Developing Perspective

#80: Managing functionality.


00:00:00   Hello and welcome to Developing Perspective.

00:00:03   Developing Perspective is a podcast discussing news of note in iOS development, Apple, and

00:00:07   the like.

00:00:08   I'm your host, David Smith.

00:00:09   I'm an independent iOS developer based in Herne, Virginia.

00:00:11   This is show number 80, and today is Wednesday, September 19th.

00:00:16   Developing Perspective is never longer than 15 minutes, so let's get started.

00:00:19   All right, so today is iOS 6 launch day, kind of exciting.

00:00:23   It's off into the hands of the general public.

00:00:27   And my guess is it will very quickly become the predominant OS for iOS development, the

00:00:33   App Store, et cetera.

00:00:34   I'm going to be tracking that on my usual iOS stats page, which I think I mentioned

00:00:38   in the last show, but definitely something to be checking out.

00:00:41   It's a little early at this point.

00:00:42   I'm recording about 3 o'clock Eastern, and I think it's only been out and live for about

00:00:46   two hours.

00:00:47   So it's a little early for the average person to probably have picked it up.

00:00:50   Most of them are probably at work and so on, and I suspect it will be a big bump tonight.

00:00:54   But overall, it's kind of exciting.

00:00:57   Generally speaking, it doesn't affect too much

00:00:59   other than making things work for my applications.

00:01:03   I mean, there's not a huge,

00:01:04   there's some change to the App Store

00:01:06   that are probably significant

00:01:07   in terms of the way search looks and some things

00:01:10   that you're all definitely gonna wanna go look

00:01:11   at your screenshots, make sure they look sharp,

00:01:13   'cause screenshots are much, much more important

00:01:15   than the iOS 6 App Store.

00:01:17   But anyway, I'm gonna be moving back

00:01:20   after kind of the excitement of the iPhone 5, iOS 6 stuff.

00:01:23   I'm gonna be moving back into this project

00:01:24   working on a weather app.

00:01:27   And I want to talk a little bit about the next step

00:01:29   of the process.

00:01:30   And last time, I was focused on talking

00:01:33   about the prototyping phase.

00:01:35   And what I'm going to talk about now is managing functionality,

00:01:39   managing a feature set, understanding

00:01:41   how do you best scope a project and define

00:01:45   what you're going to do and how that's going to look.

00:01:48   So the first thing I'm going to emphasize

00:01:49   is the importance of having that early prototype.

00:01:52   If you haven't heard the last couple

00:01:53   episodes over on Talking About Prototyping.

00:01:58   Highly recommend listening to those and working through.

00:02:00   Because the most important thing,

00:02:03   and perhaps it's a little counterintuitive,

00:02:05   the most important thing about scoping

00:02:06   and understanding the tasks and functionality

00:02:09   and the feature set of your application

00:02:12   is going to be most clear when you actually have

00:02:14   that application.

00:02:17   And that's a little bit Carp Before the Horse

00:02:18   or chicken and egg, but until you really can get your hands

00:02:18   on something and feel it, and you take that idea and the concept that you had, and can

00:02:23   actually play with it.

00:02:24   I personally find it really hard to know what it should do.

00:02:28   And more often than not, I start with a vague concept, I implement that concept, I run with

00:02:32   it for a little bit and get something working, and then I'll grow from there and grow into

00:02:39   something that is much more, a stronger app, a better app, a more useful app.

00:02:46   And the best way to do this, and this is something that,

00:02:51   for some of my apps I don't do as well,

00:02:54   but for this particular project on this weather app,

00:02:56   it works really well, is I've been using my early prototypes.

00:02:58   I'm about three weeks into development now,

00:03:02   and I'm basically done.

00:03:04   But I'm about three weeks in,

00:03:06   and I've been using it pretty much every day

00:03:07   for the last three weeks.

00:03:10   And the first day, I had a really rough version of the app.

00:03:12   I mean, it was basically hit a weather API,

00:03:12   load the data, show it, and that works.

00:03:17   And that became my main weather app.

00:03:20   And then as I've been growing and developing

00:03:21   the feature set, that's what I do every time.

00:03:23   We've had big storms, I open it up, I look at it.

00:03:25   I want to be using my app constantly.

00:03:28   I want to be using it more than the average user would.

00:03:30   I want to be able to find all the weird rough edges,

00:03:32   all the edge cases, all the funny things

00:03:34   that just don't feel right, and I want to find them

00:03:36   before my user does.

00:03:38   And the only way you can do that is to use it constantly.

00:03:38   Just in an absurd way sometimes,

00:03:41   like I check the weather at night,

00:03:43   but I'm not expecting to go out.

00:03:45   I want to make sure there's no weird things at night,

00:03:46   there's no weird things at day,

00:03:48   different times, different networks.

00:03:50   You know, I walk past a Starbucks,

00:03:52   I'm like, okay, let me just get on their WiFi network

00:03:53   and load the app and make sure it works okay on that.

00:03:56   Load the network conditioning tool.

00:03:58   And we're starting to get into a little bit of testing too,

00:04:00   but from a feature and functionality perspective,

00:04:03   it really helps me because what it does

00:04:05   it lets me understand how it would actually be used, rather than just this theoretical

00:04:10   concept of, "I want a beautiful, minimalist, clean, fast weather app."

00:04:16   Okay, that's a concept, but as a figure, exactly what data I show, exactly the interactions

00:04:21   that I use to get at that data, these things are very fluid and very dynamic.

00:04:25   And the only way to understand what those are really going to be is, in my experience,

00:04:30   is to actually build something and be playing with it on a constant basis.

00:04:33   If you're building an app for a client, the earlier you can get something into their hands,

00:04:39   the better, because what they thought they want may turn out not to be what they want.

00:04:45   And really, the core goal here is to avoid wasted work.

00:04:49   And the way you avoid wasted work often is by rather than building to sort of in the

00:04:54   classic example of like the waterfall model, where you decide what you're going to build,

00:04:58   and then you build it, and then you test it, you make much smaller choices.

00:05:02   and this is classic agile or iterative development,

00:05:05   but the goal is that you're constantly improving it

00:05:07   and you're not building major features that you don't want.

00:05:10   That doesn't mean you won't throw things away.

00:05:12   I mean, there are some functions and features

00:05:14   and functionality in my app that I built,

00:05:16   and then I said, "That's actually not really that great.

00:05:18   "Let's throw that out.

00:05:19   "Let's try again.

00:05:20   "Oh, that's not so great.

00:05:21   "Let's throw that out."

00:05:22   But overall, it's worked pretty well.

00:05:24   Overall, I really like the result,

00:05:26   and it's a lot of that iterative process.

00:05:28   And now, the funny thing is that I'm at a point now

00:05:31   that I've essentially, what I call, I've drawn the line.

00:05:36   What that means to me, and you can come with your own term

00:05:38   for it, is the application as it is today,

00:05:41   actually this occurred last night,

00:05:43   but I've hit a point that it is now ready to ship

00:05:48   from a functionality and feature set perspective.

00:05:51   It's not ready and polished,

00:05:52   I have to test it on the new iPhone.

00:05:53   There's all these other things that I'll need to do

00:05:55   before I can submit it, which I'm hoping to do

00:05:56   a week from Friday on the 28th.

00:06:01   But at this point, I'm no longer adding functionality.

00:06:04   I'm only polishing and refining functional functionality,

00:06:07   and I am bug fixing.

00:06:08   And that is an important distinction.

00:06:10   If you never draw that line in your functionality,

00:06:12   your feature list, like I had a big old to-do list,

00:06:14   and I was working through it,

00:06:16   checking off things, checking off things.

00:06:18   I got to yesterday, my to-do list was empty.

00:06:21   I had no other programming tasks that I had expected,

00:06:24   been planning to do or working on.

00:06:25   I either decided to defer them all, or I had done them all.

00:06:29   And so I'm like, okay, that's it, draw the line.

00:06:31   This is version 1.0.

00:06:33   This is what it will look like, this is the functionality and the feature set that it

00:06:36   will have.

00:06:37   And now my goal for the next week and a half is just to make that feature set as awesome

00:06:41   and polished and professional as I can.

00:06:44   And I'm trying to overemphasize this, because often what I've had with my friends and people

00:06:49   I know who do a development project, what they end up with is they're constantly thinking

00:06:53   of these new things.

00:06:54   Oh, what if I did this?

00:06:55   Oh, what if I did that?

00:06:56   Oh, what if I changed this?

00:06:57   What if I added this feature?

00:06:58   And the problem is they never ship,

00:07:03   or they ship way later than they actually wanted to

00:07:05   or they thought they would,

00:07:07   because they're always chasing their tail.

00:07:08   You can never get anywhere if that's what you're doing.

00:07:11   And the important thing is,

00:07:14   I'm not saying don't do those features.

00:07:15   I'm just saying you need to be focused

00:07:17   on what it is that you want to ship

00:07:18   and what you're trying to accomplish.

00:07:20   What goal are you trying to have?

00:07:21   What problem are you solving for your users?

00:07:23   Those kinds of things.

00:07:25   And if you don't have a clear vision of that,

00:07:26   you're just going to be running around forever.

00:07:25   And another part of drawing a line and saying, "This is the feature set I'm going to build

00:07:29   and go no further," is it's really important, I think, to have things up your sleeve, to

00:07:33   have features and functionality and things that you can add to the application later.

00:07:38   And I don't mean that in the sense of you want to ship something that doesn't work or

00:07:41   that's partially functional or not fully useful, but what you want, I think it's great if you

00:07:47   can have a few features and functionality that's sort of up your sleeve, that you can

00:07:51   roll out as a 1.1 pretty quickly.

00:07:54   maybe it's a week later, maybe it's two weeks later

00:07:59   after launch.

00:08:00   Because I feel like that really helps galvanize

00:08:01   your audience that you're invested in this app,

00:08:04   that you're in this for the long haul,

00:08:06   and it's a good thing for them to invest in,

00:08:09   and either invest their time and put it on their home screen

00:08:12   and use it all the time, which is great,

00:08:15   or invest in it and put their name on it

00:08:17   in terms of recommending it to a friend.

00:08:19   No one wants to say, "Hey, I got this great app,"

00:08:20   and then turns out, "Oh, it hasn't been updated in a while.

00:08:20   that app you recommended really kind of stinks now.

00:08:25   That's not what you want.

00:08:28   You want them to feel like, man, they bought something

00:08:29   and it keeps getting better and better and better.

00:08:31   And so I have a list of features and things in plan

00:08:34   that I've actually built a lot of these,

00:08:36   in terms of prototype stages or vaguely working things.

00:08:38   And they're just kind of turned off in the application

00:08:42   so that next, you know, whatever, once I ship and launch,

00:08:44   I can have these things ready to go.

00:08:47   It gets approved, I can immediately submit it.

00:08:46   I can be just on top of that and hopefully build a bit of momentum with my user base.

00:08:51   So don't feel like you're not going to ever get to do those.

00:08:57   You're more likely, honestly, to ship those things and have customers use them if you start drawing lines

00:09:00   and saying, "I'm going to do that next. I'm going to do that next."

00:09:05   Because if you don't, you may never get to next.

00:09:08   You may never ship because you'll just be stuck in this cycle of constantly changing things.

00:09:11   Some people talk about the concept of a minimum viable product.

00:09:16   It's this kind of, I don't know, marketing phrase

00:09:20   for a certain software methodology.

00:09:22   I personally don't like that philosophy,

00:09:25   mostly because the concept of viable

00:09:27   is totally amorphous and impossible to define,

00:09:29   as far as I'm concerned.

00:09:33   Viable is what customers will buy,

00:09:34   and you won't really know what customers are going to buy

00:09:36   until you've shipped it.

00:09:38   So you can't really know what something is minimal,

00:09:39   the minimum viable function,

00:09:38   and our feature set until you actually have shipped that app.

00:09:41   But what's important and what I'm trying to get across here

00:09:44   is that if it's useful and you've been using it all the time

00:09:46   and you think it's functional and you think it's worth it

00:09:49   and you show it to a few friends, you show it to some family members

00:09:51   and they say, "Yeah, that's cool. I like it. Maybe you do this, maybe you do that."

00:09:54   And you collect that feedback, you can very quickly get to something that's useful.

00:09:58   And useful is far more interesting to me than viable

00:10:03   because useful is much easier to define.

00:10:05   What I want to do is I want to ship something that is

00:10:10   maybe a minimally useful application,

00:10:14   or something that has a definitely useful functionality.

00:10:18   Something where what it does is immediately obvious

00:10:23   that yes, I can see how that would improve my life.

00:10:26   I can see how that would be helpful.

00:10:28   And I'm trying to scope and manage my feature set

00:10:30   around that concept so that when someone looks at the application

00:10:31   they're like, "Yeah, that's great.

00:10:36   I see the problem that solves."

00:10:37   And if you're building features that aren't solving problems

00:10:40   that are just sort of flashy,

00:10:42   or sort of appeal to you to a very niche audience,

00:10:44   I'd be really nervous about that,

00:10:49   because I'm going to end up spending a lot of time

00:10:51   on something that may not actually matter.

00:10:53   What I'm trying to build often

00:10:55   is I'm trying to build a layered application.

00:10:57   And that's basically what I've got going on

00:10:56   in the email weather app, like in the sense that if you just open the app,

00:11:01   there's a quick little tutorial, kind of a few little screens you go through,

