Thinking about how any useful software system has a lot of complexity, and the ways software developers cope with that complexity

One classic is "find a similar feature and just search and replace", because that way you don't have to understand the system

Another is "give up on understanding the system and try to build a new system that does more or less the same thing (usually less)"

Another is "ask someone else how it works endlessly without trying to understand it yourself" (There's a guy at my work who does that last one and it gets pretty annoying - and it feels like I understand things better than him, even though he's been there for years longer)

I think there's something to be said for embracing the complexity as a necessary part of a useful system, rather than as something to be eliminated or avoided


You must log in to comment.

in reply to @amypercent's post:

Regarding dealing with complexity: one that I see a lot at my workplace is “let’s make the application so simple and smooth and streamlined” but then a lot of complex decisions end up being made in the configuration. Then a config generator is made, and then maybe a generator generator. And all of that ends up way harder to test, and so much more brittle than if the complexity were felt with in the application code itself.

It feels like pushing the complexity around, but in this case, unfortunately the config mess gets bumped to a SRE or ops team to deal with

Yeah that's a good point, I've definitely seen stuff like that happen with configuration. I think if you're starting to put complex logic in configuration files you should take a step back and decide if that's actually a good idea. (I especially think homegrown config semi-languages end up being particularly hard to test and work with)

silo the complexity. abstractions abstractions abstractions. leaky abstractions are a bane to everything in their causal domain.

also "give up and remake the thing from scratch" is sometimes (depending on the scope) a great way to figure out what the fuck is going on with the thing you didn't understand. once you've understood why it does all that weird stuff, you can now throw away all the brand new garbage you just wrote and work on documenting, refactoring, cleaning up, fixing, and expanding what already exists that you were trying to fix in the first place, without having to go through with fixing all the mistakes and writing all the tests for your reimplementation.