It’s pretty easy for people who are builders (like myself) to get excited about building some new thing. Building stuff (robots, software libraries, whatever) is rewarding in-and-of itself; for the joy of creation process, for the pride of seeing an idea come to life, for the development of skills, competence and confidence – all super valuable.
It’s easy to carry this into the workplace, but there are some traps for the unwary.
When you’re building for yourself, there is a sense in which it doesn’t matter what you build, so long as you are excited about it.
When you’re building for a business, what you chose to build matters. Here are some heuristics I use to select what to build.
Build things that make the impossible possible (not to make the easy thing easier).
This idea is shamelessly stolen from Jon Blow, an independent game designer. He stated this in the context of programming language design, but in my opinion it’s broadly applicable. One example he gives is
LLVM would be a good example of this. By decoupling programming language from generated binary via a intermediate representation, it made it possible to develop new programming languages without needing to build the whole toolchain; making languages like Rust, Zig and possible (even if they only use LLVM to get started).
At Pneumatica, this philosophy sits underneath our software stack. We have a custom modelling suite that makes it possible to re-use experimental data from different biological experiments when parameterising models, which is built on ideas from systems-theory I’ve been working on for about 10 years now.
If it’s core to your business, build it (otherwise buy > outsource > build).
Part of the proposal for starting a tech business is that you have particular insight into your customers needs that other companies don’t. If there is a product on the market that you can buy that solves their problem, then you’re wrong and have made a strategic mistake.
Nobody has the resources to build everything so one has to make trade somewhere. In my opinion, it’s crucial to have complete ownership and control over the IP base of your business – hence build. If you own it, and have built it, you have the knowledge and capacity to respond to feature requests and bug fixes on a time line you control – not the case if you need to ask a 3rd party to fix issues for your customer.
Similar principal applies if you are selling services, not software. It’s just that your ‘customers’ are internal.
For everything else – especially stuff that doesn’t need to change frequently – buying is usually a better bet, as you pay either a one-off fixed cost, or a small recurring one, and don’t need to allocate precious effort to developing and maintaining peripheral products.
Use time spent – not necessarily pain – as the trigger.
I think this is one of the traps I, like many software people, have hit in the past. There is a part of the product that sucks to work on, and every time you touch it you feel frustrated. However, the fact that it’s a pain is not sufficient reason to focus any significant effort on fixing it. Instead, it’s the tasks that you find having to spend significant time on, be it administration or data-wrangling; anything that requires you to spend time doing low-value work, baby-sitting or repetitive tasks are ideal candidates for building a an automated solution.
Our robotics development fits into this category. Running cell experiments (particular the ones we like to use) is a time-consuming, labor intensive activity. Right now there isn’t a “PCBWAY” for cell biology (i.e. cell experiments full automated and on-demand) so we’re building a small scale one ourselves until someone else comes along with a better solution.
Automate the places where mistakes matter.
I’ve been a strong advocate for continuous testing for quite a while now, motivated by the fact that I know I (and every one else) miss things during code review. Even better is if your automated tests run end-to-end on the real hardware. One of the first things I did when I started at Arkeus was brought in a robust continuous testing policy, which was complicated by the fact that some of Arkeus products at the time needed specific hardware platforms to test the software stack.
It’s super important to get this right with hardware/software systems. “It crashed” is recoverable if you’re building a desktop application, but “it crashed” is harder to stomach if your computer is hanging off the side of an aircraft in flight. Logic bugs in firmware have cost space companies millions of dollars, and even some astronauts lives. For us, getting it wrong means burning out motors and frying electronics due to software mistakes, or contaminating experiments (potienally wasting many weeks of work) due to mistakes in handling biological materials.
The latter is another reason why we’re pushing ahead with robotics as part of our development.
Do “scaling enablers” only when you actually need it.
I think every software person understands this; “don’t duplicate” is drilled into us during university.
It’s always tempting to “make that piece of code a library” to make it reusable – and hence scalable.
Maybe there is part of the experimental process (such as preparing media) that you could probably automate
There is big risk in doing that too early, before there is a case for scaling, as it costs time and effort that are better off spent solving more important problems. It takes experience and/or clear demand to know when that’s the right call. If it is the right call, you probably have already hit it via the first point. I.e. scaling can be impossible without the right tool, motivating the effort to build them.

