Continuous Refactoring

From WikiContent

(Difference between revisions)
Jump to: navigation, search
(New page: == Ruthless refactoring == Code bases that are not cared for tend to take the same route as a compost heap. They rot. Every line of code that is written starts to age at the moment of its...)
Current revision (18:33, 11 July 2009) (edit) (undo)
 
(9 intermediate revisions not shown.)
Line 1: Line 1:
-
== Ruthless refactoring ==
+
Code bases that are not cared for tend to rot. When a line of code is written it captures the information, knowledge, and skill you had at that moment. As you continue to learn and improve, acquiring new knowledge, many lines of code become less and less appropriate with the passage of time. Although your initial solution solved the problem, you discover better ways to do so.
-
Code bases that are not cared for tend to take the same route as a compost heap. They rot. Every line of code that is written starts to age at the moment of its creation.
+
It is clearly wrong to deny the code the chance to grow with knowledge and abilities.
-
Due to limited information at the time of writing, newly written code is mostly an inappropriate solution for the problem. First you get it to solve the problem.
+
-
Try using TDD for validating that your problem is solved. But you shouldn't stop there. The TDD mantra is red-green-refactor.
+
While reading, maintaining, and writing code you begin to spot pathologies, often referred to as ''code smells''. Do you notice any of the following?
-
So after solving your problem you must look at your code base from a wider perspective. How does it fit with your systems architecture, the programming model principles (e.g. object oriented, functional, etc.), the language idioms.
+
* Duplication, near and far
 +
* Inconsistent or uninformative names
 +
* Long blocks of code
 +
* Unintelligible boolean expressions
 +
* Long sequences of conditionals
 +
* Working in the intestines of other units (objects, modules)
 +
* Objects exposing their internal state
-
Can you see any code smells like
+
When you have the opportunity, try deodorizing the smelly code. Don't rush. Just take small steps. In Martin Fowler's ''Refactoring'' the steps of the refactorings presented are outlined in great detail, so it's easy to follow. I would suggest doing the steps at least once manually to get a feeling for the preconditions and side effects of each refactoring. Thinking about what you're doing is absolutely necessary when refactoring. A small glitch can become a big deal as it may affect a larger part of the code base than anticipated.
-
* duplication (near and far),
+
-
* inconsistent or uninformative names,
+
-
* long pieces of code
+
-
* unintelligible boolean expressions
+
-
* long sequences of conditionals
+
-
* working in the intestines of other units (objects, modules)
+
-
* exposing your internal state
+
-
Your IDE may help you with this. The code intentions they provide offer a good starting point as they are tailored to the language and sometimes offer quick fixes (Dubbed refactoring by example by Kent Beck).
+
Ask for help if your gut feeling does not guide you in the right direction. Pair with a co-worker for the refactoring session. Two pairs of eyes and sets of experience can have a significant effect — especially if one of these is unclouded by the initial implementation approach.
-
If so you have to take action. Try to convert the smelling code to good looking pieces that feel just right. Don't rush. Just take small steps. And keep your tests running so that you can easily see if you broke something. In the Refactoring book the steps of the discussed refactorings are outlined in great detail, so its easy to follow. I would suggest to do the steps at least once manually to get a feeling for the preconditions and side effects of each refactoring. Thinking about what you're doing is absolutely necessary when refactoring. Small glitches can become big deals as you can impact quite a part of the code base.
+
We often have tools we can call on to help us with automatic refactoring. Many IDEs offer an impressive range of refactorings for a variety of languages. They work on the syntactically sound parse tree of your source code, and can often refactor partially defective or unfinished source code. So there is little excuse for not refactoring.
-
Ask for help if your gut feeling does not guide you in the right direction. Take a co-worker and pair with him for the refactoring session. Two sets of eyes and experiences have a really great impact - especially if one of these is unclouded by the initial implementation approach.
+
If you have tests, make sure you keep them running while you are refactoring so that you can easily see if you broke something. If you do not have tests, this may be an opportunity to introduce them for just this reason, and more: The tests give your code an environment to be executed in and validate that the code actually does what is intended, i.e., passes the tests.
-
Another great way to look for the target of your refactoring is design patterns. Although the original work by Martin Fowler et.al. does not rely on design patterns that heavily the additional work of Joshua Kerievsky does a good job in discussing design patterns as goals for refactorings.
+
When refactoring you often encounter an epiphany at some point. This happens when suddenly all puzzle pieces fall into the place where they belong and the sum of your code is bigger than its parts. From that point it is quite easy to take a leap in the development of your system or its architecture.
-
Fortunately in our time we have the tools available to help us with automatic refactoring. Most IDE offer a impressive range of refactorings that work on the syntactically sound parse tree of your source code (and so can even refactoring partially defect or unfinished sourceode). So there is no excuse of not refactoring.
+
Some people say that refactoring is waste in the Lean sense as it doesn't directly contribute to the business value for the customer. Improving the design of the code, however, is not meant for the machine. It is meant for the people who are going to read, understand, maintain, and extend the system. So every minute you invest in refactoring the code to make it more intelligible and comprehensible is time saved for the soul in future that has to deal with it. And the time saved translates to saved costs. When refactoring you learn a lot. I use it quite often as a learning tool when working with unfamiliar codebases. Improving the design also helps spotting bugs and inconsistencies by just seeing them clearly now. Deleting code — a common effect of refactoring — reduces the amount of code that has to be cared for in the future.
-
When refactoring you often encounter an epiphany at some point. This happens when suddenly all puzzle pieces fall into the place where they belong and the sum of your code is bigger than its parts. From that point it is quite easy to take a leap in the development of your system or its architecture.
+
By [[Michael Hunger]]
-
--[[User:Michael Hunger|Michael Hunger]] 18:25, 22 January 2009 (PST)
+
 
 +
