運用コストを下げるために

Posted by rhoboro on 2019-12-19

これは今年の初め頃に自社のKibelaに書いた記事の転載です。
社内では業種やロールに関係なく多くの方に見ていただきましたが、より多くの方に見ていただくのもいいかなと思いブログにも載せることにしました。


(立場関係なく読んでいただければ )

想像してください。

  1. 1枚のシートに必要事項を記入してボタンを1つ押すと自動で新規環境が作成されクライアントへの導入が完了
  2. マージボタンを押すだけでリリースが完了。ロールバックも簡単にできる。
  3. コマンド一つですぐ実行できる本番同等の環境が構築される
  4. 所定の場所のデータを置き換えて実行ボタンを押すだけでいつでも誰でも色んなデータで検証可能
  5. 不具合報告はほとんどあがってこない
  6. データの不正は受領時点で自動的に検出、報告が行われる

運用コストが低いということはこういうことです。
自分がいま関わっているプロジェクトはどこまでできているでしょうか?

運用コストの高いプロジェクトの特徴

逆に運用コストの高いプロジェクトは下記のような状況であることが多いです。

  • 受注すればするほど社内の負荷が上がる
  • 受注しても不具合が多く継続されないため、さらなる受注が必要になる
  • 不具合の調査、修正に多大な時間を必要とし、機能追加する余裕がない
  • 不具合修正がさらに不具合を生む
  • しんどい -> 人が抜ける -> さらにしんどくなる の負のループ
  • かかるコストが高いため、それに見合う利益を得られずプロジェクトは失敗と判断され終了。徒労感だけが残る。

自分がいま関わっているプロジェクトがこうなっていませんか?

運用コストは下げられる

運用コストが発生しないプロジェクトはありません。
そしてプロジェクトが動き続けている限り永遠に発生し続けるものです。

しかし、日々発生するこのコストは確実に下げることができます
それはほぼすべての作業が「繰り返される作業」だからです。
つまり、仕組みさえ作ってしまえば将来に渡り必要となるコストを10分の1にも100分の1にも減らすことができます。

運用コストを下げる理由は本当に集中すべきことに時間を使うためです。
不具合調査やその修正に時間を使うのは、時間とお金を浪費するだけで何も生み出しません。同じ時間を使うのであれば、より興味のある研究や自分が欲しい機能、ワクワクするプロダクトの開発に注力したほうがずっと生産的で利益を生み出し社会に影響を与え何より楽しいです。

仕組みを作るためにはスキルが必要です。
慣れていないうちは学習コストもかかります。苦痛も伴います。実践しない限りは絶対にこのスキルは身につきません。しかし、このスキルには絶大なリターンが個人にもチームにもプロジェクトにも会社にもあります
このスキルは、機械学習案件でもWebアプリ案件でもスマホアプリ案件でもどんな規模のプロジェクトでもどんな規模の会社でも応用できます。さらには、正しく身につけると運用コストどころか日々の生産性でさえも確実に向上させてくれるスキルです。それも自分だけでなく周りの生産性まで上げられます

まだまだこれからの小さな会社だからこそ本当に集中すべきこと以外に割く時間や労力を減らしたほうがいいのではないでしょうか?

必要なこととその理由

ここでは主に技術的な観点で運用コストを下げるために必要なこととそれがなぜ必要なのかを少しまとめてみました。

これらは初期であればあるほど導入コストは低くなり、削減できる運用コストは増えます。逆にすでに破綻しているプロジェクトへの導入コストは恐ろしいほど高くなります。

環境再現性を高める

いつでもクリーンな環境を簡単に構築できるようにしましょう。

  • 不具合調査や修正の検証コストが下がる
  • 機能追加の実装、検証をすぐ始められる
  • 破壊的変更を躊躇なく試せる
  • 新規メンバーが入っても環境構築に時間がかからない
  • データを少し変えるくらいの検証なら誰もがいつでもできる
  • 新規クライアントへの導入が低コストでできる

テストを用意し、利用する

テストを書き、実行しましょう。テストは品質を高めるだけでなく、開発のスピードを高めるものでもあります。

  • 実装とテストコードを同時に書くことで良い設計に近づく
  • 依存関係が明示される
  • データやパラメータの組み合わせの考慮漏れが減る
  • 実装時の試行錯誤を様々な粒度で頻繁にかつ素早く行える
  • 修正、機能追加、リファクタリング時に壊れても早期発見できる
  • 複数のデータパターンを簡単に検証できる
  • いつでも誰でも新しいデータパターンを検証できる
  • 日々のバッチ処理も同等の仕組みで異常値を検知できる

リリースフローを自動化する

デプロイやリリースフローを自動化し、テストに通っていないものはリリースしないようにしましょう

  • リリース作業のヒューマンエラーを防ぐ
  • テストにパスしないものがリリースされることを防ぐ
  • リリース頻度をあげることでリリースごとのインパクトを最小に保つ
  • リリースの属人化を避けられる
  • 不具合が発生してもロールバックできる

ドキュメント化

ドキュメントを用意しましょう。体裁よりも内容が大事です。

  • 人は忘れる生き物です
  • 作業の属人化、知識の暗黙知化を避ける
  • 質問を考える時間、質問の意図を理解し回答する時間を減らす
  • 言った言わないの不毛な争いを避ける
  • 新規メンバーへの説明コストを削減できる

さいごに

  • PDCA高速化を掲げるのであれば、まずは手元のルーティン作業から効率化しましょう
  • 運用コストを下げる、品質をあげるためにもコストはかかります。「がんばろう」だけでは何も変わりません。そこまで意識してスケジュールを調整しましょう
  • 不具合調査や修正ではなく、研究に時間を使うためやりたい研究をするためにテストやコーディングスキル(可読性、パフォーマンス等)を学び、質の高い成果物を効率的に作れるようになりましょう
  • こういった技術やスキルを広められるだけの技術力を身につけ、それらがあって当然という文化を根付かせましょう

注意書き

  • これはわたしの個人的な意見です。
  • 賛否両論あると思いますが、議論がしたいのではく個人個人が考える1つのきっかけになれば幸いです。
  • 何事もバランスが大切です。あくまで「コスト < リターン」の範囲内での話ですし、正解は状況により変わり、絶対的な唯一の正解もないと思います。
  • これに近いことは最近経営陣の方々にもお伝えしていて、実際に経営陣の方々も動き出してくれていてとても感謝しています。
  • ただし、よりダイレクトに現場レベルまで落として欲しかったという想いもあったので直接的かつ具体的な内容として文章にしました。

tags: essay