架构师修练 I - 超级代码控
生活随笔
收集整理的這篇文章主要介紹了
架构师修练 I - 超级代码控
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?可實(shí)現(xiàn)的是架構(gòu),空談是概念 So don't tell me the concepts show me the code! ?“不懂編碼的架構(gòu)師不是好架構(gòu)師” 好架構(gòu)師都是超級(jí)代碼控。
代碼是最好的老師
從代碼中學(xué)習(xí)設(shè)計(jì)的思想、方法是提升類庫(kù)設(shè)計(jì)能力、印證你所了解的概念與理論這就是架構(gòu)師看代碼的觀點(diǎn)。基本準(zhǔn)備
一個(gè)類庫(kù)可能有數(shù)千個(gè)類上萬(wàn)個(gè)方法,應(yīng)該如何去看呢? 在看代碼前我們需要進(jìn)行一些什么樣的準(zhǔn)備呢 ?- 設(shè)計(jì)模式?- 最標(biāo)準(zhǔn)的23種設(shè)計(jì)模式基本上要有一個(gè)了解,可能一下子不能理解他們的用法,但一定要記下他們的英文名字和基本的用途,如:Factory, Wrapper (Decorator), Command, ?Builder等?。
- 語(yǔ)言規(guī)范?- 熟讀語(yǔ)言本身的官方編碼規(guī)范與命名規(guī)則,這是共同的標(biāo)準(zhǔn),也是從官方得到寫(xiě)代碼的第一指導(dǎo)。
- 要看懂UML中對(duì)類的圖形表示方法(類、接口、抽象類、繼承關(guān)系、使用關(guān)系)
看代碼的方法
這里所提供的方法就先以C#作為語(yǔ)言基礎(chǔ),因?yàn)镃#有極為規(guī)范的的語(yǔ)法規(guī)則。.net 的文檔在類庫(kù)方面的文檔是最完整也是最易讀的。以.net framework作為起點(diǎn)會(huì)是一個(gè)很好的練習(xí)入口。在開(kāi)始前我還推薦一下大家需要有一個(gè)反編譯工具我用的是.NET Reflector, 用反編譯工具不是讓你去抄代碼(代碼本身是沒(méi)有多大價(jià)值的,價(jià)值的核心在于設(shè)計(jì))而是可以更深入地了解到代碼是怎樣實(shí)現(xiàn)的。用反編譯工具看微軟的代碼會(huì)看到很多的不同的,你會(huì)發(fā)現(xiàn)大最設(shè)計(jì)得非常有意思的內(nèi)部類 (Internal) 。從中大至可以推斷出微軟的開(kāi)發(fā)方法,“在外部接口完全一至的情況下,讓程序員編寫(xiě)的自由度最大邊界就是內(nèi)部類與內(nèi)部方法” 你可以馬上動(dòng)手先看看 System.Web.Mvc.dll 的實(shí)現(xiàn) 要點(diǎn):多問(wèn)為什么,帶著問(wèn)題看代碼——為什么這樣寫(xiě)(存在理由)?為什么這樣設(shè)計(jì)(出發(fā)點(diǎn))? 由你來(lái)寫(xiě)又將如何實(shí)現(xiàn)?看命名?
以面向?qū)ο蟮恼Z(yǔ)言為例,大多會(huì)在名字內(nèi)帶有具體的用法信息,從名稱推算可能使用的模式及實(shí)現(xiàn) 帶有模式印記的類:- TagBuilder - 以Builder模式實(shí)現(xiàn)的Html標(biāo)記的構(gòu)建器
- StringBuilder - 以Builder模式實(shí)現(xiàn)的字符串構(gòu)造建器
- XXXXWriter - 以構(gòu)建器模式實(shí)現(xiàn)的各種寫(xiě)入器
- ConnectionFactory - 數(shù)據(jù)庫(kù)連接對(duì)象構(gòu)造工廠
看接口
接口在設(shè)計(jì)中有著極為重要的地位,結(jié)構(gòu)再?gòu)?fù)雜的系統(tǒng)到了接口級(jí)別基本上都會(huì)很簡(jiǎn)單。而且也是判定這個(gè)類庫(kù)設(shè)計(jì)是否成熟的一種標(biāo)準(zhǔn)。接口與接口間的定義就定義整個(gè)系統(tǒng)的基本框架??唇涌诘淖罨疽饬x就是深入理解類庫(kù)設(shè)計(jì)者的設(shè)計(jì)思路與了解類庫(kù)最核心的能力。 這里我們以 IRepository 為例來(lái)講講怎么去看接口 (如果想深入了解IRepostiory的朋友可以閱讀我之前的文章:“Repository模式與UnitOfWorks模式的運(yùn)用” ) 我以 IRepository 為例是因?yàn)樗墓沧R(shí)度很大,而實(shí)現(xiàn)起來(lái)可以很龐大也可以很小,眾所周知IRepository提供的就是對(duì)某個(gè)實(shí)體的CURD(增加、更新、讀取、刪除)的一個(gè)接口。那么當(dāng)我們看到它的存在時(shí),應(yīng)該可以推斷出另一個(gè)接口:IUnitOfWork 因?yàn)樗鼈兺鶗?huì)是孿生兄弟般的存在,再進(jìn)一步推斷是否會(huì)存在IRepositoryFactory 和 IUnitOfWorkBuilder 呢? 那么就可以帶著這些問(wèn)題在類庫(kù)中找答案。 ??? 通過(guò)IRepository我會(huì)可能會(huì)發(fā)現(xiàn)一大堆的Repository類, 如抽象類:EntityRepositoryBase, FiledRepositoryBase ,JSONRepositoryBase 等 具體類:BlogRepository, PostRepository, UserRepository 等 注:作為練習(xí)大家可以去下載我在NuGet上發(fā)布的一個(gè)名為 DotNetAge Document Storage 類庫(kù),里面就有Repository的實(shí)現(xiàn) 一但掌握了從接口看結(jié)構(gòu)的方法,就可以快速地在無(wú)文檔的情況下理解類庫(kù)的核心與設(shè)計(jì)理念。參考“最佳實(shí)踐”
一般上來(lái)說(shuō),流行的語(yǔ)言都會(huì)提供官方的“最佳實(shí)踐”提供下載學(xué)習(xí)。這是一個(gè)必修項(xiàng)目,同一個(gè)需求,我們可以采用各種的設(shè)計(jì)方法來(lái)實(shí)現(xiàn),但哪一種最好的? “最佳實(shí)踐”就提供了方法選擇的指導(dǎo)?!白罴褜?shí)踐”會(huì)有大量文檔輔助講解,在此時(shí)使用上述兩個(gè)方法去學(xué)習(xí)那將會(huì)更大地提高你在設(shè)計(jì)上的提升。 隨著不斷的積累與大量的代碼閱歷,你可能就會(huì)得到這樣一種能力:隨便拿個(gè)Dll,在一個(gè)短時(shí)間內(nèi)你可以如數(shù)家珍般說(shuō)出整個(gè)Dll中的特點(diǎn)與功能。 這,就是“看”的練習(xí)方法,與練習(xí)后的效果學(xué)
要成為架構(gòu)師就需要突破語(yǔ)言的障壁,不同的語(yǔ)言有不同的優(yōu)勢(shì),設(shè)計(jì)應(yīng)該是因勢(shì)利導(dǎo),好的架構(gòu)可用任何語(yǔ)言實(shí)現(xiàn),反過(guò)來(lái)優(yōu)秀的架構(gòu)則應(yīng)盡可能地發(fā)揮語(yǔ)言的特性。應(yīng)用此方法前首先你至少已掌握或精通一門(mén)語(yǔ)言。學(xué)習(xí)多種語(yǔ)言的動(dòng)機(jī)
- 開(kāi)拓視野,從不同語(yǔ)言中學(xué)習(xí)特有的設(shè)計(jì)理念
- 尋找與更新自己的 “最佳實(shí)踐”
- 規(guī)避語(yǔ)言被淘汰的風(fēng)險(xiǎn)
開(kāi)拓視野
我最近在不少網(wǎng)站上看到這樣的一種論調(diào):“學(xué)語(yǔ)言只學(xué)一門(mén)就好,不需要多只需要精”。咋一看,似乎是對(duì)的,而我認(rèn)為僅限于初學(xué)者或不求進(jìn)取者。這是一種語(yǔ)言同質(zhì)論,是一種誤導(dǎo)與限制!如果學(xué)習(xí)語(yǔ)言能“窺一斑而見(jiàn)全豹”那就不需要有那么多的其它語(yǔ)言存在了,對(duì)嗎?? 當(dāng)對(duì)某一門(mén)語(yǔ)言精通(我指的是精通類庫(kù)而不是語(yǔ)法)后,這個(gè)時(shí)間大概也得幾年,很容易進(jìn)入到一種“思維定式”,以某種固定語(yǔ)言為基點(diǎn)想問(wèn)題,或是設(shè)計(jì)。一旦進(jìn)入這種狀態(tài)也就意味著局限性的出現(xiàn),程序員或是架構(gòu)師就被限制在了一個(gè)局部的小范圍,而且還是風(fēng)險(xiǎn)極高的范圍內(nèi)。 IT的發(fā)展是飛速的,今天的寵兒明天的乞丐這種劇目屢屢上演著,你愿意被大浪淘沙嗎?吊在一顆樹(shù)上真是一條死路,這是技術(shù)發(fā)展的風(fēng)險(xiǎn)層面。又,你的設(shè)計(jì)工作對(duì)你還有挑戰(zhàn)性嗎?你是否仍然對(duì)設(shè)計(jì)和開(kāi)發(fā)充滿激情?你的設(shè)計(jì)是否在當(dāng)下可以有什么讓你自豪的特色或創(chuàng)建呢? 被同質(zhì)化后這些答案都會(huì)被否定掉。? 我的論點(diǎn)是:不斷學(xué)習(xí)各種語(yǔ)言,體驗(yàn)各種語(yǔ)言所帶來(lái)的開(kāi)發(fā)與設(shè)計(jì)的激情,開(kāi)拓自我的視野才是一個(gè)架構(gòu)師應(yīng)走的路。架構(gòu)師不單單是技術(shù)的選擇者,而更應(yīng)該是技術(shù)的整合者。選擇“最佳實(shí)踐”
我們長(zhǎng)期會(huì)在某一領(lǐng)域內(nèi)工作,自然而然會(huì)誕生出對(duì)此領(lǐng)域內(nèi)的軟件的設(shè)計(jì)理念與實(shí)現(xiàn)方法。但這僅是一種,舉一個(gè)最簡(jiǎn)單的例子,同一個(gè)網(wǎng)站我們可以用ASP.NET MVC , Java, PHP 或是NodeJS來(lái)實(shí)現(xiàn),固然實(shí)現(xiàn)方法與代碼量就截然不同了。隨便寫(xiě)個(gè)博客網(wǎng)站就能體驗(yàn)他們的區(qū)別所在:- ASP.NET 和 Java的思維方式與代碼量差異不大,學(xué)習(xí)曲線最長(zhǎng)、 Hosting 資源成本中等,但數(shù)據(jù)庫(kù)Hosting成本高
- Php 相對(duì)前兩者簡(jiǎn)單而且資源眾多,Hosting 資源最多,成本最低
- NodeJS性能最高、學(xué)習(xí)曲線最短、代碼量最少、資源也最多但Hosting 成本最高
成為 “O” 型架構(gòu)師
開(kāi)發(fā)是一個(gè)團(tuán)隊(duì)共同完成的,與真實(shí)社會(huì)一樣,活在哪里就說(shuō)哪里的話才會(huì)深入了解對(duì)方的文化。 架構(gòu)師不是一個(gè)獨(dú)立的個(gè)體,而是團(tuán)隊(duì)中不可或缺的成員,在行政與地位上與其它成員是對(duì)等的。開(kāi)發(fā)隊(duì)團(tuán)就像是一個(gè)人,流著共同的血液。一個(gè)架構(gòu)師,一份設(shè)計(jì)就應(yīng)該是一種“O”型血,無(wú)論在哪個(gè)隊(duì)團(tuán)內(nèi)都能融合,使用哪種語(yǔ)言都能實(shí)現(xiàn)與優(yōu)化這才是一個(gè)好架構(gòu)師的目標(biāo)。學(xué)習(xí)多種語(yǔ)言的方法
學(xué)習(xí)語(yǔ)言的方法大家都會(huì)有各自的路徑與方法,在這里我只是介紹一下我自己的學(xué)習(xí)方法僅供大家參考與給我建議。我從業(yè)也10多年了,經(jīng)歷了不少語(yǔ)言以下這些是一些記憶與狀態(tài):- Delphi (1-5) (Object pascal) - 這是初戀 , 擁有最多的界面組件和最簡(jiǎn)單的可視化開(kāi)發(fā)環(huán)境,VCL算是當(dāng)時(shí)最好的選擇。
- VB (2-6) - 最容易調(diào)用COM的語(yǔ)言也是做面向?qū)ο蠛芸郆的一個(gè)了。
- C++ - 學(xué)得最差的
- java - 用來(lái)學(xué)面向?qū)ο蟮?/li>
- C# - 算是我最擅長(zhǎng)的,也是做項(xiàng)目最多的
- Php - 只能算是懂一點(diǎn)
- javascript - 我最喜歡的動(dòng)態(tài)弱類型語(yǔ)言。
- css/less - 最讓我頭疼 (有了Less會(huì)好一點(diǎn))?
- html/xml/xslt - 最容易建立方法論的標(biāo)記性語(yǔ)言是最容易建立發(fā)散性思維與抽象思維的工具
- Objective-C 和 Swift - 現(xiàn)在在學(xué)的
感性認(rèn)知
我學(xué)語(yǔ)言的第一步是不看語(yǔ)法的,因?yàn)槊嫦驅(qū)ο蟮恼Z(yǔ)言語(yǔ)法上基本是相似的,而且語(yǔ)法參考會(huì)很長(zhǎng)讀起來(lái)慢(這跟找老婆不要光看外貌是一個(gè)理)。我是從類庫(kù)入手的,從主打的類庫(kù)中可基本上快速了解整個(gè)語(yǔ)言的重要特色和常用的內(nèi)容。就如iOS吧,一入手我會(huì)先看Cococa Layer中的UIKit,花兩小時(shí)看完就知道XCode怎么用了然后就可以做個(gè)簡(jiǎn)單的移動(dòng)應(yīng)用跑一下,從感性上互相認(rèn)識(shí)一下。相互印證
沒(méi)有哪個(gè)語(yǔ)言是沒(méi)有參照物憑空發(fā)明出來(lái)的,就像學(xué)java時(shí)如果學(xué)過(guò)c++會(huì)很快因?yàn)閖ava就是在極大層面上改進(jìn)C++而來(lái)的,學(xué)C#的時(shí)候?qū)W過(guò)java就一下能上手,因?yàn)镃#是微軟沒(méi)買(mǎi)到j(luò)ava自己搞出來(lái)的同時(shí)也去改進(jìn)了java。所以語(yǔ)言之間會(huì)有互通性存在,在學(xué)習(xí)的路徑上可以先了前他們的前輩是誰(shuí),有什么特色通過(guò)雙向的印證了解可以很快速地去掌握與深入理解一門(mén)語(yǔ)言。長(zhǎng)年的積累
掌握一門(mén)語(yǔ)法很快,精通一門(mén)語(yǔ)言就是硬功了。這和我們學(xué)自然語(yǔ)言一樣,詞匯量是日積月累的成果。開(kāi)發(fā)語(yǔ)言的詞匯量就在于類庫(kù)了,每一門(mén)語(yǔ)言的標(biāo)準(zhǔn)類庫(kù)也是夠我們喝一壺的,需要實(shí)踐、學(xué)習(xí)與理解結(jié)合經(jīng)驗(yàn)沉淀成我們的成果。在這方面我給出的建議就是要培養(yǎng)自己的耐心與毅力,羅馬不是一天建成的,高手也不是一天就能修煉出來(lái)的。除了掌握官方類庫(kù)還得將業(yè)界流行的類庫(kù)和框架都能了解與熟悉這才算是“精通”。寫(xiě) - 瘋狂的編碼
“實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)” 能說(shuō)不如能寫(xiě)。學(xué)到的知識(shí)是別人看不到的內(nèi)容,作為程序員或是架構(gòu)師將腦中的精華程序化呈現(xiàn),然后成為產(chǎn)品這才是我們的終極目標(biāo)。 學(xué)會(huì)一門(mén)語(yǔ)言并不代表寫(xiě)得好,作為一名架構(gòu)師寫(xiě)的代碼要求更是不同:- 易讀 - 命名是否符合代碼規(guī)范,所有接口是否全部代碼都有注釋
- 易用 - 每一個(gè)類,每一個(gè)方法都是架構(gòu)師與程序員的UI,少參數(shù),容易理解的設(shè)計(jì)可以大大減少溝通成本。
- 框架化 - 一個(gè)一個(gè)類寫(xiě)是很慢的事,要活用模式于代碼中能同時(shí)構(gòu)建出10幾個(gè)或幾十個(gè)類。
- 參考性 - 架構(gòu)師不是程序員,寫(xiě)代碼為的是固定核心功能與公共用法,便于成員開(kāi)發(fā)。面對(duì)復(fù)雜的場(chǎng)景需要多寫(xiě)示例同時(shí)也是測(cè)試設(shè)計(jì)的易用性的方法。
- 為自己立項(xiàng)從現(xiàn)在起為自己而編碼
- 多寫(xiě)代碼片 - 對(duì)局部的理論進(jìn)行實(shí)踐,多寫(xiě)一些小的代碼片段或?qū)嶒?yàn)程序,而按正式項(xiàng)目一樣來(lái)對(duì)待。完整的記錄,共享源碼獲得Feedback,有良好的注釋。
- 模仿是學(xué)習(xí)與理解新事物的最佳捷徑 — 可以去仿造某些項(xiàng)目,當(dāng)深入其中可以更直接地理解設(shè)計(jì)者的最初設(shè)計(jì)想法,同時(shí)也可以得到一個(gè)仿造品(不是抄,仿造的目的是獲得編碼經(jīng)驗(yàn))
- 嘗試使用模式并控制類的規(guī)模
小結(jié)
架構(gòu)師之路是一條很漫長(zhǎng)而且需要不斷學(xué)習(xí)、思考與實(shí)踐積累的道路。我只是走了這條路的一小段,以此總結(jié)與更多的朋友分享共勉。在下一篇文章中我將會(huì)從另一個(gè)角度來(lái)談架構(gòu)師的修改項(xiàng)目:表達(dá)力。希望有興趣的朋友能給予更多的關(guān)注與反饋。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ray-liang/p/3818385.html
總結(jié)
以上是生活随笔為你收集整理的架构师修练 I - 超级代码控的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汇编小知识
- 下一篇: Linux性能监控命令——sar