SlideShare a Scribd company logo
1 of 39
Download to read offline
CrowdWorks Inc. Product Div.
クラウドワークス
リファクタリングチーム
「バグハンター」
株式会社 クラウドワークス
CrowdWorks Inc. Product Div.
アジェンダ
1. 弊社紹介
2. 目的・課題
3. Fat Modelの技術的負債
4. 解決方法
4.1. 設計手法
4.2. Fat Modelの弱点
4.3. 構造Before/After
4.4. 分析手法
4.5. 作戦方針
CrowdWorks Inc. Product Div.
1. 弊社紹介
CrowdWorks Inc. Product Div.
サービス紹介
オンラインで直接つながり
マッチング
仕事依頼
業務実行・納品
発注者=クライアント
(企業・個人)
40万社
受注者=クラウドワーカー
(主に個人)
240万人
CrowdWorks Inc. Product Div.
今日話すこと
クラウドワークスの技術的負債に対する取り組み
どんな課題があるか
技術的にどのようにアプローチしているか
をお話します
CrowdWorks Inc. Product Div.
リファクタリングは力学的にどうしても後手後手になりやすい。
そのためリファクタリング専門チームを創設。
チーム人数:2名
意図:既に発生したバグを退治するのは本当のバグ退治ではない。そもそもバグが生ま
れない構造に作り変えるのが真のバグ退治。
リファクタリング専門チーム「バグハンター」
CrowdWorks Inc. Product Div.
2. 目的・課題
CrowdWorks Inc. Product Div.
Crowdworks.jpをリファクタリングして開発生産性を向上し、「持
続可能な成長」への道筋を作る。
リファクタリングの目的
CrowdWorks Inc. Product Div.
解決したい課題
課題 狙う効果
開発生産性 コード変更にあたり、コード分析コストや変更
検討コストが大きく、生産性に課題。
リファクタリングにより理解容易性向上、影響範
囲局所化等を狙い、開発生産性を高める。
エンジニアス
キル
粗悪な設計は質の高い設計導入を阻む。
エンジニアが粗悪な設計を真似、学習する可
能性があり、スキル低下の要因に。
リファクタリングにより質の高い設計の導入を
容易にする。
お手本となるコードによりエンジニアのスキル
向上を狙う。
製品の
信頼性
バグを埋め込みやすい構造。重大インシデ
ント化した場合、製品の信頼性を毀損。
バグを埋め込みにくい構造へ昇華させ、弊社の
持続可能成長性を向上させる。
CrowdWorks Inc. Product Div.
現状の構造的課題
View
Controller
(Skinny Controller)
ActiveRecord
(Fat Model)
Fat Modelが大量に存在する。
Railsのお作法ではFat Modelがある
べき姿なのかも知れない。
しかし巨大化複雑化しすぎていて、生
産性低下を招いている。
CrowdWorks Inc. Product Div.
3. Fat Modelが抱える
技術的負債
CrowdWorks Inc. Product Div.
Fat Modelが抱える技術的負債
技術的負債 説明
関連コードの
散在(低凝集)
本来業務概念的に関連し合うコードが、様々なクラスにあちこちに
散在している。
あるモデルに対する処理が全く別のモデルに書かれているなど、
責務外の実装が多い。
コードの追跡が困難。
コピペコード 同じ制御コードが至るところにコピペしてある。仕様変更に弱く、修
正漏れがあるとバグ化。
意図不明な
コード
何をやらせたいのか意図不明なコード。
理解や修正を妨げる。
CrowdWorks Inc. Product Div.
Fat Modelが抱える技術的負債
技術的負債 説明
うねるコード 条件分岐(if, case-when)やループ制御(each do)などが多重に
ネストしており、遠くから見るとうねっているように見えるコード。複
雑で理解困難。
共通化に反する
Concern
共通処理の定義に便利なConcernに、respond_to?やis_a?な
ど特定クラスの場合の条件分岐が大量に入り込んでいて、共通
化に反している。複雑な上、Concernをincludeしているクラス全
てに変更影響があり触ると危険。
異なるコンテキス
トの混在
ActiveRecordにあらゆるコンテキストの実装が入り込んでいて、
巨大化の主要因になっている。
CrowdWorks Inc. Product Div.
4. 解決方法
CrowdWorks Inc. Product Div.
4.1. 設計方法
CrowdWorks Inc. Product Div.
技術的負債に対抗する知識
これらの書籍は技術的負債を解消する手法に詳しい。
これら書籍記載のノウハウを複合的に用い、技術的負債に挑む。
CrowdWorks Inc. Product Div.
武器となる設計手法
手法 説明 対応負債
ValueObject ある特定の値と、その演算ロジックをカプセル化する設計パ
ターン。業務概念ごとの高凝集化の基本。
消費税、システム利用料など。
・低凝集
・コピペコード
composed_of ActiveRecordのカラムをValueObjectへマッピングする
Railsの構文。カラムを操作するロジックを ValueObjectへ
委譲できる。
同上
ユビキタス言語 チームで概念認識を合わせるために共有する言葉。
対象ドメインの業務概念の認識合わせに用い、ソースコード
上の命名でも表現する。
・意図不明なコード
CrowdWorks Inc. Product Div.
武器となる設計手法
手法 説明 対応負債
FirstClass
Collection
ループ制御(each doなど)をカプセル化するパターン。 ・うねるコード
RuleObject 複雑な条件分岐をカプセル化するパターン。 ・うねるコード
Strategy
(区分Object)
case-whenで処理切替するロジックを単純化するパターン。
case-whenの条件分岐コピペを削減する。
・コピペコード
・うねるコード
・共通化に反する
Concern
境界付けられた
コンテキスト
概念(モデル)は状況(コンテキスト)によって意味や扱いが異
なる場合が多々ある。システムを取り巻くコンテキストを分析
し、各コンテキストに即した特化型ドメインオブジェクトを設計
する。
・異なるコンテキストの混
在
CrowdWorks Inc. Product Div.
4.2. Fat Modelの弱点
CrowdWorks Inc. Product Div.
Fat Modelの弱点
一見難攻不落なFat Modelでも、切り崩しが可能な弱点が存在する。
以下に弱点と、その弱点に対応する設計手法を列挙する。
CrowdWorks Inc. Product Div.
弱点部位
弱点 説明 難易度 用いる設計手法
クラスメソッド そのクラスにいなくても良いメソッド。
結合度が低く、ValueObjectとして容易に引き剥がす
ことが可能。
簡単 ValueObject
privateメソッド 定義クラスからしかコールされないため、依存度は低
め。
依存パラメータをコンストラクタで渡すようにすれば
privateメソッドごとValueObject化可能。
やや簡単 ValueObject
ローカル変数 演算の途中経過を格納している中間成果物であること
多い。
中間成果物を、成果物を得る演算処理とまとめて
ValueObject化する。
やや簡単 ValueObject
CrowdWorks Inc. Product Div.
弱点部位
弱点 説明 難易度 用いる設計手法
うねるコード 条件分岐やループ制御で多重にネストしたコー
ド。
ループ制御はFirstClassCollection化し、条件
分岐はRuleObject化する。
やや簡単 ・FirstClassCollection
・RuleObject
has_many ActiveRecordのhas_manyで関連付けられた
コレクションに対するループ制御を、
FirstClassCollection化する。
やや簡単 ・FirstClassCollection
case-when case-when分岐(特に分岐コピペ)をStrategy
化する
中 ・Strategy
CrowdWorks Inc. Product Div.
弱点部位
弱点 説明 難易度 用いる設計手法
ActiveRecordの
カラム
Railsのcomposed_ofでValueObject化が可
能。ActiveRecord上のロジックを
ValueObjectへ委譲できる。
これができれば理想的には ARから永続化以外
のほとんどのロジックを一掃可能!
難しい composed_of
CrowdWorks Inc. Product Div.
4.3. 構造 Before/After
CrowdWorks Inc. Product Div.
構造Before
View
Controller
(Skinny Controller)
ActiveRecord
(Fat Model)
CrowdWorks Inc. Product Div.
Context B Context C
View
Controller
ActiveRecord
(Skinny Model)
Context A
First Class
Collection
Value
Object
Value
Object
Value
Object
Value
Object
Value
Object
Context D
First Class
Collection
Value
Object
Value
Object
Value
Object
Value
Object
Value
Object
ARには永続化責務のみが残る
ActiveRecordのロジックを
ValueObjectなどに委譲
構造Afterイメージ図
抽出したオブジェクトは
コンテキストごとに分ける
CrowdWorks Inc. Product Div.
4.4 分析手法
CrowdWorks Inc. Product Div.
サイクロマティック複雑度などメトリクス
を解析し、Technical Debt(技術的負
債)の度合いを算出してくれるオンライン
ツール。Githubと連携動作する。
チームKPIとしても利用。
本ツールの公開APIを利用し、特定クラ
スのメトリクスを自動取得するスクリプト
を組み、リファクタの成果を観測してい
る。
メトリクス解析ツール Code Climate Quality
CrowdWorks Inc. Product Div.
縦軸:Remediation points。技術的負債の指標値。公開APIで取得可能。
黄色実線:現在リファクタ中の、負債化してるConcernのひとつ。
Code Climate Quality 最近の計測結果
CrowdWorks Inc. Product Div.
静的型チェックツール Sorbet(ソルベ)
Rubyの型チェックツール。
静的型付言語と同様に型チェックにより
実装正確性、コードトレーサビリティの
正確性を向上させる。
6月にリリースされたばかりで潜在バグ
が多く、クラウドワークスでは試験運用
中。
CrowdWorks Inc. Product Div.
クラスの親やincludeしてるmoduleの
一覧を返す、Ruby標準ライブラリのメ
ソッド。
共通化に失敗しているConcernを何個
もincludeし、複雑怪奇な構造になって
いるクラスの依存関係を調べるのに必
須。
クラス祖先解析API Module#ancestors
CrowdWorks Inc. Product Div.
分析手法 影響スケッチ
書籍「レガシーコード改善ガイド」に記
載の分析手法。
リファクタ対象の影響範囲を知るため
の方法である。
右図のように、クラスやメソッドの依存
関係を図式化し、影響範囲を見える化
する。
CrowdWorks Inc. Product Div.
書籍「レガシーコード改善ガイド」に記載の分析手法。
リファクタ対象の影響範囲を知るための方法である。
リファクタ対象を、テストも書かずにいきなりリファクタしてみる。
どの辺までリファクタしなければならないか影響範囲が分かる。
分析手法 試行リファクタリング
CrowdWorks Inc. Product Div.
4.5. 作戦方針
CrowdWorks Inc. Product Div.
リファクタリングの候補選定には、価値、難度、リスクの3軸で評価する(書
籍「レガシーソフトウェア改善ガイド」)
価値 チームにとってどれほど有益であるか。理解容易性が上がった、
すぐ機能追加できるようになった、バグを埋め込みにくくなった、
など。
難度 リファクタリングの技術的な難しさ。
リスク リファクタリングに失敗した場合、どれほどのリスクが発生する
か。例えばお金周りのデータが壊れるなど。
リファクタリング対象選定基準
CrowdWorks Inc. Product Div.
• 依存度の小さい末端ロジックから攻める
• いきなりコアな部分から着手すると、他からの依存度が高く影響範囲が広すぎて手
に負えなくなる可能性が高い。
• クラスメソッドやprivateメソッドなど他からの依存度が低い末端ロジックから少しずつ
切り崩していくのが基本。
• 集中攻撃
• 五月雨式にあちこちいろんなクラスをリファクタするのではなく、どれか特定のクラス
に絞って集中的にリファクタする。
• 効果①:そのクラスに関する知見が高まる。
• 効果②:思考のスイッチングコストを低減できる。
戦術方針
CrowdWorks Inc. Product Div.
start
候補リストから対象選定
影響範囲分析 &
試行リファクタリング
リファクタで
きそう?
本実装プロセスへ
課題を
メモしておく
yes
no
分析プロセス
CrowdWorks Inc. Product Div.
start
ドメインオブジェクト
設計
テストコード実装
リファクタリング実行
コードレビュー
end
設計before/afterを
QiitaTeamで記事化
本実装プロセス
デプロイ
動作確認
CrowdWorks Inc. Product Div.
ご清聴
ありがとうございました

