• DNA Can Be Used for Pattern Recognition

    In a recent paper, researchers were able to use the properties of DNA self-assembly to classify images. First, they encoded an image into DNA tiles. Then they used self-assembly to generate the shape of a letter that corresponded to an input image. The image classification which was 80% accurate.

    Biophysical processes happen all the time in our body and seeing how something as simple as DNA can perform complex calculations is fascinating. In a weird way, it’s easier to understand how these systems work by transposing what we would typically think of as computer algorithms into biophysical processes.

    From Nature Vol 625.

    See also:


  • Every Infrastructure Decision I Endorse or Regret

    Inspired by (Almost) Every infrastructure decision I endorse or regret, I thought it would be interesting to do the same for my startup.

    AWS

    Picking AWS

    🟩 Endorse

    There wasn’t really any discussion about this as it’s the default I’ve stuck with for the last decade. I’m sure there are things that GCP does better, but for an early-stage startup, I’d rather avoid anything exciting in this part of the stack. My only advice is to fully embrace as much of AWS as part of your stack, otherwise you will be spending a lot of time retrofitting and worrying about problems that don’t really exist (like having the optionality to change providers later).

    ECS + Fargate

    🟧 Weak Endorse

    Early on, we decided we didn’t want to manage servers. We don’t want the complexity of k8, and deploys should be immutable (as much as possible). The deploy pipeline is understandable (build image, upload, replace Fargate tasks). While it took some finagling to get it in place, we basically haven’t touched it since.

    RDS

    🟩 Endorse

    We’re not at any kind of scale where the costs would matter compared to managing a Postgres server directly. At a previous startup, I had to build all of the tooling for backups and replication, and that was a poor use of time.

    KMS

    🟩 Endorse

    I wish I would have given KMS a try sooner! It’s tightly integrated with IAM and makes secrets much easier to manage. It seems daunting at first, but once you have a runbook, it’s easy-ish to use.

    Terraform

    🟩 Endorse

    Using terraform from day 1 was a great idea. Configuration changes are checked into version control, which makes it transparent to everyone. Static analysis has made security audits easier, and automatic checks help us stay on top of security issues. It’s more likely that other engineers will make infra changes because the tooling is centralized and copy/paste-able.

    Software and SaaS

    Docker

    🟧 Weak Regret

    I’m not naive enough to believe there is an actual alternative to Docker, but the amount of grief Docker causes in local development on MacOS is very high. For deployment artifacts, I think it’s fine, but this is a clear case of Worse is Better and I accept that.

    Postgres

    🟩 Strong Endorse

    Postgres is our primary DB and our early decision to centralize on this has paid off. At previous startups I stitched together multiple databases for different purposes thinking I was using the best tool for the job. This time around, we haven’t fallen into this well-known trap.

    GitHub Actions

    🟩 Endorse

    It works out of the box, and it’s easy for engineers to fiddle with and extend. I just wish configuring beefier test runners was more comprehensible.

    Sentry

    🟩 Endorse

    I’ve used Sentry at several companies now, and it’s pretty good as an early-stage error tracking, perf regression detector, and workflow for tracking runtime bugs. It takes some effort to dial in (associating errors to users, long stack traces), and there are some quirks (sampling, sometimes partial data from structured logs??).

    Slack

    🟩 Endorse

    Starting with Slack alerts for most things is the easiest way to make sure you find issues before your customers tell you about them (if they tell you at all). We have several Slack bots to help with process and alerting. You can get pretty far with this setup without having a dedicated alerting/monitoring tool.

    Notion

    🟩 Endorse

    I’m a huge proponent of writing things down, and for engineering in particular, documentation is the first step to automation. Most of our work is product engineering at this point, so having a culture of writing briefs and communicating asynchronously makes tools like Notion essential. It used to be slow, but thankfully, it’s getting better for business users.

    Netlify

    πŸŸ₯ Regret

    Almost all of my personal websites are static sites these days, and I mostly used Netlify to avoid setting up CloudFront (good lord, it’s complicated). Unfortunately, this has become a big thorn in our side because at this point, for security reasons, we use it as a glorified FTP. It’s the only part of our infra that is not in AWS, and only a few engineers have access to it. In hindsight, I probably would have put this in Terraform and CloudFront from the beginning.

    1Password

    🟩 Strong Endorse

    It’s by far the best password manager I’ve used. Making sure all credentials are stored in 1Password from the beginning saved us a world of grief. There are decent admin tools for teams too.

    aws-vault

    🟩 Endorse

    We use IAM for authentication anytime we are accessing infrastructure. The aws-vault CLI makes this very easy to set up. I just wish it integrated with touch ID or something else to make it less clunky.

    Vanta

    🟧 Endorse-ish

    I haven’t used other providers for SOC2 to compare Vanta to, but the experience can be difficult to know what you need to do. The automated tests for infra integrated with AWS are good, as are the offboarding workflows.


  • The Needs Stack

    The needs stack is a way of describing what a customer is trying to do when they are buying. There is always a hierarchy of needs the customer is trying to satisfy which businesses are competing to satisfy. For example, in using the Needs Stack for competitive strategy by A Smart Bear, the author talks about “buy infrastructure” vs “set up WordPress” and going up the stack to “get lucrative speaking gigs around the world”.

    Buying a thing is a means to some end. If you know the target customer well, you can use this to find the right level of the needs stack to obviate competitors and better communicate value to the potential customers.


  • Emacs Completion Stack

    There are many packages for completions in Emacs. I recently switched over from ido and helm to the MOVEC stack: Marginalia, Orderless, Vertico, Embark, Consult.

    What do these packages do?

    • Marginalia appends additional information to completion results (e.g. adds file size to find-file results)
    • Orderless enables fuzzy-ish search
    • Vertico renders completions (vertically as the name implies) with some additional utilities for managing history, displaying the number of results, and more
    • Embark is a whole other thing that applies actions to completion results (see how to use embark for emacs)
    • Consult is the main framework around the built-in Emacs completing-read API with default wrappers around built-in Emacs commands like finding a file, switching or killing a buffer, etc.

  • How to Use Embark for Emacs

    Embark for Emacs seems like a useful way to further customize Emacs actions (M-x). I still don’t understand why I would want to use it, so this note is an exploration to try it out and see if it’s useful.

    What can you do with embark?

    I’m still figuring out what will be most useful for me, but I’m keeping a running log of what I find below.

    Cherry-picking results

    Select a custom set of results from a list of completions and export it into a new buffer to use later. For example, I can search org-roam for notes I need to complete that are tagged with #draft and then use embark to select a few notes I want to work on. Embark persists this new list in a buffer I can return to later.

    Compose results

    We can extend the above technique to build up a customized list of items from multiple searches. For example, I can start a search for notes about “AI”, select some results (C-. SPC), then search for LLMs and select those results, thereby accumulating the items across multiple searches. Invoking embark-export puts that in a new buffer to go through later just as before.

    You can view the intermediate results by using embark-live.

    Quirks:

    • Unfortunately, the results won’t update the live list unless the search query is changed.
    • I can’t seem to select all items from the search results without exporting a new buffer.
    • I would love to be able to come back to an export and add more to it later, but there doesn’t seem to be a way to do that.

    Narrow down results

    Methodically narrow down a large list of results you don’t want to lose, export a sublist, and then work on that without losing your history.

    Add contextual actions

    I want to use embark to select a region and fix all the grammar and spelling mistakes using gptel (see ways to use AI with Emacs).

    (I haven’t done this yet but am planning to try and extend the list of actions.)

    Maintaining flow

    Sometimes you’re in the minibuffer and realize there was something else you needed to do on the same item. Rather than exit (C-g), use embark to take another action instead and come back to what you were doing (C-u C-.).

    You can even use another action that isn’t already defined by calling M-x and come right back to where you were.

    Create a new note with a title from the selected region

    Select some text and then use embark to insert a new org-roam note using the text as the title (C-. M-x org-roam-node-insert).

    Other thoughts

    Embark is close to a “universal interface” for invoking actions on items. The completions framework that Emacs introduced makes it possible for Embark to operate on anything using exactly the same pattern. What’s incredible is that means nothing in Emacs needs to be updated to work with Embark.

    I’m starting to think this is a rather important discovery for UX. Search is the first step; what you do with it next is the second half.

    Embark broke my brain at first, but it makes a lot more sense when you try to use it. Notice how it seems to just work everywhere and in ways that you would expect. Files, buffers, links, search, etc.

    I was worried that this would all feel very modal and require rote memorization to do anything useful. Somehow it doesn’t feel like that because it’s all operating on text and a limited set of object types at the end of the day. Even if it is modal, there are not that many modes.

    See also:


  • Things I Use That Are 10+ Years Old

    I was thinking the other day that there are few objects that I use somewhat regularly that are more than 10 years old.

    • Patagonia Better Sweater (brown)
    • CX Cargo Guitar (carbon fiber travel guitar)
    • Ray Bans (with the NYC subway map printed on the inside)
    • A New York Knicks hat
    • Midori Travelers notebook (a gift from my brother)
    • Ikea plates (literally indestructible)

    The list feels pretty sparse considering how much stuff I’ve accumulated over the years. It also reminds me to be mindful the next time I buy something in these every-day categories. Will I enjoy using it for 10 years?

    (Surprisingly, there might be more digital things I use regularly that are that old e.g. gmail, dropbox, reddit!)

    See also:


  • Theories of Consciousness

    There are many theories put forth to explain human consciousness and experiments are running to test them. With all the discussion around AGI, it’s timely to keep an eye on them.

    Higer-order theory

    Humans become conscious of a thing (like what they are seeing) when there is a meta representation of it in the higher-order parts of the brain. This is kind of like the “symballs” analogy from I Am a Strange Loop.

    Global workspace theory

    Information enters consciousness when it is accessed and broadcast in a “workspace”, moving information from local processing units to the brain-wide workspace.

    Integrated information theory

    Concsciousness arises from the integration of information in a system where the greater degree of integration (more connections) the higher the level of consciousness.

    See also: Consciousness is categories but as Douglas Hofstadter would argue, it is conscious or it is not, there is no unit of consciousness

    Recurrent processing theory

    There needs to be a loop of information flow from higher-order cognitive areas to lower sensory processing areas in both directionsβ€”top-down and bottom-up.

    See also: Presence of a feedback loop shifts perception from mechanics to desires


  • Ways to Use AI With Emacs

    I want to better utilize AI tools in my day-to-day work. I suspect there is much more I can be doing and using Emacs as building material to make it work for me.

    What can I do with AI and Emacs?

    Writing prose

    • Rewrite and replace region to fix spelling and grammar but preserving as much of the original prose as possible
    • Ask questions about the current document context
    • Make a flow chart from the text (maybe graphviz?)
    • Summarize a doc or region
    • Rewrite and replace text for clarity
    • Retry the last prompt to iterate on different instructions
    • Select text, write custom instruction, send
    • Create pre-canned prompts I use frequently (e.g. fix this grammar, make it shorter, etc.)
    • Dispatch to org-ai on the section or file prompting for other things I’ve written which might be related
    • Summarize a link

    Writing code

    • Write function from a comment and fill in the rest
    • Debug section of code known to be wrong
    • Fix badly formatted code
    • Refactor a complicated function
    • Generate a test from the function or module
    • Write bash script for command line
    • Ask question of log output or data from a SQL query

    Management

    • Construct follow up messages for delegated tasks in org-agenda for work that are not complete yet
    • Write the basic outline of an investor update from updated information
    • Write a weekly summary and priorities for the team

  • Results Don't Matter

    I was watching an interview with Kobe Bryant where he talks about his workouts and approach to basketball. When asked if he ever gets nervous and what he does about it, he says, “the results don’t really matter” and that it’s much more important to focus on the process of improving every day. Moments like game winning shots come and go (even if you make them, the points go back to zero the next day) but the thing you can control is yourself.

    That got me thinking about how focused we should be on results in everyday life. It’s easy to ignore results in basketball (at least short term) which has clear win/lose criteria (a literal scoreboard), but other domains not so much.

    Still, experimenting and adjusting the underlying systems and processes that drive results feels like the right lesson about being productive when under enormous pressure to deliver. How people respond to the pressure in a productive way (like Kobe) makes a difference.


  • The Internet Is Not Prosthetic

    The internet is not some other thing, separate from life, it is an abstraction that is very real.

    Fundamentally, I can inspect and see the packets and bits between my computer and the network. I can manipulate the pixels I see in the browser using code. These days more atoms are controlled by bits.

    I can also make a life from the internet. I can read information. I can communicate with people and machines. I’ve made my livelihood from it by arranging bits just so.

    If the internet is real life, how should our relationship with it change? I think we should care a lot more about living a rich digital life in the same manner we think about health, fitness, and gardening. Investing in quality of life ought to include being thoughtful about our digital skills, interests, and safety.

    (Based on a conversation I had with Jake Stein)


  • Getting Started Is a Productivity Hack

    The most reliable way to stop procrastinating is to get started. Not with the intention of completing the task at hand, but doing just a little bit.

    By doing just a little bit to get started, the task you’re dreading becomes approachable. From there, it’s highly likely you’ll complete the whole darn thing.

    The activation energy needed to get going always seems higher if you stare at the mountain ahead of you rather than the next step.

    Even though I know the trick, it still amazes me that it works.


  • You Can't Wake Up if You Don't Fall Asleep

    Asteroid City, Wes Anderson’s latest movie, is a movie about a play where the plot never quite make sense. There is a scene where the playwright is asking a room of actors to be asleep. The movie returns to this moment a few times. On the final time, the director, after telling the lead actor there are no answers for why he burned his hand on purpose, tells everyone “you can’t wake up if you don’t fall asleep.”

    I think this is the whole point of the movie. The story is not the point, but a plot device to articulate the moment of “waking up”. The juxtaposition of sleep or dreaming (or watching a meandering Wes Anderson film), helps us realize reality and wake up. I caught myself noticing reality a little more clearly as that scene was happening.

    Maybe not profound, but artful and interesting!

    See also:


  • Don't Work With People Who Are Perpetually Aggrieved

    It’s difficult to work with someone who always seems to be aggrieved. It’s a sign they will blame others rather than take responsibility themselves. It’s also a sign that they won’t be interested in improving their performance or making adjustments to collaborate better with you or the team.

    If someone is perpetually aggrieved, it’s just a matter of time before they start blaming you for treating them unfairly. If that someone is particularly persuasive (it’s easy to get sucked into), it can have a far reaching, negative pull on everyone.

    See also:


  • Sloppyness Adds Up

    Imagine a busy executive trying to work with multiple people. They’re coming in and out of meetings and working on several projects all day long. They have maybe 15 minutes to concentrate on a thing to try and keep things moving or prevent holding things up. Every time there is a broken link, spelling error, obviously incorrect statement, or something that needs to be double checked, it creates delays and more work.

    A culture of sloppyness and lack of attention to detail multiplies the delays and increases the amount of work across everyone in the organization. Ostensibly small details become very important when multiplied by a large number of people.

    See also:


  • How Long Should You Spend Automating Tasks?

    This chart, adapted from xkcd, tells you the amount of time saved over 5 years based on how much time you are able to shave off of the task. For example, a task that you do daily that you are able to reduce by 30 minutes will save 5 weeks of time over 5 years. This chart can also tell you how much time you should spend on trying to optimize so you don’t spend more time than it’s worth.

    How often
    Time Shaved Off 50/day 5/day Daily Weekly Monthy Yearly
    1 Second 1 Day 2 Hours 30 Minutes 4 Minutes 1 Minute 5 Seconds
    5 Seconds 5 Days 12 Hours 2 Hours 21 Minutes 5 Minutes 25 Seconds
    30 Seconds 4 Weeks 3 Days 12 Hours 2 Hours 30 Minutes 2 Minutes
    1 Minute 8 Weeks 6 Days 1 Day 4 Hours 1 Hour 5 Minutes
    5 Minutes 9 Months 4 Weeks 6 Days 21 Hours 5 Hours 25 Minutes
    30 Minutes 6 Months 5 Weeks 5 Days 1 Day 2 Hours
    1 Hour 10 Months 2 Months 10 Days 2 Days 5 Hours
    6 Hours 2 Months 2 Weeks 1 Day
    1 Day 8 Weeks 5 Days

    See also: