标签:
老王正式工作快10年了,前一段时间有幸去给母校的学弟学妹们聊了聊人生和理想。回来以后,有学弟学妹问我该如何学习。老王于是很认真的思索了这个问题。后来做了这样一个假设:如果让我讲讲所熟悉的互联网技术体系架构如何学,我该怎样讲?
老王顿时觉得有些紧张,虽然在二百(百度和百词斩)做了不少关于互联网Server的工作,也做过一些总结,但是这个话题实在太大太深厚了,要聊的东西实在太多(百度搜索“互联网服务端技术”的结果大约700万条),需要有相当的积累。老王是一个做技术的人,不太喜欢复杂和虚幻的东东,凡事都喜欢把问题往简单实在了想和做(Linus said:Talk is cheap. Show me the code.),于是赶紧摸出小本本,开始边想边画,思索有没有相对比较简单的方法把这个事情说清楚。经过好几天的思考和修改,画出了以下的一张图(以下的图只代表老王自己的观点,由于眼界和阅历有限,如有不妥,请指正~)。
在老王的思维里,要学习互联网服务端的技术知识,在广度上,以上的东东大体涵盖了相关内容;在深度上,根据要求不一样,对于上述内容学习的程度会有不同。比如,如果你是个人web服务业务的研发人员,可能只需要对编程语言、框架和数据库有一定了解并能运用就可以了;如果是一个大型购物网站的架构师,可能以上内容都需要比较深入的研究。
好了,有了这个蓝图,老王想接下来细细讲讲每一个部分的内容。每一部分内容,老王都准备分成:初级、中级、高级三个级别的能力要求来分析。如果愿意,跟着老王一起来吧~
·语言(language)
我把语言放在了所有这些的首位,因为语言是做一切的基础,他是你表达你内心思维的手段。老王经常打比方,语言好比就是武侠里面的各种剑法、掌法……你要把你的内功心法表达出来,需要通过他们来落地。
现在流行的语言很多,c/c++、 java、 php、 c#、 obj-c、 python、 ruby、 perl……这么多的语言可以罗列半天。而不同语言有各自的适用范围和优缺点(前一段时间,有不少盆友总结了多个版本的语言鄙视链)。老王写过c/c++、 java、 c#、 php、 python、 javascript、 scala和shell脚本,用的比较熟的是c/c++、 java、 js和shell脚本。最喜欢的是java,因为服务器、客户端都能用,而且语言本身语法不复杂(大家嫑搬出鄙视链来鄙视老王哈^_^)。
老王觉得语言不用学太多太杂(那么多的语言,都要学一遍,多难受啊),最重要的是学好两个东西:一个是精深一门语言,一个是编译原理。
[初级能力]
会用一门语言是最基础的,就跟农民伯伯要种田,最首要的是会挖土一样。了解语言的语法、会用常用的库、写出基本的逻辑,这个算是对码农们最基础的能力要求,就是维持温饱必须要的东东。
[中级能力]
除了用语言去写基本功能逻辑以外,我们经常还要去解决一些深入的问题(比如:java内存泄露、c/c++的core dump、javascript的兼容性问题等等),这就要求我们学精深一门语言。要做到这一点,不光要学习语言本身的语法,还要学习大量的基础库、公共库和第三方库、运行框架、编译器(解释器或虚拟机)运行原理等。就跟学英语一样,字母、单词、发音、语法、句法等等。这是一整套体系,只有这一套体系了解的比较清楚了,才敢说对xx语言比较熟悉。有了这些能力,就可以说在一个语言体系中是半个专家,基本也可以奔小康了。
[高级能力]
当对一个语言比较了解以后,就可以学习一下编译原理。编译原理是学习怎么学习语言(Learn how to learn a language.),他告诉你代码是怎么样从一个个字符变成机器指令的,这个学通了,学会的就不是“鱼”而是“渔”了。学编译原理的最好办法,就是自己写一个简单语言(比如c语言子集)的编译器(虽然写的会很难受,但是一旦写成,就会恍然大悟:哦,原来是tmd这个样子的啊)。会这个,你可以去完善一个语言,去加入某个组织制定新的标准,亦或是设计属于自己的一个全新的语言。
之前面试程序员的时候,经常会看到这样的简历:“精通java、c#、python、php……等多种语言”。老王不禁感叹,能真正熟练掌握一门已经是非常难的事情,要精通N门语言,只有两种可能:要么是天才,要么简历写的过了。
总的来说,语言是一个做计算机技术码工最需要掌握的基础知识,老王个人觉得对他的了解,不需太杂,关键在精。如果想求温饱,会用一到两门语言写出业务逻辑即可。如果想在这方面有所建树,就需要对原理性的东西多深入了解+实践。
·算法和数据结构(algorithm & data-structure)
我面试过大概几百个程序员,算法和数据结构绝对是让无数码工吐槽最多最深的东东:我们平时工作就搬搬砖、写写逻辑,又不用上什么树啊、图啊之类的,学那么多算法和数据结构干嘛?!
老王当年不算认真的搞过acm(全称:acm/icpc,中文:国际大学生程序设计大赛),也在外面拉过项目,当时也是觉得,acm那些算法在实际工作中几乎没用,就用来弄弄比赛,装个B啥的。后来去了百度,进去没多久就参加了一个工程优化的比赛:我们熟悉的搜索技术遇到了麻烦,就是网页搜索有很多的结果,需要把这些结果做归并排序,然后将topN的结果展示给用户。由于线上请求量巨大,需要对排序的效率做优化,保证请求反应速度尽可能的快,消耗cpu资源尽可能的少。在那个优化比赛中,老王除了收获奖品以外,还意识到二分搜索、各种排序等等算法和数组、链表、树等等数据结构原来在实际项目工作中可以有这么大的用处。后来有经历了其他的一些项目,用到了诸如dfs、bfs、dp、trie树、bk树等等。
[初级能力]
想把一个东东做出来,以应对逻辑开发的需要,其实不用太了解高深的算法和数据结构。只需要把常用的算法(比如:排序)和常用的数据结构(比如:数组、链表)知道怎么样用就可以了。一般语言都有库,会调用他们即可。
[中级能力]
如果想把一个东东做好一点,代码更优雅,执行效率更高。就需要更深入的去了解一下常用的算法和数据结构的原理。比如:数组和链表有什么区别?他们各种操作的时间复杂度是怎么样的?在哪种情况下适合用数组,哪种情况下适合用链表?HashMap和TreeMap有什么不一样?等等。
[高级能力]
如果你是一个大型网站的技术负责人或者核心系统的负责人,可能就需要对算法和数据结构有比较深入的了解了。不但要了解基础的算法和数据结构,还要深入的掌握一些高级的算法和数据结构,让你的代码或者系统跑起来就是要比其他人的每次至少快千分之几秒。为什么?因为如果每天有上亿的请求,你的千分之几秒就变成了每天几十万秒。这有可能就是对产品用户体验的直接提升,也可能就省下了N台服务器。
算法和数据结构其实是很能考量程序员能力的一个部分,所以很多牛逼的公司都把算法和数据结构作为考察的重中之重(我有一个朋友写了一篇关于去硅谷面试的面经,里面就很重的谈到了硅谷的这些公司对算法和数据结构的要求,我看看什么时候分享给大家)。从老王的经验上讲,学好这个本事,会终身受益(老王当年一起搞acm的盆友们,绝大多数现在都去硅谷了)。
那怎么学?如果只是基本要求,可以看看基础库里基本算法和数据结构的实现代码,自己没事儿的时候照着写写。如果对自己有很高的要求,可以看《算法导论》3遍以上 + 几个著名高校的acm online judge(在线评判系统)练习100题以上。做完这些以后,你就不光只是一条好汉了,而是一个内力深厚的硬汉!
·框架(framework)
要做好工程项目,写好服务器代码,除了语言以外,框架是另外一个必修课。比如,我们要做web开发,java至少要了解一下J2EE的东东,懂tomcat、jboss、resin、jetty等等这些中的至少一个,否则就只有自己从轮子开始造起。高级点的,还要去了解一下struts(原来还有webwork)、spring和hibernate等等。而ruby的开发,可能需要了解rails,php需要了解zend或是symfony等等。
这些框架帮我们把基础的网络连接、http协议解析、路由转发、会话管理、事务管理等等都做了很好的封装,让我们开发起来更顺手和容易。因此,如果对一个框架足够了解的话,会让开发像坐上了火箭一样快速(避免被产品经理拿着棒子在后面追着跑^o^)。
不过框架自身也有优缺点,比如很多框架为了功能大而全,用起来就比较笨重,牺牲了很多效率,配置起来也可能比较麻烦(导致入门成本高,口里就会不断默念:我擦……)。所以,很多对效率要求比较高的公司或者服务,一般都会自己写一些框架,来取得功能和效率的平衡。
[初级能力]
为了开发业务逻辑,我们只需要掌握他的使用,会安装、会配置、会运行即可。让基本的逻辑能够轻松的跑在框架上。对于通用的一些框架,我们只要百度一下,便能够相对比较轻松的hold住(不过有些配置真是很烦很杂,不过没办法,为了要用他,只有痛苦一次)。
[中级能力]
如果框架提供的基本功能有些时候不满足我们需求的时候,或者出问题的时候,我们就需要知道他的部分工作原理,能够定位,去判断是哪里产生的原因。同时,可能还要会一些高级的用法和组件,减少开发量,提升执行效率等等。比如,框架是怎么做路由的、怎么解析http协议参数的、cookie是怎么存放的、session是怎么样管理的,等等。
[高级能力]
如果你掌管一家中大型公司的技术,很有可能你会带领团队重新写一套适合相关业务的框架。这个时候,就需要你完全掌握对于语言常用框架的工作原理以及他的组件,方便你在使用的时候,对他进行优化,甚至直接重写一套。要具备这样的能力,说难也难,说不难也不难:其实就是去仔细阅读这些常用框架的代码,分析关键点,思考他们设计的逻辑。我曾经读过一些框架代码,有写的好的,也有写的不是特别好的。不过每次读完,都有新的收获,帮助我对框架有了更深入的了解。
工欲善其事,必先利其器。学好用好框架,会对我们的开发效率有极大的帮助,如果能掌握他的特性,了解他的工作原理,对我们提升执行效率也会非常有帮助。所以,建议大家对于框架,还是要有一定深度的了解。
=== 暂时休息的分割线 ===
因为这篇文章饱含了老王多年的心血(此处应有掌声),写的可能会比较多。为了让大家看的轻松些,老王打算拆分成上中下三篇来写和发布。
中篇准备介绍操作系统、数据库和网络相关的东东,而下篇则会更偏重工程中遇到的架构、组件(比如:消息队列、内容聚合系统等)。
如果对这几篇文章有兴趣,欢迎大家继续关注老王的微信:simplemain
=== 美的分割线 ===
老规矩,文章末尾上一张老王自己拍的美图:这一张是我2010年环青海湖骑行拍的一张落日,当时感觉还不错,分享给大家~
标签:
原文地址:http://blog.csdn.net/zgwangbo/article/details/51245963