Python中的数据科学家软件工程
数据科学 将数学和统计学、专业编程、高级分析、机器学习和人工智能(AI)与特定领域的专业知识相结合,揭示组织数据中隐藏的可操作洞见。
数据科学是所有行业中增长速度最快的领域之一。这是由于不断增加的数据来源和由此产生的数据量。
数据科学自开始得到认可以来,就在其他学科中引发了争议。
在本文中,我们将学习软件工程的基础知识,以及为何对于数据科学家来说它的重要性以及各种原则。我们还将简要介绍重构、整洁和模块化代码(主要关注python)、测试和评审。
为什么数据科学家需要软件工程
数学家反对在没有对底层原理有透彻理解的情况下使用工具,软件工程师批评数据科学家对基本编程概念的无知,统计学家对从业者经常出现的缺乏基本统计学知识感到悲哀。
而且,说实话,它们都是合理的。
当涉及到统计学和算术时,你确实需要牢牢掌握概率、代数和微积分等理念。
这种知识需求有多广泛呢?
基础知识是不容置疑的,尽管很多情况取决于你的职能。
在编程方面也存在类似的情况;如果你的工作要求你编写生产代码,那么你至少要熟悉基本的软件工程知识。
为什么呢?
原因有很多,但在我看来,可以归结为以下原则:
- 一致性 - 代码的一致性指的是它的编写质量如何、容错性、异常捕获、经过测试以及对外部审查的程度。
-
可解释性 - 代码能够被理解并具备充分的文档说明。
-
速度 - 代码在现实环境中可以执行的速度。
-
模块化 - 脚本和对象应该是模块化的,以便重复使用、减少重复代码,并在类间提高代码效率。
重构的重要性
在我们的代码工作正常之后,重构使我们能够整理和模块化代码,并提高代码的效率。当讨论高效代码时,软件工程师通常会使用以下术语之一:
- 运行时间较短
-
占用较少的内存空间
我们可以通过以下方式来处理这两点:
- 并行化 是减少运行时间的绝佳方法。编写一个脚本以并行处理数据,同时利用机器的一部分或全部处理器,这就是所谓的并行化。
通常情况下,我们的脚本是按顺序计算数据的,解决一个问题后再继续下一个问题,依此类推。这通常在我们开发Python代码时发生,如果我们想要从并行化中受益,就必须明确指明。
- 由于Python并没有真正将内存释放给操作系统,因此在这种语言中减少内存使用是一项具有挑战性的任务。当对象被删除时,它们的内存变为可用于新的Python对象,但并没有释放给系统中的free()函数。
编写清晰代码的重要性
本文中讨论的大部分主题理论上可以归类为创建更清晰代码的工具或建议。然而,在本节中,我们将专注于对”clean”一词的精确定义。正如罗伯特·马丁在他的书《Clean Code》中所指出的,即使有错误的代码可以运行,但糟糕的代码会让开发团队陷入困境。
为什么呢?
说实话,有很多原因,但考虑一下当你浏览写得很差的代码时浪费的时间,或者当你开始新工作时发现你要处理的是旧的、难以阅读的代码。
编写模块化代码的重要性
虽然Python本质上是一种面向对象的编程语言,但对于它的详细解释超出了本文的范围。简而言之,面向对象编程是关于创建具有自身属性和行为的模块,而不是过程式编程,其中你为脚本编写一系列指令。
在现实生活中,这些特征被称为特质,行为被称为技巧。
前文中提到的计算机和打印机对象将是独立的类。
一个 类 是一个包含该类型的每个对象的属性和方法的蓝图。
换句话说,我们设计的所有计算机和打印机将具有类似的特征和工作方式。
封装 是支撑这个命题的理论。封装是指将数据和函数集成到一个单独的对象或模块中的能力。
此外,当程序被分解为模块时,各个模块不需要知道如何完成某个任务,如果他们不负责执行的话。
这对你的代码更高效、可重用的跨类以及需要时更易于调试,正如前面所说。
测试的重要性
数据科学测试是必需的。在数据科学家的代码中缺乏测试常常是其他与软件相关领域的抱怨来源之一。虽然在其他算法或脚本中,一个错误可能只会导致程序停止工作,但在数据科学中,这更加危险,因为程序可能会运行,但由于编码错误的数值、不正确使用的特征或与模型基于的假设相矛盾的数据,产生不正确的洞察和建议。
当我们谈论测试时,有两个关键的想法值得讨论:
- 单元测试
-
以测试为驱动的开发
代码审查的重要性
团队中的每个人都会从代码审查中受益,它鼓励良好的编程实践并使代码准备好投入生产。代码审查的主要目标是发现错误。然而,它们也有助于提高可读性,并确保团队的标准得到满足,防止将低效或不干净的代码投入生产。
除了这些好处之外,代码审查还有利于知识共享,因为团队成员可以阅读不同编码方法和背景的示例。
结论
在这个故事中,我们看到了一些基本原则,即使是那些天生不是程序员,并且从完全不同的背景进入这个领域的人也会发现这些原则很有用。这些原则有助于编写更好的生产代码,节省时间,并在实现脚本时使程序员的生活更轻松。