新聞資訊
您的(de)位置: 首頁 > 新聞資訊 > 軟件開發資訊

軟件開發資訊

暫無信息

軟件開發資訊
關于軟件的(de)10個(gè)常識,你一定要知道!

作者:管理(lǐ)員(yuán)

點擊率:1869

發布時(shí)間:2020-01-07 10:13

  2011年,馬克·安德列森(Marc Andreessen)寫過一篇文章(zhāng),預言“軟件吞噬世界”。觀點主要有兩個(gè):第一,許多(duō)傳統業務正在被軟件公司所取代;第二,所有其他(tā)公司都發現,他(tā)們所提供的(de)價值越來(lái)越多(duō)地來(lái)自軟件系統。

  在安德森撰寫這(zhè)篇文章(zhāng)時(shí),市值最大(dà)的(de)10家公司中,沒有一家是從事軟件驅動業務的(de)。如今,10家最大(dà)的(de)公司中有6家主要由軟件驅動,而其他(tā)4家也(yě)已經準備好了(le)轉型。

  Stack Overflow和(hé)LinkedIn列出非技術公司的(de)軟件工程招聘廣告超過了(le)科技行業本身。這(zhè)是經濟發展中的(de)一個(gè)重大(dà)轉變,表明(míng)公司正在加強他(tā)們的(de)軟件工程實踐。

  會計和(hé)軟件,哪一個(gè)對(duì)公司更重要?本文沒有答(dá)案。但是現在許多(duō)不認爲自己是軟件公司的(de)公司也(yě)開始發現:軟件系統是他(tā)們運營的(de)一個(gè)關鍵組成部分(fēn)。

  如果CEO和(hé)各級管理(lǐ)人(rén)員(yuán)不了(le)解軟件,那麽他(tā)們将是可(kě)有可(kě)無的(de)。這(zhè)要麽會限制他(tā)們的(de)職業發展,要麽會對(duì)公司業績産生負面影(yǐng)響。不管怎樣,不了(le)解軟件都注定要失敗。(據Gartner預測,到2020年,有50%的(de)首席信息官(CIO)将被取代,因爲他(tā)們沒有變革公司的(de)能力。)

