ZT:疑Google员工把8w行Python项目用4w行Java重写了

2013-12-08 02:36:41 +08:00
 Ricepig
http://blog.est.im/post/69161031446

非常有意思的一个讨论

引用:“任何流程,任何规范,任何review,任何代码检查工具,都阻止不了程序员缓慢地一点一点地滥用语言特性,也阻止不了一个软件代码自身的腐败。Python本身鼓励滥用Mock因为没有不用mock就可以方便写unit test的测试工具。Python还鼓励不定义清晰的类接口和类关系,如果你写了一个接口继承,就会有Python大牛跳出来说你不Pythonic。系统复杂性在大型软件中是不可避免的,但是如果我们可以付出一些写code的时候的小小冗余,带来长期的代码可维护性改善,那就是值得的。Java不是完美的,用Java一样可以写出不可维护的代码,但是Java至少比Python在这方面强很多。我们的经验证实了这点,信与不信就是看官的事了。”
10745 次点击
所在节点    Python
39 条回复
dimfox
2013-12-08 03:19:39 +08:00
任何一个新项目,由于需求不清晰,系统得整体设计不可能做到完美。随着项目的进行,不得不做出违背最初设计的补丁,时间越长,补丁越多,代码越混乱。把原来得代码推倒重来,新的设计者有着最初设计者没有的优势,一切需求清晰可见,系统自然可以设计得很好。不可以因此说这个语言比那个语言好。不能否认编译的语言有它得优势,尤其团队变大,交流成本变高。但是不能用这种事情作为证据。

下面这段是关键:

“刚开始写的时候以为就是随便hack一个小系统临时用用,结果慢慢发展到成为关键系统,”
justfly
2013-12-08 03:45:36 +08:00
点进去看了,讨论焦点是 python 语言层面上的约束力不够。其实也有些略微标题党的感觉,作者自己都说「我觉得代码行数的节省也在于新系统更严谨的设计」。『随便hack一个小系统临时用用』的代码,在运行过程中不断向里面修修补补、添加东西到了8W行,跟已经完成了这个系统,站在制高点上综观整体进行重构,使用了4W 行,不怎么具有可比性。

我的感觉,python 作为动态语言的灵活性有利有弊。
在多人合作的大型项目中,它的灵活性(没有接口,不是强类型,参数可以是任意类型等)对人的『约束力』不够,从语言层面上它就比 java 等语言更容易带来可维护性问题。
但它的语法特性能提高人们的开发效率,更容易实现产品的快速迭代,在互联网产品中还是很有用。但是如果项目大到维护性开始成为问题(像里面说到8W),可能更需要语言层面上的约束性。

所以,还是看具体的 case 吧。
efi
2013-12-08 03:59:47 +08:00
Python实现原型创造80%的价值,Java重写维护创造20%的价值。
jjgod
2013-12-08 04:03:45 +08:00
“Guido搞的那个code review系统就是我说的那个维护不了的系统,最后的结果就是用Java重写了。”

按这个说法那就是 Rietveld 被 Gerrit 替代了的故事,Gerrit 确实是很不错的系统,可惜目前还有很多 Google 的项目在用 Rietveld,比如 Chromium。
initialdp
2013-12-08 08:31:24 +08:00
我觉得作者弄错了。初始系统是当初随便弄一下的,必然很多东西会欠考虑。后续扩展中,也只能缝缝补补,代码自然会越来越糟。重构一个系统,一来已经对整个系统比较了解,二来会更合理地通盘考虑和设计,自然效果会好很多。这和使用什么语言没什么关系。

翻过来说,如果一开始用JAVA随便去弄,后期用PYTHON重构,估计效果也会是这样。
pythonee
2013-12-08 08:48:06 +08:00
为什么感觉就是不愿意承认python的欠缺呢,我虽然喜欢python,也写了不少,但我觉得楼主说的情况确实存在
pythonee
2013-12-08 08:48:40 +08:00
@efi 没有发生的事情,为什么你如此肯定
pythonee
2013-12-08 08:49:49 +08:00
@initialdp 行数少不少不是关键,可维护性,不断往系统加特性是关键
pythonee
2013-12-08 08:51:44 +08:00
@justfly python适合一个人的项目,我现在的认知是这样,看openstack了
pepsin
2013-12-08 09:15:40 +08:00
动态语言这个问题是比较严重,一些人自以为聪明滥用一些偏门技巧,沾沾自喜,导致后续接手的人浪费很多时间去研究这些Hack,有些Hack还很核心,导致别人只能跟着那种错误的节奏来。

