PodSearch

Developing Perspective

#207: Irresistible Complexity

 

00:00:00   Hello and welcome to Developing Perspective. Developing Perspective is a

00:00:03   podcast discussing news of note in iOS development, Apple and the like. I'm your

00:00:08   host David Smith. I'm an independent iOS developer based in here in Virginia.

00:00:11   This is show number 207 and today is Saturday, January 10th. Developing

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

00:00:20   the purposes of today's episode, I wanted to wade very carefully into the

00:00:26   kind of hullabaloo that had blew up this last week regarding the quality of Apple's software.

00:00:31   And as I always try and do on the show, rather than addressing it directly, rather than just

00:00:37   kind of weighing in, as it were, which, you know, is certainly a valid thing to do, but

00:00:42   for the purposes of what I try and do on the show isn't particularly relevant, because

00:00:46   it is only slightly helpful. What I want to do is instead take a step back and think about,

00:00:52   Well, what are the fundamental pressures going on

00:00:54   that are causing this?

00:00:56   And then as a result, what of those pressures

00:00:59   could apply to myself or to someone else

00:01:02   or to anyone making software?

00:01:03   Because while it's interesting and certainly relevant

00:01:06   to talk about whether the quality of Apple's software

00:01:08   is diminishing over time, whether that is true

00:01:11   or whether it's not, the degree to which that is happening

00:01:14   and the reasons why it may be happening,

00:01:16   talking about the software quality of one

00:01:20   of the largest companies in the world

00:01:22   and how their giant, massive engineering organization,

00:01:25   compared at least to mine, is functioning, is interesting.

00:01:28   But that really won't help me make better software.

00:01:31   But I think there are a lot of lessons that we can be thinking

00:01:34   about that are the pressures and the reasons why

00:01:37   Apple is in the situation they are in that are relevant

00:01:40   and that are helpful more generally.

00:01:42   And so what I'm going to talk about today

00:01:45   is this concept that I've been-- all week,

00:01:46   I kept coming back to, which is the concept

00:01:49   of irresistible complexity, that over time, software,

00:01:53   it's like its natural state is to get more

00:01:58   and more complicated.

00:01:59   In some ways you could think about this almost as entropy,

00:02:02   which is like the concept in thermodynamics

00:02:03   where a system will always become more and more chaotic

00:02:06   unless it's acted on actively, and it takes energy

00:02:09   to keep something unchaotic.

00:02:11   Left to itself, it'll become more and more chaotic

00:02:14   just on its own.

00:02:16   And that same thing seems to always apply to software, which is in some ways kind of

00:02:21   weird.

00:02:22   You know, software shouldn't in some ways be simple and clean because it's completely

00:02:28   an artificial construct.

00:02:29   It's something that is entirely man-made and doesn't, in theory, then wouldn't have all

00:02:35   of the natural pressures of something like thermodynamics on it.

00:02:39   But the reality with software is that in many ways it is perhaps one of the most quickly

00:02:45   complexity gathering things I'm aware of.

00:02:48   It's incredibly hard to avoid complexity

00:02:51   in both the creation and the actual execution of software.

00:02:54   And I kind of ended up with three reasons

00:02:57   why I think that's the case.

00:02:59   And a lot of why, and I bring,

00:03:01   just to loop that back quickly to why I'm bringing it up

00:03:03   in relation to Apple's software quality questions,

00:03:06   is I think a lot of what Apple is facing

00:03:08   is this overwhelming increase in complexity over time

00:03:13   and how it becomes ever more difficult to keep ahead of it.

00:03:17   That there are processes you can put in place,

00:03:19   there are-- you can adjust your timeline,

00:03:22   or your engineering talent, or all these things

00:03:24   to potentially address that kind of a question.

00:03:26   But why are you having to fight back this giant wave

00:03:30   in the first place?

00:03:31   And so the first thing, of my three points about complexity,

00:03:34   the first kind of complexity that I

00:03:36   wanted to talk about is what I'm going

00:03:37   to call marketing complexity.

00:03:40   And this is something that isn't really

00:03:43   intrinsic to the software itself,

