[你必须知道的.NET]第二十回:学习方法论
系列文章导航:
[你必须知道的.NET] 第四回:后来居上:class和struct
[你必须知道的.NET] 第五回:深入浅出关键字---把new说透
[你必须知道的.NET] 第六回:深入浅出关键字---base和this
[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始
[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理
[你必须知道的.NET] 第九回:品味类型---值类型与引用类型(中)-规则无边
[你必须知道的.NET] 第十回:品味类型---值类型与引用类型(下)-应用征途
[你必须知道的.NET] 第十一回:参数之惑---传递的艺术(上)
[你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)
[你必须知道的.NET] 第十三回:从Hello, world开始认识IL
[你必须知道的.NET] 第十四回:认识IL代码---从开始到现在
[你必须知道的.NET] 第十六回:深入浅出关键字---using全接触
[你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
[你必须知道的.NET]第二十回:学习方法论
说在,开篇之前 |
本文,源自我回答刚毕业朋友关于.NET学习疑惑的回复邮件。 本文,其实早计划在《你必须知道的.NET》写作之初的后记部分,但是因为个中原因未能如愿,算是补上本书的遗憾之一。 本文,作为[《你必须知道的.NET》]系列的第20回,预示着这个系列将开始新的征程,算是[你必须知道的.NET]2.0的开始。 本文,作为一个非技术篇章,加塞儿到《你必须知道的.NET》队伍中,我想至少因为回答了以下几个必须知道的非技术问题:.NET应该学习什么? .NET应该如何学习? .NET的学习方法? 本文,不适合所有的人。 |
关于这个问题,也有不少刚刚入行的朋友向我问起。我想可能一千个人就有一千个答案,我不能保证自己的想法适合于所有的人,但是这确实是我自己的体会和经历,希望能给你一些参考的价值。同时,我也严正的声明,我也是个学习者,也在不断的追求,所以这里的体会只是交流,并非说教。
作为同行,首先恭喜你进入了一个艰难困苦和其乐无穷并存的行业,这是软件的现状,也是软件的未来。如果你想迅速成功,或者发家致富,显然是个难以实现的梦想。老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领域的基本内容,看起来令郎满目,其实互相联系、互为补充,没有独立的分割,也没有独立的概念,了解这个必然牵出那个,所以修炼起来并不孤单,反倒在不断的领悟中能够窃喜原来软件也可以如此精彩。