JavaScript Tech Stack
šŸ‘ØšŸ½ā€šŸ’»

JavaScript Tech Stack

This is an opinionated set of choices for starting a new software product. I believe starting a new project should feel like this:

image

and not like this:

image

Assumptions

You're trying to build a "modern" app. While there are literally thousands of ways to do this, this setup assumes the following:

Cost

  • Prefer free/open source over spending money.
  • Spend money on tools if it saves significant time.
  • Prefer operational expense vs capital expense.

Primary language

  • JavaScript all the things (where possible). JavaScript has more reach (available platforms) than any other programming language.

Testing

  • All tests will be in JavaScript where possible.
  • Unit tests test developer code changes at the atomic level.
  • Integration tests test code changes at either the API or UI level.
  • Performance tests test code changes that impact performance, with some level of tolerance.
  • More code coverage is better, but 100% doesn't mean correct.

Web

  • Web - React & either Redux or Relay
  • Target Chrome, Safari, and IE

Mobile

  • You may have up to three deliveries on mobile: iOS, Android, & mobile web.
  • iOS & Android
    • build on React Native to start, shift to native when you can afford to or if you have a specific platform need
  • Mobile Web - Same as Web + responsive CSS

Server

  • JavaScript / Node (maybe Lambda)
  • In a container environment = Docker + Node.js
  • In a serverless environment = Node.js

APIs

  • For client-facing APIs, prefer GraphQL over REST, but REST is still ok.
  • For server-facing APIs, prefer gRPC or Protocol Buffers over REST.

Developer Environment

  • I think Macs are still the stronger choice, but a good maintained linux box is good too.

DevOps

  • DevOps is a philosophy that can be supported by tooling.
  • DevOps doesn't mean developers don't have to understand their infrastructure.

Cloud

  • Prefer Amazon Web Services by default unless one of the following apply:
  • Prefer Google if you need something specific that Google offers (e.g. Firebase, Spanner, etc.)

Ownership vs "Throw it over the wall"

  • Prefer people and teams to own their products vs a "throw it over the wall" model.
  • This implies that people will be responsible for production support of their code (at some level)
  • This also implies that APM, failover, degradation, and incident management need to be backed into the product versus tacked onto the product.

If you don't agree with the setup, then the selections below won't make sense. That's entirely ok, as there are thousands of other choices that are likely better for your assumptions on software development.

Work in Progress

Evaluate

Not started
TypeScript
In progress
Completed

Setup

JavaScript