#117 コードの『品質』ってなんなの? 技術書から学ぼう! Good Code, Bad Code編
2023/2/12 ·
-
順平くん、いいコードって何だと思いますか?過去に、なんかさらっとは、何回も見てるね。 ホットキャストじゃないかな。なんかで話した気はするんですけど、コメントアウトとかがなくって、なぜならコードを読めば全てがわかるからっていう、伝わりやすいコードがやっぱ書いてあること。ちょっとアバウトかもしれないんですけど。
-
じゃないですか25点です25点4分の1ちょうど25点ちょうどでしたねいいコードをエンジニアなんで書けた方がいいと思うのでマジ書きたいですねいいコードがなんでいいのかという話とか悪いコードはなんで悪いのかという話を今日はしていきたいんですけど
-
ただ僕はねコーディングがめちゃくちゃ得意ですというわけではないのでさすがに種本を参照しながらやらせてください本日ですがグッドコードバッドコード持続可能な開発のためのソフトウェアエンジニア的思考という本から情報をピックアップしながら良いコードってこういうコードだよねっていう話を
-
していきます有名なやつですかね有名ではなさそうこの本ですか今年今2月4日に撮ってますけど1月に発売された本
-
結構新しいですねなるほどホットですねホットこの本どんな本かっていうのをざっくり言うとGoogleでテックリードをやっているトム・ロングさんという人が書いた本ですねトム・ロングさんGoogleのテックリードなんてもうとんでもエンジニアですねとんでもエンジニアとんでもエンジニアその
-
技術テックを聞いている上の方の人そうそうそう本の内容はエンジニア3年以内のソフトウェアエンジニアに役立つという内容になっていますぴったり我々にこのラジオにぴったりですね信頼されてメンテナンスできるようなコードを書くためのテクニックや理論についてまとまってますっていう本なので
-
これはちょっと面白そうだなと個人的に思ってて擦れるなら擦ろうかなと思ってるんで引き続きお願いいたします本日この本の一章高度の品質っていう章の内容を引っ張りながらワイワイしていくっていう回です高度の品質良い高度とはっていう話をしたんですけどほぼ同じ意味ですが高品質な高度って何でしょうねっていう話を最初にします
-
さっき読みやすいって話してましたけど読みやすいって言ってたよね読みやすいだけでいいんですか?いえ、ダメです他に何がありますか?そう言われればなんかいいコードですもんねそう、高品質なコードとは何か今高品質って聞いたらやっぱなんかお客様からもいいと思える部分も必要だなって思ったんでそうだね壊れづらいというか長持ちするシステム
-
いろんな書き方ができているとあとはこれでプラス25点で今50点ぐらいですかねまあそうだねあと2個ぐらいあるな60点ぐらいいってるかもしれないギブアップですまあでもほぼほぼ正解なんですけどこの本で書いてたのは5つのポイントですねはい
-
最初お客さん向けっていうところがほぼほぼなんですけど一つ要件満たしてますとそりゃそうだと二つ目要件の変更がしやすい回収しやすいそうそうそうそう質の悪いコードだと結合度が高かったりとかして修正するときにリファクタリングしないとどうにもならんとかどこを直したらいいかわからんとかここを直したら思ってもないとこ壊れたみたいな
-
3つ目がエラーがちゃんと起きるちゃんと起きる適切にエラーが起きて適切に落ちる最悪なのはどっかで引っかかってデータに傷跡を残してシステムが落ちるのが最悪確かにこれ適切に落ちてない状態ですね確かに3つ目エラーの発生4つ目が予期せぬシナリオに対してもなんやかんや動作するのが高品質なコードです
-
これちょっとね難しそうですけどピンとこないかもしれないけどこれはちょっと後でお話ししますで最後がセキュリティ的に安全攻撃されても大丈夫あーなるほどなまああのSQLインジェクション防ぎましょうねとかまあいろいろありますけどそういうのもちゃんとしてるやつは高品質なコードだと言えるよねとうんうんうんいうのが書いてましたなるほどいやまあなるほどなとなんかこのポッドキャストでもいつも
-
動くコードを作るのは駆け出しエンジニアで動き続けるコードを作るのは中期エンジニアだみたいなそんなニュアンスの話をずっとしてきましたけど言ってたことありますねそんな外れてなかったなっていうのは思いつつただちょっと要件の変更とかエラーじゃないや予期せぬシナリオに対しても動くみたいなその辺はあんまり言えてなかったけど確かになと思ってました
-
じゃあその高品質なコードのこういうのが高品質なコードだよって話をしてましたけどどんなコードが書けたらというかもう少しブレイクダウンしてそれをできるようにするには何をしたらいいかというところを
-
見ていきましょうか高品質の品質を司る柱柱鬼滅の刃でいう柱ですね柱何柱いるんですか何柱がいるかっていうと6か7ぐらいいるな結構いるなね一つ一つサクサクいきますねいきましょう一つ目コードを読みやすくするっていうのがじゅんぺいが最初言ってたやつ改めて
-
読みやすいってなんで大事なんですか?誰でも読みやすいってなんで大事?誰でもそのコードを理解できる理解できるとどんな良いことがありますか?理解できるとその理解できた人はそのコードをまた機能追加の時とかにいじりやすくて
-
え、なんだ?最終突き詰めるとあれですかね時間がかからないからとか?うんうんうんっていうことですか?えー、あってますおぉーあってますがちょっと言ってほしいことをちょっと言ってくれず難しいんですけどあーあーまぁあの言ったら時間が縮むっていうところなんですがはいで、さっきじゅんぺいが言ってたのは機能修正がしやすいとかスイッチがしやすいっていうのも一つはいで、あとは開発した後にあのー
-
開発ってローカルで開発してコミットしてプッシュしてプルリクしてってやると思うんですけどレビューも時間かからなくなるんですよねなるほどレビューも時間かからないし読みやすいってことは正しく理解できるし正しく理解できる正しく理解できるってことはそこでバグが混入するのも防げるしっていうのでいろんな意味があって時間がかからなくなるとなるほどっていうのが非常に重要です
-
このコードを読みやすくするテクニックっていうのがあるんですが一番聞きたいですよねこれはまた後日です後日だったまさかだった抽象化レイヤーを定義するのが重要ですっていうのをこの本では言ってます抽象化レイヤーいわゆるメソッドなのかクラスなのかっていうところだと思うんですけど
-
この本の中で話したいこといっぱいあるんですがどの部分をどこから話そうかなっていうのはどうしようかなと思っててまだまだこすっていきたいですからね まず今日はコードを読みやすくて大事でそのためには抽象化レイヤーが重要ですと気になるなら本買ってくださいもしくはお便りでそこの話聞きたいですと言ってくれれば次やるかもしれないし 星狩さんですね やらないかもしれないし
-
お便りもらえればいいですねリクエストから2つ目想定外の事態をなくしましょうというので驚き最小の法則みたいな話なのかもしれないですけどどういうことかというとメソッドとか再利用することあるじゃないですかクラスとかそういう時に自分が作ってないところの何かを利用する時ってコードは見るにしても
-
本当にクラス名とかからこんな動きするんだなっていうのを推測して実装してとかやってたりすると思うんですけど想定外の副作用があるとバグを生み出しちゃうんですよユーザー作るメソッドだと思ってたら
-
ユーザーの講座も勝手に解説されちゃうメソッドだったわみたいなはいはいいらないデータこれいらないけど一緒に持ってきちゃうんだよなみたいな持ってきちゃってるわとかってありますよねあるね持ってきちゃうのはあるよねめっちゃあります持ってきちゃうだけだったらいいんだよねまあまあ確かにメモリーとかは無駄遣いするかもしれないですけどまあでもリソース更新したりするようなメソッドを作るときはそれだけをやる
-
メソッドとかクラスに切り出すというかっていうのは気をつけなきゃいけないところではあるんですがこれなんか達人プログラマーとかでもそうなんですけどコードでの契約っていう言い方をしてて契約今度はチェーンソーマンですか契約チェーンソーマンはそうかもしれない確かに契約正しくね
-
うちはここからここまでやりますぜっていうメソッド名だったら合意をしないのでそういうのちゃんとやっていきましょうねって話も一つありますねそのメソッドの悪魔と契約するですねもしくはね正しくないのが入った時にちゃんとエラー出してくれるとかそういうのも大事だと思いますけどこの辺の話も別なのではいわかりましたこれもじゃあお便り今日はこの本ざっくりこんなの書いてるぜっていう話悪魔でねはいで3つ目
-
ちょっと似てますけど、誤用しにくいコードを書くっていうところこれはあの例えば話からいくんですけどテレビとかってケーブルいっぱい付いてるじゃんでもテレビに付いてるケーブルって誤用しないようにできてるんですよというのも確かにわかる?
-
名前とか色って分かれててここがこうだよって分かりやすくなってるっていう話おおむねそうHDMIケーブルはコンセントに刺さんないしコンセントはテレビのアンテナケーブルに刺さんないし刺さるところにしか刺さらんデザインをしてるからご用意しないんだけどそれってソースコードというかプログラムでも言えるんですよそれこそ例えば
-
モデルアプリケーションでモデル作るときとかにここにはこれしか入らないとかねバリデーション作ったりとかするのは誤用しにくいするための仕組みではあるのでそういうの作っておくと誤った使い方をされなくなったりとか長期的に見るとバグを生み出しづらくなったりするのであんまりガチガチにやってもね頻繁に要件変更の度にエラ吐くっていうのもあれなんですけど
-
そこをいい感じにする必要があるよねっていうのがご用しにくいコードを書くって話ですねなるほどこれはねどんな話書いてるんだろうねこの本ざっくり目次を見るとそうだね全てを普遍にすることを検討するとかあまりにも汎用的なデータ型を避けるとかうーんなんか結構アバウトというかショーの名前だからねショーとかセツかそうだねフレキシブルな
-
変数の型というか使わず結構厳格に管理していくことによって 誤用されにくいコードを書くことができるよねみたいなことが書いてそうですねちょっと読んでないのでまだなんともなんですけどはいはい次コードをモジュール化するモジュール化なんでしょうモジュール化モジュール化?モジュール化 カタカナのモジュールと化けるもうなんか
-
そのPythonファイルPythonファイルじゃないPythonにしちゃいましたけど何でもいいよそのファイル使ったらクラスあってメソッドあってすでにモジュールそれがもうモジュール化なんじゃないのかなと思ってるんですけどクラスとかメソッドとかそれがモジュール化つまり?つまりどうなってることがモジュール化っていうんですかつまりそのファイルメソッドとかが簡潔に書かれていてうん
-
いつでも呼び出せる利用できる状態うぉわぁあはははしっしぶか正解正解おぉおぉ正解しようおぉおぉマジで最初違う方向に走ってったからねもう0.1秒なんならかぶせ気味で外れって言おうと思ったら後半ちょっと合ってること言いやがって逆走してました逆走してたジュゲム来てましたマリカの来てたわジュゲム来てましたジュゲムがちゃんとガイドしてくれたんだ逆だよって
-
適切に呼び出せるというかはいモジュール化っていうのは小さいまとまりメソッドとかもそうだけどはいにまとめてで誰でも呼び出せるようにというか決まった形で呼び出すとちゃんと呼び出せるような形になるあー
-
なるほどマジで逆走してたなっていうのがモジュール化コード書くときもねいろんなものをモジュール化しながら書いていくわけじゃないですか抽象化っていう言い方でもいいのかなこういう風なことをやってると変更しやすいとか管理しやすいコード書けるよねっていううんうんうん
-
ことがありますそれこそオブジェクト思考とかだとさインターフェース作ったりとかっていう話になるんでしょうねカプセル化とかねその辺の話が書いてますはいじゅんぺいくんは完璧かもしれませんがいや今やばいですね今やばいファクトリーパターンとか使ってるんですけど難しいなもうやりたいやんなきゃなはい次あと2個ですねコードをサイリーを汎用化しやすくする
-
これもでもちょっと似てないですか確かにモジュール化にちょっと似てるのかもしれないけどモジュール化はどっちかっていうと再利用しやすいっていう方かもしれないね汎用性再利用っていうのはドリルでいうと壁にも穴開けれるし
-
床にも穴開けるみたいな。 穴開けるっていうタスクについて床でも壁でも再利用できるのが再利用性。 汎用性ちょっと違くてねじ穴開けれるし、ドリルの穴も開ける。 穴系はいけるよっていうのが汎用性。コードについてもどっちもあった方がいいよねっていう。
-
汎用性のあるコード具体的にどんなんじゃいってうわー難しいそれこそオブジェクト思考それは再利用性になるのか例えばなんですけどめっちゃAWS話しちゃうけどCognitoっていうサービスがあってそれって何やってるかっていうとアプリケーションでユーザーを作ってユーザーログインとかアカウントの管理するかと思うんだけど
-
それに必要な機能がざっくり入ってるようなAWSサービスAPIって言っていいのかななんだけどそれってモバイルアプリのユーザーも作れるしPCのアプリのユーザーも作れるしどんなフレームワークでもユーザー管理ができるみたいなすごいなっていうところでこれはある種汎用性って言えるんじゃないかなとは思う確かに確かになんか
-
再利用性ではないですよねまあそう再利用性でもあるけどねでもあるの?これでいうなんかハンドドリルみたいなものだと思っている再利用性だったら
-
PCとモバイルがあってPCとモバイルそれぞれのためにそのコグニートを用意するみたいなのが再利用性っぽいなって気がしててでも一つのコグニートでモバイルもPCもいけるっていうのは確かに汎用性なのかななんとなくイメージが湧きましたけどまあまあ俺自身もちょっと人それぞれなところもありそうですけど同じ問題の解決ができるだからどっ
-
どっちもなんじゃない? うーんまあ意識してねって話ですねで、まあこの辺の話で言うと はいあのー自分でコード書くじゃん はいで、今はこの要件だけに満たせればいいというかなんか、なんて言うんだろうなじゃあ、じゅんぺいくんユーザー管理作ってって言われた時にさ はいじゃあパスワードのバリデーション うん例えばね
-
8文字以上文字集3集以上でバリデーション書けよーって思ってコーディングしたときに再利用性反用性を考えないとそれをそのまま書くんですけど再利用性反用性を考えたときにじゃあここの文字の長さ変えれるようにしとこうとか文字集も変えれるようにしとこうとか使う記号の文字
-
固定じゃなくてこれも設定ファイルとかに出しとこうみたいな感じで気遣いをすることによってコードの品質が上がるよねみたいなできたことねでもそれは慣れだよね最初はちょっとなかなか難しいけど動き続けるソフトウェアの次のみんなが使えるソフトウェアを作ろうというところになるかもしれないですね最後がいつも言ってるテストしやすいコードを書きテストしようというのが最後ですね
-
ずっとテストで話してるんですけど最近テストしやすいコードテストしにくいコードってなんだか分かりますか前ですねテストコード書くってなった時に悪いコードに遭遇してたのかなって最近思うんですけどなんか返ってくるものがよく分からないすごい追わないすごい追ってかないと
-
結局最後リターンされるものってなんだっていうのがすごい分かりづらかったんですよそこら辺がなんかもっと入れ子入れ子入れ子みたいな感じでここから出てきてここから出てきてこれから出てきて最終的にはこれがこうなるからこれがリターンされるみたいな分かりづらかったなと思ってテストコード書きづらいなって思いましたその時は多分合ってるのかなきっとちょっと想像で聞くんだけどはい
-
それはあのメソッドか何かに入る値によって返り値がいろんなパターンで変わるみたいなことだよねはいはいはいはいそういうのでテストしづらいんですよああそうなんですかよかったその通りでよかったです俺もテストケースが多いメソッドになると思うんですよそういうのって確認しなきゃいけないことが多いっていうのははい
-
もうそうだしだと他にはそうだねステートフルなメソッドはいはなんだっけはい状態を持ってるっていうのかなはいこういう他のメソッドないしクラスかなんかわかんないけど他の何かがこういう条件の時はこういうの返すしそうじゃない時はこういうの返すしみたいなメソッド単体でテストできないっていうのはいはいはいわかりますそういうのもテストしづらいって言いますね
-
それこそあれですか外部APIに依存してておそらくこの値が返ってくるはずっていうのでそれは微妙なそれは普通それは普通それは別の話でなるかもしれないけど普通でしたAPIは叩くからなテストって結局ね
-
人は間違いを犯すのでうんしあとなんか作っていくともうねエンジニアが見れないほどの量のコードができる上がるわけですようんだからもう機械にチェックさせんと品質散歩できないよねっていうところですようんでこのテストの話も書いてますこちらの本にはいはいでテストってはいめちゃめちゃ気にしなきゃいけないこと多いんですよねうん
-
あのードンキが多いんですよテストの本ってドンキ法廷?ドンキ法廷?違うドンキに多いじゃないドンキに多いじゃないドンキに売ってたらもうドンキすごい勇気だよどういうビジネスモデルにしてんじゃんターゲット変えすぎじゃないどういうことですか情報量が多いんだよねユニットテストっていう本がいっぱいあるじゃん
-
はいとかねそんな中こちらの本なんと1章にガッとまとめてるんでダイジェストだろうかなダイジェストだろうねこれはね見たことないこんなに短くまとまってるの楽しみこれは今の並行して並行してっていうかこのグッドコードバッドコードはマジでポッドキャストで喋るためだけに読んでるんですけど自分の知識もアップデートしつつ
-
普通に趣味で読んでるユニットテストの書き方と考え方だっけ単体テストの考え方使い方でしたの本も読んでてそっちは普通に趣味で読んでてこっちね結構面白そうな話がいっぱいあるのでそっちの話とまとめてやりとか比較して単体テストの話できると良いなとすごい有意義なエピソードになるぜそれできたら
-
それできたらいいよね本読むだけじゃ得られないですからねっていうのを目指して今頑張って考えてますごちそうさまですすごいはいつーので長々話してしまいましたが品質の柱でいうと読みやすい想定外の事態が起きない誤用しにくいモジュール化する再利用汎用化しやすくするテストを書くっていう
-
6つですかね6柱6柱はい6柱です1人死んじゃったりしません?大丈夫ですか?死だーや分かんないねキャラ被ってるのいそうだからね確かにちょっと見てるとねここまで高品質なコードを書くっていう散々そういう話をしてきましたが高品質なコードを書くことによるデメリットってありそうじゃない?そんなことない?書いてますか?高品質なコード純平くん今いやあの
-
書いたことないですごめんねなんか悪いこと言わせてるけど書いたことないですでもそれはなんで書けないの?えーと巧妙に誘導尋問しようとしてます今なんで書けないのかっていうとそこまでいいコード高品質なコードが何か分かっていないからそれはあるのかもしれないけどそんなの調べればあるやんいや分かんないちょっと言い過ぎかな今の誘導尋問に失敗したのですいません時間足んなくない?
-
そういうことか確かに時間あればもっとちゃんと考えてるんですけどちゃんと考えると思うけど例えばさちょっと前に話をしたテスト駆動開発とかだとレッドグリーンリファクタリングって言って最初に単体テストこけさせて単体テスト通るようにコーディングをしてであよっしゃ動くようになったわって言って次に行くんじゃなくてリファクタリングをするんですようんうん
-
で、レファクタリングをして、で、まあレッドになっちゃうかもしれないからっていうので、そうやってグルグルサイクルを回して、どんどんコードをいいものにしていくんだけど、はい。だから、そんな回してない人がほとんどだと思ってて、よっしゃ、動いたら次行こう、次行こうみたいな。まあ、そうですよね。で、それは、脳機があって、急いで仕事をしなきゃいけないから。確かに。ではと、勝手に思ってるんですよ。うん。ただ、ただ、あなたのその、よっしゃ、動いたら次行こうによって、将来的にものすごく時間がかかってしまう可能性があるんですよ。うん。
-
それなんかなんとなく分かります?もう磯がまあまああれ的なあほんとにそうマジでこの本に書いてた最後の結論を言いやがったすいませんいやいいけどなるほどそうまあちょっと今直感的に理解できない人のために例え話がこの本にあったのではいはい例え話そのまましますねビュッフェかなあビュッフェ
-
ビューフペで話せたらよかったね話せそうだけど話しません本の中に例えがあった例えばですよお家に棚をつけようと思った時に棚をつけようと思った時に正しい方法と最速の方法2つあります1つ正しい方法は金具とか使ってカビに穴を開けて棚をちゃんと固定するのが1つ
-
最速は接着剤つけてアーンってつけて戸棚を作るPPAPみたいな感じですかねそうそうそうPPAPもほぼ接着剤みたいなもんだからねあれ最速ですね接着剤の方が早いやん早いです例えばだけど金具で固定しようと思ったら30分接着剤やったら10分かかるとしますと
-
ただ10分で付けたで、ここに20分節約してるけどはいあ、戸棚ずれて設置されちゃったなっていうバグが見つかった時金具だったら抜いてはい刺してで、綺麗に付けて終わりうんうん接着剤だと「うーん」ってやったら壁のなんか石膏剥がれちゃったみたいなあーなりますねなかなか取れないしなかなか取れないしね
-
っていうので壁をきれいにしたりとかっていうのでさらに時間かかってしまうとか要件変更だとあとは部屋の模様替えがしたいと思った時に同じことが起きますと起きますね金具だったらね取ってね場所変えてねうんってやったらねちょっと壁の穴は開いてしまいますけどはいはいまあまあまあシールとか貼っておけばいいと思うんでで接着剤はもう同じようにうんってやったら壁ベルっていっちゃうんでえーなるほどリファクタリングとかしづらいと非常にそうそうそうそう
-
だから最初から手間を惜しまずに外しやすい方法というかモジュール化されているような方法でできるような方法でやるとコーディングもすんなり終わるよねっていうのがこの1章目コードの品質という章の最後の締めの言葉でしたなるほどわかりやすい例えでした若干のびのびと話してしまったんですけど品質いいコードの方がいいよねっていうのは聞いている皆さんもともと分かってたことかと思うのでそうですね
-
品質の良いコードとは何だろうなっていう時に要件満たしてて変更しやすくてエラーも正しく起きて汎用性があってセキュリティ的に強いよねっていうところが頭の片隅に置かれてれば一旦今日はいいかなっていう感じですね今後は読みやすいコードを書くためには何するんだっていう話は少なくともしたい少なくともそうですね
-
他どうしようかなーって感じですがまあ面白かったら随時する感じで読みやすいコードとあとユニットテストなんしかなお便りで聞きたいですってすごい言ってくれたらもう話しちゃうぞってなっちゃうかもしれないですねなんなら勝手読んでくださいって感じだけどねこの本ねあのねちょっと読んでるけど難しくないと思う難しくないは言い過ぎかな難しくない簡単ではないけどうん
-
3年目までに読めっていうのは少し要求することが高いかもなとは思うけどでも理解できないことではないと思うっていう肌感覚ですねでもアメリカの3年目はやっぱここ読んでちゃんとやるんだなっていうのは肌で感じるところではあるね日本でもそうしていきましょうマジでそれ全員ここひまじんプログラマーのリスナー全員高品質なコード書けるように書けるように
-
そういうのを目指していきましょうはいというので今日はグッドコートバッドコートの一緒について話しながらバイバイしました続きも交互お期待交互お期待じゃあ終わりまーすバイバイバイバイ
-
さあ皆さん次の商品は目玉商品ですこちらめちゃくちゃでかいエンターキーわー大きいこれがあるとストレス発散生産性アップ快適な睡眠もえ枕にしちゃうんですかこちらの商品はお値段など1024円わーお2の10乗
-
そして今番組終了1時間以内にGoogleフォームよりお便りを送った方はちっちゃいスペースキーも付いてきますポケットに入れて持ち運べますね番組の高評価フォローもすると会員割引なんと90%オフほぼただ今すぐご応募
#117 コードの『品質』ってなんなの? 技術書から学ぼう! Good Code, Bad Code編