開発を迅速にするためのMyベストプラクティス集
負債をため込まないために重視していること
Auto generate
Types
型安全にバックエンドサーバ、Databaseにアクセスすることで、実際にコードを動かす前に、型チェックで明らかなエラーを検知できる。 また、SQLインジェクション等のセキュリティ対策も同時に行うライブラリもあり、セキュリティの担保にもなる場合がある。
例
ORM
- Prisma, TypeORM: Databaseのテーブル定義からTypeScript型定義を自動作成。SQL文を書く必要がなくなり、型安全にDatabaseにアクセスできる。また、テーブル定義からDatabaseのテーブルを作成ができ、DBの設定、マイグレーションも自動で行える。
GraphQL codegenerator
- GraphQL Code Generator: GraphQLのQuery/Mutation/Subscriptionの型定義を自動作成。型安全にGraphQLサーバにアクセスできる。
REST API codegenerator
- openapi2aspida: OpenAPIからTypeScript型定義を自動作成。型安全にREST APIサーバにアクセスできる。
gRPC tRPC
Documentation
自動でドキュメントを生成できるようにする。 CIと連携して、常にAPIのドキュメントが最新の状態であることが担保できる。
ドキュメントを挟まないことで、ドキュメントの更新忘れによる不整合を防ぐ。
例
REST API(Open API)
- tsoa+Swagger UI: tsoaを利用し、ExpressのControllerからSwagger UIのドキュメントを自動生成し、Swagger UIで確認可能。
GraphQL
- Apollo Sandbox: 動いているGraphQLサーバにpost可能なQuery/Mutationのドキュメントを確認可能。
スキーマ駆動開発
スキーマの定義ファイルからフロントエンドもバックエンドも実装を行う開発方針。
例
- express-openapi: OpenAPIからExpressのControllerを自動生成。
CI
コードの体裁を守ることによって品質管理がしやすくなる。
また、パッケージのアップデートに伴う不具合をある程度未然に防ぐことができる。
- formatter
- prettier
- 本ブログで利用している設定はprettier.config.mjsを参照。
- prettier
- linter
- ESLint
- 本ブログで利用している設定は.eslintrc.cjsを参照。
- Stylelint
- 本ブログで利用している設定は.stylelintrc.mjsを参照。
- markdownlint-cli2
- 本ブログで利用している設定は.markdownlint-cli2.jsoncを参照。
- secretlint
- 本ブログで利用している設定は.secretlintrc.jsonを参照。
- ESLint
- test
- E2E, Visual Regression
- Unit, Integration
- else
- LightHouse CI | Page Speed Insights
- Nu Html Checker
- htmlhintを利用(
npx htmlhint https://example.com
)。
CD
GitHub/GitLabのMainブランチへのマージや、タグの付与をトリガーに自動デプロイを行うことで、コードと環境のコードの不整合を防ぐ。
- Vercel bot: Vercelへのデプロイを自動化。
- Render bot: Renderへのデプロイを自動化。
- AWS CDK: AWSのリソースをコードベースで管理し、差分を自動デプロイ。
Container service
開発環境にdocker composeを利用することで、開発環境を即時に作成できる。
また、フルマネージなコンテナサービス(AWS Elastic Container Service等)を利用することで、容易にk8sのようにコンテナの管理を自動化できる。
Update and Security alerts
常に最新の状態のライブラリを使うことで、脆弱性を防いだり、メンテナンスがしやすくなる。
- Renovate: 定期的にパッケージのアップデートのPRを自動作成。
- Dependabot alerts: 脆弱性を自動で検知し、パッケージのアップデートのPRを自動作成。
Git
- CHANGELOGを自動生成。
- standard-version:
CHANGELOG.md
を自動作成 +package.json
のversion
を自動更新。 gh release create --generate-notes
コマンドによって、GitHubのReleaseのタイトルと本文を自動生成。
- standard-version:
- git-cz: Conventional Commitsに則ったコミットメッセージを自動生成。
- commitizen: 同上。
- Husky: コミット前にlinterを実行し、コードの品質を担保する。GitでMarkdownを管理している場合やCI/CDの実行時間を削減したい場合に有効。
- Squash Commit by default: Pull Requestをマージする際に、コミットをsquashすることで、コミット履歴をきれいに保つ。
- Pull Request単位でビルドを共有する(iOSやAndroidアプリの場合、DeployGate等を活用する)。
Single source of truth
ドキュメントを唯一の情報ソースとし、色々な箇所にドキュメントを散りばめないようにしよう。
オフィスなしのオールリモートで成長するGitLab社、世界中の2,000人をつなぐカルチャーとは
その他
プログラマの三大美徳
- 怠惰
- 短気
- 傲慢
つよつよエンジニアになるために
- 非機能要件が考慮されている。
- プログラミングの原理原則が守られている。
- レポジトリ内に無駄なコードがない(
.DS_Store
等)。 - CI/CD pipelineが初期から整備されている。
- テストコードが(高確率で)存在する。