前書き

『Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ』(東京大学出版会)

  • 2019/09/30
Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ / 森畑 明昌
Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ
  • 著者:森畑 明昌
  • 出版社:東京大学出版会
  • 装丁:単行本(240ページ)
  • 発売日:2019-09-24
  • ISBN:413062458X
内容紹介:
プログラミングの基本とともに情報科学の基礎を,Pythonを用いて学ぶテキスト.データ処理・AIなどの話題を扱い,基礎から本質までを学ぶことができる.
IT系技術者だけでなく、様々な進路に進む人々が広くプログラミングを学ぶことにはどのような意味があるのか。プログラミング言語の研究者である著者が、大学の情報科学の教科書に込めたメッセージを、本書冒頭の抜粋再構成の形で紹介します。
※文中の〔…〕は中略した部分です。

はじめに

本書は、プログラミングの基本を習得するとともに、プログラミングを通して情報科学の基礎を学ぶための教科書として執筆した。現代において情報科学の基礎は必須の教養となっているが、これを学ぶ際にはプログラミングを併せて学ぶことが強く望まれる。本書で学ぶような計算量や数値誤差といった内容は、座学で聞くだけではなかなか実感がわかないが、少しプログラムを書けば身につまされるものとして体験できるからである。しかしながら、既存のプログラミングに関する教科書は、特定のプログラミング言語の機能とその利用法を知るような方向性に進みがちで、情報科学の教養を得るには適切でなかった。本書は逆に、情報科学の基礎を学ぶ、そのために必要最小限のプログラミングを学ぶ、という内容となっている。ただし、プログラミングの教科書としても有益であるよう、言語によらず重要なプログラミング上の概念、たとえば正しさの確認やモジュール化など、についてはできる限り盛り込んだつもりだ。

プログラミング言語としてはPythonを用いる。Pythonは世界的に広く使われている言語ではあるが、本書で採用したのは以下の理由から初学者にとって有益であると考えたためである。まず、開発環境やライブラリなどがよく整備されていること。特に、Anacondaパッケージにより、計算機環境によらず、ほぼ同じ状況でプログラミングができる点は大きな長所である。さらに、比較的高水準な記述が可能であり、初学者が躓きがちな「最低限のプログラムを動かすための、初学者にとって意味不明な記述」がほとんど不要であること。なお、Pythonを用いてはいるが、Pvthon特有の機能はほとんど使っていないため、他の言語を学習する際にも十分参考になる内容となっている。

本書の主たる読者としては大学の教養課程の学生を想定している。そのため、一部の内容には高等学校程度の物理学や微分積分学、統計学の話題が登場する。とはいえ、各分野についての深い知識はまったく不要である。また、情報系技術に関わることになった社会人の方にとっても、基礎から本質までを学ぶことができるものだと自負している。〔…〕

なぜプログラミングを学ぶのか

もしあなたが将来プログラマやITエンジニアになりたい場合、プログラミングを学ぶのにそれ以上の理由はいらない。しかし、多くの人はそんなことはないだろう。IT系以外の職業を考えていたり、または将来のことはまだ決まっていなかったりするのではないだろうか。そういう人には迷いがあると思う。自分にはプログラミングを学ぶ必要があるだろうか?

私は、ほとんどの人にとって、プログラムを学ぶ意味はあると思う。言い換えれば、プログラムを学んだことは、その後の人生に何かしら活きてくると思う。とはいえもちろん、プログラミングが全人類に必須だということはない。プログラミングに関する状況は、日本で生活する人にとっての英語学習に比較的近い、というのが私の意見だ。

日本ではまったく英語を使わなくても普通に生活してゆける。その一方で、日本の外にはさまざまな国があり、私たちは少なくとも間接的にはそれらの国の組織や人と深い関わりをもって生活している。〔…〕つまり、私たちが直接英語を使っていないとしても、誰かが代わりに英語を使っていて、そのおかげで今の私たちの生活は成り立っている。これは比喩でも何でもなく、今や外国との交流や貿易なしには社会全体が立ち行かないようになっているのだ。〔…〕。

プログラミングについても状況はよく似ている。ただし、プログラミングによって意思疎通できるのは外国の人ではなくコンピュータだ。現代社会はあらゆるところでコンピュータを利用しており、もはやコンピュータなしなど考えられない。このコンピュータ、いろいろな仕事を緻密にやってくれる、人類にとって非常に信頼できる相方なのだが、残念ながら日本語や英語を解さない。彼ら彼女らとはプログラミングを通してしか会話ができないのである。

プログラミングを学べば、コンピュータと直接話ができるようになる。これはとても大きなメリットだ。〔…〕しかし、すべての人類がコンピュータと直接話をできなくてもかまわないだろう。大事なことは、コンピュータについて知ることだ。彼ら彼女らはどんな生活を送っていて、何が得意で、何が苦手なのか……。そういうことを知ることで、たとえば、コンピュータと関わっている人たち(つまりプログラマやITエンジニアなどだ)に仕事を依頼したりする際に、やり取りがスムーズになるだろう。

とはいっても、プログラミングを学ぶことが将来にわたって永遠に役立つとは限らない。たとえば、自動車の内部構造は一昔前は免許取得にも必須の知識とされていたが、今はそれほど重要視されていない。自動車の内部がほとんどコンピュータ制御になってしまい、内部構造の知識は適切な運転や故障対応に以前ほどは役立たなくなってしまったからだ。同様に、コンピュータが今よりもっと社会の奥深くに息づくようになり、人類がコンピュータと間接的にしか接しなくなってくると、おそらくプログラミングを学ぶ意義は下がってくる。しかしそれまでは、プログラミングを少しだけ学んでおくことは、現代社会をよりよく知りよりよく生き抜くことにつながると思う。

プログラミングの学び方

プログラミングは英語と似た状況にある、と先ほど述べたが、学び方も似ている。プログラミングは語学であり、まさしく語学のように学ぶ。まず最初は基礎的な単語や例文を学ぶことになる。この段階では多少の暗記が必要になる。それが終われば、とにかくできる限り多くの文章を書いたり読んだりすることが重要になる。この際には、先生やネイティブからのフィードバックを受けることが望ましい。これに加え、余裕があれば海外の文化や習慣——コンピュータの場合、コンピュータそのものの構造(コンピュータアーキテクチャと呼ばれる)やその上で走っているオペレーティングシステムなどの基盤ソフトウェアについての知識などに対応するだろう――を学ぶことができれば望ましい。

〔…〕プログラミングに用いる言語であるプログラミング言語は、英語などの人類が日常的に使っている言語(プログラミング言語との対比では自然言語と呼ぶ)に比べて圧倒的に簡単だ。〔…〕そもそも、プログラミング言語は人類とコンピュータが簡単に意思疎通をするために人工的に作られたものなのだから、人間にとって簡単でなければ本末転倒なのだ。〔…〕

もう1つ大事なことは、1つプログラミング言語を学べば、他の言語も比較的簡単に習得できるようになる、ということだ。自然言語の場合「将来使うかもと思って必死に中国語を学んだら、仕事で必要になったのはフランス語だった」というようなことが起こりうるし、そのときに中国語の経験はフランス語にはそれほどは活きないだろう。その点、プログラミング言語は異なる言語でも基本的な部分はよく似ていることが多く、1つの言語を学ぶと類推で他の言語のこともある程度わかるようになる。だから、とりあえず1つ言語を学んでおく、というのは無駄にはなりにくい。

プログラミングを通して見えてくる世界

プログラミング言語の語彙や文法を学ぶことは手段にすぎない。より重要なのは、学んだ言語を活用して何をするかだろう。〔…〕本書ではプログラミングを通してコンピュータは何が得意で苦手かを学ぶ。たとえば、コンピュータについて以下のように思っていないだろうか?


◇コンピュータは正確無比である。特に計算は絶対に間違えない。

◇コンピュータは猛烈な速度で処理を行う。高性能なコンピュータならなおさらだ。


これらは、完全に間違いとは言えないが、どちらかと言えば誤解に近い。

コンピュータによる処理が正確だというのは、さまざまな理由でかなり不正確だ。まず、コンピュータを操作するためにはプログラムが必要だが、正しいプログラムを作るのはかなり難しい。これはプログラマの技量の問題ではない。実際、歴史をひもとけば、有名企業や大規模プロジェクトで開発したプログラムが間違っていたために起こった大惨事を多数見つけることができる。次に、コンピュータは原則として計算を間違える。たとえば、ほとんどの場合、コンピュータは0.1+0.1+0.1=0.3という簡単な計算すら失敗する。さらに、多くのプログラムは正確に結果を求めることを最初から諦めている。これは気象予報や自動運転、最新の人工知能であっても同様だ。この理由は2点目の誤解と関連するが、本当に正確に結果を求めるのは時間がかかりすぎることが多いためだ。いずれにせよ、コンピュータの出した結果は手放しで信頼できるものではない。特に、自動運転や医療診断など、誤りの絶対に許されない用途にコンピュータを使う際には、これは本当に深刻な問題となりうる。

また、コンピュータが高速に行うことができる処理はそれほど多くない。私は知人から「なぜチェスの最善手順を解析するようなプロジェクトが起こらないのか。チェスなんて8×8の盤面しかないのだから、現代の高性能なコンピュータに十分な時間を与えれば解析できるはずだ」というようなことを言われたことがある。このプロジェクトが現実的かと言われれば甚だ怪しい。チェスの最善手順を求めるのはコンピュータにとって「原理的に難しい」問題の典型例であり、8×8=64マスごときの盤面ですら完璧に扱うのは不可能に近い。そのため、最先端の人工知能であっても、このような場合には「最善」を求めるのは諦めている。チェスに限らず、コンピュータを使って人間が扱いたくなるような処理のうちかなりの部分は、コンピュータにとって「原理的に難しい」問題だ。その種の問題には、コンピュータの性能が上がっても到底解消できないほどとてつもない時間がかかってしまうのだ。以上のような状況は、情報科学の基礎を少し学べば理解することができるし、少しプログラムを書けば体験することもできる。本書でもこの状況を学ぶとともに、これらができる限り深刻な問題とならないよう、以下のアプローチでプログラミングに挑む。


◇プログラムの正しさをよく確認する。原理的に正確な結果とならないプログラムでは、どの程度不正確なのかも考える。

◇そのプログラムが現実的な時間内にどの程度の規模のデータまで扱えるか確認する。小さなデータしか扱えない場合、よりよい方法がないか模索する。


これにより、コンピュータの欠点や苦手な部分を私たちがある程度フォローできる。これは、コンピュータという異邦人をより理解し、よりよく付き合うことにつながるはずだ。

[書き手]森畑明昌(東京大学准教授・情報理工学)
Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ / 森畑 明昌
Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ
  • 著者:森畑 明昌
  • 出版社:東京大学出版会
  • 装丁:単行本(240ページ)
  • 発売日:2019-09-24
  • ISBN:413062458X
内容紹介:
プログラミングの基本とともに情報科学の基礎を,Pythonを用いて学ぶテキスト.データ処理・AIなどの話題を扱い,基礎から本質までを学ぶことができる.

ALL REVIEWS経由で書籍を購入いただきますと、書評家に書籍購入価格の0.7~5.6%が還元されます。

関連記事
東京大学出版会の書評/解説/選評
ページトップへ