本記事では僕が個人開発で作ったサービスのひとつを紹介します。
僕の個人開発サービスは、2009年に個人開発で開発・ローンチして今年で10年になります。
初期の開発にかかった時間はおおよそ1人月ぐらいです。
その後、色々と改修を繰り返しているので総工数は不明ですが、10年で6人月も使っていないと思います。
当時作った時はこんなにも長く使われるサービスになるとは思いませんでした。
しかし、10年経った現在でも使われているサービスということは、僕に揺るぎない自信を持たせてくれます。
本記事の内容
- 僕が個人開発したサービスの紹介
- PVと収益の公開
- 使っている技術
- どのように運営しているか
- 個人開発で得たモノ・失ったモノ
個人開発をしたことある方もない方も、現役プログラマーの方も今からプログラマーを目指す方も、この記事を読んで少しでもノウハウを吸収していただいて、自分の個人開発に役立ててもらえれば幸いです。
サービスのページビューと収益の公開
本記事の信憑性を示すために、10年で積み上げた数字を紹介します。
ページビュー
集計期間は2009年6月1日〜2019年4月28日
PC版・スマホ版合計 589,705,724PV
ガラケー版 20,144,870PV
合計 609,850,594PV(約6億PV)
一時期は月間1,000万PVを超えていたのですが、Google先生のアップデートに伴って少し落ちました。
しかし、今でも月間700万〜800万PVは保っています。
収益
10年間トータルで4,000万円以上の広告売上を出しています。
今は月に50万円、多いときで100万円ぐらいの売上が発生していますが、最初の3年ぐらいは冗談抜きで数千円のレベルでした。
そこから少しずつPVが増えていって今の売上にたどり着きました。
こちらも信憑性を示すために詳細を公表します。
(クライアント様に迷惑がかからないように社名はぼかしを入れてあります)
昔のデータを持ってきても意味が無いので2018年のデータを公表します。
これを見ると2018年だけで700万円の売上が発生しています。
10年の合計金額は4,000万円を超えています。
どんなサービスか?
「2ちゃんねる勢いランキング」という名前のWebサービスです。
(もしかしたらご存知の方もいるかも知れません)
2ちゃんねる勢いランキング
https://www.ikioi2ch.net
サービス内容は、2ちゃんねる(現在は5ちゃんねるですが表記を統一するために以下2ちゃんねると表記します)の、各スレッドへのレスの書き込みスピードを計算して「勢い」を算出してランキング形式で表示しています。
「勢い」の計算式は以下です。
勢い=レス数÷スレが立ってからの分数×60×24
なぜこのようなサービスを開発したのか
自分が欲しかった
10年前、当時の僕はいわゆる「にちゃんねらー」でした。
主にVIP板と狼板に出没してはクソスレを量産しながら「2ゲット!」などとのたうちまわっていました。
当時は2ちゃんねるの閲覧には「OpenJane」という専用ブラウザをパソコンで使うのが主流でした。(スマホはまだまだ主流ではありません)
OpenJaneではスレッドのソート機能があり、その中で「勢い」でソートする機能がありました。
つまりこの時点で「2ちゃんねるの勢い」という概念は既にあったということです。
しかし、OpenJaneでは板ごと(VIPとかなんJとか)で勢いをソートすることはできましたが、2ちゃんねる全体の勢いを見ることはできませんでした。また、専用ブラウザという特別な環境でしか見ることができず、通常のWebでは見られません。
「これをWebサービスにすれば需要があるかも知れない。というか自分が見たい」
このようなきっかけで開発が始まりました。
自分のスキルを試したかった
実装した時は1人でサービスを一気通貫で作るのは初めてでした。
元々DBを含むサーバサイドや、JSPとかのフロントエンドのプログラムは組めたのですが、ちょうどそのころ仕事でLinuxに触れる機会があってLinuxコマンドやApacheの設定方法を覚えました。
その時に「これって1人でサービス作れるんじゃね?」と思ったのがきっかけでした。
利用している技術(とバージョン遍歴)
- 言語
- JDK1.5 -> 1.7 -> 9.0
- フレームワーク
- MVC
- Struts
- O/Rマッパー
- iBatis
- MVC
- フロントビュー
- HTML,CSS,jQuery
- JSP
- サーバ構成
- CentOS 6.x系混在
- サーバ6台構成
- さくらのクラウド
- 本番Webサーバ×1
- 本番DBサーバ×1
- 本番バッチサーバ×1
- STG用Web/バッチサーバ×1
- STG用DBサーバ×1
- デプロイ/Jenkins稼働サーバ×1
- さくらのクラウド
- ミドルウェア
- Webサーバ / Appコンテナ
- Nginx 1.14.0 -> 1.16.0
- Apache 2.4
- Tomcat 6.0 -> 9.0
- Squid
- Webサーバ / Appコンテナ
- Database
- MySQL5.1 -> MariaDB 10.0.19
- バージョン管理
- SVN -> Git(ホストはGithub)
- 形態素解析
- Sen
- 全文解析
- MariaDBのFULLTEXT INDEX
- ビルド
- Ant -> Gradle
- CI
- Jenkins
- IDE
- Eclipse -> IntelliJ IDEA
こうやって見ると枯れた技術が多いですね。
(枯れたどころか土に還った技術もチラホラ…)
要件定義
このサービスでやること
- スレッドの勢いを計測してDBに保持する
- ランキング形式で見られるようにする
- そのまま2ちゃんねるに遷移してスレッドを閲覧できる
このサービスでやらないこと
- 2ちゃんねるのスレッドのレスの保持
- あくまでも勢いを計測するだけであって、過去ログを保持することはしない
- 2ちゃんねるの規約に触れることになる
- 2ちゃんねるへのリファラとして機能することが当サイトの意義
- ユーザーが「お、このスレッドの勢いが高いな、どれどれ見てみよう」と本体へ誘導できればWin-Winの関係でいられる
- レスを取得すると2ちゃんねるの負荷がかなり増大する
仕様
(この辺りは難しいと思う方は読み飛ばしてもらっても構いません)
技術的には何も難しいことはしていません。
なぜなら当時の自分にはそんなに難しいことをする技術もなかったからです。
2ちゃんねるをスクレイピングして勢いを算出
基本的にやっていることはスクレイピングです。
当時はJavaでいい感じのスクレイピングのライブラリが無かったので、全て自作でロジックを組みました。
(現在は5ちゃんねるのスクレイピングはホワイトリストに登録された接続元IPからしか出来ない可能性が高いです)
板一覧URLの取得
まず2ちゃんねるの全ての板と、板ごとのURLを取得します。
これはトップページのメニューを取得してスクレイピングすればOKです。
http://menu.5ch.net/bbsmenu.html
例えば以下のようになります。
<br><br><B>ニュース</B><br>
<A HREF=http://headline.5ch.net/bbynews/>速報headline</A><br>
<A HREF=http://hayabusa9.5ch.net/news/>ニュース速報</A><br>
<A HREF=http://asahi.5ch.net/newsplus/>ニュース速報+</A><br>
以下延々と続く
<br><br><B>ニュース</B><br>
がカテゴリ、<A HREF=http://headline.5ch.net/bbynews/>速報headline</A><br>
が板になります。
板名と、板のURLと、その板がどのカテゴリに属するのかぐらいの情報をDBに保持してあげます。
板ごとのスレッド情報の取得
先ほど板と板URLを取得しました。各板URLにはsubject.txt
という、スレッド一覧情報が書かれたtxtが存在しているのでスクレイピングします。
例えばなんJのsubject.txtは以下になります。
http://hayabusa9.5ch.net/news/subject.txt
1554015610.dat<>【廃線】西武ファン集合 (71)
1554015892.dat<>【悲報】雨さん、降ってしまう (2)
1554012841.dat<>彡(^)(^) 「食べ放題きたで!」店「まずお通し食ってから料理注文してや」彡(^)(^) 「ん?」 (423)
各表記には以下の意味があります。
- 1554015610.dat
- スレッドとレス本体のファイル名。拡張子はdatで中身はテキストファイル
- 数字はスレッドが作成されたUNIX timeを表している
- datの数字を見ればスレッドが作成された日時が分かるので、スレッド本体を見に行かなくてすむ=2ちゃんねる本体への負荷を軽減できる
- 【廃線】西武ファン集合
- スレッド名
- (71)
- スレッドに現在書き込みまれたレスの数
つまりこれだけの情報があれば、スレッドのレスの勢いを算出できる仕組みになっています。
勢いの算出
まずUNIXtimeを日時に変換します。
※以下、特に記載が無い限り全てJavaでのコードです
Date regDate = new Date(datNo * 1000);
スレッド作成日時とレス数を元に、勢いを算出します。
// 勢い=レス数÷スレが立ってからの分数×60×24
double progress = ((System.currentTimeMillis() / 1000) - datNo) / 60;
double ikioi = resCount / progress * 60 * 24;
あとはこの勢いの値をDBへ保持してあげるだけです。
これを定期的にバッチで実行します。
スレッドへのリンクURLの作成
各スレッドの勢いが算出できたのであとはフロントで表示します。
この辺りのロジックは特に難しいことは無いので割愛します。
開発言語、利用技術の選定
- 当時の自分はJavaで書くのが一番速かったのでJavaを選定
- DBは使い慣れたMySQLを選定
- OSは仕事で普段からRed Hatを使っていたのでCentOSを選定
選定基準はとにかく自分の中で一番得意で速い技術です。こういった理由でフレームワークやWebサーバーなどを選定していきました。
個人開発:実装開始からサービス公開まで
個人開発の孤独と引き換えに得た決定権
1人でサービスを開発するのは孤独でした。
しかし孤独と引き換えに「何をしてもいい、新しいことをする時も誰にも相談しなくてよく、全ての決定権が自分にある」という経験を得たことはとてもエキサイティングでした。
おにぎりとコーヒーを吸収してコードを生み出すマシン
開発は2009年のゴールデンウィークを全部潰しました。
コンビニでおにぎりを大量に買いだめして、お腹が空いたらおにぎりを2つほど食べながら実装。お腹が落ち着いたら開発を再開。
そうするとまたお腹が空いてくるのでまたおにぎりを食べる。
ボトルで買い込んでいたコーヒーはみるみるうちに消費されていきます。
ひたすらおにぎりとボトルのコーヒーを吸収しながらコードを生み出すマシンと化していました。
睡眠はどうだったかと言うと、眠くなったら寝ます。
だいたい朝方ですがきちんとベッドに入って就寝します。
特に目覚ましはかけませんが、実装の方法が気になって3時間ぐらいで目が覚めます。
そしたらまたパソコンに向かっておにぎりとコーヒーを吸収しながらコードを書きます。
ひたすらこれを繰り返していました。
初期のサーバーは家プレ
2009年当時は、AWSに代表されるIaaS(クラウドサーバー)のサービスもまだほとんど無く、あったとしても利用料はかなり高額でした。
そこで自宅サーバーです。
サーバーをデータセンターに置いてホスティングしてもらうことを「オンプレミス(オンプレ)」と呼びますが、それにかけて家にサーバーを置くことを「家プレミス(家プレ)」と呼んでいたりしました。
そして外部にサービスを公開するたまにはグローバルIPアドレスは固定でないといけないので、プロバイダと契約して固定IPを1つ契約しました。
DDNSはめんどくさかったから…
サービスローンチ(リリース)
いよいよリリースです。
当時はWindows機で開発していたので、いざ本番環境のCentOSへデプロイしたら、やれ環境変数がどうのとか、ほれクラスパスがどうのとかでサービス起動まで持っていくだけで一苦労でした。
その後も沢山のエラーとか、メモリリークしていきなり落ちるとかを1日に何度も繰り返します。
安定するまで1ヶ月ぐらいかかった記憶があります。
サービス開始から運用フェーズへ
ある程度安定してくると次は保守・運用フェーズに入ります。
サービスをさらによくするために様々な改修を入れます。
その中でも大きめだった改修をいくつか紹介して解説します。
スレッドタイトルを形態素解析する
形態素解析を使ってスレッドタイトルを解析する改修です。
これは、スレッドタイトルを形態素解析にかけて、名詞のみを抽出して「話題のワード」を作成する機能です。名詞のリストはWikipediaの記事タイトルを取得しています。
この機能は今でも現役で動いています。
抽出した話題のワードを独自のスコアに基づいてランキング付けして、検索リンクにして内部リンクを発生させることでSEOに役立てるというテクニックです。
これに2009年のシルバーウィークを全て使いました。
またおにぎりとコーヒーを吸収しながらひたすらコードを生み出すマシンになった時でした。
Nginxの導入
僕のサービスには、一番同時接続が増える瞬間が1年に2回あります。
それは、AKB総選挙の1位発表の瞬間と映画「天空の城ラピュタ」のバルスの瞬間です。
この時は同時接続数が1,500ぐらいまで上がり、当時のApache+Tomcatの構成では耐えられずダウンしていました。
そこでリバースプロキシとしてApacheの前にNginxを一枚立てて、静的コンテンツはNginxで返し、Java側へ行くリクエストだけApache -> Tomcatで処理するようにしました。
これが功を奏して、それ以来サーバーダウンすることが少なくなりました。
SEOで気をつかった点
上述した形態素解析以外は、普通にHTMLの構成の仕方に気をつけたぐらいで、特別なSEOはしていません。
スマホ最適化を実装したのは2014年ぐらいでした。
これは効果があり、スマホアクセスの1人あたりPVが2.5倍ぐらいになりました。UIが最適化されると回遊性が向上するよい例だと思います。
モチベーション管理
モチベーションの管理はそこそこ苦労しました。
とにかく途中で「こんなサービス誰がつかうのだろう…」としょっちゅう思います。これは個人開発あるあるです。
モチベーション管理についてはこれだけで記事が書けます。
なので書きました。
よろしければご覧ください。
サービス公開で得たモノ・失ったモノ
得たモノ:個人開発したサービスをリリースと運用しているという実績と評価
「個人開発サービスをやってるってすごいですね」とよく言われます。
実際やってみると時間はかかるし、ある程度の根気は必要ですがそこまで難しいことではありません。
開発したサービスの人気があるかどうかは別にして、リリースした実績と、ある程度の期間(最低1年以上)運用していることを人は評価します。
これは断言できます。
大事なのはPVや収益だけではありません。
もう一度言います。
実際にリリースすること、そして運用を続けることに対して人は評価します。
得たモノ:フルスタックエンジニアとしてのスキル
最近はあまり聞かなくなったフルスタックエンジニアですが需要はまだまだあります。
要件定義、設計、実装、テスト、ネットワーク、インフラ、DB周りから何から何までできる、ジェネラリストなエンジニアに対して「フルスタックエンジニア」と呼称します。
僕はこれに加えて、SEOと、データを元にしたマーケティングと、商品企画と、システム保守運用と、プロダクト改善と少しのデザインができます。
これらはほとんど個人開発で得て培ったスキルです。
しょせん個人開発で身につけたスキルなんて、業務で役に立たないのではないか、と思われる方もいるかも知れません。
しかしこれは間違った考えです。
個人開発であっても、一度でも経験したことがあればその仕事はある程度できます。
特に人数が少ないベンチャー企業では、1人で何役もの仕事をすることはザラです。
別にスペシャリストでなくてもよいのです。
業務が発生して出来る人が社内にいなければ「SEO少しかじった程度ですけどやりたいのでやらせてもらえますか」と提案することができます。
実際に僕はこれで色々な仕事を担当してスキルを磨きました。
この積み重ねで強いエンジニアに成長するのです。
得たモノ:勢いという概念に市民権を与えた話
2ちゃんねるの勢いという概念は、僕がサービスを作る前からありましたがポピュラーではありませんでした。
しかしある時期を境に「このスレ勢いすげーwww」というような書き込みがよく見られるようになりました。
それがこのサービスをリリースして認知されてきた2009年10月辺りなのです。
それを示すグラフがあります。
ある語句のGoogleでの検索ボリュームを調査できる「Googleトレンド」というGoogleが提供しているツールでの「2ちゃんねる 勢い」の調査結果です。
サービスを作ることにより、一つの概念に市民権を与えることができた
これはかけがえのない経験と実績になりました。
失ったモノ:ありません
断言します。
個人開発で失うモノはありません。
強いて言うならせいぜい使った時間と、遊びの誘いを断った友達ぐらいです。
時間は投資だと思いましょう。引き換えに最高の経験とスキルを得ることができます。
友達は諦めましょう。
別に1年以上に渡ってずっと断る訳ではありません。せいぜい1ヶ月〜3ヶ月ぐらいです。
その間、誘いを断って二度と誘いの声がかからなくなったとしてらそんなものだったと諦めましょう。
本当の友人であれば3ヶ月経った後でも誘ってくれます。
その代わり、自分の中での繁忙期が過ぎたら自分から誘うなどのケアは忘れずにしましょう。
まとめ
以上、長々となりましたが個人開発のサービスの紹介をしました。
個人開発は簡単ではありません。様々な機能横断的なスキルが求められます。
しかし、その時知らなくても調べて勉強して習得すればよいのです。
モチベーションの管理が大変な時もあります。
どの言語を選択するかで悩む時もあります。
個人開発独特のナレッジが必要になる時もあります。
そういった悩んだときの考え方や、ナレッジをこのブログで少しずつ共有していきます。
僕の夢は、一人一人のプログラマーやエンジニアが個人開発でサービスを持つことを応援することです。
僕自身、10年前に個人開発をしていなければ今の自分はありませんでした。
9年前に入社した当時の会社は、僕の個人開発を評価して採用してくれました。
(今は退職して独立しています)
人生を変えてくれた個人開発をもっと沢山の人に経験してほしい。
個人開発をする・したい全てのエンジニアの、そんな方の背中を押せる存在でいられるように。
もしも、あなたが個人開発でサービスをリリースしたらTwitterで教えてください。
すぐに見に行きます。実際に使います。感想を書きます。
僕はあなたが個人開発で作ったサービスを見たいです。
それではよい個人開発ライフを!