プログラミング初心者が半年でiOS,Androidアプリをリリースするまでの軌跡

## はじめに
「ド」がつくほどのプログラミング初心者だった私が、Flutterを用いて半年でアプリをリリースするまでの軌跡をつづりたいと思います。
現在でさえもまだまだヨチヨチ歩きの自分が、生まれたての子鹿のような状態でもがきながら作ったアプリなので、温かい目で見ていただければと思います(笑)
とはいっても溢れんばかりの情熱を持ってつくったので、少しでも刺さる内容があれば嬉しいなぁと思います。
※技術的な話はあまりありません。

## 作ったアプリ
「ココミラ」という大学受験を控えた学生が授業動画を見られるアプリを作成しました。

・iOS
https://apps.apple.com/jp/app/%E3%82%B3%E3%82%B3%E3%83%9F%E3%83%A9/id1663436977

・Android
https://play.google.com/store/apps/details?id=com.KOKOMIRAI.kokomira0107

Flutter,Firebaseを用いて1人で開発しました。他にも非エンジニアのチームメンバーがおり、要件定義に関してはみんなで行いました。
開発期間は2022年9月〜現在です。

## 何者？
現在(2023年3月)、大学院修士1年生です。
名古屋大学の数学科を卒業したあと、もうすぐ統合して名前が変わる大学に進学しました。

学部生時代に友人と株式会社ここみらいという会社を立ち上げ、「ここみらいチャンネル」という教育系YouTubeチャンネルを運営してきました。

プログラミングは2022年9月に始めるまで全く経験がありませんでした。

## 開発に至った経緯
ここは少し長くなってしまいますが時系列と共に、アプリ開発をすると決めた経緯をつづります。
実はゼロからアプリ開発をやろうと思ったのではなく、友人とやっていた事業の中でアプリ開発をする必要性が出てきたといった形になります。
なので、アプリのコンセプトや機能はその事業のコンセプトに準拠しています。

正直アプリ開発以前の話なので、かる〜く流し読みしていただければと思います（笑）

### YouTubeチャンネルの創設
大学2年のときに名古屋大学の友人と「ここみらいチャンネル」という教育系YouTubeチャンネルを立ち上げ、これまで運営してきました。
https://www.youtube.com/@kokomirai

チャンネルの特徴としては
・大学受験生向けの授業動画を投稿している
・理科・社会といったマイナー科目の講義が充実している
・無料の教材をダウンロードして使える

といった感じです。
今では5.6万人の登録者がいるチャンネルに成長させられました。


### チャンネル創設の経緯
このチャンネルは僕やチームメンバーが学生時代に感じた苦しみや課題感から生まれています。
中でも大きく2つの課題を強く認識していました。

1つは理科や社会などのマイナー科目の学習に苦しんだということです。
私自身、岐阜県の田舎の公立高校出身で、教員不足の影響からか、大学で化学を専攻した教員が生物を教えているといったような状況が頻発していました。
教科に愛情のない先生が教えると、生徒にもそれが伝わりどんどんその科目が嫌いになってしまうという感覚が僕にはあります。
僕自身理科社会を好きになれなかった理由として、先生がその科目を楽しそうに教えていなかったという点が大きかったように思えるからです。
田舎に生まれたからといって、受けられる教育の質が下がるというのはよろしくないし、何よりその科目に対する愛情のある人に教えてもらう機会がとても重要だと思いました。

また、もうひとつの理由は学生時代の塾代にめちゃくちゃお金がかかったということです。
友人も私もある大手映像授業塾に通っており、現役時代にトータルで100万以上塾代がかかりました。友人の場合は親が自営業で、教育費を捻出するために夜中にバイトしていたことを大学時代に知ったらしいです。
その塾が一概に悪いということでは全くありませんが、「もっと教育費安くても良くないか？」「良い大学に行かせたいという一心で高い教育費を払う親の気持ちを無碍にしたくない」という思いが拭いきれませんでした。

こんな思いから「もっと安くて教育効果が高く、誰でも学びたい人は学べるようなコンテンツを作ってやろう！」と思いました。
そこで行き着いた先がYouTubeというわけです。

### コンテンツへのこだわり
そんな自分たちの思いから、学生に無料で質の高いコンテンツを届けるということを徹底していました。
特に、本当に受験で使い物になるコンテンツにするために、授業に付随したテキストを自作し「体系的に学べる」かつ「復習ができる」サービスづくりを徹底しました。この自作教材が他の教育系YouTubeチャンネルと一線を画しているように思います。
動画を見る時間だけではなく、電車の行き帰りなどの隙間時間に教材を見返してもらったり、受験会場までテキストを持っていってもらえるくらいに作りこんだからです。

![スクリーンショット 2023-03-21 21.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849000/209a6dd1-3ed1-89bc-638b-fb52fc1e050f.png)

これによってYouTubeで動画を見るだけに留まらない、学生の生活と共にあるサービスを一定程度実現できたと思います。

### 無料でコンテンツを提供するために
しかし、無料で学生に授業を供給し続けるには、他の部分でマネタイズし事業を成立させる必要があります。
そこで思いついたのがスポンサー収入を得るということです。
僕らのチャンネルには学生のユーザーがそれなりにいたので、その学生たちに塾や大学の情報をオススメすることでスポンサーとなる団体からフィーを頂こうと考えたのです。
そのために急遽公式HPと公式LINEを作り、学生には教材PDFのダウンロードを「YouTubeの概要欄→公式Webサイト→公式LINE」と遷移して行なってもらうように設計しました。
公式LINEで学生の情報を少しいただくことでセグメントわけした広告を打ったり、HPで塾を紹介したりといった施策を打ち、スポンサーに対し価値提供していました。

この仕組みによりいくつかのスポンサーについていただくことができ、ある意味マネタイズすることはできました。

### 何のためのサービスか
しかし、ここである問題にぶち当たります。スポンサーとなる団体とのやりとりが業務の大半となり、肝心要の学生へ向けたサービスが全然作れていないといった状況に陥ってしまったのです。

自分たちが本当にやりたかったことは何だろう？

無料で教育を提供するということが本質なのか？

いや違う！

本当にやりたかったことは、あらゆる学生に質の高い教育を提供すること。全国どこにいても良質な教育を享受でき、挑戦したいと思える人が挑戦できるようにすること。その科目の愛情を伝え、好きになってもらうこと。

学生からお金を取らないという行為によって、学生に向けたサービスを作るという行為から離れていく仕組みができていたことに気づきました。
学生に良質なコンテンツを提供し続けるためには、綺麗事だけでは絶対に成り立たない限界がありました。

(しかも満足度が高かったユーザーも高校を卒業するタイミングでほとんど離脱するので、新規ユーザーに向き合わず満足度が下がれば、結局ユーザーがどんどん離れて広告効果が無くなるといった思いもありました。)

### アプリ開発に踏み切る
そこでYouTubeというプラットフォームではなく、自分たちの教育プラットフォームを作り、そこでいくらか学生にお金をいただく中で活動を続けていこうと考えます。（この意思決定にはもっと紆余曲折がありましたが。。。）
また、アプリ開発に踏み切った理由はこれだけではなく、YouTubeというプラットフォームが学習に向かないだろうという確信もありました。
YouTubeには次のような特徴があるからです。

・授業中に広告が表示される。
・自分の好きな動画がオススメされる

このような環境は、学習にとって大きなノイズになります。
そういったノイズを排除し、学習のみにシンプルに向き合える。そんなプラットフォームを作りたいと思いました。

## 外注せずにインハウスで作った理由
プラットフォームをつくろうと意気込んだは良いものの、チーム内にエンジニアはゼロ。それだけでなく、プログラミング経験のある人物もゼロでした。
仲間からは外注しようという意見も出ましたが、僕は自分たちのサービスを外注して作ってもらうということに強い抵抗感がありました。
それは自分たちの思いに芯から納得し共感している人でないとより良いサービスは作れないという確信があったからです。
しかも開発費用はびっくりするほど高いし、保守・運用フェーズでも要求がある度に死ぬほどお金がかかります。お金だけではなく、コミュニケーションコストもかかります。
YouTubeチャンネルを運営するなかで、ユーザーの意見を聞いたりアナリティクスを見ながら様々なアップデートをしてきた経験があったので、アプリに関しても創って壊してという行為が絶対に必要になると思いました。
外注して、自分たちの視点だけで要件定義をしてそれなりのモノが出来たとしても、本当に学生にとってより良いサービスを追求することが後々難しくなると思ったのです。しかもエンジニア視点を持つ人がチーム内にゼロだと、外注した人に「それは無理だよ」と言われた場合に太刀打ちできない気がしました。
そして、頑張ればアプリ作れるんじゃね？という謎の自信と、外注はしないと言った責任感から仲間に「アプリ開発に挑戦させて欲しい」と訴え、猛勉強&開発をスタートさせます。

## よしやるぞ！ →  アレ？
まずは近くの書店に行き、アプリ開発と書いてある棚を物色しました。
そこで見つけた本に、「iOSアプリならSwift一択！」と書いてあり、「ほうほう・・・」と思いながらまずSwiftの本を買いました。
すごく易し目の本だったので、手を動かしながらなんとか2,3日で読み切り「なんか動くものができた」という達成感を得ました。
しかし、本を一冊読んだタイミングで「アレ、このまま突っ走っていいのか？俺何も知らないじゃん、アプリ開発のことも、プログラミングも。。。」と思い、ちゃんとした人に指針だけでも頂かなければ！と考えました。

## ガチのエンジニアに助けを求める
誰にお聞きしようか、知り合いにエンジニアの方もいないし・・・と悩んでいた僕は「自分の使っている大好きなアプリの製作者さんに連絡をとってみよう！」という発想に至ります。（今思うと大胆だな。。）
名前はお出しできませんが、200万人以上もユーザーのいるとても有名なアプリを開発しているエンジニアの方(Tさん)に長文のメールをして、自分たちが実現したいことやその経緯、そして少しでもお話を聞いていただくことはできないかということをお伝えしました。
すると2時間後くらいに、メールに載せていた私の電話番号に電話がかかって来て、「アツイ方ですね。もう少しお話を聞かせてください。」と連絡してくださいました！(突然何者かもわからない大学生から連絡が来たのに、良い人すぎる・・・)
お話をするなかで、私たちのサービスの理念や内容に共感していただくとともに、「君らのサービスならSwiftではなくFlutterが良いんじゃない？」とおっしゃっていただきました。
書店にFlutterの本はなかったので、全く選択肢にありませんでした。

Flutterを使うと良い理由として
・クロスプラットフォームなので、1人で開発するなら特にコストを下げられる。
・「ここみらいチャンネル」という既にユーザーの多くいるメディアがあるため、iOS,Android両方のアプリを近いタイミングで出せるようにした方が良い

といった点を挙げてくださいました。(ホントはもっと色々あったのかも・・・)
こうして、Swiftの勉強は切り上げ、Flutterを使ってアプリ開発をするための勉強に舵を切ることができました。(この出来事がなければAndroidアプリは出せていません・・・)
またTさんは「2週間に1回1時間、顧問という形で何でも相談に乗りますよ」と言っていただき、無償でアプリ開発をご支援してくださいました。
今でもこんなことがあって良いのかと思うくらい信じられないことだと思いますし、何があっても恩返しをしたい。そのために成長したい。そう強く強く思いました。
Tさんは「僕に恩返しするんじゃなくて、成長したらこれからの方に同じようにその力を還元してあげてください」とおっしゃっていてくださいましたが。。（カッコ良すぎて言葉になりません。絶対こういうカッコイイ大人になりたいと思います。）

# 「このコードは悲惨ですねぇ・・・」
さぁアプリを作るぞ！ということでFlutterの本を3冊くらい買ってきて、1週間ほどで手を動かしながら読み込み、UIだけは作れるようになりました。
ググりながら使えそうなWigetのコードをコピペして、ホットリロードでUIを作っていきました。
それだけで少し出来た感があり、「結構いけんじゃん！」と思った記憶があります。（そんなカンタンなわけねぇだろバカヤロウめ！）

そんななか訪れた、2週間に1度のTさんとのMTG。
僕のコードを見た第一声が

「このコードは悲惨ですねぇ」

でした。

「えっ！そうなの！？」

どこが悲惨かもわからない悲惨な男は、Tさんに
「すみません。どこが悲惨か、全て教えていただけますか・・・」と涙ながらに訴え、プログラミングの基礎となる考え方をインプットさせていただきました。
教えていただいた点として、例えばですが

・同じコードを何度も書かない
・変数名は機能に合ったものにする
　自分は変数名を適当にunkoとかにしていました。(死ぬほど恥ずかしい)
・クラス,インスタンスとは何か

といったことを教えていただきました。
自分が認識できていないたくさんの課題に気づかせていただき、このご指摘がなければ相当苦しかったと思います。

自分はなんにも知らないんだなぁということを痛感し、そこからアプリ開発に必要な事項を猛勉強しました。
さらにプログラミングそのものを全然知らないと思った私は、Dartの文法をちゃんと勉強するだけでなく、paizaやAtCoderをやったりもしました。

# アプリ開発と大学院生活の両立
Tさんの的確なアドバイスと指針をいただきながらアプリ開発を進めていき、何とか動くものを3ヶ月後くらいに作ることができました。
自分は一応理系の大学院生でもあるので、昼間は研究、夜中にアプリ開発といった日々をほぼ毎日過ごし、前に進んできました。
初心者で何も分からないうちはむやみに効率を求めるより向き合う時間も大事だと思っていたので、可能な限り毎日アプリ開発の時間を作りコードに向き合いました。
道中で何度も何度も何度もうまくいかないことがあり、挫けそうになりましたが、自分を信頼してくれているチームメンバーや無償で応援してくださっているTさん、そしてサービスを届けたい学生のことを思い出すことで前に進めました。
とは言いつつも、同じエラーで2日くらいつまづいたときは本当に泣きそうでしたが、最終的に聞ける方がいるということが自分にとって大きな心の支えとなりました。

# アプリへの密かなこだわり
アプリ「ココミラ」は僕らのサービスのコンセプトでもある「体型的なインプットを素早くやる」という思想を反映して、極力シンプルなつくりになっています。（複雑なものを作る技術がないという見方もあります）
「あったら良さそうな機能」はとりあえず排除して、最短で見たい講義に辿り着き、授業や教材を見てインプットできるという仕組みを追求しました。
またユーザーがどんな感情になるかを考え、極力わかりにくい表現を無くしたりしました。(まだまだ全然ダメですが)

# ユーザーからのリアルな意見
開発開始から4ヶ月後にアプリをリリースし、今では3,000人近くの方に使ってもらっています。
自分たちでは気づけないリアルな視点で意見をいただけるので、たくさんの気づきがあります。
また、たくさんの方に共通する意見に加え、１人のユーザーを深掘りしてお話を聞くなかで出てくる観点も大切にしています。
YouTubeチャンネルをつくる際に僕ら自信の痛みを深掘りすることでより良いサービスが実現出来たように、ユーザーの感情をきちんと理解してサービスを作っていきたいと思います。
また、定性的な観点だけでなく、定量的な観点も非常に重要なので「数値による答え合わせができる仕組み」を作らねば・・・と思っています。
建設的なご指摘をくださり、未熟なサービスでも応援してくださるユーザーの方がたくさんいるというのは本当に救いだなと思います。

# 山積みの課題
まだまだ山積みの課題がココミラにはあります。
そしてアプリをローンチして、本格的にマズいな・・・と思っている部分が2つあります。
それは

1.アプリ上で動画の読み込みが遅い
2.ランニングコストが高い

というものです。
Firebaseのcloud storageに動画を保存しているのですが、通信環境によって動画の読み込みにかなり時間がかかります。
また、400ギガ以上の動画を扱うサービスだからかFirebaseの月額のランニングコストがかなり高いです。。。
ユーザー数が増えたり、動画コンテンツが増えたりといった拡張をできるようにするためにも運用コストを下げられる方法があれば知りたいと思っています。
もし、どなたか知見のある方がいらっしゃればご連絡いただきたく思います・・・・・・

# おわりに
こんな長い文章を読んでいただき、本当にありがとうございます。
どなたかの励みになっていればとても嬉しいです。
また、ここまでお読みいただいた方は、私がどれほど無知かを悟ったことかと思います。
何かアプリ開発に関してアドバイスをいただける方がいらっしゃれば本当に本当にありがたいです。
また、この活動にご興味をお持ちいただいた方もぜひお話をさせていただきたいなと思っています。
自分自身、基本的に一人で開発をしてきたので様々なエンジニアの方とお話ししながら知見を溜めていきたいと思っていますし、共感していただく方には仲間になって欲しいとも思っています。

それでは、ありがとうございました。