フィヨルドブートキャンプに「自作サービスを作る」という課題がある理由とフィヨルドブートキャンプの取り組み

この記事は[「フィヨルドブートキャンプ Part 2 Advent Calendar 2021」](https://adventar.org/calendars/6360)の20日目の記事です。 - [フィヨルドブートキャンプ Part 1 Advent Calendar 2021](https://adventar.org/calendars/6331) - [フィヨルドブートキャンプ Part 2 Advent Calendar 2021](https://adventar.org/calendars/6360) 昨日 12/19 は - [オブレゴニア](https://twitter.com/obregonia1) さんの「[ghqとpecoでリポジトリの管理を便利にする](https://zenn.dev/obregonia1/articles/e82868e8f66793)」 - [sanfrecce_osaka](https://twitter.com/sanfrecce_osaka) さんの「[レビューするときにやっていること・気を付けていること](https://sanfrecce-osaka.hateblo.jp/entry/2021/12/19/235500)」 でした。 皆さん、素敵な記事をありがとうございます🙏 --- フィヨルドブートキャンプは、最後の課題「自作サービスを作って公開する」を終えて卒業になります。今回は、そもそもなんで自作サービスを作る、という課題が用意されているのか?についての話をします。 ちょっと余談ですが、フィヨルドブートキャンプの学習アプリの中にはこの記事のように、プラクティスのヒントや説明のドキュメントがたくさん用意されているのですが、フィヨルドブートキャンプの中に入らないとそういうのは見えないので、ちょうど今[キャンペーンもやっているし](https://prtimes.jp/main/html/rd/p/000000004.000061066.html)、ってことで、フィヨルドブートキャンプの中身を知るきっかけにもなればと思い、ドキュメントを公開記事にしました。 ## 自作サービスを作って公開するの前にチーム開発があります 自作サービスを作る前にやるプラクティスは「チーム開発のプラクティス」で、受講生の皆さんが今までずっと学習で使い続けてきたフィヨルドブートキャンプ学習アプリの開発に参加するものでした(このブログ記事もフィヨルドブートキャンプ学習アプリの機能の一つ)。ちなみに、フィヨルドブートキャンプの学習アプリは OSS として GitHub 上にコードが公開していて、誰でも見れるし、誰でも利用できます( [https://github.com/fjordllc/bootcamp](https://github.com/fjordllc/bootcamp) )。 チーム開発では、開発の仕事と同じようにチームの中の開発者の役割をやってもらい、与えられた Issue に取り掛かってもらったり、他のチームメンバーのコードをレビューしたりします。Issue にはポイントがふられていて、20 ポイント分の Issue を終えたらチーム開発のプラクティスは修了になります。 これをやることで、開発の仕事ってどうやるのかを知ったり、GitHub 上や チャットでの開発のやりとりに慣れたり、レビューをすることに慣れたり、Git の使い方に慣れたり、もう運用しているプロジェクトのコードを読むことに慣れたり、作った機能のデモをすることに慣れたり... など、プログラマーとして就職した場合に必要になることの大体を経験できます。実際卒業生に話を聞くと、「仕事のやり方はフィヨルドブートキャンプのチーム開発とほとんど同じで、すぐに仕事に慣れた」という声をよく聞き、その都度僕はしてやったりと喜んでいます。 ## チーム開発では足りないところ 自分でもフィヨルドブートキャンプのチーム開発のプラクティスはよく出来ているな〜と思うところはあるのですが、これだけでは足りないこともあります。 どんな Issue が挙がっているかはその時のタイミングで変わるので、なるべく全員に Rails、DB、JavaScript に絡む Issue を担当してもらうようにはしているのですが、どの Issue が自分の担当になるかは運に左右されてしまいます(とはいえ、希望があった場合はできる限りそれに沿うようにしています)。 担当する Issue の技術の面でのばらつきもあるのですが、技術面以外にもばらつきがあります。Issue の中には仕様がきっちり決まっているものと、まだふわっとしているものがあります。こちらも全員が両方の Issue を担当できるといいのですが、なかなか難しいです。新機能の場合は大体ふわっとしていて、仕様を考えて提案してもらったり、逆に僕の提案について意見をもらったりなど、コードを書く前の段階のことも色々やってもらいます。これがすごく面白いし、ユーザーのことを考えたり、リリースまでにかかる時間について考えたりする貴重な経験になるので全員にやってもらいたいところなのですが、新機能はあまり追加されないので全員がやることは難しいです。 このように、チーム開発では経験して欲しいこと全てを経験するのは難しいため、自作サービスを作るというプラクティスをやってもらっています。自作サービスの方で、チーム開発で開発ではできなかったこと、もっとやりたかったことを存分に経験してもらっています。さらに、それ以外にも経験してほしいことがあるので、そちらもまとめます。 ## それ以外の自作サービスで学べること チーム開発では開発者の一人として開発者の役割をしてきましたが、自作サービスでは、開発者だけでなく、企画、プロダクトオーナー、デザイナー、経営者、広報...などサービスに関わる全ての役割を一人でやる必要があります。 ### 目的と制限 自作サービスで自分がやる役割を見て「経営者?」と疑問に思ったかもしれません。会社の場合、従業員や外注にお金を払ってサービスを作り、そこで使ったお金以上の儲けを出さなくては会社が潰れます。会社のお金は無限ではないので、限られた予算・期間内でサービスを作り儲けを出さなくてはいけないので、それらを無視してどんな機能も盛り込んでいくということはできません。何を実装し、何を捨てるかの判断、作り続けるか、止めて別のものを作るかの判断が必要になります。 会社ではなくフィヨルドブートキャンプの受講生の場合、作るサービスで儲けることを目的にすることは稀ですが、一人で Web サービスを作って公開できるスキルがあることを証明する、問題をこのサービスを使うことで解決する、チーム開発では Minitest を使っていたので RSpec を使う、チーム開発では Vue.js を使っていたので React を使う、自分の名刺代わりになるようなサービスがほしい... など、会社のサービスの目的とはだいぶ違うものになるかもですが、サービスを作る目的があることは会社と同じです。 また、お金と時間に限りがあるのも会社と同じです。いつまでに自作サービスを作る課題を終わらせフィヨルドブートキャンプを卒業するか、そのためにはどんなサービスをどこまで作るかを考える必要があります。時間をかければ卒業までにかかるフィヨルドブートキャンプの受講料もかかってしまい、就職を考えている方は就職も先になってしまいます。とはいえ、時間に限りがあるからといって、目的を達成しないものを作っても意味がありません。 制限の中で目的を達成することを考えることが大事になりますが、これを考える機会を得られることが自作サービスで学べることの大きなポイントの一つになります。 ### 優先順位と計画 一人でサービスを作るのは長期戦です。勢いに任せて思いついた機能からガンガン作っていく、という方法では途中で息切れしてしまう可能性が高いし、ゴールが設定されていないといつまで経ってもリリースはされず、途中で作ることが嫌になってしまうこともあります。そうならないように、リリースするのに必要な機能を俯瞰して考え、Issue を洗い出し優先度を付けることが大事です。 そして、ちゃんと進捗が出ているかを確認し、うまくいっていない場合はその原因について考えたり、やり方を変えていくのも大事です。ときには自分の中の開発者と話し合って、この部分が実現できるか不安があるからこの技術調査を優先したい、や、コードの負債のせいで開発がしにくいのでリファクタリングをしたい、といった申し出を受け入れたり、場合によってはどう計画しても非現実的なものになってしまったり、目的を達成することが不可能なことに気づいたりして、自分の中の経営者と話し合って目的や計画を見直す必要が出てきたりなどがあるかもしれないです。 ### いろいろな役割を経験することで ...と、このようにいろいろな役割を経験することで、その役割の人の気持ちや出会う問題について知れることが重要なポイントだと考えます。この役割の人にはこう動いてもらえると、この役割の人にとってはこういう場合にすごく助かる、というのがわかっていることで、実際チームで開発をする際にいい動きができるようになります。一人でサービスを一回作っただけで知れる範囲というのは限られてはいますが、それでもやったことがない人に比べて大きな差はあると思います。また、自分がその役割をやってみたことががきっかけで、開発者以外の役割のことにも興味が持てれば、チームで開発がさらに楽しくなれるかもしれません。 ### 他にもたくさん 他にも問題を探したり、それをどうやって解決するかを考えたりなどや、他にもたくさんのいい経験になることがありますが、それらについてはまた別のドキュメントで書いていこうと思います。 ちょうど先ほど [yana-gi](https://twitter.com/yana_gis) さんがサービスリリースのブログ記事を公開してくれたのですが [コードを画像でツイートできるサービスをリリースしました](https://yana-g.hatenablog.com/entry/2021/12/20/112148) ここに自作サービスを作って学んだことがたくさん書いてありましたので、ぜひ読んでみてくださいー。 ## フィヨルドブートキャンプの取り組み このように、学べることがたくさんある自作サービスですが、リリースまでやる、というのはすごく大変というのは重々承知しています。フィヨルドブートキャンプでは、リリースまでやり切れるよう出来る限りのサポートをし、常に改善もしています。 ### 細かく段階に分ける 「そんじゃあサービスづくり開始!!終わったら教えて」という訳ではなく、自作サービスをリリースするまでをプラクティスに分けて、都度メンターがチェックをするようにしています。 現時点では、 - どんなサービスを作るかを考える - ペーパープロトタイプを作る - カンバンを作る - 技術検証をする - リソース・DB設計 - Webサービスを作る - デプロイ - 自分で作った Web サービスのデザインレビューを受ける - 自分で作った Web サービスのコードレビューを受ける - Web サービスをリリースする このような段階に分けられています。 例えば、プラクティス「どんなサービスを作るかを考える」では、エレベーターピッチの形式で作るサービスの内容を提出し、解決したい問題と、その解決手段を明確にしてもらいます。自分が作りたかったサービスが何の問題も解決していなかったり、誰にも起きていない問題を解決しようとしていたり、わざわざWebサービスを作りよりXXXを使った方が楽で便利だったり... など、作る前の今の時点で手戻りを最小限にするために、間違いに気付くことを目的にしています。これを読んでる卒業の中には言われた人もいるかもしれないですが、「それ Twitterで良くない?」、「それ 写真で撮れば良くない?」、「紙に書いたほうが早くない?」は、よく出てくるワードです。 その次の「ペーパープロトタイプを作る」も同じ目的で、実際の画面に起こしてもらい、本当に問題を解決できているか?、逆に手間がかかって別の問題が起きていないか?ちゃんと使えるのか?などを確認し、間違いに気付くことを目的にしています。 「技術検証をする」の方は、技術的な問題で実現が不可能なことに気付くため、「リソース・DB設計Web」は、DBの設計に問題があり後で大幅な改修が必要になって手戻りが発生するのを防ぐことを目的にしています。 これらを経て、プラクティス「サービスを作る」に入ります。 ### 自作サービス進捗報告会 手戻りが発生しないよう段階を付けて都度確認を行っていきますが、それでもリリースするまでのモチベーションを維持するのは大変です。モチベーションの維持が難しい原因に、締切がないというのがあります。この問題を解決するために、自作サービス進捗報告会というものを週一で開催しています。 自作サービス進捗報告会とは、週に一回、ビデオチャットに自作サービスの課題まで進んだ受講生が集まり、それぞれが今週やったことと、来週やることをそれぞれ発表してもらう会です。今週出会った問題などがあったらそれも言ってもらい、みんなで相談に乗ります。これがあることで、次回の自作サービス進捗報告会までにここまで終わらせようと、区切りを付けて細かい目標を立てやすくしています。 最近はメンターを始めフィヨルドブートキャンプに関わる皆さんのおかげで脱落する人が減り、自作サービスまで到達する受講生が増え自作サービス進捗報告会もだいぶにぎやかになってきました。最近メンターになってくれた [esa 社](https://esa.io/)の [ken_c_lo](https://twitter.com/ken_c_lo) さんも参加してくれて、豪華で楽しい会になってます。僕もみんなが考えたサービスがどんどんリリースに近づいていくのを楽しんでいます。 そうそう、自作サービス進捗報告会はやったことと次やることを報告する会ということなので、何もできなかったら参加する意味がないと誤解している人がいるかもなので、この場でそうではないことを伝えておきたいと思います。仕事が忙しくてや体調が悪くてで着手できなかったなど、原因が明らかな場合は別ですが、技術的にわからないことがあって進まない、なんか原因はよくわからないけどうまくいかない、などがあった場合こそ出席して相談してほしいです。これはチーム開発も同じですが、うまくいってないときこそフィヨルドブートキャンプを活用しまくってください。 ### 卒業式プレゼン 月一で開催しているオンラインで開催しているミートアップのときに卒業式を行っているのですが、そのときに卒業になった受講生に作ったサービスをプレゼンしてもらっています。この場があることで、いい発表ができるものを作ろうという目標になります。僕も毎回発表や、それを聞いた受講生のリアクションを楽しみにしています。これは予想してなかったのですが、現役受講生にとっては、学習を進めるとこういうものが作れるようになるのかー!と、モチベーションアップになる効果もありました。あと、発表があることで卒業式がより卒業式っぽい感じになりましたね。 ## 今後 以上、フィヨルドブートキャンプに「自作サービスを作る」という課題がある理由と取り組みの話でした。 今後解決したい課題として、自作サービスをせっかくリリースしても、開発を止めてしまうという問題を解決できたらなー、と思っています。確かにサービスを運営し続けるのって大変ですが、サービスを成長させることにも楽しさはあるので、ぜひリリース後もカイゼンし続けてもらえると嬉しいです。僕らも何か仕組みを用意したいと考えています。いつか、自作サービスからヒットするサービスが出たら面白いですよね。 --- 明日はのフィヨルドブートキャンプ Advent Calendar 2021は、 - [yana-gi](https://twitter.com/yana_gis) さん - [ぴー](https://twitter.com/takapi61) さん です。楽しみにしてますー!!