見出し画像

Code ChrysalisのThe Immersive Coding Bootcamp(Cohort 10)を終えて(その1)

去年(2019年)の秋頃に前の会社を退職し、2019年12月まで、Code Chrysalis の The Immersive Bootcamp というコーディングブートキャンプに参加していました。私は、ちょうど 10 期生(Cohort 10, CC10)になります。

転職先が決まり、今までの振り返りも兼ねて、この記事(ポエム的な何か)を書きました(長くなりすぎて、2 パートに分けるつもりです…)。内容としては、ブートキャンプに参加する以前の話から、ブートキャンプの3ヶ月で経験したことについて、今(2020年2月現在)に至るまでの軌跡を時系列に沿ってまとめました。

以下は、あくまで個人的な感想にすぎないという点をご了承下さい(思い出補正がかかっていて、話を盛ってる部分があるかもしれません)。Code Chrysalis のコーディングブートキャンプに参加する・参加したいと思っている方の参考になれば幸いです。

Code Chrysalisのブートキャンプを知ったきっかけ(2018頃)

そもそもブートキャンプに参加する前は、システムエンジニアとして2年半、VB、C#を使ったデスクトップアプリ、Javaを使ったWebアプリの開発をする社内 SE として勤めていました。そんな中で、いろいろな理由があって、今の会社をやめて転職しようと考えていました。

当時、そのまま転職するという手もありましたが、コーディングブートキャンプを経て転職する道も考えていました。特に、モダンな Web アプリ開発を現場で経験してこなかったので、業務外でモダンな Web アプリの開発経験をブートキャンプを通して養いたいと思っていました。

ただ正直、当初は日本のコーディングブートキャンプに魅力を感じていませんでした。というのも、当時、多くのコーディングブートキャンプが Ruby(Ruby on Ralis)をメイン言語として採用したからです。Ruby on Ralis のフリー教材が巷にあふれていることや、それらのブートキャンプのカリキュラムを見る限り、独学でも勉強できそうという印象から、こういったブートキャンプに私個人としてはあまり魅力を感じていなかったわけです(あくまで私個人の見解ですが…)。

そんな中、異彩を放つコーディングブートキャンプを見つけました。それが Code Chrysalis でした。授業はすべて英語、JavaScript をメイン言語として、フルスタックエンジニアの育成を行っていると。また、私としては、フロントエンドでは React や Vue などのJavaScript のライブラリやフレームワークが現在の主流となっているのに加え、Node.js や Express などを使ったバックエンドの構築もできる JavaScript を中心としたカリキュラムは理にかなっていると感じました。

また、上記の技術的なスキルの習得にとどまらず、テックトークをはじめとするプレゼンやチーム開発、エンジニア間のコミュニケーションなどの、いわゆるソフトスキルの向上にも力を入れているという点も、他のブートキャンプにはない魅力だと感じました。

その他にも、YouTube でテックトークや卒業発表の様子が動画として公開されており、多種多様な技術を使ってアプリケーション開発を行っている生徒たちを姿を見て、「ほんとに三ヶ月でここまでできるのか、すごいなぁ」という印象を受けました。一方で、なんかレベルが高そうで自分には無理だと最初は思い込んで、端から諦めていました。

Intensive English Communication(ECI)に参加する(2019年1〜2月)

久しぶりに Code Chrysalis のホームページを覗いてみると、なんと Intensive English Communication(ECI)とよばれる日本人のための英会話のコースが新たにスタートしているではありませんか!

そのときはまだ、自分が Code Chrysalis のブートキャンプに参加する決意が固まっていたわけではありませんでした。英語の能力が足りていないと感じていたので、まずは Code Chrysalis が主催する英語のコミュニケーションクラスに入って、そこからどうするか考えようと思っていました。

