島までは遠い 〜サークルアラウンド株式会社代表佐藤のブログ〜

佐藤正志@サークルアラウンド株式会社のことが少しわかる場所。プログラマーを育てるトレーナーとして、現役のソフトウェア技術者として、経営者の端くれとして、想うことをつづる。

ステップアップJavaScriptという中級になりたい人向けの書籍について。もしくは人生で初めて本を書いてみた話。

はじめに

2022年1月14日に「ステップアップJavaScript」という書籍が発売になりました。JavaScriptを学んでいく上で一度は困りそうなトピックの解説を入れつつ、動く仕組みを作りながら学ぶ本です。 是非チェックして欲しいです。

書籍の中身については弊社でも作成した書籍Webページに仕込みました。「はじめに」「目次」「実際に書籍の中で仕上げるデモ」を確認できます。

books.circlearound.co.jp

きっかけ

お問い合わせフォームから翔泳社さまに直接ご連絡いただきまして、当初は「先方が持っている企画内容でJavaScriptの書籍を書かないか?」というお話でした。大変ありがたいことであったものの「我々はその内容では書く気になれん」とワガママを言わせていただきました。私はこういうところ頑固なので、たとえ仕事をロストしても考え方を曲げたくないという面倒なところがあります。

現代のプログラミング学習において「全てを網羅するような辞書的な書籍」というものはあまり価値が高くないと考えています。それは全てインターネットにありますし、特にJavaScriptについて言えばMDNを見れば最新の正確な内容を確認することができます。

developer.mozilla.org

これをお伝えしたところで会話終了と思いきや

「それならどんな本なら書きたいんですか?」

と逆に問いかけられたので私たちで企画を練ることになり、一回目のオンラインMTGはお開きになりました。

私たちの考える中級とは?

宿題になったので、脳内にあるものを何かしらの形でアウトプットしてみる必要がありました。私と小笠原の二人で進める上でもゴールが明瞭でなければチグハグな内容になりますし、出版社側とも企画意図をしっかりと合わせたいと考えた為です。

小笠原との次のMTGの直前に私がMiroで描き殴ったのが以下の絵です。イメージとしては「私の前に面接で『中級』を名乗る人がいたらどういうスキルを持っている人を想像するだろうか」という切り口でした。

JavaScriptの中級者について考えてみた
JavaScriptの中級者について考えてみた

当初は水色と紫で色を入れた範囲を全部網羅したいと考えていました。SPAやオブジェクト指向のようなところも軽く網羅する予定で、かなり大きく出たものだと今では思います。これをまとめる中で「JavaScriptができる」と言っても実は複数の切り口がありそうだということに気づきました。本書の読み方でも示しましたが

  1. DOMの扱いやHTML5の呼び出しなどを学習する「ブラウザを使いこなす軸」
  2. JavaScript言語の特色や変遷を把握して言語を適切に使う「JavaScript言語の軸」
  3. クラスや関数を使いこなし、コードの堅牢性や再利用性を追求する「言語によらないコード感覚の軸」

というようなものです。実はさらにもう一つあり「仕事としてコードを書く際に必要な心構えや考え方」のような、弊社のトレーニングで伝えている"実際の開発現場でやれると良い振る舞いや考え方"についても強く打ち出したい、弊社がやるならそういう色を付けたいとも考えていました。書籍というものをよくわかっていない私としては、一旦これを共有してみてどういうリアクションが貰えるかから考えようとしていました。

書籍に求められる条件について

次の会合では、たたき台を提示したこともあってより具体的なことを意見交換できたのはとても良かったです。先方はより責任を持った方も含めた3名の方で対応してくださり「書籍を売る側はどのようなことを考えているのか」が私の脳内に写像できたことは、振り返ってとても重要だったと思っています。この会合で私が脳に刻んだの主に以下の3つです。

  • 長く読んでいただけるものになる方がありがたい(つまり流行りのライブラリを説明するだけの内容だと、すぐに時代遅れになってしまう)
  • あまりに上級な内容を入れようとすると買ってくれる人がかなり限定されるので、結果として売れなくなってしまうことがよくある
  • 私たち現場開発者、トレーナーが思う「中級」と書籍で言う「中級」には多少乖離がありそう(これは中級者として完成した人を指すのか、初級から中級になろうとするのかの差異かもしれません)

この辺りをポイントにできたので「何をやるべきか」がより明瞭になったと感じています。経験不足のため、当初自分が提示した内容が本としてどの程度のボリュームになるのかがイメージできていませんでした。今回の書籍を実際に手に取ると287ページとかなり分厚く、これ以上の内容を盛り込むのはどう考えても無理だったろうと感じています。上手に誘導していただいたのでしょう。

最終的に、当初の大柄すぎる内容よりも言語そのものの理解にフォーカスする方が結果が出せそうだと納得することができました。ただし、大抵の読者がブラウザ上のJavaScriptを利用している事実や、「世間では意外にDOMを理解していない人は多く、この内容は落とさない方が良い」という提示をいただき、当初は落としても良いかと考えた基本的なDOM操作の内容をおさらいする内容を入れています。

