紙がない時は脳でシミュレーション

# ■はじめに
まだ、若かかった頃は、よく通勤電車の中でこのトレーニングをしてました。プログラミングを脳の中で行っていました。プログラマーはいつも時間があるとこのようなことをしていると思います。頭の中でコーディングしています。不思議なことにステップステップが浮かんできます。関数も浮かんできます。記憶力がいい若いころはほぼ全体のステップが浮かんでいました。なぜこのようなことができるのかと言えば、それまで、デバッグしているときになぜなぜの繰り返しでステップが脳に焼き付いてしまったからです。脳を休めているときにファーとそのコードが浮かんできます。少し、整理したいと思います。

# ■プログラミング頭になっていた
その頃は、頭がプログラミングづけになってしました。寝ても覚めてもコーディングのことが出てきます。


# ■朝の通勤電車の中で
ラッシュ時の電車の中では紙に書き出すことができないので、頭の中でコーディングしていました。

# ■ある時、ふっと思いつきます。
あそこで、あのフラッグの設定が間違っていたのか、それでイベントが入らなかったとか。それまで悩みに悩んでいたことが、電車の中で思いつきます。そうなるともういてもたってもいられません。はやく、会社に着いて試してみたいと。そして、テストしてみたら見事に動作した時の喜びはなんとも言えません。プログラミングの作業はこの連続です。なぜなぜの繰り返しと解決した時の喜びが交互にきます。

# ■不具合のどうどうめぐりからの脱出
よくドツボにはまるということが言われます。まるで迷路に入った時のようにぐるぐると同じところで不具合から脱出できません。頭の中のロジックが一つの考えに固定化していて柔らか頭になっていない状態です。こういう時は頭を叩いて頭の目を覚ます他ありません。強く打つと良くないので手加減します。この不具合のどうどうめぐりから脱出する場合、何回回ったら出られるのかという回数はありません。なぜなぜの繰り返し数は時と場合によって異なります。ドツボにはまったらいったん冷静になることが一番です。少し時間をおいて、先の電車の中でとかで解決することもあります。
# ■複雑なコードに潜むバグ
これは鉄則です。複雑なコードほど不具合が潜在しやすく、また、あとでの解読に時間がかかります。ウィルスと同じでどこかに潜んでいます。コードを書いているときはまさかここにバグが潜むとは思いもしません。ところが潜んでいるのです。じっとしていてその時が来るのを待っています。人間の体の中には様々なウィルスがいます。普段は出てきませんが、免疫力が落ちるとでてきます。バグも同じで、普段は発生しませんが、プログラムコードの免疫力が低下してくると発生します。このプログラムコードの免疫力とは、何かを考えてみます。ある程度までは持ちこたえます。
しかし、ある限度を超えると持ちこたえることができずに、不具合として発生します。火山の爆発と似ています。たとえば閾値の設定が小さかったため、想定以上の津波が来て堤防が決壊してしまったとか。シンプルなコードはよく動くかもしれません。複雑な条件が絡まないため、決定値表から漏れることもありません。この決定値表が曲者です。
# ■フラグに潜むバグ
私もよくフラグは使用します。ただ、多様してしまうのです。何か処理をするときに安易にフラグを作ってしまうのです。この方が面倒臭くないのでつい作ってしまいます。しかし、これがバグの引き金になります。フラグはオンとオフを行いますが、コーディンクしている段階で似たようなフラグがつくられてしまいます。この条件表を作らず、設計もせずにコード化してしまうのが原因です。プログラミングも慣れてくると設計図は頭の中にあります。ドキュメント化はしていません。そのため、フラグのオンオフのタイミングがどこかで漏れが生じます。このような不具合は結構あります。



# ■対策
脳でコードをシミュレーションすることはいいですが、どこかでドキュメント化は必要です。新たに書面に書き出すことが面倒であれば、ソースコードにコメントするのがベストです。ここでしっかりとコメントで処理内容を記述しておくとあとで見たときに理解できます。その書き方も問題ですが、一定のルールを決めて置く必要があります。ReadMeというドキュメントがありますがそれも一つの方法です。社会的な大規模システムは別です。それはしっかりとしたドキュメントを書かねばなりません。ここでは趣味でWebサイトを作っているときの話です。

# ■ドキュメントとコードの整合問題
どうしてもドキュメントは後追いになってしまう。まず、バグを解消するため、コードを追いかけてしまう。メンテナンスする人はコードは頭の中に入っているので、ドキュメントを見ることはしない。あの処理は、あのコードファイルのあのあたりに記述していたと覚えています。エディターのファイル体系やファイル内の前後の関数やメソッドを記憶しています。不具合の大体の場所はつかんでいます。こうなったら、もうドキュメントは見てません。ソースコードに集中しています。ここからどうどうめぐりが始まります。これを抜け出すには、ドキュメントに改修履歴をのこすことです。いつ、どこで、何を改修したかをドキュメントとコードに書き出します。今はバージョン管理のいいツールがあります。(Gitのような)私の場合は、プロジェクトで開発しているわけでないので、使っていません。個人でWebサイトを作成していますので好き勝手に行っています。

# ■脳でシミュレーションは記憶力維持にはいい
脳を活性化するためにはこの方法もいいと思います。特別な場所も必要でなく、紙も鉛筆も不要で、頭だけあればできます。新しい機能を設計するときも紙があれば使いますが、手元にない時は、例えば、定期的に家内の薬をドラッグストアへ取りに行きますがその待ち時間が長い時は脳内シミュレーションをしています。ときどき、紙とペンをもって行きますが無いときはそうしています。脳内シミュレーションでよく使いケースは、イベントが入らない不具合を考えているときです。なぜ入らないのかということが最初の疑問です。ここから、いろいろなケースを想定してシミュレーションしてゆきます。よくあるケースは、リスナーは登録しているが、そこへ飛んでこないというケースです。なぜ飛んでこないのかでさんざん悩みます。場所が悪いのか、登録する要素がまだ表示されていないのか、結局、問題は例えばサムネイルの表示に時間がかかり、表示されていないタイミングでリスナーを登録していたこと、このようなリスナーを登録しようとしていたが、登録対象がまだ表示されない内にリスナー登録の実行をしていたケースが多いです。


# ■あとがき
脳シミュレーションはトレーニングにもいいと思います。脳を使ってコーディングすると紙の節約にもなります。消しゴムもいりません。脳に紙を置き、そこへコードを書き出してゆきます。間違ったらすぐにリセットできます。脳の中でforループもコーディングできます。やや難しいのは非同期処理のコーディングで、defferやresolve,promiseの書き方など。Webサイトを作成していますので、javascriptはよく使います。同時にjqueryライブラリーも使います。最近はiframeと親との間でメッセージ通信したり、iframe内にアクセスするため、contentDocumentも使います。プラグインを作成しているとこれらのテクニックも使うことになります。そのため、脳シミュレーションも次第に高度化してきています。これも進化の過程かもしれません。脳内だけの閉じた空間でいろいろなことができます。じっと目を閉じて脳で考えているとふっと別の世界に入り込むこともあります。瞑想することもいいかもしれません。視覚からの情報に頼っていると脳でじっくり考えることがなくなってきて脳の退化が進むのでは危惧しています。例えば、テレビを見続けていると脳で考えることよりも先に目からの情報が入りそれを鵜呑みにしてしまう癖がつくことを危惧しています。