Developing Perspective

#78: Managing 3rd Party Libraries.


00:00:00   Hello, and welcome to Developing Perspective.

00:00:03   Developing Perspective is a podcast discussing news of note in iOS development, Apple, and

00:00:07   the like.

00:00:08   I'm your host, David Smith.

00:00:09   I'm an independent iOS developer based in Herndon, Virginia.

00:00:11   This is show number 78, and today is Tuesday, September 11th.

00:00:15   Developing Perspective is never longer than 15 minutes, so let's get started.

00:00:19   All right, so I'm going to be continuing on my process that I started in the last show,

00:00:24   kind of this arc I'm going to be doing about developing a new project from start to finish.

00:00:31   And I really appreciate all the people who sent me questions, feedback, comments about

00:00:35   that.

00:00:36   I've been collecting them all on Twitter and email and all that.

00:00:39   I'm not really able to reply to everybody, so just know that everything you send I will

00:00:43   read and I will try and incorporate as best I can.

00:00:47   Sometimes there's duplication, sometimes there's not.

00:00:49   It's just kind of impractical to actually respond to every person individually for exactly

00:00:53   how I do that.

00:00:54   But hopefully the results is positive, and I just want to encourage you, if you have

00:00:58   those thoughts, I definitely appreciate getting them, and by all means keep sending them in.

00:01:03   I really like it on Twitter, just because it's short and succinct.

00:01:06   If you're going to send me an email, please try and smush that down to sort of a kernel

00:01:11   of what it is that you're asking, just to make my life a little bit easier.

00:01:15   And just probably a note, tomorrow is of course announcement day, which is very exciting.

00:01:19   I'm recording this on Tuesday, September 11th.

00:01:22   Tomorrow, Wednesday, September 12th is the big Apple announcement, new iPhone, all that.

00:01:27   I may do an extra episode to cover that, or maybe do it as Thursday's episode.

00:01:31   I'll just have to see based on how it goes.

00:01:33   All right, so for the main topic I'm going to talk about today when you're building a

00:01:36   new project is talking about a little bit of one more thing on prototyping and then

00:01:42   how I manage third-party libraries.

00:01:45   So first, one more thing about prototyping.

00:01:46   I've got a couple of little questions about that, and I think an area that I wanted to

00:01:50   cover is just sort of the importance of encapsulation when you're prototyping.

00:01:55   And if you're not familiar with encapsulation, or it goes by all kinds of different names,

00:01:58   I'm sure, but when I say encapsulation, what I mean is the taking functionality and grouping

00:02:04   it into distinct classes so that you organize the logic of your application into smaller

00:02:09   and smaller parts that have smaller and smaller roles and more and more focus.

00:02:14   And this is really important when you're prototyping.

00:02:17   It's in general a pretty good practice.

00:02:18   You can get carried away with it for sure.

00:02:20   But what I find is really important is

00:02:23   sort of having as loose coupling

00:02:26   between components as you can.

00:02:28   And by that I mean I want to be able to pull things

00:02:31   in and out and sort of, oh, change my mind,

00:02:33   throw this away, oh, might change my mind,

00:02:34   throw this away, and have that effect

00:02:36   as few things as possible, or affect things

00:02:38   in as defined of an interface as possible.

00:02:41   So as an example, I recently completely changed

00:02:45   my data provider underneath the weather application.

00:02:48   I was trying one, found some things I didn't like,

00:02:50   moved to another.

00:02:52   Okay, that's great.

00:02:54   And what I ended up having to do is I really only had

00:02:56   to change it in one place because I'd encapsulated

00:03:00   all the data loading functionality into sort of a class

00:03:04   two or three level steep so that all my view stuff

00:03:07   didn't even know that anything had changed.

00:03:10   It was all being provided the data in exactly the same format as it was before, it just

00:03:13   happened to come from a different source.

00:03:15   And all I had to change was the thing that was doing the setting the URL that I wanted

00:03:20   to get the data from, and then my actual sort of parser that was taking that and moving

00:03:24   it just from a JSON blob into sort of domain objects in my application.

00:03:29   And so by doing that, it made that process really easy.

00:03:31   And it was also very dependable for, I knew I didn't break a lot of things in doing that.

00:03:37   So that's just something that I do a lot,

00:03:42   is when you're creating a new project, especially early on,

00:03:44   don't feel scared of just,

