kagamihogeの日記

kagamihogeの日記です。

とあるプログラマーの追憶

プログラム覚えるのに

必要なのってなんですか

プログラム覚えるのに より抜粋

確かに、プログラミングができるようになるのに必要なことって何なんだろう、と思うことはある。既に書けるようになっちゃった人の「今」だけを見ると、なおさら良くわからんくなるよなぁ、とも思う。

というわけで。とあるプログラマーこと俺がどんな風に育ってきたか……大学生活 4 年間を振り返ることで、プログラムを覚えるのに必要な一例を示す。ま、履歴書みたいなもんですな。

ただし、この育成例は大学教育というものにベッタリです。万人にオススメできるものでもないし、ましてやこうしなければプログラムを覚えられないという性質のものではない、ということに注意。要は、あくまでも一例、ということです。

動機と時代背景

俺は人から「大学で何勉強してきたの?」と聞かれたときは「大雑把に言えば情報系ですね」と答えるようにしている。では、なぜその大学に行こうと思ったのか? ゲーム好きだったからです。

高三になって進路を決めなければならなくなった頃、当然色々悩んだわけです。ある時、どこから聞きかじったのかはもう忘れてしまったのだけど「ゲームというのはプログラミングとやらで出来ているらしい」ということを知った。で、どうなったかというと「じゃあ進路はプログラミングとやらを勉強できるとこで」ということに。事の始まりは半分ギャグだったわけですな。

しかし、俺は数学万年赤点だったため文系コースを選択していた。すなわち理工学系の進路はアウト。さてどうするか……となったわけです。俺は外向けには「コンピュータサイエンスを学んできました」と言っているけど、ガチ情報系出身者ではありません。なので、その辺にコンプレックスがあったりなかったりするんだけどw ま、それはさておき。

……ところで、'50-'60 年ぐらいはまだまだコンピュータというのは超高価*1で、どこぞの大学教授が自分の家を抵当にアメリカからウン千万のコンピュータを買った、とかそんな狂気染みたことが行われていた時代でした。そのコンピュータの性能は……今なら 10 万も出せば買えるようなものです。正気にては大業ならない時代だったわけですなぁ。

とまぁ、コンピュータというのはまだまだ非一般的なモノではあったけど、企業ではじわじわと利用が拡大してく時代でもありました。このため、大学によっては経営・経済学部あたりでコンピュータ・サイエンスを勉強できる学科を設けていました。そう、文系科目で受験可能かつコンピュータサイエンスを勉強できる、ということです。学科のお題目としては「企業経営におけるコンピュータの可能性を考える」とかそんな感じのムニャムニャです。しかし、当時の俺にはそんなややこやしい崇高な理念なんぞわかるはずもなく「英・国・社で受験できて大学でプログラミング勉強できそうならおk」という認識でした。

余談ですが。そんな感じの道を辿っているので、いわゆる理工学部系の人には説明不能で名状しがたいコンプレックスがあり、偏差値的にはとても高いとは言いがたい大学でもあったので、学歴コンプレクスはすげぇありますw

ただまぁ、社会人続ける上では経営学に片足突っ込んでいたことは有利に働いてるよなぁ、と今は思います。

また、学科に関するややこしい定義は 経営情報学 - Wikipedia をどうぞ。

一年次 - 経営学、コンピュータ、Pascal との出会い

当時のプログラミング初等教育は、Pascal を用いるのが一種のトレンドのようなものでした。そして、俺にとっては Pascal がプログラミングの母となりました。プログラミングに対する接し方や考え方は、入学後数ヶ月で形作られてしまったようなものですね。擬似コードを書くと、C と Pascal が入り混じった文法になるし。

「プログラミングって面白い」と思うようになったきっかけは、無論 Pascal の講義を通してです。強く思い出に残っているのは、バブルソートのアルゴリズムと実装。真っ黒で素っ気無いコンソールに幾つかの数字を入れると、それが昇順に整列されて表示される……ただそれだけのものだったけど、これにすごい感動したのを今でも覚えている。

「if とか for とか、一つ一つはシンプルな要素なんだけど、それらを組み合わせるとこんな複雑なことができる!」

書いててちと恥ずかしいけど、こんなとこですかねw この頃は講義で出される課題が楽しくて仕方が無い時期でした。箸が転がるだけでも楽しいというか、何でもいいからプログラムが動けば楽しいお年頃だったのです。ユークリッドの互除法アリストテレスのふるい、フィボナッチ数とか、数学に由来する古典的かつ基本的な問題が多かった。まぁ、つまんない人にはクソつまんない授業だったろうなぁw しかし、猿と化していた俺には基礎を築くための良き時間となりました。

学科では基本情報処理技術者(旧・第二種情報処理技術者、いわゆる旧 2 種)を取得するのが奨励されていたので、その範囲を網羅する講義もありました。コンピュータに関する全般的なことを教えてくれた、っとこですね。コンピュータの 5 大機能とか、2/8/16 進数とか、浮動小数点の仕組みとか、OS ってナニとか、ファイルやネットワークって? とかとか。コンピュータについて何も知らない俺には目新しいことばかりだったので、かなり楽しかったですね。しかし旧 2 種の試験は 1 回落ちましたw

経営学については、自動車産業の勃興をテーマに、企業とはなに? 労働とはなに? 経営者って何するの? とか、経営学へのイントロダクションとして色んなことをやった気がする。当時はコンピュータというか Pascal にご執心だったので、この辺の講義の記憶はかすかにしか残ってないんだよね……w 勿体無いことをしたと思います。

あとは、教養科目でここぞとばかりに高校時代に勉強できてなかった自然科学系を偏って取ったり、数学(行列・線形代数微分積分・集合・論理、かな?)の講義を取ったりしました。まぁ、元々理系科目がチャランポランだったので成績はそこそこに収まったけどw けど、数学キライが修正されたのは大きな収穫でした。高校の頃に数学が赤点、という理由だけで理系コースを避けたのを後悔した瞬間でもありました*2

あーあと、タッチタイピングは、入学してすぐに大学の端末に入っていたしょっぱいタイピング練習ソフトで覚えました。というか、とある講義の先生に「覚えろ」って脅されたからなんだけどw さらに、とあるチャットルームに入り浸りでキーボードにはすぐ慣れました。個人的に、キーボードに慣れられればコンピュータという未知との遭遇に対する恐怖/苦手感はカナリ薄れるんじゃないかなーと思います。

二年次 - C と計算機数学、コンピュータ・サイエンスの入り口へ

そろそろ「『プログラミング覚える』の話から吹っ飛んでるじぇねーか」と、こげな長い文書を忍耐強くお読みの方はお思いのことでしょうw が、プログラミングを学ぶことはその周辺分野を学ぶことでもあります。周辺分野は人によってマチマチで、エロだったりエロだったり*3ゲームだったり、経営学にトンでいったり、機械語が跋扈するローレベルな世界に興味関心が向いたり、コンピュータ・サイエンスという理論の世界に目が向いたり、と十人十色なわけです。

そこで俺はというと、計算機数学やオペレーションズ・リサーチ、数値シミュレーションなどに興味関心が移りつつありました。まぁこの辺の話は一先ず置いておいて。

二年次のプログラミング言語の学習は Pascal の延長として C 言語を学びました。構造体とポインタのマジックに翻弄されまくった時期でもあります。C 言語で、データ構造とアルゴリズムについてじっくり学べた(教授の教え方がムチャクチャ上手だった!)のは、後々の俺の能力を形作る上で重要な土台となりました。ツリー・2 分探索・ヒープ・TRIE・B 木・ハッシュなどなど。C で実際に実装してみたのもあれば無いのもあり。

計算機数学(これも教授の教え方がムチャクチャ上手だった!)では、そもそも機械って何ってところから始まって、オートマトン・状態遷移図・関数・再帰的定義・スタック・チューリングマシンなどの話をやっていた。とあるモデルを示した状態遷移図を、少しずつエレガントに仕上げていったりと、工夫溢れる教え方をして下さった教授の講義は今でも良い思い出です。BNF 記法や二値論理、アルゴリズムとはそもそも何なんか、てトコらへんも面白かったです。

オーダ記法と計算量について教えてもらったのも後々大きな資産になりました。データベースアクセスを伴うプログラミングのデッドロック調査やパフォーマンスチューニングに役立ってくれました。ただ、データベースそのものやテーブル設計、SQL についてまともに勉強しなかったので、そこは後悔しています。

オペレーションズ・リサーチ(OR)は……アンマリ真剣にやりませんでした。線形計画法とか相加相乗平均とかだけど、この辺はスッポリ頭から抜けています。が、この講義取ったのが後々 補給戦―何が勝敗を決定するのか (中公文庫BIBLIO)軍事とロジスティクス に(俺はまだどちらの著作も未読だけど)興味を持つフラグになるとはこの時思いもよらず……

また、コンパイラ構文解析、OS そのものやノイマンアーキテクチャについての講義がありました。これは、後に組み込みの仕事をちょっとやったときに役立ってくれた。8086 アーキテクチャにはすんなり馴染めたのは大きかったです。486 はさすがにゼンブ理解できるまでには至らなかったけどw*4

この時期では俺の思考スタイルが、プログラミング言語は抽象化の歴史であり、ソフトウェア開発は具体化と抽象化の過程である、といった方向性へこうした一連の講義を通して少しずつ形成されていきました。

ところで経営学関連の方なんだけど……この時期、コンピュータ関連の講義が面白すぎてそっち方面はグダグダになっていましたw 必修の会計学はギリギリもギリギリで通過してたり。また、企業経営とコンピュータを使用した情報システムがどんな風に絡み合って発展してきたかを考察する講義もあったんだけど、これもギリギリで通過してました。当時、この講義を担当していた教授は「この講義は君らには至極ツマラン代物だろう。君らが 10 年経つころ、この講義の持つ意味がわかるだろう」と仰っていたが、今まさにその意味を実感している。上手く説明できないんだけど、すっごく端的に言うと はぶさんの blog を読んでる人にはわかってもらえると思う。あと、情報システムの歴史を断片的にでも知ってると、お偉方と話あわせやすいってのも特典だねw*5

三年次 - コンピュータ・サイエンスをもう少し深く、ACM-ICPC、ネトゲ廃人化

狭義の「プログラミングを覚える」という話からはブッ飛んできてますが。まだ読みますか? ようやく俺の大学生活の折り返し地点ですよw この辺りまでは比較的マジメ君だったわけですが、三年次の後半に人間的な意味でも折り返し地点を迎えます。

三年次は、データ通信・情報理論・数値解析・数値シミュレーション、が主なところかな? この辺りの講義はアンマリ思い出が無かったりする。

ネットワークの基礎とか、エントロピーとかダイヴァージェンスがどうとか、圧縮・符号化・復号・暗号化の基礎理論、巡回セールスマン問題、キツネとウサギが食い合いするシミュレーション―なんていうんだっけアレ?―などの複雑系入門な話などなど。まぁざっくばらんに色々な理論勉強した時期ですね。

しかし、自分でも不思議なのは Unix/Linux にマッタク興味持たなかったんですよね。何故かというと、当時 Windows 2000 が出て OS レベルで困ることが無くなってきた時代背景と、俺自身が抽象的な理論に傾倒していてコンピュータを使いこなすなどの具体的な側面に興味持たなかったのが大きかったと思います。

ウチの学科は三年次からゼミ(研究室)に所属するようになっていた。で、担当教授が ACM-ICPCACM国際大学対抗プログラミングコンテスト)の問題をドサッと持ってきて「さぁ解け」と。

この問題は俺にとってパズル感覚として受け入れられ、解き方が分からない問題は終夜俺の脳を悩ませることになりました。夢の中でプログラミングし始めたり、風呂入ってるときに「わかった!」つってびしょぬれで飛び出したり*6とか奇行しまくった時期でもあります。

実際のとこ、プログラミングはこのパズル問題集通して覚えたようなものです。問題の性質としては、総当り方(Brute Force)、ジェネレート&テスト、数値科学シミュレーション、文字列解析、動的プログラミング、バックトラック、とかそんな感じかな? テストパターンの設計に関する知見もこの経験から得た部分は大きいですね。

……しっかし東大・東工大・京大あたりの連中はホント天才つーか変態だよな、と思い知らされたのもこの時期。彼らは、俺らが 1 時間かかる問題を 5 分とかで解いちゃうもんね。研究室内で「どうせ俺らはへっぽこさ……」というネガティブ空気が流れた時期もありました。感染源は俺。

また、研究室では担当教授が「Java および Servlet/JSP 勉強するべし」とのお達しを出していました。おかげで Struts にはすんなり馴染めたし、今日の Web アプリのフレームワークもおおよそを掴むのはラクです。教授に感謝ですね。K6-2 なんぞのマシンでそこそこのクラス数の Java ファイルをコンパイルするのは鬱陶しい時期でもありました。

この頃の購読雑誌は bit, Java World, そして Software People. Software design ではアリマセン。研究室で「UMLモデリングのエッセンス」を輪読(担当教授の別の講義だったかな?)したあたりから、いわゆる上流に興味持ち始めたわけです。プログラミングの心理学―または、ハイテクノロジーの人間学 25周年記念版ライト、ついてますか―問題発見の人間学 などのワインバーグ本、ピープルウエア 第2版 ? ヤル気こそプロジェクト成功の鍵 などのデマルコ本を読んでました。いやはや、何とも可愛げのねぇ学生さんだよなぁ今思うと。

三年次には、一年生の初等プログラミング講義の教員補助アルバイトをやってました*7。自分の blog でちょくちょく プログラマーの教育 に触れるのは、その経験に由来してる部分が大きいです。ちなみに ステップバイステップ・プログラミング教育 - kagamihogeのblog で「『なんで出来ないの?』はマジ禁句。」と書いてるのは、この頃のリアル体験です。マジで学生一人のやる気フルボッコにしたことはトラウマです……

とまぁ、三年次前期まではそれなりに清く正しく(?)学生生活を満喫していたわけですが、三年次後期に恐るべき事態が発生しました。

ラグナロクオンライン(ネトゲ)との出会いである。

これによって生活パターンが激変しました。いわゆる廃人です。後期になってコマ数が減り、研究室に行くのも週一、サークルにも入っていない孤独な人間だったので、ヒキコモリ化が加速していきました。

同時にエロゲにもハマってました。まぁおかげで PC 自作の知恵が身に付いたので痛し痒しと言ったところなんだけども。

四年次 - ネトゲ、ネトゲ、ネトゲ、就活、卒論

四年になると、もはや週一の卒論進捗報告で大学に行く以外、まともに外出しなくなりました。そんなんでよく就職っていうか更正できたよなぁ……俺の世代は 197x で、就職氷河期が直撃してる頃でした。ただ、情報サービス関連だけは気前良く採用してる企業が多くて就職口には困らない頃でもありました。まぁもっとも間口を広げただけに、ブラックな企業もタクサン量産されてる時期でもあったわけですが。それでも文学部や経済学部に行ってた連中はヒーヒー言ってたのを見れば、就職できただけマシだったと見ることも出来るのだけど。

まぁそれはともかくとして。この頃の俺は、もうホントーにネトゲ・ネトゲ・ネトゲでした。RTX を使用した、秒単位で安定した支援環境の提供の研究に超熱心でしたね。YAMAHA のルータじゃないです、ラグナロクオンラインというネトゲのツールの話です。

このため、ネトゲの合間に就活と卒論書いてるよーな生活が一年続きました。

就職は、少し上で書いたように口はいくらでもあったのでスンナリ終わりました。面接で話すことやエントリーシートで書くことに事欠かなかったためです。むしろ、SPI などの筆記試験のほうが厄介でした。何しろ当時のライフサイクルの第一優先がネトゲだったので、就活のためだけの勉強なんてやってられなかったのが理由です。

卒論は、Web アプリケーションのフレームワークの可能性について論じる内容を書きました。が、出来の方はもう思い出したくないですね……卒論発表会は一発で通ったけど(=再提出を免れた、という意味)卒業論文の執筆は、リアルに涙が出るほどキツかったからなぁ。卒論に苦しむ後輩たちへ - kagamihogeのblog は、過去の自分に向かってのエントリでもあるのです。

プログラムとは

「プログラムを覚えた」という状態は、まぁ人によって色々な意見があるのだけど―この言い回し自体がなんつーか理系の人っぽくてイヤらしいねぇw―以上のような経緯を経て俺はプログラムを覚えました。

しかし、この状態は実はかなり危うい。

なにか作りたいものがあって

作りたいものの作り方がよくわかんなくて

(中略)

すぐには出来ないかもしれないけれど

そのうち

何か作れればいい

プログラム覚えるのに より抜粋

ものすごく極端な言い方をすると、俺には「作りたいものはない」 プログラミングそのものを四年間も学習・研究の対象にしてきたんだから、そうなったのは当たり前といえば当たり前なんだけどね。「作り方」の理論や背景事情はすっごい勉強してきたけど「あなたの作りたいものはなに?」という問い掛けはしなかったからね。つまり、頭デッカチ。

「これがあれが作りたい!」という人たちには、俺はものすごくイビツな在り方に見えるんじゃなかろうか。何せ、作り方を知ってるクセに何も作ろうとしないんだもんねw Web 上でサービスを公開しては消し公開しては消しを繰り返してる人たちが俺にはとてもまぶしいです。

とはいっても日銭をかせがにゃならんわけで。大学卒業後の数年は、理論と現実の狭間に苦しんだりおちこんだりもしたけれど、私はげんきです。最近は「作りたいモンなんて別にないけど まぁいいや サァ行くか」てな感じです。作りたいモンがあるでもなく、しかし理論先行しちゃってる俺には現実のドロドロさに耐え切れなかったのです。「危うい」って書いたのは、そういう意味です。

しかしながら、その後色々あった結果、ここ 1,2 年は受託開発というフィールドは自分にすごいしっくり来るなぁ、と思い始めてきました。あーいや受託開発を、仕様書書いてそのとおりにコード書くだけの仕事、みたいにナメてるわけじゃなくて、その逆です。中々に研究しがいのある領域だと思い始めたわけですよ、受託開発は。参考文献 受託開発の極意―変化はあなたから始まる。現場から学ぶ実践手法 (WEB+DB PRESS plusシリーズ)

なんでそう思うかってのは……まだ上手く文章にできないんだけどね。そこそこの収入、そこそこのやりがい、そこそこのカッタるさ。受託開発ちゅーのは、言葉の見た目も中身も分かりやすいカッコよさはないし、まぁ実際地道な作業の連続なんだけど、だがそれがいいと言いますか。

最近思うのは、(受託開発の)日々の地道な作業を通してその中に構造を見出す、ってのはソフトウェア工学の到達すべき頂の一つなのかもしれない、と。その一端を俺が担うことが出来るなら、これほどの喜びは無い、みたいな? 言い換えるとですね、日々のテキトーな活動を通してそこそこのお金稼げるならそれでヒャッホイなワケですよ。

まぁ、まだまだわっかんねーことだらだけだし、仕事でムカチンと来ることもあるけど、諸々含めてこれからのコンピューターにまだwktkしてる自分がいるんですよね。

プログラム覚えるのに

必要なのってなんですか

プログラム覚えるのに より抜粋

まぁなんつーか。そんな感じです、ハイ。

おまけ

今回のエントリを書くにあたって穴倉押入れからご登場願った大学時代のノートたち。

教科書類は捨てられても手で書いたものは中々捨てられない……

*1:正確には電卓も絡んでたりしてちょっと違うんだけど……このあたりの歴史を知りたい方は NHK の「電子立国」をどうぞ。

*2:書いてて思ったけど。きっとこの辺の経験が理工学系に対する謎のコンプレックス源なんだろうなぁ

*3:大切なことなので 2 回書きました

*4:「はじめて読む8086」は読めたけど「はじめて読む486」は途中で挫折。

*5:「むかしはブートストラップってはさみとテープで切り貼りしてたんですよねー」とかw

*6:アルキメデスのキモチが分かる気がする……

*7:時給 1000 円↑に釣られた