I just re-read JoelSpolsky's essay, "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)", (http://www.joelonsoftware.com/articles/Unicode.html) and thought what other concepts should every developer know. I've started with the following: * Unicode and Character Sets (Read Joel's essay) ** ''Small NitPick: Don't confuse UCS-2 with UTF-16. Otherwise it's a good motivating introduction to the subject.'' * RegularExpression''''''s (I've just learned them in the last year and had this "where you've been all my life" feeling about them.) ** I've been able to do without them much of the time by knowing string functions and string function tricks well. It is often more code than reg-ex's, but at least I know what is going on and can incrimentally tune the results instead play with the dark-grey box of reg-ex's. I find it with less DiscontinuitySpike''''''s. I don't necessarily recommend this, but couldn't slam it heavily either. It is hard to keep reg-ex knowledge fresh in my head I've found if I only need them say once every 8 months. I have to keep re-learning them because the symbols are rather arbitrary, lacking neumonics of any kind. And every language has subtle differences in their implimentations. * Basic StructuredQueryLanguage statements * a good understanding of trees and graphs (Hierarchies and inheritance play an important part in ObjectOrientation. For the mathematical underpinnings, see, e.g., PartialOrder.) * Basic understanding of internet and web technologies (TCP/IP, HTML, CSS, ...) * Basic understanding of divisions of labor and data between clients and servers. * Basic understanding of hardware Developer's "common sense": * Banging out a quick fix will virtually always come back and bite you, no matter how implausible it seems. Or it might come back and bite the person who has to clean up after you because you're an irresponsible shoddy programmer, while you go on to a different project to write more swathes of shoddy, bug-filled, half-assed code. And they will come back and bite you, maybe literally. * Or patience. I've meet programmers who I felt were not overly intelligent, but because they stuck with it they eventually found their way through. Some problems can only be solved with patience and dedication anyhow. Personal management: * Estimation of the time needed to solve a problem or implement a feature, and ETA. * Correct identification of priorities, from the viewpoint of the customer, user, management or developer, as needed. * How and why to use a VersionControl system. * Some way to search and manage all those damned emails we get these days. I still flunk this. Please add others with commentary. ---- * LexicalScope, PassByValue, PassByReference. They don't have to understand it in the real definition sense. Just that if they see code, they should know which variable's value is obviously effected, which is not. (Believe me, many a programmer in my company doesn't even know the term Pass-by-value). ---- Almost everyone uses at least a little floating point once in a while, but it's a tricky and much misunderstood subject. The following really should be considered required reading. "What Every Computer Scientist Should Know About Floating-Point Arithmetic" by David Goldberg, published in the March, 1991 issue of Computing Surveys. * html: http://docs.sun.com/source/806-3568/ncg_goldberg.html * PDF: http://eason.com/library/math/floatingmath.pdf ''Agree. Every once in a while, someone will go on a mailing list and complain about a language bug (be it CeePlusPlus, JavaLanguage, RubyLanguage, CommonLisp) because ((1.0 / 3.0) * 3.0) != 1.0.'' ---- I noticed the existence of this but don't know anything about it: What Every Programmer Should Know About Object-Oriented Design. by Meilir Page-Jones foreword by Larry L. Constantine. ISBN: 0-932633-31-5 ---- Every developer should know OnceAndOnlyOnce (and it's amazing how many don't). * I told you once. * ''No you haven't.'' * Yes I have. * ''When?'' * Just now. * ''No you didn't.'' * Yes I did. * ''You didn't.'' * I did! * ''You didn't!'' * I'm telling you I did! * ''You did not!!'' (MontyPython, The Argument Clinic; '''not''' OnceAndOnlyOnce) ---- The Five Essential Phone Screen Questions, by SteveYegge http://steve.yegge.googlepages.com/five-essential-phone-screen-questions ---- Given the prevalence of multi-core CPUs these days, I think an understanding of concurrency issues should be on this list. -- MikeSmith * Seconded. -- IanOsgood * Thirded - doing things in parallel is just too important a concept; ignoring it as a software developer is going to be harder and harder as time passes. -- JamesHollidge ---- Parsing and parsers: regular expressions, lexical analysis, (E)BNF grammar definition, parser generators and, perhaps, recursive descent parsing. The popularity of XML as a syntax for human to write and edit is due to a lack of basic computer science education. ---- Basic HCI concepts. A lot of solid, functional and inventive but unusable (by end users) software is made! -------- See Also: AdviceToNewProgrammers