Python不可维护?终于把一个8万行的Python程序用Java重写了


发布者 ourjs  发布时间 1386553727000
关键字 技术前沿 

水木社区上出现了一个贴子: 终于把一个8万行的Python程序用Java重写了

争论主题: Python写大型系统是否缺乏可维护性。

正方: Python真可怕,非常容易被滥用,不适合写X万行以上的代码。

反方: 用不好就说语言不好,而且Java省代码也不符合常识,这其实是一个工程问题,如果再用Python重写的话会比Java写出事的要精简的多得多得多。

贴子内容

在噩梦般地维护了一年多一个8万多行的Python程序之后,终于争取到机会把这个破烂玩
意用Java重写了一遍,大概是4万行Java左右。说说效果吧:
1. 从过去平均每周down一次,到现在连续运转近半年只down过一次。
2. 节省超过80%的cpu和内存
3. 代码多了很多功能,过去无数因为系统太复杂无法实现的功能现在都能简单清爽地实现
了。
4. 单元测试真管用了,不是过去那种把代码反过来写一遍的滥用mock了
前后代码都是同一个team写的,写代码的人都不是菜鸟(顶级公司的核心团队)区别只有
语言和几年的经验积累。
总结一句话就是:动态语言滥用起来真是可怕  
珍惜生命,远离Python。

 

评论内容

 

发信人: javaboy (喝了咖啡就话多-_-;), 信区: Python

这个论据和结论的逻辑,给你再好的编程语言你都用不好啊。。。

 

By Ricepig

引 用:“任何流程,任何规范,任何review,任何代码检查工具,都阻止不了程序员缓慢地一点一点地滥用语言特性,也阻止不了一个软件代码自身的腐败。 Python本身鼓励滥用Mock因为没有不用mock就可以方便写unit test的测试工具。Python还鼓励不定义清晰的类接口和类关系,如果你写了一个接口继承,就会有Python大牛跳出来说你不Pythonic。系 统复杂性在大型软件中是不可避免的,但是如果我们可以付出一些写code的时候的小小冗余,带来长期的代码可维护性改善,那就是值得的。Java不是完美 的,用Java一样可以写出不可维护的代码,但是Java至少比Python在这方面强很多。我们的经验证实了这点,信与不信就是看官的事了。”

 

发信人: daluobu (阿土仔), 信区: Python

刚开始写的时候以为就是随便hack一个小系统临时用用,结果慢慢发展到成为关键系统,
负载巨大,而且还对宕机越来越敏感,导致不得不用Java重写。重写也不是那么简单的过
程,半年多时间里面一个模块一个模块地替换,整个系统还不能停转一分钟,像是给一架
飞行中的飞机换引擎。
  
同样的故事在别的公司肯定也发生过好多次,写一个小东西玩玩结果变成了关键系统。我
觉得我们团队的问题是几年前过分迷信Python,错过了在系统还不太复杂的时候重写的机
会。

 

 

发信人: FlyingBoy (revising hgext.inotify), 信区: Python

80k的python代码只实现了40K的java代码的功能?
这python代码烂的可以

 

 

发信人: flw (帅五进九), 信区: Python


这根本不是语言的问题。
而是软件工程的问题。
  
你能够用 Java 重写一遍,为什么就不能用 Python 重写一遍?
性能问题姑且罢了,宕机问题重写肯定能搞定嘛!
重写之后 8 万行变 4 万行也不是不可能嘛。
  
所以实际上归根结底就在于你们用 Python 的时候,
你们潜意识里面是只注重功能,不注重设计的。
而你们用 Java 实现的时候,一定是经过了全盘的深思熟虑,
站在了前人的肩膀上。
  
所以,你总不能说只有最后一个包子才吃得饱吧?

 

 

发信人: dyspnea (呼吸困难), 信区: Python

java 省代码?不符合常识啊
难道是后来找到了合适的java库
而python全是自己造轮子?

 

 

发信人: hgoldfish (老鱼), 信区: Python

80k的Python代码功能不如40k的Java代码。效率不说,这Python代码有复用吗?我自己平时也经常写Python和Java代码。有些功 能需要同样在Python和Java下面各实现一次。我自己的感觉是Python代码量明显少于Java代码。而且,代码量的减少不止来源于`[], {}`这些语法糖,还有很大一部分来源于Python鸭子类型,使得整个系统设计起来更简洁灵活。
对了,40k的Java代码,论表达能力,你还得再扣去一堆堆的getter/setter。能剩下30K就不错了。如果是真的,这次重构应该说相当成功了。

 

