ZT:疑Google员工把8w行Python项目用4w行Java重写了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Ricepig
V2EX    Python

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

  •  
  •   Ricepig 2013-12-08 02:36:41 +08:00 11536 次点击
    这是一个创建于 4334 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://blog.est.im/post/69161031446

    非常有意思的一个讨论

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

    下面这段是关键:

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

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

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

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

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

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

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

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

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

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

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

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

    当然你对价值有不同的定义另当别论。
    aminic
        19
    aminic  
       2013-12-08 15:02:38 +08:00
    你们都弱爆了,#LISP一行搞定一切#
    aku
        20
    aku  
       2013-12-08 15:08:06 +08:00
    @aminic 哈哈,这个一行,估计没人能看得下去吧。
    不过,话说回来,真的是一行搞定。
    wizardoz
        21
    wizardoz  
       2013-12-08 15:21:01 +08:00
    8W行的python能被4W行Java重写,那一定是本来设计的有问题吧
    Ricepig
        22
    Ricepig  
    OP
       2013-12-08 15:51:05 +08:00
    题目是有点儿标题党的意思,但是文章里面还是有值得思考的地方:
    1. 任何流程,任何规范,任何review,任何代码检查工具,都阻止不了程序员缓慢地一点一点地滥用语言特性,也阻止不了一个软件代码自身的腐败。
    2. “Python很好,只是你们这些外行不会用”,这是我听到的最多的所谓Pythonic人的论调。事实是Python作者自己亲自带领的那个项目也是一塌糊涂。
    3. Python程序的问题之一就是“腐烂”得很快,程序刚写好的时候看起来很简洁,一旦开始维护就快速地变成一堆乱七八糟的东西,动态语言代码腐烂速度远远超过强类型语言。
    4. 如果用一个语言开发出可维护的代码需要的能力超过了Google能招聘到程序员的平均水平,我认为这个语言就不是一个可以用来开发可维护代码的语言。
    5. 现在随着某Python之父的离开,公司里面粉Python的人也越来越少了。
    dorentus
        23
    dorentus  
       2013-12-08 16:05:38 +08:00
    这八万行的 python,假如这次是用 python 来重写,估计也可以变得更好,所以……
    ovear
        24
    ovear  
       2013-12-08 16:18:41 +08:00
    @dorentus
    发信人: daluobu (阿土仔), 信区: Python
    标 题: Re: 终于把一个8万行的Python程序用Java重写了
    发信站: 水木社区 (Sat Dec 7 00:48:05 2013), 转信

    这个项目里面,重构是一直在进行的,在过去的八年里面,用Python大规模地重构也发生过好几次。

    为什么不仔细看内容就下结论。。
    wdlth
        25
    wdlth  
       2013-12-08 20:51:46 +08:00
    既然是Google自家的,为何不用Golang呢?Python 8W行换成Java 4W行,看来原来Python的版本就有很多冗余的东西。
    mikale
        26
    mikale  
       2013-12-08 21:35:14 +08:00
    python版竟然比java版多4W行,这代码确实有问题。

    我所知道的情况,认识一哥们把C++的3W行代码改成python变成了6千行

    就我个人和周围的朋友,用python写超过100行代码十倍以上的,多的是情况

    这里唯一的问题,公司是google,按照此文的楼主的描述,我看google的水平差别很大啊,竟然会出楼主这种水平的员工。
    Ricepig
        27
    Ricepig  
    OP
       2013-12-08 21:40:36 +08:00
    @wdlth 你稍微看一下你楼上的回帖。另外“如果用一个语言开发出可维护的代码需要的能力超过了Google能招聘到程序员的平均水平,我认为这个语言就不是一个可以用来开发可维护代码的语言。”
    mikale
        28
    mikale  
       2013-12-08 21:41:06 +08:00
    发信人: iJava (简单美好), 信区: Python 标 题: Re: 终于把一个8万行的Python程序用Java重写了 发信站: 水木社区 (Sat Dec 7 14:28:56 2013), 转信

    这个帖子满精彩的,俺就8了一下:

    楼长说的那个系统应该就是Mondrain,从来没有开源的.这里有详细的介绍,包括对g公司的code review process.


    发信人: yueq (yueq), 信区: Python 标 题: Re: 终于把一个8万行的Python程序用Java重写了 发信站: 水木社区 (Sat Dec 7 16:09:34 2013), 转信

    根据楼主的描述,是Google的内部code review工具:)。

    发信人: yueq (yueq), 信区: Python 标 题: Re: 终于把一个8万行的Python程序用Java重写了 发信站: 水木社区 (Sat Dec 7 16:15:16 2013), 转信

    旧系统Mondrian 新系统Critique

    如大家上所述,我觉得楼主对于UT、OOP的理解还有待加强。

    (我也在G家某组用PYTHON)
    Nver
        29
    Nver  
       2013-12-08 21:49:29 +08:00
    没有错,不好讲是语言的区别。更多在于重构。
    mikale
        30
    mikale  
       2013-12-08 22:07:59 +08:00
    没有方法可以解决人的水平问题,方法只是给出了指导原则。任何软件规模慢慢庞大起来,又要可维护性高,一定会面临重写,不管是用什么语言重写。java语言的优势还是无可比拟的JVM的性能优势和几乎人人都知其语法。

    繁琐的软件工程流程,适合于所有语言,团队越大越繁琐,动态语言不解决这问题。软件工程一旦发生问题,再牛的人也要趴下,合作是软件开发的难题。一堆牛人做出一个破项目,在软件开发的历史上不算少见的事情。

    牛人在技术的所有领域都很牛,那是上古传说。
    mikale
        31
    mikale  
       2013-12-08 22:34:26 +08:00
    其实动态语言追求的是更少的人来做事,就个人工程实践经验而言,更高效的开发有助于让人数增加的速度减缓,从而控制软件工程的复杂度,这个道理跟算法的时间复杂度的想法类似,想必都能体会。

    软件工程的大规模合作的难题难以解决,没有好方法可以处理此问题。坦白说,OO也不是解决方法。当前解决这个问题的主流思路是,避免大规模合作,降低代码行数,即避免庞大化,这是动态语言之所以流行的原因。

    开源软件开发名著《大教堂和市集》,首次表达了避免庞大化的是如何可以做到的。github.com之类都是这条思路的当前最佳实践。在牛人总数整体不变的前提下,这几乎是唯一的方式。也是最自然的方式,社会也是这么运作的。

    这个故事的槽点:python版改java版竟然没增加团队的人数,看来项目压力还是比较小。
    clino
        32
    clino  
       2013-12-08 22:49:46 +08:00
    gerrit 我们现在一直在用,还是很不错的,不过性能部分有问题,例如有些大的git提交会失败,怎么也提交不上去,已经给了几十G的内存给gerrit了还是不行,而同样的提交用 ssh push 就没问题,原因大概是用java实现的 jgit 不如用c实现的性能好的原因

    不过我在想如果用纯python实现git在性能上应该会糟糕很多,当然一般来说会用c+python的方式来实现这种库的使用了

    以前我就知道gerrit的前身是用python来实现的,也会想python是不是不合适去实现这样的一个项目,但这种问题应该是木有答案的

    不过有一种场合我觉得python不合适去做应该是比较确定的,就是像android这样的一个系统,用python来做主打语言应该是不合适的,至少性能上会很渣
    standin000
        33
    standin000  
       2013-12-08 23:42:01 +08:00
    @aku 哈哈,一句宏!
    @mikale 人月神话,增加人手不见得减少时间。
    mikale
        34
    mikale  
       2013-12-08 23:45:42 +08:00
    @standin000 那是项目正在开发中不能增加人手,都推倒重来了,可以增加人手。不然软件公司根本不需要招人了。
    est
        35
    est  
       2013-12-09 09:07:59 +08:00
    @clino 大文件上传,很多系统不会考虑很周到。。。比如给 git 上传个8G的 iso 文件很多系统也要跪。现在如果做git 也没有人会sb到用纯python实现,都是直接用这个了 https://github.com/libgit2/pygit2

    python在桌面,移动端都没有任何优势。
    clino
        36
    clino  
       2013-12-09 09:49:27 +08:00
    @est 基本同意在桌面和移动终端上无优势的看法.另外gerrit这样的系统不是跑在桌面也不是移动终端,但这种系统的python实现被java实现替代了,可能说明确实python也不适合做这样的项目,或者即使可以,在沟通成本和人员要求上可能比用 java 的代价还要高.
    Livid
        37
    Livid  
    MOD
    PRO
       2013-12-09 10:01:36 +08:00 via iPhone
    Same story at Twitter. From Ruby to Java.
    standin000
        38
    standin000  
       2013-12-09 14:02:50 +08:00
    @mikale 项目的需求不变,算是同一个项目了。估计增加人手,未必都同意改JAVA。
    WhyLiam
        39
    WhyLiam  
       2013-12-10 00:41:10 +08:00
    "Python实现原型创造80%的价值,Java重写维护创造20%的价值。" 赞这句话
    @efi
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1183 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:51 PVG 07:51 LAX 16:51 JFK 19:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86