PodSearch

Developing Perspective

Bill Dudney

 

00:00:00 ◼   ► Hello and welcome to Developing Perspective. This is the second in the interview series

00:00:04 ◼   ► that I'm doing here on Developing Perspective where I sit down with an interesting iOS or

00:00:08 ◼   ► Mac developer and talk about their experiences, some of the lessons they've learned, how they

00:00:12 ◼   ► work, how they work productively, and hopefully help us all kind of learn and get better at

00:00:16 ◼   ► our development as a result. These interviews are longer than 15 minutes, so a little bit

00:00:20 ◼   ► of a break from the normal pattern on the show. I try and keep them under an hour, but

00:00:24 ◼   ► I just wanted to let you know that I had time. Otherwise, I hope you'll enjoy. Sit back,

00:00:27 ◼   ► and today I have Bill Dudney with me.

00:00:30 ◼   ► All right, it's my pleasure to introduce Bill Dudney of many things, and I'll go ahead and

00:00:35 ◼   ► Bill, introduce yourself, say what you're doing, what kind of work you do.

00:00:39 ◼   ► Sure. So my name is Bill Dudney, and I've done a whole bunch of seemingly random stuff

00:00:46 ◼   ► starting back in college when I first touched my first NeXT computer in, I think it was

00:00:50 ◼   ► 89 on system dot 9 which was really cool a lot of fun I did a bunch of objective

00:00:56 ◼   ► C and did much worse in school the semester I bought my next computer and

00:01:03 ◼   ► so that led to a bunch of whole a whole bunch of next step stuff until 97 I got

00:01:08 ◼   ► into Java did that for a while and then decided I was fed up with the whole IT

00:01:13 ◼   ► space and got back into the Mac and I was building a Mac app when the iPhone

00:01:18 ◼   ► It first came out and my wife built a couple of web apps for the initial iPhone and yeah,

00:01:27 ◼   ► they did amazing.

00:01:29 ◼   ► We had a bazillion plays on the games that she wrote and made a bunch of money off of

00:01:32 ◼   ► Google Ads, which was crazy.

00:01:34 ◼   ► Like who makes money off of Google Ads on iPhone games?

00:01:38 ◼   ► So anyway, so then when the SDK was announced, I decided it was time to stop messing around

00:01:42 ◼   ► with the Mac app I was writing and go build the apps that she did that were the most popular

00:01:47 ◼   ► in web technologies to rebuild them in native technology.

00:01:51 ◼   ► So I did that and then at the same time I had gotten involved with the prags writing

00:01:57 ◼   ► the iPhone SDK book right after I finished the core animation book.

00:02:01 ◼   ► And so then I finished that book up and then since then I've written, I don't know, probably

00:02:06 ◼   ► another four or five apps for both iPhone and iPad and then many of those have been

00:02:11 ◼   ► mine and done a couple for clients and teaching at the iPhone studio or iOS studio as it's

00:02:18 ◼   ► known now for pragmatic programmers and pragmatic studio and so a lot of random stuff, speaking

00:02:24 ◼   ► at conferences and teaching people all over the place.

00:02:27 ◼   ► And a brief stint working in the Mothership?

00:02:29 ◼   ► Yes, it was a blast.

00:02:31 ◼   ► I loved Apple.

00:02:32 ◼   ► It was a very cool place.

00:02:34 ◼   ► But it was hard to be away from the mountains and I really missed being able to teach.

00:02:38 ◼   ► I didn't think that it would affect me as much as it did, but it was really hard being

00:02:44 ◼   ► inside Apple where I couldn't blog about Objective-C or I couldn't talk about iPhone SDK or whatever

00:02:50 ◼   ► with people outside because everybody always thought, even if I was just saying something

00:02:55 ◼   ► random that I thought was interesting, I didn't want that ending up on Mac rumors, right?

00:03:00 ◼   ► So I had to button my lip and not talk about it when I was outside of work, and that part

00:03:04 ◼   ► was frustrating.

00:03:05 ◼   ► Again, like I was telling you earlier about teaching, I love standing in front of a group

00:03:10 ◼   ► of people and saying, "Whatever, blah, blah, blah, this cool thing about iPhone," and then

00:03:15 ◼   ► go and watch what cool stuff they come up with and watch the light bulb turn on and

00:03:20 ◼   ► stuff like that.

00:03:21 ◼   ► That's just a blast and I love doing that and I really missed it.

00:03:24 ◼   ► And I missed the mountains, so it was hard to be in California and not in Colorado.

00:03:28 ◼   ► Okay.

00:03:29 ◼   ► Cool.

00:03:30 ◼   ► So speaking of Colorado, so that's where you're right now in Breckenridge, right?

00:03:33 ◼   ► Yep.

00:03:34 ◼   ► Maybe you can kind of paint the picture of when you go to sit down to work, when you're

00:03:39 ◼   ► wanting to be productive, whether that's writing for your book or working on apps for yourself

00:03:43 ◼   ► or for clients, what does that environment look like when you really want to get to it?

00:03:48 ◼   ► Yeah.

00:03:49 ◼   ► So my most productive time, what I try to do is I'm an early riser, so I get out of

00:03:53 ◼   ► bed 4 or 4.30.

00:03:55 ◼   ► I spend a half an hour sort of getting caught up on what happened the previous day.

00:03:58 ◼   ► I read a couple of blogs and look at stuff on the net and whatever.

00:04:02 ◼   ► And then by 5 a.m. I have my coffee brewed and I'm sitting in front of my computer and

00:04:06 ◼   ► it's usually dark because you know at 5 in the morning it's dark or whatever.

00:04:11 ◼   ► I like the room to be dark.

00:04:12 ◼   ► I keep all the shades closed even during the day when it's bright outside and I you know

00:04:18 ◼   ► just sort of that's the time after that half hour of sort of waking up and drinking my

00:04:22 ◼   ► first cup of coffee.

00:04:23 ◼   ► That's when I get in the zone.

00:04:24 ◼   ► And then I'll usually work for about two and a half to three hours till around 8 o'clock

00:04:29 ◼   ► when the family's awake and everybody's ready to eat breakfast or has already eaten breakfast,

00:04:33 ◼   ► then I'll go over. It's been 15 minutes with my family or whatever saying good morning

00:04:36 ◼   ► and then I come back and I get back to work. And again, that takes about 15 minutes after

00:04:42 ◼   ► that's over to get back in the zone, but that's how I get there is sort of have the room dark

00:04:49 ◼   ► and quiet and just sit in front of my iMac and have the brightness of the computer illuminate

00:04:56 ◼   ► the room, but that's about it.

00:04:57 ◼   ► So you run an iMac?

00:04:59 ◼   ► Are you a single monitor kind of person?

00:05:01 ◼   ► So I have two monitors and I usually keep design oriented stuff on one monitor and then

00:05:07 ◼   ► Xcode on another monitor.

00:05:10 ◼   ► I try to keep email hidden or quit for a couple of hours at a time.

00:05:16 ◼   ► Although sometimes when there's stuff cooking with clients or whatever I definitely have

00:05:19 ◼   ► email going so I can respond right away.

00:05:21 ◼   ► But I find that to be really distracting.

00:05:23 ◼   ► email things beep and you got a four unread messages I start getting nervous and scratching

00:05:29 ◼   ► my chin and fighting the urge to check to make sure nothing's going on or whatever.

00:05:33 ◼   ► Yeah, four is I think like any number below five is the worst. Because I find at least

00:05:38 ◼   ► for myself if you have like every now and then you see someone just a screenshot of

00:05:42 ◼   ► their computer and you'll see it's like two or three hundred unread messages or whatever.

00:05:45 ◼   ► At that point it doesn't matter.

00:05:47 ◼   ► Exactly. It could be four thousand, right? You just whatever.

00:05:49 ◼   ► - It just doesn't matter.

00:05:50 ◼   ► But what do you, from a computer,

00:05:51 ◼   ► if you only have four or five,

00:05:52 ◼   ► then I find that that's, or one is even worse.

00:05:55 ◼   ► - Yeah. - What is that?

00:05:56 ◼   ► - Yeah, it's always-- - I know what it is.

00:05:58 ◼   ► It's one thing right there.

00:06:00 ◼   ► - It's very hard to not look at that, yeah.

00:06:02 ◼   ► Yeah, so if I have it quit and it's gone,

00:06:04 ◼   ► then I find it doesn't distract me.

00:06:07 ◼   ► But I also have to have my phone somewhere

00:06:09 ◼   ► sitting on a cloth so the way it vibrates

00:06:12 ◼   ► when the mail come in, it doesn't make me think,

00:06:14 ◼   ► should I launch mail?

00:06:15 ◼   ► I think I'll go launch mail

00:06:16 ◼   ► and make sure that's not something important.

00:06:18 ◼   ► - Yeah.

00:06:19 ◼   ► And so in terms of other than Xcode, what tools and apps and things on your computer

00:06:24 ◼   ► do you typically use when you're working?

00:06:28 ◼   ► So I always have to have some sort of, when I'm writing, I have some sort of text editor.

00:06:33 ◼   ► I've been using TextMate.

00:06:34 ◼   ► I've been playing with the free BB Edit thing and then even just TextEdit to edit XML or

00:06:44 ◼   ► markdown stuff or whatever for stuff that I'm writing.

00:06:47 ◼   ► When I'm working on the book or a book for Prague, I'm usually writing in XML.

00:06:54 ◼   ► And a lot of people complain about that, but I don't really find it to be that distracting.

00:06:57 ◼   ► I guess it's sort of like I have the four or five tags or whatever that I use all the

00:07:01 ◼   ► time.

00:07:02 ◼   ► Sure.

00:07:03 ◼   ► So it doesn't really get in the way for me.

00:07:05 ◼   ► Some people, it drives them nuts and they can't ever like get over the hump of being

00:07:09 ◼   ► able to just use those four or five that they use all the time.

00:07:13 ◼   ► So yes, so that's either TextMate or I think it's called Text Wranglers for listening.

00:07:19 ◼   ► Yeah, so people who make BB editors.

00:07:20 ◼   ► So you're editing that just in a regular, just a raw text editor with syntax highlighting

00:07:24 ◼   ► and all that.

00:07:25 ◼   ► Yep, exactly.

00:07:26 ◼   ► And so, I mean, the bulk of what goes into a book is text, right?

00:07:30 ◼   ► And so there's only a little bit of markup around, you know, this is a class name or

00:07:35 ◼   ► this is an Objective-C method name or whatever.

00:07:38 ◼   ► So I find I'm really, I'm using those four or five tags, paragraph, Objective-C method

00:07:42 ◼   ► in Class Name a lot and the rest of them, you know, there's a ton of flexibility in

00:07:46 ◼   ► there in terms of how you can organize stuff and tag it and everything, but yeah.

00:07:52 ◼   ► Other tools that I use, I use OmniGraffle a lot to draw pictures, and I do that for

00:07:58 ◼   ► both. So when I'm doing either training for Pragmatic Studio or I'm doing public speaking

00:08:03 ◼   ► at conferences like CocoConf or whatever, a lot of what I try to do with my presentations

00:08:09 ◼   ► is be very visual. I hate going to presentations where there's a thousand words on the screen

00:08:14 ◼   ► and I hate sitting through those and I don't want to make presentations like that. So I'm

00:08:18 ◼   ► typically doing something very visual. It's either, you know, a screenshot of something

00:08:23 ◼   ► going on on the screen or it's a OmniGraffle drawing or whatever. So that's a tool that

00:08:29 ◼   ► I use a lot for doing those things. Sometimes it's really helpful for me to use OmniGraffle

00:08:35 ◼   ► to sort of sketch out an idea to, like when I'm thinking about, especially if I need to

00:08:40 ◼   ► conceptualize the classes of something. Sometimes I'll draw pictures, you know, I hate UML.

00:08:46 ◼   ► I used to be a big proponent back in the Java days of doing UML. So I try very hard not

00:08:51 ◼   ► to do anything that's even remotely resembling UML. But what I'll do is drop a box, name

00:08:56 ◼   ► it, whatever, you know, some class name, and then write some notes about it, and then sort

00:09:00 ◼   ► of use that to visualize the interconnections between the classes and how they're going

00:09:04 ◼   ► talk to each other and divide up the responsibilities and stuff.

00:09:07 ◼   ► Yeah, I always find that I just do that in Xcode.

00:09:12 ◼   ► My approach for whenever I'm kind of, if I'm going to sketch something out, I'll just do

00:09:16 ◼   ► file new class just ten times and kind of, I don't know, I always think in code I guess.

00:09:22 ◼   ► For me that's where I start playing with it is.

00:09:25 ◼   ► And for me, more often than not, once I've got a couple, like once you get your beachhead

00:09:31 ◼   ► of like, "Okay, this seems to be working, and I'll just keep running in Xcode."

00:09:34 ◼   ► Oh, yeah.

00:09:35 ◼   ► So I find that, or I guess it's on a whiteboard, but...

00:09:37 ◼   ► Yeah.

00:09:38 ◼   ► So I find sometimes I do that, and sometimes it's really productive for me to start an

00:09:42 ◼   ► Xcode and creating new classes.

00:09:45 ◼   ► What I find a lot of times is I'm most productive if I do that and then delete all that code,

00:09:51 ◼   ► or at least push it aside and start over from scratch.

00:09:55 ◼   ► Because what I'll do when I'm like, "New file, new file," and I'm connecting these classes

00:09:59 ◼   ► and just basically hacking to see how I think I want this thing to work, is I get to an

00:10:04 ◼   ► idea where I'm like, "Aha!

00:10:06 ◼   ► That's the way it ought to work.

00:10:07 ◼   ► Oh, but I have all this garbage that I've created."

00:10:10 ◼   ► I was creating a relatively large XML parser that was taking XML and turning it into Objective-C

00:10:17 ◼   ► objects and then vice versa.

00:10:20 ◼   ► I asked to have written it three times because I wrote it the first time like, "Oh, this

00:10:23 ◼   ► is horrible."

00:10:24 ◼   ► And then I started writing out in OmniGraph what I was going to do.

00:10:27 ◼   ► I was like, "Oh, this is horrible too."

00:10:29 ◼   ► So I pitched that and then I went back to code and created a whole bunch of code.

00:10:32 ◼   ► "Oh, this is all horrible, but if it did this…"

00:10:34 ◼   ► Right?

00:10:35 ◼   ► So it was like the third time was the charm.

00:10:37 ◼   ► I talked to a lot of people who have a hard time pitching that code.

00:10:40 ◼   ► They're like, "Oh, I just spent a week writing all that code."

00:10:43 ◼   ► You know, but if you've got to maintain it for six months, oh, I'd much rather pitch

00:10:47 ◼   ► that week's worth of bad code and start over.

00:10:49 ◼   ► What kind of version control do you use?

00:10:52 ◼   ► That's one thing that I've often…you always hear about, like, for example, Git or Mercurial

00:10:56 ◼   ► or one of those.

00:10:57 ◼   ► "Oh, the lightweight branching is great," for exactly that kind of reason, where you're

00:11:01 ◼   ► creating these experimental or thought branches rather than having it be a big, heavy operation.

00:11:07 ◼   ► Is that the kind of way you do it?

00:11:09 ◼   ► So, you know, I try to love Git, but it's like, how can we make the simple stuff as

00:11:16 ◼   ► heinously complex as possible and then make the really difficult stuff possible?

00:11:22 ◼   ► I hate that mentality.

00:11:24 ◼   ► I'm really glad that it's free and that it's open source and I love GitHub because you

00:11:27 ◼   ► can share stuff and whatever.

00:11:29 ◼   ► I love that.

00:11:30 ◼   ► I just find Git to be so insanely complex to do really simple stuff.

00:11:34 ◼   ► I'm working on a project with my son and in order for us to share code I have to commit.

00:11:39 ◼   ► Oh, but wait, commit doesn't do it.

00:11:40 ◼   ► I have to commit minus A. Oh, wait, I've got this other thing because he committed one

00:11:44 ◼   ► file.

00:11:45 ◼   ► Now I've got to pull.

00:11:46 ◼   ► Now I've got to commit again.

00:11:47 ◼   ► Now I can actually push it.

00:11:48 ◼   ► And that just drives me up the wall.

00:11:51 ◼   ► But the client wants that, wants it in Git.

00:11:53 ◼   ► So whatever, I'll do it.

00:11:54 ◼   ► It's just not my favorite.

00:11:56 ◼   ► So I just use subversion or I sometimes use get, but it's behind the Xcode make a snapshot.

00:12:04 ◼   ► So that makes it really simple to sort of revert.

00:12:07 ◼   ► I find if I'm doing a lot of hacking where I go down a thought branch and I pitch it,

00:12:12 ◼   ► I want to make a snapshot so that I keep that around but it's not in the normal stack of

00:12:18 ◼   ► stuff.

00:12:19 ◼   ► I guess I've heard that that uses Git behind the scenes.

00:12:23 ◼   ► But I don't care, right?

00:12:23 ◼   ► Because it's so simple.

00:12:25 ◼   ► Oh, look, here's the list of snapshots.

00:12:27 ◼   ► It can get out of hand, and I wouldn't use that as my version

00:12:29 ◼   ► control system, because it's all flat and just ends up

00:12:33 ◼   ► in one long list.

00:12:33 ◼   ► But just as a thought experiment thing, I like doing that.

00:12:37 ◼   ► Because it's simple to do.

00:12:38 ◼   ► It's so much simpler than Git, push, commit, blah, blah, blah,

00:12:41 ◼   ► whatever, dance.

00:12:42 ◼   ► Oh, sure.

00:12:42 ◼   ► I think at Git, I've been using it for so long

00:12:45 ◼   ► that I think it's just grown on me.

00:12:47 ◼   ► I have the Stockholm syndrome of it now.

00:12:49 ◼   ► the problem. It always feels a little heavy-handed for a lot of what it does. And I don't use

00:12:57 ◼   ► Git, I think, in a way that I read all these, like, you know, whatever, Pro Git or whatever,

