
おやおや、かわいそうに!「舌切り雀」に学ぶ、マイクロサービスとAPI設計の教訓
優しい老人が傷ついた雀を救う。その温かい行為は、完璧に稼働するマイクロサービスのようだった。だが、怒れる老女の登場で事態は急変!過剰なリファクタリングは、APIエンドポイントを破壊し、悲劇を招く。山奥の「雀のお宿」で明かされる、宝物とバグ、適切な粒度と過剰な分割の結末とは? あなたは、どちらの選択をする?
負傷したマイクロサービス、そして優しいおじいさんのデプロイ
山道を歩いているおじいさんは、小さな雀が羽根を痛めて地面に落ちているのを見つけました。
def check_sparrow_status(sparrow):
if sparrow.wing_status == "injured":
return "Need Help"
else:
return "OK"
sparrow_status = check_sparrow_status(sparrow) # sparrow_status には "Need Help" が代入される
「おやおや、かわいそうに。」おじいさんは優しく雀を拾い上げました。「おばあさんに見つかったら、きっと煮て食べられてしまうだろう。うちに連れて帰って手当てしてやろう。」
おじいさんは雀を自宅に持ち帰り、おばあさんに隠れて介抱を始めました。「大丈夫だよ。」おじいさんは温かいお粥を雀に与えながら優しく声をかけました。「ゆっくり休んで、元気になったらまた空を飛べるようになるよ。」
class Sparrow:
def __init__(self, name):
self.name = name
self.wing_status = "injured"
self.health_status = "weak"
def eat_ojiisan_porridge(self, porridge_amount):
self.health_status = "recovering"
print(f"{self.name} はお粥を食べて元気になってきました。")
def heal_wing(self):
self.wing_status = "healed"
print(f"{self.name} の羽根は治りました!")
sparrow = Sparrow("Suzume")
sparrow.eat_ojiisan_porridge(100) # Suzume はお粥を食べて元気になってきました。
sparrow.heal_wing() # Suzume の羽根は治りました!
雀は、おじいさんの温かい手に包まれながら、心の中で感謝の気持ちでいっぱいになりました。「おじいさん、本当にありがとうございます。いつか必ず恩返しをさせてください。」
「恩返しだなんて、そんなこと気にしなくていいんだよ。」おじいさんは微笑みました。「困っている者を助けるのは当然のことだからね。」
数日後、雀の羽根はすっかり治り、元気いっぱいに飛び跳ねるようになりました。おじいさんは雀を空に放してやりました。「元気でね。」おじいさんは手を振りながら言いました。「また遊びにおいで。」
雀は、おじいさんに深々と頭を下げ、空高く舞い上がっていきました。「おじいさんのご恩は一生忘れません!」雀は青空に向かって力強く羽ばたきました。まるで、新しいマイクロサービスがデプロイされ、スムーズに稼働し始めたかのようでした。

おばあさんの過剰なリファクタリングと悲劇のAPIエンドポイント
数日後、おじいさんが山へ芝刈りに出かけた留守中、おばあさんは庭で洗濯物を干していました。その時、裏口に置いてあった洗濯糊の入った桶に、小さな雀が頭を突っ込んでいるのを見つけました。「こらっ!泥棒雀!」おばあさんは怒鳴りつけました。「せっかくの糊を盗み食いしおって!」
「ちがいます!おばあさん、少しだけ味見を…」雀は弁明しようとしましたが、おばあさんは聞く耳を持ちませんでした。「うるさい!この恩知らず!おじいさんがせっかく助けてやったのに、この仕打ちか!」
おばあさんは怒りのあまり、雀を捕まえると、その小さな舌をハサミで切り取ってしまいました。
class Obasan:
def __init__(self, name):
self.name = name
self.anger_level = 0
def find_sparrow(self, sparrow):
self.anger_level = 100
print(f"{self.name} は怒り狂っています!")
def cut_sparrow_tongue(self, sparrow):
sparrow.can_speak = False
print(f"{sparrow.name} はもう話すことができません…")
obasan = Obasan("Obasan")
obasan.find_sparrow(sparrow) # Obasan は怒り狂っています!
obasan.cut_sparrow_tongue(sparrow) # Suzume はもう話すことができません…
「二度とこの家に来るんじゃない!」おばあさんは雀を力任せに追い出してしまいました。
舌を切られた雀は、悲しみと痛みで胸がいっぱいになりながら、よろよろと飛び立っていきました。「おじいさん…ごめんなさい…恩返しができなくて…」雀は泣きながら、空の彼方へ消えていきました。まるで、重要なAPIエンドポイントが誤ったリファクタリングによって無効化され、サービスが機能不全に陥ってしまったかのようでした。

