Mr.C/文
子曰:“知者不惑,仁者不憂,勇者不懼。”
-
前言
《窮爸爸,富爸爸》里面有句話是這樣說(shuō)的:“對(duì)于受過(guò)良好教育的爸爸,工作的穩(wěn)定就是一切谨朝;而對(duì)于富爸爸來(lái)說(shuō)璃吧,不斷學(xué)習(xí)才是一切嫡纠〉莼Γ”
許多時(shí)候,我們的恐懼并非來(lái)自所恐懼的事物沫勿,而是來(lái)自我們自己的未知挨约,想克服某種恐懼,我想最好的解決方法是主動(dòng)去適應(yīng)产雹,也就是人們常說(shuō)的诫惭,走出舒適區(qū)。
隨著近二十年計(jì)算機(jī)界的蓬勃發(fā)展洽故,繼而導(dǎo)致了某個(gè)新品種程序猿的大量"繁殖"贝攒,如果你身邊也有該品種的存在,并且你想和他們可以有職業(yè)上的交流时甚,或者想要套得猿心隘弊,懂得猿類之間術(shù)語(yǔ),讀此系列文荒适,事可成矣梨熙。
-
如何走上編程之路?

本文的目的是讓你知道如何像一個(gè)計(jì)算機(jī)科學(xué)家那樣思(da)考(kai)問(wèn)(nao)題(dong)刀诬,這個(gè)腦洞的打開(kāi)方式結(jié)合了數(shù)學(xué)咽扇、工程和自然科學(xué)三個(gè)學(xué)科的最優(yōu)特性。比如說(shuō):
- 很數(shù)學(xué)的方式:計(jì)算機(jī)科學(xué)家們[1]使用一套標(biāo)準(zhǔn)符號(hào)去表示他們的idea(計(jì)算機(jī)領(lǐng)域也會(huì)涉及到很多計(jì)算陕壹,比如圖像處理中的線性數(shù)學(xué)质欲、數(shù)據(jù)挖掘中的統(tǒng)計(jì)學(xué)、概率學(xué)等)糠馆。
- 很工程的方式:計(jì)算機(jī)科學(xué)家們同樣需要設(shè)計(jì)一些組件嘶伟,并把它們組合成一個(gè)系統(tǒng),在組合的過(guò)程中還需要權(quán)衡各種方案帶來(lái)的利弊又碌。
- 很科學(xué)家的方式:計(jì)算機(jī)科學(xué)家們同樣會(huì)去觀察一個(gè)復(fù)雜的系統(tǒng)九昧,并且會(huì)做出一些假設(shè),通過(guò)實(shí)驗(yàn)區(qū)驗(yàn)證是否可行毕匀。
計(jì)算機(jī)科學(xué)家最重要的一項(xiàng)技能是 “解決問(wèn)題能力”铸鹰,問(wèn)題解決能力意味著你需要擁有以下三項(xiàng)技能點(diǎn):
- 知道問(wèn)題在哪里(猶如當(dāng)年霍去病打匈奴,你要打敗敵人皂岔,首先得知道敵人在哪)
- 能夠制定出解決問(wèn)題的方案(作戰(zhàn)計(jì)劃)
- 并且可以清晰蹋笼、正確地實(shí)現(xiàn)方案(戰(zhàn)場(chǎng)上的排兵布陣)
當(dāng)然,想在計(jì)算機(jī)領(lǐng)域有所成就,除了需要擁有以上三點(diǎn)問(wèn)題基本解決技能外姓建,掌握編程技能是必不可少的诞仓。
如果你覺(jué)得你擁有以上技能點(diǎn)缤苫,那么就可以開(kāi)始上路啦(T^T)~~~ 對(duì)速兔,就是那條傳說(shuō)中的 編程之路。
On one level, you will be learning to program, a useful skill by itself. On another level, you will use programming as a means to an end. As we go along, that end will become clearer.
-
編程之路之—— 算法
如果說(shuō) 解決問(wèn)題方式 是計(jì)算機(jī)科學(xué)最重要的部分活玲,那么就是在解決問(wèn)題中所創(chuàng)造出來(lái)的解決方案可以說(shuō)是重中之重涣狗,這里的解決方案,我們便稱之為 算法舒憾。
算法是一連串解決問(wèn)題的招式镀钓,比如我們想從A點(diǎn)到B點(diǎn),那我們選擇的方式可以有 自己開(kāi)車镀迂、坐地鐵丁溅、坐公交或者打Uber(當(dāng)然,如果你是數(shù)年前的本山大叔探遵,還可以坐直升飛機(jī))窟赏,這里的方式就是我們解決 “從A點(diǎn)到B點(diǎn)” 這個(gè)問(wèn)題的的“算法”,由此可見(jiàn)一個(gè)好的算法和一個(gè)差的算法箱季,雖然同樣可以解決問(wèn)題涯穷,但是他們之間的效率卻可能相差上百倍(這就是一個(gè)好的程序員頂?shù)蒙鲜畟€(gè)普通程序員的說(shuō)法來(lái)源之一)。
算法是理論上的解決方案藏雏,而實(shí)際上對(duì)算法的實(shí)現(xiàn)需要依賴于具體的編程語(yǔ)言拷况,“編程語(yǔ)言是一種工具”(我想這句話每個(gè)讀計(jì)算機(jī)的孩子都有聽(tīng)偉大的老師們講過(guò)吧?)掘殴。
事實(shí)也確是如此赚瘦,編程語(yǔ)言就好比你選擇了Uber后打到的是一輛奧迪還是一輛奧拓,算法在某種程度上決定了我們解決某個(gè)問(wèn)題的速度等級(jí)奏寨,但編程語(yǔ)言(前提是對(duì)不同計(jì)算機(jī)語(yǔ)言同樣熟悉的情況下起意,不包括語(yǔ)言學(xué)習(xí)時(shí)間成本)只是影響我們到達(dá)目的地的舒適度。
** 所以服爷,算法很重要杜恰。**
-
編程之路之——程序
按照維基百科的說(shuō)法:程序(英語(yǔ):procedure),指特定的一系列動(dòng)作仍源、行動(dòng)或操作心褐,而這些活動(dòng)、動(dòng)作或操作必須被運(yùn)行于相同方式以為了在相同環(huán)境下恒常得出相同的結(jié)果(例如緊急應(yīng)變程序)笼踩。不太精確地說(shuō)逗爹,程序可以指一序列的活動(dòng)、作業(yè)、步驟掘而、決斷挟冠、計(jì)算和工序,當(dāng)它們保證依照嚴(yán)格規(guī)定的順序發(fā)生時(shí)即產(chǎn)生所述的后果袍睡、產(chǎn)品或局面知染。一個(gè)程序通常引致一個(gè)改變。
其實(shí)斑胜,看完維基百科的中文解釋后控淡,作為幾乎天天跟程序打交道的我也是一臉蒙圈的...
這樣子會(huì)嚇走一大批妹紙的,對(duì)止潘,怪你囖掺炭,維基百科君。
其實(shí)程序我們可以這樣理解凭戴,它分為5個(gè)部分:
- 輸入
- 輸出
- 數(shù)學(xué)和邏輯語(yǔ)句
- 判斷語(yǔ)句
- 循環(huán)
喂喂~ 別走吖涧狮!我還沒(méi)解釋完呢,不要看到這個(gè)5個(gè)名詞就看不下去了好不好么夫?
我們可以把這五個(gè)過(guò)程對(duì)應(yīng)為我們平時(shí)撩女(男)神的過(guò)程者冤,在計(jì)算機(jī)執(zhí)行的程序就好比我們的撩妹(漢)過(guò)程:
程序組成部分 | 計(jì)算機(jī) | 撩妹(漢)過(guò)程 |
---|---|---|
輸入 | 鍵盤(pán)/文件(*通常從文件獲取,比如我們?cè)赪indows下澄焊睿看到的.exe **)/網(wǎng)絡(luò)外設(shè) | 對(duì)女(男)神發(fā)自內(nèi)心(或身體)的期盼 |
數(shù)學(xué)邏輯 | 與譬嚣、或、非邏輯是否成立 | 女(男)神當(dāng)天的心情是否適合date钞它?(如:只要Ta 6級(jí)考試通過(guò)或者你找到了一家好吃的餐廳:可Date拜银,稱之為或。 需要Ta 6級(jí)考試通過(guò)并且你已經(jīng)找到了一家好吃的餐廳才可Date遭垛,稱之為與尼桶。沒(méi)有人約Ta的時(shí)候你才可Date得到,稱之為非 锯仪,可憐T_T泵督。) |
條件判斷語(yǔ)句 | if語(yǔ)句 | 你今天是否已經(jīng)達(dá)到了約對(duì)方的條件?達(dá)到則可執(zhí)行 下一步:拿起手機(jī)庶喜,給Ta發(fā)微信或者打電話啦~~ |
循環(huán)語(yǔ)句 | while或for語(yǔ)句 | 如果被女(男)神拒絕了午餐小腊,是否繼續(xù)重復(fù)約晚餐?如果晚餐還被拒絕了久窟,是否重復(fù)約明天早餐秩冈? 如此反復(fù)...稱之為循環(huán)矣。 |
輸出 | 圖像顯示或者發(fā)送某些數(shù)據(jù)到設(shè)備上 | 這里的輸出斥扛,當(dāng)然是入问,要不要準(zhǔn)備好Date完之后的事宜啦。 |
- 是不是很簡(jiǎn)單?
是不是很簡(jiǎn)單芬失?
是不是很簡(jiǎn)單楣黍?
假設(shè)計(jì)算機(jī)是我們的身體,那么程序就是運(yùn)行在我們身上的思考過(guò)程棱烂。
我們身體 所觀租漂、所聞、所觸 就相當(dāng)于計(jì)算機(jī)中鍵盤(pán)或者鼠標(biāo)的 輸入垢啼,而我們?cè)讷@取外界的信息后再大腦內(nèi)部經(jīng)過(guò)的思考過(guò)程窜锯,就相當(dāng)于 程序在進(jìn)行 數(shù)學(xué)與邏輯運(yùn)算、條件判斷以及是否循環(huán)的過(guò)程芭析,而最終我們的 所行 以及 所想 就是我們大腦在執(zhí)行程序后的輸出。-
編程之路之——Bug & Debug
什么是bug吞瞪? bug正常翻譯為中文的意思為:蟲(chóng)子馁启。
那為什么我們程序上的錯(cuò)誤會(huì)被稱為Bug呢?
因?yàn)?.. 它第一次出現(xiàn)真的是因?yàn)橐恢籅ug:
據(jù)說(shuō)芍秆,1947年9月9日惯疙,一只小飛蛾鉆進(jìn)了計(jì)算機(jī)電路里,導(dǎo)致系統(tǒng)無(wú)法工作妖啥,一位名叫格蕾絲·赫柏的人把飛蛾拍死在工作日志上(見(jiàn)圖)霉颠,寫(xiě)道:就是這個(gè) bug(蟲(chóng)子),害我們今天的工作無(wú)法完成——于是荆虱,bug一詞成了電腦系統(tǒng)程序的專業(yè)術(shù)語(yǔ)蒿偎,形容那些系統(tǒng)中的缺陷或問(wèn)題。
世界第一個(gè)Bug記錄
我相信Bug這個(gè)詞大家并不難理解怀读,不過(guò)我還是以 幽默诉位、易懂、充滿趣味 的方式再講一遍吧菜枷!
以 A點(diǎn)到B點(diǎn) 為例苍糠,Bug 我們可以理解為是在我們從A點(diǎn)到B點(diǎn)過(guò)程中出現(xiàn)的各種意外,比如:
- 接單的Uber司機(jī)突然被交警抓了(此時(shí)Debug方法為重新下單)
- 走路過(guò)去B點(diǎn)的時(shí)候突然下起大雨 (此時(shí)Debug方法為等雨推√埽或買把傘)
- 比如本山大叔因?yàn)樘^(guò)高調(diào)而... (此時(shí)Debug方法為:不~ 這不是bug岳瞭,這是特性!)
以** 追女(男)神** 為例蚊锹,Bug 我們可以理解為我們?cè)诩s會(huì)過(guò)程中各種小插曲瞳筏,比如:
- 對(duì)方因?yàn)榇蛴螒蚧蛘哽翼n劇通宵并且關(guān)機(jī) (此時(shí)Debug方法為,等~)
- 對(duì)方因?yàn)樾那椴缓枚幌牒湍阏f(shuō)話枫耳,并扔了一只狗 (此時(shí)Debug方法為乏矾,等~)
- 對(duì)方因?yàn)榱硪粋€(gè)人而放了你飛機(jī) (此時(shí)Debug方法為...
所以,Bug 和 Debug就是一個(gè)出現(xiàn)問(wèn)題和解決問(wèn)題的過(guò)程。
如果你一直聽(tīng)到你的程序員朋友說(shuō)他一直在加班調(diào)Bug钻心,你不需驚訝凄硼,因?yàn)樵谖覀兊纳钪形覀冏约翰灰彩且恢碧幱诔霈F(xiàn)問(wèn)題和解決問(wèn)題的過(guò)程中么?
我們屬于大自然創(chuàng)造出的奇跡捷沸,而計(jì)算機(jī)只是我們?nèi)祟愃鶆?chuàng)造出來(lái)的物品摊沉,那么,連我們?nèi)祟惐旧矶家恢背霈F(xiàn)問(wèn)題的話痒给,程序它说墨,一直有Bug,又有什么不正常呢苍柏?
而且尼斧,計(jì)算機(jī)科學(xué)家們正在 創(chuàng)造著我們的計(jì)算機(jī)世界,創(chuàng)造者們?cè)趧?chuàng)造過(guò)程中不斷修正錯(cuò)誤试吁,也就沒(méi)有什么不正常的了棺棵,所以, 請(qǐng)善待你身邊一直加班改Bug的 猿類熄捍。
-
結(jié)語(yǔ)
本話題也將以系列文的方式推出烛恤,本章先以 幽默、易懂余耽、充滿趣味(捂臉) 的方式介紹 算法缚柏、程序以及Bug 三個(gè)計(jì)算機(jī)界基本法概念,望喜歡碟贾。
本文部分內(nèi)容譯自一本關(guān)于Python開(kāi)源書(shū)籍 How to Think Like a Computer Scientist币喧,感謝!
-
其實(shí)計(jì)算機(jī)科學(xué)家和軟件工程師(程序猿)是有差別的缕陕,計(jì)算機(jī)科學(xué)家偏向于計(jì)算機(jī)理論粱锐,而軟件工程師會(huì)更偏向于計(jì)算機(jī)應(yīng)用,一般來(lái)說(shuō)扛邑,"大多數(shù)的后者" 應(yīng)用 "少數(shù)的前者"所研究出來(lái)的理論至現(xiàn)實(shí)世界中怜浅。所以他們之間的語(yǔ)言和方法,是共通的蔬崩。 ?