狠狠撸
Submit Search
とある事业の脱レカ?シー
?
44 likes
?
8,265 views
Hisateru Tanaka
Follow
1 of 88
Download now
Download to read offline
More Related Content
とある事业の脱レカ?シー
1.
とある事業の脱レガシー ~技術的負債を取り戻すプロジェクトの物語~
2.
時は201x年、数年に渡る大規模リニューアルプロジェ クトを経て立ち上がった新サービス。 しかしその正体はなんと、10年前のPHP入門書を読 んだプログラマーと、20年間SQL以外書いたことが ないDBエンジニアの手による、MVCもバージョン履 歴もない動的ページの山だったのです。
3.
そこに偶然現れたある平凡な助っ人PHPエンジニア... やがて彼は、データセンターにはWebとDBの2サー バーしか存在しないのに何故かテスト環境があるとい う、次なる衝撃の事実を知るのでした...
4.
…って導入を考えてたんですが、トリを務めるとか予 想外! ちゃんとしなきゃ… なんかいろいろ中途半端ですみません
5.
たなかひさてる @tanakahisateru Pinoco developer PHPTAL contributor Firebug
translation contributor Yii framework user PhpStorm user フルスタックエンジニア(笑)
6.
レガシーとは
7.
単に下手なだけのプログラム レガシー
8.
レガシー (Legacy) 1. 遺産,遺贈(財産) 2.
受け継いだもの,遗物
9.
? なぜか置き換えできずに古いまま残されたもの ? まったく役に立たなければ単に捨てられるだけ。何 らかの恩恵があるから存在する
10.
古いとわかっているのになぜ 置き換えられないのか ? より良い代替物を開発できない ? どうして動いているのかわからない ?
既存の設計が無駄に複雑すぎて、全ての知識を吸い 上げきれない ? 作りなおして失敗するよりはそのまま使うほうが安 全だ
11.
魔術的 ブラックボックス
12.
Thanks to http://to-a.ru/
13.
どうやったら 置き換えられるのか ? 再現性のある設計/プロセスに変換する ? 属人化せず、論理的な推論の連続で仕 組みを成り立たせる ?
絡み合うレガシー部分に引きずられず、 一気通貫に進める
14.
科学的 多くのエネルギーが必要
15.
Thanks to http://to-a.ru/
16.
?レガシー = 魔術 ?リプレース
= 科学
17.
レガシーシステムの デメリットを明確にする 魔術的なものの多くは次の2つに分類できます: ? 科学で置き換え可能なもの …(a) ?
科学的に考えると実は無駄 …(b) (a) は本質的に必要? (b) が保守工数を圧迫すること = デメリット
18.
例 この変数 $hoge は200行 前に
if でこれが入るかも しれないし、そうでなけれ ばその前の行の初期値で… ってものすごい検索とスクロールですよ ね、心折れますね $hoge = 0; if ($fuga > 100) { $hoge = 1; } // この間200行 echo $hoge;
19.
例 この変数 $hoge は200行前に
if でこれが入るかも しれないし、そうでなければその前の行の初期値で… ってものすごい検索とスクロールですよね、心折れますね $hoge = $conditionalContext->getHoge();
20.
? なんで200行もステップ解析しなきゃなんないの? ? 目視で見落としない? ?
これどう考えても無駄だよね ? 手続きを宣言(AはBである)に変換する! $hoge = $conditionalContext->getHoge();
21.
「保守プログラマーは複雑な手続きを解析するのが仕 事だ」という思い込みの蔓延 = 魔術的概念しかなかっ た時代の信仰形態、あるいは、これまで信仰を集めて きたものは変えられないという諦め 脱レガシーとは、この組織的な思い込みモードから脱 却することである
22.
(注: フィクションです)
23.
うっかり「私の経験では」とか言っちゃう かもしれませんが、これはフィクションで す。いいですか、フィクションですからね。
24.
全4編 ? 第一話 プログラミング ?
第二話 開発プロセス ? 第三話 インフラ ? 最終回 人事
25.
? A社 =
開発/サーバー設備を提供、委託先 ? B社 = 事業会社、発注元 ? P氏 = とあるPHPer B社にP氏がジョインしました。
26.
第一話 プログラミング
27.
B社「このまえ依頼したフォームの改修どう?」 P氏「この2000行でいちどもfunctionを見かけてません ね」 B社「あー、全機能だいたいこの調子で組んであるよ、こ れ」
28.
index.php 画像はイメージです
29.
P氏「ああああーっもう今回改修する機能、実装はぜ んぶ作り直します」 B社「え、すごく手間かかるんじゃない?」 P氏「自分、まだ正社員じゃないですよね。てことは 工数オーバーしても個人事業主の未請求扱いですよね。 B社的には、動作保証さえしてれば、工数リスク関係 ないですよね」
30.
<?php reruire __DIR__ .
/../src/bootstrap.php ; MyApplication::create()->run(MyController::class); index.php MyController MyService index.phtml models* create access use render
31.
<?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とか書けませんからね
32.
? 今やっておかないと将来の自分にとって都合が悪い ? だからやる ?
この判断が、物语のはじまりとなった…
33.
事業会社と受託開発は 違うという読み 売上 → 予算
→ 成果 → 売上… ? 運用スタッフが売上を出す? ITは直接売上を出さない ? ITスタッフに分配される予算は限られる ? 予算と成果のサイクルに「魔術的無駄」があるとす ぐに負のスパイラルになる
34.
その後P氏の実装を原型として、徐々に他のフロント 機能もB社自身が作るようになりました。 P氏の設計を真似して、他の機能が個別に改修されて いきます。 最終的に、その手法はサイト全体でひとつに統一され、 フレームワークとなりました。 その頃には、P氏もすっかりB社の社員です。
35.
社内フレームワーク 社内フレームワークがすべて悪というわけではない 社内フレームワーク = たしかに技術的負債ではある 重要なことは、その技術的負債が: ?
より多くを返済するための借り入れなのか ? 返済よりも利子が高くつく種類のものでないか を見極めること
36.
レガシーシステムを含んで どうやってテストするのか ? クラスをクラスでテストするPHPUnitでは、そ もそもクラスが存在しない… ? アプリケーションサーバーの外から生スクリプ トの振る舞いをテストしたい ?
Behatもいいんだけど…. ? PHP 文法で BDD 風テストできる Codeception がオススメ
37.
Behat Codeception
38.
レガシーコードを どうやって解析したか ? PhpStorm には
Find by usage (変数 /関数使用箇所検索) がある ? PhpStormを開発スタッフ全員分買っ てもらいました
39.
お買い求めは こちらのサイトへ
40.
第二話 開発プロセス
41.
B社内で開発する部分が増えてきたので、バージョン 管理にGitを採用しました。 最初にサーバーがなくても、手元で使い始められるの で導入しやすかったためです。
42.
[重要] かならずGitかMercurialを使って下さい。 未経験者にはSubversionのほうが簡単だろうという のは、あまり使っていない人がいいかげんなことを 言ってるだけです。だまされないで。
43.
B社「でも枝分かれいっぱいあって難しそう」 P氏「じゃあ枝を作らなければいいんですよ」
44.
しばらく master と
pshi と yamada ブランチ(仮名) 固定で運用。 それでも、ありとなしでは雲泥の差。
45.
P氏「コード書けましたテストもOKです」 B社「よーし更新しよう」 P氏「え、それ何やってるんですか」 B社「え、いや、タイムスタンプ見て、FFFTPで変更 したファイルだけを...」
46.
うひゃぁ!
47.
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でできるよ
48.
git diff [prev
tag] --name-only | git checkout-index --prefix=./FTPするやつ/ --stdin それGitでできるよ
49.
タイムスタンプが いかに信用出来ないか
50.
P氏「あれ? こっちで変更してないファイル、タイム スタンプ上がってますね」 B社「もしもしA社? 昨日そっちで何かやった?」 A社「あれとこれと...
そういえば /inc あたりに...」 B社?P氏「ちょっとまって、それこっちでも使って る!」
51.
カオス
52.
P氏「テストサーバの index_2tmp.php って何です か」 B社「知らないなぁ、使ってないやつじゃない?」 P氏「じゃあこの
index3.php も要らないですね」 B社「それは本番にもあるから使ってるやつ」
53.
とめどなくカオス
54.
B社「もしもしA社? ひとつお願いしたいことが...」 A社「はい、追加費用のかからないことなら」
55.
B社「たのむからGit使ってください」 form ユーザー企業 to エンジニア
56.
作業するときはかならずチケット(課題) 管理するようにしました。 Gitでは、チケットごとに異なるブラン チを切ることにしました。 緊急でないかぎり、本番の更新は随時 ではなくまとめてやるようにしました。
57.
? 事業会社は自分のことなので真剣です ? Gitの操作はプログラミング能力とは関係ありません ?
チケット管理システムは意味がわかればWebのフォーム に文字を書けるだけでOKです ? 問題意識、情報の運用、ソフトウェアの開発プロセスに は、本質的な情報の力が出ます 受託開発の会社は、顧客をITの素人だと思ってはいけません。? 実は自分たちが長けているのは、PHPの文法とかだけだった、なんてこ とないように!
58.
? 特権的な分野で過去のやり方を守るだけ =
魔術 ? 新しいやり方から次のやり方を生み出せるもの = 科学
59.
第三話 インフラ
60.
P氏「あれ? testとprodにnslookupしたら同じIPに なるんですけど...」 B社「そりゃそうさ同じマシンだもん」 P氏「え」 B社「たしか同じのにWordPressも入ってるよ」
61.
期待したもの App DB 本番 App DB テスト Blog 開発
62.
得られたもの App DB 本番 /var/www テスト /var/www_test 本番
db テスト db_test cron (本番のみ) WordPress wp_db WordPress /var/www/blog phpMyAdmin FTP
63.
やばい
64.
テスト環境だけ AWS に移動しました。 いつでも自由に停止/再起動できるようになりました。 テストが本番に影響する心配もなくなりました。
65.
テストメールが送信されないよう? Mailcatcherを利用しました
66.
B社「うーんうーん」 P氏「どうしましたか」 B社「XAMPPでは動かないのになんでtestで動くの?」
67.
C:?XAMPP
68.
? Vagrantに移行 ? Maicatcherのお手軽版としてFakeSMTPを利用 ?
手元でテストしたものの信頼性が格段に向上。 ? テストサーバーの取り合いもなくなりました。 ここでVagrant環境とテストサーバーを、随時本番サー バーに似るようメンテし続けたことが後で効いてきます。
69.
ある日、メディア掲載に大成功し... アクセス殺到
70.
サーバーが… 死んだ…
71.
23:10 夜運用スタッフ大慌て 帰宅後の社員を巻き込んで飛び交う? 深夜の社内チャット 自宅のP氏「SSHが息してないです」
72.
P氏「こうなったらA社のデータセンターに...!」 B社「翌日出勤時間の9:00まで、あそこリスタートで きる人誰もいないよ」
73.
翌日9:00まで リスタートできる人誰もいないよ
74.
ほどなくして、B社内でAWSへの完全移行が決定され るのであった… B社「自分たちのビジネスのタイミングでサーバ運用 したい!」 サーバ環境を変えてもちゃんと動きそうな期待は、テストサーバーと Vagrantで十分に積んできました。というわけです
75.
ELB EC2 (App) RDS Nginx
Apache EC2 (WordPress) Apache MySQL PHP MySQL SES これからはこいつらのEBS スナップショットからテスト環境を生成可能
76.
? ハードウェア設備は利権化しやすいポイントです。 ? 変える理由に実利がともなわないと、出資者は動き ません。経営で重要なのは移行費用を回収できるか です。 ?
脱レガシーには、移行コストと先の損得の見積もり を、わかりやすく比較することが重要です。
77.
最終回 人事
78.
ここまでのエピソードで? もっとも重要だったこと = 人事 HOW? WHY?
79.
どのようにして P氏を採用したか ? カンファレンス ? 勉強会 ?
コワーキングスペース 適切な情報が流れているコミュニティに? 接点を持つこと
80.
なぜP氏を? 採用できたか ? ITによる成長力を信じる社風があること ? ITに頼らずに今の事業を支えている人がいること ?
タイミング (←重要)
81.
? 手が空いた優秀な人材は、それを放っておかない会 社が数多くある ? 良い人材がいたとき、すぐに採用できる余裕を経営 に織り込むこと ?
現場から「この人を採用したい」という声が挙げら れるようにすること
82.
その後人事はどうなったか ITの会社ではないのに、多くの良いエンジニアを多く 採用/契約できた。 ? 悪いエンジニアは優秀なエンジニアを歓迎しない ? 良いエンジニアは優秀なエンジニアをひと目で見分 けられる ?
むしろ良いエンジニアは自分よりも優秀なエンジニ アがいたらどんどん呼びこむ
83.
え、なにこの経営者向けのオチ? 自分が所属してる会社でどうやって脱レガシーするか 聞きたかった?
84.
→ 自分の会社を、人事/社風のレイヤー で動かすことを考えて下さい
85.
? レガシーの正体は非科学です ? 非科学とは社会的/組織的な迷信です ?
人のメンタルを変えないかぎり、それは表面的な対 応でしかありません ? 道具や教本だけに頼ると、脱レガシーだと思って採 用した最新手法が、やがて時間とともに、次のレガ シー(先代の残した魔術)となります
86.
? たとえば、Jenkinsのタスク、Chefのレシピ... ? 秘伝のタレに再現性を与える行為
= 脱レガシー
87.
? 学びましょう! ? 学んだことを仕事に持ち帰りましょう! ?
そして人に伝え、迷信に頼らないチームにしましょ う! ? 大変かもしれませんが「やりたい」という気持ちを エネルギーの源泉として!
88.
ありがとうございました
Download now