K.S.ロジャース株式会社's job postings
今の会社の技術スタックについて整理してみる
2/18に久しぶりにイベント登壇してきました。今まで一番少人数の箱でしたが、その分距離感も近く色々話も脱線できたりとある意味楽しめました。人前で話すのは好きなタイプなので今年は少しずつ増やしていきたいところです。
さて、タイトル通り、ちょっと今の会社の技術スタックについて整理してみようかなと思います。普段ワークスタイルの記事が多いのと、書いている技術ブログもAWS方面の偏りが大きいため会社スキルについて誤解があるかもと思い笑
サーバーサイド
サーバーサイドの技術は主に以下の3つに分かれます。Railsの経験はありますが、会社としてはあまり採用しないようにしています(メタプログラミングが嫌いなんですよね・・・)。個人的には新規のPJでRailsをやるくらいならCrystalを採用したいところですね。
- PhalconPHP(3.2), Nginx, PHP-FPM
案外オーソドックスにPHP(7.2)を使っていたりします。PHPと聞くとクソコードのイメージがわくかと思いますが、弊社では大規模開発に想定してガチガチのDDDで設計を組んでいます。PhalconPHPはその特性上自由に設計ができるので、徹底的に設計を詰めています。
テストコードは初期リリースの段階で書くのはほぼ意味をなさないと経験則的に判断しており、テストコードを意識しだすのはリリース後からです。それまではスプリントを回しながら週一でQAを入れたりしてカバーするようにしています。view側はvoltを利用し、js、cssなどは後述しますがwebpackを連携してちゃんとトランスパイルされたものを利用しています。
事業立ち上げをすることが多い分、ビジネス検証とそのPDCAが重要であり、サービス初期の段階からのSPAの導入には懐疑的な考えを持っています。
CTOとして重要なのはビジネスを成功させるためには、コストの少ないサービスリリースとそのスピード感のあるグロースが不可欠であり、UXが素晴らしいものの開発コストが大きくなりがちなSPAはあくまでもサービスが0→1の部分を超え、ユーザーがしっかり付いてきた段階で導入すべきだという認識です。とはいえ、複雑なUXを組むためにはReact/Vueはマストなので、そこはしっかり普段はtsxで開発を行なっています。 - Gin(1.3), Golang(1.10.x)
APIサーバーはGolangでの実装に切り替えていっています。gRPCを使いたいんだもん。フレームワークは一番人気のGinを用い、ORMはGORMを使っています。XORMとか色々性能比較しましたが、まぁGORMが一番でした(性能比較表は忘れた...多分社内のどっかのissueにコメントがあるはず)。
自分はGoはコードレビューしかやっていませんが、DDD+CQRS的な実装でlog出力はlogrusを利用しています。特徴的な実装としては普段のローカル開発はもちろんdockerですが、毎回docker-composeを再起動してリビルドするのはしんどすぎるのでライブリロードとしてこれまた同名のGin( https://github.com/codegangsta/gin )を使っています。サービスリリースを控えているZEED( https://zeed.app/ )は裏側の成果報酬の集計処理系でGolangを使っていたりします。
その他の点でいうと、APIサーバーなのでJWTをよく使いますが、JWTはdgrijalva/jwt-goを利用しています。
Qiitaで全然Golangの記事書けていないのでなるべく早く書きます。。。
現在はGoroutineを使ってWebSocketも実務レベルで導入しているため、記事を書くと参考になるかもと思っていたり。 - Flask, Python(3.7), gunicorn
前の会社がAI系のスタートアップに所属していた時にはFalconを利用していましたが、今回リリースするZEEDではオーソドックスにFlaskを使っています。
SQLAlchemyやLinterでflake8を使っているのでいたって癖のない構成です。ZEEDはSNSのデータ解析を行なっていく中でkeras(tensor-flow)を使って深層学習をする可能性もありましたが、詰めていくなかで不要との結論にいたったため、TensorFlow Servingの利用は取りやめました。
あくまでもAIのAPIサーバーとして利用するためあまり大規模なものは想定していません。
クライアントサイド
結構ガリガリAndroid/iOS作っていたりしますが、ウェブでいうと基本はReactです。ただ、VueでもOKで、ある程度の好みに任せています。が、あまりどのPJでもReact/Vueは設計的には煮詰まり切っていないかなーというのが正直なところ。。。
ちなみにHPはNuxt v1で作っています。誰かv2にしてくれーという気持ちもあったり。
- Android, MVI, Kotlin
AndroidはクリーンアーキテクチャやMVVMの変遷を経て、現在はMVIベースでの設計になっています。自分自身、Androidエンジニアからのキャリアだったため、クリーンアーキテクチャやMVVMまではしっかりやってきましたが、MVIは正直わからないっす笑 メンバーに負んぶに抱っこ、詳しいことは割愛。ただ、MVI+Coroutineな感じの設計ですね。画面遷移はもちろんNavigationです。
画像キャッシュ周りはGlide、通信周りは当たり前ですがRetrofit+Okhttpです。その他ログ管理はjake神のTimber、DIも導入しているのでdagger2を利用しています。
現在はRESTでのボイラープレートができていますが、gRPCへの切り替えを実施するところです。 - iOS, DDD, Swift
iOSは最近はVIPERが話題ですが、弊社ではDDDにRouterの要素入れた感じの設計ですね。通信はAPIKit、画像キャッシュ周りはNuke、DIとしてSwinject(SwinjectStoryboardを使いたいため)を導入し、定番ですがRxを使った設計になっています。その他としてログ管理はSwiftyBeaverを用い、R.swiftでリソース管理をしていますが、使っているライブラリは有名どころばかりなのではないでしょうか。
こちらも現在はRESTでのボイラープレートができていますが、gRPCへの切り替えを実施するところです。 - React, TypeScript
reactは普段tsxでの記述を推奨しています。というかreactを使わない場合でもtsxでjsの記述を行なっていますね。
フロントエンドの開発ではejs, tsx, scssの組み合わせで開発を行い、webpackでトランスパイルしてhtml, js, cssを吐き出してモックアップとしてUI/UXの確認をビジネス側と行う流れを組んでいます。SSRも考慮するとSPAはNuxtはやりましたが、NextJSに本年度は切り替えていこうかなーと考えています。できるメンバーもしっかりいますし。余談ですが、FirebaseはFCMもあるので色々最近使う場面が多くなってきていますが、複数人開発にはあんまり向かないこともあり、FireStoreとかは積極的には使わないようにしています。あと、BEMは社内規約策定と実施の徹底が結構しんどいので採用していません。
インフラ
- AWS, ECS, ecs-cli
AWS大好きです、はい。そしてECSはとにかく素晴らしい。。。ECSがリリースされた直後から使っています。弊社はGitlabを使っていますが、Gitlab CIとECSを連携し、ECRにコンテナイメージがpushされたらブルーグリーンデプロイでデプロイされるようになっています。最近、ecs-cliがリリースされ、docker-composeでデプロイ管理を行えるようになったため、リプレイス中です。もちろんCloudFormationのymlでインフラ管理を行なっています。 - RDS, MySQL5.7.x, Redis, ElastiCache
MySQLはクライアントソフトをSequelProに依存しまくっているため5.7系を利用しています(8はバグる。。。)
その他、最近はRedisを用いることが増えてきたのでElastiCacheを使うことも増えてきました。 - ログ収集/監視: AWS Cloud Watch, New Relic
このあたりは普通ですね。。。CloudWatchはいろんなアクセスログ、アプリケーションエラーログなど色々ログをロググループに分けて吐き出しています。アプリケーションレイヤーのエラーはNew Relic、インフラレイヤーはCloud Watch経由でSlack通知が来るようにしています。 - Apache Solr, ElasticSearch
全文検索はSolrもElasticSearchも使ったことがありますが、個人的な好みはSolrです。Solr CloudとElasticSearchを比べ始めるとめんどくさいですが、サクッとお手頃でGUIも優れているSolrがやはり扱いやすいです。ElasticSearchは検索の件数に上限があるのがあまり好きじゃないんですよねー。
その他
ちょっと変わり種な技術もやっていたり。。。
- ROS
あんまり知名度は高くないですが、ロボット開発で使われるあいつです。実は結構経験があり、今もとある大きなPJで利用中です。pub/subやwebsocketの概念はROSで初めて勉強しました。 - OpenCV
まぁ、もう最近はCNNやGANが有名になってOpenCVを使った画像認識は出番が少ないですが、結構触っていました。愚直にカスケードフィルターを作ってごにょごにょ。。。CUDAを導入してOpenCVをGPUで扱うこともやっていたりしたのは懐かしい思い出です。
以上、他にもありますが、さっくり整理してみました。
今年はGolang(gRPC)とSPA(NextJS)に力を入れていきたいところですね。来年あたりはどうなっているのか皆目見当つかないですが、最新の技術には意欲的に挑戦していこうと思いますのでバシバシご応募お待ちしています。