极客时间已完结课程限时免费阅读

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

结束语丨我相信这不是结束,让我们江湖再见-极客时间

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

讲述:冯永吉

时长05:45大小5.27M

这是“网络编程实战”的最后一篇文章了,提起笔来,竟然感觉到有些不舍,回想起这个专栏的诞生,和总编、编辑反复地讨论选题,根据用户反馈不断打磨大纲,一幕幕都感觉恍如昨日。时间过得飞快,感谢大家几个月以来的相伴,不管大家对这个专栏有什么样的评价,我都可以自豪地说,我是很用心地在做这个事情。感谢极客时间的总编郭蕾,还有这个专栏的编辑,没有你们的支持,很难想象我会坚持完成这个专栏。
虽然我自认是个高性能网络编程领域的老手,但是在此之前,整个知识体系都是碎片化的,实践中虽然有过一些经验和教训,却很难形成一个完整的系列。平时也读过不少网络编程方面的书,大多也是为了解决实践问题进行的查疑解惑,从来没有动力去把这些碎片化的知识加以整理,所以,也非常感谢极客时间的这次邀约,使我能够以一个更加系统的角度把自己之前碰到的问题结合理论加以梳理,最终能形成一个比较完整的系列。我感觉自己在做这个事情的过程中,也收获颇丰。

学习方法论

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

动手实践

前两天和同事们一起去登山,有些同事身体很棒,一溜小跑就奔到了山顶。我在下面远远地看着他们,无比羡慕,萌生出一个想法,如果能不登攀这些石阶直达到山顶,那该多好啊。
可是,这终归是一个不切实际的幻想,我知道我还是要一步一个台阶地迈过这些石阶,才能达到山顶。当我最终到达山顶时,那些疲惫和羡慕都随风而去,自己所能感受到的,则是“无限风光在顶峰”的畅快。
我拿这个登山的例子来类比我们学习计算机技术的过程,这两者是何其的相像。有的同学非常羡慕可以动辄写出框架的专家,其实,要成为专家,中间的一些台阶必须要自己迈过的,没有人可以一步登顶,只是有人跑得快,有人跑得慢而已。
计算机技术是一门非常重视实战的学科,网络编程更需要静下心来不断试错,因为它通过系统内核交互。只有通过试错,才能让你的理解慢慢接近真实的答案。如果只是读文字而不去实践,不可能帮助你成为一个真正的专家。
我在和同学们的互动中,发现有相当多的同学已经能动手去写,并且在这个过程中有不同的领悟,可以问出一些高质量的问题,这都是非常好的现象。坚持下去,一定会引起质变,让自己成为这个领域的专家。

学习源码

除了动手实践外,看源码也是一个快速提高自己的途径。俗话说,熟读唐诗三百首,不会作诗也会吟。源码读懂了,就可以帮助你大幅度理解原理,技巧也会得到提升。
在网络编程这块,我推荐你看 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 会让你如虎添翼。
总结需要你对原理、代码反复咀嚼。总结的方式有很多种,你可以画框图,写流程图。对技术反复考究的态度,决定了你可以在这条路上走多远。
分享这件事情让我们有一定的成就感,在这其中也不用担心出错,如果有人帮助你纠正了错误的理解,而你付出的不过是倾听和感谢,岂不是一件非常好的事情。
在互联网高度发达的今天,学会技术总结和分享,将会使我们事半功倍。

不是再见的再见

我期望这个专栏可以帮助你快速复习和掌握网络编程相关的领域知识、编程模型,为你今后的职业发展奠定良好的基础。你可以写下你的心路历程,非常期望未来和你进一步的互动,我们江湖再见。
文章结尾处有一份调查问卷,希望你可以抽出两三分钟填写一下。我想认真倾听你对这个专栏的意见或者建议,期待你的反馈!
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 1

提建议

上一篇
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
下一篇
期末测试题丨有关网络编程的知识,你掌握了多少呢?
unpreview
 写留言

精选留言(33)

  • herongwei
    2019-11-26
    极客时间上第一门 100 % 学完 的课程,感谢老师^_^

    作者回复: 谢谢支持。

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

    作者回复: 我觉着用不着5年。 你先学习了基本概念;之后再读多线程、Netty之类的Java编程书籍,再去看微服务,RPC等应用层的概念。一年一个主题,3年就可以小成了。关键是持之以恒。

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

    作者回复: 感谢一路相伴。

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

    作者回复: 达到了我的初衷,感谢分享。

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

    作者回复: 你太热情了☺️

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

    作者回复: 工具应该是可以的,你可以减轻下测试压力,设置下断点看下问题所在。

    共 2 条评论
    1
  • 初见
    2019-10-31
    花的最值的一门课,感谢老师,笔芯❤

    作者回复: 谢谢,同笔芯❤

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

    作者回复: 找一本C语言的书看下,多写多看吧。C语言的书我推荐 https://book.douban.com/subject/1139336/

    共 2 条评论
    1
  • 功夫熊猫
    2022-07-30 来自江苏
    谢谢老师,以前感觉都只是一知半解,但是现在对大多数的设计思路有了很清楚认识。让我明白了一个道理,如果要进入某个领域的话,就先看看这个领域的大佬的作品,这是提升的最快方式了。最近看sqlite3也是这种感觉,以前感觉数据库好难呀,现在有了大体认识后,就感觉简单多了,数据库感觉就是字符串的解析和以及磁盘与内存的交互。
    1
  • 功夫熊猫
    2022-07-30 来自江苏
    谢谢老师。
  • 西门吹牛
    2022-04-18
    最近有个疑问,在网络收发包的过程中,数据拷贝到内核态,内核进行协议栈包装或者解析,是单线程执行吗?这就是一个线程会处理多个socket上数据的协议栈解析吗

    作者回复: 肯定不是啊。好比你有8核的CPU,肯定比人家单核的要快。内核的任务调度、多核处理,会考虑这些。

  • 每天进步一点点
    2022-03-16
    来得有些晚了,感谢老师的分享,收获良多。

    作者回复: 感谢捧场~

  • Geek_d89079
    2022-02-25
    非常好的课程,感谢老师~

    作者回复: 感谢相伴~

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

    作者回复: 感谢相伴~

  • 淡C
    2022-02-12
    极客时间第一门学完的课,准备二刷了,收获太大了

    作者回复: 🤝

  • 左星辰
    2021-12-13
    作为一个移动端应用层开发者,这个专栏学完真的是收获良多,很多之前一知半解的问题都接近融会贯通了,最后c语言实现的http服务器程序,也让我对编程思维有了新的认知,原来c语言也能这么优雅的实现面向对象编程。 这个专栏主要是介绍了高性能的服务端程序,对于高性能的客户端网络程序不知道老师是怎么理解的呢?

    作者回复: 服务端都搞定了,客户端应该不难吧。哈哈

  • Elmer
    2021-11-04
    老师可以帮忙看看几门编程语言各自使用的I/O模型吗? 不知道理解的对不对: nodejs: 本身是single reactor + worker threads; 但使用cluster后可以实现main-sub reactor + worker threads; nginx: 本质上是main-sub reactor + worker threads, 但主进程直接把listenfd共享给了sub reactor, 这里有点区别 netty:main-sub reactor + worker threads 可能实现思路都差不多,但由于各个语言的实现不同,在不同的场景各自发挥不同的优势。
    展开

    作者回复: nginx和netty我看过,同意你的理解。nodejs没看过源码,不好判断。

  • 青鸟飞鱼
    2020-11-07
    江湖再见
  • crown
    2020-04-26
    Libuv没有推荐,是不是思路和libevent之类的差不多

    作者回复: 我觉得是的

  • ray
    2020-04-13
    老师您好, 由衷感谢您在极客时间开网路编程实战这门课,我以前总是自己google查高性能网路边程的资料,由于网上资料太杂、各家说法不依、没有前后连贯的讲解,以及缺乏范例代码,实在是学的很痛苦。自从上了老师的课,许多不懂的问题都透过gdb调适代码,逐步追踪程序的变化,再搭配linux命令观察tcp的状态边迁,可以说是对网路知识有了大幅度的提升,不再是碎片化的学习。这门课对我来说就是打开高性能网路编程的开始,期许自己以后可以用老师所教的知识为基底继续成长下去。 最后再次感谢老师XDDD
    展开

    作者回复: 👍