SlideShare a Scribd company logo
納品のない受託開発を支える
レガシーコードを作らない仕組み
SonicGarden Inc. 西見 公宏
2014/9/27 レガシーコード改善勉強会
西見 公宏 Nishimi Masahiro
As Business Programmer
2014/09/27	
 レガシーコード改善勉強会	
 2
自己紹介
西見 公宏 Masahiro Nishimi
@mah_lab
昭和58年生まれ 東京育ち
2児(双子)の父親です
ブログ
http://blog.mah-lab.com/(毎日更新中)
2014/09/27	
 レガシーコード改善勉強会	
 3
2008年
2011年
2014年
大手SIerに入社
SonicGardenにジョイン
今ここ
会計ERP(Oracle EBS)のアプリSEとして従事
Oracle EBS向けソリューション開発のためオフショア
開発も経験
要素技術はHP/UX、PL/SQL、Oracle Formsなど
新規事業の立ち上げで必要となるWebサービスの開発・
運用を行うビジネスプログラマーとして従事
要素技術はLinux、iOS、Ruby、Railsなど
企業向けCMS、医療系システム、教育事業向けシステムを
開発したり、SonicGardenが展開するサービスの開発に
従事しています
2014/09/27	
 レガシーコード改善勉強会	
 4
最近の活動
「コードレビュー」というテーマで
お話をさせていただく機会が多いです
(外部の社内勉強会にもお邪魔させていただいております)
2014/09/27	
 レガシーコード改善勉強会	
 5
今日お話する内容
1.  レガシーコードの何が問題か?
•  そもそもレガシーコードとは何か
•  レガシーコードがもたらす問題とは何か
•  コードだけの問題なのか?
2.  納品のない受託開発を支える、レガシー
コードを作らない仕組み
•  継続して開発するビジネスモデル
•  技術の共通化でアップデートを容易に
•  同じ基盤を使う人間による相互レビュー
2014/09/27	
 レガシーコード改善勉強会	
 6
1. レガシーコードの何が問題か?
2014/09/27	
 レガシーコード改善勉強会	
 7
そもそもレガシーコードとは何か?
h)ps://flic.kr/p/4GW2c2	
2014/09/27	
 レガシーコード改善勉強会	
 8
そもそもレガシーコードとは何か?
•  誰かから引き継いだコード(つらい)
•  ぐっちゃぐちゃなコード(つらい)
•  仕様が分からないコード(つらい)
レガシーコード改善ガイドによる定義
「レガシーコードとは、単にテストのない
コードです」(はじめに、より抜粋)
2014/09/27	
 レガシーコード改善勉強会	
 9
そもそもレガシーコードとは何か?
何のためにテストコードが必要なのか?
ソフトウェアを変更するため
振る舞いの変更、不具合修正、非機能要件の改善 etc.
2014/09/27	
 レガシーコード改善勉強会	
 10
レガシーコードがもたらす問題とは何か?
h)ps://flic.kr/p/6oUuWj	
2014/09/27	
 レガシーコード改善勉強会	
 11
レガシーコードがもたらす問題とは何か?
ソフトウェアが変更できない
機能追加・変更しづらい
不具合に対応しづらい
パッチをあてづらい
変更コストが
増大する
2014/09/27	
 レガシーコード改善勉強会	
 12
これって、コードだけの問題?
2014/09/27	
 レガシーコード改善勉強会	
 13
インフラも含めて、コード
Data Center
Server
Operation System
Middleware
Production Code
Server
Operation System
Middleware
Production Code
DB ServerLoad Balancer
Infrastructure as Code
2014/09/27	
 レガシーコード改善勉強会	
 14
変更できないインフラがもたらす混沌
サーバ(インスタンス)
メールサーバ
DBサーバ
テスト環境のコード
本番環境のコード Webサーバ
振り分け
共用
ü  OSのバージョンアップができない
ü  ミドルウェアにパッチを当てられない
ü  テスト環境での事故が本番環境に影響
まずインフラを
再構築しなければいけな
いけど、影響範囲が
分からない。。
2014/09/27	
 レガシーコード改善勉強会	
 15
インフラも含めて、コード
ソフトウェアを変更できるように保つ
コードを変更できるように保つ
インフラを変更できるように保つ
ユーザーにとってはコードもインフラも
同じソフトウェアの話。区別はできない。
2014/09/27	
 レガシーコード改善勉強会	
 16
アプリもインフラもレガシーにしないために、
どんな工夫をすれば良いのだろう?
2014/09/27	
 レガシーコード改善勉強会	
 17
2. 納品のない受託開発を支える、
  レガシーコードを作らない仕組み
2014/09/27	
 レガシーコード改善勉強会	
 18
納品のない受託開発とは
好評発売中!
•  要件を一度に決めない
•  少しずつ決めて、少しずつ開発
•  継続して開発し続ける
•  事業が終わるまでソフトウェアを
提供しつづける月額定額の契約
•  顧問としてお客様に関わる
•  つくることが目的ではなく、事業
にコミットするのが目的
(つくらずに実現できる方法も探す)
2014/09/27	
 レガシーコード改善勉強会	
 19
サービス型
(クラウド)
製造納品型
(自社運用)
プ
ロ
デ
ュ
ー
ス
型
︵
汎
用
的
パ
ッ
ケ
ー
ジ
︶
オ
ー
ダ
ー
メ
イ
ド
型
納品のない
受託開発
クラウドベンダー
パッケージベンダー
大手システム
インテグレーター
2014/09/27	
 レガシーコード改善勉強会	
 20
所有から利用へ
Point of Sales Point of Use
品
質
時間
品
質
時間製造業 サービス業
構築
償却
買った時点が最高品質
買った時点が最高で、
そこから陳腐化がはじまるもの
常に使っている時点で最高、
最新のものを利用できる
利用中が最高品質
(常にアップグレード)
すぐに利用開始
継続して利用
2014/09/27	
 レガシーコード改善勉強会	
 21
納品のない受託開発で提供する
ソフトウェアの価値
「顧客のパートナーとして、
ビジネスの成長に必要なソフトウェアを
継続的に改善して提供する」
つまり、お客様にとっての価値は
「何で作られているか」ではなく、
「利用できるソフトウェアか」
2014/09/27	
 レガシーコード改善勉強会	
 22
「利用できるソフトウェア」であるためには、
システムがレガシーなんてとんでもない
https://flic.kr/p/6LgsHA
2014/09/27	
 レガシーコード改善勉強会	
 23
利用中が最高品質を支える
3つのポイント
1. 継続して開発するビジネスモデル
2. 技術の共通化でアップデートを容易に
3. 同じ基盤を使う人間による相互レビュー
2014/09/27	
 レガシーコード改善勉強会	
 24
ポイントその1
継続して開発するビジネスモデル
2014/09/27	
 レガシーコード改善勉強会	
 25
継続して開発するビジネスモデル
変更しやすいコードでなければ
コストがかかる
変更しやすいコードが利益に貢献する
ビジネスモデル自体が
レガシー化の抑止につながっている
2014/09/27	
 レガシーコード改善勉強会	
 26
ポイントその2
技術の共通化でアップデートを容易に
2014/09/27	
 レガシーコード改善勉強会	
 27
技術の共通化でアップデートを容易に
フレームワーク
Ruby on Rails
言語(処理系)
Ruby
インフラ
Heroku /AWS
全てのサービスを共通の仕組みで構築する
2014/09/27	
 レガシーコード改善勉強会	
 28
レガシー化を加速させる大きな原因
C# / .net
Windows Server
PHP / CakePHP
CentOS
Ruby / Rails
Amazon Linux
バラバラなシステム
システムが増えれば増えるほど保守が複雑化
システムを知っている人が辞めると
誰も保守できなくなる
2014/09/27	
 レガシーコード改善勉強会	
 29
レガシー化を加速させる大きな原因
選択した技術が問題なのではなく、
複雑化によって保守コストが増大するのが問題
機能追加・変更しづらい
不具合に対応しづらい
パッチをあてづらい
変更コストが
増大する
2014/09/27	
 レガシーコード改善勉強会	
 30
費用対効果を高くするための技術戦略
LCC(ローコスト・キャリア)に学ぶコスト戦略
•  使用する飛行機の機種を統一することで整備費やパイ
ロットの訓練費を削減
•  搭乗手続きのオンライン化などITを活用した自動化
•  乗務員が機内の清掃なども行い一人何役もこなすことに
よる人件費の削減
LCCのコスト戦略を
受託開発の技術戦略に応用
2014/09/27	
 レガシーコード改善勉強会	
 31
軽量言語の特性
バージョンアップが早く、
バージョンのライフサイクルが短い
Ruby(最新2.1.2) Rails(最新4.1.6)
2008年6月
Ruby1.8.7リリース
2014年7月末
Ruby1.8.7、Ruby1.9.2
セキュリティメンテナンス終了
2010年8月
Ruby1.9.2リリース
2015年2月23日
Ruby1.9.3
セキュリティメンテナンス終了
2011年10月
Ruby1.9.3リリース
2013年6月27日
4.0リリース
3.1メンテナンス停止
Ruby1.9.3以上必須
2010年8月29日
3.0リリース
2011年8月31日
3.1リリース
アセットパイプラインの登場により
バージョンアップのハードル上がる
2012年1月20日
3.2リリース
2014年4月8日
4.1リリース
2013年2月
Ruby2.0.0リリース
2014/09/27	
 レガシーコード改善勉強会	
 32
Ruby、Railsのバージョンアップには
追随しなくてはならない
•  セキュリティメンテナンスが終わるとセキュリ
ティパッチが提供されなくなる
•  放置しすぎるとバージョンアップが難しくなる
(時間によりコスト増大)
少しずつバージョンを上げていくのが重要
開発を継続的に行うビジネスモデルともマッチ
2014/09/27	
 レガシーコード改善勉強会	
 33
もちろん利用しているOS、ミドルウェアも
アップデートし続けなければならない
•  OSのバージョンが古すぎることによって脆弱性対応
パッチが当てられなくなる
•  OSが古くてミドルウェアがバージョンアップできな
い&ミドルウェアへのパッチも当てられなくなる
インフラも共通化することによって
対応コストを減らす
開発を継続的に行うビジネスモデルともマッチ
2014/09/27	
 レガシーコード改善勉強会	
 34
納品のない受託開発のインフラ
Heroku AWS(OpsWorks)
•  PaaSであるHerokuを利用
•  OS、ミドルウェアのバージョン
アップはHerokuに任せる
•  特別なミドルウェアを利用しない/
特別な非機能要件がない場合に利用
•  AWS OpsWorksによってプロビ
ジョニング
•  全ての設定はChefレシピで管理
•  基本となるレシピを統一化すること
でコストを削減
監視システム群
•  死活監視にNagios、性能監視にNewRelic、障害監視にBugsnag、
プロセス監視にmunin、バックアップ監視に自社製ツールを使用。
•  自社製ツールにはサービスの標準的な設定を管理するチェックシートがあり、それ
を埋めてはじめてサービスを一般に向けて稼働させることができるようになる。
2014/09/27	
 レガシーコード改善勉強会	
 35
ポイントその3
同じ基盤を使う人間による相互レビュー
2014/09/27	
 レガシーコード改善勉強会	
 36
基盤を共通化したとしても残る問題
•  基盤を共通化しても、利用している決済
システムなど、サービスによって異なる
部分は存在する。特定の人しか保守でき
ないものはレガシーだ。
•  いくらテストコードがあっても、人に
よって書き方がバラバラで、他の人が理
解できないコードだと意思疎通の道具に
なりえない。
2014/09/27	
 レガシーコード改善勉強会	
 37
そのためにコードやドキュメントの
レビューをしよう、とは思うものの・・・
2014/09/27	
 レガシーコード改善勉強会	
 38
システムの知識が共有されていないと
レビューは成り立たない
共通の知識がゼロ 共通の知識がある
知らないこと
知らないこと
知ってること
(共通の知識)
2014/09/27	
 レガシーコード改善勉強会	
 39	
ここだけ
気にすれば
良い
全く
わからん どや!
コードレビューでレガシーにしない
•  テストは正しい動きを伝える手段だが、正
しく伝わることまでは責任を持たない
•  読まれるまで読めるコードかどうかなんて
分からない
•  人の目が入ることによって、より「読める
コード」になる
読めないコードがレガシー化を加速させる
2014/09/27	
 レガシーコード改善勉強会	
 40
今日お話した内容
1.  レガシーコードの何が問題か?
•  そもそもレガシーコードとは何か
•  レガシーコードがもたらす問題とは何か
•  コードだけの問題なのか?
2.  納品のない受託開発を支える、レガシー
コードを作らない仕組み
•  継続して開発するビジネスモデル
•  技術の共通化でアップデートを容易に
•  同じ基盤を使う人間による相互レビュー
2014/09/27	
 レガシーコード改善勉強会	
 41
まとめ
•  レガシーコードの問題点は変更が困難になるために変
更コストが増大すること。しかし、その問題の解決に
はテストコードがあるだけでは不十分で、インフラも
含めて変更可能になっている必要がある。
•  納品のない受託開発では以下の仕組みでレガシーコー
ド化を防いでいる
•  継続してい開発するビジネスモデル
•  技術の共通化でアップデートを容易に
•  同じ基盤を使う人間による相互レビュー
2014/09/27	
 レガシーコード改善勉強会	
 42	
テクニックではなく、
仕組みでレガシーコードにしない
ソニックガーデンでは
一緒にはたらく仲間を募集しています!
http://www.sonicgarden.jp/jobs
転職を考えている方はコチラ!
2014/09/27	
 レガシーコード改善勉強会	
 43
あなたの会社で「納品のない受託開発」
という新規事業を立ち上げませんか?
http://www.sonicgarden.jp/guild
興味のある方は下記のURLにアクセス!
2014/09/27	
 レガシーコード改善勉強会	
 44
ご静聴ありがとうございました!
2014/09/27	
 レガシーコード改善勉強会	
 45

More Related Content

納品のない受託開発を支える レガシーコードを作らない仕組み