今日再談?wù)?a title="軟件開發(fā)" href="http://m.aansvym.cn/service">軟件開發(fā)人員如何提高架構(gòu)設(shè)計能力。對軟件開發(fā)而言,一般3年是一道坎,3年的編碼基本上可以逐步做出初步的設(shè)計,3年的設(shè)計基本上可以具備架構(gòu)設(shè)計的能力。盡管架構(gòu)設(shè)計是高屋建瓴,從頂向下對問題區(qū)域進(jìn)行分解,最終解決,但你會看到,真正的能力都來自于你的日常編碼,日常功能模塊設(shè)計的大量實踐積累。
當(dāng)然,大多數(shù)軟件開發(fā)人員即使編碼多年,也很難有設(shè)計能力,這也是設(shè)計思維意識的轉(zhuǎn)變。例如,在前面文章中提到的編程階段,你應(yīng)該有自動化和復(fù)用思維,在設(shè)計階段,你應(yīng)該有分層、分解、抽象、聚合等思維能力。
軟件開發(fā)中的設(shè)計能力是什么?
就軟件開發(fā)和編碼而言,我在前面的文章中已經(jīng)提到過,簡單來說就是數(shù)據(jù)結(jié)構(gòu)+算法,那么你是否對常用的數(shù)據(jù)結(jié)構(gòu)和算法都很清楚,有設(shè)計能力?
很明顯,答案是否定的。
最基本的設(shè)計能力是當(dāng)你面對問題領(lǐng)域時,你知道用什么樣的數(shù)據(jù)結(jié)構(gòu)或算法來解決這個問題。這是最基本的設(shè)計能力。
例如一條路徑搜索問題,別人告訴你用二叉樹模型和算法來解決,你去編碼實現(xiàn)了,那么就具備了編碼能力。但可以自己分析和建模問題,最終得出二叉樹算法效率最高,最終實現(xiàn),然后具備設(shè)計能力。
因此,設(shè)計能力的難點在于,當(dāng)你面對問題時,你可以快速分析,找到最合適的數(shù)據(jù)結(jié)構(gòu)和算法來解決。這就是設(shè)計能力。
從設(shè)計能力到結(jié)構(gòu)設(shè)計能力有什么區(qū)別?
簡言之,架構(gòu)設(shè)計則站得更高,你面臨的是一個完整的業(yè)務(wù)系統(tǒng)建設(shè)。該業(yè)務(wù)系統(tǒng)本身包括底層技術(shù)平臺的構(gòu)建、開源組件的選擇、開發(fā)框架和分層設(shè)計等非功能設(shè)計內(nèi)容。與此同時,它也包括了整個業(yè)務(wù)需求的到來,你如何進(jìn)行分而治之。
將整體需求分解為幾個子系統(tǒng)或模塊,這些模塊本身聚集了哪些功能,暴露了哪些接口,模塊之間如何協(xié)作才能完成完整的業(yè)務(wù)。如何分解才能保證分解后的組件高度聚集、松耦合、高度自主,最終通過界面集成完成整個業(yè)務(wù)。
分解后的內(nèi)容可以分配給不同的設(shè)計或開發(fā)人員進(jìn)行詳細(xì)的設(shè)計和開發(fā)。同時,你可以拍拍胸部,按照我的要求設(shè)計模塊和界面。我可以確保每個模塊最終都可以組裝。
因此,結(jié)構(gòu)層面涉及兩個關(guān)鍵方面。
首先,你可以從零開始構(gòu)建一個完整的開發(fā)或技術(shù)框架,制定分層設(shè)計,界面設(shè)計原則,規(guī)劃共同的技術(shù)平臺和組件,制定總體的開發(fā)標(biāo)準(zhǔn)和流程等等。
第二,你還需要了解體業(yè)務(wù),了解完整的業(yè)務(wù),才能做好系統(tǒng)分解和分解后的整合。我認(rèn)為分解、整合和抽象總是架構(gòu)設(shè)計的關(guān)鍵能力。
了解以上內(nèi)容后,回頭看看
例如,您可能會認(rèn)為您熟悉Redis、Kafka、SpingBoot等各種開源軟件或框架,這并不意味著您具備設(shè)計能力。但如果你清楚地知道在面對某個場景時,到底是應(yīng)該使用緩存,還是應(yīng)該使用消息中間件事件機(jī)制,那么你就具備了設(shè)計能力。
例如,你可能認(rèn)為你已經(jīng)詳細(xì)學(xué)習(xí)了常見的設(shè)計模式,并不意味著你有設(shè)計能力你遇到某個場景時,你知道應(yīng)該使用什么樣的設(shè)計模型來解決它。這叫做設(shè)計能力。
因此,培養(yǎng)設(shè)計能力有兩種方法
首先,你做了大量的編碼,在整個過程中走了彎路,你發(fā)現(xiàn)需要抽象或復(fù)用,才能提高你的開發(fā)效率,也讓軟件具有可擴(kuò)展性,你只要懂得這種反思和復(fù)盤,就一定能提高你的設(shè)計能力。假如您在開發(fā)過程中做了大量的粘貼、復(fù)制動作,而且沒有觸發(fā)您的思考,那么顯然很難培養(yǎng)您的設(shè)計能力。
設(shè)計能力往往始于編碼和編程思維
第一,自動去除重復(fù)的東西,第二,通過參數(shù)抽象把類似的東西變成可重復(fù)使用的方法或函數(shù),在抽象之后實現(xiàn)自動化。第二,自動化之后,你會發(fā)現(xiàn)如何更好地應(yīng)對變化,為了應(yīng)對變化,你做了更多的抽象或界面設(shè)計,在這個過程中逐漸積累設(shè)計能力。這個步驟你會發(fā)現(xiàn)你的問題是某個設(shè)計模式來解決的。
二是編碼積累到一定數(shù)量后,可以閱讀軟件架構(gòu)設(shè)計的書籍,首先形成設(shè)計的完整思路和方法論,也可以閱讀設(shè)計模式的書籍,對設(shè)計模式有一個完整的了解,可以比較分析日常編碼實踐的內(nèi)容和設(shè)計模式。這樣遇到類似的問題,可以少走自己探索的彎路。
但以上也只解決了設(shè)計能力問題
沒有解決結(jié)構(gòu)思維水平的問題,結(jié)構(gòu)思維的核心是全球能力,是高抽象和建模能力,明確業(yè)務(wù),理解技術(shù)的相互聯(lián)系能力。
當(dāng)然,大多數(shù)架構(gòu)設(shè)計師更熱衷于開發(fā)框架、技術(shù)平臺、開源組件選擇等。,而忽略了如何從一個業(yè)務(wù)需求中提出來。通過系統(tǒng)分析,你可以知道整個業(yè)務(wù)系統(tǒng)應(yīng)該如何劃分模塊,如何設(shè)計界面,如何設(shè)計整個數(shù)據(jù)模型和數(shù)據(jù)庫來支持業(yè)務(wù)。同時,你也可以思考你需要遵循什么樣的開發(fā)框架和模式,分層架構(gòu)思完成某個功能模塊的開發(fā)。
這件事實際上難,大多數(shù)人都沒有這種能力。
但為什么很多人的結(jié)構(gòu)設(shè)計還是做得很好,簡單來說,整個信息化和因特網(wǎng)發(fā)展到今天,各種業(yè)務(wù)系統(tǒng)、電商平臺、因特網(wǎng)應(yīng)用你基本上都能找到類似的結(jié)構(gòu)參考和原型,你只需參考別人的做法就可以了。
例如,如果你想成為一個電子商務(wù)平臺,你應(yīng)該如何分解每個子系統(tǒng),或者你是否建立每個中間能力中心,這些都是標(biāo)準(zhǔn)的方法。你不需要創(chuàng)新。你只需要參考別人的實踐來做。
但如果你面對一項全新的業(yè)務(wù),你就要去規(guī)劃和構(gòu)建整個業(yè)務(wù)系統(tǒng)的結(jié)構(gòu)設(shè)計,模塊劃分,我相信大多數(shù)結(jié)構(gòu)設(shè)計師都不能做到這一點。這一能力已不再是簡單的你技術(shù)多牛,而是考察全局思維和系統(tǒng)觀,考察的是分解與集成、分類與抽象、問題分析與解決、模式匹配、這些能力,統(tǒng)籌我常說的思維能力。
如果一個人真的有能力獨立分析和解決問題,有系統(tǒng)思維,你會發(fā)現(xiàn)他不僅做好了結(jié)構(gòu)設(shè)計,還做了很多其他的事情。就是這個道理。
因此,為了具備這方面的能力,您可以首先熟悉相關(guān)的業(yè)務(wù)領(lǐng)域知識,或者查看與目標(biāo)相似的完整軟件架構(gòu)設(shè)計書籍,領(lǐng)域驅(qū)動建模書籍,傳統(tǒng)的RUP統(tǒng)一軟件過程方法論等等。看一看完整的業(yè)務(wù)需求是如何通過流程分析、用例建模、對象建模、界面設(shè)計逐漸落地的。
請注意,在這一過程中,像UML這樣的建模設(shè)計語言是很好的輔助,但核心這些建模工具或語言也只是幫助你抽象或形式化地表達(dá)你的內(nèi)容,整個建模的核心還是系統(tǒng)分析思路。這一點始于原始需求輸入,如何逐步形成一個完整的構(gòu)架設(shè)計思路,才是關(guān)鍵。