NOAH
JACOBS

TABLE OF CONTENTS
2025.02.09-On-Overengineering
2025.02.02-On-Autocomplete
2025.01.26-On-The-Automated-Turkey-Problem
2025.01.19-On-Success-Metrics
2025.01.12-On-Being-the-Best
2025.01.05-On-2024
2024.12.29-On-Dragons-and-Lizards
2024.12.22-On-Being-a-Contrarian
2024.12.15-On-Sticky-Rules
2024.12.08-On-Scarcity-&-Abundance
2024.12.01-On-BirdDog
2024.11.24-On-Focus
2024.11.17-On-The-Curse-of-Dimensionality
2024.11.10-On-Skill-as-Efficiency
2024.11.03-On-Efficiency
2024.10.27-On-Binary-Goals
2024.10.20-On-Commitment
2024.10.13-On-Rules-Vs-Intuition
2024.10.06-On-Binding-Constraints
2024.09.29-On-Restrictive-Rules
2024.09.22-On-Conflicting-Ideas
2024.09.15-On-Vectors
2024.09.08-On-Perfection
2024.09.01-On-Signal-Density
2024.08.25-On-Yapping
2024.08.18-On-Wax-and-Feather-Assumptions
2024.08.11-On-Going-All-In
2024.08.04-On-Abstraction
2024.07.28-On-Naming-a-Company
2024.07.21-On-Coding-in-Tongues
2024.07.14-On-Sufficient-Precision
2024.07.07-On-Rewriting
2024.06.30-On-Hacker-Houses
2024.06.23-On-Knowledge-Graphs
2024.06.16-On-Authority-and-Responsibility
2024.06.09-On-Personal-Websites
2024.06.02-On-Reducing-Complexity
2024.05.26-On-Design-as-Information
2024.05.19-On-UI-UX
2024.05.12-On-Exponential-Learning
2024.05.05-On-School
2024.04.28-On-Product-Development
2024.04.21-On-Communication
2024.04.14-On-Money-Tree-Farming
2024.04.07-On-Capital-Allocation
2024.03.31-On-Optimization
2024.03.24-On-Habit-Trackers
2024.03.17-On-Push-Notifications
2024.03.10-On-Being-Yourself
2024.03.03-On-Biking
2024.02.25-On-Descoping-Uncertainty
2024.02.18-On-Surfing
2024.02.11-On-Risk-Takers
2024.02.04-On-San-Francisco
2024.01.28-On-Big-Numbers
2024.01.21-On-Envy
2024.01.14-On-Value-vs-Price
2024.01.07-On-Running
2023.12.31-On-Thriving-&-Proactivity
2023.12.24-On-Surviving-&-Reactivity
2023.12.17-On-Sacrifices
2023.12.10-On-Suffering
2023.12.03-On-Constraints
2023.11.26-On-Fear-Hope-&-Patience
2023.11.19-On-Being-Light
2023.11.12-On-Hard-work-vs-Entitlement
2023.11.05-On-Cognitive-Dissonance
2023.10.29-On-Poetry
2023.10.22-On-Gut-Instinct
2023.10.15-On-Optionality
2023.10.08-On-Walking
2023.10.01-On-Exceeding-Expectations
2023.09.24-On-Iterative-Hypothesis-Testing
2023.09.17-On-Knowledge-&-Understanding
2023.09.10-On-Selfishness
2023.09.03-On-Friendship
2023.08.27-On-Craftsmanship
2023.08.20-On-Discipline-&-Deep-Work
2023.08.13-On-Community-Building
2023.08.05-On-Decentralized-Bottom-Up-Leadership
2023.07.29-On-Frame-Breaks
2023.07.22-On-Shared-Struggle
2023.07.16-On-Self-Similarity
2023.07.05-On-Experts
2023.07.02-The-Beginning

WRITING

"if you have to wait for it to roar out of you, then wait patiently."

- Charles Bukowski

Writing is one of my oldest skills; I started when I was very young, and have not stopped since. 

Age 13-16 - My first recorded journal entry was at 13 | Continued journaling, on and off.

Ages 17-18 - Started writing a bit more poetry, influenced heavily by Charles Bukwoski | Shockingly, some of my rather lewd poetry was featured at a county wide youth arts type event | Self published my first poetry book .

Age 19 - Self published another poetry book | Self published a short story collection with a narrative woven through it | Wrote a novel in one month; after considerable edits, it was long listed for the DCI Novel Prize, although that’s not that big of a deal, I think that contest was discontinued.

Age 20 - Published the GameStop book I mention on the investing page | Self published an original poetry collection that was dynamically generated based on reader preferences | Also created a collection of public domain poems with some friend’s and I’s mixed in, was also going to publish it with the dynamic generation, but never did.

Age 21 - Started writing letters to our hedge fund investors, see investing.

Age 22 - Started a weekly personal blog | Letters to company Investors, unpublished. 

Age 23 - Coming up on one year anniversary of consecutive weekly blog publications  | Letters to investors, unpublished.

You can use the table of contents to the left or click here to check out my blog posts.

Last Updated 2024.06.10

Join my weekly blog to learn about learning

2025.02.09

LXXXVI