发信人: bsxfun (色即是空), 信区: Python


我个人一点很粗浅的感受:Python里面想搞代码重用比Java难太多了。 
Python里面是有OO,但没有private,没有protected,虽然有下划线,但我所维护的代码基本没遵守。
另外据我所知,Python社区也有一大帮人提倡只要function,不要class吧。
一开始我还用Java里面的思路来写python代码,想封装个接口,搞个继承啥的;后来发现这样太麻烦,还不如直接copy&paste&modify来的快糙猛。

 

 

发信人: stephenjy (O_O), 信区: Python

用Java的思路来写python,当然写不好。我一个写Java的同事最近写python的代码,
写了一大堆Factory。。。

 

 

发信人: Brock (Noname), 信区: Python


其实很多时候,脚本语言一看就知道,根本就不是严肃的语言。语言的很多特性都是很
具有随意性, 作者的想法变了,可能就改了。很多东西都没有精确的定义。脚本语言当
个工具用用就算了,真用来做大项目,绝对是作死。

 

 

发信人: daluobu (阿土仔), 信区: Python


原帖说的是一个10个人团队的故事,不是他自己。信与不信其实并不太重要,我发这个
帖子也是纪念一下这个美梦成真的项目。如果有人有共鸣,那就已经很好了。
  
过去公司里面也是有不少迷信Python的人,重写系统的想法我在组里提了很多次,终于
在一个Python大粉丝离开之后才得以实现。现在随着某Python之父的离开,公司里面
粉Python的人也越来越少了。而且事实证明,那个Python之父带的项目(不是我们这
个,比我们这个规模要大一些),用Java重写之后,不论功能还是性能还是新功能,也
都明显好了很多,和我们组的经验相当吻合。
  
我觉得代码行数的节省也在于新系统更严谨的设计。Java鼓励精密的接口设计和简洁的
代码关系,再加上Dependency Injection,代码的复用程度很高。Python完全没有接
口的概念,一切类都是胡乱写,还可以动态增加新成员,导致代码复用的难度相当大,
不修改地复用一个类还不引入bug简直是奇迹。

 

发信人: adamhj (淘气阿丹), 信区: Python


python只是没有对这些行为进行限制,但是滥用这些特性本身就是程序员的过错而不是一种语言的问题;说到底你这python代码各种问题的原因还是因 为“一开始只是随便写的临时用的小项目”,一开始就缺乏严谨的设计,之后又为了在这系统上添加功能估计也是各种奇技淫巧无所不用,最后自然是个没法维护的 东西。python不是不能设计,python不是不能严谨,python只是不做过多限制,该怎么设计、怎么限制应该是开发者自己决定的事情;即使是个 大牛,不能适当约束自己的想象力和创造力,我认为仍然是经验不足的一种表现
  
当然python和java比也的确有很多不足,比如性能方面,比如缺乏严格的接口设计;但是我觉得你们这个例子里面,成败的差别并不完全是语言造成的 

 

 

发信人: Alassius (饿了索食), 信区: Python


不一定是菜鸟,更有可能的是自以为很聪明的老鸟。看到特性觉得好就非要用。实现怎么复杂怎么来。随便一行里二十个运算符,一个函数五百行,十几二十几层缩进。差不多的代码都是复制过去然后稍微改上那么一点点。刚毕业的学生还真未必能搞定二十层缩进。
  
Java是件束缚服,对这种病多少能治点。Java的智慧之处在于语言的严谨性不是为了让写好程序更容易,而是为了让写烂程序更难。Python正好反过 来,可以很容易地写好程序,但是对胡搞没有限制。遇上胡搞的人确实会很惨。谷歌这种地方能招来很聪明的人,而“聪明”正是KISS的天敌。如果没有语言来 做束缚服,码农又不懂得该如何约束自己,那就只能靠项目管理和代码审查。顶级公司核心团队做不好这些,“写一个小东西玩玩结果变成了关键系统”,这正是核 心团队对自己能力过分自负的表现,觉得自己是顶级就可以忽略软件工程。这是教科书式的聪明反被聪明误。 

 

 

标  题: Re: 终于把一个8万行的Python程序用Java重写了


google再怎么废也不至于招菜鸟进去。
  
