In Why "Build vs Buy" is the Wrong Question I explained how you should categorise your systems into appropriate "subdomains" (a la Domain-Driven Design), to help better understand whether to build or buy. Core - your business's unique competitive advantage, keep in house and invest. Supporting - "boring" software that exists to serve your core. Because it supports something unique to your…
In big, enterprise IT departments, the question of build vs buy will often come up. A well-intentioned leader will challenge a group: Do we really want our talented (and expensive) engineers building this thing? This doesn't feel like our competitive advantage and there must be something off the shelf we can leverage instead. The intent of the question is good, but it lacks an important nuance.…
Accountability has a weight limit If the AI deletes all your business-critical data, you can't fire the AI . If an AI controlled missile launcher accidentally shoots an ally, you can't send the AI to prison. AI can act, but only humans can be accountable . As a rhetorical device for this post, let's assume that a single engineer in the old days could complete one story a day, but now they can, and…
William Martin forwarded me some written feedback on Learn Go With Tests from Kynan Ware which made my day. I get a lot of friendly feedback from people on the work, but this is one of those where the author has taken the time to explain why they enjoyed the book more specifically. Before reading Learn Go With Tests, I read a Go different book that only had a chapter on the standard library’s…
I made The first commit for Learn Go with Tests ( LGWT ) on the 2nd of March 2018. I was hungover and frustrated at the lack of high-quality test-driven development articles I had seen in the Go community, so I decided to give it a Go. Whilst I understand that GitHub stars don't mean anything , they are still an indicator that the project is well received. I'm not going to engage in false modesty;…
“Inspection to improve quality is too late, ineffective, costly. Quality comes not from inspection, but from the improvement of the production process.” ― W. Edwards Deming, Out of the Crisis Many prescribe shifting QA left, which sounds clever, but it's not very actionable advice, more an aspiration. This post describes concrete things quality assurance engineers can do to help increase quality…
The current state of web application development User expectations of the web are now that you have this super-smooth no-reload experience. Unfortunately, it's an expectation that is usually delivered with single-page applications (SPAs) that rely on libraries and frameworks like React and Angular, which are very specialised tools that can be complicated to work with. A new approach is to put the…
A colleague of mine is venturing into the magical world of Kanban, and one of the essential parts of Kanban is setting a "work-in-progress (WIP) limit". A WIP limit dictates the number of items of work you can have in progress at a time. It dictates your maximum work capacity. In this example, the team can only have 2 items at play at a time. Even if you have a "spare dev", she cannot start a new…
I'm looking for a new software developer/engineering manager role, and this post will summarise me for potential employees. This blog is a fair reflection on my general attitudes towards software development, what's important to me, what I feel works, and what doesn't! My hope is someone will read this and think. Chris's experience, values, and work methods align with what we need, and we should…
Work has been a mixture of a lot of highs and lows. My current place is quite chaotic; there have been leadership changes that bring in different ideas and expectations. Re-orgs often tend to be tough, where you find different people's values and ways of work clashing. Over this year, I've had three different line managers, which has sometimes caused problems. These are all fairly normal growing…
For several years, I had an ambition to speak at some kind of Gopher conference event, especially to talk about testing, which is a subject that is so misunderstood. I've been doing the whole testing thing for quite a long time now, and I still find lots to learn. So, I get irritated when developers of 2 years experience tell me, so full of confidence, that "no-one does TDD in the real world". A…
Poorly managed work in progress (WIP) is a common cause for low performance in development teams. When you have a team juggling too much work, it engages in frequent, expensive context switching, which reduces quality and slows delivery. Your team is working hard, but not delivering. The reduction in quality has a compounding effect on WIP as you will get unexpected bugs, re-work, and outages;…
When working with people who are learning test-driven development (TDD), I have a habit of talking about “the hat we’re wearing”. This comes from reading the book Six Thinking Hats . The premise of the method is that the human brain thinks in a number of distinct ways which can be deliberately challenged, and hence planned for use in a structured way allowing one to develop tactics for thinking…
I was lucky enough to have a second appearance on the Go Time podcast a few weeks back. Riya, Dave, Mat and I talked about TDD. I enjoyed it! Don't think I waffled too much but as Mat said, it felt like we only scratched the surface. You can have a listen here
David Wickes wrote an excellent post called Three Books , which claims that any senior developer should be able to recommend three books to a less experienced colleague. There are various reasons for this and some nuance, so please read the post! I wish I had been lucky enough or had the foresight to read these books when I was 25. I’ve tried to pick three varied books that give you solid…
No matter what my role is within a company, I want to work in an empowered, trusted, team that works together to deliver things we can all be proud of. Old-fashioned “command and control” hierarchies or completely misunderstood applications of agile have caused misery for people working under them, and do not result in successful products. I want to avoid working in those kinds of environments.…
Many people have false starts with test-driven development (TDD). When I discuss it with people, many have some misunderstandings around the method, in particular the motivations behind it. I believe if developers have a better understanding of why to use it, they’ll have a better chance of practicing TDD more effectively and get more value out of it. This posts explores the reasons for using TDD…
I was lucky enough to be invited on to the Go Time podcast to talk about Introducing your team to Go . It was my first time on a podcast and whilst I was a bit nervous and waffled a little, it was a lot of fun because Jon and Mat made me feel very welcome and comfortable. Introducing a new technology to an organisation is not only about technical merit. Even if it were, we’re all terrible…
I recently redesigned this website. It’s not exactly a technical marvel, but I feel that is its strength, and I wish more projects I observed prioritised delivering useful content rather than expensive to implement designs. Most people just want to read some text and look at some pictures and it’s extremely easy to do this if you don’t tie yourself up in flavour-of-the-month technologies. On the…
A lot of developers are very vague when they name their test doubles which makes tests needlessly more difficult to understand. In conversation there’s also often ambiguities which cause problems. I overheard on a podcast: Have you ever used a mock where you make assertions on the call? This post will hopefully illuminate why that sentence is a bit silly. By making a little more effort to be…
This post is a summary of work stuff over the past year which covers my first adventures into Technical leadership and line-management Hiring and building a brand new team I think I've helped build a pretty rad team, so if you're interested in that kind of thing, read on. Rough start After working in one of the most productive, interesting and fun teams I've ever had the pleasure to be a part of,…
If you read the internet, you'll soon realise that a large number of software developers don't understand what CI is and why it's important. It's important to state that continuous integration is not a server . Like the word DevOps, people seem to think these important principals of software engineering are about tools and products. Perhaps misinformed managers think if they buy the right magic…
Stumbled across https://www.websitecarbon.com which measures the carbon footprint of your website. I've always believed in lightweight, efficient websites to deliver content. I firmly believe in not using client-side JS unless absolutely necessary because not everyone has an Internet Telephone Professional Maximum on a 4g connection. I ranted about this and riled up the community about this…
People talk a lot about "lean". Maybe they've read The Machine That Changed The World and were inspired by how lean manufacturing transformed the motor industry. They read how Japanese companies became incredibly efficient and blew the competition out of the water, and then they took that to their software development team. This sounds good, but too often, I feel like people miss the real genius…
This is another follow up post to an episode of Go time I listened to the other day which seems to get my creative juices flowing. It talked about web development in Go and a few things stuck out to me A cautionary tale of generating HTML Early on in the episode it was described how the built-in template library wasn't very expressive and described that the Go Buffalo framework uses Plush…
The Go Time podcast on functional programming (fp) was an interesting listen and as someone who has done many years of both Scala and Go it's a topic I'm interested in. The show talked about the stuff you'd expect, pure functions, immutability, higher-order functions etc. Here's some thoughts I'd like to add on top. Errors Let's have a look at a function written in a few programming languages Go…
This article is for anyone who works in software and wants to keep life simple, less stressful but still keep their employer happy. You'll see how by making simple choices and sticking to well-understood, proven principles you can ship software and not burn everyone out along the way. The business have arbitrarily given your team a year to make a website thing and they've got many grandiose ideas.…
This post is a summary of work stuff over the past year which covers The ways of working, agile and innovation Microservices vs monoliths Kotlin Writing a book (kinda) The team and the way we work I rejoined Springer Nature (SN) August 2017 on the exciting premise of being in an "innovations team" where we would attempt to maybe make scientific publishing a bit better using technology. I was a…
This month I had the opportunity to present some ideas floating around in my head around tests, refactoring and design at the Go London User Group . Here's a link to the video Here are the slides If you're not into videos, here's wordy version of it. Software The promise of software is that it can change. This is why it is called soft ware, it is malleable compared to hardware. A great engineering…
I originally posted this at Dev.to, where you can see some comments This post will very much sound like I want you all to get off my lawn - because I do. How has the web become like this? The other day my partner was browsing the web on her two-year-old Chromebook, it struggled to run a number of sites as they loaded ads, gifs, videos and tons of JavaScript to do absolutely nothing of value. Every…
I originally posted this at Dev.to where lots of people agreed and disagreed. Don't deploy on Friday afternoons! This expression is taken as programmer wisdom but I hate it. I'm going to try and kill it, with words and experience. The motivation behind it is sound. I don't want to spend my Friday nights debugging a production problem either. To me the expressions smacks of unprofessionalism.…
[:fa (take 9 (repeat :la))] This post is aimed at beginners who want to take a look at Clojure , a super-interesting language which is probably quite different to what you’re used to. You will learn some basic concepts and see how to write a Secret Santa assigner because IT’S CHRISTMAS !!!!! :D Assumptions You are somewhat familiar with programming, understand concepts like flow control ( if ,…
When it comes to prioritising work you may find yourself in an environment where it can feel hard to justify playing "technical" stories. These are stories raised by developers and typically cover Raising the quality of the code Fixing technical/architectural debt Addressing edge-cases Making the system easier to operate The usual excuse for not playing this work is that a team should only ever be…
People talk a lot about how to write testable code but testable systems are what you need if you are going to be able to practice continous deployment. Writing testable systems takes practice and can be quite domain specific, but there are some general rules that you can apply. You may encounter resistance to making this extra effort so along with some guidance I will discuss how I justify this…
I was given a fairly mundane task at work and when this happens I try and find ways to make it interesting. I will usually find a way to learn something new to do the task so I can always get something out of the work I do, even if it's dull. I would quite like to get better at using the legendary tools available to me on the command line. I have never felt super confident doing text processing…
Sometimes you may need to test that an asynchronous event has been triggered in your code but you can end up compromising on the quality of your tests when doing so. This post will show one technique to test this behaviour whilst keeping your tests clean and not complicating your production code It's assumed you're familiar with writing tests, interfaces, go routines, channels and select from Go.…
Most property-based test examples you see on the web are contrived scenarios and people can be dismissive of them, claiming that they aren't actually practical. This post will have a simple example applied to one of my projects which will hopefully illustrate their value. This is a follow up to Property-based testing in Go and if you're not familiar with these kind of tests I suggest you read that…
Magic is often used to describe confusing code. Often we cannot explain how something works so magic seems like an apt description. The problem with magic is that it’s an entirely subjective term which can be used as a very annoying stick to hit useful abstractions. An anecdote A while ago I wrote something along the lines of this in Scala. val transformedCollection = collection map transformer…
This posts hopes to illustrate What property based testing is and why it is an important tool to compliment your existing tests How easy it is in Go Your current tests The usual examples illustrating TDD could be described as example based tests; where you write tests by providing example inputs and expected outputs. func TestAddingExample(t *testing.T) { result := add(3, 2) if result != 5 {…
Why do developers whine about doing estimates? All the business wants is just some kind of assurance that their important project will be done by a given date. What’s the big deal? Let’s be clear here, estimates are always wrong That’s not the worst of it. When you lock your development team in a room for a few hours to try and estimate 100 stories you are now suddenly back in the waterfall world.…
The Happy path of writing software is usually the easiest part and coincidentally is the the thing focused on most during estimation. A lack of thought behind error handling can have big consequences on the long term health of a code base. I am going to contrast on the 3 main methods of handling errors that I have come across, exceptions , product types (i.e tuples) and sum types (Try, Either, et…
SpringerLink is the biggest project I’ve been involved with. It was completely different to every other project in terms of scale and complexity. It was my first real introduction to agile software development and writing software that was actually used by lots of people . I learnt a lot of random lessons from working on a system developed by hundreds of people and I thought it was an interesting…
I can’t sell these books well enough, which is why I’m not an author or a salesman. I did really enjoy them, you might too. The Nature of Software Development If you’ve practiced agile software development for a while this will feel like an echo chamber, there’s nothing really new here. But it’s a reassuring echo chamber when things aren’t quite going as well as you’d like. It reminds you how…
What’s rad about writing Go is how the tooling is really well catered to every day software development concerns. I recently did a lunch and learn at Springer on why I think Go is great and did a case-study showing how Go makes it easy to create consistent looking, performant and reliable code. Goal We are going to write a function which calls two APIs, one is the “Hello” service and the other is…
Type systems are great because they protect you from lots of errors at compile time. However, sometimes it feels like it gets in your way and can make your code feel less flexible when you are trying to extend certain types that you may or may not have defined. In dynamically typed languages this is less of a problem because of duck-typing. However, you get no safety here; if you pass in something…
Technical debt is often described on a low level, where developers will take some kind of shortcut in order to deliver a feature quicker; at a cost to future development which must be "paid" sometime. However technical debt can manifest itself in many different ways and one way it has reared it's head on a project I am working on is by unused features. Delivery culture Agile development has many…
Last week Dan and I did a presentation at the Springer offices for the Functional Media meetup about our experiences with Scala. We thought it would be interesting to talk about the mistakes we had made with Scala as we thought that would be more interesting than rehashing a number of other talks about why Scala is or isn't good. You can find the slides here Scala is a very feature rich language…
After nosing through some Scala FP books I have been trying hard to write small and simple functions and then compose them together. This post will show an example of where this has taken some needlessly complex code into something terser and easier to understand. Previously When getting our feet wet with Scala we would more or less still write fairly traditional OO code with some nice functional…
I have been reading the book Javascript Patterns , which is fairly easy reading and I would recommend it if you wish to understand Javascript a little better. This post will describe JS objects, which is something you'll come across when you're writing almost any kind of JS. Objects in Javascript are essentially hash tables of key value pairs. The values can be almost anything; strings, functions,…
A number of my friends are cool enough to take an interest in what I do and even go as far as to want to try and understand it. This post is for my less techy friends to help gain an understanding on how when you type an address in your browser that you get something useful displayed to you. Getting the information to render a page When you tell your web browser to go to a website, an awful lot…