00:03:45   but is nevertheless one of the stronger driving forces

00:03:48   in the software's creation in the first place.

00:03:51   Because in the kind of software we're talking about,

00:03:53   whether it's software Apple's making,

00:03:54   or software I'm making to sell in a store,

00:03:56   or software you're making for a company or for yourself,

00:03:59   usually the motivation is that you are writing code

00:04:03   for the purposes of selling it.

00:04:05   The same thing applies even if you're a consultant.

00:04:07   Like what you are doing is selling something,

00:04:09   And you need to, therefore, have a market

00:04:13   who is willing to buy whatever it is that you are selling.

00:04:17   And so it's a little bit complicated,

00:04:19   because you build something.

00:04:21   You build version one.

00:04:22   It's awesome.

00:04:22   It's great.

00:04:23   Maybe you have a few bug fixes, and no one's perfect.

00:04:26   You end up with this nice, stable version.

00:04:28   You've got version 1.1, 1.2, whatever it is.

00:04:31   Nice and stable.

00:04:33   Now, the challenge becomes-- and this is in many ways driven

00:04:36   by the kind of business models that a lot of software

00:04:40   app products have is that you then

00:04:42   you start to think about, well, how can I sell this again?

00:04:46   It would be great if you could just

00:04:48   continue to sell version 1.2 over and over and over again

00:04:51   forever at the same rate and at the same quantity.

00:04:55   That'd be awesome.

00:04:56   But that's not the reality, because people look at it

00:04:58   and say, OK, that's great.

00:04:59   But if I'm going to pay more money,

00:05:01   if I'm going to do something else,

00:05:02   if you're stuck into that kind of the old school paid upgrades

00:05:05   model, then it gets really hard to be like, well, what have you given me recently?

00:05:11   Why is it worth me doing?

00:05:12   And so you kind of have to, in some ways, make something better.

00:05:17   And that definition of better is pretty loose because typically what ends up happening with

00:05:22   this is you keep adding features.

00:05:25   You know, you kind of want to be able to say, in this version we had this, and now in this

00:05:28   new version we have this plus all this other stuff.

00:05:31   We want to be able to put up a big slide that says it has 72 features and 1500 new APIs

00:05:36   or whatever.

00:05:37   Like this is the pressure that we always have because people like the thought of that.

00:05:42   Whether or not that's actually good for them.

00:05:44   I think most people like the thought of, "Ooh, this is better.

00:05:46   This is different.

00:05:47   This has stuff that I didn't have before."

00:05:50   And necessarily in some ways, everybody I know who uses something can always have an

00:05:55   opinion about it, right?

00:05:56   You always can think of like any piece of software, you probably have a list of things

00:06:00   that you would have done differently. And you're telling the software creator about

00:06:04   that. I get constant emails from people making suggestions about how I could improve my software.

00:06:11   And for that user, it may improve it for them. But in the scope of all of what I'm doing,

00:06:16   that may actually not make my software better. It just might make it more complicated. But

00:06:20   this is always the pressure. That there's always this pressure to, in order to keep

00:06:24   your business viable, that you have to add features. That selling the basic thing for

00:06:30   for the long term only sometimes works.

00:06:33   And that's a bit of a tragedy, but it's sort of the reality.

00:06:36   And you can fight it a bit.

00:06:37   Some of my products are kind of famous for their simplicity.

00:06:40   And that's great, but it gets really complicated for me

00:06:43   when my competitors are everything I do plus all

00:06:46   this other stuff.

00:06:47   And how do I compete with that necessarily?

00:06:49   Because not everybody would appreciate the fact

00:06:51   that using pedometer++, for example,

00:06:54   is probably easier to use than something

00:06:56   that did the basic pedometer functionality plus all

00:06:59   other stuff. And also of course, the simpler you are, the easier you are to be copied.

00:07:03   And so that has all kinds of other business implications. And so there's always this marketing

00:07:07   pressure to add more complexity, to add more features, to add more stuff to your software.

00:07:13   And that kind of dovetails into the next type of complexity, what I'm going to call intrinsic

