###■初めに
こんにちは、ヘルスケア事業本部 技術統括部 開発部の馮晨です。
昔から、言語を問わずに、文書を書くのが大の苦手です。
今回DevOpsに関して、自分が理解していることや考えていることをできるだけまとめてみました。
長文になりましたが、どうぞよろしくお願いいたします。
###■DevOpsとは
Wikipediaでは、DevOpsを以下のように定義しています。
「DevOps(デブオプス)は、ソフトウェア開発手法の一つ。開発 (Development) と運用 (Operations) を組み合わせたかばん語であり、開発担当者と運用担当者が連携して協力する開発手法をさす。」
この定義でわかるものは、開発と運用を連携するというポイントがあります。しかし、なぜこのような「連携」が必要でしょうか?下記の問題点を見てください。
###■問題点
「連携」が必要となる原因はいろいろあります。最も重要な原因は、現場では開発作業と運用作業は「分断されている」という状態はよく発生します。開発と運用の間に起きるほとんどの問題は、上記の状態によるものだと考えています。
一つよくある例を挙げます。ある会社は新しいソフトウェア製品を出したいとします。
開発部門は最新の技術を利用し、新製品を開発しようとしています。この製品は最新のプラットフォームで実行することを想定し、しかもリリースまでの期間はとても短い。以上の状況よって、開発チームはたくさん残業してコーティングし、予定通り開発を完了させました。そして、彼らは自分の「傑作」を運用部門に渡しました。
しかし、運用部のメンバーはとても不安を感じています。運用部メンバーの不安は以下によるものです。
- 今回の製品は、現在運用中のプラットフォームでは実行できません。その理由として、既存のプラットフォームは①古すぎる。②キャパシティーが足りない。③ソフトウェアが使用しているライブラリのバージョンをサポートしない。
- 今回の製品の推奨環境は、既存の①データストア②ネットワーク③デプロイ④セキュリティなどの環境と異なる。
- 運用部はこの製品の①エラー報告②監視③バックアップなどの機能を理解しきれていないため、サービスとして提供できない。
運用部はいろんな努力を果たして、ようやく製品を運用し始めました。しかし、環境に配備するために、製品に想定外な改修を行ったため、運用中の製品はたくさんなエラーが発生しました。運用部は発生した問題を開発チームに問い合わせると、以下のような返事をもらいました。
- 開発部が作成したコードは完璧だ。
- 運用部は最新の技術を理解できていない。
- 製品は開発側の環境で問題なく実行できている。
やがて、両部門は製品を巡って言い争いとなり、会社や他のステークホルダーは多大な損失を与えました。結果、プロジェクトは「失敗」となりました。
###■DevOpsはどう違うのか
DevOpsは上記のような「失敗」を回避するための考え方となります。DevOpsでは、開発部と運用部の共同作業を主張し、そのためにいろいろな作業プロセスやツールを提供しています。DevOpsを導入すると、両部門コミュニケーション効果を向上し、自動化、監視、バックアップ、リストア、セキュリティなどいろんな方面にたいして改善することが可能となります。
「DevOpsは何ですか?」という質問に対して、仕事の経験によって様々な答えを得られます。私が考えているDevOps以下四つのポイントになります。
・シンプルに作る
KISS原則(Keep It Simple and Stupid)はとても大事です。簡単な設計・実装はコミュニケーションの速度を向上し、開発と運用時のミスを減らすことも可能になります。さらに、製品のリリース周期の短縮にも繋がります。
・部門間の連携作業
製品の開発において、運用部のメンバーをすべての開発フローに参与させることはとても重要だと思います。例えば、運用部のメンバーをスプリント計画会議や朝会に誘ったり、プロジェクトの計画や技術アイデアを共有したりすると、運用部のメンバーがプロジェクトに対する理解を深めることができます。運用部のメンバーがプロジェクトの構成や中核の部分を知れば知るほど、実際に問題発生時の対応時間は短縮ことが可能になります。
また、問題発生時に、運用側は開発部のメンバーを誘って一緒に解決すると、問題解決の効率は向上することができます。開発メンバーを運用部の会議に誘うことによって、運用計画を共有することができます。逆に、誘った開発メンバーから今後の開発方針や最新技術を運用側に共有し、開発側で採用されているアジャイル開発、看板管理、スクラムなどの手法を運用に導入することで、運用側の環境やプロセスの改善も可能だと考えています。
・作業プロセス
開発、運用において、いろいろな作業プロセスが存在しています。しかし、作業プロセスによくある問題点とは理想化し過ぎ:各ステップは前のステップが成功する前提で作られています。ただし、作業は必ず順序よく進めるとは限らない、作業途中で何かの問題が発生時の対応方法を考慮し、問題発生しても進めるように考える必要があります。
また、作業プロセスにできるだけ自動化ツールを使用することも大事です。人間はミスをします。作業中に起こるミスを最小限に抑えるには、手作業の代わりに自動ツールで作業を行うことだと考えています。適切な自動ツールを作業プロセスに加えることによって、作業を効率化も可能となり、新メンバーに対するトレーニングコストも削減できます。
・継続的改善
現在、技術は日々進化しています。ユーザーのリクエストも同様に進化しています。ユーザーのリクエストを満たすために、常に新しい技術を開発、運用プロセスに取り入れることは大切です。そして、開発途中においてコードの継続的改善もとても重要なポイントになります。コード分析ツールを導入できれば、障害の原因を迅速に突き止め、問題が発生する前にリスクを解消することも可能です。
問題発生時、運用チームと開発チームは協力し、一緒に問題の解決に取り掛かったほうがいいと考えています。ときに開発側の小さなリファクタリングで大きな問題を防ぎ、運用チームの負担を減らすことが可能になります。
###■終わりに
今回はDevOpsの基本概念と自分が理解したDevOpsについて話しました。
実際に担当しているルナルナサイトの開発・運用プロセスを振り返ると、DevOpsの思想ややり方と相違する部分は多々あります。実際に現場で発生した問題をDevOpsの知識に当てはまると、いろいろと納得しました。
今後、DevOpsの勉強を続き、開発現場の問題点を改善できるツールやプロセスを導入していきたいと思います。