ECI のコースは、私が想像していた以上に満足できる内容でした(ハードではありましたが…)。毎週土曜に、教室で丸1日かけて英会話のレッスン、平日に1回、Skypeで英会話のレッスンがあるという内容です。毎週、宿題として、リーディングの課題や自分の意見をまとめたライティング、TED Talk の動画鑑賞、英語のプレゼンの準備などが課されました。

ここまでは普通の英会話学校と何の変哲もないように思います。しかし、ここが重要なポイントですが、ECI のレッスンにはテキストブックがありません。テキストブックがないので、その場でいきなり課題が出され、3〜4人のグループでディスカッションやディベートをしたり、パブリックスピーキングの練習をしたりします。

これにはちゃんとした理由があります。想像してみてください。実際の英語のコミュニケーションの場において、何かを事前に準備するということはあるでしょうか?プレゼンなどを除いては、ありえないと思います("Life is not scripted")。実際のコミュニケーションでは、その場で物事を考え、発言していかなければなりません。そのため、ECI のレッスンでもその点を重視したトレーニングになっているというわけです(これは私感ですが)。そのため ECI では、その場で物事を考え、英語で発言する力をさまざまなレッスンを通して養っていきます。一言では言い表せないですが、とてもユニークな英語のレッスンで適度な緊張感のもと、楽しみながら英語の学習ができたと記憶しています。

Growth Mindset に出会う

加えて、ECI では Growth Mindset という考え方に初めて出会いました。説明するのが難しいのですが、要するに、困難に直面した際に「自分ならやればできる」と物事をポジティブに捉える思考法だと認識しています(うまくニュアンスを言葉にできないですが…)。

前述したとおり、ECI にはテキストブックがなく、その場で出されたさまざまな課題を、事前の準備もなくこなしていかなければなりません。これは生徒にとっては苦痛です。しかし、そんなときこそ、Growth Mindset です。困難に直面した際に、それに苦しみ諦めてしまうのではなく、それを自分にとっての挑戦(チャレンジ)だと考え、前向きに物事に取り組んで行く姿勢を養う。それが ECI でのレッスンです。講師の先生は、ECI の期間中、生徒の背中を押してくれ、この Growth Mindset を実践するように促してくれました(少なくとも私自身はそう感じていました)。

今でも覚えているエピソードとして、ある生徒が「It is difficult for me...」といったことに対し、講師の先生が「No, it is challenging for you...」だと説いたことが印象的でした。「難しくて自分にはできない」ではなく、「これは自分にとってチャレンジング(挑戦的)」なんだと。ちょっとしたニュアンスの違いに聞こえるかもしれませんが、なるほど面白い考えだなぁと思いました。

心理的安全性が担保された環境

また、講師の先生は、文法の間違いなどの細かなミスを恐れずに、どんどん自分の言いたいことを英語で発言していける環境をうまいこと作り上げていたと思いました。生徒が「こんなことを言ったらバカだと思われるんじゃないか…」と心配する必要がなく、生徒同士がお互いを尊重し合う環境(Google のいうところの心理的安全性が担保された環境)ができていたと思います。

Growth Mindset や心理的安全性に関する部分は、Code Chrysalis の 1 つのカルチャーとして根付いていると ECI を通して感じました。こういった環境(コーディングブートキャンプ)で自分もエンジニアとしてスキルアップがしたいなぁと、ECI が終わった後は考え始めました。

残念ながら現在、Code Chrysalis では ECI を含む英語のコミュニケーションのコースはなくなってしまいましたが、その受講生であった私としては、このすばらしいコースを復活してほしいと切に願っています。

Webコーディングテスト・テクニカルインタビュー(2019年3月)

2018年11〜12月頃からすでに JavaScript を触り始めていて、当時は CodeWars の問題(6kyu から 7kyu)をひたすら解いていました。ただこのときは、テクニカルインタビューにビビっていて、まだ Web コーディングテストすら受けていない状態でした。

ECI にはブートキャンプに参加したい生徒も何人かいて、すでにテクニカルインタビューを受けた人もいました。ECI が終わった後、彼らから背中を押され、自分も失敗してもいいからとにかくチャレンジしてみようと思いました(これも Growth Mindset 的な思考かも?)。

