入社3日目の調査
大阪の物流会社に、開発者として入社して3日目です。先輩から「沖縄あての配送料がおかしい、という問い合わせを調べてほしい」と頼まれました。
プロジェクトには、ファイルが200個以上あります。全部を読む時間はありません。それでも、必要な場所は数分で見つけられます。
このレッスンのゴール
メモ
人が書いたコードの中で、ある機能がどこにあるかを見つけることができます。
キーワード
| ことば | いみ | れい |
|---|---|---|
| コードベース | 一つの製品を作るコード全体です。 | |
| 関数 | 名前のついた処理のまとまりです。 | calc_fee |
| 呼び出し | 関数を名前で動かすことです。 | calc_fee(2, "大阪") |
| grep | ファイルの中の文字を探すコマンドです。 | grep -rn "calc_fee" app |
| 入口 | プログラムが最初に動くファイルです。 | main.py |
学生が入力するセルは、このプレビューでは空白です。
フォルダの名前が地図になる
コードベースを開いたら、まずフォルダの名前を見ます。多くのチームは、機能ごとにフォルダを分けます。
orders なら注文、shipping なら配送、customers なら顧客です。配送料の問題なら、最初に shipping を見ればよいとわかります。
入口のファイル、たとえば main.py も確認します。そこから全体の流れが始まります。
実行: フォルダの一覧を見る
# 物流会社の配送システムを、小さく作ります。
mkdir -p delivery/orders delivery/shipping delivery/customers
printf 'def create_order(items):\n return {"items": items}\n' > delivery/orders/create.py
printf 'def calc_fee(weight, area):\n return 800\n' > delivery/shipping/fee.py
printf 'def find_customer(code):\n return code\n' > delivery/customers/lookup.py
printf 'print("配送システムを起動します")\n' > delivery/main.py
# フォルダとファイルの一覧を、まとめて表示します。
ls -R delivery
grep で関数の場所を探す
フォルダの見当がついたら、言葉で探します。grep -rn "def calc_fee" app は、関数が作られている行を探します。
-r は中のフォルダまで探す、-n は行番号を出す、という意味です。
次に def を外して calc_fee( で探します。すると、その関数を呼んでいる場所もわかります。
練習: 呼び出しを探す
# 小さな配送システムを作ります。
mkdir -p app/orders app/shipping
printf 'from shipping.fee import calc_fee\n\ndef checkout(order):\n fee = calc_fee(order["weight"], order["area"])\n return order["total"] + fee\n' > app/orders/checkout.py
printf 'def calc_fee(weight, area):\n if area == "沖縄":\n return 1500\n if weight > 10:\n return 1200\n return 800\n' > app/shipping/fee.py
printf 'from orders.checkout import checkout\n\nprint(checkout({"total": 3000, "weight": 2, "area": "大阪"}))\n' > app/main.py
# 配送料を計算する関数が、どこで作られているかを探します。
grep -rn "def calc_fee" app
# その関数を呼んでいる場所を探します。
grep -rn "calc_fee(" app
# 練習: 下の行の先頭の # を消して、checkout を呼んでいる場所を探してください。
# grep -rn "checkout(" app
よくある誤解
注意
「全部読んでからでないと、何も触れない」と考える人は多いです。実際の現場では、ベテランでも全部は読みません。調べたい機能に関係する数ファイルだけを、深く読みます。名前と検索で場所をしぼってから、読み始めましょう。
呼び出しをたどると流れが見える
場所が見つかったら、入口から順に呼び出しをたどります。
main.py が checkout を呼び、checkout が calc_fee を呼びます。この順番がわかると、配送料がどこで決まるかがはっきりします。
たどった順番は、メモに書いておきます。あとで先輩に説明するときにも役に立ちます。
例: 呼び出しの順番
| 順番 | ファイル | 関数 | すること |
|---|---|---|---|
| 1 | main.py | なし | 注文を作って checkout を呼ぶ |
| 2 | orders/checkout.py | checkout | 配送料を足して合計を出す |
| 3 | shipping/fee.py | calc_fee | 重さと地域で配送料を決める |
学生が入力するセルは、このプレビューでは空白です。