談編程中最重要的技能
1.算法與數據結構的本質是啥?
算法(algorithm)在維基百科的定義: A set of instructions, typically to solve a class of problems or perform a computation.(一組指示,通常用于解決一類問題或執行計算。)說白了算法只不過是所說的解決問題的步驟,它們本質上是一個解決方案,不管你有意識沒意識,你或者在引用別人的算法或自己在寫“算法”,你如果覺得自己沒正規學啥算法,好像編程還可以,那要恭喜你,你的邏輯思維和解決問題的Common Sense 還不錯。算法的差別常在于思考的深度,有效性和實踐的檢驗。有些好的解決方法被固化下來給起名為啥算法,如二分查找,Quick Sort, 等。
數據結構(data structure)在維基百科的定義: A data organization, management, and storage format that enables efficient access and modification。(支持高效訪問和修改的數據組織、管理和存儲格式)說白了就是有序的數據安排,可以根據不同維度分類(原始/非原始,線性/非線性,靜態/動態)數據結構就像算法制作食品配方的手。利用數據結構和算法的結合,可以大大提高程序的性能。
2.算法與數據結構的重要性
看到這,你可能會說那編程不是就是用算法加上數據結構來解決問題,實現設計嗎?一點沒錯。算法和數據結構是計算機科學的基礎和本質。圖靈獎得主,Pascal之父世界著名計算機科學家Niklaus Wirth 就說“Algorithms+Data Structures=Programs”
業界領先高科技公司谷歌,微軟,亞馬遜,面書等在面試中都重點關注算法和數據結構,他們認為好的開發員的Identity就是算法和數據結構的純熟掌握,靈活應用和創新產生,Linux 之父Linus Torvalds 也非常強調算法和數據結構的重要性,他認為這就是好壞程序員之間的差別。因為算法和數據結構是解決問題的模式,而雇主們最看重的正是解決問題的思路和能力(HackerRank 2018 軟件調研結果)。
那我們不懂算法和數據結構或知之甚少可不可以還是好的開發員?不大可能。這就好像你去打仗,你的武器庫里空空如也,想要蓋房子,沒有材料。沒有算法和數據結構的知識積累就我們會成為無源之水和無本之木,眼光思路受限,甚至重復造輪子。
隨著科技的進步,算法應用范圍越來越廣泛也越重要:
互聯:Web 搜索、數據包路由、分布式文件共享。。。
生物學:人類基因組計劃,蛋白質折疊。。
計算機:電路布局、文件系統、編譯器。。。
計算機圖形學:電影,視頻游戲,虛擬現實。。。
安全:手機,電子商務,投票機。。。
多媒體:MP3,JPG,DivX,高清電視,人臉識別。。。
社交網絡:建議,新聞源,廣告。。。
物理:N 體模擬、粒子碰撞模擬。。。
好的算法跨行業被應用如 Dijkstra 算法在機器人導引,TCP路由,GPS導航等領域都有廣泛應用。
算法的有效性,在時間復雜度和空間復雜度上可以有巨大差別,例如在一本詞典中找一個詞,你可以一頁一頁的找,你也可以按照索引去找,時間會有很大差異,像 常用的Big O分析 (假設1 GHz CPU,平均可在 1 納秒內執行一條指令)所顯示的差別:
這就是為啥蓋茨認為編程最困難的部分是決定算法是什么,然后盡可能優化和簡化它們,他的合作伙伴保羅.艾倫說蓋茨熱衷于尋求最有效的算法和不多寫一行代碼。這對微軟的代碼文化影響深遠,例如微軟的Paxos算法的實現只有7000+行C++代碼,但幾乎所有微軟的核心云服務在主備倒換時都會用到,你可以看到好的算法和代碼的重要性和影響力。
工程師對通用的算法和數據結構應該有深刻的理解,不是簡單的生記硬背,因為好的算法和數據結構是有普遍性和不隨時間改變,熟練掌握后我們可以舉一反三,觸類旁通。如果我們對算法和數據結構“見多”,它們常會激發我們的靈感和解決思路,使我們“識廣”。
當我們把好的算法和數據結構靈活掌握和應用到我們的產品中,或創造出新的算法和數據結構,就會受到巨大的紅利,使我們主導未來,更加有競爭力。最近看到無線的一個產品通過優化算法和數據結構使960萬個令人觸目驚心的For循環搜索次數減少到256個,近4萬倍的差別:
所以我認為,產品中的不合適的算法和數據結構是一種核心壞味道,對于個人,我們每個工程師都要對算法和數據結構有深刻的理解,做到不斷積累,見多識廣,對代碼的算法和數據結構不斷優化,要做到這一點我們首先不能滿足于搬磚文化,要成為有成長和開放心態,追求極致的工程師,這是另一個話題,以后再說。
編程 算法 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。