代码规范性与不同场景的要求

代码规范性概述

对于程序员而言,写代码在多个场合都会遇到。写代码的时候,代码规范性是一个值得关注的问题。

代码规范性可以列举出很多点,部分常见的规范标准如下。

  1. 命名规范。无论是变量、函数/方法还是类/模块,都应遵循各自的大小写规则,并且命名应该有充分的描述性。

  2. 代码格式规范。使用一致的缩进方式,单行代码的长度不宜过长。

  3. 代码结构规范。每个函数/方法或类的职责应该单一,避免同时具有多个职责。函数/方法应保持简短,避免过长。应避免嵌套层数过多的情况。

  4. 注释规范。注释的目的是解释代码本身复杂或不直观的部分,当代码本身的清晰度较高时,注释应较少,避免过多冗余的注释。注释不应该作用于不需要保留的代码,如果一段代码不需要保留,则应将其删除,而不是将其注释。

实际可以列举的代码规范性可以更多。虽然代码规范性可以列举出很多点,但是其核心目的是一致的,主要是提升可读性和降低维护成本。无论是个人开发的代码还是团队开发的代码,遵循代码规范性,提升可读性和降低维护成本,都有助于提高效率和减少错误率。

代码规范性的正面效果是显著的,但是并不意味着代码规范性没有负面效果。代码规范性的负面效果也很明显,为了遵循代码规范性,需要花更多的时间,主要体现在需要有更多的思考,选择合适的命名、设计合适的代码结构、撰写合适的注释都需要花时间。

正因为代码规范性既有正面效果也有负面效果,所以实际写代码时,不同场景的代码规范性要求也是有所不同的。

不同场景的代码规范性要求

实际写代码的场景有多种,每种场景的代码规范性要求有所不同。有些场景下,代码规范性的要求可以降低,这并非说明代码规范性不重要,而是综合考虑不同因素时的取舍。需要考虑的因素主要包括时间是有限还是充裕、协作参与人数与代码的生命周期长度。由于代码规范性的负面效果主要体现在写代码时需要有更多的思考、花更多的时间,因此时间因素直接决定了是否有条件更好地落实代码规范性。以下列举 5 种不同的场景,包括 3 种时间有限的场景和 2 种时间充裕的场景。

时间有限的场景

线上竞赛

线上竞赛是由系统根据测试用例通过情况自行评分的算法竞赛。典型的线上竞赛包括 LeetCode 的周赛,以及其他算法网站或平台的竞赛。

线上竞赛的目标是在限定时间内完成并通过尽可能多的题目,每道题目的通过标准是该题目的所有测试用例都运行通过,结果正确且复杂度符合要求。大多数线上竞赛都会将用时作为得分相同时的排名依据,因此线上竞赛的目标还包括用时最短。

线上竞赛的场景下,时间有限而且需要追求用时最短,代码由一人完成,代码的生命周期长度仅限于竞赛期间以及竞赛结束之后的较短时间段,而且竞赛结束之后虽然可以被看到代码但是看代码的目的是排查作弊而不是检验代码规范性。线上竞赛时追求代码规范性并不会带来更多的收益,只会产生更多的时间成本,因此没有代码规范性的要求,最明智的做法是放弃代码规范性。

理论上,线上竞赛不需要考虑代码规范性,可以使用任意命名方式,但是实际操作时通常会选择短命名或能体现含义的命名,不会使用又长又不能体现含义的命名,这也是遵循线上竞赛的目标的最佳决策。如果使用奇怪的变量名,反而是不正常的行为。LeetCode 的周赛为了防止 AI 作弊,会在题目中隐性加入一句使用指定变量名存储中间结果的要求,这句要求在正常阅读时不会显示,但是如果复制题目内容,则会藏在题目内容中,代码中出现奇怪变量名的选手必定是使用 AI 作弊的选手。

虽然线上竞赛是最不需要考虑代码规范性的场景,但是仍不建议完全放弃代码规范性。线上竞赛的系统可能会检测不同选手的代码之间的相似度,如果存在相似度过高的情况则可能会被认定为抄袭作弊,不排除误判的可能。由于线上竞赛时普遍追求变量名短,节省时间,因此为了避免和其他选手的代码出现相似度过高的情况,可以在命名方面相对规范,避免单字母变量名,而是尽可能使用表示特定含义的单词或单词缩写作为变量名,可以很大程度降低和其他选手的代码相似度。

求职机试

求职机试是部分公司在招聘时给求职者做的线上机试,大多考查数据结构和算法,通常作为求职面试之前的环节。典型的求职机试平台包括 LeetCode 和 Codility。

求职机试的目标是在限定时间内完成所有题目并尽可能得高分,每道题目的得分根据测试用例的通过情况决定,测试用例覆盖的情况包括各种不同类型的情况以及数据规模大的情况,测试代码的正确性以及复杂度是否符合要求。求职机试和线上竞赛的不同之处在于,求职机试并不是多人同时参与的,不存在实时排名,也不会将用时作为评分依据,因此目标不包括用时最短。

求职机试的场景下,时间有限,代码由一人完成,代码的生命周期长度仅限于机试期间以及机试结束之后的较短时间段,因此代码规范性的要求较低,应优先考虑正确性和复杂度符合要求。但是求职机试的代码可能会被面试官看到,因此代码规范性的要求并非没有,在用时较短的情况下,可以追求代码规范性。

求职面试

求职面试是公司在招聘时由面试官与求职者面对面交谈的考查形式,是求职的核心环节。面试包括线下的现场面试和线上的音视频面试。

