https://github.com/LiuKay/the-way-to-upgrade/blob/master/ARTS/ARTS-2020-05-31.md
1 Algorithm
最近兩週刷了一些 Leetcode 上 Array
和 List
相關的基礎題
(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 knowledge
和precedural knowledge
同樣重要。
作者給出了對開發者的中肯建議:
For the rest of your life, go outside your limits every single day
對於很多工程師來說,他們一旦找到自己的舒適區就會裹足不前,他們大多數以維護者的身份出現。而你應該追尋的是那些每天都在尋找突破自己能力限制的人,嘗試去解決那些在你技術棧之外的問題,以此來擴展你的技能。
2.3 兩個拐點
-
The web development inflection point
你有能力構建任何數據庫驅動的系統 ,我們通常來說叫掌握了CRUD
-
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 的安裝程序即可。
需要注意的是,如果使用 GitHub 作爲圖牀,由於網絡原因有時候圖片可能出現無法顯示的問題,這個時候其實可以替換成以Gitee(碼雲)
作爲圖牀,需要在 PicGio 安裝github
的一個插件,如下圖,配置和 github 類似,可以參考 PicGo 的使用文檔,這樣在國內的環境下圖片顯示還是很穩定的。
可以參考這篇文章進行 Gitee 作爲圖牀的配置以及 PicGo 的官方文檔, 這些地方都有詳細的教程,我就不再贅述。
Gitee圖牀+PicGo+Typora便捷在博客中使用圖片
4 Share
在我看來作爲一名軟件開發者,應該是有最基本的職業素養的,而不是說只要功能能跑就行了,這當然是最低的標準,但是如果僅僅只是滿足於功能能跑就行,那也只能在日復一日的重複勞動中度過。
工程師也應該站在客戶的角度去理解問題,即所謂的business value
,你所做的工作到底能夠給用戶帶來多大的價值,這是公司評判你貢獻的標準,如何提高這方面的輸出,纔是公司願意給你高薪的理由。