Whilst I haven’t had a real programming job in the better part of a decade I have continued coding in my spare time for various reasons. Initially it was just a means to an end, making my life as an IT admin easier, however it quickly grew past that as I aspired to be one of those startup founders Techcrunch idolizes. Once I got over that my programming exploits took on a more personal approach, the programs I built mostly for my own interest or fixing a problem. I recently dove back into one of my code bases (after having a brainwave of how it could have been done better) and, seeing nothing salvageable, decided to have a crack at it again. This time around however, with far less time on my hands to dedicate to it, I started looking for quicker ways of doing things. It was then I realised that for all the years I’ve been coding I had been suffering from Not Invented Here syndrome and that was likely why I found making progress so hard.
The notion behind Not Invented Here is that using external solutions, like in the case of programming things like frameworks or libraries, to solve your problems isn’t ideal. The reasoning that drives this is wide and varied but it often comes down to trust, not wanting to depend on others or the idea that solutions you create yourself are better. For the most part it’s a total fallacy as any one programmer cannot claim to the be the expert in all fields and using third party solutions is common practice worldwide. However, like I found, it can manifest itself in all sorts of subtle ways and it’s only after taking a step back that you can see its effects.
I have often steered clear of many frameworks and libraries mostly because I felt the learning curve for them would be far too steep. Indeed when I’ve looked at other people’s code that makes use of them I often couldn’t make sense of them due to the additional code libraries they had made use of and resided myself to recoding them from scratch. Sometimes I’d do a rudimentary search for something to see if there was an easy answer to my problem but often I’d just wrangle the native libraries into doing what I wanted. The end result of this was code that, whilst functional, was far more verbose than it needed to be. Then when I went back to look at it I found myself wondering why I did things in this way, and decided there had to be a better way.
Fast forward to today and the new version of the application I’ve been working on makes use of numerous frameworks that have made my progress so much faster. Whilst there’s a little bloat from some frameworks, I’m looking at you Google APIs, it’s in the form of dlls and not code I have to maintain. Indeed much of the code that I had to create for handling edge cases and other grubby tasks is now handled much better by code written by people far more experienced with the problem space than I will ever be. Thus I’ve spent far less time troubleshooting my own work and a lot more time making progress.
I have to attribute part of this to the NuGet package management system in Visual Studio which downloads, installs and resolves all dependencies for any framework you want to install. In the past such tasks would fall to the developer and would often mean chasing down various binaries, making sure you had the right versions and repeating the whole process when a new version was released. NuGet broke down that barrier, enabling me to experiment with various frameworks to meet my end goals. I know similar things to this have existed in the past however I really only begun to appreciate them recently.
There’s still a learning curve when adopting a framework, and indeed your choice of framework will mean some design decisions are made for you. However in the short time I’ve been working with things like HtmlAgilityPack and Json.NET have shown me that the time invested in learning them is far smaller than trying to do what they do myself. I’m sure this seems obvious to seasoned programmers out there but for me, who was working with the mentality that I just needed to get things done, it never occurred to me that my approach was completely wrong.
I guess where I’m going with all this is that should you find yourself attempting to solve a problem the first thing you need to do is see if its been solved by someone else first. Chances are they’ve gone through the pain you’re about to put yourself through and can save you from it. Sure you might not understand fully how they did it and they might not do it the way you wanted to but those things mean little if they save you time and emotional capital. I know for myself if I had to redo everything I did previously I would be no where near where I am today and likely would get no further.
I often find myself trusted with doing things I’ve never done before thanks to my history of delivering on these things but I always make people well aware of my inexperience in such areas before I pursue such things. I do this because I know I’m not the greatest engineer/system administrator/coder around but I do know that, given enough time, I can deliver something that’s exactly what they required. It’s actually an unfortunate manifestation of the imposter syndrome whereby I’m constantly self assessing my own skills, wondering if anything I’ve done was really that good or simply the product of all the people I worked with. Of course I’ve worked with people who know they are the best at what they do, even if the reality doesn’t quite match up to their own self-image.
Typically these kinds of people take one of 2 forms, the first one of which I’ll call The Guns. Guns are awesome people, they know everything there is to know about their job and they’re incredibly helpful, a real treasure for the organisation. I’m happy to say that I’ve encountered more of these than the second type and they’re in no small part responsible for a lot of the things that I know today. They are usually vastly under-appreciated for their talents however as since they usually enjoy what they do to such a great extent they don’t attempt to upset the status quo and toil away in relative obscurity. These are the kinds of people I have infinite amounts of time for and are usually the ones I look to when I’m looking for help.
Then there’s the flip side: the Alpha Nerds.
These guys are typically responsible for some part of a larger system and to their credit they know it inside and out. I’d say on average about half of them got to that level of knowledge by simply being there for an inordinate amount of time and through that end up being highly valuable because of their vast amount of corporate knowledge. However the problem with these guys, as opposed to The Guns, is that they know this and use it to their advantage in almost every opportunity they get. Simple change to their system? Be prepared to do a whole bunch of additional work for them before it’ll happen. A problem that you’re responsible for but is out of your control due to other arrangements? They’ll drill you on it in order to reinforce their status with everyone else. I can’t tell you how detrimental these people are to the organisation even if their system knowledge and expertise appears invaluable.
Of course this delineation of Guns and Alpha Nerds isn’t a hard and fast line, there’s a wide spectrum between the two extremes, but there is an inflexion point where a Gun starts to turn Alpha and the benefits to the organisation start to tank. Indeed I had such a thing happen to me during my failed university project where I failed to notice that a Gun was turning Alpha on me, burning them out and leaving the project in a state where no one else could work on it even if they wanted to. Whilst the blame still rests solely on my shoulders for failing to recognise that it still highlights how detrimental such behaviour can be when technical expertise isn’t coupled with a little bit of humility.
Indeed if your business is building products that are based on the talents of said people then it’s usually to your benefit to remove Alpha Nerds from your team, even if they are among the most talented people in your team. This is especially true if you’re trying to invest in developing people professionally as typically Alphas will end up being the de-facto contacts for the biggest challenges, stifling the skill growth of members of the team. Whilst they might be worth 2.5 times of your average performers you’re likely limiting the chances of the team being more productive than they currently are, quite possibly to the tune of much more than what the Alpha is capable of delivering.
Like I said before though I’m glad these kinds of people tend towards being less common than their Gun counterparts. I believe this is because during the nascent stages of someone’s career you’re likely to run up against an Alpha and see the detrimental impacts they have. Knowing that you’re then much more likely to work against becoming like them and should you become an expert in your chosen area you’ll make a point of being approachable. Some people fail to do that however and proceed to make our lives a lot more difficult than they should be but I’m sure this isn’t unique to IT and is innate to organisations both big and small.
My last two years have seen me dabble in a whole swath of things I never thought I’d dip my toes into. The first was web development, arguably inspired by this blog and the trials and tribulations that went into making it what it is today. Having been out of the development game for quite a long time before that (3 years or so) I had forgotten the thrill of solving some complex problem or finding an elegant solution to replace my overly complicated one. This then led me to try a cascade of different technologies, platforms and frameworks as ideas started to percolate through my head and success stories of overseas start ups left me lusting for a better life that I could create for myself.
For each of these new technologies I pursued I always had, at least in my mind, a good reason for doing so. Web development was the first step in the door and a step towards modernizing the skills I had let decay for too long. Even though my first foray into this was with ASP.NET, widely regarded as the stepping stone to the web for Windows desktop devs like myself, I still struggled with many of the web concepts. Enter then Silverlight, a framework which is arguably more capable than but has the horrible dependency of relying on an external framework. Still it was enough to get me past the hurdle of giving up before I had started and I spent much of the next year getting very familiar with it.
Of course the time then came when I believed that I needed to take a stab at the mobile world and promptly got myself involved in all things Apple and iOS. For someone who’d never really dared venture outside the comfortable Microsoft world it was a daunting experience, especially when my usual approach of “Attempt to do X, if can’t Google until you can” had me hitting multiple brick walls daily. Eventually however I broke through to the other side and I feel it taught me as much as my transition from desktop to web did. Not long after hitting my stride however did I find myself deep in yet another challenge.
Maybe it was the year+ I had spent on Lobaco without launching anything or maybe it was the (should have been highly expected) Y-Combinator rejection but I had found myself looking for ideas for another project that could free me from the shackles of my day job. Part me also blamed the frameworks I had been using up until that point, cursing them for making it so hard to make a well rounded product (neglecting the fact that I only worked on weekends). So of course I tried all sorts of other things like Ruby on Rails, PHP and even flirted with the idea of trying some of those new fangled esoteric frameworks like Node.js. In the end I opted for ASP.NET MVC which was familiar enough for me to be able to understand it clearly without too much effort and modern enough that it didn’t feel like I’d need to require IE6 as the browser.
You’re probably starting to notice a pattern here. I have a lot of ideas, many of which I’ve actually put some serious effort into, but there always comes a point when I dump both the idea and the technology it rests on for something newer and sexier. It dawned on me recently that the ideas and technology are just mediums for me to pursue a challenge and once I’ve conquered them (to a certain point) they’re no longer challenge I idolized, sending me off to newer pastures. You could write off much of this off to coincidence (or other external factors) except that I’ve done it yet again with the last project I mentioned I’m working on. I’m still dedicated to it (since I’m not the only one working on it) but I’ve had yet another sexy idea that’s already taken me down the fresh challenge path, and it’s oh so tempting to drop everything for it.
I managed to keep my inner junkie at bay for a good year while working on Lobaco so it might just be a phase I’m going through, but the trend is definitely a worrying one. I’d hate to think that my interest only lasts as long as it takes to master (well, get competent with) and it would be a killer for any potential project. I don’t think I’m alone in this boat either, us geeks tend to get caught up in the latest technology and want to apply it where ever we can. I guess I’ll just have to keep my blinkers on and keep at my current ideas for a while before I let myself get distracted by new and shiny things again. Hopefully that will give me enough momentum to overcome my inner challenge junkie.
While I’ve been a user of Twitter for well over a year I didn’t really get ituntil about 6 months ago. Initially I found it just to be a curiosity as its open API provided integration opportunities between applications that would otherwise not talk to each other (namely this blog and Facebook). Lately however I’ve actually been using it for what it was originally intended, I.E. blasting seemingly inane crap onto the Internet in close to real time. That hasn’t detracted from its real value as a communication platform however and I now find it invaluable for keeping up to date on people and things that I find interesting. I guess you could say that I use it mostly as a discovery tool.
Still this hasn’t stopped people from telling me that I’m still doing it wrong. You see, whilst I understand what I’m about to say is rather cliche, I’m actually quite a busy man. Usually the only times I have free to check up on my Twitter feed are on the trip into work and the time I spend waiting around to pick up my beautiful wife after work. Whilst I feel its ok to reply or retweet something many hours after its original posting time it seems my more active Twitter buddies are rather perturbed by my actions. I’ve also missed quite a few tweets from people who were looking to catch up with me because of this, but I’ve found the alternative to be rather…destructive.
Last weekend was one of the first in a while where I made some solid progress on Geon (which is now a codename thanks to every reasonable domain being taken). The topic of my flaunting of the accepted Twitter etiquette came up at a dinner I had had with some of my fellow twitterers the night before, so I decided to try their way of doing things for a day. In the morning I turned on my pc, loaded up Visual Studio and Firefox and kept the Twitter homepage open on one monitor whilst I bashed away at my code on the other. Whilst things were off to a great start a worrying trend started to appear.
That “X new tweets” button was the worst thing for my productivity since YouTube.
You see whenever something requires my attention, like say a new email or something like that, I always feel compelled to action it as soon as I can. If I’m doing some long task and another quick task comes my way I’ll usually put the larger task on hold to knock the smaller one out of the way so I don’t have to remember to do it later. It appears that this same behaviour is triggered by the new tweets alert popping up on the Twitter homepage as I usually only have maybe a dozen or so tweets appear every 5 minutes or so. Still because of this almost obsessive compulsive habit I have I was compelled to look them over to ensure that there was nothing in there that I might want to check out or might aid my current endeavours.
Any programmer will tell you that an interruption whilst you’re coding is a sure fire way to delay any useful work for at least 15 minutes. It’s not so much that we can’t work without distraction more that when you’re right in the middle of a problem or implementing an algorithm an interruption breaks your immersion. It’s akin to trying to find the page you were on in a book that the bookmark fell out of, you know where you were up to but you’re not going to land on that page instantly. Using Twitter in real time is devastating to this kind of work and soon after I begun the experiment it ended so that I could continue making progress.
The argument can be made that there’s a happy middle ground between the two ways I used Twitter and I’ll agree with that. The realtime option is devastating to real work and long times between uses renders the core ideal of Twitter meaningless. Still there are times when being on it constantly are worth it like my real time stream of Eurovision commentary and events that I’m interested in yet can not attend. In the end however whenever I’m trying to get something done Twitter will have to take the back seat, at least until I need to add value to what I’m doing.