| This struck a nerve. I've been on both sides of this war: the test evangelist fighting for coverage and the pragmatist shipping to beat a deadline. After 20+ years in software, the truth is painfully obvious: testing is the greatest productivity hack that everyone keeps "postponing until next sprint." The author gets the psychology exactly right. We overestimate the initial cost and drastically undervalue the compound returns. What they call "Time Technical Debt" is the perfect description for that sinking feeling when you're working on a mature codebase with spotty test coverage. The most insightful point is how testing fundamentally changes your design for the better. When you have to make something testable, you're forced to: - Think about clear interfaces - Handle edge cases explicitly - Create clean separation of concerns - Build proper startup/shutdown sequences These aren't "testing best practices," they're just good engineering. Testing is simply the pressure that forces you to do it right. My experience: if your system is hard to test, it's probably hard to reason about, hard to maintain, and hard to extend. The difficulty in testing is a symptom, not the disease. At my last company, we built a graph of when outages occurred versus test coverage by service. The correlation was so obvious it became our most effective tool for convincing management to allocate time for testing. |
For stuff like core libraries or say compilers, sure, unit tests are great. But for the levels above I'm leaning towards integration tests first, and then possibly add unit tests if needed.
After all, you can't not have integration tests. No matter how perfect your Lego bricks are, you can still assemble them together the wrong way around.