Achei o meu post anterior um pouco leviano, mas é que não posso explicar meu ponto de vista em poucas palavras. Então, resolvi explicar melhor como vejo a divisão entre os dois modos de se produzir aplicação.
A grande vantagem das aplicações desktop é o fato de serem, na sua maioria, mono-bloco. Você tem apenas um único grande conjunto de binários, não depende de servidores de aplicação e, principalmente, não terá uma rede separando sua lógica de negócios da view. Sua aplicação também é quem desenha integralmente a interface gráfica, não ficando você a mercê de navegadores diferentes.
Devido a isso, as classes de controle tornam-se praticamente triviais. Não há necessidade de frameworks mais elaborados, que tentam minimizar os impactos da rede, ou aumentar a distribuição. Eventos correm rapidamente de um lado para outro, o que aumenta muito a interatividade do usuário. Você também não terá surpresas quando o servidor de aplicação não se comporta da maneira esperada. Nesse sentido, tudo é muito fácil para o programador.
Aliás, aí está a palavra chave das aplicações desktop: interatividade. Mesmo os mais produtivos dos frameworks web não darão ao usuário a mesma experiência interativa que o desktop dá. Em muitos aspectos, ignoramos esse fato por já estarmos acostumados com o “modus operandi” da web, mesmo sendo uma experiência um pouco menos interessante.
Finalmente, dá para citar que essa arquitetura viabiliza aplicações de tempo real e aplicações que exigem muito processamento, como players de vídeo, ou jogos triplo AAA, aplicações de processamento topográfico, que geralmente são difíceis de se ter via rede (seja pelos atrasos da rede, como no caso do vídeo, ou por exigirem muito do servidor, como é o caso dos jogos e a das aplicações matemáticas).
Entretanto, sua aplicação desktop pode tornar-se complexa se você quiser que ela seja uma “rich application”. Suportar plugins, por exemplo, não é uma tarefa tão trivial.
O inferno no desktop está mesmo no deploy e nos testes de ambiente. Obviamente isso foi muito atenuado hoje em dia, com updates automáticos e a internet. Ainda assim, você nunca sabe em que máquina seu aplicativo está rodando (do contrário da web, onde você normalmente conhece exatamente a infra-estrutura de sua aplicação, com exceção do navegador). Fora que se um erro ocorrer numa atualização ou num update, será difícil descobrir que erro foi esse.
Se você usa componentes mais específicos, como por exemplo o hardware de vídeo, pode esperar custos bastantes elevados com testes. Será difícil garantir sua aplicação para um parque gigantesco de hardware. Fora que, os custos com testes também se elevam por você não ter um log unificado. Como na web vários usuários estão rodando a aplicação simultaneamente, mas em um número reduzido de máquinas, é mais fácil gerar logs consistentes, e descobrir o que gerou determinado problema. Fora que, você não precisará que seu usuário lhe envie esses logs, e convence-lo disso pode ser por sí só uma tarefa bastante complexa.
O fato é que, na maioria das aplicações, o ganho de interatividade do desktop não compensará os custos desse deploy. Isso torna a web extremamente viável. As ferramentas para produção na web também são bastante produtivas, e muitas já contemplam soluções para problemas comuns mais completos do que as soluções já vistas em desktops.
Sem falar também no fato que, como a aplicação está na rede, os usuários sentem que ela está sempre disponível. É prático para um gerente saber que ao viajar, poderá acessar os relatórios da empresa na rede de um hotel.
Finalmente, é muito prático fazer backups da infra-estrutura em aplicações web. Uma vez que o ambiente está sob o controle do programador, você pode fazer backups de banco, aumentar a redundância dos servidores ou mesmo melhorar a infra-estrutura do hardware de maneira totalmente transparente.
Hoje, acho que não cabe mais comparar as duas. Ambas estão ocupando nichos diferentes e, realmente, a web está dominando o mercado de aplicações corporativas, a olhos vistos. O desktop, fica restrito a aplicações de processamento pesado, que exijam muito do hardware, que tenham um requisito de tempo real, ou que devam interagir com algum tipo de hardware específico, como uma webcam (e talvez algum outro caso que eu tenha esquecido).