这是 B 站上一位 Up 主 @HexUp 关于提升编程能力的一系列视频,我觉得很不错,看完收获挺大,因此整理一遍笔记。

一些总结

📖《刻意练习:如何从新手到大师》


Chapter1:方法论

  1. 什么是编程能力?

编程是一种创造性的工作,给机器设置一系列的指令,让它可以完成一系列的任务,某种程度来说,编程像是在创造一个规则世界,这有点像一个建筑师或者造物主。总之编程能力的核心是能够按照某种需求或构想,写出程序来实现它。

  1. 看书可贵,但动手写代码更重要。

编程是一项贴近实战的技能,只能通过不断的真实练习来提高。看书对于学习编程非常重要,但实际操作更重要,不存在某个人看了某本编程圣经,就突然变得会写程序,动手写非常重要。个人建议是看书占 30%,实际的练习占 70%。

  1. 渐进式提高难度,拓宽能力边界。

如果只是不断地重复些同等水平的代码,也是没什么用的。提升的关键在于渐进式的训练,每一次训练的难度要始终,要恰好比你的能力上限高一点点,具有一定的挑战性,但又不是完全做不出来。当然这是理想情况,现实生活中只需要在一定范围内满足这类条件就行了。有一类程序员被称为 CRUD 程序员,一天又一天只会写这个,那么写一百年也只会 CRUD,等于没有提升。所以我们一 定要刻意的提升自己训练的难度,拓宽自己的能力边界。从长远来看,最好最快的学习方式是平滑地提升难度,这点游戏是做的最好的。我们可以参考游戏关卡的设计,把一个课程的目标进行拆分,变成一个个里程碑逐个击破。最终一点一滴的,就会获得巨大的成长。

  1. 局部的难题,复杂的系统。

局部的难题很像是应试教育里的习题,长远来看,编写复杂的系统才是最值得培养的编程能力。因为绝大多数实用的软件都是一个复杂的系统,这里面也许不需要很多精妙的技巧,一旦你能把东西做出来,把存在性的问题解决了,那么你的目标就已经达到了 80% 甚至 90%,剩下的东西可以慢慢优化,这里面复杂系统的完成能力比解题的技巧更为重要。

  1. 学会问为什么要做这件事,而不是怎么做。

很多人学习效率比较低,其实是因为他们根本不知道自己为什么要学习,而是在用别人的思考来代替自己的。一定要搞清楚自己为什么要学习某种技术,至少要知道自己学了这个东西之后能够干什么。计算机这个领域之间的鸿沟很大,你并不需要做一个全职全能的人,你需要的是在一个领域内做的够好。而首要问题就是要找到一个这样的领域。你需要自己找到这个答案。为什么要学习这项技能?比如你想做游戏,那你需要学习 C++;比如你想开发一个网站,那就需要去学习一些前端和后端的知识,比如前端的 JavaScript,后端的 Java、Go、Python 以及数据库的相关知识。总之搞清楚自己需要学什么,为什么要学,是最重要的问题。

  1. 大神不是教出来的,是靠自学练成的。

计算机是最依靠自学的专业,学校会给你安排一些课程,但说实话,除了一些比较经典技术的课程,很多课程跟工业界已经有了比较大的脱钩。计算机行业的一个特性就是发展很快,学校不可能像工业界一样日新月异,因为学校教的东西都是比较稳定、抽象的,更重要的是为学生指明方向,培养学生的自学和研究能力。我们到了成年之后,面对的知识越来越复杂,不太可能像中学一样,老师填鸭式地把知识塞给学生,大多数的东西都需要自己去学习探索讨,老师的作用更多是指明方向,少走弯路。

  1. 学习多种编程语言。

上面我讨论了在一个领域内进行深耕的重要性,但这并不意味着你就要把自己限制在某个技术栈里。相反的,这样做还是比较危险的。我觉得一个合格的程序员至少应该会半打编程语言。这里说的会不是说一定要去精通,而是说至少用这个语言写过一些程序,知道这个语言的优点和缺点。为什么呢?这是为了避免自己的思维被某一个技术所束缚或者固化。

  1. 慢即是快

对于如何「快速」提升编程能力这个问题,我的答案是不存在的。大多数人都会高估自己在短时间内学习的效率,但是低估长时间积累的力量,很容易三天打鱼两天晒网。但学习绝对是个细水长流的事情,每天学习两个小时,坚持十年,比一次学习是个小时,一个月学一次的效果要好太多了。

  1. 向伟大的程序员学习

这里我隆重的向大家推荐一个人,他叫 Peter Norvig,是谷歌研究院的院长。他写了两本在 AI 领域非常有影响力的书,一本叫《AI, A Modern Approach》,另外一本叫《Paradigms of AI Programming》。他是我见过的代码写的最优美的人之一,甚至可以说没有之一。有兴趣的可以去他的主页或者 Github,看看他的开源的代码,我保证你可以学到非常多的东西。曾经有人这样形容数学家高斯,说他就像一只狡猾的狐狸,给出结论,但是悄悄的擦去自己思考的痕迹,最终的结果却非常优美。Pater 的代码也给我这种感觉,一个非常困难的问题,他会先去进行一些非常简单的函数,每一个都很简洁,但是最终组合在一起的时候,通过简简单单的几十行代码,就解决了一个看起来非常复杂的问题。就好似一个大侦探,从各方面搜集线索、做铺垫、穿针引线,然后在最后的刹那收紧线头,真相大白于天下。

原视频: 点击查看【bilibili】


Chapter2:造轮子

今天给大家推荐一个 Github 上宝藏级的学习资料,它的名字叫做 Build Your Own X,Github 主页长这样,放了一张物理学家费曼的照片,然后配了一句台词:「What I cannot create, I do not understand」 ,意思就是「我不能创造的,我就无法理解」。这个是我认为学习计算机编程最好的方法,自己 造轮子。造轮子是什么意思?就是自己亲手写代码,实现一些工具或者框架。比如你学习操作系统,就自己手写一个操作系统,比如你学习神经网络,就自己出现一个神经网络,再比如你想打游戏,就自己写一个游戏等等。虽然这个世界上有很多的开源工具,而且他们大概率写的比你自己写的好,但是这并不意味着你自己造轮子没有意义。相反,很多东西只有你自己亲手实践一遍,你才能够明白背后真正的原理。你才能明白别人的框架写得好在哪里;才能明白,很多看似简单的问题下面隐藏着很多陷阱。 这个项目里包含了很多教程,涉及到计算机领域的各个方面。比如 3D 渲染器、增强现实、加密货币和区块链、聊天机器人、模拟器、虚拟机、前端框架、游戏,神经网络等等。

原视频: 点击查看【bilibili】


Chapter3:渐进式提升编程能力

渐进式的提升核心在于平滑的提升训练的难度。这里我引用一下 Peter Norvig 的经典文章:《Teach yourself programming in ten years》。他提到,在学习的领域内有一个经典的一万小时定律,或者叫做十年定律,意思就是如果你想成为某一个领域的专家,那么需要一万个小时,或者是十年左右的刻意训练。而且这关键就在于刻意,不仅仅是日复一日的重复同样的工作,而是用正好超出你能力边界一点点的任务,不断的挑战自己,在这个过程中尝试,然后分析自己的表现,找出自己的不足和错误,然后改进,从而达到提升的目的。然后你需要不断的重复这个过程,并且成为专家,并没有一个特别明显的捷径。即便是四岁就已经是音乐神童莫扎特也要等到 13 年之后才写出世界级的音乐。甲壳虫乐队看起来像是在 1964 年的一场音乐会中突然火起来的,但是他们从 1957 年开始就在利物浦和汉堡的小酒吧里边开始了表演,而直到 1967 年,他们才发表了第一个真正的伟大作品,虽然在那之前他们就已经挺火的。这边有两个关键词:长时间刻意练习,二者缺一不可。

不过其实从小白到高手并不需要专家这么久。一般来说,几百个小时就足以让你熟悉某一种编程语言,然后做出一些有意思的东西。真正困难的是从高手成为专家,这个所需要花费的时间远远比从小白到高手所花费的时间要长。为了能够实现平滑的增加难度,你还需要一个技能,那就是拆解自己的目标,逐个击破。下面我们来举一个具体的例子。

假如你是一个小白: 第一阶段,你应该熟悉某一个编程语言的基本语法,比如如何打印 Hello World、如何定义变量、如何进行加减乘除、如何定义一个函数、还有 if-else 循环控制等等。学会语法之后你就可以写一些简单的程序,比如如何遍历一个数组,如何反转一个字符串等等。在这个阶段,虽然你已经掌握了基本语法,但你还不能叫会使用这门编程语言,因为你并没有写出一些有意义的程序。那么如何进阶? 第二阶段,我建议去学习数据结构和刷算法题。刷题在这个阶段超出了你的能力边界一点点,但只要你稍加思考和练习,去完成一些简单和中等的题目完全没有问题。而且算法题的长度一般都不会太长,代码量通常在几十行到几百行之间,非常适合用来磨练技巧,就像钢琴里边的练习曲一样。题也不需要刷太多,一两百道经典的题就足够了。你就基本上算是跨过了小白的阶段,达到了中等玩家水平,编程能力就得到了实打实的提升。 第三阶段,就是能够独立实现一个小型的具有一定完整功能的软件,代码行数通常也在几千行到一万行之间,比如一个玩具的数据库,一个游戏或者一个网站等等。这个规模的软件的复杂度比算法要高一个数量级,目的是为了培养实用软件的编写能力,计算机始终还是一个贴近于实用的学科,绝大部分人最终还是要去写实用的软件的,因此这种练习非常的必要。而且经过前两个阶段的练习,如何编写一个五千行甚至一万行的软件,也只是恰好超出了你的能力边界,因为你已经学会了编写一个几百行的程序,编写一个更大的程序,不过是写几十个这样的程序组合在一起罢了。具体实践的时候,每一个人的节奏都是不一样的,可以根据自己的学习情况进行灵活的调整。反正不要去做无脑的东西,也不要去死磕太难的问题。如果一个问题你一天一夜都想不通,不妨先绕过,到了后面,随着水平的提高可能就迎刃而解。 第四阶段,到此你已经是一个可以胜任实际工作的人了。如果想要继续发展成为一个专家的话,你需要在实际的环境中去锻炼自己的技术,而且不能够再泛泛的学习,需要找到一个细分的方向去深入钻研,比如机器学习、数据库、网页前端、游戏引擎等等。要找一个自己感兴趣的方向,不然很难坚持很久。这个过程的基本原理还是一样的,就是不断的拆解自己的目标,然后平滑的提升自己的能力边界,最后等待时间的魔法力量把自己变成一个专家。

原视频: 点击查看【bilibili】