#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: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: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: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.