フロントエンドを何とかしたい

個人的にサーバのバックエンド&Webサーバ周りはScala + Play + Akkaで良いんでないかと思っている。今のところこれで何も困ってないどころか、過去私が経験した中で最も生産性が高くなる組合せだと思っている。

後はフロントエンドを何とかしたい。

ここで言うフロントエンドとはブラウザ上で動作するコードを指している。つまり、JavaScriptやCSSあたりだ。現状、私はここら辺を生のCSSとJavaScriptで書いている。ここら辺をいい加減何とかしたいなあと思うわけだ。

現状に至る背景

私だってAltJSとかLESSとか知らないわけではない。知らないわけではないが、今まで積極的に学習するモチベーションが無かった。それは、jQueryやunderscore、sugar、bootstrapあたりを組み合わせれば大体の処理はちゃちゃっと書けてしまうからだ。

一時期、CoffeeScriptを勉強しようと使い始めたが、playのアセットコンパイラが若干重く(Playはキックしているだけだとは思うが)、さらに職場で他の人間がCoffeeSciptを読めないという点で巡り巡って自分の仕事が増えるのでやめた。他のメンバのレベルに落とさなければならないというのは残念だけどまあしょうがない。CoffeeScriptを使わない理由だってなんかあるだろう。

TypeScriptもすごく良いと思った。Scala.jsもとても気になる。が、どれもこれも良いと思うのにイマイチ本気になれない理由はやっぱり「使わなくてもちゃちゃっと書けてしまう」に尽きる。とくに業務アプリだとデザインに凝ることはないからbootstrapつかっときゃみんな「すごいねー、綺麗だねー、今風だねー」って言ってくれるし、そこまで面倒くさい処理をそもそもフロントエンドで書く必要も無い。と、思っていた。

やっぱりなんか必要

今回、仕事で以下のような案件が来た。

元々Excelで製品検査シートを運用していたが、これをWeb化したい。そんで歩留まりとかの統計をとって生産管理・品質管理などに役立てたい。だから、Excelでやれてた事はWebでも出来るようにしたい。と。

ただし、Excel特有のセル結合などをふんだんに利用したフォーマットは継承しなくともよいとのことで、私は「らっくしょうじゃーん」とスラスラ書いていたのだが、その検査シートは中々面倒だった。

まず数式。Excelであるから他のセルを参照して計算するセルがある。こいつは悩んだ末、javascriptコードをデータで持ち、evalして帰ってきた値を設定することとした。セキュリティ的に褒められた仕組みではないが、まあしょうがない。

本来であれば一々Ajaxで投げてサーバで計算させるか、Excel数式の基本的な部分を網羅したParserを作ることになるのだろうか。前者はまだしも後者はJavaScriptでやるのはしんどいので諦めた。Scala.jsとかなら何とかなるのかもしれないが、ちょっとまだ仕事で使うには怖い。

すると今度は計算結果を基に別の計算結果を算出しているところがあった。こいつはめんどい。依存関係がある。まともに計算するのは嫌なので、自動計算を繰り返して前回計算結果と変化が無くなったところで止めることとした。これだと循環参照しているときに無限ループになるが、そこはn回で計算打ち切りと言う妥協仕様である。

そいで、こんどは計算値がExcelとあわない。調べてみるとこれは単純な原因で、小数点以下を丸めた計算結果を再度別の計算に使用しているからだった。だから、丸める前の計算結果を保持することとした。

そんな感じであれこれやっていると、どんどん動作が重くなっていく。なぜならば、こういうもろもろの値をHTML5のcustom attributeとして保持していたからだ。だから、参照するたびjQueryのセレクタが走るというクソ仕様なのである。だって、当初はこんなに複雑なことするつもりなかったんだもーん。

じゃあどうするか

ここまで来るとMVW系のJavaScriptライブラリを使うのが手っ取り早い。私はKnockout.jsがシンプルで好きなのだけど、イマイチ影が薄く、Angular.jsが圧倒的人気のようだ。Knockoutも悪くないけれども、使っている所をあんまり見ない。GitHubスター数はAngularが38kに対しKnockoutが6.4k(2015/5/27時点)。

個人的には最近のMSは好きなのでKnockoutも頑張って欲しいところ。が、この業界ではマイナーなライブラリはすぐに消えてしまう運命にあるのでどうせ最後にAngularが残るなら今のうちからAngular覚えたい。でもなあ…。Knockoutのシンプルなところが好きなんだよなあ…。と思っていた。

で、ようやく今回の本題に入るんだけど、最近になってAngularを覚えようかなという気持ちになってきた。ポイントは二つ。

一つ目はAngular 2がTypeScriptで書かれるとのこと。というか、以前からTypeScript(AtScript)のコードは存在していたようだ。JavaScriptを書かなくていいのはうれしい。(もっとも、KnockoutでもTypescriptを利用することは可能であるが、あんまり使い勝手のいいものでもなかった)

二つ目はscalajs-angularなる存在。これを使えば最近進歩が目覚ましいscala.jsとも相まって、サーバでもクライアントでもScalaでプログラミングできるのでは!?と期待している。

そういう事がありAngularを勉強しようかな、とおもっとる。

いや…でもこの道は地雷原をスキップで突破しようという試みかもしれんなあ。ちょっと前に、うちの会社で何十年も前からC言語だけを使っていてそこから進歩が無いような人たちが突然「今後Web化を推進するにあたりnode.jsを全面的に採用する。理由はクライアントサイドもサーバーサイドもJavaScriptという単一の言語だけ覚えれば良いから学習コストが低い」などと言い出して私はもしかして壮大なギャグなのかな?と思ったのだけど、私は同じ道を歩もうとしているのかもしれない。