• The Gervais Principle

    There are three groups of people within an organization: Sociopaths (tend to be at the top running the company, characterized by self-interest and need to control), Clueless (tend to be middle management, characterized by misplaced loyalty to the organization), and Losers (tend to be at the bottom, characterized by striking a bad economic bargain). The Gervais Principle speaks to the dynamics between these three groups with the Office as allegory.

    Sociopaths (who wield all the power) promote over-performing Losers into middle management thereby making them Clueless. They maneuver the Clueless to escape their own risk. For example, Michael was a top sales person before becoming a Clueless manager.

    Sociopaths turn under-performers into Sociopaths and fast-track them to positions of power. Losers that are self-aware (knowing they made a bad economic bargain) seek opportunities to raise their standing before they run out of time and get fired. For example, Ryan the intern who is bad at sales (his actual job) and manipulates his way into management position by David (a Sociopath).

    The Losers are left to fend for themselves. They find fulfillment outside of work and do just enough to get by. This is exemplified by Stanley, who knowingly plays along to the delusions of the Clueless and does enough work to never get fired.

    Read the essay.

    See also:

    • Performance management is a way of preventing the rise of low-performing Losers into Sociopaths in positions of power
    • Peter Principle a more popular (and simplistic) explanation of organizational incompetence
    • This theory can be thought of as an example of the principal-agent problem, the organization is not properly incentives to counteract the bad behaviors of promoting low-performing Losers and senior managers manipulating the Clueless.

  • TypeScript Adds Incidental Complexity to Using Libraries

    Inter-operating with libraries in the JavaScript ecosystem from TypeScript introduces incidental complexity due to packaging and types. There are (at least) four different ways to import a library[0] in TypeScript, each with subtle differences. Depending on the way the library is packaged you will need to pick the correct incantation.

    To get the benefit of static typing for a non-typed library, you also need to add @types/name-of-lib to your dependencies. Sometimes these are no longer needed when the library adds TypeScript support as did aws-sdk which, depending on what blog post or StackOverflow question you are looking at may or may not tell you.

    Finally, types in a library that has TypeScript support can be done poorly. For example, I found a rather unfortunate issue in marked.js because the Tokens union type doesn’t have a common discriminator property. That makes it not possible, or extremely hack-y to find a specific kind of element[1].

    [0]

    import { Lib } from 'some-lib'
    import 'some-lib';
    import * as Lib from 'some-lib';
    const lib = require('some-lib');
    

    [1]

    export function extractMarkdownTitle(md: string): string | null {
      const lexer_output = marked.lexer(md) as marked.TokensList;
    
      // Hack: This isn't typeable because Tokens is not a descriminating
      // union type (Def and Space don't have a `type` prop)
      let title: any = lexer_output.find((val: any) => {
        // Without casting to `any`, this won't compile
        return val.type === 'heading';
      });
    
      return title ? title.text : null;
    }
    

  • Good Magic and Bad Magic

    Good magic just works. It’s invisible and you quickly forget that it’s there.

    Bad magic works sometimes. It’s mysterious and hard to understand.

    Good programming abstractions are the right kind of magic. You can depend on them and build on top of them with confidence.

    Bad programming abstractions are the wrong kind of magic. It’s equally a mystery when it works as when it doesn’t work. They’re leaky and you end up spending more time cleaning up after the magic than benefiting from it.


  • Airplane Test of Programming Languages

    The airplane test measures the (often binary) ability to write code in a specified programming language while secluded on an airplane with no internet access. It shows the programming language’s capability to unblock the programmer and is an indicator of productivity.

    Typed languages (such as rustlang) fair better because it’s easier to reason about code and jump to a definition when you need to understand what’s going on. However, other contributing factors include the legibility of error messages and stack traces, quality of documentation, quirks in the language, tooling, and whether it is ‘batteries included’. In this way, typed languages can also fail the test (e.g. TypeScript’s quirks with interoperating with JS libraries and Webpack generally requires access to StackOverflow).


  • Website Navigation Does Not Lend Itself to Discovery

    Modern websites rely on strict hierarchy of pages to help users navigate. This uses central pages to send users back to once they’ve completed reading an article. However, this rigidity does not optimize for serendipitous discovery and many important pages on a website can be inadvertently orphaned (either because it doesn’t fit neatly into a hierarchy or users don’t know to look for it).

    Digital gardens on the other hand eschew strict navigation and rely on hypertext linking to allow a wide range of paths to content in a self-directed way. This comes with a trade off of overall coherence between content nodes.

    Read ‘The limits of structure’ by East Gate.


  • Querying Stats From Org-Roam

    You can run queries directly on the org-roam database directly (it’s just a sqlite database) to get interesting stats about your Zettelkasten.

    The location of the database can be found by evaluating org-roam-db-location.

    Note: file names have the date embedded in it formatted as yyyy-mm-dd so taking a substring is the easiest way to group by dates.

    (Updated for org-roam v2)

    Total notes (not journal entries)

    select count(*) from files where file not like '%journal%';
    

    Notes per year (not journal entries)

    select substr(files.file, 24, 4) as year, count(files.file)
    from files
    where file not like '%journal%'
    group by year
    order by year desc;
    

    Notes per month

    select substr(files.file, 24, 7) as month, count(files.file)
    from files
    group by month
    order by month desc;
    

    Links per note

    select substr(files.file, 24, 7) as month, round(cast(count(links.source) as real) / cast(count(distinct files.file) as real), 2)
    from files
    join nodes on files.file=nodes.file
    join links on nodes.id=links.source
    where links.type = '"id"'
    group by month
    order by month desc;
    

    Notes per day

    select substr(files.file, 24, 7) as month, round(cast(count(files.file) as real) / cast(count(distinct substr(files.file, 24, 10)) as real), 2)
    from files
    group by month
    order by month desc;
    

    Words written for a given year

    Counting words written in org-roam


  • Reverse Chronological Content Took Over the Web

    The majority of websites of the ‘old web’ (1990’s) were hand crafted, highly customized places where creators acted more as librariansβ€”carefully maintaining a table of contents and some evergreen content. This all changed with the introduction of Moveable Type, a CMS that took the labor out of publishing content and democratized a minimal, organized, aesthetic.

    As a result of Moveable Type, reverse chronological content (blogging) became the majority of the web. This stemmed from the constraints of the software (only one way to sort content), but the effect was profound. A table of contents was replaced with a feed of content. It was far easier to publish new content so that’s what people did.

    See also:


  • Reflections on Writing 500 Notes

    I’ve now written 500 notes and roughly 84,000 words since May 25, 2020 in my Zettelkasten. Here are a few thoughts and observations.

    I started out writing too many notes that were definitions. For example, I would come across an interesting word or concept I want to recall later so I cut a new note for it. The problem with accumulating notes like this is that the collection becomes more of a dictionary which requires rote memorization to be put to use. I have a hard time remembering those notes and connecting them to other notes.

    Compared to definitions, notes written as a claim are far more interesting and useful. I find it avoids the wikipedia feel and leads to more creative ideas. I still write some definition notes, but they tend to serve as pointers to a group of related notes via backlinks.

    I’m certainly writing a lot moreβ€”adding notes at a rate of 1,000 per year[0]. I’ve built a durable habit of writing every morning[1] which I look forward to each day. I can see the daily progress because publishing notes visualizes growing knowledge.

    However, I’m not continuously synthesizing these notes into other durable artifacts like essays. There’s some amount of reaping and sowing that I’m missing. I’ll need to make this an explicit goal and set aside some morning writing time to work on essays occasionally.

    I have a better mental model for connecting content by adding links as if I am curating a path along a garden. The amount of links per note has noticeably increased over time[2]. I’m also better at spotting individual concepts and ideas so I can appropriately cut a new note. This leads to better connections because it’s easier to connect more specific things together than more general things.

    Publishing notes daily has resulted in twice the traffic to my personal site from search engine traffic. The effects of note blogging on SEO make it so I’m constantly extending the long tail of keywords the site is ranked for. This creates a virtuous cycle because my interests are wide and niche which adds more unique keywords which draws more impressions and clicks.

    I’ve evolved my workflow for writing and publishing over time to make it easier to contribute across devices (which I wrote about in Zettelkasten, Emacs, and Creative Thinking). It’s complicated, a bit clunky (need to constantly push/pull from a git repo), and would be difficult for others to adopt. This led to me starting a side project to focus more on note blogging and building tools that combine the benefits of a Zettelkasten with publishing.

    Finally, it takes some time to ‘get it’. I read somewhere that the benefits of note taking like this don’t kick in until around 500 notes and there is some truth to that. I have a much better idea of what I want to get out of it and I’m seeing evidence that my collection is like a second brain that I can consult when doing my own thinking. Pretty neat!

    [0] Notes per month

    Month Note count
    2020-11 25
    2020-10 88
    2020-09 73
    2020-08 110
    2020-07 108
    2020-06 86
    2020-05 13

    [1] Notes per day

    Month Notes per day
    2020-11 2.88
    2020-10 2.83
    2020-09 2.51
    2020-08 3.54
    2020-07 3.48
    2020-06 2.96
    2020-05 3.25

    [2] Links per note

    Month Links per note
    2020-11 2.57
    2020-10 2.20
    2020-09 1.79
    2020-08 2.17
    2020-07 1.90
    2020-06 1.86
    2020-05 2.50

    See querying stats from org-roam for how these queries were made.


  • The Garden and the Stream

    Streams are a metaphor for the majority of the Internet we interact with today characterized by time-ordered events that require context to understand.

    For example, try going back to a tweet from a few years ago and try to glean it’s full meaning. It requires contextβ€”when did it happen, what do we know about the author, what was it in response to, etc.

    Facebook, Twitter, Instagram are the pinnacle of the stream. Content is an argument (not even a dialogue, typically a nameless ‘them’), real-time reactions, and primarily ephemeral.

    Gardens are different. There is no singular relationship of elements (i.e. a heterarchy) in a garden, no strict hierarchy or chronology. It emphasizes the reader (or creator) to find their own connections between objects in and draw their own path.

    For example, content in a digital garden is evergreen and evolves over time. There are many links between content the creator places to connect meaning and generate context over time. Adding content and connections extends the meaning of what already exists without needing to rewrite it.

    As a counter example, consider a blog post. It’s a snapshot in time of a collection of ideas strung together. It’s unlikely to be updated and extended as the author acquires new information. They could write a ‘part 2’ sequel, but this introduces a new strict hierarchy of ideas and requires reading the previous parts to fully understand the context.

    Read the essay.

    See also:


  • Effects of Note Blogging on SEO

    Since I started publishing my Zettelkasten notes, I’ve noticed a large change in overall search engine traffic. My personal site and notes have doubled in impressions and clicks. Notably I receive more impressions from search engine visitors than I do from tweets from my Twitter account.

    I’ve noticed some compounding effects that lead me to believe these effects will continue. As more notes are published along a wider range of topics (I’m naturally curious!), notes rank for more keywords (a very long tail), which increases impressions and clicks which further improves ranking and page authority. Even better, this content is evergreen once it’s indexed by search engines and increases in value over time. This is the exact opposite of tweetsβ€”most impressions happen in the first few hours and is unlikely to be found again because they are primarily consumed in a stream.