Monday, February 9, 2015

The case for autodidacticism in computer programming

I was recently asked about how being self-educated affected my programming abilities in any way. I hadn't thought the question through prior to this, so I gave some less than satisfactory answer, meandering on about how it was a mixed blessing, or something to that effect. This isn't really a very good answer...

I'm an autodidact computer programmer, and formally educated physicist, so I'd like to think I have seen a decent cross-section of both informal and formal education.

Having given the question some thought, I would like to posit that autodidacts will ultimately prove to be superior at their craft. I'd like to emphasize that this is a pretty weak causal relationship. Suvivorship bias is arguably a strong effect at work here. Successful autodidacts would likely also be successful in formal education, whereas those who struggle with formal education will surely not make the cut in autodidacticism. Hence, most mediocre programmers can be assumed to be formally educated.

That being said, the successfully self-educated do possess a number of advantages. Learning has always been the autodidact's lifelong personal responsibility, and usually when you learn of your own volition, what you learn tends to ingrain itself fairly firmly in your mind. The act of furthering their learning is also something the autodidact performs habitually. Furthermore, in order to make it very far, the autodidact will need to develop some fundamentally useful skills in problem-solving and lateral thinking.

The formally educated are subject to entirely different dynamics. While they're probably going to be exposed to a broader spectrum of knowledge, following a fixed curriculum that makes few concessions to whether the student is susceptible means that central knowledge will be lost. Emphasis is on passing exams, not on deeper understanding of the subject matter, and passing exams has never been easier. I have also seen more than a hint of CS graduates ceasing their learning process the day they graduate. It's sadly fairly common that people with five year working experience have merely accumulated five years of one year working experience.

The singular drawback of self-education is that it is a lonesome road. It can be very difficult to find peers to bounce ideas off.

Although to repeat my reservation, it's of course always going to be hard to separate the selection bias from the effects imposed by the different means of education.

Sunday, February 8, 2015

On JFokus 2015

Last week I was at JFokus, after I won tickets at a JUG event hosted at my job last year. The conference offered a pretty interesting cross-section of hot topics in Java right now.

Functional programming is absolutely incandescent. It's probably a natural reaction to lambda functions being introduced in Java 8, as well as the ongoing difficulties with designing good metaphors for parallel computing. Although I must say I'm a bit disappointed in the framing. Having dabbled in functional programming for several years, I got what they were trying to say, but the message lacked motivation. As much as it's interesting to lift the how aspect of Monads, and other FP paradigms, I fear it's going to be lost on the crowd if the solution isn't framed with a problem it solves. Pointing to JS' callback hell is a pretty lackluster motivation. The C++-talk "Plain Threads are the GOTO of todays computing" is in my opinion a far better sales pitch for Monadic chaining of parallel code. But at any rate, it's great to see functional programming is starting to make it big outside of academia!

There was also a pretty large buzz about IoT, but I remain skeptical. It still seems like a solution looking for a problem. If the industry can actually agree to a standard, it could be great, but if DLNA / UPnP is even remotely indicative, it's going to work, but just poorly enough that you're going to be frustrated and disappointed whenever you use it.

I'm reminded of that Douglas Adams quote
We are stuck with technology when what we really want is just stuff that works.
I should have taken pictures of the conference, but I didn't. Instead, here's a completely unrelated picture a frozen river I took when I went for a walk last Monday morning.

Not pictured: The Conference.

Sunday, January 25, 2015

Finding enough hours in the day

Let me proselytize for a moment.

For as long as I've had a job, I've been frustrated and intrigued by the conundrum that I work eight hours of the day, I sleep another eight (give or take), yet do not seem to have much time for anything else. That's only sixteen hours out a twenty-four hour day. What gives?! My commute is a ten minute bike-ride, so that can hardly be responsible.

Unrelated sidenote: But "what about progvember?", you ask. Well, it was very educational, although nothing came of my project beyond a REPL-loop which could perform basic arithmetic.

Oh, and C++11/14 is awesome and I love it to bits.
One of the obvious culprits, it seems, is that sleep is fuzzy. You do not instantly go from doing something meaningful to being asleep, and you do not instantly wake up to be productive. Winding down, and winding back up again, takes its fair time. There doesn't seem to be much you can do about this, at least nothing that yields a significant amount of additional time.

Below is a rough sketch of a "normal" weekday in my life:

Snooze... snooze... snooze... I don't want to wake up yet...
Getting ready for work.
Buying dinner and going home
Dinner and housework
Projects OR exercise OR dicking around on the Internet because I'm too tired to do anything meaningful
Winding down. TV, books, general chillaxation.
So... where the hell does the time go? An obvious time-thief is as already mentioned the rather long winding down-period. It's frustrating, but I've determined I need this in order to get to sleep, as doing more productive things that close to the end of my day would interfere.

Sleeping also takes a lot of time, but again I can't really reduce that without cognitive impairment. 7h30m is about as low as I can go. I've tried 7h, but then that had me crashing on the weekends.

Not listed, but very significant is a third problem: The blocks of time in which I can be productive are small and discontinuous. Most things worth doing have a significant wind-up period, ensuring that try as you might, very little productive can be accomplished in these stray pockets of free time.

Several years ago, I stumbled onto the solution to this problem. Since very few other people were actually in the office this warm and clammy summer month, I was holding the fort and there wasn't all that much to actually do during. Bored out of my mind, and itching for some challenge in my life, I decided if I was going to sit around being unproductive at work, I might as well go to work in the evening, when I naturally wasn't as productive. To illustrate what I mean, consider this "day":

Wake up
Time for projects, cooking breakfast/lunch, savoring the morning, exercise, what have you.
Getting ready for work.
Buying dinner and going home
Dinner and noisy housework. Pro-tip: Your neighbors will hate you if you vacuum at 04:30 in the morning.
Winding down

The day has not sprouted more hours, but it certainly feels that way. Because the free time is in a four hour continuous block, and because spending that time doing something exciting is not going to negatively effect your sleep (which is 12+ hours away), the time can be invested much more effectively.

An unexpected result was that my Stick It to "The Man"-attitude was completely unnecessary. My productivity at work increased every bit as much as my productivity at home! This is in part because the new sleeping hours allowed me to come into work with my brain already fully active, rather than having to spend over an hour trying to wake up. There have been mornings where I got more done before 10 o'clock than I'd usually accomplish by noon.

Another curious effect is that I didn't snooze the way I used to. Although I could hypothetically snooze for hours upon hours, I usually flew out of bed ready to get cracking on whatever project I was working on. On the 08-00 sleep schedule, the snooze buffer in the beginning is also a sort of crumple-zone in case I had a bad night's sleep, ensuring I can still make it to work at a reasonable time. That's obviously no longer necessary on 04-21.

There are of course drawbacks as well. Hitting the hay at 9 o'clock does tend to limit your options to meet other people than coworkers. It's also a bit of a pain to get back to 04-21 if you've for some reason had to change to 08-00. Finally, you need to plan your food purchases more than you're probably used to, as the window of time where grocery stores are open, you're awake, and you're not at work is greatly diminished.

Ever since I had this epiphany, I've switched back and forth between the ways of sleeping every couple of months. Each has distinct advantages and drawbacks, depending on what you wish to accomplish.