PodSearch

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.