#77: Prototyping a new project.
00:00:00
◼
►
Hello and welcome to Developing Perspective.
00:00:05
◼
►
Developing Perspective is a podcast discussing news of note in iOS development, Apple, and the like.
00:00:07
◼
►
I'm your host, David Smith. I'm an independent iOS and Mac developer based in Herndon, Virginia.
00:00:12
◼
►
This is show number 77, and today is Thursday, September 6th.
00:00:16
◼
►
Developing Perspective is never longer than 15 minutes.
00:00:20
◼
►
So let's get started.
00:00:22
◼
►
First, I just wanted to thank you all for the great feedback you gave me on the last show, number 76,
00:00:23
◼
►
The Best Way to Avoid Distractions.
00:00:26
◼
►
I heard a lot of people say that it was a really good, encouraging, motivating show.
00:00:31
◼
►
And so if you haven't heard it, and this is your first one, or you just skipped the last one,
00:00:36
◼
►
I'd highly recommend you find it.
00:00:40
◼
►
A lot of people seem to be saying that it's a really good one.
00:00:42
◼
►
So first, I appreciate your saying.
00:00:45
◼
►
I want to thank you all for the feedback, because I do this for you, for the most part.
00:00:46
◼
►
It's something that I do as a side project, my main thing, for the goal of sharing the lessons I've learned,
00:00:53
◼
►
and hopefully helping other developers.
00:00:56
◼
►
It's not a commercial project or anything like that.
00:00:59
◼
►
And so one of the biggest things you can do
00:01:02
◼
►
if you like the show is to just give me that high five
00:01:05
◼
►
every now and then when it's like,
00:01:07
◼
►
if I do something that really resonates with you,
00:01:09
◼
►
it certainly encourages me and keeps me interested
00:01:12
◼
►
and keeps me motivated to do the show.
00:01:13
◼
►
All right, so I think what I've decided I'm going to do,
00:01:16
◼
►
based a little bit on that feedback I got
00:01:17
◼
►
from the last show, and kind of just trying to decide
00:01:20
◼
►
where to head over the next couple of weeks.
00:01:23
◼
►
So in the last show I introduced, I was saying that I'm just going to be starting to work
00:01:27
◼
►
on a weather app for iOS.
00:01:29
◼
►
This sort of the story back story of that's in the last episode.
00:01:32
◼
►
Basically, that's what I'm doing.
00:01:33
◼
►
I'm working on a weather app, and I'll probably be working on it for about the next month
00:01:38
◼
►
My hope is to launch, I think, middle of the second week, October, something like that.
00:01:42
◼
►
So with review times and things, roughly I'll be working on it over the next, say, maybe
00:01:47
◼
►
month, month and a half.
00:01:48
◼
►
And I think what I've decided I'm going to do is I'm going to walk through this process
00:01:53
◼
►
from start to finish on the show and talk about how I'm going about doing what I'm doing.
00:01:58
◼
►
Now, some of the things I'll talk about are obviously, I'll be plain and straightforward and talk
00:02:04
◼
►
about some of the things I'll be a little bit more cagey about just in terms of it's, you know, you
00:02:09
◼
►
want to be able to control and trickle out some of the features, some of the UI, some of those kinds of things.
00:02:13
◼
►
I'm not going to jump in and share it all about it once as I'm doing it, but the goal is to kind of walk
00:02:21
◼
►
through this process and show the arc of developing an application, sort of from concept through
00:02:26
◼
►
to implementation, some of the marketing I'll do.
00:02:29
◼
►
And a big part of the reason why I'm doing it this way, and what kind of got me excited
00:02:33
◼
►
about the idea, is I want to try and synthesize and use all the lessons I've learned from
00:02:40
◼
►
my past failures, my past successes, all the things that I've done over the last, whatever,
00:02:45
◼
►
years that I've been writing iPhone apps, that I've learned about how to do it.
00:02:50
◼
►
And I want to try and really put all those, to bring all those to bear on this project.
00:02:55
◼
►
I want to make it that I'm doing all the things that I say, sort of I'm talking the talk about,
00:03:01
◼
►
I want to do those.
00:03:02
◼
►
And I'm going to be trying to do that in a way that I can talk about on the show.
00:03:07
◼
►
And that's hopefully helpful, that you can kind of over the next month and a half, whatever
00:03:11
◼
►
whatever that is, maybe 15 episodes.
00:03:14
◼
►
They won't all be about this.
00:03:15
◼
►
There's certainly things about like probably the new iPhone,
00:03:17
◼
►
the new iPad mini if it comes out,
00:03:19
◼
►
all those kinds of things.
00:03:20
◼
►
But you know, this will be an arc.
00:03:21
◼
►
And so what I want to do is,
00:03:22
◼
►
in some ways it keeps me accountable
00:03:25
◼
►
for doing all those right things.
00:03:26
◼
►
And having an audience who's expecting me to do it,
00:03:29
◼
►
it's like this app's going to be internationalized.
00:03:32
◼
►
And I'm going to talk about my experiences with that.
00:03:34
◼
►
I'm going to talk about, I'm going to make a video for it,
00:03:37
◼
►
a teaser video, a promo video,
00:03:39
◼
►
making the website for it, reaching out to the press,
00:03:44
◼
►
all those kinds of parts of the marketing back inside,
00:03:47
◼
►
as well as the development side.
00:03:49
◼
►
This app does a couple of interesting things,
00:03:50
◼
►
other things not so interesting,
00:03:53
◼
►
but that's what I'm going to be talking about
00:03:54
◼
►
over the next couple of weeks.
00:03:56
◼
►
I just wanted to queue that up.
00:03:57
◼
►
If that sounds good to you,
00:03:58
◼
►
and especially if there are topics or ideas
00:03:59
◼
►
or things that you want to make sure that I hit on
00:04:03
◼
►
in that vein of if you're building an app
00:04:05
◼
►
from start to finish,
00:04:07
◼
►
what are the things that you want to talk,
00:04:05
◼
►
you would want to make sure you were understanding or hearing my perspective on,
00:04:10
◼
►
then please let me know.
00:04:15
◼
►
Twitter is probably the best way to do it.
00:04:16
◼
►
You can also email me.
00:04:18
◼
►
It's on my About page if you need my address.
00:04:19
◼
►
But you can, please reach out to me if you have things that you want to make sure I cover.
00:04:22
◼
►
Otherwise, it should be pretty good coverage of the topics involved in writing an app and getting it done.
00:04:33
◼
►
So the first part of this, what I'm going to talk about is prototyping,
00:04:33
◼
►
and specifically about how I build an app
00:04:38
◼
►
and how I start that process and work through it.
00:04:41
◼
►
So kind of from final new project,
00:04:43
◼
►
this is the way that I tend to build an application.
00:04:46
◼
►
So first, you always pick a template
00:04:48
◼
►
that is relevant to your application,
00:04:49
◼
►
that'll do a lot of the heavy lifting for you if you want.
00:04:52
◼
►
Xcode has a lot of these templates in there
00:04:54
◼
►
and they work pretty well.
00:04:56
◼
►
They're definitely, you're going to get carried away
00:04:58
◼
►
with that, but if you're making a data-driven application
00:05:01
◼
►
that's going to be table-based, use the detail view template.
00:05:05
◼
►
And it'll do a lot of the setup for you.
00:05:07
◼
►
You can click a button that says use core data,
00:05:09
◼
►
and it'll build a base core data stack for you and things.
00:05:12
◼
►
These are things that you ultimately, a lot of times,
00:05:15
◼
►
what I'll end up doing is replacing those templates.
00:05:16
◼
►
And I'm not saying that you want to necessarily ship
00:05:19
◼
►
that template or use the code that's in that template,
00:05:21
◼
►
but it's great for getting started.
00:05:22
◼
►
Because you can start implementing your idea
00:05:25
◼
►
rather than having to do a lot of boilerplate, a lot of code
00:05:28
◼
►
that isn't actually interesting or useful.
00:05:30
◼
►
There's a lot of things that are just kind of there that you have to do.
00:05:35
◼
►
If there's a template that exists for doing that, please do use that.
00:05:38
◼
►
Don't feel like you need to start a new project with the window-based application,
00:05:42
◼
►
which is I think the most bare bones.
00:05:46
◼
►
You know, absolutely nothing in it.
00:05:48
◼
►
Don't do that.
00:05:50
◼
►
That's not helping anybody.
00:05:51
◼
►
So first, you start that and you start a new project.
00:05:54
◼
►
And probably it's also important for you to have a slight disclaimer.
00:05:55
◼
►
A lot of what I'm talking about in my development process
00:06:00
◼
►
applies mostly to individuals or very small teams.
00:06:03
◼
►
If you're a developer working on a large team,
00:06:06
◼
►
10, 15, 20, 30 developers,
00:06:09
◼
►
first, you really have my condolences.
00:06:11
◼
►
I'm sorry about that.
00:06:13
◼
►
That's a tough situation.
00:06:14
◼
►
I've been there.
00:06:16
◼
►
Personally, I'd rather work on smaller and smaller teams.
00:06:18
◼
►
The smaller the better.
00:06:21
◼
►
Probably my sweet spot is probably a couple of developers.
00:06:22
◼
►
I've really enjoyed the time since I've worked on projects
00:06:22
◼
►
I've met a couple developers, but I've also done the big, big teams, and it's a bit of
00:06:27
◼
►
But anyway, I'm just saying as a disclaimer, what I really like is this is the way that
00:06:32
◼
►
I like to do it because I'm an individual.
00:06:34
◼
►
I can cut a few corners.
00:06:37
◼
►
That would be really awkward to cut in a bigger team project.
00:06:41
◼
►
For example, some of the ways that I do things in terms of files and being able to add and
00:06:46
◼
►
remove files really easily and things would be really awkward in a version control environment
00:06:50
◼
►
where you're constantly trying to have to merge
00:06:55
◼
►
XJ project files and nib files and things.
00:06:57
◼
►
Take it with a grain of salt if you work on a large team,
00:07:02
◼
►
but if you're a small team or an individual,
00:07:05
◼
►
definitely this is the way that I do it,
00:07:07
◼
►
and it seems to have worked pretty well.
00:07:09
◼
►
So the first thing I do when I'm trying to prototype something
00:07:11
◼
►
is I hate doing work that doesn't help me get closer
00:07:13
◼
►
to actually completing my project.
00:07:17
◼
►
And by that I mean I hate it when you kind of,
00:07:19
◼
►
I hate the concept of building things
00:07:22
◼
►
that you're going to, that are entirely throwaway.
00:07:26
◼
►
I'm a big fan of throwaway code,
00:07:29
◼
►
but I don't like things that I'm going to build
00:07:31
◼
►
and then throw away.
00:07:32
◼
►
And a classic example for me of this
00:07:33
◼
►
is the Photoshop mockup, where you are having someone
00:07:38
◼
►
spend a lot of time and effort mocking up every page,
00:07:41
◼
►
pixel by pixel, and then the developer goes
00:07:44
◼
►
and tries to build this.
00:07:45
◼
►
And obviously I'm a developer, and that's my specialty.
00:07:50
◼
►
So I'm going to shy away from that process.
00:07:53
◼
►
If you're in a design-driven organization,
00:07:55
◼
►
that may be just the way you work,
00:07:58
◼
►
that the people in the driver's seat are designers
00:07:59
◼
►
rather than developers, and so you can't.
00:08:01
◼
►
And for me, I really struggle in that environment.
00:08:03
◼
►
What I like doing is I want to build it right away.
00:08:08
◼
►
I want to get in there, I want to build something,
00:08:10
◼
►
and I want to have something to show
00:08:12
◼
►
from that very first day.
00:08:11
◼
►
So what I do is, everything I do is writing code.
00:08:15
◼
►
I have a couple of sketches, maybe in a notepad,
00:08:17
◼
►
just to kind of organize my mind,
00:08:19
◼
►
but once I've got that, I just go in and start building.
00:08:22
◼
►
And when I'm starting to build, I tend to,
00:08:26
◼
►
I'm cutting a lot of corners,
00:08:30
◼
►
and these are often things
00:08:31
◼
►
that I know I'm going to replace later.
00:08:33
◼
►
And you cut these corners
00:08:36
◼
►
to make your development process faster.
00:08:38
◼
►
Any time that I can do something
00:08:40
◼
►
make me develop quicker and more effectively, I'll definitely do it.
00:08:44
◼
►
So, and often what I'm doing when I'm building these things is I'm doing, I'm making obviously
00:08:49
◼
►
naive choices that I know aren't right, and I know there are better solutions for, but
00:08:54
◼
►
I don't have the time or the energy to do it right away, because what I want to do is,
00:08:58
◼
►
my goal is to get from zero to a roughly functionally complete version as soon as possible.
00:09:06
◼
►
And by that I don't mean that it's ready to ship.
00:09:11
◼
►
For that I have something that I can put in people's hands,
00:09:14
◼
►
have them play with it, I can play with it,
00:09:16
◼
►
I can start using it day in and day out.
00:09:18
◼
►
On my home screen right now is my weather app
00:09:21
◼
►
and I'm using it daily to check the weather
00:09:23
◼
►
before I go out to use on a regular basis.
00:09:25
◼
►
And I want to get there as quickly as possible.
00:09:28
◼
►
It drives me crazy when I've worked on projects
00:09:30
◼
►
where you end up spending like weeks and weeks
00:09:33
◼
►
building all this code that at the end of it you're like,
00:09:33
◼
►
We don't have anything to show yet.
00:09:36
◼
►
Some higher up, some C-level executive appears in and says, "Hey, what you guys been working
00:09:42
◼
►
It's like, "Well, we've got these 16 data persistence libraries all ready to go.
00:09:45
◼
►
We've got this data rendering engine over here, and we have nothing really to show for
00:09:50
◼
►
I want things as quickly as possible.
00:09:52
◼
►
So the first thing I did when I'm building a weather app is I set it up so I could make
00:09:59
◼
►
a weather call, download the data, and display it on the screen.
00:10:02
◼
►
That's my first goal, and that was pretty straightforward.
00:10:07
◼
►
I use AF networking as my networking stack right now
00:10:10
◼
►
because it is just gorgeous.
00:10:13
◼
►
The API for it is really straightforward.
00:10:15
◼
►
It seems very fast, performance reliable,
00:10:17
◼
►
and I've had really good experience with it.
00:10:20
◼
►
And so that's all the application was at its beginning,
00:10:22
◼
►
is it was just a single view with a couple of labels in it
00:10:24
◼
►
that were styled in basic Helvetica,
00:10:27
◼
►
and you open the app, it made a static request
00:10:29
◼
►
for basically the address of my house,
00:10:30
◼
►
and it showed me data.
00:10:35
◼
►
Now, at that point, that took, oh, no,
00:10:36
◼
►
maybe an hour, something like that.
00:10:39
◼
►
It was not a lot of work to get to that point.
00:10:41
◼
►
Now, at this point, I actually have something that's useful.
00:10:44
◼
►
I can use this to look at the current weather
00:10:46
◼
►
right now on my house.
00:10:49
◼
►
That's obviously not an app I don't want to ship,
00:10:50
◼
►
or it's not useful in the broader sense,
00:10:52
◼
►
but what I've done, though, is I've started,
00:10:54
◼
►
I've gotten a great starting point,
00:10:57
◼
►
and then I just start growing out from there,
00:10:56
◼
►
pulling in more data, showing it to the user, starting to build out the views.
00:11:00
◼
►
But in everything what I'm doing is I'm trying to, as quickly as possible, get it on screen.
00:11:04
◼
►
I want to be able to see it and play with it and interact with it. But I cut a lot of corners
00:11:08
◼
►
in doing that. So here are a couple of examples, and I think these are hopefully useful
00:11:12
◼
►
examples for what this actually means in practice. So, for example,
00:11:16
◼
►
one thing that I always do whenever I'm working on
00:11:20
◼
►
prototyping like this, is I set it up so that I always
00:11:24
◼
►
cache network requests, pervasively, across the board.
00:11:29
◼
►
Because I want my iteration process
00:11:34
◼
►
to be as quick as possible.
00:11:38
◼
►
So when I launch it in the simulator on the app,
00:11:40
◼
►
it immediately returns results and displays them.
00:11:42
◼
►
Because usually the interesting part
00:11:45
◼
►
is not getting the data.
00:11:46
◼
►
The interesting part is what I do with that data,
00:11:48
◼
►
how I display it, how I interact with it.
00:11:49
◼
►
So what I do is I just add a little stub
00:11:51
◼
►
to my AF networking stack that any time
00:11:51
◼
►
a URL request is made, I record the URL,
00:11:56
◼
►
and when I get the JSON back, this is a JSON thing,
00:12:00
◼
►
it works pretty much any way you do it.
00:12:03
◼
►
I get the JSON back, I take that as an NS dictionary,
00:12:05
◼
►
and I put that dictionary with the URL key
00:12:09
◼
►
in my NS user defaults.
00:12:12
◼
►
It's a terrible solution for caching,
00:12:14
◼
►
but it works really well because it does all
00:12:16
◼
►
the serialization for me, I don't have to worry about that.
00:12:18
◼
►
And then you just, at this point,
00:12:23
◼
►
anytime you make a network request,
00:12:25
◼
►
it's instantaneously returned.
00:12:26
◼
►
There's all kinds of performance problems and things
00:12:28
◼
►
that you never actually want to cache anything
00:12:30
◼
►
in NSC user defaults, but it's a really simple way
00:12:32
◼
►
to just pervasively put that kind of code
00:12:34
◼
►
in your application.
00:12:36
◼
►
And it makes my development process much quicker.
00:12:37
◼
►
Now, I've since iterated twice on my caching strategies,
00:12:39
◼
►
and right now it's got a much more complicated system,
00:12:43
◼
►
you know, serializing data to disk
00:12:46
◼
►
in special custom files and all these kind of things
00:12:46
◼
►
that I've been building on top of that.
00:12:51
◼
►
But to start off, that's what I did,
00:12:54
◼
►
and it made me develop faster
00:12:55
◼
►
because I didn't have to worry about
00:12:57
◼
►
network connectivity problems,
00:13:00
◼
►
about that performance hits,
00:13:02
◼
►
all those things I could just focus on what I was building.
00:13:04
◼
►
Another thing that I do
00:13:06
◼
►
is I have a couple of base UI view classes
00:13:08
◼
►
that all of my views tend to subclass.
00:13:10
◼
►
And I often do that mostly just so that I can do
00:13:13
◼
►
kind of clever, not clever,
00:13:12
◼
►
I can apply custom attributes to all views across the board
00:13:17
◼
►
to make my life a little easier when I'm developing.
00:13:21
◼
►
And for example, the classic,
00:13:23
◼
►
this is the most important thing that I do
00:13:24
◼
►
whenever I'm laying out code,
00:13:26
◼
►
is I set it so that all my views have a one pixel
00:13:27
◼
►
like black border, or a random color border is even better
00:13:30
◼
►
if you just pick a random color.
00:13:33
◼
►
Because what that allows me to do
00:13:35
◼
►
is very easily see layout on my screen.
00:13:36
◼
►
When the app is running,
00:13:39
◼
►
everything has these ugly borders everywhere,
00:13:37
◼
►
But I can see weird alignment problems.
00:13:38
◼
►
I can see how things are actually spaced out in a way that is often difficult if you have
00:13:42
◼
►
a lot of white space around your controls.
00:13:45
◼
►
So those are two things that I do when I'm starting off, when I'm prototyping, to just
00:13:48
◼
►
get going quickly.
00:13:49
◼
►
And as I said, all of those things will get pulled out and replaced later.
00:13:52
◼
►
You don't want to ship this stuff.
00:13:53
◼
►
What you're trying to do, though, is actually get something that you can ship soon so that
00:13:57
◼
►
you can get feedback on soon.
00:13:59
◼
►
The earlier you make mistakes, the quicker you're able to correct those mistakes.
00:14:04
◼
►
You put it in front of somebody and they're like, "This doesn't make any sense."
00:14:07
◼
►
You want to know that information as soon as you can.
00:14:09
◼
►
As a result, I'm about a week in.
00:14:12
◼
►
I've spent roughly one week of time working this app.
00:14:15
◼
►
And I have some that's functional, that's useful,
00:14:17
◼
►
that I've started to put in people's hands and show them.
00:14:20
◼
►
And I've gotten started getting feedback.
00:14:22
◼
►
And so that's the goal of this really rapid focus
00:14:24
◼
►
on attention to shipping something
00:14:27
◼
►
and putting pixels on screen as soon as possible.
00:14:30
◼
►
That's it for today's show.
00:14:31
◼
►
As always, if you have questions, comments, concerns,
00:14:33
◼
►
complaints, I'm on Twitter as _DavidSmith.
00:14:35
◼
►
Otherwise, I hope you have a good weekend.
00:14:37
◼
►
And as always, happy coding.