E869120's Blog

アルゴリズムや競技プログラミングに関する記事を書きます。

【執筆体験記】大学 1 年生が、アルゴリズムの本を書くまで

0. はじめに

こんにちは、東京大学 1 年の米田(@e869120)と申します1。私は競技プログラミングが趣味であり、AtCoder日本情報オリンピック などに出場しています。2021 年 12 月 30 日現在、AtCoder では赤(レッドコーダー)です。

この度、「アルゴリズム×数学」が基礎からしっかり身につく本技術評論社より出版しました(既に発売されています)。アルゴリズムと数学を同時に習得できる新しい入門書です。本の内容や特徴については、

をご覧いただければと思います。

実際、一冊の本を完成させるというのは決して簡単なものではありませんでした。本記事では、本を書いたきっかけや、どのように執筆が進んだかについて記したいと思います。

目次


1. 本を書くことを決めるまで

第 1 章では、本を執筆したきっかけについて、競技プログラミング(競プロ)への参加を始めた 2015 年頃から振り返ります。

注意:この章では競プロに関する話が多く出てきますが、私が書いた本は競プロ参加者以外も対象としています。これについては 2.1 節で記しています。

1.1 競プロを始める(2015年4月~)

中学 1 年の 4 月、私は「プログラミングって何か面白そう!」と思い、単純な興味から 筑波大学附属駒場中学校 のパソコン部(通称:パ研)に入部しました。

最初はゲーム作成などをやっていましたが、同年 10 月頃に先輩から競プロを勧められ、AtCoder などのコンテストに参加し始めました。競プロで戦うために必要なアルゴリズムを学び、解ける問題の範囲を広げていくのが楽しかったため、気づいたときには完全にハマっていました。

1.2 最初の情報オリンピック(2015年12月~)

その後、2015 年 12 月に行われた中高生向けの競プロの大会「日本情報オリンピック」の予選に参加しました。当時はあまり実力が高くありませんでしたが、運よく予選を突破しました。このとき、学校の同級生などにほめられたことが大きなモチベーションになりました。

実は、私は小学校時代はいじめられており、算数などで良い成績を残しても全く認められることはありませんでした。そのため、情報オリンピックが自分にとって初めての「周りから認められた経験」となり、とても嬉しかったのを覚えています。

1.3 レッドコーダーになるまで(2016~18年)

その後は情報オリンピックの合宿で最下位に近い順位を取るなどの挫折も経験しました。しかし、毎週開催される AtCoder のコンテストに出ることで自分の苦手を分析し、その苦手を徹底的につぶしていった結果、少しずつ実力が上がっていきました。

また、中学 3 年の秋以降は練習時間も増え、学校の授業を除くすべての時間を競技プログラミングに捧げるようになりました。その結果、2018 年 3 月にレッドコーダー(上位約 0.3%)になりました。

なお、具体的な練習方法などを書くと長くなるのでここには記しません。詳しくは こちらの記事 をご覧ください。

1.4 レッドコーダーとして何かできないか?(2019年)

レッドコーダーになった後もコンテストに出場しましたが、競プロを続けていくうちに、以下のことに気づきました。

情報オリンピックAtCoder や一緒に大会に出た戦友たちから多くの刺激を受け、その結果レッドコーダーになることができたのではないか?

そこで 2019 年頃から、「自分もレッドコーダーとして、日本全体の競プロのレベルを上げることに貢献できないか?」と考え始めました。

1.5 教育的な活動(2019年~)

さて、競プロのレベルを上げる具体的な方法として、以下の 2 つがあると考えています。

  1. 競プロをやる(あるいはモチベーションを上げる)きっかけを作る。
  2. 競プロ上達のための知の高速道路を整備する。

両方がそろえば本当にレベルが上がるのではないかと思い、私は早速実行に移しました。

1. の実現に向けて

まず、2019 年 11 月に競技プログラミングのオンサイトイベント「GigaCode 2019」を開催しました。イベントではコンテストだけでなく、競プロ未経験者でも楽しめるアルゴリズムパズル という企画も行いました。

2. の実現に向けて

また、2020 年 1 月から 7 月にかけて、エンジニア向けの記事投稿サイト Qiita に競プロの解説記事を執筆しました。代表的な記事として、以下が挙げられます。

