SlideShare ist ein Scribd-Unternehmen logo
1 von 14
僕たちがすべきことは
リファクタリングなのか
【Excite × iXIT】Tech Talk #1 前に進むため新しい取り組み
2021/10/18
伊藤 匠
自己紹介
伊藤 匠
2020年入社
エキサイト株式会社 Life&Communication事業部ヘルスケア部門
2
プロダクトを触り始めると様々な不満が出る
再利用の構造が貧弱で同じ関数を何回も書く
リファレンス以外の情報が少ないフレームワーク
使われていないページ/機能/コード
意味をなさない変数名
神クラス
古いバージョン
3
テストが存在しない
伝統主義者と急進主義者の中間を目指す[1]
壊れていないなら直す
な。危ない。
汚いコードが許せない。
リライトだ。
伝統主義的 急進主義的
[1] Chris Birchall著, 吉川 邦夫訳, レガシーソフトウェア改善ガイド 複合型アプリケーション時代に即した開発・保守技法, 翔泳社, 2016
価値とリスクのバランス
で決める
4
本当にプロダクトの実装は酷いのか?
感情的に癒着した問題は「一般化」する傾向にあります[5]
-- エンジニアリング組織論への招待
“
コードベース全体を大々的に書き直すのではなく, コードの変更を容
易にするために, 目標を絞った緻密なアプローチを心がけるのです[1]
-- 達人プログラマー
“
[5] 広木大地, エンジニアリング組織論への招待 不確実性に向き合う思考と組織のリファクタリング, 技術評論社, 2018
[3] David Thomas・Andrew Hunt著, 村上 雅章訳, 達人プログラマー 熟達に向けたあなたの旅 第2版, オーム社, 2020 5
アンガードリブンは基本的に有害
レガシーソフトウェアに対していくらかネガティブな気持ちを抱
くのは自然なことだけど, そういう気分はとても有害なものだ。
我々の判断を曇らせ, 改善の仕事を効率よく進めることを妨げるか
らだ。[1]
-- レガシーソフトウェア改善ガイド
“
違和感を覚えてアンガードリブンで直してしまう人はいます。[6]
-- Engineers in Voyage
“
[1] Chris Birchall著, 吉川 邦夫訳, レガシーソフトウェア改善ガイド 複合型アプリケーション時代に即した開発・保守技法, 翔泳社, 2016
[6] 和田卓人編, Engineers in Voyage 事業をエンジニアリングする技術者たち, ランダムノート, 2020 6
そもそも
汚いコードを書きたい人も
面倒な運用をしたい人も
どこにもいないはず
何かコードを綺麗に保てない理由がある
7
醜悪なコードではなく複雑な仕様だった[1]
<?php
namespace Example¥Kireina¥Code;
use Kireina¥Code¥A;
class KireinaClass
{
private $a;
public function __construct(A $KireinaArg1)
{
$this->a = $KireinaArg1;
}
public function KireinaMethodA()
{
return $this->a;
}
}
<?php
namespace Example¥Kitanai¥Code;
use Kitanai¥Code¥A;
use Kitanai¥Code¥B;
use Kitanai¥Code¥C;
class KitanaiClass
{
private $a;
private $b;
private $c;
public function __construct(A $kitanaiArg1, B $kitanaiArg2, C $kitanaiArg3)
{
$this->a = $kitanaiArg1;
$this->b = $kitanaiArg2;
$this->c = $kitanaiArg3;
}
public function KitanaiMethodA()
{
return $this->a;
}
public function KitanaiMethodB()
{
return $this->b;
}
public function KitanaiMethodC()
{
return $this->c;
}
}
<?php
namespace Example¥Kireina¥Code;
use Kireina¥Code¥A;
class KireinaClass
{
private $a;
public function __construct(A $KireinaArg1)
{
$this->a = $KireinaArg1;
}
public function KireinaMethodA()
{
return $this->a;
}
}
機能の復元
ヘルパーコード
データチェック
<?php
namespace Example¥Kireina¥Code;
use Kireina¥Code¥A;
class KireinaClass
{
private $a;
public function __construct(A $KireinaArg1)
{
$this->a = $KireinaArg1;
}
public function KireinaMethodA()
{
return $this->a;
}
public function TuikanoHelperCode()
{
return;
}
public function TuikanoKinouCode()
{
return;
}
public function TuikanoDataCheck()
{
return;
}
}
≒
[1] Chris Birchall著, 吉川 邦夫訳, レガシーソフトウェア改善ガイド 複合型アプリケーション時代に即した開発・保守技法, 翔泳社, 2016
<?php
namespace Example¥Kitanai¥Code;
use Kitanai¥Code¥A;
use Kitanai¥Code¥B;
use Kitanai¥Code¥C;
class KitanaiClass
{
private $a;
private $b;
private $c;
public function __construct(A $kitanaiArg1, B $kitanaiArg2, C $kitanaiArg3)
{
$this->a = $kitanaiArg1;
$this->b = $kitanaiArg2;
$this->c = $kitanaiArg3;
}
public function KitanaiMethodA()
{
return $this->a;
}
public function KitanaiMethodB()
{
return $this->b;
}
public function KitanaiMethodC()
{
return $this->c;
}
}
8
僕たちがすべきことはリファクタリングなのか
人々の思考や癖, 人間関係, ビジネス環境の中で生まれてくる不合
理が, 形を変えてコードの中に漏れ出ているように思えました[5]
-- エンジニアリング組織論への招待
“
綺麗なコード
テストがなくバージョンアップが至難で過去の書き方が残る
設計の破壊やフレームワークの誤用部分のコードを参考にする
ビジネスサイドとのコミュニケーション不足による不統一な命名
現プロダクトで例えると
[5] 広木大地, エンジニアリング組織論への招待 不確実性に向き合う思考と組織のリファクタリング, 技術評論社, 2018
9
本当に必要なのは環境/文化への戦略のはず
コード
エンジニア
環境/文化
テスト運用[2]
- エンジニアの改修による心理的負担を少なくする
協力し合う[2]
- ペアプロなどによる知識の共有
継続的統合[2]
- 統合が遅れるほど修正が困難になる
設計
勉強会
・
・
・
[2] David Scott Bernstein著, 吉羽 龍太郎・永瀬 美穂・原田騎郎・有野 雅士訳, レガシーコードからの脱却 ソフトウェアの寿命を伸ばし価
値を高める9つのプラクティス, O’REILLY, 2019
10
コードを綺麗に保つには綺麗にした後が重要
自信過剰による再設計は, 元のプロジェクトと同じように崩壊する[4]
-- Clean Architecture
“
一度コードを綺麗にしたらその状態を自分なら保てる前提で
リファクタリングをしようとしていませんか?
コードを綺麗に保つ術を知らないと同じ歴史を繰り返して,
せっかくリファクタしたプロダクトも
自分が嫌悪していたコードと同じように扱われてしまう。
[4] Robert C. Martin著, 角 征典・高木 正弘訳, Clean Archetecture 達人に学ぶソフトウェアの構造と設計, 株式会社ドワンゴ, 2018
11
リファクタリングの効果はわかりづらい
リファクタリングによって違いが出ていることを, 我々に知らせて
くれる手段が必要だ。
-- レガシーソフトウェア改善ガイド
“
簡単に答えるとなんでも測っておけ, ということになる
-- レガシーソフトウェア改善ガイド
“
[1] Chris Birchall著, 吉川 邦夫訳, レガシーソフトウェア改善ガイド 複合型アプリケーション時代に即した開発・保守技法, 翔泳社, 2016
12
まとめ
僕たちがすべきことはリファクタリングなのか? => No
まずやるべきは
- 環境/文化に自分がアプローチできないか考えてみよう
- リファクタリングの効果を他者に示せる準備ができているか考えてみよう
13
参考文献
[1] Chris Birchall著, 吉川 邦夫訳, レガシーソフトウェア改善ガイド 複合型アプリケーション時代に即した開発・保守技法, 翔泳社,
2016
[2] David Scott Bernstein著, 吉羽 龍太郎・永瀬 美穂・原田騎郎・有野 雅士訳, レガシーコードからの脱却 ソフトウェアの寿命を伸ば
し価値を高める9つのプラクティス, O’REILLY, 2019
[3] David Thomas・Andrew Hunt著, 村上 雅章訳, 達人プログラマー 熟達に向けたあなたの旅 第2版, オーム社, 2020
[4] Robert C. Martin著, 角 征典・高木 正弘訳, Clean Archetecture 達人に学ぶソフトウェアの構造と設計, 株式会社ドワンゴ, 2018
[5] 広木大地, エンジニアリング組織論への招待 不確実性に向き合う思考と組織のリファクタリング, 技術評論社, 2018
[6] 和田卓人編, Engineers in Voyage 事業をエンジニアリングする技術者たち, ランダムノート, 2020
14

Weitere ähnliche Inhalte

Was ist angesagt?

Head First Inception Deck
Head First Inception DeckHead First Inception Deck
Head First Inception DeckNaoto Nishimura
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIKoichiro Sumi
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発Takafumi ONAKA
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話Nobuhiro Yoshitake
 
ユーザーストーリーの分割
ユーザーストーリーの分割ユーザーストーリーの分割
ユーザーストーリーの分割Arata Fujimura
 
RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩Hiroshi SHIBATA
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。toshihiro ichitani
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022Yusuke Suzuki
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanItsuki Kuroda
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていることonozaty
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 

Was ist angesagt? (20)

Head First Inception Deck
Head First Inception DeckHead First Inception Deck
Head First Inception Deck
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCI
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
 
ユーザーストーリーの分割
ユーザーストーリーの分割ユーザーストーリーの分割
ユーザーストーリーの分割
 
RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
Lean coffee
Lean coffeeLean coffee
Lean coffee
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 

Ähnlich wie 僕たちがすべきことはリファクタリングなのか

Connect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI その先に考えたいコト
Connect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI  その先に考えたいコトConnect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI  その先に考えたいコト
Connect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI その先に考えたいコトDaiyu Hatakeyama
 
デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択
デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択
デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択Shingo Kitayama
 
第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...
第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...
第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...Shinagawa Seitaro
 
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)Yasui Tsutomu
 
Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿
Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿
Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿Daiyu Hatakeyama
 
Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-
Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-
Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-Recruit Technologies
 
ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~Ken Azuma
 
.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみた.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみたm ishizaki
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所Kotaro Ogino
 
Pmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズ
Pmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズPmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズ
Pmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズITinnovation
 
【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンス Collision 2022 フィードバックセミナー
【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンスCollision 2022 フィードバックセミナー【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンスCollision 2022 フィードバックセミナー
【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンス Collision 2022 フィードバックセミナーNISSHO USA
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
『闇』をなくすためのコミュニケーションとユーザーテスト
『闇』をなくすためのコミュニケーションとユーザーテスト『闇』をなくすためのコミュニケーションとユーザーテスト
『闇』をなくすためのコミュニケーションとユーザーテストDaisuke Hayashi
 
Icml2018読み会_overview&GANs
Icml2018読み会_overview&GANsIcml2018読み会_overview&GANs
Icml2018読み会_overview&GANsKentaro Tachibana
 
機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))
機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))
機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))HironoriTAKEUCHI1
 
[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ
[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ
[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジTrainocate Japan, Ltd.
 
リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組Recruit Technologies
 

Ähnlich wie 僕たちがすべきことはリファクタリングなのか (20)

Connect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI その先に考えたいコト
Connect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI  その先に考えたいコトConnect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI  その先に考えたいコト
Connect 2021郡山: 街づくりのためのデジタル技術 IoT – Data - AI その先に考えたいコト
 
デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択
デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択
デブサミ2017【17-E-5】エンタープライズにおけるDevOpsの実態!Cloud Native Application Platformの選択
 
第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...
第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...
第7回 NIPS+読み会・関西 Generating Informative and Diverse Conversational Responses v...
 
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
大きな泥のカタマリを相手にするためのアジャイルと努力と苦労 by Joe Yoder (XP祭り2014)
 
Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿
Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿
Saga Smart Center: デジタル変革が及ぼす企業が考慮すべき未来の姿
 
Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-
Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-
Struggling with BIGDATA -リクルートおけるデータサイエンス/エンジニアリング-
 
ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~
 
.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみた.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみた
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
 
Pmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズ
Pmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズPmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズ
Pmi日本フォーラム2015講演資料(アイ・ティ・イノベーション 井上英明) v1.0_講演用_カスタマイズ
 
081128
081128081128
081128
 
【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンス Collision 2022 フィードバックセミナー
【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンスCollision 2022 フィードバックセミナー【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンスCollision 2022 フィードバックセミナー
【日商USA】webinar 2022.6.30 世界最大級のテックカンファレンス Collision 2022 フィードバックセミナー
 
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
『闇』をなくすためのコミュニケーションとユーザーテスト
『闇』をなくすためのコミュニケーションとユーザーテスト『闇』をなくすためのコミュニケーションとユーザーテスト
『闇』をなくすためのコミュニケーションとユーザーテスト
 
Icml2018読み会_overview&GANs
Icml2018読み会_overview&GANsIcml2018読み会_overview&GANs
Icml2018読み会_overview&GANs
 
機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))
機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))
機械学習応用システムのアーキテクチャ・デザイパターン(2020-07 ドラフトバージョン))
 
