程序員如何提升算法思維?
持續(xù)學(xué)習(xí),持續(xù)開發(fā),是目前主流 IT 業(yè)界程序員的一個生活常規(guī),在現(xiàn)代技術(shù)迭代速度非??斓那闆r下,只有不斷保持自我學(xué)習(xí)和探索才不會與時代脫節(jié)。無論是專業(yè)的 IT 從業(yè)者還是 IT 小白,都需要培養(yǎng)自己的算法思維。擁有良好算法思維后的直接好處有: 更高的面試成功機(jī)會,和更快的日常問題處理能力。
何為算法思維,并不是對一些已經(jīng)設(shè)計好的優(yōu)秀代碼的反復(fù)背誦和背板,而是自己對于問題的抽象能力的練習(xí),即 從抽象問題到實(shí)際進(jìn)行編碼或者設(shè)計程序解決問題的一個能力 ,如果單純對于一些算法進(jìn)行背誦的話,我們的思維能力不會得到提升,最多就是熟練的碼農(nóng)而已。所以,當(dāng)看到別人設(shè)計的優(yōu)秀算法后,我們一定要探尋算法背后那“曲徑通幽”的思維之路。只有經(jīng)歷了思維之路的磨難,才能永遠(yuǎn)占有一個算法,并有可能舉一反三,或者是設(shè)計一個巧妙算法。
個人認(rèn)為,對于提升算法思維的方法,首先我們需要深入思考各種苦惱的問題,例如:
-
假設(shè)我喜歡租車出行,那么對于某一個地方的停車點(diǎn)一般在什么時候有車的機(jī)率最大?有車的概率是否與天氣,溫度等因素有關(guān)?
-
我希望可以在回家之前通過手機(jī) APP 讓家里的空調(diào)提前工作起來,但是我非常 Geek ,不想使用現(xiàn)成的產(chǎn)品而想自己實(shí)現(xiàn)一個,和同學(xué)吹牛的時候可以更加脫穎而出?
在明確了這些問題以后我們就可以開始思考如何嘗試寫一個小的程序來幫助自己解決,這個時候如果手頭有一個習(xí)慣的語言就非常合適了(比如我個人就喜歡 Python,有很多庫可以使用,而且入門非常容易),如果沒有的話,可以去看看各個語言合適的場景,不過對于 爬蟲、數(shù)據(jù)分析 相關(guān)個人認(rèn)為更加貼合日常生活的項(xiàng)目來看,還是考慮直接從 Python 3 起步比較好,后期如果想用樹莓派做點(diǎn)智能家居相關(guān)的項(xiàng)目的話 Python 也是非常合適的。
對于 Python 的學(xué)習(xí),目前有很多非常成熟的課程,可以覆蓋各個不同的能力范圍,這里著重推薦 Coursera 的視頻課程,配合本地 IPython 或者 LeetCode Playground 一起調(diào)試和練習(xí),可以獲得很好的效果。
舉個栗子
找思路
我們以第一個問題為例,如果你希望了解一個停車點(diǎn)的車輛情況,你需要有一些網(wǎng)絡(luò)知識,了解 APP 和相關(guān)軟件服務(wù)器之間的通訊協(xié)議,當(dāng)了解了具體的接口之后就可以寫一個包含循環(huán)的程序來定時判斷某一個點(diǎn)的車輛數(shù)量信息,這個程序可以用 Python 來完成,涉及到的庫不會超過 2 個,基本就是 requests
json
庫。
一般來說如果要獲取一個數(shù)據(jù),代碼類似如下(通過遞歸的方式獲取一個點(diǎn)的車輛信息):
對于這樣的操作來說,真的只需要 import requests
和 import json
就可以啦~
存數(shù)據(jù)
在得到了對應(yīng)的數(shù)據(jù)之后可以考慮用文件或者數(shù)據(jù)庫的方式把內(nèi)容持久化下來方便之后的分析,此時可以使用 pymongo
庫,寥寥幾行代碼,數(shù)據(jù)就已經(jīng)很好地存儲下來。(此處可參考我們公眾號中之前的文章 《Python+MongoDB——小型程序的利器》 )
在 Python 中引入:
指定數(shù)據(jù)表并連接:
增刪改查:
插入一條記錄:
對外展示
最后,我們考慮對數(shù)據(jù)進(jìn)行可視化(畢竟這些內(nèi)容是要給別人看的),如果只是練習(xí)用的話可以簡單一點(diǎn),考慮 Matplotlib,如果需要對外展示的話,可以試試 Chart.js~
最后,當(dāng)我們完成了這些操作,就可以寫一篇文章記錄一下整個過程,這么做的好處有如下:
-
證明自己的能力可以獨(dú)立從分析到實(shí)際實(shí)現(xiàn)完成一個小的項(xiàng)目
-
吸引相關(guān)同好,通過評論得到一些發(fā)展意見從而優(yōu)化自己的流程
-
記錄這次探索,相當(dāng)于積累了自己的文檔庫
此外,如果你認(rèn)為這類問題具有通用性,可以考慮同時將代碼放到世界最大的同性交友網(wǎng)站——GitHub 上面,不僅能獲得相關(guān)用戶討論,還能在個人社交媒體上進(jìn)行自我宣傳,如果可以吸引到有類似需求的用戶,既可以提升自己 GitHub 帳號的知名度,還可以結(jié)識更多的朋友,激勵自己去創(chuàng)建更多的項(xiàng)目,增加更多的相關(guān)項(xiàng)目經(jīng)驗(yàn),完成一個正向的循環(huán),讓自己更加熟悉:發(fā)現(xiàn)問題,尋找思路,并且解決問題的一個具有算法思維的流程。