論文紹介: Towards a Theory of Software Development Expertise

Twitterで見かけたどうやったらソフトウェア開発のプロになれるかの理論を構築したという論文。
ソフトウェアエンジニアにはもちろん、その上司だったり経営者とかにも参考になると思う

論文概要

  • タイトル:Towards a Theory of Software Development Expertise
  • 著者:Sebastian Baltes (University of Trier) et al.
  • 会議:Engineering Conference and Symposium on the Foundations of Software Engineering (ESEC/FSE ’18)

FSEというのはソフトウェア工学のトップカンファレンスの1つ。
どうすればソフトウェアエンジニアとして成長できるか、という話は本であったりブログであったりとそこらじゅうに溢れているが、このような論文となっているのはなかなかないのではなかろうか。
この論文で示されている著者らの構築したソフトウェアエンジニアのプロ(以下、原文に習いSDExp)になるための理論はもちろんのこと、その理論の構築過程もとてもおもしろい。
今回のブログでは理論の構築過程については自分の前提知識が足りなくまだ十分に理解できていないので、彼らの導いた理論の要旨、というよりも自分が印象に残った部分だけを紹介する。

元の論文はarXivで誰でも見られるので、詳しくはそちらへ
https://arxiv.org/abs/1807.06087

手法

彼らの理論はどのようなコンセプトがSDExpになるためには必要で、そのコンセプトがどのように関係しあっているか、というものをモデル化したものである。
この論文では3つのフェーズを経てそのモデルを構築している。

フェーズ1ではGithubとStack Overflowのアクティブなユーザーをサンプリングしてアンケートを取り、
その結果をベースに理論のベースとなるgrounded theory (GT)を構築している。
フェーズ2では既存の文献を用いて、GTに対してそれらの理論を埋め込んでいく形で発展させたモデルを構築する。
フェーズ3ではフェーズ2までの結果を踏まえて、フェーズ1よりも踏み込んだ形のアンケートをつくり、アクティブなJava開発者と長い開発経験を持つ開発者それぞれを対象として回答を得た。
Javaにターゲットを絞ったのは、対象をわかりやすくるため、研究開始時最もメジャーな言語であったJavaを選んだとのこと。
その結果を元に彼らの理論を完成させた。

SDExpになるには

では、フェーズ3で構築した理論の図を論文から引用して見てみる

この巨大な図だけでは意味がわからないので、いくつか印象に残った部分だけを説明する。
このモデルはconcepts(コンセプト)とrelationship(関係)の2つからなる。
今回はコンセプトと関係の中からいくつか重要なものあるいは印象的だったものについて見ていく。

Tasks

このモデルはTaskを中心に据えている。ここでいうTaskというのは要件定義であったりリファクタリングであったりするわけだが、それぞれのTaskには専用の知識であったり経験がある。
ソフトウェア開発には人が関わってくるので、人の関わり(Work Context)というのも重要な要素であるが、これもTask毎に違う。

フェーズ3にて最も重要だと思うTaskはという質問に対して、

  1. ソフトウェアアーキテクチャのデザイン
  2. ソースコードを書く
  3. 要求を分析・理解する
    が最も多い回答だった。

deliberate practice

この論文でかなり強調されていた関係の1つにdeliberate practice(訳すとすれば計画的実践?)というのがある。
単に同じような経験をたくさん積む、というのはパフォーマンスを向上させるのには貢献しない、むしろ逆効果にすらなり得る。
経験の年数が能力に比例するのは最初の2年程度なので、その後はタスクの難易度を上げていくことでパフォーマンスをあげていくことが必要になる。これがdeliberate practiceである。
このdeliberate practiceにはパフォーマンスをモニターし、フィードバックを与えてあげるメンターなどの存在も必要になる。
また、自分の強みや弱みを把握する自己反省の資質も大事である。

Work Context (Task Context)

ソフトウェア開発にはマネージャーに相談したり、客からの要望に答えたりといったWork Contextが存在する。
フェーズ3で経営者が従業員の開発スキルを向上させるためにするべきことという質問に対する答えをカテゴライズすると

  1. 学習を奨励する
  2. 実験することを奨励する
  3. 情報交換をしやすくする
  4. 自由を認める
    というのが最も多い回答であった。
    具体的には
  • 外部のトレーニングコースの受講を勧める
  • カンファレンスの参加費を負担する
  • “Self-improvement Friday”、”lunch-and-learn session”などのミーティングやイベントで情報交換や学習の機会をつくる

Performance Decline

年を経るごとにパフォーマンスが落ちていくということがあるが、これについても分析している。
フェーズ3での回答をカテゴライズすると

  1. モチベーションの低下
  2. 仕事の環境の変化
  3. 年齢による衰え
  4. 態度の変化
  5. 他のTaskへの移動
    となった。
    同じような仕事をやらされ続けてモチベーションを失う、きつい締切へのプレッシャー、マネージャーのコミュニケーション不足などなどが具体例として挙げられている。

年齢による衰えについてはいくつかの実際の回答を引用している。例えば、「50代のころから新しい言語やフレームワークについていけなくなった」、「物忘れがひどくなってプログラムを書く速度が落ちた」、といったものであるが、
「40歳からritalinのような薬を飲むようにした。これは年老いたプログラマーの間では極めて一般的」などという回答まであった。
ritalinとは、どうやら多動性障害(ADHD)のための向精神剤らしいが(参考:メチルフェニデール)本当に広く使われていたりするのだろうか…

まとめ

SDExpになるための理論を構築したという論文から、構築した理論についてその要素部分をかいつまんで紹介した。
紹介しきれなかったところ、また構築するまでの過程も非常におもしろかったので、興味があれば是非元論文を読んでもらいたい。