2009年1月5日星期一

你的技术之路

by 刘未鹏(pongba)
原文请看这里

今天看了pongba的帖子,颇有体会。

上周末看了dreamhead的一篇文章(《起步的台阶》),有些感触,忍不住在TopLanguage上八卦了一把,抛的是砖,引的是玉,获益良多,故摘抄于此:



我:

01年进大学的时候,想学计算机,但却身在数学系,那个时候就做好了打算,数学只要混个及格,其余时间钻心看计算机的书,曾经一个月买了四百多块钱的书,结果只能吃方便面度日,大学有两三年时间,学习计算机的热情是最高的,从坐车到上厕所都带着书:P

也正是在那个阶段,学了很多底层知识,也钻了无数的细节。那个时候的信仰是:技术隐藏在细节当中。那个时候看的书,代表性的是:《编码的奥秘》、《80x86汇编技术原理》、《Windows核心编程》、《C++设计新思维》、《Inside C#》、《Linux内核源代码情景分析》……(那段时间最喜欢的就是"内幕揭秘"、"原理"、"深入"之类的书)

现在看来,这段时间学习方式的优点:钻技术细节,锻炼思考能力。缺点:一叶障目不见泰山。过分钻研技术细节导致忽视了要紧的技能;如,编码习惯非常差,以前写的代码,过了两年之后拿出来看,不忍卒读,连基本的DRY原则都没能遵循。此外,对技术细节的关注导致了忽视了一些编码方面形而上的原则。

这样的学习几乎持续到了本科的结束;其结果就是脑袋里技术细节不少,但编程方法学上的东西却几乎一概不知(比如对如何编写优质的代码的忽视、对测试的忽视、对重构的忽视、乃至对OO也只是停留在一点皮毛认识上)。

直到读研的第一年,才开始拿起《The Pragmatic Programmer》、《Code Complete 2nd》、《Object Oriented Software Construction》这些书,关注起一些"更大"的问题来,也拿起来《Programming Ruby》读一读,也正是这个时候,才算是走出了语言细节、技术细节的无尽泥沼,开始思考一些软件开发方面一般性的东西,开始意识到"脱离语言思考,使用语言实现"。四年,从纯技术的小世界中走出来,还不算晚。回头看,以前的钻技术细节的历史也并非全无用处,尤其是培养了金出武雄所谓的"思维体力",而在底层知识方面的积累也让后来看一些更高层的东西的时候心里更有底。然而,现在看来还是觉得:一,在细节方面花的时间太多了(细节的世界是无穷的,尤其是IT领域,一个老概念新翻,就能变化出无数细节。一个框架的API文档就隐藏着无数的"技术细节")。二,没有区分"非本质的细节",和"本质的细节",像硬件架构知识,属于本质细节,像语言细节知识,就是非本质细节了。前者是不变的,后者易变。三,没有在关注技术的同时,分出一部分时间来关注更大一些的主题(如编程的方法学,乃至项目管理,一个例子是,在以前,会认为语言的好坏至关重要,因为语言的世界是最熟知的,然而实际上软件开发的成本包含了更多重要的内容,甚至在语言方面还要取决于库、工具等等因素。以前看到"精巧的"设计模式觉得兴奋不已,现在则意识到,这些其实都是"非本质"细节)。

如今呢,倒是又开始觉得这些都不太重要,这些年的学习最大的收获不是学到的东西,而是学习的能力。对于软件开发这个知识无比细分、繁杂的领域,想要躺在过去学到的东西上过日子几乎是不可能的,然而又不可能把所有知识都装在脑中,所以唯有利用"元"能力:学习能力——用到啥,就学啥。毕竟,正如当初入数学系时的新生大会上,我们的系主任说的:数学都学了,还有什么学不了的呢?

老莫:

我跟计算机的缘分差不多可以追溯到公元1989年。我还是6年级的小学生,兴趣小组把我们带到浦明师范,然后玩弄了一下apple II。也就是个四则运算什么的。说真的,我是一点感觉都没有,基本上没分清计算机和计算器的差别。

此后,在中学里我参加模型小组什么的,玩的挺开心,还得了些小奖。联系了实践能力和动手能力,倒是很有好处。我的钳工手艺差不多是那时候打下的基础。高中时,参加了"头脑奥林匹克"(Odyssey of Mind),一种从美国引进的面向青少年的创造能力比赛。我们得过冠军和季军。从中我接受了分析能力和创造能力的训练(没错,这也是可以训练的),学会如何运用基本原理,创造性地解决一个复杂问题。当然,这种比赛时要动手的,动手能力进一步得到锻炼。

后来,我稀里糊涂地进了大学。(我没有夸张,我们这一届应该是全中国历史上唯一的一次,仅凭借会考成绩进大学的。没错,是上海工业大学,现在的上海大学,托钱伟长的福,祝他安康:))。

由于高中时的比赛经历,我选择了机械系。我原本喜欢物理的,不过上工大那时没有物理专业。不管怎么样,能读大学就行了。两年级开始学用计算机——AutoCAD——机械系学生的吃饭家伙。94年的时候,我母亲的一个同事的先生建议我们家买电脑,让我学计算机。至此,我才真正地接触计算机技术,一发而不可收。

先是学了dBase,然后是C。96年开始接触C++,接着一头栽进去,就回不来了。从Borland跳到VC,从 Win16到Win32,从api到mfc。啃过几个月的com规范,对于ms那套东西算是摸得很熟了。但始终没有跳出ms的范畴。而所用的C++,也不过是C(++)而已,直到两件以前,接触了标准C++和众老大的著作。一句话概括,我是一个用了12年C++,拥有2年半C++经验的程序员:P。

半年多以前,我听说了pongba和他的blog,然后发现了TopLanguage。然后么,在同众老大的学习和探讨中,进一步开拓了我的眼界,跳出了C++,跳出了ms,进入了更广阔的天地。一切还都在学习,学无止境啊。

这就是我的技术成长经历。概括起来就是两个字"杂交"。尽管我现在搞软件,一个很专业的领域,但是过去的经历,所学的知识,都有极大的帮助。有时,另一个学科(对我主要是机械工程)的只是和技能,会起到意想不到的作用。我也曾经学习了一些物理学,其中的一些营养,或许现在正在潜意识中促进了我的编程技能。:)

btw:从我现在的眼光看来,pongba的专业经历是最理想的:)。本科的数学,然后转向计算机,通讯或其他什么理工类专业,思维往往非常深刻严谨。没的话说了。:)

我和老莫:

老莫写道:

我跟计算机的缘分差不多可以追溯到公元1989年。我还是6年级的小学生,兴趣小组把我们带到浦明师范,然后玩弄了一下apple II。也就是个四则运算什么的。说真的,我是一点感觉都没有,基本上没分清计算机和计算器的差别。

我:呵呵,我最早接触计算机比老莫晚多了,是在97年,刚进高中,老爸买了一台台式机(奔腾MMX 200MHz,32M内存,2.1G硬盘),那个时候,最感兴趣的就是每天吃完饭之后去校图书馆看电脑爱好者,把里面的注册表应用技巧抄在一个小本子上,回到家里折腾:) 那个时候每个月必买的是三本杂志:科幻世界、电脑爱好者、电脑报。

老莫写道:

此后,在中学里我参加模型小组什么的,玩的挺开心,还得了些小奖。联系了实践能力和动手能力,倒是很有好处。我的钳工手艺差不多是那时候打下的基础。高中时,参加了"头脑奥林匹克"(Odyssey of Mind),一种从美国引进的面向青少年的创造能力比赛。我们得过冠军和季军。从中我接受了分析能力和创造能力的训练(没错,这也是可以训练的),学会如何运用基本原理,创造性地解决一个复杂问题。当然,这种比赛时要动手的,动手能力进一步得到锻炼。

后来,我稀里糊涂地进了大学。(我没有夸张,我们这一届应该是全中国历史上唯一的一次,仅凭借会考成绩进大学的。没错,是上海工业大学,现在的上海大学,托钱伟长的福,祝他安康:))。

我:我感觉这类经历还是相当有价值的!我本科有一舍友,高中的时候玩过竞赛,我们讨论算法问题的时候,感觉他直觉明显比我好多了。我们那个时候学校比较保守,玩的是应试教育,没有这些经历,对思维方式造成了很大的僵化影响~

老莫写道:

由于高中时的比赛经历,我选择了机械系。我原本喜欢物理的,不过上工大那时没有物理专业。不管怎么样,能读大学就行了。两年级开始学用计算机——AutoCAD——机械系学生的吃饭家伙。94年的时候,我母亲的一个同事的先生建议我们家买电脑,让我学计算机。至此,我才真正地接触计算机技术,一发而不可收。

我:老莫,我高中的最高理想就是报理论物理(握个手哇~~),一方面小时候看的自然科学的书对我的兴趣影响极大,另一方面初中的物理成绩也给了我很大的成就感。非常喜欢物理的那种深刻。但因为色弱不能报考理论物理,所以报计算机的,但差了3分,落到骗人的"信息与计算科学"(后来听另外几个朋友说也是被这个名字骗了,以为是计算机相关的系,才报的,哈哈:P)

老莫写道:

这就是我的技术成长经历。概括起来就是两个字"杂交"。尽管我现在搞软件,一个很专业的领域,但是过去的经历,所学的知识,都有极大的帮助。有时,另一个学科(对我主要是机械工程)的只是和技能,会起到意想不到的作用。我也曾经学习了一些物理学,其中的一些营养,或许现在正在潜意识中促进了我的编程技能。:)

btw:从我现在的眼光看来,pongba的专业经历是最理想的:)。本科的数学,然后转向计算机,通讯或其他什么理工类专业,思维往往非常深刻严谨。没的话说了。:)

我:^_^怎么说呢,虽然数学仅学了个半吊子,但后来我回头看,最重要的课程" 微积分"(严密思维)其实已经在大一学掉了,我记得教微积分的那位老教授的课,是相当有意思的,在整个大学生涯中,也仅有这一门课,去听过;也仅有这一门课考了90分向上。后来大三大四就是在软院读的了,偶尔跟过去的舍友聊聊数学系在上什么课,感觉后来学的近世数学就开始繁复了,不复原来的简洁优美。另外,每次考试前的包夜(临时抱佛脚)也极大的锻炼了理解力,一两个晚上需要基本搞定一学期的内容,一般我的策略就是捡最重要最本质的内容理解(而不是记忆),其余的就管不着了,结果每次都混个过关:P

虽然最终数学没学到太多东西,但在严密思维以及理解力上面的锻炼还是相当有益的;或许,正如系主任所说,在学新东西的胆量上面,也有作用:-)

没有评论: