New Application Checklist

26/12/2020

Updated Q4 2021

Usually when I start a new application there are a lot of things that I need to keep in mind, so I thought it would be a nice idea to make a checklist and keep it updated as I grow in experience. There are two parts to this checklist, one for an API backend and one for frontend. So without much further delay, here it is -

API / Backend

  • Code in Git
  • Restful (HTTP + JSON with correct HTTP methods) or GraphQL based
    • Prefer GraphQL for frontend facing services
  • Build + dependency management tool (e.g. npm, gradle)
  • Library versions locked for dependable builds
  • Testing
    • Unit
    • Mocking library (e.g. Mockk)
    • Integration (API request & db level)
    • Contract / Pact testing
    • CI testing with test DB setup etc.
    • Test DB should be cleaned after each (integration) test run
  • Linting / style check for consistent code look & feel
    • Editorconfig setup
  • Multi env. configuration / setup
    • Local, Staging, Production
  • Secrets management
    • Also may vary depending on env.
    • No secrets in plain text & in git
  • Request / Response handling
    • Requests - validated (using a declarative library), remove extra fields, convert to application object
    • Responses - typed, do not leak error stacktrace, use correct code e.g. 40x vs 50x
    • Intermediate service response - validated, trimmed, ignore extra fields, typed, middleware for case handling
    • Use types in tests / pacts
    • Handle duplicate requests (e.g. idempotency key)
    • Response data pagination
    • Case handling e.g. convert to snake_case over the wire
  • DB
    • DB connection pooling
    • DB seeding / data loading
    • ORM / Query builder
    • DB migration strategy (e.g. Flyway or Knex.js)
  • Logging (please log)
    • URL
    • Status
    • Latency
    • Headers
    • CorrelationID
    • UserID
    • Errors / stacktrace (as detailed as possible)
    • Blacklist sensitive data in logs (e.g. passwords)
    • Logs should be easily searchable
  • CI / CD Setup
  • Code quality analysis / measurement
  • Dev setup
    • Easy JSON + XML parsing / generation
    • CORS in development
      • Also may vary depending on env.
    • Hot reload in development (automatic restart when code changes)
    • Dependency Injection (if applicable, for better testable code)
    • HTTP client setup (for service level integration) or maybe Prot. Buffer / gRPC
  • Security
    • JWT Authentication (cert based)
    • Authenticated paths / Non-Authenticated paths (for easy setup)
    • Authorization
    • HTTPS setup (certbot)
    • Basic pen testing done
    • No SQL injection, XSS etc.
  • Monitoring & Alerting
    • Infrastructure monitoring (e.g. disk space)
    • Service monitoring (e.g. slow response time)
    • API healthcheck endpoint (e.g. service / dependency down)
  • API documentation (e.g. OpenAPI / Swagger)
    • GraphQL has in-built docs / playground
    • Look into automated generation
  • Docker & Docker-Compose setup
  • Horizontal scaling strategy (API should be stateless for example)
  • Metrics (reporting & dashboard e.g. requests per second, response times & custom metrics)
  • Strive for single deployement artifact e.g. docker image, JAR file, with only env. variable/s changing across environments

Frontend

  • UI Components (reusable / library)
  • Routing
  • State management
  • Layout / Styling / Theming
  • i18n
  • Form validation
  • Backend communication (REST / GraphQL)
  • Configuration for multiple environments (e.g. staging vs production)
  • Linting
  • Editor setup (Prettier + Editor Config)
  • Unit testing (Jest)
  • Integration testing (Cypress)
  • Building final artifact (CRA does this)
  • HTML headers
  • Icon files for all platforms
  • Accessibility
  • Lighthouse score (90+ in all aspects)
  • CI / CD
  • Deployment (S3 + CDN + Protection)
  • Error reporting (e.g. Sentry)
  • Analytics setup (e.g. GA)