パスワードを忘れた? アカウント作成
7001897 story
プログラミング

同僚の書く酷いコード、どうやって気づかせる? 155

ストーリー by headless
泥沼 部門より
あるAnonymous Coward 曰く、

本家/.「Ask Slashdot: How Can I Explain To a Coworker That He Writes Bad Code?」より。

私の同僚は非常に頭がよく、ソフトウェアの知識も豊富だが、想像を絶するほどひどいコードを書く。たとえば、

  • すべてのプログラムは1つの関数に詰め込まれ、際限ない繰り返しのせいで無駄に引き伸ばされている
  • 変数名やクラス名から得られる情報は泣きたくなるほど少ない
  • コードを短く、読みやすくするための基本的な言語機能は無視されている
  • オブジェクト指向プログラミングの虐待は吐き気を催すほどで、戦争犯罪レベルといえる

しかし、彼は私が生まれる前からプログラミングをしており、非常に頭が良いことで、人の意見に耳を貸そうとしない。そのため、「この関数をこのように書いたら良くなると思いませんか」といった簡単な提案は受け入れられないだろう。彼に事実を伝え、良いコードと悪いコードの区別をわかってもらうにはどうすればいいだろうか。

問題の彼がどう「頭が良い」かは不明だが、/.J諸兄方ならどうする?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by legasus (38676) on 2013年01月05日 12時58分 (#2300664) 日記

    > 同僚の書く酷いコード、どうやって気づかせる?
    気づいても直らないかも。

    気づかせるだけなら、スマートなコードを書いて比べさせればいいと思う。
    メンテナンスのしやすさ、修正が来たときの直しやすさ、良く使うならクラス化とか、
    そういうのは比べさせれば、とりあえず気づくと思う。
    一番いいのはダメージが大きくてもハッキリ言うこと。

    でも直らないんじゃなかろうか。
    私は人並みにしかコードが書けませんが、人並み以下のコードを指摘しても直った試しがないです。

    • by Anonymous Coward

      自分もそう思います。この人は1にしか対処できない人で、複数が見えないのだと
      思います。

      1にしか対処できないので、世界をそれで対処可能な様に再定義しないと生きて
      行けないので、自然と再定義能力に富み、頭がいいと思われているだけかも、
      知れません。

      あきらめて、(本家の)私さんがそのソースの全面的権限を得た時に、リファクタ
      すればよいだけでは?

      #人間の認識形態の問題になったら、なんであれ、直らないと思います。

  • by Anonymous Coward on 2013年01月05日 13時31分 (#2300683)
    まさにこの通りの人と仕事をしたことがあります。
    とても頭の回転が速く、バグをあまり出さない。が、ソースがあり得ないほどに汚い。どうやったらこれで動くんだと愚痴られる程。なのでチーム作業で一度問題(…というか怒号飛び交う大喧嘩)になって、一人でも十分こなせる作業、または独立性の高いモジュール開発をやってもらってます。
    その方が本人も周りもハッピーなようなのでヨシとしました。そういった方のコードはどんだけ指摘しても変わらないと思いますから、あきらめてポジションを替えるなどして最良のパフォーマンスを出せるようにしたほうが良いと思いますよ。
  • ソースコードの善し悪しの判断もまた同じようなものじゃないだろうか。
    他人の書いたコードは汚いものなんだよ、きっと。

  • by Anonymous Coward on 2013年01月05日 13時31分 (#2300682)

    とりあえず、プロジェクト杉田玄白協賛参加テキストのガベージ・イン/ガベージ・アウト:善き人々が悪しきプログラムに手を染める時 [practical-scheme.net] 原文 [pipeline.com]を読もう。
    そして知能指数が20も違えば会話が成り立たないことを思い出そう。

    そこまで言っても分からない馬鹿ならば。
    djbやクヌースのように、自分の書いたプログラムのバグや脆弱性に対して賞金をかけろと言ってやれ。
    破産するころには理解してくれるだろう。
    馬鹿には体で教えるしかないのだ。

    馬鹿がdjbやクヌースをどれだけこき下ろそうとも、彼等の書いたプログラムは、
    綺麗なプログラム(笑)とやらを書く、馬鹿や凡人のプログラムよりバグや脆弱性が少ない。
    そもそも人に読ませる必要などないのだ。
    コンパイラが読み、正しく実行できればそれで良い。
    それが理解できないから馬鹿は馬鹿であり、我々凡人は凡人のままなのだ。

    釈迦に説法とは正にこのこと。
    天才のすることに口を出してはいけない。
    うまく動いているのなら放っておけ、我々如きが口を出すべきじゃない。

    • by nobanner (41086) on 2013年01月07日 3時25分 (#2301481) 日記

      この世で必要とされるすべてのプログラムをdjbとクヌースが手分けして書けばよい。

      親コメント
    • 書いた本人には簡単に分かっててバグも無いなら、本人にとって周りに合わせて「改善」してやる理由は無いですよね。これぐらい分かれよ、とか思うだけで。

      際限ない質問攻めにするとか、どうでしょうかね。「ちょっと複雑すぎて私にはこの部分が分からないんですが」と延々みんなで聞き続ける。

      ・・・それでチームか会社としての生産性が上がるかどうかは分かりませんが。
      親コメント
    • それが理解できないから馬鹿は馬鹿であり、我々凡人は凡人のままなのだ。

      そうそう。その通り。
      でね。
      それを前提にして。
      我々「圧倒的大多数の」凡人、逆立ちしても死んでも希少な彼らのような天才にはなれない凡人たちが(おそらくはチームで)プログラミングをするにあたって、どうしたらいいと思う?
      というのが元々のACの問いなんだと思うんだよね。
      元ネタの困ったコードを書く同僚が天才なのか凡才以下の凡凡才なのかはわからないけど、とにかく彼に周囲の凡人にあわせてもらうにはどうしたらいいか、ってこと。
      周囲にあわせる必要が無いような環境で働く超のつく天才たちはいざ知らず、周囲に同僚がいる環境においては、周囲の迷惑になるのは全体の生産性を下げる行動だよね、という観点で見てみたほうがいいんじゃないかと思うんですよ。

      それと、現場的に言うと、動けばいい、というのは超短期的な話ですよ。
      書き捨てのプログラムとか、ライフサイクルが短かかったり代替商品があったりするものとか。
      半年以上とかそれなりに長く働くものであったり、社内/部内システムのようにユーザーの要望に強く結びついたものなどは、上記のものよりも強めに「メンテナンスコスト」を意識しますよ。
      それこそ1バイトのメモリをやりくりしてギリギリで商品開発をしていた頃とは違いますからね。
      それよりも、多少は実行効率が悪くてもメンテナンスしやすい構造にしておけば、あとが楽(どころかコストの安いところに丸投げとか)できますからね。
      全体的なコストを考えれば、そして中・長期的に見れば、プログラミングに所謂天才と凡人以下の存在は不要です。
      凡人の、凡人による、凡人のためのプログラムこそが正義ですよ。
      あえて例外をあげるとすれば、趣味のプログラムなら別ですけどね。

      親コメント
      • >メンテナンスしやすい構造にしておけば、あとが楽

        と言うのは共通認識になっていないと思います。
        と言うより、メンテナンスしやすくする手間など、真っ先に仕分けの対象に
        なると思います。

        もちろん先になれば仕分けた人間(たぶん収支責任者)が真っ青になるのは
        確かですが、ビジネスはファクトが基本で、なかなか先の話は飲み込んで
        もらえません。

        さらにそういう責任者体質の人は、「後で真っ青になる」と脅すと、自動的に
        不屈の精神が起動し、脅した人間を、万難を排してでも討滅すべき対象と
        見なすと思います。

        そんな簡単に正義だと言えるとも思えません。

        親コメント
  • 「コメント長すぎますよー」って何度言われた事か。
    そりゃそうだ。ギャグ満載で書いてるからな。
    でも、ちゃんと読めば理解できるはずだ。
    肝心な事はキチンと書いてあるから。
    ただ、コメントのうち7割ほどギャグ要素の為のコメントだがな!

    って事で、コメントについては悪かったと思ってる。ちょっとだけ(ヲイ)。

    ただ、「コードが理解できない」は、僕から言わせれば「頭使えよ」って感じ。
    「構造体苦手です」とか「多重配列難しいです」とかは、言い訳じゃね?

    (注:以下、愚痴だらけです。気を悪くする人もいると思いますが、吐き出させて~!)

    ってか、十年以上一人でコーディングさせといて、今更言うんじゃねーって感じ。

    こっちは無理難題な要件をクリアする為に、脳みそフル回転させてんだよ。
    で、自分の得意なコーディングは「構造体」や「(多重)配列」をフル活用するんだよ。
    僕だってバカじゃないから、キチンと細かく関数化してるじゃん。
    引数渡す時に楽になる様に、構造体や多重配列をアドレス参照にしてるじゃん。
    その関数の中で値を入れられるようにさ。
    オブジェクト指向だか何だか知らんが、クラスもちゃんと作ってるわ。
    これが僕のコーディング術じゃ!何が悪い!?
    もちろん拡張する時の事も考えて、関数作ってんだよ。
    ファイル名も変数名もクラス名も関数名も、分かり易くしてるだろ?

    ってかさー、サービス増えても増えても僕一人ってどうよ?
    ってかさー、「これ、一回ボタン押すだけで(各サービス)全部出来るようにならないかなぁ?」って・・・。
    ああ、やったさ。作ってやったさ。毎日の運用が楽になる為ならと思ってな。

    で、クリアすればするほど、要件は更にメンドクサイわ期間は短くなるわ・・・。
    いい加減限界で「要員よこせや!」って言っても上はシカト。
    そうかいそうかい、僕がつぶれなきゃ人は増えんってか。へ~~~。

    な~んて思ってたら、本当にブっ潰れた。体も精神も。

    そりゃ一人でさぁ、要件来た後(箇条書きの時もあったな)、社内SEとして
    「基本設計」「外部、内部設計」「開発」「テスト」「リリース」「保守」を、全部一人でやってきてさー。
    あ、サーバも「UNIX系出来る人少ないから」って、合計で20台近く面倒みてたんだよ。

    ってかさ~、何で社外のサーバまで僕が面倒みなきゃならんの?
    IDSを引っ越しするという(相手側都合で)お仕事も、何で僕がPMになっちゃうの?
    ASPサービスなんだから社外でしょ?(社外)開発部隊でやれよ。
    Solarisをまともに扱えるのが(僕を含め)2人しかいないって、そんなの知ったこっちゃねーよ。
    こっちは社内だけで大変なんだよ!って声ももちろんシカト。
    結局やったよ。やってあげたよ。ホントめんどくさかったぜ!

    ま、そんな状態でやってりゃ、いつかはぶっ壊れる運命だったな。

    で、僕の休職中に、新しいサービス立ち上がったらしく、
    ついでに「今までの社内システムも見直そう!」ってなったらしい。

    で、僕のソースを見て「全然理解できんわ!」って声が殺到したらしい。
    結果として、半分くらいはそのまま使ってるらしい。
    それでも、工数は相当使ったらしい。おかげ様でヤツらには恨まれます、僕。
    でも、新しくリニューアルしたものは、使いづらいとの噂も・・・。
    (これらは僕を慕ってくれてる後輩から聞いた話ですので、話半分で)

    ちなみに、サーバ関連は外部委託にしたらしい。
    クラウドだか何だか知らんが、それでいいなら良いんじゃない?

    で、去年の忘年会で、そいつらが表彰された。
    運用のシステムリニューアルを成功させたからだって。
    で、表彰受けた後の挨拶で、
    そのプロジェクトのPMのヤツが、(僕に対する)嫌味を言ってくれまして。
    ま、元々お互い嫌い合っていたのもあるけど。

    その時、危うく再び精神的に来る所だったので、
    僕の今年最初の日記の様な事になったのだ。(さりげなく宣伝)

    あ、何か全然別の話になっちゃいましたね。
    本当にすみません。ゴメンなさい。

    #今更「健康第一でね」なんて言ってくんじゃねーよ!クソ上層部共め!!

    • by Anonymous Coward on 2013年01月05日 16時21分 (#2300764)

      コメント長すぎますよー

      #これでいいですか?

      親コメント
      • OKです!

        #こういうツッコミ入れてくれる人が少なくてねー。ありがたいです。

        親コメント
    • 何でも自分でやっちゃダメよー。
      PMさせられたならマシなメンバを何人か要求するとか。

      >「構造体苦手です」とか「多重配列難しいです」
      それは周囲のレベルがかなり残念だ。
      河岸変えたほうがいいんじゃないか?
      だいたいにおいてダメな会社には優秀な人は残らないもんよ。

      親コメント
      • > tarosukeさん

        >PMさせられたならマシなメンバを何人か要求するとか。

        その要求自体が通らないんです。
        「(マシなメンバは)皆忙しいから何とかして」で終了。
        というか、マシなメンバ自体少なかったかな・・・。
        ま、僕の要求の仕方が悪かったのかなぁとも考えてはいますけど。
        (スケジュールとか工数とか資料出しても無駄でした)

        >>「構造体苦手です」とか「多重配列難しいです」
        >それは周囲のレベルがかなり残念だ。

        やっぱりそうですよね?
        僕自身もそう思うのですが、周りの反応は・・・。
        残念な会社だったのかなぁ?

        >河岸変えたほうがいいんじゃないか?

        結果としてそうなりました。
        時期も決まってるので、それまではゆったりさせてもらいます。

        親コメント
  • by sindobook (35700) on 2013年01月07日 16時08分 (#2301761)
    永遠に件の人がメンテしてくれれば問題ない。
    もちろん退職前や交通事故で死ぬ前には全てのコードを読めるように直してもらう。たとえ家族との最期の別れをする必要がある場面でも、だ。
    つまり、コードを書く人含めて「部品」として取り扱う。改修も夜間障害対応も全部丸投げ。

    それが嫌なら書き直させる。
  • by Anonymous Coward on 2013年01月05日 13時15分 (#2300669)

    本人視点では多分何も困っていない。傍目には問題になっていることであっても本人は問題と思っていない。
    価値観が違うのだからスマートなコードと比較したところでおそらくかみあわない。
    生命の危機とかよほどのペナルティなりインセンティブがない限り変わることはないのではないでしょうか。

  • by shuichi (572) on 2013年01月05日 13時23分 (#2300676) 日記

    提案するからだめなのだと。
    するなら依頼か命令で。

    「読みにくいから直してくれ」と
    具体的にどこがダメなのかを明確に

    • by sumeshi0206 (12305) on 2013年01月07日 16時59分 (#2301790) 日記

      タレコミのようなコード書く人が居るから
      ・ループの入れ子はnこまで
      ・1行n文字以内
      ・1メソッドn行居ない

      等などのアホなコーディング規約出てくるのでしょうね。
      でもそういうので縛るのが単純で効果ありそう。

      業務系の画面なんかは美しくないかもしれないけど
      だらだら書いたほうが読みやすいです。
      勝手な解釈でやたらめったら分割されたら読み難い。適切で誰でもわかって短くて見分けのつきやすいわかりやす~いメソッド名、引数の変数名がするする出てくる人なんてそうそう居ない。ってか無理でしょう?

      親コメント
  • by Anonymous Coward on 2013年01月05日 13時28分 (#2300680)

    可能性はないだろうか。

    とある現場できっちりとオブジェクト指向設計されたPerlのコードがあった。変に妥協したようなところもなく、素晴らしいコードだと思ったが、そのコードをちゃんと読める人はあまりいなかった。

    その「頭のいい」人はそういう状況を避けるため、周りのレベルに合わせるつもりでひどいコードを書いているのかもしれない。

    • てっきり、
      「他の人にも読めるコードだと他の人にもメンテできるので、自分がクビになる恐れがある。
      他の人に読めないオレオレコードならば、メンテできるのが自分以外にいないので、クビになる恐れが少ない」
      かと思った。

      そういう例は日本だとあるかもしれない。

      親コメント
    • by Anonymous Coward on 2013年01月05日 18時27分 (#2300835)

      以前勤めていた会社、ポーティングすることが前提の業務だったため完全とは行かないものの他の人がメンテする前提で無茶なコードを書くとダメだよと言う社風でした。
      (残念ながら明文化はされていない)

      その会社へ途中入社したとある人物。(私とは部署違い)
      その人物のコードがひどくて、社内で技術トップだった人が可読性も移植性も悪いのでこれこれこういう風に直して欲しいと指摘する事例がありました。

      そのときの件の人物曰く「私は技術レベルが高いから他の人間が読めるようなコードは書かないんだ!」とのこと。

      周りぽかーん。
      その人物は、たしかあまり長く在籍しなかったはず。

      親コメント
  • by Anonymous Coward on 2013年01月05日 13時36分 (#2300689)

    この手の話は、コード規約をキツめにして守らせる、静的なコード解析や、コメント記載やらを
    ちゃんとする、ということにつきると思います。
    一例ですが、javascriptは インタプリタが賢すぎてヒドいコードでも 勝手に読みこなして
    くれるため、かなり「きれいに」書くのが難しい言語だと思いますが、
    静的コード解析器 jsLint を通して 警告が出なければ ほぼ 均質なコードになります。
    indentなどもチェックしますので使いはじめこそ膨大なエラーが出てしまいますが、
    習慣にしてしまえばラクですし、デバッグ作業も大幅に減りますのでいいことづくめ。
    coffeescriptの場合も jsLintでエラー0にすることを必須にしています。

    変数名やクラス名がひどい場合には、「名前をきちんとすればコメント記載を減らしてもよい」
    というルールがあればいいんじゃないでしょうか。

  • それがすごく知的なソースコードという事はありませんか?
    実は、貴方はソースコードを読めないから落書きのように見えるという事はありませんか?

  • by nee (41210) on 2013年01月06日 0時21分 (#2300953)

    「Googleはこういう規約でやってるよ」とか、他の権威と絡めて説得します。
    コードの書き方を提示するだけでは宗教論争で終わってしまうので。

typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...