SlideShare a Scribd company logo
とある事業の脱レガシー
∼技術的負債を取り戻すプロジェクトの物語∼
時は201x年、数年に渡る大規模リニューアルプロジェ
クトを経て立ち上がった新サービス。
しかしその正体はなんと、10年前のPHP入門書を読
んだプログラマーと、20年間SQL以外書いたことが
ないDBエンジニアの手による、MVCもバージョン履
歴もない動的ページの山だったのです。
そこに偶然現れたある平凡な助っ人PHPエンジニア...
やがて彼は、データセンターにはWebとDBの2サー
バーしか存在しないのに何故かテスト環境があるとい
う、次なる衝撃の事実を知るのでした...
…って導入を考えてたんですが、トリを務めるとか予
想外! ちゃんとしなきゃ…
なんかいろいろ中途半端ですみません
たなかひさてる
@tanakahisateru
Pinoco developer

PHPTAL contributor

Firebug translation contributor

Yii framework user

PhpStorm user
フルスタックエンジニア(笑)
レガシーとは
単に下手なだけのプログラム レガシー
レガシー (Legacy)
1. 遺産,遺贈(財産)
2. 受け継いだもの,遺物
• なぜか置き換えできずに古いまま残されたもの
• まったく役に立たなければ単に捨てられるだけ。何
らかの恩恵があるから存在する
古いとわかっているのになぜ
置き換えられないのか
• より良い代替物を開発できない
• どうして動いているのかわからない
• 既存の設計が無駄に複雑すぎて、全ての知識を吸い
上げきれない
• 作りなおして失敗するよりはそのまま使うほうが安
全だ
魔術的
ブラックボックス
Thanks to http://to-a.ru/
どうやったら
置き換えられるのか
• 再現性のある設計/プロセスに変換する
• 属人化せず、論理的な推論の連続で仕
組みを成り立たせる
• 絡み合うレガシー部分に引きずられず、
一気通貫に進める
科学的
多くのエネルギーが必要
Thanks to http://to-a.ru/
•レガシー = 魔術
•リプレース = 科学
レガシーシステムの
デメリットを明確にする
魔術的なものの多くは次の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();
「保守プログラマーは複雑な手続きを解析するのが仕
事だ」という思い込みの蔓延 = 魔術的概念しかなかっ
た時代の信仰形態、あるいは、これまで信仰を集めて
きたものは変えられないという諦め
脱レガシーとは、この組織的な思い込みモードから脱
却することである
(注: フィクションです)
うっかり「私の経験では」とか言っちゃう
かもしれませんが、これはフィクションで
す。いいですか、フィクションですからね。
全4編
• 第一話 プログラミング
• 第二話 開発プロセス
• 第三話 インフラ
• 最終回 人事
• A社 = 開発/サーバー設備を提供、委託先
• B社 = 事業会社、発注元
• P氏 = とあるPHPer
B社にP氏がジョインしました。
第一話
プログラミング
B社「このまえ依頼したフォームの改修どう?」
P氏「この2000行でいちどもfunctionを見かけてません
ね」
B社「あー、全機能だいたいこの調子で組んであるよ、こ
れ」
index.php
画像はイメージです
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 がオススメ
Behat
Codeception
レガシーコードを
どうやって解析したか
• PhpStorm には Find by usage (変数
/関数使用箇所検索) がある
• PhpStormを開発スタッフ全員分買っ
てもらいました
お買い求めは
こちらのサイトへ
第二話
開発プロセス
B社内で開発する部分が増えてきたので、バージョン
管理にGitを採用しました。
最初にサーバーがなくても、手元で使い始められるの
で導入しやすかったためです。
[重要] かならずGitかMercurialを使って下さい。
未経験者にはSubversionのほうが簡単だろうという
のは、あまり使っていない人がいいかげんなことを
言ってるだけです。だまされないで。
B社「でも枝分かれいっぱいあって難しそう」
P氏「じゃあ枝を作らなければいいんですよ」
しばらく master と pshi と yamada ブランチ(仮名)
固定で運用。
それでも、ありとなしでは雲泥の差。
P氏「コード書けましたテストもOKです」
B社「よーし更新しよう」
P氏「え、それ何やってるんですか」
B社「え、いや、タイムスタンプ見て、FFFTPで変更
したファイルだけを...」
うひゃぁ!
git diff [prev tag] --name-status
M config/main.php

M src/hoge/index.php

M src/hoge/js/fuga.js

A web/css/new-style.css

D web/img/tmp.png
それGitでできるよ
git diff [prev tag] --name-only | git checkout-index
--prefix=./FTPするやつ/ --stdin
それGitでできるよ
タイムスタンプが
いかに信用出来ないか
P氏「あれ? こっちで変更してないファイル、タイム
スタンプ上がってますね」
B社「もしもしA社? 昨日そっちで何かやった?」
A社「あれとこれと... そういえば /inc あたりに...」
B社・P氏「ちょっとまって、それこっちでも使って
る!」
カオス
P氏「テストサーバの index_2tmp.php って何です
か」
B社「知らないなぁ、使ってないやつじゃない?」
P氏「じゃあこの index3.php も要らないですね」
B社「それは本番にもあるから使ってるやつ」
とめどなくカオス
B社「もしもしA社? ひとつお願いしたいことが...」
A社「はい、追加費用のかからないことなら」
B社「たのむからGit使ってください」
form ユーザー企業
to エンジニア
作業するときはかならずチケット(課題)
管理するようにしました。
Gitでは、チケットごとに異なるブラン
チを切ることにしました。
緊急でないかぎり、本番の更新は随時
ではなくまとめてやるようにしました。
• 事業会社は自分のことなので真剣です
• Gitの操作はプログラミング能力とは関係ありません
• チケット管理システムは意味がわかればWebのフォーム
に文字を書けるだけでOKです
• 問題意識、情報の運用、ソフトウェアの開発プロセスに
は、本質的な情報の力が出ます
受託開発の会社は、顧客をITの素人だと思ってはいけません。

