なぜ大学生はプログラミングが上達しないのか

#はじめに
最近、情報系の大学でプログラミングの勉強をしたのに、プログラムが書けない人が結構いるというご意見を拝見しました。

実際、私の友人を何人か思い浮かべてみてもほとんどの人が簡単な計算程度のプログラムしか書けないと思います。

しかし、ほとんどの学生がエンジニア志望なのです。

人事の方で、授業でのプログラミング経験などをアピールされて採用したのに蓋を開けてみたら全然プログラムが書けなかった！という方もいらっしゃるのではないでしょうか？

なぜ大学生はプログラミングが上達しないのか？私の経験を踏まえて考察していきたいと思います。

※あくまで私の経験をもとに客観的に分析した結果です。大学の在り方を否定しているわけではありません。

#1. 講義時間が少ない
大学の講義は半期に渡り90分 × 15回行われます。
つまり、一つの講義では**トータルで22.5時間しか勉強しない**のです。
さらに、基本的に授業は**週に1回**です。
大学の講義を通して専門的な知識を持った技術者を育てろというのは少々無理がある気がします。。。

#2. アウトプットの時間が少ない
前項で講義の時間が少ないことについて言及しましたが、アウトプット（演習）の時間はさらに少ないです。
というのも、最初はプログラミングとはなにか？というところから入ると思いますし、新しい構文などを教えるときなどは座学でのインプットをまず行わなければなりません。
私が受けていた講義では、最初の45~60分はその日に習うことの座学で、残りの時間で演習だったと思います。あとは、回によっては課題がでたりでなかったり。
そんな感じで**手を動かす時間が圧倒的に少ない**ことも大学の講義の特徴だと思います。

#3. テストは筆記試験が多い
プログラミングだろうとなんだろうと大学の講義である以上、単位の認定が必須にります。そして、単位の修得に大きく関わるイベントが試験です。
私は、この大学の筆記試験の形態がプログラミングの上達には効果的ではないと思います。
私が履修していた講義では、一部虫食い状態のプログラムが渡され、そこに入るコードを選択肢の中から選ぶ、または、プログラムの実行結果を答える問題が多くありました。
これはこれで、プログラムを読む練習になるのですが、**プログラムが「読める」と「書ける」には大きな差がある**と思います。
中には、問題を読んでコードを書いて提出する形態の試験をする先生もいましたが、僕の受けてきた講義では一人だけでした。

#4. 大学は研究をする場所
**大学は研究機関**です。高学歴になるための場所でも就職をよくするための場所でもありません。大学としては大学院に進んで研究をしてもらうことが本望だと思います。それゆえ、実務に活きるような技術を教えるというのは、大学の存在意義には反しているのかもしれません。

#5. アルゴリズムの勉強が多い
前項でも記した通り、大学は研究をするための機関です。それゆえ、大学で学ぶ内容は最適化アルゴリズムを学ぶことが多いです。これはこれでおもしろいのですが、数学を用いることが多いため、内容は難しくなります。
さらに、理論はわかってもそれをプログラムに落とし込むのも簡単ではありません。私もプログラミングを学んだばかりの頃は、課題をやっていてなぜか答えが合わない。でもどこが間違っているかわからないということが多かったと感じています。
結果、**プログラミングの楽しさがわからず、挫折する学生が多い**気がします。

#6. 日常に活かせる機会が少ない（地方学生）
これは地方学生特有の悩みかもしれませんが、都会の学生と違いエンジニアインターンやアルバイトはかなり少ないです。少なくとも私の周りでは飲食店や居酒屋でアルバイトしている学生が多く、プログラミングで稼いでいる学生はいません。
都会のようにインターンやアルバイトで実務を行っている学生が多ければ、少しは刺激になり、勉強のモチベーションも上がるんじゃないかなぁなんて思ったりもします。

#7. 課題に追われて自習の時間がない
大学生って時間が有り余っていると思われているかもしれないですが（実際有り余っている学生の方が多数だと思います）理系学生って意外と時間がないんですよね。
提出しても提出しても無限ループのようにレポートがでます。また、最低限アルバイトをしないと生活できないという人がほとんどだと思います。
ですので、とにかく今を生きるのに精いっぱいで、他のことをやっている時間なんてないという気持ちもわかります。
とはいっても、やる気のある人はどんなに忙しくても目標に向かって努力すると思うので、忙しさに甘えていいとは思いませんが。

#8. 学んでいる内容が何に活きるのかがわからない
私が最初にプログラミングを学んで思ったことです。たしか最初に受けた講義では、C言語で四則演算をしてターミナルに出力する。そしたらループや条件分岐を入れて最終的な計算結果を出力するといったことばかりをしていました。
そのとき私は**「これがどこでなにに役に立つの？」**としか思っていませんでした。
もっと動くもの（ソフトウェアとかロボットとか）を作ると思っていたので、正直この段階ではなにが楽しいかわからなかったです。

#9. コードのレビューをしてくれる人が少ない
一度、競技プログラミングのようなことをチームで行うといった講義を受けたことがあるのですが、その時の友人の書いたコードは**「aやbといった変数名の多用」**や**「かなり深いif文のネスト」**が目立っていました。
その友人は、自分でプログラミングの勉強をしていたようで、他の学生に比べるとスキルが高かったのですが、基本自分一人で勉強していたため、上記したようなことに注意を払うことがなかったようです。
**人に自分のコードを評価してもらうことで得られる気づきもたくさんある**と思うので、上達しない理由の一つに入れさせてもらいました。

#10. 受け身の学生が多い
結局これが、上達しない理由の大部分を占めていると思います。どんなに環境が整っていても、実行する側にやる気がなければどうしようもありませんからね。
ただ、日本の大学生は主体的になにかを学ぶという学生は少なく、サークルや飲み会など楽しいイベントに誘惑され、なんとなく学生生活を送ってしまう人が多いと思います。（私も3年生になるまではそうでした）
逆に、どんな環境にいようともやる気さえあればスキルもお金も手に入るところがプログラミングの秘められた可能性って感じで面白いですね。

#おわりに
大学生がプログラミングが上達しない理由を色々と考察してきました。
私は、大学側としてはもう少し工夫できることはあるとは思いますが、それでも十分丁寧に教えてくれていると思います。一番挫折しやすい時期に、詳しく講義してくれたり、演習課題を与えてくれたりするわけですからね。
私含め、大学生はもっと主体的に行動できるようにならないといけないなぁと思いました。また、この記事を書いていて企業側が学生に主体性とかチャレンジ精神を求める理由がわかりました。

P.S.
大学進学を迷っている高校生はプログラミングを学ぶことが目的であれば行く必要はないと思います。
研究をしたい、最適化アルゴリズムを学びたい、大手に就職したい、などの目的がある人は進学したほうが良いと思います。

#追記（2020年8月11日）
思いもよらぬ反響があって、様々な意見をいただきました。
一部誤解されている方がいるようですが、私は大学の在り方を批判しているわけではありません。
大学に行けば何かスキルが身につくと思っている人に向けて、そんなことはないんだよ、なぜなら〜と、私なりに理由を考えて述べているだけです。
要は、大学に行っても自分で主体性を持って行動できないと大したものは得られないよということを伝えたかったということです。
この場合のスキルというのは様々当てはまると思いますが、今回は私の経験を踏まえて、プログラミングという枠に落とし込んで記事を書きました。