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|
|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|
|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|
|39||JUnit in Action|
|40||Learn to Program by Chris Pine (2nd Edition)|
|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
- 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.
• 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.
• 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.
• 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.
• 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.
• Choose a suitable editor.
• Prefer compilers, build tools which follow the standards.
• Learn static analysis tools, profiling tools.
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.