代码风格作为开发标准

让我们马上,这与括号无关。 在这里,我们将讨论我们的大脑如何工作以及代码风格为何有助于确保项目的线性发展,显着加速新员工的适应以及总体上形成并教育发展文化。 我试图在一篇文章中收集有关开发人员大脑工作以及程序员如何阅读代码的一些研究和原理,并分享个人实验的结果。

有意思吗 欢迎来到猫。



你好 我叫Anton,我用ManyChat编写后端。 最近,我们专门讨论了PHP开发,在此我谈到了将代码样式作为开发标准之一的问题。 收到反馈后,他顺利参加了活动的来宾,我们决定解密有关Habr的报告。 对于那些特别欣赏个人存在感,并且更喜欢看视频而不是阅读文字的人,我们广播了该广播,现已开放。 您可以在这里找到它 对于那些喜欢Longrid的人,欢迎进一步。

我们的大脑是一个神经网络


值得一开始的是它的一般工作方式以及为什么您需要我稍后要讨论的所有内容。 你们中的许多人都熟悉神经网络的概念,或者至少听说过这个短语,这几年来几乎一直是IT空间和市场营销中炒作的象征。 即使是现在,许多公司仍在其产品中添加“基于AI的产品”,例如饺子上的“ Non-GMO”标签。 神经网络基于模式识别原理运行,在处理同类数据时非常有效。 这些是图像,视频,声音等。 与代码样式有关的重点是它们建立的原理。 感知器(网络单元)被描述为大脑过程,并且由于计算能力差而被放置很久之后才可以实现为功能,可行且高效的网络。 我们的大脑虽然功能强大得多,但是却以类似的方式工作。 结果,一个人从出生到死亡都使用受过训练的神经网络的力量,并且训练几乎是无缝的。

因此,我们只感知图像。 对于大脑来说,没有文字,声音和其他东西-我们只有分解后才能感知所有这些。 粗略地说,我们将图像“逐像素”分离,将其添加到内存中,然后借助联想思维,我们识别出各种对象。 因此,我们可以理解是应该逃避蛇的攻击还是骑自行车踩踏板。 这是标准感知器的示意图,它说明了对象的分类是如何发生的。 对于那些不熟悉感知器原理的人,可能看起来有些混乱。 但是由于这种平衡和称重方案,神经网络可以快速,有效地识别图像。

图片

通过编程,您可以回想起DuckType原理,即如果认为某个对象像鸭子一样游泳,像鸭子一样飞行,像鸭子一样嘎嘎叫,那它就是鸭子。 对象检测的奇异近似。 对于我们的大脑,对象识别会立即发生。 培训是一个更长的过程。 因此,您可以想象这个过程以及一个只学单词的幼儿的训练。 您拿起一个苹果,指向并说:“这是一个苹果。” 再换一个,再重复一次:“这是一个苹果。”

图片

依此类推,直到结果确定。 绿色,黄色,红色,球形,细长形,有无切屑,黑白。 年复一年,孩子在经验知识的基础上建立自己的基础。 我认为原则很明确。 训练神经网络时,我们做同样的事情。 从一个对象到另一个对象,或更准确地说,从一个图像到另一个图像。

程序员如何读取代码


当我们使用代码时,也会发生同样的事情。 我们打开页面,对其进行研究,将其分解为块,识别不同的部分-我们轻松地将属性与函数,方法和属性的隔离级别,常量等进行分离。 我们通过块来识别所有这些代码,因此,代码样式的一个重要方面是将整个代码转换为相同的形式。 这是表征代码可读性的关键因素。