思い返して印象に残っていること

非同期処理での苦しみについて

本書は殆どの部分が「トレーニングを通じで口頭やホワイトボードなどで伝えたことのある」内容をキッチリ整えたものになっています。従って、新たに捻って生み出すよりも、過去の脳内から整理して出力し直す作業が多かったので、あまり止まらずに書き続けられました。

しかし本書で最も大事な内容の一つである非同期処理は、正直苦しみました。当初、歴史も含んだ形でアウトプットして失敗しました(これは結果的に付録になりました)。改めて歴史がどうのとかは置いておき「まず何を学べば理解が捗るか」を再考して書き直したものになっています。島田達朗さんが書いてくださった下記のレビューでも、非同期の概念のページを引用してくださり、本書の中でも印象に残る良い内容が書けたのだと思います。

note.com

async/await は大変直感的な記述で非同期を記述できる為、まずこれで「背景の深い理解は一度置いておいても、思った処理を書くことはできる」という状態にたどり着けます。その後でPromiseと対比することで理解を深めていってもらう流れにしました。歴史とは逆ですが、この方が「概念化した後、詳細を学ぶ」という順序で整理ができると考えたのです。

複数の非同期処理を順番に実行することはasync/awaitを活用できるなら書きやすいです。多くの方が次に悩むことの一つとして「同時に複数の非同期処理をスタートし、全て終わってから次の処理を行う」ということがありました。これについてはPromise.allを紹介することでフォローしています。個人的にはどちらかと言うとPromise.allの具体例をもっと書きたくなってしまうところでしたが、書籍の目標としてはasync/awaitで行う連続的な実行とPromiseの基本理解の方へフォーカスしています。

参照について2つの内容をミックスして誕生した流れ

実は当初はプリミティブ型とオブジェクト型の解説のみで一度区切っており、付録の中でメモリをイメージする内容を入れていました。一度書き上げてから見直した時に、参照の印象が薄く、書籍の目的に対して足りない気がしたことと、レビュアーの意見に「付録の方の内容が良かった」というものがあったりするなどして、付録から一気に移動してきた経緯があります。ここは結構な大工事をギリギリでしてしまいました。今から書くならもう少し表現を変えても良い気がしています。

この件の反省としては「販促の時にどういうポイントを打ち出すか」は最初に決めておくべきだったということでしょう。

それと、この話題は厳密性を上げようとすると無駄に難解になる上、処理系依存の話も多くなってしまうと思いますし、抽象化し過ぎると解像度が低すぎて伝えたいことが伝わらないはずなので「どういう脳内イメージを構築しておけばコードを書く上で勘違いしないか」に苦慮したところでもあります。あまりこれに取り組んでいる文章も見たことが無いので、意図が適切に伝わるか多少の不安もある中で書いた内容です。最終的には一定以上の内容にできたはずだと思っています。

本当はメモリの話から広げてパフォーマンスの話へ繋げたい意図もあったのですが、紙面の都合上果たせませんでした。「Array.join使う方がforで連結し続けるより速いよ、それはメモリの確保が...」みたいなことを入れたかったなぁ。

コンテンツ化に力を入れ始めた理由

もともと私はあまりコンテンツ重視の考え方をしていない方です。どちらかと言うと「困った時に適切なインターネット上の文章に到達できる」ことを重視しています。ですが、この数年の個人向けトレーニングでは、その方法では苦戦するシーンが結構出てきてしまいました。あまり正確性の高くない情報へのヒット率が高まってしまい「嘘とまではいかないけれども、適切ではない」とか「様々なシーンで利用される言葉が誤用されている」などの事が増えた為です。

そうなると「困ったことは検索して…」ということを学習して欲しいのに「検索でヒットした内容に従ったのに間違いばかりである」という誤った学習をしてしまいます。このことはかなり大きな課題だと考えています。

私の理想では「『何か作りたい』程度だったらインターネットの情報だけでいい感じにできるから、人に教わる必要などない」となって欲しいのです。そして「仕事にするくらいのレベルに達したかったり、熟練のスピードを上げたければ人に教われば良い」という状態が理想だと考えています。それにはある程度適切な情報に辿り着きやすい環境が必要です。弊社では Tech libというWebサイトを作成して、Youtubeチャンネルで話した「私たちが大はずしはしていないだろう」と思っている内容を取りまとめていますが、アクセスはまだまだ伸び悩んでいます。 techlib.circlearound.co.jp

このような動画も知識のコンテンツ化の方法としては優れていますが、書籍は出版社が私よりも多くの方へ届けてくれるので、宣伝があまりうまくない私にとってはとても良い手段の一つではないかと考えるようになりました。今後も色々と世に送り出せたら素晴らしいです。

おしまいに

あまりまとまらない話を書き殴ってしまいましたが、実績解除の記録として置いておくのも良いかと考えています。 もしステップアップJavaScriptに興味を持っていただけたら下記のWebページから是非内容を確認されて、マッチしそうなら是非お買い上げください。

books.circlearound.co.jp

f:id:ms2sato:20220204223138p:plain