My friend Dave, wrote a blog a few days ago, commenting on what he thought made a good programmer. I thought I was respond by listing my own qualifications for a good programmer:
Knows the basics. Know how to open a file, read/write to it, and close a file. Know how to write functions, know basic memory management. In C++, know the difference between 'delete' and 'delete[]' and when to use each one. If you are a programmer and you can't tell me why the following C code is bad, you don't deserve to be a programmer.
char* s = "A";
strcpy( s, "This is a test" );
Keep up with modern technologies. At least having a passing familiarity with some of the other common languages out there - C++, C, Java, C#, Perl, etc. Have at least a passing knowledge of some of the commonplace technologies used in softwae today. If you don't know what XML is, or what object-oriented programming is, you don't deserve to be a programmer.
Does NOT write 'clever' code. Noone is going to care if you can use some bizarre language construct to write code. It's not going to impress anyone and its just going to unnecessarily confuse people. The code you write should be simple, to the point and easy to understand.
Programs with maintenance in mind. Let's face it, the chances are very good that at some point in the future, someone else is going to look at your code. Why make their lives more difficult by writing oddball code (see previous item) or making the code unnecessarily obscure. Write nice, simple, easy to read, well documented code. Why make the next guy's life more difficult than it needs to be? For that matter, why make your own life more difficult than it needs to be? Chances are, 6 months to a year from now, you are going to have to go back and fix a bug in some old code you wrote. You likely won't remember everything you wrote. This means that you'll end up having to figure out your own code! Make your own life easier by making it easy to understand.
Don't be arrogant. I've encountered many programmers over the years who have a superiority complex. They think they are better than the 'little people' in the company. I used to work in a company where they intentionally made the tech support department afraid of the development department. The head programmer would routinely 'talk down' to the tech support people. This is unnecessary. These people are just trying to do their jobs, just like you are. Don't make their lives any more difficult than they need to be. Everyone in a company is important. You are not any better than them, just because you make more money. Without the tech support department, noone would be using your software, and you'd be out of a job. Without the QA department, your software would be so buggy that noone would use it and you'd be out of a job. Your software provides them with a job, and their support of the customers allows you to keep your job.
Test your code! Yes, you are a programmer and yes you are a smart person, but no, you are not perfect, despite what you may think. Test every line of code you write. Test every possible path through a function. Try throwing unusual data at a function and see what happens. Investigate organized testing development methodologies like Extreme Programming and put them to use in your every day development. Even if its not a 'company sanctioned' technique, use it and don't tell anyone. It will lead to better, more reliable code.
Don't be offended when people find bugs in your code. You are human and you make mistakes. Live with it and learn from it. If someone in QA finds a bug in your code, be glad! It's better to fix the bug before it's released to the customers than after. It makes you and the company both look better. QA is there to 'cover your butt'. Let them and be glad they are helping you! Yes, it is a humbling experience when someone finds a bad bug in your code, but you must learn to accept it as a part of life. Use it as a learning experience. What did I do wrong here and how can I prevent myself from doing it in the future? Once you learn to stop being offended by criticism, you learn that this can be used to better your abilities in the future.
Learn, learn, learn! This goes along with my previous item about keeping up with modern technologies. The computer industry changes VERY rapidly. You have to keep up with the times. Don't tie yourself to one technology too tightly. Always be reading up on new technologies. Try new things. Be open to new ideas. Considering how fast the computer industry changes, if you get too tightly tied to one technology, you could suddenly find yourself out of a job and with no prospects of finding a new one. I once told someone who was considering entering the computer field - "If you are afraid of learning new things, find another career. You are going to be learning something new every day. Every day there's going to be something you don't know how to do. You are going to have to figure it out!"
Learn object oriented programming. Let's face it, object-oriented programming is here to stay. Learn to think in terms of objects instead of functions. Learn the concept of information hiding. Learn polymorphism. Learn what virtual functions are. Learn what abstract classes are. Learn what interfaces are.
Learn socket programming. Let's face it, this is a networked world. Everything runs over the Internet these days. If you don't know how to send/receive data over sockets (or even what a socket is), you are in trouble.
Learn the basics of database programming. Databases are everywhere. In any job you get these days, you will likely be interacting with one. Know what a table is. Know what an index is. Know what database normalization is. Learn basic SQL. Know what a stored procedure is. Know what the INSERT, DELETE, UPDATE and SELECT commands in SQL do.
Write cross-platform code! Despite what Microsoft may think, there is more than one operating system in existence in the world. Don't write file formats that are locked to one operating system. Don't write network protocols that send/recieve binary data. Only send/receive text data. Every major Internet protocol uses text for all it's commands (HTTP, FTP, NNTP, SMTP, IMAP). There's a reason for this. These protocols are designed to work on any computer and any operating system.
Excellent points. Let's keep this up, and see if we can get a REALLY good concept of the type of people that WE want to hire (and make sure that we fit the profile )