為什么大部分程序員都無法成為架構(gòu)師?努力背后的真相
大家是否思考過,為什么大部分程序員很難真正成為一個架構(gòu)師?
他們很多也是好的大學(xué),計算機(jī)科班專業(yè)畢業(yè),計算機(jī)基礎(chǔ)知識技能沒有任何問題,工作也足夠的努力,但是仍然很多人無法真正成為一個合格的架構(gòu)師。
從學(xué)徒到工匠,從工匠到大師,難的往往就是層層躍遷的質(zhì)變點(diǎn)。而真正影響這個質(zhì)變點(diǎn)的,仍然是你個人獨(dú)立解決問題的能力,思維能力的培養(yǎng)。
認(rèn)知升級-從外到內(nèi),從現(xiàn)象到抽象
我前面經(jīng)常會舉對汽車觀察認(rèn)知的例子。即使大部分人實(shí)際并不會去關(guān)心汽車內(nèi)部結(jié)構(gòu)和汽車的運(yùn)行機(jī)理,只需要知道汽車的外部組成,知道如何讓汽車動起來就足夠了。
這個有沒有錯?
說實(shí)話,這個在大部分場景下并沒有發(fā)生過。
人的精力是有限的,你不可能對所有的新事物,新問題都去刨根究底,搞清事物內(nèi)在本質(zhì)。但是回到你自己的專業(yè)領(lǐng)域就不一樣的。
當(dāng)面對你自己的專業(yè)領(lǐng)域的時候,一定要從浪漫派轉(zhuǎn)變?yōu)楣诺渑桑ネ诰蚴挛飪?nèi)在本質(zhì)和運(yùn)作機(jī)理。只有這樣你才可能抽象普適性的規(guī)律,在后續(xù)新問題解決中去應(yīng)用。
當(dāng)你深入問題內(nèi)部的時候,自然將專業(yè)知識的廣度轉(zhuǎn)變?yōu)榱酥R的深度。
而知識深度對你來說才是最有價值的。
一個人能夠解決復(fù)雜問題,往往僅僅是因?yàn)樽约阂娺^,而不是因?yàn)楸旧砭邆淞藛栴}分析和匹配的能力。
對于這類人當(dāng)面臨一個全新的領(lǐng)域,全新的問題的時候往往無從下手。
因?yàn)闆]有掌握一種在自己專業(yè)領(lǐng)域普適性的問題分析和解決方法。
拿企業(yè)的業(yè)務(wù)流程來說,這些流程千變?nèi)f化,但是當(dāng)流程分解后你會發(fā)現(xiàn),所有的流程都是由底層的200到300個原子業(yè)務(wù)活動組裝出來的。對于某一類技術(shù)問題同樣道理,雖然你面對問題都不相同,但是分解后都是共性的原子能力。
一個問題的解決往往涉及三個方面。
- 問題的定義,目標(biāo)的分解
- 你已有的原子能力儲備
- 利用原子能力去匹配并向上整合解決問題
你會發(fā)現(xiàn)問題分解并沒太多難度,真正的難點(diǎn)是在你原子可復(fù)用能力的儲備,其二是這些能力究竟應(yīng)該如何組合。
如何提升這個能力呢?
其一就是每當(dāng)你解決一個新問題后,你會通過復(fù)盤去思考,解決這個問題的方法中應(yīng)該拆分哪些可復(fù)用的經(jīng)驗(yàn)點(diǎn)。
其二是養(yǎng)成周期性深度復(fù)盤的習(xí)慣,即定期的會回顧是否出現(xiàn)過類似的場景或問題,這些問題群或問題列表,我會作為一個問題域來研究,去抽象這類問題分析解決的通用思路。找尋問題抽象后的本質(zhì)屬性。
比如我前面談到過性能問題的解決問題。
當(dāng)你經(jīng)常面對業(yè)務(wù)系統(tǒng)性能問題需要解決的時候,你會發(fā)現(xiàn)類似JVM內(nèi)存模型,查找內(nèi)存泄漏方法工具,Linux進(jìn)程和常用分析命令等都需要學(xué)習(xí)。你也會發(fā)現(xiàn)影響到性能了包括了硬件資源,數(shù)據(jù)庫,中間件,應(yīng)用程序,數(shù)據(jù)量諸多原因。
通過周期性復(fù)盤你才會形成一個通用的性能問題分析和診斷模型。
而不是一遇到性能問題就去重啟服務(wù)器。
對于軟件開發(fā)來說,為何經(jīng)常會強(qiáng)調(diào)去研究和學(xué)習(xí)一些主流開源軟件的源代碼,也是同樣的道理。程序員要走向架構(gòu)師,一定要從軟件開發(fā)表象走向內(nèi)在原理和運(yùn)作機(jī)制的研究,知其然并知其所以然。
很多程序員為何每天都在做簡單的CRUD增刪改查功能,原因也是相同的。大部分人并不去思考事物的內(nèi)在運(yùn)行本質(zhì)。
一個最簡單的CRUD功能也涉及到開發(fā)框架和基礎(chǔ)類庫,那么能否對這些內(nèi)容進(jìn)行研究,了解一個軟件功能實(shí)現(xiàn)出來的內(nèi)部原理。同樣,任何一個CRUD功能也涉及到高可用和高性能,那么能否對相關(guān)的數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)一步研究等。
在多年前我當(dāng)項(xiàng)目經(jīng)理的時候,對團(tuán)隊(duì)里面的開發(fā)人員進(jìn)行觀察,也是同樣的道理。
一個大的業(yè)務(wù)系統(tǒng)往往分解為了多個業(yè)務(wù)功能模塊,但是大部分人往往只熟悉自己的功能模塊,對其它模塊一無所知。而少量的人往往是自己花時間去熟悉整個系統(tǒng),熟悉自己主管的各個模塊,并去了解各個模塊之間的協(xié)同關(guān)系。
跳出盒子很多時候不是技術(shù)問題,而是思維意識問題。
不是要求所有的人都能夠探求事物內(nèi)在原理和本質(zhì),但是如果你要實(shí)現(xiàn)技能階層躍遷,那么必須從外走向內(nèi),從現(xiàn)場到本質(zhì)。
從萬物窮盡到能夠總結(jié)出一套適合自己的規(guī)律和方法論。
大項(xiàng)目實(shí)踐的機(jī)會,可遇不可求
如果我們說微服務(wù)架構(gòu)框架,你如果原來本身就對Java軟件開發(fā)熟悉。
那么你可能花1到2周的時間就能夠采用開源的SpringCloud搭建好微服務(wù)開發(fā)框架,并對里面的注冊中心,網(wǎng)關(guān),限流熔斷,鏈路監(jiān)控,安全等都進(jìn)行自我測試和驗(yàn)證。
當(dāng)然你也可以將微服務(wù)框架應(yīng)用到你當(dāng)前開發(fā)的小產(chǎn)品中。
那么這樣持續(xù)2到3年,你能夠算對微服務(wù)架構(gòu)精通嗎?
顯然不能。
其最大的一個原因就是當(dāng)你的項(xiàng)目沒有達(dá)到一定規(guī)模,實(shí)際的業(yè)務(wù)系統(tǒng)沒有達(dá)到一定的用戶數(shù)和并發(fā)量的時候,很多架構(gòu)層面的應(yīng)用問題你根本就無法遇到。
典型的包括了應(yīng)用性能問題,復(fù)雜Bug的快速定位排查,安全問題,應(yīng)用本身的高可用問題等。這些內(nèi)容實(shí)際你很難通過理論學(xué)習(xí)完全掌握。
海量高并發(fā)架構(gòu)設(shè)計的書你可能看了很多,即使書里面也會講到一些關(guān)鍵經(jīng)驗(yàn)點(diǎn),但是你原來沒有實(shí)踐遇到過,你并不會產(chǎn)生共鳴,這些書里面的經(jīng)驗(yàn)總結(jié)并不會因?yàn)槟汩喿x了書籍就直接轉(zhuǎn)換為了你自己的內(nèi)在經(jīng)驗(yàn)。
理論的學(xué)習(xí)無法轉(zhuǎn)變?yōu)槟阕约旱慕?jīng)驗(yàn),唯有實(shí)踐。
你只有通過大項(xiàng)目的實(shí)踐,在實(shí)踐過程中通過不斷地遇到新問題,解決新問題,你的技能和經(jīng)驗(yàn)才能夠不斷提升,并最終轉(zhuǎn)換為你自己的經(jīng)驗(yàn)?zāi)J健?/p>
沒有大項(xiàng)目實(shí)踐,實(shí)際你很難完成這種轉(zhuǎn)變。
沒有大項(xiàng)目實(shí)踐,即使你把所有的微服務(wù)技術(shù)原理的書全部看了,但是無法在實(shí)際項(xiàng)目中應(yīng)用,最終仍然會逐步遺忘,這些知識并不會轉(zhuǎn)變?yōu)槟銉?nèi)在經(jīng)驗(yàn)?zāi)J健?/p>
所以當(dāng)你有這種大項(xiàng)目機(jī)會的時候一定不要放過,如果在一個企業(yè)多年也沒有這種機(jī)會你也可以考慮是否找 一個新的工作機(jī)會去鍛煉。
我在前面寫過很多私有云PaaS平臺,SOA架構(gòu)設(shè)計,平臺性能優(yōu)化,SOA治理方面的文章,這些文章總結(jié)本身即來源于大項(xiàng)目實(shí)踐。
通過大項(xiàng)目實(shí)踐,你才有機(jī)會提升你這塊的架構(gòu)設(shè)計能力。要明白架構(gòu)設(shè)計過程本身也是一個迭代演進(jìn)的過程,沒有最優(yōu)的架構(gòu),只有面對當(dāng)前場景最適用的架構(gòu)。
就拿我們SOA項(xiàng)目一個接口服務(wù)運(yùn)行實(shí)例日志存儲。從最開始的數(shù)據(jù)庫分表,再到Solr全文建設(shè),再到轉(zhuǎn)到HBase的分布式存儲庫,本身就是基于場景不斷演進(jìn)的過程。
架構(gòu)設(shè)計一定不是你懂搭建某個技術(shù)框架,這不能叫架構(gòu)。
真正的架構(gòu)是你面對業(yè)務(wù)場景和問題領(lǐng)域的時候采用最佳技術(shù)方案去解決問題的能力。
要做到這點(diǎn)。
- 其一是要熟悉你所在的業(yè)務(wù)場景和業(yè)務(wù)流程。
- 其二是能夠?qū)⒓夹g(shù)能力匹配到業(yè)務(wù)上。
總結(jié)為一句話就是模式應(yīng)用能力,即當(dāng)你面對不同的業(yè)務(wù)場景和問題域的時候,應(yīng)該采用什么最合適的技術(shù)來解決。你需要的是這種匹配能力。
真正的實(shí)踐過程就是不斷地去提煉這種可復(fù)用的匹配能力。