**「ウェブとの別れ――Rust」**

2026/02/20 3:42

**「ウェブとの別れ――Rust」**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

著者のプログラミングジャーニーは9年生でパスカルから始まり、C/C++プロジェクトを経て大学卒業後にPHP開発者として働きましたが、その後プロフェッショナルにはC/C++へ戻りませんでした。ゲームエンジン構築中にRustが彼のツールボックスに加わり、低レベルの制御とモダンなツール(コンパイラ、リンター、フォーマッタ、パッケージマネージャ)の組み合わせを評価しました。
2023年末、著者はバックエンドが完全にRustで書かれ、フロントエンドがAstro/TypeScriptを使用した機能的なウェブアプリケーションをリリースしました。しかし時間とともにメンテナンスのボトルネックが発生しました。Rustのテンプレートライブラリ(Tera, Askama)は遅く、ビューとデータを分離していました;i18nサポートはNode.jsの成熟したICUベースのライブラリに追いついていませんでした;SerdeはNodeのKyselyに比べて動的SQLクエリを冗長にしました;さらにi5‑7500 VMで1回のCI/CD実行が約14分かかり、主にRustコンパイル時間が原因でした。
これらの痛点から著者はアプリケーションをNode.jsへ移行し、現在のRust実験を終了しました。今後はフルスタックウェブ作業にはNode.jsを使用しつつ、CPU集中的または非可視化サービスでは安全性と性能が価値を提供するRustを保留して使う計画です。

本文

プリロール

私は9年生(高校に入る前年)だった頃、親友に学校のプログラミングクラブに一緒に参加しないかと説得されました。
最初は躊躇しましたが、やっと同意したものです。このことに心から感謝しています。

そこで私たちは Turbo Pascal を使って順を追ってパスカルを学びました。少しずつ変数・演算子・文字列操作・データ構造など言語の基礎を掴み、最終的には Conway の Game of Life を再実装するまでに至りました。
そして夏休みがやってきました。HTML(プログラミング言語ではない)以外で、パスカルは私が学び使った初めての本格的なプログラミング言語でした。

しかし長く続けることはありませんでした。夏休み後、高校に入って「ソフトウェア工学」コースを選択し C を学びました。パスカルと同様、基本演算子・文字列操作・メモリ確保・データ構造・そして

void *
まで段階的に進めていきます。
C に恋しました――メモリを正確に制御できること、変数を参照やポインタで渡せること、必要なときにだけメモリを割り当てられる点が好きでした。

さらに 3 年間勉強し、高校を卒業。C のスキルは向上し、PHP を学び、C++ にも手を出して、さまざまなプログラム(約 20 年前のものなので厳しく評価されるかもしれません)を作ってみました:BattleCity クローン、3D ソフトウェアレンダラー、IRC ボット、不完全だった OS カーネル、ゲームエンジン、OpenGL 用 TTF レンダラーなど。

高校卒業後は 2 年制の専門学校に入学し、実務的なソフトウェア工学の学位を取得しました。
1 年目と 2 年目の夏休みの間で選択肢がありました:マクドナルドで働くか(高校時代にアルバイト経験があるため)それともソフトウェアエンジニアとして仕事を探すか。

少し躊躇した後、履歴書を作成してオンラインで見つけたポジションへ送付しました。C/C++ 開発の役割を望んでいたにも関わらず誰も採用してくれませんでした。結局 PHP でウェブ開発の職に就きました――最初の雇用主に感謝します。
この頃が C や C++ を触る最後の機会でした。PHP、Python、Ruby のような動的高水準言語はウェブ開発に向いており、ハードウェアから最大性能を引き出す必要はほとんどありません。ボトルネックは CPU ではなくネットワークやディスクレイテンシです。

それでも C は私の心を離れませんでした。マイクロ最適化に没頭し、変数がいつ確保されるか、参照やポインタで渡す方法に腹を立てました。
その後 Rust が登場しました。


Rust でのウェブ開発

ほとんどのソフトウェアエンジニアは自分自身のゲームエンジンを作ることで学び始めます――ゲームエンジンを作ったことがなければ「ソフトウェアエンジニア」と呼べないでしょう。私は Rust に恋しました。

C は古く、ハイパー開発環境に追いついていませんでした:モダンツールチェーン、リンター、フォーマッタ、パッケージ管理など。
Rust は低レベルのメモリ制御とライフサイクルを提供しつつ、使いやすいコンパイラ、ビルトインリンター・フォーマッタ、現代的なパッケージマネージャーという両方の長所を兼ね備えていました。

コミュニティは Rust を愛し、言語自体も急速に成長しました。初めて低レベルシステムプログラミング言語でウェブアプリを書けるようになりました。

