JavaScriptの業務スキルレベル 判別表 (5段階)

ふと思ったので、今の段階でさらっと確認してみます。
JavaScriptの業務スキルレベル 判別表 (5段階) - 主に言語とシステム開発に関して
○ == その設問で求められることに応えられる
× == 無理だなと理解できる
? == そもそも理解できない段階である

(0)非 JavaScript 開発者

JavaScriptの事を「ジャバ」と呼んでいる。
× ジャバスクリプト。
画面上で物が現れたり消えたりするのを指して「Ajax」と呼んでいる。
× 呼んではいないですけど、似たものかと思っています。
JavaScriptの事を,「Javaスクリプト」とか「JAVAスクリプト」と表記している。その表記だと完全に別物の言語を指す,ということを知らない。
○ 表記はjavascriptJavascriptにしていました。別物の件は知りませんでした。

(1)初学者(入門書を学習してゆく段階)

JavaScriptは,ちょっとさわった事ならばある。
if,for,while,switch,break,continue,function などの基本的な制御構文は,何も見ないで書ける。
× 何も見ずには無理です。"continue"は初めて見ました。
ネット上で拾ったライブラリやサンプルコードを自分で流用する時に,パラメータの部分(数値とか)を変えて,少しだけカスタマイズして使う事ができる。
○ いまcodecademyで近いことをしています。ただオリジナルサイトにコピペをするというものではないです。
HTMLの地の文の中に処理そのものをベタで書いたり,jsファイルの中に関数をそのまま並べて書く,というコーディングスタイルだ。
○ そうですね。
document.getElementById() という関数を使ったことがある。しかし,DOMについては何も知らない。
○ 何度か使いましたが、この関数についての詳細は…DOMについてはさらっとやりました。
バグをなくすために,「バグが出たプログラムに対して,あちこちに alert() を埋め込んで確認する」という方法を主に取っている。
○ 変数がおかしくなる位置を把握するために、そういう手法があるみたいですね。
alert() と書けばアラートを表示できる,ということは知っている。しかし,そのalertというメソッドをどのオブジェクトが持っているのかは知らない。
○ そうですね。標準オブジェクトがどうこう、とは読みました。
for文を書く際,for( var i = 0; … とせず,for( i = 0; … というようなコードを平気で書く。グローバル汚染の認識がない。
○ forに入る前に上でvar i = 0;と書いておけばいいのかなと思ってました。グローバル汚染…!?(白目
document.all や document.form といったコードを書く。
× まだ使ったことないです。
インデントが3や4を超えるような,保守性の悪いコードを平気で書く。(例えば,functionの中のforループの中のif文の中にさらにループを書くとか)
○ 書いたことはないですが、そのくらいは普通かと思ってました。
どこに書いてあるスクリプトがどのタイミングで実行されるか,あまりよくわかっていない。
○ よくは分かっていないけど、それがこわいので、初見のコードをジロジロ追いかけて把握しようとはします。どういう要素があると実行されるのかは、なんとなく分かりますが、全て把握はしてないですし、どういう見方をすれば漏れなく実行タイミングを把握できるのかが分かってません。
HTMLを書く際,tableタグの中にtbodyタグが無いとJavaScriptの動作上困る,ということの理由が分からない。
× ええ?まだtableタグとJavaScriptを合わせたことがないですね。
本屋や書店で,JavaScriptの本がJavaのコーナーの棚に陳列されているのを目にしても,特に憤りを覚えはしない。
× 「エンジニアの人から見ると苛立つんだろうな」とおぼえますね。
Firebugというものを何となく知っているが,それでも「もし作っている物の対象ブラウザがIEだけなら,わざわざfirefoxを立ち上げてfirebugを使う必要性はない。」と考えている。
× 単語は初耳です。ブラウザチェックの話ですね。

(2)ノーマル(基礎的な知識があり,ある程度の動くものを作れるようになった段階)

JavaScriptで,プロトタイプベースのOOPができる。
? ええ?おっぱっぴー?!初耳なような…
つまり,自分で独自に定義したJSON形式のオブジェクトを new して,そこで生まれるインスタンスたちに仕事をやらせる,というコーディングスタイルである。
JavaScriptでは全てが連想配列である,という事を知っていて説明できる。
ある程度DOM操作ができる。DOM Event(例えばDOM Level 2 Event Model)についてはあまり知らない。
×
DOM要素に対し,各種イベントをセットして,画面に動的なしかけを埋め込む事ができる。
× Ajaxの部分でありましたが、まだちょっと無理だなと思いました。
しかし,複数の要素に対して色んなイベントのコードをバラバラに記述しているので,次第にイベント周りのコードがめちゃくちゃになり,画面の挙動が理解不能になってしまう。(つまり,個々のイベントリスナ関数をバラバラに記述しており,1つの管理オブジェクト内にまとめて定義していない。)
jQueryprototype.jsを並存させるためには「(function( $ ){ 〜 })( jQuery )」のように記述する必要があるわけだが,このコードの意味を理解できる。
JavaScriptで,正規表現を使いこなせる。
× パッと見、暗号みたいですよねこれ。
JavaScriptからのCookieの読み書きに慣れている。
静的CSSの作成だけでなく,動的なCSS操作もまあできる。つまり,CSSプロパティをJavaScriptから動的に変える事により,静的CSSの限界を補うことができる。
× hover表現をCSSではなくJavaScript側で操作するというときに触れました。なるほどでした。
JavaScriptはマルチスレッドだと思っている。
thisというキーワードを日常的に使ってコーディングできる。つまり,JavaScriptでオブジェクトをまともに利用できる。thisが文脈依存である事は何となくだけ知っている。
○ なんとなく。
無名関数/クロージャを日常的に使ってコーディングできる。その詳しい効用は分かっていない。
JavaScriptの変数には,参照と実体の2種類があるという事を理解している。それを理解していないと問題が起こる,という事を人に説明するための短いサンプルコードを作れる。その点を図を使って人に説明できる。
× よく使うプロパティやメソッドはprototypeに保存して参照するようにして、同じものをいくつも生産するべきでない、という話は理解しました。
function f( x, y ) という関数を定義したときに, f( 1 ) のように呼び出し時の引数の数が少なかったり, f( 1, 2, 3 ) のように呼び出し時の引数の数が多かったりする場合の挙動がどうなるのか,理解していない。そういった仕様がどう役立つのかわからない。だから,「arguments」というオブジェクトの使い方もよく知らない。
×
配列中の要素を順番に操作する時に,for文やwhile文を使ってスキャンするのが間違っており,オブジェクト指向として正しくない,という事を説明できる。かわりに,いつも map(),each(),select() などのイテレータメソッドを使ってコーディングしている。
× 複数の引数をとる関数には触れましたが、呼び出し側でそういうことをした場合のあれこれは全然知りません。
例外オブジェクトやthrow文を使ったコード設計が具体的にどういう時に必要になるのか,よく理解していない。
Firebugで,デバッグやレイアウト調整まではできる。
「DHTML」という死語をいまだに口にすることがある。
XmlHttpRequestを自由自在に使いこなせてはいない。
JavaScriptを使って複雑なHTMLを動的に生成しなければならず,面倒だと感じることがよくある。または,サーバ側のCGIのコードと全く同じようなロジックを,JavaScriptのコードでも書かなければならず,二度手間・二重管理になってしまう。
scriptタグの中身は,<-- --> などでコメントアウトする。その場合に生じる不具合を知らない。
JavaScriptの自動単体テストの方法を知らないので,品質の保証されたコードを書くことができない。ある程度手動で試験を行なうが,そのために,素早い仕様変更に対応することを難しく感じている。

(3)中級者(開発プロジェクトで1人月としてカウントできる水準)

JavaScriptでやりたい事は,JavaScriptでほぼ実現する力を持っている。(外部仕様が渡されたら,とりあえず完成にこぎつけられる。ただし,内部仕様と工数は度外視している。)
×
Prototype.jsjQueryなどのライブラリを渡されたら,中身のコードを自力で追って動作を理解したり,動作を軽く修正する事まではできる。
Prototype.jsjQueryのような汎用ライブラリの上で動作するプラグインを,必要なら自作できる。
thisというキーワードを使ってコーディングできる。thisのコンテキストがわかり,自分でコンテキストを変更する方法も知っている。
×
JavaScriptで,クラス(プロトタイプ)の継承ができる。(ライブラリを使わない)
×
メインの関数を作るとき,当然,引数はJSONにする。その理由を説明できる。
無名関数/クロージャを使わないとJavaScriptのコーディングが困難である,という事を知っており,遅延評価について説明できる。
inというキーワードを使ってコーディングできる。配列に対してinを使ってはならないという事を知っており,inが必要になる局面を具体的に例をあげて説明できる。
×

:argumentsというキーワードを使ってコーディングでき,どう役立つのか説明できる。
:?

Ajaxのおかげでビューの製造工程をDRYにできる,という事を説明できる。
XmlHttpRequestをラップするようなライブラリを日常的に使っている。なので,自分にとってAjaxは,空気や水のような存在であると言える。
Firebugで,XmlHttpRequestのレスポンスの中味を見たり,XPathの調査やパフォーマンス計測(プロファイル)ができる。
alertやconfirmがDOM構造に属さない特殊な存在であり,イベント発動処理に際して問題を引き起こす可能性がある事を知っているので,取扱いに注意している。
ブラウザ間でJavaScriptの動作にどのような差異があるのか,と尋ねられたら,5〜6個程度ならばその場ですぐに言える。
「サイ本」とは何か理解しており,内容もだいたい把握している。
×
ドラッグ&ドロップやアコーディオン,タブ,ツリー型メニュー,カレンダーなどのUIを,既存のライブラリの組み合わせですばやく作成できる。エフェクトのかけ方にも慣れている。
×
(4)上級者(メインPG/メンターとして,主設計を任せられる水準)
(任意の)やりたい事は,JavaScriptでほぼ実現する力を持っている。
×
IEやOperaで,Firebugと同じようなことができる。
×
不明点が発生したら,ECMA Scriptの仕様書の該当箇所から,ブラウザの動作を説明できる。
ブラウザ間でJavaScriptの動作にどのような差異があるのか,ほとんどの相違点とクロスブラウザ対策実施方法を把握している。
×
JavaScript単体テストツールを利用できる。アプリケーション内のJavaScriptモジュールを,チームで網羅的に単体テストする事ができる。
×
Prototype使い達がprototype.jsを好む理由がわかっており,自分も同感している。 同時に,Visual StudiojQueryが正式サポートされるに至った理由を知っており,自分も同感している。 同時に,両ライブラリのデメリットを客観的に語れる。
Prototype.jsjQueryのような汎用ライブラリを,必要なら自作できる。
単なるプログラミング一般の高速化ではなく,JavaScript特有の,高速化のためのセオリーを理解している。
typeof演算子やinstanceof演算子を使いこなし,その必要性も理解している。
JavaScriptのコーディングをせずにJavaScriptを使った開発を進めて行く,という手法を有効活用している。サーバサイドでjsコードのラッパの役目をするDSLを組むなど。
DOM Level 2 Eventsについて熟知しており,createEventやdispatchEventをクロスブラウザで扱うための方法を理解している。それらがなぜ必要なのかも説明できる。
デザインパターンアーキテクチャパターンの概念を,(完全に等価ではないとしてもアナロジーとして)自分なりにJavaScriptでの設計に取り入れ,そのメリットを一貫性を持って人に説明する事ができる。それらを実際にプロジェクトで利用している。
サーバ側がDAOの役目さえ果たしてくれれば,アプリの残り全体はJavaScriptだけで一人で書ける。
しかし,実際にそうしない根拠も説明できる。
JavaScriptの最前線の動きを常にウォッチしている。
×
JavaScriptを要件に応じて適切に難読化・暗号化・圧縮できる。
×
有用なJavaScriptライブラリやAPIのストックが多い。さらに,そのストックが自分の中で絶えず増えて行くような,何らかのルーチン/仕組みを持っている。

(補足)JavaScriptに対する意識/認識に関わる項目

自分の環境で .js ファイルをダブルクリックした時に,エディタは立ち上がらない。その .js ファイルはその場ですぐに「実行」される。
ブラウザ上の煩雑な作業は,ブックマークレットGreasemonkeyでスクリプトを自作する事によって自動化している。(スクリプトの言語はJavaScript

ブラウザ上の煩雑な作業は,ActiveX/COM経由でIEを操作する事によって自動化している。例えばWebスクレイピングなど。(言語は問わない):?

ブラウザ上の煩雑な作業は,FirefoxのXPIプラグインを自作する事によって自動化している。(言語はJavaScript
デスクトップ上の煩雑な作業は,WSHやWSFやHTAでスクリプトを自作する事によって自動化している。(スクリプトの言語はJScript
エディタ上の煩雑な作業は,マクロを自作する事によって自動化している。(マクロの言語はJScript
時折,コマンドプロンプトから直接JScriptを実行する。
JScript.NETかHTAを使った業務アプリケーション開発案件の経験がある。
自作のスクリプトを利用する事によって,任意のWebサイトの動作を自由に改変する事ができるので,「このWebサイトは不便だ」という概念を持っていない。
Google Maps APIを使って,有用なサービスを短時間で構築できる。もしくは,excanvas.jsを使えるので,Flashがいらない。
VBScriptの可能性を追求したあげく,実用上使い物にならないことを悟り,VBScriptを捨てたという苦い思い出がある。
node.jsなどのライブラリを使って,サーバサイドJavaScriptアプリケーションを作成できる。