Friday, October 10, 2014

Good programming is an optimization problem

When it comes to real world software, I've come to realize that most design decisions seem which make perfect sense at one point in time seem stupid and useless after 'x' amount of time passes. The variable 'x' may differ from product to product, but because of a number of factors which affect businesses, software changes and these changes introduce complexity and the original design is lost or has altered dramatically. The application simply grows larger and larger and not always in the direction that the original design assumed.

The reasons for this situation are many - business requirements change over time, new unexpected features may need to be added to the application which may introduce feature creep and code rot. Eventually, the application will be re-written (when the cost of a rewrite becomes less than the maintenance cost or for other reasons - the system is too complex and it's hard to adapt it to new, incoming requirements).

Good programmers optimize the time between rewrites, they structure and set things up so that the design is general enough to tolerate a large amount of feature creep, that is scales well with respect to features that might come in (yes, even those which cannot be predicted at the beginning). Eventually even their programs will be re-written. But it will be a really long time after which the rewrite will happen.

Optimizing time between rewrites is one of the hardest skills to acquire because it takes a sheer amount of practice and experience designing large and complex systems. Hire programmers who can do that and your company can add value much faster than it adds cost.