4.0.1 to 5.2: Reflecting on my first 2 years with Ulta Beauty

In our latest release we added support for iOS11 and the iPhone X, a major milestone for our development team. With that release I thought it was important to take a look back and see just how much the app [and team] has changed in my time at Ulta.

Key Initiatives:

  • Cleaned up, simplified, and modernized the codebase. Established a cadence for structuring code aimed for readability and understanding with emphasis on in-line comments explaining business logic. In most cases I tell my developers to structure their code linearly so that it mirrors what’s being displayed.
  • Identified redundancy in models/views and consolidated
  • Removed all non-essential third party code (that isn’t mandated by business partners)
  • Banned the use of cocoa pods and dependency managers.
  • Removed all unused and old assets / converted new assets to PDF (vector)
  • Created a “Core” which handles all our application/session/configuration management, as well as contains our own web services client
  • Established rules on native first UI/UX patterns with creative partners and an understanding of maintaining code over time e.g. I don’t want to be fixing custom controls with each OS release.
  • Compartmentalized storyboards based on features [performance/readability]

*It’s important to note that the above initiatives reflect my viewpoint on how a large enterprise project with multiple [sometimes fluid] team members should be treated. When creating my own apps I have similar from different goals and I can take certain liberties knowing only I will be maintaining the code.

The screenshots below are a few examples of said changes. On the left is version 4.0.1, the app I inherited when I started, and on the right, 5.2, our latest release.

iPhone X, iOS11, and P3 Colors

Some callouts:

  • Search bar changing height is iOS11 revealed some skeletons in our closet, primarily around trying to maintain opaque navigation and tab bars which led to layout issues. I also explored moving the search bar to the new searchController property on navigation controller, but the business ultimately wanted to maintain the title view approach/look. Search controller is nice though because it has support for large title, hiding when scrolling, etc.
  • Supporting iPhone X wasn’t too much effort because of my previous enforcement of using native views/controls and auto layout.
  • For P3 colors we changed obvious things at first: launch screen, app icon and primary brand colors. We also made a conscious choice to not make every brand color P3, like the typography saying “If everything is bold, nothing is bold” – and we wanted certain color to stand out. P3 conversion from a code perspective is simple, but from a conversion standpoint I still am not sure the proper method.



Converting Brand colors to P3 (view image below on P3 screen for accurate reproduction)

CCR Cont.: Checkout and Order Confirmation


As with Cart, my team and I re-wrote checkout from the ground up. We set out to create a user-friendly, ada compliant, and reliable single-page checkout.

Features of note:
  • Skelton loading
  • Single page design
  • Smart address suggestions with usps recommendations
  • Section level messaging
  • Quickly access saved gift cards

Order Confirmation