views:

722

answers:

2

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/cgi-bin/wiki.pl?KataCatalogue

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.

+2  A: 

Could this be what you're looking for?

http://refactormycode.com/

spender
That site is definitely interest...but I don't think it would give me any more practice than what I get at work because each problem is different. I guess what I'm looking for is a Kata that says take this code from point A to point B. It may be that I'll need to write my own set of Katas to see if it is something that would be helpful.
mezoid
It's also possible that a set of legacy code Katas would need to be created for each language. Or maybe a person could just implement a set of requirements without doing TDD and then use TDD to refactor it towards some sort of pattern...
mezoid
+22  A: 

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.

Ryan
+1 very interesting suggestion. Like you said, the tricky thing is finding an appropriate project. I'll give this one a lot of consideration. Perhaps if I, or others, find some that are very useful it could be saved and documented somewhere as a Kata...
mezoid
"Dealing with Legacy Code" - do you mean "Working Effectively with Legacy Code"? http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
TrueWill
Yes, I mean "Working Effectively with Legacy Code". Thanks for the catch!
Ryan