I’ve been working now for some fifteen years, and I think that for someone who’s had a bit of experience, they can honestly look back and draw some valuable conclusions on “what’s important”. By implication, there are also a whole bunch of things that are not important.
Today, sitting with a prospective hire, I was asked what I thought of courses. I interpreted it is a question about the value of courses, in general. That’s a tough one. Any academic endeavour, ultimately, is only worth it’s level of recognition, presumably by a body or group of bodies whose opinion one values. The only truly worthwhile “course”, in my opinion, is one that you get through a reputable university. Ultimately, it then boils down to what is meant by “reputable”.
In IT, there will always be a market for courses. At first this statement seems obvious—after all, isn’t the way one learns how to administer an instance of Microsoft Exchange, or SharePoint, or Microsoft CRM is through a course? Is this the only way? If you’re a corporate charged with maintaining a level of skill within the org, it sure seems like the only way … it sure is the most expedient (at least at first glance).
The course-peddlers know this, and they exploit it. Corporates are easily wooed by the promise of the training silver bullet. It’s money for jam … time away from the office and the shelling out of a few shekels brings you back shiny new Exchange-ready employees the following week. There’s a problem with this though, it’s subtle—they’re Exchange-ready … yes, but they’re not really Anything-Ready, and that’s what we should really be looking for.
Anything-Ready is a meta-concept … it’s not about anything particular that you may know, or that you may need to know, but rather how good you are getting to know what you need to know. I’m not looking for Master Exchange Certified, or SCRUM Master Certified … I’m looking for Master UPSKILL Certified, All-Technologies-Applicable. Now that is valuable.
Which brings me back to why I place value in a university degree. When you go to university, you learn how to learn, and if you’re lucky enough to go on to do a post-graduate qualification, you get first exposure to Anything-Ready 101. I’m probably being unfair in that this judgement really has been made through the lens of technical degree … can’t vouch for a BA. Ultimately though, there’s still a whole lot of learning to do before you graduate as “Anything-Ready” and that’s the job of industry. True Anything-Ready graduates are the product of years of industry-grind-mill, post university degree.
So .. what is Anything-Ready?
Apart from getting your daily dose of mental calisthenics, addressing the root cause means that you’re eliminating a fear—that’s because if you haven’t gotten to the nub, you will always remain in fear of what may pop up later on because you chose to shortcut grokking the problem.
You can spot a course-taker a mile away, she tends to shy away from anything not within the ambit of what has been explicitly learned—face your fear and become a polyglot.
A keen study of Anything-Ready knows that the “Ready” part needs constant attention—regular reading is a must to maintain that status.
I continue to be astounded by the number of programmers who haven’t mastered the bread-and-butter of their tools. If I had a penny for every “senior programmer” I’ve met who can’t touch-type… Jeff Atwood says it far better than I could. As for your editor … choose one, embrace it, get to grok it, because if you’re a programmer, it’s the canvas of your craft.
No man is an island. Programming and Autism—two peas in a pod? It doesn’t have to be that way. Humans are computers … just really complex ones, and it does take a while, but every programmer eventually figures out that solving certain problems can be done an order of magnitude faster through a small human interaction than solitary toil. So keep community, not so much for the selfishness of getting what you need quickly, but for the benefit of your own soul.
There’s no barrier to entry with programming. Anyone with a laptop and an Internet connection can do it. More alarming though—anyone with a laptop and an Internet connection can convince Joe Sales Exec that they can do it well. That’s why the keeper of “Anything-Ready” faith knows how important always beats urgent. The “sins of the fathers” is a biblical meme that applies everywhere, not least in programming—careful what decisions you make, because they form more of a legacy for those who come after you than you may think.
It’s incumbent on us to be vigilant about what’s important. If we don’t, we’re in danger of wasting time. Distilling what’s important is about cutting to the chase and removing waste. It’s another way of repeating DRY (the only time you get to repeat yourself and feel good about it). Anything-Ready-practitioners are voracious distillers of what’s important.
Someone who is Anything-Ready knows that it’s tenuous title. They don’t call it the fire hose for nothing. Do you know someone who can actually drink from a fire hose? (no spilling). So keep that ego in check—there’s always someone around the corner way smarter than you. Really.
Back to Courses
Courses aren’t all bad. A good course will:
- Provide a formal, structured means to refocus;
- Expose you to people who you wouldn’t normally have had the chance to meet;
- Put your bosses mind at ease that the “skill issue” is being addressed (definitely a soft benefit);
- Keep the paper mills afloat.
Today we assessed our 20th candidate for position of senior developer, using a small test that I drafted some time ago. Since then I’ve spoken about how the test was dumbed down since one of the questions was perceived as being too difficult. The assessment consists of three questions, which I’ve dubbed Fibonacci, Quicksort and University. I’ve already discussed two of the questions, namely Quicksort and University.
Although not an earth-shattering sample, 20 is a number that we can start to draw pretty graphs with, so I’ve included a summary of the results alongside.
We can speculate about what it tells us:
- There’s something wrong with University; nobody has come up with a satisfactory answer;
- In the case of Fibonacci, there’s something wrong with the candidates; only five people have come up with a satisfactory answer.
Ok, my second conclusion above is possibly a little harsh. I think it’s a little harsh, because upon inspection by others, it’s elicited use of some power words like “mathlete” and “math-wiz”.
Now Fibonacci is the only question that I haven’t posted for all to see, mostly because I thought it was too simplistic and therefore quite uninteresting. Given these results though, I’ve been prompted to reword it completely. I mean, if only math-wiz’s have what it takes to do it then I can’t make any assumptions about the background that a candidate may have in the arithmeticmaths department.
What follows is the version of Fibonacci as it was up until now:
I’ve taken great pains to remove anything that may constitute an implicit (read “unfair”) assumption about mathematical background and I’ve reworded the question to provide a lot more hand-holding for the candidate. This should also help in offsetting the nervousness factor.
Here’s my updated version:
Recently I chatted about appropriate coding assessment questions for senior developers, and came to the conclusion that Solver was a little too demanding for someone to do in around twenty minutes (under pressure), so I replaced it with Quicksort.
My assessment now consists of three questions:
- Fibonacci. In short, “print out” the first thirty terms of the Fibonacci sequence, any which-way;
- Quicksort. Sort a simple list of names into alphabetical order, applying a crude (read: not very efficient) implementation of the Quicksort algorithm;
- University. Code up a set of objects and/or interfaces that describe a simple domain model, illustrating structural relationships between the domain objects.
At first glance, this would seem fairly easy. The tricky bit comes in due to the fourth bullet point in the problem description: “a lecturer might also be a student”. Now C# doesn’t support multiple implementation inheritance, and this problem calls for a design involving multiple inheritance.
I’m going to present my solution to the problem. I need to stress though, that I’m not wholly satisfied with it because it involves a StudentLecturer type (you guessed it … a hybrid) which just doesn’t sit well with me.
In any case, this is a classic case of the Diamond inheritance pattern (see the Diamond inheritance problem), and this is how the relationships might look:
I’ve deliberately left Course out because it isn’t really central to the real problem, and as a result, just creates clutter. Within the bounds of the description of this problem, this solution might be acceptable, but it’s pretty tightly coupled and promises to turn into a bit of a nightmare should we need to extend the orthogonal roles to more than just Student and Lecturer (although, off the top of my head, I can’t think of how). Ideally though, this sort of mixin scenario is more suited to a dynamic language like Python that allows types to be defined at runtime. Never-the-less, it makes for a worthy brain teaser when done using a statically typed language that only supports multiple interface inheritance.
All three questions comprising the assessment are required to be completed within an hour. What I didn’t anticipate though, is the response to the questions. After assessing twelve people, no-one has provided a satisfactory answer to University. Is this because it’s particularly hard? Are C# developers, in general, not as strong on the modelling front? It’s a little perplexing.