Refactoring English:4ヶ月目
原文は Michael Lynch により に公開されました。 このブログを購読する
要約を一言で
正式に本を書くことになりました!
ハイライト
- 本の先行販売が成功しました(ただしギリギリでした)。
- ブログ記事をたくさん書きましたが、反響の予測はまったく当たりませんでした。
- 次は、本を書くためのマークアップ言語を選ぶ必要があります。
目標の成績表
毎月初めに、その月に達成したいことを宣言しています。結果は次のとおりです。
Refactoring EnglishのKickstarterで5,000ドルの目標を達成する
- 結果: Kickstarterは196人のバッカーから6,701ドルを集めました。
- 評価: A+
Kickstarterは予想以上に健闘し、土壇場で逆転しました。
Refactoring Englishのブログ執筆の章を公開する
- 結果: “How to Write Blog Posts that Developers Read”を公開しました
- 評価: A
この記事はHacker NewsとLobstersでは好評でしたが、redditでは振るいませんでした。
3月末までにHacker Newsのフロントページに2回掲載される
- 結果: “How to Write Blog Posts that Developers Read”とHN Popularity Contestの両方がフロントページに掲載されました。
- 評価: A
なんとか達成できたので今は満足していますが、月の大半は、5本のネタがすべて外れたらどれだけ間抜けに見えるだろうかと不安でした。幸い、5本中2本が当たりました。
本の先行販売は成功した
月の大半、本の先行きは暗いように思えました。先行販売は5,000ドルの目標を1,500ドルも下回るペースで推移していました。
先行販売が終了する4日前、あるブログ記事がHacker Newsで注目を集め、売上の流れが完全に変わりました。
最終的にKickstarterでは6,551ドルが集まり、5,000ドルの目標を上回りました。遅れての予約注文を含めると現在は6,701ドルになっています。

先週、先行販売についてより詳しく書きました:
Kickstarterについては改めて詳しく書くつもりですが、使ってみた感想はとても良かったです。本への関心を測る良い方法になりましたし、6,500ドルの事前注文は、伝統的な出版社から前金として受け取る額よりも多いのです。
Julia Evansのビジネスモデルは自分にも通用するか?
Refactoring Englishの先行販売でワクワクするのは、ブログで生計を立てられるかもしれないという希望の光が見えたことです。
TinyPilotを運営していたとき、ブログは間違いなく最初の数十人の顧客を見つける助けになりました。ただ、やがて個人ブログが売上にまったく貢献していないように感じられるようになりました。考えてみれば当然で、個人開発者の日記に興味がある人が、400ドルのKVM over IPデバイスを買いたいとは限らないからです。
ハードウェアビジネスの複雑さもあり、時間には常に制約があったため、1日の中で最も頭を使う「深く考える時間」の大半を個人ブログに充てるのは難しかったです。それ以来、ブログを書くこととビジネスの収益性がうまく結びつく事業は何かをずっと考えてきました。
私の仮説は、教育コンテンツを作ることでブログを持続可能にできるということです。自分が取り組んでいることについて書き、さらに深掘りした本やコースがあれば、読者はより深く学べるし、その代金が私の活動を支えてくれます。
関連コンテンツで収益を得ているブロガーの最良の例がJulia Evansです。彼女はソフトウェアブログを運営し、イラスト入りのzineを販売することで収益化しています。
Juliaは現在は収益を公開していませんが、2019年時点でzineから年間約10万ドルの売上を得ていました。それは彼女がブログを本業にする前の数字です。もちろんこれは売上であり利益ではありませんが、zineはデジタルなので粗利率は90〜95%程度だったはずです。支払うのはGumroadのような決済代行やコンテンツプラットフォームへの手数料くらいだからです。
副業の段階で年間10万ドルの売上というのはかなりすごいことです。仮にJuliaが副業から本業に切り替えて売上を3倍にしたとしましょう。もし私が彼女の半分でも成功できれば、ブログと関連商品で年間15万ドルになります。挑戦的ですが、達成不可能ではないように思えます。
生活がかかっているつもりでブログを書く
3月はブログ執筆として興味深い挑戦でした。なぜなら、バズる記事を書くことで本の顧客を見つけようとしていたからです。普段は締切に追われて書くことも、読者数を最大化するためにネタを選ぶこともないので、これは自分にとっては珍しいことでした。
ネタのアイデアや書きかけの記事はたくさんあるので、次の観点で評価してみました:
- 書きやすさ: 完成感のある記事をどれだけ簡単に書けるか
- 潜在的な読者数: 記事が当たった場合、どれくらいの規模の読者に刺さるか
- 成功確率: 想定する読者に届く可能性はどれくらいか
- 本との重なり: この記事から来た読者が、本に興味を持つ可能性はどれくらいか
きちんと座って点数をつけたわけではありませんが、頭の中でのざっくりした計算はこんな感じでした:
| タイトル | 書きやすさ | 潜在的な読者数 | 成功確率 | 本との重なり |
|---|---|---|---|---|
| No Longer My Favorite Git Commit | 4 | 5 | 4 | 4 |
| How to Write Useful Commit Messages | 2 | 5 | 3 | 4 |
| How to Write Blog Posts that Developers Read | 2 | 4 | 2 | 5 |
| How to Maintain an Open-Source Project and Remain Happy | 3 | 3 | 4 | 2 |
| Fine Tuning Your Writing: Using Strong Verbs | 5 | 1 | 1 | 5 |
| Three Months Using NixOS after 35 Years on Windows | 3 | 2 | 5 | 1 |
| Use Zig to Build C Applications | 3 | 3 | 4 | 1 |
結局、このリストの上位3つを選びましたが、結果は予想通りにはいきませんでした。結果は次のとおりです:
| タイトル | 売上への影響 | 総読者数 | Hacker News | |
|---|---|---|---|---|
| How to Write Blog Posts that Developers Read | 大 | 22.3k | 9.7k | 325 |
| How to Write Useful Commit Messages | 中 | 2.6k | 126 | 1.2k |
| No Longer My Favorite Git Commit | 小 | 31.6k | 87 | 6.4k |
“No Longer My Favorite Git Commit”は、すぐに書けるとわかっていたし、元の記事がとても人気だったので潜在的な読者も多いと思い、一番手応えのあるネタに感じていました。結果はLobstersでは好評、redditではまずまず、Hacker Newsでは振るいませんでした。この記事を書くために腰を据えるまで気づかなかったのですが、存在自体知らなかったGoogle Discoverに取り上げられ、そこから1万5,000人の読者が流入していました。
この記事は私にとっては少し異色でした。というのも、これまで他のブログ記事への反論を書いたことがなかったからです。書き始めたときは、元の記事に対して強い意見があったのでワクワクしていました。だが初稿を書き終えると、考え直し始めました。6年前に誰かが書いたものを、わざわざ攻撃しているように感じられたのです。攻撃的に聞こえないよう表現を和らげましたが、それでもどこか対立的な印象は残りました。
“How to Write Useful Commit Messages”は、先行販売の呼び水になるはずだった記事です。Lobstersでは好評、redditではまずまずでしたが、Hacker Newsでは振るいませんでした。どれだけ売上に貢献したかは判断が難しいです。というのも、記事がきっかけで予約した人と、同日に本のメーリングリストで先行販売を告知したことがきっかけで予約した人を区別できないからです。
“How to Write Blog Posts that Developers Read”は、本を救った予想外のヒット作でした。Lobstersではまずまず、redditでは惨敗でした。Hacker Newsへの最初の投稿は振るいませんでしたが、翌朝別の誰かが再投稿してくれて、素晴らしい反応を得て、その日の4位で終えました。何より良かったのは、Hacker News経由で記事を見つけた多くの人が、先行販売を通じて顧客になってくれたことです。
Hacker News Popularity Contest
“Engineering as marketing”は、マーケティングが苦手なエンジニア(例えば私)に人気のマーケティング手法です。
考え方は、有料プロダクトに関連する無料ツールを作り、その出来に感心した人が有料プロダクトもチェックしてくれることを期待する、というものです。
Hacker Newsのブログ人気ランキングを作りたいとずっと思っていました。自分が他の人気Hacker News執筆者と比べてどの位置にいるのか気になっていたからです。昨年夏に基本的なプロトタイプを作ったのは、Hit the Front Page of Hacker Newsコースを再始動させるために使う予定だったからです。
そのコースを中断してRefactoring Englishに集中することにしたとき、このランキングツールをどうすべきかわからなくなりました。3月になり、何としても先行販売を成功させたいと必死になっていたとき、1〜2日かけてプロトタイプを公開できる状態にすればいいと気づきました。

