自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python如何使基于Java的StubHub受益

開發(fā) 后端
自2006年以來,Python 已經(jīng)相當(dāng)流行,你可以看到越來越多的初創(chuàng)公司在他們開始自己的業(yè)務(wù)時(shí)選擇 Python作為主要語言

自2006年以來,Python 已經(jīng)相當(dāng)流行,你可以看到越來越多的初創(chuàng)公司在他們開始自己的業(yè)務(wù)時(shí)選擇 Python作為主要語言,例如:

Netflix – 在線電視節(jié)目和電影公司

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

YouTube – 分享在線視頻

Disqus – 在線討論和評(píng)論服務(wù)

OpenStack – 用于構(gòu)建公共云和私有云的全開放源代碼,全 Python 基礎(chǔ)構(gòu)建

當(dāng)這些初創(chuàng)公司把這個(gè)優(yōu)雅利落的語言作為基礎(chǔ)設(shè)施來支持其業(yè)務(wù)的快速增長而得到越來越多的利益時(shí),我在考慮我們 StuhbHub (一個(gè)基于 Java 生態(tài)系統(tǒng)的公司)怎樣也可以從中獲益,節(jié)省工作時(shí)間,并顯著提高生產(chǎn)力,我會(huì)解釋 Python 是什么?為什么選擇 Python ,并向你展示用 Python 為我們的日常工作提供解決方案。

Python是什么 ? 為什么選擇Python ?

Python是一種解釋型的,面向?qū)ο蟮膭?dòng)態(tài)語言,像Java一樣同樣是跨平臺(tái)的。與傳統(tǒng)的主流語言如 Java / C + + 相比,程序員們喜歡它是由于以下原因:

1. Python 是一種多用途的語言

我們知道,每一種語言都有其自身的優(yōu)勢或劣勢,例如有些人會(huì)用 C++ 寫運(yùn)行在Windows操作系統(tǒng)平臺(tái)上的游戲,但沒有人會(huì)用 C++ 去建網(wǎng)站。好消息是你幾乎可以利用 Python 處理任何工作,例如:web 應(yīng)用,桌面 GUI 應(yīng)用,Linux 腳本或其他任何方便的工具,并且作為”膠水語言”你甚至可以在 Python 代碼中調(diào)用像 Java/C++ 等其他語言,這意味著你已有的代碼庫可以重用。

2. Python 更有生產(chǎn)力

一般來說, 當(dāng)我們談及 Java 和 Python時(shí),最顯著的區(qū)別是作為動(dòng)態(tài)語言 Python 不需要編譯這一步。這其實(shí)就意味著”生產(chǎn)力”。

還記得我們?nèi)绾悟?yàn)證 Java 代碼的修改嗎? 尤其是在 StubHub,我們有一個(gè)相當(dāng)大的代碼庫。

  1. 修改你的 Java 代碼 (1分鐘)
  2. 使用 ant/maven 把你的 Java 代碼編譯為字節(jié)碼 (5分鐘)
  3. 重啟 Jboss/Tomcat 來部署你的應(yīng)用程序(5分鐘)
  4. 打開瀏覽器查看變化

這里的痛點(diǎn)是:假設(shè)你有一個(gè) bug 修復(fù)需要1分鐘,但你必須等待至少10分鐘,才能在瀏覽器中看到變化,更糟糕的是,如果所做的修復(fù)并不能正常工作,因此,又要花費(fèi)下一個(gè)10分鐘只是為了做構(gòu)建和部署。

當(dāng)你使用 Python 處理的話,就相當(dāng)容易了。

  1. 修改你的 Python 代碼(1分鐘)
  2. F5 刷新瀏覽器查看變化

恭喜! 你在每次迭代修改上都節(jié)省了十分鐘的時(shí)間。

考慮一下每位開發(fā)者每天有多少次修改代碼,像 StubHub 這樣的龐大組織又有多少開發(fā)者,你可以計(jì)算下你總共可以節(jié)省多少工時(shí),這可能大得超乎你的想象。

3. 優(yōu)雅,整齊,緊湊的 Python

還有另一個(gè)主要的優(yōu)點(diǎn)。Python的語法相當(dāng)酷,我曾有一次用 Python 和 Java 去實(shí)現(xiàn)同樣的功能,與 Java 相比 Python 僅僅用了一半的代碼行數(shù)做了同樣的事情。 基于此,這就是為什么人們喜歡用偽代碼來驗(yàn)證想法或通過編寫 Python 代碼,實(shí)現(xiàn)一個(gè)快速原型。這能很快地讓你知道你的想法或原型是否可行,然后你可以為你的生產(chǎn)環(huán)境用 Java 重寫代碼。這總好過你在一開始用 Java 編碼,卻最終發(fā)現(xiàn)你的原型是不可行的。

StubHub 的 Python 故事

StubHub 走的技術(shù)路線如下:

