プログラミングのコーディングを理解はできるけど先に進まずに悩んでいる人
私はゲーム制作の専門学校に通っていました。
3年間全力で学習したにも関わらず、プログラミングのコーディングができるようにはなりませんでした。
これは努力の問題ではなくもっと潜在的な根本原因があると思うに至りました。
その後IT企業に就職しました。3年間もの間、プログラマとして業務に従事してもコーディングができるようになりませんでした。
その後あることに気づき、コーディングができるようになりました。それをこの記事に記載します。
これからプログラミングを学ぶ人が同じ鉄を踏まないために、この記事がお役に立てれば幸いです。
これはプログラマではなくてもクリエイティブな働き方を目指している人の参考になると思います。ぜひご一読ください。
この記事は全力で書きましたが、完成度60〜70%です。わかりづらい点についてはご容赦ください。わかりやすいように今後も改善していくつもりです。
目次
私の背景
新卒で入社して2〜3年の頃、専任で任された仕事は、作業進捗管理システムの小規模な機能追加でした。
設計からコーディングまでを行いましたが、小規模であるからか問題なく達成できました。
しかし、問題なく達成できたにも関わらず、自分のコーディングスキルに対して不安を感じ、その不安は最後まで解消できませんでした。
不安が解消出来なかった為、適正が向いていないと判断してプログラマを退職しました。
(その後、この記事に書いた問題を改善してから、コーダーとしてプログラマに復職できました。)
- 現場で、納期までのスケジュールに対して、自分の担当機能を全集中力で作っているのにも関わらず不安だった。
- 納期までのスケジュールと自分の進捗の把握しかできない。作成したソースコードの内容が把握できない。
- 機能追加した設計書からの模写はできる。0からはいくら考えてもコーディングが組み立てられない。
- 完成した後は機能の細かい仕様を覚えていられない。
- 日が経つに連れ、増えていく機能を管理できなくなる。
右脳と左脳を知ったことでコーディングができるようになる
ジル・ボルト・テイラーのパワフルな洞察の発作より、右脳と左脳についての明確な理解を知ったことで、コーディングができるようになりました。
コーディングは左脳を使うべきものでした。私は右脳で考えてコーディングしてしまっていたことがわかりました。
※以下、左脳側を青字、右脳側を赤字で記載します。
今にコーディングを一体化していた
「今」:(完成形のイメージすなわち、右脳のイメージ)に対してコーディングを”加算”していました。
プログラミング開発においても、自分で作らず、既存コードを完成形に合わせて大幅に変えずに機能拡張するように模写していました。
それは前回の記事「コーディングがきなかった根本的原因とその対策」でお伝えしたように、テスト当日に合わせて「今」に情報を詰め込んでいくようなものです。
それでは0のスタートから新しい機能を作ることができません。
これは会社の公転の時間軸で回っており、自分の個人の時間軸で仕事を回せなかったことにも起因します。するとどうしても既存のものに引っ張られてしまうのです。
コーディングする時は、納期時の完成形のイメージから毎日考え始めます。
スタートは無いですがゴールから紐がつるされているのを発見すれば、作成するソースコードはゴールにつながっているのだと思い、見切り発車ながらもソースコードを書いていきます。
そのようにゴールからソースコードをつなげて加算していくことがおかしいです。
ゴールからの差分を頭において、スタートからの差分が頭にない状態でした。
すなわち右脳で一体化しており、左脳で部品要素を個別に管理する頭が働きませんでした。
一体化した完成形から部品要素を明確に区別できず、ひたすら完成形にさらに肉付けするようなことをしていました。
正しい方法は要素を明確に分解して、要素ごとの時間軸で差分を管理するのが正解なのですが。
私は既存システムに機能追加していく条件でしか、コーディングを進めることが出来ませんでした。すなわち自分でスタートを管理しなくて良い状態が保たれたときのみです。
部位ごとに区別したところからスタートを合わせるべきです。スタートの部位を区別して各部位の時間軸を作るという作業が重要になります。
ここに書いている状態になっている人は注意してください。
長期間的に見ると突然新規案件を任された時に問題が顕在化します。
改善案:まとめ方を左脳型にする
文章は左から右へ書く
調査したところ、”中東圏の言語アラビア語や旧日本語等”以外の言語は文章を左から右へ書くようです。
文章の左から右へ書く規則性から、文章を書く等の”物事をシーケンシャルに表現する流れ”は「左脳から始まり右脳へつなげる」と仮定します。
[参考]なぜスーパーマリオは左から右に走るのか?左が主語であり、主語がスタートです。
左をスタート 右をゴールとします。
これまでは左←右だった
前述の説明よりこれまでの私は、コーディング書く時は「左←右」の思考で書いていました。
(to)「主語(スタート)を抽出」 ← (from)「右脳の一体化したイメージ(ゴール)」のような感じです。
「今」が一体化で記述したように、
コード:完成形の一部分 | ← | 私の頭:完成までの足りない機能の抽出 | ← | 完成形 |
コード:完成形の一部分 | ← | 私の頭:完成までの足りない機能の抽出 | ← | |
コード:完成形の一部分 | ← | 私の頭:完成までの足りない機能の抽出 | ← | |
・・・ |
コーディングを引き出す頭の中:右脳の一体化したイメージ(ゴール)へ戻る。→主語(スタート)を抽出。
右脳のゴールに左脳のスタートが加算される形でした。
思考が右脳のゴールからスタートします。ゴールに加算されるたびにスタートが消え、次のスタートを探します。その都度スタートの位置を覚えられません。
後ろに合わせる日本語的思考
「世界一わかりやすい英文法」の著者である関 正夫さんが言っていたことですが、有名なインテルのCMがあります。
英語は「インテル インサイド」、日本語は「インテル 入ってる」。
英語は「頭韻」で日本語は「脚韻」らしいです。その点で英語と日本語は真逆です。
日本語は文を後ろで合わせていると思います。
(文の違い)
英語の作文:「私は〜、私は〜」
日本語の作文:「〜しました。〜しました。」
日本語は後ろで合わせる、すなわちtail(末尾に情報を加えていく)していきます。文の最後でスタンバります。
日本語の後ろで合わせる書き方は、tailして末尾に情報を加えていき、末尾が「今」になって情報を詰める右脳型になってしまい、事柄をスタート時から個別に分解するべき考えが働かず、ごっちゃになっていってしまいます。
(プログラミングにおいて必要なのは、主語に合わせる英語の頭韻の方です。)
意図的に左脳を意識する
左脳を意識するというのは経験的に言うと、なにか考えるときに物理的に頭の左側を意識するだけです。意識すれば左脳側が際立ちます。
左脳を意識するとは単純に考えているときに頭の左側に意識をすることです。
すると左側に集まっている意識が浮き彫りになります。それが左脳で意識しているものだというのが私の体験に基づく研究です。
今度は物理的に右側で意識しますと、右側に集まっている意識が現れますので、その時に左側の意識のものなのか、右側の意識のものなのかが明確にわかると思います。
左→右にする
どのように頭を使うのか?について、左→右に考えるという思考方法を知りました。
例えばスポーツジムのランニングマシンを考えてみます。
ランニングマシンは「経過時間」もしくは「残り時間」の片方を表示できます。
例) 30分の場合、経過時間:05:30 残り時間 24:30
両方同時に表示する必要はありません。人の頭は経過時間と残り時間の2軸で同時に計算できません。試してみればわかりますが、計算するとき頭は同時に2つの軸を持つことが困難です。
私の”それまで”のコーディングはここでいう「残り時間」を計算していて、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“と1つの「今」に更新されます。
要素を詳細に分解する
次に
「私」を分解して「主語」と「動作」にします。
経過時間 | 右足 | 左足 | 右手 | 左手 |
00:00 | 着地する | 前に出す | 後ろに引く | 前に出す |
00:01 | 前に出す | 着地する | 前に出す | 後ろに引く |
00:02 | 着地する | 前に出す | 後ろに引く | 前に出す |
00:03 | 前に出す | 着地する | 前に出す | 後ろに引く |
00:04 | 着地する | 前に出す | 後ろに引く | 前に出す |
00:05 | 前に出す | 着地する | 前に出す | 後ろに引く |
経過時間の各秒に対する主語の要素を並列に並べました。
経過時間:主語が「1:多」となりました。
経過時間の「今」に対して主語1つのフォーカスでは対応出来なくなりました。
プログラムはこのように要素を極限まで分解して「今」に連動させる必要があります。
「右脳」の場合は”横軸“の各主語:右足-左足-右手-左手の関係をそれぞれ考えます。
「経過時間」の”縦軸“の変化は頭で切り替えないといけません。しかし”縦軸“の変化を頭で切り替えると、頭に浮かんでいた”横軸“の「並列」の土台がリセットされてしまいます。
今度は”縦軸“を土台にして並列の関係を0から考え始めることになり、多:多を考え初めて泥沼に陥り、これはかなり記憶力のスペースを消耗してしまいます。
「主語」を「並行」にすればそれがある程度削減できます。
主語を1つ1つの時間軸で管理する
各部位を列から行に変換して各時間軸にしてみました。
主語 | 00:00 | 00:01 | 00:02 | 00:03 | 00:04 |
右足 | 前に出す | 着地する | 前に出す | 着地する | 前に出す |
左足 | 着地する | 前に出す | 着地する | 前に出す | 着地する |
右手 | 後ろに引く | 前に出す | 後ろに引く | 前に出す | 後ろに引く |
左手 | 前に出す | 後ろに引く | 前に出す | 後ろに引く | 前に出す |
「主語」を1つずつの時間軸に意識すれば高精度になり「経過時間」の秒ごとの”連動”を捉えられます。(右手:後ろに引く→前に出す→後ろに引く・・・)
左脳側で考える目安として、「主語」から右に矢印を引いた考え方を行います。
右足→
左足→
右手→
左手→
そして各要素単位の時間の差分を自分が管理します。
1つの主語をフォーカスし、1フォーカスごとに「主語」の行動を書き留めれば「各主語」が別個に先へ進んでも、現在完了でまとめられ、消えることはありません。シーケンシャルな一線を保てます。
すると”記憶力”のスペースの無駄を省けます。
「右脳」の場合は“横軸”の各主語:右足-左足-右手-左手の関係をそれぞれ考える性質ですが、「経過時間」の”縦軸“の変化を頭で切り替えると、頭に浮かんでいた”横軸“の「並列」の土台がリセットされてしまいます。
「左脳」の場合は”縦軸“の「各主語」の1個を土台とし、”横軸“の時間変化の関係を考えます。「主語」の”縦軸“の変化を頭で切り替えても、「主語」はスタートなので1つ前に考えた「別の主語」の”経過後のスタート“と同期が取れます。スタートを忘れることはありません。
1つのまとまりのオブジェクトを作成する
元の主語「I」を更に左に置きます。
主語 | サブ主語 | 00:00 | 00:01 | 00:02 | 00:03 |
I | 右足 | 前に出す | 着地する | 前に出す | 着地する |
左足 | 着地する | 前に出す | 着地する | 前に出す | |
右手 | 後ろに引く | 前に出す | 後ろに引く | 前に出す | |
左手 | 前に出す | 後ろに引く | 前に出す | 後ろに引く |
「I」をスタート位置、「経過時間のどこか一点」をゴール位置、その2点で見れば、どれか1つの「サブ主語」をフォーカスして行動を進ませても、フォーカスがスタート位置の「I」に引っ張られるので他の「サブ主語」と連動がつながります。
別々の「サブ主語」と並行で走行できます。次の行動を行うときの戻り位置としてのスタート位置「I」です。
このように、より左に主語として1つのまとまりのオブジェクトを作成していきます。
それを前提としてコーディングの考え始めのフォーカスにし、「並行」の関係はスタート位置を土台として、「並列」の関係は「最先端のゴール位置」を土台として組み立てます。
先を作る
今とは「(人・物フォーカスの)”現在完了形“のあらゆる物それぞれが持つその瞬間の”今” (左脳側のスタートからの静的な今)」と、「(時間フォーカスの)先へと”現在進行形“の時が連なり続ける並列の「今」 (右脳側の終わりへの動的な今)」の2つに分解できると考えます。
先を作ることは現在進行形の「今」と「次の今」の動的関係を作ることです。
過去の状態→未来の状態の現在完了形の”今”の2点の差で生まれる物ではありません。
あらゆる物が動的な「今」の最先端に並んでいます。それが現実時間です。
「先を作る」領域自体は動的な「今」なので右脳領域の範囲ですが、プログラムは「今」が現実時間の進行で勝手に進んでいくものではありません。
同時並行を束ねる
プログラムを先へ進ませるにはコーディングの「要素(主語)」を先へ進ませ、自分の現実時間でつなぎ合わせる作業が必要です。
「要素(主語)」が進むのを束ねる横軸は、(現実世界に実体がある)自分の現実時間になります。(差分管理)
if(I.左足.着地していたら) {
I.右足.前に出す()
I.右手.後ろに引く()
I.左手.前に出す()
}
if(I.右足.前に出ていたら) {
I.右足.着地する()
}
if(I.右足.着地していたら) {
I.左足.前に出す()
I.右手.前に出す()
I.左手.後ろに引く()
}
if(I.左足.前に出ていたら) {
I.左足.着地する()
}
着目するべきは時間の進行が自分の現実時間の「今」主動ではなく、各部位(要素)の”今”が主動の進行であることです。
(実体のない)各要素の進行を、(実体のある)自分の現実時間につなぎ合わせ、つなぎ合わせた各要素を自分の現実時間で監視する進行時間(リズム)であることです。
経験的に言うと、組織内のリズムでこの一線を越えて、自分のコーディングを監視し続ける時間の進行のリズムになるかがコーディングが出来るようになるか、ならないかのポイントです。
この点が、右脳・左脳を認識する前までは「自分」というものが”コーディングの要素への連動”がなく、スケジュールの時間への連動だけであり、自分の現実時間の「今」と「次の今」を”会社の、組織の、案件の、チームの、スケジュール”の、納期までの工数に対する担当者A, B, Cの仮想としての自分の連動だけにつなぎ合わせてしまっていました。
振り返り
コーディングを行う前から無意識的に認識が右脳型でした。
右脳型でコーディングしていたときは「自分の現実時間」の進行に、コーディングの要素を加算していたので、「(要素がすべて並列に一体化した)今」+「(要素がすべて並列に一体化した)今」の進みでした。
頭の中で、コード1行ごとに全要素を現実時間の並列の「今」の土台に並べるという無駄な作業をしていました。
「自分の現実時間」に加算するけど、その領域は右脳側で、コーディングだけの領域ではないので、他と区別するためにコーディングの1行1行をあえて分離して認識していたように思えます。
これではコーディングは先に進みません。
左脳側で捉えるとコーディングは加算ではなく更新です。
コーディングを書き始めるスタート時点で、必要な材料は「主語」として扱えるように分解されて全て揃ってる必要があります。スタートから「主語→」「主語→」の連携を更新していきます。
ソースコードは1行1行が分離しているものでなく、経過時間のように上の行から下の行へと現在完了で1つに更新していきます。
結果的に、次を考えるフォーカスの”一瞬”、それまで書いたコードは現在完了に一体化した”今”に更新されて土台になります。
最後の位置でスタンバりながらの最後へ向かっての加算ではありません。
日本語的、右脳的に1行1行を時間の経過の最後の「今」でスタンバっているとこれが捉えられません。
特に学校の試験勉強で「テスト本番」にスタンバっていた学習方法がこの弊害となっていました。
そして、結局は完成形のイメージがあろうとも、コーディングの「要素(主語)」の”今”の変化を、自分の現実時間の「今」でキャッチして差分管理し続ける作業が必要です。
まとめ
長々と書きましたが、伝えたいことは左脳・右脳を認識したことによる時間のつなぎ方の変化です。
コーディングするときは意識的に左脳で”1個1個の部品“を主語にして考えよう、と試みました。
すると日本語の、時間の「今」に一個の意味としてまとめようとする領域を超え、1個1個の主語の並行軸は「今」を作りました。
最初は自転車に乗れない感覚のように不安定でしたが、徐々に安定していき、結果として自分が作成したコーディングが先へ進み、不安なくできるようになりました。