Coding Katas for practicing the refactoring of legacy code

mezoid picture mezoid · Sep 16, 2009 · Viewed 15k times · Source

I've gotten quite interested in coding katas in recent months. I believe they are a great way to hone my programming skills and improve the quality of the code I write on the job.

There are numerous places where Katas can be found. like..

http://codekata.pragprog.com/

http://schuchert.wikispaces.com/Katas

http://www.codingdojo.org/

I've found these to be excellent repositories of Katas... my attempts at some of them have been been immensely rewarding.

However, I feel that all the Kata's I've seen so far have one short coming. None of them seem to allow me to practice refactoring bad code. It's great learning how to write clean code the first time around...but in my current job, I don't have too many opportunities to write new code. Rather I'm often battling against legacy code and trying to figure out how to refactor modules, eliminate dependencies, and reduce coupling.

As such, I'm on the look out for a couple Katas that I can use to hone my skills of refactoring legacy code and turning it into clean code.

Does anyone know of any that already exist? I know I get a lot of practice at it while I'm at work...but I'd like to hone my skills to the point where I'm able to quickly see how to break apart dependencies and separate concerns in classes that do far too much.

Answer

Ryan picture Ryan · Sep 25, 2009

I don't know of a site that catalogs them directly, but one strategy that I've used on occasion is this:

  1. Find an old, small, unmaintained open source project on sourceforge
  2. Download it, get it to compile/build/run
  3. Read the documentation, get a feel for the code
  4. Use the techniques in Working Effectively with Legacy Code to get a piece of it under test
  5. Refactor that piece, perhaps fixing bugs and adding features along the way
  6. Repeat steps 4 through 6

When you find a part that was especially challenging, throw away your work and repeat it a couple times to reinforce your skills.

This doesn't just practice refactoring, but other skills like code reading, testing, and dealing with build processes.

The hardest problem is finding a project that you're interested enough in to keep working in. The last one I worked on was a python library for genetic programming, and the current one I'm working on is a IRC library for Java.