具体的な対策としては、公式が出しているコードクリサリスのイマーシブ・ブートキャンプの入学攻略法に尽きると思いますが、私がやった内容・アドバイスを一応書いておきます。

The Modern JavaScript Tutorial の 「JavaScript Fundamentals」と「Data types」をテストを含めて理解する。
Eloquent JavaScript の「5. Higher-order Function」は少なくとも読んでおく(高階関数の説明がかなりよい)。
CodeWars の 7kyu の問題をひたすら解く(これ以上のレベルがテクニカルインタビューで出題されることはないと思います)。
console.log() を使ったデバックに慣れておく(本当はデバッカを使えたほうがいいのですが、この段階ではこれで OK)。
JavaScript Primer 日本語で勉強したい人にはおすすめ。

個人的には、The Modern JavaScript Tutorial の解説がわかりやすかったです。一方で、Eloquent JavaScript は読みにくい箇所があるので、英語があまり得意でなく、独学の場合は気をつけたほうがいいかもしれません(ただし、高階関数の説明はためになるので、そこだけは読んでおいたほうがいいと思います)。ちなみに、日本語で勉強したい場合は JavaScript Primer もおすすめです(this の解説がわかりやすいです)。あと、読んで理解するだけでなく、実際にコードを書いてみて使い慣れる必要があります。テクニカルインタビューの対策としては、CodeWars の 7kyu レベルの問題が個人的にはおすすめだと思います。

そんなこんなで、テクニカルインタビューをパスして、Code Chrysalisのブートキャンプに参加できる資格を得ました。このタイミングで、会社の上長に相談して会社を辞めるという話をしました。時期的には CC9 に入ることもできましたが、会社での業務などの関係で退職する時期を合わせられなかったので、2019年10月から始まる CC10 に参加することにしました。

The Immersive プレコース(2019年8〜9月)

プレコースでは、JavaScript の重要な文法(Recursion、High-order Function、Closure、Class など)や HTML / CSS の基礎に関する課題が渡され、期限内にこなす必要があります。普通のブートキャンプでは、コース中にこれらの技術を学ぶのかもしれませんが、Code Chrysalis では、これらの技術はブートキャンプに参加する前にすでに習得できていることが前提となります。

プレコース中には、さらに 2 回の試験(Assessment)が課され、これらをクリアしないと 10 月から始まるブートキャンプに参加できません。つまり、Code Chrysalisのブートキャンプに参加するには、実質、合計 4 つの選考・試験を突破する必要があります。

1. Web コーディングテスト
2. テクニカルインタビュー(ペアプログラミング形式)
3. プレコース中の試験 × 2

プレコースで一番大変だったのは、JavaScript のユーティリティ系のライブラリを自分たちで再実装するという課題です。これが JavaScript の基礎固めをする上でかなりためになる課題で、普段何気なく使っているライブラリの中身がどうなっているのか理解するきっかけにもなりました。

また、課題のやり取りはすべて GitHub 上で行われるため、レポジトリのフォーク、クローン、コミット、プルリクエストなどの基本的な Git の使い方についても学ぶことになります(エンジニアにとって、コードを管理する上で必須の知識になります)。

プレコースの課題以外で取り組んだこと・反省点

さらに私の場合、英語での講義について行けるか心配だったので、Udemy のコースで英語での講義に耳を慣らしておきました。例えば、以下のJavaScript のコースを英語字幕をつけてやっていました。

The Coding Interview Bootcamp: Algorithms + Data Structures

それ以外にも、ブートキャンプのカリキュラムは公開されており内容がわかっていたので、先回りしてブートキャンプ中に習う技術(React、Redux、Express、Knex など)を軽く見ておきました。

