↓ Skip to main content

The meaning of life

Life doesn’t have a meaning. You define the meaning of your life. What is a reasonable meaning to give to your life? From an utilitarian perspective it should be about reducing pain or increasing pleasure for the largest population. It’s not clear which one is preferable. If both are considered to be on the same axis, then it is a matter of identifying the changes that will lead to the largest relative increase. Similarly to any optimization problem there are things that are easier than others to optimize and to improve, while others are neglectable in terms of improvement. With this line of reasoning one would think the best they can do is to help those that have the least: food, shelter, education, happiness, freedom. But is it worthwhile to improve the life of those people if they still die young or are unable to benefit from what you provided them? Why should we care about most of the population? Given our capitalistic environment, we want as many individuals as possible to accomplish work. The purpose of that work is meaningless, but in the grand scheme of things it is about survival. We evolved from nothing, to atoms, then molecules, then in/organic compounds, then collections of molecules, proteins, RNA, DNA, cells, organs, humans. At the electron, proton and neutron level we don’t observe any specific goal other than reaching some level of stability within atoms through the different electronic shell levels. Should we see structure as an indication of some type of implicit “design goal”, i.e., structure implies intent? Once we reach a certain complexity level we nowadays consider “life”, we start using energy as a way to interact with the environment around us. Eating is the foundation. Eating is how we acquire energy. We need to eat to have energy to accomplish anything. Sleep is necessary as a mean to conserve energy. We need energy for the sole purpose of looking for more energy. From this perspective we’re engaged in a vicious useless cycle of finding energy, storing it, and using it to find more energy. Energy used to achieve movement produces some heat due to friction with the environment. As long as the environment we live in can self-sustain itself, that is, it can produce consumable sources of energy faster than they are consumed by those inhabiting it, we can live in that environment. When it ceases to be the case, the organisms that rely on this property being true are at risk of dying. In our society, it’s easy to have access to food and thus fulfill this need.

Procaryote cells separate themselves from their environment through a lipid bilayer. We can see this as being similar to a human being living in their own home.

Why did atoms turn into more complex molecules, which in turn, after many steps, turned into cells? Why did this complexity arise instead of staying at very simple atomic levels? In many cases different atoms aggregate together to form a molecule because this assembly is structurally more stable. Why does the environment want more stable molecules over less stable ones? Why are there atoms to begin with an not just soups of electrons, protons and neutrons?


Exponential growth software company

In this article I want to explore different aspects of scaling a company that need to be taken into account if you’re trying to grow exponentially. Generally when discussing about growth we consider revenue growth to be the metric we’re measuring. One thing that is important, and that is considered throughout the article, is to be a profitable company. There’s no point in growing exponentially if it is unsustainable or your expenses are always going to be superior to your profits.

In the best scenario, your business grows exponentially without requiring any additional human power. The second best case is that it grows sublinearly, meaning that as demand grows, the amount of people required to support the company grows slower than the demand itself. Past this point, growth either matches with how many people need to be hired, or worse, growth is slower as you hire more people. Here you may have exponential human power growth to get linear (or sublinear) revenue growth.

When hiring people, you need to be able to onboard them while having as little impact as possible on the existing employees. If existing employees need to spend time onboarding new employees, then nobody is working on product development or support during that period. Here again, you want the number of people responsible to onboard and train new employees to be smaller than the number of people being onboarded. In other words, you want the ratio of onboarded to onboarders to be higher than 1 to 1.

When a company grows exponentially, every time the company effectively double due to new hires, the culture is now at risk of instability. If for instance 100% of the existing employees were following the existing culture, and 100% of the new hires have a different culture, then there will be a culture clash with no specific half of the company being in control of culture. Unless culture continues to be managed through the process of onboarding, the initial group of people and their culture will rapidly become diluted.

We’re not made to interact with dozen or hundreds of peers. As such, it is close to impossible for an individual to work with more than let say 10 direct peers. This means that teams or groups need to be created. This also means that interaction between teams needs to be managed somehow. Having multiple people from a team interact with another team leads to the implicit creation of a larger 20 people team, which does not work very effectively. On the other hand, having single points of contact between teams is a surefire way to have single points of failure. In this specific instance it is definitely necessary to have at least 1 or 2 redundancies.

It is also important to keep the people that have been at the company the longest. As the doubling period effectively divides by two the average duration an employee was with the company, losing those senior employees will speed up the drop in employee average tenure. This means that a lot of institutional knowledge will be lost along the way. This would also mean that you should possibly prefer to keep a senior employee at the cost of hiring a new employee, unless you believe that the amount of time necessary to onboard and be effective is lower than the average employee tenure.

The process of onboarding should be optimized as much as possible.

Anything that requires human power to scale linearly or superlinearly with itself needs to be optimized so that it grows sublinearly.

Follow-up: Scaling the LLM Agent Company explores how these constraints change when the workforce is entirely composed of LLM agents.


One on one

  • Define and agree on the purpose of the one on one
  • Define the topics to be discussed prior to meeting
  • Track and update metrics that you care about every time you meet
    • e.g., Predictability, Ownership, Purpose, Progress, Belonging
  • Discuss the status of those metrics if necessary
  • Write in a shared document (between the two of you) what is discussed
  • If any action items are defined during those meetings, use a task tracking system to keep each other accountable
    • Always define a deadline on tasks to indicate when the task should be revisited
  • Avoid using one on one for status updates

References
#


Answering coding interview questions

  • Read the problem statement
  • Look at any provided unit tests
  • Add any unit tests you think might be relevant and not currently covered
  • Order the unit tests from easiest to hardest
  • Ask questions to confirm your understanding of the problem and verify edge cases
  • Think of a possible approach to solve the problem
  • Share your approach with the interviewers and get their buy-in
    • You may do this by writing pseudo-code as you are explaining your thought process
  • Implement your solution
    • If you encounter any difficulties, state them and explain what you are thinking
    • Make use of preconditions/early exit if possible to handle empty cases
  • Run your code frequently, even if it is not fully working
  • Discuss any follow-up questions with the interviewers

Managing your reading

The process described below attempts to optimize reading quality books and enjoying the reading experience. As such, it promotes book exploration (discovery of new books) and reading books which have a high rating according to your own taste. Books which receive lower ratings (compared to other books) are moved down the reading priority list and will not be read until books that have higher priority (i.e., rating) either are finished reading or their rating decreases such that other books are now high priority.

  • Pick highly read books (use a site like goodreads to identify those books).
  • When reading a book, record the page you start and stop reading on, the time you start and stop reading and emit a rating for what you’ve read.
    • You can decide to optimize whether you want to optimize per page rating or per duration rating, that is, get the most value per page or by time spent reading.
  • Add new books to your reading list regularly. Those books are considered as having the highest priority and are then added to the prioritized list of books according to its rating.
  • When not reading a new book, read the books in order of priority and by interest at the time of reading.
  • From time to time you may look at your list of prioritized books and decide whether the books with the lowest priority should ever be finished. In some cases it is reasonable to decide that certain books will never be read completely.
  • As an alternative approach, one can use multi-armed bandits algorithms to decide which book to read next. Given that we can convert multi-armed bandits problem into the problem of selecting which book to read next given a sequence of readings and associated rating (“rewards”), the various algorithms (such as Epsilon-greedy or UCB1) will provide us with the next book we should read.
    • Interestingly enough, an algorithm like UCB1 will promote reading books we’ve never read first over reading books we’ve already started reading.

My reading strategy
#

  1. Read partially any book for which you haven’t given any rating
  2. Rate what you have read on a 1 to 5 scale, 1 being very bad and 5 being very good (see book rating)
  3. Compute the weighted rating of the book (the sum of rating times # of page associated to the reading divided by the total # of pages read so far for the book)
  4. Sort books by weighted rating (descending), then average estimated amount of time left to complete (ascending)
  5. If you have books that you haven’t read yet, go back to the first step. If not, then pick the book at the top of the list computed in the previous step, then continue from step 2

Heuristics
#

  • It’s better to read a good book than to finish a bad book

References
#


Adding a class alias at boot time in Laravel

When I work with the Laravel framework, I make extensive use of the Laravel Debugbar to track performance of parts of my application. I sprinkle calls to Debugbar::startMeasure and Debugbar::stopMeasure to track the duration of certain segments of my code. However, when this code goes into production, this dependency isn’t present. This causes the code to break since it cannot find Debugbar anymore.

To solve this issue, I thought I would create a dummy Debugbar class and have it added as an alias, so that any code depending on Debugbar would still work, but end up as a “no operation”. I found the article Dynamic class aliases in package which introduced the necessary piece of information to accomplish this.

<?php

use Illuminate\Foundation\AliasLoader;
use My\SuperPackage\FooBar;

class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
    public function register()
    {
        $this->app->booting(function() {
            $loader = AliasLoader::getInstance();
            $loader->alias('FooBar', FooBar::class);
        });
    }
}

In my desired use case, I simply implemented the following changes:

In app/Providers/DebugbarServiceProvider.php (a new file)

<?php

namespace App\Providers;

use Illuminate\Foundation\AliasLoader;
use Illuminate\Support\ServiceProvider;

class DebugbarServiceProvider extends ServiceProvider
{
    public function register()
    {
        if (!class_exists('Debugbar')) {
            $loader = AliasLoader::getInstance();
            $loader->alias('Debugbar', NullDebugbar::class);
        }
    }
}

class NullDebugbar
{
    public static function __callStatic(string $name, array $arguments)
    {
        // Do nothing
    }
}

In app/config/app.php

    // under the 'providers' key, add
    'providers' => [
        [...]
        // This will take care of loading the service provider defined above
        App\Providers\DebugbarServiceProvider::class,
    ],

With those two changes, it is now possible to make use of Debugbar in most places and have it work even without the Laravel Debugbar dependency installed.

References
#


Achieving goals

  • It’s important to know what your goals are.

  • It’s important to understand why they are your goals.

  • It’s important to determine which goals are more important than others (goals priority).

  • It’s important to know which goals are dependent on other goals (goals decomposition and dependency).

  • To reach a goal, you must first acquire the tools (knowledge, resources) to get to your objective.

  • It’s important to know when to drop/abandon goals.

  • Sources of inefficiency

    • Repeating the same task without sufficient experience.
  • Always try to figure out the most optimal path toward a goal

    • Observe others successful at achieving the goal you want to achieve.
    • Determine the differences between your state and theirs (what they know, what resources are available to them, etc.).
  • How to determine when it is not possible to reach a goal at a given moment in time?

    • Not enough time available
    • Too costly
    • Dependencies not resolved/ready


Closing tabs

Why tabs are kept open
#

  • Want to read but
    • Too long -> Transfer to pocket
  • Want to watch but
    • Too long -> Add to a youtube watchlist (which I’ll never watch)
  • I need them open to quickly enter data
  • I want to watch them again and again
    • Download with youtube-dl and watch using VLC
  • Would maybe read one day, but definitely not now (very low priority)
    • Transfer to pocket

Rules
#

  • If a tab is scanned more than 5/10 times, it goes into the backlog bin

Generic landing page

  • Company name

  • Product name

  • What problem we are trying to solve

  • How we are solving it

  • Why should you trust if vs our competitors

  • List what it can already do

  • List what we expect to be able to do

  • Link to our bug tracker

  • Subscribe to our mailing list

    • Become an alpha tester
    • Early access program
  • Email to contact for any question

  • A/B testing of the price

  • Testimonials

  • Full website

    • Packages/Pricing/Plans
    • Feature list
  • On signing

    • Send an email to a small survey
      • Establish the price range people would be willing to pay
      • Establish the type of model they’d be willing to accept
      • Check what feature they’re the most interested in
      • Check which feature they’d like to see in the future
  • Events tracking

    • Seen sections of the landing page/
    • Mouse movement/heatmap/session recording (viewport + mouse position)

TODO
#

  • Define the information you want to collect/know more about

Extracted from articles
#

  • Unique Selling Proposition

  • Hero shot

  • Benefits of your offering

  • Social proof

  • Call-To-Action (single conversion goal)

  • The headline should inform the user what the product or service is all about

References
#