プログラミングスキルについて考える

ちょっと前に、初心者にプログラミングを教える約束をしたんだけど、そもそも「プログラミングスキル」というものについてちゃんと評価基準を考えたことが無かったので、どのように教えると効果的なのかイマイチ方針が定まらない。ということで、ちょっと真面目に「プログラミングスキル」というものについて考えてみたら長くなった。

学校ではどうやってプログラミングを教えているのか

自分がプログラミングを教わった記憶を辿ってみる。オイラは大学の授業で初めてプログラミングに触れた。
学校のプログラミングの授業課題だと、「指定の処理を行うプログラムを期限までに書き上げて提出する」というのを習得基準にするところだけど、それだけじゃ職業プログラマーとして使いものにならないことが数年の会社員経験で何となく分かってきた。

上記のような学校の課題をクリアするスキルだけでは不十分な理由は、職業としてプログラムを書く場合、大抵は複数人が共同で1つのアプリケーションを開発したり、基盤システムなら同じソースコードを長く保守管理する必要も出てくるという点。学校の演習課題のような、個人による一過性のコーディングでは立ち行かない。

大きなアプリケーションを作るには、他人と協力するか、1人でやるにしても、長期的なスパンで計画的に開発することとなる。初期段階でも、開発規模をスケールできるようにベースを作っておくのが重要となる。コードを適度な粒度に分割し、可読性と拡張性を保つのも重要だ。この辺は他人への配慮という意味合いが強いかもしれない。(長い時間が経ったら未来の自分も他人のようなものだし)

「プログラミング」を「自動車の運転」に置き換えて考えてみる

個々のディティールだけ追っていてもドツボにハマりそうなので、視点を変えて「プログラミングスキル」をちょっと別のことに例えて考えてみることにする。
「プログラミングスキル」を「自動車の運転スキル」に例えてみてはどうだろうか。自動車の運転なら、結構多くの人がイメージできるし、実際に運転免許を取得して公道を走っている人も多いだろうし。

自動車の運転をオイラの主観で捉えて話す。
自動車の運転免許を取得するには、大きく分けて2つのスキルの習得が必要だと分解できる。
1つは純粋に「自動車」という機械の動かし方を学ぶ「ドライビングテクニック」、2つ目は公道での社会的な立ち振る舞いのルールを学ぶ「交通法規」である。どちらか一方のスキルが欠けていると、自動車の運転免許は取得できない。(基本的にはね)

それと同じように、プログラミングにも2軸のスキルがあると言えるんじゃないだろうか。
1つ目は自動車で言う「ドライビングテクニック」に相当するコーディングスキル、つまり「プログラミング言語を通じて計算機を動かすスキル」だ。自動車を自分の手足のように操る車両感覚みたいなもの。
そして2つ目は、自動車で言う「交通法規」に相当する「他人にも理解できるようにコードを安全・シンプルに保つスキル」だ。この2つ目は上手い言葉で言い切れないんだけど、「社会性」の要素を多分に含んだスキルだと思う。

この「社会性」について例を挙げると、書いた本人しか読めないようなオレオレコードは、学校の課題として提出する分には評価が下がることはあまりない。処理速度の面で言うと、案外こういうオレオレコードの方が速かったりもする。だが、コードの保守性の面では最悪だ。コード中に何らかのバグがあって上手く動かなくなっても、誰も読めないコードでは他人の力を借りることはできない。また、書いた本人であっても時間が経つとコードが読めなくなってしまうことが多い。(数ヶ月後の自分はほぼ他人)
仕事としてプログラミングする場合は、保険という意味でも、処理速度を多少犠牲にしてでも可読性・保守性を優先させる。これは、法律で制限速度を設けて安全性を担保する公道と非常に良く似ていると思わないだろうか。


スポンサーリンク


学校教育と実務の断絶

振り返ってみると、学校の授業で教わるのは上記2つのスキルの中でも特に「ドライビングテクニック」に相当する「プログラミング言語を通じて計算機を動かすスキル」だ。学校の授業では、それに加えて「エンジンの仕組み」や「ハンドルの仕組み」に相当しそうな「データ構造とアルゴリズム」に時間を割いて教えている印象。各種ソートアルゴリズムの比較とか、データ構造によるアクセス効率の違いとか色々あった。(オイラは1度単位を落としましたけど…)
しかし、学校の授業では、自動車で言う「交通法規」に相当する「社会性」のスキルを教えることはほとんど無かったように思う。学校の演習は基本的に「個のスキルを問う」という教え方なので、スキルレベルがバラバラな集団の中での他者との兼ね合いを問われることはない。

