Please, stay on technical issues, avoid behavior, cultural, career or political issues.
|
locked by Yannis Rizos♦ Mar 13 '12 at 20:52
This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: FAQ.
|
My first vote would be for Naming Conventions. |
|||||
|
|
That's it's harder than you think. While it's easy(ish) to put something together that works when used normally, coping with erroneous input, all the edge and corner cases, possible failure modes etc. is time consuming and will probably be the hardest part of the job. Then you've got to make the application look good too. |
|||||
|
|
Short-circuit evaluation, althought it's one of the first thing they teach you about boolean operators. |
||||
|
|
|
Every programmer should know how to use the debugger, and know how to use it well. |
||||
|
|
|
Which language and environment is most suitable for the job. And it's isn't always your favourite. |
||||
|
|
EDIT Yes, my point #1 is overstated. Even the best engineered application platforms do have their share of bugs, and some of the less well engineered ones are rife with them. But even so, you should always suspect your code first, and only start blaming compiler / library bugs when you have clear evidence that your code is not at fault. Back in the days when I did C / C++ development, I remember cases where supposed optimizer "bugs" turned out to be a due to me / some other programmer having done things that the language spec says have undefined results. This applies even for supposedly safe languages like Java; e.g. take a long hard look at the Java memory model (JLS chapter 17). |
|||||||||||||||||||||
|
|
Every programmer should know about testing. |
|||||
|
|
|||||||||||||||||
|
|
Every programmer should know that he's putting assumptions in code all the time, e.g. "this number will be positive and finite", "this code will be able to connect to the server all the time within a blink of an eye". And he should know that he should prepare for when those assumptions break. |
|||||||||
|
|
Don't stop learning. |
|||||||||||||||||
|
|
Every programmer should know the "science" in Computer Science (design patterns, algorithms, objects, etc...) if you can master that, you can program using any language, it is just a matter of getting used to the syntax. |
|||||
|
|
Troubleshooting and Debugging Skills They hardly spend any time on this topic in any of the programming courses I took, and in my experience it is one of the biggest determinants of how productive a programmer is. Like it or not, you spend a lot more time in the maintenance phase of your app than the new development phase. I've worked with soooooo many programmers who debug by randomly changing things with no strategy for finding the problem whatsoever. I've had this conversation dozens of times. Other Programmer: I think we should try to see if it fixes it. |
|||||||||
|
|
Pointers, obviously. :) |
|||||||||||||||||
|
|
Floating point computations are not precise. |
|||||||||||||
|
|
The more you know about how security works on your platform of choice the better. |
||||
|
|
|
||||
|
|
|
Unit Testing. This is a great way to codify your assumptions on how the code is to be used. |
||||
|
|
|
Code Complete 2 - cover to cover |
||||
|
|
|
That the #1 thing you can do to increase the quality and maintainability of your code is REDUCE DUPLICATION. |
|||||||||
|
|
Big O notation and its implications. Some useful references |
||||
|
|
|
The basics. Currently programmers learn technologies not concepts. It's wrong. |
|||||||||||||||||
|
|
Divide and Conquer. It's usually the best way to solve any type of practical problem from scheduling to debugging. |
||||
|
|
|
Domain knowledge. The spec is never 100%; knowing the actual domain with which you are developing for will ALWAYS increase the quality of the product. |
||||
|
|
|
Learn concepts. You can Google the syntax. |
||||
|
|
|
How the computer really works, language fundamentals, algorithms/data structures, algorithm analysis, and some measure of complexity theory. |
||||
|
|