x=x+1がわからないのは逐次実行がわかっていないからで、記号を変えても解決にならない

x = x + 1がわからないという話が流行ってました。
で、「=ではなく:=を使えば」とか「イミュータブルにすれば」とかいう話が出たりしてますが、問題をあとまわしにしてるように見えます。
結局のところ、逐次実行がわかっていないことが表面化している場合がほとんどではないかと。
https://speakerdeck.com/kishida/lets-code-a-process?slide=8

プログラム以外の文章は、基本的にひとつの状態を示していて状態が遷移するということがありません。 推理小説なども、最終的な状態が徐々に開示されるだけともいえます。途中から読むと犯人が変わるということはないですね。もちろんそのように途中から読むと犯人が変わるような叙述トリックは可能ですが、通常はそうではないからトリックになるわけで。

つまり、x = x + 1という式は、x + 1という演算を行ってからx = その結果を行うという逐次実行があり、そしてxの状態が遷移するコードになっていて、演算・逐次実行・状態遷移の3要素が詰まっています。 ここで、逐次実行という概念を理解していないためにx = x + 1がわからないということになるわけです。
そのためx := x + 1x + 1 -> xのように表記を変えても、問題が緩和されるかもしれないけど解決にはならないと思います。

x = x + 1はイディオムとして覚えてしまうこともあるので、x = (x = x + 1) + xが読めなかったりしますね。

そしてこれはプログラムを教える人と教わる人の断絶をあらわしています。プログラムがわかるようになると逐次実行は空気のように当たり前で「わかる / わからない」というものではなくなります。一方でプログラムを初めて見る人には、逐次実行こそが異様なものです。
そのため「x = x + 1がわからないのはセンスがないからプログラムをやめたほうがいい」のような、問題から完全に目をそむけたような発言をする人があらわれたりもします。
もちろんセンスの問題ではなく、知識やトレーニングでカバーできるものです。

また、「変数は箱か場所か」のような論争も起きたりしますが、結局のところ学習者がそこでつまずくことはあまりなく、「変数がわからない」の実態は、逐次実行がわからないことからの、変数で表されている状態遷移がわかっていないことが多いように思います。
ループがわからないのも、逐次実行がわからないことが表面化しているだけです。

あと、「Haskellで解決」のようなこともみかけますが、そうすると状態遷移が必要なときに複雑な構文が必要になり、問題をあとまわしにして難しくすることにもなります。

REPLやデバッガなどで「プログラムが順に動く」ということを確認するのがいいと思います。 ということで「プロになるJava」ではREPLから始めてループではデバッガを見せ、そして段階的に難しくなるループを例に逐次実行と状態遷移を勉強するという構成にしています。