大学で学ぶプログラミングとは

プログラム

今やプログラミングは小学校から学ぶという時代なのに、大学までいって学ぶプログラミングって何なんだろう?

ちょっと前まではプログラミングは、本当に興味をもった学生のみがかじっており、下手すればオタクといわれ、ちゃんと学問として学ぶのは高専や大学からというものでした。その大学でプログラミングを中心に学ぶのは工学部にあたるのですが、大学により違いがあるとはいえ情報工学という学問がそれにあたります。

そこでは何を学んでいるのでしょうか?かくいう僕も純粋な情報学科ではないけれど、電子工学科としてコンピュータ関連の知識を学んできましたので、ちょっと古い情報になりますが、そのあたりをお伝えしてみたいとおもいます。

まずはコンピュータ基礎

大学の場合、たいてい1年目は教養ということで情報関連の授業はなく、おおよそ2年か3年くらいから学ぶことが多いのではと思うのですが、まずコンピュータというものが0と1を理解することで成り立っているというところからスタートして、この0と1は電気が流れている状態とそうでない状態で表せること。それを使って論理回路(AND/OR/NAND/XOR回路)や結果を保持するフリップフロップというものを勉強していきます。以下の図のようにAとBから0や1にあたる電流を流すと、回路によってどういう結果がでてくるかということですね。

そしてそれらを組み合わせると最終的にはCPUやメモリが作れるというところを勉強していき、CPUの中身には命令レジスタがあったり、キャッシュがあったりするという原理、メモリのアドレス管理などといった形でコンピュータというものがハード的にどういうものなのかということを理解していきます。加えて2進数の特徴(1の補数や誤差)などを勉強したりします。

なお一年は教養といいましたが、ここでも微積分、物理学を高校以上にさらに深めたり、線形代数学を学んだりします。これが、のちに高度なプログラムを書く上での基礎知識となります。

大学でのプログラミング授業

コンピュータの基礎が終わりプログラミング授業にはいると、だいたいはC言語が選ばれるんじゃないでしょうか、というのもC言語は一番よりコンピュータに近い言語と言われ、ちゃんとメモリ管理とか、変数の型の宣言などをしないと動かないからです。その分、高速に動き、よりハードウェアを管理できるという特徴があります。そして、大学では学びを重視するため、ライブラリを使って簡単に仕上げるよりも、自分で関数を作って頑張ってプログラムを一から組み上げるという傾向があるような気がします。プログラムの世界では既に過去に作り上げたものを再びつくるのは車輪の再発見といって馬鹿にされるのですが、そんなことはお構いなしに勉強のためだと根気よく1行1行プログラムを書いてきます。そして、様々な古典的なアルゴリズムも勉強して解を最短手順で探すためのプログラムの書き方を学びます。

プログラミング+アルファ

プログラミングを学ぶ情報工学は工学部の中でも電気・電子を扱う学科であれば全般的に勉強すると思うのですが、情報工学でコンピュータの基礎を学びながら、学科の特徴となる学問を学び、それと組み合わせていくことになります。

例えば

電子科=情報工学+弱電知識(電子回路/半導体工学/量子力学/超音波etc)

電気科=情報工学+強電知識(電気回路/発変電工学/送配電工学/プラズマetc)

機械科=情報工学+機械知識(機械工学/材料工学/工学力学/熱力学/製図etc)

 

カリキュラムは大学によって異なると思いますがイメージこんな感じです。詳しく知りたい人は”電子工学 カリキュラム”などで検索してみてください。

私は電子関係の学科だったので、情報工学に加えて半導体のことや、半導体には欠かせない量子力学、それからデジタルアナログ変換や周波数フィルタ、三層モータ構造、制御工学、電気回路などを学びましたね。電子科と電気科は結構近いことを学ぶと思います。

 

なお情報工学科と情報を主体的に学ぶ学科の場合は情報工学をさらに深めるような、ことを勉強します。例えば、数値解析、時系列解析、統計学、データマイニング、言語処理系論、オートマン理論などなど最近話題のAIやビックデータに直結しそうな学問を勉強することになりますね。

 

これはまさに理系の大学である、東京理科大学の情報工学科のカリキュラムです。参考まで

教育/学部・大学院|ACADEMICS|東京理科大学
東京理科大学の学部・学科、大学院、専門職大学院のご紹介です。

 

このプラスアルファな知識(正確には情報工学科以外は、電子や電気が主で情報工学が従だと思いますが)が、単にプログラムを学ぶということではなく、良いプログラムを作る上での重要な知識になります。

 

UnixやLateXなど研究に必要な知識も

同時にUNIXと呼ばれるワークステーションの操作を覚えることが求められます。あと理系ということで論文を書くためにLateX(ラテフ)やMathematica(マセマティカ)という、ソフトウェアの使い方を覚えさせられるかもしれません。Wordでいいじゃんって思うのですけど、数式を使うぶんにはLateXを使いこなした方がキレイにかけるんでしょうね。ただ、これは大学によって、また時代によって異なると思っており、より実戦的な学びを優先する大学ではどんどんJavaやPythonなどの使われている言語をかなり早い段階から取り入れ、ライブラリをガンガン使ってているところもあるでしょうし、論文もWordで済ませているというところもあるでしょう。

 

