學用結合——回覆一位在工作中補基礎的工程師
【前言】
一直有聯絡的一位職場新人發來他近日的工作、學習感想。很真實,真實也讓我學到不少。在回信中,是在迴應他的問題,也在說我的事情。
和以往不同,先晒回信,再登原信。
【迂者回復】
抱歉,現在不常看郵件,今天才看到。
你說得老毛病,看得我也後背發涼,何嘗不也是我的呢?生而為人,本性中有的,我們要接受。也只有接受,再加上時有覺察,才是真實逐漸改變要走過的路。所以,當有這個覺察之時,向著未來真心歡喜,而不是回到過去自責。
學習可以是快樂的,前提是,需要我們選擇快樂的方向。向著想要的那個樣子前行,發覺偏了,就感激這一刻的覺察,讓自己再回軌道。有時候,原先設定的軌道有些歪,校正一下軌道也是可能的。
你這段時間”系統地“學演算法是需要的,但在工作的同時學習,只要做到在工作中有意識地用,聯絡總會來,不要著急。再者,越是底層的東西,常了用了而不知。比如,一位老司機,一邊神吹,一邊熟練的開車,他會想什麼時候踩了離合,什麼時候打了轉向嗎?這點上完全不用自責。
在學習過程中,遺忘很正常。在學習的初期,”為學而學“是可以接受的,因為你真的沒有太多的背景可以聯絡上。這也就不要寄希望於對一個知識點,一下子就搞通了。不僅不現實,深層講,這不合乎認知規律。一遍過去了,認真地學,以當前的理解功力,達到什麼程度算什麼程度,再有機會回頭看,功力已經長進,視野已經開擴了,方法已經精進了,回頭看就又牽出更大的空間。
就回復這些,每天充實度過,這就是好的。若是更多是清楚地充實度過,那只是更好。
【來信】
賀老師好,近日又解決了自己一個非常大的問題,持續前進中。
1.老毛病又犯了,腦子又開始胡思亂想了,排了那麼多要學的東西,腦子裡就每一個清晰的排期和計劃嗎,也沒有階段性的目標嗎,為啥不能持續地平穩地徐行。計劃、排期、目標也是模模糊糊的,有時候是想到什麼學什麼,很容易被打亂計劃或者是偏離初始的問題。如何改變現狀呢。
目標、方向、計劃,需要詳細的,就像程式般詳細精密。一份付出,一分收穫,不要假裝愛學習,這樣騙的了別人,騙不了自己。不要時不時地回到以前的狀態,吃虧的是自己,紮紮實實地徐行,給自己制定清晰可執行的目標和計劃。
2.賀老師的話:“著手去寫,寫出一個,就會有第二個,寫不出,由簡到難,堅持寫下去。積累夠一百行,就是到一千行的基礎和希望所在,到了一千行,在想一萬行,這時候已經是海闊天空了。制定目標和計劃也是一樣,嘗試著按這種方式去做。思維方式可以在更高的層面上知道我們學知識、用知識,這是我們再進一步應萬變的基礎。不過,也要看出,所謂思維方式也是在學知識過程中逐漸形成的,所以不要忽略在思維方式形成過程中知識的積累,要更加註重在學習過程中多問一些為什麼,多找一些資料,發現這些知識是怎麼來的,這樣會讓你學得更好,學到更真的知識,得到能用得上的技能。”
以前以為只要有思維就能夠戰勝一切,就是非常牛逼的,完全忽視了知識的積累。思維是在知識積累的過程中形成的,而不是以前自己的那套憑空想出來的很空很虛的東西。
3.資料結構是一種數學模型,解決非數值計算問題,數值計算問題用數學方程式解決。資料結構可以用ADT(抽象資料型別)描述,ADT是指一個數學模型(資料結構)已經定義在該模型上的一組操作。
所以ADT算是資料結構+演算法。程式=資料結構+演算法。
4.但在抽象資料型別定義的13種操作中,串賦值StrAssign、串複製StrCopy、串比較StrCompare、求串長StrLength、串聯接Concat以及求子串SubString等6種操作構成串型別的最小操作子集。在看jdk原始碼的時候也會發現,很多函式都是呼叫最小操作子集的函式實現的。這是一種思想,以後自己寫程式碼的時候也要注意,去構建最小操作子集,函式累加。
去構建自己熟知的最小操作集,這樣遇到問題就從這個集合裡去尋找並組合。
5.知識遷移、舉一反三的能力不行,上面學完的連貫性的東西下面不知道去用,比如今天學資料結構中的串,上面學完了Index(S,T,pos)演算法(應該是串的匹配),下面接著是replace(String& S, String T, String V)演算法,下面的這個演算法用到了上面剛學完的演算法,很方便,這就是不停的構建累加最小操作集,然後使用的例子。但是自己卻完全沒有想過去用,沒有覺察到一絲一毫的聯絡,而是去用了最笨的方法,一個一個的去往後遞推,非常low。這是自己實踐中一直存在的又一個很大的問題,學過的東西不知道動腦子主動用上,過一段就忘了,很多東西都是學過跟沒學過一樣,一遍又一遍的。以前總是耍小聰明,貪多求快,腦子裡只是有個模模糊糊的印象,就認為自己很懂了,要徹底地改變這種模式,多實踐,實踐才能發現更多的問題。原因:上一個例子沒有徹底想明白,只是把例子看懂了,能把例子寫出來了,但是卻沒有想例子的使用場景,核心是什麼,都能解決什麼問題,變形一下又能解決什麼問題。只是為了學而學,而不是學以致用,舉一反三。
6.工作中也是不求進取,不想著去優化程式碼,只是在用api實現業務流程,而且是很low的api。重視基礎和細節。
7.同時,對覺察自己也不能模模糊糊,也要步驟清晰,展現細節。把這些狀況定義好,出現這種問題應該怎麼辦,裝在腦子裡,出現的時候要能夠馬上去解決。
8.學習的目的是什麼?想過嗎?不能學完就完了,到底學的咋樣自己知道嗎?既然搭時間進去了,想過如何做的更好嗎?
9.演算法為啥精妙?因為每一步都很重要,方方面面都要考慮到,一個值變化了要考慮聯動效應。
10.看經分專案前後端互動的時候,感覺前端很複雜,很冗長,看不下去,看的時候也暈暈的,在這種情況下還想一下子看懂,短時間內看懂,而且自己沒這方面的基礎,所以不可行,不科學,這樣只會讓自己一遍又一遍匆忙的看,看一遍看一遍卻沒有效果,只會讓自己更加慌張,無所適從。這是自己學很多陌生東西的模式。慌亂、亂撞、沒有成效。一步一步來,一口吃不了胖子,把壓力分攤,給自己定短時間的小目標,把大任務切割成小任務,今天就只看一個頁面,不要看其他的,只要把柱形圖看懂就行,其他的都不要想,不要管。慢一點,把之前的積累湧上來,步步為營。不要不看、不想、不思考,就像搞懂,誰也沒那麼神。
study then and how to use。—嘗試了一天,效果不錯
11.上班的時間工作,看專案。週末和晚上才能看演算法。學東西抓本質的話,其實就沒多少東西了,抓住核心了才能去發散,凡事皆如此。—慢慢有感覺了。
12.多實踐,多發現問題,多解決問題。把學和用緊密聯絡起來。