中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

開源公司軟件產(chǎn)品的復雜性和回報

發(fā)布于:2020-12-24 16:05:07

0

123

0

api django 框架 開源 salesforce 合作伙伴內(nèi)容

那是2011年,我們Toopher正在構建一個復雜的身份驗證API。我們的小型創(chuàng)業(yè)公司基于創(chuàng)始人Evan Grim的研究生項目,而認證API是我們的唯一產(chǎn)品。作為一家初創(chuàng)公司,我們專注于創(chuàng)造價值,因此我們利用現(xiàn)有工具,而不是從頭開始構建一切。

我們用Django編寫了整個產(chǎn)品,這是一個成熟的,包含電池的開源Python Web框架,致力于快速的應用程序開發(fā)(正是我們當時的工作?。?。我們使用了Piston框架來處理API創(chuàng)建。這是一個不錯的框架,沒有什么可以滿足我們的需求了。但是Piston最終被放棄為一個項目,迫使我們提出了自己的解決方案,我們做到了,我們稱之為django-declarative-apis。

到這個時候,我們的小公司已經(jīng)被Salesforce收購。實際上,Salesforce Authenticator應用程序是作為我們復雜的身份驗證API的前端而構建的。我們意識到django-declarative-apis框架填補了Django生態(tài)系統(tǒng)中的空白,并希望將其開源,但遇到了兩個問題。

首先,新框架已深深地嵌入到我們創(chuàng)建的自動兩因素身份驗證API中,并且將其發(fā)布到一個可以公開發(fā)布的單獨程序包中將是一個挑戰(zhàn)。

其次,盡管Salesforce制定了支持員工從事開源項目的政策,但當時并沒有將先前專有代碼轉(zhuǎn)換為開源代碼的流程。

我們想分享我們學到的東西,我們學到了兩件事。首先,我們學習了如何為Django設計這樣的庫,以及如何將其與許多早已嵌入到應用程序中的意大利細面條邏輯解耦,以進行公共開源發(fā)行。其次,我們學習了如何通過Salesforce推出這樣的開源版本,這是一個動態(tài)的地方,但也是一個很大的地方-您不僅可以獲取專有代碼,然后將其扔到GitHub上,然后再調(diào)用它。首先,讓我們討論一下技術挑戰(zhàn)以及我們?nèi)绾螒獙@些挑戰(zhàn)。

反對意大利面條的邏輯

原始的API框架是一個非常程序化的解決方案。您從一個請求開始,然后提取參數(shù)并執(zhí)行您需要做的事情,以一種方法形成響應。我們必須不斷地使用新功能,而又不會破壞任何東西,最后我們得到了一堆令我們感到羞恥的意大利面條邏輯處理程序。對于單個處理程序,那里有一個非常多毛的500行方法。

它變得非常脆弱,每次不得不修改它時,我們都會感到難過。不同的行為集將基于輸入?yún)?shù)運行,并且存在很多相互依賴關系。但是我們需要繼續(xù)支持所有這種行為,因為我們有依賴于它的每個方面的客戶。

關于版本2的想法已經(jīng)出現(xiàn)了一段時間。最大的目標是使所有API處理程序都以聲明方式進行編碼。也就是說,可以根據(jù)代碼確定處理程序的行為。您可以對代碼進行靜態(tài)分析,并了解所有需要了解的信息:如何調(diào)用處理程序,獲得什么樣的響應以及它在中間執(zhí)行什么操作。

我們還希望從處理程序中的業(yè)務邏輯中抽象出HTTP請求-響應周期。在這一點上,現(xiàn)有的選擇相當嚴格。對于任何處理程序,您都必須處理請求對象,并在處理程序方法中進行所需的任何數(shù)據(jù)轉(zhuǎn)換,并使用與該代碼的業(yè)務功能沒有直接聯(lián)系的邏輯對其進行污染。

我們想出了愿望清單界面。 Evan想出了一種更具進取性的前瞻性方法來編寫我們的API,這啟發(fā)了我們立即放棄我們考慮過的所有其他方法并全力以赴。這與我們之前看到的API處理程序的任何方式都不同。

使它與眾不同的是,處理程序代碼完全不知道HTTP接口。標頭,編碼,URL參數(shù),所有這些東西都是通過一個類來處理的,該類將請求參數(shù)自動映射到該類中的字段。該類可能包含將請求數(shù)據(jù)轉(zhuǎn)換為處理程序方法可用的數(shù)據(jù)的方法,從而確保處理程序代碼僅包含業(yè)務邏輯。根據(jù)該請求,它可以提取必要的數(shù)據(jù),收集所有依賴關系并準備響應對象。

如果請求引起任何副作用,例如發(fā)送電子郵件,則可以將其隔離到單獨的任務方法中,同時保持該處理程序方法的清潔。使用附加的裝飾器,可以使該task方法自動推遲運行,直到處理程序返回響應為止。通過分離所有此類內(nèi)容,我們使處理程序變得更加易于維護。

框架一旦實現(xiàn),就需要證明它是完整的功能。為此,我們在其中重新實現(xiàn)了超級多毛的500行處理程序。因為如果我們能夠使該野獸在此框架中工作,那么我們將非常有信心它具有將所有API移植到該框架所需的全部功能。在快速完成一半的API(以及笨拙的野獸)之后,整個移植過程大約花費了一年的時間。

雖然最初的項目是作為身份驗證器API和應用程序的一部分創(chuàng)建的(您可以在Apple和Google應用商店中以Salesforce Authenticator的身份看到它),但該框架是如此有用,我們決定將其拆開并使其成為一個單獨的庫。

第一步是將其復制并粘貼到主項目(其自己的頂級目錄)中的干凈模塊中。雜亂無章,但是將這段代碼移到其自己的模塊中暴露了耦合,并向我們展示了我們需要解開哪些類型的結。我們在這個新模塊中重構了所有破壞的依賴關系,然后返回到原始API并對其進行了重構以與新的修補程序一起使用。此時,我們在兩個項目中都有相同的模塊,因此我們可以從原始API中刪除框架代碼。最后一步是使新框架可用于Salesforce中的項目安裝-一個真正的庫,而不僅僅是一個子模塊。

分享您引以為豪的東西

我們一直有野心要開源我們創(chuàng)建的框架。當您創(chuàng)建引以為傲的新穎解決方案時,讓其他人使用和貢獻它只能對整個軟件社區(qū)有所幫助。另外,通過開源,我們可以使用一些一流的工具,例如Travis CI,并且可以更輕松地將這個框架整合到Salesforce的項目中。

但這仍然是我們待辦事項列表中的低優(yōu)先級項目。至少直到Demian Brecht加入該團隊為止。他是我們的開源倡導者,他不僅相信以個人身份參與開源社區(qū),而且相信回饋開源社區(qū)的公司的有形和無形利益。他活躍于Salesforce內(nèi)部和外部的許多開源項目。到目前為止,django-declarative-apis已經(jīng)是一個子模塊,在Salesforce的許多項目中都被大量使用。我們很自然地將其開源。

但是,當我們與團隊中的人們交談時,一個共同的主題是他們喜歡開源軟件,但以前從未對此做出過貢獻,并且對此感到有些害羞。我們希望給他們這種機會,并幫助他們開始以有意義的方式為開源項目做出貢獻。他們會與我們的客戶或休閑愛好者(任何想使用和塑造它的人)一起公開開發(fā)該庫。

這樣,您的團隊可以公開開發(fā)代碼,這將為您帶來巨大的好處;因為任何人都可以看到您的代碼,將其添加到項目中并評論您的拉取請求,所以您有更多的責任來考慮您所做的更改。您會收到有關更周到的更改的更好的提交消息,這使您的開發(fā)過程具有自記錄功能。

工程團隊正在考慮將框架開源,然后我們需要與法律部門合作以實現(xiàn)該框架。對于他們來說,這是一個全新的情況。他們建立了一個矩陣,用于以開源形式啟動一個新項目或在現(xiàn)有的開源項目上工作,但沒有采取從安全相關產(chǎn)品中提取框架并公開發(fā)布代碼的方式。

因為我們正在開拓新的天地,所以我們必須確保我們的i點綴成點,而t的點綴在各處。我們需要仔細檢查所有代碼,以確保沒有任何值得我們放棄的專利。我們讓產(chǎn)品安全人員確保我們不會無意間泄露一些簡單的方法來入侵我們。這是同類項目中的第一個項目,所以花了大約六個月的時間,但是由于我們經(jīng)歷了整個項目并弄清了問題,因此,Salesforce的現(xiàn)有項目的開源采購現(xiàn)在變得更加精簡(而且很平常)。這些天來,我們有一個正式的開源采購流程,該流程有時是即時的,但很少需要4-6周以上的時間!因此,我們現(xiàn)在每年在公司范圍內(nèi)公開采購數(shù)十個項目。

對于我們而言,將其開源是有實際好處的,而與社區(qū)相關或外部無關。內(nèi)在的好處圍繞著我們的部署流程而展開。我們在Heroku上部署了我們的API,這使安裝開源和公共存儲庫中的依賴關系變得容易。作為Salesforce內(nèi)部的一個封閉庫,我們不得不跳很多圈來向項目添加django-declarative-api。箍之一的一個示例是提供依賴關系,即將庫的整個源樹鏡像到依賴項目中,而不是簡單地在配置文件中指定依賴關系和版本。當它變成開源時,突然之間,我們不再需要消耗封閉源代碼依賴項,也沒有其他任何障礙。

除了使我們的工作流程更容易之外,使項目開源還使我們能夠使用某些最佳工具,例如Travis CI。這些工具周圍有龐大的社區(qū),因為它們本身就是開源的。能夠參與這些社區(qū)并為社區(qū)做出貢獻真是太好了。如果開源,意味著我們可以在django-declarative-apis周圍找到一些社區(qū),那就太好了。但是,沒有任何這些都是值得的。

我們?yōu)檫@個圖書館感到驕傲,并很高興能夠與社區(qū)分享。當您在django-declarative-apis中實現(xiàn)具有相當程度的復雜性的新端點時,您會非常感謝它在很大程度上保護了您免于編寫不良代碼。我們接受復雜性作為我們的權衡;但是如果它允許我們在每天實施的處理程序中表達更多的簡單性,我們愿意接受框架中的更多復雜性。

最后,這兩個部分都是學習經(jīng)驗。我們造成了很多技術債務,與嘗試進行零散維修相比,重新開始比以前更能解決問題。我們還發(fā)現(xiàn),Salesforce的同僚很高興地解釋了為何存在法律法規(guī),這很有幫助。開源過程花費了更長的時間。