00:13:03 ◼   ► Git flow, all these like methodologies and things where you have like 27 branches for

00:13:07 ◼   ► all like anytime you start a new concept, you create a branch for it and all this. And

00:13:12 ◼   ► for me, I've always found that to be so it's like I'm spending all this time and work building

00:13:17 ◼   ► something that doesn't actually work.

00:13:20 ◼   ► It's like I'm just playing around outside of my actual job and what I'm trying to do.

00:13:26 ◼   ► So the only closest thing to that that I ever do with Git is, one thing I love is that you

00:13:31 ◼   ► can branch after you've made a bunch of changes rather than having to do it ahead of time.

00:13:37 ◼   ► That whole concept blows my mind where I'm like, "I think I'm going to do something experimental,

00:13:42 ◼   ► so I'm going to make a branch."

00:13:43 ◼   ► That's never how my mind works.

00:13:45 ◼   ► I think about the problem I'm working on.

00:13:50 ◼   ► I'm just working on the problem.

00:13:52 ◼   ► I'm not really cognizant that halfway through that, I went in this crazy experimental direction

00:13:57 ◼   ► more often than not.

00:13:58 ◼   ► So what I love is that you can be developing on whatever branch you're on and then you

00:14:04 ◼   ► can take your working copy and just say, "Okay, maybe I shouldn't have done it this way."

00:14:13 ◼   ► You can just take that, put it off in a branch, and then just go back to where you were before,

00:14:19 ◼   ► which is something that I've only seen in some subversion or something.

00:14:25 ◼   ► It's much more difficult, in my experience, was to play with those kind of things, like

00:14:29 ◼   ► to take your working copy and stash it off somewhere.

00:14:33 ◼   ► Do you find yourself going back to those branches?

00:14:36 ◼   ► I find that what I typically end up doing is I'm going back to them to grab a method

00:14:41 ◼   ► or to grab a little snippet of code rather than necessarily--

00:14:46 ◼   ► and I think it's like what you were talking about before,

00:14:48 ◼   ► where it's often you'll end up--

00:14:51 ◼   ► in order to arrive at the good solution,

00:14:53 ◼   ► you end up having to drive through all these crazy twists

00:14:56 ◼   ► and turns.

00:14:57 ◼   ► And often you'll have these tiny little nuggets in between

00:15:01 ◼   ► that I actually want to keep, but I

00:15:03 ◼   ► want to get rid of the bulk of that

00:15:05 ◼   ► and just put those back into a good framework.

00:15:07 ◼   ► And so that's what I'll end up doing.

00:15:09 ◼   ► Yeah, maybe I need to read ProGet or something.

00:15:13 ◼   ► Because I don't--

00:15:15 ◼   ► I've never found those-- I mean, I have--

00:15:18 ◼   ► on almost all of my projects, I just have master.

00:15:20 ◼   ► And then I have these little stashes of code

00:15:24 ◼   ► branching off the sides, just to--

00:15:28 ◼   ► rather than having this broader process.

00:15:31 ◼   ► And I've never found-- and a lot of that, too, I think,

00:15:33 ◼   ► is because it's just-- you have to have a different flow when

00:15:38 ◼   ► you're working with a team of people, like five or six people.

00:15:40 ◼   ► And so, I mean, I think we're both fairly similar in the sense that we're not doing

00:15:45 ◼   ► these big corporate projects where it's like you and a team of ten people and you have

00:15:49 ◼   ► to have a whole process.

00:15:51 ◼   ► And you even have like, often you'll have like the guy on the team, the poor guy on

00:15:55 ◼   ► the team whose job it is to manage the version control system.

00:15:59 ◼   ► The guy who's doing the merges and builds.

00:16:01 ◼   ► I mean, that's not a good job.

00:16:03 ◼   ► Pain, yeah, pain.

00:16:05 ◼   ► I guess some people are built that way, but it's not me.

00:16:07 ◼   ► Yeah.

00:16:09 ◼   ► But cool.

00:16:10 ◼   ► So that's-- and then in terms of--

00:16:12 ◼   ► do you find you use different tools when you're doing--

00:16:16 ◼   ► so like, if you're going to be working on code for one

00:16:20 ◼   ► of your training things and your book,

00:16:22 ◼   ► and you're doing all the source code,

00:16:24 ◼   ► do you build that in a different way

00:16:26 ◼   ► or using different things than you would if you're actually

00:16:29 ◼   ► writing production code?

00:16:31 ◼   ► Yeah.

00:16:32 ◼   ► So what happens with that a lot is when you're teaching somebody something a lot

00:16:37 ◼   ► of times what you have to do is put aside the complexity that you know needs to be there

00:16:43 ◼   ► in order to make it good code in order to illustrate the point

00:16:46 ◼   ► that you're trying to get across.

00:16:47 ◼   ► So if you're trying to teach someone about, I don't know, NS arrays or whatever,

00:16:53 ◼   ► you might do something in where you're trying to get someone to understand what an NS array is,

00:16:58 ◼   ► especially if they're new to programming.

00:16:59 ◼   ► And, you know, there'd be different things.

00:17:01 ◼   ► if it's someone new to programming versus someone who's an experienced programmer but

00:17:04 ◼   ► is just trying to learn iOS.

00:17:06 ◼   ► But if you're trying to teach someone NS array, for example, and they don't know anything,

00:17:11 ◼   ► you might approach NS array in a completely different way than you would already knowing

00:17:15 ◼   ► how to do iOS programming and you're sort of in the culture of iOS.

00:17:20 ◼   ► You want to bring people in slowly from a conceptual space of "I don't know anything

00:17:25 ◼   ► about programming and I've never broken down a problem into small pieces like that" to

00:17:29 ◼   ► get them to understand what an array is and how it holds a list of things and they're

00:17:33 ◼   ► ordered and whatever, where you would never do that if someone was an experienced programmer

00:17:38 ◼   ► and they're coming from Java or wherever, and they already know what a list is in Java.

00:17:43 ◼   ► You just need to help them translate from list to Java.

00:17:45 ◼   ► So I find I build more than probably the average iOS developer.

00:17:51 ◼   ► I'm hitting Command-Shift-N in Xcode just all the time, because in class we build, I

00:17:57 ◼   ► know, 15 different projects from scratch that we then end up at the end combining the ends

00:18:02 ◼   ► of those three or four different trails into one big app where we take that stuff and reuse

00:18:07 ◼   ► it and whatever.

00:18:09 ◼   ► And so, you know, every time I teach a class I create 15 or 20 projects at home.

00:18:14 ◼   ► Every time I'm writing a new one-hour presentation for CocoConf or if I'm, you know, I'm doing

00:18:19 ◼   ► a full day talk at SwipeConf in Australia in a couple, like a month, talking about core

00:18:27 ◼   ► graphics. That's another place. You know, I create a brand new project from scratch

00:18:31 ◼   ► and I do stuff in those new projects that, as a new developer, how many times, I mean,

00:18:36 ◼   ► as an experienced developer, you create one project and then you work on it for years,

00:18:42 ◼   ► right? And so I do a lot of that stuff that's probably out of the norm for someone. But

00:18:48 ◼   ► On my iMac, I'm always running Terminal and Xcode and TextMate, OmniGraffle most of the

00:18:56 ◼   ► time, not always, but most of the time.

00:19:00 ◼   ► And those are probably, those are the three big things, Xcode and Terminal.

00:19:03 ◼   ► And yeah, I'm always doing stuff in Terminal.

00:19:07 ◼   ► I tend to be, I don't know if it makes me a neckbeard or not, but I tend to trust the

00:19:11 ◼   ► command line for subversion or get a lot more than I trust Xcode.

00:19:17 ◼   ► And I don't know if that's just me being curmudgeonly or whatever, but I tend to do all that stuff

00:19:22 ◼   ► through the command line instead of through the Xcode tools.

00:19:24 ◼   ► >> Yeah.

00:19:25 ◼   ► Well, I never use the Xcode tools for version control.

00:19:28 ◼   ► I've been bitten by them a few too many times.

00:19:30 ◼   ► >> Yeah.

00:19:31 ◼   ► >> But what I find for Git especially is Git Tower.

00:19:33 ◼   ► There's an app called Tower for your...

00:19:35 ◼   ► I think it's just called Tower actually, but it's just a Git client.

00:19:38 ◼   ► Because I find what it does...

00:19:40 ◼   ► The one thing that I like that it does...

00:19:41 ◼   ► Because Git has that weird two-phase commit to stage and then actually commit.

00:19:46 ◼   ► It makes that process much more obvious, especially coming from a subversion background.

00:19:51 ◼   ► Okay.

00:19:52 ◼   ► Well, I'll have to get that then.

00:19:53 ◼   ► Because I'm so used to, yeah, in a subversion background, we're just like, you just like

00:19:57 ◼   ► SVN commit.

00:19:58 ◼   ► Right.

00:19:59 ◼   ► And you're done.

00:20:00 ◼   ► If you've added new stuff, it adds it.

00:20:02 ◼   ► And if you, you know, it reverses having to do this sort of selective, which can be great,

