僕はアメリカの大学でコンピューターサイエンス学部に入り、その後他の学部に転部しました。
転部した理由はシンプルに挫折したことと、学べる内容が自分の思っていたものと違ったからです。
その経験を元に僕がアメリカの大学に入る前に知りたかったことを書きたいと思います。
抽象度の高いアルゴリズムへの耐性はあるかい?
大学にもよると思いますが、一番最初にプログラミング言語そのものを学習した後、次に学ぶものはアルゴリズムやデータ構造になります。
アルゴリズムとはプログラムを書く際にどういう風な手順で計算をさせるかのことです。
例えば、RPGゲームで10歩先に落ちているみかんを拾うことをアルゴリズムに落とし込むとします。
一歩前に進む → 一歩前に進む → ... → 一歩前に進む → 地面にあるものを拾う
になります。
ですが残念ながらシステムを組む場合、これがベストの状態とは言えません。なぜなら"一歩前に進む"が多用されており、コードも読みにくく、もし他の場所で3歩先に落ちているみかんを拾うアルゴリズムが必要になった時コードを使い回せないからです。
この場合、以下のように考えると尚コードの行数も異なりスマートです。
n=10
n回 "一歩前に進む"を繰り返す → 地面にあるものを拾う
などのようにコードを効率化したり、有名なアルゴリズムを理解したりが必要になります。上記のものであればゲームのキャラクターがただ歩くものをイメージできるのでハードルが下がりますが、実際にコードを書くときは目に見えないものを自分でイメージしたり、あるいはイメージできずに理解してコードを書いていく必要があります。
以下が典型的なアルゴリズムやデータ構造になりますので、興味がある方はご覧ください。
プログラミングを学ぶ理由は?
大学でコンピューターサイエンスを学びたい理由はなんでしょうか?
僕の知る限り以下の3パターンかなと思います。
1、プログラムを書くことがとことん好きな人
2、プログラミングを通して何かを作りたい人
3、コンピューターサイエンス学部を出ると就職に困らず高給取りになれと聞きつけた人
1の人は人並み苦労はするかもしれませんが好きなことをできているので、楽しみながら苦労を超えていけばいいと思います。
3の人もコンピューターサイエンス学部卒が経歴としてはいいので、将来のお金や安定性をモチベーションに頑張れるなら、それでいいと思います。
問題は2の人です。何かを作りたいかは今明確にできるなら明確にしておくことをおすすめします。
例えば、もしwebサイト、スマートフォンアプリを作りたい場合、コンピューターサイエンス学部を卒業する際にはそれらの作り方を学ぶことはできません。ただし、コンピューターサイエンスの学位を取れる人なら独学ですぐ作れるようになると思います。
コンピューターサイエンス学部ではあくまで、できる限りライブラリーやAPIを使わずかっちりしたシステムを作る勉強をします。
僕の大学なら、webサイトやモバイルアプリの作り方を勉強したい人はDigital Media Arts学部のWeb Design Concentrationなどにいくと具体的にどうやって作るかを勉強できます。
他の例で、ある学際領域×ITで何かをしたい場合もコンピューターサイエンスの学位は必須ではないかもしれません。
大学によってはBioinfomatics(生物×IT)のような学部があったりするので、そういうところに入るとミスマッチが起こらず済むかもしれません。
人によってはシステムそのものからガッチリ勉強したい人もいると思うので、一概には言えませんが、コンピューターサイエンス学部の最初の授業でプログラムの書き方さえ身につけてしまえばそれ以外は自分の作りたい、応用したいものにフォーカスすることが早道かもしれません。
卒業できるならしておこう!
1~3のいずれの人でも、できるならコンピューターサイエンス学部を卒業した方がいいとは思います。
まず潰しが効くからです。アメリカの高給なソフトウェアエンジニアの仕事につきたい時、コンピューターサイエンス学部卒の学歴はめちゃくちゃ有利ですし、選考でアルゴリズムやデータベースのコーディングテストもあります。
もう一つの理由はやっぱり知っておくことに越したことはないからです。
僕の体験談ですが、とあるゲームを作った時コードがかなり長くなってしまい、ずっともっと短く書けるのではだったり、うまい処理の方法があるのではと思いつつも、それがあるのかないのかすら分からずコードを書き続けました。
上みたいに、ループの知識がないと"前に進む"を10回書かないといけないのです。それがベストな書き方かどうかも知らずに。
最後の理由で僕はコンピューターサイエンス学部を去った後もアルゴリズムは勉強しており、このブログはその学びのアウトプットの場でもあります。
少し長ったらしい文章になりましたがお役に立てれば幸いです。