My project and goals have stayed largely in line with my initial intentions, with only a few minor adjustments since the beginning of the semester. I set out to take a full-stack web app personal project that I had already begun to build to the next level in several ways. Specifically, my goals centered around making the backend design more domain driven, increasing testing coverage (across the stack, but especially focusing on thoroughness in the backend), implementing several new features, cloud deployment, and documentation. The only area that I decided to deprioritize is new features. Since implementing new features would involve a lot of concepts that I am already familiar with from building the currently implemented features, I decided I would rather spend more time learning about less familiar topics by focusing on the other goals. With the exception of testing, which is more of a necessity than a new learning experience, the areas of design, deployment, documentation, and smaller optimizations I have explored along the way involve many new concepts that I am using this project to become more comfortable with.
So far, I have accomplished approximately half of my initial goals, so I would say that I am on track. Firstly, I finished redesigning the backend for better separation of concerns between domains, between layers of domains, and between the app core and concrete infrastructure implementations. This significantly improved testability and maintainability and helped me gain a more solid grasp on best practices as projects scale. I also finished writing tests for all layers of the backend and frontend. This involved various strategies such as simulating API requests to the backend and simulating user interactions with the frontend. Thanks to the redesign’s reduction in tight coupling and dependencies on concrete implementations, internal layers of the backend became more easily testable with dependency injection and mocked traits (interfaces). Along the way, I also made various other improvements, such as setting up automated commands for database migrations to facilitate long-term maintainability. I am currently working on a few miscellaneous tasks such as automated seed data generation before moving into the deployment stage.
Moving forward, the main two categories of goals that I have left are deployment and documentation. With approximately seven weeks between now and the end of the semester, I think it is very realistic to accomplish my remaining goals along with a bit of buffer time to refine details. I would say that the biggest unknown at this point is how involved the deployment process will end up being. I have deployed several full-stack web apps in the past, but none that are exactly like this project. Specifically, I expect the frontend deployment to be relatively straightforward, since I have deployed several React apps on GitHub Pages in the past. However, the backend is a bit more complex because it involves running a server that listens for requests and connects with a PostgreSQL database. Therefore, I plan to get a head start on this issue within the next 1-2 weeks instead of waiting until the end of the semester to deploy. I think many of my classmates will also be in similar positions, so we may be able to provide one another with advice.
Overall, I have learned a lot through this project so far. It is the largest and most involved web app project that I have created to date, so I have been able to explore various concepts, perspectives, and tools that I was unaware of in the past. Some of the highlights have been automating common tasks and commands deterministically with tools like Docker, Atlas, and Just. I have also been able to get practice with development workflows using Git and GitHub, such as GitHub Projects (kanban boards), issues, and pull requests. I am looking forward to continuing to engage with new and interesting topics in the coming weeks.