コードを引継いでどこから手をつけるか

http://www.se-radio.net/2009/11/episode-148-software-archaeology-with-dave-thomas/

1 comment | 4 points | by WazanovaNews 約3年前 edited


Jshiike 約3年前 edited | ▲upvoteする | link

他人から引継いだコードを把握するのにどこから着手するかというテーマで、たまたまいくつかのエントリーを見かけました。「コードを読み切れないほど膨大にある。」「前任者、経緯のわかる人がいる/いない。」「ドキュメントがある/ない。」など様々な事情が想定されますが、全部まとめて主な声を拾ってみました。

  • 謙虚な姿勢で臨むこと。そのコードベースがわかりづらいのは、書き方が悪いコードだからかもしれないが、自分がその専門領域の知識がなかったり、ベースにあるアルゴリズムが本当に複雑な場合もありうる。それを、全てコードが悪いと思い込むと、自分にとってストレスだし、周りにも迷惑がかかる。
  • テストが完璧に用意されたコードはおそらくほとんどない。テストを追加、もしくは改善するという作業から着手すると、本番サービスに影響与えることなく、理解も進むし、コードの質も上がる。
  • 小さなタスクをこなして本番にアップしてみる。バグ修正から着手。
  • まわりに質問する。同僚の仕事を中断させることになるが、邪魔されることよりも、新メンバがすぐにたちあがるメリットの方が大きいと常識ある同僚は理解するはず。
  • コードレビューの資料の発言内容から、よく理解できている人を判別する。
  • よく理解している人とペアプログラムする。
  • 少しコードベースを理解できたら、ドキュメントをまとめてみる。最初は自分の理解の確認のためだが、やがて皆のメリットになる。
  • ハイレベルのアーキテクチャを理解するために、同僚にダイアグラムを描いてもらう。
  • パブリックAPIの重要そうな機能が、どのようにその目的を達成しているかを把握する。パブリックのインターフェースから、その機能の実装まで下る。それから関連するAPI、そしてデータ構造を理解できるまでコードをたどっていく。
  • APIのコードで、そのAPIがどう動作するかわかるが、しっかりしたユニットテストがあれば、APIの性格まで把握できる。
  • (プログラミング言語によるところはあるが)型の把握から入る。functionを定義するのに、パラメータとして、またグローバル/継承のスコープ/他のステートを介して、どの型が必要か。どの型が直接関係するのか。例えば、containerからstring、container自身、インデックス?
  • ロギングから手をつける。そのコードを把握しようとする最初の人でなければ、すでにデバッグツールがあるかもしれない。
  • まずは、正しいバージョンのコードを受取ること。テスト、ドキュメントを含め、全てを受取ること。

  • フォントを極端に小さくして、全体を素早く眺める。コードの構造、パターンが把握でき、後に詳細を確認するときにこのイメージが頭の中にあると役に立つ。

  • コードカバレッジ / callグラフを作成できるツールで、重要な箇所を判別。

  • 概要を把握するために、まずは単体テストよりも結合テストの内容確認。

  • 元々書いた人が怠惰だとメインのファイルが肥大していることが多い。ハイレベルでのキーコンセプトになりそうなキーワードでgrepしてみる。例えば、配送関連のコードだと、”ship” / “postage” / “package” など。

  • 大規模なスパゲッティ状のコードベースを引継いだ際、UMLダイアグラムに落とし込もうとして、失敗した。ダメなコードはダメなダイアグラムになるので、それを解明する時間は割に合わない。

  • Javaの場合はChrononを使ってサーバの実行内容を記録してみる。再生/巻き戻しをしながら、コードの内容 / スレッド / オブジェクトのステートなどをざっと見ていく。小さめの機能を実行して、input/outputを追う。それから複雑なものに移行する。コア機能、エッジケース、パフォーマンス向上の勘所などがつかめる。

  • 大規模プロジェクトを書き直す場合は、コードもドキュメントも忘れて、まずはユーザ視点で何を残すか決める。ユースケースを調べて、機能の取捨選択からはじめる。

[参照記事一覧]

http://www.se-radio.net/2009/11/episode-148-software-archaeology-with-dave-thomas/

https://news.ycombinator.com/item?id=8257327

http://devblog.nestoria.com/post/96541221378/7-strategies-to-quickly-become-productive-in-an

https://news.ycombinator.com/item?id=8263402


ワザノバTop200アクセスランキング


Back