Show original
Enjoyed this article?
Use "Request tipping" to ask the author to set up tip receiving.

AI translation
It was past 11 PM the night before release, and I was staring intently at the terminal output. When I saw a single small line of text remaining at the end of the flowing logs, I almost let out a sound. ——A forced termination code due to timeout. The script that automatically posts to SNS every morning had been silently dying from time to time, so…
Enjoyed this article?
Use "Request tipping" to ask the author to set up tip receiving.
The night before release, past 11 PM, I was staring intently at the terminal output. When I saw a single line of text remaining at the end of the flowing logs, I almost let out a sound. exit 124——a timeout force-termination code. The script that automatically posted to SNS every morning had been silently dying from time to time. I told myself it was "not fatal." It only happened about once in four times, and when it worked, it worked properly. But it was definitely "broken." Knowing that, the next morning I pressed the release button. This essay is an honest record of that decision and what happened afterward.
That day, I was doing final testing on an automation tool that had finally come together. It was a script that managed scheduled SNS posts to a brand account I personally operated, something I'd been gradually shaping over two weeks.
While looking over the test execution logs, an unfamiliar number caught my eye. exit 124. When this exit code appears on Linux, it means a timeout——the process didn't finish within the allotted time and was forcibly terminated by the OS. When I checked, the timeout setting for the posting process was far too tight relative to the actual processing time.
I would later learn through proper measurement, but at that point the night before, I only had a rough sense of things. The average processing time was about 150 seconds, and the timeout setting was 180 seconds. There was only 30 seconds of margin, and it would fail immediately if the API response was even slightly delayed.
Before: Success rate approximately 75% (7-8 out of 10 runs completed)
After (operating for one week without fixing): Success rate approximately 40% (timing worsened due to environmental changes)
However, I only understood these numbers after the release. The night before, I was only estimating "about once in four times" by feel, without proper measurement. This would later become a source of regret.
For 30 minutes after confirming the bug, I kept thinking about it right there.
If I fixed it, simply increasing the timeout value wouldn't be a fundamental solution. I'd need to identify why the process was slow, rebuild the retry mechanism, retest——even a conservative estimate would take a full day. It was already 11 PM. I had already announced that I would "go public" the next day.
If I chose "fix it before releasing," I'd be breaking a promise. If I chose "release it as is," I'd be handing over something broken. Two options, neither of which was right, were lined up before me.
My final decision to release was closer to intuition than logic.
This bug wasn't "doesn't work" but "sometimes doesn't work." It wasn't completely broken. And I thought what I'd lose by not releasing——the opportunity to have people try it, the time to get feedback, my own motivation——was bigger than one bug.
To be honest, I also knew from past experience that if I kept waiting to make things "perfect," I'd never be able to release anything.
Since I started personal development, I can't count how many times I've repeated the same thing. "Just a little more polish," "after I add that feature," "once I've tested it properly"——I've shelved countless things by putting them off like that.
The desire to release something perfect is real. But perfection and release are, in most cases, incompatible. Especially in personal development, time and energy are finite, and I keep raising the bar for "perfection" myself.
I was confident I could fix this bug too. But not "tonight." And when I thought "if not tonight, when will I fix it?", releasing first seemed more realistic. There's no point in fixing something that isn't being used——no one will ever see it.
The week after release, things got worse.
What was supposed to be "once in four times" failures turned into six out of ten runs stopping midway. When I investigated, I found that API response times were slower during certain time periods, and the already-tight timeout setting was taking the full brunt of that impact. When the success rate dropped below 40%, I finally decided this couldn't be left alone.
That weekend, I spent 2 hours reviewing the timeout value and processing order. I extended the timeout from 180 seconds to 300 seconds and reorganized the order to include a lightweight connectivity check before heavy processing. It was a mundane change——just modifying a single number in a configuration file.
That alone brought the success rate back above 95% the next day. The time spent: 2 hours. The fix I thought would take "a full day" the night before release actually took 2 hours. I think my estimate back then had been exaggerated by fatigue and panic.
What I regret most about this episode isn't releasing with a bug. It's making a judgment based only on intuition——"probably about once in four times"——without proper measurement.
If I had properly measured 10 runs the night before and understood the numbers as "75% success rate," even if the decision to "release" wouldn't have changed, I could have addressed it faster. Intuition matters, but sometimes numbers are unbeatable. It's less about engineering and more about properly questioning your own understanding.
And I also wish I'd added one line after release: "This isn't the final form yet. If something doesn't work, please let me know"——if you're handing over something imperfect, a bit of honesty about that changes how the recipient perceives it. Hiding imperfection versus sharing imperfection——I think the latter builds more trust as an individual developer.
As I write this record of the day I released with a bug, I'm left with a feeling I can't quite resolve——neither "that was the right call" nor "that was definitely a mistake."
But one thing is certain: because I released it, I was able to fix it. If I'd shelved it, that bug would have existed there forever, unknown to anyone, never fixed. The release didn't break it——the release revealed that it was broken, and I was able to fix it.
I now think personal development isn't a place to pursue perfection, but a place to nurture something while it's running.
That "almost finished" thing in your hands right now——maybe it's okay to release it today.
Lily (@bokuwalily) — Individual developer. Working hand-in-hand with AI to create iOS apps and web services.
リリース前日の夜11時過ぎ、わたしはターミナルの出力をじっと見つめていました。 流れるログの末尾に、小さく一行だけ残っていた文字を見たとき、思わず声が出そうになりました。exit 124——タイムアウトによる強制終了のコード。毎朝自動でSNSへ投稿するスクリプトが、ときどき黙って死んでいたのです。 「致命的ではない」と自分に言い聞かせました。4回に1回ほどしか起きないし、動くときはきちんと動く。でも確かに「壊れている」。それを知りながら、翌朝わたしはリリースボタンを押しました。このエッセイは、その判断のこと、そしてその後に起きたことの正直な記録です。
その日、ようやく仕上がった自動化ツールの最終テストをしていました。個人で運用しているブランドアカウントへのSNS投稿をスケジュール管理してくれるスクリプトで、2週間かけて少しずつ形にしてきたものです。
テスト実行のログを眺めていたとき、見慣れない数字が目に入りました。exit 124。Linuxでこの終了コードが出るのはタイムアウト——決められた時間内に処理が終わらず、OSに強制終了させられたとき。確認してみると、投稿処理のタイムアウト設定が実際の処理時間に対してギリギリすぎたのです。
後になってちゃんと計測してわかったことですが、前夜の時点ではざっくりとした感覚しかありませんでした。処理の平均所要時間は約150秒、タイムアウトの設定値は180秒。余裕が30秒しかなく、APIのレスポンスが少し遅れただけで即アウトになっていました。
Before:成功率 約75%(10回中7〜8回は完走) After(修正前のまま1週間運用):成功率 約40%(環境の変化でタイミングが悪化)
ただし、この数字を把握したのはリリース後のことです。前夜の時点では「4回に1回くらい」と目分量で感じていただけで、きちんと計測してはいませんでした。これが後に悔いを残すことになります。
バグを確認してから30分、わたしはその場で考え続けました。
修正するなら、タイムアウト値を増やすだけでは根本解決になりません。処理が遅い原因を特定して、リトライの仕組みを組み直して、再テストして——少なく見積もっても丸1日かかります。すでに夜の11時。翌日には「公開します」と宣言してしまっていました。
「直してから出す」を選べば、約束を破ることになる。「このまま出す」を選べば、壊れたものを渡すことになる。どちらも正解ではない選択肢が、ふたつ並んでいました。
最終的に出すことにしたのは、理屈というより感覚に近い判断でした。
このバグは「動かない」ではなく「ときどき動かない」。完全に壊れているわけではない。そして、出さないことで失うもの——試してもらえる機会、フィードバックをもらえる時間、自分のモチベーション——のほうが、バグひとつより大きいと思った。
もうひとつ正直に言うと、「完璧にしてから」を続けると、永遠に出せないことをこれまでの経験で知っていたからです。
個人開発を始めて以来、何度同じことを繰り返したかわかりません。「もう少し整えたら」「あの機能をつけてから」「ちゃんとテストしたら」——そうやって引き延ばしたまま、お蔵入りになったものがいくつもあります。
完璧なものを出したいという気持ちは本物です。でも、完璧とリリースは、たいていの場合、両立しない。特に個人開発では、時間も体力も有限で、「完璧」のハードルは自分で上げ続けてしまう。
今回のバグも、直せる自信はありました。ただ、「今夜」ではなかった。そして「今夜じゃないなら、いつ直すか」を考えたとき、出してからのほうが現実的だと思いました。使われていないものを直しても、誰にも届かない。
リリースの翌週、状況は悪化しました。
最初は「4回に1回」の失敗だったはずが、気づけば10回中6回が途中で止まるようになっていました。調べると、APIのレスポンス時間が全体的に遅くなる時間帯があり、もともとギリギリだったタイムアウト設定がその影響をまともに受けていたのです。成功率が40%を切ったとき、さすがにこれは放置できないと判断しました。
その週末、2時間かけてタイムアウト値と処理の順序を見直しました。タイムアウトを180秒から300秒に延ばし、重い処理の前に軽い疎通確認を挟むように順序を組み直しました。設定ファイルの数字を一行変えるだけの地味な変更です。
それだけで、成功率は翌日から95%以上に回復しました。所要時間は2時間。リリース前夜に「丸1日かかる」と思っていた修正が、実際には2時間で終わった。あのときの見積もりは、疲労と焦りで大げさになっていたのだと思います。
このエピソードで一番後悔しているのは、バグを残してリリースしたことではありません。計測をせずに「たぶん4回に1回くらい」と感覚だけで判断したことです。
もし前夜にちゃんと10回計測して「成功率75%」と数字で把握できていれば、「出す」という判断は変わらなかったとしても、もう少し速く対処できていたはずです。感覚は大事ですが、数字には敵わないことがある。エンジニア的な話というより、自分の認識をちゃんと疑う、という話だと思っています。
それと、リリース後にこんな一言を添えておけばよかったとも思いました。「まだ完成形ではありません。動かないことがあったら教えてください」——完璧でないものを渡すなら、そのことを正直に伝える誠実さがあれば、受け取った側の印象はずいぶん変わる気がします。不完全を隠すより、不完全を共有するほうが、個人開発者としての信頼につながる気がしています。
バグを残したままリリースした日の記録を書きながら、「あれでよかった」とも「やっぱりまずかった」とも言えない気持ちのままでいます。
ただひとつ確かなことは、出したから修正できた、ということです。お蔵入りにしていたら、そのバグは永遠にそこに存在したまま、誰にも知られず、直されることもなかった。リリースしたから壊れたのではなく、リリースしたから壊れていることがわかって、直せた。
個人開発は、完璧を目指す場所ではなく、動かしながら育てる場所だと、今はそう思っています。
あなたの手の中にある「もう少しで完成」のあれは、今日出してもいいかもしれない。
Lily(@bokuwalily)― 個人開発者。AIと二人三脚で、iOSアプリやWebサービスを作っています