#215 A Philosophy of Software Designに学ぶ、メソッド分割の流儀(VSボブおじさん!?)
2024/1/21 ·
-
本日ですがはいはいアフィロソフィーオフソフトウェアデザインアフィーという本からですね僕が読む前から一番気になってたボブ王子さんとのプロレスパートについてちょっとお話しさせていただきますバトってんのはい
-
ちょっともう少し解説をするとですねまずこのA Philosophy of Software Designとは何かというとですね僕が12年末ですね2023年の年末に読んでいた要書で英語の勉強かつエンジニアの勉強で読んでいたソフトウェア設計に関する本ですねはい
-
で噂だとクリーンコードとかクリーンアーキテクチャーとかそういう本を書いているボブ王子さんアンクルボブ有名な人その方も結構ソフトウェアを作る哲学というかねその辺を説いてる人なんですけどその辺と全く違うことを言っててプロレスしてるぞっていう噂を僕が聞きつけてこの要書を読んでる試合なんですが野獣馬ちゃん試合見に行ったんすね
-
今日はプロレスしてるぞーなところをお話しさせていただきますほー本当にしてるんだ実況中継いいねというのでどういうところでプロレスしてるのかというと色々あるんですけど本日はコード分割という文脈でプロレスの話をさせてもらえればなと思ってますコード分割はいどういうことかというとですねコードを実装するときに2つのメソッドとかを合わせるのか分割するのかみたいなやっぱ悩むと悩むねうん
-
分かるわそれ今日の話の中心としてはフィロソフィーオブソフトウェアデザインという本にどういう勘どころで分けるべきか一緒に書くべきかみたいなそういうところをちょっとお話ししていくので今日はじゅんぺいが最後
-
あの黒を飛ぶって来たクリーンコードでこう書いてたけど他の本ではこういうこと書いてるよって言えるようになるできるふうなるほどねできる人あるある複数の本から引き出し出せるそうそうそうそう日本人は結構クリーンコードというかボボジさんの本読む人が多いと思うんで別のも持ってるよ頭の中にって言って
-
空気感を出せる結構分割って感じですよ僕はさっきのはまだ分かんないですけど全部分割はしないでしょでも基本でも分けれるなら分けるって頭になってますこれまでの感じ僕もその感じになってますねっていうところをお話ししていきますねこの本の中では大垢が書かれていくんですけどこのコード今あるコードを分割すべきか合わせるべきかっていう基準として
-
これを分けるもしくは合わせることによってシステム全体の複雑性を下げられるかっていう基準で分割したり合わせたりしろと言ってますこのちょっと前のエピソードでも話しましたけどこの本のテーマって結局ソフトウェア全体というかシステム全体の複雑性を下げるには
-
みたいなものが書いてる本だったんですけど複雑性なのかっていうと依存性と不明瞭さによって生まれますよみたいな話をちょっと前のエピソードでしましたと依存性っていうのは関数同士が呼び出したりっていうところ不明瞭さは命名の不明瞭さとか分割の不明瞭さとかそれに認知的負荷があるよねみたいな話がありましたけどもそれらを全部ひっくるめて分けることで複雑性が上がるか下がるか合わせることで上がるか下がるかこういうところ
-
をまず見ていこうとあともう一個大事なのがモジュール性を向上させることモジュール性わかりづらい言葉が出てきましたがモジュール性っていうのは再利用しやすいかってことですね要するにね使い回すときに便利な単位で区切ろうねとこれが基準ですとこれはまあ
-
せやなって僕読んでたんですけどプログラムを書いてる時クラスとかメソッドとか定義してるわけじゃないですかその中にはパブリックなものプライベートなものあると思うんですけど要するに他のメソッドとかコードから呼び出せるものとそうじゃないものでパブリックなものに関しては要するにそれってAPIなんですよなるほど他のプログラムから使えるよねっていうそうですそうですそうですそうです
-
この本で書いているところで言うとなのでユーザーがいますとこのメソッドとかに対してというかこのメソッドを使うユーザーがいますそのユーザーが使いやすくなるかどうかそれを意識してモジュール性を向上させて複雑性を下げるように作っていくべきそこがむずいんですよそうですよねだから使うときの気持ちになる
-
っていうところですよねこれは僕確かになって思いながら読んでたんですけどプロダクトデザイン企画とかする上でもユーザー体験ってめちゃめちゃ重視するんですね昨今のモバイルアプリで言うとさ
-
アプリをダウンロードしてポロンと初回で使った時には最初に使い方が出てきたりとかアカウントも流れるように作れるようになってるじゃないですかあれってユーザー体験を意識した作り方してるからそうなんですけどこれをソフトウェア開発にも活かすべきなんだなと思ったんですねそれはフィロソフィーオブカイチですかいや聞きなさい英語からの
-
カイチからの日本語ですなるほどなので一応書いてあることではありますユーザ体験を重視するというところはこれが最も顕著に現れるのがインターフェースの部分なんですよそれはインターフェースと言っているのは
-
講義のインターフェースですねオブジェクト思考というよりは広い意味でどう使うかをどう公開してるかみたいなそうですそうです呼び出すときメソッドを見ますよね呼び出すメソッドそれがインターフェースです
-
つまり引数がどうなってて返り値がどうなってるかメソッドだとあとは実際に開発体験として開発するときって多分呼び出そうと思ったメソッドのコード見に行って頭の方ちょろっと見てふんふんこうなってるんでどこまで追いかけるかはその人次第なんですけどその入り口のメソッドがどういう作りになってるかみたいなねここを頑張ってやりましょうっていうのがひたすら書いてるなるほどね
-
今のところまだプロレス感は感じてないですけどねちょっとそこもまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあまあ
-
あとは合わせた時によりインターフェースがシンプルになる場合重複部分が排除される場合は合わせましょう分けるべき時はモジュールがいくつかの異なる目的のために使用できるものがある場合もう一回いいですかそれ単体でいろんなことをやっちゃってる時そういう時は分けましょうとここはまだ分かるとここから若干プロレスパート入っていくんですけどおお
-
この本書ではコードをこのようにすると分けた方がいいとか分けない方がいいみたいな話があるんですけどその中で最も厚く語られている部分エンジニアメソッド分割しすぎ問題これ非常に熱量を感じてます僕はそうなんだ一つのメソッドの長さを基準に一つのメソッドの長さを基準にメソッドを分割するという話がどうやらあるらしいが
-
本当にそれって正しいんだろうかという投げかけをしてますここの瞬間では名前は出てないんですけど僕はポーンと一つ思い浮かんで従業員なおじさん従業員なおじさんAKアンクルボブなるほど
-
でこれはなぜかなぜそう言ってるかというとメソッドを分割するというのはそのメソッドのインターフェースが増えるということです分けると増えるということですよねインターフェースが増えるってことはコード全体の複雑性がどんどん上がってると言えるんじゃないかとうんうん
-
それぞれ複雑な相互作用がある場合例えばこのメソッドを使ったら絶対このメソッドを使わなきゃいけないとかそれがもしくは連鎖してる場合とかそういう時ってわざわざメソッドを飛んで飛んで飛んでって言って全部通読して読まなきゃいけなくなると分かる確かにいや大変だろとじゃあ一箇所にまとめるよとうんうんうん
-
何ならその10行以内とかじゃなくてもそのメソッドの引数シグネチャって言い方しててこれ多分一般的な言い方でメソッドのシグネチャって命名とか引数戻り値の型をシグネチャって言うんですけどそのシグネチャが分かりやすかったら別に多少長くても分かるだろうとこのメソッドはこういうことをやるものなんだなっていうのがもうメソッドの1行目見れば分かるわけですからはい
-
そんなん授業とかじゃなくて別に素授業ぐらいなら分かるやろとうんうん各業とかまでなら分かるやろとなるほどねー
-
今聞いてて非常に難しいなと思ったのは例えば細かいメソッドが分かれてるとするじゃないですかAっていうメソッドBっていうメソッドCっていうメソッドっていう順番で呼んでますよとはたまたもう一個はDBEっていう順番で呼んでますよってなった時にBって共通してるじゃないですかそういうの出てきた時にこの辺悩んじゃうんですよね分けるべきなのか一緒にするべきなのかみたいな
-
確かにこのABCっていう流れで見たら一個にまとめちゃってもいいんじゃないかなと思うんですけどただBの部分だけ重複してるからここコピペで作ることになるよねみたいななんかこの絶妙なラインのやついっぱい来ないですかなんか開発してたら分かるけどそれはいいんじゃないですかBはBで抽象化すればっていう気持ちになりますねそうなんだ多分そこは本当に全部ぶっちゃけ
-
指針ではあるので厳密にこれを守らなきゃいけないってわけじゃなくて総合的に見たときにどっちが複雑性下がるかななんですねこれで言ってるのは何でもかんでも分けるなとそれこそ従業員内おじさんの理論で言うと従業員内おじさんABCが101010で書かれてたらそれぞれ全部メソッドにするわけじゃないですか一回しか呼ばれなかったとしても例えばねそうじゃないだろって話をしてるわけだけですここはもう一つ言うとこの
-
フィロソフィーオブソフトウェアデザインでめっちゃいいって言われてるメソッドの作りとしてはシンプルなインターフェースでいろんなことをがっつりやるメソッドがめっちゃいいって言ってるんですよ
-
でまあちょっとこれ言うのは安しやるのはガタシなんじゃないかっていうところはあるんですけど僕がわかりやすく想像したのは多分画像解析メソッドとかなんですよ画像解析のメソッドってどういうことかっていうと多分画像を引数に渡して画像ファイルのパスかなを引数で渡して
-
実行するとそれって裏側でとんでもない処理が行われてるんですよ画像のエンコーディングしてエンコーディングした後にそのエンコーディングした色情報を配列に渡してその配列をAIのライブラリに食わせて返ってきた値を画像にもう一回起こして
-
例えば物体検知とかだったら四角い枠に直してそれを合成して合成した画像を返すみたいなめっちゃいろんなことやるんですよでもシンプルなインターフェースで一つの機能を提供してるんですよそういう簡単なインターフェース深い機能を持ってる関数だとユーザーは認知的負荷低いじゃないですか具体的に画像認識どうやってやってるとかも知る必要がないんでそういうメソッドが一番きれいっていう哲学のもと
-
シンプルなインターフェース深い機能作っていくだからそのために分割しすぎるんだよっていう話をしてるんです分割しようとすると画像を渡してエンコードしたのが返ってきますエンコードしたやつをAIに食わせるっていうメソッドがありますみたいな設計じゃなくてドーンってやってくれるのにしましょうねっていうのがその行数じゃなくてシンプルなインターフェースディープなメソッドを作っていくファサードパターンっぽいよねなんか
-
ファサードパターンの話あったな何の本だっけファサードパターンってその細かいメソッドいっぱい作ってあってただこれだけだとちょっと流れがよく分かんないからその流れをまとめたものを一個作るみたいなパターンなんですけどすごいそれっぽさを感じたなっていう
-
多分目指してるところはみんな同じだと思うのでそういうこれだよねって多分いっぱいあるんでしょうねなので今いろいろ話してましたけど結局行数で分割するんじゃなくてやることで分割すると逆にメソッドを分割するときはどういうときかっていうとそれを分割することによって良い抽象化になるその良い抽象化っていうのはどういうことかっていうと
-
さっきの画像の話画像解析の話でいうとインターフェースがシンプルで深いことをやると言ったじゃないですかただその深いことは全部同じメソッドの中に入ってるわけじゃないですねプライベートメソッドとしてそういうことですねそういう風にインターフェースをそのままにして裏側を分けるのは別にいいよと言ってます
-
そのイメージだったそういう時は分けると分かりやすくなるしあとユーザー開発者ですね他の開発者の臨時的負荷は上がらないから分けるの良いあとインターフェースが複雑なすぎる時も分けましょうと言ってます例えば分けることで引数が減ったり命名しやすくなったり
-
そのコードを書くときのアンチパターンでうわメソッドのいい命名思いつかないってときはいろんなことやりすぎてるからだみたいなの話ありますけど分けることで命名しやすくなる時はインターフェースが複雑すぎる赤信号って言いますからねなるほどね今ちょっと思ったけど今の感じだとボブおじさん10行でまとめろって言ってるような感じに聞こえてるけどはい
-
ボボジさんもあれだよね別に10行以内にまとめろよって言ってるっていうよりはちゃんと設計すれば10行以内に収まるはずだ的な感じだよね別に行で切るみたいな感じじゃないよね確か僕クリーンコード見直したんですよこれ読んでてクリーンコード何言ってるかっていうと僕も何書いてたっけなって流し見したぐらいなんですが少なくとも20行に達することはほとんどないようにしろっていう書き方はしててうん
-
結果としてそうなるって話なのかもしれないですけどただこの著者がフィロソフィアソフトデザインの著者が言ってるのはボブおじさんがちょっとこんなことを言ったせいでありとあらゆるエンジニアが行数で切ろうとしてるのに問題視してるっていうそれは問題視した方がいいところではあってそれは問題視した方がいいわあとそうですね2から4行ぐらいで書かれたコードは綺麗に書けたなっていう話をボブおじさんはしててうんうん
-
綺麗に設計したら分けれる楽しいじゃっけなんかそんな雰囲気を感じたけどね綺麗に設計するんだったら分けろって話だと思ってました僕てっきりあーそうなのかなちゃんとそのソリッド原則にのっとって綺麗に作ったらそんなでかいコードにはならないはずだよっていう意味かと思ってたわうんうんうんでもそうやって分けると読みづらくなるって話はしてたのでこのフィロソフィーオブソフトウェアデザインの中では一箇所にまとめろとうん
-
あとちょっとさっき聞いてて思ったのはめっちゃすごいことをやってるファイルを中で分割する分にはいいよみたいな感じだったじゃないですか
-
別にそれのことを言ってるんじゃないかなともちょっとなんか聞いてて思いましたねそれのこと言ってるのはボブおじさんかそうそうそうそうそれはあるのかもしれないですねただそのボブおじさんのやつの愚直に守るとインターフェースが増えるのはありそうな話がありそうな気がしててそれだけだとそうなっちゃうこともありますよねもっと制限加えろって話なのかもしれないですねだからうんうん
-
どっちかっていうとその2人がレスリングしてるっていうよりはボブおじさんのパワーによって生まれた悪しきモンスターたちとプロレスしてる感をちょっとなんかふと思ったかもしれないそれは近いのかもしれないですがまあでもちょっと通俗するとレスリングしに行ってるなという気持ちになりますそうなんだまだまだあれなんだまたちょっと別のエピソードで正直今ので割と
-
話を終えつつあるので最後まで話し切っちゃうんですけどインターフェースが複雑すぎるときに分割しましょうって話はちょっとしてましたけどさっき分割したときにメソッドを呼び出す人がよりシンプルなコードを書けるようになってるかっていうのを思い浮かべて分割しましょうねっていうので本当にあくまで終始使う側使う側が書くコード使う側が理解する
-
っていう文脈でメソッドの分割を考えましょうという風に書いてたのがこのフィロソフィーオブソフトウェアデザインの話でしたなるほどっていうので行数で切るんじゃねえぞとでもなんか分かる気がするな
-
細かく分けた弊害みたいなのを実際に感じたことがあるんですけど僕もですオブジェクトを作るじゃないですかクラスにメソッドがいくつかに分かれてるんですけど絶対この順番で呼ばないと動かないみたいな実際には依存してるよねみたいなコードとかを見たときに
-
悲しい気持ちになったりするんですよねこのじゃあ呼び出し方どう覚えるのみたいなそうそうそうそうあれが多分悲しきモンスターのコードというかわかります僕も愚直に一回書いたことがあってそうなりますよねあと引数リレーね引数リレーあるわあるわそれこの引数覚えてた読みながら覚えてなきゃいけないのにこのメソッドに呼び出すのに使ってるだけやんみたいなのとかいっぱい増えてなんか
-
なんかなーって思いながら書いてましたかといっても別にもっといいのが書けるわけではなかったのでこれは結局どう思うっていうのが結論なんですよ言われてみればですけどそうだよなーとは思いますね行数で区切るは行数で区切って書いたことはあんまないんであんまっていうかないんでそこの域に達してないっていうのはあるんですけど
-
使う側っていうのは確かに呼び出す側の気持ちみたいのはもうあんまちょっと考えてなかったんで実際呼び出す側が認知しやすい使いやすいものって結局命名とかが一番強いのかな命名と引数に渡すかっていうのがはっきり分かれば使いやすいのかなって気はしましたけどうんうんうん
-
じゃあ結論そのクリーンコードとクリーンコードを踏まえてこういう意見もあるよというまとめをちょっとしてもらいたいわかりましたまずはボブが言ったことは聞くなと極端行数関係ないよ誰か言ってたけどそこは関係なくてそういう話ってよりは
-
なんか本当に使用者呼び使うそれを使う人たちの気持ちを考えたコードを書こうっていう話でちょっと細かく言うとえーなんて言うんでしょうコードはなんて言うんだろうな呼び使う人たちに影響を与えない範囲なのかなであればなんか中身がその呼び出すメソッドとかが複雑であればなんかこう結構細かく分けてあの
-
分割してもいいけどみたいな話で使う人を意識しましょうっていう感じですどうですかまあいいかなしどろもどろになってなかったら合格出してもらおうすみません付け加えなきゃよかったな細かく言うなよクリーンコードでよく
-
言われることがあるとりあえず攻めすぎててインパクトに残りやすい10行以内おじさんの10行以内理論なんなら20行以内なんですけどね20行に達することはほとんどないようにと書いてるので20行以上はもう本当にお前はそれはお前のプログラミング力不足じゃと言わんばかりのことが書いてるんですけどそれはクリーンコードの考え方一方で別にもっと行数じゃなくて
-
数十行ぐらいまでだったら多分シンプルなメソッドなら理解できるはずだし無駄に分けすぎて読みづらいとか理解しづらいになるぐらいだったら同じ文脈のものは一個にしろと一方で複数あるときはちゃんと分けないとよく分からんことになるから分けるものは分けろという風に書いてたのがまあ
-
フィロソフィーオブソフトウェアデザインのお話でした人間の読解力というかすごい大事だなって今必死一生思ってたんですけどなんか
-
僕その2つって共存できる話なんじゃないかなって思ってるんですよ言うてどっちも取り入れていくのが大事かなと思っててAさんがビタミンCがマジで最強だからビタミンC取っとけって言っててもう1人が出てきてみんなビタミンCばっか取ってるけど食物繊維も大事だよって言ってるけど結局どっちも取んなきゃいけないんだよって言う話なんじゃないかなと思っちゃいましたねそうですね
-
結局ボボおじさんが20行以内に達することはほとんどないようにって言ってるのは多分読者の行動を変えるためだと思うんですねそれを絶対に守らないとダメなわけじゃなくてそこまで言わないと多分変えてくれないから言ってるだけなんじゃないかと僕は勝手に思ってるんですけどだからそういう意味だと本当にいろんな情報を見て自分なりの答えを探していくというか
-
考えるのが結局一番大事そうね実際のコードで行数がこうなったからって切ってるのは見たことないけど確かに切りすぎてこれどう繋げるんだろうっていうのになってるのは結構見かける気がするんで細かく切りつつもインターフェースどうなるかっていうのを同時に意識するのが大事なのかなと思いましたねその通りありがとうございます
-
本日お話しさせていただきましたあと1回予定してますPhilosophy of Software DesignVersus Bobojiさん編そこもバトってんだあと1回だけお付き合いくださいじゃあ切ってしまいますねハッシュタグひまじんプログラマーでSNSでフィードバック募集してますのでご意見ご感想
-
お待ちしてます僕もプロレスしてるよって人がいたらぜひ教えてください見に行きますあとは説明欄からGoogleフォームでお便り募集してますこちらもお気軽にお願いいたします何でも聞いてくださいお待ちしてます最後にPodcast Platformの高評価コメントお待ちしてますこちらもお願いいたします星5
-
お待ちしてますいつも聞いてるよという人高評価してください聞いてるぐらい気に入ってるんだからお願いしますプロレスしに行こうとしてる数字と高評価数合ってないよ確かに合ってないフォローしてるけど高評価してない人もめっちゃいるよみんなカイチはまだ納得してないぞ怒りそういつもありがとうございますではまた次回バイバイ
-
こんばんは6時のニュースですまずはこちらのニュース上野公園でパンダの赤ちゃんが生まれました名前はペイペイになったようですあ、おっとここで速報が入りました現場のノリさん
-
こちら現場ののりさんですなんとかけ出しエンジニアを成長させるポッドキャスト番組ひまじんプログラマーの週末エンジニアリングレッスンの最新話が配信されたようです今回はどんなエピソードなんですかねいやーちょっとわからないんですけど私もちょっと家に帰ったら早速聞いてみたいと思います気になりますねのりさん中継ありがとうございました続いては秋の訪れを感じるこんなニュースが届きました
#215 A Philosophy of Software Designに学ぶ、メソッド分割の流儀(VSボブおじさん!?)