00:03:47   it's like, "File new file, make a new class,

00:03:51   "make a new class, make a new class."

00:03:55   Have lots of classes.

00:03:57   A lot of them you end up throwing away.

00:03:57   I've probably deleted about 12-ish classes

00:03:59   since I started this project.

00:04:03   Things that I built, tried, didn't work, threw it away.

00:04:03   But it allows me to do a lot of things really quickly and really safely, rather than if

00:04:07   you end up squishing lots and lots of functionality into one thing.

00:04:10   It's really important generally to do that, but it's really, really important when you're

00:04:13   prototyping early on to do it.

00:04:16   Because you feel like you're saving time.

00:04:18   If you're sort of, "Oh, I'll just throw everything into this one logic, or in one place.

00:04:23   I'll have my one view controller that has everything in it."

00:04:26   There's a place for that maybe, but if you're ever ... And that's really only for true throwaway

00:04:32   prototypes I could see doing that,

00:04:37   where you are building something expecting to throw it away.

00:04:39   It's like a proof of concept.

00:04:42   Maybe you can do probably your logic into a view controller.

00:04:43   But if you're building something that you're expecting

00:04:46   to actually ship at some point,

00:04:47   but you're prototyping it, your early phases,

00:04:50   your early iterations on it,

00:04:52   then it's important to break things up as much as you can,

00:04:54   because it gives you so much more flexibility and speed

00:04:57   while you're doing that prototyping phase.

00:04:59   And so then the next thing I was going to talk about

00:05:04   is managing third-party libraries.

00:05:06   And I got a lot of feedback on that,

00:05:08   and I got a couple people who said it was great,

00:05:10   that I said, "Oh, I use AF networking.

00:05:12   It's the best."

00:05:14   And there's a lot of third-party libraries

00:05:15   that you'll end up using typically,

00:05:17   and often you're going to want to talk,

00:05:19   you want to use third-party libraries,

00:05:21   but they make your life easier.

00:05:23   And that's a very hard thing to judge, potentially.

00:05:26   It's often sometimes like, "Oh, here's this guy

00:05:31   who does this library that does exactly what I want."

00:05:33   Make sure that it is actually exactly what you want.

00:05:36   Typically what I find is I never really use

00:05:38   third-party libraries for functionality that is,

00:05:41   I suppose, specific to my application,

00:05:45   or in the same problem domain as my application.

00:05:48   I almost always write that custom,

00:05:50   because it's very unlikely that a third-party

00:05:52   general-purpose solution is going to fit

00:05:52   for what exactly I want.

00:05:57   Where third-party libraries and open-source code

00:05:58   really come into play is when you are doing something

00:06:00   that's very orthogonal, that's very distinct

00:06:04   from your application.

00:06:06   So the great example there is something like a networking stack.

00:06:07   My app is not about networking.

00:06:10   I don't really care how I go from a URL to a blob of JSON.

00:06:11   I just want a URL blob of JSON.

00:06:16   And so ASN like AF networking makes that really, really simple for me

00:06:17   and handles a lot of the weird edge cases,

00:06:22   and things that I'd have to do anyway.

00:06:24   Another example is JSON parsing.

00:06:27   I don't really care how I go from a JSON string

00:06:29   to a collection of NS dictionaries,

00:06:33   NS arrays, NS numbers, NS strings.

00:06:37   I don't really care how that translation happens,

00:06:41   so I go ahead and do it.

00:06:43   Using that as a broad guide, though,

00:06:43   I think is really constructive,

00:06:48   to make sure you're not doing things

00:06:50   that you really don't want to.

00:06:52   And so that's sort of the first part,

00:06:55   is how do you decide when to use one?

00:06:57   And it's always worth playing around with

00:06:59   and looking around, seeing what people have done.

00:07:02   What I find I do more often than necessarily using

00:07:03   third-party libraries in open source is I'll look for

00:07:06   inspiration inside them.

00:07:08   So if someone's done something similar to what I'm doing,

00:07:09   So say someone's doing, as an example,

00:07:14   I do, in my weather app, I have some charts

00:07:17   for showing the forecast over the day

00:07:20   and some of those kinds of things.

00:07:23   And I don't, there's all manner of third-party

00:07:25   graphing clients that I could use.

00:07:29   But the thing that I was looking at is,

00:07:32   the thing is, what I want is,

00:07:34   I want it to look a very specific way.

