とらりもんHOME  Index  Search  Changes  Login

とらりもん - なぜプログラミングを学ぶのか Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

筑波大学農林工学系 奈佐原(西田)顕郎

!なぜプログラミングなのか?
本格的な数値解析には、表計算ソフトは不向きである。理由は、

* 計算速度が十分ではない。
* 多次元の解析が困難である。(例:3次元空間内の拡散現象の解析)
* 結果の表示機能が十分ではない。
* 複雑な処理の実装が難しい。(例:条件分岐やiteration)
* 並列計算機などの大規模な計算環境に持っていけない(スケーラビリティが無い)

などである。

 そこで、本格的な数値解析をするときは、計算機言語を駆使してプログラムを組むことが必要になる。

 実際は商用の専用ソフトを使うことも多い。しかし、商用ソフトは高価だし、仮に高価なソフトが使えても、実際には、ある程度のプログラミング的な操作が必要であることが多い。

 一方、世の中にオープンソースと[[オープンソース]]と呼ばれる無料のソフトが多く存在し、様々な解析に使える。オープンソースは[[オープンソース]]は、改造・改良を自由に行うことができる。その利点を享受して、自分の目的に特化した環境を構築するには、やはりプログラミングのスキルが必要である。

!既存のソフトを使いこなすだけではダメなのか?
 プログラミングの習得には時間がかかるし、独特の思考力が要求されるので、苦手な人は避けて通りたいだろう。はっきりいって、プログラミングができなくても生きていける。しかし、それでも、若い人には、プログラミングにチャレンジしてほしい。

 例えば、料理ができなくても生きていける。いまどき、安い外食もコンビニ弁当もある。家族の誰かがいつも手料理を作ってくれる場合もある。それでもやはり、料理のスキルは、ある方がいいだろう。なぜならば、それによって「選択肢」が広がり、「判断力」が上がるからである。

 料理ができれば、コンビニやお母さんがいなくても、材料と道具さえ用意すれば食事ができる。それは野外調査で役立つし、健康的・経済的に自活することができる。つまり、選択肢が広がるのである。また、料理ができれば、誰かが作った料理がどのような材料からどのように作られたかをある程度、推定できる。それによって、作った人の腕前や気持がわかる。その結果、値段に見合った料理の選択をすることができるし、それによって客人を適切にもてなすこともできる。つまり、判断力が上がるのである。

 同様に、プログラミングができる人は、選択肢と判断力を持っている。例えば進学・就職・留学した先で、自分が使い慣れた商用ソフトが整備されていなくても、必要なプログラムを自分で組んで代用することができるかもしれない。教育や販売などで、特定の機能・作業環境を多くの人に提供しなければならない場合、商用ソフトに頼らないでソフトを自作することで、コストを大きく下げることもできる。職場で先輩が組んだプログラムを修正・改良することもできる。職場で何かのソフトを購入しようとするとき、その値段が妥当かどうかを判断できる。商用プログラムを使うときも、どういう処理を行うと時間や容量を喰うのかが判断できる。

!自由と教養について
 こういうことの結果は、一言で言えば、「自由」である。多くの選択肢を持ち、判断力のある状態を、「自由」と呼ぶ。自由を獲得するためのスキルを「教養」という。

 教養があっても、それだけでは生きられないし、逆に、教養が無くても生きていくことはできる。多くの製品やサービスがブラックボックスとして提供されている現代では、その傾向が顕著である。もちろん、様々な製品やサービスが提供されることでて社会は発展し、便利になる。しかし、社会全体が、それらに頼らねば全く何もできない人ばかりになってしまうと危ない。社会を変革し、改良し、補強するには、選択肢と判断力を持つ自由な市民が必要である。同様のことが、企業の中でも言える。既存の環境の中で、タスクとして完全に整備された仕事をこなす人も必要だが、様々な選択肢と判断力を持って、組織のフレームや仕事のフレームを変革する人も必要である。単純作業の機械化・IT化がどんどん進む現代では、後者の必要性が高まっている。

 教養は、すぐに役立つものではない。無論、それぞれのスキルは、つきつめれば十分に役に立つ。例えば料理の腕を磨けば料理人として自活できるし、プログラミングに秀でることができればプログラマになれる。語学ができれば通訳や翻訳家になれるだろう。体育ができればアスリートになれる。しかし、そういうプロへの道はとても険しい。なので、多くの人は、「自分はどうせプロにならないから」という理由で、それらの習得を重要とは思わない。しかし、プロにならなくても、上述の理由で、これらの教養は「役に立つ」のである。

 教養を習得できるのは、人生の中で、とても短い時間である。大人になってしまうと、日々の生活に速攻で効くことしか習得できなくなる。それは時間がなくなるせいでもあるし、頭が固くなるためでもある。

!教養主義について
 しかしながら、教養を獲得することは人生の目的ではない。いつかは「教養だけの習得」に別れを告げて、何らかの道に打ち込み、プロにならねばならない時がやってくる。そうしなければ社会の中で自活できないからである。それを専門分化と呼ぶ。

 ところが、教養はとてつもなく広く、深いので、人によっては、専門分化を拒み、教養にトラップされてしまうケースがある。そういう状態を「教養主義」という。一種のモラトリアムである。教養主義は、「何でも知っている状態」を指向し、「何でもできる状態」を憧れる。芸術・工学・科学に万能の才能を発揮したレオナルド・ダビンチに憧れ、無人島に漂着しても独りで生きていくロビンソン・クルーソーに憧れるのである。

 万能を志向することは人間の向上心として自然なことだし、悪いことではない。しかし人生は有限であり、社会の少なからぬ部分は、中途半端な万能主義者ではなく専門分化したプロが協力して運営している。つまり、バランスや見極めが大切である。人には向き・不向きもあるので、いかに「教養」であっても、自分に向かないものは、どこかで諦めてしまっても良い。他の教養や専門分化によってカバーできればよいのである。専門バカになってはいけないが、万能バカ(器用貧乏ともいう)になってもいけない。

  教養主義が矮小化されて現れることもある。本来の教養は、それほど簡単に習得できるものではなく、学習の積み重ねが必要である。しかし、上手な教師が、特定のケースに絞って、具体的にやさしく噛み砕いて説明すれば、多くの事項は初学者にも理解可能である。概論とか入門とかの名のついたレクチャーはそういう場である。そういうレクチャーをたくさん受講すれば、なんだか教養がついた気になるし、確かに知識は増えるし、世の中の見方も柔軟になる。しかし、そういうものは、選択肢を広げ、判断力を高めるツールとしてはあまり役に立たない。

例えば料理を習おうとすれば目玉焼きくらいはすぐに作れるようになるが、目玉焼きを作れることが、「料理ができる」という意味においてどれほどの意味を持つだろうか。無論、全く何も作れないよりはましである。しかし、あるていどの料理を、レシピを参考にしてでも、適切な材料と道具を用意して、まがりなりにも最後まで、しかもそこそこおいしく作れてこそ、いろんな場で選択肢と判断力の源として役に立つのである。そのためには、いくつかの基本的な調理技術と知識と経験が必要である。

 そのような、基本技術・基本知識・経験は重要である。ところがそういうことは得てして退屈だし、習得に時間がかかる。だからといって、概論や入門だけを渉猟していては、そのようなものは身につかない。本来、教養とは(プロフェッショナルに較べて)中途半端なものだが、そんなことでは、さらに中途半端な、まるで「教養」の名にも値しない「体験」の集積になってしまう。単位コレクターや、資格マニアと呼ばれる人々は、そのへんを反省しないと、いかにまじめで好奇心旺盛であっても、なんか「ぱっとしない人」になってしまうおそれがある。

 要するに、「あまり手を広げないで、大事な事柄を自分で選んで、基本からしっかり、粘り強く勉強する」ことが大切なのである。

!何を勉強するか
 前置きがとても長くなったが、教養としてプログラミングを勉強するときに、対象は注意深く選ばねばならない。複数の対象を「あれもこれも」と選択することの危険性は上述したばかりである。具体的には、以下の2点を注意すべきである:

1. 汎用性の高いプログラミング言語を学ぶこと。

 汎用性とは、どこでも、どんなことにも使える、ということである。教養は選択肢を広げるものであるので、選択肢になりえるもの、つまり汎用性の高いものを学ばねばならない。世の中には、学びやすい(わかりやすい)プログラミング言語が存在するが、汎用性に乏しいものが多い。汎用性のためには、多少、習得が難しくてもがまんしよう。そのような理由から、BasicやPascalは対象外となる。これまでに組まれたプログラムを修正・改良するという点では、大規模システムの開発にあまり利用されていないrubyやawkのようなスクリプト言語も、残念ながらとりあえずは対象外となる。(ただしawkはテキスト処理や単純な計算には非常に有用である。)

2. 汎用性の高い環境で学ぶこと。

 特定のシステム(環境)の上でのみ通用するプログラミングは、上述の理由で不適切である。たとえばMS-ExcelなどのMS-Office製品の上でのみ動作するVBAという言語は、いかにMS-Officeが世間で広まっていても汎用性は無い。VBAの仕様はマイクロソフト社が独自に決定し、いつでも変更できるので、いまVBAを習得しても、いつそれが使えなくなるかわからない。Visual-Basic, Visual-C++, C#などの言語も同様である。汎用性の観点で重要なのは、グラフィック環境(GUI)である。GUIを駆使した「統合開発環境」と呼ばれるプログラミング支援ツールは、便利ではあるが、システムによって仕様が異なることが多い。したがって、そういうものになるべく依存しない、テキスト環境でのプログラミングを選択しよう。

 これらを勘案すると、選択肢は、FORTRAN, C, Java, Pythonくらいに限られよう。それぞれの特徴を以下に述べる:

[[FORTRAN|http://ja.wikipedia.org/wiki/FORTRAN]] ... 古くから科学技術分野で多用されてきた、実績のある言語である。BASICに構造が似ており、比較的、初心者にとっつきやすい。コンパイラとしては、 FORTRAN77という規格にはg77, Fortran90にはgfortranというフリーの環境がある。OSなどのシステムの開発にはほとんど使われない。

[[C|http://ja.wikipedia.org/wiki/C言語]] ... FORTRANよりは新しいが、実績のある言語である。何でもできてしまうために、誤った記述をしてもそれなりに動いてしまい、エラーの発見が難しいので、初心者にはとっつきにくい。コンパイラは、フリーのgccという環境が普及している。OSなどのシステム開発にはよく使われている。

[[Java|http://ja.wikipedia.org/wiki/Java]] ... SUNという会社が開発・公開している、新しい言語である。どんなシステムでも、その上で共通規格の仮想コンピューターを構築し、その上でプログラムを走らせるため、汎用性はとても高く、OSに依存しないプログラミングが可能である。その反面、仮想コンピューターを走らせるために計算資源を消費するため、動作は概して遅い。コンパイラや実行環境はSUNが無料で配布している。

 この実習ではCを学ぶ。上の3つの言語の中で、私自身がいちばんよく使うのがCだからである。