実は自分たちが長けているのは、PHPの文法とかだけだった、なんてこ
とないように!
• 特権的な分野で過去のやり方を守るだけ = 魔術
• 新しいやり方から次のやり方を生み出せるもの =
科学
第三話
インフラ
P氏「あれ? testとprodにnslookupしたら同じIPに
なるんですけど...」
B社「そりゃそうさ同じマシンだもん」
P氏「え」
B社「たしか同じのにWordPressも入ってるよ」
期待したもの
App
DB
本番
App
DB
テスト
Blog
開発
得られたもの
App
DB
本番 /var/www
テスト /var/www_test
本番 db
テスト db_test
cron (本番のみ)
WordPress wp_db
WordPress /var/www/blog
phpMyAdmin FTP
やばい
テスト環境だけ AWS に移動しました。
いつでも自由に停止/再起動できるようになりました。
テストが本番に影響する心配もなくなりました。
テストメールが送信されないよう

Mailcatcherを利用しました
B社「うーんうーん」
P氏「どうしましたか」
B社「XAMPPでは動かないのになんでtestで動くの?」
C:¥XAMPP
• Vagrantに移行
• Maicatcherのお手軽版としてFakeSMTPを利用
• 手元でテストしたものの信頼性が格段に向上。
• テストサーバーの取り合いもなくなりました。
ここでVagrant環境とテストサーバーを、随時本番サー
バーに似るようメンテし続けたことが後で効いてきます。
ある日、メディア掲載に大成功し...
アクセス殺到
サーバーが… 死んだ…
23:10 夜運用スタッフ大慌て
帰宅後の社員を巻き込んで飛び交う

深夜の社内チャット
自宅のP氏「SSHが息してないです」
P氏「こうなったらA社のデータセンターに...!」
B社「翌日出勤時間の9:00まで、あそこリスタートで
きる人誰もいないよ」
翌日9:00まで
リスタートできる人誰もいないよ
ほどなくして、B社内でAWSへの完全移行が決定され
るのであった…
B社「自分たちのビジネスのタイミングでサーバ運用
したい!」
サーバ環境を変えてもちゃんと動きそうな期待は、テストサーバーと
Vagrantで十分に積んできました。というわけです
ELB
EC2 (App) RDS
Nginx Apache
EC2 (WordPress)
Apache
MySQL
PHP MySQL
SES
これからはこいつらのEBS
スナップショットからテスト環境を生成可能
• ハードウェア設備は利権化しやすいポイントです。
• 変える理由に実利がともなわないと、出資者は動き
ません。経営で重要なのは移行費用を回収できるか
です。
• 脱レガシーには、移行コストと先の損得の見積もり
を、わかりやすく比較することが重要です。
最終回
人事
ここまでのエピソードで

もっとも重要だったこと = 人事
HOW?
WHY?
どのようにして
P氏を採用したか
• カンファレンス
• 勉強会
• コワーキングスペース
適切な情報が流れているコミュニティに

接点を持つこと
なぜP氏を

採用できたか
• ITによる成長力を信じる社風があること
• ITに頼らずに今の事業を支えている人がいること
• タイミング (←重要)
• 手が空いた優秀な人材は、それを放っておかない会
社が数多くある
• 良い人材がいたとき、すぐに採用できる余裕を経営
に織り込むこと
• 現場から「この人を採用したい」という声が挙げら
れるようにすること
その後人事はどうなったか
ITの会社ではないのに、多くの良いエンジニアを多く
採用/契約できた。
• 悪いエンジニアは優秀なエンジニアを歓迎しない
• 良いエンジニアは優秀なエンジニアをひと目で見分
けられる
• むしろ良いエンジニアは自分よりも優秀なエンジニ
アがいたらどんどん呼びこむ
え、なにこの経営者向けのオチ?
自分が所属してる会社でどうやって脱レガシーするか
聞きたかった?
→ 自分の会社を、人事/社風のレイヤー
で動かすことを考えて下さい
• レガシーの正体は非科学です
• 非科学とは社会的/組織的な迷信です
• 人のメンタルを変えないかぎり、それは表面的な対
応でしかありません
• 道具や教本だけに頼ると、脱レガシーだと思って採
用した最新手法が、やがて時間とともに、次のレガ
シー(先代の残した魔術)となります
• たとえば、Jenkinsのタスク、Chefのレシピ...
• 秘伝のタレに再現性を与える行為 = 脱レガシー
• 学びましょう!
• 学んだことを仕事に持ち帰りましょう!
• そして人に伝え、迷信に頼らないチームにしましょ
う!
• 大変かもしれませんが「やりたい」という気持ちを
エネルギーの源泉として!
ありがとうございました

More Related Content

とある事業の脱レガシー