Not so remote

Fostering a team feeling when everyone is remote can be extremely difficult. It’s easy to feel like you are working in a total silo, and can be made worse if everyone is spread across distant timezones. Being able to function as a team is a key component to project success. Feeling isolated and alone when problems come up can make work frustrating and stressful at times. Here are a few ways to try and overcome that:

  • Try and arrange core hours where the whole team is available and together on Skype/HipChat/Slack.
  • A weekly call with everyone to update on work, issues and client feedback.
  • A daily call between project managers and members of the team to chat about current progress and the project as a whole.
  • Code sharing sessions. Show code to other members on the team and explain what features are and how you’ve gone about implementing them.

Battling Procrastination

It makes no sense to leave the Dark Woods in favor of the Dark Playground—they’re both dark. They both suck to be in, but the big difference is the Dark Woods leads to happiness and the Dark Playground leads only to more misery. But the Instant Gratification Monkey isn’t logical and to him, the Dark Playground seems like much more fun.

An absolutely brilliant two part series on procrastination. My most hated enemy.

Part 1: Why Procrastinators Procrastinate
Part 2: How to Beat Procrastination

Small teams and interruptions

It’s hard for non-programmers to understand just how bad interruptions are when it comes to being a productive coder. While most jobs suffer from the same problems of “getting back into the flow” after being interrupted, programming is especially difficult as normally programmers are trying to hold a number of structures in their head at any one time so as to solve whatever problem it is that they are working on.

In most small companies, the development team is might only consist of three or four people and in such a small team with a large backlog to deliver, it’s not normally the teams size that is the main factor in being able to deliver large amounts of work, but all the small interruptions that happen during daily business. Asking a developer that is sitting close by about when a feature will be ready or whether something can be fixed/changed is all too tempting and easy to do. Why IM or email when you can just shout across the room. It only takes a few 10-20 second interruptions to change a productive three to fours hours into just maybe one or two.

Once a company grows these sorts of problems can be smoothed out by having someone act as a barrier to the developers, shielding them from minor questions/requests and letting them continue with their work until free to discuss them. Small companies don’t have the luxury of assigning someone that role so need to find other means to minimising that contact. It’s important that someone sets some ground rules. It could be as simple as there is a set period of time every day that programmers should not be disturbed or communication should be limited to IM and email if possible. Just removing the constant stream of “Is X ready yet?”, “Did you get a chance to look at Y?” or “Would it be possible to do Z?” would mean a huge productivity boost for your programmers and overall deliverables for your company.

Stupid and gets stuff done

Getting stuff done isn’t all about writing code or producing. It’s about delivering value and something worthwhile. I could write code all day, but if it’s of no use to anyone, then my code has been for nothing. The famous Patton quote says “A good plan violently executed now is better than a perfect plan executed next week” and I believe something along the same lines holds true for programming: “Good code deployed today, is better than perfect code deployed next week”.

So you want to be a developer?

I’m so glad that I’m not just getting started as a web developer these days. Facebook is the main example I give to people when talking to about this. It has set the standard for what and how people think a web app should behave. Move forward or backwards through photos and they are dynamically loaded without refreshing the page. Send someone a message and a modal box appears with autocomplete on the textboxes. You can browse the site, chat to friends and do all sorts of stuff without ever having to experience a page refresh. I even remember when they added AJAX to their photo albums. I mentally flipped as it made the site so much more usable. I showed it to someone going “Look! Look! There’s no page refresh.” while they just shrugged and went “I don’t see what you mean.”, D’oh… exactly! The sort of stuff no one even realises is happening. But I’m sure they’ll feel the difference if they use functionality on your site that’s similar to something Facebook does, but which requires a refresh where as Facebook doesn’t. Even I feel the pain of moving forward and backwards through photos on Flickr. After the third or fourth page refresh, I just give up.

