抽象化idea「読みやすいコード」というのは変な物で、今は自分で読みやすいコードが書けたと思っていても、他人から見ると読み難かったり、時が経つと自分でも読みにくいコードに変身したりする。バグがないから読みやすいという訳でもなく、読みやすいからバグがない訳でもない。機械はコードが読みやすいかどうかなんて気にしてない。製品の質ともなんら関係ない。エンジニアは人間が読みやすいコードに固執する。それには、ちゃんとした理由がある。読みやすいコードを書くことが大切な理由エンジニアがコードを書く過程をシステムとしてとらえ、高速化してみよう。多くの場合、下の流れを繰り返すことになる:既存のコードを読み、理解する新しいコードを書く(テストコードも含む)テストするボトルネック以外の高速化は無意味なので、ボトルネックを高速化する必要がある。ここでのボトルネックは何だろうか?多くの場合、既存のコードを読むことに大半の時間を使うはずだ。そのコードは3年前に書かれたものかもしれないし、1分前に自分が書いたものかもしれない。コードは一度しか書かれないが、これから数え切れないほど読まれることになる。いつ誰に読まれるものになるかも分からない。沢山の時間をかけて読みやすいコードを書いてもしても、これから幾度となくそのコードが読まれていく上で、書いた時間とは比べものにならないぐらいの時間を短縮することができる。時間をかけてでも読みやすいコードを書くことは、エンジニアがコードを書くときだけでなく、早く製品を顧客に届けることにもつながる。読みやすいコードを書く上で、一番大切なこと「自分では、自分が書いたコードが読みやすいかどうかが分かりにくい。「だからコードレビューをする。確かに、コードレビューはコードを読みやすくするためにとても役に立つ。自分で一人でできることもある。それは、コードと会話することである。あなたが月曜日に会社にきて、同僚に話しかけたとしよう。🧑🏻「へー、楽しそう!どこの遊園地?」というような流れになるだろう。同僚が言っていることが、何も考えなくても自然と頭に入ってくる。👩🏻「土曜日は朝の6時に起きて、洗面所まで歩いた。歯を磨いたのち、台所まで歩き、朝ご飯の準備にとりかかった。冷蔵庫の扉を開けてバターを取り出し、冷蔵庫の扉を閉めた。棚に置いてあるパンの袋を持ってきて、袋を開けて、パンを一枚取り出し、バターを塗った。そのパンをトースターに入れて、...」これでは「週末がどうだったか」を理解するのに大変な時間がかかってしまう。実は上の会話での「楽しかったよ」という返事は、普段の会話で意識することなんてないが、エンジニアがよくいう「抽象化」という概念をうまく利用している。大切なところだけ切り出して詳細は隠すことで、会話をスムーズに行うことが出来ている。人はエンジニアになる前から、抽象化の達人なのだ。考えると、初めて聞いたときは「なんじゃそりゃ」と思った「抽象化」という言葉も、実は物心ついた頃から無意識に使っているものだと気づく。逆に下の会話では、この抽象化が全然出来ていない。「いや、結局週末はどうだったの!?」となってしまう。抽象化されたコードでは、今読んでいるコードが何をしているかが一目で分かる。深堀したければ、もう一つ下のレイヤーを覗けばいい(上の会話での「何したの」という質問)。すると、そのレイヤーでも抽象化が正しくされていて、何をしているのかが一目で分かるようになっている。全てのレイヤーが正しく抽象化を行うことで、何の苦労もなくコードと会話をすることができる。自分一人では、読みやすいコードを書くことは困難だ。一行一行に込められた意味を完全に理解しているので、どのように抽象化されていたとしても、自分では意味が分かってしまうからだ。何も出来ない訳じゃない。コードを書き終えたら、そのコードと会話してみよう。上の良い例のように、分かりやすい答えが返ってくるだろうか。それとも悪い例のように、関係ないことをぺちゃくちゃ喋っているだろうか。3年後に自分が知らないエンジニアがこのコードと会話をしたとして、誰の助けも借りずに、ちゃんと会話が成り立つだろうか。会話が成り立っていないようなら、どう抽象化するかを見直そう。まとめコードは、書かれる時間よりも読まれる時間の方が圧倒的に多い。時間をかけてでもコードを読みやすくしておくことで、早く製品を顧客に届けることができるようになる。コードを読みやすくするためには、コードと会話することが大切。スムーズな会話を心がけることで、自然と正しい抽象化ができるようになる。コードを書き終えたら、3年後に無関係なエンジニアがそのコードと会話をしているところを想像して、会話がスムーズにいくかどうか試してみよう。スムーズにいかなければ、スムーズにいくように書き直そう。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。