01 January 2013
Software engineering is a very human craft, full of trade-offs. These trade-offs don’t behave in a linear way. The reaction of “if __ is good, do more of it” _is therefore dangerously misguided.
Let’s see this visually:
Software becomes more useful as features are added. However, software becomes useless as it becomes too complicated for its users.
When an application has a small codebase, it is hard to change because it is highly coupled. When an application has a large codebase, it is hard to change because nobody understands the whole system.
The ideal balance is in the middle. Remember, all code is debt.
A common reaction to the trade-off above is to use existing components and tools instead of building your own. However, the time and cost of system integration between components spirals out of control as their number increases.
Pick two. Pick any two.
People want speed, scope, and total control. However, increased scope and control each requires more time. This is a classic trilemma. I call this variation of the Iron Triangle the Silicon Triangle.
Asset | Liability |
---|---|
Commonly used features | Rarely used features |
Normal users | Edge-case users |
System uptime | System complexity |
System scalability | System bottlenecks |
Automation | Manual processes |
Simplicity | Complexity |
Test coverage | Lines of code |
Domain expertise | Ignorance and hubris |
These compromises will affect everything you do. Find your own balance and wisdom. Reflect on your failures and successes. Use that insight to be wiser and thus more effective.
Note: these graphs don’t use real data; they are for illustration purposes.