Thursday, 4 October 2012

Windows 8 App Development - Pt 3 of ?

App Project Planning and Design.

Whaddup Internet

I'm going to build an alarm clock app... not exactly a billion dollar idea but I think it will cover some interesting stuff without being too much work AND it pisses me off that Windows doesn't have a decent alarm clock utility - it's irritated me for years...

Now I'm not going to spend a huge amount of time on project planning and design for this app given I am doing all the work anyway and the concept is quite simple. I have a clear idea of what I want to get out of the final product but its always prudent to do some planning before embarking on any project no matter how small.

The planning approach I use is based on Prince2 project management, it's a product based planning approach which is both easy and comprehensive enough to ensure success. Normally in real application development we'd be spending quite a bit of time understanding the business requirements and forming a project team of people who have an interest in the project but it's just me and the app won't be big enough to form a committee so we'll skip to assembling a list of all the "products" or "deliverables" of this application.

To do this I looked at all the alarm clock apps I know and assembled a huge list of features which could be included, ideally I'd like to include almost all of these in the final product but we need to get on with it so I did a MoSCoW analysis (Must, Should, Could, Won't until later) and created a v1.0 list of features I must have in this app:

v1.0 list of features
  1. display current time
  2. set an alarm
  3. alarm plays a media file
  4. alarm can be snoozed
  5. alarm can be repeated at regular intervals (weekdays or weekends)
  6. alarm can wake up the machine from sleep
  7. alarm can sound at the specified volume even when volume turned down.
Sounds like an alarm clock to me and is a good basic place to start but often where people go wrong in development is that they don't specify the quality expectations of their requirements, so what happens is the developer goes and builds something that meets the documented requirements but is not what the customer expected... I'm doing everything for this so it's unlikely that I'll build something that does not meet my own expectations but for this example and as the person responsible for quality in my project lets expand my list a little:
  1. display current time - has to be a large 'digital' clock that is easy to read, user can select 12hr or 24hr time, clock shows AM/PM, clock does not require seconds. must update every second. must be good looking and easy to read from a distance.
  2. set an alarm - user can set 1 alarm multiple not required in v1, the alarm will play the media file selected at the specified time even if the app is not running. Alarm time will be displayed near the clock to indicate it has been set.
  3. Alarm plays a media file - media file can be anything video, audio or web-link to youube video, can play in native 3rd party player but...
  4. Player must have a snooze option so an embedded player might be required.
  5. Alarm can be repeated - user can tick which days of the week the alarm goes off.
  6. Alarm can wake  the machine  - from sleep or hibernate modes... preferably can also go off in low battery modes.
  7. alarm controls hardware volume  - to ensure alarm sounds at the specified volume no matter hardware volume state. To ensure user is alerted in the manner selected.
Given that this is not a massive list lets consider each function of the app a "product" that means based on the requirements above our product will be something like this:
  1. Main Function() - function to run the app startup and close down
  2. Display clock()
  3. Set alarm()
  4. Run in background()
  5. Save alarm data()
  6. Read alarm data()
  7. Set 24hr time()
  8. setAMPM()
  9. Update Clock()
  10. Alarm Trigger()
  11. Alarm Snooze
  12. Wake Device()
  13. Set Alarm Volume()
On top of the functions we have 3 page designs required:
  1. Clock page
  2. Alarm Settings (new/edit)
  3. Alarm Triggered
Even though we started with only the bare minimum of requirements for this alarm clock app there is some significant work to do to get this across the line! I have a whole swag of extra stuff I want to add to this app and I'm sure I've overlooked something which will come out in the development but this list of products is a great start.

Now you know I'm not satisfied with just a list of products we need quality rules on the products and the last step is to guestimate the length of time to build each bit too - lets update the list with a description and any quality and time details.
  1. Main Function()
    • Function to run the app, app must load quickly and shutdown cleanly releasing all unnecessary resources. time: 1 day
  2. Display clock() 
    • Read clock look/feel settings and display clock on the screen, clock must update every second, clock must always be visible when setting alarms. Time: 1 day
  3. Set alarm()
    • Create alarm object according to alarm settings: time, snooze time, recurrence, media file. Time: 1 day
  4. Run in background()
    • Run a service which monitors the time and compares to our alarm data. Time 2 days
  5. Save alarm data()
    • The alarm data needs to persist across sessions - Time 1 day
  6. Read alarm data()
    • Read the stored alarm data and update the alarm when service or app is restarted -Time 1 day
  7. Set 24hr time()
    • Set the clock to 24 hr display: Time 1 day
  8. setAMPM()
    • Turn on AMPM mode and display correctly: Time 1 day
  9. Update Clock()
    • Update clock data every second and check for alarm trigger: Time 1 day
  10. Alarm Trigger()
    • Function to manage Alarm trigger event:Time 1 day
  11. Alarm Snooze
    • handle snooze button and reset alarm time to new snooze time: Time 2 days
  12. Wake Device()
    • Control hardware to wake device and sound alarm even when sleeping: Time 2 days
  13. Set Alarm Volume()
    • control hardware volume to ensure alarm sounds at set level despite current volume state Time 2 days
On top of the functions we have 3 page designs required (the only quality requirement is that they look good to me):
  1. Clock page
    • Time: 1 day
  2. Alarm Settings (new/edit)
    • Time 1 day
  3. Alarm Triggered
    • Time 1 day
So now we have a great view of our project's requirements:

Time: 20 days
Cost: 20 days of my time or I guess we could put it on freelancer!
Scope: see above list of products.
Quality: see above list.
Risk: low risk, low impact, low cost, low likelihood of something going wrong.
Benefits: We get our first app under our belt. Increased reputation. Chance of selling later more sophisticated versions in the store.

That was a pretty simple exercise but we sort of covered the really important stuff... I don't recommend this approach if you are running a full blow development but we need to carefully tailor how much project management overhead we put on this given its just me so for my purposes its just fine and breaks up the project into achievable "chunks" which will help with my motivation and hopefully ensure get this done. If you are considering using freelancer.com or some other service I strongly recommend you have good project management skills and do something like this plus a little bit more work on quality expectations, who is responsible for checking quality, justified benefits and possible risks and you'll get a great result every time.

This really only covers the development of the app and not the subsequent uploading to app store etc ( I should have put that "out of scope") but frankly this is really the hard bit and we can cross the rest of the bridge when we come to it... we might need another plan if the app doesn't meet MS quality standards.

Sorry about the long post... Next we find out how good my time estimation skills are and build our first few functions.:

Peace


No comments:

Post a Comment