monorepo/docs/internal/decisions/initial-technology-selection.md
2024-07-06 11:58:08 -05:00

59 lines
3.2 KiB
Markdown

---
# front-matter
---
# Initial Technology Selection
The technology selected in this project were largely based on my own personal usage and experience. Feel free to drop
or replace technologies where you see fit. I tried to keep things it a minimum so there wasn't a lot to consider.
## Docker
[Docker][] is a powerful containerization technology that allows you to encapsulate all your dependencies into a single
isolated unit. I've been leveraging Docker in development environments since 2014 and have had huge success with making
developer environments, richer and easier to work with through containers. Docker makes it easy to encapsulate tools
into a single location, removing the need to manage complicated local provisioning scripts that spans various operating
systems.
[Docker]: https://www.docker.com/products/docker-desktop/
## NodeJS
According to [IEEE][], JavaScript was the 5th most popular programming language used in projects beating out languages
like C#, Go, and many others. When it comes to jobs, it's the 4th most popular language that organizations hire for,
and is the 3rd when it comes to trending libraries.
A large number of projects are built using JavaScript or one of its variants (e.g [TypeScript][]). Many projects
feature "progressive web apps" or "single page applications" to provide a richer client side experience.
In the early days of mobile application programming, writing iOS and Android applications came with a lot of challenge
and cost. Companies typically had two teams, building out native experiences for both platforms. As a result, features
would often drift between the different types of devices. Through systems like [Apache Cordova][], JavaScript made its
way to mobile devices. While it initially came at a fairly high performance cost, Cordova enabled JavaScript developers
to write mobile applications without needing to learn a new programming language. Over time, the community has improved
the performance of these types of applications by leveraging new technologies and capabilities.
Eventually, tools like [Electron][] and [Tauri][] brought JavaScript to the desktop. Now, Windows, OSX, and Linux
desktop applications could be written using the
Outside it's use in projects, NodeJS and NPM include a large number of useful utility packages, such as `prettier` and
`concurrently` which makes it great for formatting and linting common file formats (such as javascript, css/less/sass,
html, json, graphql, markdown, and yaml). As a result, I often like having NPM at the root to be able to manage the
versions of these tools in the repository itself.
[IEEE]: https://spectrum.ieee.org/the-top-programming-languages-2023
[TypeScript]: https://www.typescriptlang.org/
[Apache Cordova]: https://cordova.apache.org/
[Electron]: https://www.electronjs.org/
[Tauri]: https://tauri.app/
### PNPM
When working with multiple, large NodeJS code bases, multi-package management becomes a necessity. [LernaJS][] was an
early multiple package management solution. While a great initial solution, it lacked a lot features that came with
future solutions such as [PNPM][]. PNPM not only makes it easy to manage monorepos while also improving the storage of
dependencies in the local file system.
[LernaJS]: https://lerna.js.org/
[PNPM]: https://pnpm.io/