Version 13.31
アルゴリズムのまとめ
「というわけで、今回でアルゴリズム編は最後です」
『今回も長かったね……』
「これでもはしょった方なんだけどね」
『ほんとにぃ?』
「う”……よけいなものは付け足しちゃったかもしれないけど」
『でもたぶんそのよけいなものが必要なんだと思うけど』
「え?」
『で、今回はまとめ?』
「う、うんそう。まず、今回のアルゴリズム編は3つの解説で構成されてい
ました」
アルゴリズム概要(コントラクト、テストプログラム)
Version 13.01 ( No.237 ) - Version 13.05 ( No.241 )
ソート(バブルソート、クイックソート、マージソート)
Version 13.06 ( No.242 ) - Version 13.21 ( No.257 )
日時処理(問題点、変換、作成、比較)
Version 13.22 ( No.258 ) - Version 13.29 ( No.265 )
「あと番外編として」
手作業撲滅
Version 13.26 ( No.262 ) - Version 13.27 ( No.263 )
「がありました」
『なんか手作業撲滅が一番頭に残ってる……』
「そうなんだ……さて、アルゴリズムについてソートと日時処理を見ても
らったんだけど、同じアルゴリズムでもこのふたつは対局にあります」
□ソート
・繰り返し処理中心
・汎用的
・ライブラリがある
□日時処理
・逐次処理中心
・あまり汎用性がない
・ライブラリがない
「日時処理はプログラム毎に微妙に変えなきゃいけないところがあって、そ
のためにややこしい部分が多いです」
『ホントに細かいところ気にしなきゃいけなくて大変だったよねー』
「実際、アルゴリズムっていう点で考えると、日時処理はちょっと違うか
も」
『え、そうなの?』
「狭い意味のアルゴリズムだと当てはまらないかな。でも、ある程度汎用性
があって使い回せるから、まったく違うとも言い切れないんだけど」
『ふーん』
「さて、ここで重要なのは、プログラムの要素について。プログラムは次の
組み合わせでできています」
・一覧形式
・流れ形式
・繰り返し形式
『 Version 13.26 ( No.262 ) でやったのだね』
「さらに、【一覧形式】は順番が関係ない処理のことなのでこれをひとつの
処理として考えると、実質的には」
・流れ形式
・繰り返し形式
「のふたつだけになります」
『シンプルねー』
「さて、このふたつには主従関係があります。プログラムは【流れ形式】だ
けですべて書くことが理論上可能ですが、【繰り返し形式】だけでプログラ
ムを書くことはできません」
『え? そうなの?』
「繰り返し処理の中身は流れ形式になるから」
『そか、同じ流れをまとめたのが繰り返し……繰り返しは必ず流れとペアっ
てわけね』
「そういうこと。繰り返し処理は流れの中にあるし、繰り返し処理の中にも
流れはある、というわけ。だから、繰り返しが有限であれば、それを展開し
て流れにできる、というわけです」
『でも繰り返し処理するわけだよね』
「そう。繰り返しを使うと、流れを小さく小さくまとめることができます」
『だらーって長いのが短くなるわけね』
「同じ処理があればそれをまとめて繰り返し処理にすることでプログラムが
小さくなります。そうすると修正箇所が少なくなるし、全体が見やすくなり
ます」
『可読性、ってヤツ?』
「そういうこと。だから、流れ形式で書いたプログラムは、同じ箇所を見つ
けて繰り返し形式へと置き換えていくわけです」
『流れから繰り返し……』
「そうして作られた繰り返し処理のうち、多くの場面で使える汎用的な繰り
返し処理が、ソートとかのアルゴリズム」
『そっか、そういうふうに繰り返し処理にしたのがアルゴリズム……』
「それに対して、まったく汎用性のない、繰り返し処理にしようがない部分
というものもあります。それが、それぞれのアプリで絶対に書かなきゃいけ
ないプログラム、っていうところかな」
『……???』
「ん、ちょっと話が早すぎたかな。まぁ、プログラムは流れ形式と繰り返し
形式の組み合わせでできているってことは押さえておいて」
『う、うん……』
「さて、今回は、プログラムを組む上でのノウハウをたくさん紹介しまし
た」
『テストプログラムの作り方、日付の比較方法、ブロック選択、どれもすぐ
役立つのだったね』
「プログラムを作る上ではこういうノウハウって必須なんだけど、実はほと
んど解説されないんだよね」
『なんで?』
「うーん、ホームページやメールマガジンならともかく、一冊の本にまとめ
るだけのボリュームがないからかなぁ」
『雑誌連載ならありそうじゃない?』
「そうだよね。これに関しては僕も理由はわからないかな……でも僕は必要
だと思うから」
『うん、必要必要』
「で、こういったノウハウと同時に、概念的なことも説明しました」
『そうそう、さっきのもそうだし、コントラクトとかもそうだし』
「概念の説明で重要なのは、次の2点」
・なんとなく作らないように気を付ける
・ライブラリの背景としての概念を理解する
「まぁ実際には同じことを言ってるんだけど」
『どゆこと?』
「プログラムって、ほとんどの場合〈なんとなく〉で作れます」
『だよね、上から下にコーディングしてけばいいだけなんだから』
「でも実際には違うってこと。プログラムは〈なぜこういうプログラムに
なったのか〉っていう理由が必ずあって、それに基づいて作られなきゃいけ
ないんです」
『理由が必要、ってこと?』
「よくある例をたとえると、お医者さんに行ったときに、とりあえず風邪薬
出しておきましょう、とか言われたら」
『すっごくイヤ』
「風邪薬を出すにしても、そのための明確な根拠が必要なわけ」
『その根拠を踏まえたうえでプログラムを作りなさい、ってことね』
「そういうこと。そこで出てくるのが」
・ライブラリの背景としての概念を理解する
『ライブラリの背景……ライブラリも、概念があって、それが根拠になって
プログラムが作られてる、ってこと?』
「そういうこと。特にライブラリは明確な設計思想があってそれに基づいて
作られていることが多いから、概念がはっきりしていることが多いんです」
『つまり、それを読み取れってこと?』
「読み取って、こういう理由があるからこういうプログラムを作る、ってい
う仕組みを理解することが大事かな。理想は、それをベースにして自分も
プログラムを作れるようになること」
『読み書き両方ってことね。そか、書けるようになれば』
・なんとなく作らないように気を付ける
『ができるわけだ』
「そういうこと。自分が作ったプログラムに対して明確な理由・根拠が言え
るようになる、そのためには使ってるライブラリの背景を理解したり、自分
が作ったものを改めて見直す、とかが必要かな」
『……なんか、結構大きな話だね』
「うん……現場からしてみれば、プログラミングって、コードが書けたらで
きるってものじゃないよ、っていうものだからね」
『ホントは敷居が高いってこと?』
「そういうこと。ま、だからといって、こういった概念やノウハウをちゃん
と理解してる先輩は少ないし、まとめたり教えたりっていう努力もしてない
んだから、初心者だからって気にすることないよ」
『ないんかい!』
「ただ、申し訳ないけど、概念やノウハウについて、全部をここで説明する
ことは量的に不可能です」
『確かに、またどんどん遅れちゃうもんね……』
「ただ、こういったものがあるってこと、こういったものが大事、ってこと
は憶えておいて、機会があったら本屋とかで探してみてください」
『本はないんじゃないの?』
「ノウハウの方はあまりないけど、概念の方はいっぱいあるよ。ただ、概念
の本は学術的というか」
『机上の空論的というか?』
「う、まぁ、そんな感じのが多いかな……」
『読んだら眠くなりそうね……』
「それでも、そういう研究というか、科学的な礎みたいなものがベースにあ
るってことは憶えておいて」
『はーい!』
「さて、今回でアルゴリズム編は最後です」
『次回は?』
「次回からは【プロセス】と【スレッド】について説明します」
『プロセスは何度か聞いたことあるけど……スレッドも他のホームページで
はよく見かけるけど』
「ま、それよりは【同期】の方が重要かな」
『どうき?』
「ま、詳しくは次回からということで!」
/*
Preview Next Story!
*/
『アルゴリズムもややこしかったけど、マルチスレッドはもっと大変そう』
「うん、大変」
『げげ』
「特に、関数を使う、みたいな簡単な話じゃないから」
『つまり、アルゴリズムを作る、くらいのことができないとダメ?』
「そのくらいは必要かも」
『ううう』
「というわけで次回」
< Version 14.01 マルチスレッドって? >
『につづく!』
「ま、最初は簡単なところから」
『でも結局は難しくなるんじゃん!』