When I got started, web stuff was so new and so simple that in hindsight it was amazing what you could get away with. You could just fly by the seat of your pants. I know I did. The first piece of web development I ever did was back in the mid nineties two days before my first interview. I wrote a Java servlet that simply took a single text parameter and queried a MySQL database using JDBC. I showed it at the interview and got a job as a web developer using Perl. I didn’t even know the Perl but still got the job. All I had to do, day-in, day-out was write HTML and scripts that responded to clicked links or submitted forms. Submit, refresh and display the result, job done, I can go home now. Creating a site wasn’t hard, almost anyone could do it and almost everyone was at the time. Life was simple and it was pretty much a level playing field. Now though, it is a totally different ball game. You’ll need good knowledge of at least a couple of languages, HTML, CSS (Yes we need it to work across all the major browsers), SQL, Javascript + a framework like jQuery + how to use AJAX.

There is just so much that you need to know that if you’re not doing this in your spare time, how are you supposed to ever compete with the kids nearly half your age who can already do this stuff with their eyes closed. Even me, who does this stuff every day as a job has to learn more and more if I even want a chance of staying relevant and employable. I love learning, so it doesn’t bother me. Programming still turns me on and it has to if you ever want to make a go of doing this for a living. Sometimes you can be in the fortunate position of working for a company that really loves this stuff, so you can learn and grow, but I suspect the majority of IT related jobs are done in companies where IT is a second thought to their overall business goal. Where managers prefer to say “no” to your ideas rather then say “ZOMG we could totally awesomely AJAX dis bitch up!!!11!”. And the learning doesn’t just stop at work related subjects. There’s a lot to be said about learning new languages and techniques totally unrelated to your work. Not only for the mental stimulus but also how they can teach you to approach a subject in a new way. I admit this is perhaps one area where I don’t spend enough time, but I’m trying. So go forth and learn. Be totally fucking awesome.

Settling in

First week in the new office over and I’m pretty much settled in. As you can see, I try to keep my desk as empty as humanly possible. I’m finding the monitor above the laptop layout to be working really well. It’s just a bit hard to replicate at home with two 24″ monitors.

From 0 to 100mph

Drivers to your cars

Get a car, fill it with gas, put some sparkly rims on it, dress it up in a body-kit, stick some brand name decals on it and step back. What happens? nothing. Nothing happens without the driver. Nothing happens without someone getting in the drivers seat, turning the key and stepping on the gas. When it comes to performance and chatting about car lap times, a lot of people will say, that the average Joe in the same car won’t even come close to the same lap times as the pros. The same is true of software teams.

Get a project, fill it with time, assign some developers to it, dress it up in a “respected” language, stick some brand name methodologies on it and step back. What happens? A whole world of pain. Pain happens without a driver. Pain happens without someone getting into the drivers seat, making sure the whole team is constantly onboard and steering them forward.

Change follows the leader

Change needs a leader. Someone who can inspire and lead the team out of the darkness and into the light. I suppose what’s really needed is a project Jesus. The one true light and way. Someone who can mentor and guide those less informed on the various subjects, so that they can go forth and do likewise. Someone who can keep an Eagle eye view of the whole project and swoop in when things start to go a bit off course. Someone to be the general go to guy. I don’t mean bug the poor guy every five minutes, but use their knowledge to forward yourself. Read their code, study their tests and bounce ideas off them.

The collective is not enough

For a team to change, it’s not enough for the team to suddenly try and change course. A rudderless team will go nowhere, or funnily enough probably in a circle. While few may be motivated, and some willing, it’s likely that a few will stand their ground. Flipping burgers is a departure from making subs, but it’s all in the game. The evangalists and the nay-sayers each have their demons and each can just as easily de-rail the train to the end goal.

When change comes about, those who championed the ideas or were motivated to put them into action are fuelled and ready to go, but energy quickly runs out when faced with un-answerable questions because of the knowledge hole in the team. “The client wants this task done asap, how does this affect the sprint?”, “I’ve got this class here which calls this class and this other method, how do I unit test it?”, “Who knows how to set-up a CI server?”. The answers to theses questions are readily available on the internet, but a lot of it can be very subjective as well. Everyone has their limit. It’s tempting to by-pass the iteration and just slip the new task in, because it’s hard to tell a client you’re going to bump something from this iteration to meet their request when you’re not used to doing it. It’s tempting to skip testing that method, because it’s hard to refactor the code to make it testable when you’re not used to doing it. It’s too tempting to keep making builds by hand, because it’s too painful to learn how to implement CI when you’re not used to it.

Understanding and team buy-in

For change to be most effective, the whole team must understand why change needs to happen and how all the seemingly independant parts come together to achieve a common goal. If we don’t understand why, then we can never know how. But the why and the how put together does not always lead to the actual practice. For years I knew why TDD was better. I knew that I should be doing it. I knew that I should be writting my tests first, but I still didn’t. I knew how (or at least I thought I did), but I didn’t bother. The most obvious answer as to why I never did it is laziness, but I think the problem runs deeper then that. Yes, laziness is a factor, ignorance is another, but overall I hadn’t bought into the idea of TDD. I had not invested enough time to ever feel the benefits or to convince me that this is what I need to be doing. I had become de-sensitised to the pain of regular coding and debugging. It was only in that ‘a-ha’ moment, where testing and coding seemed to just flow and work, that I bought into it totally. I was convinced and couldn’t imagine ever going back.

People need to believe in the change and rally round it. People need to feel like it’s for their own benefit (which it is!) and not just for the company they work for (which in the end also benefits!). Work done in dis-belief and cynicism is never a job well done. You get out, what you want put in.

Don’t be a DSL (a.k.a When Developers Go Stale)

I’m not talking about being a Domain Specific Language, I’m talking about being a Domain Specific Loser. These are they people who don’t go to the trouble, and it is trouble, of broadening their skills and learning new things. They are the people who don’t care about anything that doesn’t have anything to do with what they are working on.

Hey, I didn’t sign up for this!

Technology is such a fast changing industry, that if you don’t keep up, you’re going to get left behind pretty fucking quickly. I had a load of things listed as points that every developer should be doing and then came across a post by Jay Fields which summed it all up perfectly:

  • Have you tried Test Driven Development? Can you name something you liked and something you disliked?
  • What language(s) that are gaining popularity, but not yet mainstream, have you written Hello World in?
  • Do you read books or blogs looking for new ideas at least (on average) once every two weeks?
  • Do you at least attempt to learn a new language every year?
  • If you don’t understand a requirement, do you IM, phone, or go talk to the business?
  • Have you ever run a code coverage or cyclomatic complexity tool against your codebase?
  • and so on…

On average, 50% of the people I’ve worked with cannot answer those questions correctly. If you can’t answer them correctly

  • You’re junior and could use a good mentor.
  • Or, it’s time to find a new profession.

Developers go stale. It’s just a fact. I was stale and then I discovered Ruby on Rails and I was born again. I don’t mean that to say that Ruby on Rails is the light, but rather that Rails opened my eyes to doing things ‘better’. It got me excited about technology and programming again. It got me constantly thinking “How can I improve?”. And since then it’s been a long steady stream of new ideas, new techniques and new tools. Groovy, Grails, Git, Proper CSS, TDD, Agile, Scrum and of course OSX, etc. I am spending increasing amounts of time buried in blogs or books. Clean Code was a complete eye opener and my current read, Refactoring to Patterns, has me feeling like I am attaining programming Zen.

I think a lot of developers kid themselves into thinking they are developers. Even after working as one for nearly ten years I still feel like I’m a scraping off the bottom of a very deep barrel. Being a shit programmer is easy, anyone can cut and paste some code together, but where is that going to get you? When you hit 30+ are you really going to have the skills necessary to start jumping into to the £50k+, £75k+, £100k+ salary bracket? No, you’re not. Sorry. At that point, we’re playing for high stakes, and they don’t hand those jobs out to just anyone. If you’re a developer and reading this post, take a look at those Jay Fields’ questions again and be honest with yourself. If you can’t answer them correctly, you should seriously take a long hard think about what you’re doing with your career. You should be doing something you care enough about, that you want to be as good as, if not better than, the people at the top of the game.

