物理老师:这道题懂了吗?
学生:懂了。
物理老师:那为什么为啥考试的时候换个方式考你怎么又错了?
学生:因为答案上面没写另一种方式的题啊。
物理老师:看答案懂了不能算懂。
看懂源码并不是真的懂了
看懂了答案并不代表真的懂了,高中生都懂的道理,不能换到编程就犯迷糊了。答案可不可以看?当然可以,但是要在自己充分思考有了自己的答案和解法以后再看。
编程领域也一样,甚至更甚。当大佬们写一个框架或者写一个轮子的时候往往经历以下步骤:
- (发现问题和定义问题)我们遇到了一个什么问题?
- (思考和设计)这个问题用什么方式和结构去解决他?
- (编码和实现)我们怎么用代码去实现它?
当我们丝毫不思考就去看源码,相当于直接跳过了最难的第一第二步骤,最终学到的是什么?大概只是第3步的实现与细节。大佬们是怎么发现大家想要一辆汽车而不是马车的学到了吗?大佬们为什么提供这样的Api和结构设计学到了吗?
所以看懂源码了是真的懂了吗?我们要在这里打一个问好。
编程真正的进阶是正向设计能力
说正向设计之前,我们先说说逆向设计。逆向设计就是指当发现了问题,然后自己并不懂设计,于是从其他相似或者相同的东西直接「借鉴」一套,至于为什么这样设计,自己也不太懂。用上一小节的步骤就是,从 3 -> 2。而正向设计,就是我们上一小节所说的步骤从 1 -> 2 ->3 的步骤正向去设计。正向设计的难度是非常高的。
举个其他领域的例子,比如我国的发动机技术,一开始大家都不会要造,长期都是靠逆向其他国家生产的发动机来生产但也不断的去尝试正向设计。近几年正向设计的技术成熟了开始能够正向设计量产发动机,于是发动机设计个制造的技术这才成为我们自己的技术。
编程是一样的,大家一开始并不懂得如何设计,因为确实很难。但是有些人从一开始就在不断思考如何设计,不断尝试造轮子,而有的人却没有意识到,不去思考设计也不去尝试设计,五年以后结果会如何呢?
所以只会看源码,就仅仅只是在逆向设计,真正的技术并不是自己的。所以我们不能光看源码,而是通过看源码积累自己的设计能力,去思考如果我遇到这个问题我该如何去设计和实现。并且要有点自信,我们自己的设计,不一定就比大佬们的差,甚至一些细节我们有可能做的比大佬们还好!
举个不恰当的例子,十年工地经验的老搬砖师傅,也不如刚从学校毕业的建筑专业学生懂建筑设计。因为设计和实现,已经可以算是不同领域了。
所以编程上要进阶怎么办?刚刚说,大佬们设计框架,开发所谓的新技术的时候经历的三个阶段,能达到上一个阶段就能进一个阶。道理很简单,做起来很难。
站在设计者的视角上
在使用别人的库/框架/新技术的时候,尽量站在设计者的视角,不断去思考如果是我应该应该怎么设计,如果是我能不能设计出更好的实现,这些我觉得不好的设计到底的确是这位大佬水平所限没想到,还是有特殊的技术原因被限制了。
当自己成为一个设计者的时候,一定要有强大的自信和强大的内心。一旦开始设计东西,那么必然会接受挑战和质疑。有些人会觉得我们的设计的不好,有些人觉得应该加上xxx功能等,甚至还有可能有大佬来质疑我们。但是哪怕大佬来了也别怂,来了就刚需要,我们需要坚持自己的设计理念,错了也要勇于承认错误并改正。
看源码之前该做什么准备
看源码之前先别猴急,每一个我们还没看过源码的轮子都是一个宝藏。当我们实际上遇到一个问题的时候,往往没有参考答案。但已经存在的轮子是有源码有参考答案的,那这对于我们设计者来说,就是最好的参考答案。
- 我们首先要搞清楚,一个框架/轮子/新技术他们到底在解决什么问题?在他们出现之前问题是什么?在他们出现之后问题发生了什么变化?这决定了这个框架/轮子/新技术最关键的部分到底在哪里,在自己设计或者看源码的时候避免陷入细枝末节。
- 然后我们要自己思考,如何用自己的思路造一个能解决最关键问题的小轮子 demo,如果能写代码就写代码,不能就把自己的设计思路结构画下来也行。
- 看源码,同时对比自己的设计,看看自己的设计跟大佬的有什么区别,哪里我们设计的更好,哪里大佬设计的更好。那些细节我们没想到,那些细节我们想得更全面。
结论
每一个有源码的框架/轮子/新技术,都是一本有参考答案的练习册,别急着去翻答案。
编辑于 08-03
推荐大家学习“善知软件实训”的线上课程:
https://www.bilibili.com/video/BV1RJ41147qd?from=search&seid=6170019529066609126
https://www.bilibili.com/video/BV1vJ411C7wZ?from=search&seid=4420382012653239507