Dear Business People: An open-letter to the managers in the room.

Dear Sir or Madame in the suit,

Hi there! I’m a programmer, and I’m really good at what I do. I’m pretty sure you’re good at what you do too, but I think it’s safe to say that we’re good at different things. The thing is, people like me are usually working for people like you, and that’s cool, we like that arrangement for the most part. In general, we would much rather make shiny fun things than agonize over boring things like quarterly profit margins (ew). Unfortunately, because of this arrangement, we don’t always tell you the hard truth, because it’s way too easy to just fire us and find someone who is willing to lie to you. It’s just business.

I guess what I’m trying to say is that you’re kinda making this software thing harder than it needs to be.

Here are some things that we wish we could tell you:

We talk about you behind your back.

It’s true, and it’s not helping. We can whine to each other about what ails software development all day long, but until we engage people like you in the conversation, we’re just talking to ourselves. So I’m reaching out to you. Help us out here. In exchange, we’ll help you print all the money you need for your Scrooge McDuck-style gold doubloon swimming pool or whatever it is you want out of life.

Those fussy nerds in the room wearing plaid button-up shirts and blue jeans, looking meekly at their little notepads in order to avoid eye-contact control your profit and loss. They deserve to be treated with a little bit more respect than just some code monkey who makes the button blue. We get frustrated, but we still don’t say anything, we just silently walk away with years of knowledge that you can’t replace.

You should practice empathy, for selfish reasons.

Whichever model fits your specific world view, the fact is that these nerds are shy and you pay them a lot. If you push them around and intimidate them you cannot expect a solid return on that investment. Bear in mind, when I said “shy” earlier, I meant “cripplingly stunted socially”. You might think to yourself that this is the perfect situation for you, an extroverted captain of industry with all the best ideas. These nerds will do anything you ask them to, won’t speak up for themselves, and they aren’t out for your job? Sign me up!

The thing is… sometimes, and I mean this with all due respect: Your ideas are awful. I mean really awful. Like, “Let’s add a friendly paperclip that gives advice on your writing” awful. The kind of thing where any self-respecting technologist should stand up and walk out of the room because of how silly it is, but they have kids to feed, so… the system shall have a “clippy”.

“How long is this going to take?” is not the right question.

It’s totally a fair question, you should be allowed to ask it, but it ignores a lot of things; things you should care about. The “this” is so ill-defined that it’s nearly impossible to say for sure.

The astute reader will notice in this highly informative chart that I found on the internet, that there is no intersection of all three attributes.

This is the “Iron Triangle”, and it’s not really up for debate.

What you should be asking is, “What am I getting, and is that worth what I’m paying for it?”

Then, it’s easy to keep the “good” part as the constant, and flex only on what you deliver. Nobody wants bad code. Your customers will hate it, and all those precious dollars will not be yours. We can do better, but it starts with you.

 Process won’t fix your problems.

If the above sounded like that “Agile” thing that your friend the product owner has told you so much about, you’re right, it does. Sadly, it’s not the whole answer. You can’t just manage your way out of this one. Process is a way of wrangling lots of people if varying levels of skill and motivation toward a common goal. This effect is not an enhancement, it is an average. It allows you to coalesce 10 developers, one of whom does 90% of the work, into a “team”, with a “velocity”, so that you can see some burn-down charts and feel good that work is being done. Here again, you are not being told the whole truth. There is overhead associated with gathering and maintaining these team metrics (most of which are fabricated anyway). The top performers burn out, the low performers can’t keep up, the project still fails.

The real solution is to have just enough process to get by, don’t obsess over the management aspect too often, and most importantly get involved.

In computer science, we have an adage: GIGO – Garbage In, Garbage Out

If you, yourself, in person do not actively work at making your project a success, and all you do is spout out a few “as a, I want, so that” incantations once every two weeks to be put on a 3×5 index card, no amount of process is going to save you.

Technical debt is the same as financial debt.

Every time you say “I want it now”, you are creating debt. If you never allow your developers time and resources to clean up this debt, it will never be paid back. What’s worse, there is no software equivalent of a credit bureau, so we can incur as much debt as we like, more than can ever be paid back even if you went years without incurring any more. In this instance, you are both the lender, and the consumer. This is not a position you want to be in. Technical debt inhibits future growth in the same way that being shot in the face inhibits living. When every new feature must first traverse all the past mistakes, duplication, hacks, band-aids, and overrides you never made a priority, how fast do you think you’re going to move? Faster than your competitor? Safe enough to pass that audit? I don’t think so. Wise up, pay up. There is no free lunch.

