#Recommended Reading

Many of us at Vokal do not have Computer Science degrees. Many of us who do have forgotten much of what we learned in school - or learned some very important parts of being a software engineer outside of school. Therefore, we've decided to maintain a list of recommended reading for anyone wishing to broaden their horizons.

This list is broken down roughly by subject matter:

What can I do to write better code?

####The Pragmatic Programmer: From Journeyman To Master
by Andrew Hunt and David Thomas

A modern classic of Software Engineering, covering around 70 tips for crafting cleaner, clearer, and more maintainable code.

Think Like A Programmer: An Introduction to Creative Problem Solving

by V. Anton Spraul

Instead of focusing on tools and techniques for coding, this book focuses on where to start before you even write a line of code: How do you solve complex problems in an elegant fashion?

Code Complete: A Practical Handbook of Software Construction

by Steve McConnell

A 900 page encyclopedia of best practices for Software Development. Note that while this is published by Microsoft, its concepts are more broadly applicable.

Clean Code: A Handbook of Agile Software Craftsmanship

by Robert C. Martin

Taking code that is readable and understandable by new devs as its highest requirement for "cleanliness", this book gives guidelines on how to make sure your code is as clean and maintainable as possible.

####Working Effectively With Legacy Code
by Michael Feathers

A guide to inheriting a giant project that someone else built, wrapping your head around it, and making it better (without breaking anything in the process).

####Java Concurrency in Practice
by Brian Goetz, Tim Peierls Joshua Bloch, Joseph Bowbeer, David Holmes, and Doug Lea

While this book focuses on Java, the first few chapters are significantly more conceptual and don't feature a lot of code. This a solid read for all developers who work in multithreaded environments.

####Design Patterns: Elements of Reusable Object-Oriented Software
by the "Gang of Four", aka Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides

The bible of Object-Oriented architectural patterns.

####The Best Software Writing I
compiled by Joel Splosky

A collection of 29 essays on software development, curated by the co-founder of StackOverflow and Trello.

How do computers work?

####Operating System Concepts
by Abraham Silberschatz, Peter B. Galvin, and Greg Gagne

As the title suggests, this is an abstract/conceptual look at how operating systems work. There are very low level details about a number of operating systems, but little rhyme or reason as to which systems are covered where. For example, chapters on schedulers might cover examples from Windows and Linux but not FreeBSD or OSX. Because of this tendency, this book is suggested for more general knowledge.

Dissecting DOS

by Michael Podanoffsky

A bit older, but a fun look at tearing apart one of the most revolutionary operating systems to rebuild it and see what makes it tick.

Linux Kernel Development

by Robert Love

A great way to gain a better understanding of the operating system that underlies most of our server-side machines (and has a similar structure to Mac and iOS).

####Mac OSX and iOS Internals: To The Apple's Core
by Jonathan Levin

An in-depth look at the inner workings of Apple Products. Note: Last updated in 2012, so there may be some bits that have changed since then.

Computer Networking: A Top-Down Approach

by James F. Kurose and Keith W. Ross

Get deep into the nitty gritty of how computers talk to each other over a network.

Compilers: Principles, Techniques, and Tools

by Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman

A great overview of how compilers take the code you've written and analyze it, then turn it into something a computer can understand.

How do projects work?

The Mythical Man-Month

by Fredrick P. Brooks, Jr.

The canonical guide to why adding more manpower to a late software project only makes it later, from a former project manager at IBM.

####Peopleware
by Tom DeMarco and Timothy Lister

Software is difficult. People are much, much more difficult. This is a guide to managing them sanely. As Joel Splosky put it in his Amazon review: "The best way to describe it would be as an Anti-Dilbert Manifesto."