Popularity Contestは、Refactoring Englishを宣伝するために私が作ったツールです
このツールは無事Hacker Newsのフロントページに掲載されましたが、本の売上にはまったく影響しませんでした。
予想外だった反応の一つは、トップ100に入った多くの人が自分の順位を気にしていたことです。Hacker Newsで最も人気のある個人ブロガーの一人であれば、もはや有名すぎてHacker Newsなど大したことではないだろうと思っていましたが、トップ100の多くの人が公開コメントやDM・メールで反応してくれました。
多くのトップブロガーが、時間とともに順位がどう変化するかに強い関心を示していたように見えました。最も顕著だったのはJohn Gruberで、私のツールが、Hacker Newsが近年自分のサイトに手動でペナルティを課しているという彼の説を裏付けていると感じたようです。
その反応を受けて、個別のブログについてより詳細な統計を見られる機能を追加しましたが、この機能についてはまだあまり反応がありません。

トップブロガーたちが自分のドメインの統計を共有したがっているようだったので、ブログごとの詳細ビューを作りました。
本を書くためのマークアップ言語選び
これまで本はHugoでMarkdownを使って書いてきました。正式なPDF版にはまだ着手していないので、出版技術を選ぶという決断を先延ばしにしてきました。
本の出版が正式に決まった今、執筆方法を決める必要があります。重視している機能は次のとおりです:
- ツールはネイティブにPDFを出力できるか
- ツールはネイティブにEPUBを出力できるか
- ツールはネイティブにHTMLを出力できるか
- ツールはどれだけ成熟しているか。単純なことをやろうとしてバグや行き詰まりに遭遇する可能性はどれくらいか
- どのDRMフリーの技術系伝統的出版社がこのフォーマットをサポートしているか
- 初版は自費出版する予定ですが、第二版で紙の書籍について伝統的な出版社と組む選択肢があると嬉しいです。
選択肢は次のようになります:
| ツール | EPUB | HTML | 成熟度 | 出版社のサポート | |
|---|---|---|---|---|---|
| Asciidoctor | ✅ | ✅ | ✅ | 高 | なし |
| LaTeX | ✅ | ❌ | ❌ | 非常に高 | No Starch Press |
| Pollen | ❌ | ❌ | ✅ | 低 | なし |
| Typst | ✅ | ❌ | ❌ | 低 | なし |
| mdBook | ❌ | ❌ | ✅ | 低 | なし |
勝者はAsciidoctorかLaTeXのどちらかになりそうです。
AsciiDocからLaTeXに変換するサードパーティ製ツールもあります。楽しい作業ではないでしょうが、もしNo Starchが本の第二版を出版したいと言ってきたら、我慢して一度だけ変換すれば済むでしょう。
Typstも数時間触ってみました。オープンソースなのは気に入っていますし、LaTeXよりシンプルなのも良いです。だが、より新しく成熟度の低いツールを使うことを正当化するほどの改善ではありません。また、研究論文を書くことには最適化されていますが、本を書くのにはそれほど向いていないように思えます。
サイドプロジェクト
fusion RSSリーダーのテストカバレッジを上げる
数ヶ月前にNixOSに切り替えて以来、自分のマシンでより多くのサービスをホストするのを楽しんでいます。お気に入りは自分のマシンでより多くのサービスをホストすることで、特にfusionという、GoとSvelte、SQLiteで作られたミニマルなRSSリーダーです。