A couple weeks ago, a mentor of mine told me:

Building a product and building a business are not the same thing. 

He is very very right. 

Once you have a product that users derive value from, you don’t necessarily make more money by making the product better. As a matter of fact, just because you have a valuable product, it does not necessarily mean you will make any money at all. 

The business itself is an entity (an organism, if you will) that you are trying to grow. Having some product or service is a necessary part of that, but not sufficient.

You need to, you know, sell the thing.*

While product development never stops it is subservient to building the business.

Overengineering happens when you add more complexity than your business or users need. It’s like hunting for a squirrel with a 50 caliber rifle—overkill.

*Really, though, your goal is likely not even just to sell the product, but to build a system for selling the product (See: On Money Tree Farming). 

Subscribe

-------------------

The “Just Right” Refactor

Yesterday, I spent a lot of time refactoring a very core part of our code base. 

The logic had gotten us from 0 customers to 10 customers, but it needed an overhaul to get us from 10 customers to 100 customers. 

For the last month or so, I was very conscious that the current solution was going to become a problem, and was brainstorming different ways to redesign the system.* However, I never took the jump and actually solved it–the change was going to be very complex and take a whole day. 

This week, though, the current solution almost became a problem for our users**. This made it obvious that if we had 15 customers, not 10, the current solution would likely break. 

So, this weekend, I ended up making a huge change that, with some hardening, should take us from 10 to 100 or even 200 users.*** If I would have done this three months ago, it undoubtedly would’ve been overengineering. Three months ago, we didn’t need to support more than ten users. Yesterday, though, it felt just right. 

Now, I could’ve engineered a change that would’ve taken us from 10 to 1,000 or 10,000 users****; I’m fairly confident I know how to do that. But, if I did this now, it also would’ve been over engineering. It would be way too early to justify the hours spent & the added complexity.

The business needs something that can get it to 100 users before it needs something that can get it to 1,000 users. 

And, the best part is, the longer we wait to upgrade the tech stack again, the more we’ll know about what the next solution should actually look like. The longer you wait, the more informed decisions you can make.

That being said, waiting even longer to push the change I just made likely would’ve have gave me more information to make it better, but would run an increasing risk of having the issue cause harm to the business.

As in all things, balance and timing matters.

*The crux of the problem was that users could submit “jobs” of highly variable size, and we were running a fifo pipeline with five workers, where each worker could do one job at a time.

**One user was entering A LOT of very small jobs… blocking other user’s jobs.

***Breaking jobs into small tasks that get distributed to workers with separate queues & concurrent pools of tasks. Also, merge tasks when possible & batched some other functions / reduced redundant resource use. 

****Horizontal scaling across machines with roughly the current setup…

Overengineering is Relative

Since the product serves the business, overengineering is a relative term.

Overengineering is another way of saying that a solution is “overkill” for the current or reasonable projected future state of the business. 



Caption: Overengineering is simply the extra complexity that does not actually provide value to the user or business; so, for a given task, the level of overengineering is just all of the engineering that doesn’t provide value to the users.

However, there is an interesting asymmetry, here. A piece of software that can efficiently serve 1,000 users can also serve 10 users, but a piece of software the can serve 10 users, can not necessarily serve 1,000 users. 

This is why awareness of what the business needs as an entity is so important.

Hunting

If you were going hunting, but did not know what you were hunting for, you would have no choice but to bring a 50 caliber rifle, as it can kill anything you would possibly hunt (barring perhaps whales). 

However, if you only needed to kill a deer, this would certainly be overkill, as a much smaller rifle would be sufficient. 

In other words, knowing that the target is a deer (100 users in the next 6 months) rather than a elephant (10,000 users in the next 6 months) allows you to rightfully reduce the caliber of the weapon you use (a system that can scale to a couple hundred users) and saves you from carrying around a bigger, harder to user rifle (code that scales to 10,000 users) than you need.

The gun is not chosen for the guns sake, just as the product is not built for the product’s sake.

The gun is chosen for the hunt, and the product is built for the business, which in turn is built to provide value to the users.*

*I have been using business & users somewhat interchangeably through this post—this is why: the business exists to provide value to the users.

The actual Outcome

It is unlikely that the product’s complexity ever actually tracks the “real” required complexity perfectly at any given time, but I think it is very possible to keep the two things reasonably close. I also think that if you are not conscious of the fact that you are building a business and are only aware of the product, you will end up with wayyyy more complexity than you need.



Caption: The jagged dark red graph is perhaps what we can reasonably hope for. The bright red graph is to be avoided, just as spending too much time below the blue line is to be avoided.

The tighter the feedback loop between the product and the business, the less overengineering will be done.

While the easy answer is to bias towards slightly over engineering, becausee if you under engineer and find out about it, that is a problem. That being said, it is likely a “champagne problem” in that it means the business is growing more than you planned on. Now, you should have resources to quickly solve the issue.

On the other hand, overengineering is more insidious in that it is harder to catch if you’re not paying attention.

I’ll leave you with a quote from an anonymous person in a cryptic group chat I am in: 

When you overengineer a solution, you make the business & users pay the price for complexity they likely don’t need.

Live Deeply,