You shouldn’t be the only “decider”.

Reject the notion of closed-door “requirements gathering” sessions. Embrace true collaboration, because you have no fucking clue how this shit works.

But HE does.


Software is incredibly hard to get right, and the people actually building it are the right people to discuss what you want, and the best ways to accomplish your goals.

Listen to your engineers, or you are in for a bad time, and you will not go to space today.



That’s all for now I think. In the end, I still love what I do, I just wish we could communicate a bit more openly and fix some of these things.

Love you all, and please don’t fire me.


The self-learner’s guide to programming.

I think it’s probably important to establish up-front, that the question of whether to teach everybody to code has been done to death. This guide assumes that you have considered these arguments, and are comfortable with your decision to give programming a try. Personally, I tend to fall into the ‘teach-everyone’ camp.

UPDATE: Okay kids, go to college. Don’t follow my example. You don’t have to study computer science to be a programmer, but you do need some kind of bachelor’s degree to be taken seriously. Things are starting to change, but for right now, college is essentially a requirement. This does not mean that you must study computer science to be a programmer. It certainly helps, but I know plenty of programmers with degrees in subjects other than Mathematics and Engineering.

Picking your first language

There is something special about your first language. Like a first love, it stays with you long after the infatuation period is over, past the breakup, and will continue to influence your decision-making for years to come.

I would suggest something in the dynamically typed space, because imposing a bunch of arbitrary rules seems pointless when you’re just starting out. C/C++ is too low-level, Java is too clunky, and lisps are too (con(fus(ing()))).

Python, Ruby, or Javascript, those are your choices friend. Choose wisely. I won’t try to bias you in any way. (cough: Javascript)

Joking aside, don’t agonize too hard over the decision, they’re mostly all the same once you get into them. There are some differences in syntax and the particular ideology behind the language, but for the most part they are all the same.

Whatever you do though, as a first language, please don’t pick PHP, VB, or SQL. These are so alien to all the others that they will forever warp your ability to grasp concepts which do not conform to the particularly strange way they are embodied in these languages. SQL is a great second language, but because it is super abstract, (so much so that it is considered declarative), and designed to deal with relational databases, that it’s really not a great language to start with. PHP is shit. Seriously don’t learn it.

Now go out learn it!

The task of learning to code is actually quite difficult, not because of a lack of available information as has traditionally been the case, but actually because there is now a metric fuck-ton of it, so your task is to sort through the crappy resources to find the pearls.

First things first, figure out your preferred learning style. If you find that you are more experimental, this is going to drastically change how you should approach the problem of learning to code.

For instance:

My first experience with programming was out of a book: “Teach yourself BASIC” or some other similarly awful step-by-step learn something complicated through repetition with very little explanation style books that permeate the genre. I hated it, but for many people this was the way they learned. I suppose it was magical to be able to print things to the screen, but at 12 I didn’t really have the wisdom to appreciate that. Had I not revisited programming later in life, I would probably be doing something detestable like practicing law. Had I actually enjoyed BASIC, as Dijkstra would say, I would have been forever scarred, and my ability to program irreparably damaged. So, I guess it all worked out.

If you enjoy a guided tour of a programming language from start to finish, I would suggest the Learn ____ The Hard Way series by Zed Shaw. I have not personally read any of them, but I think he’s a great writer, and seems to genuinely care about his students’ ability to read and understand the lessons. Plus he’s sassy, and I like that.

College is Dead?

So, I have a funny story:

A few years ago, I volunteered at a career day for my little brother and sister. Elementary age kids. You’ve maybe done this yourself. It’s a casual way to introduce young impressionable minds to the careers that they may one day pursue. This is not really something that you’re expected to prepare for, or really take too seriously. I took it way too seriously. Some parents showed up in their uniforms, talked about what they do day to day. I prepared a PyGame demo and had the kids talk out the algorithm for binary search. I didn’t see those other parents’ presentations, but I’m pretty sure I crushed it. A kid asked for my autograph.

At some point during the first presentation, the teacher asks, “So, what should they study in college if they want to be programmers?”

Now, what I mean to say is: “It’s never been easier to get into coding, and if you want to try programming, why wait until college? Start when you get home if you want!”, what comes out is: “You don’t need to go to college!” The teacher is, of course, mortified by my statement and immediately goes on damage control. The message was more polished for the next class. I think college is really great if you want to broaden yourself as a human being, get some independence from your parents, and be surrounded by smart people who are into the same things you are. If college is your thing, go for it. Go to college.

There was a lot of enthusiasm a few years ago around the concept of MOOC style offerings from major universities actually replacing the traditional college experience, but in general I think that for most people an in-classroom lecture style works pretty well. It’s certainly not the case that the ever-popular formula “anything + internet = instant_success” is always going to hold true. If you’re interested, try the free offerings from things like MIT Open Courseware before paid credential factories like Coursera.

Choose your own adventure Style

This is my favorite. Unlike advanced Mathematics, you can actually learn quite a few programming concepts without constantly being forced to understand the foundational underpinnings of the thing you’re actually trying to learn. This might seem trivial, but it’s extremely powerful. Not being forced to know about Boolean Algebra in order to understand that that “if (x > 10) do_stuff(x)” that you’re only going to do stuff when the value of x is greater than 10. Is x stored in a register, or allocated on the heap? Is do_stuff virtual? What’s the calling convention for that function? What are literally all of those things I just said? Don’t panic! You don’t have to know right now. This is due to a property that we programmers absolutely adore: abstraction. Suspend disbelief for a moment, learn the concept you are currently working on, and make a mental note to understand the wizardry that makes it possible.

This runs counter to the traditional educational paradigm where complex concepts build on top of simpler ones. Instead, most programming concepts tend toward elegance and simplicity. It’s true that to be a very good programmer you should strive to understand everything you possibly can, but the notion that you have to start from first-principles is incorrect, and potentially hazardous to your educational goals. As long as you’re curious, you can approach the task in any way you want.

Breadth-first: learn a little about a lot.

Here is a summary of a Bachelors degree in Computer Science.

  • Learn a language.
  • Learn some complicated mathematics of questionable value.
  • Now learn another language, similar to the first.
  • Now learn a third language.

I’ve probably glossed over some stuff about algorithms and data-structures, but that’s pretty much it. You get some solid exposure to a lot of things, but you probably won’t come away from the experience feeling necessarily ready to tackle any programming challenge life throws at you.

Depth-First: learn a lot about a few things.
This is definitely my preferred choice, because it’s incredibly easy to look like an absolute wizard compared to the first camp.

Oh, that’s cool, you know the first few chapters-worth of C/C++/Java like everyone else? Well I’m a D-lang black belt mothafucka, get on my level!

^^ This could be you. You’ll be writing 200 line code-haikus that outshine the competition because you actually know how to take advantage of the language. You’ll look like a rock star compared to someone who just knows the bare minimum required to pass. Learn the internals of the language,  get into the culture that produced it, and dive as deep as you can into the most advanced topics you feel capable, and you won’t regret it. There isn’t really a degree plan to follow, but it has other benefits if you’re willing to invest the time.

No matter how you choose to approach programming, the most important thing is to never stop learning. Technology is in a constant state of change, and when you decide to pursue this as a career, the requirement of life-long learning comes with it.

Good luck, and please shoot me a comment if you found this rambling mess helpful in any way!

-yours smugly,


Confessions of a Code Addict

Hello. My name is Ross, and I’m a code addict.

Code addiction is a very serious ailment, affecting one out of every hundred software developers living today. Until recently, it was thought that code addiction was simply being good at programming, but there is a darker side; the ghosts of long-dead bugs have come back to addle the brain and corrupt the spirits of the unfortunate few. Some may delude themselves into thinking that this deviant behavior is merely attention to detail, or a dedication to our craft, however the cold hard truth is that it is an affliction.

If you fear that a friend or loved one may be a code addict, please, seek help immediately.

Signs of a compulsive coder include:

  • Never admitting to having a problem, but rather constantly decomposing problems into several smaller problems.
  • Kerning Dyslexia. The inability to read fonts which are not monospace.
  • White-space obsession. Code-addicts like myself cannot read code which is considered “sloppy” by our own standards. His or her format-document key bindings will be worn smooth from overuse, and you will often find whole swaths of your code re-indented for “readability reasons”.
  • Editor envy. Questions such as “Does your editor support macros?” and “Can I change the font and color settings?” will be commonplace. Resist the urge to let them install EMACS on your computer. It is almost certainly a mistake.

Sadly, there is no known cure for code addiction. To avoid inducing a fit of nerd-rage, ensure that your variables are named correctly, and that you follow best practices. The best we poor addicts can do is echo the following string to stdout, and hope for the best.

