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.

Comments

Popular posts from this blog

Converting a Large AngularJS Application to TypeScript Part 2

In part 1 I was able to take an Angular controller written in JavaScript and convert it to a TypeScript file while doing very little to change the code. In this post I am going to explore transitioning that same controller to actually use the features provided in TypeScript. This is how I left off my controller:
declare var angular: any; (function () { 'use strict'; var controller: any = function($scope){ ... } angular .module('app') .controller('controller', controller); controller.$inject = ["$scope"]; })();
While performing the translation from JavaScript to TypeScript, I would make sure at every step that the functionality I expected still worked, so if anything I did broke the system I would change it back and try again with another approach. Also if something seemed like it worked too easily, I would break it on purpose to make sure I wasn't getting a false result through browser caching a previously working fil…

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') …

Gamify TDD

I like it when things that would not normally be associated with games add concepts from games as a way to incentives you to accomplish things. Why simply go for a run if you can have an app that will track you and give you a gold star if you do better than you did the last time? Why go to the coffee shop that only gives you coffee if the other one will give you points that you can redeem for free drinks eventually?

I was recently introduced to CodeSchool, an online training system similar to PluralSight, it has video courses and challenges you can take to prove that you retained what the video taught. CodeSchool also adds badges and tracks to your learning, so as you complete a video and its challenges you get a badge. Complete a collection of courses within a specific discipline and you become a master of that discipline.

Some of these incentives are not tangible and really don't mean much in the real world, but they tend to work for me. If I start working towards a large goal a…