经常被问及高性能网络方面,由于一直没有直接处理过这方面的具体处理,我总是回答没有详细研究过。最近我思考了下,没机会涉及实际应用处理,并不是没机会学习。如果别人问到了这方面,一次两次可以回答没涉及过,再三再四这样回答就有些说不过去。知道了不足,还不去更正,就是学习态度不积极,知错能改,能自知才是最重要的。
了解自己
说起来也是主要做数据处理,以及后端开发,从技术方面考量,主要就是网络和数据库。自己所涉及得网络方面也就是学生时代得网络课程,以及Uinx网络编程卷一,另外还有winsock的一本书。在实际应用中主要用过,linux和windows里面的api,MFC里面封装的网络类,libcurl,boost里面的asio的开发这些,没机会处理涉及大规模的场景,也没机会开发底层的网络库。
收集资料
请教搜索大神,发现目前有这些较为知名的c++开源网络库,ACE,ASIO,POCO,libevent,libev,C++ Sockets Library,libcurl,Mars等。这里说明下,有些是在招聘网站里面发现。
多插些不想关但我认为比较重要的话,对于我们学技术的,平时还是多上上招聘网站,看看企业需要什么,也好知道自己本身的不足,找到自己学习的方向。我本人总是需要找工作才上招聘网站,完全是个失败的例子。大一入学就应该立即注册招聘网站,开始整理简历,根据自己兴趣和专业方向,看企业具体需要什么样的人并据此学习,学习起来目标明确,也会更有动力。至于已经上班,那就更不能安于现状,人如逆水行舟,不进则退。所谓机会偏爱有准备的头脑,也就是这么个意思。
言归正传,另外还有web方面的知名开源软件,例如apache,nginx,lighttpd,和firefox,chromium等等,应该还有很多的开源网络工具,就不再查找列出了,如果能把前面这些都研究透,估计就是神级人物了。
作战计划
学习东西跟战争也有很多相似的地方,想打胜仗不容易。有资质未必能学好,国共两党领导层,一个是喝过洋墨水的很多,一个是受过高等教育不多,装备上更不能比,谁败谁胜?遇到强敌不是想的撤退或智取,而采用投降和硬刚,怎能不败?不再赘言,两者有很多相似之处,其实世上的事在道理上都是相通的。
问题来了,怎么学呢?必须看的到,摸得到,不能只是道理上的理解,得有记录的东西,还得有代码,得用测试数据说话,高性能到底高了多少。好了这些应该还是总体的要求,并没有具体得实现步骤,只提目标不写步骤,只是空想,并没有任何意义。步骤一定要能量化,这样就可以对自己学习进行检测。
1.一周至少一篇网络方面微博
这是个简单的可量化的指标,这项学习,给不定期时间,只要一直坚持,网络上面的知识总能越学越多。
2.研究两个开源库在TCP方面得实现
毕竟自己也不算网络方面的小白,不能再从零看基础一点一点记录。没那个必要,直接剖析代码,看别人如何实现。很知名的库有很多的文章在写,在招聘网站发现了有个公司写的fpnn,就拿它开刀。github上74星,用的人少,资料少,必然问题会多,这样我就可以学到很多,得来不容易的知识,失去也不容易。然后就再研究一个比较出名的微信Mars,github上11856星,先这么定。
3.整理一个简单的TCP方面的库
这里其实最简单的就是把成熟的开源库代码,自己做移植整理,但是这样做觉得学的不够深刻。本次的目的是高性能,主要为了体现这个高字,我们知道,所谓的高低是个相对概念。还是从基础的api写最简单client,server开始,然后整理出测试程序,用数据说明程序的定量指标。通过不断改进程序,指标不断得到提升,这样来证明确实高,最后自然的就整理出了这个库。