java Python缺乏静态类型如何影响大型项目的可维护性和可扩展性?[已关闭]

fafcakar  于 10个月前  发布在  Java
关注(0)|答案(8)|浏览(81)

已关闭。此问题为opinion-based。它目前不接受回答。
**希望改进此问题?**请更新问题,以便editing this post能够以事实和引文来回答。

三年前就关门了。
Improve this question
在阅读了this very informative (albeit somewhat argumentative) question之后,我想知道你用Python编程大型项目的经验。随着项目规模的扩大,事情是否变得难以管理?这个问题是让我一直坚持使用Java的原因之一。因此,我对大型项目中Java和Python的可维护性和可扩展性的比较特别感兴趣。

ar7v8xwq

ar7v8xwq1#

我在用Python开发一个大规模的商业产品。我给予了一个非常粗略的估计,即5000个文件x 500行。这相当于250万行Python代码。请注意,这个项目的复杂性可能相当于其他语言的1000多万行代码。我还没有听到任何一个工程师/架构师/经理抱怨Python代码不可维护。从我们的bug跟踪器中,我没有看到任何可以通过静态类型检查避免的系统性问题。事实上,很少有错误是由于不正确地使用对象类型而产生的。
我认为这是一个非常好的学术主题,可以实证研究为什么静态的基于类的语言似乎并不像人们想象的那样重要。
关于可扩展性。我们只是在产品中的数据库1之上添加了一个 db2 ,它们都是非SQL的。没有与类型检查相关的问题。首先,我们设计了一个足够灵活的API来预测不同的底层实现。我认为动态语言在这方面是一种帮助而不是阻碍。当我们继续测试和bug修复短语时,我们正在处理任何语言工作者都必须面对的bug。例如,内存使用问题、一致性和引用完整性问题、错误处理问题。我看不出静态类型检查对这些挑战有多大帮助。另一方面,我们从动态语言中受益匪浅,因为它能够在飞行中或简单的修补之后注入代码。我们能够测试我们的假设,并迅速证明我们的修复。
可以肯定地说,我们的100多名工程师中的大多数都很高兴和高效地使用Python。对于我们来说,使用静态类型化语言在相同的时间内以相同的质量构建相同的产品可能是不可想象的。

wwtsj6pe

wwtsj6pe2#

强类型语言总体上倾向于产生更少的bug,并且python 3.11中增加了类型提示类似于typescript。
弱类型语言适合于快速开发,并且通常能够快速试验新特性更为重要。
这里没有一个解决方案-选择适合工作的工具。

kmynzznz

kmynzznz3#

尝试在一个大型的动态类型框架中追溯一个明显格式错误的对象的源,该框架具有许多IoC或其他设计模式,其中对象不能直接在堆栈上跟踪。
现在尝试在静态类型语言中执行此操作。
除非在使用现场附近记录了对象的类型(例如通过类型注解,一个Python的类型安全库)或堆栈上的某个地方,推断它来自哪里几乎是不可能的。我是根据自己的经验说这番话的,我曾经试过调试Buildbot框架的某些部分。它涉及到通过框架搜索大量的原始文本,甚至使用PyDev,Komodo和Wingware等花哨的IDE。
我不怀疑在动态语言上施加一些类型约束是可能的,但是缺乏任何标准化似乎是任何试图调试一个大型现有框架的一部分的人的障碍。
编辑:自2014年以来,Guido增加了PEP484,MyPy和打字模块。这使我在维护大型项目方面的经验大大提高。

xeufq47z

xeufq47z4#

python中没有良好测试覆盖率的大型代码库可能是一个问题。但这只是图像的一部分。这一切都是关于人和合适的方法来做这项工作。
没有

  • 源控制
  • 错误跟踪
  • 单元测试
  • 专业团队

任何语言你都可能会失败。

hl0ma9xz

hl0ma9xz5#

我记得IntelliJ IDEA创新前后的日子。有很大的差异。以前,静态类型只用于编译,开发基本上将源代码视为文本文件。之后,源代码是结构化的信息,许多开发任务必须更容易,这要归功于静态类型。
然而,过去的日子并不是生活在地狱里。我们接受了它,做任何必要的事情,使用迄今为止可用的工具,建立系统,满意。没有太多不愉快的回忆。这可能就是动态类型程序员现在的感受。没那么糟
当然,我再也不会回到过去了。如果我被禁止使用这样的IDE,我想我会给予我们一起编程。

ruarlubt

ruarlubt6#

根据我的经验,可维护性依赖于低耦合、良好的文档、良好的开发过程和出色的测试。静态类型与这些几乎没有什么关系。
Java在编译时捕获的错误只是可能发生的错误的一小部分。它们也几乎总是通过测试检测到的最微不足道的;如果你在测试你的代码是否产生了正确的答案,你就不可能错过对错误类的对象调用方法!在这方面,你可以说Python实际上在保证质量方面更好;通过 * 强迫 * 你至少测试一点,以确保你的代码没有简单的拼写错误,它确保你实际上 * 做 * 测试至少一点。
事实上,Java甚至不是一个很好的例子,一个语言与强大的静态检查捕捉大量的错误。尝试在Haskell或Mercury中编程以了解我的意思,或者更好地尝试在Scala中编程并与Java库交互;当你比较使用Scala库的普通惯用Scala代码和必须处理Java库的代码时,编译器能够为你保证多少“正确性”的差异是惊人的(我实际上已经这样做了,因为我在Android上用Scala编程了一点)。
尽管与Scala等语言相比,Java的静态错误检测存在缺点,但您在许多开发人员长期工作的大型代码库中编写良好的可维护代码的能力取决于完全相同的技术Python程序员在大型代码库中使用相同的技术,尽管Python的静态错误检测与Java相比存在缺点。

lvjbypge

lvjbypge7#

我在许多项目中使用过Python,从几百行到几千行。动态类型是一个很好的节省时间的方法,它使面向对象的概念,如多态的方式更容易使用。类型系统不会使项目不可维护。如果你很难想象,试着用Python写一些东西,看看它们是如何运行的。

ryoqjall

ryoqjall8#

我在一家大数据初创公司工作,该公司使用Python作为主要语言。我的项目是大约30k行的python。根据我经验,如果你的团队采用一个好的编程实践,例如,添加类型提示和广泛的单元测试,它可能不会那么影响可维护性。因为Pycharm可以在有类型提示情况下自动检测某些类型错误。
真实的的问题是:1.性能,这可能与可维护性无关,但这是一个问题。2.并不是你处理的每一个python代码库都写得很好。因为Python易于学习和编写。一些没有受过基本CS训练的人会开发一个不可能维护的Python项目。我工作过一个Python项目,它有很多文件,每个文件都有几千行,没有类型提示。那些家伙不知道OOP他基本上是用编写C语言方式编写Python的。他只是利用了一些Python语言特性,但完全是命令式编程。编写好的python项目真正依赖于训练有素的工程师。如果你雇不到足够好工程师,最好还是依靠工具本身。“3.在python大数据公司,产品经理和一些非技术人员并不关心数据类型的一致性。这些人会设计出一个非类型安全数据产品。例如,在Json中,如果一个字段通常是一个字符串,但当它为空时,有些人会将它设置为空。这将在运行时失败。

相关问题