Three boks I'll recommend you read as soon as possible.
1) The Mythical Man month
3) The Pragmatic Programmer
3) Code Complete.
The thing about these books, well atleast 1 and 3 is that when they were written they broke new ground. Or if that phrase bother you, they were the first mainstream publications that brought their core ideas to developers.
Reading these books early in your career will help cement these best practices.
Reading these books after you've been a practicing programmer means,IMHO, that the return you get from reading them goes way way down.
You'll find that you've already learned all/most? of what they are trying to teach.
You'll find yourself getting frustrated that they are preaching what you already know as common sense and first principles.
Or put another way, I'm not sure there is much that someone who has programmed for 5-10 years can get out of those books that they haven't picked up somewhere else already or learned the hard way.
Thank you. The most value I get from these kinds of books is to become aware of important concepts so that I can actively work on improving them. In other words: what I seek from these books is the mental framework that experienced developers rely on, the rest is mostly noise.
I read through Code Complete 2 cover to cover my first year and I agree with parent it's more useful early on than later. There's a lot of discussion around best practices; I think there's an entire chapter on strategic whitespace. All the stuff in there makes sense, but it cements why it's important.
Definitely check out "The Pragmatic Programmer"! There's definitely some good nuggets in there that helped me. Distinguishing full-blown prototypes vs. prototypical kernels that can be productionized, a.k.a. tracer bullet prototyping, is one.
This x1000. I'm only just getting to reading these now 10 years into my career and I find them to be a bit useless for me since I've already picked up bits and pieces of each throughout my past jobs/companies. Would have been much better off earlier on if I had just read these beforehand.
I kinda wonder, after all these years, if there would ever be a new edition of the Pragmatic Programmer; or even a discussion from the authors on how their thinking has evolved over time.
I always started and stopped reading Code complete book.
The most recent strategy that really worked for me was. I googled summary notes for that book to recognize the topics that I wanted to learn and ditched the ones that are redundant.
This rejuvinated my interest and productivity for reading that book.
Peter Seibel does an amazing job of asking programmers questions that make them explain their methodology. The interview with Donald Knuth is awesome; really enjoyed hearing him talk about literate programming.
2. The Soul of a New Machine
Tracy Kidder's 1981 Pulitzer Prize winner I think is a brilliant case study on how engineers work together and the things that can go wrong and right with different personalities interacting with highly technical ideas. The project in this book starts without the consent of management, which to me shows the value of questioning the system to add business / engineering value.
3. Little Schemer
Small book that will give your brain a serious workout and show you how to problem solve with Lisp like languages. Even if you never end up using a Lisp dialect, this book expands your brain.
This! The primary benefit of this book is in learning to understand recursion. Lisp just happens to be a good environment for naturally expressing recursion.
+1 to Coders at Work. That book does an excellent job of showing the human side of programming.
I think too many people approach the industry thinking programmers are god-like deities who have an unlimited amount of time and brain power. Coders at Work does a great job breaking down the "imposter syndrome" plaguing new people coming into the industry.
Don't Make Me Think by Steve Krug and The Design of Everyday Things by Don Norman.
While they're not strictly software or programming related, I really like the concepts of making interfaces that require minimal thought to use and empathizing with your users. I've seen an unfortunate amount of "programming machismo" where a confusing or poorly engineered system is used and accepted because "that's just how things work in the real world". And whenever someone struggles with the process, it's obviously because they're wrong, not the system. But more often than not, if more than one person has trouble understanding your system, whether it's an API, a website, a build process, the design is the issue.
Don't Make Me Think is a good one, but I always felt like its lessons could have been summed up in an infographic...though I guess that would be missing the context to get people over that hill. I guess if you don't know that intuitively, you're the kind of person that needs that book.
I honestly felt the same way about "The design of everyday things". The first few chapters are quite interesting but it gets insanely repetitive after a while. To be fair I feel that way about a lot of pop-sci books...
Our field is so varied that there is no good answer to this question unless you specify what you want to focus on.
Some people are inevitably going to recommend The Art of Computer Programming, which hardly anyone has read and isn't that relevant to the work that 99% of us are doing.
Someone will probably recommend The C Programming Language, also called K&R after the authors, but again it's not very useful unless you're going to be using a lot of C and even then I personally don't think it provides anything you can't get from guides on the internet. (I have actually read this one, but it's been a while)
There are other classic textbooks that will probably be mentioned that are only useful to those in that domain. Many of us can get by without a deep understanding of algorithms and data structures, most people don't need to read a compiler book, etc, etc.
However, there are some generalized books that people often recommend like The Pragmatic Programmer and Code Complete. These are, in my opinion, good recommendations if you're looking for something to read but I wouldn't say that someone starting a career in software engineering should read them. Software engineering isn't really a field with seminal texts that should be read by everyone.
For example, every political scientist should have probably read The Republic by Plato and Politics by Aristotle among many other texts. I don't think software engineering has that equivalent, partially due to the relative newness of the field and partially because the primary output of our field is not written texts.
Another interesting question would be "What codebases should someone starting their career in software engineering look at?". Are there things that the average joe programmer can learn by poking around the Linux kernel or Firefox? Maybe. I don't know. I've never done it. I'd be interested in hearing from those who have, though. Maybe I'll do my own ask HN.
edit: I feel I should clarify that this is written from the perspective of a software engineer, not an academic in computer science. For all I know there could be seminal texts that those on the academic side should all have read.
"The C Programming Language" is a good read if you intend to write a book. It is well written so you should read it for inspiration on how to make your book good.
If you want to learn C - there are plenty of resources that work just as well. The good ones cover things that didn't exist back then. (I've only read the original K&R from before ANSI, not one of the latter edition(s) so I can't comment on how up to date the latest version is)
Designing Data-Intensive Applications[0] by Martin Kleppmann. There's a previous HN thread about it[1]. Helped me understand a bit more about databases and systems. The book is also very approachable and has the perfect blend of application and theory at a high level that anyone approaching the industry for the first time stands to gain a lot from reading it.
The Architecture of Open Source Applications[2] series is a good one for leaning how to build production applications and you can read it online. The chapter on Scalable Web Architecture[3] is a must-read.
As far as a technical book, Data Intensive Applications by Martin Kleppman. This book covers distributed systems as well as databases, data-warehousing, and data-processing.
A lot of tools and patterns you don't see in school that describe how most of the "magic" behind high-powered software we use is implemented.
My take on some which I think should be atleast read once:
1) The unix programming environment
2) The design of the unix operating system
3) The Pragmatic Programmer
4) Programming Pearls
5) Computer Systems: A Programmers Prespective
6) K & R C
7) The art of Unix Programming.
I read this in like a week at one of my first jobs. I learned so much that in a few days my status in the team radically changed and became the go to person when people's scripts didn't work; word spread and soon I had people from other teams seeking help with their scripts too. No one else read the book though AFIK ...
What I really liked about this book at the time:
- it explains the few key concepts extremelly well
- the exercises were truly outstanding, really testing your understanding of subtleties of above concepts
It's very old and underrated. Many people have problems getting started with the command line and basic UNIX tools.
This is _THE_ place to learn about this.
FWIW, "The Goal: A Process of Ongoing Improvement" by Eli Goldratt, almost certainly was the inspiration for The Phoenix Project, and is IMHO a better read. One could follow up with any of Goldratt's other books for more information about the Theory of Constraints.
Another vote for The Phoenix Project. It really helps to set the right mindset for identifying and addressing the multitude of non-technical challenges that quickly become the focus of many (I'd venture most) developers' careers.
To elaborate, the best things you can do for yourself when starting your career are be easy to work with and have a clear picture of what good code/system/project/team/company organization looks like.
Don't worry about coming out of the gate skills-hot. It's a marathon, not a sprint. If you are lucky and good, you will be doing your best work late in your career, not at the beginning.
None of the other recommended books tell you how to name things, and that's always going to be the most important problem to solve anyway ;)
1) The Mythical Man month
3) The Pragmatic Programmer
3) Code Complete.
The thing about these books, well atleast 1 and 3 is that when they were written they broke new ground. Or if that phrase bother you, they were the first mainstream publications that brought their core ideas to developers.
Reading these books early in your career will help cement these best practices.
Reading these books after you've been a practicing programmer means,IMHO, that the return you get from reading them goes way way down.
You'll find that you've already learned all/most? of what they are trying to teach.
You'll find yourself getting frustrated that they are preaching what you already know as common sense and first principles.
Or put another way, I'm not sure there is much that someone who has programmed for 5-10 years can get out of those books that they haven't picked up somewhere else already or learned the hard way.
Code Complete: http://codecourse.sourceforge.net/materials/Code-Complete-A-...
Definitely check out "The Pragmatic Programmer"! There's definitely some good nuggets in there that helped me. Distinguishing full-blown prototypes vs. prototypical kernels that can be productionized, a.k.a. tracer bullet prototyping, is one.
This rejuvinated my interest and productivity for reading that book.
1. Coders at Work
Peter Seibel does an amazing job of asking programmers questions that make them explain their methodology. The interview with Donald Knuth is awesome; really enjoyed hearing him talk about literate programming.
2. The Soul of a New Machine
Tracy Kidder's 1981 Pulitzer Prize winner I think is a brilliant case study on how engineers work together and the things that can go wrong and right with different personalities interacting with highly technical ideas. The project in this book starts without the consent of management, which to me shows the value of questioning the system to add business / engineering value.
3. Little Schemer
Small book that will give your brain a serious workout and show you how to problem solve with Lisp like languages. Even if you never end up using a Lisp dialect, this book expands your brain.
I have more here, all of which I recommend for software and other careers http://benbrostoff.github.io/books/
I think too many people approach the industry thinking programmers are god-like deities who have an unlimited amount of time and brain power. Coders at Work does a great job breaking down the "imposter syndrome" plaguing new people coming into the industry.
While they're not strictly software or programming related, I really like the concepts of making interfaces that require minimal thought to use and empathizing with your users. I've seen an unfortunate amount of "programming machismo" where a confusing or poorly engineered system is used and accepted because "that's just how things work in the real world". And whenever someone struggles with the process, it's obviously because they're wrong, not the system. But more often than not, if more than one person has trouble understanding your system, whether it's an API, a website, a build process, the design is the issue.
Some people are inevitably going to recommend The Art of Computer Programming, which hardly anyone has read and isn't that relevant to the work that 99% of us are doing.
Someone will probably recommend The C Programming Language, also called K&R after the authors, but again it's not very useful unless you're going to be using a lot of C and even then I personally don't think it provides anything you can't get from guides on the internet. (I have actually read this one, but it's been a while)
There are other classic textbooks that will probably be mentioned that are only useful to those in that domain. Many of us can get by without a deep understanding of algorithms and data structures, most people don't need to read a compiler book, etc, etc.
However, there are some generalized books that people often recommend like The Pragmatic Programmer and Code Complete. These are, in my opinion, good recommendations if you're looking for something to read but I wouldn't say that someone starting a career in software engineering should read them. Software engineering isn't really a field with seminal texts that should be read by everyone.
For example, every political scientist should have probably read The Republic by Plato and Politics by Aristotle among many other texts. I don't think software engineering has that equivalent, partially due to the relative newness of the field and partially because the primary output of our field is not written texts.
Another interesting question would be "What codebases should someone starting their career in software engineering look at?". Are there things that the average joe programmer can learn by poking around the Linux kernel or Firefox? Maybe. I don't know. I've never done it. I'd be interested in hearing from those who have, though. Maybe I'll do my own ask HN.
edit: I feel I should clarify that this is written from the perspective of a software engineer, not an academic in computer science. For all I know there could be seminal texts that those on the academic side should all have read.
If you want to learn C - there are plenty of resources that work just as well. The good ones cover things that didn't exist back then. (I've only read the original K&R from before ANSI, not one of the latter edition(s) so I can't comment on how up to date the latest version is)
And, if you do decide to dive in and read them, plan to spend a few years on them.
[1] https://www.slideshare.net/tboubez/5-things-i-learned-toufic... [2] https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_tes...
The Architecture of Open Source Applications[2] series is a good one for leaning how to build production applications and you can read it online. The chapter on Scalable Web Architecture[3] is a must-read.
[0] https://www.amazon.com/Designing-Data-Intensive-Applications...
[1] https://news.ycombinator.com/item?id=15428526
[2] http://aosabook.org/en/index.html
[3] http://aosabook.org/en/distsys.html
A lot of tools and patterns you don't see in school that describe how most of the "magic" behind high-powered software we use is implemented.
But Kleppman's book is genuinely and outstandingly useful for understanding the various components involved in modern backend architectures.
I read this in like a week at one of my first jobs. I learned so much that in a few days my status in the team radically changed and became the go to person when people's scripts didn't work; word spread and soon I had people from other teams seeking help with their scripts too. No one else read the book though AFIK ...
What I really liked about this book at the time:
- it explains the few key concepts extremelly well
- the exercises were truly outstanding, really testing your understanding of subtleties of above concepts
One for the ages.
It's very old and underrated. Many people have problems getting started with the command line and basic UNIX tools. This is _THE_ place to learn about this.
1) Clean Code 2) The Phoenix Project 3) UNIX and Linux System Administration Handbook
I'm sure #2 will be something folks want to fight over shrug. If you want to sidestep years of headache it's a must-read though.
Don't worry about coming out of the gate skills-hot. It's a marathon, not a sprint. If you are lucky and good, you will be doing your best work late in your career, not at the beginning.
None of the other recommended books tell you how to name things, and that's always going to be the most important problem to solve anyway ;)