Hacker News new | ask | show | jobs
by danpalmer 975 days ago
What even does "keep it simple" mean. What even is "understandable". Every article about this sort of thing skips past the interesting arguments and assumes that their approach is the simple one, that their aim is simplicity.

If you are presented with the option of an abstraction – perhaps a library or framework, perhaps a service or API – is it "simpler" to use it or to not?

If you don't use it, and you build the alternative, you know more about how the system works as a whole, and therefore arguably it's simpler. But complexity is still introduced, and in some cases the abstraction layers still need to be built (but maybe not all of them).

If you do use it, you can consider the system to be simpler because you hide the complexity, and on the happy-path of usage that may be true, but the complexity still exists and you don't understand it because it's hidden. Arguably it's simpler, but it's easy to point to how it's more complex.

I've met engineers who strongly prioritise one or the other of these sorts, and to them that way is obviously simpler, but the problem is that both approaches are obviously simpler when you look at them in a certain way, you have to get past the obvious to realise that there are trade-offs.

3 comments

Imagine that you want to make an apple pie. Normally you would buy all the components and utensils, then bake it in a pre-existing oven.

But if you want to make an apple pie from scratch, you first need to create a Universe, and you likely go for the simplest Universe that supports apple pies. The overall stack would be simpler (especially if you pursue simplicity and ease of understanding as a goal), but the last step, making the actual pie, may be more involved, and the taste of the resulting pie may be not top-notch. In exchange, you have a pie which you completely understand from first principles.

> In exchange, you have a pie which you completely understand from first principles.

If you ever get to it, with trying to create a Universe and all. It’s like the drum loops joke:

> I thought that using loops was cheating, so I programmed my own using samples. I then thought that using samples was cheating, so I recorded real drums. I then thought that programming them was cheating, so I learned to play the drums for real. I then thought that using purchased drums was cheating, so I learned to make my own. I then thought that using pre-made skins was cheating, so I killed a goat and skinned it. I then thought that was cheating too, so I grew my own goat from a baby goat. I also think that this is cheating, but I’m not sure where to go from here. I haven’t made any music lately, what with the goat farming and all.

I think you are alluding to the difference between "simple" and "easy". You might enjoy this talk from Rich Hickey: https://paulrcook.com/blog/simple-made-easy

You can add stuff to make something easier to build or deploy (faster, more automated), while the addition makes the whole more complex (less understandable, harder to troubleshoot).

I don't get your comment in regard to this article.

The author finishes by very explicitly saying do your own thing your way. Moreover, they suggest they're not happy using systems that they find understanding obscure/a burden.

I suggest reading beyond the opening paragraph.

One of the article's themes is simplicity and its relationship to how we design software. So no, I think the comment you're replying to is totally apt and welcome discussion of the idea.
I did read the article. My comment is not a criticism of the article, it's a general point that I think about a lot and which I think was worth discussing in the context of this article.

I think this article is a fairly clear example of one side of the debate, and while it's somewhat open to the idea that there are other ways of doing things, it is also somewhat dismissive of using other peoples' abstractions.