人物说明:
• 大师 :从事开发工作 20 年有余,精通各类编程语言,有着常人难以匹敌的软件工程经验,说话时惜字如金,有时会让人觉得有些神神叨叨 (但人不坏) 。 • 学徒 :学习编程的时间不长,热衷于提升自己的软件开发技能,勤学好问。
1. 1 行代码与 20 行注释
一天,学徒问大师:「我每天都写很多代码,实现很多需求,为何编码水平却停滞不前?」
大师回答道:「让我看看你在写些什么。」
学徒打开电脑。大师指着屏幕上一行普通的赋值语句,说:「当你有一天意识到,需要在这前面补充 20 行注释时,你就成长了。」说完,大师转身离开了。
piglei 说
在编程时,人们理想中的代码应该是「自说明」的——无需任何注释也很容易理解。
但也有些时候,程序要处理的场景过于复杂,导致我们实际上没法只用代码就将重要信息全部表达出来。此时,如何找到那几行重要的代码,并用大段注释将隐藏的知识有效表达出来,就变得很重要。
作为一名程序员,有能力编写可读性高的代码固然很好,但若是还能信手写出言简意赅的注释与文档,更是锦上添花。
2. 删掉注释
一天,学徒问大师:「我每天都写很多代码,实现很多需求,为何编码水平却停滞不前?」
大师回答道:「让我看看你的代码。」
学徒打开电脑,大师指着屏幕上的一段注释,说:「删掉它。」
学徒照做。沉吟片刻后,学徒大声说道:「我明白了,你是说要关注代码本身的描述性,而不是过度依赖注释来解释代码!」
大师摇摇头,说:「不,我只是想看看你的指法,而据我观察,你甚至不能盲打。」然后,大师转身离开了。
piglei 说
学徒口中的「关注代码的描述性,不要过度依赖注释」诚然很对,但这次,顽皮的大师的关注点实际上在别处:基础技能(盲打)。
在工作中,一名程序员要用到的工具多种多样。我见过一些程序员,他们就像段子中不会盲打的学徒一样,对每日使用的编辑器、IDE 和命令行工具只是略通皮毛,从未花时间系统性地学习过。
但是,深入掌握那些日常工具,以及有意识地增进那些底层技能(比如说打字速度),实际上会对工作效率带来意想不到的丰厚回报。
3. 微服务架构能力
一天,学徒问大师:「我该如何提升自己的微服务架构能力?」
大师回复道:「让我看看你的代码。」
学徒打开电脑,大师看到项目的 utils 目录,其代码规模数倍于其他功能模块的总和。大师说道:「如果你不懂如何组织模块,那么你实际上也无法‘架构’任何其他东西。」
然后,大师转身离开了。
piglei 说
设计一个大的单体项目,与设计由一堆微服务构成的分布式系统之间有许多相通之处,二者遵循一些类似的指导原则。
比方说「单一职责原则」,该原则所回答的问题是:」应该如何设计项目的模块(或微服务),才能让我们在开发功能时,不牵扯太多无关的模块(或微服务)?「它对于两种架构风格同样有效。
「模块化」是软件开发中最重要的指导思想之一,无关架构模式。
4. 聪明的代码
一天,学徒问大师:「我将 10 行 Python 代码用推导式优化成了 1 行,新代码非常漂亮,为何提的 PR(代码合并请求)却被拒绝了?」
大师说:「你的 PR 是我拒绝的。」
见学徒有些吃惊,大师又补充道:「我一个月前写了那 10 行代码。」
学徒的脸有些红,不过仍不想放弃自己的 PR,于是他争辩道:「但是,就在我改动的函数旁边有个类似的函数,那里面有许多更复杂的单行推导式代码,为什么把它们合并进来?」
「哦,那是我 10 年前写的代码。」大师答道。
piglei 说
「什么样的代码是好代码?」
对于这个问题,随着「编码工龄」的增长,我们的答案会发生天翻地覆的变化。
段子里的大师,十年前醉心于用最少的代码表现最复杂的逻辑。十年后,却更倾向于写那些平平无奇的简单代码。
对于代码来说,「可读性」永远是第一位。将诸多逻辑压缩在一行代码中,是一种有趣的思维训练(容易让作者自我感觉良好),但常常以损害可读性为代价。
在编程时,我们需要在「华丽的代码」和「朴实的代码」间找到一个平衡点,而据我观察,随着经验的增长,那个平衡点会持续向着「朴实」那一端移动。
此外,我还有一句话想对学徒说:「既然没 bug,咱不如就别动那些代码了呗?」
Crossin的新书【 码上行动:用ChatGPT学会Python编程 】已经上市了。 本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:
添加微信 crossin123 ,加入编程教室共同学习 ~
感谢 转发 和 点赞 的各位~