Richard Hart

Something @ Somewhere • Kent, UK

Richard

  • And that’s why I blog.

    [via gapingvoid]

  • 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.

  • The migration over to Slicehost is now complete and I’m extremely happy so far. It wasn’t as easy as I thought it would be, but the feeling of impending doom I got when presented with a fresh install of Gentoo was quickly overcome. Apache + PHP + MySQL took virtual no time to install (once you discount the time it took to compile them up) and the installation of WordPress along with importing my old posts worked pretty much like a charm. Installing and migrating over my Gallery2 install proved a bit tricky but nothing that some time didn’t set right. One thing I’m not prepared to do is setup Email so I’ve entrusted that to MailTrust which is working well. I’m finding things like no FTP server or even VIM amusing after coming from Dreamhost where all of this stuff is there already for you, but the sense of freedom and also ‘leaness’ of the server more than makes up for all that.

  •     <mx:series>
            <mx:CandlestickSeries>
            <mx:boxStroke>
                <mx:Stroke weight="1" color="black"/>
            </mx:boxStroke>
            </mx:CandlestickSeries>
        </mx:series>

    One thing not mentioned in the Flex CandlestickSeries documentation is how to change the border colour of each candlestick. So you end up with a horrible orange border by default. This can be removed with the boxStroke tag.

  •     int main (int argc, const char * argv[]) {
            NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
            for(int i = 0; i < 100; i++) {
                NSMutableString * fizzbuzz = [[NSMutableString alloc] init];
                if(i % 3 == 0) {
                    [fizzbuzz appendString:@"Fizz"];
                }
                if(i % 5 == 0) {
                    [fizzbuzz appendString:@"Buzz"];
                }
                NSLog(fizzbuzz);
                [fizzbuzz autorelease];
            }
            [pool drain];
            return 0;
        }

    We have lift off!

  • Figure out the absolute least you need to do to implement the idea, do just that, and then polish the hell out of the experience.

    Not only does John Gruber nail it when it comes to the essence of what being ‘iPhone like’ is about, he echoes the essence of what good piece of software is about. At it’s furthest abstraction, in my opinion, the above is really a mantra for reaching the pinnacle of one’s own life.

    [Via Daring Fireball]

  • RescueTime


    So in October I spent a grand total of 327 hours infront of a computer. 43% of the whole month or the equivalent of nearly two straight weeks. The dip on Oct 13th was when I installed Ubuntu ;)

  • 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.

  • “Andy Bechtolsheim is also famous for being one of the first investors in Google. After getting the pitch he went to his car to write a $100,000 check for the not-yet-incorporated company. At one stage I saw that investment was valued at $1.5 billion”

    [Via HackerNews]

  • 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?

  • Dear Ubuntu 8.04,

    Please don’t be mad. It’s not you, it’s me. Maybe I’m just too fussy. While other’s can live with your rough edges, it’s just too painful for me to deal with. Maybe it’s just the ugly fonts, maybe it’s the fact that links sent to me in Pigdin won’t open when clicked and need to be manually copied and pasted into Firefox.

    While I understand you probably thought our game of “lets make one or the other monitor work but never both at the same time” was fun, the two hours of pain it took to get “working”, followed by another two hours of fiddling when they both failed to work after a reset was just too soul wrenching.

    But I tried to look past these failings and for a while things worked out really well. I was overjoyed when you compiled my code faster then the servers did, but really, that was all you had going for you. When you failed to run Selenium IDE, I winced a bit, but thought I’d manage, but when you failed to run Firebug, I couldn’t bear to go on. I know others out there are willing to put the time and effort into making a relationship with you work and I know that you’ll find someone else who’s right for you.

    The last thing I ever want to do is change you. But why can’t you be more… I dunno… OSX like?

    Richard

  • You can’t get a little bit pregnant. – Lou Mannheim

    There’s a story about a manager that said his team was doing scrum/xp. When pressed as to the details of what that meant, the manager replied that they were doing ‘no documentation’. Scrum is the in project management methodology of the moment. Quality? Scrum! Clear deliverables? Scrum! Happy developers? Scrum! Pole dancing midgets covered in maple syrup? Scru… Hey wait a minute!

    So yes, Scrum and what does it have to do with getting a little pregnant. My point is, if you’re going to do it, you need to go the whole way. It’s not enough to just dip your toes in the water. You may refer to your current load of work as a sprint, refer to units of work as stories and may even refer to your working capacity as your velocity. But, scrum is not about giving names to concepts, or about having a backlog, or having a burndown chart etc. Even if you did all of theses things together, you would still not be doing Scrum, because it is more then the sum of its parts. And I can guarantee you that if you start going down this path of faux Scrum, when things start to move slightly off course and panic starts to creep in, you’ll dip into your old ways to “fix” the immediate problems and then when the shit really starts to hit the fan, you’ll give up on it completely and deem the whole exercise a failure. That’s why you can’t get a little bit pregnant. You’ve got to go all the way and get to fourth base.

    “Woah, Joe, all theses companies are succeeding with Scrum, we should do it too!”, “Yeah lets!” – High five! The product backlog gets written up, the burndown chart gets drawn and every morning there’s a stand up meeting with some people to discuss ‘work’. A week or two goes by and it really starts to feel like the wheels are greased and progress is being made. Then an urgent client request pops up, a massive bug has been found, or that feature they asked for two months ago and which they’ve just seen (Hey, we’re retrofitting Scrum to primarily waterfall driven project), isn’t what they wanted. Well the request is fine, we’ll go through the current sprint’s backlog with them and they can decide what they would like pushed back. Oh, they don’t even know what a sprint is, “What did you say? Spinelog?”. Well the bug is not a big deal, we’ll just run our tests, make the amends and get it sorted real quick. Oh there aren’t any tests. Ok well at least the incorrect functionality we can handle, we’ll just plan it into the current or next sprint and continuous integration means they can monitor the progress as we go a long. Spontaneous combustion? Fuck me. It’s not good enough to pretend, or for the development team to do it in isolation from the stakeholders or customers. To succeed you need buy-in across all the people involved with bringing the project to fruition. Everyone needs to understand the process and understand the role that they play. Pretending to do it ends up giving the team (mostly management) a false sense of security and that can really come round to bite you in the arse.

    Don’t get me wrong, I’m not saying that doing Scrum in the above fashion is always wrong, because sometimes your circumstances leave you with little choice. But, what I am saying is that proclaiming to be doing Scrum without understanding it all the while living in blissful ignorance of the flaws of your own processes, is bad and harmful. I don’t mind mistakes or doing things the wrong way when you start out, because really you need to start walking the path before you can get to where want to be. I just can’t stand people saying their walking the path when really their just sitting on their fat arse, biding their time.

    Man looks into the Abyss, and there’s nothin’ staring back at him. At that moment, man finds his character, and that’s what keeps him out of the Abyss. – Lou Mannheim

  • New Macbooks and Macbook Pros are extremely nice. Sadly no sign of the new monitors yet.

  • I’m very sensitive to exactly what mouse I have on my laptop. Can you find a range of choices? [for the Mac] Of course you can’t find a range of choices. You know, anyway — can you find the applications you want on the Mac? Well, you don’t really get full Microsoft Office.

    Steve Ballmer

    Seriously, come on. Next he’ll be telling us how you can’t even right click on a Mac. It’s tiring enough to hear this sort of BS from everyday Windows users, but from the CEO of MS? yawn

  • Groovy gotcha


    This stupidly caught me out and a proper D’oh moment followed. I had bad been converting a couple of parameter calls as such:

       def myString = someString ? someString : ""
       def myInteger = someInteger ? someInteger.toInteger() : 0
       def myBoolean = someBoolean ? someBoolean.toBoolean() : true

    To something more Groovy (I hate it when people say it like that). But:

       def myString = someString ?: ""
       def myInteger = someInteger?.toInteger() ?: 0
       def myBoolean = someBoolean?.toBoolean() ?: true
    
       def someBoolean = "false"
       def myBoolean = someBoolean?.toBoolean() ?: true
       assert myBoolean, false // tis true me lord!

    I was expecting it to return the boolean value of someBoolean if it wasn’t null, but instead it was tripping the elvis operator and returning the default value when the result was false. Cue slap on the forehead after realising why I wasn’t getting my expected value back.