学而时习之

孔子说:“学而时习之,不亦说乎。”

小时候老师告诉我,这句话的意思是:学过的知识要经常复习,反复背诵,这样就会感到快乐。

我当时就很困惑:反复复习,真的快乐吗?

后来做了 C++ 工程师,我才慢慢觉得,“学而时习之”或许不是让人学完以后拼命复习、不断刷题,把自己卷得精疲力尽。

这里的“习”,可以理解为练习、实践;“时”也不只是“时常”,还可以是“适时”,也就是在合适的时候。

所以,“学而时习之”也可以理解为:

学到一样东西,等到合适的机会亲手用出来。知识从书本走进实践,从“我看懂了”变成“我做到了”,这当然是一件快乐的事。

这种感受,做 C++ 的人应该很熟悉。

你学了指针,刚开始只知道它保存的是一个地址。后来自己写代码,终于弄明白对象为什么会悬空、程序为什么会崩溃,也知道什么时候该用指针,什么时候该交给引用和智能指针。

那一刻,开心。

你学了 RAII,书上说“资源获取即初始化”,看起来只是一句抽象的定义。后来你把文件句柄、互斥锁和网络连接封装进对象,让资源随着生命周期自动释放,再也不必在每个分支里小心翼翼地清理。

代码干净了,泄漏消失了。

开心。

你学了移动语义,知道有左值、右值,知道 std::move 本身并不真的移动任何东西。直到有一天,你在一个性能敏感的模块里减少了不必要的拷贝,延迟降了,吞吐量上去了。

这时候,书上的概念才真正变成了你的能力。

开心。

你学了模板,第一次看见那些尖括号时,只觉得眼花缭乱。后来遇到几套结构相似的代码,你用泛型把重复逻辑收拢起来,还让编译器帮你检查类型。

开心。

你学了并发编程,知道什么是互斥锁、原子变量和内存序。真正排查过一次死锁,修掉过一次数据竞争,再回头理解“线程安全”这四个字,感受就完全不同了。

虽然过程未必轻松,但问题解决的那一刻,确实开心。

这才是我理解的“习”:不是把同一道题机械地做一百遍,而是把学到的知识放进真实的问题里,让它经受编译器、测试、性能数据和生产环境的检验。

而“时”同样重要。

不是每学到一个 C++ 特性,都要立刻塞进项目。

刚学会模板元编程,不代表每个函数都要写成模板;刚学会继承,不代表所有对象都需要一棵复杂的类层次;刚学会设计模式,也不必把一个简单的 if 包装成十几个类。

合适的问题出现时,再使用合适的工具。

需要表达独占所有权时,用 std::unique_ptr;需要共享所有权时,先确认它确实是共享关系,再考虑 std::shared_ptr;需要提升性能时,先测量瓶颈,而不是凭感觉到处添加缓存、对象池和无锁结构。

这就是“适时”。

孟子评价孔子是“圣之时者也”,强调的正是顺应时宜、把握时机。古人所说的“时雨”,也是在庄稼真正需要的时候落下的雨。

知识也是如此。

用得太早,可能是在炫技;用得太晚,可能已经付出了代价;在问题恰好出现的时候,把学过的东西用出来,它才真正成为你的能力。

王阳明后来讲:“知是行之始,行是知之成。”

放在编程里也一样。

文档看懂了,只是“知”的开始;代码写出来,能够编译、运行、测试,并真正解决问题,才算“行”的完成。

所以,我现在理解的“学而时习之”,并不是学完以后疯狂重复。

它不是刚学会写一个循环,就罚自己手写一百遍;不是刚理解智能指针,就把项目里所有裸指针全部替换掉;也不是刚看完一本《Effective C++》,就连夜发动一场覆盖整个代码库的“现代化改造”。

那不叫学习的快乐,那很可能只是制造新的技术债。

真正的快乐,是今天学会了一个概念,过些时候遇到一个真实问题,忽然发现它正好能派上用场。

你把代码写出来。

编译通过。

测试全绿。

程序稳定运行。

然后你意识到:原来这次,我真的学会了。

这大概就是一个 C++ 工程师的“不亦说乎”。

至于一天刷几百道题、为了使用新语法而使用新语法、把所有代码都改造成自己刚学会的模样,大可不必。

不要卷自己,也不要卷代码。

毕竟孔子还说过:

“过犹不及。”