1. 程式人生 > >在職程式設計師再學演算法的深刻感悟

在職程式設計師再學演算法的深刻感悟

一位已經在職程式設計師在再次學習演算法中,在方法上遇到了上點麻煩,他給我來信,併為他出了一些主意,見《一道演算法題引起的疑惑——如何“畫”演算法(附免費視訊連結)》。
  隨後,他真的打通了這個環節。更難得的是,他在這一段時間內,已經進入到了一個新境界。從學習中的認知層次角度,他已經從上大學時,圍繞著能應對考試的那種表層的學習,進入到了真正思考學習內容的意義,並且能夠感知和調控自己的學習方法和過程的深度的學習中了。
  這是一個人能在這個終身學習的時代立足的基本條件之一。
  徵得他的同意,將他給我寄來的學習體會分享出來供讀者參考,在【】中加些我的批註。

【分享他的來信】
1.需要幾個指標,初始位置是什麼,如何在迴圈體中移動。而且各種特殊情況都要考慮到,比如連結串列為空,只有一個節點等等。

【要對程式的流程有個很好的感知,同時,要對“邊界”敏感一些。】

2.陣列和連結串列是很多資料結構的基礎,使用二者來實現更高階的資料結構(看jdk原始碼)。
  3.遇見陌生的東西不要有懼怕心理。正是拉取已有知識的好機會。

【這是一種很健康的成長心態。】

4.積累的東西,不能用完就扔了,成為身外之物。要在現有的基礎上不停的積累,提高,內化為自己的能力和潛意識。

【不要試圖一下子就學會,“滾雪球”式的成長,是最好的。】

5.查漏補缺,如何查漏補缺?看的時候需要注意什麼?對知識點的重新覆盤,不熟的東西熟悉,和已有的熟悉的東西聯絡起來,形成知識網路。透徹理解,能給別人講出來,能自己動手寫出程式。目的是學以致用。

【多種學習的手段,組合拳輪流上。】

看以前學過的內容,會發現有新的東西、不理解的東西、貌似以前遺漏的東西,會感覺不爽,覺得是自己以前學得不好導致的。這是自己一直存在的一個很大的問題。

【揪著“以前學得不好”不放,會讓自己走不動。放下這份自責,腳步就輕鬆了。】

首先,要明確一點,不是自己學得不好導致的,知識就是在學習的過程中不斷加深理解和完善的,像添磚加瓦一樣。在遇到這種情況時候,不能否定自己,要輕鬆愉悅地吸收知識點,和以前所學聯絡起來,讓知識點更加牢固,這就是持續精進的過程,如果否認這個過程的合理性,就是認為一個知識點都是一次就學的很完善,這是完全不符合實際的。急功近利的表現。每看一次,都不能白看,讓知識點更加牢固,這就是你的目的。以後腦子裡要有構建知識網路的意識。

【學習,和軟體產品一樣,是在“迭代”中逐漸完善的。將眾多的知識點,不斷產生聯絡,構建自己的知識網路,這是學習中最重要的事。】

當你感覺不適、不想學的時候,有可能就是你的不好的慣性思維在作怪,這時候需要反觀自己的思維過程。

【在“學會學習”的過程中,這樣的反思,促進自己思考學習,從而指導再後面的學習。這是“關於學習的學習”,是“學習(動詞)學習(名詞)”,教育學中,將其稱為“元認知”。】

6.看連結串列的時候,size和head陌生,這說明以前就沒有整體思路-全域性觀,只不過是寫著程式順下去了。以後需要改變:不要寫一遍寫一遍,寫了多次還不知道整體思路,所以每次寫的時候感覺手生。

【寫一遍是手段,在頭腦中形成理解和記憶,這是目標。】

搭架子,往裡面填充細節。終於找到手生的原因了,下一步就是在實踐中解決它。

【有價值的體驗!】

7.在做專案的時候有意識的儘量窮盡知識,用到實際中去。如果用不上,是知識體系搭建的不好,不知道往那個知識點對應。零零散散的知識點不好運用起來。

【要主動建構知識網路。常說的“記不住”,很多時候問題出在“調不出來”,這需要建網路,給自己更多的“提取線索”。】

8.搭建知識網路的重要性。

【好感悟!】

9.演算法:先考慮一般情況寫出演算法,然後利用特殊情況來修正。如果報空指標錯誤,大多數情況是邊界條件的問題。如果有多個指標,後面的指標可以考慮在迴圈體重進行首次賦值。

【我的回信】
  進步怎麼可能有這麼大?感悟怎麼能有這麼深?從認知理論的角度,你已經進入到了用”元認知“指導自己學習的層次了。這樣的總結很有意義。
  就這樣先在技術上鑽研,你將同時收穫一份比技術更有價值的財富。
  這些思考,我可以在部落格上分享嗎?

【他的回覆】
  嗯嗯,賀老師,可以的。
  以後我把學習過程的疑惑、經歷、思考和收穫持續傳送您。
  現在經常看您的帖子,受益匪淺,要是讀大學的時候就能發現您的帖子,現在就是另一番模樣了,相見帖子恨晚。