原創(chuàng) 2016-06-29 周瑞珍 學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí)
版權(quán)聲明
本文首發(fā)自微信公共帳號: 學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí)(xiaolai-xuexi)忿峻;
無需授權(quán)即可轉(zhuǎn)載,甚至無需保留以上版權(quán)聲明;
轉(zhuǎn)載時請務(wù)必注明作者吞琐。
以下是《共同成長社區(qū)》第 39 次分享邻梆,分享者是周瑞珍。
個人簡介:
周瑞珍琢锋,計算機(jī)軟件專業(yè)碩士辕漂。目前從事系統(tǒng)維護(hù)工作,業(yè)余時間喜歡閱讀和健身吴超。追求持續(xù)的自我成長钉嘹。
《共同成長社區(qū)》的分享,并不是 “私密” 的鲸阻,我們不在乎分享內(nèi)容是否流出去跋涣,事實(shí)上缨睡,我們會主動拿出絕大多數(shù)的內(nèi)容分享至社區(qū)之外 —— 因?yàn)樗械姆窒恚罱K傳播得越廣越有價值仆潮。
若要進(jìn)一步了解《共同成長社區(qū)》宏蛉,請?jiān)诤笈_點(diǎn)擊 “收費(fèi)社群” 的子按鈕 “共同成長” ……【請注意:共同成長社區(qū)已停止接受直接加入,請參閱這篇文章性置∈安ⅲ】
今天,我分享的主題是零基礎(chǔ)怎樣進(jìn)入編程的世界鹏浅。
提起編程嗅义,很多人都會直覺地認(rèn)為:
這是一件很難的事情。
包括以前帶的很多學(xué)生隐砸。
其實(shí)之碗,就像學(xué)英語,學(xué)了基本的音標(biāo)和語法季希,就可以開始去聽褪那、去看、使用英語式塌。編程也是一樣的博敬,入門并不難。只是面對一個全新的領(lǐng)域峰尝,難免會感覺一片茫然偏窝,不知道從哪里下手。今天我要分享的內(nèi)容武学,就是讓大家對編程有一個總體的了解祭往,知道要學(xué)哪些內(nèi)容,減少盲目摸索的時間火窒。
以下是今天分享的一個提綱硼补。
一、為什么學(xué)習(xí)編程
優(yōu)酷上有一個奧巴馬的講話視頻:
http://t.cn/R5HYND4
呼吁每個美國人都學(xué)習(xí)編程熏矿,這是他 2014 年參加 http://code.org 發(fā)起的“編程一小時”活動時拍的一個宣傳片括勺。他說:
如果我們希望美國走在科技前沿,就需要年輕的美國人掌握這些工具和技術(shù)曲掰,它將改變我們的做事方式。
就我個人認(rèn)為奈辰,假如你不以編程為職業(yè)栏妖,學(xué)習(xí)編程有這幾個作用:
1. 減少重復(fù)性勞動
我們來看一個實(shí)例。這是一個中英文對照的文本文檔奖恰。假如我要把里面的全部中文句子和英文句子提取出來吊趾,分別存到新的文本文件中宛裕。
方法 1:
直接復(fù)制粘貼。最直接论泛,但是最耗時揩尸,特別是當(dāng)你有許多這樣的文檔要處理的時候。
方法 2:
找工具屁奏。網(wǎng)上有很多處理文本的工具岩榆,但是不容易找到符合自己要求的。
方法 3:
寫程序坟瓢∮卤撸可以完全符合要求,需要一定的編程基礎(chǔ)折联。
2. 收集自己想要的信息
前面這種文本文件粒褒,就是我之前學(xué)英語的時候用的,下載這些含有中英文對照的文本诚镰,經(jīng)過處理奕坟,再倒入到一個叫是 Supermemo 的軟件里面,用來做翻譯練習(xí)清笨。
再如月杉,有些做量化交易的人,編程抓取行情數(shù)據(jù)函筋,用在自己的交易系統(tǒng)里面沙合。網(wǎng)上有非常豐富的信息資源,當(dāng)你掌握了編程技術(shù)跌帐,就可以更充分地使用它們首懈。
類似的例子還有很多,但是除開前面所說的谨敛,我認(rèn)為學(xué)習(xí)編程更重要的是培養(yǎng)一種新的看待問題和處理問題的方式究履。
喬布斯在一次訪談中也提到:
學(xué)習(xí)編程教你如何思考,就像學(xué)法律一樣脸狸,學(xué)法律的人未必都成為律師最仑,但法律教你一種思考方式,同樣炊甲,編程教你另一種思考方式泥彤。
巴菲特的伙伴查理芒格很喜歡說一句話,
在拿著錘子的人眼里卿啡,整個世界都是釘子吟吝。
人很容易被自己原有的思維固化,所以查理芒格在他的交易系統(tǒng)中使用了很多學(xué)科的模型和方法颈娜。
當(dāng)你進(jìn)入一個陌生的領(lǐng)域剑逃,掌握了這個領(lǐng)域中的模型和方法浙宜,并且把它和你原有的思維體系結(jié)合,你會獲得一種新的分析和解決問題的方法蛹磺。
二粟瞬、什么是編程
編程的目的是為了解決問題。實(shí)質(zhì)就是把生活中的問題轉(zhuǎn)化成計算機(jī)可以處理的模型萤捆,并且交給計算機(jī)處理裙品。
以我們常用的網(wǎng)上購物為例,在沒有電商之前鳖轰,我們購物是這樣一個流程:
1. 商場把商品放在櫥窗或貨架上
2. 我們查看清酥,挑選物品,放到購物車?yán)?/p>
3. 付錢結(jié)賬
4. 取走商品
現(xiàn)在蕴侣,我們購物則是這樣一個流程:
1. 賣家把商品添加到淘寶店鋪或其他網(wǎng)店中
2. 我們通過瀏覽器瀏覽焰轻,添加到購物車
3. 提交訂單,付款
4. 收貨昆雀,確認(rèn)完成
通過對比辱志,大家可以發(fā)現(xiàn):
兩者的流程其實(shí)是非常相近的,實(shí)質(zhì)就是把現(xiàn)實(shí)生活中的場景切換到了虛擬的網(wǎng)絡(luò)中狞膘,把之前人工完成的許多操作交給了計算機(jī)處理揩懒。
當(dāng)我們編程時,通常是為了解決一個問題(一系列問題)挽封。所以已球,首先要確定問題是什么?手里有哪些工具和方法辅愿?
前面那個問題智亮,我們可以用以下步驟解決:
1. 打開目標(biāo)文本文件
2. 讀取一行英文句子(偶數(shù)行)
3. 寫入到一個新的文本文件中
4. 重復(fù)步驟【 2 】
但是這并不是一個很好的方案:
假如文件當(dāng)中出現(xiàn)空行,或者中英文的順序換一下点待,程序就不能再使用了阔蛉。
如果仔細(xì)觀察,發(fā)現(xiàn)所有英文句子是以英文字母開頭癞埠,所有中文句子是以數(shù)字開頭状原。可以采用正則表達(dá)式把所有符合要求的句子直接提取出來苗踪,寫入新的文件颠区。
三、當(dāng)我們學(xué)習(xí)編程時我們在學(xué)些什么通铲?
編程思想
所謂編程思想瓦呼,就是我們在編程時看待事物,分析問題的思維方式。
1. 面向過程的思想
以功能為中心央串,按照完成功能的步驟來編寫程序。
西紅柿炒雞蛋
{
x g 西紅柿洗凈碗啄,切塊
y g 雞蛋打入碗里质和,加少量水,打散
起鍋稚字,倒油 z g饲宿,倒入雞蛋翻炒,盛出
放入西紅柿翻炒
放入炒好的雞蛋胆描,放鹽q g瘫想,糖p g
}
我們把這個過程寫成一個函數(shù),每次需要的時候調(diào)用就可以了昌讲。
? ?西紅柿炒雞蛋(西紅柿 x吠架,雞蛋 y 尖殃,油 z,鹽 q,糖 p)
2. 面向?qū)ο蟮乃枷?/p>
世界是由一個個對象組成的菠劝,每個對象都隸屬于某一個類。例如學(xué)生是一個類鲤看,每個特定的學(xué)生張三违柏、李四就是學(xué)生類的對象。
?Class西紅柿炒雞蛋
{
? ? ? ?西紅柿 x g
? ? ? ?雞蛋 y g
? ? ? ?油 ? ?z g
? ? ? ?鹽 ? q g
? ? ? ?糖 ? p g
構(gòu)造函數(shù){
西紅柿洗凈证逻,切塊
…….
放入炒好的雞蛋乐埠,放鹽,糖
}
? ?加熱{
? ? ? ?…
}
擺盤{
…
}
}
每個類擁有特定的屬性和方法囚企。屬性可以理解為它的構(gòu)成成分丈咐。方法則是它可以做哪些事情。
每個類可以做些什么事情洞拨,就取決于我們?yōu)樗帉懥四男┓椒ǔ豆蓿缟厦娴念愔校覀冞€寫了一個加熱方法烦衣,一個擺盤方法歹河。這些方法可以按我們的需求來寫,但構(gòu)造函數(shù)是必須的花吟,因?yàn)橥ㄟ^構(gòu)造函數(shù)才能生成一個具體的對象秸歧,才可能完成后面的操作。
類是虛的衅澈,相當(dāng)于一個規(guī)范键菱,對象是實(shí)的,真正可以操作今布。對象是類的實(shí)例化经备。就像上帝在造人之前拭抬,先設(shè)定好,人這個類有什么屬性侵蒙,有眼睛鼻子嘴巴造虎,再用泥巴捏出亞當(dāng)、夏娃纷闺。
3. 引入面向?qū)ο笏阍洌梢云鹗裁醋饔茫?/p>
安全性和獨(dú)立性
類包含的屬性和方法是一個整體,可以對外界封閉起來犁功,同時為外界提供一定的訪問接口氓轰。使用類的人不需要關(guān)心內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),只要知道是怎么用就可以浸卦。就像廚師長對手下的廚師說署鸡,做一份西紅柿炒雞蛋,廚師就負(fù)責(zé)去做镐躲,至于是怎么炒出來的储玫,廚師長不需要了解,他只關(guān)心是否可用萤皂。
可重用
類和類之間可以形成樹狀的繼承關(guān)系撒穷。子類可以繼承父類所擁有的一切●晌酰可以全盤接收端礼,也可以自己做出修改。
Class 西紅柿雞蛋蓋飯:西紅柿炒雞蛋
? ?{
? ? ? ?米飯 t g
? ?}
? ?Class 西紅柿雞蛋面:西紅柿炒雞蛋
? ?{
? ? ? ? 面條 z g
? ?}
上面用冒號表示繼承關(guān)系入录,西紅柿雞蛋蓋飯和西紅柿雞蛋面都是繼承自西紅柿炒雞蛋這個類蛤奥。子類可以直接使用從父類繼承的屬性和方法,比如構(gòu)造函數(shù)僚稿,同時自己添加新的屬性和方法凡桥。所以這里就不需要再定義西紅柿、雞蛋這些材料了蚀同。
靈活的擴(kuò)展
假設(shè)有這樣一個繼承關(guān)系
這三種菜各自有自己的擺盤方式缅刽。但是在目前還不確定究竟是哪一道菜,可以先用父類來寫:
? ?{
? ? ? ?主菜 meal
? ? ? ?meal .擺盤
}
程序運(yùn)行的時候會根據(jù)最終的情況蠢络,生成的究竟是父類還是子類的對象衰猛,自動選擇對應(yīng)的擺盤方式。
以上三種面向?qū)ο缶幊痰奶攸c(diǎn)在教科書里面稱為封裝刹孔、繼承和多態(tài)啡省。
面向過程和面向?qū)ο筮@兩種編程思想其實(shí)并不沖突,只是適用于不同的情況。我個人的理解是卦睹,面向過程相對微觀的畦戒,樸素的思維方式,而面向?qū)ο髣t是相對宏觀的分预,需要更多的歸納和抽象兢交,更接近我們看待世界的方式。
如果以造房子來比喻的話笼痹,面向過程是一個從地基、墻壁酪穿、門凳干、窗一步步建造的過程,而面向?qū)ο髣t是把門被济、窗救赐、墻壁都做成一個個有特定接口的組件,需要使用的時候就把它們組合起來只磷。
四经磅、 編程語言
前面所說的編程思想并不局限于某種特定的語言。而編程語言則是落實(shí)到最終要做的事情钮追,寫代碼预厌,要有一個特定的選擇。和我們生活中學(xué)習(xí)的語言其實(shí)是類似的元媚,學(xué)習(xí)外語是為了和別人交流轧叽,學(xué)習(xí)編程則是為了和計算機(jī)交流,讓它聽懂我們的指令并按照要求操作刊棕。
學(xué)外語時炭晒,我們要學(xué)習(xí)單詞、語法甥角、句子网严,同樣的,編程語言也包含這些要素嗤无。但是這里有一個區(qū)別震束,說外語的時候即使單詞發(fā)音錯誤,語法不正確翁巍,對方也可能聽得懂驴一,但是在編程中,一個再細(xì)微的錯誤灶壶,也可能導(dǎo)致程序無法運(yùn)行肝断,或者得不到正確的結(jié)果。
打開任何一本編程語言的教材,基本上都包含以下幾大塊:
1. 數(shù)據(jù)類型 運(yùn)算符
對于編程人員來說胸懈,數(shù)據(jù)類型是最底層的担扑。因?yàn)槲覀兯幚淼乃袃?nèi)容都是以數(shù)據(jù)的形式存儲和處理的,無論在我們眼里是怎樣的表現(xiàn)形式趣钱,無論是數(shù)字涌献、文字、圖像首有、音頻燕垃、視頻,對于計算機(jī)來說全部都是數(shù)據(jù)井联。
回想我們從小學(xué)習(xí)的數(shù)學(xué)卜壕,數(shù)據(jù)類型從整數(shù)、小數(shù)烙常,到后來的有理數(shù)轴捎、無理數(shù),再到集合蚕脏,運(yùn)算符從最簡單的加減乘除到乘方侦副、開方,到集合的運(yùn)算驼鞭,是一個逐步擴(kuò)充的過程秦驯。編程中的數(shù)據(jù)類型和運(yùn)算符其實(shí)也是類似的,只是更加豐富和多樣终议。
2. 控制語句
控制語句的作用是對程序流程的選擇汇竭,決定下一步該做什么。通常包含順序穴张、選擇和循環(huán)三種细燎。順序指一行行地按
選擇
有一個關(guān)于程序員的段子:
老婆給當(dāng)程序員的老公打電話:“下班的時候買一斤包子回來,如果看到賣西瓜的皂甘,就買一個玻驻。”
當(dāng)晚偿枕,程序員老公手捧一個包子進(jìn)了家門……
老婆很生氣:“你怎么就買了一個包子璧瞬?!”
老公答曰:“因?yàn)榭吹搅速u西瓜的渐夸∴惋保”
在程序員的眼里,問題是這樣處理的:
循環(huán)
假如體育老師讓你在操場上跑 10 圈墓塌。
3. 語言自身的類庫
五瘟忱、怎樣開始編程
1. 學(xué)習(xí)基礎(chǔ)概念和知識
2. 實(shí)踐奥额,實(shí)踐再實(shí)踐!
結(jié)合你的專業(yè)访诱、行業(yè)背景
計算機(jī)發(fā)展到今天垫挨,已經(jīng)和各行各業(yè)的專業(yè)技術(shù)緊密的融合在一起。你自身擁有的專業(yè)触菜、行業(yè)知識九榔,在編程的時候也是一種資源。假如你是學(xué)財務(wù)的涡相,對于財務(wù)軟件的理解哲泊,就會比其他人更到位。
結(jié)合你的愛好催蝗、對應(yīng)用的需求
如果你的工作涉及到很多在電腦上做的重復(fù)性的工作攻旦,可以考慮使用腳本提高工作效率∩荩或者,從自身的興趣和需求出發(fā)且预。例如:
我對微信公眾號的閱讀體驗(yàn)感到不滿意槽袄,那是不是可以做一個爬蟲,把指定公眾號的全部文章一起抓取下來锋谐?甚至做成電子書遍尺,可以很方便的閱讀?
有了這個念頭涮拗,先在網(wǎng)上搜索乾戏,看有沒有人做過類似的東西,有什么樣的解決方案三热,需要哪些方面的技術(shù)鼓择。假如已經(jīng)有類似的方案,就先拿來就漾,看自己能否理解里面的代碼呐能,再針對自己的需求進(jìn)行改動。
3. 解決問題抑堡,糾正錯誤
4. 回到步驟 【 1 】
? ?