我写程序三年,程序程最痛的员教领悟是:教程里教的都是语法,没人教你如何把代码当作一块泥巴来捏。程序程真正的员教程序员教程,第一课应该是程序程“拆”。
去年我带了个实习生,员教他啃完两本经典书,程序程能默写设计模式,员教却对着一个五百行的程序程遗留函数发呆。我说你试试把它拆成五个小函数。员教他拆了,程序程但拆完更乱——因为他不明白,员教拆的程序程目的是让每个函数只回答一个问题,而不是员教让代码看起来更“整洁”。他拆出来的程序程每个小函数都在问“这个值怎么来”,而不是“这个步骤要什么”。后来我让他先写注释,用大白话把流程讲给自己听,讲不通的地方就是需要拆的地方。这比任何重构工具都管用。
另一个真相是:调试能力比写代码能力值钱十倍。很多人遇到bug就printf,打日志,像无头苍蝇。我见过一个老哥,他debug的方式是先把代码念出声来,一句一句念,念到逻辑断裂的地方,bug自己就跳出来了。这不是玄学。当你念“然后这个变量被赋值为空”,你的耳朵会比眼睛更早发现“等等,这里不该为空”。人脑处理听觉的路径和视觉不同,念出来能强制你走线性逻辑,而看代码容易跳着走。
关于学习路径,我得泼盆冷水。别一上来就学框架。Spring Boot、React、Vue,这些是别人的积木,你拼得再快,也不代表你会造积木。我见过太多简历写着“精通Spring全家桶”的人,让他写个简单的并发队列,手都在抖。基础是什么?是内存怎么布局,是栈和堆的区别,是哈希表为什么是O(1)。这些不玄乎,但决定了你遇到线上OOM时,是能冷静分析还是只能重启服务器。
还有件事,没人告诉你:代码写出来是给人看的,顺便给机器执行。所以命名比注释重要,结构比技巧重要。我给自己定了个规矩——如果一个函数名超过三个动词,那这个函数肯定做多了。比如processDataAndSendEmailAndUpdateStatus(),这种名字一出现,就该拆成三步。别觉得麻烦,你维护三个月前的代码时,会感谢当初那个愿意多敲几个字符的自己。
最后说个反直觉的观察。很多程序员把“高效”挂在嘴边,但真正的高手往往看起来很慢。他们写一行,想三行,删两行。我认识一个做数据库内核的,一天写不到五十行代码,但他那五十行能跑五年不崩。慢不是低效,是你在用思考换未来的时间。代码这行当,快是容易的,慢才是本事。
所以,别急着买课,别急着刷题。先找个烂项目,拆它,念它,改它。拆坏了不赔钱,念错了没人笑,改崩了正好练手。这才是程序员教程的第一章——剩下的,都是注释。