そう考えると、この「社会性」の訓練は開発現場でのOJTにかなり頼っている要素なのではないだろうか。
別に全部学校で職業訓練しろとも思わないけど、この「プログラミングにおける社会性」、つまり「一般常識」となる知識は教材もあまり無いので独学がしにくい。所属する組織が違えば社会も違うのだから。もし個人でこの「社会性」を訓練するとしたら、有名なライブラリを触りながら常識的なお作法を読み取っていくぐらいしかできなさそうだ。

交通法規を知らない超絶ドライバー

社会性の欠けたオレオレコードについて、もう少し自動車に例えてみる。端的に言うと、暴走族や走り屋のようなイメージだ。公道でトリッキーな運転をしたら、それを見て混乱した周りの車が事故を起こしてしまうかもしれない。映画「ワイルド・スピード」みたいな超絶ドライビングテクニックを公道で展開されるのはかなり迷惑なのである。1人で走る分には気持ち良いし、目的地まで速くたどり着くかもしれないけど、事故を起こすリスクは高まる。走るのが速ければ良いというものではない。公道には対向車や後続車、原チャリや自転車だっているのだ。

最近はどうか分からないけど、オイラが就職活動をしていた頃、面接でたまに聞かれた質問に「書いたプログラムはどれぐらいの行数ですか?」というのがあった。いちいち記憶していなかったから答えられなかったけど、これはおそらく「ドライビングテクニック」を見積もるための質問で、長い距離を走っていれば、自ずと運転は上手くなるという考えだろう。採用する側も、優れたドライビングテクニックを持った人材を採用したいのはわかる。新卒のプログラミングスキルにおいて「社会性」はあまり問われない。

ただ、この手の判断基準で厄介なのは、プログラミングコンテストの類の実績を持ったタイプである。もちろんコンテストにもよるのだが、基本的には短いコードで評価される競技であるため、超短距離ドライバーが実績を上げてしまう。スニペットは書けるが、アプリケーションとしてまとめることができないタイプで、実はドライビングテクニックも大したことがないという人もたまにいる。「スタートダッシュは超上手いが、コースを完走できない」と言ったところだろうか。

マニュアル車とオートマチック車

時代が進めば、自動車は進化して運転の仕方は多少変わるし、国や地域が違えばルール・マナー、つまり「社会性」も変わる。プログラミング言語の違いは、右ハンドル車と左ハンドル車ぐらいの違いなのかもしれない。(異論は認める)
ここ最近のプログラミング環境の進化は著しくて、マニュアル車に対してオートマ車みたいな感覚だ。そこまでの知識が無くても職業プログラマーにはなれる時代がすぐに来るだろうとも思う。
オイラが初めて触れたプログラミングはJava + Eclipseだったので、超オートマ環境からのスタートだった。翌年のC言語の演習科目では、Linux環境でコマンドラインからコーディングとコンパイルをする演習授業になって結構戸惑ったのを覚えている。(オートマ環境からマニュアル環境に移った感じですかね)

人材を採用する側からすれば、AT限定免許取得者よりは、マニュアル免許を持っている人の方が良いだろうけど、業務内容によっては大型特殊やA級ライセンスまで持っている必要はないし、AT限定免許を取得した人ばかりの集団に1人だけA級ライセンスの人がいたところでその実力は発揮されないだろう。販売されている自動車がAT車ばかりなら、AT限定免許の人を集めるだけでも十分に仕事になるはずだ。

何のために自動車を運転するのか

ここまで、だいぶエラそうなことを書いてきたけど、オイラ自身も大したプログラミングスキルを持っているわけではなく、どういうスキルを磨いた方が良いのか具体的に考えたかったのである。AT限定免許の人を馬鹿にするわけではないし、プログラミングを自動車の運転に例えたけど、別にプログラミングを免許制にしろと言いたいわけでもない。

ここまでの話には、「何のために自動車を運転するのか」という、「目的」の話が無かった。スキルの話になると大抵この「目的」がスッポリと抜け落ちるんだが、「目的に対して最適な方法が選べる」というのが何にも勝るスキルなのではないだろうか。目的に対して最適な車種・ルートを選択すること、つまり段取りを決めることが、最高のスキル。アプリケーション開発は、決められたコースでの車種限定レースではないのだから。

AT車で済むことをわざわざマニュアル車でやる必要はないし、目的によっては、自分が使いやすい、自分専用のAT車を作ってしまっても良いのではないだろうか。IDEってのはそうやって進化してきたはずだ。より効率の良い手段が登場したなら、そちらを選べばいい。1つの手段に凝り固まるのが1番やっかいで、課題の本質を見誤ってしまう。
課題を効率的に解決する「ハッカー」を目指せということなのかもしれない。

というのが、今のオイラの考えです。

こちらは以前流行った書籍。
今回の例えに則ると、公道でトラブルを起こさないための”マナー“を具体的に語っている内容。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)


スポンサーリンク


Also published on Medium.