I think we need a Bar Exam for computer programmers

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.

This is what would worry me. Everyone I’ve known who learned to code at school sits about studying linear algebra, discrete math, and stuff. I’d be worried that any sort of test of programming would end up focusing on math topics and/or questions about keywords and concepts in particular languages. Real programming has more to do with being able to learn something new fast and then make non-breaking, secure code in an organized fashion without taking years to do it. The sort of people who make tests never seem to want to test stuff like that.

I’d probably leave section 6 out of any test though. People don’t build their own compilers these days. I’m also a bit hesitant about a Ethics for Programmers. ANSI or someone has some sort of standard like that, and I just laughed.

I feel your pain.

I think that prospective programmers should be put into an infinite loop and if they can escape, then they can be let out into the wild to program. The rest have to work in marketing.

What we really need is a PE designation exactly like the more traditional engineering disciplines have, and it should be treated exactly like they treat it–most projects should be unaffected, but anything safety or security critical must be approved by a professional software engineer. We will also need more stringent education requirements for software engineers, and yes, most people who use that title should lose it.

However, the selection of topics on that test doesn’t look anything like actual software engineering. Check out CMU’s master’s program in software engineering for an example of what the folks in the know think a software engineer should learn. Also take a look at Penn’s master’s in embedded systems for another take on what the people who write software with very strict performance requirements should be taught.

Here’s the code of ethics thing. It was the IEEE not ANSI. But overall, programmers are just white collar workers. We’re barely even engineers. While a lot of concepts are similar (simpler solutions are the most elegant, etc.), ultimately it’s still an art more than a science and 99% of the time we’re working on interface code not space shuttle systems, though we’ll build the connection to the database, we don’t have access to what’s inside it, etc. We don’t need a standard of ethics greater than any other blue or white collar worker.

I dunno. This is their list of core courses sounds more like a list of how to be a good software manager than an actual programmer.

Of those, I’d definitely put software architecture and design trade-offs on my list (but in more specific terms.) Things like configuration management and product validation (e.g. testing and QA) are already there.

HR management, risk assessment, cost estimation, risk analysis, etc., are all management topics which are useful but don’t seem immediately relevant to my purposes.

So perhaps “software engineer” is not a good term, since the eggheads at CM say it means something completely different from what I’m talking about.

How about Licensed Code Spewer. Registered Algorithm Ninja. Certified Programmer of Awesomeness (Oops, CPA is already taken).

What is the result of this. We have licenses for laywer and doctors and I can list you hundred of incompetient doctors and lawyers. Now I’m not saying we shouldn’t strive for the better but what’s the point.

The point in licensing people who are doctors and lawyers and the like are to prevent incompetents from HARMING you. How is an ineffective computer programer harming you?

The computer industry makes such strides because it encourages people to try things. If you require people to take the same test, to think the same way you immediately have problems.

Look at politics, it’s an influx of lawyers. That is a key reason why things get so messed up when looked at by ordinary Joes. The lawyers all graduate from the same kind of thinking, whether it’s valid or not and have lost touch with the common sense approach.

Look at the Intenet, the hierachy of Top Level Domain names is a mess. Really the .com, .org .net could be done so much better, but so what? Is it really hurting anything?

If I don’t like Windows, I got Linux. Why because Linux people are trained differently. If you are requiring everyone to get the same training they think alike. Sure the basics are the same but it ends there.

If a programs sucks it’ll likely fade into oblivion and be replaced by a better program. Most programs have beta testers

I am just thinking what benefits would you gain by restricting the talent pool. Especially when the worse thing you’ll get is a screwy program that makes you re-install Windows. In the end that isn’t such a big deal, 'cause everyone backs their files up regularly right? :slight_smile:

I do! I’m working on a hobby project right now that ultimately called for a custom scripting language with its own peculiar set of language constructs and semantics. It was a pretty simple task for me to whip up a grammar and a semantic specification, and then roll out a quick lexer and parser. (I would have just used a lexer/parser generator, but I hadn’t written a compiler since university and my coding fingers were itchy. :D) Just a little knowledge of languages was very useful in developing a very useful solution to a highly specialized problem: using the custom language has probably quadrupled productivity in other areas of the project, at a conservative estimate.

Sure, in a larger project you wouldn’t bother to write your own lexer, or parser, or probably even your own virtual machine, but I think the concepts are still pretty important for anybody who really wants to understand computer languages to learn. Really, the basic concepts of compilers are a very simple reification of otherwise abstract language theory concepts - I think it’s pretty important to include them on those grounds.

I haven’t had to write an actual compiler (thank the FSM) but I have written custom parsers for weird proprietary data formats and whatnot. It was actually easier than I thought it would be, once I got the basics down.

Incompetent programmers write insecure software, which is exploited by bad people and costs businesses and governments untold billions of dollars. Incompetent programmers crafted an entire class of operating systems so badly that there are now established networks of millions of compromised computers dedicated to nefarious purposes. Fucking spammers and Nigerian princes have built the larges parallel processing infrastructure in the world, for free, on top of stupid people’s mistakes.

Programmers who don’t understand what they’re doing create things that don’t work. These things then have to be fixed by people who do know what they are doing. 99% of the software that is developed in the world is never seen directly by the public at large. It’s in institutions, corporations, government bureaucracies, research projects, NPOs, factories, and rocket ships. And all of it costs ten times as much as it should.

Bad programmers waste time doing things in stupid ways. They try to invent solutions themselves for problems which have already been solved. They do not understand the purpose of the tools at their disposal, and use them in inappropriate and dangerous ways.

Idiot programmers are allergic to proper structure, and think copy and paste is a better strategy than some form of abstraction. (Usually because they don’t understand any forms of abstraction.)

Stupid people do not understand proper testing procedures, do not use version control, do not have a proper test environment, and put absolute shit into production. All the fucking time.

Mouthbreathing troglodyte programmers don’t understand cryptography, and store and transmit sensitive data in insecure ways. Do you have any idea how much money is wasted by credit card companies alone every time some numbnuts leaves a flash drive with a list of credit card numbers on the bus?

I really don’t understand what you’re trying to say here. Taking a test causes people not to think right?

Nobody expects a lawyer who just passed the bar exam to be an expert in admiralty law capable of arguing an international shipping insurance case. But a lawfirm expects someone who passed the bar to have the level of basic competence necessary to begin professional work and further training.

I want such a test that would prove a similar level of basic competence in the craft of programming.

What does the organization of the DNS system have to do with programming?

Specific technologies are irrelevant. Programmers must cultivate skills that have nothing to do with any operating system, programming language, development environment or platform. These skills are universal and abstract.

Seriously? Do you really think so? Because you are either hopelessly naive about how software is developed, or you are pulling my leg.

I don’t think you have any notion of the cost incurred by incompetence. Stupidity scales better than anything in else in the world.

IMHO the biggest problem with your proposal is that so much about programming changes so quickly. It’s such soft and shifting sand to build foundations on.
I think many software companies, particularly the biggest ones, have decided that “churning” their user’s world is where most of their income should be coming from. They don’t sell most of their product by creating new abilities or servicing people who are just starting to use applications in general. They do it by triggering and servicing waves of new software that is incompatible with the old. I mostly buy software to replace versions that stop working when the world around them changes. Offhand I can’t think of any software capability I care much about since the invention of browsers and the WWW, and I’m a technical professional that spent the last 15 months primarily on one programming project.

Nearly everything you said in your post was so irrelevant to the real world of politics, their faithful bureaucrats and the way they operate in the real universe.

The problem lies in the fact that the average middle management bureaucrat has NFI how to write a simple specification for a data base that can be analysed nor how to monitor progress made by programmers.

I’ll provide an example in the context of New South Wales and the Malik serial killer case in the 1990s.

The geniuses in the NSW Police Department decided they needed computer analysis of any data collected, so three or four of these clueless middle and upper management police administrators called in a bunch of MicroSmarm certified programmers from some firm and tried to develop a data collection system to solve the case by using that management tool known as BOGSAAT (Bunch of Guys Sitting Around a Table).

“No problem!” MicroSmarm 1 said.

“Hell, Yeah!” MicroSmarm 2 said. “We can set up an inter relational data base that, once you put the data in will, once you enter the query, spit out everything you need to know about anything! It’ll knock your socks off!”

“Yes!” MicroSmarm 3 said “It can correlate anything and everything. It can spit out reports that will tell you everything you ever wanted to know, and more!”

The computer illiterate, middle management cops, were content to accept a data base designed by these MicroSmarms. The data collection system included an enormous multitude of “Free Text” data collection fields which made the whole point of data collection totally meaningless.

Needless to say, after four wasted years, all the data collected had to be thrown out and a properly designed data base, purchased mostly from overseas, had to be used to start the data collection from scratch.

From the very beginning, the MicroSmarm frauds didn’t even bother to change the default US Month-Day-Year format to the Australian Day-Month Year format because: “Duh, you didn’t tell us you wanted this in the BOGSAAT meetings, did you?”

Speaking for myself, although my programming experience is slim, I do know how to:-

(1) write a proper specification for a relational data base using Excel with linked workbooks and cells;
(2) oversee and monitor progress made by contractors;
(3) demand that complete updates to both the System and User Documentation be presented to me at a weekly meeting with the (usually) MicroSmarm trained programmers.
(4) test the data base against the monthly claim to ensure that work claimed on the invoice was actually done.

In my career I have had to terminate the employment of perhaps five individual clerical type staff and I have always felt totally depressed for a week after doing it.

