Custom for designing, off-the-shelf for shipping
As software engineers, we're paid to write really cool type annotations solve problems. Usually we do this by taking a bunch of different pieces and putting them together to solve the problem. Maybe you mix together a database, a queue, a web framework, and some business logic. Or maybe you design a new storage engine, your own web framework, and a custom cache. It's an engineering question to determine which way is the right way. Should you build custom things? Or should you use off-the-shelf existing pieces? There is no general answer for that, of course. It's dependent on your situation. But there is a pattern that I've found helpful for problem-solving which balances the two approaches. You use as many custom components as you like for designing a solution, and then you use (mostly) off-the-shelf components for what you're going to ship . This technique helps a lot when you aren't sure what the solution will look like. If you try to design a solution using off-the-shelf solutions here, you may run into a couple of problems. First is that it's just a weird solution space, and you have to move in pre-defined step sizes. Second, though, is that you might need a custom component. If you need just one , when you're designing with off-the-shelf components, how will you realize that? And how will you know where that one custom component should go? Besides, how do you even know that any solution is possible? Designing with custom components allows you to get an existence proof [1] that the problem is solvable. You don't need to worry about a good solution, one that's viable. You first need to worry about any solution, as complicated as you like. If you can put together all these custom things you know you could build, then you know that some path exists! Custom components are also really helpful when a part exists but you don't know it exists. You have a problem, you know that it would help you to have something that can solve it. If you haven't solved that problem before, how would you know that a solution does exist? You look at it with custom components, and then that can lead you toward discovering the existing components. After you've designed a solution, you move on to refining the solution. It's ideal if you can build something entirely using off-the-shelf components, because those exist! You don't have to reinvent them, and it's probably cheaper to use them [2] . You can look at each of your custom components and start to ask: why is this custom? Maybe it needs to be, but more often, what it's solving is similar to something someone else has solved. You can look for those related tools and related problems, and find those solutions. Then slide a solution in in place of your component! Occasionally, you will find something where an off-the-shelf component does not exist which is equivalent to your custom one. Then you start to ask, okay, did I solve this problem wrong? I begin at the assumption that I'm not in a totally unique problem space. Then I look at how other people solved this problem, or why they didn't have to . What is it that people are doing that's different here so they don't run into it? And then if you get through that, you may actually have a unique new problem! And you get to keep that custom component in your design. But along the way, you moved a lot of custom work into using off-the-shelf components. Take a break, give yourself a pat on the back, then get back to work making money for corporate overlords at the cost of your health have fun building! Despite doing most of my problem solving in software, the example I want to share is a physical one (which inspired this post). I recently rebuilt my ergonomic setup again, my fifth iteration. This time, it is made of mostly off-the-shelf parts with one custom part. The first version was very much an existence proof that a way existed to use my laptop "portably" with my ergonomic keyboard. It wasn't great, and it didn't solve portability really, but it gestured at the solutions. My second version was the real existence proof, and it went almost fully custom. Off-the-shelf I used a tripod z tilt head, and I made the tray and laptop holder myself (I'm not counting the keyboard or laptop, since I'm building a solution around them). My third version used only custom components, and showed me it's possible! The fourth version used more custom components in a different arrangement. And now my new version? It's mostly off-the-shelf components. I didn't know most of these existed at all when I started on the rig a couple of years ago. Instead of a tray with grooves in it for my keyboard to slide on them, or velcro to hold it down, I got camera equipment! It uses two camera rods, two mounting blocks for those, two z-mount tripod heads, a "magic arm", and a tripod laptop holder tray. And a small custom component: a little wood piece that keeps it balanced, essentially outriggers. It's probably not done, though. There will surely be a sixth iteration. If nothing else, I want to replace the laptop holder. This one is a little too heavy; the rig as a whole is serviceable, but it would be nice to make it a little lighter for travel. So go forth and build things. Feel free to use as many custom components as you want when designing, but then think about if you can do it with off-the-shelf components when you want to be able to ship it. Of course, if my boss is reading this, reverse all the advice. You know I need to build us a new database in Rust. C'mon. My math degree is leaking out. An existence proof shows that something exists, ideally by providing a concrete example or giving a way to produce such a thing. I've found this concept very helpful in designing software, because you can break problem solving into two phases: first prove it's possible, then find a good solution. ↩ Large companies will often end up building their own custom versions of off-the-shelf components, once there is enough scale for it to work out. One example of this is Apple. They used Intel's CPUs for a long time, and then eventually designed their own once it made enough sense. Smaller companies generally cannot make this work. ↩