很多同學(xué)和朋友經(jīng)常向我抱怨說,算法已經(jīng)成為他們學(xué)習(xí)和工作中的一個負(fù)擔(dān)。在他們看來,算法只能應(yīng)付一下考試,在學(xué)習(xí)中沒有任何用處;也有人說,求職過程中考算法純粹是浪費(fèi)精力,在實(shí)際工作中沒有用到任何算法。
在我的本科四年中,花了大量時間學(xué)習(xí)算法,參加算法比賽——成績很濫,朋友們都說,和我的付出嚴(yán)重不成比例,但是我一點(diǎn)也不后悔花費(fèi)時間學(xué)習(xí)算法。算法讓我在平時的學(xué)習(xí)中應(yīng)對各個科目都從容自如,學(xué)習(xí)起來事半功倍。
在平時的學(xué)習(xí)交流中,有時看其他人的代碼相當(dāng)別扭,不是看不懂(有時真看不懂),而是很納悶,為什么要這么寫呢,明明有很明顯的順暢的思路,干嗎要寫這么繞呢?我將我覺得正確的思路寫出來的時候,對方也會覺得這樣寫順暢了很多,代碼也小了很多。
在一般應(yīng)用中,不會說讓你寫一個KMP算法,或者給你設(shè)計(jì)一個動態(tài)規(guī)劃的題目讓你來解。但是如果你會這些算法,掌握了這種優(yōu)化的思想,在平時的編寫中會不知不覺的寫出比較高效的代碼。
有人說,現(xiàn)在中國的軟件現(xiàn)狀就是這樣,不在乎你實(shí)現(xiàn)的有多快,只會在乎你有沒有實(shí)現(xiàn)所有的功能點(diǎn),隨著硬件條件的改善,一般情況下都能滿足要求。這樣說也是沒錯,如果你甘愿只做一名碼工,因?yàn)閷τ谙喈?dāng)大的一部分軟件,效率并不是最重要的,甚至第二、第三重要都排不上。但是對于企業(yè)級的應(yīng)用和軟件的核心部分,往往效率是非常重要的。
如果將編程和寫作類比的話,可以進(jìn)行這個的比較。編程必須會語言C/C++、Java、Python等,寫作也一定要會一個語言漢語、英語、法語,當(dāng)然計(jì)算機(jī)語言有效率的優(yōu)劣以及適合的應(yīng)用的場景,而自然語言沒有這種屬性。算法修養(yǎng)之于編程就像文學(xué)修養(yǎng)之于創(chuàng)作,沒有一定的文學(xué)修養(yǎng)就寫不出好的作品,同樣沒有良好的算法修養(yǎng)也創(chuàng)造不出好的代碼。數(shù)據(jù)結(jié)構(gòu)就像寫作中的排比句等,它們是骨架,結(jié)構(gòu)化編程就像是寫作中的段落,它們使得層次分明。
在靜靜的夜晚,明月透過窗子,照進(jìn)小屋,頓時一種異樣的情懷涌上心頭。這時有下面幾種人,第一種,嚎啕大哭,“媽媽……”;第二種,潸然淚下,“我嚓,想家了是不”;第三種,沉思狀,“有首詩可以表達(dá)這個情懷”,拿起全唐詩,查找了整晚,夜盡天明時,驚呼“找到了,原來是‘舉頭望明月,底頭思故鄉(xiāng)’啊,我記得有的。”;第四種,徘徊低吟“舉頭望明月,底頭思故鄉(xiāng)”;第五種,心中油然而生,“獨(dú)在異鄉(xiāng)為異客,明月千里寄鄉(xiāng)思”。
同樣地,這也反映了一個程序員算法修養(yǎng)的幾種境界。第一種,菜鳥,不會表達(dá)自己的思想,這種多見于初學(xué)語言的人,只會寫hello world之類程序的人;第二種,入門,可以表達(dá)出自己的想法,但是不懂什么算法,只是憑自己對計(jì)算機(jī)語言的理解寫程序,當(dāng)然寫出的程序功能點(diǎn)可能不少,但是不完善,潛在的bug很多;第三種,有一定的算法基礎(chǔ),但是沒有掌握完全,寫程序時有高效的意識,對一些核心程序,看著資料也能寫出相應(yīng)的代碼,但是不能活學(xué)活用;第四種,有不錯的算法修養(yǎng),寫出的代碼清晰高效,可勝任關(guān)鍵代碼的編寫;第五種,有很高的算法修養(yǎng),理解了算法的精髓,自己可以得出算法供世人學(xué)習(xí),一般是大師級人物。國內(nèi)有相當(dāng)一部分程序員就是處于第二階段,他們也有穩(wěn)定的工作,甚至不錯的收入,但是總感覺遇到了瓶頸,自己的能力躊躇不前。
有人說,現(xiàn)在各種庫都有,那些代碼都非常高效,我只要熟練使用這些庫就行了,不用學(xué)習(xí)算法??梢赃_(dá)到熟練使用幾個庫的程序員也算是第三階段,但是要想熟練駕馭更多的庫,將庫函數(shù)熟練的使用,沒有一定的算法基礎(chǔ)是不行的。比如,如果你想熟練使用STL庫,那么對各種容器和算法都應(yīng)該有一定的認(rèn)識,什么時候使用list,為什么快排不能應(yīng)用于list?要想回答這些問題,必須掌握初步的算法。
對于想要在技術(shù)上有一定作為的程序員,沒有算法修養(yǎng),就如同金庸小說中的學(xué)武之人不學(xué)習(xí)內(nèi)功,它可以將外功學(xué)的爐火純清,憑著這份功力可以走遍半個江湖,但是一旦遇到高手就掛了;反之如果有內(nèi)功修為,學(xué)習(xí)外功可學(xué)一知十,觸類旁通,內(nèi)功修為越高將來的成就越大。
學(xué)習(xí)算法吧!