• You Can't Be Normal and Expect Abnormal Returns

    This quote by Jeffrey Pfeffer, professor at Stanford GSB, sums up the difficulty of achieving something different by doing the same things. You can apply this to “success” or any venture really. For example, it’s highly unlikely that Tony Hawk became the best skateboarder ever by living a conventional life.

    There is an important nuance that I think people forget—it’s not about personality, it’s about behavior. Emulating Steve Jobs personality completely misses the point, his moodiness and assholery did not a good product make. It was the cultivation of taste and building a cathedral with maniacal focus and decision making. He was extreme, but I highly doubt being an asshole was the essential part.

    See also:


    Published

  • Using Org-Agenda for Work

    This is a work-in-progress as I’m still refining an org-agenda centric workflow. Here’s what I’ve learned so far.

    The key problem I think this system should solve is 1) trust that something wasn’t lost or forgotten 2) what to do next. Everything else is nice to have.

    You can’t get everything into org-mode. There will always be some incompatibility like getting your calendar synced using GCal. If you don’t accept that, you’ll never actually use it.

    The default org-agenda has too much stuff going on if you have 100s of items. I realized I need multiple views of the same things to keep focus. One for the day and another for a fortnight. I look at the day view the most because it has mercifully few items. I look at the fortnight view to think ahead and plan.

    Having separate org files is a bit cumbersome. It’s best to always use org-agenda to interface with tasks. Otherwise, there is a lot of manual file opening and searching.

    Including goals at the top of the agenda to help focus my attention on what matters. I wrote a small function to inline macros in the buffer so I can see things like how many days are left to hit the goal.


    Published

  • Bill Belichick on Long Snappers

    I watched a press conference of Bill Belichick being asked about long snappers and whether it’s worth having a dedicated roster spot for a specialist. I don’t particularly care about this but I was struck by how thorough and detailed Bill’s answer was.

    He explains how the league started with more generalists—players who could do special teams and long snap. As strategies changed, it became more important to have a specialist long snapper who could block. If you saved a roster spot by having a player who performs more than one role well, there is a risk they could be injured. The league evolved to specialized roles for punters, kickers, and long snappers as a result.

    I watched all 10+ minutes of it because it reminds me there is infinite detail in just about everything. Things can seem so simple and but is more likely a failure of imagination of how deep it goes.


    Published

  • UI Rule of One

    There should only be one primary action the user can take on the screen at a time. When there is more than one action to take it becomes confusing. Which should I do first (ordering)? Which am I supposed to do (decisions)?

    As a simple analogy, think of the difference between a plane’s cockpit and a soap dispenser. The former is filled with knobs and switches for all sorts of functions, the latter has only one thing you can do—get soap.

    If you want to make UI feel intuitive, requiring little to no explanation, distilling the interface into a series of single actions (choices) is your best bet.

    That doesn’t mean there isn’t a place for more complicated interfaces, but if you see this happening, you’ll know it increases the level of understanding needed by new users.


    Published

  • Tag Vocabulary

    Tags are used to create heterarchical systems that lets you iterate on retrieval. The tag names are abstractions like categories, projects, or ideas that are encoded on top of a set of items (like notes) to make it easy to find later.

    A built-in assumption with tag-based systems is that you will use tags consistently—a tag vocabulary. That’s why tags are much easier to develop individually than as a group. It’s easier to map your way of retrieving information than having others agree on how to collectively retrieve information. Twitter hashtags are the exception, but I would argue these are a form of Schelling points.

    See also:

    • org-mode uses projects (hierarchy) and tags (heterarchy) to manage large numbers of tasks
    • My tag vocabulary is used for driving functionality rather than organizing topics

    Published

  • Schelling Point

    Coordination in the absence of communication. For example, two players in a game can’t talk to each other but they want to team up for a quest. They show up at a time that seems most likely (noon) on a day that is most likely (New Years) in a place that’s most likely (an inn). This works because people can use the shared context of their world to superimpose coordination.


    Published

  • List of Boring Technology

    The following list of things are my choices for boring technology.

    Backend programming languages:

    • Python
      • Frameworks:
        • Django
        • FastAPI
      • Package manager
        • pip

    Frontend programming languages:

    • Javascript (TypeScript is nearly there)
      • Frameworks:
        • React
        • React router
      • Package manager
        • npm
        • Use create-react-app for as along as humanly possible

    Databases:

    • Postgres
    • MySQL
    • Redis

    Deployment:

    • Ansible

    Hosting:

    • AWS

    Notes:

    • I’m hoping terraform to become boring. It looks like more engineers have experience with it, but few have set it up from scratch.
    • There are no boring package managers or build tools for the JavaScript ecosystem.
    • Redis used to be novel, but now it’s boring which is good. Try not to use it in novel ways though.

    Published

  • Founders Should Write the Check for All Expenses

    For as long as possible, in an early-stage startup, one of the founders should write the check for any expenses of the company. That includes payroll, vendors, SaaS subscriptions, professional services, and how much you’re paying accountants and bookkeepers (whom you may incorrectly think are looking out for the company’s cash).

    The reason this is so important is that expenses tend to grow very rapidly as the company grows. Left unchecked, you can get surprised by large bills and overpay for a long time. Every dollar going out is a dollar less in runway.

    It takes money to grow, but startup failure is nearly always due to running out of money. Shouldn’t you keep an eye on that?

    See also:


    Published

  • Getting to 1,000 Clicks per Month in Google Search

    My personal site now gets 1,000 clicks per month from Google searches. It took two and half years of consistently adding content nearly every day to get to this point. There are 884 pages indexed by Google and 186 that are not (for mysterious reasons). It takes ~24k impressions to deliver 1,000 clicks. The majority of the content comes from my published notes rather than longer form content like blog posts or essays.

    It’s kind of incredible how much content is needed to generate a comparatively small amount of traffic through SEO. This could be because the things I write about tend to be fairly niche and far ranging in topic.

    See also:


    Published

  • Using Grammarly With Emacs

    There’s now an official API for Grammarly and a language server. That means we can use eglot to get Grammarly in Emacs buffers. Here’s the setup which mostly works.

    Update: Grammarly announced they are discontinuing the API so this won’t work after January 10th, 2024. There are no good replacements. If I find one, I’ll add it here.

    You can get an Grammarly API client ID by creating an app here.

    Build the Grammarly VSCode extension:

    git clone git@github.com:znck/grammarly.git
    cd grammarly
    # Install pnpm if you don't have it installed already
    npm install -g pnpm
    # Build the extension and language server
    pnpm build
    

    Wrap the node based language server in a script:

    #!/bin/sh
    node /{PATH TO REPO}/grammarly/extension/dist/server/index.node.js --stdio
    

    Add it to the path or copy it to a global bin:

    cp /{PATH TO REPO}/grammarlylsp /usr/local/bin/grammarlylsp
    # Make it executable
    chmod +x grammarlylsp
    

    Configure eglot to use it when in markdown mode:

    (defclass eglot-grammarlylsp (eglot-lsp-server) ()
      :documentation "Grammarly Language Server.")
    
    (cl-defmethod eglot-initialization-options ((server eglot-grammarlylsp))
      "Passes the initializationOptions required to run
       the server."
      `(:clientId "{GRAMMARLY API CLIENT ID HERE"))
    
    (add-to-list 'eglot-server-programs
                 `(markdown-mode . (eglot-grammarlylsp ,(executable-find "grammarlylsp"))))
    

    Published

  • Successful Organizations Don't Suffer Fools

    Managers are essential to scaling a successful organization but have a large blast radius if things go wrong.

    The best organizations don’t suffer fools. The center of gravity (culture and decision making) is with individual contributors. This works because ICs are better evaluators of a manager than other managers or leaders, making it more obvious when it’s not working out.


    Published

  • Thinking Better Thoughts

    I remember when I first started working at Stripe I felt like the dumbest person in the room. I was amazed at how smart everyone seemed and the writing…gosh, the writing! If I wanted to be like that too, something needed to change.

    At first I thought I needed to improve my critical thinking. Looking for a solution, I poured over mental models and frameworks.

    It didn’t really help though. I can hang my thoughts off of a neat model but can still get away with sloppy thinking—just packaged in a smarter looking format.

    Turns out, what I’m really trying to do is ‘think better thoughts’.

    (As an aside, it’s wild that humans can even have this kind of metacognition!)

    I don’t want to be smarter, I want to be more creative, reason about problems clearly, and draw upon useful knowledge. Better thinking is a skill I can take steps to develop, being smart is merely a judgment (and a lousy one at that).

    How do you think better thoughts?

    One of my favorite Paul Graham-isms has to do with finding startup ideas. The best way to find amazing startup ideas is to become the kind of person who has amazing ideas.

    As annoying as it sounds, the only surefire way to have better thoughts is to be the kind of person who has better thoughts. Afterall, identity is a powerful motivator and improving thinking is a collection of habits and behaviors.

    To me, that’s reading better books and writing things down.

    Read better books

    (I’m going to focus on non-fiction books here due to their practicality in thinking better thoughts, but of course there fiction books which apply.)

    It’s not like I read one book and suddenly think better, but reading increases the cardinality of thoughts I can have. Reading helps me think “wider” and combine more ideas—an important element of creativity and discovery. Thinking wider leads to compounding benefits as more ideas become available like an ever expanding pallet.

    Reading books about thinking was surprisingly helpful. The Clock of the Long Now helped me think about long term thinking and deep time. The Beginning of Infinity helped me explore epistemology and how to not fool myself. The Minto Pyramid Principle helped me think about writing and how to explain things to others effectively.

    Reading books opens up new pathways follow your curiosity. Those new pathways lead to other books to read and more ideas to think about. For example, The Beginning of Infinity led to thinking about consciousness which led to reading I Am a Strange Loop and physics.

    Not just any book will do. I feel that “better books” are ones that are relevant to your interests but slightly off the beaten path. A simple heuristic is to look for canonical books in the field if inquiry that gets mentioned often by people working in the field but are seldom actually read.

    Write things down

    There are many benefits to writing and it gets even better when I write about what I’m reading. I take notes to clarify my understanding of the ideas I find interesting. I think about what I’ve read more if I’ve written anything about it. It sharpens the ability to express ideas to others.

    This last point proves to be another important part of thinking better thoughts—writing grows knowledge and enables others to add to it. Human knowledge is meme replication so ideas need to be effectively replicated. This is critical for making progress as a group whether you are working on a team or building a company.


    Now that I’ve written this down, the through-line here is that cultivating curiosity is a useful strategy for thinking better thoughts. Reading books and writing naturally leads to more curiosity.

    The difference between “go read these books about philosophy, it’s good for you” and “why does Godel’s incompleteness theorem keep coming up in these other books, what did he find” are huge. One feels like homework, the other feels like discovery.


    Published

  • Creating Meaning Through Analogy

    One of the most profound findings from Godel’s incompleteness theorem is that meaning can be mapped onto a system that was specifically designed to prevent it. Principia Mathematica, the system Godel was poking at, was designed—amongst other reasons—to solve the paradoxes of set theory and logic with a constrained set of rules. Godel abstracted over the symbolic logic (converting proofs into numbers) to show a self-referencing statement could not only be represented in PM but was also undecidable.

    This proof shows that new meaning can be mapped onto existing things through analogy and abstractions are real.

    From I Am a Strange Loop.


    Published