00:20:06 ◼   ► but it's...

00:20:07 ◼   ► Yeah.

00:20:08 ◼   ► Right.

00:20:09 ◼   ► It introduces a huge level of complexity that, you know, with subversion, I was used to pleasantly

00:20:14 ◼   ► ignoring that complexity.

00:20:18 ◼   ► So switching gears slightly, one of the things that I definitely wanted to talk to you about

00:20:21 ◼   ► is so you obviously do a lot of training and teaching for adults, for people who are coming

00:20:29 ◼   ► to your classes or going to conferences or those kinds of things.

00:20:33 ◼   ► But I know also that your son's a developer and those kinds of things.

00:20:38 ◼   ► And one thing I've always wondered about, I have a son, he's three right now, so it's

00:20:43 ◼   ► It's a little early, probably, but I've always been thinking about how do you teach programming

00:20:48 ◼   ► to kids?

00:20:49 ◼   ► I was curious how you've done that in terms of, as an educator, it's one of these things

00:20:55 ◼   ► like in my mind I have this dream of my students changing from my company to Smith & Son.

00:21:04 ◼   ► How do you actually start it?

00:21:08 ◼   ► So my oldest is definitely...he's got that personality where he wants to take everything

00:21:14 ◼   ► apart and he wants to learn everything.

00:21:18 ◼   ► Yeah, I mean, it's phenomenally fun to work with him, too.

00:21:22 ◼   ► I've done two projects.

00:21:24 ◼   ► One project is completed, it's in the store and has lots of positive reviews and stuff,

00:21:28 ◼   ► so it's really cool.

00:21:29 ◼   ► And then another one we're working on right now together, and it is insanely fun working

00:21:33 ◼   ► with him.

00:21:34 ◼   ► If you can make it and sons, it's awesome.

00:21:37 ◼   ► Or and daughters or whatever.

00:21:38 ◼   ► It's so much fun.

00:21:40 ◼   ► But it's definitely a personality thing, I think.

00:21:45 ◼   ► 'Cause we have a lot of kids and other kids,

00:21:49 ◼   ► he's now 15, I forced him, and he would say I forced him,

00:21:55 ◼   ► to go through the book called "Learn to Program"

00:21:59 ◼   ► from Chris Pine, published by Pragmatic.

00:22:01 ◼   ► Phenomenal book.

00:22:02 ◼   ► It's focused on Ruby, so if you are definitely focused on iPhone, it might not be the right

00:22:06 ◼   ► book if you want to learn how to program for iPhone.

00:22:09 ◼   ► But if you want to learn how to program, it's a fantastic book.

00:22:13 ◼   ► So he finished it.

00:22:14 ◼   ► This is like he was 10 or 11 years old, so it was three, four, five years ago.

00:22:18 ◼   ► When he finished it, I looked at his work and he did all the right stuff.

00:22:21 ◼   ► He'd get all the programming done and he handed me the book and he said, "I never want to

00:22:25 ◼   ► do this again."

00:22:27 ◼   ► So you know, I mean, it's just a personality thing where my older son just ate it up and

00:22:31 ◼   ► and he loved that kind of stuff.

00:22:33 ◼   ► He was reading Stephen Cochan's Objective-C book

00:22:36 ◼   ► when he was 11 and doing all sorts of crazy stuff.

00:22:39 ◼   ► But to start with, the place he started was Lego Mindstorms.

00:22:43 ◼   ► And I can't say enough good about Lego Mindstorms.

00:22:45 ◼   ► They are so awesome, especially if your child is into Lego.

00:22:50 ◼   ► Just so many cool things you can do on the mechanical side

00:22:53 ◼   ► from building the robots.

00:22:55 ◼   ► And then you can also go and program them using,

00:22:58 ◼   ► they have a visual programming environment,

00:22:59 ◼   ► which is a great place to start.

00:23:01 ◼   ► teaches you loops and branches and stuff like that.

00:23:04 ◼   ► Drive forward for five feet, stop for five seconds,

00:23:06 ◼   ► drive forward for five more feet,

00:23:08 ◼   ► put on a sensor, a touch sensor, and if you

00:23:10 ◼   ► feel a push on the touch sensor, then turn around,

00:23:13 ◼   ► things like that.

00:23:14 ◼   ► When you say visual programming, so that's sort of like you're

00:23:16 ◼   ► dragging in components and wiring them up physically,

00:23:20 ◼   ► rather than doing it in code.

00:23:23 ◼   ► And it looks like LEGOs, which is kind of cool.

00:23:25 ◼   ► So you drag out a block that says,

00:23:27 ◼   ► if the touch sensor is hit and then it has a branch on it,

00:23:32 ◼   ► and that branch then says turn the motor

00:23:34 ◼   ► to reverse for five seconds.

00:23:36 ◼   ► That kind of stuff.

00:23:37 ◼   ► And so you drag these blocks out,

00:23:38 ◼   ► you connect them by drawing lines

00:23:40 ◼   ► similar to the way you do an interface builder.

00:23:42 ◼   ► And so they have places where inputs come in

00:23:44 ◼   ► and places where outputs go out.

00:23:46 ◼   ► And so with that then, the person

00:23:49 ◼   ► can understand the basics of programming, branching,

00:23:53 ◼   ► and looping.

00:23:54 ◼   ► And to a certain extent, variables,

00:23:56 ◼   ► although it's not very focused on that necessarily.

00:24:00 ◼   ► It would be like a sensor, and then that sensor has an output.

00:24:03 ◼   ► And so it's kind of a variable, but you don't really

00:24:05 ◼   ► get the feel for it.

00:24:07 ◼   ► But from there, you can go-- staying on LEGO Mindstorms,

00:24:10 ◼   ► building your robots, you can use something called Not Quite

00:24:13 ◼   ► C, which is most of C, but it doesn't have a preprocessor

00:24:17 ◼   ► and a couple of other things to simplify the compiler.

00:24:20 ◼   ► And it will-- I think it uses GCC behind the scenes.

00:24:22 ◼   ► It compiles down to assembly language for the processor

00:24:26 ◼   ► that's on the Lego Mindstorms.

00:24:28 ◼   ► And it also has an environment that'll push it over the USB or IR port

00:24:32 ◼   ► to the device and then you can run your programs that you wrote in C.

00:24:36 ◼   ► So that was part of the progression that my oldest took, is he first did

00:24:40 ◼   ► Lego Mindstorms with the visual programming,

00:24:42 ◼   ► then we got not quite C on it, and then at the time I was really into Java in

00:24:46 ◼   ► 2003 or something, and so we got

00:24:48 ◼   ► there was a Legos Java VM that ran on it, and we went down the path of

00:24:53 ◼   ► trying to make that work but the tools on the Mac were not very good and so we

00:24:56 ◼   ► ended up abandoning that but I think on the PC side that that works so you could

00:25:00 ◼   ► through a VM you know with Parallels or whatever be able to do that and then he

00:25:06 ◼   ► spent a little bit of time with squeak and scratch which are both small talk

00:25:09 ◼   ► based environments from the MIT Media Lab both of those are really cool and

00:25:14 ◼   ► then from there he just one day he said I want to write games and he started

00:25:19 ◼   ► studying OpenGL and then that led him to linear algebra and so.

00:25:23 ◼   ► I mean, he's got that personality where he'll just rip apart everything and he wants to

00:25:27 ◼   ► understand stuff.

00:25:28 ◼   ► We were talking the other day and he said, "You know, I really wish I had a time machine

00:25:33 ◼   ► so I could go back in time and have enough time to learn everything."

00:25:38 ◼   ► So it's definitely a personality thing.

00:25:43 ◼   ► And I also did...

00:25:45 ◼   ► So we homeschooled, so we're part of a homeschool community in Breckenridge, and we did a class,

00:25:49 ◼   ► lot of people are asking how did you get Andrew into programming and stuff, friends and stuff.

00:25:53 ◼   ► And so we did a class with like, I think we started off with nine kids and we ended with

00:25:59 ◼   ► six. Three of them had to drop out for various reasons. But we spent an entire year, once

00:26:05 ◼   ► a week for two hours we spent doing programming. And that was just complete basics. This is

00:26:12 ◼   ► an array, this is an if statement, this is a for loop, and that kind of stuff. And yeah,

00:26:19 ◼   ► What that taught me was that every kid is different and some kids are wired to do programming

00:26:27 ◼   ► and some kids aren't.

00:26:28 ◼   ► Not to say that they can't learn it, it's just some kids' personality style is they

00:26:32 ◼   ► like to take things apart and figure out how they work and then see if they can put them

00:26:36 ◼   ► back together.

00:26:38 ◼   ► And some kids don't.

00:26:39 ◼   ► I mean, you know this in adults too, right?

00:26:40 ◼   ► You talk to some people and they're like, "Oh, awesome.

00:26:43 ◼   ► I put gas in my car and I stick the key in the ignition and it runs."

00:26:47 ◼   ► And other people are like, they're ripping apart their motor to find out how pistons

00:26:50 ◼   ► work or whatever.

