Project: Online Community Web App
The motivation
I wanted to accomplish a few things with this project. First, I wanted to spend some time trying out some new technologies, specifically redux for the frontend, node.js/express/mongoose/mongoDb for the backend, and using Webflow to help produce the design and CSS. Second, I wanted to figure out how to build a better online community.
Developer experience
So Redux was something I wanted to look into because everyone was using it, and previously I've only used flux. And after having tried it, I would definitely want to use redux moving forward. Redux's ability to pass in state and action creators as props is definitely a cleaner implementation even if using redux creates more boilerplate primarily due to container components. Also the support for middleware allows you to easily plug in various features. For instance, redux has a single store where you can track the changes of each action, and redux-logger is a middleware that is implemented in one line that beautifully prints out these changes to console log.
Previously I've used flask for a backend, and I was looking into Django, but when I looked at the performance metrics for backends these were not the best choices. Node.js was able to perform multiple times better than either python solution. In addition, I saw particular pain points with using python as the webserver backend. Python is by default blocking, it runs one line at a time and doesn't move to the next line until it's done. This is usually fine. But when I need an API endpoint to send an email using another API, I don't want the server to be stuck waiting for the email api to send a success or error response. Python does have a way to make things more event driven or asynchronous, but it's not very straightforward. At least, not very straightforward compared to javascript callbacks and especially with javascript promises.
In addition, flask and django have a much smaller market share for backends compared to node.js, and it's reflected in the size of their communities. I was able to find very good popular libraries for things like OAuth for express, but for python those libraries are starting to get some tumbleweeds.
However, I haven't abandoned python as a backend completely. Python has an amazing community in machine learning and data science, and one really great way to use this is to build a flask API to handle these tasks as a worker in a microservices architecture.
Finally I dipped my feet into a NoSql database, and I would say moving forward I would use a NoSql database for my projects unless I really needed that data integrity or I wanted to do some really sophisticated queries. But in the initial stages, while I was building out this web app I had to change the schema multiple times. I wasn't quite sure what I wanted to build (it was for fun, learning, and practice). And the NoSql database really smoothed out that process to try out different ideas quickly and easily. And mongoDb is an amazing product, out of the box it supported all the basic CRUD of course, but it also had a built-in search engine mechanism and even graph traversal.
But I do see some of the downfalls, atomic transactions for MongoDb is only on a per document level, which is equivalent to a row in a table for SQL. If I need to make multiple changes to multiple documents and make sure it's all or nothing, there's a specific and rather lengthly process to do so for mongoDB. Whereas at least with my experience with PostgreSql, I could do everything I needed and then if everything worked, commit the changes.
This is definitely a very important distinction. But since I'm mostly prototyping different ideas and need to produce something quickly, I would still use a NoSql database first.
Goal
I've always been interested in creating communities, and everyone on the internet can be instantly connected together, but we have not succeeded in building something that truly creates a global community.
People feel more lonely and isolated than ever before. And the processes we use to help people find other like-minded people or content they'd like, creates insulated isolated groups that have just been creating larger fractures in our community at the global scale.
To me, it seems ironic and bewildering, but what's clear is that there has to be a better way. There has to be some way to use the internet to create that global community, a community that improves our sense of belonging, and works to help us understand and listen to our fellow human beings.
That is why I built this. In the process of building it, ultimately I had to design it. I had to figure out what would incentives people to share more, how to discourage bad actors, how to allow people to retract statements, how colors influence these decisions, and so on.
But this is not the design or setup that I believe will accomplish my goal, I needed to do this to further build the skillset and start putting together the steps towards that goal. And after finishing it, it looks like a step in the right direction.