created_at
updated_at
tags
toc
headings

mozaic bootcamp 2019

Intro

2019/4/28 - 5/1 の 4 日間で、 mozaic bootcamp 2019 というひたすら Web 技術を叩き込むイベントを開催した。

その内容やモチベーションについては、以下で話している。

ep48 Monthly Web 201901 | mozaic.fm

このイベントの概要と目的について記録する。

概要

Web に限らず、初学者を対象とした書籍, イベント, 動画, 研修など、最初のステップを踏むためのコンテンツは幸いなことに充実してきている。

一方、そうしたコンテンツを修め、基礎的な部分をある程度理解した人が、次のステップに進むためのコンテンツは途端に減り、どうすればより成長できるのかで悩む時期があるように感じている(筆者がそうだった)。

自分でなんとかするしか無いといえばそうだが、そうした迷える中級者に対しても、もう少しできることがあるのではないかとずっと考えていた。

構想自体は 2 年くらい前からあったが、なかなか条件が揃わず出来ずにいた。今回たまたま色々な条件が揃ったため、開催に至ったのが mozaic-bootcamp である。

mozaic-bootcamp は Web の技術について、初心者向けのコンテンツなどで基礎をある程度習得し経験も有るが、今ひとつ次のステップに進むためにどうすれば良いのかで悩んでいる迷える中級者が、次のステップへの足がかりを見つけるためのイベントである。

おおよその詳細は参加者の @isyumi_net さんが記してくれた。

mozaic bootcamp に行ってきました - isyumi_net ブログ

そこで、今回は実施の形式や方法などについて記録しておくことにする。

扱う内容

この bootcamp では、フレームワークやツール、特定のサービスの話はしない。

また、最先端の API を列挙し紹介するといったこともしない。

扱うのは基本的なものばかりである一方、それらを「より高い解像度で理解する」ことを目的としている。

全く新しく聞く話でなかったとしても、自分が「知っている技術の知らなかった側面」について知ることは、その仕様をさらに深く理解する入り口として非常に重要だ。

例えば、参加者に Cookie について知らない人はいないだろうが、 Cookie に関連して知っている範囲にはばらつきがあるだろう。

正確な仕様、現実の実装、実際の使われ方を把握すると、 Cookie を正しく扱えるだけでなく、関連して起こっている議論(3rd Party Cookie と ITP, HTTPS, Feature Policy, SameSite, State Tokens etc)についても理解するベースができる。

機能が正確に把握できると、その裏で考慮されている非機能要件(performance, security, a11y)も理解でき、正しく使えなかった場合の弊害も見えてくる。

結果、その技術を正しく使うことに加え、現状ある問題を把握し、出てきた仕様の意図を正確に読み取り、新しい仕様の議論に参加するといったことへの基礎になる。

Web 開発のトレンドは移り変わりが激しく、コミュニティでも四半期ごとに別の話をしているような現状だ。

そうした刹那的な知識そのものを扱うのではなく、その流れそのものについていくための力をつけることをより重視している。

カリキュラム

初心者向けなら全てゼロからやれば良いが、中級者には定義がないため、ターゲットがどこまでを知っているのかの前提を引くのが難しい。これは中級者に向けたコンテンツが少ない理由の一つだろう。

究極的には、全てのトピックについて参加者の反応を見て、理解してそうであれば先に進み、そうでなければ深く掘り、終われば次に進む、質問があれば都度補足し、場合によっては脱線する、というやりかたをとるのが理想となる。

この bootcamp は、その理想をそのまま採用した。

したがって、通常のセミナにあるであろう「何をどの順でどこまで話すのか」といったカリキュラムは事前には一切なく、筆者がなんとなく思い描いた 4 つくらいのトピック以外は、全てその場で決まる。

最後にどこまでいくかも決まってないが、 Web についての話が 4 日程度で終わるはずがないので、行けるところまでということになる。

教える側も知っている以上のことは教えられないため、双方非常に属人的であり、同じ bootcamp は二度ない。

資料

カリキュラムが無いので、事前に配布する資料やテキストももちろん無い。

Web は、一次情報としての仕様が W3C/WHATWG/IETF/TC39 などから公開されているため、 bootcamp はこれを随時参照しながら進める。

また、 4 日間仕様を実際に見ることで、「仕様はどこにあるのか」「どの仕様に書いてあるのか」「どうやって仕様を読むのか」といったことが身に付く。

これは単に「この機能はこう使う」という知識以上に重要なものであり、この bootcamp が終わった後も進化を続ける Web の、進化そのものに追従するために重要なスキルであると考えている。

また、資料があると多く場合その資料を消化することが目的となり、脱線や構成の変更など柔軟な対応がしにくくなるという側面もある。

実装

仕様を読んだら、必ず実装と挙動を確認する。

仕様はあくまで仕様であり、詳細な挙動は実装にゆだねられる部分が多い。これは時代と共に変わるため、実際に試すのがもっとも正確となる。しかし正確に試すのは慣れが必要だ。

簡単なものはサーバ/クライアントを実装し、 nc, curl, devtools, wireshark などを組み合わせて挙動を確認する。さらにリアルワールドがどうなっているのかを、主要なサイトの実装を参照したり、 BigQuery で httparchive のデータを調べながら確認する。

