以前podcastなどでも言ったが、最近友人知人を集めてAndroidアプリ開発を教えている。

最初は普段ダベってる友人が、今の仕事低賃金なのでAndroidのアプリ開発を覚えてプログラマになりたい、とか言ってきた。 年齢的には自分と近い年齢なのでそれなりに探す必要はあるだろうが、 まぁ探せばありそうだし、どのみちプログラムには興味あったのでやってみたい、との事。

普段カフェやファミレスでダベってるのをプログラム教えるのに変えるのは別にいいよ、と思ったので、やってみた。 で、共通の友人に「最近あいつにアプリ開発教えててさ〜」と言ったら「何それ、俺も習いたいんだけど?」とか言い出して、 別に二人でも三人でもあんま変わらんしいいぜ、と言って、これだとどこか市の施設とかでやる方がいいか、と探したら無料で使えてホワイトボードもある所があったので、 そこで教え始めた。

で、そんな話を親族にしてて、小学生の甥とか興味あったら教えてもいいよ、と言ったら、興味ある、との事で教える事になった。という事で現在3人くらいに教えている。

せっかくなので「あおぞらAndroid開発教室」と名前をつけてみた。サイトはこちら>karino2のあおぞらAndroid開発教室

それぞれ多少バックグラウンドに違いがあるが、全員まぁプログラム素人と言って差し支えない感じ。 英語は全く読めないし、gitどころかマークダウンとか何それ?って感じのITリテラシー。

でも別に1から全部教えれば前提知識なんてなくてもどうにかなるんじゃないか、とは思っていて、 1から全部教えている。

Androidはちょっと入門には難しい所もあるけれど、 スマホで動くってのはやりたい事が分かりやすいというメリットもあるし、 仕事を探すならそれなりに希少性もあるので悪くないかもしれない。

割と序盤の立ち上がりの所はそれなりにみんな達成出来たと思うので、ここらへんでブログの記事にしてみてもいいかもしれない、と思い書いている。

時間とか場所とか

毎週金曜、17時〜21時の4時間(ただし実際は3.5時間くらいで終わってる)。市のコミュニティースペースとかいう所で机とホワイトボードを借りてやってる。 完全ボランティア(たまに炭酸水奢らせたりはしている)。

使える入門文書が意外と無い

Androidの入門なんていくらでもあるだろう、と思って幾つか見てみたのだが、どうも使えるのが無い。

入門文書のくせして、どいつもこいつも登場するクラスが無駄に多い。 しかも言語がJavaか、またはkotlinの場合は不必要にいろんな言語機能を使う。 プログラム言語の知識が一切無い人が始めるのにはすごく向いてない。 Javaの基礎くらいわかっていればこれでもいいんだが…

理想としては最初の段階で必要最低限の言語機能を教えて、その言語機能だけである程度いろいろなAndroidのViewなどを解説し、 一定段階まで来たら追加で言語機能を教えて、その次にはその言語機能を使ってより難しかったり出番の少ない機能を教えていく感じで構成されているといいんだけど、 そういうプログラムを学びつつAndroidを学んでいく、という配慮がどれもあんまり無い。 最初の段階で要求するプログラム言語の知識が無駄に多い。

しかもとりあえずやってみよう系の入門は、「ここからここまでやればこの範囲のものが自由に作れるようになる」みたいなマイルストーンのようなものを感じず、 単にダラダラとどういう事を考えて選んだのか分からない題材が続く。

という事で、結局全部自分で作る事にした。以下に気をつけている事などを書いておく。

繰り返してなれる課題とプログラム言語の勉強が交互に続く構成

Androidのアプリ開発というかGUIアプリ開発の入門は、 とりあえずポトペタしてなんかハンドラ書いていろいろ動かす、を繰り返してある程度慣れて、 そのあとにその背後の理解をちょっとずつ広げていくのが良いと思っている。

そういう訳で序盤は同じアプリを延々と反復練習して覚えて、それをちょっと変える範囲で出来る事をいろいろやっていき、 ある程度やったら次はプログラムの知識をちょっと増やしてもうちょっと出来る事を増やして、 そのあとその範囲で出来る事をいろいろやる、という風に、反復練習とプログラム言語の勉強を交互にちょっとずつ増やす形式になっている。

分からない所は自分で手を止めて実験したりとかに期待せずに、指示通りにやれば十分に理解出来るように「これを反復するように」と指示するようにしている。 この辺は初めてプログラムを勉強する人はこういう事を学ぶ事自体に慣れていない事が多いので、勉強の仕方まで指示している感じだ。

そして反復練習は実際にそれをやった動画をyoutubeにアップして、何も分からなくてもただ真似を続ければなれる事が出来る、 という作りにしている。 これでプログラム初期の、 なんか分からない事が大量にぶわーっと出てきてしまってすぐ挫折してしまう、という問題を回避している。

ある程度慣れたあとにそれが何だったのか、という説明が来るので、 それを何に使うのか?みたいなのが分からないままいろいろ出てきてしまうという初期の問題を回避出来ていると思う。

また、プログラムの勉強をして少し経った時に、ふとなんだかすべてが分からなくなってしまった時も、 動画を真似して繰り返していればなんとなく思い出したり理解が深まったりして踏みとどまれるというのも狙っている。 これは数学的に何かを学ぶのが苦手な人でも、プログラムは触ってがちゃがちゃやってると結構マスター出来るという自分の周囲の観測結果も踏まえている。

説明なく新しい事が極力出ないように全部順番に並べる

何も知らない所から学ぶ事を前提としているので、説明無く新しい要素が出ないように気をつけている。 また、「詳しくはXXを見てください」は一切やっていない。 使うものはすべて解説している。

これは学習の初期では覚える事をなるべく限定して、けれどその範囲だけはしっかり覚えてほしいから。 ぼやっと広い知識に触れさせるのはもっとあとの段階になってからの方がいいだろう、と思っている。 また、学習の初期の段階で理解が難しそうなものに触れさせると、 こういうものに慣れてない人は「あー、全然分からん!やっぱり自分には無理なんだ!」というモードに入ってしまって理解を拒絶してしまう事があるので、 ある程度軌道に乗るまではそういう事は極力無いように考えて作っている。

自作のJS入門への参照はあってそちらをやる事は期待しているが、基本的にはその二つのサイトだけで全部揃うようになっている。 本当はJS入門と同じ内容をkotlinで説明し直す方がいいんだろうが、 さすがに変数とは何か、とか、コメントとは、とかを全部説明し直すのはかったるかった…

外部のサイトを調べないでも初期の必要な事が全部揃い、復習する時もサイトの該当セクションを見るだけで良いように気をつけている。

一度に出てくる新しい要素をなるべく減らすように気をつけている

例えばif文の時に==>=<=&&||を解説する、みたいな事はなるべくしないように、 まず使うものだけを説明するようにしている。

型も最初はIntとStringを中心にして、LongとかBooleanとかの話は出さないようにしたり、必ずその習得段階で使うものだけを説明するように心がけた。