就这个事情而言,基本就是这个路子:
某天某人一拍脑袋觉得做个某工具很有帮助,于是上python,10分钟三下五除二搞定
了。然后大家都觉得不错,慢慢的用的人越来越多,这个工具的feature也越加越多,
然后又作为beta产品发布了。
作为产品,基本的测试还是得有的,所以胡乱加了点单元测试,又胡乱补了点文档。
  
上线之后,因为用户量的增长,新增feature的速度也加快了。随着feature的增多,
原有的拍脑袋设计压根就不work了,但因为是线上系统又不方便大动干戈,但新
feature还要加,咋办?于是利用动态语言的灵活性,各种各样的hack手段就出来了,
就这么不断凑合下去。慢慢的人去人留,懂得整个系统到底如何work的人越来越少,增
加新feature也越来越难,系统也越来越变得不稳定,最终某天爆发了,大家都不堪忍
受了,来一轮重构。这个时候选择啥语言基本就是一个政治问题,而不再是一个技术问
题了。
  
但是,回过头来想想,如果没有当初某人一拍脑袋,然后10分钟写好一个tools,哪里
有后面的今天呢?而这样的拍脑袋行为在整个公司都在时刻发生着。如果对每一个拍脑
袋行为都以严格的要求,任何一个小tools都要按照成为未来成为关键业务系统的假设
而进行设计,那这个事情做起来还真不是一般的低效。
  
就束缚方面而言,个人不喜欢被束缚,但自由并不等于不能被管理。
从软件工程角度出发,管理的方法多得是。最简单的方法,给git加个hook,不通过
pylint的,不通过unittest的,不通过某某rules的直接不给push。这样不就结了。

 

 

发信人: lvsoft (Lv(The Last Guardian)), 信区: Python


回到我之前的例子,我用一周时间搞定的demo,能在30万日志量下,实现最多0.1秒延迟
的web端监控,数据过滤,数据聚合。但数据量如果上到100万,延迟就达到秒级,如果
上1KW,延迟就要几十秒。
  
然后我现在用8周时间重构的系统,在1亿条规模下依然能达到0.1秒的延迟。
  
换句话说,经过重构,系统的效率提升了1000倍有木有?可惜我第二次重构的时候依然
用了Python,而没选择Java语言,不然又是用事实验证了Python性能很差有木有!

 

 

发信人: justicezyx (又跑路在即), 信区: Python


python这个东西本身的语言特性跟大型项目开发不匹配:
1. 缺乏封装和抽象的基本语言要素;动态特性及各种特性都鼓励程序员快速完成功能而不是尽兴必要的设计和思考
2. 程序运行效率极其低下,如今动态语言没有jit,用gil这种违反常识的设计的屈指可数吧
3. python看上去极其高明的duck typing其实是testing的噩梦。。。
4. python社区长期缺乏对大型软件开发的工程积累;你把python写得跟java一样:高重用、可测试;返回头有人会笑你一点都不pythonic。。。

 

......





