作者 | 核子可樂(lè)、褚杏娟
近日,十多年從事開(kāi)發(fā)工作的 Facundo Olano 寫(xiě)了一篇關(guān)于“軟件開(kāi)發(fā)應(yīng)該優(yōu)先服務(wù)誰(shuí)”的文章,引發(fā)了廣發(fā)開(kāi)發(fā)者討論。Facundo 在文章中提出,業(yè)務(wù)和用戶(hù)的優(yōu)先級(jí)永遠(yuǎn)大于維護(hù)者,維護(hù)者大于開(kāi)發(fā)者,但對(duì)于業(yè)務(wù)和用戶(hù)的優(yōu)先級(jí),則無(wú)法確定。
對(duì)此,有開(kāi)發(fā)者提出,開(kāi)發(fā)人員其實(shí)必須滿(mǎn)足的是中層管理人員的需求,而不是實(shí)際用戶(hù)的需求,否則就拿不到訂單。那么,在這個(gè)研發(fā)生態(tài)里,開(kāi)發(fā)者明顯處于底層,那誰(shuí)才處于“食物鏈的頂端”?
“代碼的閱讀次數(shù)大于編寫(xiě)次數(shù)?!毕嘈藕芏喑绦騿T朋友都聽(tīng)過(guò)這句話(huà),它提醒我們作為代碼開(kāi)發(fā)者,絕不應(yīng)犧牲未來(lái)的閱讀和修改空間來(lái)?yè)Q取一己之便利。換句話(huà)說(shuō),代碼的閱讀量要多于編寫(xiě)量,所以最好想辦法保證代碼簡(jiǎn)潔明了,同時(shí)輔以測(cè)試和說(shuō)明文檔等有助于提高可維護(hù)性的要素。
我個(gè)人則將其總結(jié)為更簡(jiǎn)潔的表達(dá)方式:
維護(hù)者>作者
其實(shí)在代碼編寫(xiě)之外,這樣一條經(jīng)驗(yàn)法則也同樣適用于發(fā)現(xiàn)問(wèn)題和做出決策。
代碼是用來(lái)跑的,不是用來(lái)讀的
代碼只是我們達(dá)成目的的手段。軟件都有自己的目的,負(fù)責(zé)為特定用戶(hù)提供服務(wù)。如果代碼無(wú)法達(dá)成這項(xiàng)目的、為用戶(hù)提供良好的體驗(yàn),那么無(wú)論代碼本身質(zhì)量多高、可維護(hù)性多棒、涉及的技術(shù)有多么精妙,都將毫無(wú)意義。因此:
用戶(hù)>維護(hù)者>作者
或者說(shuō),我們把開(kāi)發(fā)者部分統(tǒng)一起來(lái),就得到了:
用戶(hù)>開(kāi)發(fā)者
正因?yàn)槿绱?,我們才?yīng)該盡早、盡快把程序交付給用戶(hù),再結(jié)合他們的反饋不斷做出優(yōu)化,而不是在事前做一大堆假設(shè)、或者反復(fù)詢(xún)問(wèn)他們到底想要什么。
這是一套強(qiáng)有力的思維模型,只要在開(kāi)發(fā)過(guò)程中始終以用戶(hù)為中心,我們就能走得更遠(yuǎn)、更穩(wěn)。這也是我自己在漫長(zhǎng)的職業(yè)生涯中,總結(jié)出的最具指導(dǎo)意義的開(kāi)發(fā)方針。
代碼的運(yùn)行次數(shù)大于閱讀次數(shù)
當(dāng)我說(shuō)到“運(yùn)行”時(shí),指的可不只是執(zhí)行程序,更包括生產(chǎn)運(yùn)營(yíng)中的各個(gè)環(huán)節(jié):部署、升級(jí)、觀察、審計(jì)、監(jiān)控、修復(fù)、清退等。正如 Dan McKinley 所言:
“總的來(lái)說(shuō),保持系統(tǒng)長(zhǎng)期可靠運(yùn)行的成本,要遠(yuǎn)遠(yuǎn)優(yōu)先于構(gòu)建系統(tǒng)時(shí)遇到的種種不便?!?/span>
我們也可以把這個(gè)結(jié)論納入前文提到的小模型:
用戶(hù) > 運(yùn)維者 > 開(kāi)發(fā)者
我本人花了很長(zhǎng)時(shí)間才吃透這一點(diǎn)。因?yàn)楦鶕?jù)個(gè)人經(jīng)驗(yàn),實(shí)際構(gòu)建的很多軟件都從未真正被投入生產(chǎn),至少?zèng)]有得到大規(guī)模應(yīng)用。這是因?yàn)榇蟛糠周浖冀⒃谖唇?jīng)測(cè)試的假設(shè)之上。
在生產(chǎn)環(huán)境中運(yùn)行代碼時(shí),保持簡(jiǎn)單/保持傻瓜設(shè)計(jì)這看似直白的原則往往很難落地。它指的不只是代碼本身,更要求減少軟件中的活動(dòng)部件、吃透軟件的故障模式。換言之,要保證某些部件出了問(wèn)題時(shí)軟件仍能正常工作。
別忘了,是軟件在為業(yè)務(wù)服務(wù)
要想讓開(kāi)發(fā)過(guò)程平穩(wěn)推進(jìn),核心要素在于用戶(hù)。而這其中蘊(yùn)含的假設(shè)是:軟件本身有用且運(yùn)行良好,軟件對(duì)用戶(hù)有價(jià)值、對(duì)組織也有價(jià)值。這樣的提前可以轉(zhuǎn)化成以下理解方式:開(kāi)發(fā)者需要編寫(xiě)出良好、可用的軟件,業(yè)務(wù)部門(mén)再將其轉(zhuǎn)化成經(jīng)濟(jì)收益。
另外,軟件應(yīng)該總體有效,更好地服務(wù)于消費(fèi)者和企業(yè)需求。通過(guò)納入業(yè)務(wù)視角,我們的基本方針進(jìn)一步擴(kuò)充成這樣的形式:
業(yè)務(wù) > 用戶(hù) > 運(yùn)維者 > 開(kāi)發(fā)者
最典型的例子就是預(yù)算:我們不可能有無(wú)限的資源來(lái)滿(mǎn)足用戶(hù)需求,所以首先要衡量成本和收益,想清楚怎樣設(shè)置營(yíng)銷(xiāo)活動(dòng)和上市期限。此外還有利益相關(guān)方和投資者,他們各有各有利益和訴求。
在如此復(fù)雜的情況下,乍看上去對(duì)于軟件、開(kāi)發(fā)團(tuán)隊(duì)或用戶(hù)似乎正向的決策,放進(jìn)整個(gè)組織內(nèi)往往會(huì)起到負(fù)面作用。有時(shí)候,我們更需要?jiǎng)?chuàng)造收入、而不只是取悅用戶(hù)。
反面教材
到這里我們就得到了一個(gè)小模型,表達(dá)了軟件開(kāi)發(fā)流程中各個(gè)因素之間的相對(duì)重要度,也許能幫助大家立足宏觀專(zhuān)注于真正關(guān)鍵的環(huán)節(jié)。接下來(lái),我們將著眼于常見(jiàn)的軟件開(kāi)發(fā)障礙,嘗試把它們也納入思維模型。
不可維護(hù)的代碼:作者 > 維護(hù)者
這就是我們文章開(kāi)頭提到的情況,開(kāi)發(fā)者聰明但太懶惰,于是寫(xiě)出的代碼就成了交纏混雜的意大利面,后續(xù)的接手者永遠(yuǎn)無(wú)法理解當(dāng)初為什么要這樣設(shè)計(jì)。
無(wú)用的軟件:開(kāi)發(fā)者 > 用戶(hù)
對(duì)于那些不在乎用戶(hù)感受、或者堅(jiān)持把技術(shù)放在首次的團(tuán)隊(duì),開(kāi)發(fā)的就是這種無(wú)用軟件。其中充斥著過(guò)度設(shè)計(jì)、降低用戶(hù)體驗(yàn)的“現(xiàn)代化”元素,Web 應(yīng)用程序甚至有可能導(dǎo)致瀏覽器崩潰。
在我的機(jī)器上明明能跑:開(kāi)發(fā)者 > 運(yùn)維者
軟件在設(shè)計(jì)中并未考慮到運(yùn)維需求,因此軟件本身過(guò)于復(fù)雜、包含大量移動(dòng)部件、專(zhuān)供小型數(shù)據(jù)負(fù)載使用的數(shù)據(jù)庫(kù)、由眾多小團(tuán)隊(duì)管理的微服務(wù)生態(tài)等等??傊?,軟件架構(gòu)在毫無(wú)必要時(shí)就開(kāi)始考慮后續(xù)的規(guī)模擴(kuò)展問(wèn)題,最終運(yùn)維人員被折磨得焦頭爛額、開(kāi)發(fā)人員也被批得體無(wú)完膚。
技術(shù)倒逼業(yè)務(wù):開(kāi)發(fā)者 > 業(yè)務(wù)
把代碼本身視為目的。那幫自命不凡的工匠、泰坦尼克號(hào)上的音樂(lè)家和 Lisp 極客們,搞出來(lái)的就是這樣的軟件。
簡(jiǎn)歷驅(qū)動(dòng)型開(kāi)發(fā):開(kāi)發(fā)者 > 一切
不加任何約束、任由開(kāi)發(fā)者天馬行空發(fā)揮之下,開(kāi)發(fā)出的就是這種軟件。
純粹空想型軟件:業(yè)務(wù) > 用戶(hù) > ops 開(kāi)發(fā)者
這種軟件雖然能被開(kāi)發(fā)出來(lái),但卻很少、甚至從未被投入生產(chǎn)。我個(gè)人稱(chēng)之為空想型軟件,因?yàn)樗耆前凑諛I(yè)務(wù)部門(mén)的想象搞出來(lái)的。
業(yè)務(wù) > user >運(yùn)維者 > 開(kāi)發(fā)者
這是另外一種沒(méi)考慮過(guò)用戶(hù)需求的空想型軟件,它根本就解決不了問(wèn)題、或者解決的是錯(cuò)誤/根本不存在的問(wèn)題。這類(lèi)軟件會(huì)倒逼用戶(hù)向它靠攏,為的就是讓大量前期投資看起來(lái)能有那么一點(diǎn)點(diǎn)用處。
極端資本主義軟件:biz > 用戶(hù) > 運(yùn)維者 > 開(kāi)發(fā)者
這是由風(fēng)險(xiǎn)投資支撐而來(lái)的軟件,沒(méi)有健康的商業(yè)模式,或者說(shuō)商業(yè)模式只追求不斷增長(zhǎng)、達(dá)成壟斷、剝削用戶(hù)。
一點(diǎn)總結(jié)
最后,讓我們?yōu)檫@場(chǎng)有趣的思想實(shí)驗(yàn)做個(gè)收尾:
業(yè)務(wù) > 用戶(hù),這會(huì)帶來(lái)難以估量的災(zāi)難后果。
如前文提到,我們之所以要開(kāi)發(fā)軟件,目的是為最終用戶(hù)解決問(wèn)題?!?span id="ccccccc" class="candidate-entity-word" data-gid="2715329">程序員修煉之道》就對(duì)此做出過(guò)精當(dāng)?shù)目偨Y(jié):我們的目標(biāo)是取悅用戶(hù),而不僅僅是交付代碼。但自從投身于程序開(kāi)發(fā)之后,我發(fā)現(xiàn)隨著軟件普及度的不斷提升,這個(gè)假設(shè)又變得越來(lái)越不受重視、難以維持。
當(dāng)下很多得到大規(guī)模應(yīng)用的軟件根本就不關(guān)心用戶(hù),甚至反過(guò)來(lái)要操縱用戶(hù)、把用戶(hù)變成產(chǎn)品的一部分。這不僅限于社交媒體——作為用戶(hù),我們甚至無(wú)法回避各種頁(yè)面和功能欄中的廣告彈窗,谷歌搜索里顯示的垃圾也越來(lái)越多。
在我看來(lái),好軟件的定義已經(jīng)跟行業(yè)中大部分認(rèn)為的能賺錢(qián)的軟件之間出現(xiàn)了嚴(yán)重割裂,很多軟件專(zhuān)家的強(qiáng)烈不適感也正來(lái)源于此。雖然我們不能忽視軟件開(kāi)發(fā)領(lǐng)域的底層商業(yè)邏輯,但至少應(yīng)該采取更強(qiáng)硬的道德立場(chǎng)、拒絕無(wú)止境地傷害用戶(hù)。用戶(hù)也許并不永遠(yuǎn)優(yōu)先于業(yè)務(wù),但業(yè)務(wù)也不該被無(wú)條件地放在首位:
用戶(hù) > 運(yùn)維者 > 開(kāi)發(fā)者
業(yè)務(wù) > 運(yùn)維者 > 開(kāi)發(fā)者
業(yè)務(wù) ? 用戶(hù)
網(wǎng)友:實(shí)際上你必須考慮管理層
Facundo 的文章引起了廣發(fā)開(kāi)發(fā)者共鳴,同時(shí)這些開(kāi)發(fā)者們結(jié)合自己的實(shí)際經(jīng)歷又做了一些補(bǔ)充,比如管理層的關(guān)鍵作用。
有開(kāi)發(fā)者直接指出,有些用戶(hù)使用某個(gè)系統(tǒng)并不是因?yàn)樗麄兿矚g它,而是因?yàn)樗麄兊墓举?gòu)買(mǎi)了它?!霸凇畼I(yè)務(wù)>用戶(hù)’的情況下,開(kāi)發(fā)人員最終不得不迎合中層管理人員的需求,而不是實(shí)際用戶(hù)。不這樣做的代價(jià)就是無(wú)法贏得合同。但當(dāng)你忙于實(shí)現(xiàn)中層管理喜歡的新功能時(shí),用戶(hù)的需求就會(huì)被鎖定在你有限時(shí)間里能提供的‘垃圾’里?!?/span>
“我有過(guò)這樣的經(jīng)歷。我在一家向市政府銷(xiāo)售軟件的公司工作。重要的是市長(zhǎng)/鎮(zhèn)長(zhǎng)/市議會(huì)的意見(jiàn)。如果報(bào)告看起來(lái)不錯(cuò)并且價(jià)格合適,他們就會(huì)續(xù)訂。我記得在會(huì)議現(xiàn)場(chǎng),每天使用它的人當(dāng)面告訴我們它有多么糟糕。毫無(wú)疑問(wèn),該網(wǎng)站承諾將修復(fù)一些特定的 bug,并將價(jià)格提高到最低限度。” 網(wǎng)友“Deprecate9151”提到。
“derangedHorse”指出,“通常,中層管理人員也是用戶(hù),但他們只占用戶(hù)群的少數(shù),并且使用一組不同的功能(例如報(bào)告)。因此,現(xiàn)在的問(wèn)題是哪些用戶(hù)被優(yōu)先考慮,并在優(yōu)先考慮少數(shù)擁有權(quán)力的用戶(hù)的體驗(yàn)與保持產(chǎn)品足夠的可用性以供其他用戶(hù)提供一些數(shù)據(jù)價(jià)值之間找到平衡?!?/span>
對(duì)此,有開(kāi)發(fā)者指出,“您需要考慮中層管理人員的需求,因?yàn)樗麄兏跺X(qián)給您,但通常還有工藝空間為最終用戶(hù)帶來(lái)真正出色的用戶(hù)體驗(yàn)。大多數(shù)軟件工程師都缺乏真正的工藝意識(shí),因此當(dāng)不需要構(gòu)建出色的用戶(hù)體驗(yàn)時(shí),他們通常不會(huì)理會(huì)這個(gè)?!?/span>
參考鏈接:
https://olano.dev/2023-11-30-code-is-run-more-than-read/
https://news.ycombinator.com/item?id=38483181
本文轉(zhuǎn)載來(lái)源:
https://www.infoq.cn/article/NM15aIhUo7KUahoyWKZ5
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。