No Silver Bullet (1986) [pdf]
worrydream.com
worrydream.com
What's the role of the product managers here. In common experience, how much of the above falls on the product managers vs. the software builders?
A few threads that have had traction in the past:
(2021) https://news.ycombinator.com/item?id=25926136
(2019) https://news.ycombinator.com/item?id=20818537
(2017) https://news.ycombinator.com/item?id=15476733
(2015) https://news.ycombinator.com/item?id=10306335
The Wikipedia article:
No Silver Bullet: Essence and Accidents of Software Engineering (1987) - https://news.ycombinator.com/item?id=25926136 - Jan 2021 (9 comments)
No Silver Bullet (1986) [pdf] - https://news.ycombinator.com/item?id=20818537 - Aug 2019 (85 comments)
No Silver Bullet: Essence and Accidents of Software Engineering (1987) - https://news.ycombinator.com/item?id=15476733 - Oct 2017 (8 comments)
No Silver Bullet (1986) [pdf] - https://news.ycombinator.com/item?id=10306335 - Sept 2015 (34 comments)
No Silver Bullet: Essence and Accidents of Software Engineering (1987) - https://news.ycombinator.com/item?id=3068513 - Oct 2011 (1 comment)
"No Silver Bullet" Revisited - https://news.ycombinator.com/item?id=239323 - July 2008 (6 comments)
Interesting that Brad Cox's "revisited" article was the first one to get comments.
This is probably true for "most of the modules" but not for "most of the modules that people actually use"
I came from PHP, where everyone and their mom would reinvent the wheel.
Then I switched to Node.js, where no one would write their own code anymore.
The truth lies in the middle.
Can I write something like D3 until the dead line hits? Probably not.
Can I write something like left-pad until the dead line hits? Certainly.
Habits often mute common sense.
Using a modern high productivity like Python, Ruby, or Javascript will enable faster iteration and software growth.
Note: sometimes Rust or another lower level language will be more productive. Tool choice is hard and contextual.
One of my main lessons from Brooks was always to put people in the roles that they are best suited for. In "The mythical man month" developers are not interchangeable. There are a number of different roles that needs to be filled, and different types of people are required to fill them.
(Brooks, who referenced Goldstine/von Neumann and even Aristotle, certainly would not mind if we enjoyed his article in its context)
"ὥσπερ τὸ πῦρ καὶ ἐνθάδε καὶ ἐν Πέρσαις καίει"
> "While Brooks insists that there is no one silver bullet, he believes that a series of innovations attacking essential complexity could lead to significant improvements. One technology that had made significant improvement in the area of accidental complexity was the invention of high-level programming languages, such as Ada."
The core of "essential" vs "accidental" complexity remains very insightful. If, like Brooks argues, we are mostly hitting essential complexity now, no single programming language or IDE is going to provide a radically large improvement anymore.
"Productivity" is a tricky beast. What does it even mean? Programmers typing fast and getting code into production quickly? But what about the success and correctness of the systems they write? What about bugs and performance problems? What about incorrect or misunderstood requirements? Have we solved those?
I'm a bit skeptical about this. If you look at random backend code, you'll find lots of boilerplate, control structures, error handling, dealing with different data structures, performance optimizations. All of that I would consider random complexity. All of that is there only because computers can't figure these things out on their own.
There are better and worse ways to go about it, i.e. "accidental" complexity, but the core logic is irreducible.
Random spaghetti code and boilerplate isn't, but Brooks' argument is that improving this, while definitely a good thing to strive for, won't result in a huge improvement in productivity, because the major roadblocks lie elsewhere.
I don't think he is arguing against minor wins, either. He just says we must focus on the major ones.
Often that relation goes both ways, and the frontend code (that is even more complex) can be derived from the backend too.
That doesn't look very minor to me.
I would argue it's a very convenient but minor thing, and that it doesn't truly change the complexity of writing code. It just makes it less dreary. I would also argue it's a win that it can be automated, and I think Brooks would agree!
I don't think he was arguing small wins don't matter.
Coupled boilerplate on the other hand is complexity, where if you change x in front end you also must change corresponding x in backend.
Productivity is about getting solutions successfully deployed to production. Things that interfere with that may be "essential" or "accidental", but the distinction turns out not to matter much.
One of Dan Luu's better essays covered this.
I obviously disagree. I think it matters a lot, especially because it allows us to detect that trap programmers and hackers often fall prey to: hyperfocusing on minor technical details because they are cool to think about without regards to the actual gains.
That's not to deny a lot of improvements in the past decades actually made programmers' quality of life tremendously better.
Dan Luu is a very interesting essayist and I find myself nodding in agreement with a lot of what he writes. He's made it his business to go against the grain of most "universally held truths" (a great chunk of his essays are about debunking commonly held beliefs about tech and science), but in doing so I think he tends to overstate his case. In this case, I think he is right but also overstating his case, and Brooks remains as relevant as ever. Luu's 2022 addendum is interesting, because it certainly cuts both ways -- not just in the way Luu would want!
https://danluu.com/essential-complexity/
For my own contribution, I think machine learning may be a good refutation of No Silver Bullet. It removes the need for the “essential complexity” of solving a problem. Like imagine trying to make GitHub copilot before machine learning. In Brooks’s world, the essential complexity of designing algorithms and data structures would indeed make this very difficult to do. But by using machine learning, you just let the neural net figure out the problem.
ML can help with managing complexity. It can also be a tool for creating additional complexity.