
Ask HN: Resources for learning software design? - majewsky
Last week, a colleague came to me to ask for advice. He&#x27;s a senior systems administrator who&#x27;s now in a developer role. He&#x27;s competent in writing and editing code in general, but feels like he&#x27;s lacking experience in software design.<p>He&#x27;s eager to learn about the subject, but I couldn&#x27;t quite help him. I consider myself reasonably competent in designing software, but that&#x27;s the result of 15 years trial-and-error-based learning, so I cannot point him to any resource. Can you recommend a book, webpage or other material (or maybe just some advice) that might help him build this skill?
======
cottonseed
Tough question. I'm not aware of any books that are substitutes for reading
and writing large projects, some books I've found useful: TCP/IP Illustrated:
The Implementation (goes through the implementation of the 4.4BSD-Lite network
stack), Lion's Commentary on UNIX (or xv6 book), Network Algorithmics (amazing
book), Linux Kernel Development by Love, Large Scale C++ Software Design,
Design Patterns. A lot of people like the Architecture of Open Source
Applications books. I also think learning more computer architecture as the
beginning of computer systems engineering is good for everyone, but that's
just me.

Lampson's classic on hints for computer system design:

[https://www.microsoft.com/en-us/research/wp-
content/uploads/...](https://www.microsoft.com/en-us/research/wp-
content/uploads/2016/02/acrobat-17.pdf)

Here is a previous HN post on the subject:
[https://news.ycombinator.com/item?id=8000811](https://news.ycombinator.com/item?id=8000811)

The Clean Code author has a Clean Architecture book but I don't think it is
out yet.

------
dabockster
Just study resources on MVC and some of the patterns that get lumped together
with it (Adapter, Facade, etc). There are books available, but they all tend
to lack in certain areas (since software design is a super broad topic). Best
just to read up on some of the patterns and work on some projects. (Yes, I
know that's the usual comeback for this sort of post. But practice really does
make perfect for this sort of thing.)

And, if someone recommends a book called Code Complete, quietly begin to
question some of their life choices.

~~~
csnewb
Why do you think Code Complete is inadequate for learning about software
design?

~~~
kidmenot
Not the user you replied to but, according to my experience, Code Complete is
useful in that, as many other well-written books, it gives advice that comes
from common sense and gives it a name. Much like Martin Fowler did with
Refactoring, after all: breaking down long methods into smaller, well-named
ones is common sense, but calling it Extract Method gives everybody a handle
to use for further research.

Saying that whoever recommends Code Complete made some wrong life choices is a
bit rude and uncalled for. Books are just tools, the benefits they bring
depend on whether the reader goes through them in a smart way or not.

Then again, but this is a matter of taste, I would suggest The Pragmatic
Programmer as a first read. It's shorter, well-written and with laser-like
focus on the topic at hand.

Lastly, since designing and writing software is as much of an art as it is
science, what's really important is to avoid reading passively and blindly
applying anything the knowledge one finds in a book, and instead strive to
understand why, and going against the grain and see why certain practices are
called "best".

