お盆休みに入る前にTwitterに以下のツイートを投稿しました。
ステップ数で評価しようとするどこかのシステム開発会社みたいだなw https://t.co/67ujbhVoUn
— 米村歩@日本一残業の少ないIT企業社長 (@yonemura2006) August 10, 2017
あるんですよ。一番困ったのはステップ数に応じて「検出されるはずのバグ数」という指標もあって、その数の分だけバグが検出されないと試験が正しく実施されていないと判断されてしまうことがありました。プラグインで自動生成されるコードにまでその指標を押し付けられ…バグなんて出るはずもなく…。 https://t.co/oM4zT3oolb
— 米村歩@日本一残業の少ないIT企業社長 (@yonemura2006) August 10, 2017
私自身が客先常駐の現場でシステム開発に携わったのはフリーランスの頃なのでもう10年以上前の話なのですが、当時ステップ数(プログラムの行数)に応じて、これくらいの数のバグが検出されるはずだという基準が設けられている会社やプロジェクトがありました。
このやり方には当時から様々な問題がありナンセンスなやり方だったので、10年以上も時が経過した現代ではもはや絶滅した手法となっていることだろうと想像していましたが、皆さんからいただいた反応を見ると、どうやら客先常駐の現場では今でも当時と同じ基準が使用されていることも珍しくないということが判明しました。
日進月歩のIT業界において10年以上前からまるで進歩が無いというのはまるで大昔の化石を発見したかのような驚きですね。(私は化石を発見したことはありませんがw)
単に進歩がないというだけにとどまらず、ステップ数によってバグ検出数の基準を設けることに関しては、このIT業界に潜む様々な問題を感じましたので、お盆明け一発目はそのことについて書いてみようと思います。
ステップ数によってバグ検出数の基準を設ける問題点
品質を担保しようとする目的のために一定の基準となる指標をガイドラインとして設けることは悪いことではありません。そういう意味で、当然のことながら基準が設けられていること自体に問題があるということではありません。
しかしながらプログラムのバグというものは決してステップ数(プログラムの行数)に比例するとは限らないことは、プログラマーであれば誰でも理解できることです。
プログラムの読みやすさ(可読性)を向上させればプログラムの品質は向上してバグは少なくなりますが、プログラムの可読性を向上させようとするとステップ数が増えることは当たり前のようにあります。
また将来的な仕様変更や機能拡張のやりやすさ(拡張性)を向上させれば、システム運用開始後のメンテナンスがやりやすくなり、仕様変更が生じた時にも少ない工数で容易に対応できるようになりますが、プログラムの拡張性を向上させようとするとステップ数が増えることは当たり前のようにあります。
またシステム開発で使用されるプログラミング言語やフレームワークには様々なものがありますし、システムの仕様の複雑度によっても必要なテスト数や検出されるバグ数は大きく変わってくることは当たり前のことです。
https://twitter.com/hassy_se/status/895573610189934592
一概にバグ検出数の基準値を設けることなど非常に難しいことですし、そもそも最近のシステム開発では部分的にプログラムのソースコードを自動生成することは頻繁にあり、そのようなツールも多々あるのです。機械的に自動生成されるわけですから、自動生成のツールによって生成されたソースコードにはバグが存在しないと考えることが普通です。
しかしながら、このように自動生成されてバグが検出されるはずがないようなプログラムに対しても、ステップ数によるバグ検出数の基準なるものが押し付けられることが客先常駐の現場では普通にあります。
現在進行形で、自動生成されたソースになぜバグが発生しなかったかというこじつけ理由を書いて、品質に問題なしと書く検収やってます。 https://t.co/60AWU8fsSw
— ケルビン@斜壊人 (@legendkelbin) August 10, 2017
定められた基準を満たすバグ数に達しないとこのように報告書を書かされることもあります。
こういったことを私自身も10年以上前のフリーランス時代には行っていたわけですが、客先常駐の開発から離れてかなり時間が経ちましたし、さすがにこんなことは今では行われていないだろうと思っていたら10年前と全然変わっていないようです。
なぜSI企業はステップ数による基準を設けるのか
ステップ数によるバグ検出数の基準なるものを設けるのは、プロジェクトの元請けとなっているSI企業です。
この多重下請け構造の上の方にいる元請け企業は、プロジェクト管理を行うのみでプログラミングを伴うシステム開発業務は行わないことが多いです。技術的なことには一切かかわらずにノータッチであることが多いので、IT企業でシステム開発を行う会社の人間であるにも関わらず、技術的な難しいことはほとんどわからない人達が大勢います。
そうするとプログラムの中身を理解した上でその品質を評価することなどできませんから、技術的なことはよくわからない彼らでもプログラムの品質評価を可能な限り客観的に行えるようにしようとして生み出されてきたものが、「ステップ数によるバグ検出数の基準」なのではないでしょうか。
プログラムの行数が1000行だったらバグ1件以上、2000件だったら2件以上出てなければプログラムの試験が適切に行われていない、というような画一的な基準であれば、技術的なノウハウが一切ない人間にも理解することが可能になります。
SI企業の多くの人達はプログラムのことがわからない技術的には素人同然の人達なので、彼らがプログラムを評価しようと考えた時に素人でもわかるような基準が必要なのでしょう。
基準を作る人達と基準を運用する人達の間に距離がありすぎる
専門的なプログラム知識がない人達でも理解できるようにある定められた評価基準を設けたり、どんなメンバー構成でも一定の品質基準が担保されるように基準を設けること自体は悪いことではないと思います。
では客先常駐の現場で運用されているこのような評価基準の何が問題なのかというと、基準を作る人達と基準を運用する人達の間に距離がありすぎることなのだと思います。
客先常駐の現場で運用されている「ステップ数によるバグ検出数の基準」を作るのは元請けとなっているSI企業の偉い人達です。一方でそれを実際に現場で運用するのは下請け企業のエンジニア達になります。
普通は現場で運用されている何かしらのルールが現場の実情に沿わずに問題がある場合は、適宜ルールを改定して現場の実情に合うように改善されていくものです。しかし多重下請けの客先常駐のプロジェクトではそういう訳にはいきません。
現場にいるエンジニアが実情に沿わないからルールの改善が必要だと訴えたところで、訴える先は別の会社の人間になりますし、SI企業は個別のプロジェクトで別の会社の人間が何かを叫んでいたところでそんな声に耳を傾けたりはしないでしょう。
客先常駐でプロジェクト管理のために派遣されているSI企業の人間としても、自分達には何が正しいか判別するだけの技術力はありませんから、そうすると自分が所属する会社から指定されている基準を満たそうと行動することは当然のことと言えます。
これ、同じようなことに遭遇しておかしいでしょ?って指摘したら、例外(この場合は自動生成コードの指標)を認めるとそこからずるずるとなし崩しになるからだめって言われたことがあるなぁ https://t.co/VjEkliwFYV
— 瑠璃丸 (@Rurimaru_0) August 10, 2017
例外を認めず現行のルールを遵守しようとするその姿勢は、企業側からすれば優良な社員と見ることができますね。SI企業側の人間として自分の会社の運用基準を遵守しようとしているだけなのですから、何も責められるようないわれはありません。
私も客先常駐のシステム開発を行っていた時は、いくら合理的に説明しても取り合ってもらえないSI企業の人達に対して、こいつらなんて頭が堅いんだと不条理に感じたものですが、彼らの立場からするとルールを守ることの方が正しかったのだと今では思います。現場の彼らが悪いのではなく、多重下請け構造の客先常駐という構造の問題です。
元請けの大手SI企業の人達が技術的なスキルを習得するように方針転換すれば少しは変わるかもしれませんがそうはならないでしょうから、今のこの構造のままでは基準を作る側と運用する側の距離が乖離した状態を解消することは不可能だと思われます。
延々とあまりにも無駄過ぎることが続けられる毎日
プログラミングの実装を担当するエンジニアとしては、どう考えてもテストの必要のないコード、バグが検出されることはないはずのコードというものは存在するのですが、それをいくらSI企業の人達に説明したところで取り合ってもらえないとなると、どうにかして別の方法を考えるしかなくなってしまいます。
自動生成された大量のgetter、setterのテストコードを書かされた時は泣きそうになったorz
— 米村歩@日本一残業の少ないIT企業社長 (@yonemura2006) August 10, 2017
プログラマーであれば自動生成されたgetterやsetterにバグが入り込むような余地はないことは全会一致だと思うのですが、SI企業の方達にはその理屈は通用しないことがありますので、その場合は泣きながらバグが出るはずがないソースコードに対して単調な作業を受け入れるしかありません。
しかもステップ数に対して一定のバグが検出されないと通過できませんから、その場合は無駄な報告書を書かされたり、それが嫌だからバグの捏造をすることも行われます。
ある時は単体テストケース作る→テスト数足りないと差し戻されて水増しとか…。
またある時は設計書に書いてないけど追加された処理がある為関連のテストケース追加したらテスト数オーバーしていると理由で差し戻し(最低限まで削ってそれ)とか…。
※どちらも設計書、ソース共に読み比べて作成 https://t.co/pyaqcODimQ— 月羽空兎⛩️なんかかいとけ (@soratoandyuuto) August 10, 2017
ステップに対する目標不良件数を求める現場は確かにある。目標に届かない場合はテスト内容が正しいことや低くなった理由を明記して、説明が求められる。
面倒なので、不良メモ帳にどんな小さい不良でも明記しといて、まともにやって足りないときはそこからネタを出すこともあったり。 https://t.co/ujUUAiVyL5— えいひれ@完熟 (@eihire_nico) August 10, 2017
https://twitter.com/g_ino_plus/status/895552861324550144
これが客先常駐のシステム開発現場で昔から行われていることであり、今となっても改められることもなく続けられていることなのです。必要のないものをわざわざ水増しまで行われているこの現実。こうしたことを改めるだけでも一体どれだけの残業が削減できることか。。
必要な作業による残業ではなく、本来やらなくて良い無駄な作業を行うための残業によって、現場のエンジニアがどれだけ精神的に疲弊することか。。客先常駐の現場はこんな状態ですので働き方改革など夢のまた夢の話です。
無駄を削減するためには企業ごとの役割分担の明確化が必要
以上述べてきたような無駄を無くすためには、企業ごとの役割分担の明確化が必要だと思います。プログラミングを行わないSI企業がプログラムレベルの試験や品質に関して介入してくるからこのようなおかしなことになってしまうのだと思います。
プログラミングを行わない元請け企業であるSI企業は、プログラムレベルの試験などには介入せずに、もっと上位の結合試験等のフェーズだけ行えば良いと思います。プログラムの試験のバグ検出数のような基準を作るのであれば、実際にプログラムを実装している企業が現場の実情に合わせて基準を作るべきです。
そしてこの問題の根っこにあるのは多重下請け構造による偽装請負に問題があることは明らかでしょう。客先常駐で同じ現場で他の会社の人間から指揮命令が当たり前に行われるから、基準を作る人と基準を運用する人が乖離するような問題も起きやすいのです。
企業ごとの役割分担が明確化されていれば一緒の現場で客先常駐の形でシステム開発を行う必要も無いはずです。多重下請け構造による偽装請負、客先常駐の問題を解決することで、IT業界からかなりの無駄が削減され、生産性は飛躍的に向上するのではないでしょうか。