Ceci n'est pas une pipe.

A description of a doctrine without words is not a doctrine without words.

Over the last few days, the internet saw a layered explosion of conversation regarding Adria Richards, and a conversation which happened near her at PyCon 2013. To me, it looked like this:

The first circle represents the initial event. The second circle represents Adria's public reaction. The third circle represents the reactions of HackerNews, Twitter, Playhaven, SendGrid, Anonymous, 4chan, and the internet at large to Adria's reaction. The fourth circle represents the analysis of the internet's reaction. And, for the sake of brevity, the last circle represents the analyses of this analysis. Some where in the middle of that rainbow pile there was some introspection. (Aside: I consider all of these articles worth reading.)

I'm the sort of person who likes to believe I'm above such flame wars, even before I know what they are about. And it was easy for me to nurture that unproductive belief in a little log cabin of silence. Fortunately, I was brought into a conversation in our office and knocked off my little throne of self-righteousness. Someone said something. Someone took offence. Someone else took offense on behalf of the offended (and, of course, themselves). It was discussed and the Original Someone took offense to the implications of that discussion. That's when I stepped in to "help out". Now our picture looks like this:

I've shrunken our original semicircles to avoid a hyperbolic 3364 x 1740 PNG.

No need to thank me, friends. Glad I could help.

Keep in mind that this was a respectful and lucid discussion; everyone I work with is intelligent and thoughtful. But look at those layers: none of us could possibly share a context. It was difficult to nail down what we were even debating most of the time. Our own emotions? A specific incident? The reactions to an incident? The state of our industry? The incident as a microcosm of our industry at large? The state of gender roles and sexuality the world over? Some muddied mix? Anything we'd unravel seemed to hide another layer of experiential and emotional complexity which would quickly bury us again.

It wasn't until hours after Tejas stepped in and suggested we all take the weekend to sleep on it that I realized I was making precisely the mistake I presumed everyone else was making. I believed I understood. I believed I had clarity. I believed if they would just listen to me I could show them the answer. Specifically, I believed I had the one piece of advice everyone else was missing: "Maybe you should take some time to reflect on how she might feel." The irony still hurts.

I will continue to participate in this conversation. (And the related conversation about stopping rape, as it is ultimately more important.) Many of the links in this chain are ugly links. When a conversation is itself about our understanding of one another -- and thus how we treat one another -- those ugly event-links are (a) pointers to discussions we need to have and (b) proof the conversation is valuable, because we haven't stopped hurting each other yet. The recursive nature of the conversation shouldn't scare us but it might suggest we speak carefully.

But before I participate in the conversation, I'm peeling back all ten layers and taking stock: Who am I? A healthy, educated, middle-class, white man. I will never be a woman and I do not have the imaginative capacity to understand what a woman feels. I will never be another person and I do not have the imaginative capacity to understand what another human being feels. I can learn by listening with an open mind, even if I will never perfect my understanding. How beautifully this dovetails with my position of privilege! It's the perfect time to shut up and take some of my own medicine: Reflect.

How do I really see other people? How do I really see myself? When do I judge you? When do I desire you? When do I reject you? Why? When my perceptions take life in my actions and my words do you feel threatened, comforted, intrigued, or confused? Why? Which link in the chain am I? Am I making things better?

. . .


defining the test for rubymonk

I wrote some time ago about defining the interface for rubymonk. Glancing at it again that post was a bit rambling. Sorry. However, it did introduce a concept I've been mulling over for the last half-decade: re-framing all software in terms of automation. Robots. I'll start with RubyMonk as an example, and then move on to others and counterexamples.

RubyMonk has quite a sophisticated back-end. The details aren't important for this discussion, but it is essentially a virtual sandbox which quickly and safely executes any programming language (not just Ruby) in isolation, preventing that code from interrupting other users' exercises, other processes running on the RubyMonk servers, other files on said servers, or the clean operation of rubymonk.com itself. Once this sandboxing technology is in place, the interesting question is no longer "how do we run arbitrary code submitted from a browser?" but "how do we teach someone Ruby?"

Everyone on the RubyMonk team has taught Ruby to classmates, colleagues, kids, and friends. The activity of "teaching Ruby" is a known quantity. In the world of yesteryear, however, these lessons always involved our physical presence. From our teachers we have learned how to recognize certain categories of mistakes and how to introduce a correction. From them we have also learned when not to correct someone -- sometimes feeling the pain of a mistake is more memorable. Conversely, they taught us to identify frustrations and to step away from an exercise when it becomes too emotionally taxing. They taught us to ask the right questions when someone doesn't appear to understand a concept. Or to employ humour, analogies, and anecdotes to colour a subject. Finally, they taught us to teach. And so, when we work with a new programmer, we also teach them to teach.

This is an incredibly human endeavour, teaching. But all software is an immaterial robot. We need to bridge the divide. How does the RubyMonk robot work? Today, when you attempt an exercise on RubyMonk, you are learning from an interactive book: first you read a blurb about lambdas or ActiveRecord or your topic de jour. Next, the robot quizzes you by offering up an exercise. Your solution to the exercise is sent to the RubyMonk server and executed against a small battery of tests -- each of your test results is returned to you with a brief explanation. If you pass all the tests, you pass the exercise. So what are we missing? Well, we can't teach you TDD with this method yet -- how do we test a test? And if the solution to that seems obvious, how about teaching SQL? Prolog? Portuguese?  Calculus? And once you solve those problems (and we largely have), the real challenge emerges. So far the robot does not recognize categorical mistakes. The robot does not infer when to let you suffer through a mistake to make it stick (perhaps thankfully!) nor does it know when to tell you to step away for a tea break and give your mind a rest. It doesn't ask the student dynamic exploratory questions on difficult lessons. It doesn't remember the last time it forgot the order of parameters to the signature of Enumerable#inject.


The challenge of RubyMonk -- as is of all useful software -- is to replace a human being. And while the task of teaching is surely orders of magnitude more complex than the task of photocopying documents or playing your favourite David Bowie track, the goal remains the same: Build robots. Free up human time. iTunes is a robot. Prismatic is a robot. RubyMonk is a robot.

I've only been back in the startup world for one year. There's a lot of great stuff going on around the world right now. The last time I lived in India there was no Cleartrip or Redbus, which are robotic replacements for travel agents and telephone booking. Online banking was a non-starter. In 2013, every country seems to have technology covering the basics. The better technology companies are geo-agnostic or are striving to be. I don't want to hire a robot I can't take with me to Thailand (it's always fun to see which part of my Rdio collection is missing when I land in a new country... but I'd still prefer if it were all there). The world is getting smaller and faster and more overwhelming -- but thankfully a generation of nerds is fighting to smooth the transition for you. When we can't build a robot to help you, we'll fight the antiquated laws which stifle progress. At least, some of us will.

I see a divide between the inevitable future of beautiful, helpful robots built by a new generation of businesses (and non-profits, for that matter) and the ephemeral world of peculiar toys established on a misguided premise. This hit me in the face as I read through The Lean Startup, agreeing with everything Ries had to say but feeling a peculiar unease throughout the entire book. Why was I getting such a barfy feeling in my guts reading a book of sensible advice? It only occurred to me once I'd finished that most of his experience was drawn from building IMVU, which was a robot version of human... what, exactly? I'm not sure, either.

It's a good thing for those of us in the startup world that there is money to fund such endeavours: GroupOn, Instagram, the iPhone-ordered-artisanal-bread-aged-cheese-local-ingredient-biodegradable-packaging... grilled cheese sandwich. A cornucopia of startups whose primary customers are other startups. (Ever read a short story by an English Lit major about an English Lit major who suffered from writer's block during a short story assignment? Yeah. That.) A thousand other companies that lack a real goal, a real business model, a real raison d'être. If those companies can find enough money to feed their employees, surely so can those building software which solves real problems.

At C42 Engineering we're currently working on a process to help us identify meaningful problems and gaps in the solution space. We'll publish everything about this process because there are big, hard problems left to solve. And each of those problems is an opportunity for someone to build an elegant robot. We can't wait to see yours.

An Atheist's Glimpse of God

