渡るネットは嘘ばかり

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

プログラミング教室営業の大嘘〜大学で普通にプログラミング身につく件〜

ITコンサルの友達が1本稼いでるって聞いて、マジか、月収100万か!!とビビったら、普通に1000万だった件。まぁ、30代も半ばまでIT業界コツコツ積み上げるとそれくらいの人、企業内でもフリーランスでも増えますよね。

大学でプログラミングを学べないはプログラミング教室の流した嘘

プログラミング教室で大学でもプログラミングできる人間ほとんどいなくて、独学で学んだ人間が教える!とかだいたいのとこで言ってるんですが、日本の大学ってそんなにレベル低いのか、と思ったら、それ、プログラミング教室の流してるステマの一部ですね。競合の大学が遥かにレベル高いと「文系でもできる!」「未経験でも短期間で即戦力」とかって誇大広告が使えなくなるからね。

www.ituore.com

これの中の人、自称大学院でプログラミングを専攻してる人なんですが、良く考えたらプログラミング専攻ってなんやねん。CSの専門領域にもプログラミング言語はあってもプログラミングなんてありません。そもそもでプログラミングは学術分野ではない。記事に書いてたんでWebCampってとこのステマかな、これ。真子氏もそうだけど、プログラミング教室の記事って、大学にLabとかTAの存在をないように扱ってるよね。大学ってプログラミングの授業はたいていLabがあって、そこで実装に必要な技術対話式でTAが教えてくれます。実技面の補講みたいなもの。TAもオフィスアワーあるから行けば時間の許す限り教えてくれますよ。3年とかになると研究室にも入るから教授とか先輩にも聞けるはずだし。どうも、この人もCSじゃないんじゃないか疑惑。

むしろプログラミング教室のほとんどは監視下で独学してるだけ

本来、教室行くメリットは理論部分を教われることなんだけど、実際は課題投げてわからなかったら教えてくれるだけですよね?生徒用の会員サービスページで読む形だったら独学と全く変わらないし。そもそもがさ、コンピューターサイエンスの授業ちゃんと受けた人間と独学の人間で、なんで独学に教えてもらいたがるの?サッカー教わるとして、クラブチームで習ってレギュラーで試合出てた人と空き地で1人で蹴ってた人、どっちに習いたい?独学の人は、独学の仕方教えたり独学の手助けはできても、誰かに習ったことないから、プロで何年も教えてる教授の教え方とかわかんないでしょ?
結果として、教え方は独学+質問しかできないだけなんですよね。動かし方は知っててもどう動いてるかわかってないから。

プログラミングとかアルゴリズムってできる人にはパズルみたいに感じると思う。パズル解けないからってすぐ答え教えてもらいますかね?というか、自分でデバッグさえできれば、課題もらえば一人で解けるし、職業としてやりたいなら解けないといけない。その謎解きが楽しめないなら職業にしても楽しくないと思うよ。1人で解決する方法教えたら、課題は教室でやらないで宿題でいいじゃん…。せめてやるなら、他の学生がいないとできないペアプログラミングとかやったらいいと思う。下手するとプログラミング教室の運営の人達、ペアプログラミングも知らない可能性ある。独学しかしたことないんだもんねぇ…。

ただ動くだけの独学プログラミングと違って、アルゴリズムとかって独学ではきつい部分あるんですよ。証明も必要だし、半分理論ですし。動かすだけでなく、なんでこのやり方だと早いの?の根本理解は教えてもらったほうがいい。特に乱択系とかグラフ系とかできなくはないけど、独学結構きついですよね。データ構造にしても、ただ使ってるとなんでの部分が浮かばないので、原理を説明してもらった上で自分で組んでみる、それが大事だと思います。配列とかハイレベル言語だと、中で動的に拡張とか行われてるの知らないですよね?生成時にサイズ指定しないと簡単にはみ出す(Javaだと初期10個)んだけど、内部のサイズ越えた時点で大きい配列を新しく作って(大体2倍のサイズとか?)、そこに全部の要素入れ替えるとかってことが行われるんですが。その代わり、ランダムアクセス(100個中の45個目を見たい時、45番目にいきなり飛べる)ができる。個数分からない追加には向かないし、途中に追加するとそれ以降全部後ろにずらさなきゃなので、そういうのには向かないけど参照にはいいんですよね。リストだと前と後ろがどれか、って情報を持つので、最後に追加するなら最後の要素にくっつければいい。最初も同様。ただし、ランダムアクセスできないから、前か後ろから辿らないといけない。最初と最後を判断するのに番兵的な要素を置く、なんて話もあって、結構面白いし、知ってるとデータ構造の選択が正しくできてスケールによってはパフォーマンスに寄与できる。

