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