個人的な反省としては、この時点で転職を見据えてもっとアルゴリズムやデータ構造の学習を進めておくべきだったと思いました。理由としては、私がこれらの分野を苦手としていたことと、転職時のコーディングテストでこれらの知識が要求されるためです。ブートキャンプ中は、他にも学ばなければいけないことがたくさん出てくるので、プレコースの時点で手をつけておいたほうよかったなぁと思いました。

ちなみに、他の生徒に教えてもらったんですが、アルゴリズムやデータ構造の学習に最適なのが、LeetCode です。特に分野別に分類されている、こちらのコーディング面接対策のために解きたいLeetCode 60問のリストが参考になります。

The Immersive がついに始まる(2019年10月: 1〜2週目)

プレコースの課題をすべてクリアし、晴れて Code Chrysalis のブートキャンプに参加することができました。不安と期待を胸に、六本木にある Code Chrysalis の教室に向かいました。しかし、そこでは次なる試練が待ち構えていました

他の生徒とのペアプログラミング

私にとっては、技術面でついていけるかという不安が大きく、英語でコミュニケーションを取っていかなくてはいけないということを半ば忘れていました…。Code Chrysalis では、基本的に 1〜2 時間の講義のあと、スプリントと呼ばれる課題が課されます。そして、その課題を別の生徒とペアを組んでペアプログラミングを行い、課題を解いていきます。

とにかく、相手が自分が想定していたよりも速いスピードで英語を話すので、英語でのコミュニケーション(特にリスニング)に四苦八苦していました。ECI が終わってから期間が空いてしまったということもあり、「しまった、英語をもっと勉強しておくべきだった…」と入ってから痛感させられました。もちろん、ブートキャンプ中は毎日英語で生活するため、日々英語力が鍛えられていくのですが、事前に鍛えておくに越したことはないと思います(リスニングをもっとやっておけばよかったなぁ)。

また、ペアプログラミングではお互いの意見がぶつかり合うこともあります。そんな中で、お互いを尊重しつつ、最適解をペアと一緒に考えていく作業が求められます(英語であることも相まって、これが大変なんですが…)。私の場合、口頭で英語を使ってうまく説明できない場合は、ノートに図を書いてペアと話をすることもありました。また、お互いに質問しあって、「これってこういうことだよね」って確認することもしばしばでした。恥ずかしながら、私のリスニング能力がイマイチなので「Could you explain that again?」とか言って、聞き返すこともよくしてました…。

プログラミングだけじゃない、ユニークなカリキュラム

コーディングブートキャンプと聞いて、「きっと、期間中はプログラミング漬けの毎日に違いない」と思っている方も少なくないかもしれません(少なくとも、私はそう思っていました)。しかし、Code Chrysalis でのブートキャンプは違います。例えば、毎日、朝と昼休憩の直後にライトニングトーク(3 分間のプレゼン)を行います。スピーカーは生徒の持ち回りで、少なくとも 1 週間に 1 回は人前でプレゼンする機会が与えられます。プレゼンの内容は、一般的な話題から技術的な話までさまざまです(この他にも、アルゴリズムの説明や自分たちで作ったアプリの技術的な説明など、テックトーク寄りのプレゼンをする機会があります)。

その他にも、1〜2 週目では、ほとんどの人にとって初体験となるペアプログラミングを円滑に行うために、ペアとのコミュニケーションや、フィードバックのやり方などのコミュニケーション関連の講義が入ってきます。それ以外には、タイムマネジメントや Growth Mindset 、目標設定など、いわゆるソフトスキルを身につけるための講義が入ってきます。ちなみに、技術系のスキルを教えるインストラクターとは別に、これらの講義を受け持つ専任のインストラクターがいます。

エンジニアとして必要な4要素 : CATE

また、ソフトスキル関連の講義の中で、エンジニアに必要な以下の 4 つの要素(CATE)を学びました。他にもいろいろあった気がしますが、私が一番記憶に残っているのがこれです。

1. C(Communication):コミュニケーション
2. A(Autonomy):自立性(自ら学び、成長する力)
3. T(Technology):テクノロジー(エンジニアとして必要な技術力)
4. E(Empathy):共感性(一言では言い表せない…)

Empathy に関しては、様々な意味を含んでいると思います。例えば、誰のためのアプリなのか(ユーザストーリーを考えられているか)、ユーザに対して最も価値を提供できる機能(MVP: Minimum Viable Product)は何なのか(優先して実装すべき機能は何か?)について考えることも、この Empathy の一部だと思います。

Code Chrysalis では、多くのコーディングブートキャンプに見られるように、コーディングスキル(T: Technology)の習得に特化するのではなく、これらの要素をまんべんなく身につけるための講義や課題が用意されています。これが、他のブートキャンプと大きく異なる点であり、Code Chrysalis の良さだと思っています(それぞれの話は後述)

恐ろしいスピードでバックエンドからフロントエンドまでを一気に学習…(2019年10月: 3〜4週目)

1〜2 週目の時点で、プレコースの復習やアルゴリズムとデータ構造、非同期処理、データベースの基礎などを習得しました。3〜4 週目からは、その学習スピードを緩めることなく(むしろ加速して?)、バックエンド(PostgreSQL、Express、REST API、GraphQL)からフロントエンド(React、Redux)までの技術をたった 2 週間で習得していきます。

初見でこれらに取り組むのは無理ゲーだと思ったので、このあたりからちゃんと予習をするようにしていました(少なくとも前日に)。土日の時点で、次の 1 週間の予定が開示されるので、事前に講義のスライドを確認したり、公式ドキュメントに目を通すようにしていました。予習の段階で大まかに内容を理解しておいて(40〜50 % ぐらいの理解度)、講義とスプリント(ペアプログラミング)で理解度を深めるというスタイルで臨みました。

インポスター症候群と闘う

ブートキャンプ中、どうしても他人と自分を比較してしまいがちです。このあたりから「他の人と比べて自分は劣っているんじゃないか」というネガティブな思考にとらわれる時期がやってきます(少なくとも私は)。

人間、十人十色です。全く異なるバックグラウンドを持った生徒が集まってくるので、みんな違って当然です。みんな異なる才能を持っています。なので、他人と自分を比較するだけ時間の無駄です。「この人の UI / UX に対する感覚がすばらしいな」とか、「この人のシステム設計に対する細部へのこだわりがすごいな」とか、「この人のプレゼンのストーリーの組み立て方がすばらしいな」とか、他の生徒をリスペクトする方向に気持ちを持っていったほうが楽になれます(私はそう考えるようにしていました)。またこういった中で、他の生徒から学ぶこともたくさんあります。独学と違って、色んな人から刺激を受けて自分の視野を広げる事ができる、これもブートキャンプの醍醐味かもしれません。

時間との闘い(タイムマネジメントを意識するが…)

このあたりから、ソロプロジェクトといって、アイデアを練って、自分 1 人で好きなプロダクトを作る課題が与えられます。もちろん、作って終わりではなく、最後にみんなの前でプレゼンを行います。正直言って、限られた時間(例えば、2 日間)で成果物をあげないといけないため、かなりハードな課題となります(そして、最初のソロプロジェクトは土日に行いました…)。

そこで重要になってくるのがタイムマネジメントです。アイデアを練る時間、コーディング(実装)の時間、プレゼンを準備する時間を、デットラインから逆算して「いつまでにどの工程を終わらせないといけない」という計画を自分で立てていきます。最後にプレゼンをしないといけないので、中途半端なものを見せるわけにもいきません。ただ、最初の頃のプロジェクトでは「あれもこれも実装して、すごいアプリを作ってやるぞ。」と意気込んだものの、実装する機能に対しての優先付けが自分の中でちゃんとできておらず、焦って作業が手に付かないということがありました。

MVP(Minimum Viable Product)の実践