Being shit is easy, being good is hard. We live in a world where no one wants to do anything for themselves, but that’s not how the world works. So do the right thing. Step outside the comfort of your regular language, read some books, read some blogs, try some new techniques. That’s all you need to do. Don’t allow yourself to become stale by working within the confines of your 9-5 job, its codebase and the developers around you. You need to step out of that mentally to really see what’s going on in the world of technology. I’ve probably learnt more from developers I’ve never met, then those that I’ve sat next to for years! If I hadn’t stepped out of such a silo, I’d still be developing applications in Struts, forever re-compiling and restarting the server, wishing there was an easier way. Now that I’m using Grails, I don’t know how I ever got by before. And with all the lessons and techniques I’ve learnt over the past six months, going back to those old Java/Struts applications is a joy, as it’s a chance to flex my muscles and do some fun refactoring and sprinkle some syntactic sugar around (Nothing is more satisfying then sweetening some smelly code).

It’s hard for some people to swallow. Being a developer today is not what being a developer was 5 or 10 years ago. A lot of people don’t want to adapt, and that’s fair enough, but that’s how species become extinct. They don’t adapt. Being a developer today is about so much more then just developing code. It’s about delivering solutions. From soup to fucking nuts. We should be able to interact with customers, spec out pieces of work and participate in groups to ultimately deliver on a customers’ need. It’s a bitter pill to take but that’s what the job is. It’s a far cry from what it was before, where writing software was like a holy quest, and the crusaders could never be questioned for fear of ever increasing budget and timing overruns. These days there are companies delivering software of such high quality and at such a high pace that customers become understandably agitated when their developers fail to do the same. There used to be a time where you could deliver a piece of shit and get away with it because people still didn’t really understand the web and what it was capable of. But you’re damned these days as clients want the same small features that make sites like Facebook, Gmail or Yahoo a pleasure to use. “What do you mean you can’t do it? XXX does! How hard can it be?”. *Ouch* I hope you’re up-to-date on your skills when that question comes around.

Investing in Your Own IT – The Ultimate No Brainer Pt. 2

This is a follow up to my previous post about investing in your own IT. The more I think about the more I keep coming back to the thought that it’s not about investing in IT, it’s really about investing in your people. After all, without your people you’re nothing. Yes, without your people you are nothing. Zilch, nada, zero, nil, null.

You’re not spending money on new computers so that tasks are done faster or made easy to achieve. To claim that is to say that the key to success lies within the tools. It doesn’t. It lies within the people. “Well”, you may say, “then it doesn’t matter what equipment I give them then!”, and with that you would join the many number of managers I’ve heard say the exact same thing and who I believe had no a clue as to what their people actually did. Good tools do not create good developers, but bad tools do create bad ones. And I don’t mean bad in the sense that all of a sudden they start writing bad code, but that they become de-motivated, uncaring and uninterested in their work, to the point where it has a significant impact on their deliverables.

Now you could say that a developer worth a dime will rise above and make best with what they’ve got, but we’re a proud bunch of people and of course want nothing more than to do good. But if you begin to even start to feel like you’re being set-up to fail or that you are not important, then it’s lights out and that is going to have a major impact on your motivation and which will affect anything that you are supposed to deliver. A motivated developer will always create something faster, better and stronger then one that isn’t. A motivated developer is a productive developer.

“Hey, I’m paying these monkeys! So they can just lump it or get the hell out.”

Well at least you are brave enough to admit that you’re paying people to put up with your shit. But why? Why be shit? Isn’t there some part of you, deep down, that just wants to blow the fuck off the roof and do extraordinary things? It all comes down to self-development, whether that be the self as an individual or the self as an entity, like a company. I touched very briefly on the subject in my post about typing, the short of it being, if you have the opportunity to improve, why would you not do it? There are, of course, reasons not to. Perhaps it’s fear. There is the fear that if you make the effort to try, that you will fail and others will laugh at you, or there is the fear that the actual process of trying to improve will only expose your flaws, and no one one wants to be exposed as being a complete moron (You know who you are). Perhaps it’s monetary. To get better, you may need to buy new equipment, new materials, go on courses, whatever. It’s easier to steer the course then it is to make waves. There are always reasons not to do something, but does that mean we shouldn’t do anything? Of course not. Let’s give our developers a moral boost. Let’s motivate them. Let’s make them feel important. Don’t stick them on shitty machines with small monitor/s.

Fuck it, where’s my new machine?

[Flowchart modified from the Panflute Flowchart]