More Related Content

What's hot

DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)
DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)
DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)Masanori KAMAYAMA
 
Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値
Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値
Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値IoTビジネス共創ラボ
 
DXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティ
DXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティDXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティ
DXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティEiji Sasahara, Ph.D., MBA 笹原英司
 
シンプルに考えよう Zero Trust Network
シンプルに考えよう Zero Trust Networkシンプルに考えよう Zero Trust Network
シンプルに考えよう Zero Trust NetworkRyuki Yoshimatsu
 
The Shift Left Path and OWASP
The Shift Left Path and OWASPThe Shift Left Path and OWASP
The Shift Left Path and OWASPRiotaro OKADA
 
Securitytopics 2020 06
Securitytopics 2020 06Securitytopics 2020 06
Securitytopics 2020 06SQATjp
 
OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016
OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016
OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016OpenID Foundation Japan
 
20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン
20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン
20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオンIoTビジネス共創ラボ
 
IoTセキュリティガイドラインの検討
IoTセキュリティガイドラインの検討IoTセキュリティガイドラインの検討
IoTセキュリティガイドラインの検討Toshihiko Yamakami
 
【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要
【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要
【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要シスコシステムズ合同会社
 
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編Tatsuya (達也) Katsuhara (勝原)
 
ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)
ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)
ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)オラクルエンジニア通信
 
