メモ2ブログ

メモtoウェブログ。旧ブログはこちら。 http://sakebook.blogspot.jp/

続続・Androidアプリ開発を学生に教えた話

今までと同じく、TRUNKから講師の依頼があったので講師をしてきました。

過去の話はこちらです

sakebook.hatenablog.com

sakebook.hatenablog.com

進め方

週一で、一回あたり2~3時間の全8回のコースで、全体を通すとおよそ2ヶ月のコースとなり、今までで最長のものでした。

周りと圧倒的に差をつけるスキルアップの1ヶ月 - TRUNK CAMP | TRUNK

「kotlinでアプリ開発をしてストアにアプリを公開する」というのが今回のゴールでした。

以前より回数があるので、各自でアプリを作る形にして進めていこうと考えました。具体的には、何かしらのWeb APIと連携してそれをリスト表示するものを考えていました。

じゃんけんアプリなども考えたのですが、皆が同じアプリを作ってストアに公開してもストアからしたらノイズになってしまうかなと考えて、別のアプリになるように前述のゴールにしました。

各週でやる内容は次のようにし、各週で課題を出すことで進めていこうと考えました。連絡にはFBグループを作成し、困ったりしたら個別にメッセージを送るのではなく、グループに投稿してもらうようにしました。
あなたが困ってることは他の誰かも困ってることかもしれないので、知識を共有する形にしたかったからです。

カリキュラム

  1. Kotlinの文法
    • 作りたいアプリを考えてくる
  2. 作りたいアプリの設計・Android Studioの使い方
  3. データクラスを作る・レイアウトを作成する
    • レイアウトを実現させる
  4. リスト表示する
    • リスト表示できるまで
  5. APIをつなぐ
    • APIからデータを受け取れるまで
  6. イベントを起こす・別画面を作る
    • データを繋いで別画面に遷移させる
  7. Intent連携・アナリティクスを入れる
    • シェア機能など実装したいものを各自実装
  8. 申請準備・ストアへ申請

Kotlinでアプリ開発ということで、Kotlinのことを初めに教えて、それからAndroidについて学んでいく構成で考えました。

しかし実際は次のようになりました。

  1. Kotlinの文法
    • 作りたいアプリを考えてくる
  2. 作りたいアプリの設計・Android Studioの使い方
  3. プログラミングの基礎
  4. レイアウト作成・イベント発生
    • アプリのレイアウトとイベント発生まで仕上げておく
  5. 別画面作成・Intent連携(1/2)
    • 自分のアプリに足りない機能を開発していく
  6. 別画面作成・Intent連携(2/2)
    • 自分のアプリに足りない機能を開発していく
  7. 申請準備
    • 自分のアプリに足りない機能を開発していく
  8. オフィスアワー

さらに、7名いた参加者が最終的には3名になりました。 どうしてこうなったのか一週ずつ振り返ります。

1週目

Kotlinについては、Kotlin入門までの助走読本Kotlinスタートブックなど、体系的にまとめてある物があるので改めて自分の方で資料を用意して教えるのはやや不毛な気がしましたが、資料を作成しました。
資料はKotlinの特徴を攫う内容にして、書籍などでちゃんと学んで貰おうと考えました。そのため、わからないことがあっても大丈夫という事を強調して進めました。

プログラミングに触ったことのある方は半数程度いました。オンラインのサービスで学んだ方が多かったです。

実際に手を動かさないと理解しにくいと思ったので、IntelliJを入れてもらい、Kotlinを書きながら進めました。

ここでいくつか問題がありました。

  • IntelliJがDLされていない
  • WindowsJavaの設定がされていない(DL & Path)
  • PCのスペックが足りなくてIntelliJを立ち上げると凄まじくもっさりする

IntelliJはそこそこ大きいので、事前にDLしておいてもらわないと待ち時間が発生します。Android Studioは皆DL済だったのですが、ここは事前共有できていなくて不手際でした。

待ち時間がもったいないのでJavaも設定出来ていなかった方たちには、try.kotlinで作業してもらうようにしました。

また、自分の資料が暗黙でプログラミング言語に触れたことがあること前提になってしまっていて、「Nullってなんですか?」と言われたときには、しまったー!!と思いました。

Kotlinについては先に詰め込もうと思って作った資料でしたが、ひとつずつ手を動かしていると、わからないことがあっても大丈夫とはいえ、あまりにも頭に入っていない感じが見受けられたのと、時間が迫っていたので、資料中、高階関数以降を割愛しました。

あまりに手応えが得られなかったので、終了後にTRUNKの方と相談し、コースを2つに分けることにしました。

  • 何かしらのWeb APIと連携してそれをリスト表示するアプリ(Web APIアプリ)
  • 写真加工アプリ

写真加工アプリは、以前教えたことのある内容なので比較して簡単なのはわかっていました。

Web APIアプリを継続する方は7人中2人で、一人は当日欠席していた方でした。
残り5人のうち、一人は難易度の関係でコースを辞退しました。

資料はこちらです。

docs.google.com

2周目

Android Studioの使い方を学ぶ週でした。

参加者は残り6名のうち、4名でした。来ない方の中には連絡が無い方もいました。

第1週のなかで紹介したKotlin助走読本を読んできたという方がいて、意欲的だこれはモチベーションが高いな!と感じました。
しかし、意図的にエラーを起こしてもらう箇所で、次週はプログラミングについて説明しないとヤバイと理解しました。

docs.google.com

3週目

当日に3名辞退の連絡がありました。インターンやゼミの都合で時間が合わなくなったり、難易度が理由でした。

自分の教える順序や内容の問題もあったのですが、この週でプログラミングの基礎的な部分を補おうとしていたので、精神的にきつかったです。

残り3名になり、Web APIを利用するコースの方はいなくなり、全員写真加工アプリコースとなりました。
それなのに、写真加工に使用していたAdobe Creative SDKがサポート終了となり、メンテされなくなることが2週目の講義の翌日に発表され、散々でした。

また、Windowsユーザで前週と違うユーザアカウントでログインしていて、権限やpath周りの問題があるなど想定外なハマりどころがありました。

docs.google.com

4週目

Web APIを利用するコースの参加者がいなくなったので、以前講義をした写真加工アプリの資料を変更する形で対応しました。
以前の学びから、必要になったときに必要なことを教えるようにスライドを作り直しました。

内容はレイアウト作成・イベントハンドリングでした。

GitHub上にコードを置いて連携させることを2週目から課題としていたのですが、4週目になっても出来ていない方がいました。
Android Studioを利用すればできるようだったので、こちらでGUIをキャプチャしてサポートしてあげられれば良かったなと思いました。
一方、それによって参加者同士で教え合う部分ができたのは良かったです。

docs.google.com

5週目

Intent連携周りを教えました。

キリが良いところまでやろうとしたのですが詰め込みすぎました。実際は6週目の内容を含んでいたのですが、時間が遅くなってしまったので分けました。

また、先週の課題が終わってる前提の話だったので終わってない方の対応で30分くらい時間を使いました。
その間、終わってる方には並行して手を動かしてもらうとはいえ、待ってもらうことになったので良くなかったです。

やんわりと

「人を待たせることになるのでちゃんと課題としたことはやってきてほしいしわからなかったら質問してほしい」

という旨を伝えました。が、後の週で伝わってなかったことが自分に伝わりました。

複数人に対して教えるときは、理解が早い方に合わせるのか、理解が遅い方に合わせるのかどっちがいいんでしょうか?
今回の講義では、全編遅い方に合わせて進めました。

docs.google.com

6週目

引き続きIntent連携周りを学ぶ週でした。

写真加工アプリを作ることになって、参加者に改めてどんなアプリにするか(どこにどのボタンを置いて機能を呼び出すか + α)を確認したところ、SDKをカスタムする必要のある機能を考えた方がいました。
それは出来ないから改めて考えてきてほしいとしていたのですが、改めて作るものをきちんと共有してもらえていなかったです。

この週で撮影機能を実装したのですが、その機能は入れないという方がいて、その方は他の方に教えている間は自習という形になりました。また、途中でその方から質問があったときに、作りたいアプリが見えていなくて、困る場面がありました。
実装方法だったり、やりたいことの実現方法は無数にあるので、何を作るのか?というのはきちんと把握していないとやりにくいです。

今回のアプリはAPI Levelを21からにしていたのですが、実機を持ってる方が4.3だったので、使えないという事がありました。その方はPCのスペックも足りておらず、エミュレータを使うのは現実的ではなかったため、アプリのAPI Levelを下げることで対応していました。

しかし、カメラでファイルを扱うので、その端末特有の問題が発生してしまいました。
実機があるから使いたいとはいえ、Androidの辛い部分に触れてしまう可能性が高まるので、事前に制限を共有することで今回のような事態はなるべく回避したいなと思いました。

SDKの利用登録部分で思ったより時間がかかってしまいました。Applicationクラスの作成や、Privateな情報の扱いなどもしたので、ちょっとやりすぎだったかなと思いました。
開発の間は、こちらで用意したPrivateキーを使うなどすれば簡単にできたのかなと思いました。

また、Windowsだけでハマる箇所やMultiDexの問題が見つかったりして時間がかかりました。

docs.google.com

7週目

ストアに申請するためのアカウント作成やAPKの作成などの話をしました。

初めに、各自の詰まってる部分を共有してもらって、一人づつ画面に写しながらこれから何をしたらしたら良いのかを説明しました。
他の方の説明中に我関せずと小説を読む人(スライド待ち)もいれば指摘された部分を修正する方もいて、それぞれだなと思いました。

docs.google.com

8週目

当初の予定と変わったのでオフィスアワーという時間の使い方をしました。

前回から何も変わっていなくて、何も取り組んでない方がいました。どうして何もしていなかったのかと聞くと、優先度が低かったからと言われて悲しくなりました。
しかしそんな学生も、写真加工ができると急にやる気が出てきたようで自分でこういうのをしたい!と取り組んでいました。正直初めからそれくらいのやる気で取り組んで、ググったりしてくれれば「わからない場所がわからない」という状態にはならなかったんじゃないかなと思い、残念でした。

結局写真加工アプリにしても、作りきって公開できる方はいませんでした。

反省

自分にとって一番反省したい点が

皆が同じアプリを作ってストアに公開してもストアからしたらノイズになってしまう

と考えてしまったところです。 初めてアプリ開発をする人にとっては、ストアにどんなアプリがアプリがあるかどうかということは関係なくて、自分がアプリを作ってストアに上げるという体験が大事です。同じアプリがどうとかより、自分が作ったものが皆が触れる所に上がるという喜びと興奮に気づくべきでした。

昔の自分もそうだったのに、初心を忘れていました。
目線がずれてしまったことが、今回のような結果になってしまった一番の原因だと思っています。

これで学生にアプリを教えたのは3回目だったのですが、わかったことがあります。

自分は、教えられる側のモチベーションを上げるのが苦手みたいです。熱意を持って取り組んでくれる前提で考えているようです。
また、熱意を持って取り組んでいてくれても、そもそも課題が難しくて最後までできていなかったです。

Facebookグループで質問して良いとしていたのですが、思ったより質問はされなかったです。グループで聞かずにteratailで質問してるのを見つけてしまったときは悲しかった。。(teratailだから悲しいという意味ではないです)
そもそもFacebookをそんな見ないようなので、今ならSlackとかDiscordでTeamを作成してしまうのが良い気がしました。作ったら見るということが保証されているわけではないですが。。FacebookよりSlackのほうが、時系列に表示されて、使っている人もちらほらいるのでマシかなと。

何度も教える機会があるならば、自分なりのAndroidのスタートブックを作成するか、教材を決めてしまってそれに即して教えていく形がいいかなと思いました。

まとめ

次の点が至らなかったので同じような機会がある方は参考にしてください。

Keep

  • 臨機応変にコースの内容を変更できた。
  • GitHubでの添削は、なんで動いていないのかが同じコードで確認できるので分かりやすかった。
  • 講義の開始時に詰まっているところを共有してもらいながら皆で同じ画面を見て修正するのは良かった。

Problem & Try

  • つまらなそうなアプリでも初めて作ったアプリなら嬉しい。
    • つまらないとか決めつけない。
  • プログラミング未経験の方がいる場合は言語に触れたことある前提で話さない。
    • 参加者がプログラミング経験あるかどうかを事前に把握しておく。
    • 参加者を経験者に絞るという方法も。
  • 一定以上のPCのスペックが無いと現実的ではない。
    • 3GB以上とあるが推奨通り8GBは欲しい。。
  • IntelliJなど事前準備があるのに当日の連絡にしない。
    • 募集ページに事前準備を記載する。
    • 参加者と事前にやり取りできる場を用意する。
    • 事前準備を記載できない場合はギリギリまで参加者の募集を行わない。
  • Facebookグループは見る習慣や表示順序の関係でやり取りには適さない。
    • 学生はFacebookを見ない。
    • SlackやDiscordにすると良いかも?
      • 既読が無いのでリアクション必須。
  • 課題はしてこない。
    • 課題を複数回持ち越させないために、終わっていない課題を一緒に終わらせる時間を講義後に設ける。
    • 前日になって焦ってやったり、忘れているのでリマインドを送る。
    • 中間締め切りを用意して確認するのも良いかも。
  • 作るアプリの機能と画面を定義しておく。
    • 箇条書きとメモ書きでもいい。
    • 途中で変えた場合共有してもらう。
    • 全員で全く同じアプリを作る場合は講師側でまとめておけば大丈夫。
  • クレデンシャル情報は扱わない。
    • 扱う場合は講師側で紛失しても対応できるものを用意して利用してもらう。
  • 理解の早い遅いどちらに合わせるか方針を決めていなかった。
    • やる気のない人を切ってしまってよいか確認する。
  • 質問しにくい雰囲気を作ってしまっていたのかもしれない。
    • 丁寧語で接してたが、もっと距離を縮めることが必要だったのかも。

3回やってこんな感じですが、めげずに参加した人の満足度を高めていきたいです。

参考

TRUNK - インターンとトレーニングでビジネススキルをつけよう。 / TRUNK

Try Kotlin / Kotlin

Important Update to the Creative SDK – End of Support for the Image Editor UI, Color UI, Market Browser, and Labs Components / Adobe Creative SDK

思考するエンジニアのためのQAプラットフォーム / teratail【テラテイル】