在西农-S5: 技术入门

生命如此短暂,掌握技艺却要如此长久。

找了一早上的素材,把自己的 QQ空间 说说看了一遍,感慨万千啊,以前也真够压抑和迷茫的!现在想的以前和以前真实的自己差距还真的是挺大的。现在能想到的总是以前自己得意和开心的事情,那些失意的事、那些讨厌的人早就忘了差不多了。 上篇文章写的实在太少了,今天周六时间充裕一些,就多写一点吧。

我本来打算的是按照时间的顺序往下推(大一、大二、大三、大四),写了几篇之后发现这种叙事方法太乱了,我也不擅长。我擅长的是围绕着一个点(主旨)发散思维去展开来讲。所以后面尽可能分成不同的主题,也就是相同的时间上分不同的维度。


技术上的入门

大一上学期,唯一的专业课是 C语言,耿老师(一个我敬佩的老师)带的,很多人都喜欢他的讲课风格。就连峰子也表示耿老师的课他一节没拉下。而我不太喜欢,很多课都睡觉睡过去的,主要是这课没让我感觉到快感(听不懂)。

一个引申命题是:计算机的入门语言到底适不适合选择 C语言?

不同成长经历的人,理解上差距很大。大学课程的设计出发点应该是:学会C语言,其它语言都不在话下了。我对C的理解是:一门语言本身简单(没那么多的语言特性,面向过程),又难以理解的语言(主要是指针、内存管理),还有一点:如果抛开系统谈C语言其实就没什么可谈的了。 相比 Java 这种跑在虚拟机上的语言,它的确难理解的太多了,但是一旦你掌握了以后,学习任何语言都要比别人理解的更深一层。就好像别人还在费劲理解 Java 语法层面上的东西的时候,你已经在了解虚拟机的下面的深层实现机制了。

对于一个将要写程序很多年的人来讲,C语言几乎是一门必须要掌握的语言;但是对于一个初学者,兴趣和积极性可能要更重要一些,初学者很需要一个正的反馈,不夸张的说,C语言用一行 "Hello,World" 把很多人挡道了门外。 这两者是自相矛盾的,所以我一直以来也没得到一个自己认可的结论。

虽然大家 C 语言学的很认真,还有很多人拿了高分,但实际上没几个人能够上机写出一段能够成功运行的程序。祥子、陈东坡、ymb、hanxiao 等人算是例外吧,他们是最早一批开始写程序的人。

这一点点的优势在后面的数据结构的课上被放大了(优势累积,在生活中也处处可见,很多事情的区别不在于开始了多久,而在于别人已经开始了,你还在傻站着)。大一下学期开了另外一门很重要计算机课程:数据结构。 数据结构是蔡老师带的,再后面的 C++与面向对象 也他带的。值得一提的是,他的课我从来没逃过一次课,没睡过一次觉。

蔡老师从国外回来没多久,有想法,还有激情,PPT 用户体验也很赞。然而,他做一个不知道未知正确与否的选择:我们的数据结构是用 C# 上的,而不是C。

崩了……,C 还不会,现在又搞出一个 C#。最终导致的结果是:上课听的很开心,也大体知道数据结构是怎么回事了,就是不会怎么写代码。这个时候,大家纷纷做出了自己的选择,祥子、东坡他们选择的是用 C 实现;ymb,lyl 等人选择的是 C# 。

印象中,祥子、东坡、ymb 是当时能够用 C/C# 写出完整数据结构代码的人,也是最早一批被蔡老师去“做项目”的人。大一能跟着老师做项目,这个殊荣让大家羡慕嫉妒恨。

这里要提一下:祥子在对技术的理解上,很本质,即便是当时,也远远超过很多人很多年了。当时蔡老师分别找他们谈了之后,东坡和 ymb 留下了,祥子拿了钥匙但是一次都没去(也挺不厚道的)。

我问过祥子,为什么不去呢,祥子的回答是:“过去其实就是给人家干活。。我才不去。。”