軟件常識

  本文列出了(le)管理(lǐ)者應該知道的(de)10個(gè)常識:

  關于軟件,本文認爲這(zhè)是所有管理(lǐ)者都需要知道的(de)10件最重要的(de)事情:

  1. 軟件不是魔術

  軟件不是魔術。雖然它看起來(lái)像魔術,或者是魔法,但它不是魔法。每一個(gè)元素都是由人(rén)設計的(de),都有其數學基礎,或者是可(kě)以用(yòng)人(rén)類語言解釋的(de)過程。

  與魔術不同,軟件不是憑空變出來(lái)的(de)。它需要設計、構建和(hé)維護。就像房(fáng)子有多(duō)種系統一起工作(地基、結構、管道、房(fáng)間、家具等等)那樣,軟件系統也(yě)需要許多(duō)層和(hé)子系統來(lái)創建整個(gè)系統。它可(kě)以設計得(de)很好,也(yě)可(kě)以設計得(de)很差,而且快(kuài)速的(de)設計很少能持久。

  如果人(rén)們不能用(yòng)語言來(lái)描述它會做(zuò)什(shén)麽(包括想要的(de)結果和(hé)如何實現),那麽計算(suàn)機也(yě)無法做(zuò)到。“how”被稱爲算(suàn)法,這(zhè)并不神奇。

  機器學習(xí)和(hé)其他(tā)人(rén)工智能技術也(yě)并不神奇。機器學習(xí)是基于數據的(de)預測,而不是顯式的(de)規則或指令。它一般是用(yòng)線性代數來(lái)做(zuò)的(de)。如果有100萬張已知的(de)香蕉照(zhào)片和(hé)100萬張沒有香蕉的(de)照(zhào)片,一個(gè)訓練有素的(de)機器學習(xí)系統看一張新照(zhào)片,會根據它從之前的(de)照(zhào)片中學到的(de)知識告訴你它看起來(lái)像第一組還(hái)是第二組,這(zhè)不是魔術。使用(yòng)機器學習(xí)根據過去的(de)招聘決定對(duì)簡曆進行排序,即使沒有任何故意的(de)偏見,也(yě)可(kě)能會放大(dà)經驗主義的(de)招聘曆史。

  2. 軟件永遠(yuǎn)不會“完成”

  軟件永遠(yuǎn)不會“完成”,軟件是一個(gè)叠代的(de)過程,在其生命周期中包含許多(duō)修訂和(hé)更新。我們的(de)工作是創造一個(gè)能認識到這(zhè)一點的(de)環境。

  同樣,我們從來(lái)沒有期望市場(chǎng)營銷和(hé)客戶獲取是“完成的(de)”,它們也(yě)是叠代過程。在每個(gè)叠代中,随著(zhe)我們不斷地爲業務交付價值,我們也(yě)不斷地學習(xí)和(hé)成長(cháng)。即使已經做(zuò)了(le)一些成功的(de)發布,我們從來(lái)沒有打算(suàn)“停止”做(zuò)這(zhè)些事情。

  如果軟件可(kě)以在一個(gè)版本中完成就好了(le),但這(zhè)不是現實。需求文檔充滿了(le)模糊性,軟件的(de)第一個(gè)版本充滿了(le)“哦,那是我寫的(de),但不是我的(de)意思”的(de)場(chǎng)景。最好的(de)軟件能激發新的(de)想法和(hé)功能需求,看到新的(de)銷售管理(lǐ)系統更加高(gāo)效,就會激發出更高(gāo)的(de)效率。世界在變化(huà),競争對(duì)手提供了(le)新的(de)功能,人(rén)們就有了(le)新的(de)想法。另外,總是有一些bug需要修複:可(kě)能是在代碼中,也(yě)可(kě)能是在構建代碼的(de)底層軟件框架和(hé)系統中。某些軟件可(kě)能是完美(měi)的(de),但可(kě)以确信的(de)是,随著(zhe)時(shí)間的(de)推移,人(rén)們會發現它所構建的(de)平台存在各種漏洞。

  我們的(de)工作就是讓一個(gè)組織能夠認識到這(zhè)一點。

  認識到這(zhè)一點的(de)方法是建立一個(gè)有信心定期發布新版本的(de)組織。當完全自動化(huà)測試和(hé)其他(tā)工程規範就位時(shí),我們就建立了(le)信心。這(zhè)種信心創造了(le)一種能力,可(kě)以避免過長(cháng)的(de)發布周期,而是每季度、每月(yuè)甚至每周發布高(gāo)質量的(de)軟件。特定的(de)頻(pín)率并不重要,但是信心很重要,自信能夠帶來(lái)更快(kuài)的(de)創新。

  3.軟件開發是團隊作戰,沒有人(rén)能做(zuò)所有事情

  軟件開發是團隊作戰,開發人(rén)員(yuán)既不是産品經理(lǐ),也(yě)不是UX(用(yòng)戶體驗)設計師,也(yě)不是質量工程師、分(fēn)析師、安全專家、技術作家或運營工程師。組織需要所有角色。

  沒有哪個(gè)管理(lǐ)者會建議(yì)每個(gè)銷售(sale)人(rén)員(yuán)都做(zuò)營銷(marketing)及PR,否則就解雇銷售團隊(因爲營銷人(rén)員(yuán)了(le)解産品,也(yě)能做(zuò)銷售)。營銷和(hé)銷售是相關的(de),但又是不同的(de)。因此,兩者之間存在著(zhe)分(fēn)工。

  同樣,開發團隊需要獨立的(de)人(rén)員(yuán)來(lái)收集需求、質量保證和(hé)測試、代碼編寫等等。

  一個(gè)開發人(rén)員(yuán)可(kě)以“做(zuò)所有事情”的(de)神話(huà),稱爲“全棧開發人(rén)員(yuán)”或“10x工程師”,這(zhè)一般隻存在于小公司。是的(de),一個(gè)非常小的(de)公司可(kě)能一個(gè)人(rén)同時(shí)做(zuò)營銷和(hé)銷售,但你可(kě)能不會加入這(zhè)樣的(de)小公司。

  不要用(yòng)自己的(de)興趣去挑戰别人(rén)吃(chī)飯的(de)專業。一個(gè)小孩“擅長(cháng)Facebook”并不意味著(zhe)他(tā)或她會成爲下(xià)一個(gè)紮克伯格;一個(gè)小孩對(duì)工程學很感興趣并不意味著(zhe)他(tā)或她可(kě)以能夠使用(yòng)微積分(fēn);一個(gè)小孩能夠自己做(zuò)了(le)一個(gè)網站并不意味著(zhe)這(zhè)個(gè)網站每小時(shí)可(kě)以處理(lǐ)數十億的(de)金融交易。

  4. 設計不是外觀,而是工作原理(lǐ)

  史蒂夫·喬布斯有句名言:”設計不隻是外表和(hé)感覺。設計就是工作原理(lǐ)。“ UX設計師不會坐(zuò)下(xià)來(lái)決定菜單的(de)顔色,或者決定按鈕是圓形還(hái)是方形,他(tā)們決定工作流和(hé)交互是什(shén)麽。

  用(yòng)戶會看到一個(gè)有三個(gè)選項的(de)屏幕,還(hái)是一個(gè)屏幕隻顯示一個(gè)選項?這(zhè)個(gè)設計決定需要心理(lǐ)學、對(duì)用(yòng)戶的(de)同理(lǐ)心,以及測試、測試、再測試。

  UX設計的(de)最大(dà)挑戰之一是,一旦你熟悉了(le)系統,就失去了(le)預測新用(yòng)戶的(de)能力。設計該系統的(de)人(rén)在預測新用(yòng)戶的(de)需求時(shí)将自動被取消資格。UX可(kě)能很漂亮、優雅,可(kě)以與一件藝術品相媲美(měi),但是請UX設計師将背景更改爲帆船的(de)圖片是沒有幫助的(de)。

  我們的(de)工作是信任測試數據而不是主觀臆測,創建一個(gè)環境,在産品發布之前計劃進行多(duō)次修訂,并期望在産品發布之後進行進一步的(de)改進。不要将UX設計人(rén)員(yuán)與圖形設計人(rén)員(yuán)混淆。讓UX計師設計公司節日賀卡和(hé)讓技術作家寫公司通(tōng)訊是一樣的(de)失禮行爲,這(zhè)些是不同的(de)技能。

  5. 安全是每個(gè)人(rén)的(de)責任

  不管知不知道,無論願不願意,我們都是從事安全行業的(de)。所有軟件都有安全需求和(hé)潛在的(de)安全漏洞。開發軟件所涉及的(de)系統也(yě)有安全需求和(hé)漏洞。雖然防火牆和(hé)入侵檢測等安全的(de)基礎設施組件是必要的(de),但它們還(hái)不夠:還(hái)必須使用(yòng)内置的(de)安全控制來(lái)設計、實現和(hé)維護軟件平台。安全既是好的(de)技術,也(yě)是好的(de)流程。

  如果認爲我們不是被攻擊的(de)目标,那就錯了(le)。所有的(de)計算(suàn)機系統都是被攻擊的(de)目标,因爲攻擊不僅是爲了(le)其中的(de)信息,而僅僅是它是一台計算(suàn)機這(zhè)樣的(de)一個(gè)事實。例如,一個(gè)沒有價值信息的(de)系統是網絡攻擊目标,因爲它可(kě)以被用(yòng)來(lái)轉發對(duì)其他(tā)計算(suàn)機的(de)攻擊,或挖掘比特币,或存儲他(tā)人(rén)的(de)盜版視頻(pín)。

  安全不是打開/關閉這(zhè)樣按鈕,有許多(duō)灰色地帶。安全性最好從一開始考慮。事後的(de)亡羊補牢是昂貴的(de),而且往往是無效的(de)。我們不會先造一艘船,然後再“添加”一種讓它漂浮的(de)功能。同樣,也(yě)無法先構建一個(gè)系統,然後按下(xià)“具有安全性”按鈕就安全了(le)。

  安全是關于風險和(hé)對(duì)風險的(de)容忍度。對(duì)兩個(gè)節點之間的(de)通(tōng)信進行加密并不能保證它的(de)安全性,但它提高(gāo)了(le)安全性,隻有超級算(suàn)力才有可(kě)能破解密碼。在一個(gè)領域降低風險對(duì)其他(tā)領域沒有幫助。保護網絡并不能防止物(wù)理(lǐ)安全問題。一個(gè)人(rén)撐開一扇門,其他(tā)人(rén)就能偷走你的(de)備份磁帶。

  正如吉恩·斯帕福德(Gene Spafford)的(de)一句名言:”唯一真正安全的(de)系統,是一個(gè)關了(le)電、澆鑄在混凝土裏、由全副武裝的(de)警衛把守在絕緣房(fáng)間裏的(de)系統——即便如此,我還(hái)是心存疑慮。“

  遵守NIST CSF(國家标準與技術網絡安全框架學會)、PCI DSS(支付卡行業數據安全标準)和(hé)SOC 2(服務組織控制報告)等安全标準可(kě)以量化(huà)風險,如果做(zuò)得(de)合适,還(hái)可(kě)以降低風險。這(zhè)些标準并不能保證絕對(duì)安全,絕對(duì)安全是不存在的(de)。更重要的(de)是,它們爲如何負責任地應對(duì)和(hé)報告不可(kě)避免的(de)安全漏洞提供了(le)指導。誠實、直率、公開是良好的(de)建議(yì)。

  軟件,如果不管它,就像面包一樣變得(de)陳舊(jiù)。我們的(de)工作是平衡安全妄想與現實,并适當預算(suàn)時(shí)間和(hé)資源。

  6. feature大(dà)小并不能預測開發時(shí)間

  feature大(dà)小(用(yòng)戶感知到的(de))與創建feature所需的(de)時(shí)間完全無關。小feature可(kě)能需要幾天或幾年的(de)時(shí)間,大(dà)feature(用(yòng)戶感知到的(de))也(yě)可(kě)能需要幾天或幾年的(de)時(shí)間。

  我們的(de)工作是創建并支持一個(gè)軟件開發過程,該過程接受這(zhè)個(gè)事實,并且不是拍(pāi)腦(nǎo)袋評估工程量。工作量評估本身可(kě)能需要令人(rén)驚訝的(de)很長(cháng)時(shí)間。

  鼓勵通(tōng)過溝通(tōng)來(lái)解決工作量評估的(de)問題。工程師可(kě)能會給出一個(gè)令人(rén)驚訝的(de)很長(cháng)時(shí)間的(de)工作估算(suàn),但是也(yě)會提出對(duì)需求進行更改,從而大(dà)大(dà)縮短時(shí)間。記住工作量評估要包括測試、培訓、部署和(hé)意外的(de)假期(例如病假)。

  在沒有與工程部門協商工作量的(de)情況下(xià),永遠(yuǎn)不要承諾某個(gè)feature。這(zhè)并不是我們在公司的(de)權力标志,這(zhè)需要的(de)是一個(gè)專業流程,在這(zhè)個(gè)流程中,開發人(rén)員(yuán)的(de)請求得(de)到認真對(duì)待,評估工作量,并按時(shí)交付(或出于誠實的(de)原因延期)。

  7. 偉大(dà)來(lái)自于成千上萬的(de)小進步

  偉大(dà)來(lái)自于在很長(cháng)一段時(shí)間内所做(zuò)的(de)成千上萬,也(yě)許是數百萬的(de)小進步(變更)。如果變更的(de)效果都被測量是負面的(de),那麽變更将被回滾。

  谷歌(gē)也(yě)不是一天建成的(de)。谷歌(gē)的(de)搜索引擎是數百萬個(gè)人(rén)改進的(de)結果。搜索質量小組每周開會一次,工程師們走上講台,提出他(tā)們的(de)修改建議(yì)。他(tā)們展示了(le)在模拟的(de)環境中會有多(duō)大(dà)的(de)改進,委員(yuán)會進行辯論并投票(piào)表決。幾周後,将對(duì)測量結果進行評審,并決定保留或回滾更改。

  谷歌(gē)搜索是叠代開發戰勝“數據大(dà)爆炸”思維的(de)勝利。誰都不可(kě)能在一開始做(zuò)出一個(gè)好的(de)搜索引擎。隻有在好萊塢電影(yǐng)中,一個(gè)聰明(míng)的(de)極客才會想出一個(gè)驚人(rén)的(de)新點子,并且第一次就能完美(měi)地實現它。在現實世界中,一夜成名需要數年的(de)時(shí)間。

  無論試圖實現的(de)目标是一個(gè)爲客戶提供更好服務的(de)系統,還(hái)是一個(gè)更高(gāo)效、錯誤更少的(de)系統,還(hái)是一個(gè)運行更順暢的(de)系統,都是如此。

  我們的(de)工作是要求系統的(de)設計能夠容易擁抱新的(de)變化(huà),并定義相關的(de)KPI(關鍵性能指标),這(zhè)些KPI可(kě)以在更改之前和(hé)之後方便地進行度量。最重要的(de)是,必須有一個(gè)流程來(lái)檢查結果,并決定保留或回滾變更。回滾不應被視爲失敗或受到懲罰。從每次回滾中學到的(de)與在每次保留的(de)更改中學到的(de)一樣有價值。

  托馬斯·愛(ài)迪生聲稱在發明(míng)燈泡的(de)過程中測試了(le)1000根燈絲。當一位記者問他(tā):”失敗1000次是什(shén)麽感受?“他(tā)回答(dá)說:”我沒有失敗1000次。燈泡是一項有1000個(gè)步驟的(de)發明(míng)。”

  8. 技術債很討(tǎo)厭,但不可(kě)避免

  技術債務是将來(lái)需要做(zuò)的(de)工作,因爲我們現在選擇了(le)一個(gè)更簡單的(de)解決方案,而不是使用(yòng)一個(gè)需要更長(cháng)時(shí)間的(de)更好解決方案。任何合理(lǐ)規模的(de)軟件項目都有技術債務。技術債務讓所有的(de)進步都變得(de)更慢(màn),越忽視它,它就越像滾雪(xuě)球一樣越滾越大(dà)。

  有金融背景的(de)管理(lǐ)者聽(tīng)到“債務”時(shí),會認爲這(zhè)是一種未來(lái)會有回報的(de)投資。技術債務恰恰相反,它是有毒和(hé)痛苦的(de),并且是一個(gè)定時(shí)炸彈。

  1972年,Fram爲它的(de)濾油器做(zuò)了(le)一個(gè)電視廣告,在廣告中,一位汽車機械師解釋說,一位顧客爲了(le)節省4美(měi)元而不更換濾油器,後來(lái),這(zhè)位顧客不得(de)不花200美(měi)元更換一個(gè)昂貴的(de)主軸承。汽車機械師總結說:“你可(kě)以現在付給我錢,也(yě)可(kě)以以後付。”

  有一個(gè)軟件項目,其中有一個(gè)子系統與供應商通(tōng)信。最初系統隻與一個(gè)供應商通(tōng)信,所以非常簡單。然後又接了(le)一個(gè),然後另一個(gè)。有些功能必須實現三次,每個(gè)供應商一次,這(zhè)是不可(kě)持續的(de)。當要求支持第四個(gè)供應商時(shí),開發人(rén)員(yuán)表示反對(duì)。是的(de),他(tā)們可(kě)以在大(dà)約一個(gè)月(yuè)的(de)時(shí)間裏把它移植上去,但是軟件架構開始吱吱作響,就像飓風中的(de)老房(fáng)子一樣。這(zhè)些權宜之計積累了(le)大(dà)量的(de)技術債務。

  開發人(rén)員(yuán)的(de)建議(yì)是花兩個(gè)月(yuè)的(de)時(shí)間重構供應商架構,使其成爲一個(gè)插件系統。然後,新的(de)供應商可(kě)以在一周内而不是一個(gè)月(yuè)内支持接入。

  管理(lǐ)者們并不高(gāo)興。爲什(shén)麽下(xià)一個(gè)供應商需要兩個(gè)多(duō)月(yuè)的(de)時(shí)間來(lái)支持,而之前的(de)供應商是在一個(gè)月(yuè)内支持的(de)呢(ne)?花兩個(gè)月(yuè)的(de)時(shí)間來(lái)償還(hái)技術債務将使未來(lái)的(de)支持更快(kuài),代碼更穩定,并使添加新feature更容易。很難衡量确切的(de)好處。

  “你可(kě)以現在付給我,也(yě)可(kě)以以後再付給我"。

  我們的(de)工作是分(fēn)期償還(hái)技術債務。失控的(de)技術債務降低了(le)添加其他(tā)feature的(de)能力,并導緻軟件系統不穩定。償還(hái)技術債務應該與業務目标挂鈎,類似于非功能需求。

  9. 軟件不會自己運行(軟件需要運維)

  雖然供應商和(hé)開發人(rén)員(yuán)可(kě)能會試圖告訴你不同的(de)情況,但是軟件并不會自己運行。任何基于軟件的(de)系統(特别是網站和(hé)web應用(yòng)程序)都需要運維人(rén)員(yuán)和(hé)運維流程。否則,軟件就像一本合上的(de)書(shū),必須有人(rén)打開它,管理(lǐ)它,以及照(zhào)顧它的(de)需求。

  運維比軟件開發本身更重要。代碼隻寫一次,但運行可(kě)能會是數百萬次。因此,粗略地衡量一下(xià),運維的(de)重要性是否要高(gāo)出幾百萬倍呢(ne)?

  我們的(de)工作就是期望運維成爲任何軟件系統的(de)一部分(fēn)。它必須像其他(tā)任何項目一樣被計劃、預算(suàn)、管理(lǐ)和(hé)有效地運行。

  運維功能(通(tōng)常稱爲非功能需求)對(duì)用(yòng)戶是不可(kě)見的(de),除非作爲二級需求。數據備份是非功能需求中一個(gè)很好的(de)例子。沒有用(yòng)戶請求數據備份,但是,用(yòng)戶确實要求恢複已删除的(de)數據。遺憾的(de)是,沒有備份就沒有恢複。恢複是功能需求,備份是一種運維(非功能)需求。

  讓軟件服務易于維護或高(gāo)效運行的(de)功能需求從來(lái)不會被用(yòng)戶提出來(lái)。然而,他(tā)們确實享受著(zhe)一個(gè)低成本、高(gāo)可(kě)靠的(de)系統所帶來(lái)的(de)好處。客戶會離開那些不靠譜的(de)網站,再也(yě)不會回來(lái)。

  持續改進的(de)需求不僅包括新功能需求,還(hái)應該包括新的(de)非功能性需求。因此,我們的(de)工作不僅是爲客戶提出的(de)功能需求分(fēn)配資源,還(hái)要爲運維需求分(fēn)配資源。在兩種相互競争的(de)需求之間取得(de)平衡是困難的(de)。

  但是,一個(gè)成功的(de)産品是業務需求和(hé)運維