Python缺乏静态类型如何影响大型项目的可维护性和可扩展性?

时间:2010-09-08 20:54:59

标签: java python project-management static-typing

阅读this very informative (albeit somewhat argumentative) question后,我想了解您使用Python编写大型项目的经验。随着项目规模的扩大,事情变得无法管理吗?这种担忧是让我依赖Java的一件事。因此,我对通知对大型项目中Java和Python的可维护性和可扩展性的比较特别感兴趣。

8 个答案:

答案 0 :(得分:14)

我使用Python完成大规模的商业产品。我粗略估计了5000个文件x每行500行。那是大约250万行的Python。请注意,这个项目的复杂性可能相当于其他语言的10 mil +代码行。我没有听到过一位抱怨Python代码无法维护的工程师/架构师/经理。从我从错误跟踪器中看到的情况来看,我没有看到静态类型检查可以避免的任何系统问题。实际上,根本不使用对象类型会产生很少的错误。

我认为这是一个非常好的学术主题,通过实证研究为什么基于静态类的语言似乎并不像人们想象的那样重要。

关于可扩展性。我们刚刚在我们的产品中的数据库1之上添加了一个数据库2,它们都是非SQL的。没有与类型检查相关的问题。首先,我们设计了一个足够灵活的API来预测不同的底层实现。我认为动态语言在这方面是一种帮助而不是阻碍。当我们继续测试和修复错误时,我们正在研究那些在任何语言上工作的人都必须面对的错误。例如,内存使用问题,一致性和参照完整性问题,错误处理问题。我没有看到静态类型检查对这些挑战有任何帮助。另一方面,我们通过能够在飞行途中或简单修补后注入代码,从动态语言中获益匪浅。我们能够测试我们的假设并快速展示我们的修复。

可以肯定地说,我们100多名工程师中的大多数人都使用Python感到高兴和高效。对于我们来说,使用静态类型语言在相同的时间内以相同的质量构建相同的产品可能是不可想象的。

答案 1 :(得分:8)

根据我的经验,静态类型语言可能难以维护。例如,假设您有一个实用程序函数,它接受自定义类作为参数。如果你在路上采用新的命名约定,那么这个类的名称将不得不改变,然后你的所有实用函数也必须改变。在像python这样的语言中,只要在类中实现相同的方法就没关系。

就个人而言,我鄙视一种妨碍我的语言。表达你的想法的速度是有价值的,这是Python相对于Java的优势。

答案 2 :(得分:5)

python中没有良好测试覆盖率的大型代码库可能是一个问题。但这只是图像的一部分。这完全取决于人和适当的工作方法。

没有

  • 源代码管理
  • 错误跟踪
  • 单元测试
  • 承诺团队

你可能会因任何语言而失败。

答案 3 :(得分:4)

我记得IntelliJ IDEA创新前后的日子。存在巨大差异。之前,静态类型仅用于编译,开发基本上将源代码视为文本文件。之后,源代码是结构化信息,由于静态类型化,许多开发任务必须更容易。

然而,现在并不像过去那样生活地狱。我们按原样使用它,做任何必要的事情,使用迄今为止可用的工具,建立系统,满意。没有太多不愉快的回忆。这可能是动态打字程序员现在的感受。这不是那么糟糕。

当然,我永远不会回到过去。如果我被禁止使用这样的IDE,我想我会一起给我们编程。

答案 4 :(得分:4)

尝试在具有大量IoC或其他设计模式的大型动态类型框架中追溯显然格式错误的对象的源,其中对象无法直接在堆栈中跟踪。

现在尝试使用静态类型的语言。

除非在使用站点附近(例如通过类型注释,a-la Python的类型安全库)或堆栈中的某个位置记录对象的类型,否则推断它的来源几乎是不可能的。我从经验中说,试图调试BuildBot框架的一部分。它涉及大量原始文本搜索框架,甚至使用PyDev,Komodo和Wingware等花哨的IDE。

我不怀疑是否有可能对动态语言施加某些类型限制,但对此缺乏任何标准化似乎是任何试图调试大型现有框架的人的障碍。

编辑:自2014年起,Guido添加了PEP484,MyPy和打字模块。这使我在维护大型项目方面的经验更加出色。

答案 5 :(得分:1)

根据我的经验,可维护性取决于低耦合,良好的文档,良好的开发过程和出色的测试。静态打字几乎与此无关。

Java在编译时捕获的错误只是可能发生的错误的一小部分。它们几乎总是通过测试检测到的最微不足道的;如果您正在测试您的代码是否产生正确答案,那么您无法错过在错误类的对象上调用方法!在这方面你可以说Python确实更好以确保质量;通过强制你至少测试一下以确保你的代码没有简单的拼写错误,它确保你实际上测试至少一点。

事实上,Java甚至不是一个非常好的语言示例,它具有强大的静态检查功能,可以捕获大量错误。尝试在Haskell或Mercury中编程以查看我的意思,或者更好地尝试在Scala中编程并与Java库连接;当您将使用Scala库的正常惯用Scala代码与必须处理Java库的代码进行比较时,编译器能够为您保证多少“正确性”的差异是惊人的(我实际上已经这样做了,因为我编写了一个在Android上的Scala中。)

你能够在很长一段时间内在大型代码库中编写良好的可维护代码,尽管与Scala等语言相比,Java静态错误检测的缺点依赖于完全相同的技术< / strong> Python程序员使用它们在大型代码库中做同样的事情,尽管与Java相比,Python的静态错误检测存在缺陷。

答案 6 :(得分:0)

我已经将Python用于许多项目,从几百行到几千行。动态类型可以节省大量时间,并且可以更容易地使用像多态这样的OO概念。类型系统不会使项目无法维护。如果您无法想象,请尝试用Python编写一些内容,看看它们是如何运行的。

答案 7 :(得分:-1)

我在一家使用python作为主要语言的大数据初创公司中工作。我的项目是大约3万行python。根据我的经验,如果您的团队采用了良好的编程习惯(例如fox示例),添加了类型提示并进行了广泛的单元测试,则可能不会因此影响可维护性。因为Pycharm可以自动检测类型,如果有类型提示,则会出现一些类型错误。

真正的问题是: 1.性能,这可能与可维护性无关,但这是一个问题。 2.并非您处理的每个python代码库都写得很好。由于python易于学习和编码。一些没有经过基础CS培训的人会开发一个无法维护的python项目。我工作了一个python项目,其中有很多文件,每个文件有数千行,没有类型提示。那家伙对OOP一无所知。他基本上以类似于编写C的方式来编写python。他只是利用了一些python语言功能,但却完全需要进行编程。优秀的python项目确实依赖训练有素的工程师。如果您不能雇用足够的工程师,则最好依靠工具本身。 3.在python大数据公司中,产品经理和一些非技术人员并不关心数据类型是否一致。这些人会设计出不是类型安全的数据产品。例如,在Json中,如果一个字段通常是一个str,但是当它为空时,某些人会将其设为null。这将在运行时失败。