Manuel Schoebel
Tuesday, 06. May 2014

Building an MVP -

As a startup founder and developer I really like the approach to start a new startup idea really small in order to invest as little time as possible to get an initial fealing weather or not my idea is worth investing more time or not. A benefit for clients of course is, that they also do not invest too much time and money but can start evaluating their idea quickly. This small application is called an MVP (Minimal Viable Product) and as I’ve written before, Meteor is the perfect tool to start fast, but also to evolve the initial small project to a large application later on. is exactly this, an MVP to learn very early on if the idea works and how it can be improved. Amir Rahbaran strongly believes in online education and came up with the idea to create an online plaform where everyone can create an online course. What makes crowducate special is that everyone can participate at an online course, just like you can on github. That means you can read a lecture of a course and if you find something you can correct or improve, you can simply edit it. The author then gets a change request and if he or she accepts it, the lecture is updated instantly. Also it is possible to even copy the whole course and modify it as you want. Besides this open source features for e-learning, Amir decided to make the whole plattform open sourced as well, so you can find the source code at github.

Amir started developing crowducate himself first and for someone who never programmed before, he came really far and I helped him along the way as much as I could. He also attended to our Meteor Meetup where we could discuss some problems of him, too. But, time is important so we decided that it would be better to let me develop an MVP.

Some of the basic features we needed were:

  • User accounts (Login, Register …)
  • Create Courses (with sections and lectures)
  • Make a change request
  • Copy the course

User Accounts

For the user authentication we used a fork of accounts-entry which I created some time ago when there were some parts missing I needed. For your new apps I would use the original package or simply implement something more individual on your own, since it is not too hard because Meteor comes with an Accounts package that gives you everything you need (login, logout, create user, send verification mails and so on).

Create Courses

For the courses I decided to create one collection for a course, one for sections and another one for the lectures. Each document references to its parent one (lecture has a sectionId, a section has a courseId) so that you can get all documents easily if you e.g. subscribe to a course. In the publications I chose the so called ‘naiv approach’. The downside of this is, that if a user looks at a lecture and the author would add a new one, this change would not be updated in realtime. But if the user changes to another lecture, the new lecture would be available again. There is not yet the perfect way to publish “joined collections” but for this usecase where you normally would publish a complete course rather then update it in realtime, I decided it is not that important, so keeping it simple is the way to go. Also publications like this will be part of Meteor core and it is one of the features that is quite on top of the list and this will be the time when to optimize further. If you really need joins like this me personally would use client side joins (wait for course data -> then subscribe to sections of the course and wait -> then subscribe to lectures of all course sections and wait -> then render) because those are easy and you cannot make much wrong. If the additional roundtrips that occur with this strategy are not an option (e.g. you have much traffic or much more dependend data) you can create your own observeChanges method.

But in general I really would not optimize every little bit too early. Think of the purpose of the MVP: Get user feedback fast! And not: Build a highly scalable application. This comes, hopefully, later on.

Make a change request

For the change requests I found the perfect library that comes from google called Diff Match and Patch that displays the difference between strings and this is exactly what a change request is. The change request itself is also its own collection and stores the changed version.

Copy the course

Lastly the copying of the course feature came with a little discussion weather it is really necessary for an MVP. In my oppinion it is not, because the change request is the one main feature that differentiates crowducate and is enough to make a first test of the idea. Amir had some good arguments to also include it in the first iteration of the MVP because this feature is a big statement in terms of open learning. All knowledge on crowducate is really for everyone and if your change request is ignored you can take the course and improve it the way you like. But also if you want to translate a course this is a really great feature, simply copy the course and translate it. Also this feature will show how people really think about open learning in general. Technically this is more or less just a copy of the course document and all its depending documents with a new userId for the owner attribute.

Conclusion and next steps

Thanks to Meteor it was possible to create this project in under two weeks as a single developer and Amir is able to get feedback and make crowducate better and bigger over the time.

Since the project is open sourced on github everyone is invited to help improve it further or to use it for you own purposes.

Links you should follow, too: Welcome To Crowducate
Amir about crowducate: Crowducate - My journey for an opportunity

Teile den Artikel, wenn er dir gefallen hat:

Du willst wissen wenn es etwas Neues gibt?
Dann melde dich kurz bei meinem Newsletter an!

Durch Anmeldung bei meinem Newsletter willigst du zur Erfolgsmessung, dem Einsatz des Versanddienstleisters MailChimp und Protokollierung der Anmeldung zu. Mehr Informationen dazu und zu deinen Widerrufsrechten findest du hier in der Datenschutzerklärung.