Rapture in Venice

:: Mobile Design and Development Shop specializing in iPhone, iPad, and Android

Time for Apple to Retire the 16GB iPhone?

Stock checks around Colorado suggest there’s far less market for a 16GB model iPhone. Considering the size of apps, photos, videos, expansion of the OS itself, and how difficult it was to upgrade to iOS 8, seems many people are leery.

Time to retire it, Apple?  How about a base 32GB model next year?

Screen Shot 2015-09-26 at 9.36.54 AM

The day after the 6S release, stores across the country are left only with 16GB models…and gold. :-)

  • Print
  • Facebook
  • Twitter

Apple Quality is Down the Shitter


In 2007, I got a job with EffectiveUI here in Denver as a Flex Developer.  I’ll never forget my first day there: I was sitting alone at my desk for almost the entire day with nothing to do because nobody there had thought to have a computer ready for me when I started…

(I actually spent my first few weeks with nothing to do, but that’s a whole different nightmare of a story.)

So, it’s the afternoon and the lady who was tasked with coordinating with the guy who was lazy about going to the Apple Store in the first place comes over and I think she has my laptop!  It’s going to be a Mac Book Pro and I’m both nervous and excited because I’d never used Mac up to that point.  First, she pulls out a skinny notepad from a sheath and is handing it to me and now I bet she’s going to grab my new lap–hang on…

That’s…my laptop?  What the hell?  That’s the laptop?  Holy hell it’s skinny…!

So began my love affair with Apple.  The beauty of the machine. The ease at which I picked up on OS X. (I lept in on Tiger.) Soon, the iPhone would come out and what gloriousness it was!  Then later the iPad.  For me, Apple was miles better than PC’s and had the hardware you just lust for!

I thought it was a marriage that would last.

Maybe not.

A Series of Unfortunate Events (2013-15)

The past few years have been a nightmare as an Apple user.  Quality has gone way downhill as Apple insists to get in a macho arms race for technologies nobody’s asking for and fewer people needed.

First, I had to replace my iPhone 5 not once but twice.  Each due to problems with the hardware buttons.  I mean, seriously, we’re talking about the buttons.  While Apple is building a fucking spaceship in California right now, they can’t make sure something as simple as a button can be stable?

Alright, chalk it up to bad luck.  Yet next, Mavericks comes out, and that’s when I learn that Finder has taken a nose dive.  Since its release, followed by Yosemite, Finder has consistently had problems simply copying files.  It can hang.  You have to know how to relaunch Finder.  Any time I need to replace one I cross my fingers.  Something so simple…yet my faith wavers.  To this day.

Then comes Continuity, the ability to move between your Mac and iPhone or iPad “seamlessly.” I was puzzled as to why Apple would invest so much time and effort into allowing someone to edit a Numbers file on their iPad and then magically continue it on their iMac.  I can’t see how simply hitting save and then opening on the iMac is that big a deal.  However, I’ll be the first to admit how useful I found it to send SMS messages from my desktop.  It kept me focused on my work while I communicated with friends and family (and Craigslist sellers from whom I was buying games, games, games!)

Yeah, sending SMS messages was great for the few months it worked.  It’s been a year since it stopped, though.  I’ve googled, re-configured devices, pretty much everything and can’t get my phone to talk to my desktop anymore.  Nor my laptop!  It’s ridiculous.  One tiny little feature in a whole set that I liked, and it no longer works. Fantastic.

Let’s talk about my saga with Time Capsule.  Tired of my sketchy Linksys and in need of a local backup solution to replace unreliable online services such as Carbonite (sucky client) and Backblaze (the backups said they were happening, but they weren’t), I plunked down $400 for a Time Capsule.

This wireless-router-and-backup-system-in-one would be freaking great if it actually worked. To be fair, the wifi part has been excellent.  Yes, I still have to reboot it from time to time because it’s 2015 and we still can’t have reliable wifi routers, yet it’s the backup system which has been a nightmare.

The first one I got would have this problem where, every so often, the backups would start failing.  I’d reboot it and, presto, they’re working again!  Cool.  Then a few days later, nope, it’s down. Eventually, it never worked anymore  Finally, I brought it in to the Apple Store and the (figurative) genius replaced it for me.  Alright, it was just a bad one, let’s bring this puppy home and enjoy stress-free backups now!


My new Time Capsule worked for a month or so without problems, but since then, I’d say every month, the dreaded, “It’s been 10 days since your last backup” message will pop up on my three machines.  The Time Capsule is still doing wifi, but the backup system is stuck.  Nothing fixes it except a power cycle.  Oh, joy.  That might sounds like not a huge deal but realize that this is the backup system, not the wifi.  When wifi starts failing, rebooting it works and it’s really no big deal.  For backups, I only know something had gone bad a week and a half after the problem starts!  There’s no option I can see that will warn me when just a day goes by without a backup.  I just have to manually check each day I guess.

I put up with it, but it’s bullshit.  Two broken Time Capsules?  Hardly likely.

How about iCloud?  Once again, this was a technology I didn’t think I really needed, but it has proven useful.  For one, it’s an easier way to backup my devices.  For a progressively smaller amount of money each month, I can back up all my photos to the Internet. Sweet! Better yet, those photos sync to all my devices so when I take a picture with my phone it will immediately sync with my desktop!

Well, almost immediately. Pretty quickly.

Uh, maybe after a few minutes.

OK, hours sometimes…?

Alright, honestly, I have no fucking clue when the photos will sync.  Sometimes it’s pretty quickly and sometimes it takes days.  The general rule of thumb is that when it would be really handy to sync quickly, it never happens. I never have a problem with Dropbox…but iCloud?  Oh, man.  Problems all the time.

Along to the rescue is…Photos for Mac! This handy app replaced iPhoto because…well…I don’t know why it replaced iPhoto.  It has less features, looks ugly as shit, and best yet…it does not support the ability to drag and drop from the app itself into, say, a file selection dialog.  That used to be really useful, but Apple says Photos is better for me. And, after using it for many months, I still can’t really tell you if the iCloud synchronization happens when it’s open or in the background.  I don’t know because the syncing has gotten worse.  Won’t somebody tell me?

(Oh, hey, I just ran the app and it looks like the two photos I took this morning finally synchronized over to my desktop. Too bad I emailed myself the files 10 hours ago.)


Moving to my iPhone, let’s see, I’ve had a whole slew of problems: spontaneous reboots, apps like eBay breaking under iOS 9, many graphical glitches in apps ever since iOS 7 drastically altered UIKit for no real reason, hooking it up to a charger may or may not actually initiate charging, they moved the power button to the side (directly across from the volume buttons) so I take lots of accidental screenshots of my phone now, and the best part has been when Apple decided that being the only phone that knew how to handle portrait/landscape photos correctly was not enough and opted to fuck it all up instead. (How am I supposed to laugh at Android users posting sideways pics on social media when I can’t tell who’s who anymore?!)

And we can’t forget the Apple Maps launch, can we?

What the Hell Happened?

I’ll tell you what happened and it’s simple: Apple has gone away from iterating on tight, well-tested systems and shifted to pumping out huge, complex technologies that the PR department can make hype commercials with.  We’ve seen Continuity, iMessage, iCloud, Game Center, Apple Pay, Flat Design, Siri, Apple Maps, PassBook, Touch ID, Facetime, iBooks and the list goes on and on.  Some of these are really great, too!  But, look at all the technology and integration that goes into each one.  It all has to be re-tested for every update.

