I am the @Scale conference again this year. Watching large companies (where large == more than just one product say) plan how they both structure their organizations as well as build their products, is top of mind, and last year both were at the forefront of the topics.
What I find interesting about @Scale is that the topics aren’t focused on cool technologies for startups, but more squarely on the issues that larger enterprises face.
I got to participate in today’s announcement that companies are coming together to collaborate via the TODO Group. The focus is to have a space to collaborate openly (mainly around open source). Good stuff.
Technology: Hybrid Fallacy
The constant debate over the last several years is “hybrid” vs. “Web”. I have talked about this again and again, and it obviously isn’t a binary choice.
We often assume that “hybrid” talked about means “using Web technology in native apps”, but in fact that is only one choice. Bret Taylor today talked about how Quip built its sync engine in C++ (helps to have great engineers who know C++ ;), and shares that across iOS, Android, and Web.
It is important to take note of the fact that the shared code is infrastructure code. We aren’t talking about using C++ as a toolkit that is doing anything with the UI tier.
There is a place for C++ in the UI. When you don’t care about the UI looking native. The typical example is “games”. Gaming companies have gotten a ton of leverage by building engines that can be customized for platforms. This can make sense for them as: a) they tend to want to ship to as many platforms as possible, and b) they can afford to build a custom UI. This isn’t true for the vast majority of your apps.
When it comes to the Web side of hybrid, it is good to know where the product (and or company) is coming from.
Some companies had the pleasure of starting in the “mobile first” era (a la Quip), but most “large” companies didn’t. Many of them have a ton of logic tied to the Web. Yup, still. When you talk to people at these companies they will often discuss how they are building services these days. Ask them if that is retrofitted across their products though.
From Web to Service
Let me mention our story at Walmart. When Ben and I landed there almost four years ago, there were no mobile applications, and barely a mobile oriented web site.
A “services” layer was being built, but it was backwards. The services were built on top of the web site. This lead to really bad side effects. Not all of the features were available (only those that were wrapped in a “service”), and the services were very brittle (changes to the web tier often broke services).
One of the reasons often used to “go hybrid” is to solve the problem of “we can’t get access to all of the features!”, where the root cause is actually “we need the services to be king”, and the solution could pop out of that. There are many questions to ask, including: How different are the various features across “all of the screens?”
There are plenty of use cases where the views are very similar between desktop, tablet, and mobile. Great! You can easily share the services and even potentially go hybrid.
However, I believe that the ideal situation is to have services exposing the functionality that each client needs, and to have native feeling UI on top of those services. You need to answer:
- Can we pull off an acceptable UI? This depends partly on how complex a UI you think is suitable, and partly on what the hybrid tech has in terms of capability. Are you sure though that you don’t want to do something wicked cool natively? What about when you rotate the iPhone 6+ and go landscape!
- Do we need to A/B test this puppy all the time? How much would it help to have different views in real-time? Do you want to / have you build an A/B solution that lets you do this natively? (e.g. return a DSL that the native UI can paint)
- Is there complex view logic that makes sense to unify in one place? Really? even better than unifying it to product some simple JSON that represents the UI?
Our item pages are incredibly complex. There are a ton of different types of items, and that “page” is also a platform to surface content from a ton of other places (it touches almost every other commerce team). Should it be a hybrid Web component that is responsive?
The pro is that we can A/B test it, add functionality across the platforms easily, etc. The con is that we can’t do as many fancy native UI-isms. What if instead of a hybrid Web UI we had a clean description of the view that native could render? E.g. “Although there are 196 pieces of data to calculate something about an item, we always show some text under the image, so we can do that logic on the server and just return the info that the view can display there”.
Organization: Customer First not Mobile First
There are many trade offs on the technical side, but what is equally (if not more) important is marrying together the people side of the equation.
In 2014 we are beyond “mobile first”. There are plenty of screens, and your customer can interface with your service from any of them. When the mobile revolution kicked off many built out small “mobile” teams to move fast in the new world. There were few engineers who really knew mobile, so the laws of supply and demand lead to the forming of consulting groups who could “get value” from the companies. At this point, we still have consulting companies helping with mobile, but many more companies have in house engineering efforts (as well).
Having the “mobile” team allows you to move fast, but breaks down. For example, at Walmart we were able to scale out a very small team to quickly build experiences across iOS, Android, mWeb and various countries (not just Walmart in the US). The results were the largest revenue growth that I have been involved in.
The trade offs become real. When you have a silo, the side effects can creep in:
- The “mobile PM” for X and the “desktop PM for X” argue about features (who decides?)
- The mobile organization has different priorities than other parts of the organization (who decides?)
- The mobile organization starts small is heavy in domain knowledge for mobile platforms, but lighter on domain knowledge on the problem domain (e.g. “I work on the iOS app and this sprint am doing some item page work” vs. “I work on the item page and grok the complex requirements of the catalog”).
Moving from platform teams to vertical teams is key. Uber talked about their migration, and it mirrors many that I have seen recently.
The vertical teams are focused on a product for the customer. E.g. “I work on the Walmart Photo team”. They have their own vision, mission, backlogs, and roadmaps. They control as much of their destiny as possible. It is unrealistic to say they control the entirety, because chances are they will be interfacing with other groups (e.g. “We work with the Checkout team to do commerce around photos”). As the products get larger, new vertical teams are created to serve that purpose.
We see horizontal teams to deal with a couple different issues:
#1 Leverage components
When we see that we are solving the same problem three times (across teams), take a look to build a leveraged component or framework (but not prematurely!)
#2 Leverage knowledge
Your company may not have an army of iOS experts. How do you spread the love? We don’t believe in ivory tower architects who just tell you what to do and how to do it, but we do believe in having our best engineers help bring up the level of all of the engineers. It also helps with spreading knowledge between the pillars “oh interesting, the Pharmacy team had to build something just like that, we should talk to them” or “we actually have something in the platform that can help there…”.
#3 Help teams learn
We need to train the vertical teams to be able to own their own codebase across the platforms that they support. This involved “training”, but nothing is better than working with a great engineer. To counter the “architect” what if instead of the rules and enforcement, the following happens: “The photo team has a feature that really pushes the native barriers, so Bob from the platform team is going to join for a couple sprints to a) help them build it and b) look at how we can bring something back to the platform”.
#3 Keeping an eye on cross cutting concerns
When you are in a vertical team you are going to be running as fast as possible to meet your KPIs. In general the team will push on features, so it helps to balance this a touch with keeping the technical debt down and helping performance and other meta concerns.
iOS engineers want to be able to talk about iOS engineering issues. This is where the notion of a tribe comes in. As you move from the “iOS team” to vertical and platform teams, you want to keep the iOS-y communication up. It is important to grow the tribe and have them feel like a cohesive group, even if they are a virtual group.
A core value that sticks out for me is diversity. This cuts across both the technology and people layers. It is great for teams to try new ideas. We need experiments to learn from, and need to balance this with “every team uses a different Web framework” (which is where the platform teams come in).
In the name of diversity, we have room for both “full stack” engineers, as well as “highly focused” ones. If you care deeply about front end iOS work, there is room for you (there is plenty of this work, more than we can ever get done in fact…. [hint: we are hiring ;)]). Also, if you love to jump between the backend and front-end sprint to sprint that is great too! This flexibility means that the team can cross pollinate nicely and folks can load balance on the bottlenecks. Midfield soccer players and “football” kickers are all very welcome.
I am excited to see us trend to vertical teams and get the balances “right” with respect to the platform teams. There should be a natural tension here, and as with all tensions I don’t look for a false world where there are no conflicts, but instead look to see how conflicts are resolved. If issues fester, the process is broken.