Programming Book List

Sr No Book followed by author
1 About Face – The Essentials of Interaction Design
2 Advanced Programming in the UNIX Environment by W. Richard Stevens
3 Agile Principles, Patterns, and Practices in C# by Robert C. Martin
4 Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin
5 Algorithms + Data Structures = Programs
6 Algorithms for Interview by Adnan Aziz and Amit Prakash
7 Alice in Wonderland by Lewis Carol
8 Best Software Writing I by Joel Spolsky
9 Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin
10 CLR via C# by Jeffrey Richter
11 Code Complete (2nd edition) by Steve McConnell
12 CODE by Charles Petzold
13 Coders at Work by Peter Seibel
14 Compilers: Principles, Techniques and Tools by Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman
15 Computability by N. J. Cutland
16 Computational Beauty of Nature
17 Computer Graphics: Principles and Practice in C (2nd Edition)
18 Computer Systems – A Programmer’s Perspective
19 Continuous Delivery
20 Cracking the Coding Interview
21 Design Patterns in C# by Steve Metsker
22 Design Patterns by the Gang of Four
23 Domain Driven Designs by Eric Evans
24 Don’t Make Me Think
25 Effective C++
26 Effective Java by Joshua Bloch
27 Foundations of Programming by Karl Seguin
28 Framework Design Guidelines by Brad Abrams
29 Getting Real by 37 Signals
30 Gödel, Escher, Bach by Douglas Hofstadter
31 Growing Object-Oriented Software, Guided by Tests
32 Hackers and Painters: Big Ideas from the Computer Age
33 Hackers: Heroes of the Computer Revolution
34 Here Comes Everybody: The Power of Organizing Without Organizations by Clay Shirky
35 How To Solve It by George Polya
36 Introduction to Algorithms by Cormen, Leiserson, Rivest & Stein
37 Introduction to Functional Programming by Philip Wadler and Richard Bird
38 JavaScript – The Good Parts
39 JUnit in Action
40 Learn to Program by Chris Pine (2nd Edition)
41 Learning Python
42 Mastering the requirement process by Suzzane and James Robertson
43 Masterminds of Programming
44 Masters of Doom
45 Modern C++ Design by Andrei Alexandrescu
46 Modern Operating Systems by Andrew S. Tanenbaum
47 More Effective C++
48 No Bugs! by David Thielen
49 Object Thinking by Dr. David West
50 Object-Oriented Analysis and Design with Applications by Grady Booch
51 Paradigms of Artificial Intelligence Programming: Case studies in Common Lisp
52 Patterns of Enterprise Application Architecture
53 Patterns of Enterprise Application Architecture by Martin Fowler
54 Peopleware by Demarco and Lister
55 Philip and Alex’s Guide to Web Publishing
56 Practices of an Agile Developer
57 Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt
58 Pragmatic Unit Testing in C# with NUnit by Andy Hunt and Dave Thomas with Matt Hargett
59 Programming Pearls by Jon Bentley
60 Refactoring to Patterns by Joshua Kerievsky
61 Refactoring: Improving the Design of Existing Code
62 Rework by Jason Freid and DHH
63 Ruby on Rails 3 Tutorial: Learn Rails by Example by Michael Hartl
64 Smalltalk-80: The Language and its Implementation
65 Software Estimation: Demystifying the Black Art by Steve McConnel
66 Structure and Interpretation of Computer Programs
67 Surely You’re Joking, Mr. Feynman!
68 Test-Driven Development: By Example by Kent Beck
69 The Alchemist by Paulo Coelho
70 The Annotated Turing
71 The Art of Agile Development
72 The Art of Computer Programming by Donald Knuth
73 The Art of Deception by Kevin Mitnick
74 The Art of Unix Programming
75 The C Programming Language by Kernighan and Ritchie
76 The C++ Programming Language (3rd edition) by Stroustrup
77 The Career Programmer: Guerilla Tactics for an Imperfect World by Christopher Duncan
78 The Deadline: A Novel About Project Management by Tom DeMarco
79 The Design of Everyday Things by Donald Norman
80 The Elements of Computing Systems
81 The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity
82 The Little Schemer
83 The Mythical Man Month
84 The Passionate Programmer (My Job Went To India) by Chad Fowler
85 The Practice of Programming by Kernighan and Pike
86 The Pragmatic Programmer
87 The Productive Programmer
88 The Seasoned Schemer
89 The Soul of a New Machine by Tracy Kidder
90 The Tao of Programming
91 The Tao Te Ching
92 The Timeless Way of Building by Christopher Alexander
93 Things That Make Us Smart by Donald Norman
94 Thinking in Java by Bruce Eckel
95 Violent Python: A Cookbook For Hackers, Forensic Analysts, Penetration Testers And Security Engineers
96 Why’s (Poignant) Guide to Ruby
97 Working Effectively with Legacy Code
98 Working Effectively with Legacy Code by Michael C. Feathers
99 Writing Secure Code (2nd Edition) by Michael Howard
100 Writing Solid Code
101 Writing Solid Code by Steve Maguire
102 Zen and the Art of Motorcycle Maintenance by Robert M. Pirsig

