views:

857

answers:

21

I read an article recently by Joel Spolsky entitled "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)". I knew nothing about Unicode before I read the article. Now, I feel like I can speak intelligently about the topic and, if I ever needed to dig deeper, I have a good foundation of knowledge to build on.

This enlightenment got me thinking: "I wish there were an article like this for all topics germane to software development (and computer science in general)."

So, the question is: what are the things that every developer should know something about?

(And, if possible - what is the something and how do I learn it?).

EDIT: A good point was raised -- that the answer highly depends on the role the developer is supposed to fulfill. However, regardless of your day-to-day role, you probably should know something about common things like networks, database design, etc (for example).

It's not likely you'd be embarrassed as a developer if you couldn't discuss the detailed inner-workings of the MySQL database engine, but you might be if you didn't know what a primary key was.

A: 

If statements, Loop constructs, Basic Theory, loose understanding of what a database is and how to query it, procedural and object orientated theories.

I'm sure there is more but that is what came to my mind...

Best Regards,
Frank

Frank V
+5  A: 

I think maybe a short brief on version control systems and their differences of architecture would be useful.

snitko
If you ask me, a developer not thoroughly familiar with _at least_ one version control system is a mighty poor developer indeed.I certainly wouldn't hire someone like that. Have they been living (and coding) under a rock their whole career?
thenduks
+1, and would be even better if a mention of bug tracking systems was also added.
Adriano Varoli Piazza
+1  A: 

The Structure and Interpretation of Computer Programs. Then move on to the Art of Computer Programming. Between the two, pretty much everything (technically) you should know is covered.

Chris Lloyd
If your minimum requirments are sicop/taocp then you are going to be very dissapointed when you start to interview new staff!
Martin Beckett
There is no problem with setting the bar high :)
Chris Lloyd
you left out "A Discipline of Programming" and "The Psychology of Computer Vision" ;-)
Steven A. Lowe
TAOCP is for knowing *everything* about a particular topic, not *something*. :-)
ShreevatsaR
Unless you're developing highly advanced system-level software I think The Art of Computer Programming is a ridiculously high requirement. It most certainly is NOT an "absolute minimum knowledge requirement" for any given developer.
Martin Doms
+1  A: 

Code: The Hidden Language of Computer Hardware and Software has a really good explanation of the underlying fundamentals.

nzpcmad
+4  A: 

Language and Communication skills.

Mastery of whatever spoken/written language you have to work in, and the ability to both articulate and understand ideas and concepts in a written form.

Without that, you will not pass go, and you will not collect your $200.

seanb
A: 

Abstraction. The ability to comprehend even the most basic levels of abstraction is a big difference between programmers and non-programmers.

chaoticsynergy
+2  A: 

If I am an employer, people who have read fundamental books like Code Complete 2 and The Pragmatic Programmer will get a Major plus in my consideration

...and its because I know that such people are motivated to learn best practices when it comes to development, and that they don't just settle for what they have learned in schools only...I will know that these people want to be the best in the field.

If I was an employer, those are the people I would want working for me.

So, to those who havent read such books yet, I suggest you go and read them immediately...if, and only if you want to be the best amongst others.

Andreas Grech
+10  A: 
  1. You should be able to install and maintain your own operating system on your development system.
  2. You should be able to install your own development tools.
  3. You should be able to write a simple "Hello, World" program in any language for which you can get get a compiler with only a little bit of experimentation.
  4. You should know how virtual memory works.
  5. You should know basic data structures like arrays, lists, hash tables, sets -- how they work and why you would choose one over another.
  6. You should know how to organize your code into meaningful units of computation -- classes and methods for OOP -- that are loosely-coupled and highly cohesive.
  7. You should know what the terms coupling and cohesion mean.
  8. You should know how to write code that is clear and concise and explains itself to someone else who reads it with only minimum comments.
  9. You should know how to ask questions when you don't understand.
  10. You should know how to elicit the real requirements of a system, not just the stated requirements.
  11. You should know that you are in a profession where if you aren't learning all the time, you will likely have to find a different job.

... the list goes on, but I won't.

tvanfosson
If you were a hiring manager, you'd never hire anybody.
moffdub
No. I'm willing to help the people we hire get to this point.
tvanfosson
Never hire anybody?? These are the basics! I hope you don't have to help people along too much tvanfosson cause people shouldn't come knocking unless they know these things.
Simucal
I would like to throw an intercal compiler at number 3.
Svante
I don't agree with (1) really, either. I've developed *for* systems where you can't "install and maintain" the OS, unless you count reflashing the damn thing from the image you get in the devkit. Systems you develop *on*, sure, a programmer should have basic IT skills.
Steve Jessop
@onebyone - I won't quibble. Most of us develop on Windows/Linux/Mac for Windows/Linux/Mac. I've updated (1) to reflect that it's the dev machine I was talking about.
tvanfosson
@Harlequin -- "any language not designed intentionally to frustrate your attempts to program in it" seems like a little too much qualification for this list, but your point is well taken. :-) I wouldn't necessarily want to implement a sendmail rule to add "Hello world" to an email either.
tvanfosson
According to that list I can only call my self "de.el...r" This list is good, but I think is to much for "absolute minimum".
OscarRyz
I fall down on 10. Don't get me wrong, I know some tricks for eliciting the "real" requirements as compared with what you initially thought the requirements are. But do I "know how to do it"? That's a bit like saying, "you should know how to complete your next project on time and in budget"...
Steve Jessop
If every developer hired knew #6, the world would be a better place, with all the pink bunnies and fluffy cottoncandy clouds.
Adriano Varoli Piazza
I agree with Oscar Reyes, this list certainly contains what good developers should know and be able to do, but it is too much for an absolute minimum in my opinion.
Michael Barth
+1  A: 

Networking. At a minimum, the conceptual role of each layer in the OSI Model, how DNS works, the difference between TCP and UDP...

Don't really need to know the innards of a Cisco router, but it constantly suprises me the number of developers that I have met that just see the network as a black box, wonder why their networked app sucks, and have no idea where to start looking.

Of course, if you don't ever run into networks, then don't bother...

seanb
Add a basic idea of HTTP/SMTP/POP3.
Vilx-
This, along with lots of the other things here really, *really*, depends on the type of job you're supposed to fill. If you're going to write simulations of weather patterns over the antarctic, maths are much more important than being able to talk to a POP server.
Lasse V. Karlsen
+3  A: 
  • Error-handling, exception management, application reliablity.
  • Source control and how to use it properly.
  • The art of good communication with different types of people.
RoadWarrior
+1  A: 

I think that the most important thing for a programmer is to have a correct mental model of processes that occur when his/her code is executed by the computer. This covers awful lot of ground: staring with "what is a bit?" through "what is a pointer?" all the way through "what is an OS" and "what does Oracle do". Any question about programming can be reduced to the mental model of the computer that the programmer has.

The most important thing is to know that miracles do not happen. If you don't know why things happen to work, you must find out, or the hole in your understanding will hurt you at some point. If you don't know why things are broken, you can't fix them until you know. No debugging by magic.

The reverse of this is the ability to abstract lower layers away when needed. Understanding of bits and pointers does not help you much when you write SQL - quite opposite.. Still, the understanding needs to be there, in background so to speak. When you answer questions like "Why is my query slow?", bits and pointers and addresses and pages all come flooding back.

Arkadiy
+5  A: 

It's a never-ending cycle.

People go from total ignorance, to glib understanding, to competence, to adroitness, to mastery, to adept, and then to a newer, higher level of ignorance. The questions never end, they just become more sophisticated.

The goal is to avoid the natural inclination to become entrenched and comfortable at any given level of attainment.

