為什么部分外行人看起來(lái)不太復(fù)雜的網(wǎng)站,比如Facebook,需要大量頂尖高手來(lái)開(kāi)
時(shí)間:2023-10-30 11:36:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-10-30 11:36:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
為什么部分外行人看起來(lái)不太復(fù)雜的網(wǎng)站,比如Facebook,需要大量頂尖高手來(lái)開(kāi)發(fā)?:首先支持和贊成@子柳 和@覃超 的答案,他們都從實(shí)際的案例上有力得說(shuō)明了問(wèn)題的難度所在,我只是錦上添花,展開(kāi)來(lái)說(shuō)一下。
不單局限于網(wǎng)站,對(duì)于所有的軟件來(lái)說(shuō),從軟件工程學(xué)的角度來(lái)說(shuō),其需求大體可以分為功能性需求(functional Requirements)和非功能性需求(nonfunctional Requirements)兩個(gè)大的部分。
功能性需求,一般是我們顯性易見(jiàn)的,就是一般實(shí)現(xiàn)了什么功能,提供了什么服務(wù),大體我認(rèn)為問(wèn)題中提到,或者我們?nèi)粘Kf(shuō)的:“看起來(lái)復(fù)雜不復(fù)雜”,基本上都會(huì)是針對(duì)功能性需求而言的。如果拿google的搜索服務(wù)舉例來(lái)說(shuō),那就是:
提供一個(gè)輸入框, 提供一個(gè)按鈕,用戶在輸入框里輸入關(guān)鍵字,按了按鈕以后,可以搜索出相應(yīng)結(jié)果。
功能性需求,會(huì)因?yàn)椴煌木W(wǎng)站,不同的軟件,不同的業(yè)務(wù)和使用目的,大相徑庭,五花八門(mén),不一而論。
非功能性需求,以下應(yīng)用維基百科的定義(雖然有些晦澀和繞口,但是我認(rèn)為是比較精到和準(zhǔn)確的)
在系統(tǒng)工程及需求工程中,非功能性需求(Non-functional requirement)是指依一些條件判斷系統(tǒng)運(yùn)作情形或其特性,而不是針對(duì)系統(tǒng)特定行為的需求。和非功能性需求相對(duì)的是功能需求,后者會(huì)定義系統(tǒng)特定的行為或功能。非功能性需求也可以視為為了滿足客戶業(yè)務(wù)需求而需要符合,但又不在功能需求以外的特性。
一般會(huì)在系統(tǒng)設(shè)計(jì)(英語(yǔ):Systems design)中詳細(xì)列出實(shí)現(xiàn)功能需求的計(jì)劃,而會(huì)在系統(tǒng)架構(gòu)(英語(yǔ):Systems architecture)中詳細(xì)列出實(shí)現(xiàn)非功能性需求的計(jì)劃。一般而言,功能需求會(huì)定義系統(tǒng)的行為,而非功能性需求會(huì)定義系統(tǒng)的特性。
非功能性需求一般會(huì)稱(chēng)為系統(tǒng)的“品質(zhì)”,有時(shí)也會(huì)稱(chēng)為“限制”、“品質(zhì)屬性”、“品質(zhì)目標(biāo)”、“品質(zhì)屬性”、“品質(zhì)服務(wù)需求”或“非行為性的需求”。有許多非功能性需求的英文都是以“ilitiy”結(jié)尾,例如穩(wěn)定性(stability)及可移植性(portability),因此非功能性需求有時(shí)也稱(chēng)為“ilities”。
非功能性需求可以分為以下的二類(lèi):
運(yùn)行品質(zhì)(Execution qualities),可以在系統(tǒng)運(yùn)作時(shí)觀察到的品質(zhì),例如保安性及易用性等。
發(fā)展品質(zhì)(Evolution qualities),和軟件系統(tǒng)結(jié)構(gòu)及開(kāi)發(fā)過(guò)程有關(guān)的品質(zhì),例如軟件可測(cè)試性(英語(yǔ):software testability)、可維護(hù)性、可擴(kuò)展性、可伸縮性(scalability)等
非功能性需求一般是隱性的,容易被菜鳥(niǎo)程序員,設(shè)計(jì)師們忽略。非功能性需求不同于功能性需求,它在不同的網(wǎng)站,軟件上,擁有一定的共性,就例如@子柳 提到的海量文件存儲(chǔ)的問(wèn)題上,淘寶,騰訊,google都遇到了一樣的問(wèn)題,研發(fā)了類(lèi)似的解決方案(TFS,TFS和GFS)。
非功能性需求的分類(lèi)方法較多,并沒(méi)有業(yè)界通行和一致的標(biāo)準(zhǔn),但是大多數(shù)殊途同歸,名稱(chēng)/叫法以及分類(lèi)方法上可能略有差異,但是其含義和指向一般是趨向一致的,我簡(jiǎn)單介紹一下我一般較多采用的分類(lèi):
- 性能/容量:性能和容量比較利于理解,包括像需要支持的用戶的數(shù)量?。ㄓ绕涫欠逯档牟l(fā)用戶數(shù)量),用戶能夠接受的響應(yīng)時(shí)間啊,數(shù)據(jù)規(guī)模啊(例如@子柳 提到的百萬(wàn)級(jí)的驚人數(shù)據(jù)規(guī)模,上億的文件存儲(chǔ)啦等等。這里小小糾正一下@子柳 的一個(gè)觀點(diǎn),百萬(wàn)級(jí)的數(shù)據(jù)支撐,還是有一些商業(yè)數(shù)據(jù)庫(kù)產(chǎn)品可以支持的,TPC-C/TPC-D以及新一代的業(yè)界性能測(cè)試標(biāo)準(zhǔn)中還有千萬(wàn)級(jí)數(shù)據(jù)規(guī)模的測(cè)試項(xiàng)目,也有數(shù)據(jù)庫(kù)廠商報(bào)名參加的,當(dāng)然,對(duì)于淘寶這樣的業(yè)務(wù)模式和實(shí)際情況/要求來(lái)說(shuō),性?xún)r(jià)比和實(shí)用性可能確實(shí)就比較低了)
- 可靠性/可用性/可復(fù)原性: 可靠性之與在規(guī)定的一段時(shí)間和條件下軟件維持其功能服務(wù)以及性能水平的能力有關(guān)的一組屬性(可用性是另外一種說(shuō)法)。例如說(shuō)我們要求系統(tǒng)7x24小時(shí)運(yùn)行,全年持續(xù)運(yùn)行故障停運(yùn)時(shí)間累計(jì)不能超過(guò)10小時(shí)等等,都屬于這方面的要求。 可復(fù)原性與在是發(fā)生錯(cuò)誤和故障后重建其性能水平并恢復(fù)直接受影響數(shù)據(jù)的能力。例如支付寶需要保證如果在交易提交失敗以后,需要保證回滾,不能這頭銀行的錢(qián)沒(méi)有付成功,那頭卻顯示付款成功或者反之這頭銀行扣款了,那頭在改變交易狀態(tài)的時(shí)候缺因?yàn)槿呷蛘咂渌驅(qū)е陆灰走€是未付款狀態(tài)。
- 可維護(hù)性/可管理性:包括系統(tǒng)在無(wú)人工干預(yù)條件下的穩(wěn)定性,自排錯(cuò)能力,可測(cè)試性都屬于這個(gè)范疇。故障的可排查能力,系統(tǒng)的修正,升級(jí),備份,恢復(fù)機(jī)制以及方便與否,都屬于這個(gè)范疇。這通常會(huì)極大決定系統(tǒng)的運(yùn)行維護(hù)成本及維護(hù)難度。
- 安全:包括傳輸加密,存儲(chǔ)加密,可破解性,以及各種未被授權(quán)的用戶行為如何防范和控制,都是安全范疇,這里的安全不單針對(duì)外部普通用戶,也針對(duì)內(nèi)部不同級(jí)別的權(quán)限用戶的的控制。小到如何防范和處理用戶在輸入框里輸入特殊字符來(lái)獲得設(shè)計(jì)者未曾預(yù)料的結(jié)果,大到防范外部黑客和內(nèi)部?jī)?nèi)鬼。安全很多時(shí)候不單依賴(lài)技術(shù)實(shí)現(xiàn),同時(shí)非常依賴(lài)相應(yīng)的制度和審計(jì)。
- 易用性:好吧,這個(gè)話題現(xiàn)在最熱了,這可能是非功能性需求中現(xiàn)在唯一被高亮出來(lái),被各種人等都關(guān)注,都拿出來(lái)說(shuō)事的一個(gè)領(lǐng)域了。易用性設(shè)計(jì)現(xiàn)在已經(jīng)上升到了一個(gè)新的高度,叫做人機(jī)體驗(yàn),UE設(shè)計(jì),雖然現(xiàn)在UE到底是劃分在功能性需求還是非功能性需求上,尚有一些爭(zhēng)議,但是主流觀點(diǎn)(包括我自己)都認(rèn)為,這是非功能性需求的一個(gè)典型部分。
- 數(shù)據(jù)一致性:包括數(shù)據(jù)的編碼和語(yǔ)言,冗余數(shù)據(jù)的一致性要求(含時(shí)間要求)等等。例如為了性能的考慮,數(shù)據(jù)庫(kù)整體設(shè)計(jì)未采用巴斯克范式,而采用了第二或者第三范式的要求來(lái)設(shè)計(jì),一些信息(例如用戶注冊(cè)信息),可能同時(shí)存在于系統(tǒng)的多個(gè)地方(例如多個(gè)表中),當(dāng)發(fā)生注冊(cè)信息變更時(shí),如何保證多處地方記錄的信息都被修改,以及這個(gè)全部修改的時(shí)限要求是多少等等都是這個(gè)范疇的內(nèi)容。
- 系統(tǒng)/環(huán)境 條件及限制:現(xiàn)有的軟硬件條件,平臺(tái)的條件,網(wǎng)絡(luò)的條件都屬于這個(gè)范疇。典型的例如很多移動(dòng)互聯(lián)網(wǎng)產(chǎn)品,必須要考慮移動(dòng)網(wǎng)絡(luò)的帶寬條件,終端運(yùn)算性能和能力,以及其移動(dòng)網(wǎng)絡(luò)穩(wěn)定性等等。
事實(shí)上,從我的經(jīng)驗(yàn)來(lái)看,一般來(lái)說(shuō),很多軟件項(xiàng)目及產(chǎn)品,其在非功能性需求上的成本,難度和工作量,是要超過(guò)功能性需求的。在特定的軟件領(lǐng)域,例如網(wǎng)站(尤其是淘寶,facebook這樣海量用戶規(guī)模的網(wǎng)站),金融(銀行證券),電信領(lǐng)域,其非功能性需求實(shí)現(xiàn)的重要性,工作量,技術(shù)難度要遠(yuǎn)遠(yuǎn)遠(yuǎn)遠(yuǎn)大于功能性需求的實(shí)現(xiàn)。
而且,功能性的需求的實(shí)現(xiàn),其實(shí)在大多數(shù)情況下,更依賴(lài)于業(yè)務(wù)的高手(或者好的產(chǎn)品經(jīng)理)而不是技術(shù)的高手,而非功能性需求的實(shí)現(xiàn),恰恰是挑戰(zhàn)技術(shù)高手的重要課題。
一個(gè)最典型的極限非功能性需求的例子就是電信的計(jì)費(fèi)系統(tǒng),其實(shí)基本功能很簡(jiǎn)單,獲取通話時(shí)長(zhǎng),按照費(fèi)率公式算個(gè)錢(qián)出來(lái),但是放到海量的用戶,實(shí)時(shí)的計(jì)費(fèi)要求中來(lái)看,這是一個(gè)極具技術(shù)挑戰(zhàn)的活。
還有一個(gè)經(jīng)典的案例是,中國(guó)某地方性銀行(注意僅僅是地方性的銀行),想要引入一個(gè)柜面服務(wù)的系統(tǒng),找到了新家坡的一個(gè)廠商,他們?cè)跂|南亞銀行業(yè)有很多案例,而且功能設(shè)計(jì)非常完善合理和先進(jìn)。但是這家地方性銀行引入這個(gè)系統(tǒng)以后,2周之內(nèi)發(fā)行了幾十萬(wàn)張信用卡,這系統(tǒng)就頂不住崩潰了。這就是典型的功能性需求實(shí)現(xiàn)完美,但是非功能性缺陷的例子。
從我的經(jīng)驗(yàn)來(lái)看,一般來(lái)說(shuō),非功能性需求中,性能/容量,以及安全的要求,一般是技術(shù)挑戰(zhàn)最多,內(nèi)涵最豐富,成本最高,最值得關(guān)注的領(lǐng)域,當(dāng)然,現(xiàn)在易用性(UE)也是一個(gè)極度收到重視的領(lǐng)域。
有志于架構(gòu)師取向的IT技術(shù)人員,非功需求實(shí)現(xiàn)的領(lǐng)域,是一個(gè)必須關(guān)注,必須熟悉的領(lǐng)域。
而本問(wèn)題最大的根源在于,只看到了網(wǎng)站功能性需求的部分,而沒(méi)有注意到非功的部分,對(duì)于非專(zhuān)業(yè)的IT技術(shù)人員來(lái)說(shuō),這很正常,但是對(duì)于IT技術(shù)人員來(lái)說(shuō),是需要認(rèn)真關(guān)注的必修課。
最后,舉一個(gè)可能不太恰當(dāng)?shù)睦觼?lái)說(shuō)明一下:
100米的路,從這頭到那頭,看起來(lái)是件很簡(jiǎn)單的事情。
但是要求10秒之內(nèi)要從這頭跑到那頭,這就需要田徑高手了。
如果還要求,10秒之內(nèi)跑完,要連著反復(fù)跑好幾趟,路上可能有積水濕滑障礙物,那我覺(jué)得就只有去找博爾特劉翔之類(lèi)的頂尖高手去聊聊了
關(guān)鍵詞:比如,高手,外行,部分,復(fù)雜