Haxeが気になるOSXでWEBなエンジニアのために１年かけて人柱になった記録

# がいよう
- 2013/11にHaxeと出会って、2014/12に至るまでの記録
- 初めはただのRailsエンジニアだった
- 今はフロントエンドとバックエンドをHaxeで書いてBaaSを作ってる
- 型システムを使いこなせるようになるとテストを書く量が減って、変化の激しいスタートアップの開発スタイルに柔軟に合わせたりできそうなので、やって良かったと思ってる。
- JSだけでなくPHPやPythonやJavaやObjCも吐けるので普段使いの言語としてオススメ

# 2013/11

## 認知

<blockquote class="twitter-tweet" lang="ja"><p>こりゃいいや / index - Haxe <a href="http://t.co/Xokkwzowus">http://t.co/Xokkwzowus</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/399439641515814912">2013, 11月 10</a></blockquote>

そもそも[@nobkz](https://twitter.com/nobkz)に唆された

## 興味

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/T_Hash">@T_Hash</a> 教えてくれる人が身近にいるのは良いですね。なにやら次flash案件来ますしちょうどいいのでやってみます。</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/399734099079745536">2013, 11月 11</a></blockquote>

受託案件で使おうとしたが叶わず。このあとめちゃくちゃAS3した。

## 考える

<blockquote class="twitter-tweet" lang="ja"><p>Haxe, node.jsを使って良い感じにMVC書けるようになったらJS嫌いも治るかな</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/399539148719005700">2013, 11月 10</a></blockquote>

完全にRailsしか知らない人のセリフ

## 徐々に気付く

<blockquote class="twitter-tweet" lang="ja"><p>てかHaxe, コンパイル言語だからJSよりデバッグ楽な面もあるのでは</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/399767152946724864">2013, 11月 11</a></blockquote>

ようやく型チェックの重要さに少し気付く

# 2014/6

## 仕事で使うことになる 

結局[@nobkz](https://twitter.com/nobkz)がいる会社に入る

<blockquote class="twitter-tweet" lang="ja"><p>Haxe&amp;BaaSでゲーム作りってコスパ最強だなってしみじみ思う</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/475650700626497536">2014, 6月 8</a></blockquote>

このころに

> 仕事で使うから準備してて

と言われるも、WEBで使うイメージはあまりなかった

## 試しに触ってみはじめた

- 経験のあるAS3っぽかったので抵抗はなかった
- enumが良いって言われたけど意味が分からなかった
- 型のある言語をそもそもあまり触らないので型の使い方がめちゃくちゃだった
- Railsに浸りきっていたのでフレームワークなしでクラス図から設計する練習を始めた

# 2014/8

## よりよい環境を求めて

OSXで使えるエディタをいろいろ調べてました。

<blockquote class="twitter-tweet" lang="ja"><p>Haxe based / “Cactus IDE | Indiegogo” <a href="http://t.co/kkmQhNOSwq">http://t.co/kkmQhNOSwq</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/495116353682935809">2014, 8月 1</a></blockquote>

kickstarter発のCactusIDEはHIDEにrenameしてるんですね。今知りました。
https://github.com/HaxeIDE/HIDE

<blockquote class="twitter-tweet" lang="ja"><p>atom/haxeたのしいぐへへ</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/497772105421709312">2014, 8月 8</a></blockquote>

結局僕はatomにしました。今でも使ってます。

[@syuhei_hiya](https://twitter.com/syuhei_hiya)はsublimeで、[@nobkz](https://twitter.com/nobkz)はemacsです。

元々emacserだったんだけど、Haxeでatom plugin書けるようになりたいなとか思ったので。

## Haxeでフロントをいじる

ログを可視化する系のアレを作ることになった

<blockquote class="twitter-tweet" lang="ja"><p>elasticsearch.js(40000行)のhaxe externを作るのは無理なのでClientのget系メソッドに限って作るためにコードリーディングしてるけど辛いよね</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/504923476709232641">2014, 8月 28</a></blockquote>

JSのライブラリをHaxeの世界に呼ぶときに型が欲しいのでextern化するときにハマった。全部読んでextern化しなくても、使う関数だけextern化すれば良いのでそんなにつらくない。D3.jsのexternも作った。型チェックが必要ないくらいしか使わないライブラリなら`untyped __js__("xxxxxxx")`ってやってHaxeのインスタンスにすればすぐ使える。

<blockquote class="twitter-tweet" lang="ja"><p>haxeは情報が少ないしブラックボックスに囲まれている感あるのでウダウダ言わずソース読む他ない</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/501436201077723137">2014, 8月 18</a></blockquote>

この頃は知的体力がなかったので音を上げてたけど、ちゃんと読む癖をつけたので今やなんでこんなことを言っていたのかよくわからない。

## 課外活動を始める

<blockquote class="twitter-tweet" lang="ja"><p>Haxeもくもく会 in 三軒茶屋 を公開しました！ <a href="http://t.co/2JKENp7V9S">http://t.co/2JKENp7V9S</a> <a href="https://twitter.com/hashtag/haxe?src=hash">#haxe</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/505777644114178048">2014, 8月 30</a></blockquote>

もくもく会を開いてみた。このとき来てくださったのは、[shohei909](https://twitter.com/shohei909)さん。強そうなHaxerさんたちと豆腐の店に行った縁でした。僕はextern作りでまだハマってた。shohei909さんは

<blockquote class="twitter-tweet" lang="ja"><p>HaxeManualを和訳するかとかいう話になったが何故かLaTeXからmdを生成するなぞ環境で白目剝いてる <a href="https://t.co/21hF6sNC0c">https://t.co/21hF6sNC0c</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/509671965964001280">2014, 9月 10</a></blockquote>

これをやり始めてました。本家がHaxeでLaTeXからmdを生成しているらしく、LaTeX環境の準備などで萎えてしまった。和訳だけでもコミットしたい。する。

# 2014/9

## 情報源を漁る

<blockquote class="twitter-tweet" lang="ja"><p>.<a href="https://twitter.com/sgtn">@sgtn</a> こんなもんか&#10;<a href="https://t.co/pC9ILDaKyG">https://t.co/pC9ILDaKyG</a>&#10;<a href="http://t.co/gYDc8gDkZj">http://t.co/gYDc8gDkZj</a>&#10;<a href="http://t.co/Atx3uGFdBq">http://t.co/Atx3uGFdBq</a> &#10;<a href="https://t.co/t1DKi0BH8w">https://t.co/t1DKi0BH8w</a>&#10;<a href="http://t.co/SCqNPFrgDE">http://t.co/SCqNPFrgDE</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/506416568834617344">2014, 9月 1</a></blockquote>

リンクを集めた。あんまり読んでない。

## 型システムを明確に意識し始める

<blockquote class="twitter-tweet" lang="ja"><p>haxeのtypedefとusingの力を噛み締めてる。typedefはコンパイル時により厳密にエラーチェックしてくれていい。usingは引数とレシーバを逆転することでrubyっぽくメソッドチェインできるようになるんだけど、これも型システムの力っぽいものを感じる。学びたい。</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/508394121325592576">2014, 9月 6</a></blockquote>

このときはまだ、enum-switchやユーザー定義型（抽象データ型）を使いこなせていなくて、他の人が型を設計してくれるお陰で便利さを噛み締めていた。usingはrubyっぽい記述が可能になるっぽくてテンション上がった。言語インターフェースのrubyっぽさワクワクするから、rubyが学術的な面からどう評価されようと今でも好きですね。

<blockquote class="twitter-tweet" lang="ja"><p>Haxeのコーディングを容易にする型システムはすばらしいので、個人的にはアフォーダンス的なものをもっともっと向上させたい。</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/508646227370446849">2014, 9月 7</a></blockquote>

興奮して変なこと言ってる。たぶん型定義が冗長で可読性が落ちてることと、そのオブジェクトがどんなメソッドを持っているかruby(rails)予想しにくいことを言いたかったんだと思う。前者はローカル変数に型推論を使って記述を簡略化すること、後者は自作static関数をusingしたり、クラス設計や命名を意識すれば改善されてゆきそう。

## テストを始める

<blockquote class="twitter-tweet" lang="ja"><p>haxelib install buddyｳｪーｲ</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/508995576923308032">2014, 9月 8</a></blockquote>

buddyはHaxe用テストスイート。mocha-haxeと違ってJS以外にも使えるspec系のテストスイート。haxe.unitやmunitも触ったけど、rspecっぽさと非同期処理のテストしやすさを考えて主にbuddyを使ってる。

node.js関連ライブラリのexternを作ってHaxeをバックエンドにも使う試みとかをやってた。

## 感動したもの二つ

<blockquote class="twitter-tweet" lang="ja"><p>HaxeでDSLでググったら弊社CTOの記事が出てきたけど言語知識が広範かつ一般化されててイカしてる。コードベースにMonad.hxがpushされたときは困惑したけどそういう背景があったのか。 <a href="http://t.co/jrqr23lErN">http://t.co/jrqr23lErN</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/513908161729019904">2014, 9月 22</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p>最近作りかけのMVWライブラリを、試験的にHaxelib初めて登録してみた。てか、zipでアップロードしないとイケナイのね。<a href="http://t.co/SEHaW8fpmb">http://t.co/SEHaW8fpmb</a></p>&mdash; はなだのぶかずakaイケメンLisper (@nobkz) <a href="https://twitter.com/nobkz/status/511027352701108224">2014, 9月 14</a></blockquote>

モナドをHaxeに持ち込んで、例えば非同期処理の記述を容易にするsimpleMonadと、クライアントサイドMVW(Whatwver)のMage。ここまでできるのかと壮大な気分になった。

# 2014/10

## にわかに活気立つHaxe界隈

<blockquote class="twitter-tweet" lang="ja"><p>Here&#39;s the reader map of my latest <a href="https://twitter.com/hashtag/Flash?src=hash">#Flash</a> <a href="https://twitter.com/hashtag/OpenFL?src=hash">#OpenFL</a> <a href="https://twitter.com/hashtag/Haxe?src=hash">#Haxe</a> post. Hooray Europe &amp; Japan! ♥ ? ♥ <a href="http://t.co/E6D6NlPzFH">pic.twitter.com/E6D6NlPzFH</a></p>&mdash; Jeff Ward (@Jeff__Ward) <a href="https://twitter.com/Jeff__Ward/status/523120097460629505">2014, 10月 17</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p>もうHaxe勉強せざるを得ない</p>&mdash; kiyopikko (@kiyopikko) <a href="https://twitter.com/kiyopikko/status/525473381756309504">2014, 10月 24</a></blockquote>

## 徐々に学習を進める

<blockquote class="twitter-tweet" lang="ja"><p>usingの仕様が知りたくてたまにhaxe読むけど.mlだしまだちょっと追いきれない</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/527751229976227840">2014, 10月 30</a></blockquote>

# 2014/11

## typedefやenumや非同期処理やクラス設計がようやく肌に馴染んできた

<blockquote class="twitter-tweet" lang="ja"><p>人間がやるべきチェックをカバーしまくりつつ優しい表現のできる型システムとしてHaxeは素晴らしいと思うのです。</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/530034104482283520">2014, 11月 5</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p>モナド(in Haxe)最高という気持ちに浸っている</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/530399617339256833">2014, 11月 6</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p>JSを書いている気が一ミリもしないHaxe素晴らしい</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/530399715536285696">2014, 11月 6</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p>switchまみれは宿命か / “void element blog: ほむほむジャンプをHaxeに移植してみた話” <a href="http://t.co/IBVXBQW583">http://t.co/IBVXBQW583</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/530952824478134273">2014, 11月 8</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p>haxe-oauth is ゴミ</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/535686267472576512">2014, 11月 21</a></blockquote>

↑haxe-oauthはマジでひどかったので一から書き直して公開しようと思ってる（node-oauth-haxeでも良いのかもしれないけど、JSとの境界面は型がDynamicになりやすいので実行時までエラーを残しちゃって嫌だからなるべく割けたい）

<blockquote class="twitter-tweet" lang="ja"><p>GHCのDeferring Type ErrorsいいなーHaxeにも欲しい</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/536348915289694209">2014, 11月 23</a></blockquote>

しっかりHaxeで型の恩恵を味わったのでHaskellの型システムの良さも徐々に分かってくる。

# 2014/12
## JSコミュニティでちょっとずつHaxeを紹介してみたり

<blockquote class="twitter-tweet" lang="ja"><p>英語でHaxeのenumの話したら「お前は何を言っているんだ」ってなったからもっと英語勉強します <a href="https://twitter.com/hashtag/%E6%82%B2%E3%81%97%E3%81%BF?src=hash">#悲しみ</a></p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/539975981541244928">2014, 12月 3</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/hashtag/Haxe?src=hash">#Haxe</a> sexy <a href="https://twitter.com/hashtag/Pizazz?src=hash">#Pizazz</a> color is <a href="https://twitter.com/hashtag/f49200?src=hash">#f49200</a> → 244|146|0. That is almost red, half green and no blue. <a href="https://twitter.com/_sgtn">@_sgtn</a> <a href="http://t.co/qyVUpUXC0H">pic.twitter.com/qyVUpUXC0H</a></p>&mdash; Jorge Bucaran (@jbucaran) <a href="https://twitter.com/jbucaran/status/540116224550907906">2014, 12月 3</a></blockquote>

[TokyoJS](http://www.meetup.com/tokyojs/)で仲良くなったJorgeがHaxeに興味を持ち始めてる図


## 最近

<blockquote class="twitter-tweet" lang="ja"><p>Haxeって吐き出せる言語多すぎる。Elmをbrowser, iOS, androidのplatformに限定して実装するくらいが理想的な気がする。目的を絞っていいから、frontendを抽象化するlayerが欲しい。</p>&mdash; shogochiai(˘ω˘) (@_sgtn) <a href="https://twitter.com/_sgtn/status/540040736234688512">2014, 12月 3</a></blockquote>

銀の弾丸はないって分かってるけど、Haxeを使ってると"Write once, run anywhere"を夢見ますよね。


# Haxeを始める際に気をつけたほうが良いことまとめ

- enumとswitchを組み合わせた型チェックが何故生産性を高めるのか確認すること
- 非同期処理のコールバック関数にもしっかり型を与えて網羅すると、リファクタリングが怖くないしミスが減るのでオススメ
- Dynamic型という型を定義していないようなふわふわした状態の変数を残すとユーザーが触る段になって実行時エラーめっちゃ出るので気をつけたほうが良い
- まだ要求も仕様もよくわからないプロトタイピングの段階ならJSで書いたりDynamicもりもりでも良いと僕は思う
- Success型とかError型とかJust型とかNull型とかまあ型チェック（コンパイル時）の段階で例外やnullを発見できるようなアレを頑張ること
- JSみたいにクラスの作り方山ほどないし、コーディングスタイルを統一できて良いこと
- JSライブラリの利用については「1.型が欲しいくらいそのライブラリを使うならExtern」「2.型がいらない使い方ならuntyped」を使うととりあえず覚えて、一度くらい試しにexternを作ってみること。

# 参考文献

言語の固さ、型チェック、externなどの話題 / [altJS勉強会「Haxeすごいからみんな使え！」](http://www.slideshare.net/sipojp/haxe-24876418)

書きかけだけど必読です / [何故HaxeでJavaScript開発をするのか](http://www.denkiyagi.info/haxe-javascript-tutorial/whats_haxe.html#haxejavascript)

受託だろうとスタートアップだろうと、大きなプログラムの複雑さを押さえ込むということがどういうことか少し分かる記事です。変更に強く品質が保てるHaxeはマジでよいのです。/[大規模なギョームシステムにHaxeを採用してみた話
](http://www.slideshare.net/terurou/haxe-15006171)

# 追伸
- 間違いの指摘や追記がお願いできると嬉しいです。
- スタートアップにおけるプロダクトの価値検証時にテストを書かない代わりに型に頼ってスピーディーに最小限のプロトタイプを作ってユーザーに価値を問うスタイルがよいなと最近思っているので、似たような試みをされている方のお話を聞いてみたいです。
- 株式会社technical rockstarsはHaxeの会社です
- [milkcocoa](https://mlkcca.com/)のHaxeExtern([milkcocoa-haxe](https://github.com/milk-cocoa/milkcocoa-haxe))あります