One of the benefits of working for a startup like C42 Engineering (where I help build rubymonk.com -- the name is a coincidence) is the broad range of experiences available, both in and out of the office. Thanks to our flexible work environment, I was able to travel to Himachal Pradesh for a couple weeks of experimenting on myself as a break from experimenting with software. I know not everyone enjoys such benefits, so let me start by saying this: I am thankful.

An introductory course in Vipassana meditation is 100 hours of meditation practiced over 10 days. I took this course in late 2012 and it was simultaneously the hardest and most interesting thing I've ever done. In the months since I took the course, I've tried dozens of times to explain the experience in print and in person. I've consistently failed.

With that in mind, let's all just agree this article will also be a failure. Low expectations will prevent us from taking things too seriously and prevent me from talking too much. Hopefully.

The Problem

I haven't identified with atheism since I was an angry teenager but in 31 years on Earth, I've never put faith in something greater than myself. That's fine. I've never had much faith in myself, either. The bigger things aren't missing out on much. I've called out this fact because I expect my retelling of my experience to sound considerably religious, even though I am not.

I ask the same questions we all ask. Who am I? Who are we? Where are we from? What is our purpose? What is my purpose? How can I help? Usually my answers come in the form of pithy quotes from scientists whose attractive wisdom I've come to wish was my own. Other answers I've found in secular interpretation of religious and philosophical tomes: the bible, the torah, the quran, the tao te ching, the writings of chuang tzu, calvin and hobbes, dr. seuss. And though many of these answers are momentarily comforting, I've spent the majority of my life in a state of philosophical discontent.

I'm a middle-class kid from Western Canada. I have a loving, supportive family. I couldn't ask for better friends. Ninety percent of Maslow's pyramid has been taken care of for as long as I could remember, leaving me to arrogantly believe it's my responsibility to improve this world, even if I have no idea how to do so.

Enter Meditation

I didn't start meditating for some spiritual or mystical purpose. I started out of arrogance: "Sit there and think about breathing." Yeah. That sounds pretty easy and relaxing. I bet I'll be good at it.

Once I realized that meditation is incredibly difficult, arrogance transformed from my reason for attempting meditation into my reason for continuing to try: After a while, I noticed that it did start to relax me. Not during meditation, of course: the meditating part was still insanely difficult. But if I meditated for half an hour before work, I found myself occasionally enjoying the unpleasant bus commute. Sometimes there was a marked change in my behaviour for the first few hours of the day. I was less arrogant. I was less of a jerk in general.

Anyway, that's pretty boring. The point is: meditation is hard. To make this point clearer, I've set up an interlude so you can meditate if you've never tried it before. It will only take 10 minutes, which is relatively short compared to the 6000 minutes of an introductory vipassana course.

Meditation isn't usually very complicated. Try this for ten minutes:
  • put your hands on your lap, close your eyes -- don't move or open your eyes until you hear the 10-minute gong.
  • focus on your breath; feel it wherever you can -- in your nose, in your throat, in your lungs, in your diaphragm.
  • distracting thoughts will come up; just ignore them. when you notice you've been distracted, gently let go of the thought and focus on your breath again.
  • if you get really distracted, breathe hard a few times so your breath is easier to focus on.
  • don't feel disappointed or defeated when your mind wanders... it's just what happens.
  • make sure you hear a gong sound when you click "Start"; the timer only works in modern browsers (HTML5).


How did that go? Was it difficult? If you found it easy, try this twenty minute timer.


You are amazing.

The Material

The course is completely free of charge. The course center is spartan. The stone buildings have no ornamentation. There is no text beyond the essential. ("Breakfast is served at 6:30AM.", "Toilets this way.") There is no imagery whatsoever, not even a little stone buddha statue. Males sleep in little huts on one side of Camp Goenka and eat on the male side of the kitchen. Females sleep on the other side of Camp Goenka and eat on the female side of the kitchen. Everyone meditates together in a big hall.

The course is taught by recorded video and audio, which gives the drab surroundings an extra-culty feel. All vipassana centres worldwide use the same video, so one hopes Mr. Goenka records a new one in high-definition before he dies. The DVD used for the course already looks dated; in a couple decades it will resemble Scientology recruitment videos from the 1970s... in medium, if not in content. Some of the instructional audio involves chanting. I'm not a fan but by the end of the course I was accustomed to it. The chanting, as it turns out, is little more than the instruction repeated in Pali.

