It's not news that at the heart of successful software systems (and, frankly, fulfilling software careers) is good design. Also not news is that defining what "good design" really means has been at the heart of many debates, papers, talks, books, discussions, and more for ages. To help, J.B. Rainsberger and Scott Bellware offer some advice to follow until that one true definition comes along.
A Technical Debt Workshop was recently held to improve our industry's understanding of and approach to "technical debt", resulting in some interesting ideas. Among them, changing our perception of the problem to focus on "assets" rather than "debt", an idea now receiving quite a bit of attention by people such as Michael Feathers and Brian Marick.
In his latest blog post, Michael Feathers argued that object oriented programming languages offer some built-in features that facilitate testing and are therefore more recovery friendly than functional languages. Proponents of functional languages expressed strong disagreement with this statement, which provoked a very passionate debate in the blog community.
Alberto Savoia has written a series of four articles describing "characterization testing" - the process of writing unit tests to understand and work with legacy code.
One can't always start from scratch with Agile - sometimes it's used to salvage troubled projects, but Emanuel Gaillot notes that "What's tough about XP is, the more you need it to get your project in a better shape, the harder it is to start doing it." Can a team really afford to switch in the middle of a troubled project? Gaillot recently shared his approach to gradual XP implementation.
Ian Roughley shows how to use logging seams to easily create unobtrusive unit tests around legacy classes, without needing to edit class logic as well as avoiding behavior changes.