This work is licensed under a [http://creativecommons.org/licenses/by/3.0/us/ Creative Commons Attribution 3]
 +
 
 +
Back to [[97 Things Every Programmer Should Know]] home page

Current revision

Code bases that are not cared for tend to rot. When a line of code is written it captures the information, knowledge, and skill you had at that moment. As you continue to learn and improve, acquiring new knowledge, many lines of code become less and less appropriate with the passage of time. Although your initial solution solved the problem, you discover better ways to do so.

It is clearly wrong to deny the code the chance to grow with knowledge and abilities.

While reading, maintaining, and writing code you begin to spot pathologies, often referred to as code smells. Do you notice any of the following?

  • Duplication, near and far
  • Inconsistent or uninformative names
  • Long blocks of code
  • Unintelligible boolean expressions
  • Long sequences of conditionals
  • Working in the intestines of other units (objects, modules)
  • Objects exposing their internal state

When you have the opportunity, try deodorizing the smelly code. Don't rush. Just take small steps. In Martin Fowler's Refactoring the steps of the refactorings presented are outlined in great detail, so it's easy to follow. I would suggest doing the steps at least once manually to get a feeling for the preconditions and side effects of each refactoring. Thinking about what you're doing is absolutely necessary when refactoring. A small glitch can become a big deal as it may affect a larger part of the code base than anticipated.

Ask for help if your gut feeling does not guide you in the right direction. Pair with a co-worker for the refactoring session. Two pairs of eyes and sets of experience can have a significant effect — especially if one of these is unclouded by the initial implementation approach.

We often have tools we can call on to help us with automatic refactoring. Many IDEs offer an impressive range of refactorings for a variety of languages. They work on the syntactically sound parse tree of your source code, and can often refactor partially defective or unfinished source code. So there is little excuse for not refactoring.

If you have tests, make sure you keep them running while you are refactoring so that you can easily see if you broke something. If you do not have tests, this may be an opportunity to introduce them for just this reason, and more: The tests give your code an environment to be executed in and validate that the code actually does what is intended, i.e., passes the tests.

When refactoring you often encounter an epiphany at some point. This happens when suddenly all puzzle pieces fall into the place where they belong and the sum of your code is bigger than its parts. From that point it is quite easy to take a leap in the development of your system or its architecture.

Some people say that refactoring is waste in the Lean sense as it doesn't directly contribute to the business value for the customer. Improving the design of the code, however, is not meant for the machine. It is meant for the people who are going to read, understand, maintain, and extend the system. So every minute you invest in refactoring the code to make it more intelligible and comprehensible is time saved for the soul in future that has to deal with it. And the time saved translates to saved costs. When refactoring you learn a lot. I use it quite often as a learning tool when working with unfamiliar codebases. Improving the design also helps spotting bugs and inconsistencies by just seeing them clearly now. Deleting code — a common effect of refactoring — reduces the amount of code that has to be cared for in the future.

By Michael Hunger

This work is licensed under a Creative Commons Attribution 3

Back to 97 Things Every Programmer Should Know home page

Personal tools