关于这个问题,也有不少刚刚入行的朋友向我问起。我想可能一千个人就有一千个答案,我不能保证自己的想法适合于所有的人,但是这确实是我自己的体会和经历,希望能给你一些参考的价值。同时,我也严正的声明,我也是个学习者,也在不断的追求,所以这里的体会只是交流,并非说教。
作为同行,首先恭喜你进入了一个艰难困苦和其乐无穷并存的行业,这是软件的现状,也是软件的未来。如果你想迅速成功,或者发家致富,显然是个难以实现的梦想。老Bill和李彦宏在这个行业是难以复制的,所以做好长期艰苦卓绝的准备是必须的。至少,我身边的朋友,包括我自己都是经历了这个过程,而且依然在这个过程中,累并快乐着。所以,如此辛苦,又没有立竿见影的“钱”途,想要在这个领域有所发展,只能靠坚持和兴趣了。二者缺一不可,对于刚刚毕业的你来说,这个准备是必须有的。这是我的第一个体会,可能比较虚,但是这个在我看来却是最重要的一条。
第一条很关键,但是除了在思想上做好准备,还有应该就是你关心的如何下手这个问题了?从自己的感觉来说,我觉得比较重要的因素主要包括:
1 基础至上。
其实早在两年前,我也存在同样的疑惑,很多的精力和时间花费在了追求技术技巧、技术应用和技术抄袭的自我陶醉状态。历数过去的种种光辉历程,很多宝贵的人生都花在交学费的道路上了。所以,当我把全部的精力投入到基础和本质研究的课题上时,竟然发现了别样的天地。原来再花哨的应用,再绝妙的技巧,其实都架构在技术基础的基础上,没有对技术本质的深刻理解,谈何来更进一步了解其他。这种体会是真实而有效的,所以我将体会、研究和心得,一路分享和记录下来,于是就有了《你必须知道的.NET》这本书的诞生,我切实的觉得从这个起点开始,了解你必须知道的,才能了解那些更广阔的技术领域。
所以,如果能够坚持,不放弃枯燥,从基础开始踏踏实实的学习基础,我想你一定会有所突破。而这个突破,其实也有着由量到质的飞跃,以.NET为例,我认为了解CLR运行机制,深刻的认识内存管理,类型系统,异常机制,熟悉FCL基本架构,学习c#语言基础,认识MSIL、元数据、Attribute、反射、委托等等,当然还包括面向对象和设计架构,都是必不可少的基础内容。你可以从《你必须知道的.NET》的目录中来大致了解到应该掌握的基础内容,顺便广告了:-)
话音至此,顺便推荐几本基础方面的书,如果有时间可以好好研究研究:
- Don Box, Chris Sells, Essential .NET,一本圣经,深刻而又深邃,为什么不出第二卷?
- Jeffrey Richter, Applied Microsoft .NET Framework Programming,.NET世界的唯一经典,偶像级的Jeffrey是我的导师。
- Patrick Smacchia, Pracical .NET2 and C#2,.NET领域的百科全书,可以当作新华字典来读技术。
- Richard Jones, Rafael D Lins, Garbage Collection: Algorithms for Automatic Dynamic Memory Management,内存管理方面,就靠它了。
- Christian Nagel, Bill Evjen, Jay Glynn, Professional C# 2005,c#基础大全,大家都在看,所以就看吧。
- Thinking in Java,是的,一本Java书,但是带来的不仅仅是Java,写书写到这份上,不可不谓牛叉。
- Anytao, 你必须知道的.NET,我很自信,没有理由不推荐,这本书有其他作品所没有的特别之处,虽不敢恬列于大师的经典行列,但是推荐还是经得起考验。
我一直主张,书不在多,有仙则灵。上面的几本,在我看来就足以打好基础这一关。当然如果有更多的追求和思索,还远远不够,因为技术的脚步从未止步。但是,至少至少,应该从这里开始。。。
2 你够OO吗?
不管对业界对OO如何诟病,不管大牛对OO如何不懈,那是他们折腾的事业。而我们的事业却无法远离这片看似神秘的王国,因为但凡从项目和产品一路厮杀而来的高手,都理解OO的强大和神秘。站在高高的塔尖来看软件,玩来玩去就是这些玩意儿了。所以,在我看来OO其实也是软件技术的必要基础,也是技术修炼的基本功之一,因此我也毫不犹豫的将对面向对象的理解纳入了《你必须知道的.NET》一书的第一部分范畴。
然而,实话实说,OO的修炼却远没有.NET基础来得那么容易,苦嚼一车好书,狂写万行代码,也未必能够完全领悟OO精妙。说得玄乎点儿,这有些像悟道,想起明代前无古人后无来着的心学开创者王阳名先生,年轻时每天格物修炼的痴呆场景,我就觉得这玩意儿实在不靠谱。其实,很少有人能完全在OO面前说彻悟,所以我们大家都不例外。但是因为如此重要,以至于我们必须找点儿东西或者思路来摩拳擦掌,了解、深入和不断体会,所以我对面向对象的建议是:始终如一的修炼,打好持久战。
如何打好仗呢,不例外的先推荐几本经典作品吧:
- EricFreeman, Elisabeth Freeman. Head First Design Patterns,标准的言简意赅,形象生动,难得佳作。
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlisside,设计模式-可复用面向对象软件的基础,开山祖师的作品,不独白不读。
- Martin Fowler, Refactoring: Improving the Design of Existing Code,同样的经典,很拉风。
- Robert C. Martin,敏捷软件开发:原则、模式与实践,对于设计原则,无出其右者。
- 张逸,软件设计精要与模式,国内作品的优秀作品,园子里的经典之作。
有了好书,还是远远不够的。所以,还得继续走王阳明的老路,今天格一物,明天格一物,看见什么格什么。用咱们的专业术语说,就是不断的学习和实践他人的智慧结晶,看经典框架,写熟练代码。我的一位偶像曾语重心长的告诉我,做软件的不写上千万行代码,根本就没感觉。按照这个标准衡量一下自己,我发现我还只是小学生一个,所以废话少说,还是去格物吧。
那么OO世界的物又是什么,又该如何去格,在我看来大致可以包括下面这些内容,但是分类不按学科标准:
- 面向对象的基本内容:类、对象、属性、方法、字段。
- 面向对象的基本要素:封装、继承、多态,我再外加一个接口。
- 设计原则:接口隔离、单一职责、开放封闭、依赖倒置、Liskov替换,没什么可说的,这些实在太重要了。
- 设计模式:也没有可说的,实在太重要了。
- Singleton
- Abstract Factory
- Factory Method
- Composite
- Adapter
- Bridge
- Decorator
- Facade
- Proxy
- Command
- Observer
- Template Method
- Strategy
- Visitor
- 分层思想:例如经典的三层架构
- 模块化
- AOP
- SOA
- ORM
- ......
这些OO领域的基本内容,看起来令郎满目,其实互相联系、互为补充,没有独立的分割,也没有独立的概念,了解这个必然牵出那个,所以修炼起来并不孤单,反倒在不断的领悟中能够窃喜原来软件也可以如此精彩。
3 舍得,是门艺术。
有了技术基础,懂得修炼OO,下面就是舍得的问题了。舍得舍得,不舍怎得?
.NET技术有着近乎夸张的应用范畴,从Windows GDI应用,到ASP.NET Web应用,到WCF分布式应用,到Window Mobile嵌入式应用,到ADO.NET数据处理,到XML Webservice,.NET无处不在。所以,对于.NET技术的学习,你应该有个起码的认识,那就是:我不可能了解.NET的整个面貌, 还有个起码的问题继续,那就是:我还要学吗?
当然不可能了解所有,因此你必须选择和舍得,选择有方向,舍得有兴趣;我还要学吗?当然要学,但是应该首先清楚如何学?在这么多眼花缭乱的技术应用中,有一个基础始终支撑着.NET技术这艘航母在稳步前行,不管是什么应用,不管是什么技术,不管是什么框架,CLR总是.NET技术的心脏。通过表面来倾听心脏的声音,才能更好的了解机器的运转,顺着血管的脉络了解框架,才能明白机制背后的玄机。层出不穷的新技术和新名词总是能吸引你的眼球,但是永远不要只盯着那块蛋糕,而掉了整个礼物,所以对.NET的学习一定要打好基础,从了解CLR底层机制和.NET框架类库开始,逐渐的追求你的技术选择。
善于分辨,不盲从。每天上cnblogs、MSDN和其他的订阅技术文章,是我的习惯,但是如果每篇都读,每篇都看,那就基本没有其他的时间,所以你必须有分辨的能力,和抵抗诱惑的心态。找准自己的方向,并且坚持下来,是难能可贵的。
在这方面,没有参考,也没有推荐,全屏自己的慧眼。眼光,是个关键。
4 读几本经典的作品。
这一点其实并不需要多说,推荐的几本作品值得花点儿功夫来学习,因为这的确是最初的开始,走在路上从起跑线就走错了方向,大致快速追上是比较难得。所以经典的作品就是一个好的起点,我也会不时的在个人博客中推荐更好的专著,希望你继续关注J
5 遵守规范,养成良好的编程习惯。
其实这是个看似无足轻重的小事儿,我经常看到自以为天下无敌的高手,胡乱的在编辑器中挥洒天赋,一阵高歌猛进,但最后自己都不知道当初的本意是什么。软件是个可持续的资源,于人于己都遵守点儿规则,出来混是要有点儿职业道德。对自己而言,良好的编程习惯正是一个良好学习习惯的开始。看着自己的代码,感觉像艺术一般优雅,大致也就是周杰伦听到东风破时候的感觉吧,怎一个爽字了得。
推荐一本这方面的书:
- Krzysztof Cwalina,Brad Abrams , .NET 设计规范--.NET约定、惯用法与模式
6 学习,讲究方法。
具体的学习方法,实在是因人而异,我从来不主张学习他人的方法,因为人性是难以复制的东西。自己的只有自己最清楚,所以你可以模仿他人的技艺,但是用于无法刻画其灵魂。关于学习方法这档子事儿,我向来不喜欢参考他人,也更不喜欢推荐。
但是,即便如此,丝毫不减弱学习方法的重要性,懂得了解自己的人是真正的智者,所以挖掘自身潜力永远是摆在自己眼前的课题。寻找一套行之有效的方式方法,非常的重要,但是不要学着模仿,这方面我觉得只有创新才能成功。
如果实在没有自己的方法,我就觉得没有方法就是好方法,苦练多看,永远不过时。
7 找一个好老师。
如果有幸能有一位德高望重而又乐于奉献的师长指导,那的确是人生之幸运,但是这种概率实在是太小了。我没有赶上,所以大部分人也没法赶上。没办法,还是需要好的老师,那么哪儿有这样才高而又德厚的人才呢?
答案是互联网。google,baidu,一个都不能少。
MSDN是个好工具,博客园是个好地方,《.NET禅意花园》是个好开始。
8 英文,无可避免。
前面说过,要不断的修炼和格物,要学习好的作品,认识好的框架。很不幸的是,这些好事儿全被老外占了,因为本来就是从他们那里开始的,所以也不需要泄气。中国人自古都是师夷长技以制夷的高手,希望软件产业的大旗别在我们手上倒下。但是,话说回来,英文就成了一个必须而又伤神的拦路虎,但是没办法使劲的嚼吧。多看多写多读,也就能应付了。
关于英文的学习和成长,我并不寄希望于在什么英语速成班里走回头路,学校苦干这么多年也每隔名趟,所以下手还是务实点儿,我推荐几个好的英文网站和大牛博客,算是提高技术的同时提高英语,一箭双雕,一举两得:
- http://www.gotdotnet.com/
- http://codeproject.com/
- http://www.asp.net/
- http://codeguru.com/
- http://www.c-sharpconer.com/
- http://blogs.msdn.com/bclteam/
- http://blogs.msdn.com/ricom/
- http://samgentile.com/blog/
- http://martinfower.com/bliki
- http://blogs.msdn.com/kcwalina/
- http://www.pluralsight.com/blogs/dbox/default.aspx
- http://blogs.msdn.com/cbrumme/
当然这里罗列的并非全部,MSDN、asp.net自不必说,可以有选择的浏览。
上述1+7条,是一些并非经验的经验,谁都知道,但不是谁都能做到。累并快乐着,永远是这个行业,这群人的主旋律。在技术面前,我嫣然一笑,发现自己其实很专注,这就够了。
好了,啰里啰唆,可能是经验,可能是废话。正如一开始所说,作为一个过来人,我只想将自己的心得拿出来交流,绝没有强加于人的想法。除了推荐的几本作品,你可以有选择的参考,其他的甚至可以全盘否定。心怀坦诚的交流,说到底就是希望更多的人少走我曾经曲曲折折的弯路,那条路上实在是幸福与心酸一股脑子毁了一段青春。