私がコーディングできるようになった理由　その２（右脳・左脳の使い分け）

[[その1](https://qiita.com/komugirice/items/591050e59460ea0bb2f7)]で右脳・左脳を紹介しました。それをコーディングに生かした話になります。


# 知る前　（起)
退職後に脳科学者であるジル・ボルト・テイラー氏の動画を見て気付いたことが、私はどうも右脳を使って物事をまとめているようだ、ということです。まとめ方が右脳型でした。

###背景
新卒で入社して2〜3年の頃、専任で任された仕事は、作業進捗管理システムの小規模な機能追加でした。設計からコーディングまでを行いましたが、小規模であるからか問題なく達成できました。
しかし、問題なく達成できたにも関わらず、自分のコーディングスキルに対して不安を感じ、その不安は最後まで解消できませんでした。
不安が解消出来なかった為、向いていないと判断してプログラマを退職しました。

###不安
・現場で、納期までのスケジュールに対して、自分の担当機能を全集中力で作っているのにも関わらず不安だった。
・納期までのスケジュールと自分の進捗の把握しかできない。作成したソースコードの内容が把握できない。
・機能追加した設計書からの模写はできる。0からはいくら考えてもコーディングが組み立てられない。
・完成した後は機能の細かい仕様を覚えていられない。
・日が経つに連れ、増えていく機能を管理できなくなる。

###問題点
小規模なら良いのですが、大規模もしくは新規開発になると自信がなくなります。これが年齢を積み重ねていくごとに責任とレベルが高く要求され、どこかで問題を起こすという潜在的不安がありました。その自信がなくなる漠然とした不安の理由が経験が足りないからでは無いことはわかっていました。自分の考え方や頭の使い方に問題があるのではないか？という結論に至りました。その結論に至ったものの、結局はどのように頭を使うのか？が、問題でした。

###不安の原因
前工程として設計書が完成して設計工程が完了します。コーディング工程〜納期までは、設計した完成形のイメージを持ってスタートします。
<img width="557" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145337/71eb6a69-215e-6250-b758-9c1ca4318f1c.png">



**[[その1](https://qiita.com/komugirice/items/591050e59460ea0bb2f7)]でジル・ボルト・テイラーの考察から、左脳が「過去・未来」、右脳が「今」を司っていることを紹介しました。**それになぞらえて私の状況を説明すると、以下の状況に説明できます。

・今日から納期までのスケジュールを"１つのつながった時間"として頭に入れていた。

・作業の１日１日はスケジュールの上では同じ「今」だった。

・"１つのつながった時間"の「今」は、完成形イメージを元にコーディングを完成させることに引っ張られる。

・担当するシステムは自分がコントロールできない大きな存在だった。"１つのつながった時間"の「今」の中で、自分なりに担当機能を日割りで逆算した。大きな山を降りる時の１歩１歩になぞらえるように、１日１日の作業を割り振った。

・１日１日の作業が無駄にならないようにする為に、私のコーディングは一連につながる道の「ゴール」（スケジュールの納期、完成形のイメージ）に沿って差分を模写することしかできなかった。フォーカスをゴールから外すことが出来なかった。

・スケジュールは時間が一連につながっているが、コーディングは時間が一連につながっていない。様々なオブジェクトの進行の分岐に対応できない。

<img width="554" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145337/81e0c021-40f1-a366-a5aa-63435d5b1218.png">


#今にコーディングを一体化していた　(承)
　**「今」：（完成形のイメージすなわち、右脳のイメージ）に対してコーディングを"加算"していました。**
　その「今」にWebシステムの全要素が入っていたので管理しきれなかったように思います。

次の表のごとく、山を下るような感じで完成系イメージからコードを抽出する作業を繰り返していたと思います。ゴールから始まれば道を間違えないと考えていたからです。


|コード：完成形の一部分|←|私の頭：完成までの足りない機能の抽出|←||
|---|:-:|---|---|---|
|コード：完成形の一部分|←|私の頭：完成までの足りない機能の抽出|←|完成形|
|コード：完成形の一部分|←|私の頭：完成までの足りない機能の抽出|←||
|　･･･　|||||



しかしこれは、コード各行の上から下へ進む流れが、関連性の流れではなく、自分の現在から納期までの流れでした。

###おかしいところ
コーディングする時は、納期時の完成形のイメージから毎日考え始めます。完成形のイメージがあるからゴールの実体がありますが、毎日の今現在にスタートがありません。スタートは無いですがゴールから紐がつるされているのを発見すれば、作成するソースコードはゴールにつながっているのだと思い、見切り発車ながらもソースコードを書いていきます。そのようにゴールからソースコードをつなげて加算していくことがおかしいです。
一体化した完成形から部品要素を明確に区別できず、ひたすら完成形にさらに肉付けするようなことをしていました。

**私は既存システムに追加していく条件でしか、コーディングを進めることが出来ませんでした。すなわち自分でスタートを管理しなくて良い状態です。**

人間の体は手、足、胸、腹、背中、顔で一体です。しかし腕は腕で独立しており、足は足で独立しているから機能します。腕の目指している方向と足の目指している方向は別々です。個体の連携を個体からではなく一体化のイメージから合わせることは間違いであり、部位ごとに区別したところから合わせるべきです。
（部位ごとに区別するということは複数を同時に考えることになるので負荷となります。しかし"スタートを区別"すると言う点において重要です。）

###関節的原因
####・仕事に対する姿勢を学んできたバイトの時間単位のサイクル
バイトは24時間やることが時間単位で決まっています。
新入社員になる前、コンビニの倉庫仕分けのアルバイトをしていました。
1便、2便、3便とあり、時間ごとに入荷、出荷、片付けと作業内容が決まっているので1時間単位でゴールが決まっていました。コンビニの1日単位の時間軸に合わせて作業するので時間単位以上の期限を考える必要はありませんでした。なので1時間1時間毎、ゴールの時間制限を守ることだけを考えて働いていました。このサイクルの世界では日常のサイクルが当たり前となってしまい、効率化によりスタートでの区別が無くなってしまいました。これはゴールから引かれるサイクルです。

####・学校教育の成績
1年の周期で考えると、生徒側は小学校1〜6、中学校1〜3、高校1〜3年と1年ずつ上がっていきます。
先生側は中学校3年の担任なら、来年以降も中学校3年の担任を繰り返します。
生徒は時間が直線的に進みますが、先生は同じ学年を毎年ぐるぐると回っています。
（私はこの状況を「スーパーマリオメーカー」になぞらえて、生徒を「マリオ側」、先生を「ステージ側」と呼んでいます。）

その学校の世界では生徒が未来につながるのは学校にアウトプットする成績であり、テストの点数です。個人の頭の中にある、学習で覚えた知識が先を作り出す訳ではありません。
点数を上げるにはテスト当日に暗記していれば良いです。テストが終わったら次の学期のテストの内容を覚えるので、それまでの学期の内容は忘れても良いです。
生徒は覚えた記憶をテストの時に留め、留めている生徒を学校システムのコンベアが次へ進ませます。

学校はそうですが、システム開発はそうではありません。だが当時の私は納期のその時、頭の中にすべてを記憶していなければ気が済まなかった学校の習慣から抜け出せていなかった気がします。しかし、記憶したものが自分を"先"へ進めてはくれません。

先とはゴール地点です。システム開発のゴール地点にたどりつくには必要物すべてをアウトプットすることです。作りきって山の頂上にたどり着かなければなりません。時間は自分を先に進めてくれません。山を登り切ったその先にしか自分の先もないです。

学校教育では自らスタートを作り、ゴールへ向かうサイクルがありませんでした。そこには未来につながってるゴール地点があるだけでした。しかし未来と思っていたものも生徒の直線側の未来ではなく、学校のシステムのサイクルでした。
長期間スパンで、スタート時に明確な自分のスタート位置とゴール条件を認識してからの時間の流れを経験したことがないこともコーディングが出来なかった間接的原因だと思います。

####・後ろに合わせる日本語的思考
「世界一わかりやすい英語の勉強法」の著者である関 正夫さんが言っていたことですが、英語は「Intel inside」、日本語は「インテル　入ってる」。英語は頭韻で日本語は脚韻です。その点で英語と日本語は真逆です。

日本語は文を後ろで合わせていると思います。
(文の違い(主観的なイメージ…)) 
英語の作文：「私は〜、私は〜」
日本語の作文：「〜しました。〜しました。」

日本語は後ろで合わせる、すなわちtailです。文の最後でスタンバります。

[](
--- 保留 ---
英語：左から右へ加算
日本語：右から右へtail
英語：A.do(B)
日本語：（は：A, を：B）する
日本語は共通を共有
日本語は1年間の地球の公転の時間軸に合わせて進むイメージ
ステージが軸であり、主語はプレーヤー
英語は主語がステージ
学校の流れも全体が共有する1年の流れで、個人個人でスタートが違うということがない。同じときに卒業するから次のスタートがそろう。自分で自分のスタートを管理することがない。1年の流れ、物理的な時間がスタートとゴール
--- 保留 ---
)

※誤解が無いように付け加えさせて頂くと右脳による一体化は会社の組織等の集団活動の領域においては優先されて良いです。

#まとめ方を左脳型にする　（転）

###・文章は左から右へ書く
**調査したところ、"中東圏の言語アラビア語や旧日本語等"以外の言語は文章を左から右へ書くようです。**

文章の左から右へ書く規則性から、文章を書く等の"物事をシーケンシャルに表現する流れ"は「左脳から始まり右脳へつなげる」と仮定します。

[参考][なぜスーパーマリオは左から右に走るのか？]
(https://www.gizmodo.jp/2016/12/why-mario-run-left-to-right.html)

左が主語であり、主語がスタートです。
左をスタート　右をゴールとします。

###・これまでは左←右だった
前述の説明よりこれまでの私は、コーディング書く時は「左←右」の思考で書いていました。
(to)「主語（スタート）を抽出」 ← (from)「右脳の一体化したイメージ（ゴール）」のような感じです。

**「今」が一体化**で記述した表のように、

|コード：完成形の一部分|←|私の頭：完成までの足りない機能の抽出|←||
|---|:-:|---|---|---|
|コード：完成形の一部分|←|私の頭：完成までの足りない機能の抽出|←|完成形|
|コード：完成形の一部分|←|私の頭：完成までの足りない機能の抽出|←||
|　･･･　|||||


コーディングを引き出す頭の中：右脳の一体化したイメージ（ゴール）へ戻る。→主語（スタート）を抽出。
**右脳のゴールに左脳のスタートが加算される形でした。**
思考が右脳のゴールからスタートします。ゴールに加算されるたびにスタートが消え、次のスタートを探します。その都度スタートの位置を覚えられません。

###・左→右にする
どのように頭を使うのか？について、左→右に考えるという思考方法を知りました。

例えばスポーツジムのランニングマシンを考えてみます。
**ランニングマシンは「経過時間」もしくは「残り時間」の片方を表示できます。**
例) 30分の場合、経過時間:05:30　残り時間 24:30

両方同時に表示する必要はありません。人の頭は経過時間と残り時間の2軸で同時に計算できません。試してみればわかりますが、計算するとき頭は同時に2つの軸を持つことが困難です。

私の"それまで”のコーディングはここでいう「残り時間」を計算していて、1秒ごとに「残り時間」が1秒減り、その1秒をコーディングの1行とするようなやり方でした。

**"それから"のコーディング、すなわち左→右にするということは「経過時間」を基準にします。**


**その1秒1秒、私は走る。**

| 経過時間| 主語 |動詞|
|:-:|:-:|:-:|
| 00:00 | I | run |
| 00:01 | I | run |
| 00:02 | I | run |
| 00:03 | I | run |
| 00:04 | I | run |
| 00:05 | I | run |

**1秒ごとに「経過時間」を00:00→00:01と加算していきます。**00:02, 00:03と増えていきますが、その時々それぞれの1秒はその1秒の「今」を持っています。1|1|1| = 00:03、1|1|1|1・・・　と増えていきますが、例えば"27:11"まで増えたとしても、**"27:11"はその時のスタートとなります。**

このアナログな時間変化、"その時々の「今」"を区別するのは難しいですが、確実に**「経過時間」は現在完了形で経過が更新され、"27:11"と１つの「今」に更新されます。**


次に
**「私」を分解して「主語」と「動作」にします。**


|   経過時間  | 右足 | 左足 | 右手 | 左手 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 00:00 | 着地する |前に出す|後ろに引く|前に出す|
| 00:01 | 前に出す |着地する|前に出す|後ろに引く|
| 00:02 |着地する  |前に出す|後ろに引く|前に出す|
| 00:03| 前に出す |着地する|前に出す|後ろに引く|
| 00:04 | 着地する |前に出す|後ろに引く|前に出す|
| 00:05 | 前に出す |着地する|前に出す|後ろに引く|

経過時間の各秒に対する主語の要素を並列に並べました。
経過時間：主語が「1：多」となりました。
経過時間の「今」に対して主語1つのフォーカスでは対応出来なくなりました。

**プログラムはこのように要素を極限まで分解して「今」に連動させる必要があります。**

「右脳」の場合は"横軸"の各主語：右足-左足-右手-左手の関係をそれぞれ考えます。「経過時間」の"縦軸"の変化は頭で切り替えないといけません。しかし"縦軸"の変化を頭で切り替えると、頭に浮かんでいた"横軸"の「並列」の土台がリセットされてしまいます。
今度は"縦軸"を土台にして並列の関係を0から考え始めることになり、多：多を考え初めて泥沼に陥り、これはかなり記憶力のスペースを消耗してしまいます。「主語」を「並行」にすればそれがある程度削減できます。


###・主語を並行にする

| 主語  | 00:00 | 00:01 | 00:02 | 00:03 | 00:04 | 00:05 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 右足 |前に出す |着地する|前に出す|着地する|前に出す|着地する|
| 左足 |着地する|前に出す|着地する|前に出す|着地する|前に出す|
| 右手 | 後ろに引く|前に出す|後ろに引く|前に出す|後ろに引く|前に出す|
| 左手| 前に出す |後ろに引く|前に出す|後ろに引く|前に出す|後ろに引く|

[](--ポイント--)
「主語」を1つに意識すれば高精度になり「経過時間」の秒ごとの"連動"を捉えられます。（右手：後ろに引く→前に出す→後ろに引く･･･）
[](--ポイント--)

**左脳側で考える目安として、「主語」から右に矢印を引いた考え方を行います。**
右足→
左足→
右手→
左手→

また、「経過時間」から縦軸を見れば、「経過時間」ごとの「要素(主語)」と「要素(主語)」の"連動"を捉えられます。（00:01：右足-左足-右手-左手）
[](--- 修正要)
1つの主語をフォーカスし、1フォーカスごとに「主語」の行動を書き留めれば「各主語」が別個に先へ進んでも消えることはありません。シーケンシャルな一線を保てます。
[](--- 修正要)
すると先程の"記憶力"のスペースの無駄を省けます。
「右脳」の場合は"横軸"の各主語：右足-左足-右手-左手の関係をそれぞれ考える性質ですが、「経過時間」の"縦軸"の変化を頭で切り替えると、頭に浮かんでいた"横軸"の「並列」の土台がリセットされてしまいます。

「左脳」の場合は"縦軸"の「各主語」の1個を土台とし、"横軸"の時間変化の関係を考えます。**「主語」の"縦軸"の変化を頭で切り替えても、「主語」はスタートなので1つ前に考えた「別の主語」の"経過後のスタート"と同期が取れます。スタートを忘れることはありません。**

**「左脳」の「並行」で「要素(主語)」をフォーカスする**

・元の主語「I」を更に左に置きます。

| 主語  | サブ主語  | 00:00 | 00:01 | 00:02 | 00:03 | 00:04 | 00:05 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| I | 右足 |前に出す |着地する|前に出す|着地する|前に出す|着地する|
|  | 左足 |着地する|前に出す|着地する|前に出す|着地する|前に出す|
|  | 右手 | 後ろに引く|前に出す|後ろに引く|前に出す|後ろに引く|前に出す|
|  | 左手| 前に出す |後ろに引く|前に出す|後ろに引く|前に出す|後ろに引く|

「I」をスタート位置、「経過時間のどこか一点」をゴール位置、その2点で見れば、どれか1つの「サブ主語」をフォーカスして行動を進ませても、フォーカスがスタート位置の「I」に引っ張られるので他の「サブ主語」と連動がつながります。別々の「サブ主語」と並行で走行できます。**次の行動を行うときの戻り位置としてのスタート位置「I」です。**

このように、より左に主語として1つのまとまりのオブジェクトを作成していきます。それを前提としてコーディングの考え始めのフォーカスにし、**「並行」の関係はスタート位置を土台として、「並列」の関係は「最先端のゴール位置」を土台として組み立てます。**


###・左：主語の並行→右：時間の並列へ
並行 × 並列の「多：多」の関係を作成したい時、まず始めのフォーカスに戸惑います。それにはまず「1：多」にします。「サブ主語のどれか１つ：経過時間」がそれに当たります。片方を1つにすることで土台が固まり、1つの「1：多」が組み立てることが出来たら他の「1：多」を作ります。

例えとしては簡単すぎますが今回のランニングマシンを例にすると、次のようになります。
例）「右足：00:01 着地する → 右足：00:02 前に出す → 右足：00:03 着地する → 右足：00:04 前に出す」、「左足：00:01 前に出す → 左足：00:02 着地する → 左足：00:03 前に出す → 左足：00:04 着地する」…。

**「経過時間のどれか一点」をフォーカスすると、「右足|左足|右手|左手：00:03」となります。**「多：1」となり、各主語←経過位置からの並びを確認していく目印となります。


あとはリズムです。「要素(主語)」単位で「今」と「次の今」が正しく連動しているかを確認します。


###・先を作る
***今***とは「(人・物フォーカスの)**"現在完了形"**のあらゆる物それぞれが持つその瞬間の**"今"** (左脳側のスタートからの静的な今)」と、「(時間フォーカスの)先へと**"現在進行系"**の時が連なり続ける並列の**「今」** (右脳側の終わりへの動的な今)」の2つに分解できると考えます。

**先を作ることは現在進行系の「今」と「次の今」の動的関係を作ることです。**
過去の状態→未来の状態の現在完了形の"今"の2点の差で生まれる物ではありません。

あらゆる物が動的な「今」の最先端に並んでいます。それが**現実時間**です。
「先を作る」領域自体は動的な「今」なので右脳領域の範囲ですが、プログラムは「今」が現実時間の進行で勝手に進んでいくものではありません。

###・同時並行を束ねる
プログラムを先へ進ませるにはコーディングの「要素(主語)」を先へ進ませ、自分の現実時間でつなぎ合わせる作業が必要です。
(まだ現実世界に実体がない)「要素(主語)」が進む横軸は、(現実世界に実体がある)自分の現実時間になります。

```java:running
if(I.左足.着地していたら) {
  I.右足.前に出す()
  I.右手.後ろに引く()
  I.左手.前に出す()
}
if(I.右足.前に出ていたら) {
  右足.着地する()
}
if(I.右足.着地していたら) {
  I.左足.前に出す()
  I.右手.前に出す()
  I.左手.後ろに引く()
}
if(I.左足.前に出ていたら) {
  I.左足.着地する()
}
```

**着目するべきは時間の進行が自分の現実時間の「今」主動ではなく、コーディングの各要素の"今"が主動の進行であることです。**

**(実体のない)各要素の進行を、(実体のある)自分の現実時間につなぎ合わせ、つなぎ合わせた各要素を自分の現実時間で監視する進行時間(リズム)であることです。**

経験的に言うと、組織内のリズムでこの一線を越えて、自分のコーディングを監視し続ける時間の進行のリズムになるかがコーディングが出来るようになるか、ならないかのポイントです。

この点が、右脳・左脳を認識する前までは「自分」というものが"コーディングの要素への連動"がなく、スケジュールの時間への連動だけであり、自分の現実時間の「今」と「次の今」を会社の、組織の、案件の、チームの、スケジュールの、納期までの工数に対する担当者A, B, Cの仮想としての自分の連動だけにつなぎ合わせてしまっていました。



[](
「要素(主語)」が動作を行うことで、各要素の"現在完了形"の"刻"が生まれる。"刻"を「時」に乗せるには自分の「今」が必要だ。それが現実時間に対しての「自分:時間 = 1:多」だ。それが出来て本番稼働したら現実時間で「人:時間 = 多：多」になる。
)



**コーディングを行う前から無意識的に認識が右脳型でした。**
**右脳型でコーディングしていたときは「自分の現実時間」の進行に、コーディングの要素を加算していた**ので、「(要素がすべて並列に一体化した)今」+「(要素がすべて並列に一体化した)今」の進みでした。頭の中で、コード1行ごとに全要素を現実時間の並列の「今」の土台に並べるという無駄な作業をしていました。

「自分の現実時間」に加算するけど、その領域は右脳側で、コーディングだけの領域ではないので、他と区別するためにコーディングの1行1行をあえて分離して認識していたように思えます。
これではコーディングは先に進みません。

**左脳側で捉えるとコーディングは加算ではなく更新です。**

コーディングを書き始めるスタート時点で、必要な材料は「主語」として扱えるように分解されて全て揃ってる必要があります。スタートから「主語→」「主語→」の連携を更新していきます。

ソースコードは1行1行が分離しているものでなく、経過時間のように上の行から下の行へと1つに更新していきます。
結果的に、次を考えるフォーカスの"一瞬"、**それまで書いたコードは一体化した"今"に更新されて土台になります。**

最後の位置でスタンバりながらの最後へ向かっての加算ではありません。
日本語的、右脳的に1行1行を時間の経過の最後の「今」でスタンバっているとこれが捉えられません。

**結局は完成形のイメージがあろうとも、コーディングの「要素(主語)」の"今"の変化を、自分の現実時間の「今」でキャッチして把握し続ける作業が必要です。**


#それから　（結）
長々と書きましたが、伝えたいことは左脳・右脳を認識したことによる時間のつなぎ方の変化です。
**コーディングするときは意識的に左脳で”1個1個の部品"を主語にして考えよう**、と試みました。
すると日本語の、時間の「今」に一個の意味としてまとめようとする領域を超え、1個1個の主語の並行軸は「今」を作りました。

**左脳を意識するというのは経験的に言うと、考えるときに物理的に頭の左側を意識するだけです。意識すれば左脳側が際立ちます。**

最初は自転車に乗れない感覚のように不安定でしたが、徐々に安定していき、結果として自分が作成したコーディングが先へ進み、不安なくできるようになりました。

※ブログを開設しました。こちらもぜひ閲覧してください。
<a href="https://kangae.jp">考え研究所</a>
<a href="https://eigoken.jp">英語研究所</a>