I'm eager to begin a side project for learning purposes, and I'm seeking some guidance on which technologies/frameworks/libraries to use, and how to structure the application, at least at a high level. I'm a front-end developer, and while I've done some miscellanous work with server-side programming, databases, etc., this will be my first attempt to personally create a full-stack application. I've decided to use Node.js as the server-side environment, but that's my only firm requirement.
I've already come up with an idea for the application. Here are some notes on its features:
The utility in this application will come from its ease/speed of use and from striking the right balance between simplicity and extensibility. To the former point, you should be able to edit project/tasks descriptions in place, click to toggle metadata, drag & drop to move tasks to different projects, etc. There should be minimal list management overhead. To the latter point, you should only have to enter as much metadata about each task as you care about or is useful to you, and thus get out of the application as much utility as you've put in in effort. If you want to use the app only to record and update your list items, that's fine; if you want to finely manage deadlines, specify the importance of every task, etc., then that's fine, too. The more you put into it, the more you get out of it, but there's no enforcing data entry beyond a simple line item description for each project/task.
This all suggests to me a one-page web application (and ideally, eventually mobile-friendly) with perpetual saving in the background. You should be able to log in, move some stuff around, mark some stuff as completed, and close it down. No formalities, just like a written list. It will be an ever-evolving list that should ultimately save you time, not create the burden of extra overhead to track all of your small daily tasks.
So, given all of this, I'm seeking some recommendations on how to approach developing this application; essentially, how to architect it. Should I use a client-side MVC framework like Ember.js or Backbone.js? What database is best fit for storing this kind of data, and what should my schema look like? How do I approach CRUD/REST and routing? As a single-page app, will I have to resort to one huge controller? What does the data look like that I'm transporting between the server & browser? Again, my only hard decision has been to use Node.js on the server, since the point of this undertaking is mainly to leverage my JavaScript skills to dive further down the stack (and, hopefully, to come up with a useful application!). Everything else is wide open to recommendations.
Given your recommendations, I'm confident that I can dig into the specifics of these technologies and figure out how the pieces fit; I'm just mostly at a loss right now since there are so many options and approaches for how to structure an application, and while I've fixed a bug in a Rails view here and there, I've never architected a complete application; I don't fully understand the fundamentals of how this all comes together. I'd love some feedback along the lines of "each task in the list can be a document; use Redis to store a JSON object with the properties of the task, and when a user updates a task in the browser, compose and send this object from the client to your controller to update the Redis document". That's probably total malarkey, but hopefully you get the point. Any links to tutorials, demos or other examples are also much appreciated - I've already read and watched a lot, but I can never seem to mentally map these more general explanations to my specific use cases.
Please let me know if there is anything I've been particularly naïve about, or any important details that I left out, or if it's just not entirely clear what I'm asking for.
I also realize that this type of question isn't the ideal use case for SO since there is no "right" answer, but I think the best answer will simply be the one that is most helpful.
Big thanks in advance for any help!
If I were building this, I would use Backbone.js, and use a simple RESTful CRUD interface (which Backbone's default sync method is built for), but thats just me.
With this approach you could have a task model, extend that to a subtask model (adding in a parent attribute), and have each task (and thus subtask) having a collection of subtasks.
Syncing would be simple, as you can just use Backbones building sync method and a basic RESTful CRUD server.
You can include any validation you want right into your Backbone model, and bind to a tasks subtasks by listening to a custom event on that collection (triggered when a model in that collections state changes) to determine if the task (and all subtasks) are complete.
I know that this post is kind of upvoting Backbone alot, but it is a subjective question, and this is my opinion.
Server side I would recommend using Express, and you may be able to make use of the express-resources modules to make your REST implementation easier.
Again, this is just my opinion. Feel free to ask questions.