Why I’m Selling My MacBook Pro – Focus

In a word – “focus.” There are a lot of cool technologies available to developers to today and the truth is that, I’ve been spending a lot of time chasing a lot of different albeit very interesting technologies and trying to figure out what makes sense for myself and for Buccaneer. Here’s just a brief list of the things that I’ve found incredibly interesting technology-wise over the last eighteen months:  Docker, Swift, Linux, iOS development, Android development, Arduino, 3D Printing, DevOps, Angular, React, and about a thousand other things. All of them are very cool, but there’s not a lot of depth one developer can get in any given technology if he or she is focusing on more than one or two of them at a time.

So what does this have to do with selling a Mac. Well, I spent years writing iOS apps in Objective-C and a significantly smaller amount of time writing them in Swift and that was fun for a long time, but now Buccaneer and I have moved on to the exciting world of Containerization via Docker and the wider DevOps space.

For a time, I was trying to juggle these two priorities but what I found was that if you have two messages, then all you’re really messaging is a cacophony of white noise. Another aspect of this is looking into the future based on the current tech trends. While there still are some advantages to native apps over hybrid apps, most enterprise customers are correctly focusing on hybrid or web-powered apps or those who have a little more tolerance for a performance hit are skating to where the puck is likely going in the form of progress web apps. Enterprises are really deciding between hybrid apps with tools like React or Ionic or full on progressive web apps using something like Angular or Google’s Polymer. The reasons for this tend to be the usual development and maintenance costs arguments but also that most of the complexity in enterprise systems tends to be on the back-end rather than the client-side.

My solution is extremely simple — to just skate to where the puck is going and that’s toward thinner clients with complicated back-end systems. These back-ends will be hard to maintain and that’s where containerization provides value and I find that sort of work is best done on a Linux workstation, so I’m going Linux 100%.

Mac Exodus Over?

Many commentators myself included have been making some hay out of the trend of developers and other pros moving away from Apple’s macOS in favor of various (usually Ubuntu) distributions of Linux. Vendors like Dell and System76 have seen gains in the professional workstation market against the less then well received MacBook Pro, but Apple is waking up and smelling the professional angst. Apple’s pronouncements in favor of professional computing on macOS and the promise of a revised MacBook Pro as well as a re-designed Mac Pro with a more “modular” design. We’re already seeing the so called Mac Exodus being blunted by Apple’s announcement. The questions becomes less a contest of Linux vs macOS quality and more a race against the inevitable tide of macOS’s professional resurgence. The overall goal for Dell and System76 should be to gain as much market share in the professional workstation space before Apple actually launches new hardware for that market. To that end, I’m going to play “CEO for a day” of Dell and System76 and game out a strategy for both of them respectively. I’m picking on these two firms, because I like them and also feel like they have the best shot of actually being successful.

Dell has money. Lots and lots of money. That’s great but also can lead to conservatism. Their success with the Sputnik project was one of the early and most successful ventures of a major desktop manufacturer into the Linux space. The product it produced – the XPS 13 Developer Edition – is still one of the most compelling Ubuntu laptops available. Dell needs to widen their Ubuntu product-line to include larger higher power models as well as something more akin to the MacBook Air. There will be an R&D / product development cost to this, but it’s going to be worth spending. The other key here is that Dell has a huge asset that System76 won’t – it controls its own production pipeline and has the manufacture of PCs down to a science. That should lead to better yield over competitors which at any reasonable volume means there are some margins to play with there. Dell should cut these margins on select base models of Ubuntu Linux workstations to the bone, nearly selling them at cost. This will make a dramatic cost comparison against Apple, given their already high prices and should also make Dell a very attractive supplier to creative agencies and the like as they look to cut costs in an increasingly competitive environment. Remember, the goal here is to gain market share fast and hopefully create career spanning Linux customers who otherwise would have gone to Apple.

System76 doesn’t have Dell money but it has something else focus. In many ways, they’re already taking the right steps to up their hardware game by moving away from Clevo and Sager hardware and toward producing their own, but more can be done. My expectation is that within the next eighteen months we are going to see more Apple quality hardware from them once their production lines and processes are fully up and running. Sadly, some of it is going to come at a greater cost than money. System76 has good relations with the Linux community and in particular the Ubuntu community. Canonical (the company behind Ubuntu), in what can be described charitably as a pivot toward reality, is dropping its Unity desktop user interface in favor of GNOME and seems to be more focused on IOT and “cloud computing” than the desktop. This makes sense, given that Canonical has limited resources and needs to make real money somehow, someday, someway. The folks at System76 who I’ve met and like very much need to find a way to show leadership in the community by guiding it into a direction that strengthens the Ubuntu desktop as the leading choice for professional workstations. The key here is to lead the community in the right direction but resist the temptation to commit too much of their own limited development resources to the effort. I know what I am suggesting is less being a good community citizen and more leveraging the community, but the reality is that the Linux community has been wasting development resources on alternatives to alternatives for things like package management and window managers — strong leadership could finally close some of these questions and focus the communities efforts.

This is a race against the clock and make no mistake, the window is closing quickly. If Linux workstation vendors such as Dell and System76 can’t make significant gains in market share quickly, then this whole “Mac Exodus” will be little more than a blip in the history of Apple’s domination of the modern professional workstation market. If you have any questions or comments, Tweet me and please checkout my Youtube channel where I offer Docker and DevOps tips.

MacBook Pro 2016 Review

I’ve been having a lot of fun working on Linux over the last few months and continue to use it as one of my two daily drivers, but the realities of corporate VPN policies and the fact that even Ubuntu is not supported by most common corporate VPN clients forced me to pick up a Mac. Being the type of guy that likes to go big or not at all, I went for the 15” MacBook Pro. Take a look:

Sure it’s not the absolute highest end Mac you can buy but it’s by no means a slouch. Here’s some thoughts after working with it for about two weeks.

The Good: The MacBook Pro has the best screen I’ve ever seen in any laptop in over a decade of being primarily a laptop user. The build quality is very good and the “Space Gray” gives it that “pro” feel I’ve found missing in Apple products for some time. While I’ve been pretty critical of the full-fledged (one might even say “courages” adoption of USB-C over USB3), I see the long-term value in having all your devices use a standard port for charging and data transfer, however, I question if Apple would be willing to have the iPhone adopt the standard as well in it’s next iteration.

The Bad: While the MacBook Pro feels premium in practice its performance doesn’t feel like the nearly $3,000 I paid for it. Knowing that it doesn’t run Kaby Lake may be part of my problem and certainly for that amount of money, I’d like to at least have the option of more than 16GB of RAM. Also, the price jump between storage configurations feels a lot like gouging. All in all, the worst part of this machine is the price tag and feeling that you have “SUCKER” painted on your forehead when you compare the price to the specs.

The Ugly: I’ve developed Mac apps and iOS apps for a long time and in the past I’ve be skeptical of Apple’s additions to both platforms. In most cases, I’ve been forced to at least concede that some users may like some features. This simply is not the case for the TouchBar. Try as I might to find a productive and interesting use for it over it’s classic function row predecessor, I’m left feeling like I am holding what in ten years will be a curiosity of Apple hardware design history that is unlikely to be widely adopted by developers let alone repeated in other product lines. I also can’t help but feel that the TouchBar is at least partially responsible for the hefty price tag.

Overall, the MacBook Pro is a fine tool and it does a job that I need done. If you’re looking to fall in love with a device, you’re in the wrong place. However, if you are like me and consider your machines tools to do work on (much a like a carpenter might look at a particular table saw or hammer), then you’re likely going to get some return on your investment and be happy in the end.

How I Missed Web Assembly

As pointed out by an intrepid Coder Radio listener, I totally missed the importance of Web Assembly when it was in its initial nascent phases a year or so go. Now that Web Assembly is going to become a standard endorsed by the W3C and has backing from at least two major browser vendors to date (Google and Mozilla), I’ve done a full 180 and am convinced it is the future of not only web development but probably a good deal of mobile and desktop development as well; my assumption is that tools like Ionic and Electron will be able to leverage the performance gains brought by web assembly as well.

Looking back my mistake was that I failed to parse out the signal from the noise in the wider JavaScript conversation circa 2014 and on. There was (and in many communities still is) a lot of angst about the short-comings in the JavaScript language and a lot of people making noise about using alternatives to it that would simply compile to it –  CoffeeScript and TypeScript for example. There was of course a thread in the background about Web Assembly becoming potentially a language agnostic solution to this problem, but because I was looking at it through the lens of alternative languages to JavaScript and at the time didn’t think and I still don’t think  that changing from JavaScript just because you want a different language but then compiling into JavaScript makes any sense at all. In other words, I took a breathe and shouted a hearty “get off my lawn!”

My curmudgeon-like tendencies aside, I still firmly standby the idea that just writing in something like CoffeeScript to compile into JavaScript just because you don’t some features or shortcomings of JavaScript is silly. What I missed was that this whole language brouhaha was just a minor prologue to the real story — Web Assembly. Moving to Web Assembly not only increases web application performance significantly but also (as more languages create compilers for it) gives those developers who prefer some language over JavaScript a much more reasonable choice; they can simply use the language of their choice and compile it directly to Web Assembly! I’m totally on-board with that. In fact, I’ve been working in Microsoft’s TypeScript and find it great, so if we actually make it (we probably will) to this Web Assembly world, then I’ll probably go Typ eScript for most greenfield projects going forward.

As in Eden, there’s a potential snake in our garden — Apple. Web Assembly being fully supported on mobile Safari for iOS is absolutely necessary to unleash the full potential and development efficiencies that I believe Web Assembly can over the next five year period bring.

Questions? Comments? Blood curdling nerd rage? Tweet me! Also, take advantage of my free strategy session for your next project!

A Farewell to ‘App Developers’

I have had the great privilege of really coming to age at just the right time to be able to get into the ground floor of the mobile app development wave starting in 2008. In fact, to my knowledge, I opened one of the first three purely mobile app development firms in my home state of NJ.  While there were certainly ups and downs, I had a blast. Now it’s 2017 and frankly the party has been over for some time; in fact, I’d argue that for many in my position the end of 2014 and a good portion of 2015 served as a well deserved hang over. Before I get into what I really mean here, it’s important that you understand what things were like from 2008 to roughly 2013. Simply put, the market wanted “app developers” and there just weren’t that many, so an outsourcing / contracting boom began — entrepreneurs and enterprises both were handing out five and six figure checks to dumb kids like me with little to no vetting purely out of the ever present fear of missing out. It was an amazing time. Then the inevitable hangover hit. It happened differently for both groups but it happened and at the end of the day a lot of good small app development shops paid the ultimate price.

Every story needs a good fool and most of the app entrepreneurs (“apprenuers if you’re a hipster from Australia) fit the bill perfectly. Like the little girl who’s enchanted with the tale of the frog prince, they went out an got-a-kissin, cracking open their kids’ college funds or their 401Ks to be the next Uber or whatever the hot app of the week was at the time. Basically, they bought the Disney-like fairy tale sold to them by films like the Social Network. Unfortunately, like most fairy tales that Disney spins into feature films, the true source material ends in tears. Their assets drained, the vast majority of these would be Zucks left the app world with red eyes and broken hearts.

The enterprise space is a little more complicated but shares the fundamental error of understanding that the entrepreneurial one does – that mobile apps are one time capital expenditures rather than ongoing commitments. A lot of enterprises made exactly the same mistakes that entrepreneurs did, but their superior capital and (in many cases) diffusion of blame among managerial groups allowed them to simply swallow the pain and move on. Still, most IT managers now consider apps to be like any other piece of software they buy and not just some quick one off that they’ll let the local shop “take a shot at”. Sadly, this shift has greatly disadvantaged small vendors, as IT managers increasingly look to their traditional long-term software vendors for app development services as simple add-ons to their existing contracts. It’s easy to take a Darwinian perspective here but the truth is a little more dirty than simple survival of the fittest in terms of big vendors and small vendors. Large vendors made it a habit (and still do) of externalizing their app development services to smaller more focused shops. I can tell you that this was fine for a time, but then something changed.

The large vendors realized that it was cheaper to just internalize or in some cases contract out to individual 1099s for their app development services and simply cut the little guys out. We’re in 2012 here now and I surmise that beginning of the app market cooling and an increased pool of young app developers out their had a hand in this. Some went as far as using legally restrictive language in their contracts with the smaller firms to prevent them from using the subcontracted work they had done in their own sales efforts. Imagine being one of these small shops for a moment. You wake up one day and in your email is a termination from one of your biggest “partners”, then the same thing the following week, then again the next week. In a month, you’re waking up to having nothing in your portfolio and payroll outstripping revenue on a monthly basis. What do you do? Do you take the risk and breach your contract, risking a C&D or possibly a full scale lawsuit, do you try to dance around it by mentioning the projects verbally but keeping them out of writing? What happens if you finally have a sale about to close but the prospect wants you to “prove it”? Your former client who overnight became the Empire to your rag tag Rebellion sure as shit isn’t going to give you a reference and might even poach the deal if you try to use them. Welcome to 2015.

I’d like to say that this story has a happy ending but in reality it doesn’t. Many shops closed their doors in 2015 or were forced to restructure in some significant way. Put simply a lot of good people lost their jobs, a lot of would be entrepreneurs felt cheated, and the owners / shareholders of the large IT firms made just a little more money. Even among the survivors “app development” as it was in 2008-2012 is over and they are struggling trying to become small enterprise IT vendors but growth is nothing like it was during the nascent period of app development. Let’s all remember those halcyon days as we look at our CRMs and wonder what the Hell happened.

Like what you read? Don’t forget to subscribe and follow me on Twitter.

4 Must Listen Podcasts For Developers

Software development is a fast moving profession and it’s near impossible to stay up to date with all of the changes, new libraries, and great open-source projects that are coming out on what feels like an hourly basis. That’s where great podcasts come in to keep you not only up to date on your development specialty but also give you an understanding of what is going on in other areas of the industry, so you remain a well rounded technologist. In the interest of fairness, I am going to exclude my own show Coder Radio from this list but I would of course encourage you to give it a shot as well as all of the other great Jupiter Broadcasting productions. So here are my five must listens in no particular order!

Linux Action Show: Though this is more of a general Linux development show, it’s the best source for Linux coverage on the web today. Even developers who aren’t focused on the FOSS / Linux space, should at least listen to LAS to maintain a level of knowledge on the platform to hold up a casual conversation with a Linux-focused developer.

The Bike Shed: Focusing on web development with a specific focus on Ruby, Rails, and all things JavaScript, this show gives a good overall look at the web development landscape from the perspective of developers working at a high-end development consultancy — the show is produced and hosted by members of the Thoughtbot team.

.Net Rocks: This is one of the classic developer shows and it’s still great. Even though I imagine that many of you reading this aren’t work on .Net / Microsoft technologies, this show will still manages to be accessible. This is an absolute must listen for those of you who may have some prejudices or just simply be out of touch with what is going on with Microsoft developers.

Accidental Tech Podcast: ATP is a show hosted by some very deep and thoughtful Apple fans who also happen to be developers. I’m positioning it that way, because like LAS, ATP isn’t designed as a developer show, but they do often showcase development topics. I find this show especially valuable, because I rarely agree with the hosts when it comes to development topics or their general outlook on technology as well as what makes software valuable. It’s this challenge to some of my held beliefs that I find valuable and while my outlook has continued to diverge from theirs, there is still tremendous value in being challenged and I recommend that all of you subscribe to at least one show where your options will be challenged.

One More Thing: OK, so I told you there’d be four but I have a fifth. I just launched a YouTube Channel that focuses on open-source and mobile development tips for the enterprise sector. I hope you’ll check it out!

There you have it – my four must listens and a bonus! Let me know what you think on Twitter and take a look at my company Buccaneer Tech INC!

 

 

 

Three Tech Wishes for 2017

Happy 2017! As we put 2016 in the rearview mirror, we’re all taking a look at the outlook for 2017 as I did here but I wanted to take a more personal angle here and explore what I desperately want to see from the tech community. This list is by no means exhaustive and for the sake of time (and online attention spans) I’m limiting it to my top three.

Google Account Management: Dealing with multiple Google accounts is an unfortunate and annoying fact of life for me both as a regular user and as a developer. In this year alone I’ve probably written thousands of lines of code for myself and for clients to deal with this problem by basically scraping calendar events between two or Google accounts. The business case for this problem is pretty simple. Company A gets a contract to do some work but they don’t have the resources in house, so they subcontract part (or all) of the job to Company B, but Company A doesn’t want the client to figure out that Company B exists and is actually doing the work, so they give all the Company B people Company A Google accounts. My event scraping solution is sloppy and fraught with all sorts of little issues. Google should find a way to implement some sort “vanity account” system that let’s the actual email addresses be masked between multiple domains, so that the customer sees what Company A wants them to, but Company B doesn’t have the overhead of dealing with yet another GMAIL account.

Reactive Programming Hype: A lot has been made of Reactive Programming in 2016. While there is definitely some fire to the smoke, things are getting way too hyped and frankly I’m seeing Jr developers pitching reactive programming on freelance gigs as some sort of silver bullet that will solve all the problems you have have and even ones you don’t know you have yet. This is scary! Sure there has always been hype around “new” (sneer quotes because Reactive Programming is only new from a ‘certain point of view’) technologies and methodologies but this hype train around all things with the word or root ‘react’ in them has the kinetic energy of ten hydrogen bombs. I’ve gotten too many projects in this year from prospective clients that were over-engineered in one of these reactive libraries by some Jr dev who just got a little too excited on the Kool-Aide sales pitch and the story is sadly all the same – the client was happy with what he was told but what he got was a steaming pile of hard to reason about spaghetti code and ultimately a rewrite. For 2017 let’s just pull the cord a little on the hype train, OK?

Docker Direction: Despite some fairly significant pain in upgrading between Docker versions and other more minor issues, I am still a serious believer in Docker as the premier containerization solution. Coder Radio listeners will remember that even as a callow youth I was on the Docker train right from the beginning but my faith has been somewhat shaken and I’d like some clearer communications regarding where the technology is going, who they feel their ideal target users are, and where Docker the company sees its role beginning and ending — in other words where will they and where won’t they compete with vendors who are selling / implementing Docker.

Those are my three (I hope fairly doable) wishes for 2017, but before I go…. I also want to note what I didn’t mention here that I have in my end of year / new year posts for the last years – App Store monetization and more specifically a sign from Apple on where they see that going. We got our answer in 2016 – subscriptions. While that will work for a number of apps and is working fine for my Backpoints (iOS & Android), it does not satisfy all the needs of independent developers and likely will not create the high-value ecosystem of professional paid (paid defined as taking money in any non-donation way) software that the iOS App Store originally enjoyed. When I think about Apple and their answer to the monetization issues on the App Store, I am remained of that great quote from Dan Brown’s Angels and Demons: “God answers all prayers, but sometimes his answer is ‘no’.”

Google Home Review

I’ve been spending some time with a Google Home at my office. It’s. been a pretty interesting experience overall and makes me more confident in my previous assertion that of the big three in tech (Apple, Google, and Microsoft), Google is going to dominate the digital assistant / bot space. While my experience with Home was not perfect, it was a pretty impressive showing for a first generation device.

The Good: Google Home is smart as a whip! There’s just no way around that. My office mate and I spent hours trying to trip it up on trivia, calculations, and finding obscure movie and song facts and the device held up just fine. By far the most useful functionality for our office has been dictating songs to it and passing back and forth; prior to the Home, we would take turns playing (put your hate in the comments) vinyl records. Sure, we could do this with a PC or even an iPad but just being able to pick songs verbally has been an surprisingly enjoyable experience. I know this sounds a bit silly, but it reminds me of when I got my first iPad – I had mocked the iPad as just a large iPod Touch, but I changed my tune after my first few minutes using Apple’s tablet. This is just how I feel about Home, though I went in with a little more of an open mind than I did with the iPad.

The microphone seems fine but I do occasionally have to re-state requests to the device and it’s not clear if I just mumbled or my NJ accent was too hard for Home to parse on certain phrases. The speakers are pretty good and don’t have that tinny quality to the sounds that I was worried about before I got the device. For most users Home will likely be the highest quality speaker they have in their house, but I can see audiophiles wanting something a bit more.

