The Three Costliest Technical Decision Mistakes in Embedded Development

Three costliest decision mistakes in embedded development and how to avoid them
This article summarizes three of the most common fatal mistakes in embedded development: choosing obscure chips solely based on price while ignoring the development ecosystem, lacking software architecture planning at the project's start, and patching instead of refactoring when refactoring is due. All three share the same essence — trading short-term convenience for long-term pain. The author emphasizes that embedded products have extremely high modification costs after shipping, and technical decisions should always be made with a long-term perspective.
Introduction
In embedded development, technical decisions often have far-reaching consequences. A seemingly reasonable choice can evolve into a project nightmare months later. This article summarizes three of the most common and costly decision mistakes in embedded development — all sharing one common trait: saving effort in the short term while paying multiples of the cost in the long run.
Mistake #1: Choosing Chips Based on Price Alone, Ignoring the Development Ecosystem
This is the first pitfall embedded developers are most likely to fall into. During the project planning phase, to control BOM costs, teams choose cheaper, obscure chips while overlooking the maturity of their development ecosystem.

What Is a Chip's "Development Ecosystem"?
A chip's development ecosystem refers to the complete support system formed around a chip, encompassing official SDK quality, third-party library support, community activity, documentation completeness, and supply chain stability. Mainstream chips like the STM32 have dominated the market for so long precisely because they're backed by HAL libraries, the CubeMX toolchain, a massive developer community, and abundant reference designs. In contrast, obscure chips — even those with superior specs on paper — often cause developers to waste enormous amounts of time debugging peripherals and porting protocol stacks due to their weak ecosystem. The "ecosystem value" of a chip is essentially the sum of previous developers' hard-won experience and toolchain investment — all hidden development costs.
How This Manifests
- Scarce documentation: Chip docs are entirely in one language, community discussions are virtually nonexistent, and you can only brute-force your way through problems alone
- Poor SDK quality: The manufacturer's SDK is chaotic, and peripheral drivers are riddled with bugs
- Development timeline explosion: A project that could be completed in one month with a mainstream chip drags on for three months with an obscure one
- Production risks: Even scarier are hard-to-reproduce issues like system freezes during mass production, with no way to trace the root cause
Another common scenario is SDKs that are bloated to accommodate different chip models — once something goes wrong, pinpointing the issue becomes extremely difficult.

The Right Approach to Chip Selection
Chip selection should be a comprehensive evaluation of: price, documentation quality, community activity, SDK maturity, and supply stability. Saving a few cents on material costs might drag out the entire project timeline by multiples — or even ruin the project entirely. A chip's ecosystem value far outweighs its price difference.
Mistake #2: No Software Architecture Planning from the Start
At the beginning of a project, when requirements are simple and features are few, everyone thinks "let's just get it running first." So global variables fly everywhere, complex computations get stuffed into interrupt handlers, and the attitude is "just make it work, we'll clean up later."
Typical Consequences of No Architecture Planning
After getting features working, you never actually have time to optimize. When the client starts adding requirements, you discover that the code is so intertwined that changing one feature breaks another.

The Essence of Layered Architecture in Embedded Software
Layered architecture in embedded software typically includes the Hardware Abstraction Layer (HAL), driver layer, middleware layer, and application layer. This layered approach originates from operating system design, and its core value lies in isolating change: when the hardware platform changes, only the HAL layer needs modification; when business logic adjusts, only the application layer needs updating. Even on resource-constrained MCUs, this layering is entirely feasible — you don't need complex design patterns, just C language features like function pointers and struct encapsulation to achieve clear module boundaries. The essence of architecture planning isn't increasing code volume, but clarifying from the start "who is responsible for what, and who shouldn't touch what."
Common Misconceptions About Embedded Architecture Design
Many people say: "Embedded systems have limited resources — why bother with all that architecture?" This is a classic misconception. Architecture planning doesn't mean using complex design patterns; it means achieving these basics:
- Clear module separation: Hardware layer, application layer, and protocol layer are managed separately, each minding its own business
- Global variable governance: It's not that you can't use them, but their scope must be restricted
- Well-defined interfaces: Modules communicate through clearly defined interfaces
This work takes at most two to three days upfront, but skipping it could mean two to three months of refactoring later. The ROI difference is staggering.
Mistake #3: Patching Instead of Refactoring When Refactoring Is Due
The longer a project is maintained, the harder the code is to modify; the harder it is to modify, the less anyone dares to touch it. Every bug fix means adding another layer of logic on top of existing code, because modifying the original code might break other features.

