As someone who once worked on desktop apps professionally, I've been asking myself this same question a lot over the last couple years. I think there are a few reasons.
- Mobile completely eclipses desktop in active userbase. With the pandemic, desktop has made gains, because people have been stuck at home, but nobody expects that to last forever, and even with the gains, mobile is far more popular. Compound this with the fact that, for years, mobile experiences have been held back because developers were on desktop, even when most of their customers were not. It's difficult or impossible to develop on mobile, and a pain to test on a separate device, so most developers worked and tested on desktop, leading to things being too small or non-functional on mobile. This gave rise to the mobile-first push, mostly from managers and developers who understood the market importance of mobile. In many organizations, I suspect it was such a slog to get everyone on board, I doubt they want to risk undoing that effort by creating new desktop apps.
- Desktop frameworks have not just stagnated, they've degraded. This is most true on macOS, least true on Windows. Even as Apple has invested in updating AppKit, the results have been uneven. There are still some controls using cells, and some controls that were updated to use views, but then haven't been updated to match newer framework conventions. At the same time, new bugs get introduced in every major OS, making desktop apps buggier over time, and forcing app developers to constantly keep on top of things.
Apple has tried to hit this from multiple angles, from running iOS apps on Mac, to SwiftUI, but I think it's telling that SwiftUI works best on Watch, then on iOS, and finally on Mac. The desktop is the lowest priority for that framework. Catalyst and running iOS apps are largely throwing in the towel, replacing desktop development with mobile development, but even then, they're not perfect.
Linux has faced less-extreme versions of these issues with both GTK and QT, though at least these aren't strictly tied to OS version. There's also issues around licensing drama with QT, and the fact that selling software on Linux is a very difficult sell.
On Windows, Win32 and Winforms remain relatively stable, if somewhat unpleasant to work with. WPF and WinUI seem to always have some issues, not to mention WinUI is limited in what it can do, which is why Microsoft eventually opened their app store up to Win32 applications. But it's not always clear which framework you should be using for a new project.
There are, as you pointed out, always cross-platform frameworks like react native, but not to disparage those who are developing those frameworks, they just don't match up to true native frameworks once you get past very simple apps. There are issues with cross-platform design, of course, but also with performance. These issues can be overcome in cross-platform apps (see VS Code, Discord), but I don't think I've seen a cross-platform app that was "good enough" except for electron apps.
- The desktop is in a weird place, design and quality wise. Traditionally, the table stakes have been higher for desktop apps. You needed to have more features and more polish. You needed to be compatible with other desktop software and more hardware peripherals. There's also always been the fact that OS paradigms have traditionally been different. If you ship a cross-platform app that did things the Windows way, Mac users would complain, and vice-versa.
But that's becoming less important as more people migrate OSs more often, and platform conventions are becoming both less important and more homogenized, especially as users who grew up on mobile start using desktops for the first time. That's part of the reason VS Code can get away with so many Windows-style keyboard shortcuts on the Mac.
However, it's still an issue. Just look at the 1Password beta forums right now to see how many contradictory changes are being requested now that 1Password shares a UI design between desktop platforms.
- Important Web apps have gotten to a place where they're good enough. See: Figma vs. Sketch. Performance and polish-wise, Sketch beats Figma hands down, but Figma is good enough, and it makes collaboration much easier than Sketch. It's cross-platform, and since it's a Web app, it's easier to get your collaborators to use it, since all they have to do is click a link you send them.
There's a similar scenario with Google Docs. Native versions of Office are still technically superior, and Office 365 exists, but most college students and younger are using Google Docs. It's free, it works well enough, and it's easy to collaborate. If you try to write an entire book in it, you're quickly going to get bogged down with performance problems. Seriously, word processors from the 1990s outperform Google Docs once you get beyond a few hundred pages, but few people push it that hard. It's not uncommon to see college students with top-of-the-line Macbook Pros that have exactly third-party apps or personal files on the device. They're nothing but Google Docs and social media terminals.
Desktop conventions and integrations are still important to a large but slowly shrinking subset of users, but foreign to a large but growing subset of users. It's tough to know exactly how to design a desktop app to appeal to a large enough audience.
- The market. Desktop app stores have tried to push desktop software along the same pricing trajectory as mobile, but have only succeeded in splitting the market. There are lots of Mac users who won't download any software outside the App Store, but the App Store on the desktop sucks. The sandboxing requirements make a lot of software impossible, the pricing is in a downward spiral, as on Mobile, but unlike Mobile, few people actually browse the app store, so it doesn't lead to any discoverability. The story on Windows is similar but less extreme. Microsoft has opened their app store up so basically any app can be on there, but there's not really an incentive to put apps there, and people don't browse it.
There's no good places people go to browse for desktop software anymore, perhaps because of a lack of interest, and that can make deciding where to sell your software and how to promote it a difficult decision.
As a mobile engineer with 20 years of experience and some knowledge about web development, I would say that web dev is more mature, flexible and (what is the essential part) keep up with new trends much faster.
Things like declarative UI syntax is still something new in the mobile world (SwiftUI, Compose, etc.), dependency management is a dark area (Android is a bit better, but a total mess on iOS/macOS development side), debugging experience for the web is miles ahead.
I usually ask myself the same question but in reverse – why mobile/desktop app development has not evolved to be like web dev?
There are positive and negative factors presented by mobile platforms:
Negative:
1. Highly abstract, hiding away internal functionality. 99% of mobile is GUI. iOS even abstracts away the filesystem. Android is more transparent.
2. Highly locked down: walled gardens increase the friction to run custom code. Terminal as an app that can be installed, but on unrooted devices it's almost useless compared to terminal on a desktop.
3. Ergonomics: smartphone keyboards and screens are not conducive for onboard development. Solutions exist but are pretty niche, and most people would prefer attaching a real keyboard.
Positive:
1. Arguably mobile platforms have increased the number of coders! The app stores facilitate distribution and payment, encouraging new programmers to make an impact. Desktops are in most cases the actual development platform though.
Mobile development still has some unfortunate features, like Apple's App Store guidelines limiting the types of apps you're allowed to distribute there, and ever-changing requirements that mean that apps that don't get updated for newer OS releases (even if the app is otherwise fine) get removed from the app store.
Even with that, mobile is where all the users are nowadays. Traditional desktop/laptop computing is not a growth market. If you want to build software that lots of people will use you want to build it for mobile platforms. Smartphones are also ridiculously overpowered at this point, so you do have the resources to make pretty compelling experiences unlike with what you'd think of as a traditional embedded system.
The blame is on the mobile vendors (and desktop platform vendors) just trying to "out-innovate" each other (also building propietary security/signing solutions) with their propietary stacks (SwiftUI/ObjC, Java/Kotlin, C#,etc) at the same time as there's been an explosion of apps/services that just needs basic functionality. The budgets/manpower isn't there to support everything... apart from if it's just a webview.
20 years ago a Windows program was enough (guess why Visual Basic was so popular?).
There's also a flip-side to the equation, the web-platform is damn capable thanks to the relentless pacing (both in features and JIT improvements in JS engines) after IE died off and catching up to it is becoming harder every day.
Looking today the only real choices for cross-platform dev seems to be: WebView, React Native (using Expo is a damn smooth experience almost to the level of webviews) and finally Xamarin/C#. (Yeah, I'm aware of Dart/Flutter but isn't it already long overdue to be killed by Google?)
Is it true empirically that independent developer software sales are lower on mobile than desktop? I definitely spend more on mobile apps, and I’m a software engineer who spends a lot of time on desktop. My impression is that the mobile app ecosystem has massively grown the market. Subscriptions are lucrative, so platform support for that only helps developers.
Mobile is getting crappier, so I can see why C++ developers would be reluctant to partake.
Google and Apple keep piling feature on top, so mobile has the 2nd biggest churn after front-end. Recently even the preferred programming language changed on both platforms.
It's under pressure from web-applications, which although of inferior quality are easier to develop.
Most apps aren't anything special and require mostly UI and UI framework skills (animations, platform-specific APIs, etc).
So it's more agnostic for mobile development than the native mobile development you're clamoring for?
Also it's really not a big step for them to polish the desktop experience. They just released 0.2.0, give it time and I really do think that it's going to be a great platform for both mobile and desktop.
Web development doesn't bind you to a specific platform. And modern desktop apps are overwhelmingly Electron (i.e. based on a web stack).
And if you're a mobile developer, you must have a Mac, because the tooling for iOS does not exist on other platforms. So even you target multiple mobile platforms, you'd develop it on Mac.
Completely agree with this. We've reached the same point we did with laptops a few years ago where making hardware more powerful doesn't improve the user experience much. Phones from different manufacturers are more or less interchangeable and there's not much incentive for an owner of last year's model to upgrade to this year's model. Both of the leading app stores are full of gimmicky junk and the leaderboards are increasingly stagnant. The prospect for indie mobile developers with new ideas is grim in 2014. Users are settling into patterns with a handful of established apps and it turns out there's just not that much you can do as a developer with nothing more than a 5" touch screen.
So I'm a contrarian even though I've been building mobile apps for the last four years. The desktop seems like both a vastly more interesting but likely also more lucrative place to be for a developer.
Mobile is “not just like desktop” unless you’re using a cross platform framework and even then you have different constraints - unreliable network connections, different screen sizes and interactions, you have to be more mindful of power and memory usage, dealing with app stores and review processes, etc.
But its really not hard to look at job boards or where the money is going both from internal and external investments to see which cart to tie your horse to. It definitely is not the desktop.
Even Microsoft isn’t really focusing on desktop development and has put .Net Framework in maintenance mode.
I'm not on their team but the answer is rather self-evident.
There are 100x mobile developers than desktop developers which is why there's so much more investment in mobile tools than desktop tools.
Also, this is Google-led project and Google doesn't write desktop apps (modulo few exceptions like Chrome). As every team, they have more work than they can manage, so they have to prioritize things that are important to them.
Developers are dying for a cross-platform solution for mobile development. If one existed that had complete parity with existing mobile platforms (including integration with OS and distribution model), except with current mobile web's performance, you really think that most developers would continue to just do everything twice?
Not to mention you need a Mac for iOS development. If your entire team (or at least all of the mobile developers on your team) don't have Macs, you're limited to Android.
I wonder why this lesson we learnt from desktop GUI development doesn't apply to mobile apps. Seems like the preferred approach there is to use native controls.
Assuming they make money on phones, it is. They can say "Look, mobile app development is just desktop app development! No special environments! Just cross-compile the Exact Same Code(tm)!" or maybe "It's Just Javascript!(tm)" and all of a sudden they've got a ready-made ecosystem of app developers who don't even need to install any new tools other than what they've already got installed on their desktops to provide content for their phones. More content -> more sales -> more money, and they must be absolutely desperate for anything that might draw developers' attention away from iOS and Android. If you start from the viewpoint that you need to provide a phone-specific display server anyway, you can see the thinking.
There are bits I think are wrong with this plan, but it's coherent.
Mobile UI builders can barely generalize over their own domain even when they are just targeting a specific platform.
That's not very high praise, to me. Look at all the code you still have to write just creating a table view on iOS. If I avoid writing code, then I'm stuck with stringly-typed identifiers hidden in sidebar menus which is even harder to debug.
The bottom line is that client development is hard. So hard that our tools for more focused platforms than web (like mobile) aren't even better, they just have different trade-offs.
We do tend to maximize device resources in mobile development. The default application type is implemented in native code, battery life is a HUGE consideration, which is really a proxy for CPU, IO, GPU & network efficency and binary size is correlated with how long people keep your app installed. Usually memory usage is very good.
It's just desktop development might as well be legacy development, and the vast majority of people only use their web browser and a few office apps at most. Except games & command line apps, which are also developed in an efficient way, how many apps do you have on your desktop device. Probably barely any compared to your mobile device!
What is being optimized is developer time, productivity and time to market, because if you haven't noticed in the last 15 years, developers have gotten very, very expensive. Inefficent software is purely a business decision. Make something faster than web dev that gets delivered over browsers (flutter is a good candidate) and watch as all new apps all of a sudden become that.
Mobile is almost all IOS and Android... and mostly but not all devs use Macs due to xcode.
The only places that Windows seems to persist are developer markets where tooling choices are limited to Windows (games, medical, embedded) or corporate standards dictate tooling.
- Mobile completely eclipses desktop in active userbase. With the pandemic, desktop has made gains, because people have been stuck at home, but nobody expects that to last forever, and even with the gains, mobile is far more popular. Compound this with the fact that, for years, mobile experiences have been held back because developers were on desktop, even when most of their customers were not. It's difficult or impossible to develop on mobile, and a pain to test on a separate device, so most developers worked and tested on desktop, leading to things being too small or non-functional on mobile. This gave rise to the mobile-first push, mostly from managers and developers who understood the market importance of mobile. In many organizations, I suspect it was such a slog to get everyone on board, I doubt they want to risk undoing that effort by creating new desktop apps.
- Desktop frameworks have not just stagnated, they've degraded. This is most true on macOS, least true on Windows. Even as Apple has invested in updating AppKit, the results have been uneven. There are still some controls using cells, and some controls that were updated to use views, but then haven't been updated to match newer framework conventions. At the same time, new bugs get introduced in every major OS, making desktop apps buggier over time, and forcing app developers to constantly keep on top of things.
Apple has tried to hit this from multiple angles, from running iOS apps on Mac, to SwiftUI, but I think it's telling that SwiftUI works best on Watch, then on iOS, and finally on Mac. The desktop is the lowest priority for that framework. Catalyst and running iOS apps are largely throwing in the towel, replacing desktop development with mobile development, but even then, they're not perfect.
Linux has faced less-extreme versions of these issues with both GTK and QT, though at least these aren't strictly tied to OS version. There's also issues around licensing drama with QT, and the fact that selling software on Linux is a very difficult sell.
On Windows, Win32 and Winforms remain relatively stable, if somewhat unpleasant to work with. WPF and WinUI seem to always have some issues, not to mention WinUI is limited in what it can do, which is why Microsoft eventually opened their app store up to Win32 applications. But it's not always clear which framework you should be using for a new project.
There are, as you pointed out, always cross-platform frameworks like react native, but not to disparage those who are developing those frameworks, they just don't match up to true native frameworks once you get past very simple apps. There are issues with cross-platform design, of course, but also with performance. These issues can be overcome in cross-platform apps (see VS Code, Discord), but I don't think I've seen a cross-platform app that was "good enough" except for electron apps.
- The desktop is in a weird place, design and quality wise. Traditionally, the table stakes have been higher for desktop apps. You needed to have more features and more polish. You needed to be compatible with other desktop software and more hardware peripherals. There's also always been the fact that OS paradigms have traditionally been different. If you ship a cross-platform app that did things the Windows way, Mac users would complain, and vice-versa.
But that's becoming less important as more people migrate OSs more often, and platform conventions are becoming both less important and more homogenized, especially as users who grew up on mobile start using desktops for the first time. That's part of the reason VS Code can get away with so many Windows-style keyboard shortcuts on the Mac.
However, it's still an issue. Just look at the 1Password beta forums right now to see how many contradictory changes are being requested now that 1Password shares a UI design between desktop platforms.
- Important Web apps have gotten to a place where they're good enough. See: Figma vs. Sketch. Performance and polish-wise, Sketch beats Figma hands down, but Figma is good enough, and it makes collaboration much easier than Sketch. It's cross-platform, and since it's a Web app, it's easier to get your collaborators to use it, since all they have to do is click a link you send them.
There's a similar scenario with Google Docs. Native versions of Office are still technically superior, and Office 365 exists, but most college students and younger are using Google Docs. It's free, it works well enough, and it's easy to collaborate. If you try to write an entire book in it, you're quickly going to get bogged down with performance problems. Seriously, word processors from the 1990s outperform Google Docs once you get beyond a few hundred pages, but few people push it that hard. It's not uncommon to see college students with top-of-the-line Macbook Pros that have exactly third-party apps or personal files on the device. They're nothing but Google Docs and social media terminals.
Desktop conventions and integrations are still important to a large but slowly shrinking subset of users, but foreign to a large but growing subset of users. It's tough to know exactly how to design a desktop app to appeal to a large enough audience.
- The market. Desktop app stores have tried to push desktop software along the same pricing trajectory as mobile, but have only succeeded in splitting the market. There are lots of Mac users who won't download any software outside the App Store, but the App Store on the desktop sucks. The sandboxing requirements make a lot of software impossible, the pricing is in a downward spiral, as on Mobile, but unlike Mobile, few people actually browse the app store, so it doesn't lead to any discoverability. The story on Windows is similar but less extreme. Microsoft has opened their app store up so basically any app can be on there, but there's not really an incentive to put apps there, and people don't browse it.
There's no good places people go to browse for desktop software anymore, perhaps because of a lack of interest, and that can make deciding where to sell your software and how to promote it a difficult decision.
reply