渡るネットは嘘ばかり

元文系、米国大学院CS修士号持ちITエンジニア。自称エンジニアが撒き散らすゴミを少しでもキレイにしたい

DIVE INTO CODEのレビュー(2017年度版)

[2018/07/21追記] 2018年版書きました。カリキュラムだいぶ変わってるので、こちらをご覧ください。

masa-lab.hateblo.jp

旧カリキュラムからの改善という意味で、ポスト自体は残しておきます。

 

[2018/07/07追記]古いカリキュラムのものなので近日中に新しいレビューをします
観点としては教室参加者でなく、人事や現場エンジニアの立場として、卒業生をどう評価するか、です。教室自体の使い勝手や学び易さは他を見て下さい。あくまで、現場エンジニアとして人事に参加した場合にどう見るか、であり、教室自体に通った際の善し悪しではありません。応募者がいた場合、現場エンジニアはどう評価するかが中心です。

道に迷う独学の歩き方

コンピュターサイエンス(CS)概論的な授業でプログラミングを書き始める前からはじめの一歩辺りの部分をカバーしてるクラスでは、基礎中の基礎の問題解決の正しい手法をまず教えます。それが正統なCSの教え方です。エンジニアリングのプロジェクトの基本中の基本はPDCAなわけで、とりあえず、書き始めて手を動かせというのは、地図を手に入れたらまず歩き出せ。歩いてれば目的地に着く、と言ってるようなもの。そんなのエンジニアリングじゃないです。ちゃんと、最適な道順を確認してから動き出して、途中、工事で通れない道があったりしたら、道順を修正してまた歩き出す。それがエンジニアのプログラミングの歩き方です。

www.projectengineer.net

やっぱり、文系の独学の仕方を教えてしまうのか

で、上記の手を動かせの話はDIVE INTO CODEの野呂CEOが語ってることです。ここね、受講者のブログ見て、短期間のプログラミング教室の中でまともかも、って思ったんですが、ちゃんと見てみたら…。
※リンク死にました

programming-study.com

学ぶポイントは3つあります。
1つ目は、とにかく手を動かすことです。「習うより慣れろ」ですね。書籍や動画を見て分かった気にならないで、わからなくてもいいから自分でやってみることが大切です。
2つ目は、時間制限を設けることです。例えば、エラーが発生したときに、自分一人の力でどうにかしようとすると、2、3時間が軽く吹っ飛ぶことがあります。だから、独力でやる時間を30分と決めたら、どんなに考えても調べてもわからなかったら、30分後に誰かに聞きましょう。自分で調べても考えてもわからない場合は、知見のある開発者やわかっている人から聞くことで圧倒的にスピードが上がります。
3つ目は、初心者はまずモノマネからやることです。守破離の守からやっていきます。まずは、コードを真似てみて、動くということを確認しましょう。無理して我流でやらずに、最初は真似ることが大事です。

 これ読んだ学校でCSを専攻した人は、ああ、理論とか飛ばして「やさしい○○(言語名)」とか「○○入門」とかそういうプログラミングの書き方だけを書いた技術書読んで学んだんだな、と思ってしまいます。嗚呼、典型的な文系、という印象。自分の時間は圧倒的にスピードが上がってもできるエンジニアの時間が減るわけでトータルの仕事量…計算できないわけ無いですよね…。これを習慣化すると、その人が行った現場で生産性めっちゃ落ちるんですよ。1日5回とか聞いたりすると、契約打ち切られますね、普通に。つーか、どんなに考えても調べてもわからない課題出すなよ…。そのままググって見つかっちゃまずいけど、講義の応用で少しひねれば解ける、が普通の出題なんだけどね。

IT業界の言語の需要

