The Tao of HashiCorp – HashiCorp
https://hashicorp.com/blog/tao-of-hashicorp.html
blogの投稿で紹介されている内容が興味深く、自分の情報整理がてら、参考訳を作成していました。例によって、このまま眠らせておくのも勿体ないので、公開します。間違い等ありましたら、ご指摘ください。
■HashiCorp道(The Tao of HashiCorp)
この Tao of HashiCorp (HashiCorp道)とは、ビジョンやロードマップやプロダクト・デザインにあたっての基礎となるものです。あなたがHashiCorpのプロダクトの使用や貢献にあたり、私達の仕事に対する動機や意図を理解するための手助けになるでしょう。
■ワークフローであり、技術ではない(Workflows, not Technologies)
HashiCorpの手法(アプローチ)は、根底にある技術に関してより、むしろワークフロー(仕事の流れ)の最終ゴールに焦点をあてています。ソフトウェアとハードウェアが日々発展し改良されるなか、新しいツールを採用するかどうかの判断は極めてシンプルであり、最も効率的なユーザー経験をもたらすかどうかです。プロダクト・デザインは、ゴールを設定し、そこに至るまでのワークフローを想像するところから始まります。そして、私達は仕事の流れを単純化するために、既存のツールを探します。もし、十分なツールが存在しないなら、私達は構築のステップに入ります。ここでは、基本的に技術を選ばないのではなく、私達が問題を解決するために最適な技術を利用します。技術が発展し、よりよいツールが出てくるならば、それらの技術を活用して、より理想的なワークフローに更新されるのです。技術的な変更があったとしても、ゴールは同じなのです。
■単純で、モジュール型で、組みあわせ可能な(Simple, Modular, Composable)
Unix哲学はソフトウェアの価値を伝えるために、広く知られています。それは、単純、モジュール型、組みあわせ可能であること。このアプローチは、同時に使うことによって明確な範囲を限定して小さなコンポーネントを好みます。他の方法は画一的です。というのは、単純なツールでも範囲がハッキリさせていないいと、新しい機能や拡張性のためにツールが大きくなりがちです。私達は、コンポーネントはブロックだと考えています。それは、各々が1つの機能を持ち、革新的な機能で繋がることができるということです。
簡単で、モジュール化されて、組み立て可能なアプローチによって、私達がプロダクトを高いレベルで抽象化されたものを作ることができます。全体的な問題を解決するよりも、私達はコンポーネント(構成要素)毎に分解して、それらを解決しようとします。私達は、各々の問題における最もうまく考えられるソリューションを構築し、そして、しっかりした完全なソリューションを作るために、それらのブロックを組みあわせます。
■通信の連結した手続き(Communicating Sequential Processes)
私達のシンプルで、モジュール化されており、組み立て可能であるという信念を実現するため、いくつかの信条を使ってシステムを連結します。通信連結手順(CPS; Communication Sequential Processes)は、ネットワークを通した自主的なプロセスにおける接続が無くても、通信できるという計算モデルです。私達はCPSというアプローチは複雑で強力にスケールするサービス指向アーキテクチャにおけるシステムを構築するときに必要なものだと信じています。それから、各々のサービスは個々のプロセスがAPIを通して他と通信できる独立したプロセスとして扱われるべきです。
CPSの意味するところは、ソフトウェアを書き、サービスをシステムに取り込むための最も良い既知の方法を提供します。私自身の体の性質が最も良い例です。人体でさえ呼吸、心臓血管、神経、免疫など、相互に連携したシステムではないでしょうか。
■不変であること(Immutability)
イミュータビリティ(immutability)とは、変わることができないことです。これは多くのレベルであてはまることができる概念です。不変に対する最も似た実装は、バージョン管理システムです。一旦コードがコミットされれば、そのコミット内容は永遠に固定されます。gitのようなバージョン管理システムが広く使われているのは、早老な便益を提供するからです。コードはバージョン化されており、ロールバックやロールフォワードすることができます。バージョン化によって監査をできるようにし、現在の状態に至るまでの履歴を明確にすることができます。もし何かに問題があれば、バージョン履歴からエラーの原因を特定することができるのです。
この普遍の概念は、基盤の様々な面に拡張できます。アプリケーションのソースや、アプリケーションのバージョン、そして、サーバの状態です。私達は、イミュータブル・インフラストラクチャによって、デバッグやバージョン管理や仮想かにより、さらに堅牢なシステムを導くことができるでしょう。
■コード化を通したバージョン管理(Versioning through Codification)
コード化は全てのプロセスがコードで書かれるべき、保管されるべき、バージョン化されるべきという考えです。運用チームは、歴史的に言い伝えによって、どのように構築・アップグレード・インフラの選定を行うかに信頼をおいていました。しかし、情報は簡単に失われますし、最も必要とした人達からは隠蔽されました。プロセスにおける何らかの変更が自動的に保存され、バージョン化され、重要な知識の成分化は情報の共有を促進しますので、データの損失を防ぎます。
HashiCorpの全てのプロダクトは知識パラダイムの成文化に続くように設計されています。ユーザーが行った何らかの変更は、バージョン化され、プロセスの明確な履歴を記録するために保存されます。
■コード化を通した自動化( Automation through Condification)
典型的なシステム管理で必要となるのは、オペレータがインフラに対して手動で変更を加えることで、ポジション的にスケールさせるのが難しくなってしまいます。インフラのスケールを管理しようとしても、それは永遠に増えつつけます。手動によるシステム管理技術の影響で、新しくスケールしようとしても苦労する道を歩むでしょう。多くのシステムを自動的に管理するのは、オーバーヘッドの減少が唯一の選択肢なのです。
自動化をすすめるにあたっては多くのアプローチがありますが、私達はコード化を促したいです。コード化された知識は、機械によって実行されるだけでなく、オペレータにとっても読みやすいものとなります。自動化ツールによってオペレータの生産性を向上し、迅速に動き、人的ミスを減らすことができるのです。機械は自動的に検出・振り分け(トリアージ)を行い、問題を解決します。
■弾力的なシステム(Resilient system)
弾力的なシステムとは、予想外の入力と出力に耐えられるよう構築されたものです。これを達成するためには、システムには望ましい状態と、現在の状態に関する情報を集める方法と、自動的に現在の状態が望ましい状態に戻るように調整する仕組みが無くてはいけません。
私達は、この種類のシステムの厳格さを基盤に適用することで、高いレベルの信頼性を達成するために重要であると我々は考えています。HashiCorpのプロダクトは、常に体系化された知識を通して望ましい状態を認めます。それらは、機能的に独立したコンポーネントを通してリアルタイムに状態を集めます。そして、それらはツールを通して自己修復や自動復帰を行います。
■実用主義(Pragmatism)
私達が強く信じているのは、あらゆる問題を解決するのは実用主義であるという点です。私達が信じている多くの原理、不変やコード化や自動化、CSPといったアイディアは、それらは私達が目指しているものですが、私達が独断的に押し付けるものではありません。実務的なソリューションのために、再評価することが多くあります。
実用主義によって、私達が新しいアイディアやアプローチや技術を使うにあたり、そしてそれらを HashiCorpのベストプラクティスにかなうかどうかを考えます。そうすることによって、初めの原理と間違い(相違)を見つけることがあるかもしれませんが、むしろ、心を開き、謙虚に受け入れます。適用するという能力が、確信に極めて重要であり、それこそが私達が誇りに思う点なのです。