A developer's journey creating a simple dice app across seven platforms reveals systemic challenges in documentation, tooling, and ecosystem fragmentation that continue to plague native application development.
The developer community continues to debate the merits of native versus cross-platform development, with frameworks like Electron dominating many application categories. Yet beneath this conversation lies a rarely examined reality: the actual experience of building native applications across major platforms remains surprisingly challenging and inconsistent. A recent experiment by ArcaneNibble, who undertook the task of creating a simple dice-rolling application across seven different platforms, offers a revealing snapshot of the current state of native development.
The Fragmented Landscape
What emerges from this comprehensive experiment is a picture of extreme fragmentation. Each platform presents its own unique set of challenges, from build system complexities to documentation gaps and conceptual inconsistencies. The developer's experience ranged from the straightforward simplicity of Standard C to the "magical" but restrictive nature of Apple's SwiftUI, with numerous frustrating experiences in between.
The most striking pattern is the disconnect between platform rhetoric and developer reality. Major platforms tout their developer-friendly environments, yet the actual implementation often falls short. GNOME, for example, promotes itself as an accessible environment, yet the documentation fails to explain crucial concepts like GLib or GObject that are fundamental to understanding how the platform actually works.
Documentation as a Critical Bottleneck
Across all platforms, the quality and accessibility of documentation emerged as a critical pain point. This isn't merely about missing API references, but a failure to build mental models and conceptual understanding that would allow developers to troubleshoot effectively.
The GNOME experience exemplifies this issue. The introductory documentation makes almost no mention of GLib or the GObject system underlying all GNOME applications. This creates a significant barrier to understanding, as these systems are essential for responding to user actions. Similarly, the KDE documentation, while more task-focused, suffers from organizational issues that make it difficult to locate essential information.
Even well-resourced platforms like Android struggle with documentation fragmentation. The Jetpack Compose documentation is spread across API references, marketing videos, oversimplified codelabs, and tutorials that avoid explaining how to build complete applications. This fragmentation forces developers to piece together information from multiple sources, increasing the cognitive load and time investment required.
Build System Challenges
Beyond documentation, build systems emerged as another significant source of frustration. The KDE/Qt experience demonstrated how CMake's confusing error messages can derail development efforts. The developer encountered unhelpful error messages like "couldn't find 'ECM'" without clear guidance on resolving the issue, and inscrutable errors like "No TARGET 'something' has been created in this directory" that required mysterious workarounds.
These build system challenges aren't merely technical inconveniences; they represent a fundamental barrier to entry for new developers and contribute to the perception that native development is unnecessarily complex. The contrast with the simplicity of Standard C's approach is striking - a language that, despite its limitations, offers a straightforward path from code to executable.
Commercial vs Open-Source Approaches
The experiment reveals interesting differences between commercial and open-source platform approaches. Apple's SwiftUI, for example, offers a tightly integrated, magical experience that works seamlessly within the Apple ecosystem. The live preview functionality in Xcode represents a high standard for developer tooling, demonstrating what's possible when a company controls both hardware and software.
Microsoft's WinUI 3, while improved over previous Windows frameworks, still suffers from brand confusion between WPF, UWP/WinUI 2, and WinUI 3. The documentation fails to clearly distinguish between these technologies, leading to frustrating errors like using Windows.UI.Xaml.Data instead of Microsoft.UI.Xaml.Data.
In contrast, open-source platforms like GNOME and KDE struggle with coordination and consistency. GNOME's Human Interface Guidelines and recommended workflow using GtkBuilder XML and Gnome Builder as an IDE create an experience that feels incomplete and inconsistent. The developer repeatedly encountered situations where "nothing happened (but something should've), and now I have no idea why" - a debugging nightmare that suggests fundamental issues with the platform's design.
Standardization vs Innovation
The experiment highlights a fundamental tension in software development: the balance between standardization and innovation. The POSIX experience demonstrates how slow standardization processes can lead to irrelevance. POSIX fails to specify modern random number generation mechanisms like getrandom(2) or /dev/urandom, despite their wide availability.
This creates a paradox where standardization, intended to solve portability issues, instead becomes part of the problem. As the developer notes, "the issues which they had hoped to solve (e.g. portability) once again become everybody's problem." This applies not just to POSIX but to broader standardization efforts, including C's slow pace of modernization.
Developer Experience Trade-offs
Each platform presents different trade-offs in developer experience. Qt/KDE, despite CMake challenges, offered clearer error reporting and more straightforward debugging. The platform was "louder with errors, usually at least printing something to the terminal when something went wrong," which greatly reduced "nothing happened" debugging frustration.
SwiftUI, while enjoyable to work with, comes with significant ecosystem restrictions. The tight integration between Apple's hardware, software, and programming languages creates a walled garden that simplifies development but limits portability and reuse.
Jetpack Compose for Android emerged as the most disappointing experience, described as "a very soulless 'I wish it were SwiftUI'" with documentation that is "a horrific mess, oversimplified into oblivion." The asynchronous nature of androidx.datastore.core.DataStore for persistent settings created integration challenges that the developer couldn't resolve satisfactorily.
Community Sentiment and Adoption Signals
The experiment reveals interesting patterns in community sentiment. Despite the challenges, certain platforms appear to have strong community support. The developer notes that KDE benefits significantly from Qt's widespread use outside the Linux desktop ecosystem, in industrial HMIs and automotive infotainment systems. This commercial interest likely yields more resources for documentation and tooling.
The GNOME community appears to struggle with inclusivity. The developer notes hearing repeatedly that "GNOME keeps failing to listen to, communicate with, and value contributions from power users and other 'outsiders.'" This suggests a potential disconnect between the platform's development team and its broader community.
Counter-perspectives
While the experiment highlights numerous challenges, it's important to consider counter-perspectives. Some might argue that the complexity of native development is inevitable given the diversity of platforms and user needs. Each platform has evolved to meet specific use cases and user expectations, resulting in different design philosophies and technical approaches.
Others might suggest that the challenges documented are temporary, representing the growing pains of rapid innovation. Platforms like SwiftUI and Jetpack Compose are relatively new, and it's reasonable to expect that documentation and tooling will improve over time.
The developer's own conclusion offers a balanced perspective: "If you actually want to build a native cross-platform app, I'd personally recommend Qt (although I would not use CMake)." This suggests that while challenges exist, some platforms offer more viable paths than others.
Looking Forward
The experiment raises important questions about the future of native development. As cross-platform frameworks continue to improve, will native development remain viable for most applications? Or will the complexity and fragmentation documented here drive more developers toward solutions like Electron, despite their performance and resource implications?
What's clear is that platform maintainers must address the fundamental issues identified: documentation quality, build system reliability, and debugging support. Without these improvements, native development risks becoming the domain of specialists rather than the mainstream approach it once was.
The developer's experience offers a valuable reality check for anyone considering native application development. While each platform has its strengths, the cumulative effect of these challenges suggests that the dream of seamless, enjoyable native development across multiple platforms remains elusive. As the tech community continues to evolve, addressing these fundamental issues will be crucial to ensuring that native development remains a viable and attractive option for developers building the next generation of applications.

Comments
Please log in or register to join the discussion