求职面试的问题会涉及多个方面,包括代码题,代码题可能考查数据结构和算法,也可能考查其他方面。

求职面试和求职机试的不同之处在于,求职面试多了求职者和面试官的交谈过程,面试官也能看到求职者写代码的全过程。虽然时间仍有限,代码几乎都由求职者一人完成,代码的生命周期长度仅限于面试期间以及面试结束之后的较短时间段,但是由于面试官会看到求职者写代码的全过程,面试官与求职者的交谈也会决定代码内容,因此代码规范性的要求显著更高。

求职面试中,除了交叉面试之外,大多数情况下的面试官都是将来的同事和领导。从面试官的角度,可以将面试看成是与未来的同事或下属的一次合作;从求职者的角度,可以将面试看成是与未来的同事或领导的一次合作。既然是合作,就是一次模拟的团队写作,代码规范性是面试中的一个重要考查项,很大程度反映了求职者的未来工作表现。

时间充裕的场景

题解代码

在 LeetCode 等算法和代码的网站或平台,除了做题之外,还有题解功能。题解的作用是给其他人展示解题思路和正确的代码。

虽然题解代码由题解作者一人完成,但是题解发布之后会被很多人阅读,代码的生命周期长,因此题解代码的代码规范性的要求显著高于线上竞赛和求职机试,也高于求职面试。题解代码的代码规范性的重要性体现在如下方面。

  1. 作为题解,无论是思路还是代码,都是给读者看的,因此必须做到思路清晰、可读性强,否则就失去了题解的意义。

  2. 求职面试的面试官对题目非常熟悉,也知道正确思路,通过阅读求职者的代码可以快速判断解法是否正确以及是否符合复杂度要求。题解的读者的水平可能相差很多,虽然不乏高手,但是也有很多读者是首次遇到该题的新手,规范的代码更有助于读者理解正确的解题思路。

工程代码

工程代码是工作场景下由团队完成的代码,其代码规范性的要求最高,显著高于题解代码的代码规范性。工程代码和题解代码相比,其代码规范性的重要性体现在如下方面。

  1. 题解代码是解决特定的问题的,问题规模小,代码通常较短,而且只需要处理合法输入,不需要处理非法输入等其他情况;工程代码处理的场景显著更复杂,代码量更大,而且除了功能本身之外,还有错误处理、非法输入兼容、接口设计、可扩展性等大量工程要求。

  2. 题解代码是静态的,只要题目不变,题解代码就不需要变;工程代码是动态的,需要长期迭代,代码会被很多人阅读和修改。

工程代码的场景和前面提到的场景都不同的点在于长期迭代和多人参与,这一点决定了工程代码的代码规范性的要求远高于前面提到的场景。前面提到的场景,即使代码会给其他人看,代码也是静态和只有一人参与的,代码完成之后几乎不存在更新代码的成本;工程代码的场景,代码的长期迭代和多人参与决定了更新代码的成本极高,因此非常有必要降低更新代码的成本。

工程代码如果不遵循代码规范,则可能在最初阶段用时短、时间成本低,但是到后期维护与修改时,必然会因为不遵循代码规范而付出更多的时间成本,而且多付出的时间成本远超过最初阶段节省的时间成本。反之,遵循代码规范虽然从短期而言会多花时间成本,但是从长期而言可以节省更多的时间成本,长期节省的时间成本远超过短期多花的时间成本。因此,工程代码的场景下,遵循代码规范是完全有必要的。

总结

不同场景的代码规范性要求不同,并不表示特定场景下的代码规范性不重要或错误,而是综合考虑不同因素时的取舍。

在时间有限的场景下,代码规范性要求相对较低,特别是线上竞赛的纯系统评分的场景,代码规范性要求甚至可以没有。这并不表示遵循代码规范性是错误的,而是有优先级更高的核心目标,并且放弃代码规范性并不会影响达到核心目标,反而可以节省时间更好地达到核心目标。虽然时间有限,但是在条件允许且不影响核心目标的情况下,遵循代码规范性总是更好的。

在时间充裕的场景下,代码规范性要求会显著更高。由于不需要赶时间,因此没有优先级更高的目标要求放弃代码规范性,此时应将代码规范性作为写代码的最高目标。

相关推荐
深圳老胡3 小时前
C语言实现C++面向对象程序设计示例
笔记·stm32·单片机·代码规范
深圳老胡7 小时前
STM32C5 系列 MCU 的 FreeRTOS 软件架构搭建指南:外设配置与应用实践
笔记·stm32·单片机·代码规范
高晶2 天前
Android 文件管理器开发实战指南
程序员·代码规范
2 天前
正则少一个 re.MULTILINE,我的安全闸门全程空转——而我以为修好了
后端·代码规范
咖啡八杯2 天前
异常体系设计:三类策略(i18n code、message、受检异常)
java·架构·代码规范
浮链序3 天前
Shopify 把 10 亿商品开放给任意 agent 了:我用零依赖 Python 撸了个带预算闸门的代购网关
后端·代码规范
这个DBA有点耶4 天前
ELT 工具选型完整指南:从 ETL 差异分析到工程落地
数据库·架构·代码规范
这个DBA有点耶4 天前
分布式事务深度:TCC空回滚、悬挂与Saga补偿风暴的根因与解法
数据库·mysql·代码规范
这个DBA有点耶6 天前
为什么UPDATE比SELECT危险得多?锁范围等于扫描行数
数据库·架构·代码规范