Developer Productivity: My Talk at DDDSW


One of my goals this year was to do a talk at a developer conference. I did a few talks at .NET Oxford last year, and wanted to take my public speaking a little bit further, and the fantastic Developer Developer Developer conferences gave the perfect opportunity! For those that haven't heard of these conferences - there are a number of them throughout the year at different locations. They're always free to attend, and always on a Saturday. This means that most of the attendees are there because they want to be there, not just because they've being sent and paid for by their work. I've been to a few now, and there's always a really great community vibe.

intro (note: image above is the main DDD intro, not my talk)

Last weekend was the DDD South West version, which is based in Bristol. I wrote a blog post from last years' DDDSW, which can be found here. When the submissions opened for this years DDDSW, I submitted my Developer Productivity talk which I'd done as a lightning talk last year at .NET Oxford. The lightning talk version was just 20 minutes, and there was a lot more I wanted to cover in the talk, so doing a full one-hour talk at DDDSW allowed me to add a lot more content that was missing in the shorter version. I had no idea if people were interested in a talk like this - and was obviously really chuffed when I got an email through saying that my talk had been voted for and accepted!

The talk went really well, and I received some fantastic feedback afterwards. There was also a feedback app for the day where attendees could rate both speaker knowledge and speaker skills, and also provide feedback. I received this feedback via email, and was really blown away by the comments! My speaker knowledge had been rated at 9.21, and my speaker skills at 8.86. The comments people wrote were insanely positive - really chuffed to bits with them! The email made my day!

The published slides for my talk can also be found here, and the Reveal.js source-code can be found here.

At the start, I mentioned the #devprodtalk Twitter hashtag, for people to share their photos, feedback, and their own productivity tips.

The rest of this blog post will be about the talk itself - the topics I covered, and the tools I demoed and talked about. Note that some of the sections have been copied from a blog post I wrote last year after doing the much cut-down 20-minute lightning talk version last year at .NET Oxford. I decided to duplicate the content here so that this post includes everything from my full talk at the weekend, rather than the reader having to switch over to the other post and read first.

Intro

It always surprises me that if you take a room full of developers, the deviation between each developer's productivity level is huge. And I mean, seriously huge! A task that might take one developer half an hour, might take another developer an entire day - and the quality of the solution will also be wildly different too.

A lot of it is of course down to experience, but it isn't as closely tied to the number of years the developer has been developing for as you might think...

You might have a 20 year developer who has been working for the same company throughout - using the same technologies - hasn't the foggiest about the latest technologies - no idea about design patterns and best practices. No idea about writing maintainable, testable code. Never written a unit test in their life.

And you might have a 2 year developer, who actively studies every day - reads blog posts and books, listens to podcasts, watches Pluralsight, has side projects, dabbles with other technologies and programming languages.

The two year developer is probably going to be a better and more experienced developer. I'd certainly rather hire a developer with this mindset.

Now imagine that 2-year developer in another 18 years! Imagine the difference between those two 20-year developers!

The Power of Compound Learning

I touched on this in my blog post about National Coding Week (see the 3rd question) "What advice would you give others wanting to get into coding?" So rather than repeating myself, I'm just going to quote my answer from that blog post ...

My biggest piece of advice would be to never stop learning! And also to actually embrace learning, as it's something that as a developer, you'll be ongoing doing a lot of. If you embrace it; actively study daily - read books, watch Pluralsight, listen to podcasts, read blog posts - then you'll very quickly put yourself ahead of the average developer.

I don't know the official term for it, but I think of it as incremental learning, where learning a little bit every day, over a long period of time, becomes huge. You could also think of it as compound learning because in the same way as with compound interest, where you earn interest on your interest, on your interest, on your interest - you also get the same concept with learning. The more you learn, the more underlying knowledge you have to build upon. So basically, the more you learn, the faster you learn, so the more you learn, so the faster you learn! This is a very powerful concept to appreciate and take advantage of.

You also learn and retain more by being motivated - so it's important to make sure you enjoy what you're doing and never get stuck in a rut. There are so many great technologies to play with - even if this is a side project or getting involved in an open source project - make sure you play and have fun with different technologies and programming languages. There's a lot of very cool stuff going on - especially nowadays.

Snippets and Note Taking

As developers, we repeat ourselves a lot! More than we realise. And I don't mean as an industry - I mean individual developers repeat themselves a lot. How many times have you Googled the same problem multiple times; spent half an hour searching for the same Stackoverflow answer more than once; written code that does the same thing, more than once. It's a tremendous waste of time.

This might sound really obvious, but it's surprising by how many developers I've seen who don't have a centralised place to put their code snippets.

I personally use Workflowy for this. You can read a blog post I wrote about this here. But the tool you use isn't the point. The point is that you have a centralised place you can quickly store snippets and notes. It could be Workflowy, Evernote, OneNote, GitHub, even text files in Dropbox. It's the concept that matters, not the tooling.

There are a few points I'd recommend though when choosing a tool...

  • Make your snippets and notes sharable. And I don't mean sharable with other people - I mean between your home PC and work PC - and anywhere where you'd need to access them.
  • They should be easily searchable and well structured. As this gets bigger, you still want to be able to very quickly find what you're looking for.
  • Centralised. Most IDEs have some form of snippet extension. The problem this this is, you're limited to using them just in that IDE. I have lots of things in mine - code snippets, command line snippets / reference, step by step instructions on how to stuff, build script references, regedit hacks, etc, etc.
  • Private / Personal (see below)

I want to expand on the final "private / personal" bullet point. Your snippets / notes should be personal. Now, one might argue that you should share it, let others contribute. The problem with this is that everyone's minds work differently. One person will write and structure their notes completely differently than the next. So if multiple people are contributing, then you need to have some form of moderation and standards as it gets bigger. It also raises the barrier to entry. One of the hardest things about this is consistently contributing. Everything you do, ask yourself if it could be of use to your future self. If so, spend a couple of minutes adding it to your snippet repository. If multiple people are contributing, then you're even less likely to contribute as frequently.

Now, after saying that - please bear in mind that I'm talking about non-project specific snippets and notes. It's not company or project specific. However, if you work in a team, then it's very important to have internal development documentation. Ideally a wiki of some form. I've worked with quite a few teams that don't take time to document properly, and it's not good. Documentation is very important. If a key developer gets knocked down by a bus - the company shouldn't be screwed! I've recently written a full blog post about the importance of this. However, this is not what I'm talking about in this talk. I'm talking about your own personal snippets and notes which you can take with you from company to company, as well as side projects.

Obviously, the true benefit to this is when you start using your snippets and notes. I've had tasks before which have taken me an entire day to do the first time I've done it. And once in my snippet repository - I've done the same task next time in a fraction of the time. It's a massive time saving.

I ended this section with a short demo of how I use Workflowy to manage my notes and snippets.

Tools and Automation

The next section of my talk, discussed tools and automation. As developers, everything we do revolves around tooling. From small tools like the clipboard, to massive tools like Visual Studio. We've all heard of both the clipboard, and Visual Studio. But there are plenty of other tools that can help us be more productive that are less common. Also, there is plenty of functionality even in those tools we already use that we probably don't use or even know exist. Think of all the functionality in Visual Studio that you don't use.

For rest of this section, I picked out a few tools that I use heavily on a daily bases that make a big difference to my productivity...

LINQPad

One example of a tool that I find a lot of .NET developers don't use, which every .NET developer should be using - is LINQPad. I've written quite a few blog posts on this, and also did a 20 minute lightning talk at .NET Oxford dedicated to this.

This is a fantastic tool with so many different use-cases. Rather than me detailing what it does in this post - I'd recommend checking out both their website, and my list of tips and tricks blog posts about it.

In the talk, I demoed LINQPad briefly, but obviously didn't have enough time to cover it fully like I did in my previous lightning talk.

Resharper

Resharper is a Visual Studio extension which literally saves me hours each week. I should point out that Jetbrains are a prize-draw sponsor of .NET Oxford - but my reason for talking about and praising Resharper are completely unrelated. I genuinely find it that useful.

I used my blog sourcecode project to demo Resharper. I created a new class and wrote a short bit of code. The main point I wanted to get across was how little typing I was doing, and how much I was leveraging Resharper to do a lot of the typing and scaffolding for me.

I then briefly pointed out a few other bits of Resharper's functionality, focusing on areas where I think developers who already use R#, perhaps don't know about. Some examples which spring to mind are Incoming Calls, the Stack Trace Explorer, pulling members up and down into base/derived classes, changing signatures, etc.

I had a few comments from people afterwards saying that they didn't know Resharper could do half of what I showed.

The CLI

cli

I'm a big fan of the CLI, and it always surprises me when I ask an audience who uses the CLI, how few hands go up. This talk was no exception - pretty much zero hands went up! This really took me by surprise at an event like this!

I mentioned earlier about the power of tools. Well, if you're not a command line user, then you're missing a large percentage of tooling that can make you more productive. I'm not saying the CLI is better than a GUI - what I'm saying is that there are GUI tools and there are CLI tools. If you don't use the CLI, you're missing out on a large percentage of tooling available to make you more productive. The right tool for the job and all that - well the CLI is the right tool for a surprising amount of jobs!

Unfortunately the stock Windows CLI is a bit rubbish. If you're a Windows user, I'd highly recommend taking a look at a tool called ConEmu. In this talk I demoed some of ConEmu's functionality - eg. tabs, split screen, saved layouts, etc. I also demoed how I take advantage of the split-screen saved layouts when developing locally with a .NET Core project I'm working on which has an API, Identity Server, and a web frontend. Having a console window in one monitor which has multiple split screens, tailing output logs for each service is really useful.

I also demoed some other CLI functionality - eg. the ctrl-r search-history shortcut, and spoke about other useful tools - eg. PoshGit, Chocolatey, Z powershell module, and a few others.

For more about the CLI, ConEmu, and the tools I discussed - you can read my blog post about Getting more from the Windows Command Line.

A Better Clipboard

I'm still amazed by how rubbish the stock clipboard is. You have just one item in your clipboard, and if you copy something else, you've lost that data for good. Come on, this is 2018 - that's rubbish! I'd highly recommend using a clipboard manager to get around this. Personally, I use a tool called Ditto. It hooks into my clipboard and keeps a history, which I can access via a hotkey (I have it mapped to ctrl and backtick). Pressing that hotkey gives me a dropdown to select from my history. I can also shift-select to paste as plain text.

This might all seem like a 'nice to have', but it actually becomes really powerful when you can trust your clipboard and take advantage of not losing the data. Once you get used to working this way, your workflow tends to flow that little bit smoother!

Todo Lists + Getting Things Done

todolists

I also discussed todo lists and the GTD method. The main concept of GTD is to get everything out of your head, and into a system. Mostly that system will be a todo list app of some form. Personally, my life revolves around Todoist. Everything actionable I need to do, immediately goes into Todoist. I immediately give the tasks labels and a priority. This means that nothing is just my head waiting to be forgotten. This also means that my mind is free to be more creative, have more ideas, and just be less stressed.

I recently wrote a blog post: Todo lists: The right way, which I'd highly recommend reading. This post also discusses the Eisenhower Matrix, which I use to prioritise my tasks, and also discussed this in the talk.

The post above focuses on non-based-project tasks. I also recommend using todo lists for project-based tasks too. Break what you're working on into smaller actionable chunks, then work from that list. And as you think of things whilst you're working, just quickly add them to your list, so you don't forget them. I find that working from a list like this, minimises procrastination and also stops you from forgetting the smaller details.

Focus!

focus

Focus is obviously a massive part of being more productive. There are many different forms of distraction - from internal procrastination, to digital notifications, to background conversations, or physical interruptions by colleagues.

In this section I talk about two things I find make a massive difference to my focus levels. A decent set of headphones (yes, simple I know!), and also the Pomodoro Technique...

Headphones

I've recently purchased a pair of Bose QC35 IIs, and these make a massive difference to my focus level. Whilst I would highly recommend these headphones - my points aren't about that particular brand or model - it's about some key attributes...

  • Noise Cancellation: Being able to turn off all the background noise - office banter, etc. makes a huge difference. Whether you're consciously or subconsciously listening to background conversations - they're stopping you from being as focussed and in the zone as you could be.
  • Size does matter!: I used to wear in-ear headphones, and since switching to my QC35s, I've found that I'm much more immersed due to the larger size and covering my ears. I also find that I get interrupted a lot less by colleagues. When someone is wearing big headphones, and is clearly in the zone - people tend to thing twice about interrupting you to ask you trivial things that can actually wait.

Then of course, as we're talking about headphones - there's music. Everyone is different - some people don't like working to music, some people do. I quite often have my headphones on without music on at all, and I still feel more immersed. I do find that music can make a big difference to my focus level - and the genre of music that makes me the most productive can completely change depending on my mood. Paying attention to what music does and doesn't improve your productivity can be a really useful focus tool.

Pomodoro Technique

tomatoes

Another tool I find that makes a big difference to my focus level and how much I can get done, is the Pomodoro Technique. Basically, you pick a task, set a timer for 25 minutes, then do nothing else but that task for 25 minutes. You can't check emails, notifications, Facebook, Twitter. Your time and focus needs to be 100% on that task for the 25 minutes. Then you get a 5 minutes break, then start another Pomodoro.

25 minutes isn't a long period of time - so it's actually much easier to commit to ignoring distractions and not procrastinating for that 25 minutes.

It also helps that by choosing a task beforehand - you've set both a goal and a deadline to focus on. There's a law called Parkinson's Law that states "work expands so as to fill the time available for its completion". So if you have a task that should take about an hour - but you give yourself two hours - it'll probably take you two hours. So, what if you just give yourself 25 minutes of focussed Pomodoro time???

There are quite a lot of Pomodoro Desktop timers - from open source timers like Tomighty to commercial ones. However, I wasn't quiet happy with them - either not doing enough, or doing too much. I also wanted my data to only be kept locally rather than in the cloud. So I decided to create one myself! It was also an excuse for a fun little hobby project, and also have a play around with Electron. It's still work in progress at the moment (not yet 1.x release), but it's certainly usable. I intend to add full reporting functionality in future versions. It also has Slack integration, so when you're in a Pomodoro, Slack is automatically put into do not disturb mode and a little tomato icon appears next to your name so your colleagues know not to disturb you. I've called this project Tomatoad, and it can be found on Github here. It's also on Chocolatey, so can be installed via cinst tomatoad.

Mindmaps

mindmap

I've recently starting using mapminds more and more. Due to their hierarchical nature, they're a fantastic way to visualise and break down what you're working on. I now start a mindmap when starting a new blogpost; a new project; or even a larger task within a project. It really helps me stop and think of all the things needed, and can save a lot of time, and also help with estimating, as there's less chance I'll forget something.

I've tried a few different mindmap apps, and have settled on XMind. The free version covers everything I need, and the files can be saved locally rather than in the cloud. This means that I can use it on clients' machines too without having to worry about licences or things being uploaded to the cloud.

Zero-Inbox

zeroinbox

I've also recently spent a bit of time getting all my inboxes to zero-inbox. And I've found that this has suddenly made my email much more valuable! I no longer miss things, and there's a lot less noise due to my unsubscribing from stuff as I go. And when you get to zero-inbox, it's actually really easy to keep it that way.

To get to zero-inbox in Gmail is really easy. Just archive everything. Gmail has bulk sweep buttons that make this really quick. Draw a line under everything and accept that fact that if you want to find something, you can search for it.

For other email providers that don't support bulk archive, then I'd recommend temporarily changing the sort order of your inbox to sender. That makes it much easier to bulk select and delete or archive blocks of emails.

Once you're at zero inbox - your inbox should only be a landing zone. You can then process these incoming emails as soon as possible by doing one of the following ...

  • Delete
  • Archive if you want to keep it for reference. In Google Inbox, mark this as done. By archive this might be copying it to an archive or reference folder depending on your email provider / client.
  • Unsubscribe, then delete
  • Reply, then archive
  • For emails that require a larger action - add to your GTD todo list, then archive. I have an IFTTT rule that adds any emails I star to Todoist.

Each of these actions is quick to do. There's no need to ever keep an email in your inbox. It's just a landing zone.

Another thing that a lot of people try to do when moving to zero-inbox, is create an abundance of subfolders to organise their emails. This just isn't necessary and overcomplicates things. Just have a single Archive or Reference folder (whatever you want to call it). The search functionality nowadays is so powerful - you can always find what you want very quickly - there's no need for complicated folder structures. Keep it simple.

Another thing I've found since moving to zero-inbox, is that the benefits of this minimalist way of doing things has seeded other parts of my life. I now try to keep the house tidier, as in the same way as with emails - things then just becomes easier to manage. Likewise with my desk. And various other parts of my life.

Multi-tasking

multitasking

It's been proved time and again that human's cannot multitask. Yet we keep on trying to do so. I hear a lot of people who are stress venting that they have so much work to do! You do not have so much work to do. You have ONE thing to do! At a time. One thing at a time. If you're using some form of todo list (which I spoke a lot about in this talk in the GTD section), which is prioritised - then your system should always be telling you what the most appropriate thing is you should be working on at this moment in time. Once this is done, take the next one of the list. Simple with no stress. If you're trying to do lots of things at the same time, then you're not doing those things to your best capacity, so whilst it might feel like you're doing more - in the long run, you're not. If your boss or stakeholder is trying to get you to do more than you can do - then it just comes down to good communication. Explain that you're being given more to do than you can keep up with - and you can even ask them to prioritise those tasks for you if they feel the need. But do remember that if you get stressed about it - then that's your decision. Keep calm, trust your prioritised todo list, and do one thing at a time.

