如果編程是一門“藝術(shù)”,那么編程語言就是工具统扳,而“藝術(shù)”的根在哪里喘帚?
我在初學(xué)編程的時候,是以一門課程來學(xué)習的咒钟,記得非常清楚吹由,第一門編程語言學(xué)的是匯編,那個時候沒有人告訴我朱嘴,編程到底是什么倾鲫,我們只是想將它學(xué)好,按照教科書上的內(nèi)容萍嬉,找參考資料乌昔,將所有參考資料上的例子全部實驗一遍,尋找哪里有錯誤壤追,詢問老師磕道,當時老師也是很努力的給我們解決實際過程中遇到的問題,可是行冰,當我們學(xué)完了以后呢溺蕉?考試結(jié)束了伶丐,伴隨而來的也是這門語言的遺忘,為什么焙贷?因為缺少了應(yīng)用撵割、缺少了核心的理解。
第二門語言也是以課程的形式學(xué)習的辙芍,C啡彬,這門語言比匯編容易一些,至少能夠去理解一些故硅,但是庶灿,考試結(jié)束了伴隨而來的是什么?還是遺忘吃衅!同樣是因為缺少了應(yīng)用和核心的理解往踢。
這種情況持續(xù)了很久很久,當時我和我的同學(xué)們基本上看不到希望徘层,因為我們不知道我們到底學(xué)了什么峻呕,我們不知道我們將來畢業(yè)以后能干什么?難道就是這樣畢業(yè)嗎趣效?
直到我們學(xué)了算法瘦癌,我當時有一種感覺,在黑暗的森林中跷敬,看到了曙光讯私,終于看到了希望,因為我明白了一個道理西傀,語言是算法的一種體現(xiàn)斤寇,在設(shè)計的過程中,核心內(nèi)容為算法拥褂,工具為語言娘锁。這個時候又出現(xiàn)了另外一個問題,計算機是機器肿仑,只認01致盟,我們?nèi)绾巫層嬎銠C理解我們的內(nèi)容,并且存儲尤慰?當時詢問老師,老師回答:“回去找數(shù)據(jù)結(jié)構(gòu)的書看雷蹂,看完以后再來找我伟端。”我遍尋圖書館匪煌,借來5本參考書责蝠,如饑似渴的讀党巾,我記得當時我每天只睡3到4個小時,那個時候真的是有點得到了武功秘籍一樣的感覺霜医。讀完了以后齿拂,我好似打通了任督二脈,終于明白了編程的根本肴敛,也終于明白了為什么編程是一門“藝術(shù)”署海!
如果說編程是一門“藝術(shù)”,是因為編程是優(yōu)雅的與機器交互医男,從而讓機器解決現(xiàn)實問題砸狞,能夠更好的解決人力發(fā)展的局限性。簡單來講:我們制造出來機器镀梭,為了替代我們?nèi)祟惾ソ鉀Q一些問題刀森,而如何讓機器工作,就是編程的“藝術(shù)”报账!
如果說編程語言是工具呢研底?是因為人類的語言與機器的語言是互不相通的,而你要讓機器去解決問題透罢,必然要通過一種工具使得人類與機器能夠交互榜晦,這就是編程語言的工具。
“藝術(shù)”的根琐凭,在于算法與數(shù)據(jù)結(jié)構(gòu)芽隆,這些是是計算機的根本,因為算法解決了如何讓機器做的問題统屈,數(shù)據(jù)結(jié)構(gòu)解決了存儲的問題胚吁!算法中的優(yōu)化問題,能夠處理問題的速度更加迅速愁憔、或者更加符合業(yè)務(wù)腕扶。
打開UC瀏覽器 查看更多精彩圖片
編程語言是在不斷的發(fā)展的,在每一個階段吨掌,會有一個階段的王者半抱!
跨度大一點,我們討論完“藝術(shù)”的問題膜宋,再來討論一下工具的問題窿侈。什么是工具,工具就是為了解決我們現(xiàn)實中遇到的一個問題秋茫,使得更加簡單史简、方便、高質(zhì)的一個可以使用的物體肛著。從進化學(xué)的角度來講圆兵,工具也是區(qū)別于人與動物的根本跺讯。人為什么既無尖牙也無利爪的情況下,還可以處于食物鏈的頂端殉农?就是會使用個工具刀脏。那么編程也是一樣的。人為什么能夠命令機器超凳,因為咱有工具愈污!
那么,既然是工具聪建,就必須要符合這個社會的需要钙畔,需要不斷進步,根據(jù)社會的條件而進行更新?lián)Q代金麸。編程語言也是一樣的道理擎析。比如:在計算機發(fā)明出來的時候,計算機算力以及存儲是很寶貴的挥下,編程語言要求盡可能的節(jié)省存儲于算力揍魂,這是硬件的要求,你沒地方說理棚瘟。就好像是遠古社會现斋,每天人類都吃不飽,你還考慮穿衣的內(nèi)容嗎偎蘸?穿暖就行了庄蹋,不考慮樣式;現(xiàn)在解決掉了溫飽問題迷雪,對于穿衣限书、吃飯也就提出了要求,要吃的好章咧、穿的美倦西!這是社會發(fā)展的必然,沒什么奇怪的赁严。那么扰柠,這就會出現(xiàn)一個問題,編程語言這個工具是如何進化呢疼约?其實也是相同的道理卤档,比如:C,面向過程程剥,極大程度上節(jié)省硬件資源裆装,同時由于是面向過程,所以邏輯上更加清晰倡缠,使得機器在運行過程中效率很高哨免。為啥,因為在C的廣泛應(yīng)用的時候昙沦,那個時候計算機硬件是相當昂貴的琢唾,你沒事不可能上一個現(xiàn)在的超級計算機上去,沒有盾饮!所以只有節(jié)約采桃,高效。那現(xiàn)在呢丘损?比如:python普办,效率比C低很多,但是無所謂徘钥,為什么衔蹲?因為現(xiàn)在很多地方對于計算機算力及存儲要求的不高,很多都是過剩的呈础;但是對于開發(fā)效率以及迭代效率要求的比較高舆驶,因為現(xiàn)在是一個高速的時代,你慢了就有可能被替代而钞!所以誕生了偏向開發(fā)高效的一些語言沙廉!你能說這些語言不好嗎?并不是臼节,只是適應(yīng)社會發(fā)展而已撬陵。同樣也是工具在進步而已。
這里我用一個比喻我覺得比較恰當:好比是農(nóng)民伯伯種地用的鋤頭网缝,一開始巨税,農(nóng)民伯伯由于體力優(yōu)先,因此他會去優(yōu)化鋤頭頭途凫,優(yōu)化鋤地動作垢夹,讓鋤地更加的方便,高效维费,從而節(jié)省體力果元,能夠干更多的工作。因為這個時候農(nóng)民伯伯的體力是有限的犀盟,也就是說而晒,計算機算力是有限的。(鋤頭好比是編程語言阅畴,鋤頭頭和鋤地動作好比是數(shù)據(jù)結(jié)構(gòu)與算法倡怎。) 那么,現(xiàn)在我們出現(xiàn)了機械化,從某種意義上講监署,我只要加油颤专,就可以耕地,那么钠乏,我們考慮問題就會轉(zhuǎn)變栖秕,轉(zhuǎn)變?yōu)椋胰绻嗟母囟@得更多的收益晓避,因為有了機械化簇捍,我加油就可以了。這就是工具的提升(機械化是編程語言)俏拱。但是暑塑,這里面有一個問題,你再機械化锅必,是不是也得需要一個類似于鋤頭的東西在耕地事格?這就是根。 如果再繼續(xù)推理下去况毅,所謂的算法是分蓖,我的這個鋤頭用什么樣的力量鋤下去湾戳,用什么角度鋤下去良风,能夠耗費的能源最少籽懦,獲得的收益最高规辱,這就是算法的優(yōu)化内边,也是算法的根介汹。那么數(shù)據(jù)結(jié)構(gòu)是什么意思呢骂铁?我的這個鋤頭的 頭用什么樣的材料睛竣?用鐵余佛?用銅柠新?還是用其他金屬?能夠使得這個鋤頭用的時間最長辉巡。 這就是計算機的根恨憎。
打開UC瀏覽器 查看更多精彩圖片
既然是工具,那么如何能夠?qū)W好呢郊楣?
這是一個很高深的課題憔恳,很多人會告訴你,你要多練净蚤,沒錯钥组,多練是根本,我這里就不再贅述了今瀑〕堂危可是我們要理解一個問題点把,這個問題是,僅僅是多練就可以了嗎屿附?
相信大家都看過一本書《天龍八部》郎逃,里面有個角色叫虛竹,到最后厲害吧拿撩?可是之前他如何呢衣厘?換句話說,僅僅是多練压恒,沒有很好的方法,沒有理解是絕對不行的错邦,因為招式的厲害是一時探赫,當你不再年輕,體力不再好撬呢,那么伴隨而來的是什么呢伦吠?淘汰!
還記得《天龍八部》里最牛的人是誰嗎魂拦?“掃地僧”毛仪,他呢?不年輕芯勘,招式幾乎沒有寫箱靴,為什么大家都覺得他比較厲害呢?這就叫“內(nèi)功”荷愕,“內(nèi)功”是可以隨著你的不斷深入的理解而不斷加深的衡怀,到一定程度就變?yōu)椤盁o招勝有招”了!
現(xiàn)在整個社會過于浮躁安疗,造成大家只重視招式的訓(xùn)練抛杨,而忽略掉“內(nèi)功”的修為,這從某種意義上講荐类,也是為什么產(chǎn)生中年危機的原因怖现,尤其是IT這一行!
打開UC瀏覽器 查看更多精彩圖片
既然“內(nèi)功”重要玉罐,我要如何修為“內(nèi)功”屈嗤!
我不是一個“專家”,所以我不敢說的比較大厌小,僅僅是建議吧恢共,其實多聽聽“專家”的蠻好的,聽的多了璧亚,再聽聽我的讨韭,有點幫助最好脂信,建議、建議透硝、建議狰闪!
無論你是要做什么,開始的第一步必須是打好基礎(chǔ)濒生,這你沒有跑的埋泵,只有基礎(chǔ)打好了,才有繼續(xù)提升的根罪治,根穩(wěn)了丽声,才能長的高,長的快觉义!基礎(chǔ)是什么雁社?數(shù)學(xué)是基石,很多情況下晒骇,算法的思維借用了數(shù)學(xué)中的極限思維霉撵,比如:蟻群算法,蟻群算法的核心思維就是無限的螞蟻一直爬洪囤,爬的多了徒坡,留下的最深的那條線就是最優(yōu)解×鏊酰可能有小伙伴說喇完,我數(shù)學(xué)不好,注意款咖,我講的是數(shù)學(xué)思維何暮,很多情況下數(shù)學(xué)思維比數(shù)學(xué)解幾道題重要!
其次铐殃,編程思維海洼,編程思維也有很多很多“專家”講過,大家看看富腊,也可以參考一下我的坏逢,我認為的編程思維其實很簡單,就是將復(fù)雜的問題分解掉赘被,然后分別抽象出模型是整,之后識別模型,利用算法解決問題民假。說的高大上是吧浮入,我們舉個例子:包餃子(餃子是世界上最好吃的食物。)我們需要干嘛羊异?第一步事秀,問題分解彤断,面皮、餡料易迹、合二為一宰衙。然后抽象出的模型分別為:面皮、餡料睹欲、手法供炼。繼續(xù)我們進行模型識別,面皮要通過和面窘疮、揉面袋哼、搟面,存放面皮等等考余,餡料需要剁肉先嬉、剁菜、調(diào)味楚堤、攪拌均勻。手法需要正常包含懊、花樣包身冬、機器包等等。然后我們利用某種算法解決掉這個問題岔乔。這其實就是編程思維酥筝,我們很多人都有這種思維,只是沒有很好的利用而已雏门。
再次嘿歌,你理解了這些以后,你需要學(xué)習計算機基礎(chǔ)知識茁影,你得知道計算機的構(gòu)造是什么宙帝,怎么運行的對吧,你不知道這些怎么和人家聊募闲?就好像是你和一男朋友(女朋友)談戀愛步脓,你都不知道人家的喜歡什么討厭什么,你怎么談戀愛浩螺?
然后你需要學(xué)習數(shù)據(jù)結(jié)構(gòu)和算法靴患,只有理解了這些,才是開始要出。這一步其實會困擾很多人的鸳君,因為你缺少方向感,所以很多人在這一步退縮了患蹂。
最后或颊,你需要使用一個工具砸紊,將你理解的內(nèi)容寫出來,因為你只有寫出來了饭宾,才能實現(xiàn)批糟,就像你心中的白馬王子(公主)長什么樣子,你得畫出來或者寫出來吧看铆,不然誰知道徽鼎。所以需要一門編程語言來進行。
到這一步弹惦,基本上圓滿了否淤,之后就是按照自己所想的內(nèi)容,無限輸出就好了棠隐,但是我的建議是石抡,遵循開源的理念,別動不動就收個費神馬的助泽,計算機這玩意得開源才能發(fā)展啰扛,技術(shù)的保留其實從某種意義上講限制了技術(shù)的發(fā)展。
打開UC瀏覽器 查看更多精彩圖片
打開UC瀏覽器 查看更多精彩圖片