00:07:35   And this is what I'm getting at,

00:07:37   where I have a very specific domain need for my application,

00:07:37   So it doesn't necessarily make sense to do it just generally like that.

00:07:42   And so instead of using a third-party plumbing library, what I did is I wrote my own.

00:07:46   But I went and I looked around at how other people are doing charts, how other people are doing graphs.

00:07:55   Just looking in their code.

00:07:59   Don't feel like you're going to GitHub, you can browse the project right there, you can look at the code, see how, "Oh, that's how they do it."

00:08:03   and that's how they got their performance up, or whatever.

00:08:08   That's a great tool for a third-party code

00:08:12   that you then are picking and choosing the concepts

00:08:15   and bits and pieces from that project,

00:08:17   but then ending up with a really custom,

00:08:20   sort of highly-tuned version of that

00:08:23   for your particular application.

00:08:25   So that's something else I do.

00:08:27   And then lastly, what I wanted to talk about

00:08:28   is how I organize my third-party libraries.

00:08:30   And I recently, and this is the first time

00:08:29   I've ever done it for this project, I started using a thing called CocoaPods.

00:08:34   And CocoaPods, if you're familiar with a package manager from another language, say for example

00:08:39   like gems in Ruby or I think Python, PHP, a lot of them have these kind of things that

00:08:45   are designed to bundle up functionality in a way that is easy to sort of pull in and

00:08:51   out, that you can version well, that you can reference directly in your source control.

00:08:56   And CocoaPods is one that's designed to do this for Objective-C projects.

00:09:02   And the great thing about it is it integrates really well with Xcode.

00:09:05   And so a little bit of sort of how it does it, I recommend just looking at their website

00:09:10   and going from there.

00:09:11   But what CocoaPods do is it takes your Xcode project and moves it inside of an Xcode workspace,

00:09:19   which if you're not familiar with, a workspace is just a collection of projects that Xcode

00:09:23   is aware of.

00:09:25   and you can share code between and kind of when you build, it builds both projects.

00:09:28   But it creates its own project, the pods project, that handles all the third-party libraries

00:09:34   for you.

00:09:35   And so that has this really nice effect of separating them out from your code so you

00:09:39   don't have to worry about them there.

00:09:41   And it's also handling all of the other stuff that you would sometimes need to do in terms

00:09:46   of linking frameworks and all this stuff.

00:09:48   All the extra frameworks that you need for this are all pushed over into the pods directory.

00:09:53   They're not in your own code.

00:09:55   And so that's really nice from a cleanliness perspective

00:09:58   of keeping your project clean and light.

00:10:00   And whenever you install a new pod, I guess they'd call it,

00:10:05   it adds it to that, it updates its own Xcode project.

00:10:08   It's a project that you should never edit yourself,

00:10:10   because it's always going to be overridden,

00:10:12   and it's kind of like CocoaPods manages that for you.

00:10:14   But it works great.

00:10:15   And you want to add a new one, you just

00:10:17   added it to your pod file, which is a little thing where

00:10:19   you specify, like, I want AF networking version 1.0 RC2.

00:10:23   or whatever my current one is, and you say pod install,

00:10:26   and it installs it.

00:10:27   That's it.

00:10:28   You can say pod-- you can delete it, and then do pod install,

00:10:31   and it'll delete it.

00:10:33   You can search for different ones.

00:10:34   You can do like pod search, JSON,

00:10:36   and it'll give you a list of JSON file-- of JSON libraries

00:10:39   that exist that you can choose from.

00:10:41   There's a lot of really nice things like that,

00:10:43   that I've started using it, and I think I really will probably

00:10:46   be moving forward.

00:10:47   If you're a third-party library developer,

00:10:49   I highly recommend creating a pod spec

00:10:50   file for your library.

00:10:55   It makes it really easy for other people to integrate with,

00:10:58   and it's really straightforward.

00:11:00   I mean, they make it really easy.

00:11:01   Another nice thing, too, you can also have private pods.

00:11:04   And I've done this myself for one of the little components

00:11:07   that I have internally.

00:11:11   So this is code that's not publicly available,

00:11:12   but it's in a private GitHub repository.

00:11:15   But you can just create a pod spec for it and link to it,

00:11:17   just like you would normally.

00:11:16   And so you can manage your own dependencies internally

00:11:19   this way, too, which is kind of nice.