Digging a little deeper, there’s a lot of blame to place on the changes to the Developer API.  In the early days of iPhone, the API was clean and easy to work with.  Then, Apple started introducing an endless chain of expansions that do nothing but lead to buggy code:

  • A Core Data persistence system that makes thread-based data access trickier than achieving alchemy.
  • iCloud integration with Documents that’s extremely hard to code correctly and even harder to test.
  • The complete UI redesign in iOS 7 is so incredibly, unnecessarily complex that apps today still have bugs related to it.
  • Pulling autorotation responsibilities out of UINavigationController.  That one change caused so much pain for so many people.
  • Swift, the language Apple hopes to replace Objective-C some day, is designed by the Antichrist and? only! gets! { worse? }.with! each? iteration!
  • Speaking of Swift, using the debugger has been a much buggier, slower experience ever since the new language showed up.  Anyone else notice this?
  • Provisioning profiles are actually harder to deal with in 2015 than they were in 2009. (Do you want to fix this?  NO!  NO, XCODE!)
  • Storyboards are incredibly powerful except that they’re so incredibly frustrating to work with in the editor. (It also causes Xcode to crash more than anything else.)
  • More devices per generation, with more variety, requires many more releases per iteration.  The list of beta builds when a new release is out makes even Android blush.
  • Custom keyboards seemed like a great idea until every single iPhone user complained how broken they were.  And still are.
  • You now need to provide no less than 149 app icons to ship your app.
  • Even launch images are over-complicated these days!
  • Autolayout.  Need I say more?

There’s no one thing that has brought us to this point.  In my mind, Apple is stretching itself thin in trying to maintain so many devices, technologies, and features at a stable level.  In getting the complicated things working, they fail to keep the fundamentals such as file copying stable. Fixing a bug requires a lot of cross-device testing, too, so updates come slower as well.

Whatever it is, it’s come to the point where I’m considering not only a switch to an Android device, but stopping iOS development completely, too.  I don’t want to, but right now keeping up with iOS SDK “advances” (I can’t air quote this enough) is a monstrous headache.  I’m still catching up with advanced UICollectionView stuffand that’s years old now.


Apple.  Fix this.

  • Print
  • Facebook
  • Twitter

, , , , ,

Developing a Local CocoaPod Alongside Your iOS App

Whether you’re an independent developer or a large team building apps for multiple clients, there’s no better way to improve your efficiency than by collecting your most useful code into one re-usable, unit-tested framework.

Today, I’m going to show you a great way to use CocoaPods so that you can simultaneously build your Swift apps while locating generalized solutions into their own standalone Pod.

Let’s Create Our Pod

The first thing we’ll do is create a Pod that will store all of our handiest classes, components, and extensions.  We start by creating a project for a Swift framework:

Choose "Cocoa Touch Framework"

Choose “Cocoa Touch Framework”

Name it however you like and make sure it uses the Swift language.  I’ll call mine Tilikum:

Call the framework whatever you like, but I'll dedicate mine for the poor, imprisoned Orca. :-(