To enhance programming skills, you need to focus on following.

  • Programming Languages
  • Data Structures
  • Algorithms
  • System understanding

To keep my answer short, I will not suggest any books, but keep myself limited to overview of each topic. Each topic is a big subject of interest in itself. But you can try to grab as much possible gradually in long term. I have also shared some tips from David Byttow (Co-founder of Secret). First let’s have a look at above topics.

Programming Languages

• Never limit yourself to one language. Keep learning multiple languages – one procedural, one object-oriented, one scripting, one functional, etc.
• Also, don’t try to learn too many languages in a short time span. Gradually keep learning one new language every year. But never forget the old one you learnt.
• Don’t focus only on syntax. Focus on the paradigm of the language, its weaknesses and strengths. Understand where each language fits well. Learn what the language designed to offer.
• Good hold on 3-4 languages will give you a very nice insight about these languages, which will be useful to you.
• Keep practicing a lot. Almost daily you must write a program, even if it is a 10 lines program. Make it a never dying habit.

Data Structures

• Learn all the basic data structures – array, list, tree, graph, trie, dictionary/map, set, etc.
• Learn the advanced data structures whatever you can – suffix array, suffix tree etc.
• Implement data structures in whatever languages you know.
• Understand the basic operations (read, write, etc,) time complexity for those data structures.
• Understand the strength & weaknesses of each of those.
• Remember the data structure support by the language libraries (STL, classes etc.).
• Keep playing a lot with those.

Algorithms

• Learn all the easy algorithms – sorting, searching, graph algos, etc.
• Learn all the advanced algorithms whatever you can – dynamic programming, backtracking, etc.
• You need to master algorithm complexity computation.
• You need to learn how to design your custom algorithm as per the need.
• Keep implementing lots of algorithms.

System Understanding

• Understand your target OS nature. What your OS supports? How a process is being executed? etc.
• Understand program segments – data, text, stack, heap, etc.
• If your language is based on virtual machine, then learn how your VM works at a high level.

Tools [Optional]

• Choose a suitable editor.
• Prefer compilers, build tools which follow the standards.
• Learn static analysis tools, profiling tools.

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

Tips from David Byttow (Co-founder of Secret)

1. The more you code, the better you’ll get.

it’s that simple. By coding, you’re practicing. But the best practice is focused practice. Have goals in mind, explore new areas, and challenge yourself. Over time, you should develop a portfolio of both unfinished and finished projects. GitHub is a great place to put this portfolio on display, but just having an eclectic body of work is huge.

2. Re-build the wheel.

You should implement the most common data structures in the language you’re trying to learn. Do not rely on common libraries. Implement the following and write tests for them: vector (dynamic array), linked list, stack, queue, circular queue, hash map, set, priority queue, binary search tree, etc. You should be able to implement them quickly as you get more comfortable with the language.

3. Solve word problems.

Spend time coding solutions to different types of problems. One of the best resources is TopCoder. Read this, then try solving problems. Pick those that test your ability to implement recursive, pattern-matching, greedy, dynamic programming, and graph problems. Just go through a bunch of archived problems.

This is probably the number one reason I was hired at Google. I spent literally two weeks obsessed with TopCoder. After that, I could code Dijkstra’s algorithm with my eyes closed and one arm tied behind my back. I could solve almost any kind of graph-problem under the sun. It was all problem-solving repetition. And as Eric Schmidt says, “Repetition doesn’t spoil the prayer.”

4. Build small products.

Look at the startups around you, can you rebuild some portion of their product? Chances are you can do it in a weekend. You can build the initial essence of Google in a weekend (PageRank over a structured document corpus) if you really want.

Again, just keep coding. Keep a growing list of projects and ideas for what you can build in minutes, days and weeks.

Source: Stackoverflow and Quora.