Bot

仮想通貨botの開発記録#53(2024/2/10)「エラーに対処する根本的な方法を身につける:ソースコードの読み方」

2024年2月10日

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

エラーに対処する根本的な方法として「ソースコードを読む」というアプローチがあります。

プログラマーがどのようにソースコードを読んでいるのかということを調べて、Bot開発に使えそうなポイントを整理しました。

Yodaka

一次情報にあたるというアプローチは、長期にわたって確実に効果を発揮する部分です。

【ソースコードを読むポイント】

  • イベントが発生する場所から読む
    →ユーザーが実行したことに対してシステムが結果を表示する箇所を探す
    →ユーザーの操作以外に処理を実行する部分にも注目。Botは特にこの箇所が多い。
  • 読んでも分からない処理は読み込まない
    読み飛ばして良いソース読まなければいけないソースの見分け方を知る
  • プログラムに慣れるまでは読むソースコードの量を減らす
    →理解のベースを作るのに重要なこと。今自分が分かる範囲で確実に理解できることを増やして、それらを繋げていくイメージを持つ
    →「全体像を掴んで慣れてきたら詳細なロジックを読む」という流れで読む
  • 他人が読みやすいプログラムを書く
    →「リーダブルコード」などの書籍を参考にして、「他人が読みやすいコード」を書く
    →この本は今使っているので、引き続き内容を刷り込んでいく

【読まなくて良いソースの見分け方】

  • 「メソッド呼び出しをしている処理」でなければ読み込まなくてOK
  • 共通処理は使う側の人は読まなくてOK
    Bot開発においてはこの限りではない

【まとめ】

  • イベント発生の箇所を探す
  • メソッド呼び出しをしている箇所を探す
  • 最初のうちは共通処理は見ない
  • 最初から詳細な部分を読み込もうとしない
  • 最初は「読むプログラムの量を減らす」
  • 少ない量を完全に理解したら詳細な部分を読み込む

【コードリーディングの方法・コツ】

コードリーディングとは「名前の調査」。それぞれの名前(構成性要素)が何を表しているのかを理解すること。

ソースコードの構成要素は

  • ファイル名
  • 関数名
  • 変数名
  • 型名
  • メンバ名

など。

【コードリーディングの技術】

1.データの構造体やクラスの構造を見る

2.関数の呼び元を見る:知らない関数は呼び元での使われ方を見てみる。そこから使われ方の推測を立てられれば、関数の中を見なくても済む

3. コールグラフ:関数呼び出しの関係図を描く。関数の数が多く、呼び出しが深い時に有効

4.検索の「アタリ」をつける:「探しているものがどこにあるであろう何なのか」を常に意識することで、潜り過ぎや検索迷子になることを避けることができる。

5.関数の引数をチェックする:基礎的なことだが忘れがち。頻出テクニックなので、まずはこれを思い起こすようにする

6.関数呼び出しから重要そうな関数を見つける:経験に基づく直感力が要求される領域なので、今はスルー。いずれ理解できる時が来るはず。

【読まない技術】

1.変数宣言は読み流す:使われる時に確認すればOK

2.上の方で宣言されている関数は飛ばす:上の方で宣言されている関数は下の方で宣言されている重要な関数のための部品である可能性が高い

3.長い関数の上の方の処理は飛ばす:一番下で呼ばれる関数一つだけを読む

4.関数名から処理を推測する:基本的には関数名を信頼する。ただし、関数名がその処理の内容を正しく表していない可能性があることにも注意しておく。重要そうではない関数名の関数が重要な処理をしていることがある。
→Bot開発においてはクリティカルな問題。「意味が一意になる関数名」を付ける習慣を磨く。

5.例外処理は飛ばす:例外処理はメイン処理を円滑に行うための補助。メインの処理を理解することを優先するのであれば、詳細に読み込まなくても良い。
→その一方で、Botのコードを書く時には例外処理は非常に重要ソースコードでどのような例外処理が施されているかを読みこむとポイントを掴める。

【宿題1】

  • 意味が一意になる関数名をつける
  • ソースコードの例外処理を見て、Botの稼働においてどのような例外が発生するのかを知る

【ソースコードを効率よく読むコツ】

1.読む目的をはっきりさせる:構造の理解or不具合解析。何のためにソースコードを読むのか目的をはっきりさせておく。 →Bot開発においては不具合解析の場面が多いので、メソッドの名前やコメントなどを一切信じないで書いてあることを忠実に理解するように努める

2.目的にそぐわない部分は読みとばす:必要な部分だけを読むことで時間短縮できるし、理解も深まる。その土台となるのは「1.読む目的をはっきりさせる」こと。明確な意図を持って読めば、知らなくて良い部分をスルーできるようになる。

3.推測しながら読む:プログラムの全体像や処理を推測しながら読む。クラスやメソッド名から処理の内容を考えてみる。 →処理の過程のテンプレートを知り、そのイメージを作る必要がある。プログラムがその処理の過程で何をしているのかを復習しておく。 【宿題】プログラミングの処理の基礎を勉強する

4.無駄なコードは消して読む:必要な部分だけを残して読む。余分なコードはノイズ。戻り値チェック・エラーハンドリング・昔のコードを消した履歴やコメントなどは真面目に読まなくてOK。 →何が必要な部分なのかをはっきりさせておくことは重要。ここでも「1.目的の明確化」が効いてくる。

5.メモを取る:クラスの関係はメソッドのつながりをメモしながら読む。読んで分かった内容や構造をメモしておくと、一度読んだ部分を繰り返し読む手間が省ける。再読の効率を上げるために重要。人は忘れる生き物なので、忘れてしまったことを読み返すことが前提。記憶力の良い人はスルー推奨。

6.デバッグ・テストする:実際に動かしながら理解する。実際の動きを見ながらコードを追うことで確実に理解できる。ログ解析の技術にも通ずる。エラーメッセージも詳細に追っていくことで、変数の中身なども理解することができる。 →Bot開発においてはこの部分の比重が大きい。確実にモノにしておく。

Yodaka

VSCodeでのデバッグの具体的な方法をXにてリプライを頂いたので追記します(2024/2/11)。

【宿題2】

  • リーダブルコードを参考にしてコードを書く(現在進行形)
  • コーディングの思想について本でも学ぶ(ビューティフルコードを購入済み)

まとめ

今回まとめた内容を公式ドキュメントの読み方とあわせて活用していきます。

特に、読む前の下準備を整えることで「読まなくても良い部分を省く」というポイントは私に馴染み深い読書の技法にも通ずるところがあり、スッと理解できました。

一方で、コーディング作業そのものに対する理解はまだ浅いな、と感じます。

経験不足からくる理解の浅さであるため、地道に理解できることを一つずつ増やしていきます。

あとは、これらの技術を実際に使って、馴染ませていくだけです。

また、技術を身につけて本質的なレベルで理解して使えるようになるためには、

時間をたっぷり用意して振り返りまで含めた実践経験を積む

ことが肝要であることも再確認できました、

この調子で開発と学習を進めていきます。

Yodaka

最後に、今回の記事をまとめるにあたって参考にした情報をまとめておきます。

-Bot