ブートキャンプ中の講義で、MVP(Minimum Viable Product)という考え方を学びました。これが、自分にとっては上記の問題を解決する 1 つのきっかけになったと思います。MVP とは、顧客(ユーザ)に対して価値を提供できる最小限のプロダクトを作るアプローチ方法のことです。自分の作りたいプロダクトに対して、様々なアイデアが出てくる中で、どの機能が最もユーザにとって価値があるのかを考え、実装する機能の優先順位を決めていきます。最初からフルスペックの巨大なプロダクトを作ろうとせず、小さく始めて徐々にプロダクトを大きくしていくイメージです。これを実践することで、ある意味、MVP がプロダクトを開発する上でのマイルストーンになり、精神的なゆとりも得られました。

Code Chrysalis のソロプロジェクトやチーム開発では、この MVP を意識した開発をするようにとよく言われました。チーム開発を含め、以降のプロジェクトではみんな MVP を意識した開発を行っていました。

フルスタックアプリケーションの開発と初めてのチーム開発(2019年10月: 5〜6週目)

最初の 1 ヶ月で Web アプリケーション開発に必要な知識・スキル(バックエンドからフロントエンドまで)のほとんどを学びました。週の最後に、みんなで写真を撮るんですが「今週も生き残ることができたぞ!」ってお互いに言ってました(今思い返せば、そのくらい猛烈で濃密な時間を過ごしていました)。Code Chrysalis のブートキャンプの期間は 3 ヶ月ありますが、実は 技術的な部分に関しては 1 ヶ月でほぼすべて習得し、それ以降はすべてソロプロジェクト・チーム開発を通した実践的な内容に移ります。

4 週目までで、フロントエンドに関しては React と Redux を習得し、5 週目以降では、今度は Vue と Vuex を短期間(2 日)で習得することになります。その後は、より実践的な内容として、チーム開発とソロプロジェクトを行いました。また、合間の時間にアジャイル開発やプロダクトマネジメント、CI / CD に関する講義が入ってきます。またプライベート(?)では、同時進行でテックトークの内容を練る作業をしていました(これも週末の宿題の一部)。

エンジニアとしての自力・自立性を養う

これまでも話してきたとおり、Code Chrysalis では、1〜2時間程度の講義があり、その後にスプリントと呼ばれる課題をペアプログラミングで行っていきます。ただし、スプリントで出題される課題で必要となる知識・内容が、講義内ですべてカバーされているとは限りません。例えば、データベースの基礎を学んだ際は、CRUD 処理を行う際に具体的にどのようにクエリを組み立てたらいいかについては講義内で説明がありません。この場合、講義では概念・コンセプトの部分の解説が中心となります(すべてのスプリントでそうなっているわけではないですが)。そのため、スプリントの課題を解く上で公式ドキュメントや参考資料を読み込み、クエリの書き方を学びながら実践していきます。

一見すると「講義ですべて説明してくれればいいのに!」と思うかもしれませんが、私はこれはエンジニアとしての自力や自立性を養うための一環だと思っています。確かに、React や Vue のようにすでに有名となり、巷にさまざまな情報が溢れているものであれば、Udemy のコースや Qiita、ブログ記事などから有用な情報をまとめて効率的に入手できるかもしれません。しかし、全く新しい技術の場合はどうでしょうか?これらの最新情報はネット上でまとまった記事などが少なく、公式ドキュメント(もしくは実際のソースコード)から内容を紐解いて行くことが求められます。エンジニアとして新しい技術に速やかにキャッチアップしていくことを考えた時、公式ドキュメントを読むことが重要になってきます。Code Chrysalis では公式ドキュメントを参照するようによく言われますが、これがその理由だと私は思っています。

また、ソロプロジェクトでは全て自分の裁量で組み立てていくことになるので、この課題を通して、エンジニアとしての自力や自立性、自信を身につけていくことができました。

初めてのチーム開発やそれ以降の週の話、卒業後の転職活動の話は、次の記事にまとめるつもりです(続くかどうかは気分次第です…)。

この記事が気に入ったらサポートをしてみませんか?