回复 (32)
  • #
  • #1 wandering_dawn 1408176569563

    这是一个Python与JAVA的故事,同样的故事在过去也发生在c++与JAVA,c与c++甚至Linux与Unix等等的身上,动态语言本来就为灵活易用而生,而灵活易用又往往与严谨规范背到而且,我认为Python在大型项目开发上比不上JAVA的主要原因是没有足够成熟的解决方案。而JAVA在这方面就好很多,JAVA在这方面的很多问题根本不用思考,直接使用现成的解决方法就可以。而重构本来就是针对现有问题而做出的改进,面对的是一个接近完美的需求分析,所以问题得到解决性能得到提升是理所当然的,而作为一个大型项目选用JAVA也是一个明智之举。但软件开发看重的问题很多,作为一个小尝试,Python是一个不错的选择,而Python调用JAVA、c++等的代码也不难,方便重构时混合使用,Google选择Python只要可能也是看重它的'胶水'特性,所以Android没有选择Python。反正语言各有长短,程序员也各有所好,正如霍大侠的那句话武术本身并无强弱之分,只是修习者的实力各有不同。

  • #2 lively_surf 1408235730206

    @wandering_dawn #0

    基因不同,Java是更工程化的语言,偏学院派,偏向严谨,正确性。

    Python等脚本语言更注重实用性,偏实践派,偏向简单,效率。

  • #3 廖字羊 1432283870942

    楼猪瞎编啊,原文是XXX万行java代码改写成X万行python代码好伐!!!

  • #4 邓尼纪 1441793204786

    麻痹,调用一个类库,不知道多加了多少代码

  • #5 章岁吗 1454328011595

    请问youtube访问量大不大、效率高不高、网站好不好?人家还用python写的,你一家小公司,有什么好吹的,只是技术不行罢了

  • #6 ERIC 1455259984259

    Python只是在走10年前perl走的老路里面,最后回归,某一单独的领域,不同的是perl有CPAN,python有什么

    脚本语言本来就应跟java这种语言相比,语言来说,perl 和 Java是两个极端,一个过于自由,一个过于严谨 而python处于两者之间,不伦不类

  • #7 沈伪代 1463626952808

    我只能说,太逗B了。你们爱用谁用谁,反正我用PYTHON。再见!

  • #8 邬斗水 1468312817974

    语言真能培养出不一样的人才。我见到过牛逼的c程序员,写出一大堆的过程式函数的互相调用,我为啥不用设计模式,一下子就简单了;我见过php程序员快8年工龄了,8万行代码融于一个函数无法自拔,这样的团队还在不断的讨论php技术....

  • #9 徐节犬 1469153203346

    哈哈

  • #10 徐节犬 1469153306717

    instagram也是python web开发的,不是一样运行的很好。php都说最烂,facebook用的那么牛(后来自己hack php的是另外一说,也没有见人家改成java啊)

  • #11 伍未文 1481262550431

    sssssssssssssssssssssssssss

  • #12 鲁汗天 1487642473211

    google 80%的系统在跑着PYTHON, 呵呵,呵呵。。。。

  • #13 邢件尖 1487922617084

    我们从来不缺会写几句代码,实现几个小功能的程序员,我们缺的是能够对整个项目进行规划的程序架构师

  • #14 邢件尖 1487922691013

    会写代码就像学会下象棋的规则,但是能不能变成象棋大师?人的问题

  • #15 元兄阳 1496248092993

    @章岁吗 #4

    6666

  • #16 宁比朵 1496836717008

    python几句话能搞定的事情,JAVA需要几十句话。你特么在逗我。

  • #17 任万屯 1498203249947

    @邢件尖 #12

    然而天朝的架构师都实现不了小程序。讽刺

  • #18 aszhou 1500360651219

    @任万屯 #16 那你见到的一定是伪架构师。

  • #19 辛公了 1501121669280

    如果那个项目,从起始阶段就用java做,你8万行能写出来就有鬼了,重构有什么好吹的

  • #20 连如虫 1502716599335

    python看上去就不能写大型项目,写起来各种随意,不好控制项目质量

  • #21 伍再勿 1506406780951

    @宁比朵 #1

  • #22 詹叨号 1508252040405

    python 这个语言比较灵活,要悟性高 一个python程序猿 可以干个六个java程序猿 ,最起码 潜力大 设计领域广 人工智能 web 科学计算 值得拥有

  • #23 吕号托 1509077068352

    @詹叨号 #21

    悟性高汇编都能干掉几个python

  • #24 吕号哈 1509077105094

    反正我用java我舒服就行

  • #25 范入之 1509513906135

    又要给python抹黑了。。。 跟上面说的例子一毛一样, 本来脑袋一拍几K的代码给自己写的个工具用来偷懒的,莫名其妙现在成公司这个业务指定的工具了。。。 哪个部门的都特么来提需求,领导还来着不拒,美其名曰让工具更完善,现在已经3W多行了。。。代码自己都快看不下去。。。 哪天心情好了重构吧

  • #26 朱千兆 1511337695533

    这根本不是语言本身的问题,而是人的问题。

  • #27 姬死发 1516937828909

    @章岁吗 #4是的,看他那个样子,也就写写java

  • #28 任台旦 1517216219622

    @章岁吗 #4

    人家的高并发并不是用PY来写的,PY只是做后台维护和数据分析而以,说白了PY就是个辅助。

  • #29 戚尼吗 1524143661923

    随便发言。。。还可以这样。。。 好样的,辅助大师py

  • #30 郭引危 1524212364249

    @吕号托 #22

    牛鼻,哈哈哈

  • #31 穆防布 1526107451848

    py 方向好广

  • #32 maxian 1526262835091

    一脸那啥的进出

微信扫码 立即评论