開発者に必要な力ってコーディング力より読解力な気がする(ブレイクポイントの使い方)

私が実務をするにあたって思ったこととして，開発者にとっては，コーディング力も重要であるが，読解力がより重要であると思う．実務では多くのコードがあり，レイヤーごとに機能を分割しているため，流れを読むこと自体が大変になる．そこでまず，読む力が大事だと思う理由について以下にまとめてみる．



# 1. エラーメッセージの解釈
以下は、JavaScriptアプリケーションで発生した典型的なエラーメッセージである．
```
CopyUncaught TypeError: Cannot read property 'forEach' of undefined
    at processData (app.js:42)
    at fetchData (app.js:37)
    at <anonymous>
```
このエラーメッセージを正確に解釈し，問題の根本原因を特定するには，高度な読解力が求められる．

# 2. 複雑なアルゴリズムの理解
以下は，二分探索木の挿入操作を実装したPythonコードである．
```py
pythonCopyclass Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key

def insert(root, key):
    if root is None:
        return Node(key)
    else:
        if root.val < key:
            root.right = insert(root.right, key)
        else:
            root.left = insert(root.left, key)
    return root

def inorder(root):
    if root:
        inorder(root.left)
        print(root.val)
        inorder(root.right)

root = None
root = insert(root, 50)
insert(root, 30)
insert(root, 20)
insert(root, 40)
insert(root, 70)
insert(root, 60)
insert(root, 80)

print("Inorder traversal of the constructed BST")
inorder(root)
```
このアルゴリズムの実装を理解し，必要に応じて修正や最適化を行うには，コードを読み解く力が不可欠だと思う．

# 3. コードレビューコメントの理解
以下は、GitHubのプルリクエストでよく見られるコードレビューコメントの例です：

```
# 新機能：ユーザープロフィール更新機能の実装

## 概要
ユーザーが自身のプロフィール情報を更新できる新機能を実装しました．

## 新機能の対応内容
- ユーザープロフィール更新フォームの作成
- プロフィールデータのバリデーション機能
- データベースへの更新処理の実装
- エラーハンドリングの追加

## 再現/実行時のコマンドや注意点
1. `npm install` を実行して新しい依存関係をインストール
2. `npm run migrate` でデータベースの最新マイグレーションを適用
3. `npm start` でアプリケーションを起動
4. ブラウザで `http://localhost:3000/profile` にアクセスして機能をテスト

注意点：
- 環境変数 `DATABASE_URL` が正しく設定されていることを確認してください
- Node.js v14.0.0以上が必要です

## 問題点や課題
- プロフィール画像のアップロード機能は未実装です。別タスクとして追跡する予定です
- 大量のユーザーデータに対するパフォーマンステストはまだ行っていません

## 改善したいがわからないのでレビューを求める点
- `processData()` 関数のパフォーマンス改善方法
- `handleError()` 関数の最適な分割方法
- `UserModel` クラスでの関心の分離の適切な実装方法
- `initializeApp()` 関数での同期メカニズムの実装方法

## その他
参考文献：
- [Node.js Best Practices](https://github.com/goldbergyoni/nodebestpractices)
- [Clean Code in JavaScript](https://github.com/ryanmcdermott/clean-code-javascript)


@reviewers レビューよろしくお願いします．特に、コードの構造とパフォーマンスに関するフィードバックをいただけると幸いです．
```
このような形で書いてあるコメントを理解するという意味でもコードの読解のほかに単純な文章の読解力が必要なのかと思う．

## 結局読解力が必要な理由をまとめると...
読解力は開発者の日々の業務の様々な場面で重要な役割を果たす．エラー解析，アルゴリズムの理解，そしてチームコミュニケーションなど，多くの場面で読解力が求められる．コーディング力も重要だが，読解力はより基礎的で広範囲に影響を与えるスキルだと言える．

高い読解力を持つことで

 - クライアントや上司の要求を正確に理解し、適切な解決策を提案できる
 - 技術文書やAPIドキュメントを効率的に理解し、適切に実装できる
 - 複雑なアルゴリズムやデータ構造を理解し、最適化できる
 - エラーメッセージを正確に解釈し、迅速にバグを修正できる
 - チーム内のコミュニケーションを円滑に行い、効果的に協力できる

したがって、開発者として成長し、複雑な問題を解決する能力を向上させるためには、コーディング力と並んで（あるいはそれ以上に）読解力を磨くことが重要だと思う．

# デバックポインタの使い方
コードを読み解く上で，大量にあるコードをなんの助けもなく読み解くことはなかなか難しいと思う．そこでブレイクポイントを使ってデバックモードで実行することをお勧めする．

## 1. ブレイクポイントとは

ブレイクポイントとは, プログラムの実行を特定の行で一時停止させるための機能である. デバッグ時に変数の値や実行フローを確認するのに役立つ.

## 2. ブレイクポイントの設定方法

多くの統合開発環境(IDE)では, 以下の方法でブレイクポイントを設定できる:

 - 行番号の左側のマージンをクリックする.
 - キーボードショートカットを使用する (IDEによって異なる).
 - メニューから「ブレイクポイントの追加」を選択する.

```py
url = input("URLを入力してください\n")
print("ページを取得しています...")
text = fetch_webpage_text(url) #ここで一時停止させたいならばここの行番号をクリックしてブレイクポイントを設定する
print(text)
```
## 3. ブレイクポイントの種類

1. **行ブレイクポイント** 特定の行で停止する.
2. **条件付きブレイクポイント** 指定した条件が満たされた場合のみ停止する.
3. **データブレイクポイント** 特定の変数の値が変更されたときに停止する.

## 4. ブレイクポイントの使用

1. デバッグモードでプログラムを実行する.
2. ブレイクポイントに到達すると, プログラムが一時停止する.
3. 変数の値を確認したり, ステップ実行したりできる.

:::note info
デバッグモードでの実行はたいてい実行ボタンの近くの`虫のマーク`を押すと実行できる．
:::

## ブレイクポイントの使用例
今回はヒープソートについてデバックモードで追ってみようと思う．どこに置くかは以下のコードのコメントとして残してみた．
```py
def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2

    if left < n and arr[left] > arr[largest]:
        largest = left

    if right < n and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        # ブレイクポイント1: 要素の交換前
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)

    # ヒープを構築
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # 要素を1つずつ取り出す
    for i in range(n - 1, 0, -1):
        # ブレイクポイント2: ルート要素と最後の要素を交換する前
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)

# テスト用の配列
arr = [12, 11, 13, 5, 6, 7]
print("元の配列:", arr)

# ブレイクポイント3: ソート開始前
heap_sort(arr)

# ブレイクポイント4: ソート完了後
print("ソート後の配列:", arr)
```

### VSCodeではどのように使うのか
![スクリーンショット 2024-07-01 17.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/3e66c49c-4025-f7c1-0af2-ef2423b2aeaf.png)
デバックモードで実行すると画面上部にこのような選択ができるようになる．
左から`続行`，`ステップオーバー`，`ステップイン`，`ステップアウト`，`再起動`，`停止`である．

#### 続行 (Continue)

プログラムの実行を再開し, **次のブレイクポイント**まで進める.
現在の停止点から, 次にブレイクポイントが設定されている箇所まで実行が進む.
ブレイクポイントがない場合, プログラムは終了まで実行される.


#### ステップオーバー (Step Over)

現在の行を実行し, 次の行に移動する.つまり今の関数からは移動しない．
関数呼び出しがある場合, **その関数全体を1ステップとして扱い**, 関数の中には入らない.
主に現在の関数内の実行フローを追跡したい場合に使用する.


#### ステップイン (Step In)

現在の行を実行し, 次の実行可能な行に移動する.
関数呼び出しがある場合, **その関数の中に入り**, 関数の最初の行で停止する.
関数の詳細な動作を確認したい場合に使用する.


#### ステップアウト (Step Out)

**現在の関数の実行を完了**し, 呼び出し元の関数に戻る.
関数の残りの部分を実行し, 関数の終了直後の行で停止する.
現在の関数の詳細な実行を飛ばしたい場合に使用する.


#### 再起動 (Restart)

デバッグセッションを終了し, プログラムを最初から再実行する.
すべての変数と実行状態がリセットされる.
プログラムの動作を最初から確認したい場合に使用する.


#### 停止 (Stop)

現在実行中のデバッグセッションを終了する.
プログラムの実行が即座に停止され, デバッガーが終了する.
デバッグを中断し, 通常の開発環境に戻りたい場合に使用する.

ここでは`続行`を押した時の例を出す．変数の値がブレイクポイントで一時停止した時点での値を確認できることがわかる．変数がどんどん変わっていくことが読み取れるだろう．このようにどの時点で値が変わっていくのかがわかるので想定外の値が変わるタイミングを突き止められる．エラーの原因も突き止められる．

![スクリーンショット 2024-07-01 17.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/c989407a-c1c3-5a55-813b-166d39e08934.png)
![スクリーンショット 2024-07-01 17.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/f414bb56-a4c0-7841-200e-233fba27d98e.png)
![スクリーンショット 2024-07-01 17.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/94475d2b-c338-803e-d435-5b5a216a225e.png)
![スクリーンショット 2024-07-01 17.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/5ce6a08e-306b-efec-0cac-c24c944341f8.png)
![スクリーンショット 2024-07-01 17.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/4660973e-032b-aa1a-fef6-b1b9553c8981.png)
![スクリーンショット 2024-07-01 17.43.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/b66e90db-27fd-46de-ce49-aad80e675fc6.png)
![スクリーンショット 2024-07-01 17.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/eca691b9-9701-d293-715b-00210c14473d.png)
![スクリーンショット 2024-07-01 17.43.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/9c727333-e382-6cfd-27ff-66b9224b58ab.png)
![スクリーンショット 2024-07-01 17.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/da657a02-4418-927c-e53c-7f52220eb7fc.png)
![スクリーンショット 2024-07-01 17.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/41bb2407-c2ee-1b4f-737b-d18af4a0501b.png)
![スクリーンショット 2024-07-01 17.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/b7610512-a7c0-6bb6-70ff-b7459d526ddf.png)
![スクリーンショット 2024-07-01 17.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/5af89a81-6a89-98fd-1528-c6932c04519a.png)
![スクリーンショット 2024-07-01 17.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/79d1d610-661d-abc3-c7b3-ea3a0a43d753.png)
![スクリーンショット 2024-07-01 17.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/06bf21ca-01f9-ae5c-c8c2-096e89567c5e.png)
![スクリーンショット 2024-07-01 17.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/679dc66c-943f-e7e3-57f1-ba31dd575794.png)
![スクリーンショット 2024-07-01 17.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/b50304d2-686c-be57-a4a3-0c2db103983b.png)
![スクリーンショット 2024-07-01 17.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/7c653f75-763a-038e-56ac-2d5087071145.png)
![スクリーンショット 2024-07-01 17.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/3d1382fd-620e-77a0-b665-566160b3564e.png)
![スクリーンショット 2024-07-01 17.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/ff0736ff-4e2d-c766-4b57-975e89b19786.png)
![スクリーンショット 2024-07-01 17.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/f077c8a0-4f5c-a61e-f5f0-2b848a779ca8.png)
![スクリーンショット 2024-07-01 17.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/4c101183-e4f7-e16f-c2ad-f57016dfe594.png)


`続行`ではなく`ステップイン`にすれば関数内の動きもデバッグできる
ブレイクポイントを効果的に使用することで, デバッグ作業を効率化し, バグの特定と修正を迅速に行うことができる.どんどんつかっていこう！