OpenWork Tech Blog

OpenWork を運営するエンジニアによるテックブログです。

OpenWork の技術スタック

サーバーサイド

PHP (Symfony4) web infra, Python web infra, Go web infra, Bash infra, OpenAPI web

OpenWorkのサーバーサイドは主にはPHP x Symfonyで実装されています。 PythonをAWS Lambdaで使ったり、決済まわりをGoで開発したり、その時々で言語を選択しています。 スマホアプリの開発が進む中で、OpenAPIを使ってAPI仕様書を書くようになりました。

プロジェクトの構成に関しても、サービスの成長に伴うコードベースの増大に対応していくため、クリーンアーキテクチャやドメイン駆動設計を参考にしたものへの変更を進めています。

関連ブログ記事: API仕様書にOpenAPIを使用して感じた良さ

フロントエンド

JavaScript (Vue.js, jQuery) web, Babel web, webpack web, ESLint web, Prettier web

Vue.jsを使用し一部のページはSPAで開発しています。 古い機能はjQueryゴリゴリで実装されているので、チャンスがあればVue.jsやES2015+に置き換えていきたいと考えています。

ネイティブアプリ

Android

Kotlin native, Data Binding native, Navigation native, Retrofit2 native, OkHttp native, moshi native, RxKotlin native, Glide native, Epoxy native, Timber native

iOS

Swift native, RxSwift native, RxCocoa native, Alamofire native, Codable native, ComposableArchitecture native, Combine native

共通アーキテクチャ

MVVM native, Clean Archtecture native

Androidはプラットフォーム公式のライブラリをできるだけ活用しつつ必要に応じてOSSライブラリを取り入れています。 MVVMにUseCaseやRepositoryなどクリーンアーキテクチャのプラクティスを取り入れ、保守性は高いが堅すぎない設計を心がけています。

プラットフォーム

Amazon ECS infra, AWS Lambda infra, AWS Elastic Beanstalk infra, Cloud Run infra

主にECS + FargateでDockerコンテナのアプリケーションを動かしています。また、一部EC2上で動くシステムはElastic Beanstalkを採用しています。 新規サービスの開発などで新たに構築するシステムに関してもECSを選ぶことが多いですが、機械学習周りではGCPの Cloud Runも採用しています。要件を最も満たすのは何かを都度検証した上で、技術選定することが重要です。

関連ブログ記事: Web サーバーの構成, コストを考慮したコンソールログインのできる開発環境 Web サーバーを Fargate Spot + Terraform で作る

Webサーバー

Apache infra, Nginx infra

Webサーバーの大半はApache (2.4 系)で動いています。 一方、CDNの後段に置いている画像プロキシサーバーに関してはNginxを採用しています。Nginxは静的コンテンツの配信に強く、image_filter_moduleを使えば画像の加工も容易です。画像プロキシサーバーは、オリジンサーバーであるS3に置かれた画像を適宜リサイズ・キャッシュしており、画像加工の手間やS3アクセスによるオーバーヘッドを抑えています。

データベース

Amazon Aurora(MySQL互換) webinfra, Elasticsearch webinfra, Redis webinfra, Amazon DynamoDB webinfra

データベースは基本的にフルマネージド型のサービスを選択するようにしています。 RDBに関してはパフォーマンスや可用性を考慮しAmazon Auroraを採用しています。 Elasticsearchは企業や求人の検索、スカウトの対象者検索機能など、検索関連機能で活用しており、 RedisはSQLのクエリキャッシュやログイン周りなどに利用し、ユーザーがストレスを感じないサイトの応答速度を実現しています。これらについても、自前で管理しなくてよいAWSのElastiCacheを利用しています。

CDN

Fastly infra, Amazon CloudFront infra

画像/CSS/JSなどアセットの配信には主にFastlyを利用しています。一部アセットにはAmazon CloudFrontも利用しています。

DWH

Treasure Data webinfra, Google BigQuery infra

メインのデータウェアハウスとしてTreasure Data, サブ (アクセスログ用) としてBigQueryを利用しています。
現状、Treasure Dataをデータレイク的にも利用してしまっており、システム負荷やデータ量の問題が顕在化してきているため、近々データ基盤を刷新する予定です。

ログ

Fluentd infra, Logstash infra

アプリケーションのログはFluentd経由でS3やTreasure Data、Datadogに送られます。 RDBからElasticsearchへのデータ同期の一部でLogstashを利用しています。

CI/CD

CircleCI web, AWS CodeBuild/CodeDeploy/CodePipeline infra, Bitrise native, GitHub Actions web native

CI/CDはプロジェクトやシステムによって異なります。 OpenWorkのメインシステム (Webアプリ) のCI/CDとして、 CircleCI/CodeBuild/CodeDeploy/CodePipelineを組み合わせて利用しています。一連のリリース作業をSlack上から行えるように、リリースの自動 (ChatOps) 化もされています。

関連ブログ記事: 毎日のリリースをSlackから実施できるようにした話

IaC

Terraform infra, AWS CloudFormation infra

インフラのコード管理としてTerraformを利用しています。一部のリソースはCloudFormationも利用されています。

監視

Amazon CloudWatch infra, Datadog webinfra

インフラの監視には主にCloudWatchを利用しています。CloudWatch Alarmで生じたアラートはSlackに通知しています。 その他、アプリケーションログや一部インフラリソースはDatadogで確認を行います。

Testing Tools

TestRail nativeweb

ネイティブアプリチーム、WebアプリチームともにTestRailを導入しており、エンジニアがテストの作成と実施を担当しています。 テストプランやテストケースはエンジニア同士でレビューをした上で、開発時とリリース前確認に使用しています。 仕様が正しいかという観点で、プランナーにレビューしてもらうこともあります。 また、デザインに関わるテストはデザイナーにも実施してもらいます。

Selenium / PageObjectパターンを活用してE2Eテストを行っています。

分析、可視化

Tableau 全員, Google Analytics 360 全員

データの分析、可視化ツールは、エンジニアに限らず利用可能です。 会社としても勘や経験に頼った意思決定ではなく、データを用いた意思決定を重視しています。 またデータから仮説を導き、それを元にした施策を打つだけでなく、 データを取得できるようにすること自体が開発案件になることもあります。

UIデザイン

XD, Photoshop, Illustrator, Figma, VSCode デザイナーがコーディングする際は主にVSCodeを使用しています。 その他のツールはデザイン検討やデザイン案の作成に使用しています。

その他ツール

GitHub, Slack, Backlog, Qiita Team, Stoplight Studio, Postman