最近増えているのは、SEの方です。SEはドキュメントの作成やプロジェクト管理といった仕事はしますが、自分でコードを書かないので新しい技術を学べない。そこに不安を感じて、将来性が高い自分でサービスを作ることができるスキルを磨いて、転職したいという方が多いです。彼らは、元々プログラミングの基礎を知っていて、入社時にJavaの研修を受けているので、オブジェクト指向言語であるRubyをスッと理解できます。

このプログラミング教室界隈のRuby至上主義ってなんなんでしょうかね?Javaの研修を受けてるから、Rubyが理解できますとか言ってるんですが、実際の需要は

www.bizreach.co.jp

 Javaが1番需要あって、1番給料が良いのはPythonです。Pythonなのは機械学習、AI系のライブラリが豊富でお金と直結しやすい最新の技術に使えるからです。なので、人手不足解消したいなら、Java教えたほうがいいでしょ、って話で。ちなみにRuby案件だと、大概jQueryとかNode.jsを求められたり、単体だと3年の経験とかですね。Rubyを使ってるところって結構、画面には手間かけたくなくて最先端の技術を裏で使ってたりってイメージがあります。Rubyしかできないとか、それならJavaしかできない、の方が何倍も仕事につながりやすいですよ。ただ、IT土方でブラックも多いですが。

プログラミング初心者の方だと、チーム開発ができて、自分で開発を進められる実務レベルになるのには300時間ぐらいはかかります。SEの方でも160時間必要です。

システム業界の事全くわかってない感モリモリです。悪名高きブラック業界ではPG→SEが基本なのに、SEの方が少ないんだが。160時間のプログラミング経験で実務レベルらしいですよ、SEの皆様

DIVE INTO CODE | Doorkeeper

ちなみに野呂CEO,資格欄見るとRails3ブロンズって旧バージョンの入門編しか持ってないようなんですが…。ちなみに、俺は文系エンジニアの時代でもアプリケーションエンジニアとDBエキスパートにLPICJavaプログラマとWebコンポーネントOracleシルバー(ゴールドは研修費無理)、DB2 Advanced Expert、UMTPにXMLあたりの資格持ってました。というか、期限ないのは持ってます。それでも全然初心者に毛が生えた程度だと思ってアメリカの大学院に留学したんですよ。なんでRubyブロンズとMBAが教えるのに十分なcredentialと思ったんでしょうか…。てか、この人、Javaを下に見てるけど、Java使えんのかな。まぁ、Javaが文系でも結構使えちゃう、1番簡単な言語の一つな気はするけど。Rubyの資格取るならJavaできるならJavaも取ってそうですけどね。俺、1ヶ月も勉強せず黒本解きまくって受けてギリギリだけど、入社3ヶ月と半年でJavaの資格2個取ったし。擬似コードちゃんと書けるなら言語なんて基本方言程度の差で正直どうでもいいんですけどね。ライブラリのあるなしあるけど、別に中でやってることある程度わかるから、なくても大して困らないし。多少時間かかるけど。使えって言われれば初めての言語でも2日後には書きますよ、普通に。簡単なのなら、即書きますよ。

結局、おそわるのはサービスの作り方?ビジネス?

この方も、MBA取ってたり(正直よく知らない大学ですが)、ビジネスのセンスはあるように思えますが、正直、プログラミングはセンスあまりなさそうなコメントが目立ちます。

globis.jp

誰でもやればできと、その時、「プログラミングって特殊なスキルじゃない」って確信したんです。

(↑原文ママ)これ、文系エンジニアのキーワードですよね。炎上した案件で、1人でかなり巻き取る人とか見たことないんでしょうか?特殊なスキルじゃない、って思ってる人が書いた翻訳プログラム(しかも誤訳してる)をふざんな、とできるエンジニアが共通化したりリファクタしたりして高速化して巻き取るわけなんですが。プログラミングは6割位の人は向いてない(しかもCS専攻しか仕事につけない国で出た話)、というのが定説ですよ。現場に長くいたら嫌でも実感するでしょう。自分の何倍も経験ある人がクソみたいなコード書いちゃってたりします。その確信は残念ながら過信だと思います。

ここもそうなんですが、独学で学んだだけで、ちゃんとCSの授業を一通り受けたわけじゃないならプログラミングで何が重要か、将来、応用まで対応できて高給取れるために学ぶべき基礎は何か、とかわからないですよね。できればCSの大学院までは最低でも出た上で(学部と修士では景色が全く違う=修士は数学中心)プログラミングに必須な知識を濃縮して教えるというのが正しい教室のあり方だと思うんですが。

だって、これって、公認会計士の資格取った人が司法試験教えてるようなものですよね?公認会計士取るのすごいかも知れませんが、その人が司法試験に精通してるわけじゃないし、司法書士の方がまだ詳しいのでは?プログラミングでガチで食ってる人間からすると、なんでこの人が教えるの?みたいな話です。OSSで何か認定されてる人というわけでも、有名企業でエヴァンジェリストしてたわけでもない、ちょこっとプログラミングに関わる仕事して、ビジネス側に行った人ですよね?ビジネスに関してはすごく学べると思いますが、プログラミングはどうなんでしょう。

カリキュラムを読んでみる

diveintocode.jp

※旧カリキュラムのURLは死んでます
で、カリキュラム見たのですが…ブログの作り方とかwebデザイン教えるなら、アルゴリズムとかデータ構造教えましょうよ…。何度も書くけど、webデザインはプログラマの仕事じゃないからね。独学の人は1人でやるからやらなきゃかもですけど、最近、ハッカソンでクリエイティブのUIやってる人に聞いたら、美大でwebデザインのコース出てるそうです。完全に畑違い。評価できるのはちゃんと講義をやってること。知るべき知識は正しく学ばないと悪い癖が付きます。と、言いつつ、上で手を動かすこと、とか言ってるので、講義では「書き方」の講義な気しかしない…。問題解決の手法、解くべき問題を特定して、擬似コードで処理のアルゴリズムを確認、処理や計算量が問題ないことを証明して、擬似コードを言語に変換する、みたいな基本的な手順教えてないんだろうなぁ。これ、大学のプログラミング系の授業の最初に習うことです。

プロトタイプコースは全5回、即戦力コースは全10回の授業があります。授業は予め用意されたテーマを元に行います。ex (HTML/Rails/要件定義/API/Git..)

ふぁ!!うわー、講義する意味ね~…。やっぱり駄目でした。

ちゃんと教える気はありそうなAIエキスパートコース

ただね、AIエキスパートコースはちゃんとやるっぽいんですよ。

diveintocode.jp

Python入門
アルゴリズム・データ構造
データサイエンス入門
数学
Pythonを使用した、スクレイピング
機械学習
深層学習
応用プロジェクト

-自然言語処理
-画像認識
-音声認識
-GameAgent

最新の技術を学ぶ

論文の輪読会や実装会を行い、最新の技術を利用する力を身に付けます。

プロトタイプ作成

応用プロジェクトの知識を元に、プロダクトにAIを導入をします。

DEMODAYで発表する

でもさ、これ、誰が教えるの?MITとかどこかのカリキュラム参考にしたんだろうか。講師陣でちゃんと学んだ人いなそうに見えるんですが…。これも独学で教えちゃうつもり?100万近く取って?あと、ところどころおかしいんですよね。アルゴリズムでサーチとか、データ構造で二分木とかヒープ教えたほうが良いんじゃないか。ソートは重要だけど、サーチとかほとんど教わらんぞ…。だって、最初から2分木というかB木?突っ込めばO(log n)で見つかるわけだし。データが必要でスクレイピングって何の冗談ですか?普通にワシントン大学とかで公開してるデータ・セット使えばええやん。sklearnとかにもデータセット入ってますけど…。スクレイピングって結構グレーゾーンで薦められる技術じゃないと思うんだけどなー。特に色々揉めてる昨今。で、最後の方若干怪しくなってきて、機械学習とAIがごっちゃになってみたり(AIエンジニアってデータサイエンティストとAI両刀使いのこと?【註】最近、うちの大学ではAI/ロボティクスとデータサイエンスは別領域になった)、論文の実装会って、論文のやつって、最新技術なので、基本的にライブラリ使えないんですが、わかってるんでしょうか…。しかも英文だよね?もちろん講師は実装できる前提じゃないと教えられないよね?で、プロトタイプって何やねん。AI/機械学習を実装したのを導入してるのに、プロトタイプって…。学習成果の確認にDEMOの発表会も悪くないんだけど、時間短いし、この人ビジネス教えられるんだから、プランナーの部門も作って、プログラマーの前でプレゼンさせて、一緒に組んでものづくりさせればいいのに。可能ならデザイン部門も作って3人で組むと良いと思う。それがチームの最小単位なのでは。

