结束语 真正的高贵,不是优于别人,而是优于过去的自己
你好,我是袁武林。
不知不觉中,在大家的耐心陪伴下,即时消息专栏的更新马上就要结束了。
首先,要感谢各位同学对我的信任和宽容,给我这个机会,让我能够在这段短暂的时间里,带领大家一起来学习即时消息这一门古老但又充满活力的技术。
对我来说,这是一段非常特别和有趣的体验,我也第一次尝试通过专栏的方式,将自己了解的知识进行体系化的输出。
当然这并不是一件简单的事情,知识点整理、稿件打磨、录音、留言反馈等等,背后的艰辛可能也只有经历过的人才能体会到。但每次专栏更新上线,看到自己的付出有帮助到一些同学,并且得到肯定的时候,我瞬间感觉又充满了战斗的能量。
关于专栏的落地
实际上,在开始筹备这个专栏的时候,我个人是比较没有信心的。
原因倒不是说技术层面的问题,而是担心即时消息这个话题,因为受众相对没有那么广泛,在推出之后,如何让更多非IM行业的小伙伴,也能够感兴趣并且参与进来,一直是我和极客时间团队需要认真考虑的一个事情。
因为一直没有想到更好的办法,所以这个专栏甚至中途一度停滞中断。直到6月下旬,经过和极客时间小伙伴们的多次讨论,我们才最终决定继续推进这个专栏的落地。
关于即时消息技术的前景
从我们的角度看,随着4G网络的普及和5G网络的逐步推广,在移动网络场景中,不管是流量资费还是网络的稳定性和速度、带宽,相比几年前都有了非常明显的提升。
在这样的大环境下,原本更多被用于聊天等社交场景的即时通讯技术,也被大范围应用于“万物互联”的物联网场景,以及新型社交模式,如直播互动、游戏互动等。而且,还有越来越多对实时性要求高的业务场景,也都开始引入即时通讯技术,来提升用户的使用体验。
因此,我们觉得,开设一门即时通讯技术相关的课程,不仅能够让同学们从基础原理层面上更体系化地了解即时通讯底层核心的技术实现,并且能够帮助大家在各自从事的业务系统中,结合实际场景,来尝试引入课程中介绍到的某些适合自己业务的技术点。
专栏真正开始落地后,在一系列自我摧残式的存稿,以及逐字逐句和编辑的磨稿过程中,我才切身体会到做一个专栏有多不容易。
和以前随意写写博客相比,一个严谨的专栏需要耗费大量的时间和精力去提炼技术点,并且要尽量用“通俗易懂”的文字来组织语言。
专栏的落地对于我自己来说,也是一个成长和学习的过程。
特别是在留言区,就某些技术点和各位同学们的讨论,大家的一些有趣、富有想象力的观点,也能让我重新思考,涉及的这些技术点是不是某些方面的考虑还不够,或者是否还有更好的实现落地方案。
在专栏即将结束的时候,我也想借这个机会,和参与到这门课程学习中的你,聊一聊我对技术和学习方法的一些个人的思考。
学习方法论:知识的广度和深度问题
很多时候,我们搞技术的小伙伴经常会听到人们对于知识的两种学习路径:一种是追求知识的广度,力图多点开花,前后端通吃;另一种是追求某一个知识点的深度,从对某一个小知识点的“了解和会用”,到“底层原理分析”,再到“思考优化”的这种路径来学习知识。
但是对于很多从事技术的小伙伴们来说,这样很容易陷入到一个“两难”的学习方法论的抉择中,毕竟现在的新技术层出不穷。
就拿即时消息的技术体系来说,暂且不去讲多种语言实现的问题,光是Java体系下网络通信的NIO框架就有好几种,要选择哪个框架就是一个让人很纠结的问题。
这种情况下,很容易让人陷入一个怪圈:就是我们可能花费了大量的精力,放在框架特性介绍对比、框架使用方法研究等知识上面,力求通过掌握更多的NIO框架的使用,来提升自己这方面知识的广度。但从我个人角度来看,是不推荐这种学习和研究方式的。
我认为所谓的知识广度是一个伪命题,换句话说,知识的广度只是一个结果,而不是一种学习的方法。
我更推荐的是:针对某一个特定的技术点,从使用方法下沉到原理层面上,再逐步去拓展和了解研究学习过程中碰到的各种疑问与实现细节,从而“由点到面”地去吃透该知识点。
打个比方,要对NIO框架进行研究,我觉得没必要先去纠结各种框架的优劣,而是可以选择一种比较主流大众的框架去做实践;然后,逐步去了解这个NIO框架使用到的JDK的IO库的实现方式。
比如,搞明白JDK的IO库模型,是从传统的阻塞型的BIO,发展到JDK 1.4开始支持多路复用的NIO,再发展到JDK 1.7继续改进的异步的AIO,以此来了解这几种模型的区别和迭代改进的地方。
最后,再深入到底层的操作系统层,了解它们是如何支持这些IO模型的。
比如,要了解Linux的select和epoll的实现原理,可能还需要了解IO过程中涉及到的IO事件、最终的TCP连接的状态,以及与数据收发之间的关系。因此,你还可以对TCP协议进行体系化的了解。
通过这种层层深入的学习方式,我们就能较为扎实地掌握一个NIO框架涉及到的垂直知识体系。
这样,你在掌握知识点的同时,知识广度方面也能自然而然地充实起来,以后再切换到其他NIO框架,就相对简单了很多,也能更客观和精确地对这些框架从底层原理层面来进行比对了。
当然,这种逐层深入的学习方法,在前期可能需要花费大量的精力和时间,因此需要你一定的耐心和坚持,但在对底层原理层知识有一定的积累之后,这种学习的方法也会越来越轻松。
学习方法论:碎片化知识和系统化学习
关于技术学习路径的另一个小小的建议是:从了解碎片化的知识开始,逐步扩大你在某一方面的技能树,然后再对这方面的整体知识进行系统化的学习和总结沉淀。
随着现在各种技术博客、技术类公众号、技术站点等等的普及和传播,大部分时候,我们只能通过工作之余的些许碎片化时间,来了解某些细碎的知识点。
当然,这些碎片化的知识点是一种不错的积累,但这些零散的知识点,在碎片化学习的时候,由于学习时间短、文章内容比较聚焦于一个小点,很容易让我们看完之后产生一种“我知道了”,然后就没有后续了,难以进行复杂的思考。
所以,我个人的建议是,对于某一技术点方面的碎片化的知识,在一段时间的学习后,还是需要进行系统化的“复盘”,一来可以补充遗漏的某些技术细节,二来能够形成对这个知识点的整理和总结思考,最终沉淀成自己的文档或者代码输出。
另外,你也可以尽量优先地去选择学习与自己工作内容息息相关的技术点,这样在理解知识和后续的输出实践上,也会更有帮助。
写在最后
对于从事技术工作的我们来说,技术探索的道路总是显得如此漫长,不断迭代更新的技术时常会让我们眼花缭乱,各种技术知识产品的爆炸式推广,让我们获取知识的方式变得如此简单。
但另一方面,在快节奏的生活方式下,在繁重的工作、与家人朋友的相处时间之外,我们的时间总是显得远远不够用。
如何保持一颗对新鲜事物的好奇心,如何高效有序地管理时间,如何形成一套适合自己的学习方法,这个时候可能往往比技术本身更重要。
海明威说:“真正的高贵,不是优于别人,而是优于过去的自己。”
无论如何,可能我们在一开始的时候,学习的技巧并不是那么高明,但只要我们保持终身学习的姿态,持续地投入到真正喜欢的事情上,就能让今天的我们比昨天进步一点点。
我相信,时间的复利最终能让你真正采撷到成功的芬芳玫瑰!
- starscatcher 👍(21) 💬(1)
我是在硅谷某大厂工作的资深软件工程师,工作内容和IM毫不相关。一次偶然的机会听了袁老师的第一课,从此不能自拔,追了一个月的时间,一直听完了最后一课。毫不夸张地说,你的这门课是我近几年来听过的讲得最好的课程,无论中文还是英文。你把零散的知识碎片梳理总结成系统性的课程,这其中的方法论很值得我学习。非常期待有朝一日能与你见面交流!
2019-10-29 - starscatcher 👍(8) 💬(1)
袁老师,我前两天在北美华人的的一亩三分地论坛里大力推荐你的课程啦,收到了热烈反响。请看https://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=605509 不少同学已经去注册这门课啦! 下面是我在论坛上的推荐词: 我发现我近期听的一门课对系统设计面试很有帮助,大力推荐给大家。 极客时间里的这门“即时消息技术剖析与实战”(https://time.geekbang.org/column/intro/225) 虽说这门课讲的话题是“即时消息”,但是基本涵盖了所有系统设计的要素:分布式,streaming,batch,cache,容器,网络,并发,扩缩容。 这门课主要针对职业码农,非常重技术实践和解决方案,比如各种情况下技术方案的取舍。 我基本是在开车的时候听的,听完了之后收获很大,曾经的碎片化的知识都成系统了。 另外,这个主讲人的讲课思路非常好,每个模块都基本是按照“主要需求-主要需求实现-次要需求-次要需求实现-扩容”这个思路讲的。这个思路和系统设计面试时的思路差不多,所以对我系统设计面试的帮助非常大。 不忍独享,推荐给大家。
2020-03-11 - 墙角儿的花 👍(5) 💬(1)
感谢老师,很受益。终究要再见,不能再进行交流了,好遗憾
2019-10-18 - 🐾 👍(4) 💬(1)
真正的高贵,不是优于别人,而是优于过去的自己。 完整学了一遍,很不错的专栏,还会二刷三刷,袁老师辛苦了。
2019-10-18 - leslie 👍(2) 💬(1)
非常喜欢陈皓老师在二叉树视频中的一句话“芝兰生于空谷,不以无人而不芳”。学到现在听过各个老师的方式:最终还是选了刘超老师的方式改进成自己的。 学习其实很简单:从开课一路坚持到最后一节课一周不拉的学完,其实学习的过程中还是碰到了大量的问题,导致不得不去扩展学习,不过庆幸的是最后坚持的学完了;坚持到最后其实就是一种胜利。学习的过程其实就是不断的自我否定自我前进的过程:定期对比自己每个季度能看到自己的的进步就是一种自我的胜利。 虽然今天是最后一节课,不过还是想求教老师一个问题;如果自己部署IM的话,那么有没有可用的开源监控系统可用?老师的课程中提到了这块而自己又OPS多年-学习中觉得这块还是非常重要,再好的系统不可避免有问题,监控系统是及时发现问题和解决问题的必要条件;希望老师在这块最后能简单的分享还不错的开源工具,让我能学习和修正。 谢谢老师一路以来的辛勤付出和顿顿教诲:希望将来还能看到老师的分享;谢谢。
2019-10-18 - 小可 👍(1) 💬(1)
这个专栏是我追的比较紧的课程,之前虽然我没做过IM系统,但对IM有点兴趣,网上虽然有类似的博客文章,但都不是很深入。我想知道真正的IM系统是怎么实现的,是不是和我想的一样?一节一节看着专栏,也在一步一步验证我的想法。有些点,经过老师的讲解也是茅塞顿开,真的感谢袁老师真心细致的讲解,谢谢。
2019-10-18 - clip 👍(1) 💬(1)
说来惭愧,之前买了很多的专栏但完成度都比较低。这个专栏是第一个几乎跟着更新看完的,留言的参与度也是最高的。因为现在的工作是 IM 相关的业务开发,但是因为实际开发接触面有限不知道整体的架构。学习专栏之后通过和已经知道的一些信息做对比就有更深的认识了,对之后的工作也会很有帮助。多谢大佬的专栏!
2019-10-18 - 云 👍(1) 💬(2)
老师好,老师的专栏结束了,感觉还没有学够,感觉要学的还太多。如何把im落地生产环境还是摸不着头脑,好在老师已经给我们提供了一个demo。以前没接触过im,问您一个问题。我们想在app中做个消息提醒功能,您说我们该用什么技术,用户在2万左右。目前想用websocket做可以吗?还是用http2的推送。或者在前端做轮询定时请求后端接口就好。还有哪些好的方案?我们用的springboot。
2019-10-18 - 尔东橙 👍(0) 💬(1)
老师,基于最近的疫情,导致远程办公软件需求暴涨的情况,能不能加餐谈一谈这种类似于钉钉的软件在这种高并发情况下的问题和解决方案
2020-02-15 - 天健园扛把子 👍(0) 💬(1)
感谢老师,一路走来收获颇丰!
2019-11-24 - yic 👍(0) 💬(1)
第一个学完的专栏,感谢老师的辛勤付出。系统性的讲解了IM系统,很完善的系统。要把这样一个完善的系统做好还是需要一个团队,甚至多个团队的努力。可惜微博在北京,不然倒是想加入一睹老师风采,哈哈
2019-11-22 - 大土豆 👍(0) 💬(1)
Android客户端开发路过,负责IM客户端软件开发一年时间,踩过了无数的坑。老师,其实IM应用层协议这块倒是可以深入讲一下,比如私有协议的制订,是走文本协议还是二进制协议,数据格式方面是用json还是protobuf,这些都是比较有趣的。
2019-11-20 - wuhaka 👍(0) 💬(1)
花了一周多时间听完了,对于我现在开发的IM业务帮助很大,网上的IM资料很少有系统性的介绍,独自开发IM前后端总是闭门造车走了不少弯路,虽然也解决IM核心的群聊、集群等一些难点,但在工业级产品前感觉个人项目还是Demo级别的,需要提升的地方太多,感谢老师的精彩分享。 后看了老师的一篇关于DirectByteBuffer堆外内存泄漏排查的文章,很见功底,是个合格的架构师。
2019-11-08 - 鱼向北游 👍(0) 💬(1)
打卡 花了两周学完的,以前在游戏行业,也算和im沾边,前阵子又摸滚打爬把通用网关通信趟了一边坑,然后才看到老师专栏,发现摸滚打爬的坑老师这里基本都详细涵盖了,专栏再早点上就好了
2019-11-08 - 长庚也是星星 👍(0) 💬(1)
感谢老师精彩的文章。 订阅好几个专栏了,这是第一个看完的,知道了IM服务是什么有哪些技术点,心里有了IM的轮廓。 接下来要学习实现IM相关的知识netty等用来coding。
2019-10-31