【ITニュース解説】I built a habit tracker where the web server, routing and HTML rendering are all written in COBOL
2026年10月27日に「Reddit /r/programming」が公開したITニュース「I built a habit tracker where the web server, routing and HTML rendering are all written in COBOL」について初心者にもわかりやすく解説しています。
ITニュース概要
COBOLだけでWebサーバー、ルーティング、HTML生成を行う習慣トラッカーアプリが開発された。NodeやNginx、JavaScriptなどの一般的なツールを使わず、COBOL単体で全て処理。古い言語でも現代的なWebアプリが動くか試す実験的な取り組みだ。
ITニュース解説
このニュースは、古くから使われているプログラミング言語COBOLを使って、ウェブサーバー、URLの振り分け、そしてウェブページの表示に必要なHTMLの生成といった、ウェブアプリケーションの根幹となる部分をすべてゼロから作り上げた習慣トラッカーというアプリについてのものだ。通常、現代のウェブアプリ開発では、Node.jsやNginxのような専門のツールを組み合わせて使うことが多い。しかし、このプロジェクトではそれらのツールを一切使わず、COBOL単体でどこまでできるかを試すという、まさに挑戦的な実験を行った。
ウェブサーバーとは、インターネットを通じて送られてくるリクエスト(たとえば「このウェブページを見せて」という指示)を受け取り、それに応じた情報(ウェブページの内容など)を返す役割を担うプログラムのことだ。通常、ウェブサーバーを構築するには、NginxやApacheといった専用のソフトウェアを利用する。だが、この開発者はCOBOLプログラムに、オペレーティングシステム(OS)が提供するネットワーク通信の基本的な機能(C言語の標準ライブラリlibcにあるsocket、bind、listen、acceptといった関数)を直接呼び出させることで、独自のウェブサーバーを実装した。これは、OSと直接会話して「ここでネットワークからの接続を待ちます」「接続があったら受け入れます」と指示しているようなものだ。
さらに、ウェブサーバーには複数のユーザーからのリクエストを同時に処理できる能力が求められる。ウェブブラウザの一つであるSafariは、実際にデータを送る前に、あらかじめ複数の接続を開いておくことがある。もしサーバーが一度に一つのリクエストしか処理できない仕組みだと、Safariが事前に開いた接続でデータを送ってこない場合、そのサーバーは他のリクエストを処理できずに止まってしまう。これを避けるため、このCOBOL製サーバーは、新しい接続があるたびに「プロセスをフォークする」という仕組みを採用した。プロセスをフォークするとは、現在のプログラムのコピーを新しく作り出し、それぞれが独立して動作するようにすることだ。これにより、たとえSafariが接続を先に開いてデータを送ってこなくても、サーバー全体が停止することなく、他のユーザーからのリクエストを並行して処理できるようになった。
次に、ウェブアプリにおける「ルーティング」という機能について見てみよう。ルーティングとは、ユーザーがアクセスしたURL(たとえば/homeや/settingsなど)と、その際に使われたHTTPメソッド(情報を取得するGETや、情報を送信するPOSTなど)に応じて、プログラムのどの部分を実行するかを判断し、適切な処理へと振り分ける仕組みのことだ。この習慣トラッカーでは、COBOLのEVALUATEステートメントという命令を使ってルーティングを実現している。これは他のプログラミング言語におけるswitch文に似ており、「もしURLがこれこれのパスで、HTTPメソッドがこれこれだったら、この処理を実行せよ」といった具合に、柔軟に処理を切り替えられるようになっている。
ウェブページをユーザーのブラウザに表示するためには、HTMLという形式でページの構造や内容を記述する必要がある。このプロジェクトでは、COBOLプログラムが直接HTMLを生成する「サーバーサイドレンダリング」という方法を採用している。具体的には、COBOLのSTRING ... WITH POINTERという命令を使い、HTMLの各部品(ヘッダー、フッター、コンテンツなど)を文字列として組み立てて、最終的なHTMLファイルを生成している。
ウェブアプリを開発する上で、セキュリティは非常に重要な要素だ。特に、ユーザーが入力した情報をそのままウェブページに表示すると、悪意のあるプログラムコード(たとえば<script>alert(1)</script>のようなJavaScriptコード)が埋め込まれてしまい、他のユーザーのブラウザで実行されてしまう可能性がある。これを「クロスサイトスクリプティング(XSS)」と呼ぶ。この習慣トラッカーでは、ユーザーが入力した内容をウェブページに表示する前に「HTMLエスケープ」という処理を行っている。HTMLエスケープとは、特殊な意味を持つ記号(例えば<や>など)を、単なる文字として表示されるように別の記号に変換する処理のことだ。これにより、たとえユーザーがscriptタグを含む文字列を入力しても、それは実行可能なコードとしてではなく、ただのテキストとして安全に表示される。
このウェブアプリは、JavaScriptを一切使わずに動作している点も特徴的だ。現代のウェブアプリでは、ユーザーインターフェースの動的な変化やインタラクティブな操作を実現するために、JavaScriptが不可欠とされることが多い。しかし、この習慣トラッカーでは、すべてのボタンや操作を、ウェブの基本的な要素である<form method="post">というHTMLのフォーム送信機能で実現している。
フォームが送信されると、サーバーはユーザーからのデータを受け取って処理し、その結果をブラウザに返す。ここで重要なのが「POST/Redirect/GET」という設計パターンだ。ユーザーがフォームを送信(POST)した後、サーバーは直接ウェブページの内容を返すのではなく、303 RedirectというHTTPステータスコードをブラウザに送り返し、別のURL(この場合はルートパス/)へ移動するように指示する。ブラウザはこの指示に従って、新しいURLへGETリクエストを送信し、そのページの最新の内容を取得して表示する。この一連の流れにより、ユーザーがウェブページをリロード(再読み込み)しても、以前に送信したフォームのデータが誤って再送信されてしまうのを防ぐことができる。
ウェブアプリの外観、つまりデザイン(スタイリング)は、CSSファイル一つで実現している。たとえば、習慣の達成度を示すプログレスリング(円形の進捗バー)は、conic-gradientというCSSの機能を使って描かれている。また、各習慣の色はcolor-mix()という機能で生成されており、これらも現代的なCSSの表現力を示している。
アプリが扱うデータは、特別なデータベース管理システムを使わず、2つのテキストファイルに保存されている。データは「固定長レコード」という形式で整理されており、各データの項目が常に決まった文字数(バイト数)を占めるように記述されている。これは、昔からCOBOLが得意としてきたデータ管理の方法だ。日付の処理に関しては、COBOLが持つINTEGER-OF-DATEという機能を利用している。開発者自身も、このCOBOLの日付処理機能は、JavaScriptのDateオブジェクトに比べて非常に使いやすいと評価している。
この習慣トラッカーは、コメントを含めても約650行という比較的短いコードで実装されている。そして、JavaScriptを使っていないにもかかわらず、ページのリロードは非常に高速で、ユーザーはほとんど遅延を感じないという。
ただし、開発者も明言しているように、これはあくまで技術的な「実験」であり、実際のビジネスや大規模なシステムで運用することを想定したものではない。そのため、macOSでしか動作しない、自分のパソコン内(localhost)でしかアクセスできない、そして最大100個までしか習慣を登録できないといった固定された制限がある。
このプロジェクトは、COBOLのような非常に歴史のあるプログラミング言語でも、ウェブサーバーの構築からページのレンダリング、ユーザーインターフェースの基本的な操作まで、現代のウェブアプリの基盤となる多くの機能をゼロから実装できることを示している。これは、私たちが普段利用しているウェブサービスが、どのような基本的な技術の組み合わせで成り立っているのかを理解する上で、非常に興味深く、学びの多い事例と言えるだろう。古い技術から最新のウェブ技術まで、その根底にある原理は変わらないということを再認識させてくれる実験だ。