我畢業(yè)于克萊門(mén)森大學(xué)政治學(xué)專(zhuān)業(yè)。我曾考慮過(guò)是否選擇學(xué)習(xí)計(jì)算機(jī)科學(xué)專(zhuān)業(yè),還在大一那年報(bào)名參加了“編程概論”課程,不過(guò)很快就退出了。實(shí)在是太難了。你可以先嘗試自學(xué),如果不行在報(bào)班。
畢業(yè)后我一直住在硅谷,我發(fā)現(xiàn)我需要學(xué)習(xí)編程。一年后,我成為了eBay公司的一名中級(jí)軟件工程師。我不想讓大家覺(jué)得這是很輕松就能做到的。實(shí)際上,這是極具挑戰(zhàn)的一件事。在這一年的不斷嘗試努力過(guò)程中,我得到了很多樂(lè)趣。
1.1自學(xué)的優(yōu)勢(shì)
雖然與擁有計(jì)算機(jī)科學(xué)學(xué)士、碩士甚至是博士學(xué)位的同事一起工作的壓力很大,但別忘記了你還有“自學(xué)的優(yōu)勢(shì)”。你選擇學(xué)習(xí)Python編程,不是出于老師布置的任務(wù),而是因?yàn)槟銉?nèi)心學(xué)習(xí)的渴望,這一點(diǎn)是你所擁有的最大優(yōu)勢(shì)。蘋(píng)果公司的創(chuàng)始人斯蒂夫·沃茲尼亞克(SteveWozniak)就是一位自學(xué)成才的程序員;還有因在美國(guó)宇航局的阿波羅登月計(jì)劃中做出卓越貢獻(xiàn)而獲得總統(tǒng)自由勛章的瑪格麗特·漢密爾頓(MargaretHamilton);還有Tumblr的創(chuàng)始人大衛(wèi)·卡普(DavidKarp),Twitter的創(chuàng)始人杰克·多西(JackDorsey),Instagram的創(chuàng)始人凱文·斯特羅姆(KevinSystrom),他們都是自學(xué)成才的程序員。
1.2為什么應(yīng)該學(xué)編程
不管你從事什么工作,編程都有助于你的職業(yè)發(fā)展。學(xué)習(xí)編程將給你自己賦能。我喜歡嘗試新想法,時(shí)刻都有希望啟動(dòng)的新項(xiàng)目。學(xué)會(huì)編程后,我就可以坐下來(lái)自己實(shí)現(xiàn),而不需要依賴(lài)他人。
編程也會(huì)提升你在其他方面的技能。因?yàn)槟闶炀氄莆樟藛?wèn)題解決能力,鮮有其他工作不會(huì)因此而受益。我最近要在Craiglist上租房,搜索并篩選房子是個(gè)非常費(fèi)力的活兒。但是我寫(xiě)了一個(gè)程序來(lái)代替我搜索,最后將結(jié)果以郵件形式發(fā)送給我。學(xué)會(huì)編程,將把你從重復(fù)性工作中解放出來(lái)。
如果你想成為軟件工程師,市場(chǎng)上對(duì)這類(lèi)崗位的需求也日益增長(zhǎng),但是符合要求的候選者卻總是供不應(yīng)求。到2020年,預(yù)計(jì)將有一百萬(wàn)個(gè)編程崗位空缺。即使你的目標(biāo)不是成為軟件工程師,科學(xué)和金融等領(lǐng)域的崗位也開(kāi)始傾向那些擁有編程經(jīng)驗(yàn)的申請(qǐng)者。
1.3沒(méi)有編程經(jīng)驗(yàn)怎么辦?
如果你之前沒(méi)有任何編程經(jīng)驗(yàn),擔(dān)心自己無(wú)法勝任編程工作,我想想告訴你的是:你完全有能力做到。人們對(duì)程序員有一些常見(jiàn)的誤解,比如程序員都得擅長(zhǎng)數(shù)學(xué)。這是錯(cuò)誤的印象,不過(guò)編程確實(shí)是一件困難的工作。幸運(yùn)的是,專(zhuān)欄涵蓋的內(nèi)容將讓這一切變得比你想象得更加容易。
為了提高編程技巧,你應(yīng)該每天練習(xí)編程。擋在你面前的唯一障礙就是無(wú)法堅(jiān)持,所以我們要采取一些措施確保自己能夠堅(jiān)持不懈。準(zhǔn)備一張檢查清單,來(lái)確保每天都有做練習(xí),而且也能夠幫助你保持專(zhuān)注。
如果你還需要其他幫助,效率專(zhuān)家TimFerris建議采用如下技巧來(lái)保持驅(qū)動(dòng)力。事先給家人或朋友一筆錢(qián),如果你在規(guī)定的時(shí)間內(nèi)完成了目標(biāo),就讓他們把錢(qián)還給你,否則就將錢(qián)捐獻(xiàn)給你討厭的機(jī)構(gòu)。
1.4學(xué)習(xí)前你需要了解
《零基礎(chǔ)學(xué)Python》不僅是教你如何使用某種特定的語(yǔ)言編程,還會(huì)介紹標(biāo)準(zhǔn)教材中所不包括的其他所有知識(shí)點(diǎn)。專(zhuān)欄內(nèi)分享的是我在成為軟件工程師過(guò)程中不得不自學(xué)的內(nèi)容。專(zhuān)欄不適合那些想要隨意了解下編程知識(shí)、將寫(xiě)代碼作為愛(ài)好的人,而是專(zhuān)門(mén)寫(xiě)給那些希望以編程為職業(yè)的人。不管你的目標(biāo)是成為一名軟件工程師、企業(yè)家,還是在其他的崗位上使用編程技能,你都是專(zhuān)欄的目標(biāo)讀者。
學(xué)會(huì)一門(mén)編程語(yǔ)言還不夠,你還需要學(xué)會(huì)其他技能,才能像計(jì)算機(jī)科學(xué)家一樣地工作。我會(huì)教授大家我從編程新手到專(zhuān)業(yè)軟件工程師過(guò)程中學(xué)到的一切。這個(gè)專(zhuān)欄,是為了向有志于編程崗位的人分享他們需要掌握的知識(shí)框架。
我經(jīng)常從自學(xué)編程的朋友那聽(tīng)到這樣的反饋:我現(xiàn)在該做什么?我還不是一名程序員,也不知道下一步該學(xué)什么?因此我設(shè)計(jì)了下面的專(zhuān)欄結(jié)構(gòu)。
1.5專(zhuān)欄的結(jié)構(gòu)
我的目標(biāo)不是包羅你需要了解的每個(gè)主題的所有細(xì)節(jié),而是提供一份指引——一個(gè)編程職業(yè)發(fā)展所需要的所有技術(shù)路線圖。由此我將專(zhuān)欄分成五個(gè)部分。
第一部分:編程簡(jiǎn)介。讓你盡快寫(xiě)出自己的第一個(gè)程序,最好在今天。
第二部分:面向?qū)ο缶幊毯?jiǎn)介。這部分將介紹不同的編程范式,著重闡述面向?qū)ο缶幊獭D銜?huì)開(kāi)發(fā)一個(gè)游戲,體會(huì)編程的強(qiáng)大能力。讀完這部分后你會(huì)沉迷于編程。
第三部分:編程工具簡(jiǎn)介。將介紹提升編程生產(chǎn)力的不同工具。這時(shí),你已經(jīng)沉迷于編程,并希望變得更好。你將會(huì)學(xué)習(xí)相關(guān)的操作系統(tǒng)、使用正則表達(dá)式提升效率、安裝并管理他人的程序,以及使用版本控制與其他工程師協(xié)作的知識(shí)。
第四部分:計(jì)算機(jī)科學(xué)簡(jiǎn)介。將簡(jiǎn)要介紹計(jì)算機(jī)科學(xué)知識(shí),主要涵蓋兩個(gè)主題——算法和數(shù)據(jù)結(jié)構(gòu)。
第五部分:找到工作。最后一部分是關(guān)于最佳編程實(shí)踐,如何找到軟件工程師的工作,團(tuán)隊(duì)協(xié)作以及程序員的自我提升。我會(huì)分享如何通過(guò)技術(shù)面試與團(tuán)隊(duì)協(xié)作的建議,以及如何進(jìn)一步提升自己的技能。
1.6從終點(diǎn)出發(fā)
我學(xué)會(huì)編程的方式,與計(jì)算機(jī)科學(xué)通常的教學(xué)方式正好相反。專(zhuān)欄的結(jié)構(gòu)是根據(jù)我自己的方式組織的。一般來(lái)說(shuō),你會(huì)先花很多時(shí)間學(xué)習(xí)理論,理論知識(shí)學(xué)的太多以至于許多計(jì)算機(jī)科學(xué)的畢業(yè)生甚至不知道如何動(dòng)手編程。杰夫·阿特伍德(JeffAtwood),在其博客“為什么程序員不會(huì)編程”中寫(xiě)道:“和我一樣,許多人都碰到了這樣的情況,編程崗位的200位申請(qǐng)者中,有199個(gè)根本不會(huì)寫(xiě)代碼。重申一遍:他們一點(diǎn)代碼都不會(huì)寫(xiě)。”這種現(xiàn)象直接促使Atwood發(fā)明了FizzBuzz代碼挑戰(zhàn),一種用來(lái)在面試中篩選申請(qǐng)者的編程測(cè)試。
《王者之旅》電影中的主角喬什(JoshWaitzkin),在《學(xué)習(xí)的藝術(shù)》一書(shū)中回憶了他如何反向?qū)W習(xí)國(guó)際象棋。他沒(méi)有和其他人一樣研究開(kāi)局,而是從學(xué)習(xí)象棋殘局(棋盤(pán)上只剩下少數(shù)幾個(gè)棋子)開(kāi)始。這樣做讓他對(duì)國(guó)際象棋有了更深的理解,并贏得了多次大賽冠軍。與此類(lèi)似,我認(rèn)為先學(xué)習(xí)如何編程再學(xué)習(xí)理論的方法更高效,因?yàn)槟銜?huì)擁有了解背后原理的強(qiáng)烈驅(qū)動(dòng)。這就是為什么專(zhuān)欄一直到第五部分才介紹計(jì)算機(jī)科學(xué)理論,而且內(nèi)容也盡量精簡(jiǎn)。雖然理論很重要,但是在你擁有了編程經(jīng)驗(yàn)之后,理論的價(jià)值才更大。
1.7專(zhuān)欄的格式
專(zhuān)欄的各個(gè)章節(jié)緊密相關(guān)。如果你讀到了某些看不懂的概念,可能在前一章已經(jīng)做了介紹。專(zhuān)欄內(nèi)盡量避免重復(fù)解釋?zhuān)岳斡涍@個(gè)特點(diǎn)。在給重點(diǎn)詞匯下定義時(shí),會(huì)使用斜體。每個(gè)章節(jié)的末尾都有一個(gè)詞匯表,對(duì)該章內(nèi)出現(xiàn)的斜體名詞進(jìn)行解釋。
專(zhuān)欄代碼段前的注釋為GitHub的網(wǎng)址,讀者可于網(wǎng)站直接復(fù)制代碼。
1.8專(zhuān)欄使用的技術(shù)
為了讓讀者盡可能的積累編程經(jīng)驗(yàn),專(zhuān)欄會(huì)介紹多種技術(shù)。在某些情況下,必須在許多不同的技術(shù)中做出選擇。在第20章“版本控制”中,我們將會(huì)學(xué)習(xí)Git的基礎(chǔ)知識(shí)。Git是一個(gè)流行的版本控制系統(tǒng),選擇介紹Git是因?yàn)楣P者認(rèn)為它已經(jīng)成為版本控制的業(yè)界標(biāo)準(zhǔn)。專(zhuān)欄中用Python來(lái)編寫(xiě)大部分的編程示例,因?yàn)樗且婚T(mén)很流行的初學(xué)者語(yǔ)言,而且即使從來(lái)沒(méi)有使用過(guò)Python的人學(xué)習(xí)起來(lái)也比較簡(jiǎn)單。此外,目前幾乎每個(gè)領(lǐng)域?qū)ython開(kāi)發(fā)者的需求都非常大。不過(guò),專(zhuān)欄會(huì)盡量做到內(nèi)容與技術(shù)無(wú)關(guān)——注重概念,而非技術(shù)本身。
1.9初學(xué)者需要準(zhǔn)備的工具
首先需要有一臺(tái)計(jì)算機(jī),以便跟著每個(gè)專(zhuān)欄內(nèi)容進(jìn)行示例練習(xí)。計(jì)算機(jī)有一個(gè)操作系統(tǒng)(operatingsystem),即一個(gè)扮演人與計(jì)算機(jī)物理硬件之間的中間人的程序。可以在屏幕上看到的稱(chēng)為圖形用戶(hù)界面(GraphicalUserInterface,GUI),它是操作系統(tǒng)的一部分。
臺(tái)式計(jì)算機(jī)和筆記本電腦目前有3種常用的操作系統(tǒng):Windows、UNIX和Linux。
Windows是微軟推出的操作系統(tǒng)。
UNIX操作系統(tǒng)發(fā)明于20世紀(jì)70年代,目前最流行的UNIX操作系統(tǒng)是蘋(píng)果的OSX。
Linux則是目前世界上大部分服務(wù)器(server)都在使用的一款開(kāi)源操作系統(tǒng)。服務(wù)器指的是執(zhí)行托管網(wǎng)站等任務(wù)的計(jì)算機(jī)或計(jì)算機(jī)程序。
開(kāi)源(open-source)意味著軟件不歸某個(gè)公司或個(gè)人所有,而是由一群志愿者維護(hù)。Linux和UNIX都是類(lèi)UNIX操作系統(tǒng),意味著二者之間非常相似。
如果你喜歡我的專(zhuān)欄《零基礎(chǔ)學(xué)Python3》,有問(wèn)題歡迎給我留言,我會(huì)第一時(shí)間反饋給您。https://learning.snssdk.com/feoffline/toutiao_wallet_bundles/toutiao_learning_wap/online/article.html?item_id=6681141509619712520&app_name=news_article