初めましての人も、いつもの人も、皆様たいへんお世話になっております。弊社オルトプラスでCTOやっています、有馬と申します。
本記事は オルトプラス Advent Calendar 2023 の12/1の記事です。
弊社はゲーム作りを基本に、いろいろなものを開発しています。弊社内で取り組んでいる技術の紹介、集う技術者たちがやっていることを中心に、社内のにぎやかな感じを、このアドベントカレンダーでお届けできれば幸いです。
今回は私が若手エンジニアに向けて、何かあると渡している本についてお話しします。長年ゲーム業界のエンジニア畑にいるのですが、新しいエンジニアがチームに入ってしばらく経つと、周囲との違いにとまどったり、コミュニケーションのミスでへこむことがよくあります。これまでを振り返りながら、弊社や他社で見かけた、そんな「悩めるエンジニアへ差し入れてきた本」について述べてみます。
■エンジニア的な問題解決に向けて
エンジニアによくある技術的課題の解決に向けて下記の7冊をよく贈っています。
1冊目 『リーダブルコード』
2冊目 『達人プログラマー(第2版): 熟達に向けたあなたの旅』
対象
多くの人といっしょに開発する場面でつまづいた人
コードレビューでマサカリが刺さった人
どう作っていけばいいのか、迷う人
内容
この2冊は鉄板です。これまで何冊も買ってはエンジニアへ渡しています。
『リーダブルコード』を初めて読んだときは、「これで新人向けの研修資料を作らなくて済む!」と嬉し涙を流しました。マジです。若手エンジニアが、集団で開発するときは、独学していたことが通じず、お作法やルールの違いでよくとまどいます。こうして欲しいという指摘だけでも言われたほうはつらく思います。そのあたりを解消したり、「こういうことでいいんだ」という安心感を得るためにも、この本はちょうど良いと思っています。
『達人プログラマー(第2版): 熟達に向けたあなたの旅』は、もう少し成長したエンジニアに渡しています。開発を進めていくうちに、エンジニアは「本当にこの作り方で良いのか」、「どうしたら失敗せずに済むのか」といった「揺れる心」を持ちます。そんなとき、何かしらの「柱」がエンジニアにはいると思っています。信念とでも言うのでしょうか。矜持かもしれません。この本は侍における『葉隠』のようなもので、エンジニアとしての正しい心構えを育むには良い本だと思います。
3冊目 『オブジェクト指向における再利用のためのデザインパターン』
4冊目 『Java言語で学ぶデザインパターン入門』
対象
コーダーから一歩踏み出したい人
コードレビューでマサカリが刺さった人
「中身をよく知ってから作ってください」と言われた人
内容
エンジニアがある程度できるようになってくると、何かを継承したクラスを作ったり、機能によって最適なクラス構成を作っていくことになります。そこには「パターン」があります。どう作ってもこれが最適だよね、というものです。たとえばUnityではシーン間のデータ受け渡しにSingltonを割と多用しますし、MVCやMVVMなどの大きなレイヤーに分けてゲームを作ることになります。この概念や構成を頭の中においておけば、プログラムを作るときに迷いません。また、新しいプロジェクトに配属されて、コードを見ていくようなときにも、「これはSingletonパターンだからインスタンスを入れておく静的変数があるはず」など、コードの構成を知るための手がかりになります。
『オブジェクト指向における再利用のためのデザインパターン』は通称GoF本と呼ばれるもので、デザインパターンの定本です。ここから始まりました。
『Java言語で学ぶデザインパターン入門』は、『数学ガール』を生み出した結城さんの本で、出たときから読みやすいと思っています。実例がわかりやすいので、GoF本では挫折しそうな人にはぜひと思います。
有馬は『C MAGAZINE』でεπιστημη(えぴすてーめー)さんの連載記事にありました、「ブロックのようにコネクタを規定クラスに作り、それを派生したクラスをつないでいくことで処理を行う」というクラス構造がとても好きです。たとえば麻雀ゲームでゲーム進行から聴牌の確認、役判定まで行うとき、そのまま作ると判定だらけで作るのが面倒になります。そこで「聴牌しているか」「天和かどうか」みたいなそれぞれを判定をするクラスを個別に作り、次に判定しないといけないものを呼び出してデータをそちらに渡していくスタイルだと、各クラスで判定しないといけないものだけに処理をフォーカスさせることができ、かなり作りやすくなります。これはデザインパターンでいうところの「Chain of responsibility」パターンに近いかもしれません。
こういう構造や作り方を頭の引き出しに入れておくと、いろいろな局面でエンジニアは勇気を持って立ち向かえると有馬は思っています。
5冊目 『[改訂新版]C言語による標準アルゴリズム事典』
対象
計算量がわからず負荷がかかるコードを作った人
どういうふうにやりたい処理をコードとして実現すればいいのかわからない人
内容
昨今はいわゆる「富豪的プログラミング」なので、ソートとかハッシュ化とか、1から作らないでもすでにライブラリがあったり、便利な仕組みがたくさんあります。昔のようにちまちまと1バイト削るとかはしなくて済むようになってきました(まだ環境によってあるけれど)。
一方でN+1問題とか、計算量の求め方を知っていれば防げたトラブルをちらほら見かけます。そんなときに『[改訂新版]C言語による標準アルゴリズム事典』を渡しています。昔の定番な本で、有馬もたいへんお世話になりました。
ソートとかよくあるアルゴリズムは実装しなくても……とは思うのですが、「どういう仕組みで作られているのか」、「どういうデータを与えたらその方法には最適なのか」を知っていれば、適切な使い方がわかってくると思います。本来ならコンピュータサイエンスを正しく学ぶべきなのでしょうが、ひとまずはその入り口としてこの本を読んでもらえたらと思っています。
6冊目『新装版 リファクタリング―既存のコードを安全に改善する―』
対象
すでに運用しているプロジェクトに配属されて、わけがわからない人
勝手にコードをいじって怒られた人
内容
有馬はコードをたくさん読まないと、良いプログラマにならないと思ってます。だからといって、ただ漫然と読んでも勉強にならないことが多いです。そんなときは、本書にある「Chap.3 コードの不吉な臭い」などをかじりながら既存のコードを読むと、いろいろわかってきます。読んだコードからは様々な「臭い」を感じられるはずです。それは「なぜこういうコードになったのか」ということを読み解く鍵になります。
リファクタリング作業自体はプロジェクトの判断があるものですが、知識として知っておくと、これから進むエンジニアの道を明るく照らしてくれるはずです。
7冊目『オンラインゲームを支える技術』
対象
同期通信について、よくわからない人
メタバース作りたいんだよ、という人
内容
最近同期通信の業務が増え、弊社でもNode.jsを中心とした同期通信の環境を構築しています。
HTTPとかでは、サーバ側は「クライアントからデータくれと言われたら、すぐにそのデータを返してプロセスを終える」というところになります。クライアントとサーバは1対1の通信だけで済み、ステートレスで作ってあれば、通信不良でもリカバリしやすいです。
一方で同期通信になると、パラダイムシフトが要ります。「データくれ」→「データあげる」というのは変わらないところですが、「どんなデータ」を「どんなタイミング」で「何人に共有するのか」というところに気をつけないと、途端に破綻します。たとえば30fpsで1フレごとにキャラクタの位置を送るとした場合、2万人同時接続を目指すとしたら、1秒間当たり「2万人の送信先」のひとつあたり「2万人の受信先」に向けて30回通信がいることになり、トラフィックとしては120億回×送信データぶんがいることになります。
回線切断に耐えたり検知すること、通信遅延が発生しないこと、これを叶えないとアプリとしてのクオリティは下がります。その技術や技法について本書は述べています。
筆者は中嶋謙互さん。私のようなゲームでのネット界隈の大先輩であり、古くから携わっている第一人者です。若い人がこれから同期通信、WebRTCなどをいじりたい、チャットは作れたけどその先はどうしたらいいのかわからない、という人には好適書だと思います。
■マネージャー寄りの問題に向けて
エンジニアリングというよりは、マネジメントのほうの問題に近いときは下記の本を贈っています。
8冊目『失敗の本質』
対象
これからリーダー、マネージャーを目指したい人
アサインされたプロジェクトがどうもおかしいと相談しに来た人
内容
いろいろな人がお勧めしている本なのですが、「チームがよく陥る組織の問題」がこれほどわかりやすく書いてある本はありません。
この本を読んでから、不祥事を起こした企業の第三者委員会による調査レポートを読むようになりました。日医工の不正事例は身につまされるものですし、京セラケミカル事業部で起きたUL認証の不正は、その後の京セラ本体からの対応がすさまじく勉強になります。いずれも本質的なところは『失敗の本質』で触れられた問題と同じだと、本書を読むとわかるはずです。
この本はそういう昔から変わらない「問題のパターン」について、第二次世界大戦での日本軍が行った失敗の実例を元に書いてあります。述べられたもので、ひとつあるのは「行き過ぎた最適化」です。現場が楽になるように、コストを圧縮するようにした結果、重大な危機を招きます。また全体最適化したほうがいいのにかかわらず、現場の対応だけ最適化すると、本来の目標を達せられないことが、とても多いのです。
この本を読んだ人は、「ああ、これは失敗するパターンだ」と思うだけでなく、何かしら動いてもらえたらと思います。この本を読んだ私は、あなたの味方です。
9冊目『マネージャーの問題地図 ~「で、どこから変える?」あれもこれもで、てんやわんやな現場のマネジメント』
対象
これからリーダー、マネージャーを目指したい人
アサインされたプロジェクトがどうもおかしいと相談しに来て、「なんとかして」と言い返された人
内容
『失敗の本質』がパターン集なら、こちらは「具体的な解決方法をまとめたレシピ集」という位置付けです。「うん、確かにこれは問題だ。ではどう解決する?」というときにとても役立ちます。問題に直面している人にとっては、「あ、これはやってる!」、「なるほど、こうすればいいのか」という、安心を見つけられる本でもあります。
実際にそれをしてうまくいくかはわかりません。それでもここで示された解決方法をメガネにして問題を見つめると、解決への糸口がわかってきます。そんな感じで読んでもらえたらと思います。
10冊目 『サーバントリーダーシップ入門』
対象
これからリーダー、マネージャーを目指したい人
アサインされたプロジェクトがどうもおかしいと相談しに来て、「なんとかして」と言われていろいろやったのに、チーム内の人が動いてくれず困っている人
内容
リーダーシップの取り方は、「俺についてこい!」という単一的なものではなく、いろいろな方法があります。そして、それはリーダーシップを取るその人の個性に合ったものでないと、とたんに破綻します。
有馬がマネージャーとして悩んでいたときにこの本に出会い、いろいろな「するべき」という思いが消えました。有馬は「ついてこい」というスタイルだとどうしても無理が起きてしまい、サッカーでのボランチや見守る役が多かったので、サーバントリーダーシップは私の個性にとてもあった方法論でした。
この本は、ほぼ半分が資生堂で実践された方のインタビューなのですが、最初の入り口としては良いと思います。
ほかにもいろいろなリーダーシップの取り方や方法があります。自分に合うリーダーシップの方法をぜひ見つけてください。
11冊目『アジャイルサムライ』
対象
これからリーダー、マネージャーを目指したい人
アサインされたプロジェクトがどうもおかしいと相談しに来て、「なんとかして」と言われていろいろやったのに、チーム内のエンジニアが動いてくれず困っている人
内容
これまで紹介した本にあるマネージャー論は一般的なもので、エンジニアに対してはうまくいかないかもしれません。本書はアジャイル開発手法を中心に、組織としての開発の進め方を掲載しています。このとおりに実践してうまく行けるプロジェクトは少ないかもしれません。それでもマスター・センセイの言葉を胸にすれば、勇気を持って開発に取り掛かれると思います。
有馬はこれを読んでから、「アジャイルで示されている手法を絶対にやるというよりは、プロジェクトの性格に合わせて手法を取捨選択し、緩く統治して、開発を促すことのほうが重要」、「やるほうはもちろんだけど、やらないことリストを最初に作って、アサインしたエンジニアにわかってもらう」 、「バックログを置き、過去実績からこれから開発にかかる時間を予測する」というのを実践しています。人やチームの状況によって、これがうまくいくかはまた変わりますが、いまのところ有効です。
12冊目 『僕は君たちに武器を配りたい』
対象
じゃあ有馬はどんな思想でエンジニアと向き合っているのかを知りたい人
内容
「あれこれ言う有馬は、どんなスタンスでいるの?」という疑問を持たれた人に渡しています。この本の作者、夭折された瀧本哲史さんは、「若い人へ武器となるものを教えるので、それで人生や社会と戦って欲しい」と述べていました。その武器となるものにはいろいろあり、それは現代社会の仕組みや構造に合わせて使わないと有効な武器になりません。ステークホルダーとの交渉、よくある落とし穴、リスクのある生き方、成熟した資本主義世界でのゲリラ戦……など、そうした武器を本書は理想論ではなく、包み隠さずリアルに書いています。
有馬もこの思想でいます。若い人が現代社会の実戦で使える武器を持ち、それによって未来を切り開いて欲しいと願っています。そんな視点でエンジニアへ業務をお願いしたり、講演をお願いしたり……ということをしています。
本書の内容を過激に思い、納得されないかもしれません。そのため、有馬の行動原理を知りたいという人にだけ、この本を渡しています。
■コミュニ―ケーションの問題に向けて
問題を聞いていて「それはコミュニケーションの領域の問題ではないか」というときに渡している本になります。
13冊目 『あなたの話はなぜ「通じない」のか』
対象
話を聞いてくれないと嘆く人
よく思い違いをされるという人
内容
現代社会でのプログラム開発はチーム戦です。誰かにこうして欲しいというのが伝わらないと、なかなか仕事がうまくいきません。とくにエンジニアでコミュニケーションに問題を抱えていると思う人には、この本を渡しています。
著者の山田ズーニーさんは、長年通信教育の小論文の先生をされていた方です。その視点から本書は改善方法や考え方について丁寧に書かれていて、好書だと思います。この本を読んだからすぐに変わるというわけではないのですが、何かしらの突破口になるのは実際に観測しています。
14冊目 『伝わる・揺さぶる! 文章を書く』
対象
Slackや報告書が読まれないという人
何がかかれているかわからないと言われた人
内容
同じく山田ズーニーさんの本です。リモートワークが多くなり、テキストでお願いしたり報告することが、以前より多くなりました。そのため、理解されやすい文章を書く能力について、ますます求められています。
有馬は他社に在籍したときに「A4サイズ1ページの紙に、ヌケモレなく事業提案を書け」というのをやりました。元々パワポで100ページの内容です。これには壮絶に苦労して、この本を読みながら、なんとか及第点のものを作れました。そのときに思ったのは「伝わらないのが怖いから、読んだ人にわかるようにあれこれ書いてしまう。それが読みにくさにつながる」というところでした。想定読者を考えながら、適切な文を適切に書く、そのたいせつさをこの本に教わりました。お勧めしています。
■ほかには?
本ではないのですが、「公式を読め」というのはずっとお願いしているところです。「やってみた」の記事はたいへん助かるのですが、それを読んで試して、ほんのちょっとしたことで記事のように動かず、それだけでつまづくエンジニアを多く見てきました。そんな人には、公式を読んで、それに付随するフォーラムがあればそちらの情報を探して……という癖をつけてもらっています。実際のところ、類例がない問題というのは、あまりありません(逆にそれがないようにつまづきやすいうちは開発するべきと思う)。「困っているところは全世界でいっしょ」と思うことで、心理的障壁やあきらめ感を減らすようにしてもらっています。
ほかに、もう少し違う本だと、『貧乏人の経済学――もういちど貧困問題を根っこから考える』は私の視点をがらりと変えてくれた良い本でしたし、『イシューからはじめよ――知的生産の「シンプルな本質」』は、良いエンジニアにありがちな「たくさんくる飛び込む作業依頼をどうさばくか」の解決方法に役立つところがあります。
他にも個別の問題に対して渡している本がいくつもあります。ですが、今回はここまでにさせていただきます。
■終わりに
弊社オルトプラスでは必要な本を会社で買う仕組みがあり、それとは別によく使う本はオフィスへ置いとくようにしておいてあります。そのせいか、本について語り合う機会は多いかなと思います。
この世界は、インターネットで検索すればどんな情報でも出てくるようになりましたが、本という媒体はまとまった読み物としてまだまだ役立ちます。これからも困っているエンジニアへ「スッ……」と最適な本を差し出していきたいと思います。