What happens on a vipassana course is very simple: You meditate. There are breaks in the day to eat, sleep, poop, shower, and walk around. Sometimes a dog would wander through the course centre and we could pet him. That was exciting. Sunset was the only daily sensory event of note.

What doesn't happen on a vipassana course? Everything else. Just in case you were wondering, you can't: talk, read, write, exercise, eat your own food,  use the internet, use a phone, or look anyone in the eye. Some monastic rules (precepts) also apply: No killing (even mosquitoes), no stealing, no sex, no masturbation, no lying, no smoking, no drinking, no drugs. Thankfully, when so much is forbidden, some rules cancel each other out! It's easy to avoid telling lies when you can't speak. Though you can speak to the instructor and the volunteers, so there are one or two daily opportunities if you're really jonesing to tell a delicious lie.

Every day follows the same format. Vipassana centers exist in most countries across the globe and the course is run identically in each one:

Though it's never explicitly mentioned, the course is effectively broken up into three equal parts:

Days 1 - 3: Anapana (breathing) Meditation. These first three days are spent mentally staring at your nose. It's not as boring as it sounds because it's excruciatingly painful. Sitting still for ten hours a day hurts. "It will be painful." was the forewarning of the instructor when I complained about my knees. He was right. By the third day, I had experienced the greatest physical pain of my life.

Days 4 - 6: Vipassana (insight) Meditation. These next three days are spent learning and practicing vipassana. It's basically an extension of Anapana: rather than focusing explicitly on the skin beneath the nostrils, scan every bit of skin over the entire surface of the body. Over and over and over. Somehow, this actually calms the pain caused by sitting still for ten hours a day. The pain is not eliminated but it becomes much less significant.

Days 7 - 9: Deep Vipassana Meditation. The last three days of "serious" meditation are where things get weird. Surface scanning gives way to deeper penetration of the body. Physical pain takes a back seat to the volcano of emotion and memory one opens up after six days of attention turned inward. On Day 7, one girl ran out of the hall to sob and howl loudly in the courtyard. After the morning meditation on the ninth day, I broke down and cried in a way I haven't felt myself do since childhood. The meditation hall was so utterly silent on this ninth day it was almost impossible to believe this was the same crowd that was shuffling and burping and grunting and coughing and farting their way through the beginning of the course.

Day 10: Vipassana and Metta Bhavana. Noble silence is broken: we can talk and look each other in the eye again. The businessmen of the crowd are back on their Blackberries. Writing utensils emerge and some return to the book they abandoned nine days prior. As senses return and the intensity of meditation is visibly dulled, the world becomes real again. Each meditation ends with a few minutes of Metta Bhavana (loving-kindness) meditation.

