DevOpsのベストプラクティスを学ぶ

# 1 経緯
私たちのチームでは DevOps エンジニアでありながら DevOps のベストプラクティスを意識的にインプットしたことがありませんでした。
そのため、DevOps とは何かという基本的なことからベストプラクティスの勉強会を行い、アウトプットとして本記事に情報をまとめます。
# 2 本記事の目的
* DevOps とは
* DevOps（および DevOps エンジニア）のベストプラクティスとは

以上についての要約を DevOps エンジニアとして業務に携わる方へ説明します。
# 3 DevOps とは
開発チーム-運用チーム間のコミュニケーション・連携が円滑に行われず、開発/リリース/運用のフローに長い時間を要してしまうことがありました。DevOps は上記のような非効率なフローを改善するための一連のプロセスを指します。
プロセスとは、後述する「DevOps エンジニア」の中で登場する様々な役割・技術を持つ人や、ツールの連携により成されます。
DevOps を説明する上で頻出する「アジャイル」とは開発手法を指しており、アジャイルに加えて運用を紐づけたプロセスが DevOps です。
# 4 DevOps のメリット
DevOps を実行することによって様々なメリットがあります。
Atlassian のドキュメントによると以下のようなメリットがあるとされています。
* 開発・運用チーム間の不透明さや依存関係のすり合わせが不足することを改善する
* より高い品質で多くのリリースが可能になる
* 運用コストの削減
* 開発・運用チーム間のコミュニケーションが円滑になることで協力して課題に取り組めたり、フィードバックを得るまでの時間が短くなる
* 自動化プロセスが増えることにより、エラーの早期発見やインシデントへの復旧対応などの計画外作業に対して素早く対応できる
# 5 DevOps を文化として定着する
DevOps を文化としてチーム間で定着するために必要なことをまとめます。
### 5.1 DevOps の定着
DevOps を文化として定着するには、開発・運用チーム間で以下を結びつけるために文化的な変化が必要になります。
* 考えや意見を正直かつ敬意を持って共有することができる透明性
* コミュニケーション
* 協力関係

チームでの仕事の方法を大きく変えることになるため、DevOps を文化として完全に受け入れるためには組織の最高幹部からの賛同を得ることが必要とされています。
### 5.2 DevOps 定着のために必要となる変化
DevOps を文化として定着させるためにはいくつか必要となる事項が存在します。
以下はその例になります。
##### 責任を共有する
* 開発・運用チームの両方が製品の成功や失敗に対する責任を負うこと
* 開発チームは製品を構築して運用チームに渡して終わりではなく、​製品のライフサイクル全体を監督する責任を持つこと
* 運用チームはシステムのビジネス目標を理解し、開発者と協力してシステムの運用ニーズを定義すること
##### 自立型のチームになる
* 開発・運用チームが効果的な協力関係を構築するために、面倒で時間のかかる承認プロセスを必要とせずに意思決定を行って変更を実装すること
* チームに責任を移譲すること
* 失敗を恐れずにすむ環境を確立すること
* 顧客に対するリスクのレベルごとに、迅速かつ容易に意思決定を行うための適切なプロセスとツールを用意すること
##### 自動化する
開発・運用チーム間のプロセスの自動化と統合によりソフトウェアをより迅速かつ確実に構築、テスト、リリースができるようになる  
# 6 DevOps エンジニア
DevOps エンジニアとして求められる役割やスキルについてまとめます。
### 6.1 DevOps エンジニアの役割
##### インフラの稼働/システム管理 
アプリのホストするために必要なサーバー/ストレージ/ネットワークリソースのデプロイやメンテナンスなどの作業が該当します。
##### リリースエンジニアリング
アプリ実装やデプロイを行う上で必要となる作業が該当します。
### 6.2 DevOps エンジニアに必要となるスキル
DevOps エンジニアに必要とされているスキルとその説明を以下でまとめます。
* コミュニケーションと協力関係
  * 顧客とのやりとりが重要になるためツール活用しつつ連携できることが必要になります。 
* システム管理
* DevOpsツールの使用経験
* 構成管理
  * 1つ以上の構成管理ツールの経験があることが期待されています。
* コンテナとコンテナ連携
  * コンテナ管理とコンテナ間の連携に利用するツールなどの知識が必要になります。
* 継続的インテグレーションと継続的デプロイ
* システムアーキテクチャとプロビジョニング
* コーディングとスクリプティングの熟知
  * コーディングはアジャイル開発におけるソースコードレビューやコード管理力です。
  * スクリプティングは自動化スクリプトの実装などが該当します。
* 共同管理スキル
  * 一元管理できていない運用（例えばコミュニケーションツールとか）があればDevOpsエンジニアが開発者をサポートして連携を取れる仕組みを取り入れられることを指します。
# 7 DevOps を実行するためのベストプラクティス
DevOps を実行する上でのベストプラクティスは3点あります。
* アジャイルによるプロジェクト管理
* CI/CD による作業の前倒し
* 継続的なフィードバック

それぞれの詳細は後述します。
### 7.1 アジャイルによるプロジェクト管理
アジャイルによって要件、計画、結果のフィードバックを継続的にチームで対応し必要に応じて方向転換することができます。
また、アジャイルプロジェクト管理の重要な概念として以下の3つが挙げられます。
* ToDo、進行中、コードレビュー、完了の 4 つの段階を含むワークフローをもつこと 
* 大規模なプロジェクトをより小さなタスクに分割し、進捗に応じてニーズやスコープの変化に対応すること
* スクラムやカンバンを用いて漸増的な作業の計画、追跡、測定を行うこと
### 7.2 CI/CD による作業の前倒し
作業を前倒しで行えているチームでは、コード開発のプロセスの中でもテストを自動化するなどして早い段階でバグの検出が行われています。
また、バグの修正やリファクタリングなどの対応をスムーズにデプロイするために CI/CD を用いています。
### 7.3 継続的なフィードバック
これまで開発チームではスピードまたは品質の最適化しかできないと広く信じられてきたようです。
しかし、継続的なフィードバックを得ることは開発と製品管理両方を可能にする DevOps の要素の1つであるとされています。 
継続的なフィードバックによって開発・製品管理それぞれ観点で可能になる点は以下です。
###### 開発の観点
* パイプラインなどで何らかの障害が生じたらチームが直ちにアラートを受け取ることができる
* 明確で詳細なコードテストの結果をできる限り速やかに利用できる
###### 製品管理の観点
* 生産上の障害やパフォーマンス不足、報告されたバグを認識できる
# 8 まとめ・感想
今回の学習を通じて DevOps が開発だけではなく運用についてもフォーカスしたプロセスであることや、開発・運用におけるベストプラクティスとして開発・運用チーム間のコミュニケーションや工程の効率化も重要視されていることがわかりました。

また、今後の DevOps 活動へ取り入れるため現在小さい規模で DevOps のベストプラクティスに沿ったシステム構築を行い、ドキュメントで記されていたメリットを体験する取り組みを行っています。
クライアント・サーバアプリケーションの実装から CI/CD の構築までを行っているため、いずれ各プロセスの内容の紹介や実際にベストプラクティスを意識した構成にしてみて感じたことなどをまとめられればと考えています。
# 9 参考
https://www.atlassian.com/ja/devops