Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Ask HN: Books That Dramatically Transformed Your Programming Skills
29 points by 0xperke on Sept 4, 2024 | hide | past | favorite | 28 comments
What books on programming, software development, and related topics have you read in the past that profoundly changed your skills as a developer, to the point of being life-changing?

On HN, we often hear about books like SICP or TAOCP, but what other influential books should everyone read, even in 2024?



97 Things Every Software Architect Should Know. Hands down. I just came across A Philosophy of Software Design and it looks good, but I haven't finished it yet.

My experience has been that 'programming' is largely about learning best practices, single responsibility, modularity, writing efficient, clean code. There are no real special books necessary for this, just read the industry standard recommendations.

But if you want to set yourself apart from others you need to study software design and architecture, and follow the big industry names on social channels. Designing software is more of an art and figuring out how to do it isn't immediately obvious or easily attainable from books. It takes years of experience and wide reading, and a lot of what I've learned about it has come from social media, not books.


thank you for your point of view!

Which big industry names on social media would you recommend following?


One good way to do it is to follow Kent Beck on Linkedin. He's constantly reacting to other software influencers, and if you like the point of view of the other influencers, follow them too. Over time follow who you like, unfollow who you don't like. I'd also recommend following Jason Gorman.

And sign up for a Mastodon instance and create a software list. These people are much more candid there than they are on Linkedin.


A Philosophy Of Software Design by John Ousterhout comes with a great way to look at how to design software modules. Found it by recommendation here on HN.


FYI, there is also a talk by him, which is pretty good too:

https://www.youtube.com/watch?v=bmSAYlu0NcY


Looking forward reading it - already ordered it last week :)


On the programming side:

* Thinking Forth by Leo Brodie

* Lisp In Small Pieces by Christian Queinnec

* Compilers (the Dragon Book) by Aho, Sethi, and Ullman

* Smalltalk-80 (the Blue Book) by Goldberg and Robson

But on the non-technical side, the book that probably had the biggest impact on my career was "What Color Is Your Parachute" by Richard Bolles. It is what convinced me I could transfer my skills from video game dev into another field and how to come up with a plan to do so.


Ill mention a few books and how they've helped me become a better programmer.

- Structure and Interpretation of Computer Programs: this helped me understand the different types of recursion; how a problem can be modeled for the code to solve and how those designs can evolve and how the paradigm I'm using (functional or OOP) can help me

- Refactoring: this book helped me understand the different patterns we can use to alter code. Giving them a name and symptoms is a great way to apply and communicate with other coders. I recommend this book to everyone.

- The little Lisper: this really helped me get recursion. Like really. Although I could use a refresher.

- Clean code: look... this book is bad. Like, really bad. But, at the time I read it, and in the languages I used (Python, C, R) we didn't have many rules on how to write and organize our programs. And I wanted to improve on that skill. And this book gave me pointers and made me think about those ideas. I don't recommend it around, because for many people Clean Code can become a dogma really easily. But if you can question and critique and reach out to other resources and is an advanced beginner to coding, I can see this book bringing value.

- An Elegant Puzzle and Staff Engineer by Will Larson: those helped me get clarity on the role of the technical team in an organization. A team that produces code as the main driver of impact in a product/service. I lump them both because I read them back to back and don't remember, exactly, which is which. But une is more focus on a tech leader and the other a tech specialist.

- Unix and Linux System Administration Handbook: whenever I need to interact with some unix technology, this book delivers in terms of giving me a nice historical view and presenting the common tooling around the tool. This helps me interact with stuff programmatically much better. Be it GRUB, X, SAMBA, this book gave me the necessary introduction I needed, much more organized and thought out and with useful references than the average blog post you will find in the wild.

And I'd like to recommend this Ask HN on problem solving books

https://news.ycombinator.com/item?id=33797862


thanks a lot for your recommendations and how they helped you!


As a backend engineer, I've always thought building decent-looking UIs would be beyond my abilities, until I read Refactoring UI


My first learning on data structures came from https://www.amazon.com/Definitive-XML-Schema-Priscilla-Walms...

Not a book but I learned what not to do and what to avoid in my earliest days of programming from the super opinionated tool JSLint.

This was my go to reference to learn CSS https://www.amazon.com/CSS-Pocket-Reference-Visual-Presentat...

As for language design I am mostly self taught through a lot of trial and error. For me it’s all about functions and variable scope. After that everything else is just a statement, expression or a data structure. With that I can write just about anything, make it scale, and keep it super simple to read.


None. The best way to get way better at programming is to work on code bases written by people that are much more skilled than you. You cant learn math by purely reading a math book, you have to work the exercises. Go find an expert code base on github and hack on it, or work at a company on a team with very high programming standards


