ボクココ

サービス開発を成功させるまでの歩み

コードを美しく保つためのたった一つの方法

ども、@kimihom です。

とあるイベントでエンジニアの方々と話していて話題になった “クリーンなコード” について書いていくとする。

結論から言うと、コードを書かない のが最も美しく保つための条件だと考える。

サービス設計レベルでの"美しさ" を極めよう

いくら優秀なエンジニアがサービスを作ったところで、優秀でないプロダクトマネージャーの元で開発をしてはいいコードを保つことはできない。優秀でないプロダクトマネージャーは、機能の多さで他社と差別化をしたり部下の仕事を作ろうとする。この機能が他社サービスにはあるから、うちにも取り入れよう。そんな自社サービスの思想を全く考えない機能をエンジニアに要求するのだ。

その時点で、どんな優秀なエンジニアでも作ったシステムは確実に複雑になる。例えて言うなら、小説家が1冊の本の中にうまく章立てをしてまとめていたのに、全く別の話題をその本に書けと言われているようなものだ。そんな要望があれば、どんなに美しかった本を書き続けたライターでも途端に汚い本を作り上げなければならなくなってしまう。

「このサービスはこのためにあります。」そう明言し既存機能を改善できるビジネス側の人間がいない限り、コードを美しく保つことは不可能だ。これがまずとても重要な前提条件。

某メッセンジャーアプリを見てみよう。基本的に全てのユーザーはメッセンジャーアプリをインストールしたなら、"友達と会話をするため" にそのアプリを起動するだろう。なのにそのアプリ内にゲームだとか情報誌だとかニュースだとか、それらがあってもほとんどのユーザーは使わない。ユーザーにとって"そのサービス=メッセージのやり取り" という明確な意識が根付いているためだ。友達と会話するためにアプリを開いたのに、そこにニュースがあったとして、それを見るだろうか。ほとんどのユーザーは"ニュースアプリ"として切り出されたものを使うだろう。なぜならニュースを見たいと思ったときにそのアプリを開くと言う明確なモチベーションが紐づいているからである。

これは大分類の"機能"ではあるが、小さな意味での"機能"にも同等のことが言える。そのお気に入り機能は本当に必要か?その SNS ちっくな機能は本当に必要か? 軸がブレると手当たり次第に機能追加するというやり方が正当化されてしまう。"開発"した分だけサービスが成長させられると思ってしまう。そんな幻想を抱いている方は、Google 検索や Uber が何故あれだけダントツで成功したか理由を考えて欲しい。"機能追加" ってのは仕事をした感が得られるだけの、何も考えていない証拠である。

機能が大規模になればなるほど複雑になるのは必然だ。コードを共通化したりしていくと、ある機能は動いてある機能は動かなくなる。そんな微調整の連続が始まる。それを嫌がってコードの共通化を行わないと、どんどんコードが肥大化していく。Fat なコードがあると、エンジニアは開発するモチベーションを大きく損ねる。一度でも妥協すると、ドミノ倒しのように崩れていくのだ。第三者がそのサービスの開発担当になったときに、リスクを冒したくなくなる。コードを修正するよりも、新しくコードを追加するという選択に 逃げる ことになる。新しく追加したコードであれば、他の依存関係をあまり考えなくて済むからだ。そんな逃げのコードの連続、そして軸のブレた機能開発こそ、最終的に Fat でメンテナンス困難なコードを生むのだ。

全ては機能を追加することが正義だと思い込んでいる人が最初に生み出す悲劇である。だからこそ、サービスの “Why"、そのサービスは何のために存在するのか をちゃんと理解し、志を持ち続けられる人にしか美しいコードを保ち続けることはできない。

これはサービスを作るエンジニアが優秀かどうか以前の話だ。ちゃんと機能が設計されたサービスであれば、勝手に綺麗になっていくものである。何故なら、闇雲に機能を追加するのではなく、同じ機能を改善/洗練していくことになって既存ソースの修正がしょっちゅう入り、より良いコードにするための仕組みが意図せずとも生み出せるためである。

どんなに優秀なエンジニアだって、ひたすら機能追加していくようなサービスをクリーンに保つことなど不可能だ。最初はそんな機能がない前提で設計していたのに、どんどん追加していけばぐちゃぐちゃになって当然だ。

これから何かを作ろうとする人は、まずそのサービスがなんのために存在するのかを明確にし、その理由に沿った機能を磨き続けることだけに集中すればいいのではないかと思う。

既に Fat なサービスを運営している方へ

多くの機能を提供しているサービスを運営しているなら、確実に Fat な状態になっていることだろう。そんな方へ私が言いたいのは、「コードを思い切って消していく人を賞賛する」文化をつくっていって欲しいと思う。Fat なシステムを削除していけるエンジニアは"勇者"だ。自分の責任を背負って懸命にシステムの依存関係を読み解き、いらないコードを消していく。これには半端ない集中力とシステム全体の理解が必要で、新しく機能を作るよりも何十倍,何百倍も難しい。しかもビジネスサイドの人たちからは賞賛されることのない地味な仕事だ。その仕事を進んでやる人こそ、Fat なシステムを担当することになった場合の最高のエンジニアだ。

コードを消していかないと、確実に理想は届かない。コードを消すって文化のない開発組織は、確実に Fat なシステムになって減退する。

コードを消すことを諦めて作り直すって選択もあるかもしれない。しかし、その作り直した先にはまた機能追加っていう逃げの開発をしてしまって、やがてまた Fat なシステムができあがっていく。そんな無駄な時間の繰り返しが発生する。

コードを消すってことに時間を投下することを容認しないような会社にいる場合は、とっとと辞めるべきだ。機能開発ばかりに目を向いているのはサービスの軸がブレブレである証拠だし、素晴らしいシステムを保ち続けることに理解のない会社なのだから。

終わりに

今回は私の思うコードを美しく保つための方法について記した。もちろんこれにはいろんな意見があるかとは思う。あなたのコードを美しく保ち続けるための秘策を教えて欲しい。私もその理想について一緒に考え続けていきたい。