00:26:51 ◼   ► So, you know, kids are the same way.

00:26:53 ◼   ► So it is interesting.

00:26:56 ◼   ► And it's difficult to push.

00:27:00 ◼   ► You can pull, but it's really difficult to push.

00:27:03 ◼   ► And so it's a fun adventure, though.

00:27:06 ◼   ► It's really cool watching, especially when you get the kids whose, the light bulb goes

00:27:09 ◼   ► on, they're, you know, hacking at two o'clock in the morning, sending emails.

00:27:13 ◼   ► "Hey, I tried to get this core animation thing to work and I couldn't and this is my code."

00:27:18 ◼   ► And I was thinking back to when, as you're talking, it's like I was trying to think how

00:27:23 ◼   ► I got into it.

00:27:24 ◼   ► And I think my first, the closest, the first time I ever did anything that would be considered

00:27:28 ◼   ► programming was I think Logo?

00:27:30 ◼   ► Is that what it was called?

00:27:32 ◼   ► The Little Turtle?

00:27:33 ◼   ► I think it was on a Sinclair Spectrum.

00:27:35 ◼   ► Wow.

00:27:36 ◼   ► Which was, I mean, I have no idea when that was, I have no idea what age that was, but

00:27:41 ◼   ► I just remember making the turtle go around.

00:27:45 ◼   ► - Yeah, that's awesome.

00:27:46 ◼   ► - And then it was basic on the old Windows that shipped,

00:27:50 ◼   ► I think it shipped with the old Windows 3?

00:27:53 ◼   ► - Yeah, way back in the day.

00:27:55 ◼   ► - It was QBasic or something like that?

00:27:57 ◼   ► - Something like one of the basic derivatives.

00:27:58 ◼   ► - And I just remember that was,

00:28:00 ◼   ► and from as early as I can remember almost,

00:28:04 ◼   ► it's like you have that aptitude for it,

00:28:07 ◼   ► and it just stuck.

00:28:10 ◼   ► And it's like now that's how I make my living.

00:28:12 ◼   ► That's kind of a crazy thing to think about.

00:28:13 ◼   ► It started off with making turtles go around a screen to--

00:28:17 ◼   ► Isn't that crazy how that stuff unfolds?

00:28:19 ◼   ► My first was a Commodore 64.

00:28:21 ◼   ► And I wrote this awesome-- remember--

00:28:25 ◼   ► it wasn't Minecraft.

00:28:26 ◼   ► No, it was Missile Command, where you had the things

00:28:29 ◼   ► and you could choose which base.

00:28:31 ◼   ► Kind of style.

00:28:32 ◼   ► There's incoming nukes and you would shoot missiles

00:28:34 ◼   ► from the ground.

00:28:36 ◼   ► And I think it was called Missile Command.

00:28:38 ◼   ► Anyway, so I had one that a balloon floated across the sky and you had to shoot the balloon.

00:28:42 ◼   ► I had a single missile base at the base.

00:28:44 ◼   ► And so I spent hours and hours and hours, till two or three in the morning, writing

00:28:48 ◼   ► this program and I had it on a cassette, right?

00:28:51 ◼   ► Because that was off the Commodore way back in the dark ages when there was barely electricity.

00:28:55 ◼   ► Well, this tape got eaten by the tape machine.

00:28:59 ◼   ► I was so mad, I put the whole thing back in the box and shoved it into my closet and I

00:29:04 ◼   ► didn't program again until I was in college.

00:29:06 ◼   ► That was a crazy thought, but I remember the same thing, that Sinclair Spectrum.

00:29:11 ◼   ► I remember when I played games on it all the time, you put it into your tape deck and hit

00:29:17 ◼   ► play and you wait while it loads the program onto the computer from your cassette player.

00:29:22 ◼   ► Isn't that crazy?

00:29:23 ◼   ► Yeah.

00:29:24 ◼   ► At least it wasn't punch cards, right?

00:29:25 ◼   ► You can read stories about people with punch cards.

00:29:28 ◼   ► At least it was relatively convenient to make copies.

00:29:32 ◼   ► Yeah.

00:29:33 ◼   ► You could just put it into--

00:29:36 ◼   ► Tape to tape.

00:29:37 ◼   ► And you tape to tape, high-fi, and off you go.

00:29:40 ◼   ► Yeah.

00:29:41 ◼   ► Yeah, those were the glory days, right?

00:29:42 ◼   ► Now it's kids these days.

00:29:45 ◼   ► Kids these days, I tell you.

00:29:47 ◼   ► Yeah.

00:29:48 ◼   ► So shifting gears again slightly.

00:29:51 ◼   ► One thing I was always curious about for someone

00:29:53 ◼   ► who's been working on-- who's been doing this for a while,

00:29:56 ◼   ► and especially from the progression from back

00:29:58 ◼   ► in the Mac days and Xcode as it's progressed

00:30:00 ◼   ► in all the different ways.

00:30:01 ◼   ► it's like how many how's your debugging process like and how do you go about

00:30:07 ◼   ► when you're when you hear when you hear bug how do you go about trying to nail

00:30:12 ◼   ► it down and find it and what's your mindset and your approach for that so

00:30:16 ◼   ► the first thing I do is is think through the problem and and what I try to do the

00:30:23 ◼   ► end this is something I tell all my students is apply the scientific method

00:30:27 ◼   ► And that sounds sort of glib or whatever, but so many people don't.

00:30:31 ◼   ► They just sort of start randomly sticking log statements in their code and break points

00:30:36 ◼   ► and clicking around until they find something that they think is the problem and they apply

00:30:41 ◼   ► a change that they copy from Stack Overflow or who knows where, and they click the Go

00:30:45 ◼   ► button and the bug is gone in the path that they expected.

00:30:50 ◼   ► And what I find happens, and I'm guilty of doing that too, right?

00:30:53 ◼   ► It'd be the same thing when I'm in a hurry.

00:30:56 ◼   ► What I find when I do that is I've masked the bug.

00:30:59 ◼   ► I haven't actually found and fixed the bug, I just changed its behavior and so now the

00:31:02 ◼   ► bug is still there but I don't see it because the path I've been following is fixed.

00:31:06 ◼   ► And so I first try to think through, okay, what's the real problem?

00:31:11 ◼   ► And then I start putting things into the code to force that, you know, to test that hypothesis.

00:31:16 ◼   ► It's either true or it's false.

00:31:18 ◼   ► And if it's not true, then I have to rethink.

00:31:22 ◼   ► Or if it's partially true.

00:31:24 ◼   ► So for example, if you expect the box to be pixel-aligned that you're drawing with core

00:31:29 ◼   ► graphics on the screen, and for some reason it's showing up fuzzy, well then you can go

00:31:33 ◼   ► through and say, "Oh, well duh, the obvious problem is I'm not rounding my rectangle to

00:31:37 ◼   ► integer or half integer boundaries or whatever," right?

00:31:40 ◼   ► So then I go through and I look and see, "Well, I'm actually doing that.

00:31:44 ◼   ► Okay, well now what's going wrong?"

00:31:47 ◼   ► So then I would form the next version of the hypothesis to say, "Okay, well, I must be

00:31:52 ◼   ► changing that rectangle somewhere else, right? So then I might put a watch point with LLDB,

00:31:58 ◼   ► put a watch on that variable, or whatever like that to sort of track down what's really

00:32:03 ◼   ► the problem. And then I try to go as far as I can to prove to myself that that really

00:32:07 ◼   ► is the issue before I apply a change. Then I apply the change and test to make sure that

00:32:13 ◼   ► it really did, leaving all that logging or debug statements or whatever that I put in

00:32:18 ◼   ► with the debugger and so forth, leaving all that stuff in place until, okay, so the behavior

00:32:24 ◼   ► stopped manifesting itself, but did I actually fix the real problem or did I just mask it?

00:32:29 ◼   ► So I try to put enough instrumentation in my code, meaning things like log statements

00:32:34 ◼   ► or breakpoints that I turn to continue and put log statements inside the breakpoint,

00:32:39 ◼   ► put enough of that stuff in so that when I think I've fixed it and I run, I can see the

00:32:44 ◼   ► real issue.

00:32:46 ◼   ► Another thing that I found really helpful is if I'm doing something like a networking

00:32:51 ◼   ► code or something that is happening in the background and it's happening repeatedly,

00:32:55 ◼   ► you're downloading 100K of JSON or whatever, and if you put a breakpoint for every 4K that

00:33:01 ◼   ► comes down, you have to continue, continue.

00:33:04 ◼   ► It gets so tedious that I just don't do that.

00:33:06 ◼   ► So what I do is put in log statements and wrap that in a hash if def debug or something

00:33:12 ◼   ► like that so that it would only happen when I have the debug thing on. And then I leave

00:33:16 ◼   ► that code in there forever because I find a lot of times I am being an idiot with writing

00:33:21 ◼   ► networking code and it just sucks in a whole number of ways. And so I put that instrumentation

00:33:27 ◼   ► in there, flip on the switch that turns on the logging, and I watch that logging that

00:33:31 ◼   ► comes out to determine if I'm really, if I'm getting it right or if I'm doing something

00:33:36 ◼   ► wrong. And I'll put statements like, "Is this thread the foreground thread?" And if it

00:33:42 ◼   ► is, and I print out an error message saying, "Hey, idiot, you're running your networking

00:33:45 ◼   ► code on the foreground thread. You're going to host somebody." And then I always run that

00:33:51 ◼   ► with that test flag turned on to print out those logging statements before I declare

00:33:56 ◼   ► a branch or a whatever or ship it or make it beta or whatever, just so that I get some

00:34:00 ◼   ► sanity check that all that stuff that I put in is doing the right thing.

00:34:06 ◼   ► are like things where I'm observing bad behavior. Another thing that I try to do every time

00:34:12 ◼   ► before I ship something is run instruments against the code and not just like leaks because

00:34:19 ◼   ► a lot of people that I run into run leaks, but I run leaks, the allocation instrument,

00:34:24 ◼   ► I run time profiler, I run the core animation instrument and check my frames per second

00:34:28 ◼   ► on all my animations and stuff. And I try to do that again before I ship anything off

00:34:32 ◼   ► to beta or any other release that anybody else is going to see. And I use the allocations

00:34:39 ◼   ► instrument to look at not just am I growing constantly in memory, but how many I expect

00:34:46 ◼   ► that I'm parsing JSON so I have a thousand strings because there's a thousand strings

00:34:50 ◼   ► coming out of this JSON file. Do I have 12,000 that are transient? Huh. And I scratch my

00:34:56 ◼   ► head and start looking at why is that going on. And what I often find is when I do that

00:35:02 ◼   ► stuff, I find problems in my code that would have never come up unless I had done that.

00:35:09 ◼   ► Because it's not technically a bug. All I'm doing is taking electrons from the battery

00:35:13 ◼   ► and increasing entropy in the world, right? Which is a bad thing. And so those are sort

00:35:20 ◼   ► of the big things. I put breakpoints and I tell the breakpoint to log and autocontinue.

00:35:26 ◼   ► I put breakpoints in and then examine the program at a particular spot in the breakpoint.

00:35:31 ◼   ► And then I put logging statements in that are wrapped in some sort of flag that says,

00:35:34 ◼   ► do this log or don't do this log, and then use instruments a lot.

00:35:37 ◼   ► Yeah.

00:35:38 ◼   ► Interesting with instruments, it kind of makes me think of it's like it's the difference

00:35:41 ◼   ► between a program working and it working well.

00:35:45 ◼   ► Because it's often, at least I find it's relatively easy to make something work.

00:35:50 ◼   ► You can get it, it's like you can get the intended result to happen.

00:35:55 ◼   ► But the challenge is usually, it's like the difference between the, like a college professor

00:36:00 ◼   ► who always said there's always a naive implementation,

00:36:03 ◼   ► and then there's the right implementation.

00:36:06 ◼   ► And almost always, it's like you can make something happen.

00:36:10 ◼   ► Like you say, and it will work fine.

00:36:12 ◼   ► And I often find this especially,

00:36:14 ◼   ► but it's the difference between when

00:36:16 ◼   ► you're developing the simulator.

00:36:17 ◼   ► And essentially, you have infinite speed

00:36:20 ◼   ► and infinite memory.

00:36:21 ◼   ► And everything's-- your connection's always wonderful.

00:36:26 ◼   ► And it works in those circumstances.

00:36:29 ◼   ► And then you'll run it on-- you're doing your compatibility

00:36:32 ◼   ► testing.

00:36:32 ◼   ► You'll put it on an old third gen iPod touch.

00:36:35 ◼   ► And you're just like, oh my goodness, what is going on?

00:36:37 ◼   ► This is not my code.

00:36:38 ◼   ► Who wrote this horrible stuff?

00:36:41 ◼   ► This is not going to work.

00:36:43 ◼   ► But instruments is a great way to find those kinds of things

00:36:47 ◼   ► that it's working.

00:36:48 ◼   ► But animations is another one.

00:36:50 ◼   ► Where it's like, it's working, but it's at 30 frames a second

00:36:54 ◼   ► or whatever.

00:36:54 ◼   ► And so you're doing something, or you're

00:36:57 ◼   ► being non-optimal in your implementation.

00:36:59 ◼   ► - Yeah, and I love that, especially when you flip on,

00:37:02 ◼   ► I'm just that kind of person who is,

00:37:05 ◼   ► I don't know, it irritates me if I expected a thousand

00:37:10 ◼   ► strings to be allocated in pitched, and there's 12,000.

00:37:13 ◼   ► Like, what is, like, that's just wrong.

00:37:16 ◼   ► Something's messed up there.

00:37:17 ◼   ► And it's the same thing of like,

00:37:19 ◼   ► looking at the VM tracker.

00:37:21 ◼   ► Okay, when my app is running and it's in a steady state,

00:37:24 ◼   ► I don't want to have more than 12 meg or 14 meg

00:37:27 ◼   ► of dirty memory. I just set that as a goal for myself on any app that I ship because

00:37:33 ◼   ► it's one screen full of information, which is probably about 3.5 meg on an old iPhone

00:37:40 ◼   ► on a new one. It's probably whatever that is, 10 meg, something like that. And then

00:37:43 ◼   ► a couple of meg for data. And that's it, right? Because the data that displays that stuff

00:37:48 ◼   ► on screen should only be a small amount. So, you know, especially if you're using Core

00:37:54 ◼   ► data or whatever to fetch your data, you have no excuse to fetch all the customers in China.

00:37:59 ◼   ► And hopefully that's a billion people who bought your product.

00:38:01 ◼   ► But you should never fetch all that into memory at once.

00:38:05 ◼   ► And so I love looking at that and sort of digging into those problems.

00:38:08 ◼   ► And probably would have made a good tester or one of those QA people who breaks everything.

00:38:14 ◼   ► But I like digging into that and finding stuff.

00:38:16 ◼   ► It's really fun.

00:38:18 ◼   ► One of the things I used to do at Apple that I really loved was helping people who would

00:38:22 ◼   ► come in with their apps and say, you know, whatever, this app looks really cool but it

00:38:26 ◼   ► doesn't perform very well. And you look them in the eye and say, have you run instruments?

00:38:32 ◼   ► And you can tell, because some people hesitantly say, yeah. That's the person who ran leaks

00:38:38 ◼   ► like two weeks after they started the project and not again. Most people say, what's instruments?

00:38:45 ◼   ► And so you sit down with them and you start showing them in their code. You've never looked

00:38:48 ◼   ► at their code before, right?

00:38:49 ◼   ► I don't even have access to their code.

00:38:51 ◼   ► And I look and say, oh, yeah, see here you're doing

00:38:53 ◼   ► networking on the main thread.

00:38:55 ◼   ► Oh, and see over here, you're allocating 4 million strings

00:38:57 ◼   ► and throwing away 4 million strings.

00:38:58 ◼   ► What are you even doing?

00:38:59 ◼   ► Like, were you dropped off a turnip truck?

00:39:01 ◼   ► What are you talking about?

00:39:03 ◼   ► I was never rude to people.

00:39:04 ◼   ► But it's really fun to go look at that stuff.

00:39:08 ◼   ► And oh, look, this animation's running at 15 FPS.

00:39:11 ◼   ► And everything is transparent.

00:39:12 ◼   ► See all this red?

00:39:13 ◼   ► This really shouldn't be here.

00:39:15 ◼   ► So it's fun.

00:39:17 ◼   ► I definitely noticed that every time I've gone to a lab at WWDC, almost always the first--

00:39:22 ◼   ► and it doesn't even matter necessarily what the problem is I'm having.

00:39:26 ◼   ► I've never really ever had a debugging or a work session with one of the people at WWDC

00:39:32 ◼   ► lab that didn't involve launching instruments for something.

00:39:36 ◼   ► And it's one of those things, though, for the first-- probably the first year or two

00:39:40 ◼   ► of being an iOS developer, I never ran it, ever.

00:39:45 ◼   ► just never, other than like you say,

00:39:47 ◼   ► every now and then running, it's like if I have a leak

00:39:48 ◼   ► that I'm trying to track down, it's like,

00:39:50 ◼   ► oh, I'll run the leaks tool, that's what it does.

00:39:52 ◼   ► But it is, it's this, and it's, for me,

00:39:55 ◼   ► it's always one of my highlights of the actual sessions

00:39:58 ◼   ► at WWDC are like the what's new in the developer tools

00:40:02 ◼   ► instrument stuff, because it's one of these things,

00:40:05 ◼   ► like the first time you ever see them,

00:40:07 ◼   ► all the little, like the magic check boxes,

00:40:09 ◼   ► is the thing that always like blows your mind,

00:40:11 ◼   ► where you hit the box and all of a sudden,

00:40:12 ◼   ► everything turns green, that's wrong.

00:40:14 ◼   ► for whatever definition of wrong is.

00:40:18 ◼   ► I have to do off-screen drawing, so it turns this color.

00:40:21 ◼   ► It's transparent, so it's doing this.

00:40:23 ◼   ► And it's just this amazing thing where

00:40:25 ◼   ► it's able to show you the problem in a way that almost

00:40:29 ◼   ► doesn't seem possible.

00:40:31 ◼   ► That somehow, it's like, how does it know

00:40:33 ◼   ► that's where the problem is?

00:40:34 ◼   ► And it's like, well, that's--

00:40:35 ◼   ► It's awesome, isn't it?

00:40:36 ◼   ► It's like they wrote the frameworks on the one end

00:40:37 ◼   ► and the tools that debug the frameworks.

00:40:40 ◼   ► It's so cool.

00:40:40 ◼   ► And the power of DTrace, too, right?

00:40:42 ◼   ► I mean, it's like the incremental cost of having that in there and turned off is nil,

00:40:47 ◼   ► virtually.

00:40:48 ◼   ► It's almost nothing.

00:40:49 ◼   ► And so you can just spread that stuff everywhere and then flip it on like a switch.

00:40:54 ◼   ► You could even – I haven't actually done this in any production app, but you could

00:40:57 ◼   ► build your own D-Trace stuff and stick it in your app and then you could run it against

00:41:01 ◼   ► instruments and see if your app is doing what you expect.

00:41:04 ◼   ► Yeah, I just love instruments.

00:41:06 ◼   ► It's like a – I tell my students in class, it's like a code spelunking tool.

00:41:12 ◼   ► Like, you see the surface of the mountain and it's very pretty, but when you go spelunking

00:41:17 ◼   ► into that mountain, you see the guts, you see what's inside of it, and that's what you

00:41:21 ◼   ► get out of instruments is you get to see what's really happening.

00:41:25 ◼   ► And we often, within so many different things that we do in life, we have a plan and we

00:41:31 ◼   ► start executing it and so many things distract us from the one path that we have laid out.

00:41:36 ◼   ► That's what happens with code is you start with this plan, this beautiful abstract design

00:41:40 ◼   ► that's perfect in your mind, and then real implementation gets in the way, right?

00:41:45 ◼   ► And you end up with all this messy junk.

00:41:47 ◼   ► If you don't go back and look at it with instruments, you know, I mean, do you remember what you

00:41:52 ◼   ► wrote six weeks ago?

00:41:53 ◼   ► I don't even, right?

00:41:54 ◼   ► It was yesterday.

00:41:55 ◼   ► I forget the stuff that I wrote yesterday.

00:41:57 ◼   ► So I just love instruments as a tool to be able to help you figure that stuff out and

00:42:01 ◼   ► see what's really going on.

00:42:04 ◼   ► The OpenGL ES tool, I don't know if you got a chance to look at that or if you play much

00:42:07 ◼   ► with OpenGL.

00:42:08 ◼   ► And I'm by no means an expert.

00:42:10 ◼   ► My son is big time into that stuff, but I love the OpenGL expert and the other OpenGLES

00:42:16 ◼   ► tools.

00:42:17 ◼   ► You can tap one button and it captures the entire frame, all the buffers that you're

00:42:20 ◼   ► drawing data into and shows you them graphically.

00:42:24 ◼   ► All the textures that are bound, how they're bound, flip a switch and it will start running

00:42:30 ◼   ► your code through an analyzer that basically turns off the fragment stage.

00:42:36 ◼   ► Does the performance change?

00:42:37 ◼   ► Okay, well then your fragment stage is probably fine.

00:42:39 ◼   ► turns off the vertex stage, oh look at that, the performance went up to 60 FPS, I bet your

00:42:44 ◼   ► vertex shaders are hosed.

00:42:46 ◼   ► And so then it points that out to you without you having to go through and tweak all that

00:42:50 ◼   ► stuff yourself.

00:42:51 ◼   ► It's just amazing, it just blows me away how cool it is.

00:42:54 ◼   ► Yeah, I've only ever seen the OpenGL stuff in like the WDC sessions.

00:42:57 ◼   ► It's one of those things that I've done, I've written almost every kind of game, or almost

00:43:03 ◼   ► every type of app you could imagine, and used almost every framework, except things with

00:43:08 ◼   ► with OpenGL and games. The one area that, like when I'm talking to a client or whatever

00:43:13 ◼   ► kind of experience it is, I can do anything except for games. Anything 3D. I'm an entirely

00:43:20 ◼   ► 2D person.

00:43:21 ◼   ► Yeah, it's one of those things I would sorely love to do something. I don't even care if

00:43:27 ◼   ► it's a game. I just want to do some OpenGL stuff. I love it. I play with it. Every time

00:43:31 ◼   ► I have free time between books or classes or whatever, I end up spending time doing

00:43:35 ◼   ► Open GL stuff, it's really, really cool.

00:43:39 ◼   ► Cool.

00:43:40 ◼   ► And I guess the last thing that I kind of wanted to talk about is just in terms of like

00:43:46 ◼   ► lessons you've learned or perhaps even better coming from your position as an educator,

00:43:51 ◼   ► what are kind of some of these common mistakes or problems that you see people doing over

00:43:56 ◼   ► and over again that would be good things to make sure you never, ever do?

00:44:01 ◼   ► Yeah.

00:44:02 ◼   ► Some stuff that I see brand new people to the platform do and and it happens across the board and I don't know that

00:44:11 ◼   ► There's a few people here and there who don't fall into the trap, but most people do and that's really

00:44:17 ◼   ► Thinking about what you're doing before you go to do it. We're so trained with Google now that or whatever search engines

00:44:25 ◼   ► - I want to

00:44:28 ◼   ► Change the background color of a text field

00:44:31 ◼   ► What's the first thing people do they don't go read the docs or engage their mind they search on Google find something on Stack Overflow

00:44:38 ◼   ► And copy and paste it sure I'm as guilty as the next person of doing that

00:44:42 ◼   ► But I see people do that and that's their development approach and they never get to the point where they actually understand

00:44:49 ◼   ► What the background property is on a view and they don't understand why it might be better to use background property than to use draw rect

00:44:56 ◼   ► They never like

00:44:58 ◼   ► process that stuff because they're so conditioned to

00:45:02 ◼   ► google copy-paste done ship it kind of stuff

00:45:06 ◼   ► um... so that's the number one thing i would encourage people to do is please

00:45:11 ◼   ► you know i i understand that needs to happen from time to time but especially

00:45:15 ◼   ► when you're learning stop that

00:45:18 ◼   ► or it's fine if you go google it and look at it on stack overflow but never

00:45:21 ◼   ► copy the code from stack overflow

00:45:23 ◼   ► the read the docs on background property

00:45:26 ◼   ► And then when you get there and you scratch your head and you say, "Huh," there's a little note at the end.

00:45:30 ◼   ► The last phrase in there says, "This is more efficient than drawing a background color in DrawRect."

00:45:35 ◼   ► What's DrawRect? Go dig into DrawRect.

00:45:38 ◼   ► And that sort of like, "Find the path to peel back the onion," is the most important thing to make you a good seasoned iOS developer.

00:45:49 ◼   ► Now that we have Arc and storyboards, I think there's fewer problems that are typical, like

00:45:57 ◼   ► people always get stuck on.

00:45:59 ◼   ► I still have a lot of people who, from Google or I don't know where, but they get this idea

00:46:04 ◼   ► that interface builders shouldn't be used and they should write everything in code.

00:46:08 ◼   ► And that's another one of my soapbox things where I just stand up and say, "Look, you

00:46:12 ◼   ► gotta pull your head out.

00:46:13 ◼   ► That's ridiculous.

00:46:14 ◼   ► What are you talking about?"

00:46:16 ◼   ► Because a lot of people read these blog posts that say, "Oh, Interface Builder is so slow

00:46:20 ◼   ► and whatever."

00:46:21 ◼   ► Oh, it just makes me crazy.

00:46:25 ◼   ► If it's slow today, it's going to be better tomorrow.

00:46:27 ◼   ► And if you write all that code, you're going to be saddled with thousands of lines of code

00:46:30 ◼   ► that could be easily represented visually.

00:46:34 ◼   ► And then other stuff that people consistently mess up.

00:46:41 ◼   ► Even with Arc, I see people struggling with understanding the memory management, and I

00:46:47 ◼   ► think the biggest reason that people struggle is, again, that engaging their mind to not

00:46:52 ◼   ► just read the docs, but to build puzzles to understand what's going on with retain, release,

00:46:59 ◼   ► auto-release, whatever, so that they can understand what's really going on there.

00:47:06 ◼   ► It's always one of those funny things.

00:47:11 ◼   ► I always find this with myself.

00:47:13 ◼   ► There is all these shortcuts that you can take in development, whether that's just grabbing

00:47:18 ◼   ► code on Stack Overflow or tools or techniques that you'll find on a blog post.

00:47:24 ◼   ► I always think about the most is like these shortcuts that it's almost like you have to

00:47:28 ◼   ► have a driver's license before you can use those.

00:47:30 ◼   ► I like that analogy.

00:47:32 ◼   ► Because if you're sitting there, it's sort of like when you're learning to drive, at

00:47:36 ◼   ► least with me, when I was learning to drive, it's like two hands on the wheel, whatever

00:47:41 ◼   ► it is, it's like at nine and three or two and ten or whatever you're supposed to do.

00:47:45 ◼   ► All of these things that are important for helping you really grasp and have a solid

00:47:51 ◼   ► command of the skill that you can ease up on once you're proficient in that task and

00:47:58 ◼   ► in that skill.

00:48:00 ◼   ► I think I find that myself.

00:48:01 ◼   ► It's like there's all these things that you get into trouble

00:48:04 ◼   ► when you start doing things that you-- anytime

00:48:07 ◼   ► you have code in your app that you don't understand.

00:48:10 ◼   ► It's probably even the simplest way

00:48:11 ◼   ► when I think of that situation you're describing.

00:48:15 ◼   ► I've certainly seen in my consulting days

00:48:17 ◼   ► a lot where you see this code and it's like, what does this do?

00:48:18 ◼   ► It's like, I don't know.

00:48:20 ◼   ► I got that from Stack Overflow.

00:48:22 ◼   ► It seemed to work when I put it in.

00:48:24 ◼   ► And it's this problem of it's like I often--

00:48:28 ◼   ► And when I'm finding the little nugget from Stack Overflow

00:48:31 ◼   ► or from someone's blog or something,

00:48:33 ◼   ► hopefully what it is is I'm seeing something and saying,

00:48:36 ◼   ► oh, right, that's how you do it.

00:48:39 ◼   ► It's helping draw that connection between two

00:48:42 ◼   ► frameworks that I'm not familiar with,

00:48:44 ◼   ► or helping me find the bug in my code where it's like,

00:48:47 ◼   ► oh, that's right.

00:48:49 ◼   ► Any time you use this class, you have to also do this thing.

00:48:53 ◼   ► all these little, like, the little, like,

00:48:55 ◼   ► the either undocumented or poorly documented

00:48:59 ◼   ► little, like, tricks that you have to do to make things work

00:49:01 ◼   ► great.

00:49:02 ◼   ► And if you start throwing too many of those in that you don't

00:49:05 ◼   ► understand, then debugging becomes impossible.

00:49:08 ◼   ► Yeah.

00:49:08 ◼   ► Yeah.

00:49:09 ◼   ► Yeah.

00:49:09 ◼   ► Because like, what's the old saying?

00:49:11 ◼   ► It's like, don't write code that's-- don't write

00:49:17 ◼   ► code that's too smart.

00:49:18 ◼   ► Because debugging is harder than writing code.

00:49:21 ◼   ► And so if you write code that's at your limit of intellect,

00:49:24 ◼   ► you'll never be able to debug it.

00:49:25 ◼   ► Because debugging is harder, so by definition,

00:49:28 ◼   ► it's impossible to debug code that's

00:49:30 ◼   ► at your limit of intellect.

00:49:32 ◼   ► So write code that's easy and understandable,

00:49:34 ◼   ► and then you can actually debug it and work on it.

00:49:37 ◼   ► So I certainly see those types of things.

00:49:39 ◼   ► I find a lot of times-- and I've been joking about this recently

00:49:42 ◼   ► on Twitter-- is that I look back at everything

00:49:46 ◼   ► I wrote six months ago, or even six weeks ago,

00:49:49 ◼   ► think, "Who's the idiot who wrote this code?" And on the one hand, I think that's positive

00:49:54 ◼   ► because you're always learning new stuff and you're always learning new ways to approach

00:49:56 ◼   ► things or think about things or whatever. And where I see people fall down, though,

00:50:03 ◼   ► is that they buy into that and they say, "Oh, six weeks ago I was dumb," or "Six months

00:50:09 ◼   ► ago," or whatever, but then they never go the next step of, "Oh, I'm going to figure

00:50:13 ◼   ► out why that works the way that it does or whatever.

00:50:17 ◼   ► So yeah, it's an important thing.

00:50:20 ◼   ► I think it's too easily overlooked with the ability to make progress on whatever it is,

00:50:27 ◼   ► the feature you're trying to implement or the app you're trying to get shipped or whatever,

00:50:30 ◼   ► to just copy and paste from someone else.

00:50:32 ◼   ► Oh sure, and all the little lies we tell ourselves, "Oh, I'll fix it as soon as I ship."

00:50:36 ◼   ► Right.

00:50:37 ◼   ► As soon as that--

00:50:38 ◼   ► 1.1 will have that fixed.

00:50:39 ◼   ► Yeah, I'll totally fix that and I won't be cheating on that.

00:50:42 ◼   ► That never seems to happen.

00:50:44 ◼   ► Yeah, yeah, yeah.

00:50:45 ◼   ► Well, I wanted to thank you for taking the time to be here on the show this week.

00:50:52 ◼   ► And before you go, I wanted to sort of give you an opportunity to talk about how people

00:50:55 ◼   ► can find you, follow you online, those types of things and projects and things you have

00:51:00 ◼   ► upcoming that you should know about.

00:51:02 ◼   ► Sure, thanks.

00:51:03 ◼   ► Yeah, that's awesome.

00:51:04 ◼   ► So the Pragmatic Programmer's book on the iOS SDK has been fully updated to iOS 6.

00:51:11 ◼   ► We did a beta cut right before we started putting iOS 6 content in there.

00:51:18 ◼   ► The book that's currently shipping covers iOS 5 where it's updated for iOS 6 and then

00:51:23 ◼   ► as soon as it goes public, we'll ship a beta version that goes public and then it'll go

00:51:27 ◼   ► off to the printers and it'll be a couple weeks after that before the paper hits, which

00:51:32 ◼   ► I'm really looking forward to.

00:51:34 ◼   ► It was a fun book to write and it was really cool to sort of go in and rethink the way

00:51:38 ◼   ► we wrote the book the first time.

00:51:40 ◼   ► So it's a very different, completely rewritten book, so that was a lot of fun.

00:51:46 ◼   ► I'm also working on a book that I'm self-publishing through the iBookstore on C, the language,

00:51:54 ◼   ► and all the stuff that, as a proficient Objective-C programmer, that you've looked at and thought,

00:51:59 ◼   ► "What is that pointer thing?

00:52:01 ◼   ► I'll just pass nil for the error because I don't really understand ampersand error."

00:52:05 ◼   ► Stuff like that to sort of help you understand, "What does that ampersand thing really mean?

00:52:08 ◼   ► What are pointers and stuff?"

00:52:10 ◼   ► kind of some people look at me like I'm kind of nuts but I'm basically going to take you

00:52:14 ◼   ► from the type system of C and understanding the basic types and then how they sort of

00:52:20 ◼   ► evolved into objects how we ended up with with Objective-C objects by talking about

00:52:25 ◼   ► structs and then we're going to implement a really simple version of the Objective-C

00:52:29 ◼   ► runtime so you can send messages to your to the struct that you built which is kind of

00:52:34 ◼   ► on the one hand sort of nutty and very nerdy and behind the scenes kind of you'll only

00:52:38 ◼   ► enjoy this book, I think, if you like to understand how things really work. But on the flip side,

00:52:44 ◼   ► I think it's also going to help a lot of people who are proficient at Objective-C but want

00:52:48 ◼   ► to take their development to that next level to understand stuff more deeply or whatever.

00:52:54 ◼   ► So that will be--it'll definitely be done by the end of the year. I'm working on a lot

00:53:01 ◼   ► of really fun HTML5 CSS interactives to sort of show off the code and help people understand

00:53:06 ◼   ► how stuff works. So that will be by the end of the year roughly. And then I'm also, speaking

00:53:12 ◼   ► of teaching kids, I'm working on a series of books to help kids understand how to program

00:53:17 ◼   ► games on the iPhone. And so that'll be like very basic programming all the way up to,

00:53:22 ◼   ► you know, doing game type stuff. So I eventually, my goal is to make it all the way to OpenGL.

00:53:30 ◼   ► So you have basic programming all the way to loading an OBJ file or a COLLADA file and

00:53:35 ◼   ► displaying it on screen and having your bad guys shoot guns at each other. But that's

00:53:40 ◼   ► probably a two-year effort to get all that stuff written. So, you know, it's a... and

00:53:44 ◼   ► it's also a sort of a background thing.

00:53:46 ◼   ► Great.

00:53:47 ◼   ► So, yeah. So that's the two big things that I'm doing that are sort of personal and then

00:53:50 ◼   ► still doing a little bit of consulting here and there and doing a lot of teaching.

00:53:54 ◼   ► If people want to find you online, where to go.

00:53:56 ◼   ► Oh, yeah. So I'm @bdudney on Twitter. So you can follow me there. I have a blog at bill.dudney.net,

00:54:02 ◼   ► I've been a slacker and haven't been updating nearly as much as I would like to.

00:54:06 ◼   ► But those are the two big places where I do most of my public stuff.

00:54:10 ◼   ► Great.

00:54:11 ◼   ► Again, I just wanted to thank you for taking the time and I really appreciate you talking.

00:54:17 ◼   ► Sure.

00:54:18 ◼   ► It was a blast.

00:54:19 ◼   ► It was a lot of fun.