To enhance programming skills, you need to focus on the following 4 topics.
- 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.
- 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.
- Write a lots of code, compile, run, debug.
- Read lots of code authored by others, may be from popular open source projects.
- Keep learning new languages, new data structures, new algorithms, new tools year after year.
By : Swarup-Sahoo