- サーバーサイド
- フロントエンド
- ネイティブアプリ
- プラットフォーム
- Webサーバー
- データベース
- CDN
- DWH
- ログ
- CI/CD
- IaC
- 監視
- Testing Tools
- 分析、可視化
- UIデザイン
- ソースコード管理
- コミュニケーション
- プロジェクト管理
- ナレッジ管理
- 情報発信
- AI支援
- その他ツール
サーバーサイド
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