00:11:06   and that's all you ever do.

00:11:10   From then on, that app is useful.

00:11:12   It's going to show you the current locations, weather,

00:11:14   in a nice clean interface with a few other bits and pieces, and that's great.

00:11:17   Now, that's my first level.

00:11:21   It's immediately useful and obvious.

00:11:22   Every user who downloads my app should be able to see that.

00:11:22   And then what I've done is I've built functionality around that

00:11:25   to try and enhance that functionality.

00:11:27   So there's all kinds of other gestures and things and options

00:11:30   that you can do to see more information,

00:11:32   to see information tailored to the current weather,

00:11:34   and all these kinds of things that I'll share in more detail

00:11:36   once I actually ship the app.

00:11:38   And then I have additional functionality and settings

00:11:40   and options on top of that.

00:11:42   And what is kind of nice about that approach is at any point,

00:11:46   if I'd been dragging on, I could have not added a layer.

00:11:50   Because there are many other layers

00:11:52   I can add on top of even what I have now.

00:11:54   It's kind of like peeling the onion.

00:11:56   I can keep adding functionality that goes out and out and out

00:12:01   around a really solid core.

00:12:03   But I couldn't get there if I didn't start with that really

00:12:05   solid core and then add another layer of functionality

00:12:08   around it and add another layer of functionality around it.

00:12:11   And I'm trying to use this layered approach concept.

00:12:13   Because hopefully what I'm trying to get across

00:12:14   is that if you don't start with a really solid kernel

00:12:17   at the middle of that, it's kind of like when

00:12:19   you're growing a crystal.

00:12:20   You want to have really perfect crystal in the middle so that everything else grows out

00:12:24   nice and uniform.

00:12:25   And so what I will be really focused on is trying to get that core experience, the core

00:12:29   functionality as absolutely bulletproof as possible.

00:12:32   It's an application for editing text.

00:12:34   You want that editing screen to be amazing.

00:12:37   No one really cares how good your file management is and your search and all these other things

00:12:41   if you can't edit your text file.

00:12:43   If your app's a reading application, that reading experience needs to be amazing.

00:12:48   if your app is, I don't even know, I'm trying to think,

00:12:51   like if it's a clock app, you need to be able to tell the time.

00:12:55   You know, there's all these things that are just,

00:12:57   whatever your core experience is has to be absolutely bomber.

00:13:01   And then once you've got that going,

00:13:03   then you add on additional things on top of that.

00:13:06   So that's how I manage sort of feature set and functionality.

00:13:10   Start with a kernel of a good idea, really implement that in.

00:13:12   Get that in early, use it all the time,

00:13:14   and then build out from there.

00:13:16   and at some point draw the line and say,

00:13:17   "Hey, this line, this layer, that's where I'm going to stop."

00:13:21   So that's what I've been doing.

00:13:22   Like I said, it's been going pretty well.

00:13:24   This weather app's basically done.

00:13:26   I've drawn the line, now I'm just polishing

00:13:28   and cleaning things up.

00:13:30   Today I actually did a whole bunch of performance stuff,

00:13:33   mostly because I was kind of worried that on Friday

00:13:35   when my iPhone 5 shows up, I'm going to be really,

00:13:38   I'm not going to care as much about performance

00:13:40   because if everything they say is true

00:13:42   and it's about twice as fast,

00:13:43   I'm not going to have to worry about

00:13:45   as much of a lot of things.

00:13:46   I mean, it's not a hugely performance-intensive

00:13:50   application, so maybe I don't need to worry at all.

00:13:53   But I've worried about it now.

00:13:54   It's as fast as I can get it.

00:13:55   And now when the iPhone 5 shows up on Friday,

00:13:59   it should be absolutely bulletproof.

00:14:01   That's my hope, anyway.

00:14:02   But otherwise, I hope you guys have a great rest of your week.

00:14:06   I mean, we're probably going to shift the next show to Friday,

00:14:09   just because I want to talk a little bit about my new iPhone

00:14:11   5, hopefully when I have it in my hands.

00:14:13   a little bit of talking about that,

00:14:15   as well as any thoughts and responses I have

00:14:18   based on what that means for development.

00:14:19   So anyway, I hope you enjoy getting your phone.

00:14:21   If you got one, if not, drop by the Apple Store

00:14:23   and pick one up and look at it,

00:14:25   even if you can't take it with you.

00:14:27   By the way, it's been a great week.

00:14:28   Happy coding.

00:14:29   It's an exciting time, and enjoy it.

00:14:31   Bye.