What Are the Genuinely Useful Ideas In Programming? 598
Hugh Pickens DOT Com writes "Computer Scientist Daniel Lemire has had an interesting discussion going on at his site about the ideas in software that are universally recognized as useful. 'Let me put it this way: if you were to meet a master of software programming, what are you absolutely sure he will recommend to a kid who wants to become a programmer?' Lemire's list currently includes structured programming; Unix and its corresponding philosophy; database transactions; the 'relational database;' the graphical user interface; software testing; the most basic data structures (the heap, the hash table, and trees) and a handful of basic algorithms such as quicksort; public-key encryption and cryptographic hashing; high-level programming and typing; and version control. 'Maybe you feel that functional and object-oriented programming are essential. Maybe you think that I should include complexity analysis, JavaScript, XML, or garbage collection. One can have endless debates but I am trying to narrow it down to an uncontroversial list.' Inspired by Lemire, Philip Reames has come up with his own list of 'Things every practicing software engineer should aim to know.'"
Great read: The Pragmatic Programmer (Score:4, Interesting)
Exactly. Code Complete is a great book. I liked The Pragmatic Programmer -- from Journeyman to Master [amazon.com] even better. It's slightly more meta, but the tips inside are really universa.
Some are even applicable beyond software engineering, e.g. "don't repeat yourself" (i.e. don't have two versions of the same information (e.g. your source in your repository and its documentation on your website) stored in two different places because the probability that over the time both will diverge equals 1. It's better to make one the master copy and derive the other from it.) I recommend this book to all my students.
Re:databases (Score:5, Interesting)
Perhaps the relational calculus might not be strictly necessary, however if knowing the theory behind relations helps engineers from naively treating databases as data garbage dumps, it'd be worth it.
Keep narrowing - a LOT (Score:5, Interesting)
Half of those things are NOT things I would "recommend to a kid who wants to become a programmer".
Version control, UNIX philosophy, software testing - it's too much! Someone who wants to be a programmer should start to learn programming first, and then they can explore the wild twists and ideas that surround the thing once they have a grasp of what programing means to them.
I would say even starting languages to recommend depend on the person. If a programmer likes some languages and not others later in life, why should that not be true from day one because of how they like to think? What if you are recommending a language that will turn them off programming forever?
It would almost be best to develop a kind of programming sandbox, that would let them use a variety of languages and concepts (like functional or OO or even, yes, procedural!) and see the path they take most naturally.
Re:Keep narrowing - a LOT (Score:4, Interesting)
I was with you until the last paragraph.
How about we point beginners to a simple imperative language with an interactive mode? Pack it with simple but interesting games they can understand and modify.
You know, the same stuff we had when we were kids. It sure beats the shit we're giving them now.
Re:Code Comments (Score:2, Interesting)
I would also _proper_ naming of variables, not everything abbreviated without any vowels that won't make any sense in 6 months.
That's where the importance of typing comes in. Every programmer should take a typewriting course. Makes them a ten times better programmer if you don't have to use abbreviations and avoid commenting because typing takes you too long.
Re:Foundation (Score:5, Interesting)