83BLOG

armorik83

自分のプログラマ能力指標を測ってみた

@armorik83です。Qiitaはなんか違うなと思ったので初めてはてなブログに手を出す。

postd.cc

元ネタは上の記事。真面目に回答してみたら能力全然足りてなくて危機感いっぱいです、がんばろ。

コンピュータサイエンス

データ構造: レベル1

レベル2: ハッシュテーブルの実装方法や衝突への対処法、優先度付きキューとその実装方法などを説明できる。

レベル2で説明求められたので脱落。

アルゴリズム: レベル0.5

レベル0: 配列内の平均値を見つけることができない(信じ難いことですが、私はそのようなプログラマ志望者と面接したことがあります)。
レベル1: 基本的なソート、検索、データ構造トラバーサル、データ取り出しアルゴリズムの知識がある。

さすがに平均値は見つけられても『データ構造トラバーサル、データ取り出しアルゴリズムの知識がある。』がどこまでのものを指すのか…。アルゴリズムは自分でも相当弱点だと認識しているので今後の訓練対象。

システムプログラミング: レベル0.5

レベル0: コンパイラやリンカ、インタプリタが何か知らない。
レベル1: コンパイラ、リンカ、インタプリタの基礎知識がある。アセンブリコードとは何か、システムがハードウェアレベルでどのように機能するかについて理解している。仮想メモリとページングに関して多少の知識がある。

仮想メモリとページングに関して多少の知識がある』って辺り非常に怪しい。リンカも怪しい。レベル0かもしれない…?

総評
コンピュータサイエンス弱すぎィ!

ソフトウェアエンジニアリング

ソースコードのバージョン管理: レベル?

レベル0: 日付順にフォルダをバックアップ。
レベル3: 分散型VCSシステムの知識がある。BzrやMercurial、Darcs、Gitを試したことがある。

Gitガンガン使ってますが逆に言うと、BzrやMercurial、Darcsは全く分かりません。さすがに0ではない。レベル不明。

ビルドの自動化: レベル2.5

レベル2: スクリプトを作って基本的なシステムをビルドできる。
レベル3: スクリプトを作ってシステムだけでなくドキュメントとインストーラもビルドし、リリースノートを生成し、ソース管理のコードにタグを付けることができる。

2は超えてるはず。リリースノート生成さぼってます。

自動テスト: レベル3

レベル3: 機能テスト、ロードテスト、性能テスト、UIテストを理解し、自動化することができる。

自動じゃないテストは嫌だ。

総評
ソフトウェアエンジニアリングはまぁまぁでしょうか。知らないことだらけなので慢心せず鍛えます。

プログラミング

問題の分解: レベル2

レベル2: 問題全体を解決する再利用可能な関数やオブジェクトを考え出すことができる。
レベル3: 適切なデータ構造とアルゴリズムを使用し、変更対象である問題をいくつかの側面にカプセル化するような汎用コードやオブジェクト指向のコードを考え出すことができる。

大言壮語にしても、さすがに3とは言えなかった。

システムの分解: レベル1

レベル1: 同じプラットフォームかテクノロジ内でさえあれば、問題空間を分割してソリューションを設計できる。
レベル2: 複数のテクノロジやプラットフォームにまたがるシステムを設計できる。

一応Node.jsでバックとフロント両方自前でやってましたが…バックエンドの技術は薄いです。

コミュニケーション: レベル3

レベル3: 思考や設計、アイデア、仕様を明確に理解して伝達でき、文脈に合わせてコミュニケーションできる。

実際どうかは、各人の評価に委ねます。

同一ファイル内におけるコードの秩序: レベル3

レベル3: ライセンスヘッダ、サマリ、十分なコメントを含むと共に、一貫性のある余白の使い方がなされており、見やすいファイルとなっている。

割と神経質なほうかも。よほどじゃなかったら何でもいけますが。好きな本はリーダブルコードです。

ファイル間におけるコードの秩序: レベル2.5

レベル2: 各物理ファイルが固有の目的を持っている。例えば、あるファイルはクラス定義、あるファイルは機能の実装、など。
レベル3: 物理的なコードの構成が設計とほぼ一致しており、ファイル名やフォルダ構成を見れば設計を想像することができる。

3と言いたい! でもちょっと経つと粗を感じるので、堂々とは言えないですね。この辺の構成は気にして試行錯誤する。

ソースツリーの秩序: レベル2

レベル2: 循環依存がなく、バイナリ、ライブラリ、ドキュメント、ビルド、サードパーティのコードが全て適切にフォルダ分けされている。

上と似てる。けっこう気を使う方。

コードの可読性: レベル2.5

レベル2: 長い関数がない。珍しいコードやバグフィックス、コードの前提を説明するコメントが書かれている。
レベル3: アサーションを使ってコードの前提が検証されている。条件やメソッドのネストが深くなく、コードが自然に流れている。

3までいくかな? というところ。アサーションを全てにはしてないけどTypeScriptユーザ。ネストは浅いものを好み防御的プログラミングが多い。3に近いのかな。

防御的プログラミング: レベル1.5

レベル0: 防御的プログラミングの概念を理解していない。
レベル1: コード内の全ての引数をチェックし、重要なコードの前提についてはアサーションを行う。
レベル2: 戻り値のチェック、および問題が起こり得るコードについての例外チェックが確実になされている。

スタイルとしては防御的なんだけど、自分が使うツールは例外チェックとかサボってるので2まで届かず。

エラー処理: レベル1

レベル1: 例外を投げたりエラーを返すようなコードに対して、基本的な処理ができる。

エラー処理経験値の低さが露呈した。

IDE: レベル3

レベル3: カスタムマクロを作成したことがある。

まぁこの辺は。

API: レベル3

レベル3: よく使われるタスクを単純化したり、APIで足りない部分を補ったりするためにライブラリを作成したことがある。

AngularJSのAPIでもいいんですよね、えっ違う?

フレームワーク: レベル2

レベル2: 1つ以上のフレームワークを実務で使ったことがある。また、フレームワークに関連した用語をよく知っている。
レベル3: フレームワークを作成したことがある。

2と3遠くないですか。

要求仕様: レベル1

レベル1: 仕様の漏れについて疑問を持つ。

経験値の低さ。

スクリプト言語: レベル?

レベル1: バッチやシェルが使える。
レベル2: PerlPythonRubyVBScriptPowershellが使える。
レベル3: 再利用可能なコードを作成し、公開したことがある。

再利用可能なJavaScriptはダメですか!

データベース: レベル1

レベル1: 正規化、ACID、トランザクションなどデータベースの基本的な概念を理解しており、簡単なSELECT文が書ける。
レベル2: 将来実行されるクエリを念頭に置きながら、適切かつ正規化されたデータベーススキーマを設計することができる。ビューやストアドプロシージャ、トリガ、ユーザ定義型を使いこなすことができる。クラスタ化インデックスと非クラスタ化インデックスの違いが分かる。ORMツールを使いこなすことができる。

2の文量がヘヴィ。

総評
チーム開発経験が無い(あっても2人)のが成績に響きました。野良グラマつらいな?

経験

業務レベルで使用経験のある言語: レベル1

レベル1: 命令型言語、オブジェクト指向言語、そして宣言型言語(SQL)。加えて静的型付けと動的型付けの違いや、弱い型付けと強い型付けの違い、型推論について理解していればなお望ましい。
レベル2: 関数型言語。加えて遅延評価やカリー化、継続について理解していればなお望ましい。

遅延評価、カリー化辺りは理解していても業務レベルで関数型言語は扱えない。

業務レベルで使用経験のあるプラットフォームの数: レベル?

プラットフォームってなんですか。OS? Mac, Windows, CentOS…ん、違う?

職業プログラマとしての経験年数: レベル-1

レベル0: 1年

1年すら無いです。

専門知識: レベル1

レベル1: ある領域において少なくとも1つのプロダクトに関わったことがある。

なんだこのザックリとした項目。

総評
さすが、低いどころか項目の意図すら理解できていません。

知識

ツール知識: レベル0

レベル0: Visual Studio.NETやEclipseなどの主なIDEしか知らない。

知ってる(触ったことがあるとは言ってない)、WebStorm万歳。

触れたことのある言語: レベル2

レベル2: 関数型言語。加えて遅延評価やカリー化、継続について理解していればなお望ましい。

ここではレベル2ってとこですか。

コードベースの知識: レベル0

レベル0: コードベースを見たことがない。

コードベース…コードとベース…バンドかな?

最新技術に関する知識: レベル2.5

レベル2: アルファ版やCTP版やベータ版をダウンロードしたり、記事やマニュアルを読んだりしたことがある。
レベル3: プレビュー版を実際に触ってみて、何かを作ったことがある。それを一般公開していればなお望ましい。

Angular2でサイト構築試みてます。

プラットフォームの内部: レベル1

レベル1: プラットフォームの内部的な動作の仕組みについて基本的な知識がある。

まぁ…ぎりぎり。どこまでが基本的といえるのだろう。

読んだことのある書籍: レベル-1

ここの例全然読んだことないです、すんません!

ブログ: レベル3

レベル3: プログラミングについての個人的な洞察や考えをブログ上で発表している。

Qiitaで吠えてるともいえる。

総評

実務的知識の低いQiita芸人であることが露呈しました。レベル20になったら賢者になれるはず…!

まとめ

オールレベル3が求められるワケではないと思ってるけど、もっと全体的に成績を上げたいと思いました(小並感)

これから個人的な内容はブログに書きます。ではまた。