OpenWork Tech Blog

社員クチコミサービスを運営しているオープンワークエンジニアによるテックブログです。

OpenWork の技術スタック

サーバーサイド

PHP8 (Symfony5) web infra, Python web infra, Go web infra, Bash infra, OpenAPI web, TypeScript web, NestJS web, GraphQL web, Prisma web

OpenWorkのサーバーサイドは主にPHP x Symfonyで実装されていますが、新規サービスの立ち上げ時には技術選定を行い、TypeScript, NestJS等を採用しています。 他にもPythonをAWS Lambdaで使ったり、決済まわりをGoで開発したり、その時々で言語を選択しています。

スマホアプリの開発が進む中で、OpenAPIを使ってAPI仕様書を書くようになりました。

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

フロントエンド

TypeScript web, JavaScript (Vue.js, jQuery) web, Babel web, webpack web, ESLint web, Prettier web, React web, Next.js 14 (App Router) web, GraphQL (GraphQL Codegen, graphql-request) web, Tailwind CSS web, Storybook web

一部のページはTypeScriptやVue.jsを使用しSPAで開発しています。 新規サービスではReact, Next.jsも採用しています。

ネイティブアプリ

Android

Kotlin native, Navigation native, Retrofit2 native, OkHttp native, moshi native, RxKotlin native, Glide native, Jetpack Compose native, DataStore 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, Cloud Run infra

主にECS + FargateでDockerコンテナのアプリケーションを動かしています。 新規サービスの開発などで新たに構築するシステムに関しても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 CDK infra, AWS CloudFormation infra

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

監視

Amazon CloudWatch infra, Datadog webinfra

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

Testing Tools

TestRail nativeweb

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

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

分析、可視化

Tableau 全員, Google Analytics 4 全員

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

UIデザイン

Photoshop, Illustrator, Figma, VSCode

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

ソースコード管理

GitHubのOrganizationを使ってソースコード管理しています。

コミュニケーション

リモートワーク下でも適切なコミュニケーションが行えるようにさまざまなツールを活用しています。 Slackを使って非同期/テキストコミュニケーション、ZoomやSlackのハドルを使って対面のリアルタイムコミュニケーション、oViceを使って仮想オフィスでのコミュニケーションを行なっています。

プロジェクト管理

Backlogを使ってプロジェクト管理を行なっています。 プロジェクト外のタスク管理にはGitHubProjectを利用しています。

ナレッジ管理

Backlog、GitHubを使ってナレッジを管理しています。

情報発信

社外向けにテックブログを使って情報発信しています。 社内向けにGitHubを使って情報発信しています。

AI支援

GitHub Copilotを導入し、AI技術を活用したコード補完を行なっています。 ChatGPTを導入し、さまざまな場面で作業効率をアップさせる取り組みをしています。

その他ツール

Redocly, Postman