畢業(yè)10年,他有話說(shuō)
只有細(xì)節(jié)能夠決定成敗嗎?
6月22日看到很多高校畢業(yè)典禮的新聞,當(dāng)時(shí)也沒(méi)多想。今天想到這個(gè)事,突然意識(shí)到自己09年畢業(yè),到今年已經(jīng)整整過(guò)去10年了。真是歲月如梭、光陰似箭啊。
從大一學(xué)C語(yǔ)言后,就開(kāi)始用C語(yǔ)言寫(xiě)練習(xí),到如今也算寫(xiě)了14年的代碼了。
記得剛工作時(shí),大家討論的內(nèi)容是用table布局呢還是用div布局,10年后的今天再來(lái)看看這些事情,可能自己都會(huì)笑出聲來(lái)。
是啊,10年間變化的不僅僅是技術(shù)的迭代、興起與滅亡。還有人,包括自己在內(nèi),對(duì)很多事物的認(rèn)知、看法或想法都發(fā)生了變化。
剛工作時(shí),總是喜歡關(guān)注細(xì)節(jié),會(huì)為自己又學(xué)會(huì)哪些知識(shí)點(diǎn)或?qū)懗隽艘欢巫哉J(rèn)為還不錯(cuò)的代碼而沾沾自喜。
10年后的今天,我更傾向于從整體上或宏觀上去看待一件事情或一個(gè)事物,甚至去研究它的起因,變化過(guò)程或趨勢(shì),然后嘗試著去推測(cè)它的未來(lái)。
但這并不是說(shuō),我全然放棄了對(duì)細(xì)節(jié)的追求。其實(shí)從宏觀上觀察有時(shí)會(huì)更利于對(duì)細(xì)節(jié)的理解。細(xì)節(jié)在關(guān)鍵時(shí)刻還是很重要的,畢竟有句話叫“細(xì)節(jié)決定成敗。
無(wú)論各行各業(yè),隨著時(shí)間的推移,唯一不變的就是變化,無(wú)非是有的變化的猛烈,有的變化的輕柔罷了。
那么問(wèn)題來(lái)了,“宏觀”和“細(xì)節(jié)”在變化面前,哪個(gè)能夠堅(jiān)持的久一些,或者說(shuō)變化的慢一些?
如果把“宏觀”看作是整體架構(gòu)或結(jié)構(gòu),把“細(xì)節(jié)”看作是實(shí)現(xiàn)方式或處理方法,你會(huì)優(yōu)先關(guān)注哪一個(gè)呢?
細(xì)節(jié)還能決定成敗嗎?能,當(dāng)然能。但是宏觀同樣關(guān)乎著命運(yùn),甚至影響著未來(lái)的走向。
從某種意義上講,宏觀應(yīng)該受到的關(guān)注度更高一些,但至少應(yīng)該和細(xì)節(jié)持平。因?yàn)椤昂暧^”通常和整體結(jié)構(gòu)對(duì)應(yīng),“細(xì)節(jié)”通常和局部處理對(duì)應(yīng)。
整體結(jié)構(gòu)一旦確定下來(lái),后期改起來(lái)很麻煩,因?yàn)闋砍兜降姆矫嫣唷5蔷植刻幚硪蛏婕胺秶^小,后期更換處理方法會(huì)相對(duì)容易一些。
無(wú)論是從理論還是實(shí)踐來(lái)看,實(shí)現(xiàn)細(xì)節(jié)是變化最頻繁的。所以我們應(yīng)該做的是把整體結(jié)構(gòu)設(shè)計(jì)良好,具體某個(gè)地方的實(shí)現(xiàn)細(xì)節(jié)根據(jù)實(shí)際情況而定。
不過(guò)很多人總是會(huì)陷入去關(guān)注細(xì)節(jié),讓細(xì)節(jié)占據(jù)自己的大部分思維,往往忽視了從宏觀整體上的把握,或在此上面投入的精力不夠。
程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法
只要是計(jì)算機(jī)專業(yè)的,或半路轉(zhuǎn)行但愛(ài)學(xué)習(xí)的,都知道這樣一個(gè)公式,程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法。很顯然,這個(gè)公式是老外很早提出的,不過(guò)基本上所有人都是認(rèn)可的。
我之前還看到有老外說(shuō)過(guò),在數(shù)據(jù)結(jié)構(gòu)和算法這兩者中,數(shù)據(jù)結(jié)構(gòu)要更重要一些,它的重要性是要大于算法的。我個(gè)人是比較同意這個(gè)觀點(diǎn)的。
比如,有這樣一道題目,給你一個(gè)單鏈表,要逆向輸出一下。拿到這個(gè)題目后,不管最終如何實(shí)現(xiàn),至少要去想一想。
現(xiàn)在把這個(gè)題目改一下,給你一個(gè)雙向鏈表,也逆向輸出一下。拿到這個(gè)題目后,根本就不用想,直接從尾部向前輸出即可。
可以看到,數(shù)據(jù)結(jié)構(gòu)變了之后,實(shí)現(xiàn)方法一下子就簡(jiǎn)單了很多。所以數(shù)據(jù)結(jié)構(gòu)的重要性是要大于算法的。可以說(shuō)是數(shù)據(jù)結(jié)構(gòu)決定了算法。
就像人們常說(shuō)的,雖然條條道路通羅馬,但有些人一出生就在羅馬。就算你的排序算法再快,都不可能比已經(jīng)有序根本就不用排序的還快。當(dāng)然,這是極限思維的運(yùn)用。
說(shuō)起數(shù)據(jù)結(jié)構(gòu),很多人第一反應(yīng)就是大學(xué)數(shù)據(jù)結(jié)構(gòu)這門(mén)課里講的東西,線性表啊,樹(shù)啊,圖啊等這些。
說(shuō)起算法,很多人也肯定認(rèn)為就是書(shū)上講的那些,冒泡排序啊,快速排序啊,二分查找啊,深度優(yōu)先/廣度優(yōu)先遍歷啊等這些。
怎么說(shuō)呢,這些其實(shí)都是非常學(xué)院派的說(shuō)法,如果是一個(gè)學(xué)生或剛參加工作時(shí)間不長(zhǎng),可以這樣來(lái)理解。
一旦到實(shí)際應(yīng)用當(dāng)中,相當(dāng)于進(jìn)入了工程界,脫離了學(xué)術(shù)圈,很多事情都要重新?lián)Q個(gè)立場(chǎng)或角度去看待。
所以數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的存儲(chǔ)方式或描述方式,我們自己定義的接口啊、類啊這些都叫數(shù)據(jù)結(jié)構(gòu),并不只是List或Map這些才是。
同樣,算法就是指解決問(wèn)題的方法,我們平常寫(xiě)的一些代碼也可以稱為算法,并不只是像排序算法、哈希算法或選舉算法這些才是。
好了,現(xiàn)在可以想一想我們寫(xiě)的程序代碼,大部分都是什么樣子的?不就是定義數(shù)據(jù),獲取數(shù)據(jù),傳遞數(shù)據(jù),操作數(shù)據(jù),存儲(chǔ)數(shù)據(jù)嘛。
定義數(shù)據(jù)就是類,獲取數(shù)據(jù)就是查詢數(shù)據(jù)庫(kù)或從客戶端提交,傳遞數(shù)據(jù)就是本地方法的參數(shù)或遠(yuǎn)程調(diào)用時(shí)數(shù)據(jù)的協(xié)議傳輸,操作數(shù)據(jù)就是各種運(yùn)算/轉(zhuǎn)換/排序等,存儲(chǔ)數(shù)據(jù)就是類對(duì)象或容器對(duì)象或數(shù)據(jù)庫(kù)等。
定義數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)就是數(shù)據(jù)結(jié)構(gòu)呀,操作數(shù)據(jù)就是算法呀,所以,程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法。
如果數(shù)據(jù)結(jié)構(gòu)經(jīng)過(guò)精心設(shè)計(jì),那么算法就會(huì)變得很簡(jiǎn)單,如果再處理好數(shù)據(jù)的獲取與傳遞,那最終寫(xiě)出來(lái)的程序,一定是非常棒的代碼。
不信自己試試看。
軟件 = 邏輯抽象 + 合理實(shí)現(xiàn)
離散的程序代碼可能沒(méi)有太大的意義,但是把它們堆在一起構(gòu)成具有某種功能的軟件就會(huì)產(chǎn)生一定的價(jià)值。所以從微觀上看,軟件就是一堆程序代碼。
從宏觀上看,軟件又分為系統(tǒng)軟件、應(yīng)用軟件和中間件。國(guó)內(nèi)搞系統(tǒng)軟件的應(yīng)該比較少,大部分都是應(yīng)用軟件和一些中間件。但不管什么軟件,最終都是在計(jì)算機(jī)上運(yùn)行的。
那么計(jì)算機(jī)是怎么來(lái)的呢?不是土里長(zhǎng)出來(lái)的,也不是樹(shù)上結(jié)出來(lái)的,更不是某個(gè)物種進(jìn)化的。它是人類的偉大發(fā)明,是抽象出來(lái)的,而且是符合邏輯的。所以在計(jì)算機(jī)的世界里,邏輯和抽象占據(jù)很重要的地位。
那么軟件是怎么來(lái)的呢?可能是產(chǎn)品團(tuán)隊(duì)會(huì)進(jìn)行市場(chǎng)調(diào)研,功能規(guī)劃,界面設(shè)計(jì)和交互設(shè)計(jì)等。嚴(yán)格來(lái)說(shuō)這些只能叫做原型或需求。只有當(dāng)著手和實(shí)現(xiàn)相關(guān)的工作時(shí),才是軟件的真正開(kāi)始。
從程序角度,軟件的實(shí)現(xiàn)都是從邏輯抽象開(kāi)始,無(wú)論是橫向的分模塊還是縱向的分層,或者說(shuō)分子系統(tǒng),只不過(guò)是不同的抽象方法運(yùn)用而已。這個(gè)邏輯抽象是非常非常重要的,凡是存活時(shí)間長(zhǎng)的軟件,都是經(jīng)過(guò)良好邏輯抽象的。
因?yàn)殡S著時(shí)間的推移,所有事物都在變化,良好的抽象更能抵抗變化,或更能適應(yīng)變化,所以活的時(shí)間就會(huì)更久一些。
邏輯抽象是一個(gè)很復(fù)雜的問(wèn)題,里面涉及很多哲學(xué)的思想或權(quán)衡的問(wèn)題。比如,自動(dòng)化程度高的軟件,定制性不強(qiáng),不容易滿足用戶的個(gè)性化需求。定制性強(qiáng)的軟件,必定自動(dòng)化程度不高,會(huì)造成用戶難以上手,不容易普及推廣。
大家想想Hibernate的消亡以及Mybatis的興起,就是一個(gè)定制化大于自動(dòng)化的結(jié)果。Linux用作服務(wù)器操作系統(tǒng),需要專人維護(hù)。Windows用作日常辦公系統(tǒng),每個(gè)人都會(huì)用。平板電腦則走進(jìn)千家萬(wàn)戶,連3歲小孩都玩的很溜。無(wú)所謂好與壞,定位不同罷了。
所以抽象是一個(gè)綜合問(wèn)題,充滿著哲學(xué)、權(quán)衡與取舍。沒(méi)有特別統(tǒng)一的標(biāo)準(zhǔn),也沒(méi)有嚴(yán)格意義的對(duì)與錯(cuò)。只有你更關(guān)注什么,或更期望什么。
抽象完了之后,一定要能合理實(shí)現(xiàn)才行。不能為了抽象而抽象,最后無(wú)法實(shí)現(xiàn),一切不能落地的,都是空談。比如抽象一個(gè)腦機(jī)接口,把大腦和計(jì)算機(jī)連接起來(lái),通過(guò)意識(shí)交流,這恐怕暫時(shí)真的實(shí)現(xiàn)不了。
總的來(lái)說(shuō),就是這樣:
一、合理抽象,劃分好子系統(tǒng)/模塊,定義好功能邊界、交互方式,這樣整體結(jié)構(gòu)非常清晰。
二、精心設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),定義好類或接口,這樣會(huì)使代碼寫(xiě)起來(lái)變的簡(jiǎn)單,而且后期容易改。
三、其實(shí)就是既從宏觀整體把握,又著眼于具體實(shí)現(xiàn)細(xì)節(jié),可稱之為有勇有謀。
當(dāng)然,這是理想情況,實(shí)際上是這樣:
day 1
老板:“來(lái)來(lái)來(lái),我有個(gè)需求給你說(shuō)下”。
我:“好的”。
day 2
老板:“昨天的那種方式不好,按這種方式實(shí)現(xiàn)吧”。
我:“好的”。
day 3
老板:“昨天的那種方式好像還有點(diǎn)問(wèn)題,按這種新的方式實(shí)現(xiàn)吧”。我:“好的”。
day 4
老板:“昨天的那種方式好是好,可能別人一時(shí)不太好接受,要不還是按最開(kāi)始的方式實(shí)現(xiàn)吧”。
我:“好的”。
day 5
老板:“多長(zhǎng)時(shí)間能做好”。
我:“投入5個(gè)人,大概2個(gè)月吧”。
老板:“我給你20個(gè)人,半個(gè)月能弄好吧”。
我:“這個(gè)。。。”。
老板:“哦,對(duì)了,以后再招人,35以上的不要了啊”。
我:“好的”。
咦,莫非老板是在暗示我,因?yàn)槊髂晡揖?5啦。
以上內(nèi)容純屬娛樂(lè),請(qǐng)各位老板不要當(dāng)真哦。
如果大家想要實(shí)時(shí)關(guān)注我更新的文章以及分享的干貨的話,可以關(guān)注我的公眾號(hào)Java3y。
獲取Java精美腦圖

?獲取Java學(xué)習(xí)路線

獲取開(kāi)發(fā)常用工具

?加入技術(shù)交流群

在公眾號(hào)下回復(fù)「888」即可獲取!!

點(diǎn)個(gè)在看
,分享到朋友圈
,對(duì)我真的很重要!!