これは初学者が突然いっぱい新しい知識を前にすると「あー、全然分からん!やっぱり自分には無理なんだ!」というモードに入って(ry

という事で最短経路ですべてを学習するなら非効率となるけれど、最初の段階である程度書けるまでをもっとも障害少なくたどり着けるように、 と工夫している。ある程度書ける所まで行ったら、そこからはちゃんと入門をすれば良い、という事で。

ただある程度いろいろ書けるようでないと自分で書いて理解を深めていく事が出来ないので、 いろいろと書いていくのに必要な最低限の組み合わせを良く考えて選んである。

途中の各マイルストーンを達成すると出来るようになる事を最大化するように努めている

各途中の段階で、「ここまでをマスターするとだいたいこの辺のアプリが作れるようになる」というような目標をかなり具体的に想定して、題材を選んでいる。 その結果として、例えばSQLiteが出てこないでファイル入出力とテキスト処理は出てくる。 こうした「普通のAndroid入門でやる事」が無い代わりに「普通のAndroid入門では出てこない事」でも必要なものは入れている。

最初8回くらいを耐えると「てきすとでっき」のようなアプリとか簡単なToDoアプリみたいなものは作れるようになる。 テキスト処理とUIを組み合わせて作れるアプリというのはデータベースべったりのCRUDよりもずっと自由度は高いし、 そうした処理はAndroid開発以外にも応用が効くので初期に学ぶ意義は高いと思っている。

これらを全部満たすものを作るのは、思ったより難しい

これらを全部満たすようなものが全然無いなぁ、という事で作ってみたのだが、作ってみると結構難しい。 最低限使うだろう、と思ったものが意外と初期の段階では使わなかったり、要らないと思っていたものが必要になったりがちょこちょこある。 自分が思っているよりも序盤の必要最低限の事は少ないなぁ、という発見があった。

またプログラムを一切やった事が無い人がプログラムを学ぶ場合には、 普通のプログラマが思わないような事の練習が必要だったり、解説が必要だったりもする。 例えば val s = str + "ほげ" を解説したあとに val s = "ほげ" + str が必要になっても全然分からなかったりする。 え、ダブルクオートのヤツ左に置く事も出来るの!?とか。

こうした反応は実際に教えてみないと分からないので、初心者向けの入門書を実際に教えないで書くとかは難しいもんなんだな、と思った。 だからある程度素人に教えている人が書いた入門教材じゃないと役に立たないな、と思うが、 プログラムの実務経験が十分にあってプログラム素人にプログラムを教えてて入門教材作っている人は、まぁ居ないよなぁ…という気もする。

Androidアプリ開発に関係無い技術界隈の雑談を適当に挟む

プログラム素人というのはプログラム関連の知識が全く無いので、 例えばHTMLとかも知らなかったりするし、Linuxが何なのかも知らなかったりするし、web開発とかが何なのかとかも知らない。AWSとかDockerとかgitとかも知らない。 RDBやSQLという言葉も知らないしTCP/IPやHTTPという単語も聞いた事も無い。

そういう訳で、Android開発とは関係ないようなそういう単語を雑にホワイトボードで説明したりしている。 年収がどのくらいだとか覚えるのがどのくらい大変だとかどのくらい将来性があるかとかもかなりいい加減な自分の判断で適当に説明している。

なんかそうした業界的な背景知識みたいなものがある程度無いと他の分野の人と会話が出来ないし、よそのチームと関わるような仕事が出来ない。 また自分がどっちの方向に進んだらいいかも良く分からないだろうから、 なんか疲れてきた時などに適当に30分くらい雑談している。

本当のプログラム素人にはこうした話は結構意味があるんじゃないかなぁ、と最近思い始めているが、どうなんだろう。

「Railsとはリクエストを受け取ってDBを読んでHTMLを返すプログラムです」とか「UNIXにはLinuxとBSDがあります」とか、怒られが発生するような雑さではあるが。

プログラム素人がプログラムを学べるというのは結構驚きらしい

こんな事をやっているよ、と分野外の友人知人に話すと「え?そんな何も知らない人がスマホのアプリとか作れるようになるものなの?」と驚かれたりする。

自分の感覚からすれば「そりゃ俺が全部最初から教えればよっぽど適性無い人以外は出来るだろう、普通俺みたいなのが全部最初から教える事なんて無いだろうけど」という感じなのだが、 それは全くの素人からすると驚きらしい。

でもやれるならやりたい、と思っている人は自分が思っているよりも結構多く、なんか一発当てて暇になった我らFIRE勢などは、 暇つぶしにもっと市民とかにプログラムとか教えてもいいのでは無いか、という気はした。

おっさんが何かを教える、みたいなの、だいたい独りよがりで誰も望んでない印象だが、スマホのアプリ開発はそうでも無さそう。 教えたい人はあんま居なさそうだが。