type
status
date
slug
summary
tags
category
icon
password
拿我过去学习 Java 和最近学习 C++ 的经历来回答这个问题吧,个人愚见,不喜勿喷。
开始时,和很多人一样,我在网上搜索如何学习 C++ 的问题(学习 C++ 需要多久、学习路径、学习资料等等),认真对比视频课程,精心绘制技术路线图,并制定了一个详细的学习计划准备执行,正如我几个月前 C++ 相关资料及计划 中所讲那样。
开始的几天,我按照计划看视频、做练习、做笔记。然而,很快这种学习方式变得枯燥无味。不仅没有提升我的眼界使用自信,反而在无趣和消磨中倍感焦虑。所以我很快就放弃了这种学习方式。
我知道自己不应该做什么:
- 不要刷视频,效率太低且枯燥无味
- 不要看书学习,效率太低且枯燥无味
- 不要看国内任何一个培训机构的课程,效率太低且枯燥无味
讲究实效的学习方式
如果按照一般的学习路径,从 C++ 语法基础开始,依次学习 C++ 核心、高级特性、网络、数据库、Linux 命令、Linux 系统、项目实战……这样一步步学下来,每天花八个小时,至少需要三个月,还要认真练习,还要看《C++ Primer 第5版》、《C++ 对象模型》、《Effective C++》等书籍。仅仅想一想,就令人不寒而栗。这种学习方式就像被要求每顿饭都要吃下十个馒头,而坚持这样做只是为了在面试时证明自己既聪明又勤奋,但面试过后这些知识很快被忘记。更打击人的是,在面试时由于项目深度不够和对项目细节不够了解,一样被淘汰。
存不存在一种既有趣又有效的学习方法呢?假如我们把编程领域最优秀的人所使用的学习方法叠加在一起,并按交叉点多少对这些学习方法进行排序,得到一份榜单。试想一下,“勤奋学习”会在这份榜单上的什么位置呢?让我们将聚光灯转向榜单上的其它学习方法吧。
从做项目开始
游泳要下水,开车要上路,想要学溜冰,最快的方式就是穿上溜冰鞋⛸️,在溜冰场上手舞足蹈。
你一定有很多顾虑,这怎么能行,我还分不清引用和指针、不知道怎么引入一个库、不知道怎么写线程……,放下这些顾虑吧,很多问题都是你凭空想象的。胜任项目开发的工作其实并不需要学习太多知识,而且你过往的经验和接受的教育已经使你具备了项目所需的大部分技能,你只需要稍花一点时间适应就够了。
具体怎么开始呢?首先把项目拆解开,分解成一个个问题。例如,其中一个问题是如何请求 HTTP 接口获取数据。解决这个问题需要用到哪些技术点呢?类、封装、继承、curl、线程、JSON、回调等。OK,那讲让我们在冰场驰骋吧,针对这些技术点一个个做练习。C++ 线程怎么写?线程怎么传参数?怎么编译一个 JSON 库?JSON 怎么使用?等等。在这个过程中,你可能需要不断停下来,翻看菜鸟教程、进行搜索、询问 ChatGPT,顺便记录下编辑器的快捷键。当做完这些小练习后,再把它们组合起来,你已经知道怎么解决请求 HTTP 接口获取数据的问题。此时,你可以在项目中提交自己的代码了。
你会惊奇地发现,做完这些只需一两天的时间。更令人欣喜的是,这个过程中你不是单调地接受别人灌输的知识,每个小练习都带来了反馈,并且你了解了知识之间的相关性。我们的大脑总是倾向于遗忘,相关性是阻止遗忘的有效方式之一。不需要给记忆过多负担,你只需要记住如何请求 HTTP 接口获取数据这个问题就够了。就让我们轻装上阵,继续解决下一个问题。
如果你还不知道做什么项目,可以从自己的兴趣出发,一定要养成做自己项目的习惯。"工作"意味着别人告诉你要做的事情。如果有一天你真的能做出伟大的工作,那很可能是你自己的项目。
忽略细节
细节在项目开发中重要吗?当然重要,但它绝不是最重要的。C++ 学习中需要关注细节吗?没错,但在编程领域,普通开发者总是想抓住所有细节,而优秀开发者知道如何省略不必要的细节。
对于初学者,不要给自己戴上枷锁。搞不懂指针、不会模板函数,真的没什么大不了。写错了,编辑器会提示我们,出了bug再去解决,印象会更加深刻。不同于游泳和开车,写几个bug并不会有生命危险。
不是鼓励你写烂代码,但比写烂代码更糟糕的是畏首畏尾不敢开始。大胆尝试,才能在学习中得到满足和快乐,这样才能激励你像更远更深的地方探索。写出优秀的代码通常需要以下几个阶段:
- 第一阶段:了解业务背景,学习一些理论知识,不加验证地拼凑出最简陋的效果,代码混乱、漏洞百出,难以理解。
- 第二阶段:验证实现细节,使用合适的框架和设计模式进行抽象或解耦,添加必要注释等,代码运行更稳定,阅读起来也更顺畅。(所谓的“工作”到这一步已经结束,因为下个月的 OKR 已经定下。)
- 第三阶段:深入研究学习,考虑时间和空间限制,借鉴 Google LevelDB、微软 Proxy 等优秀库对相似问题的解决方式,进一步用简短有效的方式解决问题。
- 第四阶段:在做其他项目时,接触到的新技巧或对原理的追求给了你新的灵感,你可以尝试新的方法来解决同样的问题,代码行数越来越少,越来越简单。最终,原来的解决方式“退役”了,就像爱迪生时代的低功率电灯被更现代的设计淘汰一样。
- 第五阶段:随着时间的推移,你在一个领域积累的知识越来越多,对原理越来越清晰,那些被奉为经典的框架或工具在你眼里变得缓慢、繁杂,难以忍受。它们与你设想的理想状态相差甚远,最终你决定开发自己的框架或工具。
最开始写不出好看的代码是很正常的。我们通常经历了许多曲折,才找到一条艰难的道路。值得肯定的是,走完这条崎岖的小道需要耐心。但更需要耐心的还在后面。到达目的地后,我们还需要保持思考的耐心。只有继续思考,我们才能不断舍弃多余的弯路,筛选出必要的步骤。最后,长达 1200 行的代码也许就能精简到 120 行。
跟随兴趣
兴趣是伟大工作的引擎,也是舵手。它不仅会驱动你,而且如果你顺其自然,它还会告诉你要做什么。当你有疑问时,就尽量追求兴趣。随着你对某个领域了解的增多,这个领域也会发生变化。一个领域应该随着你对它的了解越来越多而变得越来越有趣。
知识的边界是以分形的形态存在的。当你越靠近知识的边界时,你需要学习的知识就越多,需要涉及的领域也就越广泛,提升也就越缓慢,而所能解决的问题也会越来越多。
如果你还不知道你的兴趣所在,一个简单的方法是看看你闲暇时想做的事情。如果它还没出现,C++ 开发可能只是一个权宜之计。你应该尽可能多尝试其他工作。毕竟,到退休还有很多年,不能从事自己喜欢的事业,职业生涯会少了很多乐趣和激情。
积攒问题
技术的本质是工具,需求的本质是需要,而联系这两者的就是问题。比起鞭辟入里的分析见解和轻松优雅的解决方案,更重要的其实是问题本身,问题让你直面思考。当你观察某项技术的发展历程,不难发现,最大的革新力量都源自于需求所带来的一个个问题。
每当你开启一个领域的学习,随之而来就会有很多不解的问题。你学习触及的范围越广,遇到棘手的问题就会越多。时间有限,解决一个复杂的问题,艰难的部分一天有效的工作时间可能只有四五个小时,所以要留足时间给最重要和最想做的事。很多问题,就让它先积攒起来,问题越多,你也会越富有。
一些问题与别的问题相联系,分解后就可以彼此消除。一些问题解决它需要付出的时间太多,相似的问题越来越多,也就具备了解决的价值。一些问题像是被坚硬外壳包裹着的榛果,我们把它泡在水里,几周或者几个月后,时机成熟,你用手轻轻一压就打开了。
笔记
当你尝试对解决问题的思路做笔记时,如何定义它、如何应用它、学到了什么、没学到什么、有哪些局限性、技术之间的联系等等会变得更加清晰,写笔记的过程,会促使你不断地进行思考。
和代码一样,笔记本身也是你的作品。不要让优秀的思维禁锢在大脑之中,一个开发者如果无法表达自己的思想,就会成为一座永远无法到达的孤岛;而一个可以与人分享技术的开发者,则会在充满感恩的人群中像英雄般受到热烈欢迎。
笔记,也会帮你解决另一个问题——记忆。很多知识你第一次学习时要花费很多时间,但永远记住,不要重复你自己。再次使用它的时候,尽可能减少你所花费的时间。
如果我们被兴趣和志向带到了靠近知识边界的地方,即使没能幸运地发现一个新的突破点,将边界向外扩展一点,也可以在探索的路上留下自己的标记,为后来的开发者指引方向,让他们可以更轻松地抵达我们能到达的最远处。我们也可以为自己在整个职业生涯中奋力追寻完整的自我而感到骄傲。