互联网服务端技术——如何学(上)

老王正式工作快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年环青海湖骑行拍的一张落日,当时感觉还不错,分享给大家~

时间: 2024-08-07 16:38:40

互联网服务端技术——如何学(上)的相关文章

互联网服务端技术——如何学(中)

boys & girls,我们的中场休息结束了哈,赶紧搬板凳继续听老王扯技术的淡~ (悄悄的广播一下:如果没有看过上一篇的同学,请关注老王的微信simplemain,或者拉到本文末尾扫描/识别二维码) 上一篇,我们谈到了互联网服务端技术的整体蓝图.同时顺着这个蓝图中,介绍了语言.算法和数据结构.框架具体有哪些要求以及怎么样去学习他们.接下来,老王准备介绍另外几个比较基础,又在工程中大量使用的技术.具体是什么呢?我们接着往下看.首先我们还是把那幅蓝图摆出来(开始装B啦~). 聪明的同学一定已经发现

互联网服务端技术——如何学(下C)

老王又在周日的下午来骚扰你了,今天给你带来的应该是这个系列的最后一篇~ 前面该铺垫的都做的差不多了(如果没看过老王之前的文章,请打开微信关注:simplemain),今天给大家聊聊很现实的.距离大家平时生活接触到的一些技术. 题外话:老王一直这样认为,计算机科学是一门实践科学,脱离了实践的计算机技术大部分是扯淡的(比如:中国高校的大部分毕业论文).好吧,跟老王一起来吧~ 今天聊的是一些通用的分布式系统的架构设计:动态聚合系统.内容检索系统.通用评论系统等.这里面有些是老王实际做过的,有些是老王自

互联网服务端技术——如何学(下A)

时间一周周的真是过的好快,又到老王扯技术淡的时间了,快回来听老王扯淡吧~ 当年老王刚刚走出学校踏进社会的时候,一个百度的老同事(人称瀚哥,虽然不是我的直接导师,也可以算半个了,后来对我帮助挺大的~)就问我,觉得在学校的时间过的快嘛?我说快啊,你看这本科+研究生七年,一晃眼就过了.他说,你来工作了就会发现,工作以后,时间更快.现在回想一下,我工作都8年了,当年进公司的那一刻还历历在目-- 不知道为啥,突然就写出了上面这些文字,可能是人老了都爱回忆往事吧.好了,不扯闲淡了,开始我们的技术话题吧~ 老

互联网服务端技术——如何学(下B)

今天想跟大伙儿聊聊分布式组件.说到组件,老王当年就觉得是高大上的玩意儿.一听说谁谁谁在哪个公司,写某某组件,仰慕之情犹如滔滔江水延绵不绝~后来自己也写了一些所谓的组件以后,觉得这个并没有什么神秘的.所谓组件,老王是这么理解的:为了一个整体的环境能够完整的工作,而提供的一些功能相对独立.目标明确.有可能通用性强一些的函数.类.库.模块.系统或者服务等等.比如,你写一个打印的函数,提供给文字编辑的软件使用,你的函数就可以叫做打印组件:也可以提供一个打印服务给文字处理系统,你的服务也可以叫做打印组件.

为什么好多人想学Python 怎么快速学会高端技术

为什么好多人想学Python?怎么快速学会高端技术?大数据和人工智能时代的到来让Python迎来大爆发,各大互联网巨头都在使用Python进行开发,这吸引了很多非专业人士的关注.为了能够快速学习高端技术,越来越多的人选择专业的学习. 为什么越来越多的人选择学Python? 首先,市场环境推动.Python的迅猛发展不仅是企业需求紧迫推动,更是国家政策推动.此前有新闻报道,全国计算机登记考试出台了最新的调整方案:“Python 语言程序设计”将成为二级考试的新增科目;还有消息称浙江省信息技术课程出

【问底】夏俊:深入站点服务端技术(一)——站点并发的问题

url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-03-16%2F2824221&type=3&count=&appkey=&title=%E6%9C%AC%E6%96%87%E6%9D%A5%E8%87%AA%E6%8B%A5%E6%9C%89%E5%8D%81%E5%B9%B4IT%E4%BB%8E%E4%B8%9A%E7%BB%8F%E9%AA%8C%E3%80%81%E6%93%85%E9%95%BF%E7%BD%91%E

【问底】夏俊:深入网站服务端技术(一)——网站并发的问题

摘要:本文来自拥有十年IT从业经验.擅长网站架构设计.Web前端技术以及Java企业级开发的夏俊,此文也是<关于大型网站技术演进的思考>系列文章的最新出炉内容,首发于CSDN,各位技术人员不容错过. 注:本文首发于CSDN,转载请标明出处. [编者按] 本文来自拥有十年IT从业经验.擅长网站架构设计.Web前端技术以及Java企业级开发的夏俊,此文也是<关于大型网站技术演进的思考>系列文章的最新出炉内容,首发于CSDN,各位技术人员不容错过. 以下为正文: 一. 引子 <关于

都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。

刚刚过去2019,新的一年2020年.都说衣不如新人不如故,技术是学新不学旧的?可是旧的知识不巩固,根基不固很容易在面试或者实战遇到很大的问题的 以下知识点PDF版后续可见 更多面试内容等等(更多完整项目下载.未完待续.源码.图文知识后续上传github.)(VX:mm14525201314)https://github.com/xiangjiana/Android-MS 一丶线程篇 1.线程池的好处? 四种线程池的使用场景,线程池的几个参数的理解? 参考答案:使用线程池的好处是减少在创建和销毁

浏览器端技术体系概览 -- 前端开发的七种武器

科普文一则,说说我对前端技术体系(也称浏览器端技术体系)的认识,希望能让更多人了解前端,也希望能借此丰富前端开发的大局观. 去年我写了网站性能优化系列文章,看过的朋友会知道,这类文章重点并非介绍各种具体的优化技巧,而是在关注发掘这些优化点的思路和方法.然后介绍给大家多种检测手段去发现问题,进而有目标的解决问题.所有这些需要我们对有网页整个生命周期有清晰的认识,对网页中各种技术极其相互结合的方式有明确的认知.这就回归到一个更本质的问题:浏览器端技术体系是怎样的. 想用三言两语说清前端技术不大可能,