“cpp是不是特别难?我是不是不适合学?”每次看到这种问题,我都想先让对方深呼吸一下,因为很多焦虑不是cpp本身给的,而是被“听说很难”“别人都在卷”“不学就落后”这些话吓出来的,作为一个平时写文章、也偶尔折腾代码的自媒体作者,我对cpp的感情挺复杂:它不轻松,但也没必要被妖魔化;它有门槛,但门槛不等于墙。
先说一个特别具体的生活实例,我表弟去年上大学,专业跟计算机沾边,开学没多久,他给我发消息,说第一节cpp课老师让打印一个菱形,他折腾了两个小时,最后屏幕上出来一个歪歪扭扭的“半菱形”,他当时特别崩溃,说自己是不是脑子不适合编程,我让他把代码发来,一看,问题其实很朴素:循环边界没想清楚,空格和星号的数量关系也没画出来,后来我让他在纸上先画三行,标清楚每行几个空格、几个星号,再回去改代码,十分钟后,他打印出来了,虽然还是有点丑,但至少成了,那天他跟我说了一句特别真实的话:“原来不是我不会,是我一上来就想直接写,没先把问题拆开。”
这个例子我后来经常拿来聊cpp,很多人对cpp的第一印象,是语法复杂、符号多、报错长,像一堵墙,但真正让人卡住的,往往不是“墙太高”,而是学习方式太急,cpp需要你对内存、类型、作用域、编译过程有一些基本理解,它不像某些语言那样“写两行就能跑出很热闹的结果”,可也正因为这样,它特别适合训练一个人把问题拆清楚、把边界想明白、把细节落实的习惯,这个习惯,不只对编程有用,对写文章、做项目、甚至安排一次旅行都有用。
我还有一个同事,之前做数据分析,平时用Python很顺手,有一次我们需要处理一个本地的小工具,要求运行快、依赖少、最好能直接编译成一个可执行文件发给别人,他第一反应还是想用Python写,结果打包和环境配置折腾了半天,后来我们换了个思路,用cpp写了一个很小的命令行程序,功能不复杂,就是读文件、做筛选、输出结果,写的过程中他也吐槽:“这类型和指针真烦。”但程序跑起来那一刻,他承认了一件事:cpp在某些场景下确实有它的位置,不是说Python不好,而是工具要跟任务匹配,你用扳手拧螺丝可以,但拿它去敲钉子,体验当然不会好。
所以我的第一个个人观点是:cpp值不值得学,不能脱离目标讨论,如果你只是想快速做网页、写脚本、处理表格,那未必需要从cpp开始;如果你对系统底层、性能敏感的程序、游戏引擎、嵌入式、编译器等方向感兴趣,那cpp很难绕开,最怕的是,很多人还没想清楚自己要做什么,就先被“cpp很难”或者“cpp很高级”这两种叙事推着走,前者让人不敢开始,后者让人学得很虚。
第二个生活实例来自我自己,前阵子我想给公众号整理素材,写一个很小的本地程序,把一堆文本文件按关键词筛出来,再生成一个汇总,说实话,这个需求用别的语言也能做,但我那段时间正好想重新熟悉cpp,就拿它练手,结果第一天我就被文件路径和编码问题教育了:在纸上想得很顺,真跑起来不是读不到文件,就是中文乱码,后来我一点点加日志、缩小范围、先用一个固定文件测试,再扩展到整个文件夹,整个过程不快,但特别踏实,每修好一个bug,我都知道是哪里出了问题,而不是“玄学地好了”,这就是cpp给我的一种反馈:它不太哄人,但你认真对待它,它也会认真回应你。
也正因为有这种体验,我不太喜欢一些自媒体把cpp写成“王者语言”,好像学了就高人一等;也不喜欢另一种极端,说“现在谁还学cpp,纯属受苦”,这两种说法都太省事了,省事到忽略了具体的人、具体的目标和具体的场景,语言是工具,工具就有适用边界,cpp的优势和代价都很明显:它给你更大的控制权,也要求你承担更多细节责任;它能做出性能很好的程序,也可能让你在指针和生命周期里绕很久,这不是“好”或“坏”能一句话概括的。
我的第三个观点是:学cpp,最好别从“收藏一百个教程”开始,而从一个能看见结果的小项目开始,比如做一个命令行待办清单、一个简单的通讯录、一个文本统计工具,哪怕很简陋,也比只看视频强,因为cpp的很多概念,只有在你亲自踩过坑之后才会变得具体,就像我表弟打印菱形,老师在台上讲循环是一回事,他自己把空格数量算错一次,又是另一回事,学习这件事,有时候真得允许自己笨拙一点。
最后我想说,如果你现在正被cpp折磨,先别急着给自己下结论,你可以把问题缩小一点:是语法不熟,还是思路没拆开?是环境没配好,还是对某个概念理解偏了?把“我学不会cpp”换成“我卡在这个具体问题上”,压力会小很多,行动也会清楚很多,cpp不是洪水猛兽,也不是万能钥匙,它更像一门要求较高的手艺,适合那些愿意耐心打磨、并且确实需要它的人,学不学,值不值,最终还是要回到你自己的目标上,别被焦虑推着跑,先想清楚你要去哪里,再决定要不要带上这件工具。
