プログラミング言語の習得度合を考える

スポンサーリンク

こんにちは!めっそそです。

業務が忙しく中々記事を更新できなかったのですが、ひと段落ついたのでまた更新をしていきます。
リハビリがてら、今回は巷でよく議論される(?)「何を以てプログラミング言語を習得したのか」について書いていきます。(あくまで個人の意見です。参考程度に。)

※プログラミングという言葉は業務だとあまり使わず、開発工程の「実装」ということが多いので個人的にあまり馴染みがないのですが、今回はわかりやすくプログラミングと言っています

前置き

プログラミング言語の習得についてはSE、PGに必須ですが、果たして何を以て言語を習得した!と言えるのでしょうか?

仕事で言語を書いている人からすれば「即戦力で活躍してくれる」くらい、これから勉強を始める人や趣味でプログラムを書いている人からすれば「形になって動くものを作ることができる」くらい等、人によって基準が異なるので一概には言えません。

また、言語知識があってもフレームワークはどうなんだ、プログラミングができるだけじゃなく開発環境、実行環境を整えることができるのかなんかもあるため、単純にその言語が書ける以外の評価基準もあります。

が、今回はそんな細かい話は置いておいて、自分の経験と感覚から純粋にプログラミング言語の習得度合に一定の基準を設定してみました。色々意見があるかと思いますが、話のネタ程度にとらえてみてください。

習得度合の基準

個人的な感覚としては、以下の段階があると思います。詳細は以下で。

  1. 変数宣言や基本三構造が書ける
  2. ライブラリ、言語毎の特徴的な仕組みを書いたことがある
  3. 例外処理を書いたことがある
  4. ライブラリ、言語毎の特徴的な仕組みをプログラムから読むことができる
  5. ライブラリ、言語毎の特徴的な仕組みを使って実装できる
  6. 読み解くのが困難なレベルの実装をできる

【レベル1】変数宣言や基本三構造が書ける

みんな最初はここからスタートです。変数を宣言し、基本三構造(逐次処理、条件分岐、反復処理)を使ってプログラミングすることができる段階を指します。これができない=プログラミングができないと言っても過言ではないです。

性能、効率、保守性なんかを度外視したら理論上これで何かを作ることはできる…はず。同じ処理をコピペで書いたり、変数名に適当なものをつけて自分が分かればいいのだ!といった頃ですね。

とりあえずテキスト片手に実装をして動かしてみるのが楽しい時期。予想通りの結果が出てくると感動するよね。その気持ちはいつまでも大事にしてください。

【レベル2】ライブラリ、言語毎の特徴的な仕組みを書いたことがある

基本三構造の学習を終えた後、さらなる学習を進めた状態です。クラスがどうとか、文字列処理や日時処理に関してプログラミング言語に応じて色々な機能があることを知り、「へぇ〜こんなことができるんだ!でも何に使うの?」くらいのレベルかなと。

イメージとしてはテキストを片手に実装をしてみて動作確認を行なっているくらいかなと。本格的なシステムを作る、商用システムでは必須の技術ながら個人で勉強をする間はそのメリットを享受しにくいし、その癖複雑になってくるので誰しも一度嫌になる頃だと思います。

ここを理解してうまく動かすことができたり、レベル1のプログラムにこのレベルで学習した内容を取り込んで動かすことができると「もうこの言語はマスターしたぜ!」の気分になれます。気分だけ。プログラミング沼はここから始まります。

プログラミング初学者がつまづきやすいところですが、この段階では参考書がいっぱいあるので、是非是非色々な参考書を手に取り内容を読み比べてみてください。

【レベル3】例外処理を書いたことがある

正常系以外の処理を記載したことがある、異常系、準正常系の処理を認識しているレベルです。
一説には「プログラミングは正常系で半分、異常系で半分」だそうなので、プログラミング言語を知っていると言える最低レベルはここかなと。

ダニングクルーガー曲線では所謂「完全に理解した!」のレベルですが、仕事で使うにはまだまだ怪しいですね。

テキストでは一通りの内容を終えたため、「これ以上何を学ぶことがあるのか?」と思ったりします。確かに必要な知識はこの段階で身についているはずなのですが、じゃあ実際に役に立つのか?というと全く役にたたない不思議。。

ちなみに言語の学習時点では価値がわからない異常系の処理ですが、異常系の処理は超大事です。自分で異常系の処理を記載してエラーハンドリングできるあなたはこのレベルをとっくに脱出しています。

【レベル4】ライブラリ、言語毎の特徴的な仕組みを読むことができる

