Tuesday, 10 June 2014

Prioritsing personal development and personal projects

I have a problem. I feel like my software development knowledge is poor and must be boosted. Which bit? Errmmm…all of it. Everyone knows more than me, I know nothing. That’s what my brain tells me. Learn all the things, right now! But, I can’t do that. Like other people, I have a full time job. I have a family, I can’t just ignore them. But I want to learn stuff, I want to improve myself, how do I do it? There’s so much to learn, how do I decide what is most important right now?

This is what runs through my head almost daily. My first thought is make a list. Lists are great, they mean you don’t have to remember stuff. Before I had a kid I used to have a fairly long list of stuff I wanted to know more about, books I wanted to read, technologies I wanted to play with, projects I wanted to undertake. That was fine, I had lots of time I thought, I’ll get to them eventually. Then my son appeared and my time disappeared. I made the sensible decision to kill the list. Well, everything but the top most item, the task I wanted most to complete. This worked well for a while, but then my free time and energy creeped up again. I started adding more things to the list. Arrggh! How to I prioritise this stuff? My free time is way more important that it used to be, I need to prioritise. This is where I stumble. I still want to complete all the things on my list but I can’t decide which is most “important”. Note the quotes. I’m using these to suggest that none of the tasks are really important, I just convince myself they are. Also it's worth clarifying that I'm talking about non trivial tasks, something that I would at least have to put at least few hours into. 

So, I need to find a better way to prioritise right? Off the top of my head there are a couple of ways I could go about this.


Method 1 - A system

I need a system. I like having a system. I used to have a system for stacking dishes on the draining board, before I got a dish washer. Find the most efficient method and stick to it, that’s me. 

One way to make decisions is using a decision matrix. List the options, list the factors and rate each factor against each option, using an optional weighting. The option with the highest total is the winner. This is so me. 

What factors are applicable here. After some light brain activity I came up with the following:
  1. Is it fun? E.g. Do you enjoy doing it? Is it something that you can’t wait to get your teeth into?
  2. Is it useful? E.g. Is this something that will make your life easier, or your colleague’s lives easier?
  3. Is it important? E.g. Will your career suffer without this? Can you work without this? The distinction between useful and important is a bit hazy. Something useful could save you time day to day but something important you’ll struggle to do without
  4. Is it difficult? E.g. Creating a game from scratch is difficult, reading a book is not
  5. How long will it take? Pretty obvious this one. If you’re going to spend a long time doing something it had better be worth your while in some way

Scores are between 1 and 5, 1 is low, 5 is high. E.g. 1 means something isn’t fun, 5 means it’s super fun.

Mostly there’s no need to be specific, just a gut feeling will do, with the exception of duration which I feel the need to be a little more explicit. 
  • 1 - years
  • 2 - months
  • 3 - weeks
  • 4 - days 
  • 5 - hours
Here’s an example of the kind of things floating round my head right now.


Fun?Useful?Important?Difficult?How long?Total
Weighting52335N/A
Learn about .NET vNext4355581
Investigate UA feature and work out how to upgrade 2534461
Write a Hubot script5514470
Write a Resharper plugin4513357

I think this is potentially pretty useful. Here are the hard facts, based on the gut feeling values, with which I can work out the most “important” task.

The results are interesting. vNext stands out because while it’s not that useful right now it is really important to know how to take advantage of it down the line when it’s released. Plus it won’t take very long, I can watch a few videos and blogs to get a feel for it.

At the other end of the spectrum is the Resharper plugin. I’ve wanted to try and write a plugin for ages. There are some tasks at work that I could automate using Resharper. After giving it some thought, it would be really useful, but, it’s utterly non essential, it’s probably not going to be particularly easy, therefore will take weeks if not months and I imagine it’ll be a very steep learning curve which will take the edge off the fun factor. 


Method 2 - Throw out the system

While doing a little reading around this area I stumbled across Jeff Atwood’s blog post todon’t. In it he makes the point that collecting tasks is bad and todo lists are bad. I get this. I look at my list of stuff I want to learn and I think crap, I’ve not got enough time! Someone create me a Time Turner already! 

So, method two is bin my todo list. But, if I do that, how will I remember what I want to learn? Well, as Jeff Attwood and Adam Wozniak point out you can just go with the flow. Act on what excites you right now, what interests your right now. Everything else is irrelevant. 

In one respect this approach scares me. I strongly believe there’s no point remembering something that can be remembered by something that doesn’t forget, usually Evernote. So if I don’t write down all the things I want to do, how will I remember them? On the other hand this feels like a breath of fresh air, like a release, like a weight off my shoulders. This way I can be rid of the physic weight of unfinished tasks and just work on what interests me, and that's a big deal.

Here's another way of thinking about it. In on task hoarding and todo bankruptcy the author talks about a hoarder named Richard Wallace

"Despite his incredible existence (he slept in a chair, his bed was covered in ceiling-high junk), he didn't see see that he had a psychological syndrome. Pay attention to this, because it's kind of the point: He didn't believe he had an excessive hoarding habit, he felt his real problem was a shortage of storage."

I'm the same as the author of that blog post. I don't believe I have an excessive task hoarding habit, I believe I have a shortage of time. I don't want to live like that. 

This seals it for me. As of now I'm deleting my home dev todo list and I'm deleting my work dev todo list. I'm going to trust that everything I want to learn will be suitably interesting and exciting that it will be at the forefront of my mind. What if this approach doesn't work? That's fine, I can always change my mind somewhere down the line. But for now I'm not going to miss the constant reminder that I don't know enough.

Monday, 7 April 2014

Devweek 2014 - Day 3


Already familiar with ASP.NET Web API? You sure? - Ido Flatow

I had no idea Web API was so extensible and configurable. You can change pretty much everything in it’s pipeline; message handlers, filters, parameter binding, formatters and so on. 

Turns out Web API can be cached, but you have to do a bit of manual coding to enable it. Essentially it’s a case of using max-age or expires headers as appropriate. Or, ETag headers can be used to version your cache. I can see this being quite a clever way of caching but it requires more setup.


Culture of review - Austin Bingham

I’m very much sold on the benefits of reviews so much of this talk was familiar. But, saying that, I’d forgotten a few important things.
  • Research has been done in this area. All the research mentioned in the talk suggested that code reviews are a effective way of finding code defects
  • Taking your time is important. Don't review in a rush
  • 200-400 lines of code per review is optimal based on research done at Cisco


Better code through bugs - Seb Rose

The question this talk was trying to address was how do you know you have a high quality test suite? In short, you don’t, there isn’t a reliable way to measure. This is where mutation testing comes in. Mutation testing is a fascinating concept. The framework being demoed, pitest, introduces bugs, called mutants, into your code. There are several different types of mutations. Examples include conditions boundary mutator, which changes conditional operators; increments mutator, which changes increments to decrements and visa versa; math mutator, which changes math operation operators. 

For example, the conditions boundary mutator can change a >= to a >. Once the mutation is made your unit tests are run. If at least one test does NOT fail, you have a problem. It may be that you need another test case or there may be some other issue which needs to be fixed.

It sounds like a really interesting and potentially useful technique, but, there are problems. 
  • It can be slow
  • You may not be able to achieve 100% pass rate. Some issues cannot be fixed
  • There’s no good .NET mutation testing framework