Estimates

estimates

Our natural tendency is to be optimistic when giving estimates. We like to look good when giving the projected estimate, and we forget about the amount of problem solving, Googling, StackOverflowing we do on a daily basis. It almost always takes us longer than our first-guess estimate. This causes us to get stressed, cut-corners, and not test our work properly. Then our work goes over to QA (or even worse, straight to production!), and comes back to haunt us costing us even more time, or adding more technical debt to the project.

You'll hear people say to double your initial estimate. I say triple it. Multiple it by Pi. It's surprising by how close this actually comes to the real figure.

It's hard though taking a task that you think will take you a day, and then quoting three days instead. But you'll be much better off for it - producing much better quality work, and being less stressed whilst doing so. Your managers / stakeholders want a true estimate, and would much rather you give a longer estimate and complete on time with work that passes QA first time, than you not completing on time and/or providing shoddy code that has lots of bugs raised from QA after you've marked it as "done".

Brain nutrition

brainfood

If you think about the immense size of the Universe - we are just tiny tiny specks. However, as far as your brain is concerned - you are the absolute centre of our Universe. Everything you see and feel is in the context and viewpoint of your brain. Your thoughts, feelings, memories, emotions, ideas, focus level. Everything. Your brain is your most valuable asset. It's who you are. And yet - we don't look after it! We eat junk food, processed food, don't drink enough water. Our brains have approximately 100 trillion connection, and requires good nutrition for these connections to function properly and for your brain to create more. So rather than reaching for a MacDonalds or a pizza - think about foods instead that can keep your brain healthy. Like avocado, eggs, nuts, fish, bananas, berries, whole grains - even dark chocolate. Then there's water - lots and lots of water. I notice a massive difference when I have lots of water in day than when I don't. When I consistently drink about 2-2.5 litres a day - I feel noticeable better and happier.

Notes for next day

At the end of each day, I spend about a minute doing a brain dump into a text file of what I'm working on and where I'm up to. This means that the next day, as soon as I get to my computer in the morning, the first thing I see are the notes from the previous day, and I'm immediately back in the zone ready to start. On the days that I forget to do this, there's a noticeable difference in how long it takes me to get started and remind myself where I was up to.

Mindset

I ended the talk on a final thought. It's actually surprisingly easy to change your mindset at a given moment in time. If you're unmotivated or just feeling a bit fed up. Stop, close your eyes, and flick a mental switch. You can choose to be more motivated. You can choose to be less stressed. You can choose to have more energy. It's surprisingly powerful, and if you do this often enough, habits start to form.

LINQPad Giveaway!

linqpad

I didn't Tweet about this beforehand, as I didn't want to give an unfair advantage against the other speakers whose talks ran parallel to mine - but the author of LINQPad very kindly gave me a licence to give away at the talk! I also did a LINQPad giveaway at my 20-minute lighting talk about LINQPad last year at .NET Oxford - but then had the advantage of being able to hook into the Meetup.com RSVP list - in the same way as my PrizeDraw does. So in that talk I copied some of the PrizeDraw code into LINQPad and did the prize draw from LINQPad as a nice little extra LINQPad demo. I obviously couldn't do that this time - so instead I said I'd pick out a Tweet afterwards from the #devprodtalk Twitter hashtag. I did so, and a big contratulations to Richard Peat for winning the LINQPad licence for his Tweet! ...

Q & A

In my practice run-throughs, I had finished in exactly one hour, so wasn't planning on having time for questions. In the actual talk though, I finished with 5 minutes to spare, so did have time for questions before wrapping up.

  • Q: "How much time do you spend per day organising your todo lists?"

  • A: "Hardly any, as it takes seconds to add something to my todo list, and I do it as I go along. I can add tasks on my computer, my mobile, or via voice control if driving. Once you get everything in your todo list, you can add as you go."

  • Q: "What happens if you fall out of the habit?"

  • A: "This is like if you're a gym goer, and go on holiday, then find you're out of the habit when you get back. You just need to be self-aware, and get back into the habit again."

Tool Reference

Whilst they've all been covered throughout this post, I've also listed below all the tools I discussed for quick reference ...

Links to my related blog posts


Please retweet if you enjoyed this post ...

Search


Recent Posts


Featured Posts


.NET Oxford Links