Thursday, June 23, 2011

Books every programmer MUST read

Recently at an Object bootcamp at ThoughtWorks, our trainer Dhaval sent a link to "Single Most Influential Book Every Programmer Must Read" on StackOverFlow.

The list is simply beautiful. Thanks a lot Dhaval for pointing to this page.

If you are a programmer, and have any passion for learning, programming and reading, then here is your "oracle". Say a hello to it here.

Saturday, May 14, 2011

The advantages of Refactoring

Lately I have been reading a lot on "Refactoring" and "Agile Development". One of the most notable books on Refactoring is by Martin Fowler (Book Link).

The more I have been reading and practicing, the more convinced I have become of the necessity of continuous refactoring. Here are the list of advantages I am seeing as I refactor code:

  1. Code becomes cleaner, easier to understand and flows as-if though written in English, not in Java.
  2. Large complex methods, or classes get broken into much simpler to understand classes/methods.
  3. This has an advantage that now the same work is done my multiple small classes & methods, rather than big classes and methods. Hence "Merging" code into multiple branches becomes rather simple in comparison. One can easily see the change and its impact, and in most cases merging becomes an "Add" activity, because now one is adding multiple classes to code base, rather than merging lines into big methods. And anyone who has done branch folding/merging understands that adding a class to a branch is way simpler than doing a diff of classes and merging code lines.
  4. An interesting side-effect that happened due to refactoring is in profiling. Using a profiler for performance profiling usually gives method level results. Now, with refactored code, the same functionality is split into multiple methods, so now its much easier to identify the offending piece of code for optimization. Also, with refactoring, since methods are well named, and re-usable.. one good optimization has a bigger impact on other parts of the system.

I think to make your system loosely coupled, stable and 'evolvable'.. combine refactoring with unit testing (or better TDD) .