为什么这很重要? 因为他大部分时间都在读代码。 找不到一些直接相关,这在很大程度上取决于资格,语言(例如,Python缩进,并且结构不正确的代码根本行不通),代码质量等。 但是,您需要花费50%的时间来阅读自己和他人的代码。 如果代码很复杂,那么指示器可以达到75%;如果代码真的很糟糕,则可以花费95%的时间阅读并尝试找出在哪里添加一行以纠正某种缺陷。 现在是问题。 如果看到代码花费其时间的75%的时间读取磁盘或将内存分配给双链表,该怎么办? 程序员将尝试优化此过程,尝试更改算法,应用更有效的存储结构等。 因此,当花费的时间变得至关重要时,我开始检查此过程。 可以说,这是大脑,它比任何计算机都要强大得多,并且可以存储大约1PB的数据。 但是,在开发用于处理代码的思维框架(形成代码阅读习惯的隐藏过程)的过程中,我遇到了一些研究,其中传感器监视初学者和有经验的程序员的眼球运动。 看起来像这样:
初学者



经验丰富



注意有经验的程序员的工作。 它选择代码块,对其进行分解,然后逐块读取它们,突出显示关键部分并分析其工作。 初学者匆匆忙忙地逐行,只是想了解这里发生了什么。 大部分时间都花在整理全局图片和读取代码上,而这些检查都是在不断进行交叉检查的情况下进行的。

该视频来自2012年,非常古老,录制的目的是研究程序员的大脑过程。 您可以在这里这里阅读更多内容。

现在是时候回到感知器操作的描述了。 这清楚地展示了经过训练和未经训练的神经网络的工作。 基于他的知识,有经验的程序员像解释器一样遵循代码,通常甚至没有意识到。 可以采用与训练神经网络相同的方法来解决该问题。

有两种方法可以加快代码读取速度:

  1. 不断建立关于代码外观的开发人员知识库。 这意味着终身学习,这将不断扩展网络的功能。
  2. 将所有代码统一为一个标准,设置相同的代码样式

当然,很明显,第一种方法非常费力。 在这种情况下,程序员需要不断读取存储库。 考虑到人员流动,新技术和新实践的出现,这几乎变得不可能。 排除方法仍然是代码的样式化,这将减少分解的影响,而只影响业务逻辑。

钢琴调音器数量


想象一下,一个由5人组成的团队根据需要编写系统的所有模块和组件,不断接收重叠的任务,调整彼此的代码。 假设每个人都以自己的方式书写,那么写条件的所有选项的可能数目是多少? 5.我们有多少个有效块? 所有构造,单参数和多参数函数的调用,名称空间,类,特征,接口,块的位置,静态变量,可见性区域等。 前提是每个人只能使用一种写作风格,这不同于其他所有人的风格。 如果一个人十岁呢? 那50点呢? 显然,随着人数的增加,由于写入同一块的方法数量有限,方差将减小。 这是我们不投资主要编程问题之一的第一个层次-变量命名。 甚至没有考虑乘数和所有可能组合的影响。 最重要的是分离风格,在空格和标签上的缩进,喜欢面条等。 等 新专家不断涌现,而旧专家则要离开。 结果,您将获得大量无法读取的代码,这些代码无法习惯,也无法从公司的程序员那里开发出训练有素的神经网络。

我们的大脑很懒


我们的中央处理器在头骨中的另一个有趣的效果是对新信息的极端负面感知。 我们的大脑很懒。 大脑的质量约为总体重的1.5–2%,因此会消耗其全部能量的25%。 对大脑而言,最耗费资源的手术之一过去是,现在是而且仍然是注意力集中的时期。 您可以将最大浓度保持20-25分钟(采用Pomodoro技术),在此期间,大脑会吞噬掉与全天主观休息所需的葡萄糖一样多的葡萄糖。 处理新数据是非常耗费资源的过程。 大脑的主要目标之一就是节省这些相同的资源。 这是由于我们的心理模型的工作。 一种心理障碍。 看起来像这样。 您开始学习新知识。 某些新事物很难提供,并且由于缺乏明显的进步动力,您的自尊心由于“我很愚蠢!”的思想而开始下降。 我们的心理是这样安排的:整个态度取决于自尊,而我们的态度又取决于我们在社会上的成功。 为了不破坏适应性依赖的基本社会要求,我们的大脑开始抵制降低自尊心的活动。 因此,您想看电视连续剧,阅读哈伯尔文,去喝咖啡,坐在社交场所。 网络等 任何事情,只是不学习Landau领域的理论。 或修复难以再现的错误。 或者...阅读难以理解的低质量代码。 大脑如何根据该区域的限制进行行为的一个很好的例子是大约70-80岁的人,他们指出空白,不想学习智能手机或机器人吸尘器上的2个按钮。 资源用完了。 大脑拼命地阻碍了学习过程,并在拇指上起作用。 年幼时,这些资源很多。 随着时间的流逝和成长,它们变得越来越少。 它线性地工作。 幸运的是,这被我们神经网络功能的增强所抵消。 当然,除非我们在谈论直接针对性的退化。

