Rails 项目后期迁移到其他语言的倒也很多,但没觉得这是动态语言的劣势吧…… 以下原帖:
发信人:daluobu (阿土仔), 信区:Python 标 题:终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Fri Dec 6 08:10:26 2013), 转信
在噩梦般地维护了一年多一个 8 万多行的 Python 程序之后,终于争取到机会把这个破烂玩意用 Java 重写了一遍,大概是 4 万行 Java 左右。说说效果吧:
- 从过去平均每周 down 一次,到现在连续运转近半年只 down 过一次。
- 节省超过 80% 的 cpu 和内存
- 代码多了很多功能,过去无数因为系统太复杂无法实现的功能现在都能简单清爽地实现了。
- 单元测试真管用了,不是过去那种把代码反过来写一遍的滥用 mock 了。 前后代码都是同一个 team 写的,写代码的人都不是菜鸟(顶级公司的核心团队)区别只有语言和几年的经验积累。
总结一句话就是:动态语言滥用起来真是可怕
珍惜生命,远离 Python。
—
※ 来源:·水木社区 http://newsmth.netFROM:·[ 216.239.45.*]
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Fri Dec 6 08:24:55 2013), 转信
刚开始写的时候以为就是随便 hack 一个小系统临时用用,结果慢慢发展到成为关键系统,负载巨大,而且还对宕机越来越敏感,导致不得不用 Java 重写。重写也不是那么简单的过程,半年多时间里面一个模块一个模块地替换,整个系统还不能停转一分钟,像是给一架飞行中的飞机换引擎。
同样的故事在别的公司肯定也发生过好多次,写一个小东西玩玩结果变成了关键系统。我觉得我们团队的问题是几年前过分迷信 Python,错过了在系统还不太复杂的时候重写的机会。
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Fri Dec 6 13:42:31 2013), 转信
原帖说的是一个 10 个人团队的故事,不是他自己。信与不信其实并不太重要,我发这个帖子也是纪念一下这个美梦成真的项目。如果有人有共鸣,那就已经很好了。
过去公司里面也是有不少迷信 Python 的人,重写系统的想法我在组里提了很多次,终于在一个 Python 大粉丝离开之后才得以实现。现在随着某 Python 之父的离开,公司里面粉 Python 的人也越来越少了。而且事实证明,那个 Python 之父带的项目(不是我们这个,比我们这个规模要大一些),用 Java 重写之后,不论功能还是性能还是新功能,也都明显好了很多,和我们组的经验相当吻合。
我觉得代码行数的节省也在于新系统更严谨的设计。Java 鼓励精密的接口设计和简洁的代码关系,再加上 Dependency Injection,代码的复用程度很高。Python 完全没有接口的概念,一切类都是胡乱写,还可以动态增加新成员,导致代码复用的难度相当大,不修改地复用一个类还不引入 bug 简直是奇迹。
※ 来源:·水木社区 http://newsmth.netFROM:·[ 216.239.45.*]
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 00:48:05 2013), 转信
这个项目里面,重构是一直在进行的,在过去的八年里面,用 Python 大规模地重构也发生过好几次。
决定用 Java 重写是很艰难的,不是某个人拍脑袋的决定。放弃 Python 主要是因为它的代码可维护性比较差,缺乏编译器检查,动态语言特性导致模块间过渡耦合,缺乏性能分析工具,内存管理机制低效,多线程性能很差。这些都是一个持续维护很多年的高负载应用所必须的。
Linter 能做的事情很有限,公司代码管理系统早就是不过 lint 不能 submit。code review 也不能解决问题,因为团队里面每一个人对于系统设计和语言特性是否滥用理解程度都不同。
争论是否能够通过管理来解决语言本身缺陷其实是没意义的,因为我们碰见的是实实在在的语言缺陷问题,就应该用最直接的解决方案。
“Python 很好,只是你们这些外行不会用”,这是我听到的最多的所谓 Pythonic 人的论调。事实是 Python 作者自己亲自带领的那个项目也是一塌糊涂。他们遇到的最主要问题就是可维护性低和性能差。世界上有没有人比 Python 作者本人更 Pythonic?如果他自己的项目都不行,谁能做得更好?
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 01:30:35 2013), 转信
如果一个语言比另外一个差 1000 倍,那就是很大的问题了,随便写两行 code 都可能成为性能瓶颈。Python 又恰好缺乏性能分析和优化工具,导致出了性能问题都不知道在哪儿。BTW,1000 倍这个数据是有依据的。
接口上所谓的冗余其实是提高程序可维护性的关键。人脑容量有限,所以必须用电脑辅助人脑进行接口使用正确性的检查。强制要求程序员写强类型的接口也是一种强迫程序员对正确的设计进行思考的过程。结果导致的就是强类型语言可维护性更好。Openstack 只有 1.4M 和 3 年历史,用 c/c++/Java 写的大型软件都是复杂几个数量级,而且维护几十年。Python 程序的问题之一就是“腐烂”得很快,程序刚写好的时候看起来很简洁,一旦开始维护就快速地变成一堆乱七八糟的东西,动态语言代码腐烂速度远远超过强类型语言。 如果 Python 作者本人带领的团队都写不出可维护的 Python 代码,谁能?
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 01:50:35 2013), 转信
Guido 搞的那个 code review 系统就是我说的那个维护不了的系统,最后的结果就是用 Java 重写了。新系统比旧系统好用很多,而且还持续有新功能上线。那个项目组有一个在公司内部流传很广的文章,说为什么需要用 Java 重写,并且结论是 Python 只适合写 100 行以内的小脚本。我刚才试了找这个文章有没有外网可以访问的版本,但是没找到。
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 02:25:23 2013), 转信
如果用一个语言开发出可维护的代码需要的能力超过了 Google 能招聘到程序员的平均水平,我认为这个语言就不是一个可以用来开发可维护代码的语言。创造出一个不可维护的语言很容易,汇编,Basic 以及大批的早期编程语言都是这种。创造出可以让普通程序员也可以维护的语言才是更困难的,只有少数语言做到了,C 和 Java 是,C++ 都不能算是很成功。
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 02:48:32 2013), 转信
你几乎都说反了,Google 非常重视代码的可维护性,扩展性几乎是在项目一开始就必须考虑的问题,Google 对软件工程实践的重视和深度是我所知道的公司里面最高的。不知道你说的管理是什么意思,但是 Google 有强制性的代码规范,有强制性的 designreview。Python 的很多“高级”特性已经在编程规范里面禁用了,但是有些特性是没法禁用的,比方所有对象 member 都是 public,比方函数参数没有类型。就是这些很基本的东西带来的可维护性问题。
越是水平高的程序员越是会遵守编程规范和软件工程实践。至少在我们这种产品 team 里面大家是相当重视代码质量和设计质量的。这也是为什么我们舍得投入那么多把一个不好的系统重写。
【在 Alassius (饿了索食) 的大作中提到:】
问题是这种不可维护性恐怕正是贵司能招聘到的这种平均水平造成的。智商高,技术至上,写代码怎么聪明怎么来,不重视维护,不重视扩展性(直到太迟的时候),不重视软件工程,不重视管理。普通程序员如果有好的资深码农引导,早早地被告知不要滥用语言的灵活性,倒未必会有这些问题。聪明的程序员你这样跟他说他还看不起你。
发信人:daluobu (阿土仔), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 03:21:05 2013), 转信
意思就是:任何流程,任何规范,任何 review,任何代码检查工具,都阻止不了程序员缓慢地一点一点地滥用语言特性,也阻止不了一个软件代码自身的腐败。Python 本身鼓励滥用 Mock 因为没有不用 mock 就可以方便写 unit test 的测试工具。Python 还鼓励不定义清晰的类接口和类关系,如果你写了一个接口继承,就会有 Python 大牛跳出来说你不 Pythonic。系统复杂性在大型软件中是不可避免的,但是如果我们可以付出一些写 code 的时候的小小冗余,带来长期的代码可维护性改善,那就是值得的。Java 不是完美的,用 Java 一样可以写出不可维护的代码,但是 Java 至少比 Python 在这方面强很多。我们的经验证实了这点,信与不信就是看官的事了。
发信人:YABC (Yet Another BBS Client), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 10:26:33 2013), 转信
难得这么热烈的讨论,可是争论语言优劣没结果。
希望楼主再爆料点。这个大粉丝说的就是 Guido 了吧?这套系统说的就是 Rietveld?Java 的版本说的是 Gerrit 吗?可是 Gerrit 不是早就有了吗?难道你们内部用的不是开源的 Gerrit?另外,GAE 的 Python 版本你们内部有什么评价呢,比起 Java 和 Go 的呢?也觉得质量不行吗?Guido 干得不爽才走了吗?谢谢。
我用过 Rietveld,是 Python 语言本身在用的 review 工具,感觉风格挺老旧的。还没见有别的项目用这个东西。
发信人:YABC (Yet Another BBS Client), 信区:Python 标 题:Re: 终于把一个 8 万行的 Python 程序用 Java 重写了 发信站:水木社区 (Sat Dec 7 10:41:11 2013), 转信
Gerrit 是这个项目的 Java 的 fork,很多大项目在用。从这点说 Guido 开创的这个 Python 项目算成功的。当然后面的自然会吸取前面的教训,做得更好是应该的。
发信人: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)