2009-08-07

優秀なプログラマたまに起こる逆行(退行)現象

あれは私がまだ大学助手をしていたころだから3年ほど前のことだと思う。

私の勤めていた大学(情報系)では「プログラミング研究会」みたいなサークル活動が行われていて

プログラミング講義を受け持っていた私はそのサークルにちょくちょく顔を見せるようになっていた。

そこにはとびっきりかわいい女子学生が一人いたのだけれど、その子はゲームが大好きで

自分でもゲームが作りたい」と一念発起してゲームコンテスト作品を出品することになった。

しかし、彼女プログラミング講義(Java)を1年くらい受けているものの、

本格的なモノを作った経験がなく、ひとりでは行き詰まりをみせているようだった。

彼女はひとりでいることが多く、パソコンに向かって黙々とプログラムを書いているのをよく見かけた。

それを気にかけていた私はたま彼女ランチに誘うようになり、彼女の方もしだいに私に打ち解けてきた。

私たちはだんだんと仲良くなっていった。私は彼女キュート笑顔に魅了されていった。

ある日、彼女が私のもとにやってきて、もじもじと顔を赤らめながら上目づかいにこう言った。

先生、頼みごとがあるんですけど・・・」

「なんだい?」

メッセンジャーアドレス教えてくださいませんか?」

これから恋の話が始まるのを期待したあなたは別のページを読んだ方がいいかもしれない。

これから始まるのはプログラミングの話だ。

その日から毎日のように彼女は私にメッセンジャープログラミングの相談を投げかけてきた。

私と彼女は連日のようにプログラミングについて語り合った。

彼女は大変優秀で、私の教えるプログラミングテクニックをみるみる吸収していった。

私は彼女才能に驚き、彼女が将来優秀なプログラマになるであろうことを確信した。

しかし、ときおり彼女が優秀であるがゆえの面白い逆行現象が起こったのだった。

ケース1

ある日、私は彼女メモリ意識してプログラミングをしていないことに気づいた。

Java ではメモリ意識する場面というのは少ないが、まったく無いわけではない。

私は彼女プログラムメモリ無駄に使っているということを指摘した。

しかし、よく聞いてみると、彼女メモリハードディスクくらいの感覚しか持っていないことがわかった。

驚かないでほしい。

私の経験上、情報学部の学生の半分以上がメモリハードディスクの区別がついていない。

それを知っている私は落胆することもなく、落ち着いて彼女メモリの説明をすることができた。

彼女は私の説明を聞き「よくわかりました」と、とびきりキュート笑顔を見せた。

しかし、翌日、彼女の書いたコードを見てがく然とした。コードが次のように変更されていたのである。

	for (int i = 0; i < MAXHOGE; i++) {
		doSomething(i);
	}
	for (int i = 0; i < MAXFUGA; i++) {
		doSomething2(i);
	}

	int i;
	for (i = 0; i < MAXHOGE; i++) {
		doSomething(i);
	}
	for (i = 0; i < MAXFUGA; i++) {
		doSomething2(i);
	}

彼女はこのコードを私に見せながら、相変わらずのキュート笑顔でこう言った。

「このほうが使うメモリが少ないですよね!」

ケース2

ゲームコンテストの締め切りが近くなってきて、実際彼女はよく頑張っていたのだが、

どうしても間に合いそうになかったので、私もコード書きを手伝うことになった。

とある部分を書いていたとき、重複したコードを見つけたので Template Method パターンを使って書き直した。

Template Method パターンというのが何かというと、同じことをするコードがいくつもの場所でばらばらに書かれないように

一つのクラスにだけ書いて、それを継承して使いまわすという手法(デザインパターンの一つ)だ。

私はこの手法を彼女に教えようとは思わなかった。

なぜなら、彼女継承だとか委譲だとかポリモーフィズムとかがよくわかってないのだ。

驚かないでほしい。

私の経験上、情報学部の学生の99%が、その、ポリホーなんとかが分かってない。

私は彼女には何も言わずにこっそりコードコミットした。

しかし、彼女はそれに気づいていた。

翌日から彼女コードの書き方ががらりと変わった。

彼女はいたるところで継承を使うようになっていたのだ。

彼女は私のコード自分で解析し、新たなる発見を独力でしていた。

重複したコードがあればそれを徹底して継承で解決しようとしている。

そう、差分プログラミングだ。

差分プログラミングの正式な定義は知らないが、彼女は IS-A 関係のない継承を使ってしらみつぶしに

重複コードを書き直していた。

そのコードを見せながら、天使のような笑顔彼女はこう言った。

「こうするとコードの量が減りますよね!」

まとめ

私がこの文章で言いたいことは、知の高速道路を渡ってきた若い優秀なプログラマ

ときおり妙な退行現象を起こすということだ。

それは普通の道を通ってきた古い世代にとっては実にみょうちきりんなことに思えるかもしれない。

しかし、それは彼らなりに理由があってのことであり、馬鹿だからやってるわけではない。

彼らは優秀であるがゆえにそういったことを起こすのだ。

そして彼らは優秀であるがゆえに、自分が間違っていることを理解するのも速い。

もし、あなたのまわりで若いプログラマが逆行現象を起こすのに遭遇したとしても、

どうか暖かく見守ってほしい。

ちなみに

上で紹介した2件に関しては、彼女にはそのあと説明をして理解を得ることができた。

彼女は本当に優秀なプログラマだ。

しかし我々はそれで油断してはならない。

いつか彼女はその可愛らしい顔をにっこりとほほ笑ませながらこう言うかもしれないのだ。

ローカル変数よりグローバル変数のほうが便利ですよね!」

  • これマジ? 俺、未経験(もちろん非情報系専攻)で業界に入ってプログラミングやることになって1年くらい経つ。 その間の学習の軌跡はだいたいこんなもん。 とりあえずK&amp;Rを読ま...

    • 26歳から職業プログラマーやってるが。 前職は文系職だし、学生時代にCとかFortranでゴミみたいな設計(ていうか設計ってなに?食えるの?みたいなレベル)の数値計算プログラムを書いた...

  • 文章から判断するに、その彼女は、 「創造」と「演繹」の能力に比べて 「分析」と「帰納」が優位だから、 先に理論を説明するより、 良い例、悪い例を見せてから、やらせてみて、 そ...

  • あれは私がまだ大学助手をしていたころだから5年ほど前のことだと思う。 私の勤めていた大学(情報系)では「SEX研究会」みたいなサークル活動が行われていて SEXの講義を受け持ってい...

    • http://anond.hatelabo.jp/20090807204140 C++は中高生のセックスに似ている。何故ならば。。。 みんな、そればっかり考えている みんな、その話ばかりしている みんな、他の人もやっていると...

  • プログラムは論理だけじゃない著作物ってことですね。 コンピューターのためだけでなく、人間にもわかりやすい記述が必要。 しかし、それは論理だけではなく経験も必要ということか...

  • ケース1のどこが悪いかわからない。 変数iのスコープを適切にして、 変な箇所でiにアクセスさせて不良を発生させるリスクを減らせって話? 私がメインはC++のコーディングするから...

    • こういう人が書いたプログラムは保守性悪いだろうな・・・ ケース1で問題なのは、for文内で行っている処理が引数付きのメソッド呼び出しであること。 引数のないメソッドや、単純な...

      • といったってたかが4バイトじゃないか。 ここで問題になるようなバイト数か?

      • メソッド呼び出しは、どちらの書き方でもスタックにiがプッシュされるだけでは? もしかして特殊な環境の話?

      • にやにや

      • ところが今回はカウンタ変数を引数に入れてメソッドを呼び出している。 そうなると、メソッド呼び出し先で、仮引数のメモリを毎回確保することになるので、 カウンタ変数を共通...

        • C/C++ならば、ループカウンタにローカル変数を使えば、最適化されることは分かってるから保守性重視で書く。 真面目なコンパイラなら1はどっちを書いても同じようなコードになるさ。 ...

          • 真面目なコンパイラなら1はどっちを書いても同じようなコードになるさ。 同じようなコードというのはコンパイラが吐き出すアセンブラコードの話?? 真面目なコンパイラなら修正...

            • レジスタの多いCPUの場合で、単純なループが最適化されるとループカウンタはレジスタ上に確保される。 ローカル変数の場合。全てのコンパイラを知ってる訳じゃないから、全部そうな...

              • なるほどコンパイラで同じアセンブラコードはかれるんですね。 じゃ、変数のスコープ短く保つべきですね。

                • http://anond.hatelabo.jp/20090809221610 最初の文と次の文が全然つながってない気がする 吐かれるコードが一緒なのに、じゃ、の意味が分からない…

          • まー、こんな所をチマチマこだわっても、全体は良くならん。 こまけーこたぁいいんだよ!!(AA略 そこは同意。 ただ大元の増田の投稿で「退行」って騒いでいるから、そんな騒ぐほ...

          • Cから入った中途半端なC++プログラマでオブジェクト指向の理解イマイチだからかもしれないけど、私はこんなコードをよく書く。 ObjA *a = NULL; ObjB *b = NULL; int rc = RC_SUCCESS; a = createA();...

    • 実際に稼げてるか分からないメモリのために、変数の寿命を短く保つというルールを曲げるのは、割が合うかどうかって話じゃないの? 「変数の寿命を短く保つ」という基本的なルール...

  • 長文の割に内容なさ過ぎ。別に難しい用語を使ってるわけでもないのにこういうのがかけるのも才能なのかもしれん。何が正しい方向かが全然明示されないからその逆行現象というのも...

  • お前中卒だろ?

  • 現役中学生の間違いでは。

  • あれは私がまだ大学助手をしていたころだから3年ほど前のことだと思う。 過去形で書いてあるのはクビになったからだろうか。

  • 正直、ケース1は大した問題ではない。 そりゃ、スコープの理解がきちんとしているのに越したことはないけど。 この程度でウダウダ言うぐらいなら後置インクリメントを改めるべき...

    • 後置きインクリメントってi++のことだよな? それが++iの方に改めろって言ってるんだよな? どして? 評価順が換わるのは分かるが、このケースでは処理結果に影響ないじゃん。i++だと...

    • http://d.hatena.ne.jp/cubicdaiya/20080606/1212695409

      • 作法ではないな。内部処理的な問題。 http://anond.hatelabo.jp/20090809204059がよい解説のリンクを張ってくれたので見るといい。 簡単に言えば後置インクリメントは処理の内部で必ず一時的な...

  • Google Docsはグローバル変数を使う、定石とは逆の実装 | エンタープライズ | マイコミジャーナル http://journal.mycom.co.jp/news/2009/08/11/020/index.html

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん