なぜエンジニアは長時間労働してはいけないのか

主語が大きすぎるタイトルですが、今の自分の考えをまとめておきたく、記事を投稿します。
もしかしたら、将来は全然真逆のことを考えているかもしれません。

また、ここでの「エンジニア」はシステムエンジニア、とりわけアプリケーションエンジニアを指します。
主語を「エンジニア」にしているのは、僕がエンジニアリングしか知らないだけなので、もしかしたら営業職や事務職でも同じことが言えるかもしれないし、言えないかもしれません。

サマリ

結論から書くと、以下の2点があるので、長時間労働しないほうが良いです。

長く働けば成果が出るのか

汎用的な例を挙げていきましょう。

「用紙を三つ折りにして、封筒に入れてください。」

という仕事があったとします。
誰でもできる簡単なお仕事ですね。

この仕事を1時間やった場合とさらにもう1時間やった場合に、完成した封筒の数を想像してみてください。
多少の差はあれど、最初の1時間と、その後の1時間で、ほぼ同じ数の封筒を完成させられることができると想像できます。

では次に、このような仕事があったとします。

「1時間の間に、地球温暖化に対する解決策をなるべく多く挙げてください。」

そしてさらに、「もう1時間あげますので、より多く出してください。」ということになったとします。
あとの1時間では、最初の1時間と同じ程度の量の解決策を出せるでしょうか?
おそらく、あとの1時間ではほとんど解決策を出せないでしょう。

封筒の例では時間にほぼ比例して成果が出ますが、地球温暖化の例では、時間に比例しませんでした。
この章で言いたいことは、「仕事の性質によって、時間に対して成果が比例するかは変わる」ということです。

また、封筒の例は「手を動かす」仕事で、地球温暖化の例は「頭を動かす」仕事です。
手を動かす仕事は時間に比例して成果が出やすく、頭を動かす仕事は時間と成果があまり比例しない傾向にあるようです。

エンジニアリングは時間と成果が比例するか

では、エンジニアリングの話に戻りましょう。
エンジニアリングは「手を動かす」仕事でしょうか。「頭を動かす仕事」でしょうか。

当然どちらの側面もありますが、圧倒的に「頭を動かす」比重が大きいですね。

エンジニアの仕事がタイピングであれば、長く働けば働くほど、成果は出るでしょう。
ですが、エンジニアの仕事は残念ながらタイピングではなく、エンジニアリングなのです。
そして、エンジニアリングは時間と成果が比例しない傾向にあります。

つまり、エンジニアは「長時間労働しても成果が出るとはかぎらない」ということです。
では、どのようにすればエンジニアはより良く成果を出せるのでしょうか。

エンジニアリングとは何なのか

より良く成果を出す方法を知るためには、まずエンジニアリングについて振り返ってみましょう。

実を言うと、「動くもの」を作ることはさほど難しくありません。
動くだけでいいのであれば、MVCなんて考えなくてもいいし、ユーザビリティなんて考えなくてもいいし、ひとつのファイルにすべての処理を書いたっていいわけです。

ですが、「動くもの」で仕事になることはほとんどありません。
バグが出たら調査をし、必要に応じて修正しなければいけません。
新しい機能を追加することもあるでしょう。
既に実装したものを別のものに作り変える場合もあります。
使い方がわからなければ、サポートをしないといけないかもしれません。

このような「動き続けるもの」や「メンテナンスをし続けるもの」を作ることはとても難しいことです。
「動き続けるもの」を作るために、様々な手法や原則が生み出されてきました。
オブジェクト指向MVC、構造化プログラミングや契約プログラミングなどもそうでしょう。
また、よりコストを抑えてシステムを作り続けるために、XPではKISSやYAGNIといった原則や、「レッド→グリーン→リファクタリング」のようなTDDサイクルも生まれました。

色々な手法や原則はありますが、僕個人としては、KISSの原則を守ることに一番時間をかけていると思います。
システムは現実の射影です。
現実をモデリングしてシステムに落とします。
どのようにモデリングをすれば、一番シンプルになるのか。
それを考えてひたすらモデリングをし、リフレーミングをし、またモデリングをし・・・ずっと繰り返すだけです。
データベースの設計でも、アプリケーションのアーキテクチャ設計でも、メソッド分割でも、変数に名前を付けるときでも、粒度や対象は違えどやっていることは同じです。

エンジニアリングにおける大半は、ひたすらモデリングをすることだと思います。

より頭が働けばより成果を出しやすい

では、モデリングを効率良くするためにはどうすればいいのでしょうか。
もちろん個人の技能やセンスに依る部分も大きいのですが、ここではそういった個人に依存するものは除いて、「各個人それぞれがより効率よくモデリングするためにはどうすればいいか」を考えます。

これはもう、「頭が働いている状態」としか言えません。(笑)

