なぜプログラミングを習うのか

プログラミングを学習するモチベーションには様々なものがあります. 人工知能に興味がある人もいると思いますし,スマートフォンのアプリを開発してみたい人もいるでしょう. 一方で,「数学者にはプログラミングは不要だ!」と思っている人も少なからずいるのではないでしょうか. しかし,初等教育においてもプログラミング教育がはじまろうとしていることからも分かるように,プログラミングは理系の人材としてだけでなく,現代人の素養の一つになりつつあるので,その意味からも,プログラミングの基礎を学習することには大きな意味があると思います.

プログラミングとは

そもそも,プログラミングとは何でしょうか. 人それぞれいろいろなイメージを持っているのではないかと思います. 映画やドラマではよく超絶スキルをもったプログラマが登場するので,「超絶スキルを身につけること」といったイメージを持っている人もいるかもしれません.

プログラミングを一言で説明するならば,計算機(コンピュータ)に

(データ)入力 → 処理 → 出力

の作業を事前に指示する行為といえます.

したがって,プログラミングを学習するためには,計算機の長所と短所を理解しておく必要がでてきます. 全てを列挙するわけではありませんが,いくつか例を挙げてみましょう. なお,ここでは現代において主流の古典コンピュータについての長所・短所について考えます( 量子コンピュータを考えると当然古典コンピュータとは異なる特徴がありますが,短所が全て克服されるというわけではありません).

長所 短所
計算が高速 曖昧な指示はダメ
飽きない・疲れない 単純な指示の組み合わせでないといけない(組み合わせは複雑でよい)
指示を守る 無限は扱えない
忘れない 高速とはいえ,スピードは有限

プログラミングを学ぶためには,短所をよく理解しておくことが必要です. 先に長所について少し触れますが,このような長所も「壊れない限りは」あるいは「電力が供給されている限りは」という条件付きであることに注意しましょう. 次に短所について少し詳しく説明します. 計算機は確かに多くの人間よりも高速に計算ができますし,いろいろなソフトウェアやアプリを使うと「すごいこと」がいとも簡単に行えてしまうことが多いです. しかし,計算機そのものが人間のような高度な知能を持っているわけではないので,計算機への指示は「わかりやすい」ものでないといけません(決められた文法を確実に守る必要があります). また,いわゆる「すごいこと」も,細かく分解していけば,本当に単純な指示の組み合わせになっています. また,計算機には様々な有限性があり,それゆえに,困難に遭遇することも少なくありません. 例えば,無理数を表現したいとき,無限の桁を計算機の中で表現するわけにはいきませんから,有限桁で打ち切って表現することが多いです. 通常,実数は 15〜16 桁で表現し,それより細かく表現するには計算の速度など多くを犠牲にすることになります. また,無限が扱えないということから,数学の極限操作は特に苦手です. さらにいえば,一回ごとの四則演算は非常に高速に行えるとはいえ,解きたい問題やそれに対するアルゴリズムによっては

四則演算1回あたりの計算時間 x 計算全体に必要な演算回数 >> 宇宙の年齢

ということも多いので,総合的に様々な注意が必要になります.

プログラミング(の学習)の構成要素

プログラミングを習得するためには,どのようなことを学習する必要があるのでしょうか. もちろん,ハードウェアについての最低限の知識は必要です(この講義でも説明します)が, 数学の問題(数学の未解決問題というわけではなく,数学的に定式化された問題)をプログラミングによって解くことを考えた場合,次のような要素が重要です.

アルゴリズム

これは問題を解くための方法論です.アルゴリズムの理解や開発には数学的素養が不可欠です.

プログラミング言語

昔は計算機が直接理解できる「機械語」を使っていました. しかし,これは非常に難解なので,人間が(しっかり学べば)比較的簡単に扱えて,機械語へは自動的に翻訳してくれる言語が多数開発されました. もちろんそれぞれの言語に得意・不得意な分野があります. この講義では,プログラミング言語としては古めの C 言語 と,科学技術計算用に特化して開発された比較的新しい Julia を使って学習を進めます.

スキル・経験

外国語を学習するときと同じように,一朝一夕に習得できるわけではなく, 経験を積むことは非常に重要です. その中で,多くのスキルも(知らず識らずのうちに)身についていくはずです.

外国語を学ぶときと大きく異なるのは,「雰囲気」では計算機に何も伝わらないという点です. 指示の中にたった一箇所の文法ミスがあるだけで,そのプログラムは実行されません. とはいえ,講義ではエラーメッセージの読み方も説明しますし,また,「文法テスト」のようなことも行いませんので,その点は安心してください. 困ったとき(例えば,文法が分からない・忘れたといった場合)は,調べればよいのです. 特にこの講義で扱うような基礎的な内容は,インターネット上で解説が見つかることがほとんどです. そのような検索能力(および,適切な情報を取捨選択する能力)もこの講義を通して高めていってほしいと思っています.

プログラミングを嫌いにならない

プログラミングを身近に感じてもらうこともこの講義の目的の一つです.ですので,(1 年生のときに少しは学習していると思いますが)自分で手を動かしながらプログラミングの勉強をするのははじめてという人も,一つずつ着実に内容を理解し,経験を積んでいけば,半年も経てばある程度の能力に到達できると思います.

ただし,語学の勉強でも言えることですが,全くの初心者がいきなりヘミングウェイの小説を英語で読もうとすると心が折れると思います.この講義でもできる限り初歩的なことからはじめていきますが,そこをおろそかにしていると,数週間後の講義は途端に分からなくなる可能性があるので注意してください.また,語学の勉強をはじめるときは,文法からしっかりやりたい人やまずはラフな会話から慣れていきたい人など,人によってスタイルの違いがあるでしょう.プログラミングの勉強をするときも,どんなことなら楽しめそうかといったことを考えながら勉強するとよいのではと思います.

この講義を最後まで学習すると具体的にどんなことができるの?

進捗にもよりますし,皆さんからの要望などにもよって変更となる可能性もありますが,例えば,この講義では次のような内容(の非常に基礎的な部分)をカバーします.

この講義で扱わないこと

この講義では,(扱いたいけれど)扱わないこともたくさんあります. もちろん,そもそも数学的に定式化された問題しか扱わないのですが,離散数学的な内容はほとんど扱いません. 例えば,巡回セールスマン問題 のような問題は扱いません. 離散数学や計算量理論は非常に重要ですし,また,実際に「アルゴリズム」を書名に冠した入門書の多くで扱われていますが,本講義では,具体的な問題としては

などをメインに扱います. 従って,上述の通り「アルゴリズム」は重要なのですが,「数値計算法」や「数値解法」といった方が,本講義の内容によくあっているかもしれません.