Search

Like what you see? You can pay me to solve problems for you.

Like what I'm doing? Give to me on gittip!

Saturday
Mar022013

an open letter to the programming community, and other friends.

The audience for this is quite broad, so some of this will be old news to some of you, but the background is necessary. Shortly before Christmas, I found myself in San Francisco (I'm from Seattle), without a job, friends in the area, a steady place to live, or much money. I ended up doing a contracts for a little bit, but it didn't quite work out. Quickly enough I realized that to get into the sort of situation I want to be in over the long run, Seattle makes the most sense.

In the long run, I want set my own terms for how I work, and have significant say in what I work on. This may look like some sort of consulting, but if so it'll require that I'm able to turn down most work, as much of it won't be appropriate for these goals. It may look like some other sort of business. I don't know yet, but I do know it's my long term goal, what I'd like to be starting on, in some way or another, before I'm 30 (I'm about half way to 27 right now, for context).

I guess the apology fits nicely after all that. I asked a lot of a number of different people in the community, and created the opportunities for people to reasonably expect various things from me. I have, almost without fail, fallen through on those expectations. I feel the need to say that I'm sorry, but I just can't follow through on anything right now. Lack of money, and the instability it can bring, are taking a big enough toll on me that I can't manage a ton more than my job search right now. So, please, everyone who's given me advice, offered to pair with me, attempted introductions for me, etc., don't take it personally. I hope to get back to most of you, in some form or another, once I'm back on my feet.

I honestly didn't expect so many people to be willing to help in so many little ways. A number of times since December I have been so overwhelmed by the little and big bits of support I've gotten from this community. I'm pretty freaking sure that, over the past three months, I have cried a few times because of how grateful I was. I haven't really shared that with anyone, unfortunately, because, as I mentioned, I'm just barely getting by. Still, I want you all to know – whichever of you read this, at least – I absolutely appreciate it. You may not consider whatever thing you did to have been much, but it showed me that I'm finally part of a community that, in big and small ways, gives a shit about me. I've been hanging out on the web with programming communities since like 2003-ish (holy shit, a decade?!), and this is the first time I've ever really felt any sense of belonging. So, thanks. That helps a lot.

Love y'all. Really.

Sunday
Feb032013

this is just on my blog so people can reply

1. How do you go about getting decent work? If you don’t think this is an active process, what do you think is bringing you good work? I think this might partially be the wrong question, because it seems from reading ‘Design is a Job’ that at least part of the responsibility is on the consultant to educate the client on how the process works best.

2. There’s an implied bootstrapping problem in the previous statement: if you’re not an experienced consultant, how do you know how to help the client be better? If the client is significantly better than you, it seems unlikely you’ll be able to get that work.

3. Rates are problematic for me for a few reasons. First, the typical problem I think most everyone goes through at first: you’ve got no context, so you don’t know where to start. I’m a little past that, as I’m starting to get a little bit of context from the discussions I’ve had with my initial clients. More importantly, though, and what’s got me stressed the most right now: it seems that if you take work at a low rate, you can’t afford the time investments/mental space to do the self improvement and self care to be worth the higher rates. This leads smoothly into another point…

