←back to thread

1070 points dondraper36 | 2 comments | | HN request time: 0s | source
Show context
0xbadcafebee ◴[] No.45069134[source]
Hard, hard disagree.

First of all, simplicity is the hardest thing there is. You have to first make something complex, and then strip away everything that isn't necessary. You won't even know how to do that properly until you've designed the thing multiple times and found all the flaws and things you actually need.

Second, you will often have wildly different contexts.

- Is this thing controlling nuclear reactors? Okay, so safety is paramount. That means it can be complex, even inefficient, as long as it's safe. It doesn't need to be simple. It would be great if it was, but it's not really necessary.

- Is the thing just a script to loop over some input and send an alert for a non-production thing? Then it doesn't really matter how you do it, just get it done and move on to the next thing.

- Is this a product for customers intended to solve a problem for them, and there's multiple competitors in the space, and they're all kind of bad? Okay, so simplicity might actually be a competitive advantage.

Third, "the simplest thing that could possibly work" leaves a lot of money on the table. Want to make a TV show that is "the simplest thing that could possibly work"? Get an iPhone and record 3 people in an empty room saying lines. Publish a new episode every week. That is technically a TV show - but it would probably not get many views. Critics saying that you have "the simplest show" is probably not gonna put money in your pocket.

You want a grand design principle that always applies? Here's one: "Design for what you need in the near future, get it done on time and under budget, and also if you have the time, try to make it work well."

replies(3): >>45069366 #>>45069468 #>>45069663 #
1. thefourthchime ◴[] No.45069663[source]
I get what you're saying, but you're also attempting to design the perfect system without any hindsight, which is impossible.

The beauty of this approach is that you don't design anything you don't need. The requirements will change, and the design will change. If you didn't write much in the first place, it's easy.

replies(1): >>45070886 #
2. 0xbadcafebee ◴[] No.45070886[source]
But designing "the simplest thing that could possibly work" may make harder than necessary to modify later. (and any time the requirements change after it's built, you're inching towards a big ball of mud, so this whole idea should be reviled whenever possible)

An example is databases. People design their database schemas in incredibly simplistic ways, and then regret it later when the predictable stuff most people need doesn't work with the old schema, and you can't even just add columns, but you have to modify existing ones. Avoid the nightmare by making it reasonably extensible from the start. It may not be "the simplest thing that could possibly work", but it is often useful and doesn't cost you anything extra.

Just as much as people say "don't prematurely optimize", they should also say "don't prematurely make it total crap".