ARTS-2020-05-31 Review: 快速提升編程能力的關鍵

https://github.com/LiuKay/the-way-to-upgrade/blob/master/ARTS/ARTS-2020-05-31.md

1 Algorithm

最近兩週刷了一些 Leetcode 上 ArrayList 相關的基礎題

(leetcode 中英文切換可以直接將https://leetcode.com/XXX改爲https://leetcode-cn.com/XXX跳到對應題目)

1.1 比較有代表性的題

Array:

List:

1.2 思路清奇的題解
1.3 刷題總結

正在實踐 覃超推薦的“五毒神掌”–五遍刷題法,有時間做題目的時間比較分散,往往會忘記做題的時間,所以應該還是得記錄一下每天做了什麼題,按照時間線來進行復習。

在這兩週的做題中發現一些固定的模式,

  • 一是雙指針法的使用,要理解清楚每個指針的作用是什麼,以及何時會改變,還有邊界在哪裏
  • 解題的過程應該是從簡單的思路開始,再到慢慢優化出最佳方案,有時間看到一個題目,直覺裏有一個比較模糊的解法,但是在實現的過程中就會忘記一些必要的條件和限制,而這樣的限制可能是在最直接的解法裏面最明顯的。
  • 左右兩邊往中間逼近的策略,如 contain water,有點讓我想起高數裏面的"夾逼準測"
  • 升維的思想,比如雙指針其實是一種 一維上二維的思想
  • 空間換時間。時間和空間是算法裏面最重要的2個維度,當然在目前來看時間的效率更爲優先。
  • Discuss區的最高投票裏面總能看到各路大神的精彩解答

2 Review

The Key to Accelerating Your Coding Skills - KEN MAZAIKA

作者的個人主頁:https://kenmazaika.com/about/

作者在這篇文章中說明了快速提升編程能力的關鍵點

2.1 起步階段:
  • 學習領域相關知識(domain-specific knowledge),比如用 Ruby怎麼寫循環,用代碼從數據庫讀取特定數據, 這方面的知識往往與具體的編程環境相關
  • 要成爲一個自學自足開發者的第一步就是能夠完成具體的任務。
  • 對初學者來說,最重要的技能是能夠關注細節,一是能夠讀懂錯誤信息,能夠Debug error message, 知道發生了什麼,二是能夠從每一個你犯的錯誤中去學習,當下次再遇到的時候就能夠快速的解決
  • 善用 Google 進行搜索
  • 你永遠不可能知道所有的知識來解決所有的問題,要保持終生學習的態度

當下面這些情形發生的時候,說明你已經度過起步階段進入下一階段了:

  • 當你遇到很多錯誤信息時你已經不在像開始時那樣害怕,反而能夠知道怎麼去解決他們
  • 當你十分擅長通過搜索引擎來尋找解決方案
  • 當你能夠從曾經寫過的代碼中來學習,而不是從頭開始一步一步的重新來過
2.2 轉折點

這個階段稱爲The Inflection Point, 雖然只是整個學習過程的一部分,但卻是最重要的一個階段,因爲在這個階段你將要面對的是那些沒有現成答案的問題。

很多時候你會覺得自己並沒有準備好,而且傾向於去做一些基礎性的工作,比如一些Get started工作。這個階段你甚至會懷疑自己是不是真的適合做一名開發人員。一個很重要的原因是:

During the inflection phase, you will be coding 10-20 times SLOWER than in the previous phase

在這個轉折點上,你的編碼速度將會比入門時慢10到20倍

儘管在感覺上你會覺得自己進步很慢,甚至自我懷疑,但是實際上,你其實在那些最重要的事情上取得進步。

這裏作者引出了相對於domain-specific knowledge 的另一種知識:procedural knowledge

Procedural knowledge is the ability to teach yourself what you don’t know along the way.

簡單來說就是在學習過程中如何自學自己不知道的東西的能力。比如你要實現一個新的功能,你該如何開始,如何設計,如何實現?

對於開發者來說,domain-specific knowledgeprecedural knowledge同樣重要。

作者給出了對開發者的中肯建議:

For the rest of your life, go outside your limits every single day

對於很多工程師來說,他們一旦找到自己的舒適區就會裹足不前,他們大多數以維護者的身份出現。而你應該追尋的是那些每天都在尋找突破自己能力限制的人,嘗試去解決那些在你技術棧之外的問題,以此來擴展你的技能。

2.3 兩個拐點
  1. The web development inflection point

    你有能力構建任何數據庫驅動的系統 ,我們通常來說叫掌握了CRUD

  2. The algorithm and data structures inflection point

    算法和數據結構,掌握數據結構和算法意味着掌握了某一門編程語言的基本知識,以及操縱數據和能夠理解一些性能上的取捨

2.4 關於拐點的結論

When learning to code,domain-specific knowledge doesn’t matter in the grand scheme of things

當學習編碼時,domain-specific knowleage其實並沒那麼重要,真正重要的是:

  • 你對 web 開發框架有一個紮實的理解
  • 能夠掌握用任何一種你所熟悉的語言寫出複雜算法的實現

這裏作者用各大廠爲什麼如此看重算法和數據結構來舉例說明,真正重要的東西其實就是這2樣。

2.5 在拐點你將學會的

對於開發者來說,最好的參考就是你曾經寫過的類似的代碼,當你完全理解了你所寫的東西,你根本不用去記他們,所以每次開發一個新的功能時請先反問一下自己 :“我是不是寫過類似的代碼?”如果是,請翻出以前的代碼並逐行解釋給自己,現在是否能夠重用?

2.6 高效通過拐點的策略

During the tutorial phase, take breaks from going over structured material and give yourself challenge problems along the way

  • try to do something that is outside the scope of the tutorial - 儘量做一些超出入門教程的嘗試
  • Try to use tutorials as little as possible - 少使用輔導教程,多參考 GitHub 文檔
  • Focus on the essentials and use repetition - 刻意練習,重複練習

通過拐點是一件很有挑戰性的事,理解這些能夠幫助你更好的學習:

  • 明白這個階段本身就是困難和不那麼輕鬆的,
  • 明白在這個階段其實是在跟你自己的信心做鬥爭,你的感受其實很常見,想想那些比你牛的人
  • 持續的努力,但是不要過度透支自己
2.7 如何知道自己已經通過拐點

The final stage of the inflection point process is acceptance. Acceptance that software
development is a process of continuous learning

終於明白編程其實是不斷持續的學習,去解決更爲複雜的問題。

學習是爲了找到方法,而不是問題的答案。

3 Tips

Typora + PicGo + Gitee 完全使用Markdown 寫作

Typora 是一個所見即所得的 Markdown 編輯器,支持 Windows, Mac 等,用它來進行 markdwon 寫作簡直不要太爽。但是衆所周知 markdown 寫作的一個問題就是圖片鏈接,在本地寫作時,插入的鏈接可以是本地圖片的路徑,這就導致了在需要發佈文章的時候,需要手動將圖片上傳到圖牀上去,然後替換爲網絡地址。所幸的是 Typora 也幫我們解決了這個問題。 Typora 本身不支持上傳圖片,但是它支持使用第三方的圖牀工具,比如我們這裏要用到的 PicGo

PicGo 是一個強大的開源的圖牀工具,支持各大圖牀如騰訊雲COS, 七牛雲等,甚至還能使用 GitHub 作爲圖牀倉庫,上傳圖片自動返回圖片鏈接到Typora

在安裝好了 PicGo 之後,進入 Typora 的偏好設置->圖像->上傳服務設定選定 PicGo 的安裝程序即可。

te

需要注意的是,如果使用 GitHub 作爲圖牀,由於網絡原因有時候圖片可能出現無法顯示的問題,這個時候其實可以替換成以Gitee(碼雲)作爲圖牀,需要在 PicGio 安裝github 的一個插件,如下圖,配置和 github 類似,可以參考 PicGo 的使用文檔,這樣在國內的環境下圖片顯示還是很穩定的。

PicGo插件

可以參考這篇文章進行 Gitee 作爲圖牀的配置以及 PicGo 的官方文檔, 這些地方都有詳細的教程,我就不再贅述。

Gitee圖牀+PicGo+Typora便捷在博客中使用圖片

PicGo

4 Share

在我看來作爲一名軟件開發者,應該是有最基本的職業素養的,而不是說只要功能能跑就行了,這當然是最低的標準,但是如果僅僅只是滿足於功能能跑就行,那也只能在日復一日的重複勞動中度過。

工程師也應該站在客戶的角度去理解問題,即所謂的business value,你所做的工作到底能夠給用戶帶來多大的價值,這是公司評判你貢獻的標準,如何提高這方面的輸出,纔是公司願意給你高薪的理由。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章