一些定型观念


您可能会听到一个常见的误解:“嗯,我是专业人士,我可以阅读任何代码。 我写得又快又爽,解决了公司的问题。 如果解决了问题,我的代码是什么样子并不重要。 其余的人根本无法很快解决,我对此没有任何问题。” 如果您的环境中有这样的编码器,则可以告诉他:“老兄,我有个坏消息要告诉您。 您使整个团队都感到不满,而这种方法就是为什么当一个超级高效的程序员快速强制执行代码时,其他人的编写速度会降低的原因。”

超级高效的程序员无需格式化和标准化就可以在两方面实现超级高效:

  • 超级高效地完成任务,而无需设计和样式。
  • 放慢其他人的注意力是非常有效的,因为添加之后,人们已经尝试了很长时间才能了解这里发生的事情。

为什么需要代码样式


尽管这已经很明显了,但是有必要强调一下要点。
代码风格:

1. 提供项目的线性开发,并且不影响代码量。 如果您提供了可理解的代码的历史记录,那么无论有多少开发人员来来去去,您始终具有同等的代码质量,这使项目无论其大小如何都可以动态增长。

2. 大大加快了新程序员适应的过程。 如果您的代码写得清楚,那么新的专家将迅速训练他的神经网络来识别块并开始变得有用。 有员工自给点之类的东西。 这是员工开始仅带来收益的起点。 而且,如果代码写得清晰,新员工就不需要了解业务逻辑,它只会学习阅读您​​的代码。 而且他做得越快,他就越不会停止向其他专家询问大量问题,从而浪费了他们的时间。 就产品带来的潜在价值而言,对于团队和公司而言,通过盈亏平衡点的专家所花费的时间要多得多。

3. 消除对细节的依赖。 您无需经常迷失他人的独创性和特定的设计。

4. 在学习新代码时,最大程度地减少心理障碍的影响。 您的大脑抵抗力较弱,因为 无需研究别人的风格。 读取清晰代码所需的心智资源少得多。

5. 最小化声誉损失。 到达新公司后不久,程序员将开始与以前的同事和朋友分享他的印象。 他会说这里的一切都很酷,或者他会强调使用代码时的负面影响。 从某种意义上讲,这给您带来了人力资源上的好处:如果您想让优秀的程序员与您一起工作,请制定一个好的项目。 尽管这并不总是很重要,但是在某些公司中,他们原则上不看代码的质量,而只是看功能到销售的交付,这是一个不错的奖励。 众所周知,经常离开的原因是由于不断降低质量差的代码库而造成的疲劳。

6. 形成和培育发展文化。 程序员的任务比整个公司的未来都低,但是必须传达一种理解,即代码的可理解性和可读性现在会影响进一步开发的动力,这一点很重要。 如果代码难以阅读且不规范,可以进行痛苦的重构和缩放,那么随着项目代码库的增长,开发速度将下降。 质量越低的代码,编写新代码的难度就越大,产品开发的速度就越慢,公司的发展就越困难,而您付出更多的钱就越困难,因为花了大量的钱在为项目生命周期提供新员工和新员工方面,这是主要的他们在公司上任职的时间不是花在公司的利益上,而是花在编写该法规的药物分类上。

完美的代码


我们都知道它不存在。 从规范代码样式的角度来看,是代码设计的概念。 如果那是真的,一切都会很好。 在开发远程代码样式时,概念比较宽松,其中包括开发原则。 在类或文件中分成逻辑上隔离的块的代码也涉及设计。 命名,隔离级别,继承。 所有这些工具不仅是交互作用,而且是复杂机制的设计,其中每个模块都起作用。

概念因语言而异。 细节脱颖而出。 但是基础保持不变。 质量代码仅由两个标准确定:

  • 代码是匿名的
  • 代码读起来像本书

匿名码


在此过程中需要提出的理想状态称为匿名代码。 我敢肯定,你们中的许多人已经打开了工作草案并随机提出了​​要求,可以毫不犹豫地说出是哪个同事写的。 每个人通常都有风格。 有人喜欢以下情况的面条:有人在弹出lambda时和不弹出时,有人喜欢减少变量以节省一个字符。 在匿名代码中,您不能执行此操作。 在理想的非个性化代码中,无法识别作者。 当您到达代码风格的最后时,就是这种情况。

书本级别的可读性


还记得2个主要的编程问题吗? 缓存无效和变量命名。 我们将绕过缓存过程的黑暗过去,直奔痛苦。 命名变量,类,对象,文件,方法,常量等。 这个问题有两个极端。 名称太短太长。 常识告诉我们逻辑在中间附近。 在这里,超高效的程序员敲了敲门,告诉我们他们不在乎。 但是,为什么我们要对此进行理论化呢? 告诉我这段代码是做什么的?



还有这个吗?



可以直接轻松读取第二个代码。 无需真正理解业务逻辑即可了解此类命名的功能负载。 在此示例中,我们只使用整个存储库,然后使用builder创建集合,然后应用过滤器。 您甚至无需深入研究代码即可了解正在发生的事情。 就像在标题上看书一样。 但是命名并不是全部。

设计模式


几乎在每次面试中都会询问您有关设计模式的信息。 他们的公共目标是可重复的体系结构解决方案。 它们的副作用是可预测性和一致性。 切换到基于设计模式的体系结构之后,您便形成了一个可预测的系统。 即 根据名称,您可以轻松了解类或对象的目的。 存储库模式有什么作用? 这是带有数据采集方法的存储库视图。 构建器模式有什么作用? 组装复杂的对象或结构。 在各个方面等等。

有一种命令模式。 该怎么办? 当然,只执行! 您无需研究其中的内容。 显然可以做到。 设计模式可帮助您了解项目的工作方式。 如果一切写得很好,您将不会感到奇怪:“我的目录中有什么?” 通过名称,您可以轻松确定位置和位置。

这么说吧。 形成了所有关于设计模式的决定,在此基础上承担了开发人员在特定问题上的痛苦。 有人已经经历过这种痛苦,并以现有架构模型之一的形式制定了解决方案。 而且,所有这些都是在臭名昭著的SOLID之上形成的。

实心


SOLID是面向对象编程的五项原则的首字母缩写。 注意:5条原则。 面向对象。 程式设计 这不是惯例。 这不是建议。 这不是某些老程序员教年轻人的愿望。 , SOLID — . SOLID, 6 , , SOLID — . , , . — . , , : , , . . , .

? ? . , . code style, , SOLID. . . . — -. 即 , , , , , , . , .

, code style community . , , , , . , . , . , . , .

code style? ! . , . , . . - open-source based . , PSR , - . symfony2 code style, PSR . , , PHP. , , .

?


, , ? — , , CodeStyle , . , PHPStorm , phpcs codestyle — . , . , , , .

, (), . , ? . . , . 2 Google Sheets . 23% . , 7 , , 20 . . , 20 . 21% . , , .

, , , , 90% , . ? Middle PHP Developer . onboarding , 3-. … - . . onboarding -, , . , 1- Junior PHP Developer. « » . success story.

, , , 25%, onboarding' ⅔. « » , . , . , , , phpstorm Sonar Light.

— , Senior , , . , , . Senior QA Engineer .

, 21-27%. , , - . , 5%, 5 ( , ), 5 69 . , 14 840 – 40 /. phpcs phpstorm? , 50 .

PS: , , ManyChat, .

Source: https://habr.com/ru/post/zh-CN468953/


All Articles