メモ2ブログ

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

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

縁あって、学生に様々なスキルを教えるサービスで、Android開発の講義を開きました。その際流れと知見、及び思ったことをまとめます。

経緯

前職の同期が、起業して件のサービス(Trunk)を始めた。エンジニアとしてのスキルなども知っていたため、Androidアプリ開発の講義を開いてくれないか?と持ちかけられた。休日も会うような仲だったため、不信感などはなかった。

社会人になる際にプログラミングの勉強を始めて、現在社会人4年目だが、そのようにまとめて教えるという機会はなかったので、自身のスキルの確認も兼ねて引き受けてみることにした。 現在働いている会社にも自分から説明し、社名の表示や開催場所として弊社で行えることとなった。

準備

その同期と相談し、全5回で、一度の講義は2時間としました。週一で、一月で終わるくらいがちょうどいいかなと。

しかし、いざ教えようとなって、自分自身もまとまった形で教えてもらうことがなかったので、mixiAndroidTrainingを参考に資料の草案を作りました。

自分自身が勉強していく中で覚えて嬉しかったことやワクワクしたことをちりばめて、学生のモチベーションを保つような構成を第一に心がけました。

講義のターゲット(参加条件)は

  • 学校でプログラムの授業を受けた人または独学でプログラムを勉強して少しわかる方

講義のゴールは

としました。

社内の会議室の問題や、一度にハンズオンで教えられる限界があるだろうということで、4名までの募集としました。しかし、実際応募は3名までしか集まりませんでした。ちょっと切なかった。

前日にFacebookのMessengerでグループが同期によって作成され、そこで調整を行いました。初回の日時は決まっていたが、残りの日程は応相談という形にしました。その方がフレキシブルに調整ができて良いと思ったので。

全5回としていたが、事前準備として第0回を設けていました。これは、受講者各自に事前に取り組んでもらおうとして設けました。 第0回の内容は

  • 環境構築
  • git clone
  • 作りたいニュースアプリを考える

というもので、事前に開発環境を整え、このリポジトリを共有できる形にして、課題を各自考えておくというものです。

Messengerで質問を受け付けていたので、質問が上がった分に関しては、答える形で対応できました。

開催

第1回

  • 2015/7/30 19:30~

www.slideshare.net

狙い

  • Android Studioでプロジェクトを作成した時にいろいろファイルが生成されるが、どれが自分で編集するもので、どれが編集しなくても良いものか。それぞれの役割を知る。
  • 開発環境を使いこなし、ボイラープレートの手入力を避ける。
  • デバッグ方法を知ることで、問題箇所の特定をできるようにする。

実際

「実践Androidアプリ開発」ということで、Gradleでのビルドも説明したのですが、はじめに説明する必要はなかったのかなと思いました。

gradleというフォルダを管理することで、環境によらずビルドできるようにするということを伝えようとしたのですが、その部分も、他のプロジェクトや他のジャンルの開発を経験してみないとしっくりこないところなのかもしれません。

全てを一から教えるというよりは、プログラムと対話できるようにすることで、自分一人でもいじれるようにさせたいと思い、はじめにデバッグを行ったのですが、意図をうまく伝え切れなかったです。そう思った理由は、受講者が一字一句写経していたからです。ここはもっと意図を伝えられるように演習を多めにとるべきでした。

AndroidSDK周りでも、テーマの設定は、「こういうものなんだ」と触れないでおけば良かったかもしれません。「どうしてActoionBarがあるんだろう?ないアプリもあるけど、どうやって制御しているんだろう?xmlに書いていないのに。」という疑問がでてくるかなと思い触れました。

Android Studio以外にも、Genymotionとgitを使ったので、その辺りの環境構築も必要なところは失念してました。そのため、全体的に時間が押してしまい、2時間の予定が3時間近くかかってしまいました。最後のgitの部分はハンズオン形式ではできませんでした。

思っていた以上にプログラミング経験の浅い方が来たので、少しギャップを感じました。そこを埋めるために、入門書を紹介したのですが、やる気のある方で、次回には購入していました。

第2回

  • 2015/8/6 19:30~

www.slideshare.net

狙い

  • スケジュール感を持った開発を覚える。
  • イベントハンドリングで、上から順に実行されるプログラミングに介入できることを覚える。
  • イベントを正しく制御できるようにする。
  • ライブラリを使えるようになることで世界が広がる。
  • 通信でデータを取得することで世界が広がる。

実際

先週の講義の復習も兼ねて、レイアウトの演習ができたのは良かったです。 レイアウトは、実現方法が1つというわけではないので、参加者で実現方法が異なったりした点も面白さと理解が深められたと感じました。

作りたいアプリレビューでは、難しい問題がありました。 実際に作るのは自分自身なのに、自分では(限られた時間では)できるかわからないことを作りたいというものです。

「このデータはどこから持ってくるのか?」
「データがないときはどうなるのか?」
「リストの構成要素はなんなのか?」
「この部分を押したら何が起きるのか?」
「この画面へはどうやって到達するのか?」

ディレクターとして案を出す分には良いのですが、今回は自分自身がエンジニアとしての立ち位置で振舞うので、自分自身が理解できていないものを作れるはずがありません。 しかしながら自分の知識の枠に留めるだけではできることに制約ができてしまうので、エンジニアはその部分の塩梅が難しいという話をしました。

イベントハンドリングのため、Acitvityのライフサイクルを説明したのですが、Activityの追加は、第2回では扱わなかったので、合わせたタイミングで話したほうが良かったかなと思いました。

ボタン押下時のイベントの、実装とハンドリングでは、インタフェースという概念の説明を敢えてしなかったのですが、しておくことで、後の話も理解しやすかったのかもしれないと思いました。 ボタンの状態のところは、いくらか実践的で、ハンズオンで効果を確認しながらできたので、楽しくできました。

ライブラリの導入部分では、ライセンス周りの説明が抜けていました。リリースまでに必要な部分として説明する予定でしたが、関連する事柄なので、同じ場所で話しておくべきでした。

ボタンのイベントハンドリングと、Retrofitでのデータ取得も、どちらも無名クラスの書き方だと同じなので、順序立てて理解しやすい形で説明できたかなと思っています。

前回同様、1時間押しとなってしまいました。僕のほうがスケジュール感を持ててないですね。しかし、通信を行い、データを取得するというところまでは今回に収めたかったので、押しながらも行いました。外部のデータを取得できるようになれば、各自でAPIを探して、自分が持っていないデータを扱えるようになります。そこでワクワクすると思い、入れました。


第3回

  • 2015/8/21 19:30~

www.slideshare.net

狙い

  • カスタムListViewの表示。

実際

標準のListViewを経験し、高速化を行わないListViewを経験し、高速化を行ったListViewを実装するという流れでした。 ViewHolderを使うことでそこまでかわるのか?という疑問に対して、実際に数値で見せることができればよかったのですが、そこまで準備できませんでした。

APIを探し切れていなかったり、前回説明したRetrofitの使い方だと不十分で実装できないAPIがあったりして、ダミーのデータを使うことになりました。 データの取得が完璧でないのに、次々と進んで行ったのは、並行して理解しなければならない項目が増えて、もしかしたらあまり良くなかったのでは?とも思います。

時間を押すことなく終了したのですが、余裕があれば、画像取得はPicassoで行う前に、自前で非同期で画像を取得の部分を実装したかったです。 今回までの講義の進み具合を鑑みて、非同期処理の講義は割愛しました。

講義後に、ListViewの部分について復習したいとの声が上がったので、もっと時間をかけて説明するか、別のアプローチが必要だったのかもしれません。


第4回

  • 2015/9/18 19:30~

www.slideshare.net

狙い

  • 新しい画面の追加方法を覚える。
  • Intentによる他のアプリとの連携を覚える。
  • WebViewで記事を表示させるだけでなく、URLごとの制御か可能ということを知る。
  • アプリ選択画面を表示させないスマートな起動方法を知る。

実際

都度、次回の講義の日程の調整を行った結果、一月近く間隔をおいての講義になりました。しかも、参加者全員参加の調整ができなかったのが非常に心残りです。 講義のスケジュールはあらかじめ決めておき、予備日を設けるほうがいいのかと思いました。複数回に渡る講義は、不参加のリスクも孕んでいるので難しいです。

通信周りの復習がしたいという声があったので、行いました。使うAPIが決まったので、そちらで組み込んでたのですが、僕が詰まってしまって、次回持ち越しとさせてもらいました。この辺りは、勉強が不十分で参加者にご迷惑をおかけしました。

Activityの追加を、第4回にしてようやく行いました。画面一つのほうが、覚えることが少なくて集中できると考え、このタイミングでのActivityの追加となりました。第2回の振り返りにもあるのですが、もっと早いほうが楽しみを与えられたのかなとも思いました。

Intentが、Componentを指定したやりとりという説明をした上で、Activity、その他のアプリ、URLスキームからの起動と、Intentを用いるものをまとめて説明できた流れは良いと思っています。

Retrofitによるデータの取得がうまくいっていないので、WebViewの部分やそれ以降の部分も、ハンズオンではなくデモを見せる形となったので、説明が多い回となりました。 リスクヘッジとして、サンプルコードを用意しておくべきだったと思いました。 説明が多かったため、振り返った時に「この量は詰め込みすぎたな」と感じました。

URLスキームで起動することで、特定のパラメータを渡せる話をしたので、GooglePlayからの起動やAppIndexの話になり、スライド以外の部分の話になったのもあり、今回も1時間以上超えました。


第5回

  • 2015/10/7 19:30~

www.slideshare.net

狙い

  • アプリリリースにおいて、機能面以外の部分でやらなければいけないことを知る。

実際

前回詰まってしまった通信周りの復習をはじめに行いました。GoogleWebSearchApiでやりたいことをやるには、Serializerが必要で、理解しないといけない箇所が多かったです。利用するAPIを予め決めておき、教えたいことややりたいことに注力できるようにしても良かったのかなと思いました。

効果測定ではGoogleAnalyticsを使いました。Google Developer Consoleの流れで設定を行い、Gradle Pluginを用いる方法でした。この方法で行うのならば、もう少しPluginについて説明があっても良かったかもしれません。 Genymotionで開発をしてもらっていたのですが、GAのリアルタイムにうまく反映されず、実機で行うとうまく場面がありました。GenymotionにはGooglePlayやGoogle開発者サービスもが入っていないからかもしれません。Nexusなどの実機があると、問題の切り分けに使えるので、何かしら実機があると講義において便利だと思いました。

GoogleAnalytics、Log出力抑制まわりは、ハンズオンで確認しながら進めたので、良かったと思います。 難読化の部分は、デコンパイルして実演できなかったので、あまり効果や意味合いを感じられなかったかなと思います。しかしリリースまでに、やらなければいけないことが、アプリの機能面以外でいろいろあるんだなというところは教えられたのかなと思いました。

講義のゴールをGooglePlayに公開と考えていたのですが、課題の進捗の関係で、全5回で目標までできませんでした。アプリのアイコンまわりや、アカウント作成なども触れることができなかったので、後1回分は必要でした。

振り返って

時間を超えた回がほとんどでした。思い直すと、2時間だからこれくらいにしよう、というより、教えたい内容から分割していって考えてました。収まるはずがありません。

資料の準備に追われたりして大変でした。しかし教えることで知識の整理にもなり、いい経験となりました。 至らない点が多くあり、また機会があれば、今回の反省を活かしてもっとうまく正しく教えたいと思います。

講義に使ったリポジトリは次のものです。何か同じ立場の人や、これから勉強を始めようと思っている人の参考になれば。

github.com

参考

すべてのトレーニングを無料で、すべての学生に。 / Trunk

mixi-inc/AndroidTraining / GitHub