何谓“做项目”?做项目是跟着一个老师混的简称,祥子的理解有些对但是偏激了。学校有些惯例,一些老师(教授啦,副教授啦)会在大一、大二学生里找一些底子不错的学生培养,在办公室提供一个相对良好的学习环境,最终目的可能让他当自己的研究生或者送出国之类的。 如果说老师们没有一点私心是不可能的,但是对于学生来言,提供一个环境,有人指点一下,这样的机会还是挺好的。至于如何培养,不同的老师玩法不同,有的老师会让看论文,有的老师会把自己手上的项目分一部分给学生去做,还有的老师要求严格一些有定点任务。

当时的我在干嘛呢?既没有搞数据结构,也没有搞 C#,而是在学习上学期的 C 语言。人家在学 C 的时候,我没学;人家在学数据结构的时候,我在补 C 语言就这样大一结束了,C 没学会,C# 也不会写,数据结构也没学好。 这是一个悲伤的事实。

蔡老师选择 C# 是否足够好?其他人不敢说,学渣们觉得这是极好的。学院规定在大一是不能带电脑的,大一下学期早就有人按捺不住了,大家都缺少一个契机,也没人愿意第一个吃螃蟹(万一被没收了可咋整呢)。 蔡老师间接的给了这个机会,C# 要用 VS2008,学校的机房没有 VS,可是我们要写代码啊、要写作业啊、爱学习啊,那怎么搞?没环境怎么写?那只能自己买电脑了。 陈东坡是第一批带电脑的,虽然很低调,还是被我们发现。没过几天,我和 chenyu,X 就直奔西安赛格电脑城拿到我人生的一个台式机(HP)。

要放暑假之前,我在图书馆借了几本书,琢磨着这个暑假我要干一番大事,所以暑假就没回家(大学的三个暑假都没回家)。

这个暑假确实干了一件大事:把《仙剑奇仙传4》打通关了,哈哈。

暑假有将近两个月的时间,没用多久仙剑 4 就打完了,实在无聊,又开始打仙剑3外传,仙剑3。前面说从图书馆借了几本书,有一本是《C语言标准程序库》,非常枯燥,看两分钟就开始困了(我一看书、看文档就困,这个习惯看来从一开始就有了),没看两天就困了。

还有本书叫《C++入门经典》,还真是入门,挺简单的。

李老师(班主任) 一直对我挺好的,我问她编程方面的东西,她给了我蔚老师(weijicheng)的QQ号。传言蔚老师(weijicheng)是一个动手能力极强的老师,对学生挺好的,只是他没给我们带过课。 有个学生跟蔚老师抱怨说学院的作业管理系统提交不了作业,蔚老师没有帮他解决,而是告诉这个问题自己都搞不定还怎么当计算机专业的学生……

和蔚老师在QQ上聊了很多,但是对于一个对计算机程序一点概念的人来讲,说什么都是没用的。所以唯一有用的是:他给我推荐一个 C++ IDE codeblocks 。后来我的所有 C++ demo 都是用 CB 实现的,找一个对 C++标准 支持好的 IDE 很重要。

就这样,我有了一本书和一个标准支持良好的编程环境。那个暑假,每天的生活就是起床打游戏,打累了看会书。用将近两个月的时间把这本书看完了,基本上把书上的代码敲了一遍,笔记写了好几本(大四走的时候都不忍心扔)。

似乎所有的开始都是无意的,好像自此以后一切都变得那么的顺利。

大二开了很多专业课,让我 “崭露头角” 的是面向对象程序设计。一个暑假的不经意的学习,让我突然间和别人拉开了差距。大家上课的时候还是跟着学校的小薄教程学语法的时候,我已经开始啃《C++ Primer(第四版)》了。 蔡老师的课上会留一些课上编程作业,大家在纸上写,发现写的好的就上台实现、调试、运行。而我,成了常客。

蔡老师是一个很会鼓励人的人,他常说的一句话是:“同学们既聪明又勤奋,这点作业应该难不倒你们吧……”。有一次他把我吹到别的专业了,让人哭笑不得。信管有个女学生跟他说:“老师,快考试了,怕考不过可怎么办啊?”。 他说:“你要是C++像计算机1班的张杰学的那么好的话,什么考试都不用怕……”。然后那个姑娘就问我们班的女生,张杰是谁啊……,这件事情是 zq(女友) 讲给我听的。这些“虚荣”逐渐让我累积了自信,也让有了进一步学下去的动力。

