@fhel (はすみ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

初心者がコードを読むコツについて 皆さんの考えやアドバイスをください

解決したいこと

初心者エンジニア研修生がプロジェクトのコードを読むときのコツを教えてほしいです。言語は主にC, Javaです(どちらかと言うとC)

困っていること

「プロジェクトの中から、該当の処理を見つけてみてください。」こんな課題が出ました。

何千行というコードが書かれたファイルが大量にあるプロジェクトに触れる経験がなく、初心者なのでどのように進めていくか非常に迷います。
私は「なんとなくこんな変数名があるんじゃないか?」と想像で検索をかけ、該当ファイルや処理を探していますが明らかに非効率です。

皆さんに募りたい意見2つ

  1. 何千行のコードが書かれたファイルが大量にある。その中から該当のファイルや処理を見つけるにはどうすればよいか。現状、「なんとなくこんなワードがありそう」という想像で検索をかけて、ヒットしたらラッキーみたいな感じでやってます。

  2. いざ該当の処理を見つけたけれど、変数名等が書かれまくってて、一つ一つ遡らないと。。という状況で変数名等を解明していかないといけないと思います。その時の読み解き方のコツを教えていただきたいです。

最後に

やり方は人それぞれだと思うので是非皆さんのやり方をお聞きしたいです。
色々な方の意見を取り入れていきたいと思っています。
ぜひたくさんのご意見をお聞かせください。

0 likes

7Answer

AI や設計書に頼れない場合ですが、コードを調べる方針はいくつかあります。探したい処理に適していそうなものから順に試していきます。

処理に関する名詞や動詞で探す

メールを送る処理を探すなら mail で検索する、ユーザー情報の登録処理なら register + user で探す、といった感じです。コメントがちゃんと書いてあるプロジェクトであれば、コメントに現れそうな単語で探す手もあります。

ファイル一覧から探す

秩序だったコードベースなら、ソースコードは機能や種類の単位で分割されているはずです。目的の処理をピンポイントで見つけられなくても、分類が近そうなファイルを見て参考にします。プロジェクトの命名規則やファイル分割の規則のあたりがつきますし、探している機能に関連しそうな関数名や構造体名が分かることもあります。

ユーザーインターフェースから探す

Web アプリや GUI アプリなら処理に関する画面があるはずです。そこに書かれているテキストだったりボタンの名前だったりを手がかりに検索します。 CUI アプリなら探している機能を呼び出すコマンド名などを検索します。

処理の流れを追って探す

main() 関数または特定の機能のエントリーポイントとなる関数から見ていって、より細かい分類の処理を呼び出す関数があればそこに飛んで探していきます。

デバッグプリントして探す

手元で動かせるプログラムであれば、コードの適当な場所に printf() やデバッガのブレークポイントを仕掛けます。探したい処理を実際に実行して、処理するコードが仕掛けた場所より前にあるか後ろにあるかを判断します。

4Like

Comments

  1. @fhel

    Questioner

    ご回答ありがとうございます!

    これを見ただけでも手段はかなりありますね。
    こちら明日から実践していきたいと思います。

実務であれば、今はAIを使うのが手っ取り早いです。従来手法でいうと設計書を確認するとか。
ただ、課題なら課題を出した人に確認するのが良いです。

1Like

Comments

  1. @fhel

    Questioner

    @te2ji さん
    回答ありがとうございます。
    AIにどんな情報を投げて、どんな質問をしますか?

  2. @fhel

    Questioner

    ありがとうございます!
    自分なりに試行錯誤してみたいと思います

まず第一に便利なツールは積極的に導入してください。 たとえばコールツリーを見れば全体像が把握しやすいです。

全体像を把握すればこの機能は当然このへんのモジュールにあるべき (あるはず) という絞り込みをするのは難しくありません。

第二には「プログラムを壊してみる」という手法が知られています。

関連しそうなところをまともに動作しないように書き換えたときにどこに影響が出るかを観測すればどこがどのように繋がっているか見えてきます。

もちろん自分の手元にコンパイル環境があって実行もできるという状況でですよ。 本番環境を壊したらえらいことなので。

1Like

まずはドキュメントを当たるんじゃないでしょうか?
無い場合はAIに作らせるのが良いかと思います。ただし会社の場合はその会社のルールがありますので、AIの使用については注意が必要です。

1Like

Comments

  1. @fhel

    Questioner

    ご回答ありがとうございます!

    今回ドキュメントはなかったので、AIに頼りたいと思います。
    ドキュメント作成のためにどんな情報を投げるのが良いのでしょうか?、

  2. 機密上問題がなければ、ソースコードから仕様書を作成するよう依頼すれば良いのではないでしょうか。

Gitのようなバージョン管理システムを適切に使っているプロジェクトであれば、コミットやプルリクエスト、イシューなどの文言を検索してみるという手もありますよ。

1Like

Comments

  1. @fhel

    Questioner

    ご回答ありがとうございます!

    Gitのようなバージョン管理システムは使用されています!
    文言の検索、明日やってみようと思います!

ご回答ありがとうございます!
壊してみる。という考えはありませんでしたが、確かにその通りですね。。
眺めるだけでなく、動かしてみる心構えはとても響きました
本番環境は気を付けます(笑)

0Like

Javaなら、まともな人が作っているなら名前空間名やクラス名で、ある程度そのクラスの役割が判断出来ると思います。Cの場合は、ファイル名、関数名あたりですかね。ファイル処理ならopen、close、read、write、通信関係なら send、receiveとか。

あとは、実行する処理に対して使う定番のライブラリやクラス、関数が存在するので、その名前で使用している箇所を検索かけてみると大分絞れます。このへんは、経験則になっちゃいますけど。

IDEでデバッグ実行可能なら、該当処理実行中に一時停止してどこで止まっているか見るのが一番手っ取り早いと思います。一瞬で終わる処理の場合、ログ出力しているなら、ログを見ましょう。ログ出力していない場合、デバッグログ出力を追加して追跡していくのも手です。

0Like

Your answer might help someone💌