プログラミングと自分

プログラミングの勉強とは主に二種類あると思う

  1. 言語仕様、FW(フレームワーク)仕様の把握
  2. アーキテクチャ仕様(実際に「こういう製品はこういうプログラミングしたら実現できる」という、製品ジャンルごとの知識)の把握

 

1も2も頭の良さなんて無くてもいけると思う。条件は時間だと思う。もちろん頭いい人は成長スピード速いと思う(便宜的に書いたけど頭いい悪いって結局ジャンルによるし語弊があると思う)。これが揃ってればいくら頭悪くてもどうとでもなると思う。めんどうなので自分はこれを数年以内にある程度一通りものににできたらなと思ってる(理想は)

 

 

そしてプログラミング自体にまつわる能力は例えば以下の種類があると思う(やる内容によって違うけど)

  1. 言語仕様、FW仕様、アーキテクチャ仕様に関する事前知識があること
  2. 知識が無い場合、事実だけを材料に導き出す能力(およびそれを実現できる処理能力&脳内メモリ)

2は「これはこうだと ならばこれはこうなはず」をひたすら脳内のスタックかヒープか分からないけど積んで一つ一つ処理していく。プログラムがでかくなればなるほど、その処理にはある程度脳内にメモリ空間が必要だと思う(たぶん訓練で増えると思うけど)

 

 

そして職業プログラマーに向いているのは以下の人だと思う

  1. 上記「プログラミングの勉強」ができて、上記「プログラミング自体にまつわる能力」がある(または得られる可能性が高い)人
  2. 複数人作業の情報のやり取りができる人

2についてはいわゆる社会人ならほぼみんな規定に達してると思う。自分は「自分がすごく知ってること」についてはうまく情報伝達や返答がスパスパできる特性があるので面接でコミュ力をごまかしやすい(わざとじゃない。面接に慣れすぎて面接で答える内容はスパスパ答えられて実際以上に頭の回転が速いと思われてしまう。気がする。わざとじゃない)

 

 

文系がどうのこうのって言うけど明らかに理数系が得意な人のほうがプログラミング自体は向いていると思う知らんけど。「知識が無い場合、事実だけを材料に導き出す能力(およびそれを実現できる処理能力&脳内メモリ) 」を理数系が得意な人の方が明らかに備わってると思うしそれがプログラミングの基本だと思う。というか数学ってパソコン使わないだけでほぼプログラミングだったしね。

例えば数学に行列とかあったけどあれってプログラミングで言えばforループだからね(適当。知りません。忘れましたがそんな感じだった気がした)。だから自分も「なんだよ数学ってプログラミングなのかよ」って思って、数学の公式をプログラミングで表現したらどうなるのかなって思って変換しながら勉強してみようかなって思ったことあった(やってない)

 

 

自分が得意なことは「曖昧なことにたいして大体の雰囲気を割り出す」ということだったと思う、たぶん大体。逆に事実のみしか書いちゃいけないなら、自分は良さを失うと思うし、実際今の職場でほとんど自分の能力的な良さが出てないと思う。デバッグにしろプログラミングにしろ設計とかテストとか一般的なIT業務にしろ何にしろほとんどが事実を捉えてやるやつだから自分はそういう世界にチューニングするのにまだ若干時間があるといいかなと思ってるレベル。チューニングしないと慣れない。x思わず勘でデバッグしてしまうし勘で結果を捉えてしまって違う想像の情報を頭に入れてしまってやらかすことがある。例えば「この変数の値はここでは10です」と言っても実際12だったりする。普通に自分頭おかしい。でもそういうことやってしまう。たぶん脳内のメモリとCPUのスペックが追いついてなくてスタックオーバーフローか軽く熱暴走してるんだと思う。「知識が無い場合、事実だけを材料に導き出す能力(およびそれを実現できる処理能力&脳内メモリ)」という部分において自分はまだチューニングが必要…。あるいは、最初書いたとおりあらゆる仕様を把握してしまうか(脳の変化は工夫できるトコもほぼなくほぼ慣れ&鍛錬しかない気がするので基本的に自分はこっちから攻めたいと考えてるけど、そう考えているうちにクビになってしまうかもしれない)

 

 

このように自分は自分が考えていることを「こう思う」「なぜなら」「例えば」的なある程度人に論理的にスムーズな感じで説明してしまう癖があるんだけど、内容が読んでて分かると思うけどほとんどすべてが事実ベースじゃない。「こう思う」「たぶん」「かもしれない」「知らんけど」が多い。そういう脳内空間になってるんだと思う。こう書くと自分はプログラマーに向いてない系の脳の状態なんだろうなと思う。面接ではある程度向いている人に思われるように振る舞ってしまうのは前述したとおり「面接で聞かれるような内容の返答に慣れすぎてスパスパ論理的にスムーズに答えてしまうから」だと思う。慣れすぎて。「こうなんです」「なぜなら」「例えば」という論理展開は元々よくやってるし

 

 

自分がプログラミングに向いている箇所があるとしたら以下のようなものかもしれない

  1. タイピングが生理的に好きであること
  2. プログラミングというものが文化的にも職業的にもすごい好きで憧れがあること(ただし下手の横好きなので、職業としてちゃんと今回も続くかどうかが危ない)で、それをやれるならその他に不満が発生しづらいこと
  3. そのことによって、無職時代にある程度独学で知識基盤を構築できたとこと、そしてそういう実績があること
  4. 一応論理的な接続詞をつけて物事の認識を構築するのが好きなこと(逆に基盤が曖昧なままだと不安で作業ができないし学びも遅くなる)。どこかで活きてくれればな…と思う