Rust の基礎を学びゲームエンジンを諦めた後、私は Rust でウェブアプリを作ることに決めました。2023 年末、完全稼働のウェブアプリを構築し、収益化も達成しました――すべて Rust で実装です。

年々失敗から学び、進捗はここやここ、またここに共有してきました。最終的にはバックエンドが純粋な Rust、フロントエンドは静的生成された Astro ウェブサイトという Frankenstein のようになりました。
ある時点でメンテナンスや拡張が困難となり、Node.js へ全て移行し、Rust 実験を終了する痛みの決断をしました。

この決断は簡単ではありませんでした。Rust と共に作業することが好きで、その成果は多くのコネクションや二つのカンファレンスと一つのミートアップへの登壇機会をもたらしました。リスクを取った結果、私は満足しています――しかし…


Rust へ(今は)別れ

ポジティブな点は他の記事で十分に説明済みです(Building a web app in Rust, One year of Rust in production 等)。
今回は苦労した点を語ります―将来の自分へのリマインダーとして、また皆さんへの警鐘として。

私が共有する内容は「ソロ創業者でウェブアプリを構築・運用している」立場からです。動画処理や超低レイテンシといった Rust が得意な領域ではなく、データベース・ディスク・ネットワークがボトルネックになるケースが多いです。

私は十分に Rust に熟練しています。「Rust でウェブアプリを作ろうとしたけど借用チェッカーが分からない」と言うタイプではありません。では、始めましょう。


テンプレート

純粋な Rust + サーバーサイド生成テンプレート(Tera)から、Rust API サーバ+Astro 静的サイトへ移行しました。
理由は型安全なテンプレートに甘え過ぎていたためです。Astro では

.astro
コンポーネントを使って型安全に書けます。

TypeScript を推奨しているので、全てのテンプレートは型安全で、変数ミスや見落としがほぼありません。

interface Props {
    username: string;
    email: string;
}

export function UserCard(props: Props) {
    return (
        <div>
            Hello {props.username} ({props.email})
        </div>
    );
}

Tera、Handlebars、Mrml などのライブラリではビューはプロパティから分離されます。テンプレートでフィールド名を変更したらモデルも忘れずに変更する必要があります。
テストで解決できるものですが CI/CD の時間が長くなります。コンパイル時間については後述します。

テンプレート内の関数は文字列操作のワイルドウエストです――関数がないとリッチなテンプレートを作れません。
Maud や Askama などのライブラリは Rust マクロを使った型安全な HTML テンプレートで、コンパイル時に安全性を保証しますが、ビルドコストが高くなります。


ローカライズと国際化

2015 年からローカリゼーションについて語っています。Node.js には ICU 完全サポートと

Intl.*
API が組み込まれており、数値・リスト・通貨・国名などをフォーマットできます。i18next のようなライブラリなら翻訳の型安全なオートコンプリートも得られます――Rust では実現できませんでした。

確かに Rust は Mozilla が開発した Fluent 翻訳ファイルや最小限の数値フォーマッティングをサポートしています。
しかし Node.js のほうが完全にローカライズされたウェブアプリを構築するために必要なものすべてを提供します。Rust で i18n が不足していることはよく知られています(AWWY: Internationalization を参照)。ICU4C バインディングは進行中ですが、Node.js のレベルには到底及びません。


ウェブは本質的に動的

ウェブの仕事はほとんどがデータベース・Redis・外部 API・テンプレートエンジン間でのシリアライズ/デシリアライズです。
Rust の

serde
は最高級の (de)serialization ライブラリですが、安全性のために
.unwrap()
を避けるボイラープレートを書かなければなりません。
結果として長いチェーンの
.ok_or
.map_err
が増え、カスタムエラー列挙型を多数定義します。

SQL についても同様です。私は

sqlx
(コンパイル時にクエリチェック)を使うことに満足していました。マクロに頼ることで実際のデータベースインスタンスでクエリが検証されます。しかし動的クエリを書くときは、コンパイル時にチェックされたまま文字列を構築できないため、非チェック SQL クエリへと陥ります。

Node.js では

kysely
を使うことで、データベース接続やビルド時間のオーバーヘッドなしに動的クエリを作成できます。類似した結果が得られます。


コンパイル時間

Rust は安全性を犠牲にしてコンパイル時間が長くなることがあります。近年のハードウェアなら許容範囲ですが、インクリメンタルコンパイルでも影響は大きいです。
クレート数やマクロ使用量が増えるほどビルド時間は遅くなります。

CI/CD では専用 VM(Intel Core i5‑7500, 32 GB RAM)で動かしています。プッシュから master へのデプロイまで約 14 分(うち Docker ステージとコンパイルに約12分)。キャッシュ無しだと 20–25 分。テストや Clippy は含まれていません。

対照的に Node.js は平均 5 分(リンティング・テスト込み)で済みます。Node.js に移行した後、別のバックオフィスサービスを追加してコード量が増えましたが、3 倍速くデプロイでき、CI/CD でもテストとリンタは実行しています。


エコシステムの成熟度

Rust は全体として非常に成熟したエコシステムですが、ウェブ分野では遅れています。
珍しいサードパーティ API が必要な場合、存在しないことが多いです。その結果、ビジネスロジックではなく API 実装を自前で行う必要があります。

Node.js は十分に機能します。
人々は Node.js や npm を批判し、「JavaScript に根本的な欠陥がある」と主張しますが、実際には経験と痛みを通じて学ばれるクズレのようです。Rust の

Result
Option
match
・enum は好きですが、Node.js エコシステムは成熟しており、ウェブアプリに十分安定しています。

Zod でリクエスト/レスポンス JSON を検証し、Kysely, @kitajs/html, 自作の @mjmx/core が型安全な SQL・HTML・MJML を提供します。async/await は Rust より Node.js の方が使いやすく、トレイトに async メソッドを持たせるには

async-trait
が必要です。

まだ課題は残っています:CommonJS から ESM への継続的な非推奨、ESLint と Prettier の面倒な設定(Clippy で一括提供できる多くのプラグインを扱うため)など。ワークスペースは解決されていません—pnpm は npm より優れていますが、Cargo のワークスペースには遠く及びません。TypeScript 実行時(ts-node, tsx, tsm など)は混乱を招きます。

snake_case が最も読みやすく美しいとみなされることに皆同意できれば幸いです――JavaScript の camelCase は嫌いです。


終わりに

ソロで作業するのは大変です。
ソフトウェアエンジニアとして 10 個以上、起業家として数十個もの役割を同時に担います。

Rust を成功させたかったが、前進しなければならず、Sentry のバグを無視して長いコンパイル時間を回避しました。機能開発は遅くなるため、バックエンド REST API とフロントエンドの同期やテンプレート内変数変更時に全ページを再テストする手間が増えました。

私はチームやコードレビュー担当者がおらず「贅沢」な存在です。Rust は非可視的な作業(テストを書いて検証)で優れていますが、UI を開発するときはリコンパイル待ちやビューに渡す変数の誤りを心配する必要があります。

純粋 Rust から Rust + 静的 HTML + Alpine に移行しました。メールテンプレートを安全にしたいなら Node.js で専用メールサービスを書いて react.email(または自作 @mjmx/core)を使えば、より型安全が得られます。これは後退感がありますが、Rust のモノリスを壊し、ダイナミック言語で書き直すことでウェブに適した環境になりました。

Node.js は完璧ではありませんが、一つのスタックで、むしろ Rust より多くの型安全性(実際には JavaScript は動的ですが、ビューとモデルを同期させる手間はなくなります)が得られます。翻訳キーのミスもなく、メールテンプレートに「Hello {{dearCustomer}}」が残ることもありません。

多くの問題は「動的なもの」に集約されます:テンプレート、i18n、SQL。もし今日 API サービスを書かなければならないとしたら、やはり Rust を選ぶでしょう――API にはビューや翻訳を扱う必要がないからです。ORM は好きではなく、

sqlx
以外で良い型安全クエリビルダーが不足しているように感じます。

また、小さなフットプリントも恋しく思います:Rust コンテナは 60–80 MB の RAM を使用しますが、Node.js バックオフィスは負荷なしでも少なくとも 117 MB です。

結局のところ、「仕事に合ったツールを選ぶ」ことが重要です。
CPU 集中型タスクであれば Rust は輝きます。それ以外では—今はさようなら Rust と言いたいです。


Go もありますが、実際に Go を好きになれた機会はありませんでした。

同じ日のほかのニュース

一覧に戻る →

2026/02/20 0:19

「Gemini 3.1 Pro」 (そのままカタカナ表記で)

## Japanese Translation: > **Gemini 3.1 Pro** – Google の最新 AI モデルで、複雑なタスクに対する高度な推論を目的として設計されています。 > > • **パフォーマンス:** ARC‑AGI‑2 ベンチマークで 77.1 % を達成し、Gemini 3 Pro のスコアの 2 倍以上となり、推論能力が大幅に向上したことを示しています。 > > • **新機能:** > – テキストプロンプトからウェブサイト用の高解像度アニメーション SVG を生成し、スケーリングもクリスプでファイルサイズも小さく保ちます。 > – 複雑な API をユーザーフレンドリーな設計に統合(例:国際宇宙ステーションのテレメトリを表示するライブ航空宇宙ダッシュボード)。 > – 手入力追跡と生成音声が連動した、操作可能なスターリング・マルミュレーションなどのインタラクティブ 3D エクスペリエンスをサポートします。 > – 文学的テーマを機能的コードに変換し、エミリー・ブルントー風のポートフォリオウェブサイトで実証されています。 > > • **入手可能性:** 現在はプレビュー版です。検証とさらなるエージェンシーワークフローの進化後に一般公開されます。 > – 開発者は Gemini API、Google AI Studio、Gemini CLI、Antigravity、Android Studio、および Vertex AI を通じてアクセスできます。 > – 企業は Vertex AI または Gemini Enterprise を介して統合できます。 > – Gemini アプリでは、Google AI Pro/Ultra プランのユーザーがより高い使用制限を受け取り、NotebookLM は Pro/Ultra ユーザーに限定されます。 > > • **開発背景:** 11 月の Gemini 3 Pro 発表以来、ユーザーフィードバックによる迅速な改善が進み、このプレビューリリースにつながりました。

2026/02/20 4:42

**マイクロペイメント:ニュースサイトにとっての現実的検証**

## Japanese Translation: **改善された要約** マイクロペイメントは、購読モデルを損なうことなく分散したニュース消費を収益化する方法として出版社に提供されます。代わりに広告収入の乗数効果として機能します。支払履歴は、本物の人間のエンゲージメントを独立して証明し、広告主の信頼性を高めます。モバイルアプリ内購入(IAP)は、二段階通貨交換が小額支払いを受け入れやすくすることを示しています。約80 % のモバイルゲーマーはゲームをプレイしながら IAP を行っており、マイクロペイメントの実用的な市場シェアを示唆しています。出版社は「パブリッシャコイン」をサブスクライバー向けのボーナス機能として導入でき、それが非サブスクライバーにも拡散されます。これは、習慣を形成するために無料コインを配布するゲームメカニクスと同様です。 正当なサイトは、広告主が AI 主導の帰属推定やビッグテックの不透明なレポートに対してますます懐疑的になる中で、信頼できる人間観客指標を必要とします。広告主 ROI はビッグテック評価の上昇とともに低下し、ランダム化実験は広告効果の因果関係を証明する唯一の確立された方法です。ビッグテックは W3C 承認済みのブラウザ内帰属システムを推進しており、これがブラウザベンダーに測定を集中させる可能性があります。これは、独立したサイトが自らの利益と合致しない場合、不利になる恐れがあります。 ビッグテックデータフローへの過度な依存を避けるため、正当な出版社は迅速に代替帰属手法(例:「rickcentralcontrolcom/geo-rct-methodology」)を採用する必要があります。統一されたマイクロペイメントプラットフォームは、複数の同意ダイアログ、メール登録、および通知プロンプトを排除し、ユーザーにかかる負担を軽減できます。 この記事ではさらに業界全体の動向にも言及しています:チャイニーズオープンソース AI の採用率(約80 % が中国モデルを使用)、プライバシー懸念から内蔵 AI 機能を禁止する EU、デジタルコンテンツ配信を規制する EPIC の年齢適切設計法案など。

2026/02/20 0:54

**Show HN:** *Micasa – ターミナルからあなたの住まいを追跡する*

<|channel|>final <|constrain|>## Japanese Translation: **Micasa**は、ホームオーナーが家のメンテナンスに関するすべての側面(タスク・プロジェクト・インシデント・機器・ベンダー・見積もり・ドキュメント)を単一のローカルSQLiteデータベースで管理できる、軽量で端末ベースのUIです(クラウドやサブスクリプションは不要)。 自動的に期日を計算し、設計図から完成までプロジェクトを追跡し、見積もりを横並びで比較し、保証とインシデントの詳細を記録し、ベンダー情報を保存し、ファイルを直接レコードに添付します。 インターフェースは完全にキーボード駆動で、Vimスタイルのモーダルナビゲーション、ファジー検索、ソート、列非表示、関連レコードへのドリルダウンが可能です。ヘルプ画面からフルキー绑定参照を確認できます。 Micasaは、家のメンテナンス管理に使われる物理的なショーボックス・バインダー・付箋紙を置き換えます。そのデザインはVisiDataのモーダル操作モデルからインスパイアされています。 Goでのインストール(`go install github.com/cpcloud/micasa/cmd/micasa@latest`)またはバイナリ(Linux、macOS、Windows;amd64 & arm64)のダウンロードによりセットアップできます。クイックスタートコマンドには `micasa --demo`、`micasa`、および `micasa --print-path` が含まれます。 アプリはすべてのデータを単一のSQLiteファイルにローカル保存し、`cp` で手動バックアップが可能です。 ## Text to translate (revised for completeness and accuracy):** > **Micasa** is a lightweight, terminal‑based UI that lets homeowners track all aspects of home maintenance— tasks … (the rest)