原創(chuàng) 2016-06-29 周瑞珍 學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí)

版權(quán)聲明
本文首發(fā)自微信公共帳號(hào): 學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí)(xiaolai-xuexi);
無(wú)需授權(quán)即可轉(zhuǎn)載,甚至無(wú)需保留以上版權(quán)聲明;
轉(zhuǎn)載時(shí)請(qǐng)務(wù)必注明作者。
以下是《共同成長(zhǎng)社區(qū)》第 39 次分享,分享者是周瑞珍。
個(gè)人簡(jiǎn)介:
周瑞珍,計(jì)算機(jī)軟件專(zhuān)業(yè)碩士。目前從事系統(tǒng)維護(hù)工作,業(yè)余時(shí)間喜歡閱讀和健身。追求持續(xù)的自我成長(zhǎng)。
《共同成長(zhǎng)社區(qū)》的分享,并不是 “私密” 的,我們不在乎分享內(nèi)容是否流出去,事實(shí)上,我們會(huì)主動(dòng)拿出絕大多數(shù)的內(nèi)容分享至社區(qū)之外 —— 因?yàn)樗械姆窒?,最終傳播得越廣越有價(jià)值。
若要進(jìn)一步了解《共同成長(zhǎng)社區(qū)》,請(qǐng)?jiān)诤笈_(tái)點(diǎn)擊 “收費(fèi)社群” 的子按鈕 “共同成長(zhǎng)” ……【請(qǐng)注意:共同成長(zhǎng)社區(qū)已停止接受直接加入,請(qǐng)參閱這篇文章?!?/p>
今天,我分享的主題是零基礎(chǔ)怎樣進(jìn)入編程的世界。
提起編程,很多人都會(huì)直覺(jué)地認(rèn)為:
這是一件很難的事情。
包括以前帶的很多學(xué)生。
其實(shí),就像學(xué)英語(yǔ),學(xué)了基本的音標(biāo)和語(yǔ)法,就可以開(kāi)始去聽(tīng)、去看、使用英語(yǔ)。編程也是一樣的,入門(mén)并不難。只是面對(duì)一個(gè)全新的領(lǐng)域,難免會(huì)感覺(jué)一片茫然,不知道從哪里下手。今天我要分享的內(nèi)容,就是讓大家對(duì)編程有一個(gè)總體的了解,知道要學(xué)哪些內(nèi)容,減少盲目摸索的時(shí)間。
以下是今天分享的一個(gè)提綱。
一、為什么學(xué)習(xí)編程
優(yōu)酷上有一個(gè)奧巴馬的講話視頻:
http://t.cn/R5HYND4
呼吁每個(gè)美國(guó)人都學(xué)習(xí)編程,這是他 2014 年參加 http://code.org 發(fā)起的“編程一小時(shí)”活動(dòng)時(shí)拍的一個(gè)宣傳片。他說(shuō):
如果我們希望美國(guó)走在科技前沿,就需要年輕的美國(guó)人掌握這些工具和技術(shù),它將改變我們的做事方式。
就我個(gè)人認(rèn)為,假如你不以編程為職業(yè),學(xué)習(xí)編程有這幾個(gè)作用:
1. 減少重復(fù)性勞動(dòng)
我們來(lái)看一個(gè)實(shí)例。這是一個(gè)中英文對(duì)照的文本文檔。假如我要把里面的全部中文句子和英文句子提取出來(lái),分別存到新的文本文件中。
方法 1:
直接復(fù)制粘貼。最直接,但是最耗時(shí),特別是當(dāng)你有許多這樣的文檔要處理的時(shí)候。
方法 2:
找工具。網(wǎng)上有很多處理文本的工具,但是不容易找到符合自己要求的。
方法 3:
寫(xiě)程序。可以完全符合要求,需要一定的編程基礎(chǔ)。
2. 收集自己想要的信息
前面這種文本文件,就是我之前學(xué)英語(yǔ)的時(shí)候用的,下載這些含有中英文對(duì)照的文本,經(jīng)過(guò)處理,再倒入到一個(gè)叫是 Supermemo 的軟件里面,用來(lái)做翻譯練習(xí)。
再如,有些做量化交易的人,編程抓取行情數(shù)據(jù),用在自己的交易系統(tǒng)里面。網(wǎng)上有非常豐富的信息資源,當(dāng)你掌握了編程技術(shù),就可以更充分地使用它們。
類(lèi)似的例子還有很多,但是除開(kāi)前面所說(shuō)的,我認(rèn)為學(xué)習(xí)編程更重要的是培養(yǎng)一種新的看待問(wèn)題和處理問(wèn)題的方式。
喬布斯在一次訪談中也提到:
學(xué)習(xí)編程教你如何思考,就像學(xué)法律一樣,學(xué)法律的人未必都成為律師,但法律教你一種思考方式,同樣,編程教你另一種思考方式。
巴菲特的伙伴查理芒格很喜歡說(shuō)一句話,
在拿著錘子的人眼里,整個(gè)世界都是釘子。
人很容易被自己原有的思維固化,所以查理芒格在他的交易系統(tǒng)中使用了很多學(xué)科的模型和方法。
當(dāng)你進(jìn)入一個(gè)陌生的領(lǐng)域,掌握了這個(gè)領(lǐng)域中的模型和方法,并且把它和你原有的思維體系結(jié)合,你會(huì)獲得一種新的分析和解決問(wèn)題的方法。
二、什么是編程
編程的目的是為了解決問(wèn)題。實(shí)質(zhì)就是把生活中的問(wèn)題轉(zhuǎn)化成計(jì)算機(jī)可以處理的模型,并且交給計(jì)算機(jī)處理。
以我們常用的網(wǎng)上購(gòu)物為例,在沒(méi)有電商之前,我們購(gòu)物是這樣一個(gè)流程:
1. 商場(chǎng)把商品放在櫥窗或貨架上
2. 我們查看,挑選物品,放到購(gòu)物車(chē)?yán)?/p>
3. 付錢(qián)結(jié)賬
4. 取走商品
現(xiàn)在,我們購(gòu)物則是這樣一個(gè)流程:
1. 賣(mài)家把商品添加到淘寶店鋪或其他網(wǎng)店中
2. 我們通過(guò)瀏覽器瀏覽,添加到購(gòu)物車(chē)
3. 提交訂單,付款
4. 收貨,確認(rèn)完成
通過(guò)對(duì)比,大家可以發(fā)現(xiàn):
兩者的流程其實(shí)是非常相近的,實(shí)質(zhì)就是把現(xiàn)實(shí)生活中的場(chǎng)景切換到了虛擬的網(wǎng)絡(luò)中,把之前人工完成的許多操作交給了計(jì)算機(jī)處理。
當(dāng)我們編程時(shí),通常是為了解決一個(gè)問(wèn)題(一系列問(wèn)題)。所以,首先要確定問(wèn)題是什么?手里有哪些工具和方法?
前面那個(gè)問(wèn)題,我們可以用以下步驟解決:
1. 打開(kāi)目標(biāo)文本文件
2. 讀取一行英文句子(偶數(shù)行)
3. 寫(xiě)入到一個(gè)新的文本文件中
4. 重復(fù)步驟【 2 】
但是這并不是一個(gè)很好的方案:
假如文件當(dāng)中出現(xiàn)空行,或者中英文的順序換一下,程序就不能再使用了。
如果仔細(xì)觀察,發(fā)現(xiàn)所有英文句子是以英文字母開(kāi)頭,所有中文句子是以數(shù)字開(kāi)頭??梢圆捎谜齽t表達(dá)式把所有符合要求的句子直接提取出來(lái),寫(xiě)入新的文件。
三、當(dāng)我們學(xué)習(xí)編程時(shí)我們?cè)趯W(xué)些什么?
編程思想
所謂編程思想,就是我們?cè)诰幊虝r(shí)看待事物,分析問(wèn)題的思維方式。
1. 面向過(guò)程的思想
以功能為中心,按照完成功能的步驟來(lái)編寫(xiě)程序。
西紅柿炒雞蛋
{
x g 西紅柿洗凈,切塊
y g 雞蛋打入碗里,加少量水,打散
起鍋,倒油 z g,倒入雞蛋翻炒,盛出
放入西紅柿翻炒
放入炒好的雞蛋,放鹽q g,糖p g
}
我們把這個(gè)過(guò)程寫(xiě)成一個(gè)函數(shù),每次需要的時(shí)候調(diào)用就可以了。
? ?西紅柿炒雞蛋(西紅柿 x,雞蛋 y ,油 z,鹽 q,糖 p)
2. 面向?qū)ο蟮乃枷?/p>
世界是由一個(gè)個(gè)對(duì)象組成的,每個(gè)對(duì)象都隸屬于某一個(gè)類(lèi)。例如學(xué)生是一個(gè)類(lèi),每個(gè)特定的學(xué)生張三、李四就是學(xué)生類(lèi)的對(duì)象。
?Class西紅柿炒雞蛋
{
? ? ? ?西紅柿 x g
? ? ? ?雞蛋 y g
? ? ? ?油 ? ?z g
? ? ? ?鹽 ? q g
? ? ? ?糖 ? p g
構(gòu)造函數(shù){
西紅柿洗凈,切塊
…….
放入炒好的雞蛋,放鹽,糖
}
? ?加熱{
? ? ? ?…
}
擺盤(pán){
…
}
}
每個(gè)類(lèi)擁有特定的屬性和方法。屬性可以理解為它的構(gòu)成成分。方法則是它可以做哪些事情。
每個(gè)類(lèi)可以做些什么事情,就取決于我們?yōu)樗帉?xiě)了哪些方法,如上面的類(lèi)中,我們還寫(xiě)了一個(gè)加熱方法,一個(gè)擺盤(pán)方法。這些方法可以按我們的需求來(lái)寫(xiě),但構(gòu)造函數(shù)是必須的,因?yàn)橥ㄟ^(guò)構(gòu)造函數(shù)才能生成一個(gè)具體的對(duì)象,才可能完成后面的操作。
類(lèi)是虛的,相當(dāng)于一個(gè)規(guī)范,對(duì)象是實(shí)的,真正可以操作。對(duì)象是類(lèi)的實(shí)例化。就像上帝在造人之前,先設(shè)定好,人這個(gè)類(lèi)有什么屬性,有眼睛鼻子嘴巴,再用泥巴捏出亞當(dāng)、夏娃。
3. 引入面向?qū)ο?,可以起什么作用?/p>
安全性和獨(dú)立性
類(lèi)包含的屬性和方法是一個(gè)整體,可以對(duì)外界封閉起來(lái),同時(shí)為外界提供一定的訪問(wèn)接口。使用類(lèi)的人不需要關(guān)心內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),只要知道是怎么用就可以。就像廚師長(zhǎng)對(duì)手下的廚師說(shuō),做一份西紅柿炒雞蛋,廚師就負(fù)責(zé)去做,至于是怎么炒出來(lái)的,廚師長(zhǎng)不需要了解,他只關(guān)心是否可用。
可重用
類(lèi)和類(lèi)之間可以形成樹(shù)狀的繼承關(guān)系。子類(lèi)可以繼承父類(lèi)所擁有的一切??梢匀P(pán)接收,也可以自己做出修改。
Class 西紅柿雞蛋蓋飯:西紅柿炒雞蛋
? ?{
? ? ? ?米飯 t g
? ?}
? ?Class 西紅柿雞蛋面:西紅柿炒雞蛋
? ?{
? ? ? ? 面條 z g
? ?}
上面用冒號(hào)表示繼承關(guān)系,西紅柿雞蛋蓋飯和西紅柿雞蛋面都是繼承自西紅柿炒雞蛋這個(gè)類(lèi)。子類(lèi)可以直接使用從父類(lèi)繼承的屬性和方法,比如構(gòu)造函數(shù),同時(shí)自己添加新的屬性和方法。所以這里就不需要再定義西紅柿、雞蛋這些材料了。
靈活的擴(kuò)展
假設(shè)有這樣一個(gè)繼承關(guān)系
這三種菜各自有自己的擺盤(pán)方式。但是在目前還不確定究竟是哪一道菜,可以先用父類(lèi)來(lái)寫(xiě):
? ?{
? ? ? ?主菜 meal
? ? ? ?meal .擺盤(pán)
}
程序運(yùn)行的時(shí)候會(huì)根據(jù)最終的情況,生成的究竟是父類(lèi)還是子類(lèi)的對(duì)象,自動(dòng)選擇對(duì)應(yīng)的擺盤(pán)方式。
以上三種面向?qū)ο缶幊痰奶攸c(diǎn)在教科書(shū)里面稱(chēng)為封裝、繼承和多態(tài)。
面向過(guò)程和面向?qū)ο筮@兩種編程思想其實(shí)并不沖突,只是適用于不同的情況。我個(gè)人的理解是,面向過(guò)程相對(duì)微觀的,樸素的思維方式,而面向?qū)ο髣t是相對(duì)宏觀的,需要更多的歸納和抽象,更接近我們看待世界的方式。
如果以造房子來(lái)比喻的話,面向過(guò)程是一個(gè)從地基、墻壁、門(mén)、窗一步步建造的過(guò)程,而面向?qū)ο髣t是把門(mén)、窗、墻壁都做成一個(gè)個(gè)有特定接口的組件,需要使用的時(shí)候就把它們組合起來(lái)。
四、 編程語(yǔ)言
前面所說(shuō)的編程思想并不局限于某種特定的語(yǔ)言。而編程語(yǔ)言則是落實(shí)到最終要做的事情,寫(xiě)代碼,要有一個(gè)特定的選擇。和我們生活中學(xué)習(xí)的語(yǔ)言其實(shí)是類(lèi)似的,學(xué)習(xí)外語(yǔ)是為了和別人交流,學(xué)習(xí)編程則是為了和計(jì)算機(jī)交流,讓它聽(tīng)懂我們的指令并按照要求操作。
學(xué)外語(yǔ)時(shí),我們要學(xué)習(xí)單詞、語(yǔ)法、句子,同樣的,編程語(yǔ)言也包含這些要素。但是這里有一個(gè)區(qū)別,說(shuō)外語(yǔ)的時(shí)候即使單詞發(fā)音錯(cuò)誤,語(yǔ)法不正確,對(duì)方也可能聽(tīng)得懂,但是在編程中,一個(gè)再細(xì)微的錯(cuò)誤,也可能導(dǎo)致程序無(wú)法運(yùn)行,或者得不到正確的結(jié)果。
打開(kāi)任何一本編程語(yǔ)言的教材,基本上都包含以下幾大塊:
1. 數(shù)據(jù)類(lèi)型 運(yùn)算符
對(duì)于編程人員來(lái)說(shuō),數(shù)據(jù)類(lèi)型是最底層的。因?yàn)槲覀兯幚淼乃袃?nèi)容都是以數(shù)據(jù)的形式存儲(chǔ)和處理的,無(wú)論在我們眼里是怎樣的表現(xiàn)形式,無(wú)論是數(shù)字、文字、圖像、音頻、視頻,對(duì)于計(jì)算機(jī)來(lái)說(shuō)全部都是數(shù)據(jù)。
回想我們從小學(xué)習(xí)的數(shù)學(xué),數(shù)據(jù)類(lèi)型從整數(shù)、小數(shù),到后來(lái)的有理數(shù)、無(wú)理數(shù),再到集合,運(yùn)算符從最簡(jiǎn)單的加減乘除到乘方、開(kāi)方,到集合的運(yùn)算,是一個(gè)逐步擴(kuò)充的過(guò)程。編程中的數(shù)據(jù)類(lèi)型和運(yùn)算符其實(shí)也是類(lèi)似的,只是更加豐富和多樣。
2. 控制語(yǔ)句
控制語(yǔ)句的作用是對(duì)程序流程的選擇,決定下一步該做什么。通常包含順序、選擇和循環(huán)三種。順序指一行行地按
選擇
有一個(gè)關(guān)于程序員的段子:
老婆給當(dāng)程序員的老公打電話:“下班的時(shí)候買(mǎi)一斤包子回來(lái),如果看到賣(mài)西瓜的,就買(mǎi)一個(gè)?!?/p>
當(dāng)晚,程序員老公手捧一個(gè)包子進(jìn)了家門(mén)……
老婆很生氣:“你怎么就買(mǎi)了一個(gè)包子?!”
老公答曰:“因?yàn)榭吹搅速u(mài)西瓜的?!?/p>
在程序員的眼里,問(wèn)題是這樣處理的:
循環(huán)
假如體育老師讓你在操場(chǎng)上跑 10 圈。
3. 語(yǔ)言自身的類(lèi)庫(kù)
五、怎樣開(kāi)始編程
1. 學(xué)習(xí)基礎(chǔ)概念和知識(shí)
2. 實(shí)踐,實(shí)踐再實(shí)踐!
結(jié)合你的專(zhuān)業(yè)、行業(yè)背景
計(jì)算機(jī)發(fā)展到今天,已經(jīng)和各行各業(yè)的專(zhuān)業(yè)技術(shù)緊密的融合在一起。你自身?yè)碛械膶?zhuān)業(yè)、行業(yè)知識(shí),在編程的時(shí)候也是一種資源。假如你是學(xué)財(cái)務(wù)的,對(duì)于財(cái)務(wù)軟件的理解,就會(huì)比其他人更到位。
結(jié)合你的愛(ài)好、對(duì)應(yīng)用的需求
如果你的工作涉及到很多在電腦上做的重復(fù)性的工作,可以考慮使用腳本提高工作效率。或者,從自身的興趣和需求出發(fā)。例如:
我對(duì)微信公眾號(hào)的閱讀體驗(yàn)感到不滿意,那是不是可以做一個(gè)爬蟲(chóng),把指定公眾號(hào)的全部文章一起抓取下來(lái)?甚至做成電子書(shū),可以很方便的閱讀?
有了這個(gè)念頭,先在網(wǎng)上搜索,看有沒(méi)有人做過(guò)類(lèi)似的東西,有什么樣的解決方案,需要哪些方面的技術(shù)。假如已經(jīng)有類(lèi)似的方案,就先拿來(lái),看自己能否理解里面的代碼,再針對(duì)自己的需求進(jìn)行改動(dòng)。
3. 解決問(wèn)題,糾正錯(cuò)誤
4. 回到步驟 【 1 】
? ?