[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ
[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ
[G-Tech2014講演資料] 汎用プラクティスとしてのアジャイル開発 - グローバルナレッジ
 
リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組
 
ネイティブ原理主義
ネイティブ原理主義ネイティブ原理主義
ネイティブ原理主義
 

僕たちがすべきことはリファクタリングなのか

Hinweis der Redaktion

  1. では初めに自己紹介させていただきます。 伊藤匠と申します。所属はエキサイト株式会社Life&Communication事業部のヘルスケア部門で2020年入社になります。 なので今入社して1年半, 新卒2年目になります。 普段の業務では, オンラインカウンセリングサービスのお悩み相談室とオンライン占いサービスの電話占いの運用タスクを行っています。 お悩み相談室も電話占いも結構古いサービスで, 例えばお悩み相談室はちょうど今ロゴに14年って入ってますね。 14年前に作られて, 14年間拡張が続けられたサービスということで, いろんな箇所ににリファクタリングの余地を感じたりします。 自分はFY21の上半期でお悩み相談室のサービスにテスト導入を行ったんですけど, 今日はその時の反省点というかリファクタリングというものに対する考え方で至らなかった部分の共有みたいな話をしたいと思います。 あと, 2年目になって, 本で読んだことを実践する機会とか, 逆に実践したことのベストプラクティスが本に書いてある。みたいなことが増えたので, そこら辺も交えて話してみたいと思っています。 それではよろしくお願いします。
  2. 配属されて既存のプロダクトを触り始めると様々な不満が出てくると思います。 ここに書いているのはパッと自分が受け持っているプロダクトに対して思ったことで, 上から読んでくと 貧弱な再利用構造, 情報が少ないフレームワーク, 使われていない機能, 神クラス, 意味をなさない変数名, 古いバージョン, テストが存在していない。 少しずつ, 蓄積していったものであればわかりづらいんですけど, ここら辺がいっぺんにドンと身に降りかかるとやっぱリファクタリングしたくなっちゃいます。
  3. コードをリファクタリングしたいかしたくないかって結構人によって違うっぽくて, したがらない人を伝統主義者, したがる人を急進主義者と言ったりします。 伝統主義者は「壊れていないのならば直すな」というのがポリシーで, レガシーコードへの変更で, 思いもよらないバグとかを踏んだりして何か痛い目にあったとかの経緯で生まれやすい。p57 一方, 急進主義者っていうのは, レガシーコードを憎悪している人たちで, よく言うのが「書き方が下手なコードを見るのが我慢ならない」とかです。大体の場合この「書き方が下手なコード」って, 「誰か他の奴が書いたコード」と同義だったりします。p59 理想は伝統主義者と急進主義者の中間らいしです。 リファクタリングを実行するか否かって本来は, リファクタリングによって得られる価値と失敗時のリスクのバランスを理解して決めることが必要なはずですが, 急進主義者はそのバランスを欠いている恐れがあります。 今回は主に急進主義者へ向けた内容になっています。 この話はレガシーコード改善ガイドに載ってます。
  4. さっき, 急進主義者は「レガシーコードを憎悪してる」って言ったのですが, この憎悪, というか感情って結構厄介で, 人の認知を歪めてしまうって言われています。 ここで紹介したいのは, その歪み方の1で, 「感情的に癒着した問題は「一般化」する傾向にある」ってことです。 もう少し具体的に言うと, いろんな具体的事象を1つの原因であるかのように捉えてしまうということです。 実際の話で言うと, 自分の場合は先ほど紹介したプロダクトの不満を憎悪で癒着させ, 「このプロダクトはレガシーで生産性を落とす。大掛かりなリファクタをしたい。」みたいな 生産性を落とすっていう抽象的な問題を作り上げたりしちゃいます。 こういう認知の歪みがあることを知っておくことで, 急進主義から少しだけ抜け出せると思います。 多分, 自分が関わっているものも含めて皆さんのプロダクトは, 自分が思っているほどレガシーでもひどい設計でもないと思います。 問題を一般化してコードベース全体を大々的に書き直すのではなくて, 目標を絞った緻密なアプローチをリファクタリングでは心がける必要があります。(p270)
  5. 急進主義者はレガシーを憎悪して, リファクタリングを推し進めるという話の続きに戻ります。 憎悪による開発はアンガードリブンって言われたりします。 憎悪ってネガティブな印象なんですけど, そのエネルギーがコードを綺麗に書き換えることへ向けられるのであれば, そこまで悪い話ではないように聞こえます。 アンガードリブンについては成功談と否定意見の2つを目にしたことがあって 成功談は, Enginners in Voyageに載っており, 「複雑なシステムをアンガードリブンで全て書き換えたエンジニアがおり, それによりチーム全体の「つらい」といった声が減った」という例で紹介されています。(p72) 否定意見は, レガシーソフトウェア改善ガイドに載っており, 「レガシーへのネガティブな気持ちは有害であり, エンジニアの判断を曇らせ改善の効率を落とす」と述べられています。(p20) これらはどちらが正しいと論じるものではないですけど, 僕は「レガシーソフトウェア改善ガイド」の危惧した通りの行動をしてしまったんでアンガードリブンは基本的に有害だと思っています。 特に注目してほしいところが, 判断を曇らせて改善の効率を落とすということです。 これは個人の意見なのですが, 判断を曇らせる一例としてコードに意識が向いちゃうってことがあると思います。
  6. そもそもです。汚いコードを書きたい人も面倒な運用をしたい人もどこにもいないはずです。 にも関わらず, 汚いコードや面倒な運用はいくつも存在しています。 ということは何かコードを綺麗に保てない理由がありそうです。 コードに意識が向くとこの考えに至らなくなります。というか自分がなりました。
  7. コードを綺麗に保てなくなる理由として, 例えば, 「醜悪」に見えたコードが, 「複雑な仕様」だった, という場合があります。(p73) これもレガシーコード改善ガイドから抜粋しています。この辺は実際のプロダクトでもよく見ます。 ストーリーはこうです。 レガシーとは全く無縁な, モダンで清潔な設計, 美しく構成されたモデルとともにスタート モデルが抽象的で大量のテンプレートが必要だったので一般的なケースを処理するためのヘルパーコードを追加。 古いコードにあった, 使われていないと思っていた機能を使っているユーザーがいた。そのサポートを追加。 DBの中で存在しないはずのデータに遭遇。バグか何かで存在するはずないにも関わらずそのためのチェックを追加。 ここで一歩下がってみてみると多くの場合, リライト前似ているコードになっている。
  8. そしてもう1つ。ここが今回一番伝えたい/と言うか当時の自分が至ってなかった考えになるのですが, 環境とカルチャーによって綺麗なコードが保てないというものです。 個人的に結構納得した話で言うと, この引用で, 読み上げると「」と言う筆者の考えです。 例えば現在扱っているプロダクトでいうと テストがないせいでバージョンアップが難しく, それによって過去の書き方が取り残されている 設計の破壊やフレームワークの意図の無視が既に行われているせいでそこを参考にした書き方が広がる 用語が統一されていないため命名がバラバラになる と言ったことがあげられます。
  9. 改めて整理すると, こんな感じの三角形の構造になっていると思っていて, コードはエンジニアが書くのですが, エンジニアがどんなコードを書くかとか, コードにどういうスタンスでいられるかはもっと下の環境とか文化が決める。みたいな感じです。 なので, コードを綺麗に保ち, 汚いコードへ変わっていくのを阻止するためには, 環境/文化に対する戦略が必要で, それは テスト運用だったり, コミュニケーションだったり, 継続的統合だったりです。 ここら辺を詳しく知りたい方は「レガシーコードからの脱却」っていう本を読んでいただけると9つのプラクティスとして語られています。 つまりコードを綺麗に保つことの本質はリファクタリングのみでは論じることができなくて, まず考えるべきは, 環境や文化に自身がどのような影響を与えることができるかだと思っています。
  10. 当たり前なんですけど, コードを綺麗に保つには綺麗なコードをいかに持続させるかがより重要になります。 急進主義者がレガシーへ憎悪を向けているとき, このことを忘れがちで, 一度コードを綺麗にしたら, その綺麗な状態を自分なら保てる前提でリファクタリングに取り掛かろうとします。 クリーンアーキテクチャって本の中で自分が気に入っている一文があって「自信過剰による再設計は, 元のプロジェクトと同じように崩壊する」という文です。 コードの崩壊と再設計というもっとスケールの大きな話を取り扱っていますが根本的なことは同じだと思っていて, コードをクリーンに保つ術を知らないと同じ歴史を繰り返して, せっかくリファクタしたプロダクトも自分が嫌悪していたコードと同じようになるか, そう扱われてしまいます。 リファクタリングをする前にここら辺のことをよく考えて行動に移していきたいです。
  11. ここまでリファクタリングの前段の話でしたが最後にもう一つ。 リファクタリングに入る前にやっておきたいことがあります。 リファクタリングは, コードを読む速度, 修正の範囲, デバッグにかける時間, バグ対応時間, 総称すると生産性を上げるためにやると思うんですけど, 生産性っていうのは目に見えなくて, 周りの人からの実感を伴いにくく, さらにリファクタリングによって得られる収益はありません。 僕たちエンジニアはこれらのことを意識してリファクタリングの効果を主張して評価につなげる必要があります。 そのためには「リファクタリングによって違いが出ていることを我々に知らせてくれる手段が必要」です。(p25) じゃあ, 何を測るか決めないと手段を用意できないと思うんですけど, 何を測ればいいのってなると, 「レガシーコード改善ガイド」では「簡単に答えるならなんでもはかっておけ」と述べられています。 それだけではあまりにもなので, その後に書かれていることをを紹介すると 静的解析, 性能テスト, エラー(500 Internal Server Error)を出した回数, よくあるタスク(バグ修正の平均時間, 開発環境を最初からセットアップするのにかかった時間) を測ると良いと言われています。 ここら辺もアンガードリブンでコードに意識が入っていると飛ばされやすい項目だと思うので注意したいところです。
  12. 最後に本日話した内容をまとめます。 僕たちがすべきことはリファクタリングなのかという題名に対して僕の現在の考えはNoで, まずやるべきは, 環境/文化にアプローチして綺麗なコードを保てる環境を目指すことが先決だと考えています。 そして次にやるべはリファクタリングの効果を計測する環境を整えることです。 自分はFY21の上期を使ってお悩み相談室のテスト環境を整えてなるべく容易にテストをかけるようにしたのですが, その根底に今回話した背景がほとんど考慮されていません。 同様にテスト環境を整備するという結論に至ったとしても, これらの背景を考慮しているか否かは大切なことだと思っているので, これからの思考に取り入れていきたいと思っています。 以上になります。