类型声明清晰的就好很多,限制多,自然小魔法就少。
initialdp
2013-12-08 09:23:39 +08:00
@pythonee python同样适合大规模软件,比如现在比较热的openstack等。

我也认为行数不是关键,但是“可维护性”这个东西就得再考虑一下。作为一个随便弄一下的系统,您觉得会有太多的考虑么?我认为不会考虑太多。系统变大后,如果不重写某些部分甚至调整架构,哪怕单纯出于系统兼容性考虑,也只能沿用原来的处理方式,这也就是为什么会越来越糟的原因之一。

这也就是为什么我认为作者的这个项目,如果反过来,先用java随便弄一下,系统大了之后,再用python去重构,估计会有同样的结论。

所以我觉得作者这个问题,其实无关语言,换谁都这样。这更多反应的是软件工程问题,是大规模软件V1版本和V2版本演进重构的问题。比如我们自己的软件,以前全部用C/C++,后来重构了业务模块,将业务逻辑独立出来用python实现,整个系统可维护性、扩展性等各方面都更好了,但我就不能因此得出结论:python比c/c++的可维护性方面强很多,对吧?
moroumo
2013-12-08 10:03:59 +08:00
这个和语言的关系不大
更多的是因为项目发展的一定规模,需要推到重来。在这个重来的过程中,因为对需求和功能的重新规划,使项目规模减小了。

我现在就在做这件事,推倒5年前的ROR,和Ruby service,用JRuby和Java来重新做。
jtacm
2013-12-08 10:53:22 +08:00
发个原帖吧, http://www.newsmth.net/nForum/#!article/Python/109344。
水木的帖子,回复中不乏一些自以为是的大拿啊。
bombless
2013-12-08 10:57:12 +08:00
我觉得未必要做深入解读
他们有个项目要重写,而Google现在的要求就是尽量用Java
于是就用Java了。
至于说稳定性、可维护性的问题,那也许是重写导致的,也不能全部归功到语言吧?
geeklian
2013-12-08 11:03:22 +08:00
Python有缺点也有优点,我经常用Python写的东东,过了半年重构成.net了。
若当初不用Python,则可能工期会完不成,可能赶不上需求方的变化,全因Python的高开发效率..
重构时换成.net,是因为单位以前的应用都是.net的.....
raincious
2013-12-08 11:07:03 +08:00
引: “Python很好,只是你们这些外行不会用”,这是我听 到的最多的所谓Pythonic人的论调。事实是Python 作者自己亲自带领的那个项目也是一塌糊涂。他们遇到 的最主要问题就是可维护性低和性能差。世界上有没有 人比Python作者本人更Pythonic?如果他自己的项目 都不行,谁能做得更好?

不知道说出这句话的根据是什么。不过个人很喜欢java风格。
msg7086
2013-12-08 11:11:42 +08:00
动态语言做快速原型开发,等跑起来了形成规模了,再用更合适的环境去重构,这本来就是挺正常的事情

pythonic的问题我感觉还是有点偏激了,prototyping我觉得是只要能做出东西来就OK,具体实现上的微调我觉得可以等重构来做。
efi
2013-12-08 11:15:18 +08:00
@pythonee 你想表达什么?我没有表达任何价值评判。创造和验证新的利润点比维护现有利润点更重要。原型开发创造和验证idea的商业价值,维护保持idea的商业价值。Python适合创建原型,Java适合维护。所以Python创造比Java更多的价值。这个逻辑可以吧?

当然你对价值有不同的定义另当别论。
aminic
2013-12-08 15:02:38 +08:00
你们都弱爆了,#LISP一行搞定一切#
aku
2013-12-08 15:08:06 +08:00
@aminic 哈哈,这个一行,估计没人能看得下去吧。
不过,话说回来,真的是一行搞定。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/92241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX