tl;dr; Describe the features and functionality you imagine for your application and give them priorities in how you prepare and develop them.
Let’s take the next step on your creative project. Let’s try and separate out each of the features involved in making your app a real thing.
As a starting point, it’s really helpful to define up front the things we’ll need to spend time writing code for - the things that need to happen. We’ll make a as a wishlist of behaviors, functions and operations.
In addition to externalizing and calling out the things we’re going to need to implement, we’ll also try and prioritize them into things that are essential, and nice to haves.
Features and functionality
The functions of a system are the interactions that can occur between the system and its actors (through the interfaces). An interaction is a sequence of actor inputs (e.g. a user clicking a button or typing a message) and system outputs (e.g. sending an SMS message with specificc content). Typically the actor is trying to achieve some objective (log in, search for data, update data, perform a calculation etc.).
Basically, we need to define what our system will do for our users. These are its features.
Finding Features
Start by reviewing your proposal, and look for
Things the user does:
What are the explicit interactions they cause? When do they explicitly ask for information or an action to be performed?
- Information Requests - when the user is asking the app to give it some piece of information; this is a feature
- Data Stored or records created - if this is happening they’re acting on data (creating, modifying, deleting). Each of these interactions is a feature
- Confirmations - when the user confirms an action and it’s performed
Things the system does:
What are the implicit interactions the system does on behalf of the user? When does the system reach out to the user without their interaction? When does the system reach out to other systems or do things in the background?
- Scheduled Tasks: Sending an email, SMS or other message that the user didn’t ask for explicitly e.g. a summary of activities, a random gif
- Background Tasks: Connecting to a third party service to add additional utility e.g. pulling information from Twitter, etc.
An example:
Summary: NutriBot is a meal tracking application that’ll help you log your meals by SMS and give nutritional breakdowns for each entered meal.
Our Features are something like the following
- Check for Existing User - In every interaction check the user is onboarded / in our database
- Onboard a User - Go through the process of onboarding a user
- Log a meal - Save an MMS message to our database. Confirm it
- Edit meal log - allow a user to manually edit the nutritional information for a log entry.
- Reminder to log a meal - remind a user to log a meal if they haven’t yet today
- Send a weekly summary - send a summary of their goals
- Update user goals - ask the user to set their nutritional goals
- Update user bio - ask the user for some basic biographical information (age, height, etc.)
- Analyze food image - automatically analyze the food image and suggest nutritional information.
- Handle error with image - respond if they image couldn’t be accessed or saved
- Handle mis-understanding - respond if the bot doesn’t understand what’s being asked
- Help - provide some help information to a user if they need guidance
- Link to Withings Scale - automatically link to the Withings scale to pull in weight information
- Link to …
Note: This is only a quick sketch of some possible features we might want to implement. There’s probably a few more…
This is a good starting point but it doesn’t tell us much about where we should invest our time. For example, we probably don’t need to onboard a user immediately or store their preferences. Instead we could just add these to a database manually. So, let’s capture this information
Priotized
Use Excel, Numbers or a similar tool, to build a matrix as follows:
- On one axis, add the Priority or how important the feature is to delivering a core product or working prototype.
- High priority is something that absolutely must be in a first working version for it to be demonstrated.
- Medium would be something that could be mocked up initially but is ideally included for a finished version.
- Low is anything that isn’t absolutely necessary - nice to haves, bells and whistles, etc.
- On the other axis, add the Effort or how easily and quickly the feature can be implemented.
- Low Effort is something you could implement in an hour.
- Medium is something that might take an hour or two.
- High is anything that will take more than that.
Then assign each of your features to one of the cells. Ultimately you’ll end up with a map of features and you’ll want to focus on the High Priority and Low Effort ones first. You’ll get something like this:
As we start to build out our real application, you can use this to guide how you invest time in developing features.
Submitting your Matrix
Add it to your Project Markdown file in your student folder.
These files are written in Markdown pages (see this cheatsheet too)
You can edit this in one of the following ways:
- You can edit it raw within your text editor of choice
- GitHub provides an online inline editor - visit the repo, open the file, and click the edit icon in the toolbar (right hand side).
- You can use an online tool like Dillinger or StackEdit to develop your document, and then copy and paste to your repo.