I’ve done my best to curate the books that kept me interested in software development when I was first starting out. I have to thank the authors mentioned below for introducing me to the lucrative and exciting world of software engineering.

The C Programming Language by Brian Kernighan is a foundational book in software engineering. Even if you’re not interested in embedded systems programming, learning the basics of C is critical for an intuitive understanding of how a computer works.

Many modern languages and design patterns will often (but not always) relieve you from the responsibilities of managing memory, directly interfacing with the operating system, or dealing with types. While these modern conveniences are usually worth the runtime performance tradeoff, having a working knowledge of C will give you an intuition for how other languages, such as Python, are implemented. Since most embedded software, including the Linux kernel, is implemented in C, having a strong grasp of the language opens up a large set of career opportunities.

Head First Java has a special place in my heart because it was the first book I found that made programming seem approachable and fun. It’s a really thick book, weighing in at 688 pages and 3.1 pounds, but you can breeze through it pretty quickly because a large percentage of the content is presented in the form of cheeky cartoons used to demonstrate various concepts of Java programming.

My favorite thing about this book is that the authors seemed truly obsessed with making it impossible to not understand the material. I can almost guarantee that anyone who finishes this book will have a solid takeaway, regardless of your age or background. If you’re interested in learning Java as a first programming language, I cannot recommend this book enough.

Usually a book on design patterns wouldn’t be on a list for beginners, but this one in particular is so beginner friendly that it would be a disservice to not mention it. Typically, people bring up the famous Gang of Four (GoF) book, which is a jam-packed, no-nonsense reference manual of design patterns. Head First Design Patterns, on the other hand, is a light introduction to design patterns for a novice software developer.

If I were teaching software development to someone who was looking to become a professional Java or Android developer in a short period of time, this would be the second book I would present them after finishing Head First Java.

Code: The Hidden Language of Computer Hardware and Software is a book about the man behind the curtain of computation. If I had to pick one computer science text to recommend to friends and family, this would be it. Code takes concepts we take for granted, such as storing alphanumeric values digitally or performing floating point arithmetic, and explains them with a bottom-up approach. Petzold takes the magic out of these topics and replaces it with appreciation and intrigue.

Upon completion of Code, you’ll have a good understanding of how a computer converts source code into the machine’s native language and how the CPU then executes the resultant binary. Code is a captivating adventure through the building blocks of digital computing.

Zed Shaw has had his share of bad press. Nevertheless, his book, Learn Python the Hard Way (LPTHW), is recognized by most as being the very best introductory book on Python programming.

LPTHW will take you from zero knowledge of programming to having enough familiarity with the language to take advantage its expansive and easily accessible library collection. After working my way through LPTHW, I was able to easily write some 2D games using Pygame. I read LPTHW when I was a freshman in college and I still recommend it to interns at my company who are learning Python for the first time.

Every programmer should play with an Arduino at some point in his or her career. The satisfaction of manipulating the physical world with code is enough to keep anyone motivated, and it’s easier to get started than one might think. Exploring Arduino by Jeremy Blum is an excellent introductory text for anyone interested in electrical engineering or embedded software development. Exploring Arduino does an excellent job of explaining basic electronics concepts, from motors to shift registers to interfacing with LCDs. Upon completion of Exploring Arduino, you’ll have enough confidence with programming Arduinos to do a wide array of home electronics projects. Plus, you’ll learn some basic C programming along the way.

If you choose to get Exploring Arduino, I highly recommend buying this starter kit to ensure that you have all of the parts necessary to work through the book, since it can be pretty frustrating waiting for hardware between chapters.

I picked up The Linux Programming Interface after being hired onto an embedded software engineering team after obtaining my degree. I quickly worked through all of the exercises in the book, gaining more and more confidence with the Linux API as I progressed through the book. If you’re curious how basic tools such as cat or tee are implemented or you want to learn network programming in C, The Linux Programming Interface is an incredible book to have by your side. Although this book’s focus is interfacing with the Linux API, this book has incredible depth and breadth, thoroughly explaining topics such as memory mapping, concurrency, race conditions, message queues, networking protocols, shared objects, and more.

For such a comprehensive book on such a wide variety of topics, TLPI is shockingly approachable even for a software engineer in the beginning stages of his or her career.

I hope this article was helpful. You can follow the discussion on reddit here.