その他は自分はプログラマーという職業においてあんまりアドバンテージ無いと思う。本当に、面接でスパスパ喋れて申し訳がない。わざとじゃない。ある程度普段の自分に近づけるために、少しだけコミュ障っぽい雰囲気も出したつもりだけど、それでもスパスパ喋れすぎてしまったのかもしれない。入社してからがっかりされることが、前職からの流れなので、今回もそうなのかなって思って、自分でも悲しいです。全国の面接官にはわかってほしい、「面接何回も受けてっから受け答え簡単すぎてコミュ力あるように見えてしまうんだろうな」感わかってほしい

 

 

 

 

ということを書こうと、今取り組んでるフレームワークいじりで発生したデバッグをしていて思いました。

  1. 「これはこうだから、これはここにあるはず」
  2. 「ここにあった。これはこうなってる。ということは次はこれで検索する」
  3. 「あった。これに入ってる変数はこれで、これはこの関数の戻値である。ということはこの関数の定義を探す」
  4. 「あった。この関数はこれを返していて、そしてそれは引数につながってるからこの関数を読んでる部分を探す」
  5. 「あった。このファイルはデータベースのテーブルと関連づいているはずだ。ということはこのファイル名と同じテーブルを見てみる」
  6. 「あった。なるほどここに古い値が残ってるな、これを読み込んでいてエラーになっていたのか。キャッシュ消しても駄目なわけだった」
  7. 「あれ、消せない。エラー内容はこうだ。ググったら外部キーがどうたらって感じみたいなので、他のテーブルと関連づいているのかな(悪い癖でこっから勘)」
  8. 「他のテーブルあった(悪い癖で勘で)。これか。なるほどこれの該当するレコードを消してみよう(勘で)」
  9. 「その次に元のテーブルの古いレコードを消してみよう。消せた!(勘)」
  10. 「もう一度最初エラーが出た画面にアクセスしてみよう。おお成功した」

的な何重ものプログラミングクイズを乗り越えてようやくバグを消した。こういうのがプログラマーには必要だと思う。理数系が向いてると思う。なぜなら業務でやるプログラミングは内容をググっても答えが出ないから(言語仕様は出てくるけども、それとは別の製品のアーキテクチャの段階での疑問はググっても絶対出てこない。そういうところで悩むことになるし、その時に有効なのがこういうクイズを延々とこなせるCPUと脳内メモリと事実ベースでの論理展開だと思うし、かなり使うと思う。ググっても答えが無い世界においてはやっぱりそれが無いと駄目なんだと思う)

または仕様を全部把握してしまう単純に受験勉強の鬼も向いてると思う。自分はどっちでもないのでそこはかとなく頑張るしかない。

↑のようなやばいデバッグがほぼスムーズにできて感動したからこの日記を書いた。「すべてのエラーは順番にたどれば必ず解決可能」「詰まることが一切無くやれるようになることが可能」って気持ちになった。気持ちは。

そしてそれが自分にとって大事だと思う。「詰まることがなく必ず順番に物事を解決に辿らせる事が可能」であるならば精神的も作業的にかなり安定すると思う。「処理を追えば必ず作れるしデバッグもできる」的な自信と事実が持てたなら1人前の(=1人日、1人工で数えられる)プログラマーだと思う(知らないけど)。ちなみに自分はまだ0.15人前くらいだと思う。かなり会社のお荷物してるから怖い。クビりたくないです

 

 

いや実際デバッグにおいては「処理を一つ一つたどっていけば必ず解決できる』とは思う。多少基礎知識や事前知識が必要なところあるけど…。例えばsqlの知識無いなら外部キーがどうたらとか言われた時点で「は?」ってなって数時間詰まってしまうかもしれないし、sql初めてなら数時間ごときじゃ済まないかもしれない。レコードの消し方も知らないといけないし。そういうのはある…。ただしそれも「これを知ればこれがわかるはず」という安定感があれば精神的には楽になれると思う。知らないと『何を知れば何が分かるのか』ってのも分からない状態に陥ったりするからあれだけど。やっぱりできないものはできない。でも少しずつできるようにはなっていくのは事実…

 

あとVSCodeというエディタがすごく使いやすい。デバッグにおいてはEclipseよりもかなり使いやすい。フォルダを開いてデバッガをリッスン状態にしておけば勝手に処理を止めてくれるという簡易さ。Eclipseの場合、専用のデバッグモードでプログラムを起動しないと処理を止めてくれない。そしてファイル検索が怠い(VSCodeはそこらへんシンプルで楽に見える)。とにかくVSCodeはフォルダを開いてデバッガをリッスンしたらもうデバッグモード入ってくれるのが楽過ぎる。プロジェクトをどうたらとか一切なく「フォルダを読み込む」だけでいける。IDEによくある「プロジェクトの設定がどうたらでおかしくなった!」的なのも無い。楽過ぎる

 

 

って日記に何十分も書けているので自分はタイピングが好きだけど勉強には根本的にはそこまで向いていない。現職がちゃんと続けばいいなと思うけど自分の座右の銘の一つは「できることはできるしできないことはできない」なのでできないかもしれない。終わる