自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

工程設(shè)計(jì)論——如何寫好工程代碼

精選
開發(fā) 前端
在進(jìn)行工程設(shè)計(jì)的過程中,對(duì)于認(rèn)知和計(jì)算的交替流程,我們總結(jié)了一套行之有效的經(jīng)驗(yàn),即對(duì)需求的拆分和組合。

一、內(nèi)容概述

1. 從抽象的工程設(shè)計(jì)論角度闡述了如何寫好一份代碼。闡述了設(shè)計(jì)模式和設(shè)計(jì)原則的底層原理。

2. 解釋了設(shè)計(jì)模式與設(shè)計(jì)原則適用的場(chǎng)景及局限性。工程設(shè)計(jì)論是在有限設(shè)計(jì)能力下對(duì)被設(shè)計(jì)對(duì)象進(jìn)行的認(rèn)知和進(jìn)行逆運(yùn)算的過程。在不符合這一條件的領(lǐng)域,不應(yīng)當(dāng)死扣設(shè)計(jì)模式與設(shè)計(jì)原則。在軟件領(lǐng)域,一個(gè)顯而易見的例子就是不要在極度追求性能的代碼中死扣設(shè)計(jì)模式與設(shè)計(jì)原則。

3. 解釋了設(shè)計(jì)原則中的單一職責(zé)原則為何難以掌握和運(yùn)用。

4. 面向接口設(shè)計(jì)是軟件系統(tǒng)設(shè)計(jì)的最終形態(tài),對(duì)開發(fā)流程中先寫單例再開發(fā)的原因做了解釋。

二、理論基礎(chǔ)

1. 哲學(xué)基礎(chǔ):羅素《哲學(xué)問題》。

2. 數(shù)學(xué)基礎(chǔ):矩陣?yán)碚?,工程控制論?/p>

3. 工程基礎(chǔ):一定工程設(shè)計(jì)經(jīng)驗(yàn),如代碼開發(fā)等。

4. 設(shè)計(jì)科學(xué)基礎(chǔ):謝友柏老師的《設(shè)計(jì)科學(xué)與設(shè)計(jì)競(jìng)爭(zhēng)力》,Nam Suh 的《公理設(shè)計(jì)》。

三、什么是設(shè)計(jì)——設(shè)計(jì)和計(jì)算與認(rèn)知之間的聯(lián)系

一門科學(xué)的建立,應(yīng)當(dāng)首先明確本學(xué)科的局限性,確定本學(xué)科最基本的問題與框架。明確的基本框架應(yīng)能夠迅速得到一門學(xué)科的基礎(chǔ)結(jié)論與研究方法;明確的基本問題可以用于檢驗(yàn)上述的結(jié)論與方法。指出自然界中每一杯水中都有金元素并不能對(duì)金礦的發(fā)現(xiàn)起到什么促進(jìn)作用。設(shè)計(jì)科學(xué)的現(xiàn)在的發(fā)展應(yīng)該做減法而不是做加法。對(duì)于設(shè)計(jì)所具備的特征,有很多描述。這些描述最基本的共同點(diǎn)是設(shè)計(jì)是需要達(dá)到一定的目標(biāo)的(即需求)。其他特征并不是設(shè)計(jì)最基本的特征。例如最優(yōu)化設(shè)計(jì)中就沒有需求變更,logo 設(shè)計(jì)中就沒有系統(tǒng)故障。

如果認(rèn)同需求是設(shè)計(jì)的共同點(diǎn),那么搞清楚需求是什么則是重要的。 大部分人都認(rèn)為,在我們的實(shí)際工作中,需求是不明確的,不完整的。那我們不妨用辯證的思維來考慮這個(gè)問題的反面,什么是明確的,完整的需求?一份完整的需求,對(duì)于所有人而言都是清晰的,不會(huì)產(chǎn)生什么不一樣的理解。那么對(duì)于什么樣的產(chǎn)品能夠滿足相應(yīng)的需求,也應(yīng)該是清晰的。用集合論的話來說,一個(gè)集合被其外延所完全確定。換句話說,如果需求能夠被一個(gè)確定的驗(yàn)收方式來定義,比如說單元測(cè)試,那么這份需求可以說是明確和完整的。

我們還需要更進(jìn)一步地探討什么是驗(yàn)收。以單元測(cè)試為例,我們用單元測(cè)試來輸出一個(gè) True 或是輸出一個(gè) False;如果認(rèn)為單元測(cè)試本身是一個(gè)函數(shù),那驗(yàn)收就是要求被設(shè)計(jì)對(duì)象在該函數(shù)下的相必須為 True。那么,如果我們的需求足夠簡(jiǎn)單,會(huì)發(fā)生什么情況?比如說我們的需求是找到一個(gè) x,使其滿足 x+1=0,我們一般稱這種問題為求解,或者是逆運(yùn)算??梢钥吹?,當(dāng)我們對(duì)需求及其實(shí)現(xiàn)方式的認(rèn)識(shí)完全清晰的時(shí)候,需求將退化成為一個(gè)函數(shù),設(shè)計(jì)將退化成為逆運(yùn)算的過程。

設(shè)計(jì)的過程中,我們對(duì)于需求及實(shí)現(xiàn)方式的認(rèn)識(shí)是不全面的,這是其與逆運(yùn)算不同的核心點(diǎn)(而不是需求不明確或者是需求會(huì)發(fā)生變更)。例如化工產(chǎn)品的合成路線設(shè)計(jì),例如高效排序算法的設(shè)計(jì),都不存在需求本身不明確的問題。認(rèn)知的不全面迫使我們需要在設(shè)計(jì)的過程中,一邊對(duì)需求及其實(shí)現(xiàn)方式進(jìn)行認(rèn)知,獲取更多的知識(shí),一邊進(jìn)行求逆運(yùn)算,找到能夠滿足需求的實(shí)現(xiàn)方式。

四、工程設(shè)計(jì)的過程

在進(jìn)行工程設(shè)計(jì)的過程中,對(duì)于認(rèn)知和計(jì)算的交替流程,我們總結(jié)了一套行之有效的經(jīng)驗(yàn),即對(duì)需求的拆分和組合。

我們剛剛已經(jīng)說過,需求本質(zhì)上是要求一個(gè)對(duì)象,在某個(gè)函數(shù)下的像具備某些特征,這本質(zhì)上是一種約束。而“被設(shè)計(jì)對(duì)象由 A,B 兩個(gè)組件構(gòu)成,A 具備 123 特征,B 具備 456 特征”,這和需求的描述方式?jīng)]有什么不同,本質(zhì)上也是一種約束。也就是說,分拆本身也是對(duì)被設(shè)計(jì)對(duì)象的一種約束,只不過滿足分拆約束的對(duì)象并不一定滿足需求的約束。因此我們不妨把分拆的約束當(dāng)作一種對(duì)被設(shè)計(jì)對(duì)象的弱約束。

因而工程設(shè)計(jì)可以被總結(jié)成為如下的流程:

1. 根據(jù)對(duì)需求的相關(guān)研究,給出實(shí)現(xiàn)方式的弱約束,我們一般采用對(duì)系統(tǒng)拆分的方式來進(jìn)行弱約束。在軟件領(lǐng)域,最常見的弱約束就是對(duì)組件劃分的約束,各個(gè)部件之間的依賴關(guān)系,接口的定義,數(shù)據(jù)交互方式之間的約束。(認(rèn)知過程,我們一般稱之為需求拆解與架構(gòu)設(shè)計(jì))。

2. 利用第一步的弱約束,來對(duì)需求中的強(qiáng)約束的實(shí)現(xiàn)方式進(jìn)行具體的分析和求解。(逆運(yùn)算過程,我們一般稱之為編碼)。

我們剛剛已經(jīng)說明了,分拆本質(zhì)上也是一種約束。第二步中的求解結(jié)果,仍舊有可能是一種對(duì)子系統(tǒng)需求,此時(shí)就需要我們繼續(xù)進(jìn)行更加細(xì)化的設(shè)計(jì)。

引入弱約束這個(gè)概念,是因?yàn)樵谖覀儗?duì)被設(shè)計(jì)對(duì)象一無所知的情況下,研究如何實(shí)現(xiàn)相應(yīng)的需求是相對(duì)困難的。那么我們不妨假設(shè)被設(shè)計(jì)對(duì)象具備某些性質(zhì)(這種假設(shè)往往也強(qiáng)依賴于個(gè)人經(jīng)驗(yàn)),并將這些假設(shè)性質(zhì)(比如說接口)作為研究如何實(shí)現(xiàn)的一種工具和框架。

例如在代碼設(shè)計(jì)中,拆分為 A,B 兩個(gè)模塊并進(jìn)行并行設(shè)計(jì)時(shí),如果在 A 模塊的實(shí)現(xiàn)流程完全不知道B模塊的信息,那么將會(huì)對(duì) A 模塊的設(shè)計(jì)產(chǎn)生巨大的阻礙(比如前端完全不知道后端的數(shù)據(jù)格式)。但是,B 模塊的具體實(shí)現(xiàn)方式還未確定,此時(shí) A 模塊也不可能對(duì) B 模塊的信息由完整的了解,且并不是每一個(gè) B 模塊的信息對(duì)于其他模塊都是有用的(比如后端選用的數(shù)據(jù)庫格式,后端部署的位置,后端的實(shí)現(xiàn)方式)。所以我們需要折中的對(duì) B 模塊進(jìn)行約束(比如規(guī)定接口),使得 A 模塊能夠獲得必要的相關(guān)信息。了解過認(rèn)知論的同學(xué)也應(yīng)該知道,這種接口本身就是一種對(duì) B 模塊的認(rèn)知(參照羅素的感覺材料或是我在前序文章中所述的“關(guān)系”)。我認(rèn)為這是依賴注入的底層邏輯,也是面向接口設(shè)計(jì)將成為軟件設(shè)計(jì)的最終形態(tài)的底層依據(jù)。

公式化地來描述上述流程,對(duì)于一個(gè)找到滿足的設(shè)計(jì)問題,我們將這個(gè)問題分為兩步:

1. 將 J(X)=0 拆分成為

2. 根據(jù)的性質(zhì),找到使得的具體值,例如;并同時(shí)研究,找到的具體形式,例如。

在這個(gè)例子中,工程設(shè)計(jì)與科學(xué)研究后進(jìn)行計(jì)算的最大區(qū)別即在于,第二步中的具體實(shí)現(xiàn)過程是并行的。各個(gè)組件的實(shí)現(xiàn)的并行在軟件工程中是常見的(前后端分別編碼,最后進(jìn)行調(diào)試即是如此)。我們當(dāng)然可以在完全研究清楚 J(X) 的性質(zhì)下,再去進(jìn)行設(shè)計(jì)。限制我們不去這么做的條件,并非是這樣得到的產(chǎn)品效果一定不好,而是設(shè)計(jì)需要投入的工期與人力有限制。完全設(shè)計(jì)好前端之后,再去進(jìn)行后端設(shè)計(jì),當(dāng)然是可以的,但是這種串行化的工作模式,顯而易見的會(huì)對(duì)工期造成負(fù)面影響。

為了使得這種拆分方式可行,獨(dú)立職責(zé)的原則就需要被引進(jìn)以保證最后的組裝工作順利完成。在上一步中,我們的工作是并行的,意味著我們并不知道所需要取得的值是多少。如果我們最終研究得到:。

那我們顯然是找不到相應(yīng)的解的。這就需要我們保證 f({X}),g({X}),m({X}) 之間的相互獨(dú)立。我們對(duì)拆分地獨(dú)立性及其負(fù)面影響進(jìn)行進(jìn)一步地探討:

1. 強(qiáng)獨(dú)立:存在一個(gè)定義域?yàn)閮蓚€(gè)自變量組X構(gòu)成的二元空間,值域?yàn)樽宰兞拷MX的函數(shù)融合函數(shù)U;使得對(duì)于任意的。

2. 弱獨(dú)立:對(duì)于任意的。

3. 不獨(dú)立:存在。

對(duì)于強(qiáng)獨(dú)立而言,只要組合函數(shù) J,及部分函數(shù) f,g 的研究和求解是成功的,設(shè)計(jì)即是成功的。強(qiáng)獨(dú)立的意思是,如果我們分別找到兩個(gè)取值,使得部分函數(shù) f,g 的值取到了我們想要的結(jié)果 m,n;那我們可以根據(jù)找到一個(gè)綜合的解使得部分函數(shù) f,g 同時(shí)取到我們想要的值。比如說對(duì)于:。那么對(duì)于任意一個(gè)我們要求的 f,g 的取值,我們都可以將其用來保證

對(duì)于弱獨(dú)立而言,同時(shí)對(duì)組合函數(shù) J,及部分函數(shù) f,g 進(jìn)行研究,可能會(huì)帶來組合上的困難,但是不至于使得設(shè)計(jì)徹底失敗。比如說對(duì)于。對(duì)于任意的 m,n,我們都是能找到來滿足我們的需求的(注意這里一般是由研究組合函數(shù)J的同學(xué),來提出對(duì)部分函數(shù) f,g 詳細(xì)取值要求 m,n)。由于對(duì)函數(shù) g 進(jìn)行研究和設(shè)計(jì)的人,事先可能不知道,他們完全可能設(shè)計(jì)出來的方式。因此這種情況,需要后期的合作與調(diào)試,才能完成整個(gè)設(shè)計(jì)。

對(duì)于不獨(dú)立而言,同時(shí)對(duì)組合函數(shù) J,及部分函數(shù) f,g 進(jìn)行研究,可能會(huì)使得設(shè)計(jì)徹底失敗。比如說。研究組合函數(shù)J的同學(xué)最終得到的答案可能是,這顯然是無解的。因此這個(gè)拆分可以認(rèn)為是失敗的。

這一規(guī)則對(duì)應(yīng)于軟件領(lǐng)域中的單一職責(zé)原則,有人評(píng)論這一原則是較為難以運(yùn)用和掌握的(“單一職責(zé)原則是最簡(jiǎn)單但又最難運(yùn)用的原則”)。事實(shí)確實(shí)如此,接下來我們將對(duì)這一點(diǎn)進(jìn)行探討。

我們換一種看起來正確的模棱兩可的表述更方便我們發(fā)現(xiàn)問題在哪。這個(gè)陳述是:獨(dú)立的功能應(yīng)當(dāng)由獨(dú)立的類來實(shí)現(xiàn)。那么,問題出現(xiàn)了。我們?cè)趺慈ヅ袛鄡蓚€(gè)功能之間相互獨(dú)立?熟悉哲學(xué),并對(duì)哲學(xué)中對(duì)“Free”的討論有接觸的人會(huì)很快反應(yīng)過來,“Free”這個(gè)詞必然是建立于某種映射之上,單獨(dú)說 A 與 B“Free”沒有任何意義。家庭教育和學(xué)校教育是否獨(dú)立?道德教育和智力教育是否獨(dú)立?從不同的角度會(huì)有不一樣的答案。從時(shí)間上,家庭教育和學(xué)校教育相互獨(dú)立;從評(píng)分標(biāo)準(zhǔn)上,道德教育和智力教育也相互獨(dú)立。如果把教育也作為一種設(shè)計(jì),我們是應(yīng)該把教育劃分成為家庭教育和學(xué)校教育,還是劃分成為道德教育和智力教育?劃分的依據(jù)究竟應(yīng)該是什么?

顯而易見的事情是,我們所能夠接受的判斷功能之間的相互獨(dú)立的依據(jù),應(yīng)該是從其實(shí)現(xiàn)方式上相互獨(dú)立。那么上面那句話,就可以改寫成為:實(shí)現(xiàn)上獨(dú)立的功能應(yīng)當(dāng)被獨(dú)立地實(shí)現(xiàn)。這有點(diǎn)像一句政治正確的廢話,其具體的運(yùn)用強(qiáng)依賴于設(shè)計(jì)人員對(duì)于相關(guān)領(lǐng)域的事前經(jīng)驗(yàn)與判斷。不具備相關(guān)領(lǐng)域的經(jīng)驗(yàn),進(jìn)行功能劃分必然會(huì)出現(xiàn)一些搞笑的結(jié)果。這就是單一職責(zé)原則是最簡(jiǎn)單,也最困難的原則的原因。

五、總結(jié)與局限

設(shè)計(jì)是在對(duì)需求的認(rèn)知不完整的情況下,對(duì)被設(shè)計(jì)對(duì)象進(jìn)行求解的一個(gè)過程。這就迫使我們需要一邊認(rèn)識(shí)被設(shè)計(jì)對(duì)象,一邊進(jìn)行求解。為了并行化地進(jìn)行這一過程,也為了使得對(duì)被設(shè)計(jì)對(duì)象地認(rèn)識(shí)有初步的研究工具和基礎(chǔ),我們總結(jié)出了一套利用分拆提供弱約束,并基于這種分拆,來并行進(jìn)行不同組件之間的設(shè)計(jì)的流程。由于分拆只能提供關(guān)于被設(shè)計(jì)對(duì)象的較弱認(rèn)識(shí),因此依賴倒置和面向接口設(shè)計(jì)是必須的。為了使得并行化的設(shè)計(jì)最終可以被組裝,單一職責(zé)原則(獨(dú)立原則)是必須的。

可以看到,整個(gè)設(shè)計(jì)理論是必須基于對(duì)需求的認(rèn)知不完整,且需要低成本(首要的是時(shí)間成本)地完成設(shè)計(jì)這一條件。對(duì)于設(shè)計(jì)周期比較長(zhǎng),認(rèn)知較為充分的領(lǐng)域,設(shè)計(jì)理論并不適用。完全只用設(shè)計(jì)模式來衡量設(shè)計(jì)的好壞,也是不可取的。這方面的反例有很多,LeetCode 上面的題目,恐怕沒有哪一個(gè)符合了設(shè)計(jì)模式,比如說找鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)中的雙指針就是一個(gè)典型。對(duì)于人體而言,也并不遵循什么單一職責(zé)原則,甚至可以說耦合地不像,人在饑餓的時(shí)候,可以分解蛋白質(zhì)來供能;我們?cè)陲w機(jī)設(shè)計(jì)過程中,有考慮過在液壓油泄露時(shí),拿燃油來充當(dāng)液壓油么?一些經(jīng)典設(shè)計(jì)也并不遵循設(shè)計(jì)理論與原則,例如活塞環(huán)既能夠防止漏氣,又能夠降低摩擦磨損,這顯然也不是符合獨(dú)立公理的。

只有對(duì)設(shè)計(jì)科學(xué)的底層邏輯有著深入的研究,才能使得這門科學(xué)發(fā)揮其真正的作用。雖然本文盡可能地對(duì)這個(gè)領(lǐng)域進(jìn)行了一些減法地操作,略去了一些不核心的要素,但是無論在理論上,還是例子上,都沒有能夠提供一個(gè)真正能夠被驗(yàn)證成為正確或是錯(cuò)誤的想法或是命題。本文甚至連錯(cuò)誤都算不上,這無論如何都是讓人不滿意的。

六附—利用分拆來設(shè)計(jì)系統(tǒng)的一個(gè)例子

很多設(shè)計(jì)領(lǐng)域的文章提出的例子,都是一些已有的設(shè)計(jì);或是拿著根本沒有市場(chǎng)的需求來設(shè)計(jì)一款產(chǎn)品。這種先射箭后畫靶的行為并不能促進(jìn)科學(xué)的發(fā)展。因此找一個(gè)大家都熟知的領(lǐng)域,提出解決起來較為有難度,但是需求明確的問題來作為探討的例子。很幸運(yùn)的是,我的確解決了我自己提出的問題。

在機(jī)械領(lǐng)域,平面桿件機(jī)構(gòu)的設(shè)計(jì)是最基本的問題。例如對(duì)下圖中這種四桿機(jī)構(gòu),我們經(jīng)常會(huì)進(jìn)行擺角的設(shè)計(jì)等工作。那么,我們能不用勻速的電機(jī)和平面桿件,使得平面桿件上的某一點(diǎn)有著指定的軌跡?例如用平面桿件畫一只兔子?

對(duì)于這個(gè)問題,我們梳理我們已經(jīng)知道的知識(shí),來給出一些弱約束:

1. 一個(gè)確定的平面桿組機(jī)構(gòu),其上任意一點(diǎn)的位置都是一個(gè)隨時(shí)間變化的周期函數(shù)。我們可以用復(fù)數(shù)域上的函數(shù)來進(jìn)行表示,即:

2. 由勻速電機(jī)帶動(dòng)的桿件(主動(dòng)件),其終點(diǎn)的軌跡是一個(gè)圓,且這個(gè)圓的運(yùn)動(dòng)規(guī)律與其他桿件無關(guān)。

3. 不由勻速電機(jī)帶動(dòng)的桿件(從動(dòng)件)的軌跡,由主動(dòng)件的運(yùn)動(dòng)軌跡和其與主動(dòng)件的鏈接所決定。

那么,我們?cè)儆刹鸱纸o出另外的弱約束,以解決這一問題:

A.最終設(shè)計(jì)的平面桿組,由主動(dòng)件和一些連接組構(gòu)成。這些連接組應(yīng)當(dāng)具備兩個(gè)自由端點(diǎn),且連接組上一點(diǎn)在運(yùn)動(dòng)中始終是這兩個(gè)自由端點(diǎn)的中點(diǎn),即。

在這樣一個(gè)弱約束下,我們的問題就變?yōu)榱耍?/p>

1. 如何通過一些圓周運(yùn)動(dòng),及建立在其上的加法體系,擬合任意一個(gè)周期運(yùn)動(dòng)。

2. 如何找到一個(gè)連接組,使得其具備上述條件。

問題一的答案由傅里葉變換給出:

問題二可以由如下桿組完成,轉(zhuǎn)動(dòng)副 2 始終為轉(zhuǎn)動(dòng)副 1,3 的中點(diǎn):

最終的設(shè)計(jì),我用了 16 個(gè)主動(dòng)件,及 16 個(gè)連接組,共計(jì) 80 個(gè)桿件,得到的結(jié)果已經(jīng)在上圖中展示了。

誠(chéng)實(shí)而言,我認(rèn)為這個(gè)例子在說明弱約束和強(qiáng)約束,以及拆分對(duì)于工程設(shè)計(jì)的必要性方面,仍舊難以擺脫先射箭后畫靶的嫌疑。但是至少,我不認(rèn)為我設(shè)計(jì)的機(jī)構(gòu),就是本問題的最優(yōu)解;我想本問題用以說明工程設(shè)計(jì)并不能得到最好的設(shè)計(jì)這一點(diǎn),還是足夠的。

責(zé)任編輯:武曉燕 來源: 阿里巴巴中間件
相關(guān)推薦

2022-09-13 11:09:26

5G工程設(shè)計(jì)

2020-08-20 08:17:08

機(jī)器學(xué)習(xí)技術(shù)工具

2021-10-13 08:16:14

SQL 代碼系統(tǒng)

2021-11-04 09:55:59

代碼編程語言

2020-09-30 08:08:15

單元測(cè)試應(yīng)用

2019-06-10 19:00:23

Cmain函數(shù)編程語言

2015-05-21 10:43:36

工程師如何寫代碼

2019-10-08 09:29:41

架構(gòu)代碼業(yè)務(wù)邏輯

2022-06-01 09:00:00

人工智能測(cè)試人工智能平臺(tái)

2022-03-09 15:48:13

Java代碼

2014-09-10 14:29:04

技術(shù)簡(jiǎn)歷實(shí)例模板

2021-08-04 11:34:05

設(shè)計(jì)師框架總結(jié)

2020-07-31 08:12:49

代碼機(jī)器設(shè)備

2011-06-02 15:54:42

網(wǎng)絡(luò)路由器

2019-03-04 14:52:42

數(shù)據(jù)分析簡(jiǎn)歷工作經(jīng)歷

2019-03-04 15:53:02

SQL存儲(chǔ)系統(tǒng)

2019-08-14 08:52:40

業(yè)務(wù)代碼運(yùn)營(yíng)

2016-09-22 16:14:45

前端設(shè)計(jì)Photoshop

2020-07-15 08:17:16

代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)