fusionはGo、Svelte、SQLiteで作られたミニマルなRSSリーダーです。
fusionで一番気に入っているのは、メンテナがフレンドリーでコードのコントリビューションを歓迎してくれることです。なので空き時間に細かな改善に取り組んでいます。
最も誇りに思っている貢献は、pullパッケージをリファクタリングしてテストカバレッジを上げたことです:
pullパッケージのビフォー(v0.8.9) vs. アフター(v0.9.3)
きっかけはIf-Modified-Since HTTPヘッダーのサポートを追加したかったことでした。だがHTTPリクエストを発行するコードを見てみると、修正が困難でした。いくつか問題がありました:
- コードが多くの異なる責務をごちゃ混ぜにしていました。データベースの読み取り、フィードをいつ問い合わせるかというロジック、外部データのパース、そして結果をデータベースに書き戻す処理です。
- そのコードを検証する自動テストがありませんでした。
- テストを書こうとしても、このコードを実行する唯一のエクスポートされた関数は
Puller.PullAllで、その関数はワーカープロセスのプールも管理しているため、さらに複雑さが増していました。
主に行った変更は次のとおりです:
- HTTPロジックを独自のファイルに移しました。
- RSSパース処理を独自のファイルに移しました。
- 単一フィードを問い合わせるロジックを、複数のワーカーを管理するコンポーネントから切り離しました。これにより単一フィードのロジックのテストがシンプルになりました。
- このコードがデータベースとやり取りする方法について、よりシンプルで明確なインターフェースを作りました。これによりテストでデータベースをモックするのが容易になりました。
- フィードを更新するかどうかを判断するための専用関数を作り、その判断を更新ワークフローの他の部分と混ぜ合わせないようにしました。
もう少し整理したいとは思っていますが、今のところの進捗には満足していますし、いくつかのバグ修正やfusionの機能改善にも役立ちました。
What Got Doneを正式に終了すべきだ
2019年に、What Got Doneというウェブアプリを作りました。初めての本格的なSaaSビジネスへの挑戦でしたが、顧客を見つけられませんでした。
今でも毎週使っています。週次アップデートの投稿は5年連続で続いていますが、継続的に使っているのは私だけです。たまに他の人が使い始めても、たいてい数週間で飽きて投稿をやめてしまいます。
作った当時はウェブ開発について今よりずっと知りませんでした。サイトは当初Go、Vue 2、AppEngine、Google Cloud Firestoreで構築されていました。その後AppEngineをfly.ioに、FirestoreをSQLiteに置き換え、開発は少し快適になりましたが、それでもVueでの作業は苦痛です。VueからバニラJavaScriptへ段階的に移行する良い方法がわからず、30時間以上かけて大規模に書き直す気にもなれません。
最近、このサイトはHugoで生成する静的サイトにした方が理にかなっていると気づきました。好きなエディタで週次アップデートを書き、mainブランチにプッシュすればCIがサイトをビルドして公開してくれます。このブログがまさにその仕組みです。What Got Doneでもそうすれば、ユーザーアカウントや認証、データベース管理にまつわる複雑さの多くをなくせます。さらに、すべてのアップデートがSQLデータベースに閉じ込められたレコードではなく、検索可能なプレーンテキストファイルになるという利点もあります。
サイトを運営し続けるコストはゼロで、メンテナンスも年間5時間ほどしかかかっていません。だから終了を急いではいませんが、第一歩として新規登録の受付は停止しました。
いずれ、最近のユーザーにメールでプロジェクト終了を告知し、データをエクスポートできるようにするつもりです。
興味深いリンク
- Four years of running a SaaS in a competitive market - これはブートストラップ企業の構築について私が読んだ中で最高のブログ記事の一つです。ほぼすべての教訓に同意します。ブートストラップ創業者としての自分の経験からも、すべてが真実だと感じます。
まとめ
今月やったこと
- “No Longer My Favorite Git Commit”を公開しました
- “How to Write Blog Posts that Developers Read”を公開しました
- “My Book’s Pre-Sale Just Barely Succeeded”を公開しました
- 本のマーケティングツールとしてHacker News Popularity Contestをリリースしました
来月の目標
- Kickstarterから得た教訓についてのブログ記事を書く。
- 新しい章を完成させるか、本の中のトピックについてライブセッションを行う。
- 公開での謝辞やブログ記事の編集協力を選んだすべてのKickstarterバッカーとリワードの調整を行う。
手伝ってほしいこと
もしマークアップ言語(つまりWordやGoogle Docsではない手段)で本を出版した経験があれば、ぜひその経験を教えてください。
記事をランダムに読む
コメント
ログインしてコメントする