プログラムに時間を吹き込む — 『a = a + 1』が意味を持つ理由

この記事は: プログラミングを始めて約 1 か月、オブジェクト指向の入口で「何が起きているのかよくわからない」と感じている あなた自身 に向けたセルフガイドです。数式の世界では感じなかった“時間”と“状態変化”が、なぜプログラムを難しく思わせるのか――その正体をつかみ、手を動かして乗り越えるコツをまとめました。


1. 数学とプログラムは“評価モデル”が違う

観点数学(式)プログラム(命令列)
時間軸無い(同時・恒常的真)ある(上から順に実行)
状態変化しない前提で議論変数やオブジェクトが刻々と変わる
等号 ( = )恒等関係(左右は常に同値)代入演算子(右辺を評価 → 左辺へ書き込み)
思考様式宣言的 what命令的 how

右辺 → 左辺 ―― 一瞬の時間差

int a = 1;
a = a + 2; // ❶ 右辺 a + 2 を計算(ここでは 3)
            // ❷ 結果 3 を左辺 a へ代入(a が 3 になる)

a = a + 2──数学なら矛盾ですが、プログラムでは「いまの a」を材料に「次の a」を作る状態遷移を表します。この“計算 ▶ 代入 ▶ 次の瞬間”に、あなたの思考もシフトさせる必要があります。


2. オブジェクト指向がさらにモヤる3つの理由

  1. 状態を持つ場所が増える — インスタンスごとにフィールドがあり、メソッド呼び出しで値が変わる。
  2. メッセージが飛び交う — 「誰が誰に何を頼み、その結果いつ変わるか」を頭の中で追う必要がある。
  3. 二層構造の登場 — クラスという“設計図”と、実際に動くインスタンスが分かれ、数学にはなかった抽象レイヤが挟まる。

3. “時間” を腹落ちさせるセルフトレーニング

アプローチやってみること狙い
ステップ実行Visual Studio で F10 / F11 を押し、ウォッチに変数を追加コマ送りで「今」を目で見る
メモリ図を描く変数名・値・参照矢印をノートに書き、行を進めるごとに更新状態遷移を視覚化
タイムライン図横軸を時間にし、メソッド呼び出しやイベント発火を並べる複数オブジェクト間の変化を整理
小さなシミュレータ例:カウンタクラスの Increment() を呼ぶたび Console.WriteLine一歩ごとの変化を目に焼き付ける
純粋関数と比較同じ処理を static メソッド(副作用なし)とフィールド更新版で書く状態を持つ/持たないの差分を体感

4. 理解を助けるイメージフレーズ

  • 「プログラムは 1 行ずつ時を刻む小説」 — CPU は 1 ページずつ読み進め、登場人物(オブジェクト)の心境(フィールド)が変わる。
  • 「クラス=設計図、インスタンス=今日の天気」 — 設計図は変わらないが、実体は時間で変わる。
  • 「代入は写真の貼り替え」 — 右辺で新しい写真を撮り、左辺の額縁に差し替える。

5. つまずきをセルフチェックする

モヤモヤよくある誤解自分へのツッコミポイント
a = a + 1 が矛盾に見える数学の等号≒プログラムの = と思い込む「= は “次を入れる矢印”」とメモリ図で確認した?
値がどこで変わったかわからない状態遷移を追えていないデバッガでウォッチし、一行ごとに値を読み上げてみた?
オブジェクトが勝手に動く感じメソッド呼び出しの起点があいまいタイムライン図で“呼ぶ側⇄呼ばれる側”を書き出した?

6. まとめ — “時間” を止めて観察しよう

  • 壁の正体: 時間軸と状態遷移という、数学には無い要素。
  • 突破口: デバッガ・手書き・タイムラインで 時間を止める体験 を積み重ねること。
  • 最初の一歩: int counter = 0; から始め、1 行ずつステップ実行してみよう。値が変わる瞬間が見えたら、霧は晴れる。

あなたへの小さな挑戦

  1. a = a + 1; を実行するとき、 「今の a」→「計算」→「新しい a」 の順序を声に出してみてください。
  2. 自作クラスでフィールドを 1 つだけ持たせ、メソッドで更新したら、 前後の状態をノートに図解 できますか?

答えられなければ、この記事のトレーニングで“時間旅行”を体験してみましょう。


この記事が、あなたの“モヤモヤ地帯”を抜ける道しるべになりますように。では、IDE を開いて――さあ、時間を止めに行きましょう!

訪問数 4 回, 今日の訪問数 1回

C#,学習

Posted by hidepon