Diary?

2008-07-20
Sun

(11:33)

プログラマには数学的センスが必要だという話の例を一つ(センスの問題なんで、数学の知識量とか暗算の速さとかじゃないよ)。

うちの会社の新人教育の課題に次のような問題がある。

String str = "FOOBAR[ABC(DEF)][GHI(JKL)]FIZZBUZZ[MNO(PQR)]";
String[][] pairs = new String[3][2];
pairs[0][0] = "ABC";
pairs[1][0] = "GHI";
pairs[2][0] = "MNO";
/*
 pairs の中身が
 pairs[0][0] => "ABC"
 pairs[0][1] => "DEF"
 pairs[1][0] => "GHI"
 pairs[1][1] => "JKL"
 pairs[2][0] => "MNO"
 pairs[2][1] => "PQR"
 となるような処理を書け
 */

要するに [] 内部の文字列に対して対応関係を作っていけという問題なんだけど、ここで次のような質問を受けることがある。

「"ABC" とかって何の意味があるんですか?」※実際には ABC とかよりもちょっとは意味ありげな文字列を使ってる

確かにそういう疑問を持つ気持ちもわからんでもないけど、でもその意味がなんだろうと問題の中身には一切影響がないということを理解してもらいたいもんだ。いや、もちろんそういった疑問を持つことは全然悪いことじゃないけど、それがわからないからって先に進めないというのは困る。

数学的センスというのは突き詰めれば抽象化能力の事で、先の問題でいうと

  • 問題の文字列にはパターンの繰り返しが出てくる
  • 問題を解くためには [] 内部だけ見れば良い
  • FOOBAR とかはノイズ
  • ABC が何なのかは問題を解くのに必要ない

というところに問題を落とし込めるかどうかの能力だ。実際に業務システムを作ることになると、例えば業務電文の変換処理を書く場合、やってくる電文のフォーマットだけを考えて具体的な項目毎の意味は一旦忘れてしまった方がいい。電文の意味を知っておかないといけないのは大抵別の奴で、同一人物が変換から業務処理までやる場合でも、あくまでもパターンはパターン、フォーマットはフォーマットと問題を切り分け、一度に考えることを少なくした方がミスは少ない。

さらにこれはプログラミング言語そのものにも関わる話で、最近の言語はコンパイラ型だろうがインタープリタ型だろうが、一旦ソースファイルを別形式に変換してそれから実行というプロセスを経ている。

まあ、最大の問題はこういう説明をしてもチンプンカンプンで、いやチンプンカンプンなのは別にしょうがないんでそこは全然良くて、自分の知識を総動員して理解してやろうとか、さっぱりワケワカだからもっと精進しないとなーとか、そういう風に思う気概がゼロで適当に受け答えしながら流す奴なんだけど。

俺も新人研修だけやってりゃ良い身分ではないので、本人が自発的に学習してくれないと余計に厳しいんだって。大体、いちいち俺が様子を見にいかないと全然質問をぶつけに来ないとかふざけてるだろ。それに箸の上げ下げから教えてると全然時間が足りないから、多少は説明内容のレベルを上げて、そこから質問を受けて相手のレベルを推し量っていかないと研修期間中にろくな事が教えられないんだって。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。