The Bad: I’ve experienced occasional service outages with Home that required it to the restarted. The error message given suggests that my wifi may have been to blame, but every other device on the network was fine. It’s impossible to dig deeper into this, but it stands to reason that the issue is a service hiccup on Google’s end. Silly as it sounds, it kills the magic of a voice interface if you have to get up (in my experience) every other day to unplug and restart the device.

The Ugly: Google account management is a mess on just about every Google product and Home is not exception. Home only allows you to have one account on the device — this is a terrible design decision as it makes the assumption that one account equals one person. The reality for my use case and many others is that on e person will have multiple accounts. My guess is the most common case would be users (like me) have one Google account personally that has their Play Music, YouTube Red, and other Google entertainment services on it and also have a Google Work account used primarily for email and (most importantly for the purposes of Home) calendar. In my case, I put my personal Gmail on Home to get the entertainment functionality but am totally cut off from my work calendar. Ideally, I’d like a system where Google understands that users have different Google accounts for different contexts and allows the user to take calendar services from a Google Work account while using their personal account for entertainment and everything else.

All in all, I like the Home. It is definitely a first generation product, but most of the issues with it are fixable via software. Currently, I don’t see any real competition for Home other than Amazon’s Alexa but Amazon is in a very different business than the big three, so I would question their commitment to building a truly expandable AI assistant – Google’s opening of Actions to third party developers is a strong step in the right direction. Apple seems unwilling or unable to make Siri more than a lame parlor trick and even if they did, they’d likely be very paternalistic in terms of user privacy, severely limiting third party developer access. Microsoft is doing some really cool stuff, but they don’t have the platform beachhead that Google has in Android and all of the Google related services and that Apple has with iOS. The most surprising aspect of using Home is how it has me strongly considering picking up the next flag ship Android device to get that Google AI functionality on the road. Do you have a Home or comments / questions on this post, sounds off in the comments or Twitter.

Pallet Town: First Steps to Functional

I’ve been taking a deeper look at Functional Reactive Programming in the form of RxJavaand ReactJS. While I am still at the early stages of really looking at this and forcing myself to actually work in these technologies that I’m still no really sure make a lot of sense for my use cases (more on that at a later date), I was taken aback by the simple usefulness of the “Functional” part of the equation. At the risk of grossly oversimplifying the benefits of functional programming (or at least adopting a more functional style in your object oriented code), there is a ton to be gained with just a little bit of re-thinking of how you think about the relationships between your objects and how you structure your methods. This is because one of the main benefits of functional programming is that it minimizes state and therefore unintended side-effects. Here are the two quickest and easiest ways to improve your code today using a more functional mindset.

One Function == One Action:” Every function you write should do one thing and only one thing. Let’s take a very simple sample of what this should look like:

public Pokemon getPokemon(int id) {
	Pokemon  myPokemon = PokemonStore.getById(id);
	myPokemon.setType("fire");
	PokemonStore.save(myPokemon);
	return myPokemon
}

The Assumptions in that are that we have some PokemonStore class that is effectively an ORM for your Pokemon. That’s fine. The issue here is that our ‘getPokemon’ function doesn’t just fetch us the correct record by id as you would expect it to. Instead it updates it ‘type’ property and reserves the mutated record to the datastore before returning the record. This is obviously terrible on a number of levels but looking at it from a functional point of view, the primary sin is that it does three things (getting a record, mutating a record, and saving a record) rather than just one and what it does doesn’t match the method signature. A better version of this method would have mutating the type in another method and simply return the record:

public Pokemon getPokemon(int id) {
	Pokemon myPokemon = PokemonStore.getById(id);
	return myPokemon;
}

As you can see that’s easy to read, does one thing, and there’s little to know risk that a future developer won’t understand what the method is supposed to do.

Deterministic Outputs: A method given the same inputs should always return the same outputs. If that’s not true, then you likely have too much coupled state in your code that is causing unforeseen issues. This is a great example of what not to do:

public Pokemon getFirstPokemonInRoster() {
	List<Pokemon> roster = User.CurrentUser().getRoster();
	Pokemon starter = roster.get(0);
	return starter;
}