I’ll dedicate my new Pod to that poor, imprisoned Orca named Tilikum. :-(

Now, let’s write ourselves a useful little extension for the String class for this example. Obviously, a lot more work will go into this later, but for the purpose of this tutorial we’ll simply get things started with something small.  Here’s our code:

A little extension to get us started...

A little extension to get us started…

This extension adds a length property to the String class.  We’ll add more down the road, but this is enough to demonstrate our Pod setup.  If you’ve never written a framework before, be sure to mark the extension as public, too, or else the code can’t be accessed outside of it!

OK, the extension is done, but we’re not ready to move on to our application until we write some unit tests first!  Remember, the best part about centralizing all this code is that it allows us to properly unit test in an organized manner.  You’d never copy the unit tests around along with the code…go on, admit it.

Let’s add the tests:

By adding unit tests we not only keep the code in one place, we pledge to harden it with unit tests!

By adding unit tests we not only keep the code in one place, we pledge to harden it with unit tests!

Alright, the code is all done, so now we need to turn this project into a bonafide Pod. Assuming you have CocoaPods installed, let’s hit the command line with this to create a default Podspec

This will create a starter Podspec for us.

This will create a starter Podspec for us.

Make whatever changes you like to the default file, but do make sure you change the source_files value to something like this:

s.source_files  = “Classes”, “Tilikum/*.swift”

Build and voila! Congratulations, your Pod is ready to go!  Next, we’ll create an app that uses it.

Let’s Create Our App

With the Pod created, we can have as many apps as we want using it…but let’s start with just one.  Once again, we create a new project, this time a regular ole iOS Swift app:

This TilikumClientApp app will use the useful code we keep in the Tilikum Pod.

This TilikumClientApp app will use the Tilikum Pod.

Note that there’s no requirement that we share a workspace or working directory or anything with the Pod.  The Pod is completely independent of our app. The only requirement, obviously, is that our app uses Cocoapods so that it can access Tilikum. Let’s configure TilikumClientApp now.

First, we integrate Cocoapods and create our Podfile:

This created the default Podfile.

This command creates the default Podfile.

Now, the important part: we add our Tilikum Pod to the project.  Usually we’d do this by adding a pod specification found in the main Cocoapods repository, but this time we’re going to point it at a local path:

Point to your local Pod and don't forget to add the use_frameworks! method or your Swift framework won't be linked in properly.

Point to your local Pod and don’t forget to add the use_frameworks! method or your Swift framework won’t be linked in properly.

This syntax points to the Tilikum Pod that’s located in the same parent directory as the app.  If you want to store it elsewhere, you can, but if you’re working with multiple developers make sure you agree on a hierarchy that works for everybody.

There are many benefits to pointing at a local directory rather than an online repository:

  • You can freely add new code to the Pod while you’re working on the app.
  • You don’t have to commit or push any code and you certainly don’t need to cut a new version of your Pod for every single change you make.
  • This encourages centralizing your generalized code in the Pod due to a quick development cycle.

Right now you might be thinking that relying on a current snapshot of the code as it stands in a developer’s local workspace isn’t a good thing, and you’re right!  You’re also reading the wrong tutorial. ;-)  This is about developing your Pod and app at the same time, not using versioned Pods.  You’ll have to commit and version things while you code your app to do that and that’s not going to motivate you to maintain both at the same time. You’re have to rely on generalizing and exporting your code to a Pod after your development is done and…well…we all know that’s likely never going to happen.  You’ll be too busy celebrating your new app’s release to think about it.

This method works really well and, obviously, is ideal in single-developer environments.

Alright, where were we?  Ah yes!  Now, we just need to use the Tilikum Pod in our app. The code is simple, we merely need to import the framework where we need it and then just use our new extension however we wish:

We import Tilikum above and then we can simply use our new length method!

We import Tilikum above and then we have access to our new length method!

Done!  Now, as we develop our app more, whenever we want to add some useful code we think our other apps will want to leverage, we add it to Tilikum rather than the app. Instant re-usability! Cool!

There’s just one little wrinkle we need to talk about (you knew there would be), and that’s what we need to do to refresh the Pod once we’ve added something to it.

Let’s Update the Pod so the App Sees New Stuff

Let’s say we add a new method to our extension, or a new extension altogether. We build Tilikum, but when we try to build TilikumClientApp we’ll find that the new code can’t be used yet.


The answer is simple: the Pod has to be updated in the app. Remember, TilikumClientApp isn’t pointing directly at Tilikum, it’s simply installed the Pod into its workspace just as if it was in the main Cocoapods repository.  So, we need to re-install it.

Doing that isn’t so intuitive, however.  Running pod install again won’t work because Cocoapods won’t think that Tilikum is updated even if you committed the new code.  You can update the Podspec’s version number, but we don’t want to do that after every code change or we’ll quickly stop bothering with the Pod altogether.  Luckily, there’s an easy command line sequence that takes care of it for us:

Don't worry that the other Pod (iRate) appears to be getting re-downloaded, it's actually cached.

Don’t worry that the other Pod (iRate) appears to be getting re-downloaded. It’s actually cached.

Boom!  Keep in mind, with the command above, that this will re-install all the Pods we have specified in our Podfile. However, the other Pods are actually cached and aren’t really being downloaded at all. (On Mac, you can find the cached Pods in ~/Library/Caches/Cocoapods/Pods.)  This means we have very little overheard to this step and it’s therefore feasible to do.


Using this setup, you can easily locate your app-specific code in your app while locating your re-usable code in the Pod.  You can build quick and easy and won’t have to do any refactoring later.  As a bonus, keeping our most useful code in one place encourages us to build unit tests to make sure they’re correct!

Now, all our handy String extensions and enhanced UIButton classes are instantly available to our other apps without having to pull them out later.  It’s all done as we go!

When you’re done building a particular version of your app, you can go ahead and check in the Pod code and cut a new version of it if you like (if you’ve made it public).  Other users can then use your Pod the normal way.

Awesome?  Awesome!


  • Print
  • Facebook
  • Twitter

Apple Watch Impressions: A Day Without My iPhone

I received my Apple Watch yesterday after an arduous, never-ending 10-day wait that I wouldn’t wish on my worst enemy. Since the March announcement, I have intentionally kept myself in the dark on the details of this new Apple product. Does it have a microphone? I didn’t know. Can you make calls on it? I really had no idea. Had I seen one? Nope, I’ve intentionally avoided seeing, touching, or ogling any real-life version of the gadget!

Last night I got it and marveled at its clear screen and completely new UI. I spent quite a bit of time tinkering with the configuration and learning more and more about it. Today, I decided to try and go the whole day without my iPhone. I plunked my beloved phone in my desk drawer and am ready to take the day on armed with just my Watch.

Here we go.

8:55 AM – I have a conference call with my client. I’m trying to do it with my Watch since you can make and receive calls with the Watch via the iPhone. Unfortunately, there’s no dialer, so I’ve had to grab the phone and dial the number (and hang up) so it’s not on my recent calls list. (I’ll add it to my Contact list later.)

8:58 AM – I can’t dial the passcode either. :-/ Gonna grab my phone again and dial it in on there so I can continue on the Watch.

8:59 AM – Oh my gods, once I did that on the phone, the watch no longer has the audio. I don’t know how to “pass the call” back over to it. Ugg. Alright, that will require some research later.

9:17 AM – I just noticed Nick Arnott has his Watch, too.  I can draw a picture to him using something they call “Digital Touch.”  I drew him a dick. (Obviously.)

10:02 AM – Texting with my brother. There’s no keyboard but the microphone does a good job of translating. The lack of capitalization and grammar, as always, does bug me. But it’s a text. And it’s way better than his Android phone transliterates anyway.

11:10 AM – Playing voicemails is odd.  Watch has a mechanism where it turns on when you hold your wrist up.  It seems to be able to tell via the accelerometer, but it does get it wrong a lot, too. (It turns on in many situations I don’t need it to.)  If I go to play a voicemail and want to continue listening while I type, though, Watch just cuts it off and turns off.  Not what I want it to do.  Am I supposed to stand there looking at my watch like an idiot?

12:10 PM – Asked Siri what movies were playing for my wife.  Gave me a nice list.  The Digital Crown is a nice scrolling mechanism so you don’t have to cover all the content with your fat finger.  Reminds me of the Blackberry days, honestly. :-)

12:49 PM – Figured out how to get the Mickey Mouse face watch. Soooooo coooooool.  I love the animation.  I plan on doing a Disneyland Ride Time app this month, so this matches wonderfully.


12:50 PM – Used my phone take a pic of my wrist.  Surely, that doesn’t count…

12:58 PM – Power is down to 16% so charging for the first time.  The magnetized charger is cool because there’s no port you have to expose, but you do have to place the Watch down carefully so it doesn’t come off.  The cord is also HUUUGE. I didn’t charge it last night…and I can’t recall what the charge was when I got it, so I wouldn’t draw an inference.  Let’s see how long it takes to charge all the way now…

2:25 PM – My wrist feels so naked…

2:33 PM – Fully charged!  So, I’d guess it takes about 2 hours to go from 0% to 100%.  Not terrible.  That includes not putting the Watch in Airplane Mode (as I tend to do with the iPhone).

2:51 PM – A lot of apps that have a good idea of how to present themselves on the Watch. I like the Dictionary app which basically gives you a Word of the Day and lets you speak a word.  It’s not Siri integration, just an API to get spoken words, of course.

2:53 PM – Still can’t figure out how to hand off a call from the iPhone to the Watch.  Sad.

3:13 PM – Just said “Hey Siri” while three apps were downloading.  Watch froze. Uh oh. Just unfroze now after the apps finished.  That’s a bug.

3:25 PM – Downloaded a few recommended Watch apps.  Rules looks like my kind of puzzle game, so that’s an easy one.  Shazam I grabbed because the integration with Siri isn’t there on the Watch, only the phone. (Not sure why not.)  Also grabbed a calculator so I can nerd out like the old days with my calculator watches!  Ooh, I wonder if there’s a calculator face for this…?

3:28 PM – You’ll channel your inner OCD when you look at the apps on your Watch and try to get them to form a perfect geometric shape.  I added 3 new apps, but had to add a 4th to keep things symmetrical.  It was Instapaper.  I do wonder why they won’t let you hide the Stocks app?  What’s the hurt?  I think the Apple employees are all heavy investors.

3:30 PM – Whoa!  When you read something you saved in InstaPaper, it speaks it rather than show it in printed form.  Not sure how I feel about it, but that was a surprise!  It’s playing my iPhone, though, not the watch. It’s seem that Watch only plays small sound effects, not music, but Voicemails will play on it. So…

3:35 PM – OK, if turn off “Wrist Raise” in the Watch settings you can let your voicemails play while you type and stuff because the device won’t turn off.  Of course, it doesn’t turn off now.  If you cover the face with your palm it does, which is an intuitive thing.  But gone are the days of raising your wrist to look at the time.  Not sure which I prefer.  Wish Watch was just smart enough to not turn off when you’re listening to audio.

3:50 PM – Rules! is awesome.  Still disappointed Instapaper audio won’t play on the Watch.  Why on Earth would I want to use my Watch as a remote control to play the audio on my iPhone?  I’ve never made Instapaper on the phone play audio…I didn’t even know you could.

4:55 PM – Did a workout and decided to keep the watch on to see the effect.  Felt smooth. The sport version really is extremely comfortable.  Taking it off it was sweaty on the inside.  I’d recommend taking it off during workout if you can.  You just want to avoid any wetness on a $400 watch when ya can, ya know?

6:00PM – Keeping track of the Mets, Rangers, and Yankees games.  The watch is great for doing this without keeping the phone on ya.  I’ve loved asking Siri for sports scores since I got my iPhone 5.  I love the score display, too.

8:15 PM – Well, the day is coming to a close.  Overall, I rate the Watch a 7/10. It’s most certainly an item of pure convenience, but its utility isn’t fully realized yet.  Many apps have some limited functionality and I think that’s how Watch apps should be, but that functionality has to be useful.

The MLB app has a Glance (think a screen on your lock view) that shows scores for your favorite teams.  It doesn’t show “featured” games, though.  I think it should be on the list…I have to scroll anyway.  I can also control game audio, but the audio should be on my WATCH, not the phone.  That’s why I’m wearing it.

I love the Force Touch.  This is the gesture where you press a little harder than a tap. Apple encourages this use in Watch apps, and several do use it.  I expect to see it more. (Maybe to get a phone call to handoff to Watch?!)

Still, it will take many months before the apps catch up to what the Watch can do.  If you don’t have one, the only reason you should get one now is as a developer.  As a consumer, you can definitely wait.  Maybe even until the second iteration of the hardware when the Watch is thinner. (It’s a tad bit bulky now.)

A fun experience.  It’s like when the iPhone was released. A whole new world and my creative juices are flowing to make something cool!

  • Print
  • Facebook
  • Twitter

, ,

The Horrors of Sub-Contracting

I’ve been a full-time mobile consultant now for three years and, even in that short period of time, I’ve seen the kind of work I do change a lot. When I started, I did a lot of projects for budding entrepreneurs and fixed-bid work. I loved it! But over time, partly due to the allure of a high (and steadily rising) hourly rate and the cold reality of an App Store not making many millionaires anymore, I’ve found myself doing a lot more corporate work.

Contract work with big businesses comes in a couple of forms: hourly work and sub-contracting. Hourly work is usually working on a company’s app product line or creating a new app for them. Sub-contracting is the kind of work you get through bigger mobile shops who need to augment a project team with a mobile specialist like I am.

One such gig has made my 2014 a nightmare and I wanted to share that experience with you.

The Opportunity

Back in October 2013, I was approached by a former co-worker of mine about re-writing a pair of mobile apps (iOS and Android) for a company he was working with. This is on behalf of a local Denver firm I won’t name. The apps were small and simple and I had some time available so I told him I’d do it. I bid on the project, but 2 months later the project still wasn’t ready to go and I had to back out because my schedule had filled up by then.

A month later and things were just then ready to go and…hating to pass up paying work…I decided to go ahead and do it. There were some warning signs, namely the length of time it took to start the project, but I really wanted to re-write these apps.

I should have said no.

Turbulance on Takeoff

It’s now January 6th, almost 3 months since I was approached about the project, and here we were at the kickoff meeting. So nice to get this going! Now, my contract reflected the expected timeline; this app would be done by the end of March. Unfortunately, this is also when I learned that neither design nor services had been started yet. What was going on during those previous 3 months??

I had cleared 2 full weeks in my schedule to get things going, but I was going to have very little to do. I toyed with app architecture and tried to make what I could of the early wireframes. A couple services popped up, but it was not even a week in before I was already stalled. I’d started with the Android app, and wanted to complete it before moving on to iOS, but to heck with it…I decided to start the iOS app while I waited.

Soon thereafter, I abandoned working on the apps full-time and would come back to them when the services and designs gave me more to do. I’d pop in for a day or two, a night here, a couple hours there. I’d be working on the apps twice a week, then once a week, then not at all for weeks, then a few times a week, then not at all again.

I’m ashamed to say, I am still to this day working on this app. It’s September 18th, over 8 months since it began.

The Fundamental Problem

I’m an experienced consultant. I’d done part-time consulting for YEARS before I went full-time. I know how to handle a client, so what went wrong? Why is this project taking so long? More alarmingly, the iOS app has long been abandoned! I’m still trying to finish just the Android app! (I stripped out the iOS version of the app from my contract and it won’t be done by me. All the hours spent on the iOS version were wasted.)

What went wrong? What. Went. Wrong?

The problem is my client isn’t a client. They’re a firm, and they’re the ones working directly with the client. I have no managerial responsibility on this project, I am simply the “mobile guy.” And for reasons I cannot even begin to fathom, this firm has allowed their client to drag a simple project out for 8 months:

  • The client spends weeks before they’ll make a decision on…anything.
  • The client approves wireframes and then, later, wants wholesale changes.
  • The client wanted a totally new app design, but slowly reverted every design decision back to the “way it is now.”
  • The client doesn’t answer questions until they’re asked 12 times.
  • The client is clearly insane.

      None of these things are new to me. I’ve worked with dozens of clients, and I’ve had to fire a few of them for being, quite frankly, shitty clients. Once, I fired a client because they had just fired their designer for the second time and they wanted a whole new app design (for a second time). I told them to keep their 2nd payment and I’m done. Another time, I ran away from a client because I had 10 different roles and had been given no authority for any of them.

      Bad clients happen. So what’s the problem in this case? The problem is…it’s not my client. I’m at the mercy of a firm that has mishandled the client in every way imaginable. They’ve allowed the project to stretch to absurd lengths. They’ve allowed them to constantly change requirements with no change to the contract. Quite frankly, the PM can’t manage this project.

      Why am I still working on it? Because I’m loyal to a fault. Also an idiot.


      Loyalty has its limits, and I’ve just now informed my friend that I will cease all development next week, whether the app is published or not. I didn’t want it to come to this, but despite the app being all but done I still think things would drag into 2015. What a bummer New Year’s woulda been. I think I’ve been way, way, way more than fair in all this. I don’t think more than one or two of my contractor buddies would still be working on this thing. And what’s frustrating is it’s not a project that’s a tech failure, or that it’s too buggy, or that it’s just taking too long. No, it’s simply that the client has no idea what they want, they have no urgency to get this app done, and I’m powerless to effect them as a sub-contractor.

      Let this tale be a warning about the horrors of sub-contracting.

      • Print
      • Facebook
      • Twitter


Previous Posts