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

http://ourjs.com/detail/52a5217fc253e36203000002

水木社区上出现了一个贴子: 终于把一个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。。。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值