Notes on “A Philosophy of Software Design”
lethain.com
lethain.com
Richard P. Gabriel in http://dreamsongs.com/WIB.html : "Simplicity -- the design must be simple, both in implementation and interface. It is more important for the interface to be simple than the implementation."
Ousterhout here is advocating The Right Thing, as opposed to Worse is Better. Unfortunately Worse is Better has become the dominant approach and it will be difficult to change that.
That's because "Worse is Better" provides revenue out of the gate. Design and performance doesn't sell, it just raises costs and causes churn. And so long as your features are bringing in more customers and revenue than you churn, nobody cares.
Yes, it will cause blowback later, when you have a feature-rich product that is unacceptably slow, or new features cost too much to be released on time, but that future may be years away, a timeframe you can't (or aren't allowed to) think about when investors are pushing hard for user and/or revenue growth.
Of course, those years later, it will probably be faster to pivot to a new bit of software written with a "Worse is Better" mindset and start the cycle again.
So, absolutely, work for simple interfaces. Absolutely, try to do the right thing rather than just creating a ball of mud. But the real world is a messy place, and your code needs to handle some of that mess in order to actually be useful rather than merely an entry in the museum of beautiful design.
Moreover the author commits a big mistake in saying that Google is a good example of clean software design. Talk with people inside the company to get a real picture, it's full of monsters that you have to maintain just with "tactical programming". This book is very well applicable inside Google as well.
I personally think the author is to harsh on "tactical programming" (solving problems locally without the big picture in mind). I agree with someones note on HN that tactical programming is fine till you get a product market fit. Technical debt has not to be paid back if the product fails.
I try to design strategically for overall architecture and don't care for most of the rest (in worst case you can refactor later).
If 9 out of 10 startups fail you can have huge savings. If you have enough success that it matters then you have the resources to improve.
Some of the worst systems I've seen were those designed to "last for decades".
But that's also not the same as "to last decades". A lot of the old space code was used and dismissed after a few years / missions.
The key difference is not "future-proofing" but "proofing" in general: the code had to be absolutely robust.
I.e. basically everything non-web/non-mobile has a higher lifetime.
While there can be a strategic value to just getting something working, the tough part is that many times that is used as a crutch to do no more thinking or design, quite possibly because they've never been called to. And refactors happen less than they ought to. The point is to be strategic about when to turn the quality/speed dial towards speed and know you are consciously taking on tech debt.
(IIRC the DRY principle comes from "The Pragmatic Programmer" and not "Clean code", but it is referenced and is one of dozens of "clean" concepts.)
I've had this book on my radar since it came out, but no library near me is going to stock it, and I just don't have the space in my tiny apartment for books unless they are very important to me.
[1] https://twitter.com/JohnOusterhout/status/989581205799452672
On one hand it's annoying to not be able to buy something in the format you want, but on the other, it's nice to see people refuse to compromise on aspects they consider important.
I suspect the reasons have nothing to do with typography or technology limitations, and are more related to a contract with the publisher.
One example that stands out to me is deep vs shallow classes.
https://www.reddit.com/r/Entrepreneur/comments/9ay8fq/design...
Following the above summary of the book Ousterhout argues for increments implementing abstractions instead of features.
Ordered the book now :)
Jamming new features into an existing architecture whether it fits of not is amazingly common though. In that vein I’d maybe even think about separating product and software increments just to highlight technical debt.
You are right about the frequency of jamming new features into an existing architecture whether it fits of not, but, if the feature makes sense (which is not a given), then a bad fit shows that there is something inadequate about the current architecture. This does not necessarily mean that it is wrong for its current purpose, but regardless of how you got into the situation, you now have a choice: you can redesign the architecture and re-implement the affected parts (aka refactor), or you can create technical debt, and the former has a much greater chance of success if you separate it from anything that changes features.