Guided bibliography for the serious self-taught programmer
Published: 2019-09-05 08:27:51

In this article, I attempt to provide an insightful guide for a self-study of programming on modern computer systems.

I hope you enjoy it!

## Start by learning how to program in C

C is an excellent learning tool. It is a high level way of doing low-level things. Familiarity with a statically typed language and a firm grasp of pointers and the runtime system is bound to raise the right questions in your mind and lay the foundation for when you are ready to look at operating systems more closely.

To learn C, first learn about GCC – the standard compiler for C and C++. Read this book. Read it from front to back.

![An Introduction to GCC](https://egxdigital.files.wordpress.com/2019/09/gcc.jpg?w=259)

It gives a beautiful and succinct introduction to compiler basics.

An Introduction to GCC requires no prior programming experience.

Next, start writing C programs that use pointers. This is the ONLY way, in my book, to truly begin to learn C – anything else is mere syntax.

![Understanding and Using C Pointers](https://egxdigital.files.wordpress.com/2019/09/uucp.jpg?w=272)

Finish that book. I’ll wait. Once you get back, it is time to read about operating systems.

## Learn Operating System Concepts

Operating Systems are collections of code that together provide an intuitive computing environment for the users of a computer system.

The OS provides abstractions and interfaces for those abstractions so that interacting with a computer becomes easy. One of the most important facilities that the OS provides is the Process.

Processes can be seen as data structures and associated operations that allow the user of an operating system to control a program in execution.

Check out this book on Operating Systems to learn more.

![Operating Systems: Three Easy Pieces](https://egxdigital.files.wordpress.com/2019/09/ostep.jpg?w=259)

Keep in mind that you may not be able to grasp subjects like concurrency and event loops right off the bat. This book provides clear explanations of important things like the scheduler, persistence and memory management in neat digestible chapters of around 30 pages in length.

In addition, the reference lists at the end of each chapter of Operating Systems: Three Easy Pieces make for an *incredible* bibliography for software engineers and computer scientists.

## Learn about how computers work

By this point, you have written a few simple programs, played with a few elementary data structures in C and you now know how important your OS is. You may want to go deeper to truly acquire a sense of how your computer works, unencumbered by an operating system or a particular programming language. 

This book is a good place to start

![Elements of Computing Systems](https://egxdigital.files.wordpress.com/2019/09/ecs.jpg?w=320)

There is also a Coursera course that accompanies the book and a vibrant community of learners that still benefit from what the book offers.

To keep your newfound love for hardware going, learn assembly with this book and start programming registers.

![x86-64 Assembly language Programming with Ubuntu](https://egxdigital.files.wordpress.com/2019/09/assembly64.png?w=324)

Your understanding of high level languages is guaranteed to appreciate, once you see how the machine handles things like variable assignment and loops.

There are concepts in computing that could only be illustrated well enough with assembly language.

For this reason alone, it's worth dipping into some assembly.

Let’s take a breather and recap a bit.

* you started with C
* moved on to operating system concepts
* got started with computer hardware
* explored assembly

Next up, comes this book

![Computer Systems: A Programmer's Perspective](https://egxdigital.files.wordpress.com/2019/09/csapp.jpg?w=325)

After exploring this text, you should have a rigorous set of visual metaphors for how your programs relate to such things as instruction set architectures, bits, bytes, memory and other hardware internals.

## Learn about networking and browsers

I chose to end this guide with network programming because networked applications are among the most useful things you can build. In fact, you might be ready to go in any other direction at this point but I still think these resources are worth taking in.

First up, check  out

![Beej's Guide to Network Programming](https://egxdigital.files.wordpress.com/2019/09/beej.jpg?w=284)

It's a neat introduction to programming with sockets. By the end you have a useful little networked program and a solid understanding of the operating system facilities that most networked applications are based upon.

and last but not least

![High Performance Browser Networking](https://egxdigital.files.wordpress.com/2019/09/hpbn.jpg?w=288)

High Performance Browser Networking begins with a careful explanation of TCP essentials and progresses toward a comprehensive look at HTTP and browser APIs. This is a very enjoyable and informative book on the modern web and its underlying technologies. 

## Conclusion

In my opinion, this is the right way to approach teaching yourself how to program if you desire a career change. These subjects, taken in the prescribed order, should provide you with a solid sense of completion, direction and even inspiration for your next move in learning and doing. 

I hope you enjoyed my guided bibliography for the serious self-taught programmer.

---

*If you enjoyed this article and you appreciate learning about technologies from the ground-up, you might want to check out my blog for more [developer guides](https://egxdigital.wordpress.com). I currently cover C, C++ and other basics tutorials. You can expect to see JavaScript guides and Python guides in the near future so be sure to subscribe and follow me here on DEV.*