PodSearch

Developing Perspective

#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:37 ◼   ► or so.

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:26 ◼   ► All right.

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:26 ◼   ► a mess.

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:41 ◼   ► on?"

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:49 ◼   ► it."

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:29 ◼   ► All right.

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.