言語は Ruby を使ったが、基本は socket と http モジュールくらいあればできることしかやっていないため、なんでも良い。

この部分はハンズオンのような形で実際に前でやってみせる。実際に他人が作業しているところを見るのは、それだけで得るものが多いという筆者の経験を元に、筆者が普段からやっていることの実演からも、得るものがあるだろうと期待して行っている。

質疑と脱線

参加者が何をわかっていて、何がわかってないのか、何を知りたいと思っているのかは個々に違う。

そこで、随時こちらから問いかけたり、質問を受け付けることで全体が動いていく流れを作る。

質問はその場で発言しても良いが、参加者から「話を中断するのがはばかられる」という要望で slack に #question チャネルを作り、そこでも受けられるようにした。

最初は遠慮があった質疑も中盤から活発になり、 #question チャネルの質問に別の参加者が答えるまでになった。

最終日は、急遽質問にあった TLS 周りの話を補足するために午後を費やし、 xor 演算から初めて RSA/AES, Handshake, MixedContents, CA インシデントと順を追って確認しながら体系的に解説することにした。

それができる余地を、 bootcamp はあらかじめ残すようにしている。

bootcamp の意味

大抵の研修は最後にテストのようなもので効果測定を行う。

これは通常、「その時点で理解しているか」を測る目的で行われるが、 bootcamp はその場での理解は求めていない。

中級者に重要なのは「自分が何をわかっているか」よりも「何がわかってないのか」を知ることだと考えている。「知らないこと」を調べることはできないが、「これについて知らない」を知っていれば調べることができるからだ。

bootcamp で教えるのは「こう使うとできる」や「こうすると動く」ではなく、「この仕様はここにこう書かれている」「実装はこうすると確認できる」「現実にはこう使われている」などだ。 その場の知識より、 bootcamp の後で個々がその先に進めるようにするためだ。

一方、調べるのが難しいものの一つに「なんでそうなっているか」というコンテキストの把握がある。これは歴史なども絡むので、そこは筆者が知っている範囲のことを補足しつつ、同席してもらった @myakura にも補足してもらいながら行なった。

知らないこと、調べ方、試し方がわかれば、あとは個々で進んで行くこともできるだろう。

だから、 bootcamp は、その場での理解はあまり期待せず、知らないことに気づくためのフックを大量に用意し、それをどんどん進めていく。

知らないことへのフックは深く刺さるものなので、あとで個々がやるべきことが見えてくる。

魚ではなく、釣り方を教え、見たことがなかった魚をひたすら、ついて来れるギリギリより少し溢れる程度に見せる。

全員が 4 日を無駄にせず、その時間を最大限活用する方法として、オーバーヒートさせるように意識している。

これが Lesson や Seminar ではなく、筆者が Bootcamp と呼んでいる由来だ。

募集

ここまでのような内容で実施する上で、 bootcamp は全員と目が合い声が届く少人数での開催が望ましい。

また、それなりのモチベーションが無いと、付いてくるのが難しい。

そこで connpass などでの応募はうまくいかないと判断し、 podcast のみで募集 することにした。

podcast のリスなであるというフィルタを通して、筆者のとのコンテキストの共有も期待でき、抽象的な意図の説明も言葉の方が伝わりやすいだろうと期待しての選択だ。

ただし、単に応募だけで参加というわけにもいかない点がある。少人数である以上、ドタキャンなどの対応や、レベル感の平準化、ひやかしかどうか、そもそも GW 10 連休の前半をカリキュラムもわからないものに費やす上で、双方の理解が本当に一致しているのか、など確認しておきたい項目は多くあった。

結果、応募者各位と Video Chat で会話をさせてもらうことにした。

しかし、想定よりも応募が多く、筆者の時間が足らずに限られた人数としか Chat ができなかった。

ここの負荷が今回一番高かったが、解決できる類の問題ではないだろうとも思う。

Outro

10 連休だったためもっと長くすることもできたが、筆者が 7h ひたすらフルで話し続けられる体力の限界がこのくらいだと考え 4 日にした。

会場探しも難航したが、最終的には中の方のご好意で 株式会社一休 さんにお借りすることができた。非常に良い環境で実施できたため、感謝しかない。

参加者は地方(飛行機レベル)から宿泊での人もおり、かなり高いモチベーションで参加してくれた。

bootcamp のモチベーションも理解しており、質疑なども活発で質の良い脱線も多くできた。この 4 日をかなり使いこなす(hack する)のが早かった点で、参加者には本当に恵まれたと感じている。

今回は、こうした幸運が重なってたまたま出来たところがあり、同じ条件を揃えるのは難しいかもしれない。

平成から令和を迎え、世間が浮き足立っていた裏で、朝から晩まで Web の話をするという機会はなかなか稀有であり、個人的には単純に楽しかった。

参加して頂いたみなさん、会場を提供してくれた株式会社一休さん、そして同席して的確な補足を入れてくれた @myakura さん、本当にありがとうございました。

mozaic bootcamp 2019 最終日実施中の光景