とある事業の脱レガシー
TRANSCRIPT
時は201x年、数年に渡る大規模リニューアルプロジェクトを経て立ち上がった新サービス。
しかしその正体はなんと、10年前のPHP入門書を読んだプログラマーと、20年間SQL以外書いたことがないDBエンジニアの手による、MVCもバージョン履歴もない動的ページの山だったのです。
たなかひさてる @tanakahisateru
Pinoco developerPHPTAL contributorFirebug translation contributorYii framework userPhpStorm user
フルスタックエンジニア(笑)
古いとわかっているのになぜ置き換えられないのか
• より良い代替物を開発できない
• どうして動いているのかわからない
• 既存の設計が無駄に複雑すぎて、全ての知識を吸い上げきれない
• 作りなおして失敗するよりはそのまま使うほうが安全だ
レガシーシステムの デメリットを明確にする
魔術的なものの多くは次の2つに分類できます:
• 科学で置き換え可能なもの …(a)
• 科学的に考えると実は無駄 …(b)
(a) は本質的に必要(b) が保守工数を圧迫すること = デメリット
例
この変数 $hoge は200行前に if でこれが入るかもしれないし、そうでなければその前の行の初期値で…
ってものすごい検索とスクロールですよね、心折れますね
$hoge = 0; if ($fuga > 100) { $hoge = 1; }
// この間200行
echo $hoge;
例この変数 $hoge は200行前に if でこれが入るかもしれないし、そうでなければその前の行の初期値で…
ってものすごい検索とスクロールですよね、心折れますね
$hoge = $conditionalContext->getHoge();
• なんで200行もステップ解析しなきゃなんないの?
• 目視で見落としない?
• これどう考えても無駄だよね
• 手続きを宣言(AはBである)に変換する!
$hoge = $conditionalContext->getHoge();
「保守プログラマーは複雑な手続きを解析するのが仕事だ」という思い込みの蔓延 = 魔術的概念しかなかった時代の信仰形態、あるいは、これまで信仰を集めてきたものは変えられないという諦め
脱レガシーとは、この組織的な思い込みモードから脱却することである
P氏「ああああーっもう今回改修する機能、実装はぜんぶ作り直します」
B社「え、すごく手間かかるんじゃない?」
P氏「自分、まだ正社員じゃないですよね。てことは工数オーバーしても個人事業主の未請求扱いですよね。B社的には、動作保証さえしてれば、工数リスク関係ないですよね」
<?php reruire __DIR__ . ’/../src/bootstrap.php’; MyApplication::create()->run(MyController::class);
index.php
MyController
MyService
index.phtml
models*
create
access
use
render
<?php require __DIR__ . ’/../src/bootstrap.php’; MyApplication::create()->run( MyController::class, );index.php
view.php
edit.php
<?php require __DIR__ . ’/../src/bootstrap.php’; MyApplication::create()->run( MyController::class, ‘view’ );
<?php require __DIR__ . ’/../src/bootstrap.php’; MyApplication::create()->run( MyController::class, ‘edit’ );
※.htaccessとか書けませんからね
事業会社と受託開発は 違うという読み
売上 → 予算 → 成果 → 売上…
• 運用スタッフが売上を出すITは直接売上を出さない
• ITスタッフに分配される予算は限られる
• 予算と成果のサイクルに「魔術的無駄」があるとすぐに負のスパイラルになる
その後P氏の実装を原型として、徐々に他のフロント機能もB社自身が作るようになりました。
P氏の設計を真似して、他の機能が個別に改修されていきます。
最終的に、その手法はサイト全体でひとつに統一され、フレームワークとなりました。
その頃には、P氏もすっかりB社の社員です。
社内フレームワーク社内フレームワークがすべて悪というわけではない
社内フレームワーク = たしかに技術的負債ではある
重要なことは、その技術的負債が:
• より多くを返済するための借り入れなのか
• 返済よりも利子が高くつく種類のものでないか
を見極めること
レガシーシステムを含んで どうやってテストするのか
• クラスをクラスでテストするPHPUnitでは、そもそもクラスが存在しない…
• アプリケーションサーバーの外から生スクリプトの振る舞いをテストしたい
• Behatもいいんだけど….
• PHP 文法で BDD 風テストできる Codeception がオススメ
git diff [prev tag] --name-status
M config/main.phpM src/hoge/index.phpM src/hoge/js/fuga.jsA web/css/new-style.cssD web/img/tmp.png
それGitでできるよ
P氏「あれ? こっちで変更してないファイル、タイムスタンプ上がってますね」
B社「もしもしA社? 昨日そっちで何かやった?」
A社「あれとこれと... そういえば /inc あたりに...」
B社・P氏「ちょっとまって、それこっちでも使ってる!」
P氏「テストサーバの index_2tmp.php って何ですか」
B社「知らないなぁ、使ってないやつじゃない?」
P氏「じゃあこの index3.php も要らないですね」
B社「それは本番にもあるから使ってるやつ」
• 事業会社は自分のことなので真剣です
• Gitの操作はプログラミング能力とは関係ありません
• チケット管理システムは意味がわかればWebのフォームに文字を書けるだけでOKです
• 問題意識、情報の運用、ソフトウェアの開発プロセスには、本質的な情報の力が出ます
受託開発の会社は、顧客をITの素人だと思ってはいけません。実は自分たちが長けているのは、PHPの文法とかだけだった、なんてことないように!
得られたもの
App
DB
本番 /var/wwwテスト /var/www_test
本番 dbテスト db_test
cron (本番のみ)
WordPress wp_db
WordPress /var/www/blogphpMyAdmin FTP
• Vagrantに移行
• Maicatcherのお手軽版としてFakeSMTPを利用
• 手元でテストしたものの信頼性が格段に向上。
• テストサーバーの取り合いもなくなりました。
ここでVagrant環境とテストサーバーを、随時本番サーバーに似るようメンテし続けたことが後で効いてきます。
ほどなくして、B社内でAWSへの完全移行が決定されるのであった…
B社「自分たちのビジネスのタイミングでサーバ運用したい!」
サーバ環境を変えてもちゃんと動きそうな期待は、テストサーバーとVagrantで十分に積んできました。というわけです
ELB
EC2 (App) RDS
Nginx Apache
EC2 (WordPress)ApacheMySQL
PHP MySQL
SES
これからはこいつらのEBS スナップショットからテスト環境を生成可能
• ハードウェア設備は利権化しやすいポイントです。
• 変える理由に実利がともなわないと、出資者は動きません。経営で重要なのは移行費用を回収できるかです。
• 脱レガシーには、移行コストと先の損得の見積もりを、わかりやすく比較することが重要です。
• 手が空いた優秀な人材は、それを放っておかない会社が数多くある
• 良い人材がいたとき、すぐに採用できる余裕を経営に織り込むこと
• 現場から「この人を採用したい」という声が挙げられるようにすること
その後人事はどうなったかITの会社ではないのに、多くの良いエンジニアを多く採用/契約できた。
• 悪いエンジニアは優秀なエンジニアを歓迎しない
• 良いエンジニアは優秀なエンジニアをひと目で見分けられる
• むしろ良いエンジニアは自分よりも優秀なエンジニアがいたらどんどん呼びこむ
• レガシーの正体は非科学です
• 非科学とは社会的/組織的な迷信です
• 人のメンタルを変えないかぎり、それは表面的な対応でしかありません
• 道具や教本だけに頼ると、脱レガシーだと思って採用した最新手法が、やがて時間とともに、次のレガシー(先代の残した魔術)となります