I’ve been bouncing around between working on native Applications and web apps for the last few years. Having experience with the state of the art in both areas of software development. One thing I have found is that web development is not nearly in a state that programming a complex application is sensible.
The separation of structure and style (HTML vs CSS) seems great in theory but in practice it’s hard, and limited. Between fundamental limits of styling, and the bugs/differences between browsers, targeting a pixel perfect design is an exercise in frustration. In fact attempting any non-standard layout of a web page is frustrating beyond reasonable. Add to this the new design requirements that websites should be responsive and scale down or up to all screen sizes and orientations and now you’ve probably tripled the amount of work to do.
These hurdles result in much longer development times and more bugs to fix along the way.
Native Applications on the other hand provide two key advantages to developers. First is that designers are generally not requesting uniquely laid out, graphically intense applications, so standard widgets are usually ok. Second is that for different types of applications there are better layout techniques available to use. Simple desktop applications can be designed in an interface builder tool while something like a video game can be flexibly done in code.
Both the web and native sides of app development are still evolving so it’s not simply a case of the web catching up. Native is a moving target which is itself getting better all the time as well. However with the web your technology is much more restrictive, you can’t simply opt out of HTML/CSS and write client side web applications in C++. Where as if someone writes an amazing predictive layout system in Go, you could feasibly write UIs in it tomorrow.