前言
不錯的好書,作者本身是從事JAVA為主茁瘦,但以從業(yè)15年的角度看待計(jì)算機(jī)語言的發(fā)展史,有個概括通俗易懂的角度來講述編程方面的知識。
程序員的精進(jìn)
對技術(shù)的好奇心/興趣是一切的基礎(chǔ)扒怖。
如果你看到新技術(shù)、新產(chǎn)品沒有像小孩看到新玩具那樣兩眼放光业稼,沒有立刻在自己的電腦上試試的沖動盗痒,你就需要仔細(xì)考慮一下是否真的對軟件開發(fā)有興趣。如果根本沒興趣低散,那不要浪費(fèi)時間俯邓,還是趁早轉(zhuǎn)行,有更多適合你的職業(yè)在等著你熔号。沒有好奇心稽鞭,就不愿意追本溯源,追求技術(shù)的本質(zhì)引镊。
沒有好奇心朦蕴,就難以靜下心來,耐得住寂寞弟头,遠(yuǎn)離浮躁吩抓,更難以跨過這個行業(yè)所帶來的種種挑戰(zhàn),走到架構(gòu)師這個位置亮瓷。
沒有好奇心琴拧,就不愿意學(xué)習(xí)新技術(shù)。一名架構(gòu)師嘱支,如果沒有對技術(shù)的敏感度和前瞻性一直抱著一套技術(shù)架構(gòu)不變蚓胸,估計(jì)很快就會被淘汰挣饥。很多人會語法,也懂框架沛膳,但是在基本功上卻不過關(guān)扔枫,因而只能在初級程序員上踏步。
這個基本功的訓(xùn)練就是數(shù)據(jù)結(jié)構(gòu)和算法锹安,我的經(jīng)驗(yàn)是多做習(xí)題短荐,讓這種思維在腦子里固化,以后的編程就可以信手拈來了叹哭。計(jì)算機(jī)的組成原理忍宋、操作系統(tǒng)、編譯原理风罩、計(jì)算機(jī)網(wǎng)絡(luò)糠排、數(shù)據(jù)庫、匯編語言超升,把這些知識融會貫通入宦,打通任督二脈,在我們的腦海里建立一幅計(jì)算機(jī)運(yùn)算的圖景室琢。
計(jì)算機(jī)軟硬件的基本思想在這幾十年里其實(shí)變化不大乾闰,如緩存、增加抽象層等盈滴。有了這些基本思想的武裝涯肩,去學(xué)習(xí)新的東西不但學(xué)得快,而且理解得會更透徹巢钓。要透徹地理解一門技術(shù)的本質(zhì)宽菜。公司里基本上不會有空閑的時間,一個個新需求壓得大家透不過氣來竿报。偶爾有空閑時間铅乡,大家也都犯懶了,總是想著休息烈菌。
慣性的力量是驚人的阵幸,大家都愿意待在舒適區(qū)里,不愿意變化芽世,雖然也看到了新工具的好處挚赊,但大家都懶得換新的。
抽象能力
- 把亂無頭緒的需求抽象成一些“概念”济瓢,在概念的層次進(jìn)行思考荠割,用于系統(tǒng)的設(shè)計(jì)
- 把紛雜的事物抽象到數(shù)學(xué)層面是最高的抽象。但是抽象成數(shù)學(xué)模型和算法通常是可遇而不可求的,在這種情況下蔑鹦,我們需要退而求其次夺克,試圖抽象成若干個正交的概念,以此來降低復(fù)雜度嚎朽。
- 抽象能力的訓(xùn)練沒有捷徑铺纽,就是經(jīng)驗(yàn)的積累,勤于思考和學(xué)習(xí)哟忍。
例如: 學(xué)習(xí) Java Web開發(fā)的可以思考一下為什么Spring有Controller狡门、ViewResolver這樣的概念?學(xué)習(xí)Android的可以思考一下Android是怎么對未知的锅很、紛繁復(fù)雜的應(yīng)用程序進(jìn)行抽象的其馏?為什么有 Activity、Service爆安、 BroadcastReceiver尝偎、ContentProvider 這四大組件?
學(xué)習(xí)相關(guān)
自認(rèn)為掌握了一門技術(shù)鹏控,其實(shí)并沒有真正掌握,大腦只是對這個技術(shù)點(diǎn)建立了一個整體的概念肤寝,在一些細(xì)節(jié)處做了想當(dāng)然的假設(shè)当辐,等到你用語言再來表達(dá)的時候就會發(fā)現(xiàn),原來這個假設(shè)并不完全成立鲤看,是有問題的缘揪。
如果你能把一門技術(shù)通俗易懂地給別人講明白,那就說明你已經(jīng)掌握了义桂。這種“轉(zhuǎn)教別人(Teach others)”的辦法屬于主動學(xué)習(xí)找筝,效率是最高的。
既然沒法給別人講慷吊,那就退而求其次吧袖裕,把自己的理解寫出來。技術(shù)文章溉瓶,不是泛泛地記流水賬急鳄,或者把幾個孤立的點(diǎn)羅列在那里,而是要把思路厘清楚堰酿,尤其要寫出為什么要有這門技術(shù)疾宏、這門技術(shù)解決了什么問題,然后才是這門技術(shù)是怎么使用的触创。當(dāng)你逼著自己去回答這些問題的時候坎藐,很快就會發(fā)現(xiàn),自己的理解還不夠哼绑,還需要查找更多的資料岩馍。
在網(wǎng)上查找資料過程中碉咆,整理資料和思考的過程是很珍貴的,只有這樣才能把信息變成你自身的知識兼雄。
如果實(shí)在搞不定吟逝,就帶著問題去論壇提問,去QQ群發(fā)言赦肋,找大牛請教块攒,總是可以解決的。
網(wǎng)上的大部分文章都是復(fù)制佃乘、粘貼的囱井,大部分都在講述怎么使用,對于“為什么”從來都是只字不提趣避,或者猶抱琵琶半遮面庞呕,羞羞答答地不說出來。不把自己的理解寫出來程帕,很容易放棄深度思考住练。你會覺得,我已經(jīng)知道是怎么回事兒了愁拭,然而其實(shí)一些關(guān)鍵的細(xì)節(jié)被大腦給忽略了讲逛。寫作會逼著你去思考,梳理知識體系岭埠,防止自己被碎片所填滿盏混。
其實(shí)很多人都知道寫作是一件很好的事情,就是犯懶惜论,執(zhí)行不下去许赃。還是行動起來吧!逼自己一把馆类,對自己狠一點(diǎn)混聊!有自制力的人、能夠堅(jiān)持的人才更有可能成功乾巧!
我們已經(jīng)進(jìn)入了一個碎片化的時代技羔,我們的大腦已經(jīng)養(yǎng)成了碎片化的習(xí)慣,一天不看碎片化的信息就覺得不舒服卧抗,這樣下去會慢慢地喪失深度思考的能力藤滥。優(yōu)秀和平庸的差別可能就是那一點(diǎn)點(diǎn)堅(jiān)持吧!堅(jiān)持不懈地做一件事社裆,每天前進(jìn)一點(diǎn)點(diǎn)拙绊,最后量變會發(fā)生質(zhì)變。
每個季度定一個小目標(biāo),努力達(dá)成标沪,獲得成就感榄攀,就能刺激自己更進(jìn)一步,改善半途而廢的毛病金句。
代碼相關(guān)
發(fā)現(xiàn)工作中的“痛點(diǎn)”,并且真正動手解決它給公司帶來價值檩赢。這是提高自己,讓自己和別人區(qū)分開來的重要方法。
大部分人只會抱怨項(xiàng)目很無趣违寞、沒有挑戰(zhàn)遇到問題也只會安于現(xiàn)狀贞瞒。面向?qū)ο蟮拇a由于是針對接口編程的,所以每當(dāng)你去找接口實(shí)現(xiàn)的時候是比較費(fèi)勁的趁曼,比起直接的面向過程代碼讀起來是一個不小的障礙军浆。
重構(gòu)必須有測試,先有測試用例再重構(gòu)挡闰,重構(gòu)的過程就是一個重新學(xué)習(xí)的好過程
框架是一個半成品乒融,是無法獨(dú)立運(yùn)行的,必須由開發(fā)人員按照它定義的規(guī)則摄悯,把項(xiàng)目的代碼放置到指定的地方赞季,由框架整合起來,這才是一個完整的應(yīng)用程序奢驯。是前輩們把各種經(jīng)驗(yàn)固化下來的最佳實(shí)踐
現(xiàn)在很多 Java Web Spring MVC申钩、 Hibernate、 MyBatis ixf這樣的流行框架構(gòu)造起來的叨橱,框架不得不學(xué)。但是如果只會使用框架断盛,只會填充代碼罗洗,那只能是一名HTML填空人員。
你如果對Java后端編程感興趣钢猛,那還有很多東西可學(xué)伙菜。用框架實(shí)現(xiàn)了業(yè)務(wù)只是很小一方面,還有系統(tǒng)架構(gòu)設(shè)計(jì)命迈、緩存贩绕、性能、高可用性壶愤、分布式淑倾、安全、備份等很多內(nèi)容征椒。你學(xué)得越多娇哆,就會發(fā)現(xiàn)無知的領(lǐng)域更多,所謂學(xué)無止境,就是如此碍讨。關(guān)于遺留代碼的見解
你別看我們的代碼爛治力,它可是在生產(chǎn)環(huán)境下運(yùn)行的代碼,每天有無數(shù)用戶在用勃黍,經(jīng)歷了這么多年的嚴(yán)酷考驗(yàn)宵统,已經(jīng)把系統(tǒng)中方方面面的Bug,尤其是一些深層次的Bug暴露得差不多了覆获,也改得差不多了马澈。之前看到了很多FiⅸBug這樣的注釋,每個注釋和對應(yīng)的修改都是無數(shù)前人心血和時間的結(jié)晶锻梳,這里面有多少加班和熬夜你知不知道箭券?你如果從頭再來,能保證考慮到這么多種情況嗎疑枯?能保證把邊邊角角辩块、犄角旮旯的東西都包括進(jìn)去嗎?
每個程序員都夢想從頭寫一個東西荆永,不愿意讀別人的代碼废亭,甚至同行相輕,瞧不起別人的代碼具钥。但實(shí)際情況是豆村,自己重寫一遍,不見得能比現(xiàn)在已經(jīng)運(yùn)行的代碼好到哪里去骂删,甚至更差掌动!除非你了解了所有的細(xì)節(jié)用大量的時間仔細(xì)規(guī)劃、小心編程宁玫,但是現(xiàn)實(shí)中哪有時間讓你這么玩按只帧?
測試相關(guān)
那些不存在的或者難以new出來的對象(比如訪問數(shù)據(jù)庫的對象欧瘪、訪問網(wǎng)絡(luò)的對象)可以使用Mock工具( EasyMock Jmockit等)來“造假”眷射。
優(yōu)秀的單元測試:
(1)單元測試是“白盒測試”,應(yīng)該覆蓋各個分支流程佛掖、異常條件妖碉。
(2)單元測試面向的是一個單元(Unit),是由Java中的一個類或者幾個類組成的單元芥被。
(3)單元測試的運(yùn)行速度一定要快欧宜!
(4)單元測試一定是可重復(fù)執(zhí)行的!
(5)單元測試之間不能有相互依賴拴魄,應(yīng)該是獨(dú)立的鱼鸠!
(6)單元測試代碼和業(yè)務(wù)代碼同等重要猛拴,要一并維護(hù)!如果測試代碼需要很復(fù)雜的setup才能開始測試蚀狰,說明業(yè)務(wù)代碼接口的設(shè)計(jì)很有問題
單元測試的關(guān)鍵愉昆,在于如何處理遺留代碼。
其它
領(lǐng)域特定語言( Domain Specific Language麻蹋,DSL)跛溉,專門為某個領(lǐng)域而定制的語言
Maven,通過約定大于配置的概念扮授,形成自動化Build環(huán)境
JAVA動態(tài)生成代理類的方法有兩種:
第一種是使用Java動態(tài)代理技術(shù)芳室,這種技術(shù)要求業(yè)務(wù)類必須有接口(Interface)才能工作;
第二種是使用 CGLib刹勃,只要業(yè)務(wù)類沒有被標(biāo)記為 final就可以堪侯,因?yàn)樗鼤梢粋€業(yè)務(wù)類的子類來作為代理類。三次握手:
第一次握手:京城發(fā)信荔仁,縣衙收到了伍宦,此時縣衙就會明白,京城的發(fā)信能力和自己的收信能力是沒問題的乏梁。
第二次握手:縣衙發(fā)信次洼,京城收到了,此時京城就會明白遇骑,京城的發(fā)信和收信能力都是沒問題的卖毁,縣衙的發(fā)信和收信能力也都是沒問題的。但是縣衙還不知道自己的發(fā)信能力如何落萎,所以需要第三次握手亥啦。
第三次握手:京城發(fā)信,縣衙收到了练链,其實(shí)第二次握手的時候京城已經(jīng)知道雙方的收信翔脱、發(fā)信能力都是沒問題的,這次回應(yīng)的目的只是消除縣衙對自己的發(fā)信能力和京城的收信能力的擔(dān)憂而已兑宇。-
程序編譯的過程: