こうした状況に一石を投じたのが、2009年のO'Reilly Velocity 09 Conferenceで行われた、Flickrのエンジニアによる伝説的な講演です。当時Flickrのエンジニアだったジョン・オールスパウ(John Allspaw)とポール・ハモンド(Paul Hammond)が「10+ Deploys Per Day: Dev and Ops Cooperation at Flickr」のタイトルで発表し、業界に衝撃を与えました。
この講演により「高頻度デプロイは可能」との認識が広まり、多くの企業がFlickrの実践に触発されて自社のデプロイプロセスを見直すきっかけとなりました。この講演は、YouTubeで「10+ Deploys Per Day: Dev and Ops Cooperation at Flickr」として今でも視聴可能であり、DevOpsを学ぶ人々にとって必見の資料となっています。
そして2009年、先述のFlickrの講演「10+ Deploys Per Day」に触発されたドボアは、エンジニアのナスラット・ナサー(Nasrat Nassar)からの「ベルギーで独自のVelocityイベントを開催してはどうか」というツイートをきっかけに行動を起こします。彼は「DevOpsDays」というイベントを開催することを決意しました。
2013年、ジーン・キムは、ケビン・ベア(Kevin Behr)、ジョージ・スパッフォード(George Spafford)と共に「The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win(邦題:The DevOps 逆転だ!)」を出版しました。
続いて2016年には、ジェズ・ハンブル、パトリック・ドボア、ジョン・ウィリス(John Willis)と共に「The DevOps Handbook: How to Create World-Class Agility, Reliability, and Security in Technology Organizations」を出版し、DevOpsの実践をより体系的にまとめあげました。
Amazonのエンジニアリング文化から生まれた「You build it, you run it(作ったものは自分で運用する)」の考え方もこの時期に広く普及しました。これは開発者が自ら作ったシステムの運用にも責任を持つ考え方で、開発と運用の境界をさらに曖昧にするものです。この文化の下では、開発者はコードを書くだけでなく、デプロイ、モニタリング、障害対応など、システムのライフサイクル全体に関わることが求められるようになりました。
DORA(DevOps Research and Assessment)の設立と影響
Dr. Nicole Forsgren (開発生産性Conference 2024にて)
2016年、ニコール・フォースグレン(Nicole Forsgren)、ジェズ・ハンブル(Jez Humble)らによって「DORA(DevOps Research and Assessment)」が設立されました。DORAはDevOpsの実践と組織のパフォーマンスの関係を科学的に調査・分析する組織として、毎年「State of DevOps Report」を発行し、世界中の何千もの組織からデータを収集・分析することで、DevOpsの実践がビジネス成果にどのように影響するかを明らかにしてきました。
2018年には、ニコール・フォースグレン、ジェズ・ハンブル、そしてジーン・キムによって書籍「Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations(邦題:LeanとDevOpsの科学)」が出版され、DORAの研究成果が体系的にまとめられました。この書籍によってDevOpsの実践は「科学」として確立される重要な一歩を踏み出しました。
AWS、Google Cloudなどのクラウドサービスの活用が拡大し、「クラウドネイティブ」な開発が注目され始めました。これを支える技術として、コンテナ技術(Docker)やコンテナオーケストレーション(Kubernetes)が普及し、インフラとアプリケーションの管理がより柔軟かつ自動化されるようになりました。これらの技術はDevOpsの実践をさらに加速させる役割を果たしています。特に「Infrastructure as Code(IaC)」の考え方が広まり、インフラストラクチャの構成もコードとして管理されるようになりました。これによりインフラの変更も開発プロセスの一部として扱われるようになり、開発と運用の統合がさらに進みました。現代ではTerraform、AWS CloudFormation、Ansible、Puppet、ChefなどのIaCツールが広く使われるようになっています。
データセンターやネットワーク運用を外部委託(SIer、DC事業者など)するのが主流で、自社にインフラ運用の知見が蓄積しにくい環境があります。クラウドネイティブな文化が根付く前は、Opsの自動化やSRE的観点がなじみにくかったのです。これにより、DevOpsの「Infrastructure as Code」「SRE」文化が根付きにくい土壌が形成されていました。
Kompoとは、READMEで「A tool to pack Ruby and Ruby scripts in one binary.」と紹介されている通り、Rubyスクリプトをバイナリにして配布できるツールです。
Rubyのスクリプトをバイナリにすることで、配布が容易になったり、実行環境にRubyのインストールが不要になるため配布先での実行が容易になります。
## prerequisites
Install [kompo-vfs](https://github.com/ahogappa/kompo-vfs).
#### Homebrew
$ brew tap ahogappa/kompo-vfs https://github.com/ahogappa/kompo-vfs.git
$ brew install ahogappa/kompo-vfs/kompo-vfs
### Building
To build komp-vfs, you need to have cargo installation.
$ git clone https://github.com/ahogappa/kompo-vfs.git
$ cd kompo-vfs
$ cargo build --release
Set environment variables.
$ KOMPO_CLI=/path/to/kompo-vfs/target/release/kompo-cli
$ LIB_KOMPO_DIR=/path/to/kompo-vfs/target/release
root:/app/kompo# gem build kompo.gemspec
WARNING: licenses is empty, but is recommended. Use an license identifier from
https://spdx.org/licenses or 'Nonstandard' for a nonstandard license,
or set it to nil if you don't want to specify a license.
WARNING: open-ended dependency on mini_portile2 (>= 0) is not recommended
use a bounded requirement, such as "~> x.y"
WARNING: open-ended dependency on async (>= 0) is not recommended
use a bounded requirement, such as "~> x.y"
WARNING: You have specified the uri:
https://github.com/ahogappa0613/kompo
for all of the following keys:
homepage_uri
changelog_uri
source_code_uri
Only the first one will be shown on rubygems.org
WARNING: See https://guides.rubygems.org/specification-reference/ for help
Successfully built RubyGem
Name: kompo
Version: 0.2.0
File: kompo-0.2.0.gem
root:/app# kompo --help
Usage: kompo [options]
-e, --entrypoint=VAL File path to use for entry point. (default: './main.rb')
-g, --use-group=VAL Group name to use with 'bundle install'. (default: 'default')
--[no-]gemfile Use gem in Gemfile. (default: automatically true if Gemfile is present)
--local-kompo-fs-dir=VAL
--verbose Verbose mode.
--dest-dir=VAL Output directry path. (default: current dir)
--bundle-cache=VAL Specify the directory created by 'bundle install --standalone'.
--ruby-version=VAL Specify Ruby version. (default: current Ruby version)
--rebuild
--repack
root:/app# kompo -e hello.rb --local-kompo-fs-dir=kompo-vfs
...
/usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.WD+0x0): multiple definition of `WD'; /tmp/ccNwyWlB.o:(.rodata+0x0): first defined here
/usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.PATHS_SIZE+0x0): multiple definition of `PATHS_SIZE'; /tmp/ccNwyWlB.o:(.rodata+0x28): first defined here
/usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.PATHS+0x0): multiple definition of `PATHS'; /tmp/ccNwyWlB.o:(.rodata+0x30): first defined here
/usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.FILES_SIZE+0x0): multiple definition of `FILES_SIZE'; /tmp/ccNwyWlB.o:(.rodata+0x192c8): first defined here
/usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.FILES+0x0): multiple definition of `FILES'; /tmp/ccNwyWlB.o:(.rodata+0x192d0): first defined here
collect2: error: ld returned 1 exit status
/usr/local/bundle/gems/kompo-0.2.0/lib/kompo.rb:193:in 'Kernel#system': Command failed with exit 1: gcc (RuntimeError)
classJobDescription# ...
sig { returns(::String) }
deftitle; end
sig { params(value: ::String).returns(::String) }
deftitle=(value); end
sig { returns(T::Boolean) }
deftitle?; end
sig { returns(T.nilable(::String)) }
deftitle_before_last_save; end
$ bundle exec srb tc
app/models/job_description.rb:6: Assigning a value to value that does not match expected type String https://srb.help/7002
6 | self.title = 1
^
Got Integer(1) originating from:
app/models/job_description.rb:6:
6 | self.title = 1
^
Errors: 1
$ DEPREWRITER=log bundle exec ruby user_code.rb
Calling deprecated method:
W, [2025-04-21T19:49:55.132998 #2137] WARN -- : DEPREWRITER: Legacy#old_method usage at user_code.rb:9 is deprecated. You can apply the diff below to resolve the deprecation.
--- ./user_code.rb 2025-04-21 19:49:55.123740000 +0900
+++ ./user_code.rb 2025-04-21 19:49:55.123740000 +0900
@@ -6,7 +6,7 @@
# Call the deprecated method
puts "Calling deprecated method:"
-legacy.old_method("example argument")
+legacy.new_method("example argument")
# The deprewriter will detect this call and show a warning
# suggesting to use new_method instead
Using deprecated old_method with example argument
書き換えモードでは次のような警告と変更がおこなわれます。
$ DEPREWRITER=dangerously_rewrite bundle exec ruby user_code.rb
Calling deprecated method:
W, [2025-04-21T20:11:49.426183 #39447] WARN -- : DEPREWRITER: Dangerously trying to rewrite. It will rewrite a file to apply the deprecation and load the file
Calling deprecated method:
Using new_method with example argument
Using deprecated old_method with example argument
$ git diff
diff --git a/user_code.rb b/user_code.rb
index d1a2a2b..bfcab60 100644
--- a/user_code.rb
+++ b/user_code.rb
@@ -6,4 +6,4 @@ legacy = Legacy.new
# Call the deprecated method
puts "Calling deprecated method:"
-legacy.old_method("example argument")
+legacy.new_method("example argument")
deprewriter-rubyは、Rubyの非推奨メソッドの置き換えを自動化するという、一見小さな問題に焦点を当てたgemですが、その影響は大きいと感じました。
非推奨メソッドの変更は避けられないものであり、ユーザーの移行をいかにスムーズにサポートするかは、ライブラリ開発者にとって重要な課題です。
day3のRuby Committers and the World内で、Matzも後方互換を大切にしている話をしていました。