属人性、属スキル性とRust
まずはじめに、属人性と属スキル性について解説しておく。
属人性
特定の個人に依存する性質
その人物の経験、人脈、暗黙知などに基づく
属人的な業務は、その人物がいなくなると遂行が困難になる
例: 特定の顧客との長年の関係、組織の歴史的経緯の理解
属スキル性
「専門性」、「属技術性」と言い換えてもいい。
特定のスキルや知識に依存する性質
明確に定義され、学習や訓練で獲得可能
属スキル的な業務は、同じスキルを持つ他の人物でも遂行可能
例: プログラミング言語の習得、会計知識、特定の機器の操作技術
技術者を雇用する必要のある仕事を行うのであれば、そこには「属スキル性」は避けられない。「属スキル性」も避けられるという主張は、多くの場合は、次のどちらかだ。
スキルの必要のない仕事である。
本来的にスキルが必要な仕事であるにも関わらず、スキルが必要であることを自覚していない。もしくは、目を背けている。
後者のようなことを主張する人は、次のようなことを口にする。
プログラミングは簡単
Web開発は簡単
***は学習コストが高い
このような言説は、言うのも聞くのも慎重になるべきだ。
少なくとも現代の、求められる要件が非常に複雑で、基準となる品質のレベルも高い現代においては、開発は多くの場合相応に難しい。私の経験では、このような主張をする人は、開発において解決が難しい問題に対して本来自分が本来負う責任を、長期的な(時間的/金銭的)コストに転嫁している。
具体例を挙げる。
静的検査のツールの活用やテストコードもないPHPのコードベースを、「簡単」、「学習コストが低い」という点を挙げて褒める人がいる。一理があるように思えるかもしれない(一理もないような言説は世の中に殆どない)が、このような言説は自分の都合のいい部分しか見ていない。
「簡単」であるのは、開発で難しい部分を気にしなくてよい、「浅瀬でチャパチャパ」するだけのコードであるか、本来品質を担保するべき部分を担保せずに、問題が起きてから対処するような方針を無意識的に行っているからである。(ちなみに、浅瀬でチャパチャパするだけのコードは、本当にそれで要件を充足させられるのであれば、全く問題ない。また、問題を予防する方針にしていても、問題が起きてから対処することは往々にしてあるが、それは全く本件と関係がない。) 私は上記のような壊滅的状況に追い込まれたPHPのコードベースを定期的に触る星の下に生まれてしまっているので、このようなプロジェクトでどのような問題が顕在化し、それにも関わらず無視され、別の長期的なコストに転嫁されているのかを理解している。その例は以下のようなものである。
1. パフォーマンスを考慮したコードを書かない(書けない)ため、サーバのマシンスペックに頼る。(サーバコストへの転嫁) 2. セキュリティを考慮したコードを書かない(書けない)ため、なかったことにする。(将来、脆弱性が露呈する時の担当者へメンテナンスコストを転嫁) 3. 静的検査を使用しないため、自動的、半自動的に解決することができる問題でもツールではなく人間が問題を解決する(問題解決にかかる時間への転嫁。問題解決力のある人員を用意する、人材コスト、教育コストへの転嫁)
4. テストや型をまともに書かないため、テストや型が第一級のドキュメントになり得ることを無視して個人のコード理解力に頼る(型がなくてもコードを理解できる特異な能力を持つ人員を用意する、人材コスト、教育コストへの転嫁) 3, 4はまさに「属人性」である。属スキル性のように思えるかもしれないが、ここでいう問題解決力やコードの理解力は、多くの場合普遍的なスキルというよりは、時間をかけて担当者がその問題に関わったことで熟成された暗黙知によるものである。暗黙知は次の世代に継承されないため、担当者が退職した場合、たとえスキルのある人材を投入しても以前のような組織としての問題解決力を取り戻すには相当な時間がかかる。
例に挙げたような問題を抱えているプロジェクトは、一見誰の責任でもないように思えるため、延々とこの問題が放置される。そしていずれ誰も手を付けたくないプロジェクトになる。サーバコストは際限なく増え、手遅れと言ってもいいほど深刻化してからようやく高いコストを払って人材を用意してもすぐに離れていく(高い給与を得られる程度にスキルを持つ人材は仕事を選ぶことが可能だからだ)。
静的検査が強いとされている言語やツールを使用すればこのような状態に陥ることを極力防止でき、また、悪しきコードが放置されないため悪循環に陥る可能性を低くできるのだが、「学習コスト」を理由にして使用することが避けられることも少なくない。「学習コスト」は考慮するのに、上記に挙げた多大な長期的コストについては無視されるのである。
あるいは、静的検査ツールを使用するスキルのある人員を用意するための人材コストを理由に忌避されることがある(Rust人材は高い、など)。これも私は長期的なコストに比べれば安いものだと考えている。優秀な人材を精査するためのリクルーティングコストと、その人材を継続的に雇うコストは確かにそれなりに高いが、それは払うに値するものであるからだ。上に挙げたような転嫁された長期的コストは悪循環に陥るが、まともな人材を用意するのは多くの場合、好循環になる。(SESのような、スキルに関わらず人がいればいるほど儲かる人月商売の場合は除く。) 人ではなく、特定のツールを使用することができるという「スキル」に依存するため、「属人性」を排除し、「属スキル性」が得られる。
コストのトレードオフを考慮して選択されたツールを使用し、優秀な人材がいる企業は、マーケティングさえ間違えなければ技術力のある(あるいは、ありそうな)企業として評価され、他の優秀な人材からも一目置かれる。リファラル採用という選択肢も出てくる。そのためリクルーティングコストは徐々に少なくなる。
優秀な人材は、他社の成果物へのレビューのような直接的な教育的効果はもちろん、例に挙げたような問題に陥らせないための予防策や、すでに陥っている問題に対しての対応策を施した成果物を残すため、それ自体が教育的な効果をもたらす。
とはいえ、給料の安い、低スキルな人材を並列で稼働させて運営できたほうが、見かけ上は低リスクなため、経営層に近い人間ほどのそのような選択をしたがるのは分かる。実際にそのような運営をさせてしまうのは、経営層ではなく現場レベルに近い人間が、上記のような「見えざる問題」をアピールしないのが悪い。見えざる問題はどれだけのコストを生んでいるのかが可視化しづらいため、強く、しつこいくらいにアピールをし続けなければならないのだ。
まとめと心の叫び
属人性と属スキル性は分けて考えろ
属人性は排除するのが望ましいが、属スキル性は排除できない。うまく付き合え
簡単のように思えるツールのトレードオフを認識しろ
高スキルを持つ人材の仕事の中には、低スキルが何人、何百人合わさってもできない仕事も多い
低コスト人材の並列稼働が合う仕事もある。どちらの場合もあることを認識するが大事
教育と採用を頑張れ
ついでに人月の神話を読め
トレードオフを認識できないのを経営層のせいにするな
現場しか意識できないことを主張するのは現場の責任だ
それでもだめ、もしくは主張しにくい環境ならそれは確かに環境がクソだね
注意点
たとえ属人ではなく属スキルの状態であっても、一人のスキルに依存していて、他の人はできないというような状態は望ましいものではない。
参考
六本木ではたらくソフトウェアエンジニアへのよくある質問とその答え (FAQ) (2015 - 2017) - hayato
コストがかかる処理を書くときはプログラマにちゃんと罪悪感を感じてもらうような API デザインが意図的に多く採用されています。未熟なプログラマが、知らないうちに効率の悪いコードを書くのを防ぐ教育的効果があります。
Rust は学習コストが高いプログラミング言語と思われていますが、そもそも(ある程度大規模な)「プログラムを正しく」書くこと自体が普通の人間には相当難しいことです。これまでの学習コストが低いとされているプログラミング言語は、最初のほうだけ「(なんとなく)動いている」プログラムを書くのを助けてくれるだけであり、「正しいプログラム」を書くことについては何も助けてくれず放置プレイです。最終的にユーザーにすべての責任・負担がかかります。
Rust は「正しいプログラム」を人間が書くまできちんと指摘してくるので学習コストが高くなってしまいますが、それらはいずれは何らかの形で身につけなければいけないことなのでむしろありがたいことです。これまではユーザーが担っていた責任の一部を、「コンパイラに押し付ける」ことができます。
Rust は「学習コストが高い」言語というよりは「プログラミングの学習コストを可視化してくれる」言語といったほうがいいかもしれません。これまで「雰囲気でプログラミング」してきた人にとって Rust の学習コストが高く感じるのは、きちんと可視化がうまくいっている結果です。
動的言語の「動的」性がどうしても必要になるプログラムというのは 1%もないのですが、実際はそれ以上の割合で動的言語が使用されています。
私の言いたいことが大部分詰まっている。
1. 本当の意味での技術者
通常、大勢の人たちが無理だと思っていたり、どれだけ試行錯誤してもうまくいかないような (たとえばコンピュータに関連する) 技術的な難題を、人並み外れた凄まじい問題解決能力で解決し、たちどころに目的を達成してしまう能力を持つ特殊な人たちのこと。多くの場合、置換不可能である。誰でも勉強すればなれる訳ではない。
2. 作業員的な技術者
上記を除いたその他大勢の、コンピュータに関する仕事に携わっている人たちのこと。たとえば特殊な装置(もともと上記の技術者が設計したものである)を扱う専門技能を勉強して身につけていたり、プログラミングに関する知識を勉強して身につけていたりして、そうやって身につけた能力を、与えられた指示通りに使って仕事をして給料をもらう。多くの場合、置換可能である。ほとんど誰でも勉強すればなることができる。運良くコンピュータ業界はまだ儲かっているので、他の同様の職業(たとえば工事作業員とか)と比べると、報酬は割高である。この潮流に便乗した産業が、人材派遣ビジネス・資格ビジネスなど。