A Kid in the June 2019 Candy Store

June 2019 has me feeling like a kid in a candy store.

I’m remarkably excited by the variety of things that are catching my interest and attention this month—so much so that I’m finding it difficult to decide what to do next.

A large part of that is due to all of the announcements at WWDC—but that is not all.

The Monday after WWDC, I wrote about an app I want to create that might be easier to build due to new technologies introduced at WWDC. Foremost among them was SwiftUI which I have really enjoyed digging into.

My week following the developer conference was a flurry of watching session videos and digging into things. But WWDC was not the only thing going on in the world in a few weeks back. On May 31st, Star Wars: Galaxy’s Edge opened at Disneyland.

Star Wars: Galaxy’s Edge

As a big Disneyland and Star Wars fan, had it been any other time of year, I would have tried to be there opening weekend. However, just days before WWDC, with a big LIVE near WWDC show to rehearse and prepare for, there was no way I could make it down to Anaheim.

I didn’t have to wait long though. Last weekend I had the chance to visit Galaxy’s Edge at Disneyland. I feel like they’ve done an amazing job of creating a place that feels very much a part of the Star Wars universe, even though it a brand new location not depicted in any of the movies. My inner nine-year old found it very satisfying to fly the Millennium Falcon, build my own lightsaber, and yes, drink some blue milk.

Combine Framework and Foundation

On Monday I headed home from Disneyland as Beta 2 dropped for Xcode 11, iOS 13, macOS 10.15, and all the rest.

The new beta includes Combine framework support for Foundation classes. So, it just became possible to write code to explore the same sort of data publishing pipelines that were presented in the Combine sessions at WWDC. This includes publishing notifications, properties, and timers.

So, another whole aisle of candy just opened up and I’ve spent most of the week catching up from my trip, rewatching Combine videos from WWDC, and playing around with Combine code.

So far, I am feeling the same sort of enjoyment in writing Combine code as I have had writing SwiftUI code. The main area of frustration I am finding with Combine is that the session videos are the primary place to see Combine sample code. (If I am missing a trove of Combine sample code from Apple – please let me know on Micro.blog or Twitter!) So, I’m finding that anything not covered in those sessions takes bit of trial and error to figure out.

Along the same lines, the code in the sessions often show the path from publisher through operators to subscriber, but don’t necessarily talk about who should be holding onto the publisher or the cancelable item returned from the subscriber, or exactly when it makes sense to set them up. It would be great to see more Combine framework sample code from Apple showing it in integrated into an app project, especially traditional UIKit and AppKit apps.

Toy Story 4, Forky, and WALT

Today I put the Combine framework aside for a few hours to go see Toy Story 4. Every time Pixar announces a sequel I worry that this is the one where they will jump the shark in the franchise. I am very happy to say that I really enjoyed Toy Story 4. I found Forky to be absolutely delightful!

If you know me for any length of time, you will soon discover that I am a big fan of Disney and Pixar animation.

WALT app icon
WALT app

The first iOS app I wrote is WALT: Watched Animation List Tracker. It’s not a commercial success by any means, but it’s an something I wanted to have in the world. It lists over 650 short and full length animated films from Disney Animation Studios and Pixar Animation Studios and lets you check off the ones you’ve watched.

Got to check off Toy Story 4 in WALT today.

I wrote about the creation of WALT shortly after I released it back in 2012. (Was that really about seven years ago? Wow!) A heads-up if you are thinking about paying 99 cents for the app, I do intend to make it a free app and add a tip jar. However there are many other things ahead of that on my to-do list, so I can’t tell you exactly when that will happen.

As mentioned in that original article, one inspiration for WALT was the The Walt Disney Family Museum (WDFM) in San Francisco. I have been a member since it opened ten years ago. The location is beautiful, in the Presidio with a view of the Golden Gate Bridge. And I find the museum and the story that it tells to be inspirational.

Fantasia Talk at The Walt Disney Family Museum

In addition to the exhibits at the museum, one of the things I enjoy most are the programs that they have throughout the year. In the past I have seen many great talks that speak to the creative process. For instance last year, I saw Brad Bird speak about his experiences working with classic Disney animators. I’ve seen animators Andreas Dejas and Floyd Norman talk about their time at Disney. And I’ve had the chance to see original Imagineers like Alice Davis and Marty Sklar.

Tomorrow I’ll heading up to San Francisco to see a talk by composer Fabrizio Mancinelli called The Beauty and Legacy of Fantasia. I’ve always enjoyed and been fascinated with the way animation and music can work together to achieve an effect and look forward to hearing what I believe will be an interesting perspective.

That’s A Lot Of Candy

In feeling like a kid in a candy store, June 2019 is not just some quaint little corner candy store. It’s been a giant store with aisle after aisle of classic candies, exotic candies from faraway places, and brand new candies you had never even heard of before.

With all of this intellectual and experiential candy, I hope I do not get the psychological equivalent of a bellyache. But even if I do, it has been a very memorable and enjoyable month so far. •

Disney California Adventure—A Visual History

Pixar Pier opened at Disney California Adventure this past Saturday, giving Paradise Pier a new theme and a new name.

This inspired me to create this timeline showing the evolution of lands at DCA since its opening.

Timeline of how the lands evolved at Disney California Adventure Park, 2001 - 2018

Click for PDF Version

With the renaming of Paradise Pier, none of the opening day lands of Disney California Adventure remain.

This does not mean that all attractions, buildings, or theming of the original lands have been replaced. It means that every land existing on opening day has at least been renamed, with many rethemed, and some reassigned to other lands.

On opening day, DCA guide maps listed four lands: Entry Plaza1, Hollywood Pictures Backlot, Golden State, and Paradise Pier. These are all now gone.

Golden State was divided into areas, mini-lands within a big land: Grizzly Peak Recreation Area, Condor Flats, The Bay Area, Pacific Wharf, and Golden Vine Winery. These were not full lands when the park opened. Over time, some areas have disappeared as separate areas (The Bay Area, Golden Vine Winery), while others have become lands of their own (Grizzly Peak, Pacific Wharf), and one area even managed to do both (Condor Flats).2

I believe DCA is the only Disney park that has replaced or renamed all of its opening day lands.3

Research for the timeline was done using my collection of guide maps from the park as well as online announcements or news articles of land and attraction openings and closings. Please feel free to send me any feedback or corrections at https://jamesdempsey.net/contact.

Also feel free to contact me at https://jamesdempsey.net/contact if you have guide maps from the early years of DCA that you are willing to sell – or send photos of. I am particularly trying to find DCA maps between late February and late May 2001 to pinpoint the change from Entry Plaza to Sunshine Plaza.

I’ve enjoyed witnessing the transformation of Disney California Adventure over its seventeen year history and hope you enjoy this visual history of its lands. •

About me: I’m a Disney, Pixar, and Apple history hobbyist. I worked at Apple for fifteen years then set out on my own as a software developer, technical trainer, speaker, and musician. I write humorous songs about technical things. My album debuted at #5 on the Billboard comedy album charts and was the #1 comedy album on iTunes in the US, UK, and Canada. If you or someone you know (or someone in Disney Imagineering) needs an original song with clever lyrics contact me!

Yes, Entry Plaza. The opening day DCA guide maps use this name. Within months, the name on the maps changed to Sunshine Plaza

Golden Vine Winery is a good example an area which is still very similar to opening day, but has technically ‘disappeared’. This was originally an area, or sub-land, of Golden State. When the Seasons of the Vine attraction closed and became reopened as Walt Disney Imagineering Blue Sky Cellar, the reopened attraction was now listed as part of Pacific Wharf, where it remains as of 2018. 

Pacific Wharf is the only remaining original land or area that has not been renamed. But it was not a land on opening day, it began as an area of Golden State and was not promoted to a full land until 2012. Grizzly Peak Recreation Area was renamed to the much simpler Grizzly Peak when it also became a full land in 2012.

Shipping a first iOS app

My first iOS app, WALT, went live recently, and I wanted to share some of my thoughts on the development experience.  Overall, there were two big differences from past projects I have worked on.

First, since most of my past Cocoa development has been focused on the Mac, building and shipping an iOS app meant learning a new app framework and some new ways of going about things.  It has been an enjoyable, but odd, combination of exploring things which are a good deal different, yet simultaneously very familiar—like walking into someone else’s kitchen for the first time, but already knowing where they keep most everything.

Second, shipping an app as an independent developer is a very different experience than shipping a product as part of a large team at Apple. Intellectually, I knew this from the start.  Even so, knowing about it doesn’t necessarily prepare you for all of the implications until you’ve lived through them.

One implication, of course, is that I was able to build the app I wanted to create.  I had a few specific goals for a first app:

  1. Create an app that I wanted to use
  2. Focus on frameworks and fundamentals
  3. Build a solid, speedy, polished app
  4. Ship it

Create an app that I wanted to use

Since childhood I’ve been a fan of Disney (and later Pixar) animation as an audience member—suspending disbelief and just enjoying the experience.  Over time, I’ve increasingly come to appreciate the incredible amount of artistry, collaboration and process that goes into each film.

One source of this growing appreciation is The Walt Disney Family Museum in San Francisco, which describes the evolution of animation as part of its narrative.  I’m inspired by things such as the incredible advancements and innovations in animation from the late 1920s to the late 1930s.  Over a ten year period, animated films progressed from being black and white series of sight gags using ‘rubber hose’ animations to lush multi-plane technicolor films with animated characters conveying personality and eliciting emotion.

I’m also inspired by the work of Pixar—and am amazed at the analogous progress of 3D animation from the mid-80s to the mid-90s.

Together, Disney and Pixar have produced over 640 animated shorts and features.  With almost all films released on disc, I wanted to keep track of what I had seen.  I also wanted a quick, mobile reference with some basic information on each film.  And so, I built WALT so I could use it, and hopefully other Disney and Pixar animation fans would enjoy using it as well.

Focus on framework and fundamentals

The features of my desired app lined up nicely with the core functionality common in most iOS apps: present a set of data, navigate, search, sort, filter, summarize.

Since this first app is relatively straightforward, I wanted to take the stock iOS frameworks out for a spin and see just how far they would take me, and how quickly.

My past experience in working with Cocoa frameworks is that it is good practice to use the highest level of abstraction that meets your needs.  On the flip side, it can be treacherous to try to force a framework to be something that it isn’t.  If you must twist the higher abstraction into a pretzel knot of ugly bad practices to meet your needs, it’s usually best to drop to a lower layer and implement what you need (and, of course, file enhancement requests so that a future release might meet your needs).

In the spirit of using the highest level of abstraction available, WALT uses standard UIKit controllers and views, with a handful of custom views.  The app hits just about all of the UIKit highlights: tabs, navigation, tables, custom table cells, search results, modal view controllers.

For data management, WALT uses Core Data.  A key consideration in this choice was the ability to do incremental fetches and updates. It had also been a while since I had done Core Data development on the Mac, so it was a good opportunity to reacquaint myself.

I tend to exercise caution when adopting version 1.0 technologies and frameworks – especially if an app will be immediately pushing the limits of the new technology.  In WALT, I adopted two relatively new technologies: Storyboards and Automatic Reference Counting (ARC).

Since I planned to support iOS 5.0 and later, the straightforward layout of the app made Storyboards seem to be a very good fit.  The Storyboard abstraction seemed useful and held promise to simplify development and eliminate code.  In the end, I encountered a severe accessibility bug which required much of the eliminated code to be added back in one form or another.  Overall using Storyboards was a slight net win for the project, but the experience definitely reinforced my attitude of caution.