f:id:E869120:20211230114306j:plain

大学受験でいったん中断しましたが、合格後もこのような活動を続けました。「今の日本の競プロに足りないものは何なのか」を強く意識するようになり、2021 年 4~7 月にかけて以下の 2 つの教材を作成しました。

足りないと思ったもの 作ったコンテンツ
競プロの典型問題集 競プロ典型 90 問
競プロに必要な数学をまとめた記事 Qiita|アルゴリズム・AtCoder のための数学

1.6 本の執筆依頼が来る(2021年4月)

今年 4/16 に技術評論社から「アルゴリズムと数学の本を書きませんか?」というメールが届きました。こんなに早く本を書くことになるとは思っていなかったので正直驚きましたが、人生で一度きりしかないチャンスかもしれないと思い、執筆を決めました。

f:id:E869120:20211230120451j:plain
突然送られてきたメール(掲載許可は取っています)


2. 本が完成するまで ~執筆体験記~

私は 2021 年の夏から秋にかけて 1 冊の本を執筆しましたが、決して簡単なものではありませんでした。「どうすれば分かりやすくなるのか」「どうすれば伝わりやすくなるのか」という迷いと葛藤の連続であり、完成させるのに 850 時間以上を要しました。

そこで第 2 章では、本が完成するまでの流れを時系列順に振り返りたいと思います。通常の執筆スタイルとは異なる方法をとった部分もありますので、ぜひ引き続きお読みください。

2.1 企画と対策(2021年4~5月)

実は、執筆依頼を受けた時点では競プロ参加者のみを対象にすることを検討していました。しかし類書を 15 冊くらい調べたところ、アルゴリズムの入門書はたくさんあるにもかかわらず、アルゴリズムと数学を同時に解説した本は非常に少ないことが分かったので、「競プロ参加者以外にも役立つのではないか?」と思いました。そして編集者の方と相談を重ね、単なる競プロ対策本に終わらないよう、幅広い層に手に取ってもらえるようなアルゴリズムと数学の本を執筆することに決めました。

一方、良い本を書くためには相応の執筆スキル(または文章力)が必要です。私はまだ大学 1 年生であり、Qiita に書いた記事も 20 本程度とそこまで多くなかったため、「経験が浅すぎて正直やばいのではないか」という危機感がありました。

そのため、勇気を出して 10 人程度に Twitter の DM を送り、自分が過去に投稿した記事の問題点や改善点を指摘していただくように頼みました。幸運なことに多くの人に答えていただき、中には 7 ページの PDF を書いてくださった方もいました。執筆の際に大変参考になりました。

2.2 執筆の流れについて

その後、5/17 に本の企画が正式に通りましたが、進行中の企画「競プロ典型 90 問2」を完成させてからの方が良いと思ったので、執筆開始は 8 月となりました。

幅広い層に楽しんでいただける本を目指すため、大学教員から数学を勉強中の人3まで、中学生から社会人まで、様々な層を含む 12 名の方々にレビューを依頼することにしました。この判断が後になって、本書の正確さや分かりやすさの向上に大きく寄与したのではないかと考えています。

また、執筆は下図のようなフローで進めました。通常は初校が完成した段階でレビューを受けるのですが、私は「前半の章で指摘された点を、後半の章の執筆に活かせるのではないか」と考えていました。そのため、5~10 ページ単位で「迷った部分の質問」を slack に載せ、それに対する意見や読みづらかった点などを書いてもらう形式にしました。

f:id:E869120:20211230150632j:plain

2.3 執筆 1 巡目(2021年8~9月)

東京大学では 8 月の第 1 週に期末試験が終わり夏休みに入るため、1 日 15 時間程度を執筆に使っていました。毎朝 9 時に起き、夜中の 2~3 時まで集中して本を書くような生活でした。

しかし、書籍執筆は初めてであったほか、一体どうすれば分かりやすくなるのか、一体どうすれば簡潔に書けるのかということを強く意識したため、予想以上に時間がかかりました。

「ある説明方法を選ぶと〇〇の読者層には伝わるが、△△の読者層には伝わりづらくなるからどうしよう」「こう説明すれば分かりやすいが非常に長くなってしまうからどうしよう」という葛藤も決して少なくなく、一つの図を作るのに 2 時間以上を要したこともありました(注:図は本全体で 280 個ほどあります)。

そのため、レビューを受けながら初稿が一通り完成したのが 9/27 であり、その頃には夏休みがほぼ終わっていました。

f:id:E869120:20211230152958j:plain
執筆中の slack の様子(意見は #review チャンネルに書いていただく)

2.4 執筆 2 巡目(2021年10月)

初稿が一通り完成した後は、自分の書いた文章をもう一度読んで「分かりづらい」と思った箇所を直しました。数学が苦手な reviewer から「理解できなかった」というコメントをいただいた部分も、この段階で修正しました。

また、レビューの中には「この原稿には〇〇という内容が含まれていないが、アルゴリズム学習では重要だから入れた方が良い」というものもあったので、ページ数に収まる範囲で新たな章や節を追加しました。4

分かりやすさを増大させるために説明や図を 3~4 回変えた箇所もあったため、思ったより時間がかかり、2 巡目が終わったのが 10/23 でした。しかし、最終的にはすべての reviewer に全体の 9 割以上の内容を理解してもらうことに成功しました。

f:id:E869120:20211230153931j:plain
執筆 2 巡目の様子(掲載許可は取っています)

2.5 校正作業(2021年11月)

原稿を編集者に提出してから組版ができあがるまでに 2 週間程度かかるため、この期間はたまった大学の課題などを片付けていました。その後、11/4 に校正作業が始まりました。

一切の妥協をしたくないと思い、原稿を最初から最後まで読む作業を合計 7 回行ったため、組版ミスなどを含めて 2000 個以上の修正点が見つかりました。

締切が近づく中、学業とも両立する必要があったため、睡眠時間が 4 時間(通常の半分)を下回った日もありましたが、12/3 に何とか校了することができました。おそらくこの時期が一番忙しかったと思います。

2.6 解説作成(2021年12月)

この本には 140 問を超える演習問題がありますが5、ページ数の都合上解説は GitHub ページ に掲載することになったため、12 月は出版プロモーションをやりながらこれを作成していました。作業量が多く、発売日(12/25)には間に合いませんでしたが、12/29 に完成しました。6


3. 書籍執筆を通して得たもの

4 カ月間の書籍執筆では非常に多くのことを学びましたが、その中で一つ選ぶとすれば、執筆スキルや文章力の向上です。

私はこれまで Qiita などに記事を投稿してきましたが、一つの記事に掛けた時間は高々数十時間程度でした。しかし今回は、

本を出版するからには、大学 1 年生であることに甘えてはならない。専門家が書いた本と同じ土俵で戦わなければならない。

と思い、編集者や 12 名の reviewer から多数の意見をいただきました。また、自分自身でも「どうすれば初学者にも伝わるのか」ということを休みなく考えて原稿を書きました。

こんな経験は初めてであったため、当然ハードなものとなりましたが、ここで得たスキルは今後の活動だけでなく、論文執筆や研究発表などにも役立つのではないかと思っています。とても良い経験ができました。


4. おわりに

計 850 時間にわたる書籍の執筆はとても大変な作業でしたが、妥協がなく満足のいく本を仕上げるにあたって、reviewer を含む多くの方々にお世話になりました。本当にありがとうございます。また、大学 1 年生の私が本を書く機会に恵まれたことに感謝しています。

最後に、アルゴリズムと数学に興味のある方は、ぜひ本を手に取っていただければと思います。また、本を通して何か一つでも有益な知識を得られたならば、私としては本当に嬉しいです。


  1. E869120 は東大の学籍番号ではありません。

  2. 競プロの典型問題を 1 日 1 問投稿する企画です。2021/3/30 ~ 2021/7/11 の期間に行われました。

  3. 中学数学を勉強中の社会人の方もいました。

  4. たとえばソートは元々 2 ページのコラムにする予定だったのですが、reviewer の意見を受け、13 ページかけて丁寧に解説することにしました。

  5. 節末問題・最終確認問題だけで全 148 問。例題を合わせると全 200 問。

  6. その他にも、自分の書いたプログラムが正しいかどうかを自動で判定する「自動採点システム」の準備をする必要がありましたが、これに関しては reviewer のうち希望者 7 名に手伝っていただきました。ありがとうございます。