原文:http://www.csdn.net/article/2014-05-27/2819954。
摘要:顾伟曾是一名机械工程师,毕业后听从自己内心声音走上了软件编程道路。他利用平时休息时间,完成从编程新手、到合格的软件工程师、再到2014年度微软MVP的蜕变,本文对他过去的经历、.NET以及C#等话题进行了专访。
顾伟认为,程序员不仅要关注技术,更要关注所处环境。技术可能不会做一辈子,锻炼生存能力则是最现实的话题。
顾伟,C#高级程序员、微软2014年度MVP。现在在某事业单位任职高级软件工程师,负责软件系统的设计和开发工作。
CSDN:据说你是机械类专业毕业,后来转行编程,能介绍下这段经历吗?
顾伟:我大学本科学的是机械类专业,与计算机软件编程基本上不搭边,只有一门C语言的课程与计算机相关,所以我所接触的第一门编程语言是C。毕业工作后在工厂生产一线呆过一阵,做过一段时间的机械加工。但后来终究听从自己的内心并且在父亲的支持下走上了编程之路。
CSDN:为什么要选择走上软件编程道路?当初你家人、身边的朋友对你这个决定是怎么看的?
顾伟:当时我的决定遭到了家里人的一致反对,但是直到现在我都不后悔当初的选择。他们主要认为我是非科班出身,底子薄,觉得我很难跟那些计算机专业的本科生竞争。而且计算机这行尤其是做软件编程,技术更新太快,年龄大了对新技术就学不进去了,很难再有竞争力,是个典型的吃青春饭的职业。他们一致做我思想工作,让我安心上班,虽然我那个工作环境差一点,但是相对编程来说更加稳定,以后有了经验,可以带带徒弟,日子过的逍遥自在。但是我坚持认为,软件是未来的潮流。软件产业是未来的朝阳产业,国家也在大力发展这个新兴行业,有很广阔的发展前景。再说,这世上哪有什么一劳永逸的事情,软件编程虽然比其它行业技术更新更快,但反过来说明它是一个新兴产业,有很大的发展空间。经过几次交流,最终我成功的说服了我的家人。
CSDN:作为一个自学人士,你是如何自学软件编程的?能回顾下学习方法、时间安排和其它一些学习过程吗?
顾伟:编程是个技术活,既然是技术活就需要不断的在实践当中加以练习。因为我之前自学过C语言,算是有一点基础,但是这与真正的软件开发还是有相当的差距。为了能够尽快的掌握C#开发,我买了很多相关的技术书籍。入门经典、高级编程之类的书都买了,一开始的时候就跟着上面一个一个例子不断在VS编译器中调试、运行,监控每一步值的变化,慢慢培养编程的感觉。掌握了C#语言之后,后来我喜欢做一些小工具之类练习,比如我的浏览器(Webbrowser)、记账单(单机版Access应用)等等。通过这些一个又一个的小工具开发练习,我慢慢的掌握了软件开发的技巧。更重要的是通过这些编程练习,我建立起了肯定能学好编程的信心,并从中找到了乐趣以及成就感。
CSDN:后来你报名参加某机构培训,能不能聊聊一边学习、一边实习的经历?另外,实习的机会是如何来的?
顾伟:当时刚从厂里出来,想尽快的进入软件编程领域是很困难的。为了能够尽快缩短这个转变时间,我参加了某机构的培训,并且经历了一段边学习、边实习的经历。实习的机会说来也很巧,正好当时有个认识的计算机专业大学同学在我们当地一家公司做.NET开发,我就跟他聊,问他们公司缺不缺人,我想争取一个实习工作的岗位。后来经过他的推荐,我得到了一个跟他们公司技术经理交流的机会,通过一个上午的技术笔试、面试,当天上午技术经理就跟公司总经理沟通,后来就让我第二天上午过去正式实习。
CSDN:正式工作后你又连续通过了国家计算机四级(数据库工程师)、软件设计师、系统分析师、信息系统项目管理师等资格考试,说说你是如何从程序新手到合格的软件工程师这一转变?
顾伟:回顾刚进入职场的前3年,现在都觉得很感动那时的自己。那3年基本上所有的时间和精力都放在技术经验的积累以及专业理论课的学习上面。白天上班经常性的向有经验的开发人员学习技术,并且有时候会主动的要求项目经理安排开发任务给我。晚上如果有时间一般都会抽出2-3个小时用于学习算法和数据结构、操作系统、编译原理、计算机网络、数据库原理等计算机专业理论课程。为了检验自己的学习成果,我陆续的参加了很多考试,并先后通过了国家计算机四级(数据库工程师)、软件设计师、系统分析师、信息系统项目管理师等资格考试。虽然现在来看这些考试并不算太难,但是通过准备考试的过程,自己一次又一次的梳理知识点,建立了自己的知识体系。3年的历练,不断的总结。我顺利完成了从程序新手到合格的软件工程师的转变。
CSDN:除了技术上的收获外,私企、外企以及事业单位的经历还给你带来哪些收获?
顾伟:很幸运自己能够在不同类型的单位工作过,也因此接触了很多不同背景、不同思维习惯、不同性格类型的人,积累了人脉,同时也丰富了自己的人生阅历。中小型私企是我职业生涯的第一步,我打下了坚实的基础,不仅仅是技术,更重要的是使自己的综合素质得到了提高。而大型外企的管理等各个方面相对比较正规,有一整套的流程,我懂得了如何带领和管理一个大型团队。而在事业单位,我学会了如何跟不同类型的人沟通交流。这些年以来,我渐渐感悟出一点对生活的理解:程序员不仅要关注自己所处领域的技术,更要关注我们所处的环境。技术可能不会做一辈子,锻炼自己的生存能力则是最现实的话题。
CSDN:在博客中看到你成为2014年度Microsoft MVP,能不能聊聊你是如何一步步成为Microsoft MVP的?
顾伟:认识CSDN很长时间了,一直关注.NET论坛版块,每个季度都会有申请微软MVP的帖子发出来,也因此知道了微软有个MVP奖项。在我的印象当中能拿到微软MVP荣誉的人都不是一般的技术高手。我一直想向这个方向努力,却因为工作原因没有足够的时间参与,因此一直断断续续。好在去年时间上开始相对自由,我就有了时间能够参与进来。一开始我主要是在论坛.NET版块回答别人提出的各种问题,因为自己在工作中也经常帮助同事解决技术问题,所以这种方式对我来说更容易上手。答了几个月的题之后,我发现会有一些共性的问题或者自己觉得有必要记录下来的一些东西,我就把它们以博客的形式贴出来。这样坚持了一年左右,正好到了2014年的1月,可以申请4月份的MVP,我就详细填写了申请表格并递交给了CSDN,由CSDN转交给微软MVP项目组。在此之前,我也对自己做了一个评估,觉得自己的努力和贡献已经达到了MVP的标准,这次应该没有问题。3个月之后,果然在愚人节这天晚上收到了微软发送过来的祝贺邮件,通知我成功当选2014年度微软MVP。知道自己当选微软MVP的那一刻,我更加坚定了自己未来的技术方向。
CSDN:你谈到个人非常推崇敏捷开发理念,能不能谈谈你在这方面的一些实践?
顾伟:众所周知,.NET平台和VS开发工具,是微软专门为快速开发软件而量身定制的,尤其适合中小型团队使用。而敏捷开发理念,强调的是以人为本、快速迭代。因此这两者的结合,简直是珠联璧合。我们在做软件设计时,会采用“一主一副”的策略,即让更有经验的程序员担任主要设计者,再为其配备一个副手,负责给主程序员提意见,在高效沟通过程当中,不断的完善软件设计工作。此外对于一些重要的模块编程,我们经常采用结对编程,即让编程能力更出色的程序员担任编码实现,而经验更丰富、视野更开阔、有大局观的人负责代码的实时评审,及时提出代码的问题所在。这两点我们经常在实践中采用,显著提高了开发效率。
CSDN: 在众多技术中,你为什么选择.NET?
顾伟:我曾经学习过Java语言,用Swing做过一些简单的桌面软件,后来也利用JSP、Servlet、JavaBean、JDBC、Tomcat等开发过一些MIS系统,再后来用JavaEE领域著名的轻量级框架SSH(Structs 1.x、Spring、Hibernate)做过一个稍大规模的业务系统。但是后来放弃了,转而专注于.NET。一方面是自己对C#语言情有独钟(C#语言非常优雅,比如Linq,虽然现在搞得越来越臃肿、特性越来越多、越来越复杂);一方面是微软有目前最强大的IDE—Visual Studio这个神器,使得开发、调试都极其方便(比Eclipse要好很多),很容易、很快速的就能做出东西出来。我一直认为软件开发应该强调的是速度,即在最短的时间之内开发出一个可运行的版本。让用户能够看得到实实在在的可运行的软件实体,这样当项目经理拿着软件原型与用户交流就会显得顺畅的多。开发效率是我选择.NET的重要因素。
CSDN:具体比较下Visual Studio和Eclipse的优劣吧?
顾伟:Visual Studio和Eclipse是业界当中目前最流行的两个IDE工具。VS很智能,调试、部署都非常方便,但是需要安装庞大的安装包。而Eclipse相对比较灵活,可以根据自己的需要进行设置,添加功能。但是Eclipse调试不如VS方便,且IDE界面与VS相比显得比较“原始”,这让很多初学者感到各种不爽。微软为了实现IDE可定制的需求,也发布了很多版本的VS开发工具。比如VS For Web、VS For Windows Phone等就是针对不同开发者而单独发布的版本。其它方面比如快捷键、部署等方面有细节的差异,但是总体来说,各有千秋。
CSDN: 很多人都觉得NET技术体系太过庞大,我们都该学哪些呢?顺便再推荐一些学习资源吧!
顾伟:经过这么多年.NET版本的更新,现在的.NET技术体系已经相当庞大了。除了学好.NET平台第一编程语言的C#(或者是VB.NET,你看微软多贴心啊?为广大的VB爱好者能平滑的过渡到.NET开发)以外,应该具体选择哪些技术作为自己的看家本领或者作为求职时的砝码呢?比如WCF、WPF、WF、Silverlight、Windows phone、ASP.NET MVC、Web API等等这些技术我该如何选择呢?
我的观点是:学以致用,学你最需要的,学更有前景的技术。我认为作为程序员应该要有自己的辨别能力,学习的技术一定要有针对性,要对自己的职业发展有用,不要盲目的跟风。ASP.NET MVC是对传统WebForm开发进行的一次升级。传统的WebForm组件控件开发有它的好处,但同时也有它的弊端。比如定制性差、不灵活、生成大量的冗余代码、降低运行性能等问题。相反ASP.NET MVC回归到了最原生的基于HTML的开发,解决了上述问题。WCF或者Web API也是非常有用的技术,随着移动技术的发展,各种Web服务越来越倾向于轻量级的Rest Service,而Web API就是微软提供的当前最佳开发Rest服务的开发框架。
至于学习资源,可以查看我之前发表的一篇博客,上面列举了我觉得还不错的在线资源以及推荐书籍:点此进入。
CSDN:.NET入门非常容易,但精通非常难,你认为如何才能学好.NET?
顾伟:我认为学好.NET可以从以下3点入手:
在这里我也提出自己的建议,随着XP的淘汰、Win8的兴起,我们.NET程序员需要尽快的将自己的技术进行升级。具体来说桌面开发这块要从原先的WinForm升级到WPF,Web方面要从WebForm升级到MVC,为未来的职业生涯的发展提前做好技术上的铺垫。
CSDN:.NET有开源方面的实现吗?能不能介绍下目前的情况?
顾伟:和Java一样,.NET也有很多开源项目。比如跨平台项目Mono、ORM工具NHibernate、AOP框架Spring.NET、日志组件Log4net、测试工具NUnit、对象序列化工具Json.NET等等,还有很多第三方的开源类库,这些都可以在网上下载到源代码。为了推广.NET的发展,微软也搞了一个源代码的托管网站Codeplex,里面有大量的开源项目的源代码可供下载学习。此外,微软最近又开源了很多开发框架的源代码,比如ASP.NET MVC、Web Api等。随着微软的逐步开放,.NET开源项目的数量和质量将会进一步得到提升。
CSDN:你提到C#很优雅,能不能再具体谈谈?
顾伟:C#程序员都知道C#中有一个非常重要的语法糖Linq,这是微软的一大创新。Java最近才引入了类似Linq的特性。它使得原本复杂的操作,使用Linq可能只需要一句话就能完成,轻松实现筛选、分组、排序等功能。再比如C# 5.0中使用async和await关键字来简化异步操作。以前写异步代码不太好理解,而现在可以使用顺序编码的思维,加上async和await关键字就变成异步了,显著提高了编程效率。这些都可以在MSDN开发文档上面找到相应的说明以及代码示例。
CSDN:很多人都认为C#比Java好学,对此你是怎么看的?另外,如何才能学好C#?
顾伟:这么多年以来其实一直有很多误区,其中一个就是认为C#比Java好学,有了Java基础一周搞定C#之类的观点,其实不然。应该说在早期,.NET Framework 2.0出来的时候,那时候的C#确实比较容易一点。你会看到很多Java的影子,所以你有了Java基础基本上不废太多力气就能学会C#了。但是C#现在已经发展到了5.0。期间.NET Framework又经历了3.5、4.0、4.5等几个重要版本的更新,单论C#语言本身的特性就已经超过了Java的复杂程度。没记错的话,Java 去年才推出了类似C#中的Lambda表达式。
我个人认为,学好语言本身最好的途径就是查看帮助文档并将之应用到实际项目中去,而学好C#相比较权威的资料就是MSDN在线文档。MSDN文档上面对C#各个技术点讲解的都非常全面也很详细,还有很多代码片段甚至是例子可供参考。
CSDN:有人说.NET可以跨平台,而有人说.NET跨平台是个谎言,你能不能谈谈.NET跨平台这个话题?
顾伟:一直以来.NET给人的印象都是只能运行在Windows平台上,不像Java可以实现跨平台,在Linux、Windows上面都能够运行。微软最初由于战略原因,希望更多的人能够使用Windows系统,并没有打算让.NET跨平台,并不是技术上的原因。但是也有一些软件爱好者发起了Mono这个项目,Mono的初衷就是要解决.NET跨平台的问题。而最近经常看到的Xamarin移动跨平台解决方案是Mono项目的一个分支,能够使用C#开发Android及IOS应用,这就给从事移动开发的程序员在一定程度上降低了学习成本,学好C#一门语言就能够开发多个不同移动平台的APP。在CSDN论坛已经有人发布了基于Xamarin开发的Android应用并部署到Android真机环境中运行。所以.NET跨平台不是谎言,而是事实。
CSDN:很多人都认为.NET程序员只会拖拉控件、绑定数据,是什么造成这样的局面?你认为,处于这个阶段的程序员应该如何做起?
顾伟:在早期,WebForm刚推出来的时候,微软就是这样展示WebForm魅力的,只要借助于Visual Studio这个可视化的IDE,拖拉控件、绑定数据,就可以轻松开发网页出来。应该说这是微软在Web开发方面的重大创新,让Web开发的门槛进一步降低,让更多的人可以从事Web开发。
但是作为专业的程序员而言,不能仅仅停留在这个层次进行开发。我们开发的系统,除了可用性这个硬性指标以外,性能也是很重要的。如果一个网站打开速度很慢,就会严重影响用户体验,进而会影响系统的可用性。所以我认为,在ASP.NET开发过程中,尽量使用轻量级的组件代替重量级的组件,比如最典型的用Repeater来代替Gridview。其次要从运行机制和原理等方面深入理解控件,能够有意识的写一些自定义控件。这样日积月累,你就会感到很踏实,而不是机械式的记住控件用法了。
CSDN:有人认为在安全方面,Java比.NET更好,你认同这个观点吗?如果认同,那么.NET如何做才能补上这方面的不足?
顾伟:这个观点就类似于Linux和Windows操作系统哪个更安全。其实安全是相对的,不是绝对的。Java基于JVM,而.NET对应于CLR,都是处于同一层级的运行环境的概念,所以它们的安全性在理论上是一致的,不能说Java在安全性方面就一定做的比.NET好。举个例子,比如WCF这个通信框架,就有支持https协议的绑定类型,来保证数据传输级的安全;再有身份验证凭据来保证数据的真实性,防止用户伪造身份;还有授权机制,保证不同用户身份的人访问不同权限的资源。所以微软当初在设计.NET时,是充分考虑其安全性的。
CSDN:作为微软技术的Fans,最后你能不能谈谈Windows Phone 8?
顾伟:移动开发是目前非常火爆的一项技术,当前主要是谷歌的Android和苹果的iOS两大系统占据了市场上的绝大部分份额,微软由于先期战略以及本身的问题始终没有在移动领域占得先机。目前其最新的Windows Phone 8.1平台市场份额相对也比较小,因此关注Window Phone的人不是很多。好在微软新任CEO掌权之后,对WP的发展非常重视。将搭载Window Phone系统的手机以及Surface通过Windows Azure Platform实现无缝对接,打造了一个数据集中、共享、统一的生态系统。从这个方面来讲,这也给更多的微软技术爱好者提供了一个机会,开发基于Window Phone平台的手机、平板等手持设备的APP或者游戏。熟悉WPF或者SilverLight的开发者相对更容易上手WP开发。
CSDN:云计算时代,.NET是否还能适应云计算发展需要?在实际开发中如何与云计算相结合?
顾伟:微软在云计算这方面的投入是巨大的, Windows Azure 平台(Paas)就是微软专门为实施云计算战略而打造的云平台。我们可以把自己开发的Web应用、Web Service等发布到Azure,也可以使用SQL Azure提供数据库的服务,还可以使用Office 365等Saas产品进行移动办公,这些都是Windows Azure平台所提供的功能或服务。对于开发者来说,如果没有合适的服务器资源,就可以注册一个Windows Azure平台账号,申请相应的服务,将自己的网站应用发布上去。这样既降低了成本,又获得了优质的服务,是比较理想的选择。目前微软为推广其Window Azure 平台在中国大陆的应用,与世纪互联合作,个人用户现在就可以申请体验。
CSDN: 能不能给初学者以及即将踏入软件行业的人一些建议?
顾伟:
CSDN:你认为技术不再于多而在于精,谈谈这个观点吧。
顾伟:技术总是在不断的更新和发展的,微软的技术尤其如此。人的精力也是有限的,不可能什么都会。什么都会的结果肯定是什么都不精,一遇到一些稍微困难点的问题就会束手无策,注定不能成为高手。而且有些技术虽然看上去很时髦,表面上看很有前景,在现阶段却并没有得到比较广泛的应用。Windows Phone就是一个典型的例子,虽然微软在不断的扩展这块的业务,借助于Windows操作系统的垄断地位,与Windows紧密配合。但是相比较Android和iOS开发,目前的市场份额实在很低,招聘WP开发的岗位也很少。因此作为.NET程序员一定要合理选择技术,将有限的时间和精力放到核心技术的学习上去。比如不论你是做Web还是桌面开发,只要是做.NET开发的,C#就是必须要精通的一门语言。像异步编程、多线程、Socket等等就是必须要加以应用和实践的。把基础打好之后,如果有一天WP火爆起来了,自己在技术方面实际上也做好了充分准备,很快就能转到WP开发上去。
CSDN:如果人生有个重启键,你将如何重新规划你的程序员之路?
顾伟:我是大学毕业后通过转行才进入到计算机编程行业的,人生如果可以重启,我希望自己能够在刚上大学的时候就能够选择计算机专业,尽早的发现自己的兴趣所在。
CSDN:最后聊聊你和CSDN间的故事吧。
顾伟:认识CSDN是我当年实习那家公司的经理向我推荐的,打那以后我就被CSDN的专业、前沿的技术所吸引,一直关注CSDN网站发布的关于前沿技术的信息新闻等。后来我也曾经在CSDN论坛就我实际开发过程中遇到过的问题请教过CSDN的坛友,他们都比较热情的对我的问题进行了解答,帮助我解决了一些我曾经遇到过的问题。7年之后,我也不再是当年的新人,也积累了一些些许的技术经验。我也想通过CSDN论坛这个平台,像当年别人帮助我一样,帮助更多的人。我想这也是一种精神的传承吧。