ソフトウェア開発の一般的なプロセスとして、開発フェーズが完了してリリースされると開発担当者から運用担当者に引き継がれるケースを想定されている方も多いと思います。
特に従来のウォーターフォール型の開発では、各フェーズが明確に分離しており、開発担当者と運用担当者は明確にタスクにも違いがありました。
しかし、開発担当者と運用担当者が連携できていない場合は、プロジェクトが遅延したり、問題が発生したりとスムーズには進まないこともあります。
そうした問題を解決する開発手法としてのDevOpsとは、開発部門と運用部門の連携を強め、加速する時代の流れに負けない、迅速かつ柔軟なソフトウェアの開発手法を導入するプロジェクトが増えています。
今日、ソフトウェア開発には迅速で柔軟な体制が求められています。時代の変化に遅れないよう、ユーザーのニーズを捉えられるアジャイルやDevOpsの考え方が重要視されつつあります。
この記事では、ITエンジニアが知っておくべきDevOpsの概要やメリットについて解説していきます。また、DevOpsはしばしばアジャイル開発と混同されます。両者の関係性や違いについてもわかりやすく解説します。
Contents
DevOpsとは?
DevOpsとは、ソフトウェア開発手法の一種です。開発部門と運用部門の連携を密にし、生産性を高め柔軟なサービス提供を行う手法です。「Development」(開発)と「Operations」(運用)を組み合わせた造語です。
従来のソフトウェア開発は、開発は開発部門が、運用は運用部門が専門的に担当する、という形が一般的でした。この形では、開発部門はソフトウェアの品質や新規機能の追加を目指したいのに対して、運用部門は安定した運用を目指したい、といった具合に両者が対立することがありました。
そうした従来の考え方に対し、双方の連携を強めることでより柔軟かつ迅速にソフトウェア開発を行う手法こそが、DevOpsです。
アジャイル開発と何がちがうのか
近年主流になりつつあるソフトウェア開発手法として有名なのは、「アジャイル開発」でしょう。それでは、アジャイル開発とDevOpsはどう違うのでしょう。端的に言えば、DevOpsは開発チームの組織体制を、アジャイル開発は開発の進め方を表す用語です。
アジャイル開発とは、「要件定義」「設計」「実装」「テスト」といった短いスパンでの開発サイクルを繰り返してソフトウェアを完成に近づけていく手法です。従来主流とされていた「ウォーターフォール」型の開発は、要件定義から設計、実装、といった工程を順番にこなしていく開発手法です。「ウォーターフォール」型には、ミスの修正や仕様変更に柔軟に対応できない、という欠点がありました。
そこで提唱されたのが「アジャイル開発」です。アジャイル開発は、短いスパンでの開発を何度も繰り返して行うことで、ソフトウェア全体を徐々に完成へと近づけていく手法です。つまりアジャイル開発は、ソフトウェア開発の進め方の一種、ということになります。
DevOpsは、開発部門と運用部門の連携を密にし、より柔軟かつ迅速な開発を目指す、という組織体制を指します。そのため、アジャイル開発をDevOpsの両者を同時に取り入れて開発を行うこともあります。DevOpsで組織の連携を強化しながら、実際の開発はアジャイルで柔軟に行う、といった開発が可能です。
CI/CDとDevOpsの違い
アジャイル開発と並び、DevOpsとの関係性が注目されているのが、「CI」および「CD」です。そもそも「CI」「CD」とは何なのでしょうか。
「CI」は「Continuous Integration」(継続的インテグレーション)、「CD」は「Continuous Delivery」(継続的デリバリー)の略語です。CIは、ビルドやテストといった工程を自動化し、継続的に実行する仕組みを指します。CDはCIに加えて、本番環境への配置(デプロイ)までを自動化して継続的に実行する仕組みを指します。
いずれも、ソフトウェア開発手法の一種、ということになります。DevOpsとの違いは、アジャイル開発の場合と同じく、開発手法と組織体制の違いということになりますが、CI/CDはDevOpsを実現するための仕組みでもあります。工程を自動化することで、より迅速なソフトウェア開発が可能となるからです。
DevOpsのメリット
DevOpsには、いくつものメリットがあります。ここでは、DevOpsのメリットについて解説していきます。
信頼性の向上
ビルドやテスト、デプロイといった工程は、DevOpsでは自動化されます。ツールを活用して工程を自動化することによって、ヒューマンエラーが介在するリスクを減らし、より信頼性の高い開発ができます。
生産性の向上
開発部門と運用部門がきっちり分かれていた従来のソフトウェア開発では、生産性低下につながる問題点も数多くありました。情報共有がうまくいかなかったり、リリースまでの手順が複雑化したりといった問題です。DevOpsでは、開発部門と運用部門が緊密に連携するため、そうした問題点を解消し、生産性を高めることができます。
スピードの向上
DevOpsには、開発スピードの向上というメリットもあります。DevOpsとアジャイル開発は相性がよく、より迅速なソフトウェア開発が可能となります。また、DevOpsを実現するためのCI/CDの活用も、開発スピード向上に一役買っています。
DevOpsのワークフロー
DevOpsは具体的に、どのようなプロセスで実現されるのでしょうか。ここでは、DevOpsのワークフローの一例をご紹介します。
① 計画
開発するソフトウェアの要件定義や、開発タスク、進捗の目安といった計画を行います。
② 開発
計画に沿って、コードの実装といった開発を進めます。
③ テスト
実装されたコードのテストを行います。ここで利用されるのがCIです。ビルドとテストを自動化し、より効率的な開発をサポートします。
④ デプロイ
一通り開発が済んだら、実行環境にデプロイする必要があります。ここでCDが利用されます。自動化によって、迅速かつ正確な開発が実現します。
⑤ 監視
ソフトウェアは、リリースしたらそれで終わり、という訳ではありません。サーバーやソフトウェアを監視し、不具合やユーザーからのフィードバックに迅速に対応します。
DevOpsを実現するために必要なこととは?
それでは、DevOpsを実現するには何が必要なのでしょうか?DevOpsは、開発部門と運用部門で緊密に連携しながら開発を進める手法です。そのため、両者が協力し合える関係を構築するために必要な4つの文化が重要視されます。
・Respect(尊敬する)
互いに尊敬し合い、能力や功績を評価する
・Trust(信頼する)
互いを信頼し合い、役割に応じた仕事を任せる
・Healthy attitude about failure(失敗に対する健全な姿勢)
失敗は起こりえるものであり、失敗した相手に対して健全な姿勢をとる
・Avoiding blame(非難しない)
失敗を責めたりせず、失敗の再発を防ぐための建設的な議論をする
DevOpsを実現するためには、一緒に働く相手と協力し合える関係を築くことが必要です。DevOpsの導入を考える際にはまず、社内の文化や仕事の体制を見直すことが重要となります。
DevOpsに役立つツールとは?
DevOpsを実現するには、上記の4つの文化だけでなく、ツールの導入も求められます。ここでは、DevOpsの実現に役立つツールをご紹介します。
バージョン管理ツール
開発担当と運用担当が密に連携し、アジャイル開発の手法を用いてソフトウェア開発を進める際に役立つのが、バージョン管理ツールです。データやコードの作成日時、作成者、更新日時や更新内容といったバージョン管理を徹底することで、より生産性を向上させることが可能となります。
バージョン管理ツールとしては、「Git」、「GitHub」、「GitLab」といったGitサービスが有名です。
CI/CDツール
CI/CDは、ビルドやテスト、デプロイを自動化することで業務効率を上げる仕組みです。その仕組みは当然、ツールによって実現します。
CI/CDツールとしては、「Docker」、「Jenkis」といったところが有名です。「Docker」はコンテナ型仮想化ソフトの一種です。CI/CDを実現するには、迅速に起動・処理ができるコンテナ技術がよく利用されます。Dockerはコンテナ型仮想化ソフトの中でも処理が早く、開発環境の準備や本番環境との共通化も容易に行えます。
「Jenkis」はCI/CDツールの中でも汎用性が高く、1800以上のプラグインを利用して独自にカスタマイズすることができます。Docker上での動作もサポートされているのも魅力の1つです。
インフラ管理ツール
サーバーの構築といったインフラ管理もDevOpsを実現するために必要です。インフラ管理ツールにも複数ありますが、有名なのは「Ansible」というツールです。「Ansible」はLinuxで有名なRedHat社が提供している構成管理ツールで、サーバー構成やネットワーク構成、ソフトウェア構成を簡単に実装・管理できるツールです。
まとめ
なぜ、今DevOpsが求められているのかご理解いただけたかと思います。
近年、IT業界も時代の変化が急激に早くなり、ユーザーのニーズも刻一刻と変化するようになってきました。
これまでのウォーターフォール型の開発ではスピード感が合わない状況が多々起こっているのです。
この変化に対応するためには、スピーディかつ柔軟に対応できる体制構築が必要となります。
特にベンチャー企業や成長過程にある企業は、品質を上げた完成版のようなシステムを時間をかけて設計するよりも、いち早く市場のニーズをキャッチして開発してリリースをした上でフィードバックを得て、改善するのを重ねていくことが重要になりつつあります。
「DevOpsはゴールではなく、終わりのない継続的な改善のプロセスなのです」とDevOps支持者であるJez Humble氏も言っているように、リリースを重ねて修正しながら品質を高めていくためには、DevOpsの理論を実践することが近道なのです。
Webアプリケーションやモバイルアプリケーションなどはゴール(完成形)はなく、常に変化するユーザーニーズを捉え、改善し続けることが長期に継続できるアプリケーションとなり得るのでしょう。
マイクロサービスなども同じ思想のもと、マーケットに対応すべき見いだされている技術なのです。
AWSやAzureといったクラウドサービスも時代のニーズに適応するべく、DevOpsを実現するためのツールや理論を提唱しています。特にプログラミング初心者の人などは、今はスピーディにリリースと改善を重ねることで品質をあげる手法が求められている、ということを理解しておきましょう。
プログラミングスクールなどでは、このような実践的な開発手法についてまでは学ぶことができないことが多いと思います。もし、学ぶ機会があったとしても、企業やクライアントごとにフォーマットが違っていたり、ルールに差があったりと、実務ベースでは座学で学んだことに差が出ます。
スクールではプログラミングスキルを習得することに磨きをかけ、開発手法については概念や概要を理解しておくことで大きな問題はないかと思います。
ITエンジニアとして晴れて転職ができた際に、スクラムのような知らない開発手法が導入されていたとしても焦る必要はありません。
実務経験を積むべく、1歩1歩その企業の開発手法を学んでいくことでスキルアップをしていきましょう。