I will be programming my project in the coming months. I would need advice on the technology I will use.
I focus mainly on mobile apps, so it's clear there that it will be a native app written in Kotlin.
I will also need a backend (database, API). In the database, I will need to store words and their translations along with users and some statistics to start with.
I don't know which database to choose, whether NoSQL or SQL. Maybe NoSQL would suffice for some words and key-value data.
With that backend, I have a dilemma as to which framework to use. Basically, it will be such a new for me, I just played with Flask a little bit, but It doesn't matter. Basically, everything runs on JS except the Android app. So is it advantageous to choose Node.js on the backend? I have no experience with this, is it an advantage when everything runs in almost one language? I also thought about Flask / Django, but I also quite like Node.js since it's in JS. But I'm open to all the possibilities of .NET, Spring .... What would be your choice?
I'll write everything myself, it's a project for school, but I want to move it to a higher level and release it. If it doesn't work out, at least I'll learn something. Thank you for the answers.
Let's start with the database. First, in my experience, there are few applications where choosing a document database (NoSQL) over a relational database (SQL) is advantageous. While document databases are conceptually very straight forward, I find the tradeoffs down the road are simply not worth it (I wont get into all the details here, but please do some research on the downsides of NoSQL databases). If your data storage needs were exceedingly simple, I might reach for something from the Google Firebase suite, Realtime Database or Cloud Firestore; but I find even simple storage needs tend to expand and grow over time as your application matures. Postgresql is an excellent choice, and an absolute powerhouse for a ton of applications. With the somewhat recent additions of hstore, json, and jsonb datatypes, the advantages of reaching for a pure document datastore melt away.
For the Chrome extension, I would probably favour going for something a bit more lightweight than React or Angular. I'm a huge fan of React, but it comes with a somewhat hefty download, so if it were me, I might reach for Vue instead on that one. React is better for bigger, more complex single-page applications, whereas Vue is probably a better fit for simpler applications which require a smaller set of components.
But, let me change my tune a little bit. You mentioned that this is a school project. In light of that fact I suggest you gravitate towards languages and frameworks that will help grow your career. Making smart choices based on the requirements of the task at hand is always prudent, but in this case I think it may be more valuable to gain some experience with some of the current "industry standard" stacks. Ask yourself what you can build a career on, and dabble in some of those areas until you find something that clicks for you. So, here are my revised answers, with options for each category ranked in order of preference
- Database: PostgreSQL, MySQL
- Backend: Node/Express, Rails, Django, Spring
- Frontend: React, Angular, Vue
Hi Karin, I really liked your take on this whole school thing, I'm amazed you want to put such a huge effort in it.
And please appreciate your project is a lot to take and it can also be a lot to do: the risk is going beyond the assignment for the sake of exploring technologies, architecture styles, desing patterns, and so on, just for the sake of it (don't take me wrong, I've done it all my life).
So my first advice, as quite an experienced software developer, is always go back to some fundamental principles before starting anything, before thinking to anything, and perhaps the most important principle of all is KISS: Keep It Simple and Short (search it up, there are a few versions of what those letters represent :) ). In your case, since it's a school assignment, simplicity is even more important because it makes things clear which makes learning so much more effective.
When dealing with complex tasks like this, another fundamental element is focus: where should you keep your attention when designing and then developing a software product?
In this specific case, I lack what the original assignment was requesting, but I'm quite sure the point (or one of the points) was to make you think and then act on something that didn't require months to be developed, it was to make you learn how to accomplish a task without getting lost in details or in a project too big to be finished in a finite time.
I may be wrong, but I'll keep this in mind when writing the below lines.
FIrst, the architecture of the software product looks like a classic three tiered one: frontend, backend, database. Keep in mind another fundamental principle here: the separation of concerns, which leads to different decoupled architectural elements. Also, just for clarity, the frontend(s) will talk only with the backend, while the backend will talk with the database: this will help you isolate the database from the frontend, ideally enabling you to change database technology if needed.
Second, you explained you want to go web and mobile for the frontend tier: this inevitably will lead you to the conclusions you pointed out correctly, having to choose a number of platforms and languages to basically create the same application, but the fragmentation of different knowledge and procedures can make your life quite complicated and probably miserable.
On the database tier, remember NoSQL databases can be quite powerful, but in your case try something very simple (redis can do), or just go with MongoDB as it makes easy to start and evolve your data structures. If you're more the structured type and you want to go RDBMS, try postgresql, it's easy to start (it has also NoSQL features) but so much more powerful and you could learn real SQL on it (stay away from the omnipresent MySQL, it's kind of odd sometimes).
I hope the above didn't sound too much of a lecture, and I also really hope you learn the most important lesson of all: always keep in mind the big picture!