それは僕こそが知りたい知識です。
土地勘がないコード群の中に突然投げ込まれて問題を解決せよと言われる状況というのは実は大きいソフトウェア企業では割と日常茶飯事に分類され、みんなどうにか血反吐を吐きながら解決している筈です。もちろん自分の担当するコードから出ずに仕事ができたら楽ですが、世の中そううまくは行きません。
僕が過去にそういう事態に直面した時にどう足掻いたか列挙しますので参考になれば幸いです。
バグの再現環境をまず作る
再現できないバグは、仮に神がかった直感に基づいたコード修正で解決できたとしても、解決に成功した証拠が得られないため修正できたという証明ができません。ビルドに1時間かかろうがタイムリミットが短かろうがデプロイ先でしか走らなかろうがどうにかして再現する状況を作るのが必須です。運良くユニットテストなりE2Eテストなりで再現する仕組みを作れたらその問題は半分解決できたようなものです。しかし現実は厳しく、手作業かつ低確率でしか発生しないようなバグには涙を堪えながら毎回手作業で再現させていたりもします。
作業メモは必ず残す
問題解決までの道筋は常に複数考えられます。結局のところ試みている道筋は何らかの理由で頓挫する事が多いので、何故この道筋を選んでどこまで進んで何故頓挫したのかをメモします。これは自分の思考を整理するためにも後で他の人に助けを求めるためにも有用です。もしくはなぜ不可能なのかを最終的に説明する際の下書きにもなるというか、むしろ不可能であることを客観的に証明するためにやってるんだぐらいの気持ちで作業している方が気が楽です。やっている事の実態は科学的な実験であるので、仮説を立てて検証するサイクルを意図的に回し、自分が何をしているのかを自分自身に説明するよう意識しないとわけのわからない試行錯誤に陥りがちなのが僕の悪い癖です。
コードを容赦なく壊す
コードを斜め読みして今回のバグと関係がありそうな箇所を名前で決めつけてコメントアウトします。それでもバグが再現するなら今回行うであろう修正とは関係がないはずなのでその細部の探索は後回しにできます。コードが複雑に絡み合ってると関数呼び出し一つスキップするだけで色んな所に波及してしまうので日頃から自分だけでもそういうコードを書かないよう心がけるばかりです。あと「この箇所を通っているかどうかすら分からない」「何故かこのコードが実行されているがどこから呼び出されたのか追いきれない」なんて事もザラにあるので、クラッシュしてスタックトレースを吐くように細工するのはコードを頭に押し込む手助けにもなります。ありがちなのが「問題箇所と全く関係ないところを被疑箇所にしてしまっていた」パターンなので、自分が常に狙った通りの箇所を観測できているかは疑い続ける必要があります。更にはこれを言ってしまうと力量を疑われると思いますが、わかりきっている事でもログ出力に足してみたり自分の脳内トレースと出力が一致しているかを確認するだけでもだんだんと目の前のコードが自分ごととして考えられるようになってきて心理的な抵抗感が薄れていきます。
なお巨大なコードは余りに巨大でありデバッガをアタッチしたらそのまま固まってしまうので僕はデバッガに頼りません。
ドキュメントに目を通す
いやもうこれ最初にやれよと後になって思うのですが、巨大なコードとは得てしてドキュメントも巨大である事が多いのでいきなり頭から全部ドキュメントを読んでいたらそれだけで一生が終わってしまいます。しばらくコードに浸かっていれば問題箇所に関係がありそうな固有名詞がいくつか目星がつくのでそれらで検索をかけて関係がありそうなドキュメントを掻き集めます。特に英語だと「ほげほげ101」とか「Life of ほげほげ」みたいなタイトルのドキュメントはそのドメインでの目的や問題意識を初歩から説明してくれるので特に役に立つことが多いです。
例えばChromiumのコードと格闘しているなら Life of a Pixel なんかは有用なドキュメントと言える筈です。
そして、ドキュメントに目を通してからソースコードに戻ってくるとなんと驚くことに相変わらずわけがわかりません。もっと頭が良い人ならドキュメントを見て理解できるのかも知れませんが、僕のように凡庸なプログラマはドキュメントとコードを交互に眺めて氷塊を少しずつ溶かすように実装者の気持ちを理解していく必要があります。この過程は時には週単位での時間を必要とします。
土地勘のある人の発信をよく読む
自分ではとても難しそうに見える事をいとも容易くやっている人たちの脳内には目的のコードに対する自分より精巧な脳内モデルが完成しており、そのモデルに基づいて行われる発言は意識的にも無意識的にも自分とは異なる物になっているはずです。ドキュメントに限らずチャットやブログなどのログにも目を通して、自分との差分に着目しながら何を思いながら該当箇所のコードを書いたかを想像することで現状のコードを理解する助けになることがあります。運良く開発者と会話できるのであれば、どういうつもりでコードと接しているのかを観察する事が時折自分の理解の助けにもなります。と言ってもやはり何がなんだか分からない状態をしばらく続ける事になりますし巨大なコードはどう折りたたんでも巨大なので認知能力の差に絶望するだけの事もままありました。
さて書き並べてみるといよいよもってただ藻掻いているだけですね…。もっと経験の深いソフトウェアエンジニアの方々がどのようにこの問題を解決しているのか、ぜひ広く意見を伺いたいです。