从我的经历回过头来谈论一下入门的问题:计算机专业并不是一个很容易入门的专业,刚开始需要一步一步的树立自信,需要别人的帮助、认可和鼓励。每个人都会遇到几个阶段:不知道自己不知道,知道自己不知道,知道自己知道,不知道自己知道的阶段。 不知道自己不知道是最难的阶段,也就是尚未入门,搜资料不知道怎么搜,都不知道问什么,跟别人表达表达不清楚。也就是说如果你旁边有人问你一个你觉得特别简单的问题的话,即便你再不愿意回答,也不要直接否定他。 一旦入门之后就进入一个良心循环,自己知道自己的缺点,知道怎么弥补,认可和鼓励就无所谓了,有的时候甚至会觉得是个累赘。

张老师(zhm)

大二上学期,很多老师都在挖学生,蔡老师找过我,我拒绝了,因为在当时我和他的很多观点是冲突的(这冲突并不影响他在我心里是一个不错的授业者的事实)。

有一天晚上,libo 跟我说她的一个学长 chenxian 在找两个大二的学生一起做项目,你看你 C++ 学的那么好,要不要去试试。我当时的想法是我什么都不会呢,跑去不是丢人么,但是不去吧,心里又有点不甘心。 于是,我答应了,还替祥子答应了。当时虽然我菜吧,但是我能看的上眼还真只有祥子一个(尽管祥子以前跟我说过他不想跟任何老师,我还是替他答应了,因为我了解祥子的性格)。

当天晚上我强拉着祥子去 3 楼找了chenxian 聊了一下,感觉还好。三个大三学长的加上我们两个的,一共五个人,跟着张老师。当时应该是打算开两个小组。顺带一提:chenxian 是一个我见过唯一一个学习成绩(平均成绩90+)和动手能力兼具的人,而且还经常参加各种课外活动。 在他们那届也算小有名气,最后报送浙大了。

没过多久,3 个学长都打算考研,就离开了。就剩下我和祥子两个人了。我现在觉得他们的离开对我们未见得是一件坏事……

我和祥子跟张老师混了2 年多,说实在的我们没帮到张老师什么,倒是他帮了我们太多了。他是大学里影响我最深的一个老师,也是我最应该感谢的人。他也坦言,我们两个和 chenxian 是他遇到最好的学生。

人常说,身教胜于言教,尤其是对于像我这样的人,我属于那种典型的你越逼我越不做,别跟我讲道理,道理我自己会琢磨的(犟)。张老师是这样一个人,只是会给一些建议,然后以身作则。在北京时候,dingliang 是这样的人,在上海 maliang,guangyu 也是这样的人。 他们的共性就是不会给你讲很多道理,跟他们一起工作你就能学到很多。所以说,跟优秀的人一起做事,就已经在成长了。我发现别人身上一些习惯很容易影响到我,比如有的时候下班会磨磨唧唧就是跟 dingliang 学的,哈哈。

很多学生去找老师做项目第一件事情都是看论文,张老师知道我以后要找工作不读研,喜欢程序讨厌论文,两三年的时间没逼我看过一篇论文,很多都是他看了,讲给我们听,然后我们去实现。

我和祥子好像一共跟了两个科创项目(一年一次)、拿了一个软件著作权、一个学校挑战杯三等奖、还有一些杨凌水保所的项目。这些机会不是每个人都能遇到的。不过这些对我来讲不是最重要的。

软工的教师办公室很大,能让我有机会认识更多的老师。我刚去的时候,张老师大体跟我说了那些老师是干嘛的,你要有问题,就直接问对应专业的老师。 他当时还说一段很有意思的话:“老师和老师的关系和学生和老师是不一样的,我们有一个问题要问别人的话,因为大家都是搞科研的,有的老师可能会所有保留;但是你们不一样,你们是学生,老师一般遇到学生会把自己会的毫无保留的讲给你们听,因为老师教学生是天经地义的”。 大三的时候,他出国了,我直接霸占他的工位,有个安静的环境,还能免费上网,真赞!能够有机会和西农信工的大部分软件老师沟通,请教一些技术和职场的问题等等。 总结,做实事的机会,安静的学习环境,可以请教的人,这些才是对我真正有益的事情。

关于祥子

大二下学期和大三一年是我成长最快的一段时间了。张老师一直用的是 C#,而且用 C# 开发也确实快,所以我们也跟着用 C#。祥子是认真学过C#的男人,一本《C#高级编程》被他看完了,但是祥子是不学 C++ 的男人(怒)。

我们的第一个科创项目具体是什么,我忘了,大体是 基于XXX算法的坡度坡长计算(GIS领域),也就是写一个工具,实现某一个算法。有两种语言的伪代码和几个算法,看懂伪代码,然后分别把几个算法实现,验证并对比优劣。

基于对语言的情怀,我和祥子给张老师做了一个 C# 版本,自己私底下写了一个 C++ 的版本,哈哈。C++的版本还用 Windows API 绘制了一个伪 3D 的计算结果地图,觉得超级好看(虽然实际上这个没什么用),后来用这个参加了学校的挑战杯比赛。

我和祥子一起搭档了很久,职责分的很清楚,技术方向不一样,也是性格差异的一个体现。

祥子从大一就开始搞C语言,他没怎么深入学过C++,数据结构和算法、操作系统、编译原理这些理论课他学的都很好。从看的书就可以看出来,我经常拿他来跟别人吹牛逼,他是我见过的唯一一个能坚持看完: 《Windows程序设计》、《Windows核心编程》、《COM 本质论》、《编译原理》(龙书)…… 的人,而且全是纯英文版,每本书厚的都可以垫电脑了,还有很多数学相关的书籍。他学东西很踏实,一步一个脚印的走。

反观我,C 语言没怎么学,主要学 C++ ,MFC 框架研究的清楚(底层就是Window API),基本的数据结构和算法,操作系统一般,数据库和计算机网络很渣,但是汇编很好。等到大三的结束的时候,基本上所有的 C/C++ 经典书目我都读过一遍。 我学东西很浮躁,和性格一样,喜欢的会学的很好。

祥子的优势在于踏实,技术功底扎实,缺陷在于表达和审美(那次挑战杯比赛,lijianliang老师跟我说,你们这个出校参加比赛我没大把握,但是拿个校级一等奖还是没问题的,有论文又有软件,还有著作权。 只是没想到你们的PPT做成那样啊,也没讲清楚,我作为评委都看不下去了,何况别人)。我和他恰好相反,去水保所跟他们沟通需求都是我去的,软件 UI 也是我做的,底层算法实现和攻坚是他做的。也正是因为性格和技术上的互补,我们两个可以一直搭档。

大二下学期,我问他你觉得一个毕业生应该具有什么样的技术水平。他说了一句堪称远见的话:“一门高级语言、一门脚本语言、一个熟悉的调试工具、一个操作系统平台,一个熟悉的开发环境……”。 我在我的文章中曾经多次引用过这句话,这句话可谓恰到好处,对一个毕业生来讲,不算很难也不简单;对于企业来讲,有这样水平的人,过来稍微熟悉一下业务就可以直接干活了。

有个奇怪的现象,我和祥子一起去图书馆或者自习室,去的时候开始睡,走的时候都需要我叫醒他,从无例外。有的时候我都在想,这货是不是故意迷惑我的,一个人上自习的苦下功夫,和我上自习的时候睡大觉。不过具体怎么样,也都无所谓了,因为高手总是如此!

所谓高手就是你只能看得见他高超的技艺,确从来不让你看到他的努力,给你造成哥从来都不努力但是都比你强,一旦哥努力了还得了的假象?!而真实情况是他总是一个人默默的看着书、瞧敲着代码。你看到的一次成功,可能他已经暗地里尝试过无数次了。 不要问我为什么知道……因为我就是知道……

毕业之后,我工作了,他在北邮读研。现在已经毕业在搜狗工作,我始终觉得留在公司做开发可能不适合他,他应该有更好的平台去更有价值的事情。不过关于选择这件事情,谁又能说的清楚呢。总之,前路漫长,祝好~

张杰

2015/12/19


2019-09-14 10:30:16 update:

去年我跟祥子都在杭州了,昨天中秋叫祥子过来吃了个饭,他已经不在搜狗工作了,目前在阿里,具体干啥的,我也没问。