何故 Okta を選んだか? 導入して体感したメリットとは?
何故 Okta を選んだか? 導入して体感したメリットとは?何故 Okta を選んだか? 導入して体感したメリットとは?
何故 Okta を選んだか? 導入して体感したメリットとは?Kyohei Komatsu
 
研修テキスト「IT基礎知識〜クラウド」
研修テキスト「IT基礎知識〜クラウド」研修テキスト「IT基礎知識〜クラウド」
研修テキスト「IT基礎知識〜クラウド」Tomokazu TAKANO
 
とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)
とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)
とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)Tatsuya (達也) Katsuhara (勝原)
 
4 Enemies of DevSecOps 2016
4 Enemies of DevSecOps 20164 Enemies of DevSecOps 2016
4 Enemies of DevSecOps 2016Riotaro OKADA
 

What's hot (18)

DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)
DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)
DevSecOpsのユースケースとDevSecOpsがもたらす未来(20191126)
 
Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値
Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値
Microsoft Azure - 世界最大のクラウドが提供する最先端のテクノロジーとその価値
 
DXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティ
DXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティDXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティ
DXで加速するコンテナ/マイクロサービス/サーバーレス導入とセキュリティ
 
シンプルに考えよう Zero Trust Network
シンプルに考えよう Zero Trust Networkシンプルに考えよう Zero Trust Network
シンプルに考えよう Zero Trust Network
 
The Shift Left Path and OWASP
The Shift Left Path and OWASPThe Shift Left Path and OWASP
The Shift Left Path and OWASP
 
Standardization of Healthcare Cloud Security and Crowdsourcing
Standardization of Healthcare Cloud Security and Crowdsourcing Standardization of Healthcare Cloud Security and Crowdsourcing
Standardization of Healthcare Cloud Security and Crowdsourcing
 
Securitytopics 2020 06
Securitytopics 2020 06Securitytopics 2020 06
Securitytopics 2020 06
 
OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016
OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016
OpenID ConnectとSCIMのエンタープライズ利用ガイドについて - OpenID Foundation Japan EIWG発表会 2016
 
20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン
20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン
20160928_「Cloud Robotics Azure Platform 基本セット」構築ハンズオン
 
IoTセキュリティガイドラインの検討
IoTセキュリティガイドラインの検討IoTセキュリティガイドラインの検討
IoTセキュリティガイドラインの検討
 
【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要
【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要
【Interop Tokyo 2016】 初心者でもわかるCisco SDNの概要
 
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
 
私がなぜZscalerに?
私がなぜZscalerに?私がなぜZscalerに?
私がなぜZscalerに?
 
ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)
ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)
ゼロトラスト、この1年でお客様の4つの気づき ~内部不正、ランサムウェアとの戦い方~ (Oracle Cloudウェビナーシリーズ: 2021年10月6日)
 
何故 Okta を選んだか? 導入して体感したメリットとは?
何故 Okta を選んだか? 導入して体感したメリットとは?何故 Okta を選んだか? 導入して体感したメリットとは?
何故 Okta を選んだか? 導入して体感したメリットとは?
 
研修テキスト「IT基礎知識〜クラウド」
研修テキスト「IT基礎知識〜クラウド」研修テキスト「IT基礎知識〜クラウド」
研修テキスト「IT基礎知識〜クラウド」
 
とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)
とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)
とあるセキュリティ会社のIoTセキュリティチームの日常(ErrataはDescription参照)
 
4 Enemies of DevSecOps 2016
4 Enemies of DevSecOps 20164 Enemies of DevSecOps 2016
4 Enemies of DevSecOps 2016
 

Similar to クラウドワークス プロダクトの持続的開発のためのリファクタリング実践アプローチ

信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf株式会社MonotaRO Tech Team
 
Hybrid Sourcing Service [evelink] by CSK Serviceware
Hybrid Sourcing Service [evelink] by CSK ServicewareHybrid Sourcing Service [evelink] by CSK Serviceware
Hybrid Sourcing Service [evelink] by CSK ServicewareIntelligence, Ltd.
 
ハイブリッドソーシング 「evelink」 ご紹介資料
ハイブリッドソーシング 「evelink」 ご紹介資料ハイブリッドソーシング 「evelink」 ご紹介資料
ハイブリッドソーシング 「evelink」 ご紹介資料CSK Serviceware
 
Vantan shinsuke miyaki_upload
Vantan shinsuke miyaki_uploadVantan shinsuke miyaki_upload
Vantan shinsuke miyaki_uploadShinsuke Miyaki
 
【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)
【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)
【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)Developers Summit
 
クラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Night
クラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Nightクラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Night
クラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Night満徳 関
 
【サービス資料】D4DR_新規事業開発ワークショップ.pdf
【サービス資料】D4DR_新規事業開発ワークショップ.pdf【サービス資料】D4DR_新規事業開発ワークショップ.pdf
【サービス資料】D4DR_新規事業開発ワークショップ.pdfD4DR inc.
 
20140926 azure dr_slideshare
20140926 azure dr_slideshare20140926 azure dr_slideshare
20140926 azure dr_slideshareOsamu Takazoe
 
物体検出コンペティションOpen Imagesに挑む
物体検出コンペティションOpen Imagesに挑む物体検出コンペティションOpen Imagesに挑む
物体検出コンペティションOpen Imagesに挑むHiroto Honda
 
SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方
SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方
SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方SORACOM,INC
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望についてKen Azuma
 
JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk
JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk  JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk
JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk 智治 長沢
 
「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来Yoshihito Kuranuki
 
13_B_5 Who is a architect?
13_B_5 Who is a architect?13_B_5 Who is a architect?
13_B_5 Who is a architect?Atsushi Fukui
 
X dev 20121106
X dev 20121106X dev 20121106
X dev 20121106Ken Azuma
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望についてKen Azuma
 
Woven Work Design concept20200520
Woven Work Design concept20200520Woven Work Design concept20200520
Woven Work Design concept20200520ToruTakagi
 
ITフォーラム2024 AITCセッション(3)
ITフォーラム2024 AITCセッション(3)ITフォーラム2024 AITCセッション(3)
ITフォーラム2024 AITCセッション(3)aitc_jp
 

Similar to クラウドワークス プロダクトの持続的開発のためのリファクタリング実践アプローチ (20)

信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
 
Hybrid Sourcing Service [evelink] by CSK Serviceware
Hybrid Sourcing Service [evelink] by CSK ServicewareHybrid Sourcing Service [evelink] by CSK Serviceware
Hybrid Sourcing Service [evelink] by CSK Serviceware
 
ハイブリッドソーシング 「evelink」 ご紹介資料
ハイブリッドソーシング 「evelink」 ご紹介資料ハイブリッドソーシング 「evelink」 ご紹介資料
ハイブリッドソーシング 「evelink」 ご紹介資料
 
Vantan shinsuke miyaki_upload
Vantan shinsuke miyaki_uploadVantan shinsuke miyaki_upload
Vantan shinsuke miyaki_upload
 
【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)
【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)
【13-B-4】事例から学ぶdev ops実現のためのプラクティス(黒川敦〔日本アイ・ビー・エム〕)
 
クラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Night
クラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Nightクラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Night
クラウド時代のアーキテクチャ ~クラウド時代のプロダクトマネジメントとアーキテクト~ - TechFielders Architect Night
 
【サービス資料】D4DR_新規事業開発ワークショップ.pdf
【サービス資料】D4DR_新規事業開発ワークショップ.pdf【サービス資料】D4DR_新規事業開発ワークショップ.pdf
【サービス資料】D4DR_新規事業開発ワークショップ.pdf
 
20140926 azure dr_slideshare
20140926 azure dr_slideshare20140926 azure dr_slideshare
20140926 azure dr_slideshare
 
物体検出コンペティションOpen Imagesに挑む
物体検出コンペティションOpen Imagesに挑む物体検出コンペティションOpen Imagesに挑む
物体検出コンペティションOpen Imagesに挑む
 
SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方
SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方
SORACOM Technology Camp 2018 ベーシックトラック1 | 事例で整理!IoTソリューションの開発/導入検討の進め方
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
 
JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk
JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk  JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk
JIRA collaboration without walls [JIRAが引き出す現場力] #JiraServiceDesk
 
「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来
 
13_B_5 Who is a architect?
13_B_5 Who is a architect?13_B_5 Who is a architect?
13_B_5 Who is a architect?
 
クラウド検討の進め方
クラウド検討の進め方クラウド検討の進め方
クラウド検討の進め方
 
X dev 20121106
X dev 20121106X dev 20121106
X dev 20121106
 
FortuneWorksのサービス概要
FortuneWorksのサービス概要FortuneWorksのサービス概要
FortuneWorksのサービス概要
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
 
Woven Work Design concept20200520
Woven Work Design concept20200520Woven Work Design concept20200520
Woven Work Design concept20200520
 
ITフォーラム2024 AITCセッション(3)
ITフォーラム2024 AITCセッション(3)ITフォーラム2024 AITCセッション(3)
ITフォーラム2024 AITCセッション(3)
 

クラウドワークス プロダクトの持続的開発のためのリファクタリング実践アプローチ

  • 1. CrowdWorks Inc. Product Div. クラウドワークス リファクタリングチーム 「バグハンター」 株式会社 クラウドワークス
  • 2. CrowdWorks Inc. Product Div. アジェンダ 1. 弊社紹介 2. 目的・課題 3. Fat Modelの技術的負債 4. 解決方法 4.1. 設計手法 4.2. Fat Modelの弱点 4.3. 構造Before/After 4.4. 分析手法 4.5. 作戦方針
  • 3. CrowdWorks Inc. Product Div. 1. 弊社紹介
  • 4. CrowdWorks Inc. Product Div. サービス紹介 オンラインで直接つながり マッチング 仕事依頼 業務実行・納品 発注者=クライアント (企業・個人) 40万社 受注者=クラウドワーカー (主に個人) 240万人
  • 5. CrowdWorks Inc. Product Div. 今日話すこと クラウドワークスの技術的負債に対する取り組み どんな課題があるか 技術的にどのようにアプローチしているか をお話します
  • 6. CrowdWorks Inc. Product Div. リファクタリングは力学的にどうしても後手後手になりやすい。 そのためリファクタリング専門チームを創設。 チーム人数:2名 意図:既に発生したバグを退治するのは本当のバグ退治ではない。そもそもバグが生ま れない構造に作り変えるのが真のバグ退治。 リファクタリング専門チーム「バグハンター」
  • 7. CrowdWorks Inc. Product Div. 2. 目的・課題
  • 8. CrowdWorks Inc. Product Div. Crowdworks.jpをリファクタリングして開発生産性を向上し、「持 続可能な成長」への道筋を作る。 リファクタリングの目的
  • 9. CrowdWorks Inc. Product Div. 解決したい課題 課題 狙う効果 開発生産性 コード変更にあたり、コード分析コストや変更 検討コストが大きく、生産性に課題。 リファクタリングにより理解容易性向上、影響範 囲局所化等を狙い、開発生産性を高める。 エンジニアス キル 粗悪な設計は質の高い設計導入を阻む。 エンジニアが粗悪な設計を真似、学習する可 能性があり、スキル低下の要因に。 リファクタリングにより質の高い設計の導入を 容易にする。 お手本となるコードによりエンジニアのスキル 向上を狙う。 製品の 信頼性 バグを埋め込みやすい構造。重大インシデ ント化した場合、製品の信頼性を毀損。 バグを埋め込みにくい構造へ昇華させ、弊社の 持続可能成長性を向上させる。
  • 10. CrowdWorks Inc. Product Div. 現状の構造的課題 View Controller (Skinny Controller) ActiveRecord (Fat Model) Fat Modelが大量に存在する。 Railsのお作法ではFat Modelがある べき姿なのかも知れない。 しかし巨大化複雑化しすぎていて、生 産性低下を招いている。
  • 11. CrowdWorks Inc. Product Div. 3. Fat Modelが抱える 技術的負債
  • 12. CrowdWorks Inc. Product Div. Fat Modelが抱える技術的負債 技術的負債 説明 関連コードの 散在(低凝集) 本来業務概念的に関連し合うコードが、様々なクラスにあちこちに 散在している。 あるモデルに対する処理が全く別のモデルに書かれているなど、 責務外の実装が多い。 コードの追跡が困難。 コピペコード 同じ制御コードが至るところにコピペしてある。仕様変更に弱く、修 正漏れがあるとバグ化。 意図不明な コード 何をやらせたいのか意図不明なコード。 理解や修正を妨げる。
  • 13. CrowdWorks Inc. Product Div. Fat Modelが抱える技術的負債 技術的負債 説明 うねるコード 条件分岐(if, case-when)やループ制御(each do)などが多重に ネストしており、遠くから見るとうねっているように見えるコード。複 雑で理解困難。 共通化に反する Concern 共通処理の定義に便利なConcernに、respond_to?やis_a?な ど特定クラスの場合の条件分岐が大量に入り込んでいて、共通 化に反している。複雑な上、Concernをincludeしているクラス全 てに変更影響があり触ると危険。 異なるコンテキス トの混在 ActiveRecordにあらゆるコンテキストの実装が入り込んでいて、 巨大化の主要因になっている。
  • 14. CrowdWorks Inc. Product Div. 4. 解決方法
  • 15. CrowdWorks Inc. Product Div. 4.1. 設計方法
  • 16. CrowdWorks Inc. Product Div. 技術的負債に対抗する知識 これらの書籍は技術的負債を解消する手法に詳しい。 これら書籍記載のノウハウを複合的に用い、技術的負債に挑む。
  • 17. CrowdWorks Inc. Product Div. 武器となる設計手法 手法 説明 対応負債 ValueObject ある特定の値と、その演算ロジックをカプセル化する設計パ ターン。業務概念ごとの高凝集化の基本。 消費税、システム利用料など。 ・低凝集 ・コピペコード composed_of ActiveRecordのカラムをValueObjectへマッピングする Railsの構文。カラムを操作するロジックを ValueObjectへ 委譲できる。 同上 ユビキタス言語 チームで概念認識を合わせるために共有する言葉。 対象ドメインの業務概念の認識合わせに用い、ソースコード 上の命名でも表現する。 ・意図不明なコード
  • 18. CrowdWorks Inc. Product Div. 武器となる設計手法 手法 説明 対応負債 FirstClass Collection ループ制御(each doなど)をカプセル化するパターン。 ・うねるコード RuleObject 複雑な条件分岐をカプセル化するパターン。 ・うねるコード Strategy (区分Object) case-whenで処理切替するロジックを単純化するパターン。 case-whenの条件分岐コピペを削減する。 ・コピペコード ・うねるコード ・共通化に反する Concern 境界付けられた コンテキスト 概念(モデル)は状況(コンテキスト)によって意味や扱いが異 なる場合が多々ある。システムを取り巻くコンテキストを分析 し、各コンテキストに即した特化型ドメインオブジェクトを設計 する。 ・異なるコンテキストの混 在
  • 19. CrowdWorks Inc. Product Div. 4.2. Fat Modelの弱点
  • 20. CrowdWorks Inc. Product Div. Fat Modelの弱点 一見難攻不落なFat Modelでも、切り崩しが可能な弱点が存在する。 以下に弱点と、その弱点に対応する設計手法を列挙する。
  • 21. CrowdWorks Inc. Product Div. 弱点部位 弱点 説明 難易度 用いる設計手法 クラスメソッド そのクラスにいなくても良いメソッド。 結合度が低く、ValueObjectとして容易に引き剥がす ことが可能。 簡単 ValueObject privateメソッド 定義クラスからしかコールされないため、依存度は低 め。 依存パラメータをコンストラクタで渡すようにすれば privateメソッドごとValueObject化可能。 やや簡単 ValueObject ローカル変数 演算の途中経過を格納している中間成果物であること 多い。 中間成果物を、成果物を得る演算処理とまとめて ValueObject化する。 やや簡単 ValueObject
  • 22. CrowdWorks Inc. Product Div. 弱点部位 弱点 説明 難易度 用いる設計手法 うねるコード 条件分岐やループ制御で多重にネストしたコー ド。 ループ制御はFirstClassCollection化し、条件 分岐はRuleObject化する。 やや簡単 ・FirstClassCollection ・RuleObject has_many ActiveRecordのhas_manyで関連付けられた コレクションに対するループ制御を、 FirstClassCollection化する。 やや簡単 ・FirstClassCollection case-when case-when分岐(特に分岐コピペ)をStrategy 化する 中 ・Strategy
  • 23. CrowdWorks Inc. Product Div. 弱点部位 弱点 説明 難易度 用いる設計手法 ActiveRecordの カラム Railsのcomposed_ofでValueObject化が可 能。ActiveRecord上のロジックを ValueObjectへ委譲できる。 これができれば理想的には ARから永続化以外 のほとんどのロジックを一掃可能! 難しい composed_of
  • 24. CrowdWorks Inc. Product Div. 4.3. 構造 Before/After
  • 25. CrowdWorks Inc. Product Div. 構造Before View Controller (Skinny Controller) ActiveRecord (Fat Model)
  • 26. CrowdWorks Inc. Product Div. Context B Context C View Controller ActiveRecord (Skinny Model) Context A First Class Collection Value Object Value Object Value Object Value Object Value Object Context D First Class Collection Value Object Value Object Value Object Value Object Value Object ARには永続化責務のみが残る ActiveRecordのロジックを ValueObjectなどに委譲 構造Afterイメージ図 抽出したオブジェクトは コンテキストごとに分ける
  • 27. CrowdWorks Inc. Product Div. 4.4 分析手法
  • 28. CrowdWorks Inc. Product Div. サイクロマティック複雑度などメトリクス を解析し、Technical Debt(技術的負 債)の度合いを算出してくれるオンライン ツール。Githubと連携動作する。 チームKPIとしても利用。 本ツールの公開APIを利用し、特定クラ スのメトリクスを自動取得するスクリプト を組み、リファクタの成果を観測してい る。 メトリクス解析ツール Code Climate Quality
  • 29. CrowdWorks Inc. Product Div. 縦軸:Remediation points。技術的負債の指標値。公開APIで取得可能。 黄色実線:現在リファクタ中の、負債化してるConcernのひとつ。 Code Climate Quality 最近の計測結果
  • 30. CrowdWorks Inc. Product Div. 静的型チェックツール Sorbet(ソルベ) Rubyの型チェックツール。 静的型付言語と同様に型チェックにより 実装正確性、コードトレーサビリティの 正確性を向上させる。 6月にリリースされたばかりで潜在バグ が多く、クラウドワークスでは試験運用 中。
  • 31. CrowdWorks Inc. Product Div. クラスの親やincludeしてるmoduleの 一覧を返す、Ruby標準ライブラリのメ ソッド。 共通化に失敗しているConcernを何個 もincludeし、複雑怪奇な構造になって いるクラスの依存関係を調べるのに必 須。 クラス祖先解析API Module#ancestors
  • 32. CrowdWorks Inc. Product Div. 分析手法 影響スケッチ 書籍「レガシーコード改善ガイド」に記 載の分析手法。 リファクタ対象の影響範囲を知るため の方法である。 右図のように、クラスやメソッドの依存 関係を図式化し、影響範囲を見える化 する。
  • 33. CrowdWorks Inc. Product Div. 書籍「レガシーコード改善ガイド」に記載の分析手法。 リファクタ対象の影響範囲を知るための方法である。 リファクタ対象を、テストも書かずにいきなりリファクタしてみる。 どの辺までリファクタしなければならないか影響範囲が分かる。 分析手法 試行リファクタリング
  • 34. CrowdWorks Inc. Product Div. 4.5. 作戦方針
  • 35. CrowdWorks Inc. Product Div. リファクタリングの候補選定には、価値、難度、リスクの3軸で評価する(書 籍「レガシーソフトウェア改善ガイド」) 価値 チームにとってどれほど有益であるか。理解容易性が上がった、 すぐ機能追加できるようになった、バグを埋め込みにくくなった、 など。 難度 リファクタリングの技術的な難しさ。 リスク リファクタリングに失敗した場合、どれほどのリスクが発生する か。例えばお金周りのデータが壊れるなど。 リファクタリング対象選定基準
  • 36. CrowdWorks Inc. Product Div. • 依存度の小さい末端ロジックから攻める • いきなりコアな部分から着手すると、他からの依存度が高く影響範囲が広すぎて手 に負えなくなる可能性が高い。 • クラスメソッドやprivateメソッドなど他からの依存度が低い末端ロジックから少しずつ 切り崩していくのが基本。 • 集中攻撃 • 五月雨式にあちこちいろんなクラスをリファクタするのではなく、どれか特定のクラス に絞って集中的にリファクタする。 • 効果①:そのクラスに関する知見が高まる。 • 効果②:思考のスイッチングコストを低減できる。 戦術方針
  • 37. CrowdWorks Inc. Product Div. start 候補リストから対象選定 影響範囲分析 & 試行リファクタリング リファクタで きそう? 本実装プロセスへ 課題を メモしておく yes no 分析プロセス
  • 38. CrowdWorks Inc. Product Div. start ドメインオブジェクト 設計 テストコード実装 リファクタリング実行 コードレビュー end 設計before/afterを QiitaTeamで記事化 本実装プロセス デプロイ 動作確認
  • 39. CrowdWorks Inc. Product Div. ご清聴 ありがとうございました