SlideShare uma empresa Scribd logo
1 de 35
レ ガ シ ー コ ー ド に
向 き 合 っ て み た 話
市原 功太郎
Ichihara Kotaro 2018.12.17 DevLOVE関西
現場でレガシーコードに立ち向かっている者達の話
ABOUT ME 2
Ichihara Kotaro
市原 功太郎
MonotaRO Co., Ltd
データマーケティング部門 APIグループ
エンジニア歴3年目
ABOUT OUR COMPANY 3
基幹システムからWebサイトまで自社開発
主要言語は Python など
年率20%超の成長中
レガシーコード? 4
レガシーコードとは
テストコードのないプロダクションコード
今日はレガシーコードに単体テストを導入していったお話
今日の内容 5
どんな状況だったか
チームがどのように取り組んだか
自分の話:
どのようにテストに目覚めたのか
どんな状況だったのか
こんな状況 7
15年以上成長し続けてきたコードベース
施策に合わせて追加される「業務仕様」
当然存在していない単体テスト
機能追加のテストは、E2EのExcel仕様書中心
疑問 8
どうしてこんなことに?
要因のひとつは 9
A. 事業会社だから
7
会社の成長を支えているもの
- すばやく施策を打って、仮説検証すること
- スピードが優先されがち
商品販売で収益を得るビジネス
- ソフトウェアそのものは商材ではない
※ もちろん要因の全てではない
重視されること 10
競争力の源泉は 11
つまり!
利益の最大化 ≠ ソフトウェア品質の追求
ある程度の品質ですばやく出すことが求められた
ところが→ →
事情が変わってきた 12
会社の成長
→ 機能の増大・複雑化
→ ソフトウェアの巨大化!
ソフトウェアの巨大化 13
従来のテスト手法では成長に追いつけなくなってきた
- 手仕事によるテスト実施
- E2E視点中心
- デグレの防止= レビューアの勘と経験
- リリースごとに使い捨てのテスト仕様書
= 遅い・手戻り・不安定
求められたのは 14
要求をすばやく実現するため
再現性の高い品質担保方法で開発したい
という需要が大きくなってきていた
チームが
どのように取り組んだか
ミニマムにはじめる 16
CIでコンパイルするだけのテストを開始した
Git Commit時に ✔ or ❌がみえる
CIの結果の見方を学んだ
既存の単体テストの「復活」 17
いにしえのユニットテストをCIにのせた
かつてごく一部だけ書かれていたユニットテストを発掘
(あまりメンテされてないものだったけど)
とにかく単体テストが動き始めた
リリース要件 18
ユニットテスト通過がリリース要件になった
既存CIの結果がグリーンじゃないとリリースできない
テストコードの品質を維持する動機に
実行環境 19
単体テストができるローカル環境を構築
アプリが動作する環境をVagrantとAnsibleで定義
それまでは共用サーバでの開発が中心だった
開発で気楽にテストできるようになった
テストの増やし方 20
追加・改修部分だけ単体テストを書く
いきなり全部は無理でも、やったことだけならまあ書ける
テストが徐々に増えてきた
なんということでしょう 21
テスト文化が徐々に変わりつつある
開発時にはテストプログラムが作成される
それらはコミットごとにCIで実行される
通過したものだけがリリースされる
自分の話:
どのようにテストに目覚めたのか
自分の話 23
入社してはじめてITを学んだいわゆる「文系エンジニア」
現在の現場が一社目
会社のシステムに使った時間
≒ エンジニアとしてすごした時間
こうなりがち 24
今やっているやり方がすべて
Excelテストが大変でも、別に困らない
むしろテストコードとかめんどくさい
大変なのに、困ってない?
テスト書くことはめんどくさい?
何故 25
知らないから 26
今やっているやり方がすべて
→ 他のやり方を知らないから
Excelテストが大変でも、別に困らない
→ 大変だということを知らないから
むしろテストコードを書くのがめんどくさい
→ テストの効能を知らないから
どうやって気づいたのか 27
とあるAPI新規開発案件で
新規プログラム全てに単体テストを書いた
書いてるときはちょっと面倒だったが……
衝撃 28
数秒で実行できる!
テストが失敗するところだけ直せば良い!
すぐにデグレに気付ける!
やばい、テスト書いたら超楽じゃん
続・どうやって気づいたのか 30
体験に勝る気づきはない
まわりのエンジニア達の「つらい」にやっと共感できた
(質のいいテストを書く大変さも実感できた)
この速度感と安心感を味わったら、もう戻れない
というわけで、こんな取組みを 31
テストを走らせる環境の定義
前述のローカル開発環境構築を主導して実現した
個人PC上で共通環境を再現可能
気軽に実装・テスト実行・コミットが可能な状況をつくった
それからどうした 32
みんなでテストを書きまくっていたら、
チーム全員がテスト推進派に
単体テストの無いPullRequestがなくなっ
た
これからどうしたい 33
メンテナンスしやすいシステムに再設計
秘伝の継ぎ足しコードなので、テストしづらい
既存コードの単体テストを増殖させる
現在は主管システムxx万行中 xx %
テスト実装力を上げたい
まとめ 34
テストの大切さは知らなければ気づけない
実体験で最大の気づきを得られた
テストのあるコードはよいものです
ご静聴ありがとうございました。

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
振り返り(アジャイルレトロスペクティブズ)
振り返り(アジャイルレトロスペクティブズ)振り返り(アジャイルレトロスペクティブズ)
振り返り(アジャイルレトロスペクティブズ)
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティス
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
アジャイルにモデリングは必要か
アジャイルにモデリングは必要かアジャイルにモデリングは必要か
アジャイルにモデリングは必要か
 
Istioサービスメッシュ入門
Istioサービスメッシュ入門Istioサービスメッシュ入門
Istioサービスメッシュ入門
 
ログについて改めて考えてみた
ログについて改めて考えてみたログについて改めて考えてみた
ログについて改めて考えてみた
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 

Semelhante a レガシーコードに向き合ってみた話

モデル駆動型開発
モデル駆動型開発モデル駆動型開発
モデル駆動型開発
Norihito Ohshima
 
Q a9 for ics(lotus) developers
Q a9 for ics(lotus) developersQ a9 for ics(lotus) developers
Q a9 for ics(lotus) developers
賢次 海老原
 
楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten, core skills neede...
楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten,  core skills  neede...楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten,  core skills  neede...
楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten, core skills neede...
Rakuten Group, Inc.
 
[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例
[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例
[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例
de:code 2017
 

Semelhante a レガシーコードに向き合ってみた話 (20)

アジャイル開発のためのDatadog
アジャイル開発のためのDatadogアジャイル開発のためのDatadog
アジャイル開発のためのDatadog
 
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
 
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのかDeveloper's summit 2021 [19-D-5]なぜ今、ローコードなのか
Developer's summit 2021 [19-D-5]なぜ今、ローコードなのか
 
モデル駆動型開発
モデル駆動型開発モデル駆動型開発
モデル駆動型開発
 
SQiPシンポジウムアブストラクト作成のポイント
SQiPシンポジウムアブストラクト作成のポイントSQiPシンポジウムアブストラクト作成のポイント
SQiPシンポジウムアブストラクト作成のポイント
 
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルリクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
 
Q a9 for ics(lotus) developers
Q a9 for ics(lotus) developersQ a9 for ics(lotus) developers
Q a9 for ics(lotus) developers
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
 
楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten, core skills neede...
楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten,  core skills  neede...楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten,  core skills  neede...
楽天市場で使われている技術、エンジニアに必要なコアスキルとはTechnology used in Rakuten, core skills neede...
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
.NET Lab2022年2月
.NET Lab2022年2月.NET Lab2022年2月
.NET Lab2022年2月
 
Api結合部の自動テスト方式
Api結合部の自動テスト方式 Api結合部の自動テスト方式
Api結合部の自動テスト方式
 
[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例
[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例
[DO12] ナビタイムジャパン CTO 菊池氏が語る IT リーダのための開発を加速させる DevOps の実践例
 
Web制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテストWeb制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテスト
 
はじめてのアジャイル
はじめてのアジャイルはじめてのアジャイル
はじめてのアジャイル
 
大規模ソフトウェアにおけるディリービルド&リグレッションテスト@Dev Love
大規模ソフトウェアにおけるディリービルド&リグレッションテスト@Dev Love 大規模ソフトウェアにおけるディリービルド&リグレッションテスト@Dev Love
大規模ソフトウェアにおけるディリービルド&リグレッションテスト@Dev Love
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
 
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らす
 
心・技・態 -LINEにおける改善の真実-
心・技・態 -LINEにおける改善の真実-心・技・態 -LINEにおける改善の真実-
心・技・態 -LINEにおける改善の真実-
 

Mais de 株式会社MonotaRO Tech Team

Mais de 株式会社MonotaRO Tech Team (20)

本番環境でやらかしちゃった選手権_MonotaRO社内LT会利用スライド.pdf
本番環境でやらかしちゃった選手権_MonotaRO社内LT会利用スライド.pdf本番環境でやらかしちゃった選手権_MonotaRO社内LT会利用スライド.pdf
本番環境でやらかしちゃった選手権_MonotaRO社内LT会利用スライド.pdf
 
この技術書がすごい!2023夏(おすすめの技術書をペライチで紹介する選手権) .pdf
この技術書がすごい!2023夏(おすすめの技術書をペライチで紹介する選手権) .pdfこの技術書がすごい!2023夏(おすすめの技術書をペライチで紹介する選手権) .pdf
この技術書がすごい!2023夏(おすすめの技術書をペライチで紹介する選手権) .pdf
 
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
 
【TECHTRACKJP】私ってデータエンジニアなんですか?気づいたらデータエンジニアと呼ばれるようになった私がこの職種について考えた【20230725】
【TECHTRACKJP】私ってデータエンジニアなんですか?気づいたらデータエンジニアと呼ばれるようになった私がこの職種について考えた【20230725】【TECHTRACKJP】私ってデータエンジニアなんですか?気づいたらデータエンジニアと呼ばれるようになった私がこの職種について考えた【20230725】
【TECHTRACKJP】私ってデータエンジニアなんですか?気づいたらデータエンジニアと呼ばれるようになった私がこの職種について考えた【20230725】
 
【マーケティング・テクノロジーフェア 大阪 2023】 データから正しい意思決定を行うために 〜全社横断で実施したデータ活用プロジェクトの取...
【マーケティング・テクノロジーフェア 大阪 2023】 データから正しい意思決定を行うために 〜全社横断で実施したデータ活用プロジェクトの取...【マーケティング・テクノロジーフェア 大阪 2023】 データから正しい意思決定を行うために 〜全社横断で実施したデータ活用プロジェクトの取...
【マーケティング・テクノロジーフェア 大阪 2023】 データから正しい意思決定を行うために 〜全社横断で実施したデータ活用プロジェクトの取...
 
[ITmedia Cloud Native 2023] モノタロウのクラウドネイティブ.pdf
[ITmedia Cloud Native 2023] モノタロウのクラウドネイティブ.pdf[ITmedia Cloud Native 2023] モノタロウのクラウドネイティブ.pdf
[ITmedia Cloud Native 2023] モノタロウのクラウドネイティブ.pdf
 
datatech-jp Casual Talks #5_データ基盤の立ち位置を考えるのに チームトポロジーの概念を活用した話
datatech-jp Casual Talks #5_データ基盤の立ち位置を考えるのに チームトポロジーの概念を活用した話datatech-jp Casual Talks #5_データ基盤の立ち位置を考えるのに チームトポロジーの概念を活用した話
datatech-jp Casual Talks #5_データ基盤の立ち位置を考えるのに チームトポロジーの概念を活用した話
 
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
 
JDMC LT#1 - なぜモノタロウでデータマネジメントが必要になったのか
JDMC LT#1 - なぜモノタロウでデータマネジメントが必要になったのかJDMC LT#1 - なぜモノタロウでデータマネジメントが必要になったのか
JDMC LT#1 - なぜモノタロウでデータマネジメントが必要になったのか
 
datatech-jp Casual Talks#3 データエンジニアを採用するための試行錯誤
datatech-jp Casual Talks#3  データエンジニアを採用するための試行錯誤datatech-jp Casual Talks#3  データエンジニアを採用するための試行錯誤
datatech-jp Casual Talks#3 データエンジニアを採用するための試行錯誤
 
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
 
データ基盤に関わる問い合わせ対応を仕組みで解決する
データ基盤に関わる問い合わせ対応を仕組みで解決するデータ基盤に関わる問い合わせ対応を仕組みで解決する
データ基盤に関わる問い合わせ対応を仕組みで解決する
 
モノタロウの開発・リリースサイクルを支えるJenkinsの活用事例 - Jenkins Day Japan 2021
モノタロウの開発・リリースサイクルを支えるJenkinsの活用事例 - Jenkins Day Japan 2021モノタロウの開発・リリースサイクルを支えるJenkinsの活用事例 - Jenkins Day Japan 2021
モノタロウの開発・リリースサイクルを支えるJenkinsの活用事例 - Jenkins Day Japan 2021
 
「指標」を支えるエンジニアリング: DataOpsNight #1
「指標」を支えるエンジニアリング: DataOpsNight #1「指標」を支えるエンジニアリング: DataOpsNight #1
「指標」を支えるエンジニアリング: DataOpsNight #1
 
データ管理に重要なことは事業と組織の理解だった(Data Engineering Study #11 発表資料)
データ管理に重要なことは事業と組織の理解だった(Data Engineering Study #11 発表資料)データ管理に重要なことは事業と組織の理解だった(Data Engineering Study #11 発表資料)
データ管理に重要なことは事業と組織の理解だった(Data Engineering Study #11 発表資料)
 
MonotaRO のデータ活用と基盤の過去、現在、未来
MonotaRO のデータ活用と基盤の過去、現在、未来 MonotaRO のデータ活用と基盤の過去、現在、未来
MonotaRO のデータ活用と基盤の過去、現在、未来
 
全社のデータ活用を一段階上げる取り組み
全社のデータ活用を一段階上げる取り組み全社のデータ活用を一段階上げる取り組み
全社のデータ活用を一段階上げる取り組み
 
データ基盤グループを支えるチームビルディング
データ基盤グループを支えるチームビルディングデータ基盤グループを支えるチームビルディング
データ基盤グループを支えるチームビルディング
 
MonotaRO LT - ESLintの仕組み
MonotaRO LT - ESLintの仕組みMonotaRO LT - ESLintの仕組み
MonotaRO LT - ESLintの仕組み
 
モノタロウECプラットフォームを支える開発運用モダナイゼーションの取り組み #devsumi
モノタロウECプラットフォームを支える開発運用モダナイゼーションの取り組み #devsumi モノタロウECプラットフォームを支える開発運用モダナイゼーションの取り組み #devsumi
モノタロウECプラットフォームを支える開発運用モダナイゼーションの取り組み #devsumi
 

レガシーコードに向き合ってみた話