他人が実装したプログラムを読める段階です。処理の順番が理解でき、関数やクラスで呼び出された他の処理を含めて流れを追うことができる頃です。

この段階になると他人の実装を微修正する、簡単なバグを修正するくらいの改修はできると思います。しかし、いざ自分で書いてみようとなると何をしていいかわからない…の頃ですね。今までの自信がすっかり打ち砕かれている頃です。ダニングクルーガー曲線では「全然わからない」のレベル。

この段階だと仕事で使える…とギリギリ言えると思います。その後大規模改修に放り込まれて絶望するところまでセットだったりします。大丈夫、だいたい次のレベルの人が助けてくれるので全力で頼りましょう。

自分一人だとここの段階に到達するのは難しいと思うので、是非人が書いたプログラムを見てみてください。あなたが思う以上に複雑な処理が書かれていて、人が書いたプログラムって意味分かんねえな!とプログラミングの深淵を覗くことができます。

【レベル5】ライブラリ、言語毎の特徴的な仕組みを使って実装できる

一般的なライブラリ、言語の仕組みを使ってサクッと書ける段階です。レベル2や3の頃と比べると、同じ機能でもかなりスムーズにプログラミングができるようになっているはずです。

この段階になると、それなりの機能を改修できたり、設計書を見て一から実装ができるようになっているはずです。不明点もあれど、ちょっと調べれば対応できるようになっています。ダニングクルーガー曲線では「ちょっと分かる」のレベルですね。

なお、この段階が最も幅広いと思います。中規模のプログラム改修と新規プログラミングはかなり難易度に差があるので、レベル5前半が中規模改修、レベル5後半が新規プログラミングでしょうか。根拠のない感覚的な話で言うと、Javaなら500行〜の改修ができればレベル5後半くらいあるのではないですかね。

他にも、プログラミング言語のみならずその裏で動いている情報処理についての知識も身につく頃ですね。(例:参照型の変数を引数で渡した後にその変数を更新したときに、どんな挙動をするのかきちんと人に説明できる等)
これができる人は言語に対する解像度がかなり高いと思います。

ここまでくると、満場一致でプログラミング言語を使えると言って差し支えないです。仕事でも主戦力として活躍できます。一般的に求められる最高レベルはここではないでしょうか。

【レベル6】読み解くのが困難なレベルの実装をできる

長大なコード、機能をフル活用した実践的かつ効率的なコードを書くことができる段階です。このプログラミング言語における有識者と言っても良いでしょう。

このレベルにある人たちが書くのは洗練されたコードですが、その処理の難解さからレベル5の段階にある人でさえ読み解くのに一苦労をしたりします。
ひとたびコードを読めば「そんな機能・使い方があったのか…!」「何をしているかは分かるが、なぜこの処理を思いついたのかが分からない」みたいな感想を持ちます。でもそれを真似することはできません。

言語と真摯に向き合い続けた人たちが辿り着ける境地ですが、ここまでくるともはや修行僧と言えるレベルですね。一般の人がここまでたどり着くのは至難の業だと思います。

どの段階だとプログラミング言語を習得したと言えるか?

さて本題ですが、上記のうちどの段階で言語を習得したと言えるでしょうか?
結論から言うと、その言語を学ぶ目的によって変わってくると思います。なんともありきたりな回答になってしまいますが。。

一応、例として以下のとおり考えてみました。上記のレベルに照らし合わせれば、概ねずれてない見解になるのではないでしょうか。(目的…必要レベル)

  • サンプルで見るような簡単な競プロの問題に挑戦する…レベル1
  • 自分でとりあえず動くものを作る…レベル1〜2
  • 趣味/独学でそれなりのシステムを本格的に作る…レベル2〜3
  • 他の人が書いたプログラムを読んで理解する…レベル4
  • (他の人のサポートを受けながら)仕事で使える…レベル4
  • 商用レベルのプログラムを書く…レベル5

まとめ

長々書いてきましたが、「プログラミング言語を習得した」というのはあくまで自己申告です。そしてプログラミング言語も一朝一夕にできたわけではなく時代の中で多くの機能が追加されてきています。

全機能を完全に把握することは最早現実的ではなく、不要な機能の習得に時間をかけた結果プログラミング自体が嫌いになったり、複雑な機能を使った結果作りたいものを作ることができなくなったりしては本末転倒です。

なので、「プログラミング言語を習得する目的は何か?」「それを叶えるだけの技量が身についているか?」を自分で判断し、技量が身についているなと思ったら自信を持って「〜のためにプログラミング言語を習得した!」と言いましょう。

コメント

スポンサーリンク
タイトルとURLをコピーしました