Re:factoring -「こんまりメソッド」で始めるコード断捨離

株式会社サムザップで週イチで顔を出してあれやこれや雑談したり相談にのったりしている熊倉です。
エンジニア的背景をいうと長らくバックエンドを主軸にしつつ、Unityでの実装経験があるひとです。サムザップ以外では最近ですとブロックチェーン独自基盤開発の一員だったり、typescript+reactとかで開発したりしています。ハブになったり、マネジメントしたりすることが多くなってきました。また、[scrapbox](https://scrapbox.io/)おじさんとして個人的に広める活動をしています。

本記事は[サムザップ #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sumzap2) の12/20の記事となります。
扱うテーマが多いので色々悩みましたが、今回は「こんまりメソッド」と「リファクタリング」を主軸において記事を書かせて頂きました。

# はじめに

![スパゲッティ](https://3.bp.blogspot.com/-EATHViUAKVI/W_UF9KEi82I/AAAAAAABQUE/9NkBAfsB9BgWgQOa4qBb_JQl9nvozV-JgCLcBGAs/s600/food_spaghetti_bolognese_meatsauce.png)
Image by [いらすとや](https://www.irasutoya.com/)

コピペの嵐が生み出し続けるスパゲッティコードよろしく
過去の正解であり現在では技術的負債と呼ばれてしまうレガシーコード。

そんなコードと一緒に日々過ごしていると何が良くて何が悪いのかわからなくなり感覚が麻痺するもの。

まるで、mp3のように劣化し圧縮された音楽に慣れ親しんでしまい音質の善し悪しがわからなくなったり、カップラーメンばかり食べすぎて味の善し悪しがわからなくなってしまうかの如くです。

いや、怠惰な僕としても好きだし、、たまにならいいですよね、たまになら！

![カップラーメン](https://3.bp.blogspot.com/-rZMHLcW6Er4/WlGpO69KN7I/AAAAAAABJlg/KgmrOkMSuoM0Xf0qRil3iOpMlGer-ypmACLcBGAs/s400/food_cup_ramen_miso.png)

そんな人間らしさの結晶であるコードたちとどう向き合っていったらいいのでしょうか。
この記事がそのヒントのひとつになれば幸いです。

## こんなことはありませんか？

- 人が足りないかつ仕事量が多く理解する前についコピペですませてしまう
- 目の前の仕事に追われすぎて、技術のアップデートが出来ない
- 一応引っ張る立場にいるものの狭い世界で回していて自信が持てない
- 気づくとルーチンワークが多いと感じる
- 社内での肩身が狭くていくら叫んでも通らない、、、
- 動いてるんだから良くない？ リファクタリングとか予算かけてもしょうがなくない？ ...orz
- 疲れすぎて全てがどうでもよくなってきた。ひとまずお金稼げるし、まぁいいか、、

![つらみ](https://1.bp.blogspot.com/-93LScIhvv_E/Xdttf1iHxBI/AAAAAAABWI4/qltltNyQirY1nBJxd89CltpjiEIeY4XtgCNcBGAsYHQ/s400/kaisya_kanshi_kansa_man.png)

…危ない！ このまま行くと鬱を誘発してしまう。
実感が伴う方、大変ご苦労さまです。ご多分に漏れず僕も経験者です。

はい、結構こういった事がチリツモで重なってこのような連鎖がおきがちではないでしょうか。

やばいコードの実例を出してみましょう。[ぜひこちらを御覧ください](https://raw.githubusercontent.com/salesagility/SuiteCRM/master/modules/AOS_PDF_Templates/PDF_Lib/mpdf.php)
[githubで最もやべー関数を発掘する](https://qiita.com/AngryMane/items/2be9016f82653c8cc07f)より

伝わりますでしょうか。この色々あったんだろうなぁと感じる絶望感。

# そこで登場「こんまりメソッド」
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22934/f3e5cc0f-9b97-7dbb-5c8d-e1e9c2a203e8.png)](https://www.netflix.com/title/80209379)
NETFLIXで話題になりましたね。

ここから少しだけ遠回りしますが、なんとか回収していきますのでお付き合い下さい。

## こんまりメソッドとは
知らない方もいらっしゃると思いますので参考までに。
[近藤麻理恵公式サイト](https://konmari.jp/)より
> 近藤麻理恵が提唱する
「片づけをすることで、人生を変える」メソッド。
特徴は、残すものを「ときめくかどうか」の基準で選ぶこと。

> 片づけを通して自分の内面をみつめ、自分が大切にしている
価値観を知ることで、二度と散らからない家をキープできる
だけではなく、キャリアや人間関係など、人生における全て
の選択において大きな変革をもたらします。

うわぁ、なんかキラキラしてる。宗教っぽい。
というのはひとまずおいておきます。

上記の通り、通常のこんまりメソッドでは家の中の片付け断捨離をメインとし、
ただ無差別に捨てるわけではなく「ときめく」ものを残し、それ以外のものはお世話になった感謝の気持ちを捧げながら捨てていきます。

## ときめくを辞典で調べてみると
[weblio 古語辞典より](https://kobun.weblio.jp/content/%E6%99%82%E3%82%81%E3%81%8F)
> とき－め・く 【時めく】
> ①時流に乗って栄える。もてはやされる。
> ②格別に目をかけられる。寵愛（ちようあい）を受けて栄える。

どうやら愛され栄えるものという認識のよう。
ちなみに近藤さんは海外でもご活躍されておりますが、ときめきを伝える上で**Spark Joy**と言っています。

SparkしてるJoy。なんだか眩しい。。！

また、ときめきは暖かい感覚や嬉しい感覚だと説明しています。ほっこり。

# メソッド概要まとめ
実際にNETFLIXなどで見て頂いた方がわかりやすくはありますが
まずは、ザッと概要を見てみましょう。

## 心構え
  - 今あるものを愛し、感謝する
  - 大切にしたいものを身の回りにおく
  - 常にパーフェクトは目指さない
  - 家と対話をする
       - 正座し、挨拶をする

## 分類対象
  - 衣類・本類・書類
  - 小物類
  - 思い出品(記念品・古い手紙・写真)

## メソッド
  - 整理したいものを全て山積みにする
       - 山積みにすることで自体を正しく認識しショックを自分に与える。
           - これはなんとかしなければならないと原動力とする。
       - ひとつひとつを手に取り、**ときめかない物は感謝して捨てる**
  - 場所毎に集中して片付ける
       - カテゴリ別に仕分ける
       - 思い出品が出てきたら、トキメキ感度が上がってきてから対処する
       - 同じ種類、同じサイズのものをまとめる→小さい箱にまとめる

## 将来的な効能
  - 気分が変わる
  - 緊張感が変わる
  - 習慣が変わる
  - 安易にものを増やさなくなるので出費が減る
  - 共に暮す人間関係の在り方が変わる
       - 目的を共にすることで関係が深まる
  - 子供にも片付けをする事を自然と伝えられる
       - 整理・掃除が好きになる

# 面倒くさいを乗り越える

NETFLIXのこんまりシリーズを見ると膨大な量のモノが出てきます。
人間こんなに溜め込めるものなのだなと客観視させられます。

![ごみやしき](https://1.bp.blogspot.com/-_yv9pamJbRk/VoziI2jFTZI/AAAAAAAA2ro/4DUfhjcLics/s400/gomiyashiki.png)

断捨離を通して、投げ出したくなったり乗り越えながら自己と対話をし、本当に大切なものはなんだったっけと気づいていくストーリーを見ることが出来ます。

僕らはモノを増やすことはいくらでも出来ますが、モノを捨てる事がなかなか出来ません。
お金を増やすことは好きでも、お金を捨てることが好きな人はそうそういませんよね。
子供を育てていても自分のやりたいことは進んでやるのに、後片付けまで進んでやる事はしないのです。（つらみ

そんな飽くなき欲求を乗り越え、足るを知る。
やがてエコな社会が実現すると、、いいですよねぇ、、

現実問題そうは問屋がおろさないので、
地道にひとつずつ臭いものに蓋をしていたモノたちと向き合う時が来た。というわけです。

うわーめんどくさい。リファクタリングしよ。

## コードの基準を「ときめくかどうか」にしてみる
ここから、どうエンジニアリングの世界へ転用するか一緒にイメージしながら考えてみたいと思います。
この「こんまりメソッド」、日常的に目にするコードにも仕組みにも当てはめられるのではないでしょうか？

思い出して見て下さい。

一番最初にコードを読み、打ち込み、四苦八苦しながらも動かす事が出来たあの感動を。

![あのころ](https://2.bp.blogspot.com/-JPa0Nzk_E8M/Vf-aIH2jsyI/AAAAAAAAyDc/2FG8dSNSk-k/s400/computer_girl.png)

あの時と同じように、これをやったらどうなるんだろう、こう工夫したらいい感じに出来るんじゃないかなって楽しんで試行錯誤していますか？
新しいものが出てきた時に、これどうなってるんだろう？ 凄いなー！と好奇心が刺激されワクワクしていますか？

![ワクワク](https://2.bp.blogspot.com/-Gp2_6OZJ1FQ/XASwZmJF9yI/AAAAAAABQZ0/C8dUDl0e_uEWbDjvwNAo8DArlJX4vIaFwCLcBGAs/s400/computer_programming_man.png)

いつの間にか僕ら大人たちは日頃の喧騒に巻き込まれ、ただ目の前の事をやり過ごすロボットのようになっていませんか？
物事の裏側や事情を知れば知るほど、純粋ではいられなくなる気持ちよくわかります。


しかしながら、あえて問いたいと思います。
今あなたのプロジェクトのコードたちには「ときめき」があるでしょうか？

何万行、何百万行に渡りサグラダファミリアのように肥大化し成長し続ける愛らしいコード達とお別れをするのは辛い事ですよねぇ。(物理的・技術的にも



必要なものは誰かがやるだろうという保守的な関わりではなく、我先にと実行する。
という将来を見越した勇気とやりきる仕組み作りが必要となります。

例えば現在担当しているプロジェクトの3年後の未来は一体どうなっているでしょう。

どんどん肥大化し、メンテナンスコストの高いコードを書き続けているかもしれません。
突如誰かがリファクタリングに成功して、新しい息吹が吹き込まれるかもしれません。
残念ながらサービスが終了しているかもしれません。
もしくはスクラップアンドビルドで作り直しているかもしれません。

時が経つのを待っていれば何かしらの結果はやってきます。

尻拭いは誰がやるのでしょう？
若手に周る？突如入ってきたスーパーマン？
それとも巡り巡って自分が担当するのでしょうか・・・？

臭いものに蓋をしていたのは誰だろう。
自分もその一員だったと気づき続ける事からしか手をつける事は出来ません。

![決心](https://1.bp.blogspot.com/-rC0N6OHlKT0/XdttujaKnpI/AAAAAAABWLg/OLz_d9XyvnEy13HAAsr_EA4QOmXJ40P1QCNcBGAsYHQ/s400/pose_kesshin_man.png)

急に意識高い感じで差し迫ってまいりましたが、、
いやぁ、正直やりたくないですよね。
ぶっちゃけもっと楽に生産的な事したいですよね。

僕も相当怠惰な人間です。わかります。
一人でも限界があります。

さぁ、こんまりメソッドを転用してフレームワークにしてしまいましょう。

# こんまりメソッドでコード断捨離
超訳的ですが、無理やりまとめていきます。
※ 大人の都合でコード断捨離というワードはあまり出てきません。リファクタリングで置き換えてください。

## 心構え
  - 今あるものを愛し、感謝する
     - せっかく関わりを持ってやるならコードも含めていいプロダクトにする意識を持ってみましょう
  - 大切にしたいものを身の回りにおく
     - どうなってるんだろう？とかめちゃくちゃわかりやすいとか好奇心や安心感を得られるコードを目指してみましょう
  - 常にパーフェクトは目指さない
     - 全てを完璧に一気にやろうとすると燃え尽きるので少しずつでもやってみましょう
  - コードと対話をする
     - 全てのコードには文脈があり、意思決定の歴史がつまっています
     - あぁ、大変だったんだなぁもういいんやでとそっと声をかけてみましょう 
  - 頼れるものを頼る
     - 全部自分の力だけで解決しようとせず、人、IDE、サービス、ライブラリを頼ってみましょう

## 分類対象
  - コピペコード
  - N行以上のmethod, function, class
  - モノリシックな巨大プロジェクト

## メソッド
- 整理したいものを全て可視化する
     - 全体での行数、重複コード数、ファイル数、ブラックボックス化し肥大化した神クラスなど
           - やばさをエンジニアだけではなく組織全体で認識したい
- **ときめかないコードは感謝してリファクタリングする**
     - 有難う君の役目は終わった！
     - 必要に応じてマイクロサービス化させて徐々に切り離し疎結合化してみるなど
- 場所毎に集中して片付ける
     - 適切なアーキテクチャやデザインパターンを用いて抽象化しclassを分割してみましょう
     - 同じ種類、同じサイズのものをまとめてみましょう → カプセル化・抽象化・正規階層化
     - テストコードを書き、リファクタリングしても動作保証が出来るようにしてみましょう
- ルーチンワークは自動化する
     - 何気ない繰り返し作業に対して敏感になってみましょう


## 将来的な効能
  - 仕事に向き合う気分が変わる
  - 脳内リソースに余裕ができ、緊張感が変わる
  - 習慣が変わる
     - TDD導入などによりテストを書く習慣がつく
  - やれることが増える
  - 入ってくる情報が変わる
  - 変化に気づきやすくなる
  - 安易に行数を増やさなくなるので第三者である読み手に優しくなる
  - 組織間の人間関係の在り方が変わる
  - リファクタリングを推奨出来るようになる

## リスクへの心構え

気づけばメリットばかり強調した仕上がりになりました。凄く胡散臭いですよね。

リファクタリング失敗して時間だけ無駄になるという結果になったらどうするの？とか、
パフォーマンス落ちたらどうするの？とか、
これが要因で大規模障害発生したらどうするの？

という声が聞こえてきます。

![リスク](https://1.bp.blogspot.com/-6ANy3zIxdh0/WogP8ZsnRyI/AAAAAAABKao/s812Kftyk-gkGZeITg42xL7mqsZn4an0gCLcBGAs/s400/kanden_gaikotsu.png)

大丈夫です。いずれにせよ大なり小なりそうなります。
無責任すぎますね苦笑

というのも、
リファクタリングをしないまま巨大化をしてもパフォーマンスが落ちますし、
テストコードがないままならいずれ本番でバグりますし、
様々な因果関係があいまって大規模障害は起こりますし、
レガシーコードのままなら新陳代謝が起きず才能ある担い手がつかずやがて衰退する可能性があります。

いずれにせよ誰かに謝る日も感謝する日もやってきますが、リスクをそのまま放置せずリスクを管理をすることで、前向きにリスクを取れるようになったりもします。

# 断捨離・リファクタリングが持つちから

コードをリファクタリング出来たら、実は人間関係もリファクタリングされますし、過ごす日常すらもリファクタリングされていきます。

おっと、大げさに見えます？

![ぽかーん](https://1.bp.blogspot.com/-HMFExFItLgM/VZ-QazWvIKI/AAAAAAAAvLY/ABYQKsh7gxg/s300/man_question.png)

少し抽象的に考えて見ましょう。

`refactoring`とは、`factor == '因子'`を再定義することです。
[weblio英和辞書より factor](https://ejje.weblio.jp/content/factor)

それは、関係性の変化そのものです。

因子をいじると様々な事象や振る舞いがバタフライエフェクトのように微妙に変わっていきます。

結果として最終アウトプットとしてのコードの振る舞いは変わらないかもしれませんが、それらを扱う人の振る舞いが変わってきます。

そんな連鎖反応が起きる可能性があると思いませんか？
本家こんまりメソッドでのおうち断捨離効果がきっと生まれます。きっとね。

こういう話をすると量子力学における観測者効果の話もしたいところですが今はやめておきます笑

# おわりに

実を言うと、つい先月僕自身も数ヶ月に及ぶリファクタリング案件で失敗と成功を体験したばかりです。
蓋を開けてみて初めて気づくこともたくさんありました。
反省もたくさんありましたが、多くの人にも助けられ振り返ればいい経験だったなぁと思います。
悔し恥ずかし自戒をこめつつ、この記事を書きました。

大事な事は、**あなたはどんな日常に身を置きたいですか？**という一点です。

ほんの少しの変化をもたらす小さな勇気の積み重ねが、
やがてあなたの日常を好転させる可能性があるかもしれません。

まずは一日10分から意識的に初めてみませんか？
少しずつときめきに触れる日常を作っていきましょう！

それでは良いコード断捨離ライフを！

## PS
幸いにも敬愛すべき同僚@mmm_hiroさんからキーワードを頂きました。
それは「ときめきプルリク」、「ときめきissue」です。

実際に、@mmm_hiroさんより愛のあるissueのやりとりをご紹介頂きました。
https://github.com/python/mypy/issues/4180

issueの内容が盆ミスだったことに気づき「しまった、わいはおろかや」っていうコメントに対し、
「愚かではない、皆に理解の時間を与え、またこれが誰かのデバッグの助けとなるだろう」という返答があり、
「実際に役立ったよ！」という締めがあるという愛のあるやりとりに胸を打たれたそうです。

失敗すら本当は価値のあることなのだという教訓は、僕らにチャレンジをする勇気を与えてくれますね。
優しい世界にホッコリしました。

![love](https://4.bp.blogspot.com/-8zySDVo9aYM/WjdRxLEtRPI/AAAAAAABIz4/WfrKBXqZlF8eqDNyAH0oLXlH-fpZRUkQgCLcBGAs/s300/baby_boy10_heart.png)

もし何か見つけたら、是非こっそりコメントで教えてくださいね(^^)

----
明日は@kanasaki_kenjiさんの記事です！