Compiler, grant me the serenity to accept the code I cannot change,  Courage to change the lines I can, and the wisdom to know the difference. Writing one function at a time; Enjoying one cycle at a time;  Accepting bugs as the pathway to production.

Nailing the Interview

[ understand your audience ]

Disclaimer: This is taken from my personal experience interviewing candidates. I am by no means an interviewing expert, well-studied as a human lie detector, nor have I ever dedicated an ounce of time or energy into reading a book about the art of the interview. Luckily for you, neither has your interviewer. Most likely, the person sitting across from you (the candidate) is a normal human being of average intelligence who merely wants to see if you’re the type of person they could see themselves working with for an extended period of time without wanting to pull their hair out.

Note: If this is a consulting firm, then they just want to ensure that they can use you to extract the maximum amount of dollars from clients without them growing suspicious. Your actual personality probably doesn’t matter at all.

[ don’t panic ]
That’s easy, right? Don’t sweat profusely and make the interviewer feel weird you big dummy. Just plug your glands and remember to smile, but not too much… oh god, what do you do with your hands? Are you talking too fast? Too slow? This is how humans stand right? I think so.

Seriously, just relax. It’s already a really tense situation for everyone. Just be cool, okay? The interviewer will sense your anxiety, and will respond to it by asking you really easy questions. This might seem good, but really it’s like letting a kid win at basketball to make him feel better about being adopted. You want to prove that you are a smart, confident individual, and looking nervous until you get a few pity questions lobbed your way isn’t going to do anything to help your case.

[ know the bare minimum ]
If I ask you about design patterns, and all you can talk about is Singleton, the interview is fucking over. You should be able to explain language and technology agnostic concepts such as:

  • Basic Control Flow
  • Object Oriented Design Patterns
  • Data-Structures
  • Static vs. Dynamic Typing

There is a lot to know in the world of computer science, and often there is so much that we tend to forget the core topics. Know the basics inside and out so that you and the interviewer are speaking the same language. This is not to be confused with buzz-wording. These are not merely words you say and the interviewer quietly nods approvingly. You’ll be expected to know enough about any of these to talk about them in detail. If you don’t, I suggest you read up on them now and save yourself from getting in to trouble with the next piece of advice.

[ don’t bullshit me ]
There is nothing more repugnant than an interviewee who tries to bluff. It oozes out of them like a lanced boil:

“Oh yeah, polymorphism. It’s been a while, but I can do it. I just don’t remember the specifics. I would just google it. <sheepish grin>”

What was your plan here? Did you think I didn’t know enough about the topic I just asked about to call you on your obvious bullshit? Just own up about your lack of knowledge. The risk of outing yourself as an obvious charlatan far outweighs the minor inconvenience of admitting “I don’t know”. There are plenty of things I don’t know, and when people ask me about them, I try to be honest. Not knowing something doesn’t make you seem incompetent, but being a phony makes you seem like a dickhead who is wasting my time. In my head, the interview is over. I might explain how wrong you are, but there is no real way of clawing your way back from this position, so please, remember what your mommy told you: honesty is the best policy.

[  be smart, or have a plan to get smarter (or both).  ]
If you can’t impress me with your technical prowess today, at least show me some passion and have a plan to improve your skills tomorrow. If you are a “senior” developer and you haven’t learned anything in a while, you may want to reconsider this choice and pick up a book. “Good” in this industry is a moving target. If you are not improving, you are in fact regressing relative to the rest of the industry. Find some useful resources, and have them at the ready. Exclaim proudly: “No! I don’t know what a closure is, but I’m doing some courses on Javascript in my spare time, and I’ll be sure to pay attention when that bit comes up!”

[  be memorable ]
I see a lot of people, and they are all pretty generic. We all tend to do the same sorts of things in our day-to-day, e.g. making the button say this instead of that, or when the user clicks the thing, do some other thing. It’s boring, and repetitive, and not at all entertaining to hear re-told. Talk to me about something awesome you built, or about that time you brought down production, or the hard-to-find bug that saved your coworker hours and sent him into a fit of face-palming. I probably won’t ask, so just blurt it out. The less likely it is to come up in conversation, the better.

[ show me the code ]

Get yourself a github account and put up something, a pet project, an experiment, a few Project Euler solutions. Something with your name on it that is indicative of your coding style. This is equivalent to your artists’ portfolio, and there is really no reason not to have it available.

[ accept defeat gracefully ]
Sometimes, despite your best efforts, things will not go well. There are lots of reasons for this, but generally, it will mean that you are not the candidate the interviewer was looking for, and you know it. Resist the urge to ask “how did I do?”, it just feels desperate. Instead, ask the interviewer if there were specific areas where you are weak. If he or she has lots to tell you, just accept your fate, and try to turn the experience into something positive. Smile, take notes, and learn the things they mention. Your next interview will be better.

Tune in, well, let’s face it, whenever the hell I decide to get off my ass and post something, for an F-bomb filled tirade about passion.

-smugly yours, Ross

For The Moms

This is the gist of an actual phone conversation I had with my mother one week after she purchased a new computer.

[ring ring]
Me: Hi mom.
Mom: Ross… I’m really scared. I think we have a Virus. McAfee says it’s scanning and I can’t close it.
Me: Did you install McAfee?
Mom: I don’t know! I don’t think so.

Pre-empting the dreaded “Sweetie, the computer is acting funny, can you help?” is easy, and the time you save will be your own. In life and in computer care, early prevention is the best medicine.

Mom is not the administrator

  • Create an account for her.
  • Set the privileges intelligently. (hint: low)

Details for setting up a day-to-day user can be found here:

This is the first and most important point of all. True story, after I started writing this post, she called me and said that someone “from Windows” called her and informed her that he could fix her computer remotely if she would kindly go to her computer and request remote assistance. Luckily, she was tired and has no idea how to do that, so the scam failed, but she totally would have. Don’t put mom in this position.

Mom has simple passwords

This is a really big problem, because moms accounts are probably all using the same one, and if one of the 10 million passwords leaked recently, then hackers may he charging in to pwn her.

Get her a password manager.

This solution is two-fold: one, you protect her accounts from harm, and two, she can’t forget the passwords because something else is handling them for her. Just be sure you know the master password, and teach her how to use the app on her phone and you’re golden.

Mom doesn’t understand that nobody on the internet is her friend

Beware installing anti-viral sofware which is not from a reputable vendor:

If it is not from Microsoft, Norton, AVG, McAfee, Kaspersky, or Trend Micro don’t trust it.

There is a whole category of scamware dedicated to scaring mom until she pays when she’s already infected.

Do not open attachments or follow links from people you do not know. (Trust me, no one is sending you free money, it’s a scam)

Mom doesn’t care what browser she uses

  • Install Google Chrome or Firefox.
  • Remove IE from the taskbar and the start menu.
  • Hell, just uninstall it. Microsoft is sneaky and classifies it as a Windows Feature, but you can remove it.

Mom gets confused with all these ads and popups

Arm her with all the blocks.

Mom doesn’t have a backup strategy

She probably doesn’t need one, but it might be important to think about. There are several paid backup providers, but for as cheap as DropBox is, just give her one folder, sync it, and forget it.

Mom can’t explain what’s going on right now

When something goes wrong, you can save yourself a trip, potentially cross-country, by having a strategy in place to diagnose her problem remotely.

Good: Screenshots

  • Show her where the button is on the keyboard.
  • Have her email you a screenshot.

Better: Problem step recorder

  • It’s on her machine.
  • Teach her how to use it.

Best: Chrome Remote Desktop

  • Forget recording the steps, just tap into her machine directly.
  • I guess you can also use the janky Windows Remote Assistance (start >msra.exe)

Mom just wants you to come over and fix it.

If all else fails just go over. Maybe she’ll make you a sandwich and tell you she loves you.

Finallly: Mom doesn’t need all those crazy programs anyway.

  • Linux is an OS for Linux Kernel contributors.
  • Windows is an OS for average computer enthusiasts.
  • OSX is an OS for uppity graphic designers.
  • Mom is not any of these. Just get her a chromebook.

Other miscellaneous protections for mom:

  • Stop running Windows XP, seriously, just stop.
  • Run an antivirus actively, show her what it looks like so she doesn’t freak out.
    – (AVG is good and available for free or premium with some extra features that I’m sure are probably not super worth it, but feel free to give them money if you want to).
  • Beware tools that promise to “Speed up” your pc, they are almost always a scam in the best-case and can be bundled with viruses in the worst-case.
  • If you find yourself on a scary site, ALT+F4 or kill the process from the task manager, don’t get tricked into clicking anything on the site.
  • It is almost never effective to install an Anti-Virus AFTER an infection. Re-format, re-install, get on with your life.
  • Always ensure that you have Automatic Updates enabled on Windows to ensure security patches are up-to-date.

Also, you can replace the word “mom” with, “non-technical person” and the article is still valid.

(Edited on Mothers Day 2015. Love you mom!)