<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<title>Contextual</title>
	<subtitle>Essays by shiimaxx, beneath the surface.</subtitle>
	<link rel="self" type="application/atom+xml" href="https://shiimaxx.com/writing/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://shiimaxx.com/writing/"/>
  
	<updated>2026-04-22T00:00:00+00:00</updated>
	
	<id>https://shiimaxx.com/writing/feed.xml</id>
	<entry xml:lang="ja">
		<title>効果的な自動化：ガイドとしての制約</title>
		<published>2026-04-22T00:00:00+00:00</published>
		<updated>2026-04-22T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://shiimaxx.com/writing/constraints-as-guide/"/>
		<id>https://shiimaxx.com/writing/constraints-as-guide/</id>
    
		<content type="html" xml:base="https://shiimaxx.com/writing/constraints-as-guide/">&lt;p&gt;自動化の価値は単なる作業の省力化だけではありません。自動化が利用者にとってじゅうぶんに効果的であるとき、その自動化がもつ合理的な制約が、システム全体に対してまた別の価値をもたらすことがあります。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dbinpototurunozhi-yue-gasisutemugou-cheng-nobiao-zhun-hua-wocu-su&quot;&gt;DBインポートツールの制約がシステム構成の標準化を促す&lt;a class=&quot;zola-anchor&quot; href=&quot;#dbinpototurunozhi-yue-gasisutemugou-cheng-nobiao-zhun-hua-wocu-su&quot; aria-label=&quot;Anchor link for: dbinpototurunozhi-yue-gasisutemugou-cheng-nobiao-zhun-hua-wocu-su&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;最近、私の同僚が、技術支援を担当している顧客向けに本番データベースから開発環境にデータを取り込むDBインポートツールを開発しました。本番データを抽出し、機密情報をマスキングしたうえで、開発環境にデータを投入する一連の作業を自動化したものです。この作業は元々SREチームが開発チームからの依頼を受けて手動で実施しており、依頼ごとの作業負担が大きいことが問題になっていました。&lt;&#x2F;p&gt;