どのようにすれば頭が働いている状態になりやすいかは、ポモドーロテクニックなど、色々な方法がありますが、僕個人としてはまだ「これだ!」というものを見つけられてないです。

長時間労働をすると成果をあげるのに時間がかかる

一方で、どのようにすれば「頭が働かない状態」になるかは、わりと明確にわかりやすいでしょう。
長時間労働をしたとき」ですね。
小さな波はあれど、脳を使えば使うほど、脳が疲れて頭が働かなくなるのは直感的にもわかりやすいと思います。

そしてやっかいなことに、頭が働かない状態では、「自分がいま、頭が働かない状態である」ことを自覚できません。(自覚できないほど疲れているということですね。)

僕自身も、これはよく経験しています。
長時間労働して、がんばってがんばってコードを書きます。
次の日に出社し、昨日書いたコードを見直すと、大量の考慮漏れや、ひどいモデリングが見つかるんです。
そして午前中いっぱいかけてそのコードを修正するわけです。

これはつまり、長時間労働してコードを書いている時間、まるっと無駄なんですよね。
さっさと帰って次の日の午前中にコードを書いても、同じ成果を出せるわけです。
なんなら修正不要なので、半分の時間で終わるかもしれません。

つまり、長時間労働をしてコードを書くと、良いコードは書けないのです。
その部分を修正する必要があるため、成果をあげるためにより時間がかかります。

技術的負債

少し、視点を変えてみましょう。

良いコードが書けない場合に修正して時間をとられるなら、修正をしなければはやく成果をあげられるのではないでしょうか。

これは短期的にはYesで、長期的にはNoです。
いわゆる、技術的負債というやつですね。

技術的負債がたまるとどうなるか

詳しく見ていきます。
悪いモデリングのまま、成果をコミットしたとしましょう。

まず、その機能を調査する場合を考えてみます。
調査をするためには、そのコードを読む必要があります。
コードを読みますが、そのコードは悪いモデリングのため、解読するのに時間がかかったり、ひどい場合には、誤った調査結果を導きやすくなっていることがあります。
もはやコードを解読することができない場合は、デバッガを使って実行をして確認をしたり、プリントデバッグをする必要がでてくるでしょう。
このように、「ただコードを読む」だけでも膨大な時間がかかったり、そのために別の作業が必要になったりします。

次に、改修する場合を考えてみます。
改修するためには当然、コードを読む必要があるので、上述の調査のコストが発生します。
そして悪いモデリングで実装されているため、シンプルに実装することが難しくなります。
結果として悪いモデリングのコード量が増えていきます。
また、要件がわかりづらく(コード上で)表現されている場合は、その要件をコードから見落として実装をしてしまい、バグの発生にも繋がります。

似た機能を追加する場合のことを考えてみます。
似た機能を追加する場合、既存のコードと構造を同じにします。
これは、既存のコードと違う構造で書くと、コード全体で読みにくくなってしまうためです。
よって、似た機能は、悪いモデリングと同じ構造になります。
つまり、悪いモデリングが増殖していくわけですね。

まとめると、技術的負債がたまると、作業に時間がかかるようになり、バグが入り込み、技術的負債が積み上がっていくようになります。

もちろんそれだけではありません。
バグが入り込むということは、カスタマーサポートの対応時間も増えるし、エンジニアの時間はカスタマーサポートのための技術調査に取られていき、チーム間の関係性も悪化します。
バグが多ければ顧客が解約するリスクも高まります。
また作業に時間がかかることで、価値を高めるための開発速度は落ち、リリース計画もどんどん後ろにずれ込んでいきます。
そうすれば競合他社との競争に負ける可能性もでてきます。

何も良いことがないですね。

長時間労働をすると将来的なコストを抱える

さて、話を戻します。
長時間労働の話でした。

長時間労働をすることで、技術的負債がたまります。 そしてそれをそのままにすると、開発速度が落ち、バグが混入し、技術的負債が積み上がっていきます。

負債という言葉のとおり、短期的には成果は出ますが、長期的には良いことは何一つとしてありません。
また、先ほど例にあげたとおり、技術的負債は他の機能と絡んで大きくなったり増幅していったりするため、時間が経てば経つほど、返済にかかるコストも大きくなります。

長時間労働をすると、将来的なコストを抱えてしまうのです。

時間をかければかけるほど、長時間頑張れば頑張るほど、将来の自分たちを苦しめていくわけです。

まとめ

かなり細かく書いてきましたが、まとめると以下のようになります。

長時間労働を例えるなら、「ドラッグ」が一番しっくり来ると思っています。
長時間労働は短期的にはメリットがある(ように見える)ので、簡単に手を伸ばしてしまいがちです。
ですが、長時間労働をして得られる結果は、成果をあげるためにより時間がかかるようになったり、より大きなコストを抱えることです。

この記事が長時間労働について考えるきっかけになれば幸いです。