一、引诱程序员写出“把所有东西混杂在一起”的Web应用。

  Web Form采用Code-behind方式,虽然分离了页面模板代码和后台的C#代码,但实际上有很多程序员在后台C#代码中书写大量的业务逻辑代码,并且把这些代码与页面上的控件直接绑定(因为在高度智能化的Visual Studio中,这么干太容易了),这会给网站的长期维护带来麻烦。另外,如果不是在一开始在架构上有所考虑,几乎没有办法对一个Web Forms项目进行单元测试。

二、成也控件,败也控件。

  Web Forms开发中,控件是页面开发的核心。Web Forms服务端控件是重量级的控件,它拥有自己的一套运作机理,比如控件有自己的生存周期,在不同的周期触发不同的事件;Web Forms提供了不少数据验证控件,虽然能完成大多数常见的数据验证任务,但其可扩展性和性能比不上现在使用的诸多JavaScript库(比如jQuery Valiation,不依赖于服务端生成的ViewState,运行速度更快,使用方便灵活)。

  许多Web Forms服务端控件,虽然随着ASP.NET新版本的发布而不断更新,但仍然有不少使用“老”的页面生成技术,比如有些控件仍然使用table元素完成布局,当需要使用手机等访问这些网页时,其使用体验惨不忍睹。

  ASP.NET 4.0以前版本的Web Forms控件在生成HTML代码时,其ID值相当地“变幻莫测”,这会给JavaScript代码编写带来麻烦,当然,4.0以后版本对此有所改进,现在可以指定ID了。

  Web Forms的许多服务端控件必须要使用ViewState和Control State,一些特殊的控件,比如GridView,生成的ViewState数据量可能会很大(高达数M),如果不显式关闭,那这些数据会在Web Server和Client间来回传输,占用过多的网络带宽,降低了响应速度。

Web Forms控件关联着一个DLL,并且可能在内部使用了多个JavaScript脚本文件,这会导致浏览器收到的终页面中会出现一些诸如
<scriptsrc="/ScriptResource.axd?d=JzFjHNVTNSRvxnyOuI_HmzgpeGgm-le_2DeNc7ub5pZUcy9A8M9scHh3p580Af72CFevs-15tBuSlQYGR8Y6jhCLDnQaQ1K84GPCFXjTaKWxU1eVzt8qVZ8mueqHNb4FDLOkRw2&t=ffffffff8a8533f5"
type="text/javascript">
</script>
之类的“神奇代码”,而且只要你往页面上加了一个控件,它们会不请自来。对于这些代码,你只能祈祷它工作正常,一旦出了问题,跟踪相当困难。

  总而言之,Web Forms控件高度封装的特性使用开发者调整它所生成代码的手段很少很有限,这限制了开发者的自由和发挥余地,也给页面优化带来困难。

三、下面重点说说WebForm的另一个问题——过度封装

  初WebForm的设计思想是模仿VB的开发方式,用拖放控件的方式设计Web页面。但Web应用与桌面应用毕竟有重大差异,强求统一,必然需要对Web应用的底层机理进行深度地封装,方才可能创造出与桌面应用开发一致的开发体验。Web Forms的封装甚至到了这种程度:你不需要了解HTTP协议,也能通过拖拖拽拽的方式构建Web应用。

  这样一来,基于WebForms开发简单是简单了,但远离了Web应用的本质,Web Forms框架完成了太多的事,你必须照着它规定的套路来,留给你自由发挥的余地不多了。同时,由于WebForms把HTTP协议给包得几乎”看不到了”,制造了一个“Web网站开发并不复杂,是这样“的第一印象,这其实是一个”假像“,如果不能意识到它点,仅会用Web Forms的Web开发者,离开了Visaul Studio,几乎无法在其他Web领域找到工作,因为你己“认假成真”被“洗脑“,必须”清空内存“,重新学习与了解Web应用的”真像“。

  相比WebForms,ASP.NET MVC要好得多了,它并未向使用者隐藏Web应用的本质,虽然学习曲线比较陡,涉及到技术和Web开发相关背景知识比较多,但能玩转它的人,其学习能力和平均开发水平往往都还不错。

3 微软技术影响下的程序员
  后说说微软技术特点对程序员生涯和技术发展所带来的一些影响:

  微软技术的大特点之一是”易用“和”开发高效“,这是优点,但对于程序员而言,如果对此没有清晰的认识,则会受到不利的影响。

  微软技术为了易用,包了很多层,并且许多并不开源。当你尝试去探索其底层技术实现时,会困难重重。

  另一方面,由于程序员自身开发经验与能力的限制,过度的封装也阻止了程序员对深度探索技术内幕的热情。

  与Windows相比,Linux不易用;与C#相比,Java不易用,C++尤其不易用;与Web Forms相比,JSP和PHP都不易用,……,但这些不易用,却迫使程序员去学习很多东西,调动了其积极性,程序员们收获到了自身能力与素质的提高。

  人的天性是懒的,易用、开发高效且高度封装的许多微软技术,严重削弱了很多程序员的技术探索欲望。所以我看到,在微软技术领域,只有那些意志坚定并且对技术本身有着浓厚兴趣的人,才能坚持这条深入探索技术之路,并在这一技术探索过程中收益良多。而这样的人,在微软领域之外,也会是一把好手。

  当然,针对微软技术“催生懒汉“这种现象,板子不能打在微软技术身上,而应该打在人身上,这是人本身的问题,技术本身是中性的,是“无辜”的。

  需要指出的是,微软技术走向开放的趋势日益明显,当前重量级的一些技术,比如ASP.NET MVC、Entity Framework等,都是开放源代码的,有时间读读这些项目的源码,定有所得。

  后谈一点,由于学习掌握某个技术会耗费程序员大量的时间、精力甚至金钱,没有人希望自己下大功夫掌握的技术没有用武之地,因此,门户之见相当突出。经常会看到许多程序员会为各种技术的所谓“优劣”争得面红耳赤,恼羞成怒者甚至开始对对方进行人身攻击,在网上,“黑“微软技术者尤其常见。

  其实,应该“把技术当成工具,但不要成为宗教信仰”。

  我赞同“实用主义”原则,别浪费时间去争论哪个技术好、哪个技术坏,而应该关注的是哪个技术适合于解决哪类问题。在不同的场景选择合适的技术,别试图用一种技术去包打天下,“多学几手,脚踏两只船”。

  当然,想“脚踏两只船”,这要求程序员要有足够的学习能力和扎实的计算机专业基础知识和基本技能,而且“船很多”,人却只有两只脚,加上人的时间精力也是有限的,所以要针对众多的“引人”的技术勇敢地说“不”。有所不为才能有所为,追求“一专多能”,努力精通一项技术,对其他的技术做到需要时能快速上手并对付工作任务即可。学习能力再强,也不要指望能“快速”地成为另一领域内的”高手“,这既不可能也无必要。在实际开发中,也许你不精通某项需要用到的技术,但一定有人精通这个技术,大家相互合作,取长补短好了,双赢!