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

引き継いだプログラム、「自分のもの」にするには ? 82

ストーリー by reo
読む価値の有無に関わらず読まねばならん事もある 部門より

あるAnonymous Coward 曰く、

本家「Learning and Maintaining a Large Inherited Codebase ?」より。

この仕事に就いてから、比較的大きなプログラム (3 ~ 4 万行程度) を何度か引き継いだことがある。元々の開発者らは、自分の書いたコードでもあるし (その仕様や動きを) よく理解していたが、自分はそこまでとは言えない。実際、プログラムに修正を入れる際は修正そのものよりも修正を入れるべき正しい位置を探すのに多くの時間がかかってしまう。

このように引き継いだプログラム、どうやったら理解できるようになるのだろうか ? 元の開発者らほどこのプログラムを「理解」できないのは自分の力量の問題ではなく、仕方がないことなのだろうか ?

本家 /. には「一から作り直したくなるだろうが、それは絶対に避けるべきだ。汚く見えるコードにも、全て理由があったりするものだ。開発時の相談や議論、意思決定までの過程にいなかったからコードが理解できないのである。一から作り直しても、そういった問題への理解は深まったりはしない。苦労してバグを直したり、修正を入れたりしてこそ分かるようになるものであるし、そうやって分かるようになれば作り直す必要もなくなる」といった経験からくるコメントなどが多く寄せられている。

やはり「ドキュメントも無く、元の開発者に質問できないのだとすれば、時間をかけてコードを読み砕くしかない」のだろうか ? /.Jer は引き継いだプログラムをどうやって「自分のもの」にしている ?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by mer (347) on 2010年02月17日 12時09分 (#1719378) ホームページ

    そんなことする時間なんて与えられないよ! とか言われそうな気もしますが、他人が書いた製品の仕様を理解するのに、仕様化テストは役に立ちました。

    仕様化テストのおかげでバグを大量に発見し、それで忙しくなりましたが…。

    レガシーコード改善ガイド
    http://www.amazon.co.jp/dp/4798116831 [amazon.co.jp]

    web でも一部読めます。
    http://codezine.jp/article/corner/308 [codezine.jp]

  • 属人化 (スコア:3, すばらしい洞察)

    by patagon (1453) on 2010年02月17日 12時25分 (#1719396) 日記

    属人化しないことが求められているのに、結局、属人化してしまう。
    話が違うのか?

    いつまでも呼び出されたり、聞かれたりしたくないよね?

    • Re:擬人化(おふとぴ:-1) (スコア:1, すばらしい洞察)

      by Anonymous Coward on 2010年02月17日 13時08分 (#1719466)

      擬人化に空目した自分はもう駄目かもしれない。

      #しつけのなってないコードたんを一人前のレディに教育だ! と思えば思い入れで自分ものに出来るかもしれない。。。かな?

      親コメント
    • by Anonymous Coward

      属人化をどう考えるかは立場かによりますね。

      経営者や管理者にとっては属人化はデメリットなのでしょうが、末端の技術者にとって
      切り捨てられない為の重要な手段だと思います。世界のためには不都合でも、自分のた
      めには武器なのです。

      そうしないと自分の仕事がどんどん安い人たちに置き換えられてしまいますし。

      • Re:属人化 (スコア:2, 興味深い)

        by Nekozuki Coward (37579) on 2010年02月17日 12時55分 (#1719438) 日記

        自分にしかわからないようなコードを書いてると評価が低くなるのが普通では?
        評価が下がったら給料も下がるし解雇(もしくは契約更新せず)もあるのでは?

        親コメント
        • Re:属人化 (スコア:2, すばらしい洞察)

          by Anonymous Coward on 2010年02月17日 13時00分 (#1719449)
          自分にすらわからないようなコードで悪戦苦闘すればするほどその努力を評価されるのが日本における普通です。
          親コメント
      • Re:属人化 (スコア:1, 参考になる)

        by Anonymous Coward on 2010年02月17日 19時26分 (#1719708)

        > そうしないと自分の仕事がどんどん安い人たちに置き換えられてしまいますし。

        そんな小細工しても、『実物とソースがあればオフショア受けまっせ!』なんて
        言ってる連中もいるらしいので、(本当に可能で事実だとしたら)無駄では?

        『ソースがあれば』について余談:
         開発チーム内にもソースを見せないド阿呆が居たことがあります。
         そいつのモジュールがどう考えてもおかしいので、ディスアセンブルしてバグ
         指摘したことが・・・。なにやってたんだろうね。

        親コメント
      • by Anonymous Coward
        属人化してるところからはやく切っていかないと手遅れになるのですね。
    • by Anonymous Coward

      属人化の定義にもよるけれど、「属人化しないこと」は目的ではない。
      「属人化するな」の多くが、プログラミングのできない奴の戯言だったりするんだよな。

      また、多くの「属人化していないコード」というのが、日本の現場では
      「極めて品質の悪いコード」と同義だったりするから、
      「手段の目的化は辞めろ」と言いたくもなる。

  • 引き継ぐとはこういう事 (スコア:3, おもしろおかしい)

    by Anonymous Coward on 2010年02月17日 13時09分 (#1719467)

    /* 2010/02/16 そもそも不要のため削除 開始 by 細野 */
            /* 2001/08/10 バグのため削除 開始 by 坂本 */
                    /* 1996/10/23 仕様変更のため追加 開始 by 高橋 */
                    /* i++; */
                    /* 1996/10/23 仕様変更のため追加 終了 by 高橋 */
            /* 2001/08/10 バグのため削除 終了 by 坂本 */
            /* 2001/08/10 バグ修正のため追加 開始 by 坂本 */
            /* i--; */
            /* 2001/08/10 バグ修正のため追加 終了 by 坂本 */
    /* 2010/02/16 そもそも不要のため削除 終了 by 細野 */

  • by Anonymous Coward on 2010年02月17日 11時39分 (#1719338)

    プログラムの現状とあるべき姿をよく理解しないと、代替品なんか作れないね。
    作り直してもいいけど、それはプログラムを自分のものにしてから。
    つまり、自分のものにする代替にはならない。

    • そもそも論 (スコア:3, 興味深い)

      by ncube2 (2864) on 2010年02月17日 13時12分 (#1719469)
      目の前のプログラムがどうのこうのの前に、元の要求仕様とかの上流の設計をなんとかしたくなる方が多くない?
      (COBOLプログラムの簡単なメンテだと言われて引き受けたものの、インラインで言語仕様が非公開&サポート窓口なしのアセンブリ言語が出てきて頭を抱えたことがあるのでID)
      親コメント
    • by Anonymous Coward
      同感。
      理解したいなら素直に要求仕様とソースを読めばいい。
      どんなに汚いコードでもそこに書いてあるとおりに動くのだから。

      むしろ書いた本人以外のほうが、思い込みがない分だけ動作を正確に理解できるはず。

      「汚くて理解できない。ゼロから書き直したほうが早い。」
      などと言う奴に限ってゼロからはコードが書けない。
      そんな奴にメンテを任せると状況はどんどん悪化する。
      • by Anonymous Coward

        ソースが汚い場合でもソースが読めないのは作成者より読解者の肉体的能力が劣っているのかな?という感じはする。
        そういう作成者はソースが汚かったり、作業手順が非効率でも不便なままなんとかしてしまうサバイバル的能力があるというか。

  • by naruaki (2658) on 2010年02月17日 12時10分 (#1719379) 日記
    何故このような形になっているのか?
    を知る為にも履歴管理されていると助かります。

    修正時の影響範囲の抜けとかね。

    だからと言って、書いたコードを消すな!という作法を押し付けているんじゃないからね。
    前世紀の慣習と思いたい。

    • by Anonymous Coward
      /* 2006.08.01 ○○仕様変更。下記削除 Sato */
      /* 2006.11.10 再度復活 Tanaka */
      //#if 0
      /* 2005.12.07 I/F変更により下記処理追加 Suzuki */
      if ( m_*** == XXXX )
      {
      xxxxxxxxxxxxxx;
      }
      /* 2006.11.20 △△△対策 Tanaka */
      else if ( m_*** {
      xxxxxx;
      }
      /* 2005.12.15 フェイルセーフ追加 Suzuki */
      {
      xxxxxx;
      }
      //#endif

      混沌の歴史が分かるのは良いけど、いい加減消させてよ。
      消えていった人の名前だらけだよ。
      ※フィクションです。
      • Re:変更履歴 (スコア:2, 参考になる)

        by wolf03 (39616) on 2010年02月17日 13時47分 (#1719502) 日記
        これじゃ分からないよ
        開始位置だけ分かっても、終了位置が分からないと
        管理番号+STARTと管理番号+ENDで挟み込んでおく物さ
        ま、同じところで何度も修正されると分け分からなくなるけれども

        海外本社の某社では変更履歴は仕様書のみで、ソースには残さない
        せいぜいが確認に使ったdiffリスト位だった
        #仕様書の変更漏れが複数見つかりパニックになっていたな
        親コメント
      • by Anonymous Coward
        foo()
        {
            /*  履歴ばっさり消したコード  */
        }

        /*  ただのコメントアウトだから規約違反じゃないよね  */
        //  foo(){
        //  /* 2006.08.01 ○○仕様変更。下記削除 Sato */
        //  /* 2006.11.10 再度復活 Tanaka */
        //  //#if 0
        //  /* 2005.12.07 I/F変更により下記処理追加 Suzuki */
        //  if ( m_*** == XXXX )
        //  {
        //  xxxxxxxxxxxxxx;
        //  }
        //  /* 2006.11.20 △△△対策 Tanaka */
        //  else if ( m_*** {
        //  xxxxxx;
        //  }
        //  /* 2005.12.15 フェイルセーフ追加 Suzuki */
  • まずは (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2010年02月17日 11時58分 (#1719364)
    ソースファイルの先頭辺りのコメント行に、
    // coded by ○○
    と自分の名前を入れよう。

    こうすることで自分のものになった感が高まり、解読もスラスラ進むように、、
    • Re:まずは (スコア:1, おもしろおかしい)

      by Anonymous Coward on 2010年02月17日 14時32分 (#1719532)

      作った覚えの無いソースに、

      // yyyy年xx月xx日 Anonymous Coward 新規作成

      って書かれた俺が通りますよ。 そこコピペすんなw

      親コメント
    • by Lv5DeathMarch (30244) on 2010年02月17日 14時33分 (#1719535)
      その発想は良いのですが、私なら逆の方法を取ります。

      まず全てのソースコードの先頭に「未開拓モジュール※」とコメントを入れて、コードの内容を掌握したものからそのコメントを消していく、というメソッドで。

      # ※
      --
      Lv5以下の社員全員にデスマーチ!
      親コメント
  • readonly (スコア:1, 参考になる)

    by Anonymous Coward on 2010年02月17日 18時40分 (#1719682)
    IDE の活用ですかね。書くときはともかく、読むときはかなり助けになります。

    という話をするとあんなの使えるかとかなんとかと決まって言われるのですが、
    そういった自称(emacs|vi|秀丸|とかいろいろ)マスターの人に限って、
    問題の個所を探すのに時間がかかったり探し当てても違っていたりして、
    いろいろなトラブルのもとになったりするわけです。

    「それはそいつが(emacs|vi|秀丸|とかいろいろ)の使い方を知らないんだよ」

    ええ、その人も最初同じことを言ってましたよ。

    もちろん本当に早い人もいて、そういう人はサクサクやってくれます。
    このあたりは見栄で使ってる若いモンより使い込んでる古参のおっさんの方が確実だったりしますな。
    「いや俺これしかわかんないからさ……」
    とか言いながらズバババッ!とそれは見事なものです。
    • Re:readonly (スコア:3, 参考になる)

      by ef (25263) on 2010年02月17日 19時19分 (#1719702)
      IDEで出来ること出来ないことを織り混ぜて列挙
      1. クロスリファレンサなどで静的な分析をする
      2. 実際に走らせることが出来るのであれば、プロファイラやカバレジテスタで動的な分析をする
      3. テストケースを作る
      4. 引き継いだコードが cvs などで管理されている場合、故事来歴を観る
      5. 命名規則などコーディング規約を推定する

      ひどいときは、2.でやっと本物の main() を発見したり。
      あと地味ですが unifdef(1) が便利なこともありますね。

      多分に偏見が混じっていますが、IDE使っているヒトの作業を観ると、上に書いたような分析で、
      何度も同じ事を繰り返しているように見えてしまいます(それで頭に入れているのかもしれません)。

      まぁ、道具は道具でしかないので、、最後は野性のカン。

      親コメント
  • by onikuya (17148) on 2010年02月17日 19時31分 (#1719716) 日記

    確認しつつ元のコードを詰めてますね。
    で、ついでに仕様書書いたりコーディングスタイル直したり

  • まず、私が、引き継いだときにやってみることは、
    自分なりに、こうしたら良いのでは、という改良をしてみます。
    もちろん、元のソースコードは、保存しておいて、自分の実験バージョンを作ります。
    改良によって起こった障害などを追いかけている間に元のコードの意味が分かってきます。
    ただお経を読むみたいにソースを眺めても、殆ど大事なことは分かりません。
  • by Anonymous Coward on 2010年02月17日 21時00分 (#1719778)
    まともな資料がないことが前提として、ソースコードを仕様として必要最低限の大雑把な資料を作ります。
    その資料をもとに自分の好きなように書き直し、書き直したところが元のコードのどのあたりに相当するのかをコメントしておきます。
    # 書き直す場合、1から書き直すのでなく非効率なところを効率的に~とかやってると楽しめます:)
    # 非効率なところってのはコーダの癖が出ているものなので、理解を深めるためには悪くありません。

    大体1~3割程度進めると元のコードのコーディングスタイルに慣れてきて読めるようになっているため、そこで手を止めます。
    元のコードをコピーしたものにたっぷりとコメントを入れておきます。
    可能であれば仕様書を起こします。ここまで作ったものは全て自分の環境にだけ置いておきます。

    大抵バグや構造上の制約が見つかるため、テキストでいいのでメモしておき
    これだけはチームの誰もがアクセスできる共有スペースに置いておきます。

    # グローバル変数使いまくりの場合は自分のものにはできないと諦めた方がいいです。
    # オブジェクト指向でもインスタンス変数をグローバル変数的に使っているものも諦めたいです。こちらのほうが難易度高いです
  • 修正する場所を見つけるには、それに近そうな場所をgrepして見つける。
    文字列とか、APIとか検索のヒントになりそうなキーワードはたくさんあるはず。

    そんで、検索に引っかかったところらへんにブレークポイントを立てまくる、
    IDEがなさげな、コンパイル言語だったら、適当に書き換えてわざとコンパイルエラーださせて依存関係とか特定する。
    コンパイラもないLLだったら、die とか スタックトレースとかをバシバシ埋めていって依存を調べる。

    そうやって、ここら辺はこんなことをしている、こっちらへんは何をしているとか大まかに把握する。
    5万行のソースでも、5つの部分に分けられるんだったら1万行のソースだし、残りの4万行は見なくていい。存在を忘れる。

    んで、修正に必要な箇所が入っていそうなところがあったら、そこをピックアップしてその中でまた細分化して大まかに把握する。
    これを何度か繰り返すと、全体が少しづつ見えてくると思う。

    あとは、我慢の限界を超えたところから少しづつ書き換えていけばいいと思うよ。

    --
    by rti.
  • by Anonymous Coward on 2010年02月17日 11時52分 (#1719355)
    修正に必要な部分以外読まない。手を入れない。そして、不具合が出ないように祈る。
    前任者が自動テストの環境を作っているなら、自動テストが通るくらいの確認はしますが。。。
    「すべてを把握した後に修正」なんて無理に決まってるので場当たり的にやるしかない。

    仕事であれば、元の開発者に逃げられた管理者が悪いに決まってる。
    • by Anonymous Coward

      >元の開発者に逃げられた管理者が
      ということは、本来なら全てのこーどを元開発者がメンテし続けろと?

      • by Anonymous Coward on 2010年02月17日 12時52分 (#1719431)

        未来永劫開発者が管理するんでなきゃ、開発者は自分以外の人間がメンテしやすく作ってるべきだよね。
        そうでないコードの場合、そんな人間に開発させた管理者が悪い。レビューでの指摘を怠った管理者が悪い。
        あんた何を管理してたんだって話。

        あっスケジュールか。

        親コメント
        • by Anonymous Coward

          同感です。
          市販ソフトでも時々開発者に逃げられたから開発終了ってのが有りますが
          (別のソフトは売っているから開発部門が消えたわけではない)
          そういった方面への考慮が欠けている会社も有るんですかね?

          そもそも、デスマーチで一時的に大量に人員を投入して作ったシステムだと
          メンテ担当者は他人が作ったばかり弄っている筈なんで、ノウハウが
          無いなんて事は無い筈なんですがね。

    • by Anonymous Coward

      >修正に必要な部分以外読まない。手を入れない。そして、不具合が出ないように祈る。
      日本企業での処世術としてはこれが大正解ですね。
      責任感なんて持って仕事に取り組むと、潰れるまで全責任を押し付けられるだけだから。

      >仕事であれば、元の開発者に逃げられた管理者が悪いに決まってる。
      なんだけどね。
      彼ら管理者は、仕事は三流でも責任逃れ「だけ」は一流だったりするから。

  • by Anonymous Coward on 2010年02月17日 12時24分 (#1719395)
    これはすごく重要な議論ですね。 ほんと、たった3行のコードを書くにもレビューやらなにかがあって、時間かかったりします。 すべて自分が一から作っていいなら、早いには早いんですが労力は大変ですからね。 問題はなかなか自分のコードにならないんですよね。
  • by Anonymous Coward on 2010年02月17日 12時54分 (#1719436)
    男にはな…男にはスパゲティと分かっていても食べなきゃならんときがあるんだ!
  • by Anonymous Coward on 2010年02月17日 13時30分 (#1719491)

    引き継いだプログラムを自分のものにしている間にも他の業務が発生するので
    そんな暇はなく、結局改修案件の度に時間をかけることになるんだ

    時間がもらえたならソース読んどけ。ドキュメントには大抵嘘か表面的なことしか書いてない。

  • by Anonymous Coward on 2010年02月17日 14時46分 (#1719547)
    『仕様書はありますか?』
    「お渡ししたコードの動作が仕様です」

    「あ、でもそのコードにはバグがあります」
    • by firewheel (31280) on 2010年02月17日 17時49分 (#1719653)

      「今回はメンテナンスしやすいようにと思い、ドキュメントは沢山書かせました。」
      「ただしドキュメントとソースは一致していません。」
      「ドキュメントも毎日の様に変更されたので、どのバージョンに準拠して書かれたコードなのかは誰にも分かりません。」
      「ドキュメントに含まれてない仕様も多数存在します。」
      「また、その分コードを書く時間が減って、コメントとかデバッグの時間が無くなりました。」

      プログラムを書いたことがない素人ほど、ドキュメントで問題解決できると勘違いするんだよね。

      「しかし、情報が依然まともに伝わって来ないし行かないので、デバッグはなかなか進まなかった。
      隣の部隊に届く仕様書と時間差があって、マイナーバージョンで5ぐらい遅れているのだ。
      そのくせテスト時には、俺たちブロックにバグが多い事を責め立てられる。」
      http://mssi.blog29.fc2.com/blog-entry-830.html [fc2.com]

      親コメント
  • by Anonymous Coward on 2010年02月17日 14時48分 (#1719550)

    十分な引き継ぎ期間と工数をもうけて、しっかり引き継ぎをする。
    引き継ぎ後も、前の担当者とも常時連絡可能なE-mailアドレスと電話番号を聞いておく。
    前の担当者に逃げられたなど言語道断。

    さらには引き継ぎ資料もなければコメントもない担当者も全員逃げたようなスパゲッティ
    プログラムの場合は、全部棄てて一からやり直すのが一番の近道。

    #日本有数の技術力を誇る大企業(笑)でも、そういうレベルの問題で製品が自然消滅した
    #くらいだから、日本の経営者のアホさ加減は救いようがない。

    • by ef (25263) on 2010年02月17日 17時28分 (#1719639)
      前任者と意思の疎通の図れる共通の(自然)言語がない場合ピンチ。特にコメントが読めない。
      親コメント
      • by firewheel (31280) on 2010年02月17日 17時54分 (#1719659)

        オフショアの話かな?それが英語くらいなら「勉強しろ」だと思う。
        オフショアに出すような場合は、関係者全員が共通言語(ほとんどは事実上英語になる)くらいを学んで
        いなければ仕事は進まない。また、そういう共通言語の有ることがフショア先を決める要件の一つにもなる。

        共通言語もない所をオフショア先として決定したのだとしたら………、それはもう経営者レベルの失敗だな。
        しかし日本では経営者の失敗は公式に認められることは滅多にない。

        ちなみに共通言語があったからと言って、意味不明なコメントが無くなるとは限らない。
        それは非英語ネイティブ同士ならもちろん、日本語ネイティブ同士が日本語で書いた時でさえ存在する………。orz
        #コメントの書き方も、属人的スキルの一つなんだよね。

        親コメント
typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...