阅读源码(III)
往期系列: 《由阅读源码想到》 《由阅读源码想到 | 下篇》
Medium上有一篇文章Why You Don’t Deserve That Dream Developer Job,由一位漂亮的程序媛所写。文章不免贩卖了些焦虑,但也谈到些无法回避的问题:无论对于职业人士想在原有路线上继续发展、还是想要转行另寻它路,其中所蕴含的辛苦和挣扎,都不会有半点减少。
如果你认为自己的当前处境是在一个大坑里,那估计你就得再拼一些,再拼命一点才能够逃出四面埋伏的危地。对这时的你来说,“拼命”已经不是一种崇高的自我感动,而是再现实不过的对恐惧剧烈的回应。并且,你还不能简单地把拼搏交给情绪,你还需要用清晰系统的方式,把一个个横在眼前的障碍清扫干净。
如果需要夯实语言基础,就好好啃文档。
需要提高code技艺,就好好读源码。
需要增加实战经验,就好好积累代码。
不断练习,像学生时期做练习册那样去按部就班地练习。
阅读源码,容易着急。还没做好事情的准备工作,就急着深入细节,读得晕头转向。磨刀不误砍柴工,往往,我们会不由自主地跳过“磨刀”的过程,直接抡起斧头就开干。
那么,阅读源码的磨刀,应该是怎么样的呢?
首先,要伸展性地去解剖每一个概念。例如,对ss这个梯子项目来讲,一上来就陷入到各种网络协议之中,是极其不合适的。你应该先跳出来,从它的最终输出作用开始考察:跨过围墙。然后,根据这一概念不断地细究其功能和联系:例如什么叫做跨越?跨越的方式是什么?为了实现这个跨越动作,还需要什么功能做支撑?进而需要什么模块的实现?再进一步这个模块是由哪些类来实现的?
就这样从最直观的基本点出发,逐渐添加层层深入的细节,一步步去把握这个项目。而不是反过来,一开始就迷失到细节中去。
所以,阅读源码之前,其实需要花费大量功夫去查阅和理解那些宏观的视角,在宏观视角下,理解基建设施模块的必要性和原始考虑是什么,再层层深入。好的研究者,如同好的数学证明的阅读者,会花大力气在前期的宏观概念打磨、动机理清、出发点的明确与思路的连接。之后再进入到细节,有的放矢地施展精湛的技术。
这个漫长的对来龙去脉的探索,还可以再深入一些。你可以把这些零碎的东西,精心整理为slide或者文稿,在写作的整理中,进一步巩固自己在这方面系统而深入的认知。
甚至,就算你在这一过程中,还没有获得足够的正确理解,你也该好好归纳整理自己的所得、所失和当前处境。力求写出一份详尽的状态描述报告。你完全可以期望,在撰写这个总结性的报告中,获得思路的理清与灵感的迸发。
否则,你只会被细节带入到无底洞,既获得不了真知灼见,又会被无尽的挫败感包围,丧失信心。
近期回顾
《2018年03月写字总结》
《再探羊、猪、狗》
《稀缺的时间与守恒的烦恼》
如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

更多信息交流和观点分享,可加入知识星球:

VIP赞赏专区

阅读源码(III)的更多相关文章
- 阅读源码(IV)
往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> <阅读源码(III)> Eric S.Raymond的写于2014年的<How to learn ...
- 【转】使用 vim + ctags + cscope + taglist 阅读源码
原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...
- Spring源码解析——如何阅读源码(转)
最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想. 手码不易,转载请注明:xingoo ...
- Spring源码解析——如何阅读源码
最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想. 手码不易,转载请注明:xingoo ...
- How Tomcat works — 一、怎样阅读源码
在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法.一直想阅读一些开源项目,可是没有合适的机会开始.最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的s ...
- 使用 vim + ctags + cscope + taglist 阅读源码
转自:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找到合 ...
- 转载~Linux 平台下阅读源码的工具
Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...
- Linux 平台下阅读源码的工具链
原文:http://blog.jobbole.com/101322/ 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码. 在Win ...
- Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(集群版)
上篇文章Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)讲了在 idea 里以单机的方式启动zookeeper,这篇介绍一下以集群的方式启动. 集群方式启动,才会真正 ...
随机推荐
- Docker学习(1)安装
1. Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...
- Java-NIO(三):直接缓冲区与非直接缓冲区
直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...
- scrapy中的response
初始化参数 class scrapy.http.Response( url[, status=200, headers, body, flags ] ) 其他成员 url status headers ...
- 如何用Math.max.apply()获取数组最大/小值
最近似乎对JavaScript有点兴趣了~~~打算好好钻研这个东西.可是,一开始就遇到问题了!!! Math.min.apply(obj,args);//这个obj对象将代替Function类里thi ...
- OpenGL 背面剔除
在OpenGL种可使用glEnable(GL_CULL_FACE)开启背面剔除功能,即把那些我们看不见的面删除.但在剔除之前我们需要定义正面和背面,这个可以用法线来理解.在数学学科中,法线是用右手法则 ...
- 列表(list)之二 -运用篇 -快速生成规律性列表
生成列表[1*2,3*4,5*6,7*8,9*10,11*12] 方法一:list1=[]for i in range(1,13,2): list1.append(i*(i+1))print(list ...
- [LeetCode] Boundary of Binary Tree 二叉树的边界
Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...
- electron通讯
Electron桌面应用实现两个窗口(渲染进程)之间的通讯,传输数据: 方法1:在两个网页(渲染进程)间共享数据最简单的方法是使用浏览器中已经实现的 HTML5 API. 其中比较好的方案是用 Sto ...
- ●POJ 3608 Bridge Across Islands
题链: http://poj.org/problem?id=3608 题解: 计算几何,求两个凸包间的最小距离,旋转卡壳 两个凸包间的距离,无非下面三种情况: 所以可以基于旋转卡壳的思想,去求最小距离 ...
- bzoj 4974: 字符串大师
Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度为n的仅由小写字符构成的字符串S,请 ...