I read Jeff CogswellJeff Cogswell article Changing Good Programmers into Great Programmers. I liked the article and in many parts I agree with him. Good programmers are born, great programmers are made.
How are great programmers made?
First they must know the fundamentals, basic algorithms, data structures and be familiar with information resources.
Second, they must be to solve efficiently and effectively they problem in hand and only this. This is the most difficult part. When we design a class library it feels so good to add all that “cool” features we want. Is it relevant to the immediate problem in hand? If it is then by all means write it. If it is not make a note and move on. Make everyone happy and write code that is scalable and bug free. Multithreading, processes, portability and scalability gives us enough challenges to build systems. My opinion is that every good programmer has to know the following:
1. The fundamentals (Algorithms, data structures, Object Oriented Analysis and Design)
2. State machines / Discrete mathematics
3. Where to find information (Searching)
4. The documentation
5. Time management
Must books to read are Code complete2 by Steve McConnell and Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides.
I have seen good code and bad code. The best way to understand computer programming is to build an example and then stress it. Know the tools. How you know if you right good code? The answer is simple. Try to fix or restructure a program you wrote a year after you have finished it or try to show the code to another professional for review.
As a conclusion, the main thing that comes to my mind as an advice is to experiment, read, learn and build great programs.