|
系列文章導(dǎo)航:
基于自然語(yǔ)言的軟件工程和程序設(shè)計(jì)(上)
基于自然語(yǔ)言的軟件工程和程序設(shè)計(jì)(中)
基于自然語(yǔ)言的軟件工程和程序設(shè)計(jì)(下)
軟件發(fā)展至今,無(wú)論是編程語(yǔ)言,還是軟件工程,乃至是互聯(lián)網(wǎng)的趨勢(shì)發(fā)展,都是飛速發(fā)展。于是,我們便迷茫于這樣形形色色的語(yǔ)言和概念之間,無(wú)所適從。其實(shí),我們不妨返璞歸真,回到最初,讓我們從語(yǔ)義出發(fā),來(lái)討論這形形色色的種種,你是否恍然大悟呢?
5. 面向過(guò)程是先總后分的行文順序
相信大多數(shù)程序員都和我一樣,C語(yǔ)言都是自己的第一門語(yǔ)言,那么面向過(guò)程的這個(gè)概念也自然深入人心。其實(shí),我相信,每個(gè)人心中的思維都是面向過(guò)程的。
“我們應(yīng)該先干嘛,再干嘛”。這是每個(gè)人在做一件事情前的常規(guī)思維,編程時(shí)也是一樣,我們?cè)趯?shí)現(xiàn)一個(gè)方法,或者在完成一個(gè)功能時(shí),都會(huì)去想,應(yīng)該先做什么,再做什么,然后我們會(huì)相應(yīng)地把一個(gè)方法拆分成若干個(gè)子方法,這就是我們傳統(tǒng)的面向過(guò)程的編程。
我們把這種方式稱之為“自頂向下”的編程思維。在做一件事情之前,我們要了解這件事情是什么,然后再去想這件事情應(yīng)該怎么做。
這種與我們常規(guī)的對(duì)應(yīng)叫做記敘文,說(shuō)得難聽(tīng)一些我們可以稱之為流水賬。
我們不妨說(shuō)得偏激一點(diǎn),面向過(guò)程的核心不在于方法,而在于過(guò)程。面向過(guò)程本是沒(méi)有方法的,后來(lái)為了可讀性才增加了方法這個(gè)概念。本就是輔助,當(dāng)然可有可無(wú)。
概括起來(lái),面向過(guò)程的編程方式是先總后分的行文方式,先知道總體意思,再逐條去寫(xiě)。
6. 面向?qū)ο笫窍确趾罂偟男形捻樞?/strong>
逐漸地,我們開(kāi)始接觸了Java、C#等面向?qū)ο蟮恼Z(yǔ)言,但是我們是否卻始終沒(méi)有辦法扭轉(zhuǎn)思維,來(lái)找到如何來(lái)面向?qū)ο竽兀恳只蚴俏覀兘?jīng)常為了面向?qū)ο蠖嫦驅(qū)ο竽兀?/p>
我們究竟錯(cuò)在了哪?我就是按照常規(guī)的語(yǔ)義來(lái)分析整個(gè)的項(xiàng)目,那為什么無(wú)法面向?qū)ο竽兀垮e(cuò)只錯(cuò)在我們解析語(yǔ)法的角度出現(xiàn)了問(wèn)題。
在上文中,我提到了我在高中時(shí)非常常用的一種記敘方式,就是我會(huì)在文章的題記前,先把開(kāi)場(chǎng)的主人公全部都陳列出來(lái),其中包括他們的主要性格,以及簡(jiǎn)要概括他們的陳年往事。如此做的原因是因?yàn)槲恼碌墓适陆Y(jié)構(gòu)比較復(fù)雜。
那么我會(huì)做的是,首先在提綱上列去所有的主人公,然后想清楚他的主要性格,之后再去根據(jù)他的性格來(lái)為他設(shè)定一些事件,最后根據(jù)這些事件安排這些主人公的出場(chǎng)順序,以及人物之間的關(guān)系。
這也得出了我對(duì)面向?qū)ο蟮暮诵乃枷氲母攀觯阂匀藶楸尽_@里的人不僅僅是人,是指所有存在的生物,乃至非生物。換句話說(shuō),所有需要有行為的物體。可以是人,可以是計(jì)算機(jī),甚至可以是一個(gè)衣柜。
面向?qū)ο蟮暮诵牟辉谟跇I(yè)務(wù)邏輯的過(guò)程,而在于找到所有的“人”,然后知道每個(gè)人都能做什么,最后我們?cè)侔堰@些行為加以組裝而已。
概括起來(lái),面向?qū)ο蟮木幊谭绞绞窍确趾罂偟男形姆绞剑谖恼乱潦迹考虑槎疾恢雷约菏窃诟陕铮皇窃诒磉_(dá)著自己。知道最后,才會(huì)發(fā)現(xiàn),原來(lái)這些事情的作用是這個(gè)樣子的。
有這樣一本書(shū),叫像堆積木一樣做軟件。我不清楚這本書(shū)的內(nèi)容是什么,但是這個(gè)題目很形象,面向?qū)ο笤诜治鲞^(guò)程實(shí)際上就是在做積木,每個(gè)積木都不知道自己未來(lái)會(huì)干嘛,而當(dāng)積木都做好了之后,堆積木就變得簡(jiǎn)單而易行了。
7. 并發(fā)式編程是交錯(cuò)式的行文順序
隨著軟件對(duì)性能要求的逐漸提升,并發(fā)已經(jīng)成為了我們不可回避的話題,從Erlang到C#4.0的并行庫(kù),再到顯卡編程的盛行,并發(fā)編程已經(jīng)逐漸走到了我們的面前。
在高中時(shí),有一種文體非常盛行,我也曾多次嘗試,最后的分?jǐn)?shù)也還不錯(cuò)。這種問(wèn)題是在行文時(shí),分別描述兩件事情或多件事情,這幾件看上去毫無(wú)關(guān)系,只是由每一段的ABCD、abcd等不同的符號(hào)來(lái)標(biāo)識(shí),然而這些事情到最后卻揭示的同一道理,或者是最后他們?cè)谕粓?chǎng)景匯聚,來(lái)構(gòu)成了故事的結(jié)局。
這種文體在新概念作文大賽上屢有出現(xiàn)。其實(shí)這就對(duì)應(yīng)著我們常規(guī)意義上的并發(fā)編程。每件事情和每件事情之間從局部上沒(méi)有著直接聯(lián)系,但是最后宏觀上,他們都是在為了做同一件事情,達(dá)到同一個(gè)目的。就像裝配腦袋某天在群里討論的冒泡排序的并發(fā)版——奇偶排序一樣,從微觀上,對(duì)奇數(shù)排序和對(duì)偶數(shù)排序沒(méi)有必然聯(lián)系,實(shí)則他們?cè)谕瓿芍豁?xiàng)工作。
8. 重談總體行文
我一直在編程中都很強(qiáng)調(diào)一點(diǎn),語(yǔ)義的重要性!
完美的編程語(yǔ)言應(yīng)該是與自然語(yǔ)言完全對(duì)應(yīng)的,可以把一篇文章翻譯成與之對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言,發(fā)展到那時(shí),程序員就真的變成了翻譯工作,只需要把對(duì)應(yīng)的需求文檔無(wú)需設(shè)計(jì),翻譯成計(jì)算機(jī)認(rèn)識(shí)的一串串代碼就可以了。
我們究竟如何分析一個(gè)軟件需求。在我看來(lái),軟件的創(chuàng)造過(guò)程實(shí)則就是語(yǔ)義的分析過(guò)程。
當(dāng)拿到一份需求時(shí),按照面向?qū)ο蟮能浖こ趟枷耄覀儜?yīng)該首先做到提取出這份需求文檔中所有的“主人公”,然后找到這些主人公每個(gè)人都可以干嘛,能干嘛,要干嘛。然后為之建立模型。這是面向?qū)ο蟮倪^(guò)程。
然后是每個(gè)行為的分析過(guò)程,要做這個(gè)行為,我們要先怎么做,再怎么做,為這個(gè)行為建立相應(yīng)的流程圖,這是面向過(guò)程的分析過(guò)程。
接下來(lái),我們可以分析某個(gè)行為怎么做,是否可以一邊干嘛,一邊干嘛。這是面向并發(fā)的建模過(guò)程。
當(dāng)我們要描述某個(gè)算法時(shí),我們可以說(shuō)這個(gè)算法要怎么做,只是基于語(yǔ)義的描述,例如斐波那契數(shù)列要用第一個(gè)數(shù)加上第二個(gè)數(shù),這其實(shí)就很有可能是一個(gè)函數(shù)式編程的產(chǎn)生過(guò)程。
最后是組裝,也就是堆積木的過(guò)程。我們的積木都已經(jīng)做好了,我們只需要按照不同的業(yè)務(wù)邏輯,去把這些積木搭起來(lái)就可以了。
也就是說(shuō),當(dāng)我們建立一個(gè)項(xiàng)目時(shí),首先建立人物傳記(面向?qū)ο螅缓髮?duì)人物的經(jīng)歷進(jìn)行描述(面向過(guò)程)。最后成文時(shí),我們可以用交錯(cuò)式行文方式對(duì)其重組(并發(fā)式)。
那么好,我們概括下整個(gè)的過(guò)程:面向?qū)ο蠓治?->面向過(guò)程分析--->在過(guò)程的細(xì)節(jié)上并發(fā)或者函數(shù)式--->組裝時(shí)再次考慮并發(fā)。
9. 小議過(guò)時(shí)說(shuō)
經(jīng)常會(huì)聽(tīng)到這樣的聲音,未來(lái)是面向服務(wù)的,未來(lái)是面向?qū)ο蟮模嫦蚝瘮?shù)的,面向過(guò)程已經(jīng)過(guò)時(shí)了之類的話。
其實(shí),看過(guò)我上面的分析過(guò)程,一個(gè)完整的工程只靠著某一種編程范式是行不通的,一個(gè)工程的搭建需要的是各種范式的配合使用,每種范式都有著它所擅長(zhǎng)的部分。
就像面向?qū)ο笤俸糜茫矡o(wú)法脫離了面向過(guò)程而單獨(dú)存在,哪怕你的原子拆分得再細(xì),也無(wú)法逃開(kāi)對(duì)每件事情進(jìn)行分析的過(guò)程,況且還有著業(yè)務(wù)邏輯組裝過(guò)程的存在。
而面向函數(shù),面向并發(fā)再?gòu)?qiáng)大,他也無(wú)法取代面向?qū)ο笤诜治鲆粋€(gè)大型項(xiàng)目中自底向上這樣巨大的優(yōu)勢(shì)。因此任何編程范式皆無(wú)過(guò)時(shí)說(shuō)。就像語(yǔ)言之爭(zhēng)一樣,每種語(yǔ)言都有著其合適的應(yīng)用范圍,談?wù)Z言優(yōu)劣,過(guò)時(shí)與否,我覺(jué)得毫無(wú)必要。
下文簡(jiǎn)介:
在下文中,我會(huì)對(duì)對(duì)全文進(jìn)行一個(gè)總體的總結(jié),以及語(yǔ)義與面向?qū)ο蟮年P(guān)系,設(shè)計(jì)模式與語(yǔ)義的關(guān)系,并且會(huì)淺談個(gè)人認(rèn)為未來(lái)語(yǔ)言的發(fā)展方向等等,敬請(qǐng)關(guān)注,謝謝。
it知識(shí)庫(kù):基于自然語(yǔ)言的軟件工程和程序設(shè)計(jì)(中),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。