当前位置: 首页 > 科技观察

想要高级代码?简单九步,助你轻松实现

时间:2023-03-19 19:53:52 科技观察

成为一名优秀的程序员需要长期的磨练,最好的办法就是加入编码标准高的公司。作者想给大家的是如何通过简单的调整开发流程,让代码看起来更好看。本文汇集了作者长期审查代码的经验,可以补充学术论文、发布数据集或分析Kaggle竞赛的解决方案。本文的目标读者是研究人员、数据科学家和初级软件开发人员。每一步只需不到5分钟,而且这些调整会迫使您做得更好。使用版本控制跟踪代码中的更改位置对代码进行版本控制似乎是显而易见的必须做的事情,但事实并非如此。作者的导师是一个非常聪明的人,他开发了一种算法来实现哈伯德模型的量子蒙特卡罗。该代码被世界各地的许多研究人员用来推进“凝聚态物理”的理论。当开始使用这个算法时,我惊讶地发现没有中心化的存储库。代码交换通过电子邮件进行。科学家开发的错误修复和新功能不会与其他用户交换。此外,我还看到同事如何使用不同的文件夹来控制代码版本。GitHub或其他服务上的代码版本控制和集中存储库是必要的,许多研究人员正在这样做。但是如果没有计算机科学,大多数教授和研究生都处于使用文件夹进行版本控制和通过电子邮件发送代码的阶段。问题:你什么时候需要在你的项目中开始使用git?答:从第一行代码开始。问题:您什么时候需要在GitHub上创建存储库并将代码推送到其中?答:从第一行代码开始。如果您觉得由于法律或其他原因不能公开共享您的代码,您可以创建一个私有存储库。在所有其他情况下,请访问公共存储库。等到代码看起来不错再公开是错误的。如果GitHub存储库中有不完善的代码,我的许多同事都会感到非常不安全。他们担心别人会认为他们是糟糕的程序员。事实上,根本没有人会评判你。另外,你现在写的每一个代码在六个月后看起来都会很糟糕。私有存储库总比没有存储库好。公共存储库再次比私有存储库更方便。Kaggle比赛的参与者在比赛结束后发布他们的管道是一个很好的做法,这对参与者和社区都有帮助。此外,还有一个名为Sourcegraph的工具可以在所有公共Github存储库中搜索代码。非常方便,可以提高工作效率。不要推送到master分支在团队中工作时,不要直接推送到master分支。创建一个单独的分支,并在其中工作,创建一个拉取请求(PR),将拉取请求合并到主分支中。这比直接pushtomaster错误要复杂得多,因为为了合并pullrequest,更改必须通过各种检查。手动检查是由协作者执行的代码审查。自动检查包括语法、样式、测试等。单独工作时,没有代码审查的机会,但自动检查功能仍然可以使用。在GitHub上调整设置是非常有必要的,即使有遗嘱也不会出现pushtomaster。如上所述,这可以防止错误并节省意志力。图源:unsplash使用持续集成/持续交付(CI/CD)系统来完成创建分支和合并的过程是一个开销,主要是为了允许对代码更改进行检查。建立持续集成系统后,每一个创建的pullrequest都需要进行检查,只有通过所有检查后,才能合并pullrequest。提供CI/CD功能服务的软件有很多,比如GitHubActions、CircleCi、Travis、Buildkite等,推荐使用GitHubActions。完全免费,可在私人和公共存储库中使用,并且易于设置。这一切听起来很复杂,但实际上,这只是向存储库添加配置文件的问题。简单示例:我的图书馆具有辅助功能。作者检查代码风格、格式并运行测试。复杂示例:在Albumentations库中,检查语法和代码风格、运行测试、检查自动文档构建以及针对不同的python版本和操作系统(Linux、Windows、MacOS)执行操作。注意:需要在GitHub存储库中更改设置,以便如果所有检查都在绿色区域中,则无法合并拉取请求。Linters这些工具不会更改代码,但会检查代码并发现可能存在的问题,这些工具称为linters。最常用的是flake8。它可以查找:Pep8错误和警告。一致的命名约定。函数的圈复杂度。和一组插件的其他内容。这是一个强大的工具,建议将其添加到CI/CD配置以及预提交挂钩中。Pre-commit钩子在上一步中提到了在提交之前在本地运行格式化程序的重要性。假设black和isort,需要运行:black.isort,这很麻烦,更好的解决方案是使用这些命令(例如“code_formatter.sh”),创建一个bash脚本并运行脚本。像创建脚本这样的方法非常流行,但问题是除非被迫,否则人们不会这样做。有一个更好的解决方案,预提交挂钩。这个想法类似于bash脚本,但是您希望在每次提交之前运行的内容将在执行时运行:gitcommit-m""这可能看起来是一个小差异,但事实并非如此。通过预提交,可以强制执行该行为,如上所述效果更好。来源:unsplash问题:PyCharm执行格式化非常好。为什么需要预提交挂钩?答:因为您可能会忘记使用PyCharm格式化您的代码。另外,当有两个以上的人时,请确保他们具有相同的格式。预提交挂钩,所有都将具有与存储库相同的配置。作者推荐使用这两种方法,pre-commithooks和使用PyCharm格式化代码。问题:如果我跳过控制台并直接从PyCharm进行提交怎么办?回答:PyCharm可以配置为在每次提交时运行预提交挂钩。Mypy:静态类型检查器,从Python3开始,可以在代码中为函数添加类型注解。这不是必需的,但强烈推荐。这样做的原因之一是使用类型注释阅读代码非常容易。当您在代码中看到:x:pd.DataFrame时,这比仅键入X提供的信息更多。当然,您不应该首先将变量命名为“x”。不过,本文讨论的是改进代码的简单而自动的方法,好的命名比简单的输入要难一些。类型注释是可选的。没有它们,代码运行良好。有一个叫做Mypy的工具可以检查:函数和输入参数的类型注释变量类型和操作之间的一致性这是一个非常有用的工具。所有大型科技公司都使用它来检查python代码的每个拉取请求。该工具强制执行易于阅读的代码,重写过于复杂、编写不佳的功能,并识别错误。Mypy检查可以添加到CI/CD和预提交挂钩。代码格式化程序可以通过多种方式格式化同一段代码。功能之间应该有多少空间?代码中的行应该多长?我应该输入什么顺序?我应该使用什么样的引号来定义字符串?如果要在代码上运行代码格式化程序,这些工具会修改代码以符合格式化程序的要求。常见的格式化程序类型:YAPF:非常灵活,可以配置为适合所需的样式。黑色:不够灵活,只能配置线的长度。选择其中一种工具并将其添加到您的CI/CD配置中。我喜欢用黑色。这使得我所有的项目看起来都和Black的项目一样。代码格式化程序减少了上下文切换,这使得阅读代码更加容易。有更具体的格式化程序,如isort。Isort仅对输入进行排序。Formatter需要在两个地方运行:在CI/CD中。在检查模式下运行:格式化程序会告诉您要格式化哪些文件,但代码将保持不变。这需要在提交更改和重新格式化代码之前在本地完成。对预提交挂钩的更多检查预提交挂钩可以扩展为许多不同的东西。删除尾随空格。文件的末尾是一个新行。文件格式需要txt。检查yaml文件、正确格式等。您可以创建自己的代码格式挂钩,并检查自动生成的挂钩。外部工具Deepsource.io和Deepcode.ai等工具可用作拉取请求的自动代码审查的附加检查。这些是完全免费的公共存储库,很难找到不为公共代码启用它们的理由。只要至少使用其中一种技术,代码就会更易于阅读。但这只是第一步,还有其他的标准技术,比如:单元测试、Hypothesis单元测试、Python环境、创建安装包、Dockerization、自动文件等,难度会大一些。给自己一些必须尝试的理由,让更好的工作成为自然的选择。从第一个改变开始!