そこで柏木氏が、PHPUnitをアップグレードする際に参考にしたのが、Intelの「TickTock Model」だ。
TickTock Modelとは、Intelが採用していたCPUの開発ロードマップモデルだ。「半導体の微細化」と「アーキテクチャのリニューアル」を1年半ごとに進化させることで、市場の急激な変化によるリスクを減らし、確実にCPUをリリースする狙いがある。
柏木氏は、TickTock Modelを参考に、「難問を分割する」「1つのことに注力してうまくやる」ことを考えた。まず、PHPUnitをアップグレードすることは「テストコードを修正すること」と「PHPUnitのバージョンをアップグレードすること」の2つに切り分けて取り組むことにした。さらに、テストコードを修正する際は、前方互換(Forward Compatible)を意識した。最終的なゴールであるPHPUnit 7に向けて、PHPUnit 4で動作するコードが、PHPUnit 5の環境で、PHPUnit 5で動作するコードが、PHPUnit 6の環境で動作するよう、互換レイヤーを作成するなどして対応した。
もし他の開発者が前方互換性を無視したコードを追加した場合は、その都度修正し、前方互換を意識したテストコードの書き方がプロジェクトに浸透してから、PHPUnitのバージョンをアップグレードすることにした。
柏木氏は、テストコードをどのように修正したのか具体例を挙げて説明する。
「例えば、PHPUnit 4からPHPUnit 5へのアップグレードでは、PHPUnit 5から非推奨となるgetMock関数を使わないよう、createMockかgetMockBuilderという別の関数に修正した。ただ、PHPUnit 4ではcreateMock関数が実装されていないため、互換レイヤーを作成し、createMock関数がPHPUnitのライブラリ内に存在するかしないかで実行する関数を変えるようにした。こうした修正をスクリプトによる自動修正も駆使しながら繰り返し行い、全てのテストコードがPHPUnit 4と5で動作するのを確認してから、PHPUnit 5にアップグレードした。これにより、composer.lockをコンフリクトさせずに、テストコード修正を実施でき、他の開発者への影響を最小限にできた」
こうした改善をPHPUnit 5からPHPUnit 6、PHPUnit 6からPHPUnit 7にアップグレードする際も継続し、約5カ月かけてPHPUnit 4からPHPUnit 7にアップグレード。さらに、この経験を基にAmazon Web Services(AWS)のPHP向けSDK「AWS SDK for PHP」や、ログ出力ライブラリ「Monolog」など、PHPUnitをアップグレードしていなかった複数のオープンソースソフトウェア(OSS)に貢献することもできたという。柏木氏は次のように講演を締めくくった。
「今回の作業を含め、自分の仕事を社内で評価してもらい、昇給することもできた。ライブラリのアップグレードでハマったことや、問題解決に至った方法があれは、ぜひブログや勉強会などで共有してほしい。そして、普段利用しているOSSに還元していってもらいたい」
Copyright © ITmedia, Inc. All Rights Reserved.