第一代: coldfusion
第二代:Java, 基于流的框架
第三代:Java, Tapestry + Spring + Hibernate 各種現(xiàn)代技術(shù)框架

你可以看到整個(gè)技術(shù)生態(tài)系統(tǒng)的發(fā)展是基于Java的。作為一名工程師,有時(shí)你不可能說服你的團(tuán)隊(duì)或架構(gòu)師放棄已有的代碼庫或把底層架構(gòu)從 Java 轉(zhuǎn)為其他的,但是,仍舊有一些改善的空間,你可以把事情做得又好又快,讓我給你分享一下來自我在 StubHub 個(gè)人工作經(jīng)歷的幾個(gè)故事。

故事1:使用 Python 處理 Java 源代碼

2011年 StubHub 的技術(shù)團(tuán)隊(duì)舉行了為期一周名為 fixit 的活動(dòng),活動(dòng)要求所有的開發(fā)者在一周之內(nèi)為已有的代碼寫盡可能多的測試用例以提高整體的測試覆蓋率,但在此之前,我們需要先把一些測試用例標(biāo)記為”broken”, 因?yàn)槿绻腥魏螠y試用例失敗,都會(huì)導(dǎo)致分析工具無法正常產(chǎn)生覆蓋率報(bào)告。

關(guān)鍵是給測試用例標(biāo)記上”broken”很容易, 只要給 @Test annotations 加上 broken 的屬性,如下所示:

把這樣的代碼:

  1. public class SomeTest { 
  2. ... 

改成:

  1. @Test(groups = {"broken"}) 
  2. public class SomeTest { 
  3. ... 

但在 StubHub 的代碼庫中有成百上千的測試用例代碼,那意味著你首先得把他們都找出來,從代碼庫中檢出一份案例,修改源代碼,提交回修改,然后為下一個(gè)案例重復(fù)此步驟直到處理完所有成百上千個(gè)案例。

#p#

這事相當(dāng)枯燥,我認(rèn)為Python 更擅長這種重復(fù)的文件處理而不是我,以下是自動(dòng)處理的Python代碼片段:

  1. def start(path_name): 
  2.     for root, dirs, files in os.walk('src/' + path_name): 
  3.         if files: 
  4.             for file in files: 
  5.                 filename = root + '/' + file 
  6.                 print 'filename: ' + filename 
  7.                 os.system('p4 edit //depot/project/pb_fixit_2011/gen31/test/' + filename) 
  8.                 with open(filename, 'r+') as javafile: 
  9.                     fileContent = javafile.read() 
  10.                     matcher = re.search(r'@Test([\w\W]*?)public class', fileContent) 
  11.                     if not matcher: 
  12.                         fileContent = re.sub(r'public class''@Test(groups = {"broken"} )\npublic class',  fileContent) 
  13.                         javafile.seek(0# return to 0 file position 
  14.                         javafile.write(fileContent) 

僅僅14行代碼,通過遍歷給定的路徑,并使用 p4 edit ... 從 Peforce 檢出文件,從Java源文件讀取文件內(nèi)容,使用正則表達(dá)式把測試用例標(biāo)記為 broken,然后把更改寫回源文件。我想這個(gè)腳本節(jié)約了我一天的工作。

故事2:測試第三方的API

2012 年我加入了一個(gè)名為禮物卡的項(xiàng)目,有一個(gè)名為 Black Hawk 的第三方技術(shù)合作方,他們提供兌換錢的 Web Service API。在這個(gè)項(xiàng)目剛開始的時(shí)候,他們希望確保 StubHub 的測試服務(wù)器和 Black Hawk 服務(wù)器之間的 API 調(diào)用是通暢的。由于這僅僅只是做個(gè)驗(yàn)證,并不需要很嚴(yán)謹(jǐn)?shù)膶懴抡?guī)的,能夠很好處理異常的 Java 代碼,也不需要在我們已經(jīng)安裝了 JRE 和 HttpClient 庫的環(huán)境下部署我們的代碼并測試 API(順便說一下, Python 作為基礎(chǔ)應(yīng)用被預(yù)裝在大多數(shù)的 Linux 分發(fā)版中),當(dāng)我認(rèn)為這并不是很正式的代碼,以后也不會(huì)被別人重用或者維護(hù),就有了可以做同樣事情的 Python 代碼:

  1. from httplib2 import Http 
  2. def call_bh(url): 
  3.     try
  4.         http = Http() 
  5.   
  6.         # Post request parameters 
  7.         body = """<?xml version="1.0" encoding="UTF-8"?> 
  8.             <bhnums:request 
  9.             ...... 
  10.             </bhnums:request> 
  11.         """ 
  12.         headers = {'Content-type''text/xml;charset=UTF-8'
  13.   
  14.         response, content = http.request(url, "POST", headers=headers, body=body) 
  15.   
  16.         # Expected post response 
  17.         print content 
  18.     except Exception, e: 
  19.         print e 
  20.         print 'fail to call black hawk.' 
  21.     else
  22.         print 'success to call black hawk.' 

通過 Python 來調(diào)用服務(wù)很令人愉快。盡管第一次失敗了,由于代碼的短小和易讀性我只需要拷貝Python代碼段到郵件里,發(fā)送給第三方的人詢問:“這段代碼有什么毛病 嗎?” 他們更正了某個(gè) http 請求包的問題,給我回了郵件,然后我在測試服務(wù)器上修改代碼,再次測試,它正常工作了。這期間并沒有用到 JRE/IDE/編譯/構(gòu)建/部署,僅僅通過 ssh 連接到你的 Linux 服務(wù)器,使用 vi/emacs 修改你的代碼, 然后運(yùn)行!

故事3:給客戶重新發(fā)送獎(jiǎng)勵(lì)郵件

2012 年,我還參與了另外一個(gè)名為 Rewards 的項(xiàng)目,旨在給參加這項(xiàng)活動(dòng)的用戶發(fā)送打折信息。他們加入這項(xiàng)活動(dòng)以后,應(yīng)該會(huì)收到一封關(guān)于活動(dòng)詳情的郵件。不幸的是由于服務(wù)器的問題,有 1285 位用戶沒有成功收到郵件,因此盡管他們已經(jīng)加入了 Rewards 這個(gè)活動(dòng),卻可能無法了解到如何獲得折扣。因此,我被要求重新發(fā)送郵件來補(bǔ)救這個(gè)問題。

這項(xiàng)任務(wù)很緊急,如果我們能及時(shí)重新發(fā)送郵件,對用戶來說也很有價(jià)值。但是假如我們選擇傳統(tǒng)的 Java 代碼,我們需要通過 JDBC 或 Hibernate 來調(diào)用 SQL, 從數(shù)據(jù)庫獲得沒收到郵件的用戶,寫下重新發(fā)送郵件的代碼, 弄清楚在生產(chǎn)環(huán)境上,哪里構(gòu)建/部署這段代碼比較合適,然后回滾這次部署,因?yàn)檫@段代碼只會(huì)使用一次。這很丑陋而且我能想象到,這至少需要花費(fèi)我們2天時(shí) 間來開發(fā)部署。

選擇Python的話事情就簡單多了,它還是一段運(yùn)行在Linux服務(wù)器上的腳本。為了避免讀取數(shù)據(jù)庫,我們可以首先從數(shù)據(jù)庫中取出用戶 id 并像這樣作為一個(gè)列表寫到腳本中

  1. users = [556483556480556477556379556378556471556374469686556369556466556365556364556462556460556362556360556456, ...] 

1285個(gè)用戶 ID 看起來是比較大的數(shù)目,但把他們?nèi)糠旁?Python 的一個(gè)列表中作為腳本的一部分還是可以接受,然后讓我們給用戶重新發(fā)送郵件:

  1. def sendmail_to_all(users, url): 
  2.     for user in users: 
  3.         time.sleep(1
  4.         sendmail(user, url) 

原文鏈接:http://blog.jobbole.com/43976/

責(zé)任編輯:陳四芳 來源: 伯樂在線
相關(guān)推薦

2023-03-14 15:00:58

邊緣計(jì)算云計(jì)算

2020-03-30 11:31:25

云計(jì)算

2023-05-05 09:50:30

商業(yè)技術(shù)數(shù)據(jù)存儲(chǔ)

2022-03-25 13:33:48

區(qū)塊鏈技術(shù)數(shù)字營銷

2023-06-29 10:16:25

增強(qiáng)現(xiàn)實(shí)AR

2023-07-18 16:01:51

布線結(jié)構(gòu)化布線

2021-08-11 10:14:17

物聯(lián)網(wǎng)智能酒店IoT

2022-04-18 16:44:55

區(qū)塊鏈區(qū)塊鏈技術(shù)

2022-07-12 14:31:55

機(jī)器學(xué)習(xí)人工智能工具

2022-09-01 17:01:17

物聯(lián)網(wǎng)人工智能自動(dòng)駕駛

2022-12-08 10:55:12

5G倉庫自動(dòng)化

2022-12-27 11:12:02

聯(lián)網(wǎng)物人工智能

2021-11-12 09:28:18

人工智能數(shù)據(jù)分析工具

2023-08-29 11:31:28

2021-08-11 14:37:27

區(qū)塊鏈加密貨幣技術(shù)

2021-01-08 15:08:53

云計(jì)算小型企業(yè)數(shù)據(jù)

2021-11-18 10:41:36

物聯(lián)網(wǎng)零售餐飲連鎖店

2020-04-22 17:09:04

Python自動(dòng)化開發(fā)

2023-10-18 09:00:00

人工智能異常檢測

2021-06-09 08:00:00

Python編程語言開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)