00:07:17   complexity. And this is just something that I've always noted about software that makes

00:07:22   it kind of unique from a lot of other disciplines where you're making something, is that because

00:07:29   Because software isn't limited by the constraints of the physical world, where I'm not saying

00:07:36   that building a bridge is easy, building a bridge is ridiculously complicated, but the

00:07:40   bridge is operating in an environment where with a very known set of interactions and

00:07:46   there's only so many dimensions by which something can interact.

00:07:50   There's only so many physical dimensions that something can work with.

00:07:53   Whereas with software, you can build systems that interact in so many different directions

00:07:58   and in so many different ways at the same time.

00:08:00   And that sort of like multi-dimensionality of it,

00:08:03   it makes it really complicated as you add anything

00:08:06   to a piece of software.

00:08:07   It doesn't just sort of linearly grow

00:08:10   in terms of its overall complexity.

00:08:12   It tends to grow much quicker than that.

00:08:14   This reminds me in some ways of like the handshake problem,

00:08:17   which is that sort of math thing you may have done

00:08:20   in grade school where you kind of have to think about

00:08:22   if you have n people in a room

00:08:24   and they all want to shake hands with each other,

00:08:27   how many handshakes are exchanged, which by the way, in case you're curious, is n times

00:08:31   n minus one over two, I believe.

00:08:34   But that same thing applies to software, where if one more person walks into that room, the

00:08:41   number of handshakes doesn't go up just by one.

00:08:44   It goes up by the number of people who were already in that room before they walked in.

00:08:50   That is where it gets really, really complicated, because anything you add doesn't just exist

00:08:55   on an island on its own.

00:08:56   It has to interact with all kinds

00:08:58   of other parts of your system.

00:08:59   And so every little change you have,

00:09:02   it creates this ever-increasing volume of complexity

00:09:07   that you have to manage in your software methodology,

00:09:11   in your testing, in everything you do,

00:09:13   because now there's this other angle by which something

00:09:15   can fail.

00:09:15   Now there's this other angle by which

00:09:17   something can have a problem.

00:09:18   And this is difficult. This is just

00:09:20   sort of the intrinsic problem of if you take the marketing

00:09:22   complexity that you have to keep adding features as a given,

00:09:25   then your software will necessarily have this weight constantly growing on it and growing

00:09:31   in a way that isn't just sort of linear and easy to manage.

00:09:34   It grows, I'm probably using the term, but it grows exponentially.

00:09:38   It becomes harder and harder to do.

00:09:41   And this gets especially tricky too because hardware is also always advancing.

00:09:46   And at least in the way that most people deal with hardware compatibility is you can't just

00:09:51   say this new thing only works on the current version of whatever

00:09:55   it is.

00:09:55   Maybe you can get away with that if you don't have a huge

00:09:57   install base.

00:09:58   But if you're Apple or you're an app in the App Store,

00:10:01   you want to at least have fairly wide compatibility.

00:10:04   And so now there's this other dimension

00:10:05   by which you have to keep track of everything

00:10:07   and be doing all your testing and weird different stacks

00:10:10   and different devices.

00:10:11   And even if you didn't have the marketing complexity saying

00:10:15   that you needed to add features, you at least

00:10:17   have to support the new hardware.

00:10:18   That Moore's law is putting this new stuff into you

00:10:21   and you have to deal with that. And so there's this intrinsically difficult problem that

00:10:26   to solve in software that you there's just no way around. You can't if you add and add

00:10:30   anything to a piece of software, it is going to make it much harder down the road. If you

00:10:35   think about iOS, it's eight years now or something that that it's been under development, I'm

00:10:39   sure there is a tremendous volume of interaction and coupling between components on the system

00:10:44   matter how clearly and cleverly you engineer it, it is going to be really hard to add anything.

00:10:50   especially in recent times when the features that they've been adding are so pervasive.

00:10:53   And lastly, I wanted to talk about what I'm going to call personnel complexity or personal

00:10:58   complexity.

00:10:59   You know, either way, however one way you wanted to spell it is actually valid.

00:11:03   But this is the complexity that I see in myself and I see probably in a company like Apple

00:11:08   that you always have the difficulty of if you have good engineers, if you have good

00:11:13   people who are smart and talented and driven building your software, they are always going

00:11:18   to be wanting to solve not only hard problems, but interesting problems.

00:11:24   And making something stable is not necessarily an interesting problem, at least not for myself.

00:11:30   And I know a lot of really smart engineers for whom that's difficult.

00:11:34   I've met some amazing engineers who love maintenance.

00:11:37   And if you ever come across one of those, like just wrap your arms around them, give

00:11:40   them a big hug, because they are amazing and awesome and people who help make software

00:11:46   actually work in the real world.

00:11:47   But by and large, a lot of the best engineers

00:11:49   I've known in real life don't like maintaining software.

00:11:53   They like building something.

00:11:54   They like doing something new and interesting and awesome.

00:11:57   And so it gets really hard to then either retain talent

00:12:01   in an environment that is focused on stability, that

00:12:04   is focused on cleaning things up and making them bug free.

00:12:08   It's easier to keep those people engaged

00:12:10   when you're doing something new, when you're

00:12:12   working on something completely fresh and interesting,

00:12:14   a new feature, a new device, a new platform, whatever it is.

00:12:17   That's a much easier way to get and attract those people.

00:12:21   And so there's always this pressure inside of a software

00:12:24   engineering project to tackle a new problem, in some ways

00:12:27   just for the purpose of attacking the problem,

00:12:29   whether or not it's actually making the software better,

00:12:31   whether or not it's actually making it better.

00:12:33   And I see this all the time in my own software.

00:12:35   I often see myself wanting to add a feature,

00:12:38   not necessarily because-- or honestly, for me,

00:12:41   it's I want to create a new app because I

00:12:42   have a problem with that.

00:12:44   But you often-- I see I want to do that because it's

00:12:46   interesting.

00:12:47   Not, and it's much harder to keep myself motivated about saying, let's just keep working on making

00:12:52   this better and better, more and more bug free.

00:12:54   And you see this and you can kind of imagine it as I think about any large software company

00:12:57   and you know, for the purposes of today, I imagined at Apple, that the best engineers

00:13:01   at Apple at this point in the development cycle, once they probably locked down most

00:13:05   of the really grievous bugs in iOS, you know, I'm sure they're eager and you know, they're

00:13:11   they're chomping at the bit to get at the new features to get at the new stuff to work

00:13:15   on the hot new feature, whatever it's going to be in iOS 9.

00:13:18   And so it's really hard to keep that focus back

00:13:21   and to avoid this pressure to keep

00:13:25   adding new and more complicated things,

00:13:26   because that's the way the human mind works.

00:13:28   So these are the pressures.

00:13:30   These are the things that, in our software development,

00:13:32   are putting a pressure on us towards making

00:13:34   our software more and more complicated,

00:13:36   and with our complexity, likely bringing with it

00:13:38   more and more bugs, less and less stability.

00:13:40   And we have to fight these.

00:13:41   I think the first step, and why I wanted to do this show,

00:13:44   was to make sure that we're aware of this.

00:13:46   That the first step in being able to effectively fight

00:13:49   this complexity and this tendency in our software

00:13:51   is being aware of it and thinking about it critically.

00:13:54   That when I'm adding a feature, am I doing it

00:13:55   for a marketing reason?

00:13:56   Am I doing it in a way that is respectful

00:13:58   of the intrinsic complexity this will add to my software?

00:14:01   Am I doing it just for my own reasons,

00:14:02   for personal or personnel reasons,

00:14:04   to keep things interesting?

00:14:05   And if I am, I probably need to be thoughtful about that.

00:14:08   I mean, you need to be doubly cautious about it

00:14:10   to make sure that I'm taking these other considerations

00:14:12   into account as I'm doing it.

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

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

00:14:18   or complaints, you can email me, david@developingperspective.com.

00:14:21   I'm on Twitter @_davidsmith.

00:14:23   Otherwise, I hope you have a great week.

00:14:24   Happy coding, and I will talk to you later.

00:14:27   Bye.