The Schizophrenic Programmer


Hi, my name is Justin and I have a problem. I’m insane!1

Being insane really sucks. But I’ve got a plan to get back on track. First, I’ll dole out some blame. Then, I’ll give a little background. Next, I’ll really dig into my current insanity. And finally, I’ll layout my plan for the future.

The Blame

I like to curse. And when I’m mad, I find it definitely helps to calm the rage. So to begin, I’d like to give a big fuck you to Andy Hunt and Dave Thomas, the pragmatic programmers. I love you guys but you get at least some of the blame for making me insane. Next, I’d like to give some blame to my wonderful employer, Gorilla Logic, and their penchant for landing such a diverse set of inspiring projects. You suck for building a candy store and filling it with the sweetest treats.

Unfortunately for me, the lion’s share of the blame is mine and mine alone. I’m insane today because of my lust for the new coupled with my desire to be great. I want to be a great dad, a great husband, and a great employee. Who wants to be average?

It’s just not possible that I’m alone. Who doesn’t like cool new stuff? Who doesn’t want to be great? There must be thousands, if not tens of thousands, of fellow developers suffering from insanity that goes undiagnosed. So this tale goes out to you, my functionally insane brethren. Together we can heal ourselves.

Who Am I?

I’d like to give a little background before I get in too deep with my current insanity. I’m a developer. I get paid to write code (woo hoo!) to solve problems. Blah, blah, blah, if you just fill in the rest with a bunch of geek stereotypes you won’t be far off. Yes, I like to IM my coworkers instead of just walking over and talking with them. Yes, I read slashdot. Yes, I read sci-fi. Yes, I played lots of Dungeons & Dragons.2 Et cetera…

I consider myself a smart guy, just like every single developer I’ve ever met. I stay hungry and motivated to learn something new every day, every week, every year. Thanks to Andy and Dave, I learn one new language every year. And most importantly, I try very hard to listen or at least listen more than I argue. Sometimes it doesn’t work out so well, but that’s another tale…

How I Became Insane

I’m a big fan of “right tool for the job” in both life and development. In the realm of development, the concept of right tool for the job has metamorphosized into right language for the job, aka polyglot programming. On the face of it, polyglot programming has a lot of advantages (here’s a good talk by Dean Wampler), but it is one of the root causes of my insanity.

At Gorilla Logic, we are regular practitioners of polyglot programming. Our typical enterprise RIA project uses Java on the backend and Flex on the frontend. Of course, the mix of languages doesn’t stop there. I develop for the web, so when you talk about websites, WordPress and Drupal are immediately in the conversation, and thus PHP. And since a rich client-side experience is critically important, HTML, CSS, and Javascript are drawn into the mix. In the mobile world, Blackberry and Android are thankfully mostly Java, but anything Apple takes me into the non-GC’d world of Objective-C.

I’ve also been diligently learning my one language a year for a while now. And when you combine that with work, it has simply become too much. I’ve become scattered, my mind has become messy. Looking at the syntax level, the symptoms are acute. I can’t write a loop. I can’t match a pattern. I can’t build array operations. My context switching pain is severe, it can literally take hours before I get back up to speed with the language at hand.

But it’s not just the low-level stuff anymore. I’m finding that even at the highest levels of architecture, clean thought is hard to achieve. Different languages tend to espouse different patterns and paradigms that directly impact architecture level decisions. For example, if I wanted to write a server in PHP I might consider using OS support like fork and cron. In Java, I’m off in thread land. Erlang it’s processing and messaging. Scala is all about actors.

I find myself mixing paradigms and doing stupid stuff, like trying to fake Erlang’s message passing in PHP by multiple scripts communicating by repeatedly touching rows in a database. Dumb, but becoming harder to avoid as everything slowly bleeds together in my mind. I’m in the mud and I desperately what to be clean again.

My Current Insanity

Here’s a broad sample of what I’ve done lately (as in the last month or so) for work and personal projects:

Erlang – Work
Freshened my Erlang, wrote a sample custom module for ejabberd, played with Nitrogen.
Flex/AS3 – Work
I helped out a little bit with FlexMonkey 1.0, including the fuzzy pixel bitmap comparison support.
Flex/AS3 – Work
ScrumMonkey is another Gorilla Logic open-source project. I upgraded everything to work with Flex 4 and LCDS 3.0.
Java – Work
Fun with Spring, Hibernate, and Spring Actionscript. Can’t say any more about the project.
Javascript – Work
I helped develop FlexMonkium, a Selenium-to-FlexMonkey testing tool that enabled automated functional testing of hybrid web apps. I used Javascript and XUL.
Objective-C – Justin
Wrote and published a US states and capitals memorization helper app. Read more or get it from the app store.
Objective-C – Work
iPhone and iPad. Cool stuff. Can’t talk about it yet.
PHP – Justin
Released Viceroy, a one-column WordPress theme with a dash of pink.
PHP – Work
We needed to get our community feedback out of Google Groups and into our FlexMonkey Forum. I wrote a simple scrapper in PHP and blogged about it.
PHP – Justin
Various WordPress and Drupal side projects just for fun.
Ant, Maven, Bash, Rake – Work & Justin
Scripted a bunch of stuff…

And that’s just my current insanity: the languages that I’ve touched lately. But I’m not special! At least, not in this case. The list is similar for many co-workers, and many of my friends that are web developers.

The Sensible Plan

If I’m to blame, then I’ve got to be the one to fix it. So here’s my plan:

  • Forget one language every year – Forget the syntax, forget the weirdness, and forget the whole ecosystem (frameworks, tools, community). Say goodbye and don’t look back. But before you leave a language behind, pick one core concept, one of the things the language does right, and take that with you. For example, when I forget Erlang, I’ll take the concept of concurrent programming with me. So I’ll remember stuff like immutability, message passing, and processes. When I forget Ruby, I’ll take DSLs with me. Ruby does lots of stuff well, like blocks, mixins, terse syntax, and meta-programming, but I always enjoyed using all the great DSLs the best, so that’s what I’ll remember.
  • Don’t learn one programming language every year – Yep, I’m going against Andy & Dave. So no Haskel, Clojure, Duby, Go, or Reia for me this year. I’m obviously feeling a little full on languages right now, so I’ll take a break for a few years.
  • Learn one or more APIs every year – Since Web 3.0 is all about APIs, I might as well spend some time learning more of them. The big boys are obvious: Twitter, Facebook, Flickr, Google Maps, but there are plenty more that are really interesting. From the practical side, every single web project either integrates with other APIs, wants their own API, or has some set of requirements that force a good SOA architecture (aka some internal set of APIs).
  • Upgrade my soft skills – Slinging code is fun, but it can’t be the only thing I do if I want to be a great employee. So instead of picking up all these little bits of shiny tech, I’m going to going to focus my lust for the new on upgrading my soft skills. I write this blog to improve my writing, but I haven’t spoken at a big conference since CLEO/QELS in 1999 and I was really bad. So I hope to do some public speaking in 2010.

Basically, I’m hoping to elevate my kung-fu by going for more depth of knowledge. Then, I’ll do my best to control the relentless expansion of breadth. New and shiny is no longer sufficient. Talking things through with co-workers and writing this post is a great first step into the future. I’m already feeling optimistic about my path.

  1. I’m not really insane, at least I don’t think so. I’m just functionally insane. For a glimpse into the mind of a real schizophrenic, I highly recommend Is There No Place On Earth For Me? by Susan Sheehan. It won the non-fiction pulitzer prize in 1983, so it’s a little bit dated now, but an unimaginable story.
  2. Actually, my friends and I played a lot of Rolemaster (wikipedia) and Champions (wikipedia) which are superior role playing games. If you are a true fan, you’ll understand. If not, the image of boys with dice conjured by Dungeons & Dragons is a good takeaway.

UPDATE: I wrote a follow-up post to address all the great feedback: Schizophrenic Following





Glad to know it’s not just me. I like your plan going forward. it’s inspiring me to do something similar. :-)



Man I’m there with you. I really like your ideas, In fact you should publish a book and call it Realistic Programmers: For people who have jobs, families AND like to code.

PS: how the fuck did you manage to play Rolemaster and can’t even learn one PL per year? That system is so complex that it takes minutes and 3 dice throws so you know if you managed to _breath_ correctly or if you caught pneumonia trying.




Unfortunately, the end result of the path you’ve laid out here is Tunnelvision. I know because I’ve known people who’ve laid out almost exactly the same argument before. Why is this unfortunate? Because not one of them has ever become “great” at what they do. Perdictable, and very good at that one thing they’re known to do all the time, yes. But never Great.

Yes, there is a lot to be said for depth of knowledge and specialization. The problem is that such specialization tends to fray around the edges. This isn’t a problem if you never find the edges (maybe you write CRUD-based business apps all day every day and therefore never need to reach for new tools), but greatness tends to be found in those fuzzy edge spaces.

It’s for this reason I say “embrace the insanity”! When you take the tool you’ve specialized in to that place where it begins to unravel, you’ll be glad you did – for you’ll have more weapons in your arsenal than if you’d gone through your career pretending every problem is the proverbial nail and your tool is, well, you know…




I have this same problem and i am glad i am not alone. Last year i’ve worked with java,python,scala, groovy, objective c,bash,javascript and php.

And thats just counting the languages. At some point it becomes too much to manage and you end up being jack of all trades master of none



What? No Python?! :)




“…anything Apple takes me into the non-GC’d world of Objective-C”, except that objective c 2.0 has opt-in garbage collection. Just not for the iPhone. Just being a pedant.
I agree with what you’re saying, the shotgun blast of technologies, languages and methodologies can be pretty overwhelming.



Inspired read.

I haven’t quite reached the level of insanity you speak of, but I’ve definitely felt the effect, even working in just a few different languages on a regular basis.

I’m completely with you about depth versus breadth, but.. the flaw in your plan is obvious. New toys will always be more fun to play with than the old.

At least that’s why I often like to learn a new language or read up on a new framework. It’s just fun and satisfying learning something new.




it’s Android ! … Keep up the good work ,man




When I first started reading this blog entry, linked from reddit, I was not going to read it all because I had no idea why I was reading it to begin with. If I may be so bold to suggest, you could make it a little more interesting so you don’t lose the reader’s interest – because as it is it is also boring.




Really, you are dealing with the limitations of your body and brain. The brain and it’s function of thinking are analogous to muscles and exertion. So, just like when you don’t give your muscles enough recovery between workouts, over filling your schedule with thinking intensive tasks overall makes your brain power weaker. I think in terms of letting ideas and knowledge “percolate”. Also, things like “learn 1 x per year” just create another commitment that further tax your consciousness. Best to eat when your brain is hungry I think.

And check out Python and Zope. You’ll never be hungry again!



The only language you need is BASIC. VbScript for scripting, VB.NET for Windows applications and web development with ASP.NET, and VbScript for Office macros.



Very interesting post – I have to agree with a lot of the points. One of the things that helps me on my journey to stay up to date on technology is to be active in local tech groups. This means my local Java User’s Group, my local Open Web Application Security Group, my local Refresh (RefreshDC) group, and many others. And then to blog and share what I’ve learned and get feedback. Translucent Development is my attempt at sharing that with everyone and will hopefully evolve into a site where I put my collection of pointers to helpful things on various technologies, as well as maintain my own technology Wiki.

Ahmad Y. daoudi



this is one of the best articles i visited this week, programmers should get rid of scientific progress, and think of profit and business and time management.

at the end it’s money what you get for your programming (pain)



I say Shaun is correct. Embrace the insanity, feel it, enjoy it, learn to love it. While your conscious mind is floundering in the mud your unconscious mind is steadily filtering it. It will lead to an epiphany or two when you need it and perhaps enlightenment (or maybe true insanity – but it’s worth the risk i think).

Enjoy. :)



@Everyone: I guess it really struck a chord. Thanks for reading and all the great comments.

My poor slice was taking a beating, but I can confirm the Hyper Cache plugin really works…went from load of 0.2 to 0.02 instantly.




Doing any one thing well, to the depth that you know you ought to be doing it to, requires sacrifice of something else. I learned this from being a parent, and that’s the easiest way to understand it: it’s not enough to simply pay for their food and shelter, put them in a good school system and not hit them – to do it right, you have to give them your time, which means taking time away from something else that you value. All parents intuitively know this to be true (even though we may try to convince ourselves otherwise with rationalizations).

The same principle applies to my life as coder: I can endlessly learn new technologies, or refactor my design, or broaden my perspective to gain a better viewpoint on the problem at hand: but at the end of the day, if I don’t come back down to Earth and put all these lofty realizations into practice (in time, and with a clear head), it works against my primary goal, which is to continually create effective software.

And the way to achieve this expand/apply balance is simple: if you observe at the end of each project that you’re less effective than the previous one, you’re doing too much expansion; so cut back. If you’re restless and feeling boxed-in by your current paradigm, you’re not doing enough: so ramp it up. In the end, it’s confidently adhering to your own self-evaluation (and not a blind faith in any what-have-you programming method) that will navigate you smoothly through the waters: you are your own gyroscope, embrace your own evolution.

© 2021