跳转至

结束语丨我相信这不是结束,让我们江湖再见

这是“网络编程实战”的最后一篇文章了,提起笔来,竟然感觉到有些不舍,回想起这个专栏的诞生,和总编、编辑反复地讨论选题,根据用户反馈不断打磨大纲,一幕幕都感觉恍如昨日。时间过得飞快,感谢大家几个月以来的相伴,不管大家对这个专栏有什么样的评价,我都可以自豪地说,我是很用心地在做这个事情。感谢极客时间的总编郭蕾,还有这个专栏的编辑,没有你们的支持,很难想象我会坚持完成这个专栏。

虽然我自认是个高性能网络编程领域的老手,但是在此之前,整个知识体系都是碎片化的,实践中虽然有过一些经验和教训,却很难形成一个完整的系列。平时也读过不少网络编程方面的书,大多也是为了解决实践问题进行的查疑解惑,从来没有动力去把这些碎片化的知识加以整理,所以,也非常感谢极客时间的这次邀约,使我能够以一个更加系统的角度把自己之前碰到的问题结合理论加以梳理,最终能形成一个比较完整的系列。我感觉自己在做这个事情的过程中,也收获颇丰。

学习方法论

谈完自己的感受,作为这个专栏的结束语,我还是非常希望能给坚持学下来的你们,我的忠实朋友们谈一谈学习方法论。

动手实践

前两天和同事们一起去登山,有些同事身体很棒,一溜小跑就奔到了山顶。我在下面远远地看着他们,无比羡慕,萌生出一个想法,如果能不登攀这些石阶直达到山顶,那该多好啊。

可是,这终归是一个不切实际的幻想,我知道我还是要一步一个台阶地迈过这些石阶,才能达到山顶。当我最终到达山顶时,那些疲惫和羡慕都随风而去,自己所能感受到的,则是“无限风光在顶峰”的畅快。

我拿这个登山的例子来类比我们学习计算机技术的过程,这两者是何其的相像。有的同学非常羡慕可以动辄写出框架的专家,其实,要成为专家,中间的一些台阶必须要自己迈过的,没有人可以一步登顶,只是有人跑得快,有人跑得慢而已。

计算机技术是一门非常重视实战的学科,网络编程更需要静下心来不断试错,因为它通过系统内核交互。只有通过试错,才能让你的理解慢慢接近真实的答案。如果只是读文字而不去实践,不可能帮助你成为一个真正的专家。

我在和同学们的互动中,发现有相当多的同学已经能动手去写,并且在这个过程中有不同的领悟,可以问出一些高质量的问题,这都是非常好的现象。坚持下去,一定会引起质变,让自己成为这个领域的专家。

学习源码

除了动手实践外,看源码也是一个快速提高自己的途径。俗话说,熟读唐诗三百首,不会作诗也会吟。源码读懂了,就可以帮助你大幅度理解原理,技巧也会得到提升。

在网络编程这块,我推荐你看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会让你如虎添翼。

总结需要你对原理、代码反复咀嚼。总结的方式有很多种,你可以画框图,写流程图。对技术反复考究的态度,决定了你可以在这条路上走多远。

分享这件事情让我们有一定的成就感,在这其中也不用担心出错,如果有人帮助你纠正了错误的理解,而你付出的不过是倾听和感谢,岂不是一件非常好的事情。

在互联网高度发达的今天,学会技术总结和分享,将会使我们事半功倍。

不是再见的再见

我期望这个专栏可以帮助你快速复习和掌握网络编程相关的领域知识、编程模型,为你今后的职业发展奠定良好的基础。你可以写下你的心路历程,非常期望未来和你进一步的互动,我们江湖再见。

文章结尾处有一份调查问卷,希望你可以抽出两三分钟填写一下。我想认真倾听你对这个专栏的意见或者建议,期待你的反馈!

精选留言(15)
  • herongwei 👍(9) 💬(1)

    极客时间上第一门 100 % 学完 的课程,感谢老师^_^

    2019-11-26

  • 石头 👍(6) 💬(2)

    老师,我目前3年多java开发经验。 考虑到职业发展问题(不想早早退休o(╥﹏╥)o),我想挑网络编程这个方向,深入钻研下去,成为专家。 但对于网络编程方向未来的就业和真正发展不是很清楚,老师能给解答一下吗?还有,如果持续钻研5年,能达到什么水平呢?我应该给自己设置一个怎样的5年的明确目标? 老师能不能抽时间解答下,谢谢您。

    2021-05-22

  • 进击的巨人 👍(5) 💬(1)

    C语言除了大学的一点基础就没有了,所以课程学的过程在代码这块比较吃力,学完后,依然不会用C写网络编程,不过没关系,对网络编程的底层实现与思想有了很深刻的认识,这样对上层网络框架如netty的理解有很大帮助,感谢老师

    2020-11-15

  • Jason 👍(5) 💬(1)

    老师,你讲的真好,循序渐进,深入浅出,让我对懵懂的网络编程技术真正有了系统化的理解,收获颇丰。我想给你一个大大的拥抱,甚至想亲你一口。

    2020-07-15

  • J.M.Liu 👍(5) 💬(1)

    虽然落后了好几天才把专利跟完,但是收获真的很大。以前对网络编程的底层API总是一知半解,网上看的资料也是零零散散不成体系,《unix网络编程》一类的砖头又有点让人望而却步。学完专栏之后,自己也能对一次IO的整体流程在脑子里生成一张比较完整的路径图了。尤其是最后的实战篇,感觉真的很棒,共享的代码很值得继续研究。感谢老师。

    2019-11-03

  • 满怀 👍(2) 💬(2)

    老师请问我想利用服务器压力测试工具去测试我们设计的服务器,应该怎么去测试呢,我刚刚采用了http_load以及webbench这两款压力测试工具去测试我们的服务器,都产生了:(段错误,核心已转储)这样的错误之后,服务器便停止运行了。

    2020-05-25

  • 徐衡 👍(1) 💬(1)

    很值的一门课,感谢老师

    2020-04-01

  • gtp 👍(1) 💬(1)

    跟完了专栏,感觉网络编程不再神秘!!

    2020-03-29

  • 初见 👍(1) 💬(1)

    花的最值的一门课,感谢老师,笔芯❤

    2019-10-31

  • JustRunning 👍(1) 💬(2)

    谢谢老师,学到很多,也正好解决了一些现网上线过程中遇到的几个网络引起的性能问题,最近终于项目上线完,正在学习C语言,打算学完然后彻底重学一趟整个专栏,一步步实践更进一步吃透。因为没学过C,刚学完指针结构体,但是还是不懂怎么看库源码api类似,有点小懵,不知道老师能不能补充一个小专题,比如对刚学完C的或者C比较薄弱的,还需要哪些知识怎么学,才能比较独立用C跟上专栏~

    2019-10-30

  • 西门吹牛 👍(0) 💬(1)

    最近有个疑问,在网络收发包的过程中,数据拷贝到内核态,内核进行协议栈包装或者解析,是单线程执行吗?这就是一个线程会处理多个socket上数据的协议栈解析吗

    2022-04-18

  • 每天进步一点点 👍(0) 💬(1)

    来得有些晚了,感谢老师的分享,收获良多。

    2022-03-16

  • Geek_d89079 👍(0) 💬(1)

    非常好的课程,感谢老师~

    2022-02-25

  • stark 👍(0) 💬(1)

    看了第二遍,终于搞懂了网络上的一点知识,算是入门吧,本篇课程前部分写的是Tcp/Ip网络,后半部分写的是网络I/O的知识,很基础,收益很大,感谢老师!

    2022-02-24

  • 淡C 👍(0) 💬(1)

    极客时间第一门学完的课,准备二刷了,收获太大了

    2022-02-12