優秀さと一言でいうけれど、それって何だろう?
ということで自分で考えが及ぶ範囲でまとめます。
プログラミングのみではなく「ソフトウェア開発における優秀さ」を前提にします。
(ビジネス的な要素を含むということ)
ただし自分より遥かに優秀な人達について語ってもたぶん正しいことは語れないだろうから
自分の手が届く範囲は詳細に。それ以上については雑にまとめます。
ソフトウェア開発者の優秀さランク
列挙した各特徴は必ずしもそのランク内にまとまるとは限りませんが、便宜上雑にまとめています。
また、あまり細かすぎるコンテキスト独自の話はしません。きりがないと思いますので。
ランク A
初心者もしくは名ばかりの開発者が属するランク。
- 一人では成果物を仕上げることができない
- 成果よりもサポートにかかるコストのほうが大きい
- 新人であれば先行投資、そうでなければ単なるお荷物ということになる
ランク B
少し経験を積んだ開発者や、早い段階で学習することをやめた開発者が続するランク。
Aよりもサポートコストが下がっていることで「戦力」にはなる。
- 一人では成果物を仕上げることができない
- 成果よりもサポートにかかるコストのほうが小さい
ランク C
いわゆる普通の人。プログラミングが好きな人は多分ここにはとどまらない。
とどまっているとしたらむしろ所属組織の制約とかだろうか?
- 指示されたものを概ね指示された通りに作ることができる
- 自発的に求められた以上のことをすることはない
ランク D Evil
一通りのことができるが成果物はひどい。
長期運用するシステムをこのタイプの人に外注してしまうと悲惨な展開が待っている。
- システムを一人で一通り作ることができる
- 品質、保守性は低い。かろうじて要件を満たしているように見える程度
ランク D
プログラミングが好きな人であればこのランク以上同士で働けると楽しい。
- 担当範囲に関して自発的に考えてよりよくする工夫をすることができる
- 担当範囲を超えることはない
ランク E
チームに大きく貢献できる人か特定分野に強い人
- 担当範囲を超えて貢献できる(ビジネス、システムどちらで貢献できてもいい)
- 自らビジネス(業務ドメイン)のことを考えて意思決定をできる
- レビュアーをすることができる
- 特定の分野のスキルが他と比べて非常に高い人
ランク F
組織に大きく貢献できる人か特定分野に非常に強い人
- チーム、組織に仕組みを作り出すことができる(ビジネスのワークフローやソフトウェアのフレームワークなど)
- チーム、組織に自ら新たな価値を生み出すことができる
- 多くの人が解決できない難易度の高い課題を解決することができる
- 特定の分野のスキルが他と比べて非常に高い人
ランク G
いわゆる代表的プロダクトを持つような人。
技術的に尖っていて素晴らしいものを作る人や、プロダクトに関して尖っていて人が求めるものを作ることに長けている人。
- プロジェクトや組織をこえて、業界全体に影響を及ぼすような成果物を作ることができる
- その人を含めて数えるほどの人しか解決できないような問題を解決することができる
まとめ
ざっとまとめてみました。
SIerの下請けにいた頃の感覚だと A-E ぐらいのレベル差の人たちが同じ待遇で扱われている
というケースはよく見かけました。
実際は D や E の人達の成果がほとんどだけど何故か利益を当分で分け合っているという状態ですね。
最近目にする採用時の「提示年収が低すぎる」などについては
ランク E や F など個人の枠を超えて大きな貢献をできる人や特定分野において高いスキルを持つ人が
D 以下の人と似たような報酬しか提示されていないというケースがありそうですね。
A-C の人と D の人に提示される年収も同じくらいだったりというケースもありそうですね。
あなたの観測範囲ではどうでしょうか?
聞いてみたいこと
- 経営者や人事担当者はどの層を1番欲しがっているのかな?
- 経営者や人事担当者はどの層に対してどのくらいの年収を提示するのかな?
- 開発者の人の自己評価はどのへんなのかな?
このあたりについて反応があるとみんな喜びそう。
補足
自分にできないことについて言及しても説得力がないので何ができて何ができないか補足としてまとめておきます。
プログラミングに私が関してできること
- 与えられた要件に基づいて他者の支援を受けずにプログラムを実装すること
- リファクタリングでコードベースを改善すること
- 自動テストの導入、実施をすること
ざっくりまとめると、あからさまにやったほうがよさそうなことをやってないコードベースを
まともにできるぐらいという感じです。
プログラミング以外に関して私ができること
- 問題を発見すること
- 問題解決を行うこと
- 開発体制を改善すること
- 開発に関わる技術的な情報を収集、共有すること
- プロダクトやサービスに関する企画・提案をすること
- 開発ツールの作成、導入によって生産性を上げること
- 情報共有の基盤を導入し先導すること
- 人をつないで採用やビジネス上の人脈をつなぐこと
- 営業案件をとってくること
- 開発チームに関わるメンバーを支援すること
最近はこっちの方をやっていることが多いです。
支援って曖昧ですけど、各自の長所ややりたいことを把握してそれが可能な限り実現できるようにケアしたり、
抱えている問題があるかケアして問題があればサポートしたり、雰囲気作りをしたり、賑やかしたりとかそういうものです。
特に職責として明示されているわけではなく、自発的にやっています。
プログラミングに関して私ができないこと
- 高速な開発
- システムの全体的な設計
- 本格的なDDD
- パフォーマンス・チューニング
けっこう色々できない。