There’s a lot not to like in this method. For starters it relies on the start of a Users.CurrentUser() singleton, which instantly creates couple state. Another issue is that it’s not very flexible — is it really true that we will only ever care about the current user’s roster? Finally it’s not written in a way to be optimized for easy BDD / testing and violates the functional principle (or perhaps guideline) of passing in the objects / values a method needs to run into the method directly rather than pulling them from another place. Here’s a minor change that addresses all of those issues:

public Pokemon getFirstPokemonInRoster(int userId) {
	User user = UserStore.getById(userId);
	List<Pokemon> roster = user.getRoster();
	Pokemon starter = roster.get(0);
	return starter;
}

As you can see, the revised method can now the pull the roster for any arbitrary user and does not rely on a user singleton. You can easily imagine a test being written that passes in a valid user id to test the golden path for this and also another test with an invalid value for the userId paramater; incidentally, my method still doesn’t handle that case, but there are multiple ways you might do that and catching that sort of thing is really what automated testing is for ;).

I hope you’ve found this helpful! If you have any questions or comments, please sound off below or on Twitter.

Business Innovations: Fast Pass

As I sit in the flight back from my family vacation to Walt Disney World in Orlando Florida, I find myself in awe of what I can only describe as the most ingenious business innovation since the independent subcontractor – the Fast Pass. If you haven't been to WDW in a while, Fast Passes are basically attraction reservations and they work just like restaurant reservations. This may seem like a pretty simple concept and not that innovative, but let's take a look at two real-world case studies from my last week in Orlando and note how the Fast Passes proved invaluable to WDW.

WDW is currently in a state of being "re-imaged", the jargon the "imagineers" over at Disney use when they are modifying the WDW attractions. One of the parks that is slated to undergoe and is currently undergoing a good deal of re-imagining is EPCOT, in particular the "World Showcase". One of the most notable changes the "World Showcase" has undergone is the addition of a ride themed after the popular children's film Frozen. As one of the newest attractions and being themed after a smash hit with kids of all ages, the ride has some monster wait lines where you can see dozens of eager little girls dressed up as one of the film's leads, Anna or Elsa. Even my coal black heart wouldn't dare deny these princesses their shot to "experience Frozen" if but for a few minutes. Still, mom and dad don't want to stand in line for an hour and there are meal reservations to be kept as well as other (perhaps more adult appealing) attractions to see. What does a savvy Disney-goer do? You open the My Disney Experience app possibly weeks before you even get to Orlando and book a Fast Pass for a date and time that is convenient with the rest of your schedule for each Frozen fan in your party. That's it. You've just taken a wait that could have been well over an hour and gotten it down to something like ten minutes. This is great for the park-goer and also great for Disney, as it mitigates one of the primary pain points of going to WDW, the lines.

Mistakes happen even in the Magic Kingdom. Systems can fail or employees can just plain screw up. There's a lot of complicated RFID tech being used at any given time at WDW and I saw on more than one occasion in the last week where the Magic Bands simply wouldn't work for some reason. This happened to my family as we entered the Magic Kingdom theme park — for some unknown reason my band worked fine but my wife's failed; ironically, she is an annual pass holder and I am not. We knew her pass was still good but were admittedly a little frustrated after having been asked to step aside at the entry point while the staff could verify that Lara's pass was indeed valid. After a few minutes of waiting, the staffer got back to us with a sincere sounding apology and a couple of Fast Passes to any attraction we like as an apology for the system's glitch. Our frowns were turned upside-down. The beauty of using the Fast Passes like this is that they don't cost Disney anything at all and in this case they still got to do the somewhat awkward pass verification that they wanted, but instead of having an offended guest Lara remains ever the happy Disney princess. They key to this is that there is a difference in the monetary value (read cost) of the Fast Pass to Disney (i.e. $0) and the practical value to the guest.

Many of us struggle in our small businesses in trying to find a way to give something of value to the customer in cases of an error or just as a way to build a better relationship. Unfortunately, very few of us have managed to get up to the level of sophistication as Disney has in terms of having such a wide delta between the monetary cost to our firms and the perceived value by the customer. All too often, we find ourselves doing work effectively for free due to scope issues or eating opportunity costs by going into unpaid "account service" meetings. I wish I had some solution that I could stand on a soapbox and extol, but I don't. Still, I think maybe it's time to take a cue from the house of mouse and re-imagine how we run our agencies.