你的技术之路
刘未鹏(pongba)
C++的罗浮宫(http://blog.csdn.net/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
虽然最终数学没学到太多东西,但在严密思维以及理解力上面的锻炼还是相当有益的;或许,正如系主任所说,在学新东西的胆量上面,也有作用:-)
受到两位大牛的感染了,我也拉拉杂杂写两句:
我接触电脑算是早的了。小学4年级还是5年级的时候,学校搞了一批中华学习机,其实就是一种appleII的兼容机,然后组织我们学basic。当时鬼使神差的就报名了。后来学校组织我们去考计算机奥校。话说考试题目完全没有计算机的内容,除了语文就是数学。(至今对语文卷子的最后一道题记忆深刻:问,是否知道曹冲秤象的故事,如果知道,举一个你生活中的例子。我当时纠结了半天也想不出类似的例子,所以答案写了个"不知道"。)
之后,居然鬼使神差的考上了!每周末要去上计算机课,5年级那会儿以算法和数据结构为主,但并不系统,而且都是用的basic,对指针啥的没有概念。主要像线性表,列表,排列组合,深广度搜索都学到了。话说,那会儿老师最喜欢出的题就是报数杀人,开始是一遍遍顺序报数,之后是折返来回报数,在最后转圈报数……(爆个老师的八卦:那老师写大写字母都能连笔,每次看他在黑板上写程序都要辨认半天……)
之后上了初中,就是奥校哪个学校,在所谓的计算机班。而且家里给买了台386电脑。记得那段时间最喜欢的就是用各种技巧把基本内存弄到630k左右。上课学了pascal(所谓计算机班嘛,总要有点特色,别的班学的是wps),算是接触到指针类的语言了,还短暂接触了一点OO,但只知道是把函数放在结构里(turbo pascal对oo的扩展太弱了),还不懂啥叫封装。最大成就是用pascal写了个分割文件的小程序,使用命令行,用一个函数来判断输入是否合法(当时还是8.3的文件名,输入8个字符后就必须输入'.',之后只能输入3个字符;还有只能输入数字、路径等不同的合法限制),还会判断目标位置是否足够容纳,会自动分割。(后来上了高中,找原来同学玩时,发现他还在用我写的这个程序,兴奋。可惜现在那个程序找不到了……)然后记得有年暑假,看了一遍谭浩强的《C程序设计》,算是入了C的门了。还看过一本讲ARM C++的书,算是入门了C++。(这本C++的书没讲命名空间,以至于大学有人拿着书上例子问我using是啥我都不知道,汗……)期间参加过几次比赛,最好成绩好象是区第二?记不得了,反正成绩不咋样……
高中基本都在围着高考转,也没有啥计算机上的进展。不过,报考志愿时倒是一直想上计算机系,无奈分不够,只能报了自动化(2000年,那年是唯一一次先出分后报志愿)。
大学开始接触的windows编程。入门书是《Visual C++ xxxx》(忘了,反正就是ms出的配合VC6的那本),砸重金考了个MCSD,算是对COM有了一点点理解。(不知道这个证书,在我第一次找工作时,有没有起作用……)也就是在大学,在学校图书馆借了《C++沉思录》,算是上了C++的道儿,开始对语言本身着迷。不过自身懒,虽然学校的计算机系不错,我也从没去蹭课过,想想后悔啊。而且当时总觉得拿着个C++就啥都能干了,什么GUI数据库之类,无非就是数据结构+算法嘛。现在对这个想法真是汗颜,年少轻狂……
毕业后,先是在上海一家台湾公司做光驱(在张江,可能这里不少朋友知道那里吧)。基本上感觉是被骗去的。说是程序员,结果去了工作都是针对CD盘调整firmware参数……后来辞了,去了北京华为。在这里算是开始接触软件工程的相关思想。从华为图书馆借了《代码大全》(第一版,还是复印的……),读了后才知道以前的浅薄。于是开始大量看书。正好华为内部买书挺便宜(工卡里的钱不要税的,而且只能在内部用),于是《深入理解C++对象模型》,《C++设计新思维》等书也是在那会儿看的。并且工作中接触了Java和Unix。对Java倒是没啥好感,倒是被unix的命令行迷倒了(比dos强多了啊)。不过华为的工作,大家也都是知道,看的东西虽然多,没时间实践。现在在一家公司做linux,开始接触python,linux系统本身等方面,还有很多东西要学……
唯一的遗憾,大学玩的太多了,而且太狂了。好歹那会儿应该看看操作系统和编译原理。这东西现在静不下心看啊。
KatKat Lim:
俺第一次编程是在小学或者初中的时候。第一个程序是:
hello
不是hello world,因为我看到小霸王学习机手册上面写着:人机对话……
Niu Jin:
也不是科班出身,本科学的生物医学工程。
大一时一大堆无聊的课程里就觉得C语言程序设计比较有意思,老师是刚毕业的,开堂第一节课说:"C语言我不是很熟,大家共同学习"。于是自己天天跑机房,做的是谭浩强那本C语言程序设计的习题。
后来,一堆同学报了国家计算机等级考试,也跟着报了。那个南开一百题我读起来比读小说还有味道。考试上机过了,笔试没过,因为压根没看(我知道我错了,不该浪费父母血汗钱……-_-!)。
再后来,无意中在网上发现了pongba的blog,无意翻到pongba的那篇《我的C++学习历程》。也去翻翻pongba提到的那些C++名著,然后就上了贼船^_^,大学剩下两年半将一本本C++名著读下来(全是早饭钱换的)……
现在毕业未满一年,工作是数据库维护,对坛子里的诸位大大的谈吐无限敬仰,每日来潜水。 ^_^
星染流云:
现在想想当年那些电脑杂志里最好的一本,应该是《电脑高手》,其内容之强大,至今无出其右者。不过后来改版了,我就再也没买过。
代数,我倒是认为是相当优美的,因为可以把各种数学结构用统一的角度看待。清华出的高等代数学(第2版)挺好的。
分析,也不错,就是感觉有些琐碎,各种教材角度也不同,要么偏应用,要么偏理论。应用+理论的话,同济版的高等数学+Rudin的数学分析原理,我觉得是一种还不错的组合。
语言上,静态的、动态的各学两门。
yzzrn:
小学最后一年的时候用小霸王步步高之类的学习机学会了英文的ABCD,学会了五笔字形。
初中的时候用了一下学校的DOS:每次上机插入一张软盘,最喜欢玩的"游戏"是TT。学习了一些DOS命令,用了用UCDOS和当时很牛的WPS。
高中的时候喜欢看电脑报,最爱干的事就是修改我表哥一台P2的机器的注册表。
后来城里有了无盘工作站的网吧,于是经常去修改网吧的机器(解除其中的一些限制),还经常安装冰河:-)
大学在南京NUAA上的,信息安全专业:大一上学期学了C(谭浩强版本),大一下学期学了C++,我们老师自己整的一本E文书(不知是否原创),当时他很自豪地说他的书里有一个string(即std::string),在别人的书里是没有的!!后来想写界面,于是自学了MFC(书是JJHou那本),认识了虚函数多态的妙用,被台湾术语搞晕了(繁体电子版JJHou那本书,后来自己买了一本简
体的,大三的时候送给图书馆了,至今下落不明),被JJhou对MFC一堆宏的解说搞晕了,不过framework倒是了解了不少。后来看了GOF的那本书,于是对DP无比崇拜。接着是:Bob大叔的3P书,martin的Refactoring,C++设计新思维……
然后就大学毕业开始工作了,发现书与现实的差别巨大无比。目前还在与VC6,MFC做斗争。
刘新宇:
其实我是上周五才注意到这个TopLanguage的。和前面几位相比,看来我可以卖卖老了:-)
"诸事无成,但尚能饭"。
我是初二接触计算机的,也是Apple II。参加了一些竞赛,不过印象都不深了,印象最深的是这几件事:
- 拿剪刀在double density的5寸盘的左侧剪一个缺口,然后在普通软驱上当双面用。
- 期末考试结束后,写个冒泡排序帮老师算年级排名和平均分。……终于亲自验证了计算机可以帮助提高生产力。
- 晚上调程序太晚,机房和教学楼都锁了,和老师一起跳窗户出来。
然后进入高中,接触了pascal,接触了几个同学+好朋友,也搞竞赛,牛人真的很多。不过比赛得奖能一起看个电影什么的也蛮有意思。印象深的有这样一些事情:
- 学习了些数据结构,并且在计算机小组活动上,利用老式光学幻灯机给大家讲。
- 机房的机器都是意大利赠送的ollevitti(拼写可能有错,中文据说是"好利获得"),相当于8086, 意大利键盘。
- 第一次和好朋友们一起逛中关村,大开眼界,逛了不少展览会,拿了不少好看的资料。
然后是大学和读研,这个比较复杂,列举事情似乎不够了。说说一些变化吧。
- 专业课里计算机相关的不多,C语言,汇编语言,算法与数据结构,也就这些了。现在很佩服当初的课程设置,老教授们的确看的很远,他们知道什么是工具,什么是知识,什么是要培养的能力。数学,物理培养的是科学的素养,数字电路,模拟电路,信号与系统,自动控制原理培养的是工程专业知识。实验课程培养的动手能力和——非常重要——自信。相信自己有能力解决真正的工程问题。(对了,我是自动化系)
- 可惜年轻气盛,没有能够及时理解老师们的苦心,自己在大量的语言学习,Windows编程上浪费了不少时间。
- 认识到这个问题是逐渐逐渐的,真正的生产需要扎实的基本能力和基本概念。
- 我在大学里出过很多差,到过2次湖南农村的汽车厂里帮助开发汽车自动检测线的控制程序,到过7次江西的火电站帮助开发发电系统自动检测程序。接触了一线工程后,我知道了计算机的威力,也感到了自己的不足。
- 这个不足就是硬件能力,于是悔之晚矣,我拼命学习硬件知识,动手制作电路。
- 开始读论文,认识到研究是一件非常神圣的事情,后悔当初没有好好学习数学和专业课。
- 接触图像处理,被极大吸引,发现Matlab是个好帮手。尝试静心研究,写论文,可惜岁月蹉跎,留给我的时间太短了,我毕业了。
求学
- 毕业后我空了半年时间,一边帮助老师做工程项目,一边帮助朋友写程序。这一阶段犯的错误是满意自己已经完全能够写任何程序解决工程问题了,现在看来,人一刻也不能自满。
- 到日本学习机器人开发,发现自己擅长的程序设计和电路设计,单片机开发都不使不上劲,发现了另一个弱点:机械设计。
- 努力学习机械设计,搞定了几个机器人。
- 开始学习新的C++,包括STL。
- 意外,被迫中断学业,回国。
工作
- 找工作,很艰难。先在上海工作,学习了设计模式。明白了所谓大公司里的软件开发流程。遇到了很多事,明白了社会是个残酷的大学。
- 回北京,很长时间怀疑自己,很矛盾,曾请甚至觉得"读书误人"。
- 继续工作,要承认现实。接着腰部生病,人生想法发生极大改变,珍惜活着的每一刻,生活,工作,薪资,都是身外之物,家人和亲情最可包括,人生要随遇而安。
- 开始每月写技术文章,到现在积累2本:(《听雨集——C++小品文集》和《看云集——软件开发杂文集》)
- 偶尔在cpper灌水。
- 接触squeak,明白了工作和业余爱好的区别。
- 现在越发觉得自己精力脑力大不如前,大量的非技术工作也逐渐占据了我的技术工作的部分。最近看看lisp,编译原理,Smalltalk和haskell,希望能够活到老,学到老。
对了,说个题外话,我的同学很多都发生了极大的转变,有很多事自己主动做出了重要的人生决定,列举一些:
- 认为理工,尤其是工程技术并不是自己追求的,大学期间开始学习经管的双学位,毕业后毅然出国学习经济。
- 毕业工作一年后,毅然转行学习集成电路;学成后一致在集成电路业内工作。
- 工作后转入半导体行业。
- 坚持老本行,工业自动化行业。
- 创业。
- 转入纯软件行业……这个可能最多。
- 当然,还有大量出国从事研究的。
你的技术之路是怎样的?
(更多讨论请移步我们的讨论组)