For example, it's great to know what a primary key is, even better to know, for example, the difference between a composite key and a surrogate key. It's not so easy, however, to always know if and when it is appropriate to use one over the other, harder still, to know if and when the very relational data model itself is inadequate for any particular scenario.

Harder still to retain all the knowledge gained in between, so that you can discuss the matter intelligently with other people.

Harder still to distinguish those who know what they are actually talking about from those who are comfortably adept at slinging buzzwords.

The single most important criterion, therefore, is an unwavering dedication to continuous learning.

dreftymac
A: 

No minimum knowledge requirement. Only:

  • dogged persistence, and
  • proof of prior dogged persistence
Marcus
I'd be wary of "dogged persistence". It's also known as stubbornness.
TraumaPony
do you want to replace persistence with perseverance ...
Alphaneo
A: 

I think knowledge of the Halting Problem should be required, though I found, through an informal survey, that most of the developers I work with on a daily basis have never heard of it (!).

moffdub
Yeah, reminds me of the time that it was posted to getacoder.com by someone who called himself "AlanT": http://www.getacoder.com/projects/bug_finder_92913.html At first, there were countless generic offers "I can do that!" "I have the right skillset" ... all gone by now, though.
Svante
That posting is posted in my cube and is in fact how I conducted the survey.
moffdub
Apparently some people here have never heard of Turing either. Go ahead and down-vote me. You can add to my survey results.
moffdub
A: 
  • Ability to state your point (oral and written) in a short period of time.
  • Ability to learn from your mistakes and from others.
  • An inherent dislike for extended hand-holding... use personal copy of ze brain.
  • Respect other human beings.
Gishu
+1  A: 

How to use google.

(and perhaps Stackoverflow).

Martin
A: 

For those of us working on a Windows platform, I find the lack of knowledge around permissions, user accounts, identities, groups, roles, impersonation, authentication, personalisation, authorisation etc. to be a constant disappointment.

The number of times I have looked like a legend in the face of far more experienced / better developers, simply for knowing which windows account asp.net runs under in IIS or having a basic grasp for Windows permissions runs wide and deep.

Also, having an understanding of basic networking has to be absolutely critical fr anyone writing an application that uses a network in any way - including to access the DB.

Blatfrig
A: 

Speak english...

Boris Guéry
In the US, yes this is a must. But not in a place like, say Japan.
Alphaneo
+1  A: 

i would say:

  • Problem solving (able to take the box, break it and shape it like a bowl)
  • Capabilility/Motivated to learn new things (has fire in eyes when given a new challenge to tackle)
  • is able to work/learn independently (google, stackoverflow)
  • and work well with others (can tell a joke or two)

my two cents :)

melaos
A: 

Software Developers should understand that their most important skill is finding out what the customer wants. The customer seldom has more than a vague idea, and doesn't know what an explanation would look like. Teasing out the real requirements, figuring out what's necessary and what's nice to have, and figuring out what directions the system is likely to evolve that have never occurred to the customer are important skills that you can only develop by interacting with customers.

When I'm interviewing developers for an OO position, I always try to figure out whether they understand polymorphism. I think this is the most important facet of OOP, and it's hard to teach. My standard interview question, after I've heard a little about what systems you've worked on, is "how did you make use of polymorphism in that project?"

PanCrit
A: 

To start with, we need to know the basics of Computer programming like Algorithms, data-structures, operating systems, etc. Some hardware knowledge (for example the working of the Microprocessor, the Assembly language, Memory manager.. etc) will help in a large way ....

After getting a job, every programmer finds umpteen different way to implement those fundamentals. So they should always go into the "continuous pursuit for knowledge" mode to prevent yourself from getting outdated. Learn many languages that will help implement algorithms ...

Recently, I was learning Verilog coding from a guy, who started his career in ASIC design some 20 years back. It seems he started his career drawing logic gates in a paper and sent it for design to the foundry for ASIC manufacture. He has now learnt many latest technologies including verilog, which makes him a real leader...

Alphaneo