雀のお宿:マイクロサービスアーキテクチャの楽園?
雀を探しに出かけたおじいさんは、山奥深く分け入っていきました。すると、木々の間に不思議な建物が見えました。「雀のお宿」と書かれた看板がかかっています。
def ojiisan_finds_inn(ojiisan_location, inn_location):
distance = calculate_distance(ojiisan_location, inn_location)
if distance < 1:
print("雀のお宿が見つかりました!")
return "Inn Found"
else:
return "Still Searching"
ojiisan_location = "Deep in Mountains"
inn_location = "Sparrow Inn"
search_result = ojiisan_finds_inn(ojiisan_location, inn_location) # 雀のお宿が見つかりました!
おそるおそる中に入ってみると、そこはたくさんの雀たちで賑わっていました。雀たちは、おじいさんを見ると、一斉に挨拶しました。「ようこそ、おじいさん!Suzumeから、おじいさんのご恩は聞いております!」
「Suzume?ああ、あの時の雀か。元気でやっているか?」おじいさんは尋ねました。
「はい、おかげさまで。少しばかり怪我をしましたが…。」一羽の雀が言いました。「おばあさんに舌を切られてしまいましたが、命に別状はありません。」
「おばあさんが…。」おじいさんは悲しそうに呟きました。「すまなかったね。」
「いえ、おじいさんの優しさは決して無駄にはなっておりません。私たち雀一同、心から感謝しております。」雀たちは口々に言いました。「ささやかですが、お土産をご用意いたしました。どうぞお持ち帰りください。」
雀たちは、大小二つのつづらをおじいさんの前に差し出しました。「大きい方のつづらにはたくさんの宝が入っておりますが、小さい方のつづらには少しばかりの食べ物しか入っておりません。どちらかお好きな方をお選びください。」
class TreasureChest:
def __init__(self, size, contents):
self.size = size
self.contents = contents
def choose_chest(self, choice):
if choice == self.size:
return self.contents
else:
return None
large_chest = TreasureChest("large", "Many Treasures")
small_chest = TreasureChest("small", "Some Food")
ojiisan_choice = "small"
chosen_contents = small_chest.choose_chest(ojiisan_choice) # chosen_contents には "Some Food" が代入される
「わしは、これで十分じゃ。」おじいさんは小さい方のつづらを選びました。「ありがとう。Suzumeによろしく伝えてくれ。」
おじいさんは、雀たちに見送られながら、「雀のお宿」を後にしました。まるで、シンプルなAPI設計で構築されたマイクロサービスが、過剰な機能追加の誘惑を退け、軽量で保守性の高い状態を維持しているかのようでした。

宝物とバグ:適切な粒度と過剰な分割の結末
おじいさんは、雀たちからもらった小さいつづらを家に持ち帰りました。「どれどれ…。」おじいさんは、わくわくしながらつづらの蓋を開けました。中には、まばゆいばかりの宝物が、ちょうど良い量入っていました。「これはすごい!雀たちには本当に感謝せねば…。」
def open_small_chest(chest):
if chest.size == "small":
treasure = chest.choose_chest("small")
ojiisan_happiness = 100
print(f"おじいさんは{treasure}を見つけました!")
else:
print("つづらは空っぽでした…")
small_chest = TreasureChest("small", "Beautiful Treasures")
open_small_chest(small_chest) # おじいさんはBeautiful Treasuresを見つけました!
その様子を見ていたおばあさんは、目を輝かせました。「おじいさん、その宝物はどこで見つけたの?!」
「山奥の『雀のお宿』でもらったんだよ。Suzumeたちが恩返しにと…。」
「雀のお宿?!私も行って宝物を貰ってくる!」おばあさんは、おじいさんの制止も聞かず、山奥へと走っていきました。
「雀のお宿」に着いたおばあさんは、雀たちに案内されて、大小二つのつづらの前に立たされました。「大きい方を選ぶに決まっているわ!」おばあさんは、大きなつづらを指さしました。
def obasan_chooses_chest(chests):
for chest in chests:
if chest.size == "large":
return chest
return None
large_chest = TreasureChest("large", ["Bug", "Monster", "Worm"])
small_chest = TreasureChest("small", "Few Treasures")
chosen_chest = obasan_chooses_chest([large_chest, small_chest])
「おばあさん、大きい方のつづらには…」雀が忠告しようとしましたが、おばあさんは遮りました。「うるさい!大きなつづらに決まっているでしょ!」
おばあさんが意気揚々と大きなつづらの蓋を開けると、中から、お化けや虫がワッと飛び出してきました。「キャー!」おばあさんは悲鳴を上げ、一目散に逃げ出してしまいました。
def open_large_chest(chest):
if chest.size == "large":
contents = chest.choose_chest("large")
for item in contents:
print(f"{item} が飛び出してきた!")
obasan_fear = 100
else:
print("つづらは空っぽでした…")
open_large_chest(chosen_chest) # Bug が飛び出してきた! Monster が飛び出してきた! Worm が飛び出してきた!
その後、おばあさんは二度と「雀のお宿」に近づくことはありませんでした。一方、おじいさんは、雀たちにもらった宝物のおかげで、幸せに暮らしました。時折、Suzumeが遊びに来るようになり、二人は静かな喜びを分かち合いました。まるで、適切な粒度で設計されたマイクロサービスが安定稼働し、小さなバグ修正はあっても致命的な障害とは無縁の平和な日々を送るかのようでした。時々発生するおばあさんのヒステリックな叫び声は、まるで、レガシーシステムの運用保守で疲弊しているSIerの悲鳴のようでした。
