Building an Events Application: Requirements and discussion of choice of technologies
Right! In my previous post I talked about my project of creating an events application as an alternative to facebook events. In this article we will discuss user- and performance requirements, and talk briefly about possible technologies to use for the project. So what do I actually want to the application to do and not do? Time to get down to brass tacks here.
The events application should be able to:
- Have users using SSO (Single Sign On)
Create new public events:
Have an event title
A text description of the event in question
Include photos for banner
as well as in the description(upload)- The photos in the description on top of the ability to have one as a banner opens up for customisability of the event page, which for now I am going to limit in the interest of time-saving. The event page should have text fields for headline and body.
Hold a time range for the event
Hold an address/geolocation
Have one or more owners of an event
Add tags to event
Make event private (Not shown on search)
Interact with events:
Subscription to events (push-messages for event updates, cancellation, etc.)
Add attendance to event (Automatic subscription)
Add event to your phones calendar
- Make change to calendar in case of changes to time or location or in case of cancellation (Push message with prompt to change)
Suggest changes to event if user is not the owner
Share the event with other people via link (Also the way to invite people to private events)
Show event on a map (potentially opened in google maps)
Add comments to events (Future editions)
Find events:
Search for events
Filter events using tags
Filter events using time (Think "events today")
Filter events using geolocation
- Adjust maximum distance
Show events near the user on list (using filters if any)
Show events near the user with pins on a map (using filters if any)
Favorite an event (With potential subscription)
Now for the sake of granulation, and nut cluttering the minimum viable product (MVP) I am going to cut out SSO and the features it enables, and save it for the next iteration of the app. This means that attendance and favorite events will not be in the MVP as well as event ownership. However, I still want to pick a framework for developing the api which have dedicated libraries for easy implementation of SSO.
System requirements
Now that we have looked into the user requirements, let's have a look into what this means for the requirements of the system. As I have previously stated in my initial blog post, I want to make a phone and web application that interacts with the backend through an API. Therefore I am going to split the requirements into server side requirements and client side requirements.
Server side requirements
So what do these user requirements tell us about the requirements of the server side application?
There are a few things we can reasonably deduct:
The application is primarily a simple CRUD application, and there will not be large amounts of heavy computing involved
There will be more people looking for events in their vicinity than people creating these events, which means that there is going to be considerably more reads to the database than writes
Events will be filtered and found using geolocation, timestamps as well as tags. This means that we will have to use a data-model that can store and effectively search in such datatypes. Especially geospatial search could prove to be a bit tricky.
The system should be able to store and easily look up high resolution images for rendering on the events
Client side requirements
The client should:
Be able access the users geolocation
Have easy access to use of maps - Preferably google maps, as this is what most users customarily use and thus has the interface they know the best.
Be able to push messages to the user
Have the ability to make changes to said event in users phone, if granted access
Performance requirements
Taking into consideration that this project is chiefly aimed at smartphone users, we can make some general requirements that boil down to user experience:
- It should not take more than two seconds from searching/filtering events until a result is displayed on the client application
When it comes down to the server side application, we can be relatively lax as this is a hobby project, which is more about learning new technologies and honing my skills, than it is about amassing a huge user base. However, if the project should for some reason become popular, it would be prudent to design the system with scalability in mind. For now, let's stick to some simple and not overly ambitious requirements:
The system should be able to handle that api requests are replied to within two seconds, for up to 100 requests per second. Let's say that this should be the case for the 95th percentile of all requests.
A maximum of 2000 simultaneous sessions at a time.
Zero downtime is not necessary. For now, new features can be introduced at night time, although error handling should be handled with a type of middleware. Error handling and response to end user on failure is a whole beast on its own, which should definitely be touched upon later in the process.
Have I forgotten anything when writing down the requirements for the project? Definitely! For now we are going to head on to the next thing, but I will revisit the requirements in a later blog post or cheat a little and add the requirements in this post as they appear 😉
Choosing the technologies
It's time for the difficult part. Actually picking which programming languages and technologies to use! As I mentioned in my previous blog post I am looking to learn new languages and technologies, and maybe brushing up on things that I have previously worked with. But I have been working with the python framework Django the past three years, and the more I think about what the application should be capable of, the more I think that Django is a great choice for the backend part of the project. It has a great framework for quickly exposing an API called django REST framework, it has built in user management, a really well made ORM, and an API for modelling with geospatial data! It also has a great template language for the frontend part based on Jinja2 called Templates, if one wants to use it for that part as well. Did I mention that it comes with built in admin site that can be customised and used as a backoffice?
But no, damnit! I am only doing this project not just to show my capabilities and my thought process, but to learn something new as well. A language that I have been wanting to try out for a while is Golang. So does it even make sense to make the server side part using Go? In my next post we're going to have a look at how feasible this actually is. I'm not going to go into details about Go as a language, but rather if there are any frameworks and libraries that can help me build the application so I can prevent having to build everything from scratch, thus completely exploding the scope of this project.