0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么說(shuō)軟件開(kāi)發(fā)過(guò)程是一個(gè)復(fù)雜過(guò)程

5RJg_mcuworld ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-10-23 09:09 ? 次閱讀

問(wèn)題的分類

最初在1999年被Dave Snowden開(kāi)發(fā)出來(lái)的Cynefin框架嘗試把世界上的問(wèn)題劃分到了5個(gè)域中(大類):

簡(jiǎn)單(Simple)問(wèn)題,該域中的因果關(guān)系非常明顯,解決這些問(wèn)題的方法是 感知-分類-響應(yīng)(Sense-Categorise-Respond),有對(duì)應(yīng)的最佳實(shí)踐

復(fù)合(Complicated)問(wèn)題,該域中的因果關(guān)系需要分析,或者需要一些其他形式的調(diào)查和/或?qū)I(yè)知識(shí)的應(yīng)用,解決這些問(wèn)題的方法是感知-分析-響應(yīng)(Sense-Analyze-Respond),有對(duì)應(yīng)的好的實(shí)踐

復(fù)雜(Complex)問(wèn)題,該域中的因果關(guān)系僅能夠從回顧中發(fā)現(xiàn),解決這些問(wèn)題的方法是探索-感知-響應(yīng)(Probe-Sense-Respond),我們能夠感知涌現(xiàn)實(shí)踐(emergent practice)

混亂(Chaotic)問(wèn)題,該域中沒(méi)有系統(tǒng)級(jí)別的因果關(guān)系,方法是行動(dòng)-感知-響應(yīng)(Act-Sense-Respond),我們能夠發(fā)現(xiàn)新穎實(shí)踐(novel practice)

失序(Disorder)問(wèn)題,該域中沒(méi)有因果關(guān)系,不可感知,其中的問(wèn)題也無(wú)法被解決

顯然,軟件開(kāi)發(fā)過(guò)程更多地是一個(gè)復(fù)雜(Complex)問(wèn)題。在一個(gè)產(chǎn)品被開(kāi)發(fā)出來(lái)之前,不確定性非常高,團(tuán)隊(duì)(包括業(yè)務(wù)人員和技術(shù)人員)對(duì)產(chǎn)品的知識(shí)也是最少的,而且需要大量的學(xué)習(xí)和嘗試才可以明確下一步可能的方向。不幸的是,很多時(shí)候我們需要在一開(kāi)始(不確定性最高的時(shí)候)就為項(xiàng)目做計(jì)劃。這種從傳統(tǒng)行業(yè)中非常適合的方法在軟件開(kāi)發(fā)領(lǐng)域不再適用,這也是敏捷開(kāi)發(fā)、精益等方法論在軟件開(kāi)發(fā)中更加適合的原因。

正因?yàn)檐浖_(kāi)發(fā)事實(shí)上是一個(gè)學(xué)習(xí)的過(guò)程,我們學(xué)習(xí)到的新知識(shí)反過(guò)來(lái)會(huì)幫助我們對(duì)問(wèn)題的定義,從而帶來(lái)變化。這里的變化可能來(lái)自兩個(gè)方向:功能性非功能性。

功能性的變化指隨著對(duì)業(yè)務(wù)的深入理解、或者已有業(yè)務(wù)規(guī)則為了匹配市場(chǎng)而產(chǎn)生的變化。比如支付方式由傳統(tǒng)的貨到付款變成了網(wǎng)銀付款,又變成了微信支付、支付寶掃碼等等。一個(gè)原始的電商平臺(tái)僅僅提供基本的購(gòu)物服務(wù),但是后來(lái)可以根據(jù)已有數(shù)據(jù)產(chǎn)生推薦商品,從來(lái)帶來(lái)更大的流量。這些變化需要體現(xiàn)在已有的代碼中,而對(duì)代碼的修改往往是牽一發(fā)而動(dòng)全身。

非功能性的變化是指隨著業(yè)務(wù)的發(fā)展,用戶規(guī)模的增加,數(shù)據(jù)量的變化,安全認(rèn)知的變化等產(chǎn)生的新的需求。比如100個(gè)用戶的時(shí)候無(wú)需考慮性能問(wèn)題,但是100萬(wàn)用戶的時(shí)候,性能就變成了必須重視的問(wèn)題。天氣預(yù)報(bào)應(yīng)用的數(shù)據(jù)安全性和網(wǎng)絡(luò)銀行的數(shù)據(jù)安全性要求也大不相同。

而在業(yè)務(wù)提出一個(gè)需求的時(shí)候,往往只是一個(gè)簡(jiǎn)化過(guò)的版本。

非功能性復(fù)雜性

這是一個(gè)經(jīng)過(guò)設(shè)計(jì)師精確設(shè)計(jì)的界面,在它被設(shè)計(jì)出來(lái)之前,用戶事實(shí)上無(wú)法準(zhǔn)確的描述出它。設(shè)計(jì)過(guò)程中經(jīng)歷了很多的諸如:

  • 線框圖

  • 顏色的確定

  • 交互的動(dòng)畫(huà)

  • 信息層次

往復(fù)多次之后,界面確定了。在沒(méi)有仔細(xì)思考使用場(chǎng)景的時(shí)候,開(kāi)發(fā)會(huì)誤以為這個(gè)功能非常簡(jiǎn)單。但是如果你是一個(gè)有經(jīng)驗(yàn)的開(kāi)發(fā)者,很快會(huì)想到的一些問(wèn)題是:

  • 在寬屏下如何展示

  • 在平板上如何展示

  • 手機(jī)上如何展示

  • 即使僅僅支持桌面版,跨瀏覽器要考慮嗎?支持哪些版本?

  • 有些UI效果在低版本的瀏覽器上不工作,需要Shim技術(shù)

除此之外,依然有大量的其他細(xì)節(jié)需要考慮:

  • 性能要求是什么樣的?

  • 安全性要考慮嗎?

  • 在網(wǎng)絡(luò)環(huán)境不好的時(shí)候,要不要fallback到基礎(chǔ)視圖?

  • 既然涉及發(fā)送邀請(qǐng)函,送達(dá)率如何保證

  • 與外部郵件服務(wù)提供商集成時(shí)的工作量

等等。這些隱含的信息需要被充分挖掘出來(lái),然后開(kāi)發(fā)者才能做一個(gè)合理的評(píng)估,而且這還只是開(kāi)始。一旦進(jìn)入開(kāi)發(fā)階段,很多之前沒(méi)有考慮到的細(xì)節(jié)開(kāi)始涌現(xiàn):字體的選用,字號(hào),字體顏色,元素間的間距等等,如何測(cè)試郵件是否發(fā)送成功,多個(gè)角色之間的conversation又會(huì)消耗很多時(shí)間。

需求的變化方向

作為程序員,有一天你被要求寫(xiě)一段代碼,這段代碼需要完成一件很簡(jiǎn)單的事:

  1. 打印”Hello, world”5次

很容易嘛,你想,然后順手就寫(xiě)下了下面這幾行代碼:

print("Hello, world")
print("Hello, world")
print("Hello, world")
print("Hello, world")
print("Hello, world")

不過(guò),拷貝粘貼看起來(lái)有點(diǎn)低端,你做了一個(gè)微小的改動(dòng):

for(var i = 0; i < 5; i++) {
 print("Hello, world")
}

看起來(lái)還不錯(cuò),老板的需求又變成了打印”Goodbye, world”5次。既然是打印不同的消息,那何不把消息作為參數(shù)呢?

function printMessage(message) { for(i = 0; i < 5; i++) {
   print(message);
 }
}

printMessage("Hello, world")
printMessage("Goodbye, world")

有了這個(gè)函數(shù),你可以打印任意消息5次了。老板又一次改變了需求:打印”Hello, world”13次(沒(méi)人知道為什么是13)。既然次數(shù)也變化了,那么一個(gè)可能是將次數(shù)作為參數(shù)傳入:

function printMessage(count, message) { for(i = 0; i < count; i++) {
   print(message);
 }
}

printMessage(13, "Hello, world");
printMessage(5, "Goodbye, world");

完美,這就是抽象的魅力。有了這個(gè)函數(shù),你可以將任意消息打印任意次數(shù)。不過(guò)老板是永遠(yuǎn)無(wú)法滿足的,就在這次需求變化之后的第二天,他的需求又變了:不但要將”Hello, world”打印到控制臺(tái),還要將其計(jì)入日志。

沒(méi)辦法,通過(guò)搜索JavaScript的文檔,你發(fā)現(xiàn)了一個(gè)叫做高階函數(shù)的東東:函數(shù)可以作為參數(shù)傳入另一個(gè)參數(shù)!

function log(message) {
 system.log(message);
}

function doMessage(count, message, action) { for(i = 0; i < count; i++) {
   action(message);
 }
}

doMessage(5, "Hello, world", print);
doMessage(5, "Hello, world", log);

這下厲害了,我們可以對(duì)任意消息,做任意次的任意動(dòng)作!再回過(guò)頭來(lái)看看那個(gè)最開(kāi)始的需求:

  1. 打印”Hello, world”5次

稍微分割一下這句話:打印,”Hello, world”,5次,可以看到,這三個(gè)元素最后都變成了可以變化的點(diǎn),軟件開(kāi)發(fā)很多時(shí)候正是如此,需求可能在任意可能變化的方向上變化。這也是各種軟件開(kāi)發(fā)原則嘗試解決的問(wèn)題:如何寫(xiě)出更容易擴(kuò)展,更容易響應(yīng)變化的代碼來(lái)。

小結(jié)

軟件的復(fù)雜性來(lái)自于大量的不確定性,而這個(gè)不確定性事實(shí)上是無(wú)法避免的,而且每個(gè)軟件都是獨(dú)一無(wú)二的。另一方面,軟件的需求會(huì)以各種方式來(lái)變化,而且往往會(huì)以開(kāi)發(fā)者沒(méi)有預(yù)料到的方向。比如上面這個(gè)小例子中看到的,最后的需求可能會(huì)變成將消息以短信的方式發(fā)送給手機(jī)號(hào)以185開(kāi)頭的用戶手機(jī)上。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4552

    瀏覽量

    92024
  • 軟件工程師
    +關(guān)注

    關(guān)注

    8

    文章

    217

    瀏覽量

    21087
  • 智能硬件
    +關(guān)注

    關(guān)注

    205

    文章

    2320

    瀏覽量

    107144

原文標(biāo)題:軟件開(kāi)發(fā)為什么很難?

文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    直播軟件開(kāi)發(fā)過(guò)程中,如何選擇流媒體協(xié)議?

    `在直播軟件開(kāi)發(fā)過(guò)程中,我們可能會(huì)遇到些困惑。像是對(duì)于流媒體協(xié)議的選擇,如HTTP-FLV、WebRTC,RTMP,HLS及其它私有協(xié)議等,到底哪個(gè)比較合適?哪種協(xié)議可以用在PC平臺(tái)上?哪種協(xié)議在
    發(fā)表于 08-21 14:34

    嵌入式軟件開(kāi)發(fā)過(guò)程

    在嵌入式軟件開(kāi)發(fā)過(guò)程中,般來(lái)說(shuō),花在測(cè)試和花在編碼的時(shí)間比為3:1(實(shí)際上可能更多)。這個(gè)比例隨著你的編程和測(cè)試水平的提高而不斷下降,但不論怎樣,軟件測(cè)試對(duì)般人來(lái)講很重要。很多年前
    發(fā)表于 10-27 07:28

    嵌入式軟件開(kāi)發(fā)過(guò)程中的模塊化

    對(duì)很多人來(lái),嵌入式軟件開(kāi)發(fā)過(guò)程中模塊化(Modularization)是個(gè)海市蜃樓、是個(gè)書(shū)面詞匯、是
    發(fā)表于 12-20 07:22

    嵌入式軟件開(kāi)發(fā)過(guò)程之程序代碼分層

    在嵌入式軟件開(kāi)發(fā)過(guò)程中,在程序架構(gòu)的搭建完成之后,為了提高項(xiàng)目代碼的可讀性和可維護(hù)性等,應(yīng)對(duì)程序代碼分層
    發(fā)表于 12-21 06:13

    個(gè)嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程

    并行交互進(jìn)行,這樣嵌入式軟件開(kāi)發(fā)已經(jīng)成為項(xiàng)很復(fù)雜的工程。   個(gè)嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程如下:
    發(fā)表于 12-22 08:15

    面向?qū)ο?b class='flag-5'>軟件開(kāi)發(fā)概述

    1.1 面向?qū)ο髥?wèn)題求解的提出1.2 面向?qū)ο髥?wèn)題求解概述1.3 對(duì)象、類與實(shí)體1.4 對(duì)象的屬性與相互關(guān)系1.5 面向?qū)ο蟮?b class='flag-5'>軟件開(kāi)發(fā)過(guò)程1.6 面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn)面
    發(fā)表于 12-14 20:26 ?15次下載

    利用RealView MDK仿真功能的CAN總線的軟件開(kāi)發(fā)過(guò)

     RealView MDK具有強(qiáng)大的仿真功能,能仿真很多ARM芯片內(nèi)部外設(shè)。文章以RealView MDK為開(kāi)發(fā)環(huán)境,敘述了CAN總線的軟件開(kāi)發(fā)過(guò)程,并給出了仿真結(jié)果。   0 引言
    發(fā)表于 07-16 10:57 ?2067次閱讀
    利用RealView MDK仿真功能的CAN總線的<b class='flag-5'>軟件開(kāi)發(fā)過(guò)</b>

    KnowleSys軟件開(kāi)發(fā)過(guò)程指南

    軟件項(xiàng)目的成敗并非在于完全的技術(shù)層面的考慮上,而是取決于項(xiàng)目本身是否被小心規(guī)劃,謹(jǐn)慎執(zhí)行。絕大部分軟件項(xiàng)目都可以以種幾乎保證成功的決定性的方式進(jìn)行。本開(kāi)發(fā)過(guò)程
    發(fā)表于 04-13 22:50 ?10次下載
    KnowleSys<b class='flag-5'>軟件開(kāi)發(fā)過(guò)程</b>指南

    嵌入式軟件開(kāi)發(fā)過(guò)程中基于功能點(diǎn)的缺陷度量李冰

    嵌入式軟件開(kāi)發(fā)過(guò)程中基于功能點(diǎn)的缺陷度量_李冰
    發(fā)表于 03-14 08:00 ?0次下載

    GitHub開(kāi)源軟件開(kāi)發(fā)過(guò)程影響因素分析

    通過(guò)分析GitHub開(kāi)源軟件開(kāi)發(fā)過(guò)程,提出了問(wèn)題解決速度、問(wèn)題增加速度等影響因素,并對(duì)這些影響因素間的相關(guān)性進(jìn)行了分析.經(jīng)過(guò)實(shí)驗(yàn)證明了有些影響因素之間存在定的相關(guān)性.同時(shí),根據(jù)實(shí)驗(yàn)的結(jié)果還給出了針對(duì)GitHub開(kāi)源
    發(fā)表于 12-28 11:48 ?0次下載
    GitHub開(kāi)源<b class='flag-5'>軟件開(kāi)發(fā)過(guò)程</b>影響因素分析

    軟件開(kāi)發(fā)過(guò)程中需要的十三類文檔

    軟件項(xiàng)目開(kāi)發(fā)過(guò)程中,應(yīng)該按軟件開(kāi)發(fā)要求撰寫(xiě)十三類文檔,文檔編制要求具有針對(duì)性、精確性、清晰性、完整性、靈活性、可追溯性!
    發(fā)表于 09-15 09:03 ?5936次閱讀

    軟件開(kāi)發(fā)工程師工作中最艱巨的任務(wù)是什么

    軟件開(kāi)發(fā)過(guò)程中最艱巨的任務(wù)是什么?達(dá)內(nèi)軟件開(kāi)發(fā)部的工程師們發(fā)現(xiàn)他們大部分人認(rèn)為在軟件開(kāi)發(fā)過(guò)程中最艱巨的任務(wù)其實(shí)不是代碼。
    的頭像 發(fā)表于 05-06 14:32 ?2940次閱讀

    簡(jiǎn)述Geant4 的軟件開(kāi)發(fā)過(guò)程

    Geant4 的軟件開(kāi)發(fā)過(guò)程 Gabriele Cosmo(歐洲核子研究中心,瑞士日內(nèi)瓦)用于 Geant4 協(xié)作。 摘要: 自其最早的研發(fā) [1] 以來(lái),Geant4 仿真工具包已經(jīng)遵循決定項(xiàng)目
    的頭像 發(fā)表于 08-26 16:22 ?5034次閱讀

    編程與軟件工程

    過(guò)程為中心的軟件工程過(guò)程方法論主要有瀑布式與統(tǒng)一軟件開(kāi)發(fā)過(guò)程。這種軟件開(kāi)發(fā)過(guò)程需要產(chǎn)生大量的正式文檔,通過(guò)嚴(yán)格的流程管理控制
    的頭像 發(fā)表于 09-22 10:56 ?3194次閱讀

    參數(shù)——汽車軟件開(kāi)發(fā)中最大的挑戰(zhàn)之

    汽車軟件的應(yīng)用通常是在軟件用于多個(gè)型號(hào)和迭代的車輛時(shí)完成的。參數(shù)為開(kāi)發(fā)提供了必要的靈活性,通過(guò)巧妙地調(diào)整軟件來(lái)補(bǔ)償系統(tǒng)變量,從而使軟件可重用
    的頭像 發(fā)表于 02-14 15:30 ?585次閱讀
    參數(shù)——汽車<b class='flag-5'>軟件開(kāi)發(fā)</b>中最大的挑戰(zhàn)之<b class='flag-5'>一</b>