For the following week, I also meditated twice a day at the vipassana centre. Everyone seemed to experience strange physical effects during the course but most of mine appeared during this period. Toni (a friend I'd met just before the course) found her hearing was so sensitive in the days following the course that the sound of a crowded restaurant was deafening. Pieter (a friend I met just after the course) found his sight was increasingly crisp each day until the tenth. 

The most peculiar physical reaction I had during this period was that as long as I was meditating twice a day, I slept comfortably on my back. I have never slept on my back in my entire life. I woke with no lower back pain for the first time as an adult.

The most surreal physical observation I made during this period was twofold: I started to feel deep into my body, on occasion. Once, into my bronchial tubes and the tops of my lungs. Another time, while lying down, I could feel the blood coursing through my cardiovascular system with unnerving clarity. I am a fragile little blood sack.

The Immaterial

Those concepts outside the realm of the physical are, out of interest, those which I tried to impress upon others in the months following my course. This is the section where I will fail, in case you thought I was doing a good job of explaining the experience thus far. I'll do my best but in the end I can only suggest that, if you are at all curious, you could try an introductory course yourself.

"It's strange that the very act of thinking about something makes it impossible to see it." -- Pieter Jan Visser

I didn't have words to describe this until my conversation with Pieter. In the last three or four days of the course, I started to see things. My eyes were closed, of course... and the "things" weren't really visual. However, far in the distance, on the horizon of comprehension, I saw -- briefly and for the first time -- something which resembled my beginnings. I don't know much about this thing beyond what Pieter said. To know it, to think about it, to try to understand it... was for it to disappear. I think it may have been recursive: defined in terms of itself. I can't tell you why or how.

Such a thing... this non-thing, born of nothing, apropos of nothing, ceasing to exist in the presence of anything else, is the closest I've ever come to experiencing anything religious or spiritual in my life. And yet, the process of discovery felt more scientific than anything else. Through sheer observation -- in the necessary absence of effort, suggestion, idea, word, colour, sound, smell, or taste -- an unadulterated reality appeared. It was strange and new but somehow it made sense.

Where this non-thing was very small and very hard to relate, the other idea which appeared toward the end of the course was much clearer: the meditation became an allegory, a microcosm, for the world around me. The past is immutable; why worry about it? The future is unknown and impossible to predict; why worry about it? Planning is not worrying, mind you. Just make plans with these two truths in mind. Meditation is terrific practice since there's no need to plan -- I just get to try my hand at avoiding worry. As an incredibly anxious person, this can be surprisingly informative.

A second microcosm becomes obvious after some time: After eight or nine days of internal monologue, I noticed that the way I treat myself is much like the way I treat others. Distraction was frustrating, my frustration with distraction was frustration with myself, if I was angry at the distraction I was angry with myself, and the anger never helped. Calmness and rationality prevailed every time. Gentleness. I had to be gentle with myself or I did more harm than good. I'm not certain, but I suspect it's true of my interactions with the world I live in as well.

And with that, my failure to explain my experience is almost complete. There's much I've missed. The hours of the course I spent doubting the motives of the instructors, the meditation itself, and my own sanity in signing up for such a thing -- all these doubts were quenched. My unexpected reaction to intoxicants when I returned home -- I still enjoyed them. My seeming inability to lie to myself by the end of the course -- I ask myself hard questions all the time but I apparently don't always answer from the heart. My frustration with the inclusion of Buddhist beliefs such as reincarnation, kalapas, and omniscience -- we were told to ignore these beliefs if we so chose; I ignored them. And still more remains.

Rather than exhaustively discussing every aspect of the experience, I'll leave you with what attracts me most to this bizarre practice: It is ordinary. There are no tools: Just sit down. There is nothing to see: Just close your eyes. There is nothing to believe in, nothing to talk about, nothing to do... yet it was more informative than any conversation I've had or book I've read. There is no literature to read, no philosophy to ponder, no behaviour expected of you. There are no gods, there are no drugs, there is no magic... yet it was more intense and revelatory than any acid trip.

As the Zen kids say: "Just sit."

defining the interface for rubymonk

Discussing an interview I had yesterday --quite interesting when delivered with Aninda-- with a non-technical friend, we stumbled on the fact that everything in Computer Science is an interface. From the moment you differentiate data from code, which wasn't immediately obvious to even the first computer programmers twiddling individual bits....

Everything you build in software is defined by an interface. These are the boundaries, but they're also where the magic happens.

Here are some interfaces:

(We'll come back to this.)

$ ps aux | grep clojure

At this point, I had to stop to explain how a function works. Does this help? (Hey Blogger or Google or whoever the heck is in charge: why can't that image be an SVG?)

Objects are the next interface to consider. They are a bundle of functions. Actually, they're more complex than that. They are a bunch of closures... actually, dispatching closures. (Okay, I've lost my non-technical friend at this point. Oh well.) There are other ways of looking at them, but we'll take the perspective of the function, which we already agree is quite simple. To the function, the object looks like a set of rules about how one defines interfaces with functions. Objects can be made of functions but it's not quite so the other way around (though the object may consider this point contentious or even academic). The function doesn't care. To him, an object is just a cluster -- however small -- of functions who have been told in advance that part of how they behave must change, because of the way they were set up... this time, at least. And what's worse, just because an object has been set up -- it won't necessarily stay that way! Yikes. Looking at it from the outside, the function pities the object. The function can choose to behave this way but the default position of the function is, "I never change!" The object changes himself (or worse, allows other, unknown objects to change him). It takes some work for the function to behave so sloppily; you need multiple functions -- and functions returning functions, no less (as a type's constructor returns a function whose sole purpose is dispatch based on the type of the first parameter and the name of the second -- usually with these parameters taking special positions, like first_is_an_object.second_is_a_method. I digress.). Such effort forces a conscious choice on the part of the person writing that function. "This risk is worth it!" you say, and an interface of your choice, with complexity of your choice, emerges.

Finally, at the top of this scale are languages. They themselves are composed of functions and objects. In fact, most compilers and interpreters for languages can be thought of as pure functions: I give you the language, you give me the binary, assembly, bytecode, or runtime language (JS, these days). This is the most complex interface. Usually, a human still speaks to this interface. In 2012, this interface is fully-manual. These humans are called programmers. And the best of them will make it their task to automate away their own job. But, as of 2012, programs that write programs are risky and difficult. Automation can be seen on any of these other scales (functions and data) without writing your own macro or yet another compiler or parser. Choose a language which gives you this option when you have no other choice, but be careful to wield such a weapon when you see no other way out. Otherwise, it is a simple interface you want.

Kitty pointed out to me that I haven't called out a very important point: All these interfaces are fundamentally the same. They accept some input and produce some output (even if that output is a side-effect). Objects are built of functions, and they're both built of languages. And the languages are built of objects and functions. What differentiates each one is the mental energy required to contend with the interface's complexity. Stateless interfaces -- such as immutable objects, pure functions, and HTTP -- are always easier to understand because there are fewer balls in the air. The "given" of given-when-then doesn't apply if there's nothing to set up. There's only when and then.

This makes the interface for RubyMonk interesting. There is of course a very cute visual style to rubymonk.com (yeah, we love it too), but the real interface is the user's interaction with the mentor -- how we evaluate their progress and the programs they write. How we assert that something they've done is correct -- because the programs they write are data to us. As we teach more complex concepts, this interface itself will become increasingly complex by its very nature. Or, perhaps, we will realize the beautiful intrinsic quality of data that is code and code that is data, leading us to discover an elegant solution to the automation of the Hacker Mentor.

zero to emacs in under 5 minutes

You want to write Clojure. You want to write it in Emacs. Here's how.

1. Grab Leiningen.

mkdir -p ~/bin
cd ~/bin
wget https://raw.github.com/technomancy/leiningen/stable/bin/lein
chmod +x lein
echo 'PATH=$PATH:~/bin' >> ~/.profile
lein self-install

This will get you leiningen, Clojure's build tool.

2. Grab Clojure.

cd ~/code
lein new my-first-clojure-project
cd my-first-clojure-project
lein deps
`lein deps` will bring down a local copy of Clojure. Look in ~/code/my-first-clojure-project/lib !

3. Grab swank-clojure.

lein plugin install swank-clojure 1.4.0
This gives you the `clojure-jack-in` command in emacs. It's your samurai sword.

4. Grab a healthy .emacs config.

mv ~/.emacs ~/.emacs.bak
mv ~/.emacs.d ~/.emacs.d.bak
git clone git@github.com:c42/dotfiles.git
ln -s dotfiles/emacs.d ~/.emacs.d

5. Grab an emacs.

Ubuntu: https://launchpad.net/~cassou/+archive/emacs
OS X: http://emacsformacosx.com/emacs-builds/Emacs-pretest-24.0.94-universal-10.6.8.dmg

Running emacs for the first time will automatically install all the packages you need. Now run your first emacs repl!
M-x clojure-jack-in


finger brains

Okay, so now I'm back on my own computerand it's a race against myself. Crap. I still seem to be making mistakes. I guess I just can't type all that well when I've had ad couple. Shit.
Well, this is all I can think of so I'm going to stop typing in 3 2 1....
My housemate Nikhil (and not my other housemate Nikhil) and I had a typing race on our two respective keyboards. It lasted only a few seconds. We were racing ourselves to test the keyboards (MacBook Air vs. ThinkPad 410-something-something). We each preferred each other's machines but I would only trade this for an X1 covered in leather. Our conversation led to a cross-comparative question "why should I care about my typing speed?" to which was returned one of my favourite stories:
Duke Huan was in his hall reading a book. The wheelwright P'ien, who was in the yard below chiseling a wheel, laid down his mallet and chisel, stepped up into the hall, and said to Duke Huan, "This book Your Grace is reading--may I venture to ask whose words are in it?"
 "The words of the sages," said the duke.
 "Are the sages still alive?"
"Dead long ago," said the duke.
"In that case, what you are reading there is nothing but the chaff and dregs of the men of old!"
"Since when does a wheelwright have permission to comment on the books I read?" said Duke Huan. "If you have some explanation, well and good. If not, it's your life!"
Wheelwright P'ien said, "I look at it from the point of view of my own work. When I chisel a wheel, if the blows of the mallet are too gentle, the chisel slides and won't take hold. But if they're too hard, it bites in and won't budge. Not too gentle, not too hard--you can get it in your hand and feel it in your mind. You can't put it into words, and yet there's a knack to it somehow. I can't teach it to my son, and he can't learn it from me. So I've gone along for seventy years and at my age I'm still chiseling wheels. When the men of old died, they took with them the things that couldn't be handed down. So what you are reading there must be nothing but the chaff and the dregs of the men of old."
Wait. Maybe I meant to read him the one about the buckle-maker who focuses so intently on his craft of making buckles that he couldn't see anything else. It wouldn't be the first time I've confused them. Anyway, if you can't type in one continuous stream (higher speeds are largely irrelevant but a 100wpm minimum wouldn't hurt), you're losing little tiny brain spasms to figuring out which keys to hit. These little tiny brain spasms could be helping you figure out what `self` is in the median of your code while trying to remember how to write a class method which generates class methods in Ruby. Because that's how brogrammers like you and me get our tickles. These little tiny brain spasms are basically the opposite of sleep. Shoot them down with your giant space laser-equipped pelican-shaped airship! And then just run under Bowser because you don't actually have to kill him. The beautiful Mavis Beacon awaits on the other side.

Programming is for girls!

My buddy Anne recently posted some of her favourite articles on the subject of women in Computer Science. I wrote an article last year which presupposed her question, "Programming is for girls?" My answer? Programming is for everybody!

Granted, not everyone who writes an Excel macro will be so enamored with their creation that they feel the need to master Haskell. The wonderful thing about Computer Science today is that they could. Thanks to the tiny (almost negligible) barrier to entry, the only thing left to tackle is the stigma.

Programming is already social. I prefer pair programming because I'm ADHD and it's the only way I can ever accomplish anything. But I also get to hang out with friends all day as a side benefit. Code is literature, a communication medium. It's fascinating that our little code-robots do something but it's a great deal more important that it speaks to people.

But: Not every software company is an inherently social environment. Yet.

Programming is already creative. In many ways, it's a purely creative endeavour. Outside the speed of light, there aren't many limitations placed on the raw imagination in a world of code.

But: Many software projects are still about doing the same old thing to a different piece of data.

Programming is already sexy and relevant. Startups are sexy by their very nature. Everyone knows what you're talking about if you say you work for Google or Apple. Most people you know already have a phone they've used to install software while they ride the bus.

But: Not everyone gets to work for a startup or Apple.

You can't have it all but you can certainly have most of it. Think your job isn't sexy? Automate the boring parts or quit. It's a seller's market these days. Try out a new technology, if that excites you. Talk to your coworkers. Work with them directly. Find a broader solution to an entire category of problems. Send your resume to that one company you think is really kicking ass.

There is a real spectrum of significance to the machines we build and the companies we build them for. Create some partial orderings to demonstrate this to yourself. Which is more significant? Clean water or banking? Auto insurance or rice? Diabetes research or zinc? Middle school education or vodka? Public transportation or plywood?

Not everyone considers the world in the same way and most of us will change our opinions over the course of our lives... but some parts of our society have obvious gravity. If you're already in software, let that gravity pull you in. If you're considering a career in software, contemplate the fact that a career in software really means a career in any field you want: from water purification to zinc froth flotation.

Girls, software is already sexy. Get on the trolley.