+1. I can nod my head while reading many books. It isn't until I encounter situations and apply solutions that I really learn things. More than specific books, the greatest thing I've learned is how to view a system. Thinking about underlying constraints (e.g. database) or boundaries communicating with other systems are the hard-points. All the stuff that happens in-between is mostly plumbing with a small bit of (hopefully) well factored key logic implementation.

Learning different kinds of things, e.g. distributed databases, functional languages, metaprogramming methods, etc makes you appreciate what they can do and makes you better because you can choose to apply some of those structures in more popular environments when they are beneficial (e.g. use of immutability vs shared mutable states).

Working on larger codebases with many developers, and for a long duration lets you grow from programming to software engineering for longer term goals that optimize effectiveness both in implementations but also the people processes that can work well or poorly depending on the choices made.


None

Agreed.

work on code bases written by people that are much more skilled than you

Two problems here. First, you can’t really be sure if they are skilled or publicly confident. Although learning confidence is useful too, for the same reason.

Second, you can only see what they do, not what they learned to avoid. The best way to get better is to write your own code, assuming you’re at least fluent. That will teach you what to avoid and you also learn your general predispositions and code anxiety/perfectionism levels. Good reflection on that will improve you a lot. I don’t think just parroting someone’s code makes you better, unless you’re very beginner.


Depends on your definition of "skilled" people.

I once had to work the codebase of a consultant who build up his business by having less of a T profile and more of a slightly thick, incredibly long _____ profile. His code was attrocious and borderline impossible to refactor because he never stuck to a language long and consistently enough to actually learn anything resembling code discipline or hygiene. He was always too busy learning the quirks of the language and framework, which took precedence over elegance


any recommendation how to find good github projects to look into?


What programming language are you interested in?

Usually you can go to GitHub, find a project with a lot of stars for the language you want and start browsing the code. It is worth paying attention to the general attributes of good codebase: tests, documentation, build automation. If all this is there, then most likely you will definitely find something interesting or new for yourself.


C# /.NET and JavaScript / Typescript


Well, not exactly a book and not necessarily something I recommend everybody reads, but when I was getting started (early 80's) I purchased a copy of the source code to HDOS, the HeathKit Disk Operating System (written by J. Gordon Letwin, who went on to work on IBM's OS/2). I spent many months poring over every line of 8080 assembly language code in that massive set of bound photocopies of source code printouts. The OS itself, device drivers, command shell, assembler, BASIC interpreter...everything was there. I don't think anyone can realistically do the same thing on a modern system but that experience taught me so much about programming and software engineering.


From non-university stuff, I did not read the book but I read the derivative works and applied it to my life: Getting Things Done. Specifically, Inbox Zero changed my life and made me a better programmer by having me become way more organized and on top of everything.


The Mythical Man Month by Fred Brooks

Refactoring by Martin Fowler

System/370 Principles of Operation by IBM


The best programmers aren't ones who have memorized how to do stuff based on read materials, the best programmers are ones who can look at any piece of software, from a front end application, to embedded microcontroller, and know exactly how to recreate it.

There is a reason why electrical/computer engineering graduates tend to outperform CS graduates in both general skill and the job market. If you understand how computers do the stuff they do, and can think in that manner, thinking in higher level abstractions becomes very easy.


Sorry, you lost me there. I am CS and literally every single one colleague in IT with an electrical engineering background where subpar compared to CS students. (Of course I don't claim that is true in generell or for that there are no electrical engineers who can be great developers.)

One background I will respect is mathematicians, it is always a joy to learn from them and the can model very nice abstractions. Again, in my personal experience, no claim how general this is or that there are no exceptions.


>IT

This is a different field. Many software engineers have no clue how to set up networks or administer things like routers or firewalls. At the same time IT people usually don't know how to write things like backends for web apps.


No, it means something more generic.


Thank you for your input! However, could you elaborate on how you arrived at that conclusion? The field of computer science is so vast that it can be challenging to identify which specific knowledge or skills will give you a significant advantage.


>The field of computer science is so vast

Its vast if you approach it top down (higher abstractions to lower abstractions), seeing all the different languages/frameworks, but if you approach it the other way, you realize that every higher abstraction is pretty simple.

When you start learning things like python, or js, and then move to things like C++/C/Rust, or learn frameworks like react, you get left with a sense that each one of those things is like a separate thing where you have to memorize patterns of how to do stuff.

When you learn from the ground up, like understanding how a CPU works, every new thing that you learn immediately fits in to what you already know as a simpler way to do a combination of low level CPU operations, and you immediately recognize patterns. Memorizing syntax becomes unnecessary, since you can figure things out on the fly.

To give you a real example, most leetcode problems that get asked in interviews pretty much involve some pointer manipulation under the hood. So when you work with enough low level C and assembly, figuring out how to do things more efficiently without copying data around, you can pretty much ace leetcode medium problems without studying.


Programming Pearls by Jon Bentley comes to mind. Loved it when I read it and opened my mind to a new level of programming




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: