学而时习之
学而时习之
孔子说:“学而时习之,不亦说乎。”
小时候老师告诉我,这句话的意思是:学过的知识要经常复习,反复背诵,这样就会感到快乐。
我当时就很困惑:反复复习,真的快乐吗?
后来做了 C++ 工程师,我才慢慢觉得,“学而时习之”或许不是让人学完以后拼命复习、不断刷题,把自己卷得精疲力尽。
这里的“习”,可以理解为练习、实践;“时”也不只是“时常”,还可以是“适时”,也就是在合适的时候。
所以,“学而时习之”也可以理解为:
学到一样东西,等到合适的机会亲手用出来。知识从书本走进实践,从“我看懂了”变成“我做到了”,这当然是一件快乐的事。
这种感受,做 C++ 的人应该很熟悉。
你学了指针,刚开始只知道它保存的是一个地址。后来自己写代码,终于弄明白对象为什么会悬空、程序为什么会崩溃,也知道什么时候该用指针,什么时候该交给引用和智能指针。
那一刻,开心。
你学了 RAII,书上说“资源获取即初始化”,看起来只是一句抽象的定义。后来你把文件句柄、互斥锁和网络连接封装进对象,让资源随着生命周期自动释放,再也不必在每个分支里小心翼翼地清理。
代码干净了,泄漏消失了。
开心。
你学了移动语义,知道有左值、右值,知道 std::move 本身并不真的移动任何东西。直到有一天,你在一个性能敏感的模块里减少了不必要的拷贝,延迟降了,吞吐量上去了。
这时候,书上的概念才真正变成了你的能力。
开心。
你学了模板,第一次看见那些尖括号时,只觉得眼花缭乱。后来遇到几套结构相似的代码,你用泛型把重复逻辑收拢起来,还让编译器帮你检查类型。
开心。
你学了并发编程,知道什么是互斥锁、原子变量和内存序。真正排查过一次死锁,修掉过一次数据竞争,再回头理解“线程安全”这四个字,感受就完全不同了。
虽然过程未必轻松,但问题解决的那一刻,确实开心。
这才是我理解的“习”:不是把同一道题机械地做一百遍,而是把学到的知识放进真实的问题里,让它经受编译器、测试、性能数据和生产环境的检验。
而“时”同样重要。
不是每学到一个 C++ 特性,都要立刻塞进项目。
刚学会模板元编程,不代表每个函数都要写成模板;刚学会继承,不代表所有对象都需要一棵复杂的类层次;刚学会设计模式,也不必把一个简单的 if 包装成十几个类。
合适的问题出现时,再使用合适的工具。
需要表达独占所有权时,用 std::unique_ptr;需要共享所有权时,先确认它确实是共享关系,再考虑 std::shared_ptr;需要提升性能时,先测量瓶颈,而不是凭感觉到处添加缓存、对象池和无锁结构。
这就是“适时”。
孟子评价孔子是“圣之时者也”,强调的正是顺应时宜、把握时机。古人所说的“时雨”,也是在庄稼真正需要的时候落下的雨。
知识也是如此。
用得太早,可能是在炫技;用得太晚,可能已经付出了代价;在问题恰好出现的时候,把学过的东西用出来,它才真正成为你的能力。
王阳明后来讲:“知是行之始,行是知之成。”
放在编程里也一样。
文档看懂了,只是“知”的开始;代码写出来,能够编译、运行、测试,并真正解决问题,才算“行”的完成。
所以,我现在理解的“学而时习之”,并不是学完以后疯狂重复。
它不是刚学会写一个循环,就罚自己手写一百遍;不是刚理解智能指针,就把项目里所有裸指针全部替换掉;也不是刚看完一本《Effective C++》,就连夜发动一场覆盖整个代码库的“现代化改造”。
那不叫学习的快乐,那很可能只是制造新的技术债。
真正的快乐,是今天学会了一个概念,过些时候遇到一个真实问题,忽然发现它正好能派上用场。
你把代码写出来。
编译通过。
测试全绿。
程序稳定运行。
然后你意识到:原来这次,我真的学会了。
这大概就是一个 C++ 工程师的“不亦说乎”。
至于一天刷几百道题、为了使用新语法而使用新语法、把所有代码都改造成自己刚学会的模样,大可不必。
不要卷自己,也不要卷代码。
毕竟孔子还说过:
“过犹不及。”
