How toxic is your code?

21 November 2008

Update: I have reimplemented the charts in HTML5. See Toxicity reloaded.

If you are somebody who writes code you probably know that moment when you look at some code you didn’t write, or some code you wrote a long time ago, and you think “that doesn’t look good.” Ok, more realistically, you probably think “WTF? I wouldn’t want to touch that with a barge-pole!” It is not even so much about whether the code does what it should do—that takes a bit longer to figure out—or whether the code is too slow. Even if it’s perfectly bug free and performs well, there’s something to the way it’s written. This is part of the internal quality of a software system, something that the users and development managers can’t observe directly; yet, it still affects them because code with poor internal quality is hard to maintain and extend.

Now, as a developer, how do you help managers and business people understand the internal quality of code? They generally want a bit more than “it’s horrible” before they prioritise cleaning up the code over implementing new features that directly deliver business value. Or even: how do you figure out for yourself how bad some code actually is in relation to some other code? These were questions that Chris Brown, Darren Hobbs, and myself were asking ourselves a couple of years ago.

The answer came in the form of a simple bar chart, arguably not the most sophisticated visualisation but a very effective one. And our colleague Ross Pettit had the perfect name for it: The Toxicity Chart. Read on to see what it is and how it’s created.

As usual, let’s start with an example. What follows is the toxicity chart for a version of the Hibernate framework.

Toxicity Chart for Hibernate

In a toxicity chart each bar represents a class and the height of the bar shows the toxicity score for that class. The score is based on several metrics (more on that below) and the higher the score the more toxic the class. The individual components of the score are coloured. For example, the contribution of the method length metric to the overall score is shown in orange. This makes it possible to see at a glance not only how toxic a codebase is but also how the problems are distributed. If there is a lot of purple and orange in the chart, this indicates long and complex methods, which means that the code is probably hard to test on a unit level. Lastly, classes that score zero points are left off the chart.

The calculation of the toxicity score is based on metrics and thresholds. For example, the method length metric has a threshold of 30. If a class contains a method that is longer it gets points proportional to the length of the method in relation to the threshold, e.g. a method with 45 lines of code would get 1.5 points because its length is 1.5 times the threshold. The score for all elements is added up. So, if a class comprises two methods, one that is 45 lines and another that is 60 lines long, the method length component of the score for the class will be 3.5 points. This means that elements are not just classified as toxic but the score reflects how toxic the element is.

The following table shows the metrics that make up the toxicity score and the corresponding base threshold on which the multipliers are based.

Metric Level Threshold
File Length file 500
Class Fan-Out Complexity class 30
Class Data Abstraction Coupling class 10
Anon Inner Length inner class 35
Method Length method 30
Parameter Number method 6
Cyclomatic Complexity method 10
Nested If Depth statement 3
Nested Try Depth statement 2
Boolean Expression Complexity statement 3
Missing Switch Default statement 1

At this point you might wonder where the selection of metrics and thresholds comes from. Well, we made them up. When we designed the toxicity chart we made a call on what constitutes “toxic” as opposed to just bad. Of course, staying with the method length metric, we normally wouldn’t want to see a 15-line method but that might be disputed. However, we hope that nobody thinks that a 30-line method is acceptable. And in case you’re really uncomfortable with the thresholds, you can obviously change them to build your own toxicity score. We do suggest, though, that you try the values presented here first.

Like many visualisations the creation of the toxicity chart falls into two steps: data acquisition and rendering.

Step 1: For Java projects Checkstyle is the easiest way to get the metrics. The score table above easily translates into a Checkstyle configuration file, which, by the way, is included in the Zip archive attached to this page. Assuming this file is named “metrics.xml” Checkstyle can be invoked like this:

java -jar checkstyle.jar -c metrics.xml -r <source_dir> -f xml -o toxicity.xml

Afterwards, the file “toxicity.xml” contains a list of all components for the toxicity score in an XML format.

Similar tools for other languages should be able to create similar output. It is not a huge problem if the output is somewhat different as it’s always possible to change step 2 to handle different input formats.

Step 2: What is required next is to read the data from XML, aggregate it on a per-class level, and then render the bar chart. Microsoft Excel is good at the latter two but it needs a bit of help to read the XML file. This help comes in the form of a small piece of VBA code. The attached Excel workbook contains a sheet to load the data, an “Open XML” button backed by said VBA code, a pivot table to do the aggregation, and the chart based on the table. So, step 2, really is to open the Excel workbook and load the XML file. That’s all.

Now, if you know me you know that I’ve been working with Macs for a very long time. So, naturally, I’d like to use Excel on the Mac but, alas, in its current version it does not support VBA anymore. So, unfortunately, it’s VMWare Fusion for this one.

This Zip archive contains everything needed to create a toxicity chart for Java. The spreadsheet can be adapted to read input file formats created by tools for different languages; just edit the VBA behind the “Data” sheet.

Update: I have reimplemented the charts in HTML5. See Toxicity reloaded.

23 comments

  1. Andy MacGilvery

    24 November 2008, 13:50

    When I try to import the xml into the excel worksheet I get a “User-defined type not defined” compile error pointing at code “Dim result As XlXmlImportResult”. Is this because I’m using Excel 2002?

  2. erik

    24 November 2008, 15:57

    It looks like XlXmlImportResult is not available to VBA. This could be your version of Excel or it could be a missing Microsoft XML DLL. To be honest, I haven’t seen this problem before.

  3. The Disco Blog » Blog Archive » Meaningful code metrics

    2 December 2008, 23:45

    [...] my friend Erik Doernenburg, posted an interesting entry entitled “How toxic is your code?” in which he suggests utilizing a simple bar chart that measures the toxicity of each class [...]

  4. Schauderhaft » How to Use Key Figures and How Not to Use Key Figures

    16 August 2009, 23:03

    [...] Toxicity [...]

  5. Schauderhaft » Developing for Maintainability

    20 December 2009, 21:06

    [...] linked to maintainability. Cyclomatic Complexity being possibly the best known. I personally prefer toxicity, which is based on Cyclomatic Complexity and a couple of other measures, which contribute to the [...]

  6. Schauderhaft » New Project’s Resolution

    10 January 2010, 21:44

    [...] We gonna improve that. Appart from the knowledge I took from Clean Code I’ll plan to use the toxicity metric as an important tool for [...]

  7. Ian Cartwright

    25 February 2010, 04:34

    Noticed a problem with Integer overflows for very large values of NPath complexity, the CheckStyle team fixed the same overflow issue themselves a while back.

    The fix is pretty simple, just need to change the declaration for ‘values’ from Integer to Long. See below

    Function CalculateScore(n As String) As Variant
    If (n = “score”) Then
    CalculateScore = n
    Else
    Dim values(0 To 2) As Long
    values(0) = -1
    values(1) = -1

  8. Digital Dim Sum » Blog Archive » Dealing with creaky legacy platforms

    4 February 2011, 07:11

    [...] Toxicity, another aggregated metric, has been playing a prominent role in our “system health checks” at ThoughtWorks. Toxicity charts stack multiple static analysis metrics for classes, methods, or components within an application, providing a combined “toxicity” score for each area of the code base (see Figure 2). This gives our clients guidance on where to start looking to fix problems. [...]

  9. Danny Arica

    28 October 2011, 03:13

    What does “stack size” mean?

  10. Erik Doernenburg

    29 October 2011, 02:44

    Danny, what “stack size” are you referring to? That article doesn’t mention it.

  11. What am I thinking about? Visualising your technical debt « On The Job Alliance

    21 November 2011, 22:23

    [...] find out more about these visualisation methods check out Erik’s blog article and his excellent presentation of Software Quality – you know it when you see [...]

  12. Schauderhaft » My Testing and Code Analysis Toolbox

    11 December 2011, 17:42

    [...] CheckStyle: A static code analysis that finds lots of bad practices and can check lots of coding conventions too. Integrates in IDEs and CI server. There are other tools in this area which are worth considering: FindBugs and PMD. You can also use Checkstyle in order to gather simple metrics about your code. [...]

  13. My Testing and Code Analysis Toolbox | The Agile Radar

    12 December 2011, 20:13

    [...] CheckStyle: A static code analysis that finds lots of bad practices and can check lots of coding conventions too. Integrates in IDEs and CI server. There are other tools in this area which are worth considering: FindBugs and PMD. You can also use Checkstyle in order to gather simple metrics about your code. [...]

  14. How Toxic is your Code? | OnTechnicalDebt | The Premiere Technical Debt Online Community

    16 December 2011, 09:25

    [...] Erik Bornenburg has an excellent post on his blog about how you can visualize your code and understand which part of it is part, compared to the rest of the code. This can be extremely useful in helping managers and non-developers understand the internal quality of the code. This post shows us how Toxicity Charts can help you see the technical debt that has been built up in your software: http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/ [...]

  15. Srivatsa Katta

    1 January 2012, 16:23

    Excellent post, we wanted to calculate toxicity on every checkin and monitor how we are improving the legacy code base. The excel sheet import needed some manual effort, so I wrote a small java utility which runs based on the checkstyle report and generates the toxicity (for all the important checks mentioned in this post).

    Yes the report generated is just numbers doesn’t have fancy visual representation of toxicity using graphs and all, but serves the purpose of hooking it up to the continuous integration tool.

    More details : https://github.com/katta/toxicity

    Thanks Erik again for this post which helped me understand how toxicity is calculated.

  16. Metrics based Refactoring for cleaner code

    3 January 2012, 06:53

    [...] Toxicity charts have proved very useful in quantifying the amount of technical debt in a code-base. The magnitude of the debt is quantified by comparing a value against an arbitrary threshold. The toxicity is expressed as a score against the threshold. [...]

  17. Schauderhaft » What Metrics to Use

    1 April 2012, 20:04

    [...] also used toxicity and I still like it. But I also learned from the book Making Software: What Really Works, and Why [...]

  18. Schauderhaft » Plans for My Next Project

    20 May 2012, 16:55

    [...] We gonna improve that. Appart from the knowledge I took from Clean Code I’ll plan to use the toxicity metric as an important tool for [...]

  19. My Testing and Code Analysis Toolbox | Java Code Geeks

    23 October 2012, 04:05

    [...] area which are worth considering: FindBugs and PMD. You can also use Checkstyle in order to gather simple metrics about your code.JDepend: does static code analysis of the dependencies of your code. I use it to write tests [...]

  20. Cezar Coca

    28 November 2012, 09:53

    We found this visualization technique very useful on refactoring projects. In order to integrate it in our Continuous Integration environment we managed to create a Sonar Plugin to collect the violation and render the chart.

    More details can be found here:
    http://docs.codehaus.org/display/SONAR/Toxicity+Chart+Plugin

    The above plugin can be installed from the Sonar Update Center

    Thank you Eric for this inspiring post

  21. Christos Zoulas

    17 January 2014, 17:52

    The code has a bug; the parameter number message has the numbers reversed (first the base value and then the actual). Here’s a fix:

    diff -r 904d4ca1fc4f web/complexity.js
    — a/web/complexity.js Fri Jan 17 11:49:23 2014 -0500
    +++ b/web/complexity.js Fri Jan 17 11:49:47 2014 -0500
    @@ -43,6 +43,8 @@
    var check = $(enode).attr(“source”).split(“.”).slice(-1)[0].replace(/Check$/, “”)
    var matches = $(enode).attr(“message”).replace(/,/g, “”).match(/(\d+)/g)
    var score = (matches && matches.length > 1) ? (matches[0] / matches [1]) : 1;
    + if (check == “ParameterNumber”)
    + score = 1 / score;
    result[check] = (result[check] || 0) + score
    result.total += score;
    });

  22. No Fluff Just Stuff Austin 2014 | Octocado

    22 July 2014, 06:17

    […] Toxicity Chart – How Toxic is your Code? […]

  23. erik dörnenburg » Articles » H...

    13 September 2014, 21:37

    […]   […]

  24. seo

    19 September 2014, 08:48

    Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. Seo Plugin

  25. seo

    19 September 2014, 11:58

    Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. Seo Plugin

  26. jisvmsmcqh

    20 September 2014, 13:39

    erik dörnenburg » Articles » How toxic is your code?
    ajisvmsmcqh
    [url=http://www.g96e9u31y08t01fle0gsn16tvpu9614es.org/]ujisvmsmcqh[/url]
    jisvmsmcqh http://www.g96e9u31y08t01fle0gsn16tvpu9614es.org/

  27. シャネル ダイヤシンプルリング,ソウルシャネルの口紅いくら,シャネルノベルティ マトラッセ トートバッグ 口金ポーチ付き

    20 September 2014, 16:01

    ルイヴィトン トランク 品番,ルイヴィトン リポーター 小型,ルイヴィトンダミエ長財布n61734正規品画像
    コーチバック新作アウトレット,コーチ限定パッチワークトート柄,モバイルケース【コーチ/coach】の新作、マディソンシリーズ<madison> 日本未入荷 モノグラム
    フェンディ中古ズッカバッグ,フェンディムートン,fendi ファーチャーム
    ナイキ ハイパーヴェノム ファントム prem hg-e,ナイキ ウェア サイズ選び,ナイキゴルフ
    セリーヌ 2way バッグ ヴィンテージ,セリーヌ パイソン スリッポン 価格 com,セリーヌ バッグ 底
    ディオール ヘアゴム,dior 眼鏡 売却,ディオール 財布 偽物見分け方
    ビーチサンダル ドルガバ,ヒョウ柄シャツ メンズ,ドルガバ インナー 偽物
    miumiu 2wayハンドバッグ,ミュウミュウ 財布 新潟三越,miumiu ブレスレット 革
    シャネル ダイヤシンプルリング,ソウルシャネルの口紅いくら,シャネルノベルティ マトラッセ トートバッグ 口金ポーチ付き

  28. ダンヒル バッグ メンズ アウトレット,ダンヒル ganzo,新作ダンヒル財布

    20 September 2014, 16:10

    Nike Air Max 1 Essential Sneakers in White & Grey NEW
    トリーバーチ サンダル 福山市取扱店,トリーバーチ 財布激安,トリーバーチバック 年代
    ニューヨーク アウトレット モンクレール モンクレール ワイン モンクレール ホームページ,モンクレール レディース コピー,モンクレール 御殿場 モンクレール ロンt
    kate spade 免税店,ケイトスペード バッグ イエロー,ケイトスペード 結婚式
    キーケース フェンディ レディース,フェンディ ズッカ バッグ 中古 白,fendi selleria zip aroundメンズ
    nike free run 6
    腕時計 グッチ 正規品 平行輸入,gucciiphone立てカバー,長財布 グッチ メンズ お札の入れ方
    ダンヒル バッグ メンズ アウトレット,ダンヒル ganzo,新作ダンヒル財布

  29. モンクレール コラボ ダウン モンクレール 青山 初売り ハワイ 買い物 モンクレール,ファッション メンズ ジャケット モンクレール ニット モンクレール 価格,p モンクレール 古着 や モンク

    20 September 2014, 16:58

    かっこいい ヘビ皮 ベルト 通販,anna sui tシャツ偽物,ドルガバ ボディバッグ
    すyエルメス tシャツ ロゴ,正方形 鞄 エルメス,エルメス偽物見分け方
    air jordan baby
    シャネル マトラッセ 中の色が黒のタイプある,ブランドシャネルアクセサリー,シャネル風ミニ財布
    ディオール 財布 2014 メンズ,クリスチャンディオール キラキラ紙袋,ディオール クロス ゴールド ネックレス
    air max 1 en solde
    ダンヒル70 フリント 交換,ダンヒル 財布 奈良県取扱店,dunhill デニム
    カルティエ オーバーホール 名古屋,カルティエ3連リングとコンビリングどっちが高い?,カルティエ パシャ xl ムーブメント
    ニューバランス 1300cl,ニューバランス 362,ニューバランス トレッキングシューズ レディース
    uggアンスレーブログ,夏に履けるアグ,uggスリッポン手入れ
    トリーバーチ ヤフー偽物,トリーバーチ財布 年齢,トリーバーチ ストライプ
    モンクレール コラボ ダウン モンクレール 青山 初売り ハワイ 買い物 モンクレール,ファッション メンズ ジャケット モンクレール ニット モンクレール 価格,p モンクレール 古着 や モンクレール ダウンベスト チベット モンクレール サイズ 女性

  30. バーバリーブルーレーベル ボーダーワンピース,バーバリー ダレスバッグ,バーバリー サマーニット 白

    20 September 2014, 17:27

    michael jordan for kids
    コンバース 厚底 通販,コンバース 筆箱,マリメッコ コンバース
    ディオール wファスナー,ディオール グロス 277,パリ ディオール ブログ
    nike free run shop online
    ミュウミュウ マドラス 重さ,ミュウミュウ二つ折り財布,イタリアでmiumiuの財布買うといくらぐらい
    アグヒールサンダル,アグ アウトレット 値段,沖縄 免税店 ugg
    チーク型充電器 シャネル,chanelリボン,偽者シャネル髪留め
    バーバリーブルーレーベル ボーダーワンピース,バーバリー ダレスバッグ,バーバリー サマーニット 白

  31. 土岐アウトレット ケイトスペードリクルート 2014,バイカラー ケイトスペード ショルダー,ケイトスペード 母子手帳ケース って

    20 September 2014, 17:47

    ボッテガ財布免税店,今年流行り バッグ,パイソン小銭いれ
    ピコタン エルメス エトープ,エルメススタッズブレスレット代引き,宇都宮 エルメス取扱店
    コーチ リンゴ キーリング,ドンキー瑞江コーチバック,コーチ財布の買取価格
    ティンバーランド フリース,ティンバーランドジャパン,ティンバーランド 格安
    ニューバランス ルームシューズ,神戸 ニューバランス,ニューバランス 580
    木更津アウトレットgucciバック,グッチ 財布 旧作,グッチ ペーパークラフト
    アマゾンドレス,nyctシャツコーデメンズ,iphoneケース 女の人 サングラス
    ugg slippers for men
    高島屋 トリーバーチ セール,axisサイトトリーバーチ二つある,トリーバーチ グレー 財布
    シャネル ステッチ ショルダー,シャネル ノベルティ iphone,シャネル巾着リュックは入出不可能
    ディオール グロス 人気 番号,ディオールイドラ下地,メンズ 靴 ディオール 宇宙
    nike free runs 5.0 mens
    土岐アウトレット ケイトスペードリクルート 2014,バイカラー ケイトスペード ショルダー,ケイトスペード 母子手帳ケース って

  32. 激安へび皮バック,ボッテガヴェネタ 長財布 タグ,韓国 流行り ブレスレット

    20 September 2014, 22:09

    ニューバランスm574クラシック,ニューバランス 574 バーガンディ,ニューバランス 口コミ
    トリーバーチ サングラス 銀座,トリーバーチ 財布 紫 緑,tory burch サンダル西武
    nike frees türkis
    chaussur pas cher nike
    コーチ 60735,阪神2009コーチ,松山コーチ三越財布
    グッチ キャンパス 長財布,グッチ トートバッグ ナイロン ピンク,グッチハートシェイプインターロッキングトート値段
    Nike Free Run 3 Womens
    ナイキ ターミネーター レディース,ナイキ ハイパークール,ナイキ 商品開発
    激安へび皮バック,ボッテガヴェネタ 長財布 タグ,韓国 流行り ブレスレット

  33. 沖縄アウトレット グッチバッグ,グッチ 財布 ウェビング,gucci 锝伙緷锝革緸锞楋浇 銉撱儍銈偒銉°儵

    20 September 2014, 22:57

    ニューバランス 891,ニューバランス スニーカー 画像,ニューバランス バスケットシューズ
    miumiuバッグ チェーン,miumiu 佐野 アメブロ,miumiu風ネイル
    strick uggs
    ブルガリ 香水 買取 名古屋,ブルガリ メンズ プレゼント,bvlgari ボディクリーム 航空
    ティンバーランド 激安,ティンバーランド ローカット,ティンバーランド パーカー
    モンクレール 通販 正規品 p モンクレール ダウンベスト ぶ,フランス製ダウンジャケット モンクレール 取扱店 大阪,伊勢丹 浦和 モンクレール モンクレール 店舗 品揃え
    airmax nike
    dior 壊れた,ディオール 腕時計 クリス,女性 財布 ディオールセール
    バーバリーブルーレーベル 店舗 倉敷,バーバリー ヨドバシカメラ,バーバリー風ネイル
    プラダ リュック 金具なし,プラダドレス,プラダ/prada/レディース/ナイロンショルダーバッグ/アイボリー×ベージュ 斜めがけ
    沖縄アウトレット グッチバッグ,グッチ 財布 ウェビング,gucci 锝伙緷锝革緸锞楋浇 銉撱儍銈偒銉°儵

  34. 二セリーヌ ラゲージボックス,セリーヌ スェード ワンショルダー,セリーヌ風 iphone カバー

    20 September 2014, 23:42

    ケイトスペード黒猫,ケイトスペード口コミ,ケイトスペード メガネ 取扱店
    グッチトートバッグ マザーズバッグ,並行輸入品 安心 グッチ財布,グッチidケース
    メンズビキニブリーフ,黒ポロシャツ ネックレス,馬 ペイント
    シャネル フィニッシュパウダー,シャネルビーズ ステンドグラス,スマホ ポーチ シャネル
    エルメス カレ 2013 スポーツ柄 野球,エルメス ショッキングアリゲーター 財布,エルメス 新作 カーテン
    財布 ミュウミュウ 海外正規品,0539 ミュウミュウ マトラッセ ネロ,ミュウミュウ 手帳カバー リボン
    ダンヒル 財布 博多阪急,ダンヒル ネクタイ 2014年秋冬,ダンヒル 店舗 山形
    ラブクロエ オードパルファム 男ウケ,クロエ2014秋冬バッグ,シーバイクロエ バッグ冬限定
    ugg australia usa reforme immigration
    バーバリーメンズカジュアルバッグ,バーバリー 見分け,バーバリー 西川 セカンドバッグ
    フェンディ ネックレスチャーム,カメレオン fendi,fendi ネックレス ネーム
    コンバース ゼブラ,マリメッコ コンバース,コンバース 革靴
    二セリーヌ ラゲージボックス,セリーヌ スェード ワンショルダー,セリーヌ風 iphone カバー

Leave a comment