僕の本職はサーバーサイドなのですが、半年くらいReactとReduxを使ったフロント部分を触ったので、書きたいと思います。
先にReact.jsについてですが、本家がチュートリアルをしっかりと用意しており、学習コストも高くなく、悪くないものだなと思いました。
しかし、Reduxが入った途端、めっちゃ複雑になった印象があります。chromeのプラグインを入れて開発するのが普通とか言われたのですが、そんなものを使わないと作業できないくらいに複雑で辛いなぁという印象です(Javascriptは、console.logがあれば、ほぼ開発できる気がします。)
ここから先は、こんなこと考える人も居るんだなぁ程度で見てください。Reduxが好きな人はすごく嫌な記事かもしれません。その場合は、ここでそっ閉じしてください。
Reduxはモダンだから採用した
これよく聴くのですが、本当に辞めてほしいです。jQueryも最初の頃はモダンだと言われてました。今では、レガシーとか言われています。数年したらほとんどのOSSがレガシーと言われているこの世の中で、モダンかどうか?という理由で採用するのは、辞めてほしいです。
また、モダンじゃないと外野に文句言われるという強迫観念じみたものを感じている人が居る気がします。
大規模システムでもなければ、1つのシステムの開発に関わる人数は、10人未満がほとんどだと思います。そのような中で、ネットに居るその他大勢の外野が何というか?を、気にするのは間違っていると思います。
今現在ソースに触れる人たちの技量に合った技術を導入すれば良いと思います。個人的には、jQueryしか使えない人たちが多い現場なら、素直にjQueryで行けば良いと思います(みんなで行けると判断したら、新しい技術に移行すれば良いと思います。ちゃんと取り替えられる設計で実装していれば、それなりのコストで移行できるはずです。)
Reduxはフルスタックとは言わないまでもレイヤーを跨ぎ過ぎている
僕がシステム設計する場合、レイヤー構造を強く意識して設計します。Webシステムの場合、ざっくりと下記で考えます。
- View層
- Controller層
- Model層
- Repository層
- Infrastructure層
上から下に流れていくイメージです。
(余談ですが、Model層は特定のフレームワークとか使わずにピュアな言語仕様で書きたいです。)
シンプルなActionのみを使った場合、Repository層から下の層ぐらいで終わります。
しかし、Reduxのミドルウェアの機能を使い出すと、API呼び出しなど、Controller層の役割まで行う状態になってしまいます。そこまでガッツリと入り込まれると、ただでさえ複雑なReduxが、将来的に取り外し不可能なデカイ負債となってしまいます。
ReduxはReactのstateの管理という名目でデータを保持しますがDBとの2重管理になる
DBが更新された際に、stateも更新しないとズレてしまうわけですが、その2重管理はバグの温床となります。2重管理して得られるリターンと言えば、API呼び出しを減らせることだと思うのですが、そこまでパフォーマンス的に厳しいサイトが多いのでしょうか?
TwitterとかFacebookならアクセス数が派手なので分かります。ですが、向こうは開発人数も多いし、ユニットテストなどもあると思います。ほとんどのサイトは、そこまでアクセス数も多くないしユニットテストも書いてないような気がします。
シングルページアプリケーションでも、画面が大きく変わったらサーバーにデータを取りに行ってから描画すれば良いし、React.jsには、stateの情報を次の画面に渡す方法もあります。そんな感じの実装でも十分に足りるのでは無いでしょうか?
モジュールの依存関係が多くReact.jsのバージョンをなかなか上げられなかった
時間が来れば解決するのでしょうが、かなり依存モジュールが増えてしまってnpmがエラー出してました。(これに関しては、npmも悪い気がします。モジュール管理の仕方をNode.jsのV0.8くらいのやり方に戻してほしいなぁと思います)
また、自分の過去の開発を振り返ってみても、言語のバージョンアップする際に、自分達で書いたソースコードは割りと修正無しでバージョンアップできたが、フレームワークが対応してないとかで大変な思いをしたことが多かったなぁと思います。
実際に業務委託の方がお手上げだった
作業に入ってもらった業務委託の方が、お手上げしました。最終日近くに、僕がReduxを抜いて、React.jsだけにした部分を見てもらったのですが、これなら開発出来ると言っていました。(僕も、Reduxあるバージョンが辛すぎて、出来る部分のみReact.jsオンリーにしました。。)
こういうことを言うと、「作業できないやつが悪い」的な文句を言う人も居るかと思いますが、僕は違うと思います。僕が見てきた中で、システム開発で同じ人がずっと見るということは少なく、だいたいが別な人にバトンタッチしたりして、日々運用されています。
そのような状態で企業の目線で見ると、ハイレベルなエンジニアにしか開発・運用できないシステムは、欠陥品と目されると思います。僕の大好きなアーマードコアでも、個人が使うネクストよりも、凡人でも運用出来るアームズフォートという兵器のほうが良いと言っていました。
代替可能な多数の凡人によって制御され、ハードウェアとして安定した戦力を約束する。アームズフォートは、正に企業の望むソリューションであり事実としても、その戦力は平均的なネクストを遥かに凌いでいた。
ARMORED CORE for Answerより引用
完璧に言っています。間違いないですね(・∀・)
まとめ
Reduxは複雑だと思います。データを保持するにしてもクラスとか書いてシングルトンにでもすれば良いと思います。シンプルが一番です。
僕のQiitaでも度々紹介していますが、シンプルさの必要性というRich Hickeyさんの記事があるので、一読していただければ幸いです。