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.
|Commonly used features||Rarely used features|
|Normal users||Edge-case users|
|System uptime||System complexity|
|System scalability||System bottlenecks|
|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.