
いつの間にか29歳になっていたり、しょこたんのミニライブイベントに行ってたのしかったと思ったらライブ直後にゲリラ豪雨になって「しょこたんの雨女パワーマジパネー」となったり、ファミクーマートの期間限定イベントが開催されたからミクまんを嫁に買ってきてもらったり、まあとにかくブログ書くのが久々すぎて細かい近況報告はすっとばしますよっと。
僕は最近、何事も「やるかやらないか」の差だけだと思っている。
なにかにつけてすぐ他の人と比較してしまうけれど、結局そこで出る結論は「自分はまだまだだなあ」というモチベーションアップか、「なんだ、まだ下がいるじゃないか」という安心感か、「人それぞれだな」という諦観の3パターンでしかない。結論を出しても、何も進んでない。自分は動いていないから。
まあそんなわけで、時間は限られてるのだから、やりたいことはなるべく多くやっておこうと思っている。とにかく勉強だよ、勉強。だらだら安穏としていられるほど平穏な時代じゃない。同年代で、自分が到底出来ないことを、空気を吸うぐらい当たり前にやっている人を見ると、本当に差を感じるし、自分の怠慢を自覚する。
仕事の話になるけれど、外注の人が1年かけて作ったプログラムがある。
僕の会社が作るシステムは、業務知識がかなり必要なのだが、外注にそれを求めるのは無理だと判断した上司が、「業務ロジックはストアドでやるから、あんたはそれを受け取るプログラムを書いてください」と指示した。
その後、度重なる仕様変更があったが、ストアドは上司が、プログラムは外注が変更し続けていた。
仕様変更があるということは、クライアントプログラム側でも何かしら変更があるということだ。
例えば、入力項目が増える、制御項目が増える、表示項目の順番が変わる、計算方法が変わる・・・等々。
そんなこんなで上司と外注が進めていたプログラムは、外注の請負契約終了と同時に、僕らプロパーにお鉢が回ってきた。
蓋を開けてみれば、見事なまでのスパゲッティプログラム。酷い。酷すぎる。
僕は職業プログラマだが、自分なりに美しいプログラムという持論を持っていて、外注が作成したプログラムは悉くそれに違反していた。僕の美学だけじゃなく、規約も。
これからその酷さのサンプルコードを載せよう。
Public Function Calc(Optional Keys As String()) As Integer
(何かの処理)
Select Case Keys(0)
Case "0"
(処理1)
Case "1"
(処理2)
Return 0
End Function
Public Sub Entry(Optional Keys() As String())
(何かの処理)
Dim Value As New String(){"1"}
Me.Calc(Value)
(何かの処理)
End Sub
えっ
この抽象的なコードだけでも、いくつも突っ込みどころがある。
- Calcってメソッドは何を計算しているの?
- Calcの引数は何を渡せばいいの?
- オプション引数1の"0"はどういう意味を持ってるの?
- 戻り値に必ず0が帰るのに、何故Functionにしているの?
- 呼び出し元は、受け取ったKeys引数をそのままCalcに渡さないのは何故?
- Calcの呼び出しのためにValue変数を宣言して"1"を固定で代入してるけど、なんなのこれ?
- Functionの戻り値を受け取る処理がないんだけど?
僕はこういう感じのコードが続いているのを見て、不快感MAXだった。
何より僕が許せなかったのは、
Interface BaseSection
Function Calc(Keys As String()
End Interface
などとインターフェイスが宣言されていたことで、それがいくつものクラスに実装されていたことだ。不快すぎる。
僕は今、これらのわけのわからない意図の不明なコードを綺麗にする仕事に励んでいる。
以前、確かその外注さんに聞いたことがあった。別のプログラムで。
「すみません、この関数の引数のOptional Keys As String()なんですけど、なんでOptionalで、なんで二次元配列の文字列を渡すんですか?」
「こうすると、いろんな場合に対応できていいでしょ?」
僕はハァ?と思った。あとで見てわけわからんくなるだけだろ。無駄な分岐が増えるだけ。まったく意味のない抽象化。関数分けたほうがよっぽどわかりやすい。
その時は注意して直させたけど、結局他のプログラムでも同じことをしていたわけで・・・。
ああいうプログラマにはなりたくないもんだ。勉強しよう。
0 件のコメント:
コメントを投稿