發(fā)布時間:2025-03-25閱讀(27)
平時工作之余,很多螞蟻技術(shù)同學也樂于分享技術(shù)心得和經(jīng)驗感悟,我們會不定期精選其中的優(yōu)秀文章,分享給大家。
不少同學對于編程感到好奇,但一看到厚厚的教程就打退堂鼓,我就曾經(jīng)被問過:“外行需要多長時間才能學會這玩意兒呀?”這個問題不知道該如何回答,因為我并不認同“外行”這個詞。我始終認為,在編程這件事情上,每個人都是內(nèi)行,每個人也都是外行。
學會編程沒有你想象中的那么復雜。
編程是什么?編程,說得簡單一點,就是通過一系列邏輯將你想做的事情或者想描述的物體表達清楚,然后讓它展現(xiàn)出來,或者運動起來。說得專業(yè)一點:
編程 = 算法 數(shù)據(jù)結(jié)構(gòu)什么是算法?就是解決問題的辦法,或者說通過幾個步驟來解決一個問題的過程描述;那么什么是數(shù)據(jù)結(jié)構(gòu)呢?咱們在解決問題的時候經(jīng)常需要去放置一些物件,比如把書放到書架上,那么書架就是一種數(shù)據(jù)結(jié)構(gòu),把書放到柜子里,柜子就是一種數(shù)據(jù)結(jié)構(gòu),書架和柜子就是數(shù)據(jù)的不同呈現(xiàn)/儲存方式。
其實,每個人對編程都不陌生,你進過廚房吧,17:00 回到家,怎么讓家人在 18:30 之前吃上飯?這里頭的算法就多了去了,你可以先煮上飯然后去買菜,也可以買完菜再回來煮飯,那么哪種方式更好呢?下面我們用程序語言來分析這道題:
編程問題:17:00 回到家,怎么讓家人在 18:30 之前吃上飯?算法一:先煮上飯然后去買菜算法二:買完菜再回來煮飯這里的做飯是一個程序?qū)嶓w,它包含了煮飯、買菜、切菜、做菜,這個程序?qū)嶓w的表達方式是:
做飯 = { 煮飯() {}, 買菜() {}, 切菜() {}, 做菜() {},}把中文換成英文不就是你平時看到的程序代碼么?所以說呀,編程對你其實并不陌生,它也沒你想象中的那么復雜。
編程的核心是什么?為什么人跟人之間編寫出來的代碼有這么大的差異,或者說,為什么存在小白和專家的區(qū)別?編程確實不復雜,復雜的原因是很多人不能把問題思考周全,我舉個例子你就知道了:
做飯 = { 開始() { 煮飯(); 買菜(); 切菜(); 做菜(); }, 煮飯() {}, 買菜() {}, 切菜() {}, 做菜() { if (家里沒有油了) { 買油(); 炒菜(); } else { 炒菜(); } }}做飯->開始();我們定義了一個程序?qū)嶓w叫做「做飯」,包含了幾個步驟,開始、煮飯、買菜、切菜和做菜,在編程語言里頭,我們把「做飯」稱之為對象,這幾個步驟稱之為方法,「做飯」這個對象擁有 5 個方法,我們可以一個個地調(diào)用它。首先我們調(diào)用了「開始」方法,在這個方法里,又依次調(diào)用了「煮飯」、「買菜」、「切菜」和「做菜」。
在「做菜」方法里,我們看到了一個細節(jié),那就是“家里沒油了”,咋整,這個人是這么考慮的:先去「買油」,然后回來「炒菜」。很顯然,這人不靠譜,你看,菜都要下鍋了,才想起沒有油。但是下面這個人就不一樣了:
做飯 = { 開始() { 煮飯(); 檢查結(jié)果 = 檢查(); 買菜(檢查結(jié)果); 切菜(); 做菜(); }, 檢查() { if (家里沒有油了) { 買菜的時候要買油 } if (家里沒有辣椒了) { 買菜的時候要買辣椒 } }, 煮飯() {}, 買菜() {}, 切菜() {}, 做菜() {},}做飯->開始();他的程序里多了個步驟叫做「檢查」,在出門買菜之前,先在家里掃一眼,缺了什么,用小本本記下來,然后「買菜」的時候,帶上這個小本本,這樣「買菜」就不會有遺漏了。
你看,這就是我們所謂的小白和專家,他們的區(qū)別就是后者能夠把事情想得更加周全,在解決問題的時候,不遺留任何細節(jié),并且呢,能夠讓事情可以更流暢、更快、更好地得到解決,消耗的資源最少,解決的問題最多。
編程的復雜性不要以為我上面寫的東西不是代碼,稍微調(diào)整下細節(jié),這串代碼是可以在電腦上真實跑起來的,是不是特別簡單啊?你還敢說自己不懂編程么?還會懼怕編程么?
但是也不要把編程想的太簡單了,上面的程序表達的只是一個十分粗略的做飯過程,或者說一個做飯的思路,真正要把做飯的程序?qū)崿F(xiàn)出來,還要考慮很多的問題,比如如何在程序中表達我要做辣椒炒肉、紅燒獅子頭、剁椒魚頭等等好幾個菜呢?這里就涉及到“抽象”的概念,我們需要把很多相似的步驟都抽象成一種行為,然后不斷重復這種行為:
做飯 = { 開始(菜單) { 煮飯(); 買菜(菜單); 菜單->逐一(做菜); }, 買菜() {}, 煮飯() {}, 做菜(菜品) { 洗菜(菜品); 切菜(菜品); 炒菜(菜品); }}菜單 = 辣椒炒肉、紅燒獅子頭、剁椒魚頭;做飯->開始(菜單);好了,上面的代碼相信也不是很難理解,我們把做飯分為三個事情,「煮飯」、「買菜」和「做菜」,首先我們想好了一個“菜單”,然后抽象了一個「做菜」的方法,這個方法里面包含了「洗菜」、「切菜」和「炒菜」三個步驟,每一道菜都會執(zhí)行這三個步驟。
如果沒有這層抽象會有什么問題?你會發(fā)現(xiàn)你的代碼是這么寫的:
做飯 = { 煮飯() {}, 買菜() {}, 洗菜() {}, 切菜() {}, 做菜() {},}做飯->煮飯();做飯->買菜();做飯->洗菜(辣椒炒肉);做飯->切菜(辣椒炒肉);做飯->炒菜(辣椒炒肉);做飯->洗菜(紅燒獅子頭);做飯->切菜(紅燒獅子頭);做飯->炒菜(紅燒獅子頭);做飯->洗菜(剁椒魚頭);做飯->切菜(剁椒魚頭);做飯->炒菜(剁椒魚頭);代碼本身沒有什么問題,但是看起來會十分冗長,如果你今天要做 10 個菜,那么代碼就得寫 10 遍;可如果你用到了抽象思維,你就只需要去擴展“菜單”就行了,因為在程序里有一個叫做 「逐一」的邏輯。
程序里面涉及到的邏輯并不多,諸如「條件判斷」、「循環(huán)」、「遍歷/逐一」等,很少,但是也就是這么幾個少量的邏輯,構(gòu)筑了豐富多彩的網(wǎng)絡世界。
小結(jié)好了,本文并不是想教會你如何編程,而是想告訴你,編程是一件十分簡單的事情,但是想寫出好的程序卻是一件無比有難度的事情,這需要你想出足夠好的算法,同時也需要你對程序的執(zhí)行環(huán)境有基本的了解,知道怎么寫程序跑的快、怎么寫程序會很卡,等等。
當然,作為程序員最苦惱的事情,并不是編程本身,而是需求的變化。比如當你做好了這頓飯,卻發(fā)現(xiàn)家人在外面吃過了,此時的你就只能含著淚,一個人吃完這桌難以下咽的飯菜了。
來源:阿里云開發(fā)者社區(qū)
歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-520445.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