Murga

個人的に言いたいコト・主張・気持ち。

ダメな奴がいつまでもダメな理由

アンチパターン―ソフトウェア危篤患者の救出

アンチパターン―ソフトウェア危篤患者の救出

  • 作者: William J. Brown,3,Hays W.“Skip” McCormick,Raphael C. Malveau,Thomas J. Mowbray,岩谷宏
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 1999/03
  • メディア: 単行本
  • 購入: 3人 クリック: 10回
  • この商品を含むブログ (4件) を見る

最近コードレビューをする機会が増えてきて、プログラミング歴とコードの質は全く関係がないんだなぁと実感している。何年やっていてもダメな奴のコードはダメ。

そしてダメな奴は指摘しても直らない。指摘しても直らないのでもう指摘もしたくないのだけど、仕事なので「前にも全く同じこと言いましたけど」と嫌味を込めて指摘を続けている。


何がダメなのか、なんでダメなのか、という話は、これからテーマごとに別途記事を書こうとは思うのだが、それにしても、この手の話は「コーディング アンチパターン」とかで検索すれば腐るほど言及されている。

それなのにダメな奴らは、

  1. まずこうしたアンチパターンに関する情報を読んだことがなく、何がアンチパターンなのか知らない
  2. アンチパターンは読んだことがあっても、それに対するベストプラクティスを知らない
  3. アンチパターンもベストプラクティスも知っているが、自分が書いたコードがそれに該当しているか判断できない

といった誤ちを犯している。


1つ目の「何がアンチパターンなのかを知らない」というのは結構深刻で、一般的にアンチパターンとされているものをベストプラクティスだと思っている場合すらあり、そういう人間の思想を訂正するのは至難の業だ。

だが、そういう人の考えをよくよく聞くと、複数の文献から根拠を提示できないことが多い。つまり、自分が何となく見てきたものを、自分の中だけで何となく理由付けし、よく調べもせずに正しいものだと決め付けている場合が多いのだ。「この本とあの記事で、こういう理由でダメと書いてあって、この記事とあの本で、それに対してこういう方法を取るのが推奨されている、と書かれている」といった、根拠を論じる話し方ができないのだ。


2つ目は場合によるが、「これが悪いらしいことは聞いたことがあるけど、今までそうやってきたので今後もそうする」といったタイプは厄介。目の前のものを良くしようとする気がない。コードを「一度書いたら固定できるもの」と思っている・思おうとしているタイプ。

アンチパターンと云われているものは、それを広めるとデメリットがあるから止めろと云われているのであって、それを意図的に続けようとする輩はどのような社内政治・しがらみによるものだとしても、害であることに変わりはない。汚いコードは保守にコストがやたらかさむし、修正が余計に難しくなってバグが出やすくなる。そうなると会社の評価・コストともに悪影響しかない。

こういう人は「そうはいっても、この機能って今作ったら今後変えることなんてないだろうし、今作る時に分かってればいいでしょ」とか言ったりする。そういって半年後にその機能に追加機能要望が発生したりするものだ。

現時点で想定外としていることなんて、数ヶ月・半年もしたら平気で発生したりする。それは単に見通しが甘かった場合もあるが、不思議なもので仕事というのは本当に「最初は禁止されていたこと」を「絶対やってもらわないと困る」状況に変わったりする。そうなると「この機能は10桁までの数字しか扱わない」なんてシステムは平気で「20桁まで扱えるようにしてくれ」なんて要望が出てきたりするのだ。

実際にそういう目に遭遇したことが何度もあるのに、それでも「変更要望があっても対応しやすくしておく」という発想が持てない人間は、アンチパターンを繰り返すことを害悪だと捉えられない。そのせいでお前の仕事が余計に増えているんだろ。

余計な仕事を増やしたくて、自分の仕事の質を低下させたくて、自分や会社全体の評価を下げたくて恣意的にそうしているとしか思えないドマゾタイプだ。こういう輩は、規則で縛ってレビューで繰り返し全否定し、「お前が書くコードは絶対マージしない」と言い続けて退職させるしかない。


3つ目は「無知」であることが問題。

特定の知識がないから無知、ある本を読んだから知識がある、という考え方は少し違って、無知とは、疑問が持てないことが問題なのだ。あるものを見た時に、何の疑問も湧かずに鵜呑みにできてしまう人が「無知」な人というワケだ。

自分が書いたコードを読み返して、過去に読んだアンチパターンと比較して「あれ、いっけね、こりゃ良くない書き方だ」とか、ベストプラクティスを思い出して「あ、ココはこう書いたらもっと簡単にできるじゃないか」とか思えるアンテナの力を養うことが必要だ。

違和感を持つ・疑問を抱くアンテナを発達させるためには、事前に色々な知識を吸収しておく必要もあるが、知識さえあれば気付けるかというとそうでもない。

極端な話、「よーし、俺はこれから目の前のものに難癖を付けてやるぞぉ~」と意気込んで自分のコードを読み返し始める、ぐらいの気持ちの切り替えが必要だ。

読みながら考える」のもスキルの一つ。以下の 2ch のレスがよくまとまっているので、コードを読み返すとき、ビジネス文書を読むときに意識して使えるようにしたい。

読みながら考える俺のやり方

主張を見たら→「根拠は?」
根拠を見たら→「主張は?」
結果を見たら→「原因は?」
原因を見たら→「結果は?」
具体を見たら→「抽象は?」
抽象を見たら→「具体は?」
長所を見たら→「短所は?」
短所を見たら→「長所は?」
疑問を見たら→「答は?」
問題点をみたら→「対策は?」
用語を見たら→「定義は?」
原則を見たら→「例外は?」
例外を見たら→「原則は?」

という感じで問いかけながら読む。
当たり前のことだがあえて意識して読むことで情報を早く正確に拾うのが狙い。


ダメな奴が引っかかっている特徴をいくつか挙げたが、もっと平たく総じていうと、「自分目線でしかモノを考えていない」のが問題なのだ。

コードを読む時も書く時も、「自分」という立場からコードを捉えて書くから、クラスの責務が分けられなかったり、意味不明な変数名を使ってもよしとしてしまう。オブジェクト指向はある種擬人化して対象物を捉える力が必要で、概念化・モデル化というのは「その対象物の立場になって他との関係性を区別していく」という立派なスキルだ。感覚でも「センス」でもなく、体系的に知識を身に付け、意識して知恵として活用して初めてまともにできるようになる「能力」だ。

進捗報告ひとつとっても、「自分がどこまで進んでいるか」を自分目線で表現して発言していて、それを問題だと思えない人間は、聞いている人のことを全く考えていない。聞いている人と前提知識が共有できているか、聞いている人が自分の話を理解できていそうかを確認していないし、上手く伝わっていない理由を推測することができない。相手を意識しないから、「自分が知っていることは相手も知っているはず」という前提で話しているのと同じ状態になっているのだ。

自分目線でしかモノを考えていない奴は、本人はとても気楽に生きていることだろう。自分では理解したつもりになっているコードを書いて、自分では分かっていることをそのまま話しているのだから、ストレスはないだろう。何故か「何を言っているのかよく分からない」といった指摘を受けることがあるが、どうしてそういう指摘をされるのか皆目検討もつかないから、傷つくことも、ましてや「直すポイント」なんて、自分には見当たらない。そう思っているはずだ。

だが、そういう人と一緒に仕事をしないといけない周りの人は大迷惑だ。何度言っても分からない、ルールや規則を作っても自分本位にしか動かないから平気で無視して誤ちを繰り返してくるし、その誤ちを本人はついに直すことができないから、周りがフォローしてやらないといけない。余計な仕事が増え、自分の残業時間も増え、ストレスが溜まり、このバカさえいなければ発生しなかったタスクが溜まる。

他人の気持ちを考えて話す」なんて云われたりもするが、それは自分の立場から他人の気持ちを考えようとしていて、主語・視点が常に自分になってしまっているので、こういうタイプの人間はいくらそう指摘されても直らないと思う。

こういうタイプの人間は、「自分をなくすこと」を徹底させるしかない。

例えば、会話の中で「それは○○だと思います」と言った時に、「そう思っているのは自分だけで、他の人はそうは思っていない」と考え直すこと。「僕は○○だと思っています」という自分の意見には第三者の根拠があるのか確認すること。「自分が○○だと思う」ということは、「だから全員○○するべき」とは繋がらないことを認識しないといけない。


最近の若い人がよく「他人からの評価を異様に気にする」みたいなヤツ、職場でも見かけていて、「自分が周りに迷惑をかけたらどうしよう」という思いが強すぎていつもオドオドしていたり、格好悪いところは見せたくなくて強がっている人がいたりする。

彼らは他人の目線を気にはしているが、「他人目線で自分を見直すこと」はしていないようである。

自分が迷惑をかけないようにと張り切るのはいいが、人の時間を取るのはいけないからと質問を一切せず、遅くまで残業して一つも使い物にならないウンコードを書き上げて提出してきて「まずコンパイル通ってないから」と突き返されたり。

自分が無知だと思われたくなくて、あれこれ手を付けて「コレ僕がやっときました」などと言うが、見てみると俺が作ったコードを壊して動かなくしていたり。「あなたが書き換えた場所は、こういう意図があってこういう実装にしていたのです。あなたが書き換えたやり方だとこういうバグが出ます」と、幾度となく指摘する羽目になる。

いずれも、自分の評価を気にしてとっている行動なはずなのに、「自分のしたことが他人からどう見られるか」に思いが至っていない。他人から見たら「迷惑な行動」なのに。「いいから早く相談してから対応しろよ」「分かってないなら分かったフリしないで聞けよ」と思うのだが、自分が大事過ぎるあまり、自分を否定するような自己評価はできないのだろう。自分がしていることは間違っていない、間違っているなんて思いたくないのだろう。

残念ながら、仕事においては自分目線を持てば持つほど、周りに迷惑をかける害悪な人材になっていく


これは別に自分を捨てて仕事人間になれ、とかいう話ではない。仕事においては、「自分はこう思う」なんて何の根拠もないスタンスはさっさと捨てるべきで、私生活では自分の信じること、自分がやりたいことを通してもらって構わない。仕事には「あなた個人の思想」も、「あなた自身の体裁」も求められていないんだから、そんなことを考えて保身しようなんて思うなよ、ということだ。


バカがいると迷惑である。そしてあなたはその「バカ」に当てはまっている。

まずは自分から見直して改めよう。