微软公司,我想无需我多说什么,百分之九十以上的中国网民,都用着盗版的Windows操作系统。对于软件行业的从业人员来说,微软恐怕也是经常需要提及的名词。再具体些,和这篇的题目联系上,就是对于程序员,微软这个世纪推出了.net这套傻瓜型语言,和Java很相似,但更更容易上手。对于一个没有任何编程基础的人(即没学过任何程序语言、数据结构、编译原理、算法和操作系统等相关知识的人),他第一天接触C#.net,就能够照葫芦画瓢写出Hello World(这不算什么问题,要讲的在后面)。更可喜的是,他可以在十天之内用Drag&Drop做出一个能够Build过去而且能够跑得很好的WinForm程序,以及一个虽然难看点(因为他没学过CSS)而且运行得也很慢点(因为他没学过Ajax和Javascript)并且没有太多动态特性(毕竟他还不知道什么是ORM和数据库)的Asp.net网站。
是了,我和我的很多同学都学习过C#.net,它的语法很美,也很实用,而且拥有微软出品的强大的IDE——Visual Studio,用它来开发程序,简单容易上手而且在编码以及Debug的时候,IDE能够提供丰富的功能。.net提供了优秀的框架——.net Framework,从1.0、1.1、2.0、3.0、3.5到4.0,每一个版本都加入了更丰富的类库和更加简练的编程方式,从模板、范型的加入到Linq和lambda表达式,甚至.net4.0中加入的并行编程库和动态语言支持。面向对象的一大好处就是封装以及重用,微软标准类库实现的功能,我们程序员还去实现它干什么?从而我们不再关心一个数据结构和一个算法的实现,而更多的把时间和精力放到了业务逻辑的工作流程上(微软也提出过一个WorkFlow的解决方案,不过好像并不怎么成功)。
于是,有人开始骂街,很多人跟着一起骂。为什么?因为微软的这种做法,让人人都能编程序了,换句话说,当你找工作的时候,面试官问你,你学过什么编程语言到了什么程度,你说:“C#,精通”,这并不能让你顺利找到好的工作和理想的薪水。C#在08年的市场占有率不足百分之七,在所有编程语言排名上排第五位,因为微软不对它进行跨平台的支持,所以它的占有率远不如Java。而且由于它是一套ManagedAPI,无法直接操纵指针(unsafe模式除外,而且该模式也有诸多限制),它也无法完成很多C/C++完成的工作。本来需求就不多的C#程序员,所使用的却是人人都能学“会”并能使用的C#.net,所以你的工作不好找。找不到工作,自然会出来骂街,而被骂的就是微软和C#。
其实这个事情,和“娇生惯养”有点类似。一个小孩子的父母为了能让他好好学习,把生活基本都给他安排好了,然后他自然乐于过那种“衣来伸手,饭来张口”的日子——不错,人都懒,十有八九会这么做。等到长大了独立了,发现自己生活不能自理的时候,他开始骂爹骂娘。试问,这是谁的责任?关于家长那个问题,可以说小孩子不懂事,家长不应该这么做,可是你堂堂一个程序员,你会不懂事么?无非就是贪图一时容易,因为C#.net的低起点和易入手,在会读MSDN和用一些微软官方提供的类库之后,就觉得已经练成神功,已经“精通”了。孰不知其实自己还是“生活不能自理”。很不幸的是,大多数的以C#为主要编程程序的人,都处于这个阶段,这更加造成了企业用人的时候,并不会因你一句“精通C#语言”就能如何如何。
我学软件编程,最初用的是QBasic,真正入门学的是C++。虽然我没学好指针,但是我知道它的强大所在。从前的编程,程序就是数据结构和算法,即如何存储数据和如何操作数据,其实现在它的本质仍在于此,只不过很多高级语言把这两者的实现封装起来,提供了很友善的Interface给程序员而已。然而,这并不是作为一个编程人员不去关注实现的理由。计算机科学是一个很奇妙的学科,从CPU的加法器中门电路的电平信号到一个PC用户能看到的GUI,中间不知道隔了多少层。而作为一个优秀而全面的软件从业人员,我认为至少在操作系统以上,都应该有一定的了解,甚至在计算机体系结构和组成原理上,也不能一窍不通。而在业务逻辑之外,跳出实现,还应该有一定的设计架构的功底,毕竟做一辈子程序员大脑神经元受不了。
个人以为,如果选择C#作为自己的第一语言,在会通过读MSDN调用微软官方类库,而且熟练使用Visual Studio这个IDE生成自己的Console、WinForm、Asp.net程序之后,大可以通过阅读.net Framework的代码来了解一些优秀的数据结构和算法的实现,并且多注意一下框架的架构,毕竟微软的架构师水平与我们不可同日而语。除此之外,就像我们人类的语言代表了文化一样,一种好的编程语言也自然会有一种编程文化在里面(这种说法也许虚无缥缈,意会吧,呵呵)。又正如人类文化都是相通的,C#与Java,C#与C/C++,乃至C#的MSIL与汇编,都是有很多相似之处的。其实事情就是如此,如果我们在很高的角度向下看,我们看到的是面向对象以及设计模式,如果我们从很低的角度向上看,我们看到的是内存的字节和二进制以及操作系统的API,不同的编程语言,到了这些层面,有关语法和类库以及IDE的差别,已经看不到了。
那么,最后回到题目的那个问题上,微软的技术上手如此容易,用起来如此方便,它会不会让程序员变成SB呢?也许有一批人(而且是不在少数的一批人)真的变成了SB,但是那也只能怪自己。一个具有思考和行为能力的人,你自己做了选择,却因为懒惰而不思进取,怪不得别人。
甚至,我们还应该为微软这种做法歌功颂德,因为它的确降低了入门的难度和门槛,而且提供了丰富而且完善的类库给程序员使用(因为它有钱,能够花大量的钱投入到其中去做升级和版本维护),并且MSDN网站以及其他的一些资源,给出了如何使用类库的丰富示例。这些资源如果善加利用,就应该是提高水平的捷径,而不能称之为让我们变成SB理由。
如果,你已经选择了C#,那么请记住,多思考勤学习,你就不会变成SB了。
缥缈落花街 月圆月缺 望峦山平川 雁返君未还 怆然晚春残 忆天上人间