-->

左耳听风_076_75_程序员练级攻略系统知识

你好,我是陈浩网名做尔多house要进入专业的编程领域啊,学习系统知识是非常关键的一部分。

那我首先推荐的是翻译版图书,深入理解计算机系统原书的名字叫computer systems of programmers perspective.不过呢这本书叫做程序员所需要了解的计算机知识更为合适。

那这本书最大的优点是他给程序员描述的计算机系统的实现细节,帮助读者在大脑中构造一个层次型的计算机系统。

从最底层的数据在内存中的表示,到流水线指令的构成,到虚拟存储器到编译系统,到动态加载库,到最后的用户台应用。

那掌握的程序是如何映射到系统上,以及程序是怎么执行的?你就能够更好的理解程序的行为啊,为什么是这样的,以及效率低下是如何造成的。

我再强调一下,这本书是程序员必读的一本书,然后呢,就是美国计算机科学家理查德斯蒂文斯的三套,非常非常经典的书。

呃,一本啊是unix高级环境编程,一本是unix网络编程,还有一本是TCPIP详解。

那这几本书的地位我就不多说了,你可以自己去看相关的书评,但是这三本书可能都不容易读,那一方面是比较厚,另一方面啊是知识的密度太大了,所以说读起来呢就有点枯燥和乏味。

但是啊这没办法,你得忍住。

那这里呢我重点说一下TCPIP详解这本书。

那这是一本很奇怪的书。

迄今为止呢他至少被近五百篇学术论文引用过。

那这本写给工程师看的书,居然被各种学院派的论文来引用啊,也是很神奇的一件事儿了。

而且虽然理查德史蒂文斯不是TCP的发明人,但是在这本书中啊,他把这个协议深入浅出的讲了出来,还画了几百张时序图,也是令人叹为观止了。

那如果你觉得上面这几本经典书比较难啃,那你可以试一试这些通俗易懂的。

第一本是linux c编程一站式学习,第二本是TCPIP网络编程。

那第三本呢是图解TCPIP.那其实这本书并不是只讲了TCPIP啊,应该是叫计算机网络才对他主要是想给快速入门的人看的那最后第四本啊是在TCPIP get.那这本书在豆瓣上的评分是九点二。

我这里在文中给的链接是这本书的HTML英文免费版的那里面的图啊,画的很精彩。

另外呢学习网络协议不单只是看书,你最好用一个抓包工具,看一看这些网络包是什么样的。

所以呢这里我推荐一本书叫做wireshark数据包分析实战。

在这本书中啊,作者结合一些简单易懂的实际网络案例,图文并茂的演示了使用wear shark进行数据包分析的技术方法,可以让我们更好的了解和学习网络协议。

那当然啊也拥有了一定的黑客技能。

看完了unix高级环境编程之后呢,你就可以趁热打铁看一看linux unix系统编程手册啊,或者是罗伯特拉姆的linux system programming.那它的中文翻译版linux系统编程也值得一读。

虽然和unix高级环境编程很像,不过呢它主要突出的是linux的一些关键技术和相关的系统调用。

那关于TCP的东西啊,你还可以看一看我在文中罗列的这一系列的文章。

对于系统知识呢,我认为主要有这样一些学习要点。

呃,第一呢就是用这些系统知识操作一下文件系统,实现一个可以拷贝目录数的小程序。

那第二呢就是用fork weight,还有wak PID写一个多进程的程序,用p thread写一个多线程带同步或者互斥的程序。

比如说多进程购票的程序。

那第三呢就是用signal q race、 alarm horse,或者seek process mask啊,实现一个多进程间的信号量通信的程序。

那第四呢就是学会使用GCC和GDB来编程和调试程序。

那第五呢就是学会使用,make ffile来编译程序。

那第六呢就是用sockets做进程间通信,用c语言写一个一对一聊天的小程序,或者是一个简单的HTP服务器。

然后当你读完unix网络编程之后呢,千万要去读一下c十k problem.这篇文章提出这个问题的人名字叫丹凯格尔,目前在google任职,他从一九七八年起开始接触计算机编程,是wine tricks的作者,也是one一点零的管理员。

同时呢他也是cross two的作者,他是java JS二五十一规范的提交者,并参与编写了java平台的NIO和文件锁。

那同时啊他还参与了RFC五幺二八标准中有关NAT穿越技术的描述和定义。

那c十k问题啊,本质上是操作系统处理大并发请求的问题。

那对于web时代的操作系统而言啊,对于客户端过来的大量并发请求,需要创建相应的服务进程或线程。

那这些进程或者线程多了,就会导致数据拷贝频繁,进程和县程上下文切换消耗大,从而导致资源被耗尽而崩溃。

那这个就是c十k问题的本质。

了解这个问题,并了解操作系统是如何通过多路复用的技术来解决这个问题的。

有助于你了解各种IO和异步模型,这个对于你未来的编程和架构能力是相当重要的。

另外啊现在整个世界都在解决c十m问题。

我在文中给你推荐了一篇相关的文章,你课后可以看一看。

那现在我们已经学完了编程语言、理论、学科和系统知识三个部分的内容。

那下面啊我们就来做几个实践项目啊,小试牛刀一下。

实践语言可以用CC加加或者java.那首先啊是实现一个的版本的聊天服务器主要有以下需求。

那第一呢就是每个客户端可以使用telnet IP port的方式连接到服务器上。

第二点,新的连接需要使用用户名和密码登录。

那如果没有啊,就需要注册一个。

那第三点呢就是可以选择一个聊天室加入聊天。

第四,管理员是有权创建或删除聊天室。

那普通人员只有加入退出和查询聊天室的权利。

第五,聊天室需要有人数限制,每个人发出来的话,那其他所有的人都要能看得到。

那其次呢就是实现一个简单的HTTP服务器,那需求啊主要是这几个。

那第一点呢,就是解释浏览器传来的HTTP协议,只需要处理UIL pass就好了。

第二呢,就是把所代理的目录列出来。

那第三呢,在浏览器上我可以浏览目录里的文件和下级目录。

那第四呢,就是如果点击文件了,就需要把文件打开传给浏览器。

那第五,如果点击了子目录,就需要进入到子目录当中,并把子目录中的文件列出来。

最后啊再实现一个生产者,消费者消息队列服务主要是有这么几个需求。

第一,消息队列采用一个rain buffer的数据结构。

那第二呢就是可以有多个topic供生产者写入消息,消费者取出消息。

第三呢就是需要支持多个生产者并发的写。

第四,需要支持多个消费者消费消息。

那只要有一个消费者成功处理了消息就可以删除消息。

第五,这个消息队立啊要做到不丢数据,也就是说要把消息持久化下来。

最后第六个需求就是要做到性能很高。

到今天啊,我们已经学完了专业编程方面最为重要的三个部分,内容,编程语言、理论、学科和系统知识。

我们针对这些内容做个小结。

如果你想看完我推荐的那些书和知识,并能理解和掌握,我估计怎么也得需要四到五年的时间。

嗯,是的,这就是一个计算机科学系科班出身的程序员,需要学习的一些东西。

这其中啊最重要的是这几点。

第一点呢是编程语言以工业级的CCR加和java这三门语言为主。

那这三门语言啊才真正算得上工业级的编程语言。

因为有工业级的标准化组织在控制着几门语言,而且啊还有工业级的企业应用,尤其是java,它还衍生出了大量的企业级架构上的开源生态。

你至少啊需要掌握c语言和java语言,这对你以后面对各式各样的编程语言是非常重要的。

此外啊,我还推荐学习go语言,那它已经成为云计算领域事实上的标准语言啊,尤其是在docker coberontice等项目当中,而且构源在国内外一些知名公司中啊,已经有了一定的应用和实践,并且它的生态圈啊也越来越好。

那第二点是算法和数据结构,那这个太重要了,尤其是最基础的算法和数据结构。

这是任何一个称职的程序员都需要学习和掌握的,你必须要掌握。

呃,designer是计算机的相关系统,你至少要掌握三个系统的基础知识啊,一个是操作系统,一个是网络系统,还有一个是数据库系统。

它们分别代表计算机基础构架的三大件计算、存储和网络。

那如果你能走到这里,把前面的那些知识都了解了,那么你呀已经是一个合格的程序员了,而且你的潜力和可能性是非常非常高的那如果经历过这些比较枯燥的理论知识,你还能有热情和成就感,那么我就要恭喜你了。

因为你已经超过了绝大多数人,而且还是排在上游的比较抢手的程序员了啊,我相信啊你至少可以找到年薪五十万以上的工作了。

但是呢你还需要很多的经验和实践和一些大系统大项目的实际动手的经验。

没关系,我们后面呢会有教你怎么实操的方法和攻略。

但是再往后面走啊,你就开始需要术业有专攻了。

那我这里啊给一些建议的方向。

第一呢是底层方向,包括操作系统、文件系统、数据库和网络等等。

第二是架构方向,包括分布式系统、架构、微服务、divlves,还有clarnative等等。

那第三呢是数据方向,包括大数据、机器学习和人工智能等等。

第四是前端方向。

如果你对用户的体验或交互更感兴趣,那么就走前端的路吧。

那还有一些其他的方向,比如说安全开发、运维开发,还有嵌入式开发等等。

那这些方向你要仔细选择,因为一旦选好了,就要勇往直前的走下去。

那当然你要回头转别的方向也没什么问题。

因为你有前面的这些基础知识在身,所以呢不用害怕,只是不同的方向上会有不同的经验积累。

那经验积累啊是看书看不来的那这个呢是转方向的成本,在下节课我们将进入软件设计篇,敬请期待。