從實力的角度出發來思考這道AOP題目

戎"碼"一生發表於2021-06-12

文/楠木大叔

技術更迭,一往無前。技術人總是要不斷學習以適應社會的發展和行業對我們的要求。每隔一段時間,就會有紛至沓來的新技術,新知識,新概念,我們應該如何應對,是被逼到牆角,還是主動出擊?

導讀

  • 從一道小題說起
  • 空杯心態
  • 不下水,就學不會游泳
  • 漫無目的的學習純屬浪費時間
  • 沒有深度思考的學習就是自嗨
  • 只輸入不輸出的學習就是耍流氓
  • 天下武功,為快不破
  • 萬物即可為題
  • 結語
  • 參考

人之為學有難易乎?學之,則難者亦易矣;不學,則易者亦難矣。——《為學》

從一道小題說起

作為一個技術出身的碼農,我總是對小鎮做題家是嗤之以鼻的。然而,經歷多年的學習和工作洗禮之後,我似乎又從小鎮做題家身上看到一些不一樣的東西,那就是做題是一種相對靠譜的學習方式。特別是近年來,在新技術的學習上,我逐漸開始認可和實踐這種方式。各位客官先不要反駁,請聽我慢慢道來。




筆者在學習SpringAOP的時候,非常認真的地研讀過《Spring實戰》一書中關於AOP相關知識點,也參閱過相關技術部落格文章並在實踐中有過應用,相關文章可查閱筆者文章:

自認為已經能夠基本理解AOP的概念和應用場景,但是直到遇到這道題,筆者才發現自己對Spring AOP的理解其實依然浮於表面。

儘管類似的例子在《Spring實戰》這本書上有涉及,如下


但是在大多數的技術博文中亦或是整理的面試考點中,基本都是摘抄書本術語和總結一些概念居多(當然能夠沉下心來去讀懂原始碼的同學請繞行)。這就會給新手們一種錯覺,AOP思想不過如此。

AOP的相關術語

  • jointpoint(連線點):是指那些被攔截到的點。在spring中是指方法,因為spring只支援方法型別的連線點。
  • pointcut(切入點):對哪些joinpoint進行攔截
  • advice(通知/增強):攔截到的jionpoint所做的事情。方法層面的。
    • 前置通知
    • 後置通知
    • 異常通知(丟擲異常)
    • 最終通知(無論如何都執行)
    • 環繞通知(方法執行的前後都通知,甚至可以阻止目標方法執行)
  • introduction(引介):特殊的通知,類層面的。
  • target(目標物件):代理的目標物件
  • weaving(織入):把增強應用到目標物件來建立新的代理物件的過程
  • proxy(代理):被AOP織入增強後產生的結果代理類
  • aspect(切面):切入點+通知的結合
    • advisor:一般的切面,advice本身就是一個切面,對目標類所有方法進行攔截
    • PointcutAdvisor:代表具有切點的切面,可以指定攔截目標類哪些方法
    • IntroductionAdvisor:引介切面

短短總結,其實涉及了眾多知識點,如果沒有仔細品讀和思考,恐怕是很難吃透的。所以,筆者反思,平時閱讀和學習新知識的一些問題,很多時候容易大而化之,停留表面——畢竟技術書籍不像小說,可以快速閱讀完。有時候自認為理解了,實則不然。知識點其實需要一個載體來承載,比如一個實際應用實戰,或者一道理論題目。否則就是紙上談兵,無法落地。技術的學習本身是理論和實踐結合的。所以,要想多快好省的學習,筆者推薦通過理論學習,並結合做一些實戰性強的題目。這樣的目的如下:

  • 快速熟悉各種應用場景
  • 檢驗理論知識
  • 聚焦

空杯心態

你就像這隻杯子一樣,裡面裝滿了自己的看法和成見。如果你不先把杯子空掉,叫我如何對你說禪呢?

南隱是一位禪師。一天,一位學者來向他問禪,但自己喋喋不休。南隱則默默無語,以茶相待。他將茶水注入這位客人的杯子,滿了也不停下來,而是繼續往裡面倒,眼睜睜看著茶水不停地溢位杯外。客人著急地說:“已經滿出來了,不要再倒了!”

南隱說:“你就像這隻杯子一樣,裡面裝滿了自己的看法和成見。如果你不先把杯子空掉,叫我如何對你說禪呢?”。

"空杯心態"是我最近幾年比較愛提及的一個詞,學習新知識,對新手來說,是沒有思想包袱的,但是對於老鳥,建議空杯心態,否則容易沉迷過去的知識體系,走彎路。

不下水,就學不會游泳

絕大多數的人,面對陌生事物,往往會懷有畏懼感。

我沒有接觸過PS,那麼如果讓我去設計一個海報,就會心生畏懼。我沒有用過Java,讓我去寫Java的專案,我總是處於觀看而不敢親自下去寫...

過去的數年中,筆者長時間從事C#專案研發,但是最近兩年由於工作專案的需要,需要學習Python,Java等語言。這裡以學習Java為例。

筆者學習Java真的是一波三折,不敢說自己有多大期望,就是希望能夠做一個小小的網站。第一次想學Java,大概是16~17年左右,因為沒有人指導,必然是要走彎路的,在windows上從搭建環境到跑起來第一個spring web的hello,world,足足花了一週多的時間。有興趣的朋友可以去看那篇紀實文章

出師不利,被Spring的各種配置虐的一無是處。然後更多的是看書,再加上沒有在實戰中應用的需求,基本放棄使用。幾年後,無獨有偶,遇見另外一個技術還不錯的同事,他也剛好有這段經歷,不過他當年他堅持了一週都沒有把Spring跑起來,令人唏噓。

去年,因為工作原因又開始使用Java,此時Springboot已經大行其道。便又開始投入Sprigboot的學習中,沒話說,Springboot的確是大大降低了學習門檻。有了實際應用場景,加上工作的方面的推進,這一次真正開始上手了,基本熟悉了整個專案搭建和開發流程,總算能夠獨立完成一個網站的開發和部署。

面對一個陌生領域,大部分人總是會有畏難心理,左顧右盼,甚至無從下手。這個時候,你只需要考慮是否有學的價值,如果有,那麼就毫不猶豫的先幹起來,否則,從心態上你就會選擇躺平。

漫無目的的學習純屬浪費時間

漫無目標,無書不讀的人,他們的知識是很難精湛的。

"好讀書,不求甚解",這也許是陶淵明先生的自謙的說法。普通人,特別是技術人真不要仿效。技術工作及其嚴謹,差之毫釐,謬以千里。學習上來不得半點馬虎。

我很欽佩熱愛學習的人,他們博覽群書,對新技術總是第一批嚐鮮的人。但是也有另一種,喜歡讀書,但是很盲目和無目的。

我有一個很愛學習的同事,在公司,中午就會看書,下班回到家也看,公司組織團建出去也看。但是我最近留意了一下,半月過去,我發現他的閱讀進展並不是很快,依然還停留在半個月前的那個章節。很多企業都會組織讀書會,就是大家建一個群,組織有興趣的同事一起讀書,群裡相互監督,固定時間打卡。筆者曾經供職的一家公司,老總親自搞了一個52讀書班,什麼意思呢?就是每個人一年要讀52本書,平均下來就是一週一本書。最後完成目標的人會授予獎章,當然是有人完成的。所以,從這個角度來看,我這個同事讀書效率是極低的。甚至這種不連續性還會帶來興趣的熱度的下降,最終半途而廢。

如果您確實有充足的閒散時間,那麼您隨心的讀書總比刷手機娛樂八卦強。但如果您是真正想學習的人,特別是學習新技術。因為這種學習的結果只有會和不會,對於技術人來說半瓶水和小白沒有沒有本質區別。

艾賓浩斯遺忘曲線表明,遺忘在學習之後立即開始,最初的遺忘速度很快,隨著時間的推移,遺忘的速度逐漸下降,達到一定速度後就不再遺忘。


所以,當你決定要學習的時候,一定要給自己有個規劃,要有里程碑,要有截止日期。一定要保持學習的連續性和連貫性。

沒有深度思考的學習純屬自嗨

學而不思則罔,思而不學則殆。

學習的渠道和資源從未如此豐富。記得多年以前,我們在各大技術群裡提問總會有人幫你解答,但不知從什麼時候開始,"不懂就問百度"成了一種神回覆。


你想學什麼技術,網路上總能找到相關學習資源。但是,伴隨而來的可能是更多參差不齊的搜尋結果。新手無法辨別搜尋結果的信度,走點彎路還好,但是時間卻實實在在浪費了。

所以,在學習新知識的時候,官網和原著優先。合理利用網路資源和相關輔助教程,技術部落格等。同時切記隨大流,盡信書不如無書。

對於一些較為晦澀的技術知識點,你就算閱讀一百遍也不一定能夠理解,只有從場景的角度出發去深度思考,才能理解和吃透。

在沒有深度思考之前你會覺得的自己無所不能,在深度思考之後,你會覺得自己只是勉強入門。

不以輸出為目的的學習都是耍流氓

學習,是指通過閱讀、聽講、思考、研究、實踐等途徑獲得知識和技能的過程。

沒有結果的學習本身就沒有意義,在終身學習的時代,在技術知識發展日新月異的時代,很多知識和技能一樣是有生命週期的。你今天學習了某個新知識,獲得了一項新技能,3~5年之後,這項技能可能在行業裡面已經沒有用武之地了。

學習是一個過程,需要投入人力,物力,時間和金錢,一切沒有結果的學習都是毫無意義的。那我們如何來分辨我們是否是真的努力呢?答案就是——輸出,輸出,大量的輸出,用作品說話。你總不能說我學會了,但就是做不出來吧!這不就是耍流氓嗎?

一鼓作氣,趁熱打鐵

若有恆,何必三更眠五更起;最無益,莫過一日曝十日寒。

除了少數天才,學習新知識本來就不是一件快樂的事情。懶惰,拖延是人的本性,能夠長期堅持學習的絕非常人。所以當我們開始要學一個知識或新技能的時候,不管是外部還是內部的驅動,一定會有"三分鐘熱度"。

比如,人工智慧時代已經來臨,行業壓力讓你覺得不學習就有失業風險。所以,你想學習Python來適應時代的發展。你買了教材,甚至還訂閱了相關的線上視訊課程。

剛開始,你全身都是勁兒,教材,安裝開發環境,甚至還訂閱了相關的線上視訊課程,忙得不亦說乎。這種熱度一般不會太持久,除非你的領導要求你學習,並在工作中使用。否則,沒人能保證這個熱度是否能夠堅持到週五。

筆者的建議,要充分利用這個三分鐘熱度,快速把構建專案並跑起來,做一個能夠有一定價值的demo,持續互動。比如,一個爬蟲,一個可以用在工作中的自動化工具等。

一方面趁熱打鐵,一方面有成就感,同時也輸出了。

萬物即可為題

前面筆者提到,知識點其實需要一個載體來承載,比如一個實際應用實戰,或者一道理論題目。否則就是紙上談兵,無法落地。

過去在高校,我們學習都會有考試題目,那些題目更加理論化,屬於"背多分"型別。但是進入工作崗位,特別是技術工作崗位,這就行不通了。因為技術工作不僅要強調過程,還要強調結果,只有過程和結果都對才是完成。

一直以來,前輩們都在強調動手實踐的重要性,但是往往忽略了新手們並沒有代入感。舉個例子,所有人都明白學好英語的方式就是多說口語。但是實際上大多數都是“啞巴式英語”,道理都懂,語法倍兒棒,就是沒法落地。

所以,題目一定是理論和實踐相結合的,一定是符合實際應用場景的。這樣的題目,才具有代入感,否則就是為學而學。

選擇性的刷一些高質量的技術題目,絕對是提升認知的,並且事半工倍。


2021-06-12 於天府軟體園

結語

以上只是筆者個人對學習技術的一點看法和思考,一家之言,姑妄言之姑妄聽之。歡迎大家共同探討和文明交流。

參考




相關文章