# People consistently underrate how hard it is to integrate components into a system
[[Hofstadters Law]] is the self-referential rule of thumb that “it always takes longer than you expect, even when you take into account Hoffstadter’s law.” If a system is involved, integration is a major culprit in actualizing the law.
If you’ve ever done software development, you know that even when all the components of a system nominally “work” in isolation, even when there are good interfaces and standards that everybody has followed, the chance that when you hook everything together for the first time the system just works is basically zero. Same thing with people — even if everybody nominally agrees on what needs to happen, somebody needs to spend a lot of time on coordination. And yet, people consistently fall into the trap of thinking “well the parts all exist, it’s just a matter of hooking them together.”
The integration difficulties are exasperated in physical systems when you can’t just edit some code or have a conversation to get two components to work together[^1]. It’s even worse when the systems is unlike anything people have done before and involves unintuitive interfaces.
To illustrate some of the phenomena that pop up during systems integration I’ll reference a derpy spinning-magnet propelled space-robot prototype I built in grad school.

* **Interfaces are rarely perfect.** When I first plugged the wire connectors together and issued the spin command to the motors … nothing happened. It turns out that one of the wires had become dislodged in its housing preventing the circuit from completing.
* **Interfaces are almost always leaky.** The first time I turned the motors on (after fixing the wire problem), the robot almost ripped itself apart. It turns out that the motors were powerful enough that if their voltage went from 0 to the full 12V in one time step, the acceleration was violent enough to damage the rest of the robot. The fix was to go back into software and change “on” to be a gradual voltage ramp. The interface between the software and the motors was leaky because the properties of the motors reached back and affected how the software needed to work.
* **Interfaces are rarely correct on the first go.** I realized that I needed to not only be able to send voltage commands to the motor at each time step, but I also needed to monitor actual current consumption, which required adding additional wires and resistors.
* **Systems often exhibit emergent behavior.** When both motors were turned on at a certain speed, they resonated the orange piece connecting them, causing them to wobble up and down and side to side. This emergent behavior only happened when the entire system was assembled. It’s possible to predict emergent behavior through models and simulations, but *those* take time and the more complex the system, the higher the chances that simulations won’t capture all of the emergent behavior.
All these issues were easily fixed, but they add up — adding weeks to a timeline that was only a few months long. Many of them were embarrassingly rookie mistakes, but interface issues plague even the professionals —[the crash of the $125m Mars Climate Orbiter because of a metric-standard unit mismatch across an interface comes to mind.](https://www.latimes.com/archives/la-xpm-1999-oct-01-mn-17288-story.html). Fixing interface problems or carefully checking everything so they never arise takes time.
At a recent PARPA workshop, a group of experienced technologists were talking about timelines for building a system for building microelectronics entirely different from our current paradigm (the details of which I will leave vague until we publish the technology roadmap). The level of optimism about timelines (from the people who think it’s possible at all) because many of the components basically exist was shocking!
### Related
* [[People consistently overestimate how much can be achieved in five years and underestimate how much can be achieved in 20 years]]
* [[Systems research requires a lot of work that is expensive and uninteresting]]
[^1]: This isn’t to trivialize the difficulty of getting software systems to work together!