能帮助数据科学家的软件工程概念
和许多数据科学家一样,我的专业背景是统计学。当我偶然发现这个领域时,我对预测模型非常感兴趣,鉴于我的背景,预测模型背后的推理是我的第二天性。
10 年前,我开始从事这个行业,当时该行业从语义上从数据挖掘(Data Mining)过渡至数据科学(Data Science)。
在数据挖掘领域,大多数工具都是拖放式的(例如 IBM SPSS Modeler 、SAS Enterprise Miner),而且大多数预测模型并未部署在代码中——R 语言虽然一直存在,但主要还停留在学术层面。
从我与业内人士的几次交流来看,我的经历和大多数统计学家相似——一开始,我们可能已经开发了一些代码,但我们并不特别担心代码的质量。
刚开始的时候,我的软件工程技能并不扎实。我没有接受过正规编程或软件工程事件的培训。幸运的是,我曾与很多工程师一起工作,他们指导我如何改进代码,并教给我一些概念,这些概念对于提高我作为数据科学家的技能相关。一个了解自己的代码质量的数据科学家是一个更能感同身受的专业人士——这类数据科学家关心的是那些之后要调试、部署或改进其模型的人,这样做也可以帮助他们避免大量的技术债(Technical Debt)。
在这篇文章中,我将分享一些非常炫酷的概念,这些概念帮助我提高了我的编程技能,让我成为一名更加全能的数据科学家。如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
软件开发和软件工程师的区别
快速发展的公司最想招聘的两类软件工程师
给软件工程师(SDE)的15条日常小技巧
为什么谷歌把SQL当代码对待?你也应该这样做!
Linters
Linters是一种检查代码bug或代码不一致的软件,可以帮助你编写更整洁的代码。
Linters在两个方面帮助了我:
- 在语法方面构建更一致的代码;
- 尽早发现bug;
例如,如果你使用 Python,你可以在你喜欢的 IDE 上用 flake8 或 pylint,这类工具会自动检查你的脚本是否存在代码错误或风格上的不一致。第一次用Linters也会让你惊讶地发现自己有一些没有意识到的习惯。举个例子,我在编写代码时,在使用 linter 之前,我总是在缩进代码之前在很多指令上使用不必要的尾随空格——当然我的代码是有效的,但那些尾随空格是没有必要做的额外击键。
如果你检查代码,其他用户在阅读时也会更加流畅也,因为大多数开发人员都遵循相同的风格——对于 Python,官方的风格指南是 PEP 8,用于指导前面提到的 flake8 和 pylint。风格指南是一组规范化的规则,用于格式化代码,例如编写函数、注释代码等的通用格式。
代码检查工具的另一个优点是什么?这类工具还可以指出了我们在编程时出现的常见错误,例如调用尚未声明的对象。总而言之,代码检查工具对于开发人员来说是一个很好的生产力工具。
面向对象编程
在开始编程时,特别是在数据项目中编程,你可能不会一开始就遇到面向对象编程 (OOP) 。
OOP 是大多数工程学位的初学者概念 – 可以让你的程序更加灵活。OOP能够帮助你激活脚本,并使用具有特定行为、方法和属性的对象。
最酷的就是,如果你已经用 Python 编写了代码,那么你已经在面向对象了!Python 是一种面向对象的语言,你定义的变量(例如“ABC”或 123)本身就是对象。这些对象根据其特性表现出某些行为,你可以根据其类型采用不同的方法——例如,某些方法/函数只能由 Python 中的字符串类型对象访问,例如 capitalize() 或 format()。
你也可以用这个例子组织你的代码,让你的代码以一种更有趣且更灵活的方式流动。将对象与函数式编程相结合,可以避免产生难以维护和调试的“意大利面条代码(Spaghetti Code)”软件。通过学习面向对象编程,我还了解到了继承(Inheritance)和多态(Polymorphism)等概念。
当然,OOP 不是万能的解决方案——在应用时要遵循一定的标准,同时也要非常谨慎,因为在代码中抛出对象会导致页面混乱和过度设计。
单元和集成测试
刚开始从事商业智能工作时,我已经接触过ETL(提取-转换-加载)测试“概念”——该概念与单元/集成测试类似。
在开始使用代码交付模型时,我偶然发现一个重要概念,那就是,编写好的测试可以在部署模型时发现bugs并控制环境。在数据领域,该概念对于了解更改代码对模型结果的影响非常重要。
要为你的模型添加了一个新变量?可以用符合新功能的虚拟例子写一个测试。这些测试对于发现早期bug以及测试你数据管道相关的内容有关 – 默认情况下,特征工程非常容易出错。
构建良好的测试可以避免部署中的bug,避免和模型原理不同的新版本。结合 CI/CD 管道(接下来会详细介绍),测试是非常强大的工具可以帮助你创建更具可扩展,更加稳固的模型。
单元测试只会检查特定功能或特性——通常一次只测试一个功能。集成测试将软件作为一个整体,测试整个代码的逻辑和流程。
Python中常用的测试框架是pytest,而在R中经常使用testthat。
版本控制系统
这个概念可能已经成为大多数数据科学家日常工作的一部分,也被业内人事广泛使用。如今,大多数数据科学家已经在使用诸如 Git 或 Azure DevOps 之类的 VCS 系统。没有 VCS就不会有稳定的模型。这些工具不仅对于部署和版本跟踪极其重要,对于团队协作也是必不可少。如果没有 VCS,数据科学家就会在开发代码、覆写数据和破坏数据时产生冲突。
对于数据科学项目,VCS 非常好,因为数据科学家们可以同时执行实验、构建不同的功能或测试不同的模型。一次只有一个人可以在一个脚本中操作已经是过去式了——这样做会降低整个团队的效率和生产力。
Git 是世界上最著名的版本控制系统。Git是一个简单且有效的框架,用于比较代码,跟踪支持并行工作、功能回滚和代码审查的更改。今天的大多数开源项目都是通过某种类型的 VCS 系统开发的,这表明 VCS 在过去十年中已经覆盖全世界。
CI/CD
CI/CD是指持续改进(Continuous Improvement)和持续开发(Continuous Development)。是一种开发框架/理念,能够帮助你快速、安全地发布软件。
CI/CD 最出名的是管道(Pipelines)工具,用于检查并确保部署的有效性的可运行代码中的工具。例如,在 CI/CD 管道中,每当有人将代码推送到VCS中时,你可以通过运行自动化测试检查开发人员的代码中是否存在bugs。
正如你在上一句中已经注意到的那样,CI/CD 管道是我们上述讨论的概念的完美结合体。在 CI/CD 管道中,你可以控制代码bugs、代码检测、甚至将部署构建到生产环境中——所有这些都由代码控制,开发人员无需付出任何努力。
构建良好的 CI/CD 管道是一门艺术。掌握了该概念,你就可以避免在开发过程中出现错误,避免将错误的版本发布到生产中。
感谢你花时间阅读这篇文章!在过去的几年里,我学到了很多关于开发最佳实践的知识,我想和大家分享我成为一名更加优秀的数据科学家过程中的经验和旅程。希望这些软件工程概念也可以帮你成为更优秀,更全能的数据家!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/
原文作者:Ivo Bernardo
翻译作者:Lia
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://towardsdatascience.com/cool-software-engineering-concepts-for-data-scientists-d6bd54243f4e