初創(chuàng)企業(yè)可以做六件事以避免技術(shù)債務(wù)
想象一下這樣的情景:“大約400萬行PHP代碼,由報酬過低、有時并不是善意的自由職業(yè)者和學(xué)生在8年的時間里編寫而成。雖然初創(chuàng)企業(yè)的首席執(zhí)行官編寫了大部分代碼,但在2004年為了學(xué)習(xí)新技術(shù)而中斷。”
這就是一家初創(chuàng)企業(yè)當(dāng)初為了走捷徑而到最后不得不重新編寫代碼的情況,其面臨的技術(shù)債務(wù)達(dá)到難以承受的程度。
但是,如果你在初創(chuàng)企業(yè)擔(dān)任技術(shù)職務(wù),就會知道避免技術(shù)債務(wù)并不像聽起來那么容易。
初創(chuàng)企業(yè)通常有很多發(fā)展里程碑需要在很短的時間內(nèi)完成。在人員和預(yù)算有限的情況下,初創(chuàng)企業(yè)為了開發(fā)最小可行產(chǎn)品有時需要走捷徑,雖然他們知道將來必須進(jìn)行一些重構(gòu)。
但適度實施很重要。當(dāng)初創(chuàng)企業(yè)背負(fù)技術(shù)債務(wù)時,就像爬山一樣,必須先爬過這座山才能繼續(xù)前進(jìn),初創(chuàng)企業(yè)只有先背負(fù)一些技術(shù)債務(wù)然后才能擴大規(guī)模。企業(yè)現(xiàn)在節(jié)省的工程時間都必須得到償還,通常還要償還利息。許多從事過嚴(yán)重技術(shù)債務(wù)項目的開發(fā)人員都有這樣的故事:曾在幾個龐大而雜亂的代碼庫中工作過,在那里進(jìn)行了一次重大重構(gòu),花費的時間比預(yù)期的要長,然后在完成之前將資源轉(zhuǎn)移其他項目上。其最終結(jié)果是構(gòu)建了一個更大、更混亂、更難理解的代碼庫!
換句話說,當(dāng)技術(shù)債務(wù)變得過重時,即使有很多資源可以解決這個問題,修復(fù)它也會變得非常棘手。對于初創(chuàng)企業(yè)來說,最好的方法是避免承擔(dān)任何不必要的技術(shù)債務(wù),所以需要了解一下初創(chuàng)企業(yè)可以做的六件事,以盡量減少或消除在擴大之前必須償還的技術(shù)債務(wù)。
1、不要承擔(dān)不需要的債務(wù)
這個建議聽起來很簡單,但真正實施可能具有挑戰(zhàn)性。初創(chuàng)企業(yè)需要承擔(dān)什么債務(wù)并不總是很明顯。一家初創(chuàng)企業(yè)在早期幾乎總是需要做出一些妥協(xié),但隨著工具和技術(shù)的變化和發(fā)展,可能很難弄清楚真正需要做出哪些妥協(xié)。
例如創(chuàng)建事務(wù)數(shù)據(jù)庫。一家初創(chuàng)企業(yè)在幾年前不得不做出一個艱難的決定,而且不可避免地涉及妥協(xié):是否選擇能夠快速輕松地擴展并處理潛在的一致性問題但成本更高的NoSQL數(shù)據(jù)庫?或者選擇像PostgreSQL這樣可靠、簡單且免費的開發(fā)人員現(xiàn)在可以使用的東西,但將來可能難以擴展?
這些都不是理想的選擇,采用NoSQL方法可能會帶來一系列令人不快的后續(xù)問題。但采用Postgres方法也承擔(dān)了一種技術(shù)債務(wù),因為以后必須人工擴展。正如初創(chuàng)教育機構(gòu)Kami公司在新冠疫情期間所面臨的那樣,擴展Postgres可能會很痛苦。該公司的一位代表表示,“我們知道留在Postgres并設(shè)置分片會有多復(fù)雜,管理多個數(shù)據(jù)分片會有一個持續(xù)的阻力。我們團隊中沒有人愿意完成這種工具,使我們設(shè)置了分片,也無法將業(yè)務(wù)增長10倍。”
不過,如今只需選擇正確的堆棧,就可以避免承擔(dān)大量技術(shù)債務(wù)——盡管什么構(gòu)成“正確”在很大程度上取決于企業(yè)正在構(gòu)建的內(nèi)容以及已經(jīng)熟悉的內(nèi)容。然而,在任何一種情況下,初創(chuàng)企業(yè)都必須妥協(xié)進(jìn)行選擇。
當(dāng)然,事務(wù)數(shù)據(jù)庫只是技術(shù)堆棧的一部分,但現(xiàn)在幾乎每一層都存在類似的解決方案。例如,應(yīng)用程序的業(yè)務(wù)邏輯可以遷移到基于云計算的無服務(wù)器服務(wù),例如AWS Lambda、Google Cloud Functions或Azure Serverless Functions,從而實現(xiàn)幾乎無限的可擴展性,而無需在前期投入大量的時間或費用。
因此,對于初創(chuàng)企業(yè)來說,了解他們的選擇至關(guān)重要。由于有了新工具,像Kami這樣的公司被迫做出的妥協(xié)現(xiàn)在可能完全避免。特別是,無服務(wù)器產(chǎn)品在整個堆棧中的激增使初創(chuàng)企業(yè)有可能擴展規(guī)模。這反過來又使他們能夠避免使用難以擴展的技術(shù)而承擔(dān)的技術(shù)債務(wù),只是因為它們是獲得最小可行產(chǎn)品的最便宜和最快的方式。
初創(chuàng)企業(yè)團隊現(xiàn)在可以使用無服務(wù)器選項進(jìn)行構(gòu)建,這些選項既免費又容易獲得最小可行產(chǎn)品,同時還提供云原生自動化規(guī)模,以保持成本最小化和應(yīng)用程序性能一致,無論應(yīng)用程序是處理360個并發(fā)用戶還是36萬個并發(fā)用戶。
因此,初創(chuàng)企業(yè)在早期階段避免技術(shù)債務(wù),有時是一種讓其時刻保持警惕并了解所有選擇的功能。不到一年前,還沒有免費的、無服務(wù)器分布式SQL數(shù)據(jù)庫的選擇,而現(xiàn)在已經(jīng)有了。了解這些選項可以幫助企業(yè)避免承擔(dān)技術(shù)債務(wù),并避免妥協(xié)。
2、盡量減少運維工作
在初創(chuàng)企業(yè)發(fā)展的早期階段,開發(fā)人員身兼多職是很常見的。例如,初創(chuàng)企業(yè)的開發(fā)人員通常會在運營方面擔(dān)負(fù)雙重職責(zé),直到公司規(guī)模大到能夠雇傭?qū)iT的IT運營人員。
但啟動開發(fā)時間表往往很短,企業(yè)的發(fā)展路線圖上有很多功能,而且需要快速周轉(zhuǎn)。開發(fā)人員花在運維工作上的時間其實都是應(yīng)該花費在構(gòu)建應(yīng)用程序上的時間,而且他們構(gòu)建的時間越少,可能不得不削減一些功能以在最后期限交付。而每一次偷工減料都是一小部分技術(shù)債務(wù)。
出于這個原因,選擇托管服務(wù)有時可能是一種最經(jīng)濟的選擇,即使這意味著要承擔(dān)更高的前期成本。初創(chuàng)企業(yè)可能并不愿意通過托管來節(jié)省成本,因為必須自己開發(fā),但重要的是要考慮讓開發(fā)人員了解和管理運營相關(guān)的成本。
這一成本超出了開發(fā)人員在開展運維工作時浪費的開發(fā)時間。選擇托管服務(wù)將運維工作交到第三方專業(yè)人士手中,他們通常會提供優(yōu)先的技術(shù)支持以促進(jìn)集成,這可能意味著更順暢的集成過程、更好的應(yīng)用程序性能以及在出現(xiàn)運維問題時更快地解決。
3、靈活性
當(dāng)初創(chuàng)企業(yè)做出設(shè)計選擇或選擇以后難以改變的服務(wù)時,可能會在不知情的情況下承擔(dān)技術(shù)債務(wù)。
雖然有很多這樣的例子,但最常見的例子之一是初創(chuàng)企業(yè)鎖定在單個云平臺的生態(tài)系統(tǒng)中。在一開始這樣做通常有令人信服的理由,因為當(dāng)將AWS Lambda功能連接到其他AWS云服務(wù)(如Aurora、ElastiCache或Redshift)時,可以利用其提供的功能。
但從長遠(yuǎn)來看,如果谷歌云平臺或微軟Azure成為更實惠的選擇呢?或者,如果意識到為用戶提供最可靠的服務(wù)將需要使用多云怎么辦?突然之間,一筆巨大的技術(shù)債務(wù)到期,初創(chuàng)企業(yè)的團隊將不得不弄清楚如何處理,例如將其僅限AWS云平臺的數(shù)據(jù)庫遷移到可以支持AWS和谷歌云平臺的數(shù)據(jù)庫,從而避免引發(fā)一系列其他問題。
只要有可能,選擇設(shè)計和工具以保持靈活性是值得的。有時這需要權(quán)衡利弊,但在其他時候,只需選擇不同的工具即可獲得相同的性能和更高的靈活性。因此,即使選擇的功能仍然在AWS云平臺上構(gòu)建和部署,擁有一個與云計算無關(guān)的數(shù)據(jù)庫也可以靈活地切換到另一個云平臺或在未來采用多云,而無需更改數(shù)據(jù)庫。
4、不要解決已經(jīng)解決的問題
作為工程師,不要嘗試解決別人已經(jīng)解決的問題。雖然不斷改進(jìn)的動力是許多技術(shù)創(chuàng)新背后的動力,但創(chuàng)業(yè)公司要想獲得成功,就必須與實踐相結(jié)合。雖然定制解決方案可能是完美的,但也有可用的第三方解決方案,可以在不花費開發(fā)人員時間的情況下提供99%的功能。
例如,Starburst公司提供的一個數(shù)據(jù)分析引擎為客戶的數(shù)據(jù)提供一個單一并且快速的訪問點。為了確保為客戶提供更好的性能,Starburst公司需要構(gòu)建一個多區(qū)域關(guān)系數(shù)據(jù)庫。該公司當(dāng)然可以嘗試構(gòu)建一個定制的解決方案。但正如Starburst公司工程副總裁Ken Pickering所說:“當(dāng)一個工程團隊已經(jīng)建立了一個可靠的解決方案時,我為什么要讓工程團隊嘗試解決多區(qū)域問題?我們需要對第三方技術(shù)解決方案做出明智的選擇。因為我們需要為客戶的數(shù)據(jù)負(fù)責(zé)?!?/p>
對于大多數(shù)初創(chuàng)企業(yè)來說也是如此,即使還沒有為客戶要求所困擾,也需要做出明智的選擇來保護(hù)其開發(fā)人員的時間。
為了快速發(fā)展和成長,初創(chuàng)企業(yè)需要專注于解決他們的團隊需要解決的核心問題。如果開發(fā)人員偏離正軌,轉(zhuǎn)而構(gòu)建定制解決方案,那么他們的時間將非常緊迫,以至于他們在開發(fā)產(chǎn)品的核心功能時不得不偷工減料。那么這就成為企業(yè)最終必須償還的技術(shù)債務(wù)。
5、盡早建立編碼最佳實踐
雖然人們關(guān)注的是使用為技術(shù)堆棧選擇的解決方案來避免技術(shù)債務(wù)的更宏觀的方法,但很多技術(shù)都可以追溯到草率編寫代碼,這通常是因為時間匆忙。
如果企業(yè)的目標(biāo)是為避免技術(shù)債務(wù),那么重要的是確保從第一天開始就實施并遵循編碼最佳實踐,但這應(yīng)該包括可重復(fù)的、形式化的系統(tǒng)。雖然開發(fā)人員都知道這一點,但當(dāng)初創(chuàng)企業(yè)的開發(fā)團隊只有幾個人(甚至只有一個人)時,這些都是很難做到的。當(dāng)交付截止日期快到的時候,很容易決定不需要評測或記錄代碼,但是每次跳過類似的步驟時,都會增加技術(shù)債務(wù),而這些技術(shù)債務(wù)總有一天要償還。
當(dāng)然,開發(fā)人員是否有時間遵循所有這些最佳實踐并不總是掌握在他們手中。在通常情況下,開發(fā)時間表是從自上而下傳遞。
6、立足當(dāng)下,展望未來
避免技術(shù)債務(wù)的真正關(guān)鍵是善于平衡當(dāng)前的需求和未來的目標(biāo)。實際上,這樣做具有挑戰(zhàn)性,需要將以上討論過的所有內(nèi)容結(jié)合起來,并將這些知識帶到關(guān)于企業(yè)目標(biāo)和時間表的更廣泛的討論中。
例如,如果初創(chuàng)企業(yè)的首席執(zhí)行官設(shè)定了開發(fā)期限,如果不承擔(dān)某種形式的技術(shù)債務(wù),就很難達(dá)到這一目標(biāo),那么技術(shù)人員需要能夠確定并傳達(dá)這些權(quán)衡,以便將其納入預(yù)算和規(guī)劃中。如果首席執(zhí)行官希望在本季度發(fā)布兩個主要功能,那么很可能只能發(fā)布一個功能,因為下個季度將會處理技術(shù)債務(wù),可能花費大量時間和精力處理客戶支持問題和重構(gòu)有缺陷的代碼。
在平衡有限的時間、技能和預(yù)算的同時嘗試優(yōu)化以獲得最佳結(jié)果是一項真正的挑戰(zhàn)。但是建立一家初創(chuàng)企業(yè)并不容易,也不可能完全避免技術(shù)債務(wù),尤其是在創(chuàng)業(yè)初期。但是,如果可以在堆棧中做出正確的選擇,并構(gòu)建良好的內(nèi)部護(hù)欄,以避免走捷徑或解決不需要解決的問題,那么初創(chuàng)企業(yè)可以確信自己走上了正確的道路。