プログラム書こうとして吐き気や頭痛がしなければ特に問題なし

あるある。

高校生の頃からPCでゲームをやったり、動画を見たりするのが好きだった。
受験を勉強頑張って結構名のしれた国立大学に入れたは良いが息詰まってしまった。
授業でプログラミング入門の講義をとってみたら全然わからない。
メソッドコンストラクタ再帰?このfor文どういう動きなわけ?!
バブルソートってなに?来週までに作ってこいってなんだよその宿題。ってな具合で
完全に置いてけぼり食らった。俺の周りはそこそこプログラミング経験者が居て、
俺みたいな完全初心者は殆ど居ない。
マジでなんでこんな学部選んじまったんだ。プログラミングに適正あるなんて聞いてないよ;;たいしに
はてな匿名ダイアリー:パソコンが好きで情報系学部に入ったは良いが・・・

でも、広く同年代、あるいは、日本国民全体で考えると「PC使うことに拒否感がない」「ネットが便利であることを知っている」というのは結構有利な点だったりする。世の中には、PCを使うこと自体が憂鬱という人が案外いる。周りと比較すると「やばい、私だけ初心者」と思うかもしれなけど、大丈夫、そう思っているのが同じクラスにあと5人はいる。ちなみに、私が所属している情報系学科の場合、学年のうち3分の2が「自分は初心者である」と思っていて「高校まで授業でしかPCに触ったことない」という学生も3分の1ぐらいいる。プログラミングを行った経験があるなんて50分の1ぐらい。

冷静に考えて「マジでなんでこんな学部選んじまったんだ」という実感が「俺みたいな完全初心者は殆ど居ない」ということに起因し、そもそも「プログラミングなんてしたくない。」「IT系の話は本当に苦痛。」とという理由でないならば、頭切り替えてゆっくり学べばよいと思う。

そもそも、プログラミングは授業を覚えられるほど簡単ではない。授業の中でプログラミングの全てを理解できるほど簡単ではない。授業の価値はキーワード(膨大な範囲から最重要なものをピックアップしてくれる)と資料へのアクセス方法(教科書、参考書の指定、授業ページの用意など)、自習環境の提供(どういう環境が必要なのかの指示、および、パソコン室などの環境提供)、良い道具の提示(エディタやデバッガなど)にある。プログラミングはプログラム書いてみて、エラーたたき出して、デバッグにはまって、「うわぁー!」と叫んで覚えるもの。「授業でプログラミング入門の講義をとってみたら全然わからない」のは当たり前。授業で出される課題を必死でこなしていくことで、その日ならったことを学習するのが吉。

たぶん、今、目の前に突き付けられているのは「プログラミングの適性」「情報系技術者としての適性」ではなく、「セルフイメージと実際の自分にギャップがあったときにそれを受け入れらるかどうかの適性」なのだと思う。まだ、6月半ば。全然いけるいける。プログラム書こうとして吐き気や頭痛がしなければ特に問題なし。あとは、時間使うかどうかの問題。

対応策案1:記録をつけよう

技術ブログをつけることをお勧めする。私が初心者のときに体験したのが「あれ?この現象は前も見たことある。どうやって直したっけ?」というもの。試行錯誤の過程を記録していなかったので、2週間ぐらいたつとそれがなんだったのかが思い出せなくなってしまっていた。

STAP細胞問題の例もあるように、科学者や技術者にとって作業ログをとっておくというのは、とても重要。今から、その習慣を身につけておけば、大学に入る前にプログラミングを経験していたかどうかなんて、どうとでもなるぐらいの重要な習慣。

はてなブログでもよいけど、今ならQiitaあたりで技術ブログを作ってみてはいかがかと思う。なお、ブログ初心者ならハンドル名で始めることを推奨。

とりあえず、エラーや不具合に直面したらエラーメッセージごとそれをメモしていけばよい。もし、うまく解決できたら、どう解決したのかもメモすること。

  • タイトル:エントリーの内容が簡潔にわかるもの
  • どういう環境で、何をしようと思って、何を行ったら、どうなったのか
    • 環境:OS名+バージョン、プログラミング処理系+バージョン、関連ライブラリーや道具など
    • 何をしようと思って:プログラムを書いているならば、プログラムによって成し遂げたい理想状態を説明する。
    • 何を行ったら:ほとんどの場合、ソースコードをそのまま貼り付ければよい。そのプログラムのコンパイル&実行コマンドもメモする
    • どうなったのか:ほとんどの場合、エラーメッセージをそのまま張り付ければよい
  • 適宜、愚痴。

関連過去エントリー

対応策案2:プログラミング居残り仲間 or テディベアを手に入れよう

他人に説明するだけで、プログラムの不具合を見つけることができるので、プログラミングの課題をするときに一緒におしゃべりできる仲間を見つけることをお勧めする。

どうしてもわからない場合は、友達のプログラムをコピーするのではなく、友達にお願いしてプログラムの解説をしてもらうのが「プログラミングできるようになる」という観点からは効果的。もちろん、自分のプログラムを友達に説明するというのも効果的。

(追記)対策案:エラーメッセージでググる

非常にシンプルながら、効果的な方法はエラーメッセージをそのままコピー&ペーストしてGoogleで検索するという方法。最近はIT系のQ&Aサイトもたくさんあるので結構ヒットする。ポイントは英語のページが出てきてもビビらないこと。中心的な単語とコマンド、プログラムを見れば大体予想はつくのでダメもとで目を通してみると良い。最近は良くStack Overflowにお世話になっている。

もう一つのポイントは1つのエントリーの記述を鵜呑みにせずに、複数照らし合わせてみること。前提とする環境やプログラミング言語処理系やツールのバージョン情報の確認もお忘れ無く。

対応策案3:毎時間教員に質問しよう

無理やりにでも毎授業ごとに3つ質問を作って、授業が終わったら教員に質問すると良いと思う。

第一に3つ質問を作らなければならないとすると授業中に自分の「わからないこと」「納得いかないこと」をメモしないといけない。これが、授業の理解に役に立つ。

第二に質問することに慣れる。ほとんどの人は自分の「わからないこと」「納得いかないこと」を言語化し、相手に理解できるように伝えるという訓練を積んでいない。なので、質問すること自体が難しい。授業でわからないことを質問するという大義名分があり、教員は基本的に質問に答えなければいけないので質問もしやすいと思う。

第三に教員に顔と名前を憶えてもらえる。顔と名前を憶えてもらえば、授業中にも理解度を気にしてもらえる。理解度を気にしてもらえば、君が小首を傾げたり、眉をひそめたりしていることについて「ああ、まだ、理解できていないんだな」ということで追加で説明してくれるようになる。つまり、授業を自分用にカスタマイズしてもらえる。

教員に質問するのはハードルが高いのならばTAに質問するとよい。TAに質問するのもハードルが高ければ、同じクラスのプログラミングが得意な子に質問すると良いと思う。

関連過去エントリー

対応策案3:夏休みはプログラミングコンテストにチャレンジ

目的もなくプログラミング勉強するのもつらいと思うので、当面の目的としてU-22プログラミング・コンテスト2014で作品を出すというのを狙うのもよいのではないかと。サイボウズ賞はRED BULL 100本!(22歳以下にRED BULL 100本飲ますのはどうかと思うけど)。

プログラミングをしなくちゃいけない環境に身を置くならば、ACM 国際大学対抗プログラミングコンテストにチャレンジしてみるのも良いと思う。今年の国内予選の申込み締切は2014年6月27日(金)。もちろん、いまからだと参加しても1問も解けず屈辱を味わうと思うけど、それはそれでプログラミングを学ぶモチベーションになるんじゃないかなと思う。

おわりに

プログラミングの他にも、数学(線型代数数値計算、確率・統計、離散数学)や電気回路系も、みんなが一斉につまづくし、「あれ、私の思っていた情報系と違う」とぼう然とするので自分だけが初心者と焦る必要はないですよ。

追記:サッカー好きがサッカー選手になれない話と一緒

学生個々人あるいは大学の経営層としてみれば、情報系学科に入ったのだから、入学者はすべて立派なソフトウェア開発者や研究者になる/なってくれることを期待しているのは当然の話。学んだことが直接にお金に結びつくとうれしい。

でも、社会全般で考えたら、情報系の一般素養(情報処理技術者試験の応用情報処理技術者合格ぐらいの知識)を持っている専業主夫/主婦、経営者、芸術家、事務職がいるのは良いこと。このような人たちは専門家と非専門家の橋渡しとなるし、情報系の知識を別分野に適用して、情報系知識の有用性をより高めてくれる可能性がある。

話変わって、サッカーを産業や文化だととらえたとき、サッカーに関わる業務は、実際にプレーヤーとして試合することだけじゃない。サッカーに関わる業務は、サッカーが好きでなくても、極端にいえばサッカーを知らなくても、行えるかもしれない。でも、サッカーが知っていれば、サッカーが好きならば、その業務を行うことに何らかのプラスな効果を与えるかもしれない。

金を稼げるプログラマーになれないならば、プログラミングを学ぶことに意味が無いかといえばそんなことはない。プログラミングは計算機が関わる様々な業務の一部でしかない。計算機が関わる業務を見渡してみれば、プログラミングをしないでも行える仕事は大量にある。でも、金を稼げるレベルでプログラミングをできないとしても、プログラミングがどういうことかを知っていれば、よりスムースに、より効果的に行える業務は結構多いはず。

このエントリーを書いたのはこういう認識があるから。サッカー好きがサッカー選手になれない話は、プログラミングに憧れている人が金を稼げるプログラマーになれないと一緒。でも、サッカー選手になれないならばサッカー好きになったり、サッカー選手に憧れたらいけないのかというとそういうことはない。金を稼げるプログラマーになれないならば、プログラミングを学ぶことに意味が無いかという話もそれと一緒。