General principals
Giving scarcity nature of a startup company, main goal of the architecture is to provide simple solution, yet potentially scalable, that requires minimum dev ops involvement and maintenance. This goal can be achieved by minimizing number of key technologies, languages, components, as well as relying on the industry proven solutions.
Programming Language
The only language that currently can be used across all of the architectural tiers and components is JavaScript. Settling on JavaScript language across the board will allow to build truly cross-functional engineering team. While some specialization is allowed and encouraged, every team member is expected to be comfortable in any tier of the system and switch between front/back end as needed. JavaScript requires certain proficiency. To maintain high level of standard, the development team will have to agree on certain techniques and tools that will apply across different tiers, for example:
Linter (sharing customized rules)
ES6/7
async/await constructs
Extensive Unit Testing (at least 70% coverage)
Client
Supporting goal of simplification, React based UI will be used on all types of clients. React’s mantra: Learn once -- Write everywhere. Android and iOS UIs will be sharing the same code base. The mobile UI code will not be transferable to the Browser-based single-page app as-is simply because the Browser UI is conceptually very different from the Mobile UI. But, it should be fairly easy for a proficient developer to maintain both types of clients, since the language, the event model, and the tools will be the same.
BackEnd
We will be relying on AWS infrastructure which is the industry proven solution. AWS Lambda Serverless middleware will be used, which has following benefits:
Ease of use and deployment.
Supports incremental deployment of the services that changed (no need to re-deploy the monolith).
Intraday hot re-deploy without service interruption.
Auto-scale out of the box to infinite demand.
Pay as you go (very favorable pricing comparing to other alternatives).
Supports JavaScript.
Data Storage
PostgreSQL will be used as a DataBase. AWS currently supports Aurora RDS which greatly simplifies DB maintenance and Administration. Aurora RDS is highly optimized for IO (which is a big concern for any DB technology). Unlike MongoDB, PostgreSQL has guaranteed writes. If we ever need to support Document Data structures, PostgreSQL support JSONB type, which can be indexed for quick access.
Conclusion
And this is really all that's needed for a modern product -- simple, elegant, scalable, maintainable, low cost. And if the product does not take off (which still happens occasionally) -- not a big deal to throw away, rinse and repeat.
The open-source example project is called What I Saw.
Comments