I had no intention of moving to ARC, but a few conversations with former Apple colleagues led me to give it a try on a development branch.  It went without a hitch.  My project was in an early stage, so there was not much code to convert, and I did not anticipate writing much code that would hit known ARC ‘sore spots’, such as frequent conversions between Core Foundation and Cocoa.  So, I merged the ARC changes into my main development branch and have not regretted doing so at all.

Finally, I was able to add a bit of social media support in WALT very quickly.  The Twitter framework in iOS 5 made it trivial to add support for tweeting about films you have watched.

Build a solid, speedy, polished app

These three, of course, should be goals of any app since they map to quality, performance, and user experience.  They can also be somewhat subjective areas – how responsive is responsive enough?  How polished is polished enough?  In these areas, I set some specific goals and worked towards them.

First, for me, solid means not crashing, not losing data and not leaking memory.  I don’t have enough programmer hubris to claim there are no bugs in the app, but hours of use without an issue made the app feel pretty solid to me and my testers.  Instruments came in handy to check for leaks—ARC seemed to live up to its promise.  I also periodically ran the Xcode static analyzer, which is excellent at catching potential problems.

Being speedy meant focusing on app launch, scrolling, navigating and searching.  I focused on how responsive the app felt to the user rather than using timed code benchmarks.  The criteria were that the app should launch within a count of ‘One-Mississippi Two-Mississippi’; scrolling should not lag—even in longer lists; navigation should be smooth and search results should feel immediate.

I did hit some scrolling performance issues and found Instruments to be a valuable tool in tracking down the problems.  Most turned out to be cases where I was unnecessarily fetching data repeatedly, which the Core Data instruments made very obvious.  In the end, the app feels snappy.

Making an app ‘polished’ is perhaps the most subjective and all-encompassing—it includes everything from user interaction, to the look of the app; from providing retina graphics, to how the app behaves for VoiceOver users.  Since I was already on the road of seeing just how far the stock frameworks would take me, much of the app polish is provided by the frameworks themselves.

But even leveraging what the frameworks have to offer, there are lots of subtle things that make an app feel better.  WALT contains touches like adjusting the display of a table index and sections depending on the contents of a list, restoring the user’s previous navigation and scrolling state if the app is terminated, and minor but important things like making the tap target size on a checkbox larger than its graphic.

Polishing the app was a process of using the app as I developed it, refining the behavior as the app evolved.  With polish, often the code you end up writing is not particularly difficult or time-consuming, the bulk of the work is in determining exactly how an app should behave.

Ship It

When working on a large project like OS X, someone else sets the schedule and decides that the product is ready to ship.  As an independent, those decisions are yours, but so is the responsibility for those decisions.

I found one of the keys to shipping was to guard against feature creep by choosing a core set of features for version 1.0 and focusing on them.  The process was fairly lightweight.  First, record every issue, enhancement and feature idea.  Then, decide which items absolutely need to be in the 1.0 milestone and move the rest to a Later milestone.

The lists were not immutable.  As work progressed, it became clear some things were more important than originally thought, and some things less so.  I periodically revisited the lists of issues and as time went by became more and more hard-nosed about which features remained in 1.0.

Another hurdle was deciding when the app is ready to ship.  In addition to the feature set, there is so much that can be tweaked—the exact wording of labels, the default layout of tabs, which icons represent which tabs, tweaks to graphics.  At a certain point, I needed to stop tweaking and send the app out into the world.

Wrap Up

I am very excited to have released this first app, WALT, both as a user and as a developer.

As a user of WALT, I’m currently tracking my progress through the Silly Symphony film series where the Disney studio tested many of the animation technologies and techniques that were used in the first animated feature film Snow White.

As a developer, each project brings new learning and insights and this one was no exception.  But, there is also no denying it is a very good feeling when something you have created is released into the world.

And for beginner iOS developers taking those first steps towards building an app, I invite you to join me as I lead a Full Day iOS Tutorial at CocoaConf in Portland, OR on October 25th.

I welcome your comments on this or any other blog post, or the app WALT itself at comments@jamesdempsey.net.