这是“网络编程实战”的最后一篇文章了,提起笔来,竟然感觉到有些不舍,回想起这个专栏的诞生,和总编、编辑反复地讨论选题,根据用户反馈不断打磨大纲,一幕幕都感觉恍如昨日。时间过得飞快,感谢大家几个月以来的相伴,不管大家对这个专栏有什么样的评价,我都可以自豪地说,我是很用心地在做这个事情。感谢极客时间的总编郭蕾,还有这个专栏的编辑,没有你们的支持,很难想象我会坚持完成这个专栏。
虽然我自认是个高性能网络编程领域的老手,但是在此之前,整个知识体系都是碎片化的,实践中虽然有过一些经验和教训,却很难形成一个完整的系列。平时也读过不少网络编程方面的书,大多也是为了解决实践问题进行的查疑解惑,从来没有动力去把这些碎片化的知识加以整理,所以,也非常感谢极客时间的这次邀约,使我能够以一个更加系统的角度把自己之前碰到的问题结合理论加以梳理,最终能形成一个比较完整的系列。我感觉自己在做这个事情的过程中,也收获颇丰。
谈完自己的感受,作为这个专栏的结束语,我还是非常希望能给坚持学下来的你们,我的忠实朋友们谈一谈学习方法论。
前两天和同事们一起去登山,有些同事身体很棒,一溜小跑就奔到了山顶。我在下面远远地看着他们,无比羡慕,萌生出一个想法,如果能不登攀这些石阶直达到山顶,那该多好啊。
可是,这终归是一个不切实际的幻想,我知道我还是要一步一个台阶地迈过这些石阶,才能达到山顶。当我最终到达山顶时,那些疲惫和羡慕都随风而去,自己所能感受到的,则是“无限风光在顶峰”的畅快。
我拿这个登山的例子来类比我们学习计算机技术的过程,这两者是何其的相像。有的同学非常羡慕可以动辄写出框架的专家,其实,要成为专家,中间的一些台阶必须要自己迈过的,没有人可以一步登顶,只是有人跑得快,有人跑得慢而已。
计算机技术是一门非常重视实战的学科,网络编程更需要静下心来不断试错,因为它通过系统内核交互。只有通过试错,才能让你的理解慢慢接近真实的答案。如果只是读文字而不去实践,不可能帮助你成为一个真正的专家。
我在和同学们的互动中,发现有相当多的同学已经能动手去写,并且在这个过程中有不同的领悟,可以问出一些高质量的问题,这都是非常好的现象。坚持下去,一定会引起质变,让自己成为这个领域的专家。
除了动手实践外,看源码也是一个快速提高自己的途径。俗话说,熟读唐诗三百首,不会作诗也会吟。源码读懂了,就可以帮助你大幅度理解原理,技巧也会得到提升。
在网络编程这块,我推荐你看libevent、ACE或者Asio的源代码。
libevent是一个轻量级的基于event回调机制的网络编程库,可以支持Linux、Solaris、Windows等系统,它本身是用C语言写的,代码量不是很多,比较适合入门级的阅读。
Asio是boost里的网络编程库,是用C++语言写的。里面用了很多boost的数据结构和技巧,包括大量模板的使用,有一定的语言难度,如果你对自己的C++能力比较自信,可以试着去读一读。boost库本身也已经成为C++的标准库,其设计和实现也可以说是一个学习的样板。
ACE是老牌的C++网络编程库,我读书那会非常流行,也基于ACE写过很多网络程序。很多设计模式如reactor、proactor都是ACE首次提出并倡导的。当然也有很多网络编程的大佬们觉得ACE有点过于设计了,搞得太复杂,没必要。这个我觉得见仁见智吧,有些好的思想可以拿来用,觉得不合适该抛弃就抛弃。ACE强在设计模式和抽象,如果对设计模式感兴趣,可以花一些时间学习下ACE的设计。
还有一个需要注意的地方就是总结和分享。要学会从源码中总结,即使是前人已经有的总结,如果你可以有自己的心得和体会,也可以总结出来,发到个人博客或者GitHub上去。长期坚持下来,你也会收获颇丰。我个人在面试候选人的时候,对这种比较喜欢总结,有自己想法的同学是会高看一眼的。
GitHub是一个非常好的资源,学会使用Git和GitHub会让你如虎添翼。
总结需要你对原理、代码反复咀嚼。总结的方式有很多种,你可以画框图,写流程图。对技术反复考究的态度,决定了你可以在这条路上走多远。
分享这件事情让我们有一定的成就感,在这其中也不用担心出错,如果有人帮助你纠正了错误的理解,而你付出的不过是倾听和感谢,岂不是一件非常好的事情。
在互联网高度发达的今天,学会技术总结和分享,将会使我们事半功倍。
我期望这个专栏可以帮助你快速复习和掌握网络编程相关的领域知识、编程模型,为你今后的职业发展奠定良好的基础。你可以写下你的心路历程,非常期望未来和你进一步的互动,我们江湖再见。
文章结尾处有一份调查问卷,希望你可以抽出两三分钟填写一下。我想认真倾听你对这个专栏的意见或者建议,期待你的反馈!