学习软件技术的2、3点
张波
很久很久没有接触开源社区了,也很久很久没有接触技术了,自从自废武功转作商务以后,就再也不好意思在开源论坛吱声了;木有办法,技术发展太快,现在随便哪个小师弟提出个技术问题就能秒杀我,所以在技术上与大家探讨,那必然是起于自我膨胀,而终于自取其辱了,显然非智者所为也!(郑重声明,这里没有任何对师妹技术的藐视,并非师妹技术赶不上师弟,而是大丈夫有所不为也!即便是使出顾左右而言他这种高端培训技巧,本人也不能让自己在师妹面前被秒杀,必须的!)
只是长久以来,每每看到陈老师始终兢兢业业的教书育人、康华等师兄弟已然在开源云计算等技术领域挥斥方遒,自然为其坚持和激情所感,也总想接着做点什么!
然而,世界上独独就怕“想”这个字;不对,应该是世界上就怕独独的一个“想”字,光想不练,时光荏苒,你们懂的,。。。说起来是笑谈,然而却是颠扑不破的真理:没有想法不见得是坏事,所谓脑残人安乐;光想不练、始终无丝毫实际进展才会让人悲叹蹉跎——我们的思想曾经那么深远,比乔布斯都早预感到智能移动终端的颠覆式发展,怎奈他生的早、动得快。。。
可叹我早在大学阶段就明白了这个真理,然而却每每不能理论联系实际,在漫长的岁月里不停的用细腻的思考代替鲁莽的探索,反复犯错栽跟头,在摔进的同一条河里都已经学会游泳了。今天,我要郑重的告诫大家:光练不想傻把式,光想不练假把式!这篇文章就是行动的起点!
这里我想和大家分享的是学习计算机软件技术、特别是偏重于操作系统这个领域的指导思想和学习路径。作为一个撂荒者技术没啥好说的了,我不如大家远矣;但是总结技术学习过程的经验教训,特别是教训,我还是有些心得的。况且,作为一个智力中等程度的人,我的经验可能比很多大牛的经验更有些参考价值。我姑且说之,您姑且听之,不要认为是说教的老生常谈即好。
1、 没有实践,就没有发言权。
我过去在面对操作系统方向的面试者时,常常问到一个问题:“你用的内核调试器是什么?”答案不一,总结起来往往有:
“内核调试器是干什么用的?”
——恭喜您,您是一个没有想法的人,祝您安乐!
“Visual开发环境,gcc,g++”
——你可以不诚实,但是你不能怀疑我也不诚实,既然问了内核调试器,我肯定跟度娘问过答案,胡说八道可不行。
“我用得是KBD/Windbg”
——你靠谱,我随意!是的,我会开始随意问些问题了,symbols,栈指针,prototype,断点设置的技巧,这些都是不错的方向,因为我相信你和我是同一类人,咱们有共同语言。
很难想象一个学习操作系统或体系结构,开发驱动或模块的程序员不会使用内核调试器,就像写C语言的人不懂C编译器一样。不用调试器去挑战内核,难道你是在把3.2.7的代码当14行诗在读吗,韵律感怎么样?
在学习软件技术的过程中,实践操作重过一切,代码量上不去,一切都是浮沙建塔。很难想象一个代码量低于10000行的程序员会对模块化编程的用处心有戚戚焉。如果连模块化编程都弄不明白是为什么,那又谈什么系统设计,面向对象设计,谈什么软件工程呢?
无数的教科书里都讲了模块化编程的好处,然而,请相信我,纸上得来终觉浅,在没有达到一定的代码量之前,你只是知道它能带来这个好处而已。那么,什么时候你开始懂得模块化编程了呢?就是你在编程序的时候突然想把程序扔到一边,拼命的去找专门讲模块化编程原理和技巧的书籍时,你就将入门了。
所有的理论都是用来指导实践的,模块化编程理论是个老技术,但是它却是面向对象技术、设计模式的基石。一样的道理,计算机软件技术大部分都得通过实践去驾驭,学过C++、读过四人帮不代表你掌握了这些技术,只有当你学以致用——想用、需要用、不得不用——的时候,你才能开始掌握一门技术。
此外,你还要明白,编程的实践是会带来切切实实的好处的。参加工作之后码代码换钱天经地义,我说的是大学时候无偿写代码的事。那时我曾经用汇编帮两个朋友完成过大作业,一个数学系的,一个学通信的。直到现在,我需要研究一些算法的时候总会有个教高数的教授帮我抗雷,需要一个好的手机号码的时候总会有个电信公司经理帮我打折。我也知道,以上案例看起来不像很有说服力的样子,看我的杀手锏——我曾经帮我的一个学通信的师妹完成了她毕业设计中代码的那一部分。现在,我们家宝宝的衣食住行都是她帮我打理的。
牢记,黄金屋和颜如玉,对学软件的人来说,都是码出来的!码代码需要的就是时间,你还在浪费时间吗?
题外:
还遇到过如下回答:
“我用Windbg调试Vmware下面的虚拟机,发现过Windows2003的bug,并帮助微软写了patch”
——拜托不要这么强悍好不好,连代码都没有就能搞定bug,让我们这些整天做code reading的人情何以堪啊?“请问您解决的bug相关的KB文章号码是什么?”必须和你死磕了。
夹点儿私货,面试技巧:面试时要信奉万言万当莫如一缄。除非你技术强悍到能够征服他,否则不要和面试官在他擅长的方向上展开技术争论,而是要引导面试官在他的领域里契阔谈宴。对,就是想方设法让他滔滔不绝讲自己的成功经历,而你在旁边呈钦佩状,不时击掌称善,弄得他引你为知己、恨不得请你吃饭那种。据科学统计,武侠和玄幻小说里被高人抢着收徒弟的大部分主人公都具备这样的素质和能力,不可不借鉴啊。
当然,面试的过程你还要证明你至少会说汉语,能够和团队成员沟通,所以不能一直装聋作哑。但是,一定要主意,自己说的时候殚精竭虑的引导话题到你专长的领域里去发挥。知己知彼,扬长避短。
以上为高端面试技巧,适用于具有一定面试经验的面试者针对较为高端的研发职位时使用,应届本科和硕士毕业生慎用,为什么?你知道什么时候该击掌称善吗?你有擅长的方向吗?英文引导这个单词能拼写出来吗?而且针对新人的面试,企业一般重点考察的是IQ、EQ和potential,高端技巧往往用不上。不过,只有了解这一点才可以明白正确的方向,推动深层次面试能力的全面发展。
2、 在一点上突破,境界高才是真得高。
有些同学懂十几种语言,能用二十多种不同的方式打印“Hello World!”,让人肃然起敬,赞叹不已“发烧友发烧到这个程度,非常人所能及也!”然而,这个是发烧友才做的事情,专业人士即便能做,也不会拿这个当什么光彩的事。毕竟,打印“Hello World”这种事情层次太低了。
实际上,虽然我们很少承认自己在学习打印“Hello World”这件事,但实际上很可能并没有免俗。不是吗?请看你的简历,看着上面罗列的语言类技能,精通的至少2种,熟练的不下5,6个吧?问问自己吧,用“精通”的语言,不看参考手册,你能实现一个平衡二叉树吗?用“熟练”的语言,除了按下按钮弹出“Hello World”窗口,你还能做其它的事情吗?你看,被揭穿了吧?必须的啊同胞们,我们这些人当初简历就是这么写的啊,这么多年过去了,看你们还在重复我们当年的低水平技巧,不由得让人感慨,我们国家培养创造性人才的工作确实仍旧任重而道远啊。
我过去的简历上面曾经有说自己精通Visual C++,于是进微软面试的时候,考官说你精通VC++啊,那我们就看看C++本身是用哪几类方式实现虚函数的重载的,VC下面的实现是对什么重要因素妥协的结果?虽然当时(2004年)我已经研究过侯捷老师翻译的《Inside The C++ Object Model》,但是,实践还远远不够啊,代码量太小,离回答这个问题所需的技术水平仍有差距。我只能把其中自己懂得的、大面而不会错的东西都说出来了,接起来就虚心和考官探讨起他在这个领域的最新研究进展,并不时的击掌称善。。。。。。接下来,你懂的,我过了微软面试后第一件事情就是删了简历里面精通C++这个项目。
我之所以反复的提到一些面试方面的内容,是因为面试是在我们这个行业里对一个人技术水平评价最直观的一种过程。技术面试官的最主要职责就是评价你的技术水平。你技术到底行不行,好的公司第一轮技术面试一般就会有个结论了。对于应届毕业的大学生和研究生,好的公司往往会考虑你的IQ,EQ和潜力,考虑你未来能做什么多于你现在马上能干什么。换句话说,我如果发现你C的水平能傲视同侪的话,那么我相信只要需要并给你时间,你学习C++未来能达到的水平也会非常不错。
所以,不要想当然的认为多会门语言多条路,想要毕业的时候有个更好的起点,我觉得还是应该集中精力,让自己的技术水平提高到一定的境界。其实,学软件技术就像挖井一样,必须持续在一个方向上努力深入,直到打出水来。今天换个语言,明天变个方向,你就是在反复在不同的位置给自己挖坑。不出水不是坑是什么,难道能称之为井?
其它技术领域如何深入学习我也并不明了,有关我在操作系统这个方向上学习的过程,包括历程、所需的前置技术能力、需要重点突破的领域等,我会找时间另外形成一个文档,希望到时候能跟师弟师妹们一起交流。
题外话,上面的故事告诉我们一个道理, 夜路走长了总是会碰到鬼的,像PS照片一样PS简历,面试官就会像BS苍蝇一样BS你。面试技巧能让你发挥自己120%的水平,可是如果你本来的水平是0,那么,技巧就让它还归于技巧吧,您还是您!
3、 埋头赶路,也要抬头看方向
我一直在强调学习软件技术必须要加强实践,掌握软件领域的技术,干什么都没有编代码来的实在。然而,就像世界上其它任何需要付出默默努力的事情一样,总有些人会事半功倍,有些人会事倍功半。正练九阴真经郭靖这样IQ清零的小伙子也能成为有为青年,逆练九阴真经欧阳锋这样的有为青年也能IQ清零。
我在大学时代曾经淘到过一件文物,是我这辈子目前为止捡漏最大的一笔收获,回报率逆天了。那时西邮定期会有一些书店来贩卖打折书籍,大部分是Xenix操作系统培训教材之类的——拜托,这是1999年的中国,神圣的大学校园,这种货色是卖来当做草纸的吗?——可是,很奇怪的,我居然在中间淘到了一本书,《编程精粹》,1999年。
不知道怎么形容这本书,刚才我问了一下度娘,现在此类的书籍好像有叫《编程匠艺》之类的古怪名字,不知所云啊,让我们这样的标题党大失所望。只好焚香沐浴,翻箱倒柜的请出这件神物,一看封面的副标题我就有了新的感悟——《编写优质无错 C 程序秘诀》,深刻感觉到此书作者确实是大匠,言简意赅,是靠思想挣钱,不是靠字数糊弄人的。当然,你要是不理解为何我对“优质无错”四个字如痴如醉,说明你的代码量太小,请回宿舍独占机时开始码程序,码到理解为止。
不过这样下去就没法沟通了,还是举例子吧,看这本书我的第一眼收获就是明白了assert这个宏是干什么用的和什么时候用。如果你还不懂C里面的assert有多重要,说明你的代码量太小,请回宿舍。。。。。。算了,我还是接着讲自己的故事吧。
2000年是我大学毕业季,那时找工作不像现在,我们的同学可以中兴华为随便选。而我作为一个中等智力程度,成绩一般,身体素质一般的普通同学,连招聘会投简历的华为柜台都没看到,挤不到跟前啊。在那个季节里,我距离最近的专业软件公司是珠海金山,我得到了面试机会,因为我在笔试那一轮写的链表代码里用了assert这个宏。
虽然我在最终的面试过程中因为一句非常愚蠢的回答葬送了这次机会,但我仍清楚的记得assert宏的威力,面试官显然没有看过《编程精粹》,于是,这成了我的领域,我跟他们一起讨论了下函数接口的防错设计和如何防止数组溢出错误的出现,然后就开始听他们讲金山公司目前都在做些什么工作。在我职业生涯的初期,申请程序员一类的工作时,这本书基本让我无往不利,无论是sybase还是阿尔卡特,当我写下几行防御良好的代码后,负责编码水平评测的考官基本上就开始和我聊天气了。如果你说的和他们是同类语言,他们自然视你为同类,“优质无错”这四个字的威力如斯。
这本书就是让我编码水平提升了无数个档次的法宝,它就是捷径的灯塔。当你努力编码提升自我的时候,一定要抬头看方向,去寻找这些终南捷径。比如学C++的话,侯捷先生的一些文章就有类似效果。如前文所讲,我试图整理自己研究操作系统的过程并形成一个文档和大家交流,当然,我的层次和大牛们不能比,但是,希望将来出来的时候,也能稍有增益。
学习软件技术是个漫长的过程,每一个方向都需要持续的学习,需要恒心毅力。实践,无论是编码还是调试,是这条崎岖之路的基石;始终坚持脚下的路是你能达到远处风景的唯一保障;而埋头赶路的同时,一定要看清楚方向,也要想方设法去分享前人的经验,走终南捷径。在前进的时候感受快乐,享受你美好的技术生涯吧!