4. I’m trying to get my start in an especially problematic set of circumstances:
A. I have no savings (the explanation is out of scope, but the fact is important information), so I can’t easily turn down work.
B. I don’t have any significant amount of writing or open source I’ve done (though I’m trying to remedy that.
C. I’m starting out basically on my own, in a new city (on the flip side, that city *is* San Francisco). The circumstances aren’t a question by themselves, and I realize that, but they lead to one. It’s becoming very clear to me the importance of being able to turn down work, and maintaining enough spare time/the mental space to give back in terms of OSS/writing/etc. I can’t manage that very well right now, and while I think I might be able to bootstrap, just barely, it seems like it might be more wise to change my circumstances. Of course, I can go get a short term contract, etc., and build some savings. I could also, theoretically, find someone else to work with who’s a bit more experienced, and hence has better work coming in already, and can mentor me some. What’s your opinion? Is it foolish to keep going without savings, or someone to mentor me, or something of that sort?

Thursday
Jan312013

Great developers design.

I’ve been thinking about how great developers do design. Not necessarily all aspects of it, but at the very least the meta-process that is design. Mike Monteiro, in his book Design is a Job, says that “a designer solves problems within a set of constraints.” From what I’ve figured out from talking to various designers recently, this seems to be a good definition of design to me. I think it’s necessary to take the same approach to write the best code you can to solve a certian problem. Or, even better, to figure out that you shouldn’t even write any code to solve it.

First, some definitions are in order. We’ll call design solving an ambiguous problem given a set of constraints. Programming, just for the scope of this writing, will be limited to solely the act of implementing an algorithm. I know that’s much more restrictive than what programmers actually do (which, I think, is to my point), but having a clear distinction will be useful for communicating about this. Also, one other caveat: I’m going to speak in terms of my impressions of programming culture sometimes. I know that’s not very objective, but I think in this case it’s useful, so I’m going to do it anyway.

I deeply believe the idea of programmer as implementer is bad for the world.

Most programmers have stories about bosses or clients (they’re effectively the same thing, really) who asked for implementations that seemed, to the programmer, stupid, if not utterly absurd. I don’t want to dwell on that, but rather use it as a point of departure. Let’s consider why we find ourselves in this situation. Why are clients (dropping distinction between bosses and clients for now) asking for things we consider stupid?

There are at least two potential causes for this. First, the clients might actually be asking for something stupid. This isn’t a very useful assumption to make, and it’s way too self serving. At the very least, it’s unprofessional to jump to that conclusion without significant consideration of alternatives first. It seems more likely to me is that there is a difference between the client and the programmer’s understanding of the goals and constraints of the project.

Some programmers, I know, are balking at this. I don’t know of anything polite to say to this, so I’m just going to say it rudely, because I think it deserves saying. Here goes:

You suck at empathy, and it makes you act like a bit of an asshole.

Kind of ironic to say something like that in a dickish way, isn’t it? I think (for some of us) it’s long overdue. The rest of you, I’m sure, will forgive (or at least indulge) me. See, there’s the bootstrapping problem with lacking empathy: if you’re far enough in the hole, then you won’t care enough about the impact on others to question your behavior when it’s mentioned in more nuanced ways. Hence calling (some of) you assholes.

Phew. That was an undesirable detour… Back to miscommunication about goals and constraints! Programmers are in a bit of an awkward situation here, because we are by far most intimately familiar with the constraints. So much that we become a bit myopic, I think. We (I do mean myself, too) develop a sort of tunnel vision that, when we’re not careful, makes us act like assholes (again, me too). The client says “The quux needs to gaarple like this.”, and we respond (or think) “That’s {impossible,stupid,crazy}.”[1] Remember that empathy thing? Yeah.

Instead, that conversation should go something like

Client: “The quux needs to gaarple like this.”

Programmer: “I don’t see why. Could you explain the need for that?”

Client: “Well, it has to gaarple just like that so that the user knows what just happened.”[2]

Programmer: “Oh, so we need to make sure the user has visibility into this aspect of the system!”

Client: “Yeah, that’s absolutely critical.”

Programmer: “Okay, well what about…” (here you describe an alternative that doesn’t have the downsides you perceive, and explain why they are downsides.)

Of course, most of us aren’t quite naive enough to not have some inkling of this already. Which is a really, really good thing. On the other hand, I think the value of this process increases non-linearly with respect to how many times you ask why, which is why I’m calling attention to this. Without deeply understanding the goals of the project you’re working on, you can’t come up with an ideal solution.

There’s one final step to this ethical argument. It’s a bit of a logical leap, but I get a pass on that because I’m calling it out, right? Right.[3] Here goes: you are responsible for the results of your work. Put more explicitly: every single bit of suck you put out into the world is on your hands. You remember those awful BSODs, and countless other awful experiences you had at the hands of other people’s negligence? Yeah. Don’t propagate that.

Be the change you want to see in the world. I know it’s cliché, but do it. Seriously, do it. Every broken window you put into the world tells everyone else it’s okay to produce shit. And it’s not okay to produce shit[4]. It’s all of our responsibility to tell everyone that it’s not okay to produce suck.

So, can you be a good programmer (by the absurdly restrictive definition I proposed) without doing design? Yes. Of course you can. On the other hand, most of us don’t want to constrain ourselves to that definition. I think that obliges us to reach outside your comfort zone, and deeply understand the goals and constraints of the problem we’re working on, and work for ideal solutions to them. I think this is our responsibility as humans contributing to the way the world will work in the future, not just as programmers.

Maybe that makes me a bit crazy. If so, I don’t care. It’s my central to my morality, and I’m going to live by it.


  1. I suspect we’re more likely to say, rather than think this, or have a more extreme opinion, whether it is expressed rather than just thought, as employees, or novices. With experience and freedom a bit more understanding of nuance seems to develop.  ↩

  2. The reason doesn’t matter much for this explanation (and often enough, even for your work).  ↩

  3. LOL.  ↩

  4. Except in certain well defined contexts, many of which involve porcelain.  ↩

Wednesday
Sep122012

Infrastructure is for People

Pre-ramble

‘Infrastructure is for people’ is the premise that I work from, and this post is my attempt to explain why. By continuing to read, you are participating in the process of my figuring out how to communicate this. Continue at your own peril.

I think this is one of those ideas we so much don’t believe in that it’s difficult to talk about. We don’t have language for it. That’s partially why it’s so important to talk about.

An Example (Sorta)

I’ve continually had trouble keeping track of what the balance in my bank account is. I’ve tried all sorts of approaches, and I’m still searching for a great solution[1]. It’s been years of trying, now, and still I’m regularly at a loss as to how I overspent this time.

That’s because humans are only good at certain things. We lose sight of this because the myth of our time is that we’re rational beings. Mentally keeping track of the state of transactions, past a certain number[2], is not the sort of thing humans are good at.

The Point


  1. Infrastructure can make it hard to live well.

  2. We can rebuild infrastructure.

  3. If we can improve the world, we ought to.

There appears to be a dearth of deeply socially conscious, technically minded people (I suspect I might be wrong on this point, and hope I am). The people who are most socially conscious seem to be less technically minded, and vice versa. Perhaps this is just a result of the way some predisposing traits tend to be distributed. In any case, it leads to some nasty outcomes.

The Impact

It’s a bit like something Einstein said, that’s unfortunately a bit of a cliché:


“Science without religion is lame, religion without science is blind.”[3][4]

Without the socially conscious element, we all end up leading miserable lives because we’re not caring for each other. On the other hand, without the technical approach, we often can’t actually find the underlying problem, much less fix it.

This is why I care about infrastructure. Not because solving technical problems is fun (though it is), but because I feel a duty to contribute to the betterment of the world I’m part of. This is why I think you should care about infrastructure, whether you are of a more technical or socially minded persuasion to start with.





  1. Simple is the best thing I’ve found yet. Check them out if you need a good bank.  ↩

  2. That’s a pretty small number, by the way. Check out the wikipedia article.  ↩

  3. Here’s a free version of the essay this apparently originates from.  ↩

  4. While I’m at it, here’s another, longer quote in the same vein, from Zen and the Art of Motorcycle Maintenance:


    “We have artists with no scientific knowledge and scientists with no artistic knowledge and both with no spiritual sense of gravity at all, and the result is not just bad, it is ghastly.”  ↩


Monday
Aug202012

studying and opportunity cost

I hadn't realized it, but I've been doing a stupid thing for years now. You see, I consume a lot of information. Between the various sources, it's probably dominated a goodly chunk of my life.

So, I was emptying out my inbox in OmniFocus (my GTD app), because it had gotten so full it was unusable. After I'd moved the actionable, important things back into my newly clean inbox, I looked over the previous inbox quickly to check for obvious patterns. I found it was almost entirely books to read and talks to watch, mostly tech related. At a certain point of my development as a programmer, that was arguably a useful thing. It's helped me develop a breadth of knowledge many of my peers don't have.

Opportunity cost (Please, stop and go read the wiki article if you don't know about it. This post will still be waiting.) is a bitch, though. You know what I wasn't doing, towards the end of this, so that I could keep taking things off of this list? At least two things:

  1. I wasn't coding.
  2. I wasn't having fun.

That's stupid. I can't explain enough how stupid that is. Still, it's understandable how I got there. In fact, I would still not discourage beginners from taking an approach somewhat similar to the one I took when beginning. The approach just needed more refinement.

Go for breadth, sure. Eventually, you find some areas you really care about, and you'll start to dig in. Cool. You're not generalizing quite as much. That's good for you. Once you're generally competent and relatively aware of what you're interested in, you should focus. Firstly your consumption, since that's what you've started with so far. More important, however, is to do something much harder.

Create. If you code, then code. If you write, then write. If you care about the state of the world, fine, go learn about it! Then, share your ideas. Organize. Take action.

Be careful not to act on old, congealed values, at the expense of the things you presently value. That's what I was doing when I kept filling up these queues of content, and slaving away at consuming from them. It didn't help me, and it won't help you.

When your priorities get out of line with your values (and they will, however briefly), you'll end up working yourself to death, dissatisfied all the while.