aoitaku Advent Calendar 2016 : 11日目 - JavaScript

この記事は aoitaku Advent Calendar 2016 の 11 日目の記事です。

ぼくは今年、仕事では 3 つの言語を扱いました。ひとつは Ruby で、4 日目 に書きました。
もうひとつは Swift で 5 日目 に書きました。そして残る一つが、JavaScript です。というわけで JavaScript のことを書きます。

ぼくが JavaScript を仕事ではじめて扱ったのは 2010 年、Web 業界に転職したときのことで、このときは JQuery を使って何やらしたりしていましたが、JavaScript 自体に触るのはそれ以前からやっていて、その頃はまだ prototype.js が出たくらいの頃でした。

当時ももちろん IEFirefox とで挙動が違う*1みたいな状況で、Firefox だと使える Web 標準の関数が IE だとろくに動かないとかそういうのが背景にあったので、クロスブラウザprototype.js のようなものが出てくるまではそれぞれがオレオレライブラリ作ってなんとかするみたいな時代でした。
ぼくも attacheEvent と addEventListener コンパチで使えるようにしたものとか作ったりしていましたし、IE で使える getElementsByClassName 相当のものを作ったりしてなんとかしていました。

そういう時代を経て JQuery と出会ったときの衝撃は割と大きくて、自分で JQueryプラグイン作ったりとかもしました。Twitter の最近のツイートの表示したり読書メーターの最近読んだ本を表示したりとかそういうのを作った覚えがあります。いまは全部動かなくなってしまったのでもうメンテしてませんが……。

JQuery と出会ってぼくが得たのはたとえは「流暢なインターフェース」あるいは return this であったり、function オブジェクトを渡してコールバックやイベントハンドラをセットするのを利用した DSL であったり、JavaScript オブジェクトを使ったコンフィギュレーションであったりという知見で、これらはその後 Ruby に傾倒していくなかでも多分に影響があったんじゃないかなーという気がしています。

さて、その後しばらく Web 業界で仕事を続けた後でいまの職に就くんですが、ここでは何をやっていたかというと、node.js でサーバサイド JavaScript を動かしたり、JS の Web アプリケーションフレームワーク使った Android 向けハイブリッドアプリ作ったりということをしました。
Android 向けなのは、iOS の方は以前書いたとおり Swift で作ってたからなんですが、Android 版を Java で書くかというとそれは割とコストでかそうだし JS でハイブリッドアプリ作ってパフォーマンスが間に合うならそのほうがいいのでは、みたいな判断からなんですが、まあ割となんとか動くものはできたように思います。

JQuery がない時代から JS 触ってた身としてはもうはるか遠くにやってきたなという印象なんですが、次世代 ECMAScript の仕様はめちゃくちゃいいですね、ということを思っています。
構文レベルだと好きなのは Arrow Function とか Destructuring Assignment とかありますけど、個人的にめちゃ気に入ってるのが Promise で、まだ充分手には馴染んだとはちょっと自信持って言えないんですが、それでも Promise で書いたコードとコールバックで書いたコードだともう断然 Promise で書いたほうが取り回しやすくて、みんな Promise 使おう!ということを思っています。

ところで最近はあんまり JQuery を使っていません。JQuery でほしいのは主に DOM クエリなんですけど、今だとquerySelector があるので別に JQuery でなくてもいいかなということを思っています。アニメーションに関しては最近の CSS アニメーション使ったライブラリのほうがいいのかなーということを思ったりしますが、いろいろ触ってみてもあんまりしっくりこなくて結局手で CSS アニメーション書いてたりしてよくないですね……。

個別のライブラリでいうと lodash とかも使ったりしていましたが、いまは断然 Sugar.js 推しです。ver 2.0 出てからもう人に勧めるのに抵抗ない感じになりました。
lodash と違って既存のオブジェクトを拡張して使うんですが、どのオブジェクトを拡張するかは自分でコントロールできるのと、次世代 JS 標準になる予定のものはポリフィルとして機能するのと、もちろん標準のメソッドとバッティングしないように配慮されてるのと、そのあたりが気に入っています。
lodash は lodash でよいのですが、メジャーバージョンが上がって API の互換性が壊れるということをたびたび経験していて、ちょっとさすがにつらいなという気持ちがあります。
Sugar はそんな機能まであるのかよ~っていうようなメソッドが用意されていたりして、このへんは Ruby 使っててもわりとびっくりしたりします。
さすがに Number の abbr とかはやりすぎな気がしないでもないですが、というかこういう機能生やすなら String のクラスメソッドでは、みたいなこと思ったりしますが、でもまあ実際こういうのはあると便利ではあります。

あらためて振り返ってみると、この一年の間で サーバサイドで CoffeeScript 使って、スマートフォン向けハイブリッドアプリで ES next 使ってて、JS 成分の濃い年だったなと思います。

さて、言語シリーズこの JS の記事を持って最終回なので、いろんな言語をさらってみた感想。

ぐるっと見渡してみて、次にぼくがほしいのは Ruby くらい気軽な構文で JS くらい非同期取り回しやすくて Swift よりもうちょっと取り回しやすい型システムのある言語だなーという感じです。
Ruby 3.0 とか Crystal がそうなるかというとそれはむずかしいと思いますが、まあいずれは非同期当たり前、型安全当たり前、でも人間が書いて苦痛でない言語、みたいな流れになっていくだろうなーということを思っています。なってほしい。

記事が書き上がったのが年明けてからなのでこれも年明けて書いてるわけですが、鬼が笑う心配もなく次やりたいこととか書けるので、次のこと書いておくと、まず Opal で一本ゲーム作りたいなということを思っています。   いま興味があるのは Crystal です。でも Windows でも動くようになったら考えます。
Mac あるので Mac で動くじゃんっていうとそうなんですけど、Crystal でサーバアプリ書きたいわけではなくて、作りたいのはゲームなんですよね。そうすると Mac だけで動いても困るというか、Windows でも動いてくれないと困るというか。
あとは Kotlin で Android アプリ書いてみたいとかも思っています。できるのかな。なんとか時間作って……うう。

これで言語シリーズはおわりです。
残りの日程はゆるい記事書いていきますが、残りも引き続きお楽しみいただければ幸いです。

*1:当時は Chrome はまだありません