If 12 Factor App Principles sound overwhelming to you, try answering the following questions as Yes/No, with the end objective of getting YES as answer to all questions.
- [ ] Codebase : Is your application codebase tracked in Version Control? (Ideally you should be using Git, a distributed version control system, as things stand today.)
- [ ] Dependencies : Are the application dependencies declared explicitly and isolated from the application code? (This is typically done using a package manager like NPM in Javascript platform or some dependency management system like Maven/Gradle in Java platform, etc.)
- [ ] Configuration : Is you application configuration externalized and not hard-coded? (It is good practice to go further and secure sensitive information like credentials in a vault to safeguard it from the prying eyes including the developers in the team.)
- [ ] Backing Services : Is the application designed to be loosely coupled from specific backing services like databases, queues, or caches, by accessing it all via well-defined interfaces?
- [ ] Build, Release, Run : Is the build process automated and repeatable? Further, is the application deployed using the same build and release artifacts consistently across environments?
- [ ] Processes : Does the application run as one or more stateless processes, so that it can be scaled horizontally?
- [ ] Port Binding : Does the application export services via a port binding mechanism, so that it can be run as a standalone service that is accessible via a network?
- [ ] Concurrency : Does the application leverage concurrency and parallelism for improved performance? Can it scale horizontally and handle concurrency using process-based scaling?
- [ ] Disposability : Does the application handle failures and crashes robustly? Is the application designed to start and stop gracefully without disrupting other services?
- [ ] Dev/Prod Parity : Are you having isolated environments like dev, qa, staging other than your necessary prod environment? (You are in an older era, without this engineering practice in place.) Are development, staging, and production environments as similar as possible without any environment specific quirks?
- [ ] Logs : Are the logs centralized and easily accessible for monitoring and troubleshooting?
- [ ] Admin Processes : Can administrators easily execute management tasks without affecting the application's core functionality? Are administrative tasks and one-off scripts kept separate from the application code?
I hope this checklist will help you identify areas where improvements can be made to align your application with the desired best practices and characteristics of a well-designed, scalable, and maintainable application.