で、誰が教えるんだろう、と調べてみたら…

education-career.jp

講師募集してた…。
てか、インターンパート時給1000円ってお前…。データサイエンティストでちゃんと理論理解して教えられるレベルの人ってGoogleとかに囲われて年収1500〜2000万は初年度からもらえて当たり前なんですが…応募するわけがねえ…。俺、半分は習ってるから教えられるけど、この内容なら1500万もらわんと動かんわ。めっちゃ論文読まなきゃいけないだろうし、今読んでるけど、AIの色んなクラスで使ってる教科書とか英文で1000P以上あるからね。5月までに講師見つけるつもりっぽいけど、この募集だと、現講師陣が必死で独学して付け焼き刃で教えるんだろうなぁ。100万取って。それか間に合わなくて、要求水準も高いからで適性テストして全員落として闇に葬るのだろうか…。

*以下、以上のレベルの参考になりそうな書籍*

・入門 Python3(オライリー・ジャパン)
・ゼロから作る DeepLearning
・プログラミングのための線形代数・確率統計

とっつぁん、たちの悪い冗談だぜ…と吹きかけたなう。入門書やんけ。

ちなみに、AIコースは大学で勉強した経験だと、即戦力コースと全く違う教え方しないといけないと思います。俺が機械学習受けた時、毎授業までに英語の教科書を20〜40P読んでいって、週2日計4時間授業受けて(最初の2週はプラス4時間の数学の補講)、課題やるのにも理論を理解するのに週10時間以上読んで、毎週Writingの宿題を12時間位かけて解いて、2週に1度のプログラミングの宿題は20時間位読んで6時間で実装って感じで、手を動かすより、理論をちゃんと理解することが大事でした。というかさ、1000時間あれば十分だと思ってるかもしれないけど、うちの大学院の授業で言うと4コース分以上含まれてるわけですよ。これね、初心者絶対無理。理論わかんないと思うよ。理論わからないと実装無理だからね、この分野。ちなみにDeep Learning機械学習の延長に設置されてた。大学院で1コース1学期250時間として…。実際はアメリカの大学院同じくらい金取って教授でもなく、下手したらCSも学んでない人が教えるという…。

ちなみに大学院生ね、アルゴリズム、データ構造、計算理論、プログラミング言語(SyntaxとかSemanticsとかScopeとかDynamic&Staticとか理論部分をHaskellでやった)、OS(カーネルレベルまで)、コンピューター構造辺り必修で取ってるからね。それ前提の人と同じ位の時間ですよ。見積もり甘すぎるだろ!ライブラリ使えばなんとかなると思ってるかもだけど、チューニングちゃんとしないとライブラリもまともに使えないぞ…。なるべくライブラリ使わないでとか、大学院と同じ方向性書いてあって、やっぱ大学からパクって香りがするけど、それって結構ガチの大学レベルの数学ですよ。大丈夫なん、受講生?

総括

もうマジで、プログラミング教室、ちゃんと学んだ人間がちゃんと教えるとこ作らないと駄目だと思いました。