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.
|
That there are - 1) Other programming paradigms beyond just OO (object orientation) 2) Other better IDEs beyond Visual Studio (this one is especially for programmers who have worked only on Windows and only on MS technologies) |
||||
|
|
|
User mistakes are not; they are usability mistakes:
Not to pick specifically on GNU Tools or GNOME, but these were the easiest examples to come up with. |
||||
|
|
|
How the computer really works, language fundamentals, algorithms/data structures, algorithm analysis, and some measure of complexity theory. |
||||
|
|
Evaluation.A programmer ought to know how the statements they write are evaluated. I'm not just talking about the basic
which of course can just be replaced by I'm also referring to the ability to understand your language to the point where you can come up with something like this:
When I first saw a statement like that it blew my mind a little bit; it hadn't occurred to me I could leverage the for loop in such a way. The person who wrote that statement more fully understood the possibilities available to them - they saw more open doors than I, which gave them more freedom and power in their ability to design code. Now, whether it's good code is an issue - whether any of those doors should be opened - that's up to debate. It remains that with great power comes great responsibility. |
||||
|
|
|
Speaking of commercial software dev here... Obviously might not apply to a DOD security system or a hedge fund quant.
|
||||
|
|
|
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. |
|||||
|
|
Cryptography. You don't have to be able to write your own encryption algorithm, but you have to have a basic understanding of how encryption, message authentication and the PKI works. I have struggled for too long with blind trial and error in this area. Recently I have picked up the book "Cryptography Engineering" (by Ferguson, Schneier, Kohno) and it has been a real eye-opener. |
||||
|
|
|
Unit testing is not a silver bullet. You can still introduce bugs, write wrong tests and it should not be the only form of tests you do. |
||||
|
|
|
Computers don't understand semantics. Suppose you have this:
To the computer, you may as well have used different type names and used:
Naming things is very important, but don't make the mistake of assuming the computer knows what you "mean" just because you named your type "Ferrari" or your method "DriveTo". |
||||
|
|
|
What lexing and parsing are, just a vague overview is fine. Better yet, passing familiarity with at least one parser generator framework. Most of the most horrid WTFs I've seen is people's custom parsing routines. Horrible to initially code, worse to maintain. |
||||
|
|
|
Order of execution. You'd be amazed, when talking to programmers vs the people who've never seen or touched code or the pretend programmers*, the thing they don't get is the order of execution. If you meet someone who can't pick up on the control structures, get this idea in their head first. You'll find that they learn faster after that. *yes, those people who are able to get jobs as programmers, but when you ask them the simplest technical question they go brain fart.. I think we've all met one of those. |
||||
|
|
|
Software Licensing Basics
Note to S.O. community: |
||||
|
|
|
Can't believe this hasn't been mentioned Every programmer worth is salt needs to be able to produce world ready software. By this I mean following basic internationalization principles such as externalizing all strings etc. I can't believe how many times I've seen hard-coded English strings or dialogs with truncated strings etc. when the product has been translated. |
||||
|
|
|
The more you know about how security works on your platform of choice the better. |
||||
|
|
|
||||
|
|
|
Fixing code requires more intelligence than writing the same code initially. Therefore, if you write code at the limit of your cleverness then you are, by definition, not smart enough to fix it when it breaks. |
||||
|
|
|
Write your data structures first -- that means everything from database schemas to swizzling/serialization mechanisms. Most projects are about storing and moving data from point A to point B in format C. When all is said and done about 90% of your code will be logic for doing the formatting, but the real killer is just having a format to access and write your data. Once you have an API for data access you can play around with the formatting however you want, but once you start production with a storage API it can really hurt to realize that you screwed it up. |
||||
|
|
|
In Steve Yegge's 5 essential phone screen questions, he's trying to make sure interviewees have a basic knowledge of:
http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions At the time he wrote this, he was at Amazon, but works (and probably conducts interviews) at Google now. This just gets you past the screen. Here's how he described what he was looking for:
|
||||
|
|
|
||||
|
|
|
Learn how to deploy your code, tests and software package well. One of the worst habits of developers I have seen in industry is a common ignorance of how to put your software in the hands of other people, here are some bad signs: New development environment-itus:
Version-itus:
Binary-only-itus:
Multi-core-itus:
Hard-coded-feature-itus:
|
||||
|
|
|
Simplicity, Clarity, Generality. http://www.math.harvard.edu/computing/programming/rules.html
"The most effective debugging tool is still careful thought, coupled with judiciously placed print statements." BWK |
||||
|
|
|
Use the right tool for the job. The programmer is the important element, and the language and tools should be chosen based on the problem. Don't be afraid of new languages and projects. |
||||
|
|
|
||||
|
|
