Architecture – .NET: Are web-based applications inherently harder to build than client-server

Architectureclient-servereffortnetweb-applications

We currently have an ongoing discussion about which approach to move into – we want to replace multiple older environments with .NET applications, and two potential architectures are under discussion:

  1. Client-Server ('fat-client'): requires an installation on each client
  2. Web-based ('thin-client'): works in any browser, no install required.

Some arguments are that Client-Server is inherently more stable and faster to develop, as you don't have to worry about 'stateless' and doing your API calls through URLs; on the other hand, web-based can run on mobile devices (and non Windows machines) without too much additional effort (if any).

I don't have enough experience with .NET to confirm or discard either of those claims for sure, so my question here is:

Is a web-based architecture inherently more expensive to develop than a client-server architecture?

The answer should not consider the effects of needed learning and experience gathering – the team comes historically from Client-Server, so of course in the beginning web-based will be harder, needs more training, and will have some issues. Ignore that. Assuming equally experienced and qualified teams, is one of the architecture inherently and always more effort to build?

If you are experienced in both kinds of architectures, you could help me make this decision.

A little more background: the decision for .NET is made; all our data is in Oracle DBs already, and will stay there; however, it would be nice to not be locked into Oracle long term. We plan to re-skin/re-build about thirty existing applications of various sizes, and create about twenty new ones, within the next three years (totaling roughly twenty man-years), into a somewhat integrated solution environment. All users for all apps are in-company, none of this is for the public. I tend to go with web-based (because of the mobile options), but we don't want to find out two years down the road that we went the wrong way.

Best Answer

Building a web application is absolutely more complicated and harder to build than client-server, for a given set of features. There are a variety of reasons and ideas I'll describe in no particular order.

The highest voted question of all time on this site is What technical details should a programmer of a web application consider before making the site public? In there, there are dozens of bulletpoints, and while a handful are general statements, the vast majority of them are indeed specific to web programming.

Where is the "What technical details should a programmer of a desktop application consider before making the site public?" question? Why doesn't it exist? Because everything that would be in that list is inherent to programming in general, and web programming has to be concerned about all of those in addition to the aspects in the linked question.

Let's compare similar aspects of applications that are both web-based and not. In my opinion, the difference between client/server and desktop applications is insignificant compared to the difference between those and web based.

  • Compare Google docs or Office 365 to desktop MS Office*. MS Office 10 years ago, (probably even 20 years ago Office 95), is miles ahead of both of them in terms of features and capability, with the exception of the simultaneous editing parts.
  • Outlook + Exchange from years ago is superior to any web-based email client today.
  • While the javascript PDF viewer that comes with firefox is spiffy in that it is all javascript, adobe acrobat is still considerably better despite acrobat being horrible!
  • A lot of software is just straight up impractical or impossible to implement in a web-based offering, whereas anything that can be computed can be made into a desktop app. Nothing on the web cannot be implemented in a client/server app (besides stuff that explicitly requires a browser or runs in the context of an existing web site.)

The reason why the differential in capabilities is because web-based applications are so much more difficult and complex to build.

Many people are exited about node.js, who's chief value is that you can build the front end and back end for web apps in the same language. Node.js was first released in 2009. Since when have client/server/desktop apps been able to use the same language for front and back end? Since nearly always. Why are people using it? Because web development is so complicated people are willing to bring in javascripts problems and complexities in order to try to reduce complexity in the server/browser interface.

Browsers and the HTTP link adds significant complexity to web applications. Unless I am writing software to fly the space shuttle, I don't have to worry about an error 404 when trying to access some memory address or other resource, but web applications I often do. Losing total access to the disk is often not a significant concern for desktop apps, and gracefully crashing is usually considered appropriate enough. Losing the network on a web app not only happens often, and repeatedly, but is expected to be handled gracefully and resume connection. That's all on top of all the problems that can be happening inside the serverside or front end code.

The connection between the browser and http server does not maintain any significant state. In client/server and desktop apps, it trivially maintains as much state as you want to. Think of the dozens of frameworks and mountains of boilerplate for web frameworks trying to bridge that stateness gap in a sensible way. Thick client apps, you get that all for free.

Think of all the millions of person hours people have spent struggling with obnoxious gotchas in displaying sensible webpages, the days of making things line up in Internet Explorer. While desktop apps have plenty of gotchas as their own, I don't think something as seemingly simple as "making two columns the same size" has sucked so much of humanities work on the desktop as it has on the web. I think making stuff work cross-platform has been considerably easier than cross-browser.

Even if you try to cut down on some of this complexity by restricting what browsers people use, you can similarly tone down complexity of thick-client apps by restricting what OS they are using. The web app will always have more independently operating parts and will therefore result in more complex software.

Lastly .NET has no bearing on any of this, these are broad statements I believe to be true across all languages.

P.S. Obviously there is the "browser plugin" route but that basically combines the worst aspects of both so pretend that doesn't exist when trying to grok the ideas here.

Related Topic