Python如何使基于Java的StubHub受益

自2006年以来,Python 已经相当流行,你可以看到越来越多的初创公司在他们开始自己的业务时选择 Python作为主要语言,例如:

Netflix – 在线电视节目和电影公司

Dropbox – 最流行的文件同步和共享工具

YouTube – 分享在线视频

Disqus – 在线讨论和评论服务

OpenStack – 用于构建公共云和私有云的全开放源代码,全 Python 基础构建

当这些初创公司把这个优雅利落的语言作为基础设施来支持其业务的快速增长而得到越来越多的利益时,我在考虑我们 StuhbHub (一个基于 Java 生态系统的公司)怎样也可以从中获益,节省工作时间,并显著提高生产力,我会解释 Python 是什么?为什么选择 Python ,并向你展示用 Python 为我们的日常工作提供解决方案。

推荐阅读:

Python UNIX和Linux系统管理指南 PDF高清版

Python 用socket模块实现检测端口和检测web服务

Python是什么 ? 为什么选择Python ?

Python是一种解释型的,面向对象的动态语言,像Java一样同样是跨平台的。与传统的主流语言如 Java / C + + 相比,程序员们喜欢它是由于以下原因:

1. Python 是一种多用途的语言

我们知道,每一种语言都有其自身的优势或劣势,例如有些人会用 C++ 写运行在Windows操作系统平台上的游戏,但没有人会用 C++ 去建网站。好消息是你几乎可以利用 Python 处理任何工作,例如:web 应用,桌面 GUI 应用,Linux 脚本或其他任何方便的工具,并且作为”胶水语言”你甚至可以在 Python 代码中调用像 Java/C++ 等其他语言,这意味着你已有的代码库可以重用。

2. Python 更有生产力

一般来说, 当我们谈及 Java 和 Python时,最显著的区别是作为动态语言 Python 不需要编译这一步。这其实就意味着”生产力”。

还记得我们如何验证 Java 代码的修改吗? 尤其是在 StubHub,我们有一个相当大的代码库。

修改你的 Java 代码 (1分钟)
使用 ant/maven 把你的 Java 代码编译为字节码 (5分钟)
重启 Jboss/Tomcat 来部署你的应用程序(5分钟)
打开浏览器查看变化
这里的痛点是:假设你有一个 bug 修复需要1分钟,但你必须等待至少10分钟,才能在浏览器中看到变化,更糟糕的是,如果所做的修复并不能正常工作,因此,又要花费下一个10分钟只是为了做构建和部署。

当你使用 Python 处理的话,就相当容易了。

修改你的 Python 代码(1分钟)
F5 刷新浏览器查看变化 
恭喜! 你在每次迭代修改上都节省了十分钟的时间。

考虑一下每位开发者每天有多少次修改代码,像 StubHub 这样的庞大组织又有多少开发者,你可以计算下你总共可以节省多少工时,这可能大得超乎你的想象。

3. 优雅,整齐,紧凑的 Python

还有另一个主要的优点。Python的语法相当酷,我曾有一次用 Python 和 Java 去实现同样的功能,与 Java 相比 Python 仅仅用了一半的代码行数做了同样的事情。 基于此,这就是为什么人们喜欢用伪代码来验证想法或通过编写 Python 代码,实现一个快速原型。这能很快地让你知道你的想法或原型是否可行,然后你可以为你的生产环境用 Java 重写代码。这总好过你在一开始用 Java 编码,却最终发现你的原型是不可行的。

StubHub 的 Python 故事

StubHub 走的技术路线如下:

第一代: coldfusion
第二代:Java, 基于流的框架
第三代:Java, Tapestry + Spring + Hibernate 各种现代技术框架

你可以看到整个技术生态系统的发展是基于Java的。作为一名工程师,有时你不可能说服你的团队或架构师放弃已有的代码库或把底层架构从 Java 转为其他的,但是,仍旧有一些改善的空间,你可以把事情做得又好又快,让我给你分享一下来自我在 StubHub 个人工作经历的几个故事。

故事1:使用 Python 处理 Java 源代码

2011年 StubHub 的技术团队举行了为期一周名为 fixit 的活动,活动要求所有的开发者在一周之内为已有的代码写尽可能多的测试用例以提高整体的测试覆盖率,但在此之前,我们需要先把一些测试用例标记为”broken”, 因为如果有任何测试用例失败,都会导致分析工具无法正常产生覆盖率报告。

关键是给测试用例标记上”broken”很容易, 只要给 @Test annotations 加上 broken 的属性,如下所示:

把这样的代码:

publicclass SomeTest {

...

}

改成:

@Test(groups = {"broken"})

publicclass SomeTest {

...

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f31ad09078b2f8ccd1ec06bb186cea5f.html