だから、まともなプログラミング教室は課題を黙々とやらせてわからないところを聞く、じゃなくて、教えないとわかりにくい部分は教えて、宿題をたっぷり出す。宿題や教えたところでわからなかったらいくらでも質問に答える。それが普通です。課題は応用でそれに使う技術は授業で説明するのが普通。なんていうか、教室で監視されながら独習してるって金払う意味あるんだろうか…。一人でできないなら、友達と集まってやれば大差ない気がする。そのグループ内に向いてる人が一人でもいればその人がサイトでの説明を伝えても向いてない側の学生メンターとレベル変わらん気が。ちなみに、ググってばっかのエンジニアは2流、ググってもわからないエンジニアは3流です。

プログラマを新卒採用する意味ってあるんだろうか

ちょっと話逸れるけど、プログラマって才能がほとんどなので、新卒から育てる意味ってない気がします。どちらも未経験として、向いてない新卒5年目と向いてる中途1年目って同じ年齢でも能力変わらないというか、下手したら中途の方が上なんですよね。IT企業で新卒エンジニア職取るなら未経験取る意味ってない気がします。向いてるかわからないのに時間かけて育てるのは時間の無駄。プログラミングしなくても向き不向きは確かめられるので、向いてる人の青田刈り、ならありかもですが。まぁ、日本の企業はエンジニア職で採ったのに企画になるとかあるから、正直、新卒の職種とかどうでもいいのかも知れませんが。

アメリカのコンピューターサイエンスのプログラミングクラス

前に概論でちょろっとと書いたんですが、実は大学1年レベルで必修3クラスありました。そういえば大学でTutor(学内個人指導)で働いてた時、2年のデータ構造クラス教えてたけど、1年の概論1の質問されたことあったなぁ。

俺、大学院から行って、学部レベルの授業は大学院の卒業条件のクラス(データ構造、アルゴリズム、計算理論、アルゴリズム、OS I、OSII、プログラミング言語)しか取ってないので1年の授業把握しきれてませんでした。学部のプログラミング関連クラスは1年のオリエンテーションクラス、概論1,概論2で必修。この辺できないと2年以降のはまず無理だと思う。何度も書くけど、エンジニアリングは積み上げなので、基礎ができないと応用はできません。掛け算ができないと分数の掛け算ができないみたいにね。まぁ、プログラミングだけは、基礎を誰かが書いてくれて知らないでもライブラリがやってくれたりするけど、ライブラリが実はバグってたって時に誰かがバグ修正してくれるの待つとか言ったら事業的には大損失ですよ。

せっかくなんで、1年の必修3つのクラスでやってることを順に説明します。

CS160:コンピューターサイエンスオリエンテーション

  • 進数変換:アルゴリズムを書く
  • 問題解決のステップ:Syntax vs Semantics、エラーハンドリング
  • データ型、if文、ループ
  • functionデザイン:擬似コード
  • function
  • Listと配列
  • 2次元配列:コンソール上でマルバツゲーム

 言語pythonで、結構ちゃんとやってる。毎週課題。

CS161:コンピューターサイエンス概論1

  • プログラミングとは
  • C++でデータ型、変数、定数
  • 算術計算と入力
  • 条件文とランダム
  • ループ、文字列
  • エラーハンドリング、デバッグ、処理分割
  • 引数、値渡し、参照渡し
  • 再帰処理
  • 再帰とループの違い(メモリの使い方とか)
  • 配列とC++とCの文字列の違い
  • ポインタ、スタックとヒープ、静的と動的、メモリリーク
  • 静的2次元配列とポインタ
  • コマンドライン引数、
  • 動的2次元配列
  • 構造体と構造体配列
  • オブジェクト指向言語

 CとC++の基本的な部分はカバーしてますね。課題は10週で6個。

CS162:コンピューターサイエンス概論2

 結構ガチにオブジェクト指向プログラミング。課題は2週に1個。システム会社の研修ではここだけ習いました。

大学の授業でほんとに身につかないの?

上記の3クラス、全部Lab付きでプログラミングしながらTAに聞く時間ありますね。TAもオフィスアワーあるので、その時間にも聞ける。友達に手伝ってもらいながらでも単位取れたら結構ちゃんとプログラミングできると思うんですが、日本の大学ではここまでやらない?これ、1年で取らなきゃいけないって1番基礎的な内容ですよ。繰り返すけど、1年で習うっていうのはこれくらいわからないとその先何も勉強できないってことです。もちろんですが、毎授業Readingの宿題出て、読んで来たところを授業で教えて、習ったところを課題で自分で実装します。でも3個取ったら9ヶ月かかりますね。これでも基礎だと思うんですが。3ヶ月で未経験が即戦力?この3つ必修で、さらにアルゴリズムとデータ構造も必修なんですが。学校でプログラミング身につかないって言ってる人が本当にCS専攻だったら、学校がプログラミングを重視してないとこだったか全くプログラミングが向いてなかったか、としか思えないなぁ。1年生の時に9ヶ月とかで身につけなきゃいけない基礎を4年間で身につけられなかった人が1ヶ月とか3ヶ月で教えるって、魔法の粉でも飲んでるとしか思えんなぁ。脳内でできるようになるやつ。

ちゃんと理論教えてTAがわからないこと説明してくれるCS系専攻卒業した人が、学校で全くプログラミング身につかなかったとか言って、プログラミング学ぶのに自分の作った生徒用ページ読んで課題やって質問するだけ(独学でわからないとこ教えてくれるようなもんで大学の授業から講義とLab取ったようなもの)の方が有効とか言ってる人の意味がわからない。どう考えても詐欺師の口上なのですが。もし、真子君が本当に情報テクノロジー科卒でCもC++pythonも使えないとしたら、アメリカでは大学1年の必修も突破できないですよ。でもさ、クラウドワークスでできることに書いてないって、ガチでできないんじゃないか?

うちの大学だと、4年でカーネルいじるし、4年は大学院の授業も取れる(最後の課題が大学院生は1個多い)けど、パラレルプログラミングでGPU使ったパーティクルシステムとか実装してたし、アーキテクチャではアセンブリ使ったり、BeagleBone Black上でプログラム組んだり、Shaderの授業ではcompute shaderとかtessellation shaderとか使ったり、虹とかディスクの周波数で色が変わる的なの実装してたし、ジオメトリモデリングとかもやってた。それが学部レベル到底プログラミングできない人は卒業できないと思うんだが…。ちなみにプログラミングできないと大学院では単位取れる授業1,2個しかないんじゃないかな…。結構数学的に難解な理論を実装することが多いから。課題では論文の実装とかザラ。プログラミング言語の授業ではHaskellでラムダ計算実装する課題出て、お互いのソースを分析するグループディスカッションしたけど、9割が完答してた。ググっても答え出ない感じの問題ね。

ちなみにhtmlとかcssは基本的にCSでは習いません。ガチでデザインするならデザイナーの領域だし、表示する程度だったらマークアップ言語はCとかC++pythonが当たり前に使える人には鼻歌とオーケストラくらい難易度に差があるので…。

ちょっと、プログラミング教室で無駄金払ったって人、これ拡散してくれませんか?ステマの被害者増えないように。

それと、アメリカでは起業家は尊敬されます。何故なら雇用を生み出すから。なので、1人でWebサービスをやるために起業した人は尊敬の対象ではないです。むしろ、なんて強欲で自己中なんだ、という評価かな。なんだかなぁ、システム業界はIT土方のブラック業界だし、Web業界はうさんくさい詐欺ばっかになってきたし、もう、大企業以外、スマホゲーム業界位しかまともな業界ないですよね。スマホゲーム業界も稼働はそこそこ高いけど好きでやってる人も多いから、1番まともな気がする。業界としてはね。Web業界はアルゴリズムとか最低限わかってないと入社できない最先端を攻めてる層となんとなく動けばOKの情弱市場狙い詐欺まがいの底辺の層に2分してるんだけど…。