Skip to main content

The importance of iteration

Red, Green, Refactor is the mantra for Test Driven Development.  When I started out with Unit Tests the idea of creating tests to make sure that a function behaved properly was easy to understand, but the rest of the cycle didn't really sink in until later.

Red, making a failing test, is important to the TDD approach. When practicing TDD, if you start out by creating a test and it passes without the actual code having been written yet, then there is something wrong with your test. By making sure that your test fails first, then you can be sure that whatever changes you make to pass the test will have been valuable changes that were needed to make the function work properly. If you are writing a test against existing code and it passes immediately, then you do not need to make any changes to your code as your are already passing whatever that new test is validating for.

Green, making the test pass, is the obvious part of Unit testing.  You want lots of green in your project. You want to be able to sit back and quickly have tests run across your system and tell you that things are working as intended. You can have Green without practicing the rest of TDD, and there will be some benefit to doing that.

Refactor, modifying working code to be more efficient and more easily changed, is where to true value of TDD lies.  Lets focus on how the refactoring step allows for you to change your code to make it easier to modify in the future because that is where using TDD can really improve development time.  Most of the time, if you need to write a piece of code, you or someone else will need to come back to it again in the future. It will need to be changed or added to in some way. Being able to safely rewrite your code to be as easily modifiable as possible will make it much quicker for that next person to come in and do their work.

Utilizing the Refactor step also allows you as the developer to try out different approaches to the problem. Lets say that you have a large case statement or some nested if else statements. You can hopefully look at that logic and recognize that there is a better approach to solving that problem. Now that you have your tests wrapped around that logic and know that the logic works as intended, you can rewrite that logic using a different approach and know whether or not that rewrite broke anything or not.  Rewriting and improving code will make whatever you are working on better, but it will also help you as a developer improve. Once you rewrite a select statement into something better, you will recognize that same pattern in the future and rather than needing to start out with a select statement, you can jump immediately to the improved code, which you may then be able to further refine through more refactoring.

No matter what you are doing in life, practice and repetition allows you to improve upon your action. The Refactor step of TDD is the best way for developers to practice improving their code. You get to practice on Real code with Real logic. You are actively improving your code base and adding value to your project. And of course, because you have tests around everything, you know that you aren't causing any bugs.


Popular posts from this blog

Converting a Large AngularJS Application to TypeScript Part 1

I work on a project that uses AngularJS heavily. Recently we wondered if using a preprocesser like CoffeeScript or TypeScript for our JavaScript would be beneficial. If our team is going to switch languages, we would need to be able to convert existing code over without much pain and we would have to find enough value in switching that it would be worth the conversion. I had read an article that stated that because TypeScript is a SuperSet of JavaScript, you could convert a plain JavaScript file to TypeScript by changing the extension to .ts and not much else would need to change. I wanted to test out this claim, so I took a file that I was familiar with, an Angular Controller, and tried to convert it to TypeScript to see how much effort it would take and then try to figure out where we would benefit from using TypeScript. This is what the controller JavaScript file looked like to start out with: ( function () { 'use strict' ; angular .module( 'app'

Interns: Taking off the training wheels

My intern team has been working for several weeks now on our new website. We have already completed one deployment to production and are finalizing our second one. We started with a plan to release often adding small bits of functionality as we go and so far that plan has been working really well. We already feel like we have accomplished a lot because we have completed many of our project's requirements and should easily be able to complete the rest giving us time to do even more than just the original requirements. One of the things I have had some difficulty balancing has been how much to lead the interns and how much to let them figure out on their own. In deciding what our team process should be and how we should allocate our time, I think it was important for me to do more leading. I saw some deficiencies in how we were currently working and brought up some ideas for how we could address them. We had moved into spending all our time just working through stories and did not

My idea for Hearthstone to add more deck slots

Recently someone asked the Blizzard developers for more slots for decks in the game Hearthstone. The response was that they are talking about it and looking into it, but no decision has been made yet. One of the concerns over adding deck slots is that it could complicate the UI for Hearthstone and make it more difficult for new players to understand. I have what I think would be a good solution to add more deck slots without increasing the learning curve for the game much if at all. First I would take a look at the current selection screen for starting to play a game. It defaults to showing the decks that are custom built by the player if they have any custom decks, and there is an option to page over to the basic decks. This basic deck screen is perfect for how I would change this process. Instead of having 2 pages of decks, 1 for basic and 1 for custom, you would just see the select a Hero screen. Then once you selected the Hero you wanted, you would see all of the decks that