“Cracking the Coding Interview” by Gayle Laakmann McDowell

My Favorite Programming Books for Learning Software Development

I read 20+ books while learning software development, these are my favorites

Parker Klein ✌️
Published in
7 min readSep 26

In 2016, I started learning web and mobile app development.

At the time, I was reading a lot of books and watching a lot of tutorials.

I went on to work at a startup in San Francisco, Google, and recently started my own tech company.

These are the books that helped me the most on a few different topics.

Programming Principles

The Clean Coder by Robert Martin

If you are tired or distracted, do not code. It creates waste. Find a way to eliminate the distractions and settle your mind.

As an engineer, you have a depth of knowledge about your systems and projects that no managers can possibly have. With that knowledge comes the responsibility to act.

It is the responsibility of professional developers (and stakeholders) to make sure that all ambiguity is removed from the requirements.

Manage your stress. Sleepless nights won’t help you get done any faster. Sitting and fretting won’t help either. And the worst thing you could do is to rush! Resist that temptation at all costs. Rushing will only drive you deeper into the hole.

Read the rest of my notes here:

The Pragmatic Programmer by Andy Hunt

Kaizen — continuously make small improvements.

Be aware of the bigger picture, think beyond the immediate problem.

Design components that are self-contained: independent, and with a single, well-defined purpose.

Organize code into modules and limit the interaction between them.

Read the rest of my notes here:

Clean Code by Robert Martin

In software, 80% or more of what we do is quaintly called “maintenance”: the act of repair.

The 5S philosophy: Sort (organize, naming is crucial), Systematize (tidiness, a piece of code should be where you expect to find it — and if not, you should re-factor to get it there), Shine (cleaning, get rid of comments and waste), Standardization (consistent coding style and practices), and Self-discipline (follow the practices, reflect on one’s work, and be willing to change).

Clean code’s logic should be straightforward to make it hard for bugs to hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as not to tempt people to make the code messy with unprincipled optimizations. Clean code does one thing well.

Don’t comment bad code — rewrite it.

Read the rest of my notes here:

Programming Pearls by Jon Bentley

Focus on the right problem: defining the problem is 90% of the battle.

Simple design: a designer knows he has arrived at perfection not when there is no longer anything to add, but when there is no longer anything to take away.

Simple programs are more reliable, secure, robust, efficient and are easier to build and maintain.

Understand the code at all times and resist those foul urges to “just change it until it works.”

Read the rest of my notes here:


HTML and CSS by Jon Duckett

Whenever you have many different colors in a picture you should use a JPEG.

If you want a link to open in a new window, you can use the target attribute on the opening <a> tag. The value of this attribute should be _blank.

Read the rest of my notes here:

CSS Secrets by Lea Verou

Use percentages instead of xed widths. When that’s not possible, use viewport-relative units (vw, vh, vmin, vmax), which resolve to a fraction of the viewport width or height.

Media query thresholds should not be dictated by specific devices, but by the design itself.

Shadows don’t work exactly like borders, as they don’t affect layout and are oblivious to the box-sizing property. However, you can emulate the extra space a border would occupy via padding or margins (depending on whether the shadow is inset or not).

Read the rest of my notes here:


Eloquent Javasscript by Marijn Haverbeke

6 basic types of values: numbers, strings, booleans, objects, functions, and undefined.

Comparison of alphabetic strings is by unicode value: “Z” < “a”, “a” < “z”.

In JavaScript, functions are the only things that create a new scope, not blocks.

Month numbers start at 0 for JavaScript Date, but days start at 1.

Read the rest of my notes here:

JavaScript: The Definitive Guide by David Flanagan

A function is a named and parameterized block of JavaScript code we define once and can them invoke over and over again.

The “this” keyword refers to the object on which the method is defined.

Variables are untyped.

JavaScript objects are compared by reference, not by value.

Read the rest of my notes here:


The Design of Everyday Things by Don Norman

Good designs fit our needs so well that the design is invisible, serving us without drawing attention to itself.

Two of the most important characteristics of good design are discoverability and understanding. Discoverability: Is it possible to even figure out what actions are possible and where and how to perform them? Understanding: What does it all mean? How is the product supposed to be used? What do all the different controls and settings mean?

Design is concerned with how things work, how they are controlled, and the nature of the interaction between people and technology.

Read the rest of my notes here:

Don’t Make Me Think by Steve Krug

Usability really just means making sure that something works well: that a person of average (or even below average) ability and experience can use the thing — whether it’s a Web site, a fighter jet, or a revolving door — for its intended purpose without getting hopelessly frustrated.

If something requires a large investment of time — or looks like it will — it’s less likely to be used.

There is no one “right” way to design Web sites.

We don’t read pages. We scan them.

Read the rest of my notes here:

Programming interviews

Cracking the Coding Interview by Gayle Laakmann McDowell

The ability to communicate thoughts and ideas, in a clear, concise manner, is an absolutely invaluable skill that employers seek.

5 steps to solving a technical question: 1. Ask questions to resolve ambiguity. 2. Design an algorithm. 3. Write pseudo-code. 4. Write code. 5. Test your code.

Problem solving steps: 1. Listen. 2. Debug example. 3. Special cases. 4. Brute force. 5. Optimize. 6. Walk through optimized solution. 7. Clean up code. 8. Test. 9. Test with special cases.

Beautiful code: modularize, error checks, use classes/structs/enums, good variable names.

Read the rest of my notes here:


Use code “BALLER”



Parker Klein ✌️

Codin' 👨‍💻 + oatin' 🥣. Formerly @Google @Qualcomm @PizzaNova. Building the best place to write *things* down: Twos (www.TwosApp.com?code=baller)

Recommended from Medium


See more recommendations