00:11:22   So definitely worth checking out,

00:11:23   and I highly recommend it.

00:11:24   There'll be a link in the show notes to the CocoaPods project.

00:11:28   All right.

00:11:29   So that's sort of the main two topics I'm going to talk about.

00:11:31   And to kind of round out our 15 minutes,

00:11:33   I'm just going to sort of do a little speculation,

00:11:35   a little talking about the new iPhone, what I'm hoping for,

00:11:39   what sort of things I'm thinking about as it's coming out.

00:11:43   So there's a couple of things that I don't really care about.

00:11:48   I mean, whatever it is, I'm going to buy one.

00:11:49   That's sort of a given.

00:11:50   It doesn't matter what it is, what it costs.

00:11:52   This is what I do for a living.

00:11:54   So whatever Apple's new hotness is, I'm going to buy one.

00:11:56   I'm probably going to buy it unlocked this time,

00:11:58   just because I'm not--

00:12:00   I'm still on contract with AT&T, so I'll just

00:12:02   need to buy a new one.

00:12:04   Flat out, that's probably better in terms

00:12:06   of gradually releasing the shackles AT&T has on me.

00:12:11   Things that I'm a little nervous about is 16 by nine.

00:12:16   It's weird because if the screen is a 16 by nine resolution

00:12:21   and there's a couple of things you can do to hack

00:12:25   the simulator to make it look like 16 by nine

00:12:27   and see how your applications respond.

00:12:29   And my apps do pretty well.

00:12:31   Overall, it's fine.

00:12:33   And especially this app that I've been, my weather app,

00:12:35   I've been building from the beginning

00:12:37   to be 16 by nine flexible.

00:12:39   So in the vertical dimension, it's very flexible.

00:12:39   But the thing that I worry about is a lot of these apps, I think, look funny in 16 by

00:12:44   9.

00:12:45   And by that I mean you have so much space to put information on, and the information

00:12:52   is so tall, that you end up with this really strange kind of look to it.

00:12:57   Maybe it's just not what I'm used to, but it feels very stretched and odd in that way.

00:13:03   And so I'm sure we'll get used to it, whatever it is, but that kind of makes me nervous.

00:13:06   And as I've been looking at my layouts and my designs,

00:13:09   I don't like the aesthetic of 16 by 9 nearly as much

00:13:12   as I do the current dimensions we have on the iPhone.

00:13:15   But if that's where they're going,

00:13:16   that's where they're going, I'll just get used to it

00:13:19   and adapt accordingly.

00:13:21   Things that I really want in the new iPhone is more storage.

00:13:24   I'd love for the new ones to be rather than 16, 32, 64.

00:13:28   I would love for the base model to be 32,

00:13:31   just because I think that's really what I probably want,

00:13:34   is about a 32 gig.

00:13:35   be nice for it to be $100 less.

00:13:38   And otherwise, I don't really care.

00:13:40   I mean, there's so many things that Apple

00:13:41   could do this, this, and the other.

00:13:43   It's like, if it has LTE, that's great.

00:13:46   I hope that works.

00:13:48   I'm still on the needTNT unlimited plan

00:13:51   from back in the day.

00:13:52   So I have no idea if that would work with LTE.

00:13:54   And if it does, great.

00:13:55   I got a nice, fast connection.

00:13:57   This is where I am.

00:13:58   I have pretty good AT&T LTE coverage.

00:14:00   I know it varies based on where you are.

00:14:03   NFC doesn't really make any sense.

00:14:05   A slightly slimmer form factor, sure.

00:14:08   Better battery life, maybe.

00:14:10   If they could squeeze out more battery life, I'd love it.

00:14:13   But I'm not really holding my breath on that.

00:14:15   And otherwise, I just look forward to enjoying the ride.

00:14:17   I'm sure there will be some cool things on iOS 6

00:14:19   to take advantage of.

00:14:20   And it's an exciting time as a developer.

00:14:23   I know I'll sort of get out the popcorn,

00:14:25   enjoy watching the live blogs.

00:14:26   And I hope you do too.

00:14:28   All right, that's it for today's show.

00:14:30   As always, if you have questions, comments, concerns,

00:14:32   I'm on Twitter @_DavidSmith.

00:14:34   And otherwise, I hope you have a good announcement day.

00:14:36   Enjoy it, and I'll talk to you afterwards.

00:14:38   Bye.