Technical Debt: The Silent Killer in Embedded Systems
Technical Debt is a concept introduced by Ward Cunningham in 1992 to describe the hidden costs accumulated from suboptimal solutions adopted for short-term delivery. In the embedded domain, technical debt is particularly dangerous: due to limited hardware resources and scarce debugging tools, chaotic code structures often lead to hard-to-reproduce timing issues, memory corruption, and interrupt race conditions. These problems only surface during mass production, making them extremely expensive to fix. More critically, once embedded products ship, OTA update capabilities are limited and the window for live fixes is extremely narrow — making the cost of technical debt far higher than in internet software. Continuous Refactoring is the core method for controlling technical debt. Its essence is continuously improving the internal structure of code without changing its external behavior, making each iteration healthier than the last.
The Vicious Cycle of Technical Debt
Over time, code that was once clean and clear becomes unrecognizable, buried under layers of conditional checks and temporary workarounds. Three months later, even you can't understand it anymore. The longer you delay, the higher the refactoring cost, until refactoring becomes impossible — leaving only two options: start from scratch or struggle to maintain the project while carrying the debt.
The Right Time to Refactor
Refactoring shouldn't be a one-time massive overhaul but rather continuous small improvements. When you notice these signals, it's time to act:
- Adding a simple feature requires changes in multiple places
- Fixing one bug frequently introduces new bugs
- New team members cannot understand the code logic at all
Conclusion: Short-Termism Is the Biggest Enemy of Embedded Technical Decisions
These three pitfalls are fundamentally the same type of problem: trading short-term convenience for long-term pain. Choosing a cheap chip saves on material costs but sacrifices the development timeline. Skipping architecture design saves two or three days but plants the seeds for two or three months of refactoring. Refusing to refactor avoids immediate risk but drives the codebase toward unmaintainability.
Embedded development differs from internet applications — once a product ships, the cost of modification is extremely high. Therefore, technical decisions should be weighed from a long-term perspective. Remember this principle: Every bit of effort invested upfront in doing things right saves tenfold effort in remediation later.
Key Takeaways
- Don't choose chips based on price alone — ecosystem maturity (documentation, SDK, community) has a massive impact on development efficiency
- Software architecture planning only takes two to three days upfront, but lacking it can cost two to three months of refactoring later
- Refusing to refactor when needed traps code in a vicious cycle where more patches make maintenance increasingly difficult
- The common essence of all three mistakes: short-term shortcuts leading to multiples of long-term cost
- Embedded development requires long-term thinking in technical decisions — upfront investment is far less than the cost of later remediation
Related articles
Expert OpinionsThe Lazy Person's Productivity Theory: Why Being 'Lazy' Actually Drives Peak Performance
Explore the engineering philosophy behind 'lazy people are most productive': how constructive laziness drives automation, AI tools amplify efficiency, and systems thinking eliminates wasted effort.
Expert OpinionsOutdoor Coding: You Can Touch Grass AND Build Things
When AI coding assistants free developers from their desks, outdoor coding becomes a real trend. Explore how cloud IDEs, voice coding, and AI tools enable creativity in nature.
When AI Treats Humans as Subagents: Ro…
When AI Treats Humans as Subagents: Role Reversal and Hidden Risks in Human-AI Collaboration
Exploring the paradigm shift where humans become "subagents" in AI Agent architectures. Analyzes human node design in LangChain and AutoGen, and the risks of ceding control and cognitive atrophy.