授業というスタイルで学ぶのは3年まで

大学の場合、先に述べたとおり1年は教養、専門は2年からというケースが多いのですが、専門授業は2~3年の間だけで、4年に入ると研究室配属になり、その研究室で研究していることを中心にやっていき授業はほぼなくなります。例にあげた東京理科大のカリキュラムでも4年次は卒業論文となっており、つまり研究に没頭しろというスタンスです。

大学で学ぶ授業はお堅いものが多いけど、研究室に入るとより具体的になります。研究室はまさに最先端を行くわけですから、結果をだすためにC言語でなく、よりそのハードを制御するために特化したプログラミング言語をつかったり、先行して開発されたライブラリが多い言語を選ぶことがあります。場合によっては自ら言語を開発して取り組むということもあるでしょう。

 

大学で情報工学を勉強する意味

このような形の授業が大学で学ぶ情報工学の一例かとおもいますが、単純にプログラマーになりたくてプログラミングを学ぶだけならば、正直、大学に行く必要はないかと思います。電気工学知識、電子工学知識、機械工学知識なんて不要です。情報工学科という専門学科を選んだとしても単にプログラムを書くというスキルを身につけるだけなら成人向けのプログラミング言語教室にいったり、就職して実際にプログラムを何本も書く方がずっと力はつくでしょう。

 

では大学という教育機関があるのは何故でしょう。

一つはその大学を卒業したという卒業証書に価値があるというのもあり、いくら、いい会社にはいってもいつどうなるかわからないご時世、安定企業神話は最早ないといっても、日本では勉強を頑張る=いい大学に入る=安定したいい会社に就職=いい人生が過ごせるという図式はそう変わるものではありません。特に理系の大学生は就職が有利であったり大学によっては有名企業への教授推薦がある場合も見受けられます。

それが結論だと悲しいですが・・・

ちゃんとした答えを出すとしたら僕は大学でコンピュータの基礎を学ぶことで壁にぶつかったときのアプローチが変わるかと思っています。

 

例えば医者でも眼科、皮膚科、耳鼻科と専門がわかれているように、プログラマーを含む情報処理/IT関係は非常に専門性が高い分野になっています。Web系のプログラムを専門にやっている人と組込系のプログラムをやっている人は畑が違ってなかなかお互いに勝つことはできません。

そうはいっても、医者のように一旦、人間の体ってどうなんだという基礎を学ぶことで、原因不明の病気にぶち当たった時に、原理原則から考えることができます。例えば、ぽっと眼科になって目が見えなくなってきているという症状の人が来た時に、それが糖尿病から来るものだと理解するのは、前提として体全体のことを学んでいたからでしょう。

 

情報工学もそうかと、ぱっと組込系のプログラマになっても、コストやサイズの観点でメモリが非常に小さく、その限られたメモリの中で要求する機能を実現するためには、より効率的にハードを制御できる言語を選択し、その言語を使うにあたってコンピュータの仕組みというものを理解していないといけないことがあります。そして、何よりも数学をより深く学ぶことが大学での価値であると思います。革新的なプログラムを書いたりするには、数学の要素がすごくかかわってきます。特にセキュリティや人工知能の分野では顕著に現れます。これが大学・専門まで行ってプログラムを学んだものとそうでないもの違いにあたるのではないでしょうか。

 

ちなみに僕の大学卒論は、雲が多いアマゾン地帯のジャングルの木々の下に隠れた川を人工衛星の赤外線画像をもとに検出するという研究でした。

そこでは衛星画像を一定のマス目に細分化して画像の濃度を数値化(デジタル化)、それを一定の計算式を介してさらにある閾値をもって切り捨てたり、近似値で単純化して画像のコントラストを強調したり、ノイズ除去したりするといった手法をとり、それを実現するプログラムを書いていました。(この画像が僕の学生時代の論文)

 

 

このように数学式をもとにプログラミングを作り込むということを大学では頻繁にやります。僕の場合はそんなに大した数式ではないのですが、先に書いたとおりセキュリティの暗号化技術やAIのディープラーニングなどはさらに複雑な式がでてくることでしょう、その時に微積分や線形代数、さらには情報工学系でならう高度な情報処理理論をしっていることで、それをプログラミングに取り入れることで誰も考え付かなかった画期的なプログラム、システムを作ることにつながる(可能性がある)ということが大学で情報工学を学ぶ大きな強みになると思います。

 

なお、また別途お話をしますが、単にプログラマーといってもこういう高度なプログラムをかける人材と単に言われたどおり(仕様通り)のプログラムを書く人材にわかれます、前者と後者の給料や待遇は雲泥の差。このブログをふくめプログラミングの華やかなところばかりを強調していますが、実はそうではない部分もあります。それはまた別の機会に。

今日はそんなお話でした。

コメント

タイトルとURLをコピーしました