程序员入门之路

2019-04-29 16:34:49 浏览数 (1)

1

我大学的专业是软件工程。那个时候(我09年毕业),ACM等各类算法竞赛在大学还不是特别地流行。专门搞算法的同学不多,我也没有特地去训练和参加算法竞赛,所以我有很多的时间。然后这些时间都被我花在了自娱自乐的项目和看各种系统的源代码上了。

我看得最多的源代码是linux 内核。

看linux内核源码,于我算是件很享受的事情。

我天真地以为内核几乎包含计算机工程所拥有的全部知识和技巧,觉得只要能看完并学会内核的全部,就可以天下无敌。虽然比较天真,不过这种天真却带来了极大的兴趣。

一开始接触内核,是因为在逛图书馆的时候,无意中发现了 毛德操 老师的 《Linux内核源代码情景分析》, 厚厚的一本书。记得书的开篇,讲了linux 内核里面,用C的宏,巧妙地封装了一套链表的操作。当时觉得很神奇,然后就借回去宿舍看了。

一开始看得云里雾里,连linux 是个啥都不知道。

后来慢慢了解了linux , 还知道了 linus 这个传奇人物,特地去看过他的一些历史事迹。从他的各种访谈中,又发现了 minix, 还有一本由 Andrew S.Tanenbaum 教授写的《操作系统设计与实现》。 当年linus , 就是受到 minix 的启发,开始了linux 项目,如今linux 却几乎统治了服务端。

少年虽然天真,但却满怀梦想。当时的我,对linus的事迹,对linux 操作系统和minix ,真是到了超级崇拜的地步,所以脑子一热,就有了一个神奇的想法,自己也要写个操作系统。

不过,自己知道,操作系统是个很复杂且庞大的东西,不是一时半会就能写出来的。那时候,自己也不急,一有空,就看看 《Linux内核源代码情景分析》,或逛逛 minix 的网站,或瞄瞄linux kernel 的源代码,没有什么规划,也没有什么压力,就这么看着。

一段时间后,开始知晓,写个操作系统,除了需要会C语言,还要会汇编语言。后面就找了一本 《汇编语言程序设计》开始看,边看也边照着书上的例子抄。

汇编学起来,比C要枯燥,特别是一个简单的操作,用C语言,一句就搞定了,汇编还要写一堆,不过还是慢慢学了下来。

再后面,发现只会一般意义的汇编还不行,那样只能让你的内核跑在实时模式下面,而无法跑在保护模式下。(这两个概念,感兴趣的自己查查吧 :) )

然后,又开始找了相关的书和资料,开始学保护模式的汇编,这个在我印象中应该是最蛋疼的东西,即使现在来看也是。

在这过程中,无意中发现了一本神奇的书 ,于渊 的《自己动手写操作系统》,发现里面的内容跟自己想要做的事情相当的接近。当时,有过一段时间的犹豫,要不要看这本书,因为当时想要完全自己来的,不过后面实在是太困难,就参照了不少这本书上的实现。

写操作系统的过程和看linux kernel 源代码的过程交叉进行,还是那种没有明确目的,自娱自乐的项目。持续的时间很长,有三年多的时间,不过整个过程都挺开心的。所以,当我回过头来,我觉得大学,是我人生最开心和充实的阶段。

当然这中间还穿插了很多其他的事情和项目。比如,自己去网上找了拳皇的素材,做了个格斗游戏的demo,学了点windows 的 MFC , COM, DirectX ,全平台的OpenGL, 尝试过做3D游戏等等。

不过确实也奇怪,我对微软的东西一直不太感冒,甚至有点反感,可能也是受到不少linux 开源思想的感染吧,对闭源的windows 感冒不起来。

操作系统做到后面,实现了键盘驱动,内存管理,进程创建,调度,系统调用接口,还有自己写得一个简单的文件系统。当时本想再写个窗口系统的(类似Linux 下的 X window)。把自己的想法说给了隔壁宿舍的一个同学听,他很感兴趣,想加进来一起搞。我超级开心,觉得项目踏出了一大步,终于不再是一个人了。

没过多久,就到了找实习的时候,后来那位同学忙着找实习,也就没有再理会了。

大三的时候,腾讯来大学城招实习生。自己投了简历,参加了笔试,但在笔试环节就被刷了。

后来很不甘心,就去霸面,结果凭着自己做的那个操作系统,直接过了两轮的技术面试,最后成了腾讯首批实习生的一员。

2

我现在去总结那时候的情况。可以这么说, 大学时期的学习方式太野,全凭兴趣。虽然自己的涉猎面很广,对于感兴趣的部分,也学得深入,但是没有做专门的训练,比如算法训练,代码训练,导致一旦遇到这部分,就容易被卡死。

当然,像算法素养,编码素养,这些词,我也是后面才听说的。后来才意识到,算法厉害,代码写得规范的人,都不是天生的,而是刻意训练的结果。

工作后,也花了不少时间去弥补,不过终究还是不能跟专门搞过ACM的同学相比。

大学时期,因为看了不少源代码,包括linux kernel, mysql,tcp/ip ,所以我后面做基础架构的时候,对系统的理解要比一般人深入,工作起来也比较游刃有余,这也算是歪打正着了吧 。

现在回过头来总结,觉得做工程技术的同学,有三方面的基础素质是必须要打牢固的,不然就容易在某个点上卡住。

基础部分

这里除了我们常说的各种基础知识,比如操作系统,网络,数据库等的概念,知识外,还包括实际依赖系统的实现机制。

比如,你是在linux 系统上进行服务器开发或维护,你对linux 的内部实现机制不熟悉,肯定要栽跟头的,而且路会越来越难走。再比如,你用java, 如果对JVM 的内部实现机制完全不懂,或所知甚少,要往深,往专了做,也是很难。 andriod 开发,也需要理解andriod 系统本身的实现机制。

所以这里是包括了书本知识和实际依赖系统的具体实现机制。

书本知识的掌握,一般靠看书,看文档视频等。

依赖系统的具体实现机制,如果是工程经验丰富的同学,可能从相应的书或者文档也能大概推导出对应的代码实现,如果时间不足够,可以只看书,不花费太多时间去看源码。

不过,如果是工程经验不丰富或者刚毕业没多久的同学,还是建议边看书边看源码。这种情况,只看书很容易看得云里雾里,看完很快就忘了。如果边看书,边看代码,就能从原理到实现都完整地过一遍。知道了代码的实现,就相当于是把一个思路变现了出来,不容易遗忘,而且清楚更多的细节。

算法基本功

这部分一直是我的短板,后面断断续续去弥补过一些,不过还是太过于业余,应对工作算是没有什么问题了。

我在学校时候,是认认真真学过算法的。虽然基础的数据机构,基本的算法,细节不一定都记得清,但大概印象是有的,所以我是直接就刷题,从简单的刷起,对一些概念,比如二叉树,堆等的概念记不清的时候,就翻翻书,复习一遍后再刷。

但对于没有学过基础数据结构和基本算法的同学,建议不要一来就刷题,还是买一本算法书,先好好看看,可以避免很多的弯路。

刷题很枯燥,有时我也不太喜欢,不过后来我学会沉下心来,不贪多求快,我就慢慢地,一题一题刷,时间不够就不刷,时间够就多刷点,时间长了之后,就慢慢顺起来了。

编码素养

编码素养的培养,这里建议多看一些软件工程,代码质量方面的书,类似《代码整洁之道》,还有就是多看一些好的开源项目的源代码,单纯不断地写代码,编码素养是很难提高的。

这个是习惯和意识问题,如果你不知道怎样的代码是好的, 你写得再多,也很难写出好的代码来。

要有意识的培养这部分。

结尾

大学校招的时候,我误打误撞的进入了腾讯,刚开始做过QQ,后来参与微信,一待就接近十年了,中间也发生过很多事情,有空再说说。后面,我去总结大学时期,学习的情况,发现自己“偏科”了,漏了算法和编码方面的训练,这也导致后来栽了不少跟头,希望有缺失的同学,可以重视起来。基础知识方面,文档或书,结合源代码看,带来地效果更好,本人亲测,效果杠杠的。有兴趣的同学可以试试。

END

0 人点赞