やる気のない情報(2)

今年度一年の総括.
やる気を出す必要はないけど興味を持つ必要はある.
どうせ何がどこで役立つかなんてわかんないから興味の方向性はどこでもいい(すくなくとも工学部の場合専攻だけはなんとかなるようになっている).
もしくは出来るだけ多くのことに興味を持っていれば伏線を多く張れるのでいいかもしれない.
友達が多くある必要はないけど顔は広い方がいい.
先生と仲良くなると特典が多い.
もはやB5ノートは使ってられない.A4がいい(これは俺の字がばかでかいから).
メモ用の小さいコンピュータがあると重宝する.
書籍代は意外に財政を圧迫する.
ICレコーダで授業を録ってもどうせあとで聞き直さない.
各大学にはその大学にしかない何かがあるから,それを最大限利用すること.
悪いところじゃなくていいところを見つける.
まぁ,基本的なことだけどね.
大学なんて誰かの書いたカリキュラムに従ってる限りはどうせロクなもんじゃない.でもまぁそんなもんだね.

やる気のない情報(1)

おかげさまでギリギリ留年を免れましたので,情報学科での過ごし方というか,そもそも情報学科ってなんだという問いです.
まぁ学部一回や二回の分際ではなんもわかっちゃいねえですけど,「情報学科ってなにすんの?」みたいな話をよくされる割に一言や二言で語れることではないので,少し自分の考えをまとめてみることにしました.「ここを見てくれ」と言えるように.
ちなみに今徹夜明けですので,その辺をご考慮いただければより楽しめるかと存じます.


まず情報系学科といっても,何をやるかですが,プログラミングでもやってコンピュータとおつきあいするのでしょうというのがだいたいの見方だと思います.まぁ間違っちゃいませんが誤解をかなり含みます.ちなみに情報系の人はコンピュータとか,特にパソコンという言い方を忌避する傾向にあります.多くの場合計算機と言います.なぜ計算機というかというと計算をさせるからです.人間に数学なりなんなりの問題を与えたら,あーだこーだ筆算したりグラフを書いたりして解くわけですが,計算機は突き詰めれば加減乗除とその他の数個の機能しかついていませんので問題を日本語ないしはその他の言語で書いて突っ込んだところで解いてくれるわけにはいきません.
そこで計算機のわかりよいように問題を人間側で解釈し直して,最終的に計算機に任せられるような形に書き直して計算機に突っ込んで計算させるわけですが,これがいわゆる一般の人が想像するプログラミングに相当すると思います.ただしそのいわゆる「プログラミング」でいうところのプログラミングは書き直す作業しか該当しません.「プログラミング」とは「入力された数値(など)をこの手順に従って処理して,こういう感じの結果を出力してね」という命令を書くことです.「この手順に従って処理して」という部分を「アルゴリズム」と申します.
ここで奥深いのは問題の書き直し方,すなわちアルゴリズムの書き方によって計算効率が全く違ってくるということです.表面上は同じ階乗を出力するプログラムでも,内部処理をたどれば,計算機のリソースの消費量が全く違うという例があります.10や20の階乗ならかまいませんが,非常に膨大なオーダーの計算をすることになると,この計算量の問題は非常に大きな意味を持ってきます.たとえば,非常に大きな数の素因数分解を宇宙的な時間をかけずに解くアルゴリズムが未発見なことに依拠してRSA暗号は作られています.もしこれを覆し,どんなに大きな数の素因数分解でもわりと現実的な時間で解けるアルゴリズムが発見されたら,インターネットを支えている暗号技術はかなりの部分で崩壊します.ことほどさようにアルゴリズムの書き方には重要な意味があるのです.
あえて乱暴に言い切ってしまえば,基本的に情報系の人は,アルゴリズムの研究に日々邁進しているというわけです.アルゴリズムを実現させるためにコードを書く(プログラミングする)のはまぁオマケというか,自由英作文における英作文部分みたいなものです.普通の日本人は,自由英作文をやるときに,最初は日本語で考えてそれを英語に直していくでしょう(英語でネイティブに書き下せるような大変けしからん人物はのぞきますよ).それとまぁ同じようなものです.ですからプログラミングは基本的に後付けでやらされることになると思います.アルゴリズムを作る方法論みたいなのを習って,そのアルゴリズムを実現させるためにはどんなコードを書けばいいでしょうか,みたいなそういう感じです.日本語の作文を習って,英作文を習うのと同じです.情報系の人が極まってくると英作文でいうところの英語に訳す部分は指が勝手にやってくれますので,まずは母語での作文,つまりアルゴリズムをどう作るかの勉強をしっかりやりましょう.というか,情報系学科におけるほとんどすべてのカリキュラムはひたすらそのために組まれているものと思います.


アルゴリズムってじゃあどうやって勉強すれば良いんだという話ですが,アルゴリズムと一口に言ってもきわめて広範で奥が深いこと日本海溝のごとしですから,なんとも一口には言えません.京大情報学科の場合一回生でSICPなる教科書をやりますが,アルゴリズム初学者にはいささか不親切な教科書ですから,これが第一におすすめというのはなかなか言えません.アルゴリズムの勉強はどうやら世間的には多少プログラミングに慣れ親しんだ人がよりステップアップするためにするものらしく(いや,全然世間のことなんて知りません.すいません),アルゴリズムをたたき込んで,その実現手段としてのプログラミングを学んでいくという正攻法は逆に難しい傾向にあるというか,理想論ですらあるかもしれません.かといって目的もなくプログラミング言語を学んだところでアルゴリズムを必死で考える問題に相対することも半年や一年では少なかろうと思います.ですからまぁ基本的にカリキュラムに従って,単位をきちんと取っていればそれ以上のことはまぁ研究室入ってからだねという感じだと思います.よりステップアップしたいならSICPの演習問題をひたすら攻略するも吉,アルゴリズム関係の本はごまんとありますからそれらに当たって見るも吉.アルゴリズム関係の本は,たとえばhttp://d.hatena.ne.jp/yaneurao/20050522なんかで紹介されています.


他にもどのプログラミング言語を勉強しておけばいいか,とかそういう悩みもあろうかと思いますが,基本的にどれ!と言いきることもなかなかできません.ただ,C,JavaScheme(Lisp)の三つを軽く押さえておけば後は問題なかろうと思います.だいたいこの三つを覚えておけば,あとは方言みたいなものです.よくプログラミング言語で10や20の言語を平気で扱う人がいますが,これは単に方言をたくさん覚えているだけの話(というのも失礼ですが)で,普段は標準語でしゃべるけど大阪弁も九州弁も東北弁も話せまんがなとこういう訳です.


情報系学科に入るのにコンピュータに詳しくある必要はありません.コンピュータを見るのが死ぬほどイヤ!とかスイッチの入れ方もわからん!ってのはどうかと思いますが,そういうレベルじゃなくても普通にこれまでパソコンなどとつきあってきた人なら十分に大丈夫です.またプログラミング言語に詳しくある必要もありません.非常に誤解が多いのですが,どのプログラミング言語を使うかは,結局の所,母語をどの言語に訳すか程度の差異であり,訳しやすいか訳しにくいかの問題でしかありません.どの言語に訳しても基本的にコンパイラさえなんとかなれば計算機は処理してくれます.母語できちんと作文ができれば全く問題ないのと同じで,アルゴリズムをきちんと書ければ,プログラミングの力は後からついてきます.あと自分専用のコンピュータが有った方がいろいろ実験できて楽しいけど,別に必ず必要というものでもないと思います.だいたいどの大学にも学生用コンピュータは解放されてると思いますし.だいたい,学生一人一人にコンピュータがなければ情報系学科にいけないってんならメインフレームの時代はどうしてたってんですよね.


まぁここまで読んでなんのこっちゃわからんという人は,線形代数の勉強だけ最低限してれば,なんとかなると思いますよ.あといくつかTipsを言っておくと,京大において前期で線形代数微積かその両方を落とした人は,後期に再履修の講座があるので,それを取りましょう.再履修とってる人曰く簡単らしいですよ.それとレポートはちゃんと出そうね.授業はきちんと出席しましょう.そんな感じ.誰が読むんだこれ.