2010-03-15

TDD BootCamp Hokuriku Extra Day - Development Antinews

これは個人的なイベントというか、起きたこととそれの観察記。

そして、BootCamp と日常を重ねて思ったことなど。

大変だ! レガシーコードの修正だ!

TDDBC の翌日は普通に仕事していたのですが、この現場には Camp とは比較にならない劣悪なレガシーコードがゴロゴロしています。

そこに修正の依頼が入りました。自分にじゃないですが。電話口のやりとりを小耳に挟んだので、要求を再確認。

  • 対象はいわゆるMVCフレームワークを利用したWebアプリ
  • 最速でやってくれ(ここがもう「なんだかな」ではあるんだが)
  • 変更を加える必要のあるメソッドはもう見つかっているが、これが一つで140行あってベッタベタ
    • できるだけここはいじりたくない

いやぁ、レガシーだねぇ。

  • どうやら基本的にはブラックリストの考え方で迂回する方法で実現できそうだ
  • なんか censor のない Camp ネタのように見えるな
  • この部分だけ切り出せば圧倒的にテストしやすくなるぜ。ボリューム的にも TDD の導入にモッテコイダ

というわけで、判定処理の class を別個に作るように指示。

実録! これがレガシーな現場だ!

1時間後。

  • 判定処理は class に分かれていた
  • できた class は実際の処理の中に思いっきり組み込まれ、
  • ブラウザで一回一回実行して人間が特定のボタンを一生懸命押して
  • printfデバッグ!

orz orz orz

いや、まぁ。まぁね。TDD でやれとは言わなかったけどね。やったことはあるけど身に付いていない方法を「最速」と言われている仕事で使えとはよー言いません。

  • なぜ判定にミスるのか、一生懸命に目視しているが分からない!
  • けっきょく脇で見ていた自分が原因を発見

何のことはない、単に改行コードが混ざってただけで、実はこれ、自分が Camp でハマったのと同じ(笑) すぐ使える Camp

なんとか動く状態になったので、一応対応完了となった。

レガシーコードにレガシーに対応する方法のここがダメ!

上の流れの中で自分が「こりゃダメだな」と思った点を挙げておく。

実システムは遅い!

まずいちばん気になるのは、フレームワークに載っけて目視チェックする方法は不必要なコードがたくさん動いているので遅い。おまけにブラウザも不必要な機能がたくさん動いているので遅い。つまり、

Feedback までの道のりが遠い。

これが自分が PHPer なのにコマンドラインでテストを回している最大の理由。最小のコードだけを動かして最短で Feedback を得るため、そして自分の手を Terminal から離さず、より良いリズムを作るための手法として自分はコマンドラインでテストを回している。

※ まぁ、自分の環境が劣悪なのもあるとは思いますが。

ブラウザは特に「値」の目視チェックに向かない

目視チェック自体の是非はともかく、sensitive な目視チェックの工程にブラウザは向いていないと思う。なぜなら Web ブラウザは HTML のレンダリング向けのツールであり、ホワイトスペースはいい具合に省略して表示してしまう。

もちろん PHP なら var_dump() などを使うことでクォート文字列が出力されるので、「クォート文字の間に何があるか」を人間が一生懸命読めばチェックは可能。しかし。しかし、次に続く。

目視チェックの精度は決して上がらない

ここまでで、すでに

  1. ブラウザで正しいページを出して
  2. 正しい操作をトレースして
  3. その結果を人間が正しく読み取る

という、極めて高度な操作を行っている。

上のどれをミスっても現象の把握、問題の発見を始めることはできない。

野球に例えるとこれは高度な連係プレーなのだ。野球に興味のある人なら連係プレーが本番で完璧に機能する確率が決して高くないことをよく知っていると思う。上のテストのための操作はそれと同じである。つまり、こうした手動テストは

わざわざテスト工程にミスを自分たちで入れているのと同じ

である。また、成功したとしても、ここまでですでに脳力を浪費している。問題を発見し、デバッグを行うために使える MP が、デバッグ開始時にすでに減っているのだ。しかもこれを何回もくり返していればどんどん MP は減っていく。

疲労である。

上の方法では自動化されたテストよりも人間の疲労が大きい。結果、修正作業の速度は遅くなる。

断言する。遅くなる。

コメントアウト地獄

これは BootCamp のときにも感じたことなんだけど、日頃から TDD に親しんでいる人に比べてそうでない人の方が

コメントアウトを乱発する

傾向にあるように思う。このコメントアウトがまたコードの視認性を悪くする。

テストコードがない目視チェックの場合、当然、プロダクトコードの中でチェック用のコードがコメントアウトされたりインされたりをくり返すので、TDD していない人は

コメントアウトが入っていて当たり前

と思っているように見える。

この傾向はよくないと思う。プロダクトコードの中には、必要なコードと必要なコメントと必要な余白以外ない方がよい。コメントアウトそのものを全面否定する気はないんだけど、やはり気にすべき情報は少なければ少ない方がよいと思う。人間の脳は優秀だから無意識のフィルタリングは十分有効に機能する。しかし、本当の目的以外に力を使っているという事実は変わらない。

JOJOネタの向こうを張って HxH のヒソカの台詞で言えば

「君の敗因は容量(メモリ)の無駄使い」

オレ repos のススメ

上の話とも絡むんだけど、TDD 体質の人の多くはバージョン管理システムやエディタの機能に依存してしまうことの楽さをすでに知っていて、

「不要だよな」と思った瞬間コードをばっさり削っている

と感じた。これは

あとで必要になったら戻せばいいし、戻せる

ことを「身体が」覚えているからなんだろうなと思う。

ここで言うバージョン管理システムは、より柔軟な運用ができる分散バージョン管理システムのことを指すと考えてしまった方がよいように思う。自分も去年から official な repository である svn とは別に、自分用に必ず git か hg を併用するようにしている。この方法は多少の混乱は生むけど、

svn の commit をきれいに保ちつつオレ repos で好きなようにコードを蹂躙できる

ので

「自分の作業に対する不安」が減る

ことに繋がり、とてもよいと思う。

CVS や svn 一本だと、例え branch でもあまり変な commit を作るわけにいかないというプレッシャーが残ってしまう。このプレッシャーをオレ repos で解消すると、よりコード変更に自信を持って取り組むことができる。目先の面倒が多少あっても、最終的に

自信を持って取り組めるかどうか

が、いちばん大事なんじゃないかと最近よく思う。

当たり前の話だけど不安やプレッシャーは能力の発揮を妨げる。これはアスリートたちだけの問題じゃない。我々の日常の小さな作業においても同様に、不安やプレッシャーを取り除くことが大事なんだ。


以下完全に余談。

「git は速いから」という理由を挙げている記事を目にするけど、必ずしもすべての操作において git の方が svn より速いわけではないことには注意しておいた方がいいと思う。特にリポジトリがでかいとかディスクが遅い(ネットワーク越しとか)ケースでは、branch の操作は git の方が速いけど日常的な diff 出しは svn の方が速い、ということも起きる。日常的な操作が遅いとリズムが悪くなってしまう。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm