今年一年のアウトプットを振り返る

この記事は『[ラクス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rakus)』の15日目の記事です。

# はじめに
年末が近くなってふと今年一年を思い返すと社外でも割とエンジニアっぽいことやってきたなと思ったのでこの一年でやってきたことのご紹介をしようと思います。

ちなみに普段の仕事は最近『[データアーキテクト](https://speakerdeck.com/shinu/maemuki-data-seibinin01?slide=46)』と呼ばれているようなことをしています。
が、まだ浸透していない言葉なので『[データエンジニア](https://speakerdeck.com/shinu/maemuki-data-seibinin01?slide=44)』を自称しています。

ただ、この記事の内容は仕事とは直接関係ない『個人開発』に関する内容が多めです。
個人開発の進め方、技術書典で本を出した振り返りなどに興味がある方は楽しんでいただけるかもしれません。
技術書典の振り返りまでがこの記事の本編です。

# やってきたこと
この一年で社外向けに個人開発としてやってきたことを適度に分割してご紹介します。
思い返せば今年はずっと何かの〆切に追われる一年でした……。
来年は心穏やかにすごしたいです。

## 【1～5月】ボードゲームデザインのアシストツールを作ってリリースした
### 何をやったか
私は趣味でボードゲームを自費出版しています。
ゲームのルールを作るという活動はルールの組み合わせを何パターンも試行錯誤する必要がありとても大変です。
ルールを考える際にインスピレーションを与えてくれるようなツールが欲しいと常々思っていました。
海外のボードゲームデータベースサイト『[BoardGameGeek](https://boardgamegeek.com/)』ではゲームのジャンルやルールを細かく分類して各ゲームに対してタグ付けをしたり、ゲームの面白さを評価したりといったことがされています。
（[あるゲーム](https://boardgamegeek.com/boardgame/183394/viticulture-essential-edition)は『経済』『農業』といったジャンルに属し、『ハンド・マネージメント』『ワーカー・プレースメント』といったルールを持ち、10 段階評価は 8.1 である。とか）
ただし、このサイトは基本的にゲームを遊ぶ人向けのサイトのためジャンル・ルールそれ自体の平均評価などは見られません。
なので、データを集めて全体を俯瞰できるようなツールを作ろうと思いつき実際に作ってみました。
この思いつきでこの一年の活動の方向性がほぼ決まりました。今年一年のプライベートでの開発ほぼこのツール関連のことしかしていません。

実際にはできたブツは Superset という BI ツールで BoardGameGeek の色々なデータを可視化できる仕組みを作りました。
https://joururi-soft.com/ へアクセスし、以下の ID・パスワードで閲覧オンリーユーザーでのログインが可能です。

```
ID：DilemmaHoldem
Password：texasholdem
```

![分析結果全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/e7fdbbc8-03cf-8090-fde9-a44aec400446.png)
実際にサイト内で見られる可視化の例を挙げると、上の図はゲームのルールと評価の相関関係を示した図です。
横軸がルール名で縦軸が評価レートになっています。そして、各マスの色の濃さがそのルール・評価レートに該当するゲームの数になります。
この図を見たときに色の濃いマスが上に出ているほどそのルールを含むゲームは面白いということが示唆されます。
上の図の中の濃いマスが上に出ているルールで特に目立っているものををいくつかピックアップすると『アクションポイント割り当てシステム』『バリアブル・プレイヤー・パワー』『協力プレイ』というルールがいずれも評価レート "8" 付近が一番濃く出ており面白いと評価されているであろうことがわかります。
『ダイスロール』や『ハンド・マネジメント』も色は濃いのですが、単純に登録されているゲーム数が多いだけで評価も "6" 付近の色が濃いのでひとまずここでは除外。
![007_13_評価の高いメカニクス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/5b59d109-72e8-1889-ebdf-2a2c7ed84894.png)
この図で面白いと評価されているルールをゲームに組み込めば面白いゲームを作れるのではないか？　という仮説を立てられるためルール作りに一役かってくれそうです。

このツールを作る際に1～5月にやったことは概ね以下の通り

* 1月：作ろうと思い立ち[自社の開発サークル](https://qiita.com/advent-calendar/2019/ppap)の LT 会で『作ります宣言』をする
    * 手始めに逃げ道を塞ぎます。言ったからにはこのツールを作らないとダメな空気を自分の中に植え付けます
    * ちなみに当時はデータ集めて、問い合わせ用の API を作って、フロントも自分で実装しようとか考えてました
* 2月①：とりあえず独自ドメインを購入
    * 独自ドメインを買って逃げ道を塞ぎます。ツール作らないと無駄にドメインの使用量を払うことになります
* 2月②：データ収集バッチを作る
    * どんなツール作るにしてもデータは絶対に必要なのでとりあえず集める
    * BoardGameGeek は [XML API](https://boardgamegeek.com/wiki/page/BGG_XML_API2) が公開されておりサイト内の情報を XML で取得可能
    * Scala + PhantomJS で API を叩きまくって MySQL にデータを溜めるバッチ処理を作成  
      PhantomJS が開発終了していることはバッチを作り終わってから知った
    * データベース作ったからには最後までやらないと無駄になるという気持ちになる
    * ただし、この時点で API とフロントの実装は無理だと察して BI ツールの利用を検討しはじめる
* 3月：BI ツールを選定する
    * Redash、Metabase、Superset をネットで調べて比較してみる
    * Redash ほど SQL 依存ではなく可視化の種類の多い Superset を使うことに決める  
      今思えば Metabase の方がより使いやすかった気がする
    * システムの全体図は以下の通りに決定  
      ![全体図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/092a5431-88b3-1417-38d5-b496c354a655.png)
        1. バッチ処理で XML API 叩きまくって MySQL にデータ集めます
        2. Docker 上で動いている Superset と MySQL を接続します
        3. 利用者の PC から Superset にアクセスしてデータを可視化したり可視化結果を閲覧したりします
        4. 以上
* 4月：GCP の使い方を学んで GCE でサーバ構築を行う
    * アクセス数全然ない予定だったので一つのインスタンスに色々なミドルウェア全部乗ってます  
      （Nginx、Docker（Superset）、MySQL 全部乗せ）
* 5月：SSL 対応とか実際のデータ可視化とか細かい色々な調整をやって『[ゲームマーケット](http://gamemarket.jp/)』で制作者向けサービスとして発表した

### 身についた・使ったスキル
* 独自ドメインの購入のしかた
* Scala を使った XML のパース処理の実装
* 基本的な Docker コマンド
* Superset を使ったデータ可視化
* GCP の使い方（GCE インスタンス作成、ファイアウォールの設定、独自ドメインの振り方など）
* Superset、MySQL などのサーバ構築
* Nginx を使った SSL オフロード
* スケジュール的に無理な部分を切り捨てて代替手段を考える

### 感じたこと
率直な感想としては一人でサービス作るのめちゃくちゃ大変だなと感じました。
サービス本体は Superset に頼りましたが、食わせるデータや動かすためのサーバの準備は自力でやらないといけなかったので結構な労力でした。
加えて独自ドメイン振ったり、通信を SSL 化したりといった細々としたタスクも全部自分持ちだったのでそれらも対応していると意外と時間持っていかれると感じました。

今回作ったツールは作ることそれ自体は全く目的ではなく、『ゲームデザインを少し楽にする』ことが目的で、そのマイルストーンとしてゲームマーケットでのリリースを目指していたのでスケジュール的に無理な部分は積極的に切り捨てて代替手段を取りました。
当初自力で実装する予定だったデータ分析用の API 開発やフロント周りは全部 Superset で代替しました。サーバも本来であればミドルウェアごとに立てた方が良いのだと思いますが時間とお金の関係でひとつのサーバに全部乗せしました。
しかし、そのお陰で目指していたゲームマーケットでのリリースは無事達成できました。

一通り終わってみて感じるのは「個人開発ではどこを目指すかがブレると絶対に空中分解するだろうな」ということです。
今回の目的はあくまでも『ゲームデザインを少し楽にする』ことでした。API 作り、フロント周りの実装、ミドルウェアごとのサーバ構築辺りは自分のスキルアップとしてはすごく良いと思うのですが、これらも妥協せずやっていたとしたら私のスペックでは完全に手に余ってしまいリリースには漕ぎつけられなかったと思います。
なので、個人開発では目標地点は一点集中でそこに至るための道はある程度柔軟に妥協していく必要があると感じました。
一点集中したとしても全部自分でやるとなると嫌でも色々学ぶのでちゃんとスキルは身につきますｗ

### 次回への改善点
さんざん『ゲームデザインを少し楽にする』ことが目的と言っておきながら実はまだこのツールを積極的に使って作ったゲームは世に出ていません。
ツールを作ることと後述の技術書典で本出すことに力を注ぎすぎました。
加えて可視化の種類もまだほんの少ししかありません。

来年以降は

* データ可視化をもっと学び、ゲーム作りの際に仮説を立てるのに役立つデータを作る
* 作った可視化データをもとにゲームをデザインして世に出す

辺りが目標となります。

## 【6～10月】アシストツールを作るまでの内容を本にして技術書典で自費出版
### 何をやったか
上で作ったツールに関して何を血迷ったか本にまとめて技術書典に出展しようと思ってしまいました。
そして、実際に出版しました。

![【小】表紙1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/964d3226-2e70-e594-d0d8-27c8ffaa0c60.png)

* 技術書典 7 公式：https://techbookfest.org/event/tbf07/circle/5752136612708352
* とらのあな販売ページ：https://ec.toranoana.shop/tora/ec/item/040030776825
* BOOTH 販売ページ：https://joururi-soft.booth.pm/items/1572679

『データ可視化サービスをリリースするための道案内』というタイトルですが中身は MySQL サーバや Superset サーバなどの構築やファイアウォールの設定などインフラ周りのお題が多めです。でも実は私アプリのエンジニアなんです！

やったことの時系列的には概ね以下の通り

* 6月①：軽いノリで出展が決定  
  * ある日の社内サークル用 Slack にて……  
  ![2019-12-15_告知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/64ccaf9f-faf9-195f-749a-156739e0b950.png)  
  Aさん「技術書典っていうイベントあるよ！」  
  私「個人でサークル参加するかもー」  
  　数時間後……  
　![2019-12-15_申し込み完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151273/2e052815-31a3-593f-67f5-b445c07a4c4c.png)  
  私「サークル申し込みしてきた！」  
  という非常に軽いノリで参加を決めました。
* 6月②：本書く用のソフトについて調べる  
  * 「[Re:VIEW](https://github.com/kmuto/review)」というソフトが良いらしい
  * 改良版で「[Re:VIEW Starter](https://qiita.com/kauplan/items/d01e6e39a05be0b908a1)」というソフトもあるらしい
  リンク先の記事を読むと色々良さげだったのでソフトは決定しました。
* 7月：主に現実逃避  
  * この月は目次を考えるのと本文は 2 割くらいしか進捗がなかった気がします
  * あくまでも本文の進捗が 2 割くらいで本以外の諸々の準備は全く手をつけていない状態でした
  * あと、現実逃避で社内サークルの Slack に『@メンション + image + キーワード』って投げると画像投げ返してくれる bot 作ってました
  * この怠惰が翌月からの地獄のような日々を生み出します
* 8月前半：色々なことが同時並行で進行する
    * 原稿の執筆
    * 印刷部数の検討
    * 印刷所の検討  
      『[ねこのしっぽ](https://www.shippo.co.jp/neko/)』さんと『[日光企画](https://www.nikko-pc.com/index/top.html)』さんを比較検討しました。  
      料金（早割、通常それぞれ）、〆切、搬入サービスの有無、印刷オプション（表紙加工、紙種類など）などなど色々調べてました
    * 技術書典 7 公式サイトの一般公開に向けた情報準備  
      どんな本出すかの説明文とか、本のスクショとかを整理
* 8月後半～9月前半：8月前半に加えて更に色々なことが同時並行で進行する
    * 原稿の推敲作業（社内サークルのメンバーにお手伝いを依頼）
    * 加筆修正
    * 表紙デザイン
    * 技術書典公式サイト用のサークルカット作成
    * Twitter でハッシュタグつけて宣伝ツイート
    * 出展者をフォロー＆リツイート
    * 出展ブース設営に必要な資材の調達
    * 不意に予定に入っていたことを思い出す [社内サークルの開発合宿](https://qiita.com/aoking_Ba/items/85c85c702e09724ee68a)
    * 確実に余る部数を刷る予定にしたので委託販売先の検討
* 9月後半：技術書典本番
    * 出展ブースでの接客
    * 委託販売用の本を委託受付に提出  
      などブース運営の色々で走り回ってました。
* 10月：委託販売関連のことや技術書典の参加者アンケートなど

### 身についた・使ったスキル
* 始まりから終わりまでのタスクマネジメント
* 技術的な文章を書く
* Re:VIEW Starter を使って本の形にする
* 挿絵にする画像を作成する
* Photoshop を使っての表紙デザインなどの DTP スキル
* 印刷所へ本を入稿するための手順など
* 自宅に在庫を抱えないために委託販売先を先に準備しておく
* ビジネスの本質

### 感じたこと
各作業の時間を振り返ると比重としては執筆している時間がやはり大きいのですが、それ以外の作業も予想よりかなりあったと思いました。
体感としては本書いてる時間が 4～5 割で他のタスクの合計が残りの 5～6 割だと感じます。
特に印刷所や委託販売の方法を調べるなどの「調べる系タスク」に割く時間が今回は多かったです。
ただ、これは言わば初期投資のようなものなので次回以降があれば「調べる系タスク」はだいぶ軽くなると思います。

技術書典は初参加だったのでできるだけ宣伝に力を入れようと思っていましたがこれは大正解だったと思います。
技術書典の公式サイトには『サークルチェック』という機能があり、出展ブース一覧から気になるブースをマイリストにできる機能があります。
出展者側のマイページでは現在自分のサークルが何件サークルチェックされているかがわかります。
私のサークルは一般公開前に宣伝用の表紙やサンプルを用意していたおかげか公開後も順調にチェック数が増えていました。

技術書典に出展してみて色々学びはありましたが、一番学びは何と言っても「ビジネスの本質の片鱗を学べた」に尽きると思います。
技術書典 7 は初の 2 フロア開催となっており私のブースは 3 階で出展しておりました。
ただ、3 階に上がるためには 2 階の受付を通過したうえで階段前で待機しないと上がれないという仕様でした。
こういった会場の仕様のせいで 2 階と 3 階は人口密度に圧倒的な差が生まれました。
この件に関してたくさんツイートがありましたがこの方のツイートを見ると何となく雰囲気は伝わると思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8?src=hash&amp;ref_src=twsrc%5Etfw">#技術書典</a> 3階組でした。<br>とらのあな委託のため2階におりたら、3階が倍以上の人だかりでびっくり。<br><br>来場者は3階の存在すら知らなかった、もしくは2階奥のあの狭い階段が発見できなかった可能性大。<br><br>ウチの売り子さん（午後から入場）ですら、どこから3階に上がれるか分からず40分間さまよったレベル</p>&mdash; 湊川あい📚冬コミ(火)南リ28a 出展 (@llminatoll) <a href="https://twitter.com/llminatoll/status/1175990393323700224?ref_src=twsrc%5Etfw">September 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これはある種の天災のようなもので誰も予想できなかったことなので「運営が悪い」など的外れなことを言うつもりは全くありません。
むしろ 2 フロア開催に挑戦していただき感謝しているくらいです。
私が出展する前、ちまたではよく「技術書典は出展すれば黒字ほぼ確定。悪くても印刷代とトントンくらい」と言われていましたが、技術書典 7 では 3 階に配置されたサークルは目論見が外れたケースが多いと思います。
この一件で「人がいないところで商売しても勝ち目は薄い」というビジネスにおいては至極当たり前のことを痛感しました。

商売をするうえで「商品を作る」技術はもちろん大切ですが、それと同じくらい「求められているものは何か考える」「商品を認知してもらう」「良い商品だと納得させる」「商品を十分行き渡らせる」という技術も同じくらい大切だと感じました。
エンジニアという職業柄つい「商品を作る」技術に興味が向きがちですが、マーケティングや営業に関するノウハウも満遍なく磨いて「ビジネスとして」お役に立てるエンジニアを目指したいと強く思いました。

### 次回への改善点
技術書典で次に新刊を出すのはまだまだ先になる見込みなので、新刊を出さずに技術書典に出展する際は宣伝・広報まわりに力を入れてみたいと思っています。
Twitter のフォロワー増やす施策とかを試してみたいなーとぼんやり考えています。

## 【11月】一ヶ月間ずっとボードゲーム作ってました。技術的なことは特に無いので割愛

## 【12月】アドベントカレンダー
### 何をやったか
今お読みいただいている記事の他に 3 記事執筆しています。（うち 1 つは 24 日公開）
小ネタや普段思っていることなど色々書いてます。
今月の暇な時間はだいたいアドベントカレンダー読んでるか書いてるかしてます。

この記事以外は以下の通り

* [社内サークルアドベントカレンダー](https://qiita.com/advent-calendar/2019/ppap)：5日目、24日目
* [ゲームデザイナーアドベントカレンダー](https://adventar.org/calendars/3969)：8日目

### 身についた・使ったスキル
* 日々の脳内を外に出して後から読み返せるようにしました

### 感じたこと
例年 1 記事しかアドベントカレンダー書かないので今年は 4 記事に増えて大変です。

### 次回への改善点
今のところこの記事以外順調に数日遅刻して投稿しているので来年は記事を減らすか遅刻しないように事前準備してのぞみたいと思います。

# まとめ
今年は様々な形で世にモノをアウトプットした年になりました。
スタートからフィニッシュまで一貫して一人で作業をこなしたおかげでとてもたくさんの学びがあったと思います。
技術文書作成、表紙デザイン、印刷所への発注、委託販売依頼、モノを売るために必要な工夫など IT 技術以外のスキルもたくさん身につきました。
一人で何でもこなすのは本当に大変で、文字通り寝る間も惜しんで作業しなければいけませんでしたが得られた経験はきっとこの先のビジネスマン人生で役に立ちそうだと思いました。
モノを世に送り出すことで学べることは本当に多いのでこの記事を読んだ方は是非アウトプットに挑戦していただきたいです。