ピヨピヨエンジニアをビシバシ鍛えた話

#前置き
去年から合わせて3回、計3名のピヨピヨエンジニアにいろいろ教える機会があり、今後もその機会がありそうなので、今年の振り返りついでに&今後参考にするためにここでまとめておく。

前提として、ピヨピヨ側はプログラムの基本的な事(変数の概念・条件分岐・繰り返しなど)は理解している状態。
なので文系の新卒に教える感じよりは、情報系や専門の新卒だったり、エンジニアの第二新卒に教える感じ。

目標は、何か起きたときにどこらへんから調べてみてどういうものを調べればいいのか検討がつくようになること。


#教えるときに心がけている事
これは今回のケースだけに当てはまるものではないかもしれないけど
###先に大きな事から説明する
基本的に世界(ゴール)のおおざっぱな概要を伝えて、徐々にその仕組を掘り下げていく。
(Webの仕組みを教えるときに、いきなりwebサーバとかsqlの話を始めても、まず伝わらない。)

大抵の事にも言えるのだが、教える側と教えられる側の違いは、知ってるか知らないかの差で、能力の差があるというわけではない(と思っている)。
説明の内容が完璧であるとは限らないので、先に説明する内容の用途・目的を頭に入れておいてもらう事で、聞き手に必要な部分を要領良く理解してもらいやすくなる。


###絵を描く
言葉とか文字だけで全部覚えられたら苦労しない。
必ず視覚的な補助を入れる。
「★★★は◯◯◯という名前で△△△が有名」みたいに言葉だけで言われるよりは、地図を見ながら言われた方が覚えやすいのと一緒。

後は、同じ概念のものを毎回同じ絵・同じ構成で描く必要はない。
伝えるべき概念が同じなら、表現の差はその概念が持つ別の姿だったり、説明しきれていない部分だったりする。
聞き手はその差分を見て、足りていない理解を補えたりする気づきになる。

###理解してほしい事を、説明後に「理解していれば回答出来る、別の質問」をする
当然ながら話し手のロジックと受け手のロジックがある。
コミュニケーションのとり方も人それぞれ。
結果として、分からない部分は全て質問してもらえる、とは思わない。

要は、理解してほしい事があって、話し手はそれが相手に伝わっていればいいわけで、そこの確認が出来ればいい。 

たまたまアウトプットが正解しただけでロジックがぐちゃぐちゃ、後日確認してみたら結局理解出来てませんでしたという事は往々にしてあり得る。
そこはたまたまなアウトプットでOKになってしまったテストケースの問題。

###基本的に相手が理解出来ていないのは自分が悪い(自戒)
なぜ相手が理解出来ないんだろうと思ったら、大抵上に書いたような事を自分が出来ていない。
自分がしゃべりたい事だけしゃべる、ただのエゴをしてる。
このプログラムどこもおかしくないのに挙動がおかしい！！！言語のバグやああぁぁああ！！！っていうのが、大抵はただのしょーもない自分のバグ、というのと似てる。

#だいたいこれを詰め込めばなんとかなるだろう的な事
まずは適当に詰め込む。
その後で手を動かし、詰まったときは「これはあのとき説明した◯◯◯の理論で…」みたいに進める。
上で書いた地図の話の感覚に近いかもしれない。
心のハードル的にも、「全く新しい概念」ではなく、「既に一度聞いた事がある・かじった事がある」という事が重要。

詰め込む内容はだいたい毎回同じで、
**サーバに置いている静的なファイルがブラウザに表示されるまでの流れ**
・サーバの動きはリクエストを受け取ってレスポンスを返すという事
・サーバにアクセスするにはipアドレスが必要である事
・実際にはipアドレスではなくドメイン名でアクセスしている事
・サーバではデーモンさんが常時リクエストを待ち構えているという事

###サーバの動きはリクエストを受け取ってレスポンスを返すという事
クライアントとサーバってなんだ？と私は悩んだ事があるので、毎回「クライアントとサーバとは、単なる役割の事」と言っている。
どの端末でもサーバになりえるしクライアントになりえる。
yah◯◯をブラウザに表示させるためには、
1.表示内容の記載されたファイルをサーバに要求(リクエスト)
2.リクエストを受け取ったサーバはそのファイルの内容を返信(レスポンス)
3.レスポンスを受け取ったクライアントはその内容をブラウザに表示する
という流れになるとざっくり絵を描いて説明。

###サーバにアクセスするにはipアドレスが必要である事
どの端末も住所を持っていて、その住所を元に通信しているという事を説明。
ここの詳しい部分はネットワークの仕組みの話になってくるので、グローバルIPとプライベートIPという2種類があるよって事だけ押さえておく。

###実際にはipアドレスではなくドメイン名でアクセスしている事
ブラウザに
123.123.123.123
みたいな数字じゃなくて、
yyyy.com
みたいな文字を打ち込んでるよね、的な事の説明。
ドメインやサブドメイン、DNSサーバの話、ついでにプロトコルのhttp://が省略されてたり、ポートの:80が省略されてたりなんかする事を説明。
後々証明書入れたりとか、8080でアクセスする環境のものが出てきたときに役立つ。
プロトコルは掘り下げると戻ってこれなくなるので、通信するときのお作法みたいなもの程度の説明に留める。

後はドキュメントルートとディレクトリインデックス。
URLを見て、サーバ側にあるどのファイルを読み込んでいる・実行しているのかを意識するようにする。

###サーバではデーモンさんが常時リクエストを待ち構えているという事
httpdとかsshdとかcrondとかmysqldとかとか。
これらDの一族はデーモンさんといって常時待機してる人達なのだよという説明。
とりあえずWebサーバにせよDBサーバにせよ、何かしら通信して反応あるのはこいつらがそもそも動いている = インフラ構築するときにはこいつら意識しておかないといけないと覚えておいてもらう。

#だいたいこれを実技すればなんとかなるだろう的な事
詰め込んだ後は、実際にいろいろ手を動かしてみる。
やってもらう内容もだいたい毎回一緒で
**サーバ立てて環境構築してサーバサイド処理&DB操作した結果を返すWebサービスの作成。
AWSを利用する機会が多く、だいたいEC2インスタンス(Amazon Linux)でLAMP環境を構築する。**
・Linuxに入って操作する流れ
・EC2とVPCの設定
・yumとnpmで大抵のものはインストール出来る事
・apacheをインストールしてindex.htmlを表示
・phpをインストールしてサーバサイドで処理が行われる事の体験
・sqlの説明とmysqlをインストールしてmysqlクライアントからsqlの練習
・phpからmysqlのデータを取ってきて表示させる

暗中模索でやってて、これがどう影響してるのかといういうのが分からないとつらいので、いったんはここを変更するとこういう原理でこうなる！
という、確固たる地盤を作る。

詰め込んだ内容の原理できちんと動いているんだよというおさらいも兼ねる。
最初のうちは何が正解か分からずに、間違った理解をしたり疑心暗鬼になりがちなので結構大事。

###Linuxに入って操作する流れ
基本的に端末はMacなのでMacのターミナルで練習。
lsとかcdとか。
cpとかmvとか。
grepとかfindとか。
ユーザとか権限とか。
vi(vim)の操作とか。
Linux内で生きていくのに必要最低限の操作を教える。

###EC2とVPCの設定
仮想マシンとプライベートネットワークとはなんぞや。
EC2とVPCはセットで使う事が多いので、それらを使う前に軽く説明。
EC2とVPCを実際に設定しながら、ここはこういう設定でこういう意味で…みたいな。
ルートテーブル、サブネット、セキュリティグループ、etc…
結構時間かかる…
設定出来たらsshでイン！

###yumとrpmで大抵のものはインストール出来る事
ミドルウェアのインストールにあたり、とりあえず説明。
とは言っても、yumは/etcの下でrpmは/usrの下にインストールされるよくらい。
ついでにコマンドが使えるようになったり、whichでここにパスが通ってるよ確認したり。

###apacheをインストールしてindex.htmlを表示
ドキュメントルートとかディレクトリインデックスを確認して、パブリックIPから所定の位置に配置したindex.htmlの表示を確認。
apache止めてみたりとか。
権限変えてみたりとか。
ファイル名変えてみたりとか。

###phpをインストールしてサーバサイドで処理が行われる事の体験
phpinfoとかvar_dump、echo、exitなどなど。
後々サイト構築時にデバッグするときに役立つ知識などを詰め込み。
そして表示の確認。
テンプレートエンジンなんて贅沢なものは使わず、phpの出力結果をレスポンスとして返しているだけ、という基本概念を叩き込む。

連想配列でデータの取扱とか、forで一覧の組み立て方とかとか。
mysqlでデータ引っ張って表示するときの下準備までする。

###sqlの説明とmysqlをインストールしてmysqlクライアントからsqlの練習
ちょっと今までのを置いといてSQLの説明。
ID・名前・HP・攻撃力・防御力を持ってるモンスターのテーブル作って、insertで新モンスター追加したりselectで情報引っ張ってきたりの練習。

###phpからmysqlのデータを取ってきて表示させる
上で実行したようなselectをphpから実行させてみる。
用意していた連想配列に取得結果をつっこんで、一覧に表示出来れば完成。

#これで基礎の基礎は大丈夫(多分)
だいたい上のコースで2週間くらいな気がする。
正直この2週間で、目標にしているような、問題の箇所を特定したりなどのスキルはまだ身につかない。
が、大抵の事は、実技でやった事の拡張版だったり延長線の話なので、後は現場で。
小さな案件を、私がサポートしながらやってもらう感じ。

結構急いで書いたので、もしかしたらいろいろ抜けてるかもしれない。
次教える事があったら見返してブラッシュアップしていく。(つもり)