These videos were published in 2022. Technical conditions, personal experiences, and opinions below belong to that period.
Cross-platform development is often summarized as using one codebase on several platforms. In a real business, the team must also ask how quickly a page appears, how it accesses native capabilities, whether platforms behave consistently, what developers must relearn, and who maintains those capabilities.
In T Chat episode 15, published in November 2022, Bill first described the evolution of cross-platform approaches at ByteDance. He then spoke with the host about entering the field, making technical choices, and growing as an engineer. The technical talk lasted about 34 minutes and the career conversation about 27. The architecture, standards, and performance issues in the first recording became concrete questions about what individuals should learn and how teams should work in the second.
Technical talk: business problems drive cross-platform choices
Start with the experience of loading a page
Bill defined his subject as UI frameworks that work across operating systems. Business code reaches different platforms through an intermediate layer, reducing the amount of platform-specific work each developer must do. Platform differences do not disappear; some responsibility for handling them moves to the framework and its maintainers.
Some businesses initially used Web pages. In scenarios with stricter experience requirements, however, they encountered blank screens during loading, the cost of calling device capabilities, and the need for custom features. Campaign pages make the problem particularly visible: users do not have to stay on them and may leave if entry takes too long.
His Spring Festival campaign example follows a user who taps an entry point, sees a loading state, waits, and returns to the main flow before the campaign appears. Loading speed therefore affects whether the page can retain the traffic sent to it, not merely a framework benchmark. Search cards, commerce campaign surprises, and a Singles’ Day countdown also require device-side features that an ordinary Web page does not automatically provide. Business and client teams must decide how to supply those features together.
These were the business conditions Bill experienced. They do not establish that every Web page is slow, nor do the recordings provide a measurable user-loss rate.
Reusing native capabilities still requires performance checks
Bill next described the period of introducing React Native. Client developers could provide custom components and device functions ahead of time, allowing business developers to assemble pages without building each one separately on iOS and Android.
Commerce was his main example. As the business started, core pages such as product details and order submission gradually moved to React Native. Native components prepared by the client team made the features easier to compose. But the business also ran A/B experiments after the migration. Bill recalled longer page-entry times and unfavorable movement in core measures, including GMV. Any improvement in development efficiency had to be weighed against page performance and business outcomes.
That experience helped drive work on the internal Lynx approach. The recording does not include full experimental data that would support a general ranking of frameworks. Bill also considered Flutter’s package size and integration cost for a large existing app. A standalone app or small exploratory team can face different conditions. The history is therefore a series of choices under different constraints, not a universal sequence of framework replacements.
Productivity depends on capabilities built in advance
Reducing duplicate page development assumes that device components, APIs, and infrastructure already work well. Business developers can move quickly because others have handled platform integration, native features, and engineering tools first.
Developers accustomed to HTML and Web standards also have established ways of working. Bill said the team continued improving how Web pages render and load, instead of forcing all business work through one expression or runtime.
Search and campaign pages illustrated the trade-off. Bill described search moving from a native implementation to React Native, with Web as a fallback when loading failed, and later to Lynx. He said business results after the Lynx move were roughly on par with the native period. This was his account of a business observation, not a published controlled experiment. Spring Festival and World Cup campaign entry points had many changing interactions: device infrastructure had to preserve an acceptable opening experience while product and business teams changed content quickly.
He also recalled an urgent information page related to the pandemic in early 2020, when the internal approach was still young. Unlike a holiday promotion, its first requirement was to appear in time. If every change required a new client release, the delivery cycle would miss the need. These cases had different goals but all depended on prepared device capabilities, business-side page creation, and appropriate fallback paths. A benefit in one scenario cannot simply be transferred to another.
Changing team responsibilities leads to architectural layers
As frontend developers took on more business pages, client developers’ work changed rather than vanished. Native customization, stable interfaces, and architecture became prerequisites for the upper layer’s speed.
Bill described a layered design. At the top, a DSL lets business developers describe UI and logic. An intermediate device-capability layer handles customization, preloading, caching, bridging, resource handling, and monitoring. Beneath it, an engine executes logic and organizes rendering; iOS, Android, and other systems ultimately draw the interface.
The capability layer should allow plugins. Different host apps and businesses need different behavior, while the common engine should not fill up with special cases. Rendering also has to absorb differences in layout, component behavior, and execution order so that one description produces reasonably consistent results on each platform.
He traced a page description through the layers: developers express the UI in a familiar form; the intermediate layer connects communication, caches, preloading, and custom components; the engine issues rendering work; the system and GPU produce the screen. If an iOS and Android layout rule executes differently and the framework does not absorb that difference, business code accumulates platform branches. If every unusual campaign changes the engine, the engine becomes hard to maintain. Layering gives each kind of variation a place.
This also broadens the skills developers need. Frontend code building a device UI must consider CPU, memory, and stability. Client developers benefit from understanding the business-facing page model. Bill encouraged each group to understand the other’s constraints.
Three challenges: developer habits, platform differences, and device computation
His first challenge concerned DSLs and their users. React Native, Flutter, and other approaches require different languages, components, tools, and ecosystem work. Selection should account for the team’s existing skills and resources, not just the framework’s technical design. His 2022 judgments about ecosystem direction should not be treated as current popularity figures.
Second, each additional platform creates compatibility work for framework and business teams. Bill appreciated Flutter’s approach of taking greater responsibility for rendering because it can reduce differences in native controls. Drawing the UI yourself does not, however, remove every difference in input, resources, or system capabilities.
Third, device computation matters. UI descriptions must be parsed, calculated, exchanged between logical and platform layers, and drawn. Low-end devices make this work more noticeable; even devices with more cores need a thread design that actually uses them. Data movement between layers and construction and updates of the UI tree are costs to analyze, rather than a single explanation for every blank screen or stutter.
Bill separated visual consistency from computational cost. Two platforms may produce similar images yet need very different amounts of work to do so. He suggested improving inter-layer communication while also reconsidering how threads use multicore hardware.
Standards and community affect long-term use
For a framework aimed at frontend developers, large departures from familiar rules impose a continuing cost. Bill wanted closer alignment with Web standards, while acknowledging gaps in the implementation at the time. That was a direction, not a claim of complete compatibility.
The developer community can feed improvements back into the framework. Its maintainers cannot anticipate every business scenario; use, feedback, contributions, and ecosystem tools shape later work. Actual developers ultimately test whether the approach is useful.
Bill looked beyond mobile to desktops and newer screens and interactions. A more stable rendering layer might help upper-level business code reach those environments. He also mentioned WebAssembly as an execution technology worth watching. These were 2022 explorations, not a claim that one route had already solved all multi-device problems.
At the end of the talk he connected three ideas: let different developer groups use familiar DSLs; let intermediate capabilities connect those inputs to platform rendering or self-drawing as appropriate; and seek a stable expression for rendering instructions at the bottom. A change in one layer would then be less likely to force rewrites in all others. A React team and a Vue team, for instance, need not adopt the same business language merely because they share an engine. Supporting desktop, VR, or glasses would still require work on each device’s inputs, interactions, and system capabilities.
Why not simply use Flutter?
An audience question brought the choice back to a concrete team. Bill emphasized package-size limits in a mature large app and the cost of learning Flutter’s language and DSL and building its supporting engineering practices.
The host then asked whether a small team faced the same burden. Bill said standalone apps and experimental businesses can make a different choice. He recognized Flutter’s usefulness for quickly building similar experiences on both mobile platforms and validating a new business. Both halves of that answer are needed to understand his position.
Career conversation: from understanding rendering to forming engineering judgment
Cross-platform work came from both business needs and curiosity
Asked why he chose the field, Bill recalled early React Native exploration at Didi, driven by a desire for more consistent iOS and Android behavior and greater development efficiency. Personally, it also offered a way to understand rendering: what happens between writing code and seeing pixels on screen?
Devices and interaction forms change, but knowledge of UI construction and rendering can transfer. For Bill, choosing a direction was partly choosing knowledge that would remain useful beyond one popular framework.
He did not offer a promotion table based on years of service. Early deployments exposed difficult two-platform compatibility work. Studying Flutter showed him a different rendering strategy. As he worked on device capabilities and examined other approaches, he moved from individual modules toward whole-system questions: which layer owns a problem, and which costs deserve optimization? Learning meant asking why a design exists and whether it helps real businesses and users, rather than copying it.
Compatibility branches can start a deeper investigation
When an audience member asked about a Didi internal approach, Bill focused on platform differences. If a business page repeatedly says “on iOS do this, on Android do that,” cross-platform development has merely moved two implementations into one file. He wanted to explore lower-level common expressions so that every page would not repeat those branches.
The host then asked about early career development. Bill advised trying multiple approaches, learning their principles, and forming one’s own view through comparison and practice. Someone else’s conclusion is not yet one’s own technical judgment.
Where Lynx fits, and where duplication may be justified
Asked about Lynx’s place in the system, Bill again emphasized performance-sensitive pages and important campaigns. Not every page needs it. Web continues to serve some scenarios, and standalone apps without a large infrastructure team may be better served by mature alternatives.
This led to a discussion of “reinventing the wheel.” Common foundation capabilities should be unified where possible, but businesses can reasonably customize services, workflows, and optimizations at the right layer. Similar-looking code is not enough evidence that two implementations solve the same problem. Isolation requirements can also shape organization; the interview did not map every internal system.
Supporting standards takes work but saves users work
On a question about CSS and the development experience, Bill acknowledged remaining gaps and work on parsing and other foundations. The host asked whether supporting more rules would make the framework too heavy. Bill agreed that each capability requires implementation and that architecture must control its cost.
The alternative also costs something: developers entering a team may have to relearn rules that work only inside that company, losing the benefit of existing tools and experience. Bill treated standards as a condition for long-term use and a healthy ecosystem, not just another item on a feature checklist. A smaller implementation can shift a larger learning and maintenance burden onto its users.
Evaluate a new route by the part it changes
Asked about new technologies, Bill mentioned Meituan’s exploration involving Rust, WebAssembly, and cross-platform execution. He was interested in how logic execution, communication between layers, and native rendering were arranged and which existing bottleneck the new route addressed. The recording was not a full architecture document, so specific component names or performance numbers cannot be inferred from it.
Why algorithms matter in cross-platform engineering
Bill recalled joining ByteDance in early 2019 and its algorithm-focused interview at the time, while noting that requirements change. Clear reasoning and a sound approach mattered more than memorizing a fixed set of question types.
UI tree traversal and updates make data structures relevant to the work itself. When the host asked whether trees and graphs deserved special attention, Bill agreed that UI trees use such operations but declined to give a “study only these questions” list. They also discussed linked lists, graphs, dynamic programming, and greedy methods. Different algorithms offer different ways to analyze a problem, and actual engineering work does not arrive labeled with an interview category. He recommended steady practice in the basics rather than predicting a shortcut for a particular role.
Engineering culture requires real discussion of proposals
Bill recommended learning how mature teams propose ideas, review designs and code, and carry proposals through to delivery. Review improves quality only when people engage with it. Clicking approval leaves a record but does not reveal a problem or explain an improvement.
He described design documents in his team that set out background, purpose, the problem, tests, and long-term maintenance. The host compared this to an RFC. Their concern was not a particular document format but whether an idea could be questioned and improved between proposal and release. A small team need not copy every large-company procedure to write down the problem and trade-offs and give substantive review feedback.
Grow beyond the boundaries of a job title
Finally, Bill returned to the overlap of frontend and native work. Frontend developers can learn why client engineers care about memory and resources; client engineers can learn how upper-layer UI and business flows are built. Deep technical work should advance alongside an understanding of the people who will use the resulting tool. A solution built only to satisfy its implementers can leave all other developers with a high cost of use.