&lt;p&gt;DBインポートツールの導入後、ツールの利用方法に関する興味深いやり取りがおきました。&lt;&#x2F;p&gt;
&lt;p&gt;きっかけは、開発チームから「DBインポートツールで、本番データを開発環境にあるEC2インスタンス内のMySQLにリストアしたい」という依頼がきたことですが、SREチームは、保守性の観点からこの依頼への対応は見送るべきだと考えていました。DBインポートツールは複製先としてマネージドサービス（RDS&#x2F;Aurora）を前提にして開発したものです。EC2インスタンス内のMySQLへのリストアをサポートするにはツールの改修が必要ですが、一方でこれは例外的な構成なので、積極的にサポートすることは避けたかったためです。&lt;&#x2F;p&gt;
&lt;p&gt;そこでSREチームは、依頼に対してこのような提案をしました。「DBインポートツールを利用できるように、EC2インスタンス内のMySQLをRDSに移行してもらえませんか」&lt;&#x2F;p&gt;
&lt;p&gt;注目したいのは、この提案がSREチームと開発チームの双方にとってメリットがある内容になっていることです。SREチームは、例外的な構成をサポートするためのツール改修をする必要がなくなり、またシステムを標準的な構成に移行できます。開発チームは、移行に取り組むことでDBインポートツールが使えるようになり、従来SREチームに依頼する必要があった作業をセルフサービスで実施できるようになります。&lt;&#x2F;p&gt;
&lt;p&gt;この出来事は、以前読んだあるブログを連想させました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zi-dong-rihuakutaringusisutemunozhi-yue-gakodobesunopin-zhi-xiang-shang-wocu-su-spotifynoshi-li&quot;&gt;自動リファクタリングシステムの制約がコードベースの品質向上を促す（Spotifyの事例）&lt;a class=&quot;zola-anchor&quot; href=&quot;#zi-dong-rihuakutaringusisutemunozhi-yue-gakodobesunopin-zhi-xiang-shang-wocu-su-spotifynoshi-li&quot; aria-label=&quot;Anchor link for: zi-dong-rihuakutaringusisutemunozhi-yue-gakodobesunopin-zhi-xiang-shang-wocu-su-spotifynoshi-li&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Spotifyのブログ記事『&lt;a rel=&quot;nofollow noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;engineering.atspotify.com&#x2F;2023&#x2F;05&#x2F;fleet-management-at-spotify-part-3-fleet-wide-refactoring&quot;&gt;Fleet Management at Spotify (Part 3): Fleet-wide Refactoring&lt;&#x2F;a&gt;』で紹介されていた事例です。このブログ記事は、Spotifyが抱える何千ものコンポーネント（Fleet: 艦隊）をいかに効率よく管理しているかを紹介するブログシリーズのひとつで、Fleet全体に対する横断的なリファクタリング（Fleet-wide Refactoring）を効果的に行うための仕組みを紹介しています。&lt;&#x2F;p&gt;
&lt;p&gt;Fleet-wide Refactoringの中核を担うのは、任意のリファクタリングをFleet全体にプルリクエストとして展開したうえで自動マージする仕組みです。&lt;&#x2F;p&gt;
&lt;p&gt;注目したいのは、自動マージを有効にするためには、対象のコードベースでテストが十分に整備されていることが条件となることです。これは不適切な変更の混入を防ぐためにプラットフォーム側がかけた制約ですが、同時にコンポーネントの所有チームが自律的にコードベースの品質を改善する強力なインセンティブとしても機能しています。コードベースの品質を改善することで、Fleet-wide Refactoringの恩恵（自動マージによる省力化）を最大限に享受できるためです。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zi-dong-hua-nozhi-yue-gasisutemuwowang-masiifang-xiang-niyou-dao-surugaidoninaru&quot;&gt;自動化の制約がシステムを望ましい方向に誘導するガイドになる&lt;a class=&quot;zola-anchor&quot; href=&quot;#zi-dong-hua-nozhi-yue-gasisutemuwowang-masiifang-xiang-niyou-dao-surugaidoninaru&quot; aria-label=&quot;Anchor link for: zi-dong-hua-nozhi-yue-gasisutemuwowang-masiifang-xiang-niyou-dao-surugaidoninaru&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;システムや組織の規模は大きく異なる事例ですが、どちらも自動化がもつ制約がシステム全体を望ましい方向に誘導する役割を担っていたと捉えられます。自動化が利用者にとってじゅうぶん効果的な仕組みであったため、利用者は制約を受け入れる動機がありました。また、その制約はシステムの観点で合理的なものでした。その結果、人々が制約を受け入れることはシステム全体を望ましい方向に向かわせることになりました。&lt;&#x2F;p&gt;
&lt;p&gt;もちろんあらゆるケースでうまくいくようなことではありません。自動化のメリットよりも制約を受け入れるコストが上回る場合には、利用者が制約を受け入れるインセンティブが生まれず、自動化の導入が見送られるでしょう。&lt;&#x2F;p&gt;
&lt;p&gt;制約をシステムを望ましい方向に誘導するガイドとして捉え直し、ガイドが機能するバランスを見極めることが、自動化戦略において重要なひとつの要素になります。&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="ja">
		<title>ウェブサイトの再構築</title>
		<published>2025-12-04T00:00:00+00:00</published>
		<updated>2025-12-04T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://shiimaxx.com/writing/rebuilding-my-website/"/>
		<id>https://shiimaxx.com/writing/rebuilding-my-website/</id>
    
		<content type="html" xml:base="https://shiimaxx.com/writing/rebuilding-my-website/">&lt;p&gt;このウェブサイト（shiimaxx.com）を再構築しました。元々は自分が外部サービスに書いた記事の一覧を表示するだけの簡素なものだったのですが、今後はこのウェブサイト自体にもコンテンツを載せられるようにしました。
最近になって文章を書くことに対して興味が湧いてきて、自分用の書くための場所がほしくなったというのが理由です。&lt;&#x2F;p&gt;
&lt;p&gt;元々はNext.jsのStatic Site Generationベースで作っていました。ビルド時に自作Web APIから自分が書いた記事情報を取ってきてレンダリングするという仕組みです。Web APIはApp Engineでホスティングしていました。&lt;&#x2F;p&gt;
&lt;p&gt;前述した理由もあってウェブサイトを作り直すことにしたのですが、ウェブサイト自体のメンテナンスにあまり時間をとれないということもありStatic Site Generatorを使うことにしました。&lt;&#x2F;p&gt;
&lt;p&gt;具体的にはZolaというStatic Site Generatorを使っています。ChatGPTで「Static Site Generator 2025」をリストアップしてもらいつつ、自分の用途にあっていそうなものに絞り込んでいったところ、最終的にEleventyとZolaが候補になりました。Rust製でCLIベースで操作できるというところに惹かれたのと、今使っているSereneというテーマがシンプルで自分のイメージにあっていたという理由でZolaを使うことにしました。&lt;&#x2F;p&gt;
&lt;p&gt;Sereneにはリアクション機能があり、バックエンドAPIを自分で用意すれば記事ページにリアクションボタンを設置できます（このページの右下に表示されているやつです）。
いくつかリファレンス実装もあったのですが、せっかくなので触ってみたいなと思っていたHonoを使ってバックエンドAPIを実装してみました。自分で書いたコードがまったくないというのも少しさみしいなと思っていたので、ちょうどよい規模感でコードが書ける余地があってよかったです。&lt;&#x2F;p&gt;
&lt;p&gt;ホスティングにはCloudflareを使っていて、静的コンテンツの配信はPages、リアクション機能用のバックエンドAPIはPages Functions、バックエンドAPIで使うデータストアはWorkers KVを使っています。&lt;&#x2F;p&gt;
</content>
	</entry>
</feed>
