最近有一些同学来咨询我们“源码到底怎么学习呀”,“源码怎么才能看懂”这种问题,今天我们来看看为什么大家都对看懂源码这么执着。
观千剑而后识器
合抱之木生于毫末,九层之台起于累土。同样的,代码大神始于小白,这是一个不可缺少的阶段。
我们在起初开始进入编程的大门的时候往往会因为怎么去实现一个很简单的功能或者需求而绞尽脑汁,那个时候我们是苦恼于不会。到后来慢慢的我们能够依照我们自己的知识体系去实现需求了,可能初期会觉得很开心,毕竟自己获得了成长,从不会到会是一件很值得开心的事情。
但不知道大家有没有这样一种经历,那就是几个月甚至几周之后再回过头来看当时写的代码就会觉得很不好理解,可能百思不得其解自己当初为啥有这么写,于是要么继续忍受要么推翻重写,循环不止。
包括我自己现在仍然会有这种感觉,我觉得本质原因是因为在最初设计代码的时候就没有做好,或者说压根就不知道好的代码设计应该是怎么样。
那怎么去解决这样一个问题呢,我的选择是去阅读高质量的开源项目源码,去分析,去体验好的代码设计流程是怎么样的,然后再慢慢体现在自己的日常代码中,最后形成自己好的代码风格,我本人也在朝着这个方向而努力。
最佳实践还是奇淫巧技
编程语言有很多种,入门往往简单,但是想要真真的掌握一门语言的最佳实践和一些奇淫巧技确需要时间和经验的积累。
要实现一个目的在Python 里面可能有十种写法,在Java 可能也有五种写法,在Golang 里面可能也有三种写法,每种语言的最佳实践不一样,也就是说如果把Java 的写法思维硬搬到Go 里面可能不合适或者说写起来很别扭。而通过阅读高质量优秀的开源项目的源代码可以借鉴、模仿优秀工程师的最佳实践 并且思考为什么他们要这么写,这么写和自己之前的实现方式的异同和优劣,进而转化成自己的东西,慢慢地在之后自己的代码中就会有所体现,代码质量也会相应的提高。
另外就是一些语言特有的奇淫巧技,有的能够大幅度缩减代码量的同时保持不错的可读性,有的能够用到编译器的特殊优化进而提升代码的性能,这些奇淫巧技基础教程里面往往不会教你,但是往往会出现在优秀的开源项目中。虽然在正式的工程中不提倡使用各种奇淫巧技和黑魔法,但在特殊场景下或者易于被理解的场景下的使用是被允许的,而使用前提是你懂得这些东西。
面试加分
这个看起来可能有点功利性,但阅读好的源码是为了提升自己,自己的水平提升了之后带来的自身竞争力的提升也是水到渠成的事情,现在岗位招聘的JD上经常可以看到开源项目贡献者和源码阅读者加分的字眼,只是因面试官和企业的风格不同加分程度不同罢了。
至于为什么加分也很容易明白,举个例子,JD 要求熟悉kafka,现在有三个工程师,第一个仅仅是简单的使用过,或者仅仅自己写过一些demo 第二位能够理解基本的概念 ,在项目中使用kafak解决了一些问题并且成功上线,而第三位对基本概念很熟悉的同时还阅读过kafka 的源代码,能够理解整个kafka 的主要运作流程,那么他大概率能够理解kafka 的特性和其他消息队列的异同,那么日常场景的使用和技术选型是基本没有问题的。
显然在其他方面相差不大的情况下第三位工程师自然占有优势。
所以阅读优秀开源项目的源码不是为了面试加分,但随着自身水平的提升,面试中占得优势是水到渠成的事情。
为自己的开源之路铺路
很多同学可能觉得阅读开源项目的源码很难,打开一个开源项目可能几十个文件,数万行甚至数十万行代码,觉得无从下手,有这种感觉是正常的,那么如何去解决这个问题呢,我个人觉得有以下几个办法:
阅读源码之前要先会使用,如果连这个开源项目的功能和解决的问题都不知道的话直接扎进源码里面那将会事倍功半,大概率无法坚持下去
最好是带着目的性的去阅读,比如你想弄清楚具体某个问题该项目是如何解决的,这样有针对性,也更容易以点扩展到整个面
抓重点,再优秀的开源项目也不是所有的代码都值得阅读,要学会抓住重点
学会不求甚解,这个看起来有点奇怪,但可能某个问题你实在卡住了,怎么也想不明白,这个时候可以尝试线绕过,因为知识是有体系的,阅读到后面的某个地方可能会让你联系到一起,恍然大悟
上面说这么多阅读源码的好处,其实总结起来就一个,阅读优秀的源码能够帮助自身的提升,让自己多思考。
为了帮助大家可以更好地阅读、学习源码,最近牛客大学上线了新的专刊《go高薪必备:面试框架17讲》
本专刊是Go开源项目源码分析专刊,由bilibili高级开发工程师撰写,共17篇文章。
挑选了Go 开源界知名的4个开源项目gnet(高效的网络库)、gin(知名的Go微型web框架)、fasthttp(高性能web框架)、nsq(Go消息队列)来对它们进行源码分析,分析它们的设计思想和代码实现。
每个项目的讲解都是由浅入深,由设计思想的剖析到源码实现的分析,更易于读者理解。
通过这4个开源项目源码的学习,你会了解和熟悉以下知识:
Go net 网络库的实现原理、高性能的网络库模式、网络编程相关知识
web 框架主要组件的实现原理
如何编写高性能的Go代码
消息队列相关原理及Go nsq 消息队列的具体实现
通过学习大佬的源代码实现来体会Go语言原汁原味的编程风格
最重要的是分析一个项目的能力,该从哪里切入去分析一个项目的主要流程
挑选的这几个开源项目都是代码质量比较高同时是Go优势领域应用项目,非常值得学习。作者本人也是在这几个项目的学习中获益匪浅,根据自己的理解撰写成专刊希望能够对大家有所帮助。
本专刊适用于有一定编程基础,想进一步提升自己的Go语言使用者。
专刊大纲:
专刊配套服务:
读者交流群,任何对于专刊本身或者服务方面的建议都可以随时与牛客运营小姐姐进行沟通(购买后加七七老师微信即可进群)
作者定期回复评论问题
原价30元的专刊
现在仅需20元即可购买
优惠时间截止到2021.2.8零点
优惠暗号:goyuanma
点击阅读原文立即优惠购买专刊
▼▼▼
▼▼▼