I have terminated the contracts of three MicroSmarm firms and four MicroSmarm individual programmers and I have always felt pleasure after the event to the extent of breaking out the champagne afterwards for at least two of the most troublesome and obnoxious ones.

None of the MicroSmarmers enjoyed working under contracts managed by me because I was probably the only one who knew what they were doing and, more importantly, what they were trying to get away with.

I think one of the main objections would be that at least over here (Netherlands), there is as far as I know no program that teaches all these subjects in enough depth, so basically nobody who isn’t already very experienced would be able to take a course and actually pass, and it also looks like the test would say very little about the high and low-level “design” abilities a good programmer must have.

Requiring people who code to be certified would stifle business and innovation in horrible ways. Most of the code that needs to be written out there is simple html, if you run a small business and have a reasonably bright child you can have him come up with something simple and straight forward that’ll work well enough for free. Imagine having to write a contract and hire someone every time your brick and mortar business needs a minor website update. The digital revolution is a revolution because of the incredibly low entry barrier, I think we should strive to keep it that way.

Writing HTML has nothing to do with programming, and in any case I certainly don’t advocate requiring anyone who works in the field to hold the certification, just that it be available as a clear way to separate experts from people who are just dicking around.

The implication being that anyone who isn’t certified is “dicking around” (i.e., incompetent)?

I’ve been doing application design/development/maintenance for over thirty years, and have been considered an expert (in certain areas) by my colleagues; but there is no way I could pass an exam even remotely like the one posited in the OP, which seems on the surface to be geared towards Computer Science postgrads.

Oh really? Well what about javascript which is a common part of any html page? And what about those fanatics that do AJAX stuff without a toolkit but through js directly? I guess they are not programming either. So where is your cut off? Are all weakly typed programming languages “dicking around”? Me sitting down with a guy and having him solve a few problems of my choosing is all the certification I need. If you can’t tell a good programmer from a bad one by interviewing him you’re probably not so hot yourself, so who the hell cares what you think.

With respect, I don’t think you have any idea what CS postgrads study. The majority of the stuff on that list are basic principles in modern software design and architecture, perhaps with the exception of the FP stuff which is still mostly used in academics. I don’t even have an undergrad degree and yet I know how to do most of this stuff.

Javascript is not HTML. And in a well-designed web frontend, one should be able to work on the JS and HTML entirely separately, anyway. I don’t want my graphic designers screwing with my code, and I sure as hell don’t want to mess with the HTML and CSS if I can avoid it.

What about them? They’re doing it wrong. Reinventing the wheel and premature optimization are two of the most common mistakes made in software development. There are a lot of really great AJAX toolkits out there.

Certainly not. I do nearly all my work in weakly-typed languages.

If you’re lucky enough to work in an environment where you get to pick your own colleagues, more power to you. But I’m more concerned with the type of situations like Aquila Be points out, where perfectly reasonable non-experts (the cops) hire a bunch of bozos to do their database project. The cops aren’t programmers like you and me, and would have had no way of knowing that these MS dweebs are idiots until after they’ve wasted the taxpayers’ money.

I sorta got worked up after assuming you were calling weak typed language work dicking around, I didn’t mean to call you a bad programmer or your opinions worthless, my apologies friedo.

Its true that if you have no in house programming expertise your first software project is gonna be an expensive disaster, but same would probably go for your lawsuit if you just pick a lawyer out of a phone book. The folks that have to have something that works are free to hire IBM(and pay them obscene sums of money until the end of times). Thus far I’ve found that people with a lot of certifications are good at memorizing things, but not good at programing, and I worry that the same would be the case with people who posses some kind of a comprehensive cert.

I believe that working on a large difficult project with someone who knows what they are doing is the only sure-fire way to increase the hard to define “programming skill”. I just don’t feel that preparing for and taking an exam can do the same. The 4 years I spent in college gave me the background knowledge I needed to excel at programming, but I didn’t become a good programmer until I programmed for a while with other good programmers, and I don’t think an exam can determine whether someone has done that or not.

I note the nice apology in your subsequent post. But, friedo does emphasize an excellent point worth special attention. Licensing isn’t supposed to protect other experts in the same field from the inept, it’s supposed to protect people who aren’t in a position to judge, often because they don’t know the material (or because they don’t get a chance to interview, or for other reasons).

Licenses also do another job, albeit an unhelpful one for society. They provide a way for a small number of people to create what almost amounts to a coercive monopoly, which has a big positive impact on them, if there is no political effort to block the licensing on the part of typically a very large number of other people on each of whom the negative impact is small.

The Economist ran an excellent brief article on this a couple of years ago, using the proposal of limiting the “floating” of horse teeth to dentists as their lead example (“floating” teeth, I gather, means filing their tops so they are flat and meet squarely during chewing).