I’ve been pondering all the delicious threads we’ve had lately about the attitude of lawyers regarding pro se litigants, and other professionals who have to put up with incompetent amateurs who get in their way.
The law demands an extremely high level of competence. It’s not enough just to graduate from law school, you must pass a hard test as well. Really hard. It doesn’t matter how fancy or prestigious the law school you went to is, everyone has the pass the same test. (In that jurisdiction, anyway.) Huge numbers of people flunk it. Other people go nuts and run off to India to join a cult. Others go really nuts and become politicians.
This is true of many other professions that require a high degree of competence. You can’t practice architecture, medicine, actuary-ness, or engineering without passing grueling tests which are judged by your peers. And we happily accept this reality, because we know that when it comes to law, medicine, architecture, engineering, and so forth, we civilians are completely unequipped to judge a person’s competence.
Speaking of engineering, huge numbers of organizations call the people they hire to write software “software engineers.” My own resume says it, because that’s what my title has been in a few places. Yet engineers in nearly any other field can find themselves in Big Trouble if they call themselves an engineer without having properly earned that credential.
Computer programming is a comparatively young field (though not that young). Nobody in their right minds would hire an unlicensed engineer to design a power plant. But you know that custom software that monitors the control-rod actuators? It was written by a stoned undergrad intern who doesn’t exactly understand why it’s bad to dereference a null pointer.
Laymen are not equipped to judge the competence of programmers. Stories abound about managers who get easily fooled in job interviews by the candidate who knows the most technology buzzwords, and people who are hired and produce exactly zero output for months before anything is done to get rid of them. (Just read The Daily WTF for a near infinite supply.)
As for independent measures of ability, there are none that test general and broad knowledge about programming. There are certifications, which vary from laughably stupid (anything published by Brainbench) to famously difficult (the higher-level Cisco and Oracle ones.) But those are all for specific products or technologies, which are irrelevant.
So I propose that there be an exam for programmers who want to adopt some official title, say Software Engineer. Just like being a chemical engineer, you cannot call yourself a software engineer unless you pass a hard test. Really hard. The test I envision would take at least a couple days to take. It would not be a Computer Science test (CS beyond the basics doesn’t have a whole lot to do with programming anyway.) It would be a practical test that covers, at the very least:
[ol]
[li]Binary math, bitwise operations and boolean logic[/li][li]Floating-point math[/li][li]Logic gates – the different types and what happens when you stick them together[/li][li]Imperative programming[/li][list=1]
[li]Very low-level assembler programming (a hypothetical one is fine)[/li][li]Higher-level structured programming with pointers and manually-maintained data structures (something like C)[/li][list=1]
[li]A thorough exploration of arrays, records, linked lists, trees, hash tables, queues, stacks, and all their assorted variant forms, and the algorithms associated with them[/li][li]Lots of questions comparing the algorithmic complexity of same, and optimization[/li][/ol]
[li]Object-oriented programming with automated GC[/li][ol]
[li]A full understanding of OO theory, including both class- and prototype-based systems[/li][li]Construction of simple class and object hierarchies[/li][li]Common OO design patterns, e.g.[/li][list=1]
[li]Delegation[/li][li]Encapsulation[/li][li]Class factories[/li][li]Lazy-loading[/li][li]Proxies[/li][li]Iterators[/li][li]etc[/li][/ol]
[li]Exceptions[/li][li]Aspects[/li][li]Unit testing[/li][ol]
[li]Test-driven development practices[/li][li]Loose-coupling[/li][li]Object mocking[/li][/ol]
[/list]
[/list]
[li]Declarative programming[/li][ol]
[li]Logical programming[/li][list=1]
[li]Solving logic problems with stuff like Prolog[/li][li]Scalability and complexity of various logic solvers[/li][li]Lots of other stuff I haven’t thought of[/li][/ol]
[li]Query-based programming[/li][li]Functional programming[/li][ol]
[li]Lexical closures[/li][li]Functional iterators[/li][li]Currying and partially applied functions[/li][li]Tail-recursive functions and tail-call optimization[/li][li]Functional transforms[/li][li]Infinite/lazy-loading lists[/li][li]etc.[/li][/ol]
[/list]
[li]Language theory[/li][ol]
[li]Parsing[/li][li]Lexical analysis[/li][li]Syntax[/li][/ol]
[li]Security[/li][ul]
[li]Buffer overflows and other methods of intrusion[/li][li]Permission systems and theories and ACLs[/li][li]Secure authentication and authorization[/li][li]Cryptography[/li][ol]
[li]One-way hashes[/li][li]Symmetric cryptography[/li][li]Public-key cryptography[/li][li]Block and stream-based ciphers[/li][li]Secure key exchange[/li][li]Key authorities[/li][li]Man-in-the-middle attacks[/li][li]etc.[/li][/ul]
[/ol]
[li]Standards of practice[/li][ol]
[li]Documentation[/li][li]Version control[/li][li]Testing and test environments[/li][li]Code reviews[/li][/ol]
[li]Professional ethics[/li][ol]
[li]Don’t steal your customers’ data[/li][li]Don’t sell your passwords to the Russian mob[/li][li]etc.[/li][/ol]
[/LIST]
A big list, as you can see, and that’s only stuff that I can remember. I’ve neglected a lot, obviously.
All of the questions would be practical, either involving answering a question about some code or writing some code which must pass a pre-defined test to be considered correct. (The test need not be blackbox in nature; code which produces the correct result but is astoundingly stupid should fail.)
I would not pass such a test. I know only a cursory amount of logic programming through futzing with Prolog and probably could not solve a moderately complex logic problem with it. I have been learning a lot of functional programming lately, but still get stuck on the tougher concepts. I still have no idea WTF a monad is, despite a lengthy GQ thread on the subject.
Note that not much in the above list requires advanced mathematical knowledge; because I aimed to cover topics germane to everyday programming and not theoretical computer science, which I don’t know anything about, anyway.
So, yeah. After another day dealing with stoopid rank amateurs who somehow think they can do what I, a thoroughly mediocre member of my profession, can do, this is what I’ve been ranting about in my head.