想學(xué)習(xí)Python? 加群:778570108? ?教學(xué)視頻分享和在線課堂,專業(yè)講學(xué)钞啸。
人生苦短几蜻,很高興你選擇了python,這是我比較喜歡的語(yǔ)言体斩。如果你是想做python web相關(guān)的話梭稚,可以看看這個(gè)指南python web 入坑指南 - python-web-guide 0.1 文檔,都是根據(jù)我的工作經(jīng)(cai)驗(yàn)(keng)總結(jié)的。主要涉及python網(wǎng)站和爬蟲(chóng)相關(guān)的開(kāi)發(fā)絮吵,還有一些工程性的東西弧烤。入行不久,經(jīng)驗(yàn)有限蹬敲,希望能給你指條路暇昂。下邊列舉了計(jì)算機(jī)基礎(chǔ)、開(kāi)發(fā)工具伴嗡、代碼規(guī)范急波、軟件工程相關(guān)的東西,恕我沒(méi)法像李笑來(lái)老師那樣讓你倆月速成瘪校,不過(guò)這些知識(shí)都掌握(或者大部分入個(gè)門)找個(gè)工作應(yīng)該是沒(méi)問(wèn)題的澄暮。筆者基本就是靠自學(xué) Python web 入職知乎的。最近又錄了一門面試的課程渣淤。
看到有同學(xué)覺(jué)得我寫(xiě)得又臭又長(zhǎng)(實(shí)際上緩存優(yōu)化和網(wǎng)站安全都沒(méi)涉及到)赏寇,我就大致總結(jié)一下吧,因?yàn)楹芏鄸|西都是我工作中慢慢記錄的价认,所以可能多了些嗅定,新手一下子消化不完。其實(shí)我只是偷懶復(fù)制粘貼了下我之前記錄的博客用踩。簡(jiǎn)單總結(jié)來(lái)說(shuō)就是:
python語(yǔ)法:《python核心編程》
算法和數(shù)據(jù)結(jié)構(gòu): 隨便一本參考書(shū)渠退,了解基礎(chǔ)概念,幫你寫(xiě)出高效程序
http協(xié)議:做web http協(xié)議是基礎(chǔ)脐彩,推薦個(gè)入門的《圖解HTTP》
linux:《鳥(niǎo)哥的linux私房菜》碎乃,因?yàn)轫?xiàng)目部署一般用linux系統(tǒng),所以需要了解linux
mysql:隨便一本參考書(shū)都可以惠奸。做后端項(xiàng)目肯定需要數(shù)據(jù)庫(kù)
版本控制:git梅誓,目前最流行的版本控制工具
代碼風(fēng)格:pep8標(biāo)準(zhǔn)
測(cè)試:pytest,正規(guī)項(xiàng)目需要單元測(cè)試
開(kāi)發(fā)工具:Pycharm等。
web框架:django/flask/tornado等梗掰。實(shí)際上如果可以參照f(shuō)lask文檔教程獨(dú)立寫(xiě)個(gè)博客就算入門了嵌言,至少基本的知識(shí)都涉及了。數(shù)據(jù)庫(kù)什么的最好親自安裝及穗,善用google摧茴、stackoverflow、github埂陆。就算去培訓(xùn)班估計(jì)知識(shí)點(diǎn)也不會(huì)超過(guò)我以上列舉的這些苛白,這些都是工作中最緊密相關(guān)的部分。我之前練習(xí)tornado寫(xiě)了個(gè)簡(jiǎn)單的小網(wǎng)站微閱讀焚虱,專門閱讀我感興趣的微信號(hào)购裙,爬蟲(chóng)和網(wǎng)站都涉及到了。學(xué)有所用就是最好的練習(xí)方式著摔。初學(xué)者一開(kāi)始不要害怕缓窜,我列舉的很多也是我工作中才慢慢學(xué)到的,一開(kāi)始學(xué)python的時(shí)候我sql語(yǔ)句都不怎么會(huì)谍咆,隨著你的學(xué)習(xí)做出成果了會(huì)不斷給你正反饋禾锤,入門可能會(huì)有一段困難期需要你克服(比方說(shuō)編碼問(wèn)題、包導(dǎo)入問(wèn)題摹察、性能問(wèn)題)恩掷。python相對(duì)其他語(yǔ)言入門算是容易的,而且生產(chǎn)力高供嚎,又能干很多事(自動(dòng)化黄娘、web開(kāi)發(fā)、爬蟲(chóng)克滴、數(shù)據(jù)分析等等)逼争,算是性價(jià)比很高的一門語(yǔ)言,號(hào)稱偽代碼語(yǔ)言(易讀)和黑客語(yǔ)言(黑客工具)劝赔,隨著大數(shù)據(jù)和人工智能火起來(lái)誓焦,python再次展現(xiàn)出活力。
上面這些列舉我覺(jué)得這已經(jīng)是一個(gè)合格開(kāi)發(fā)者比較基礎(chǔ)的東西了着帽,如果這個(gè)你還覺(jué)得掌握不了杂伟,那我覺(jué)得你可能不太適合入行(這些知識(shí)至少要有入門級(jí)的水平)。說(shuō)python很簡(jiǎn)單的人可能只是把它當(dāng)個(gè)玩具或者業(yè)余用用仍翰,而我是要靠它吃飯的赫粥。如果你希望深入學(xué)習(xí),下邊我引用了很多書(shū)籍和參考資料予借。正像很多知乎技術(shù)牛人說(shuō)的越平,語(yǔ)言只是個(gè)工具频蛔,你要掌握的是相關(guān)技術(shù)棧(數(shù)據(jù)、后端喧笔、運(yùn)維帽驯、爬蟲(chóng)等),而不是僅僅會(huì)使用一些python語(yǔ)法糖书闸。另外我只是個(gè)技術(shù)一般的python后端(工作一年多點(diǎn)的初級(jí)工程師),我不是技術(shù)牛人利凑,我的優(yōu)點(diǎn)在于我持續(xù)學(xué)習(xí)總結(jié)吧浆劲。我覺(jué)得編程有時(shí)候不需要特殊的天賦,但是興趣和學(xué)習(xí)能力還是很重要的哀澈。除非你天賦異稟牌借,不然沒(méi)有捷徑(要靠持續(xù)看書(shū)和針對(duì)性練習(xí)),這一行里牛人割按、聰明人膨报、勤奮者太多了,你要怎么與他們協(xié)作or競(jìng)爭(zhēng)适荣?公司里的也不都是技術(shù)牛人现柠,很多是靠編程手藝混個(gè)飯吃(所以要靠規(guī)范、流程弛矛、測(cè)試够吩、codereview防止程序員捅婁子)。我發(fā)現(xiàn)現(xiàn)在python慢慢火了丈氓,很多人開(kāi)始學(xué)習(xí)周循,但是業(yè)余選手太多,正規(guī)軍比較少万俗,而目前關(guān)于python工程實(shí)踐方面的資料并不多湾笛,我記錄了很多工程相關(guān)的東西只是希望國(guó)內(nèi)的python學(xué)習(xí)者可以越來(lái)越專業(yè),有越來(lái)越多有才智的人為python社區(qū)貢獻(xiàn)力量闰歪。python web入門一年(附python web入坑指南)最后這個(gè)是我大四開(kāi)始學(xué)習(xí)python找工作的經(jīng)歷和一些學(xué)習(xí)方法論嚎研,有興趣的可以看看。
以下是長(zhǎng)文课竣,慎入嘉赎,高手請(qǐng)無(wú)視。沒(méi)毅力或沒(méi)興趣的建議還是跟著輪子哥看看美胸和大腿吧于樟,程序員可能不適合你:
入門基礎(chǔ)
編程語(yǔ)言: Python
Python入門相對(duì)容易又可以干很多事(網(wǎng)站,運(yùn)維,數(shù)據(jù),爬蟲(chóng)等)公条,是一門方便的工具語(yǔ)言。2016年TIOBE排名顯示Python已經(jīng)名列第四迂曲,成為腳本語(yǔ)言之首靶橱。 國(guó)外的Youtube,Instagram,Pinterest关霸,Reddit传黄, Quora等知名應(yīng)用一開(kāi)始都是基于Python構(gòu)建,國(guó)內(nèi)的豆瓣队寇,知乎膘掰,果殼,餓了么等也是Python應(yīng)用的典型佳遣。這也給了國(guó)內(nèi)Python開(kāi)發(fā)者一陣強(qiáng)心劑识埋,Python的生態(tài)環(huán)境可以支撐起重量級(jí)的 產(chǎn)品。這里不想挑起語(yǔ)言之爭(zhēng)零渐,php窒舟,nodejs,java诵盼,ruby等都有豐富的生態(tài)環(huán)境惠豺。不過(guò)目前來(lái)看,技術(shù)選型用Python在招聘风宁、學(xué)習(xí)洁墙、培訓(xùn)、敏捷開(kāi)發(fā)等方面還是一個(gè)比較折中的選擇(主要在于人杀糯,而不是語(yǔ)言)扫俺。 python,ruby之類的語(yǔ)言優(yōu)勢(shì)在于其生產(chǎn)力固翰,你能在極短時(shí)間內(nèi)就搭建出原型從而贏得產(chǎn)品競(jìng)爭(zhēng)狼纬。當(dāng)然python也有其缺點(diǎn),比如python2編碼問(wèn)題骂际,性能問(wèn)題疗琉,易開(kāi)發(fā),難維護(hù)歉铝,python3激進(jìn)地舍去了很多語(yǔ)言不好的特性導(dǎo)致無(wú)法兼容python2等盈简。 推薦一下幾本個(gè)人認(rèn)為比較好的Python書(shū)籍:
《python-guide》requests作者寫(xiě)的guide
《A Byte of Python》一百多頁(yè)的小書(shū),可以快速熟悉Python語(yǔ)言太示。
《Python核心編程》比較全面的Python書(shū)籍柠贤,介紹了Python語(yǔ)言的方方面面。
《Fluent Python》Python進(jìn)階类缤,涉及了很多Python高級(jí)主題臼勉。
《Python3 Cookbook》Python進(jìn)階讀物。
《Python高級(jí)編程》小明明的python高級(jí)編程
當(dāng)然還有Python的官方文檔作為參考餐弱,不過(guò)有些文檔有些地方比較晦澀宴霸,還是推薦書(shū)籍入門囱晴。網(wǎng)上目前也可以搜到很多免費(fèi)的電子書(shū)。 如果有時(shí)間可以看看國(guó)內(nèi)廖學(xué)峰寫(xiě)的Python教程瓢谢。
算法與數(shù)據(jù)結(jié)構(gòu)
編寫(xiě)良好的代碼需要了解常用的算法和數(shù)據(jù)結(jié)構(gòu)畸写,雖然你可能很少會(huì)自己實(shí)現(xiàn),但是對(duì)于Python語(yǔ)言中一些常用數(shù)據(jù)結(jié)構(gòu)如list, tuple, set, frozenset, dict和collections模塊中的OrderedDict, defaultdict, deque, namedtuple, Counter等應(yīng)該知道什么時(shí)候用氓扛。最主要的還是了解算法中遞歸枯芬,二分等常用思想,寫(xiě)出高效易用的代碼采郎。如果你想在線練習(xí)破停,可以做一些Acm基礎(chǔ)題或者去leetcode等網(wǎng)站刷題。 推薦書(shū)籍:
《算法導(dǎo)論》你可以挑選感興趣的章節(jié)啃一啃尉剩,也可以去網(wǎng)易公開(kāi)課看下視頻教程。如果不是計(jì)算機(jī)專業(yè)的可以看下《計(jì)算機(jī)科學(xué)導(dǎo)論》這門公開(kāi)課毅臊,正好也是以Python語(yǔ)言講解的理茎。
計(jì)算機(jī)網(wǎng)絡(luò)
對(duì)于應(yīng)用開(kāi)發(fā)者來(lái)說(shuō)大部分時(shí)間可能不太會(huì)接觸特別底層的問(wèn)題,但是了解網(wǎng)絡(luò)的運(yùn)行原理還是必要的管嬉。網(wǎng)上有個(gè)面試題從輸入U(xiǎn)RL 到頁(yè)面加載完成的過(guò)程中都發(fā)生了什么事情皂林?如果對(duì)其中大部分的概念都了解就算是入門了。網(wǎng)絡(luò)相關(guān)書(shū)籍可以隨便找一本看看蚯撩。Http協(xié)議對(duì)于web開(kāi)發(fā)者來(lái)說(shuō)比較重要础倍,需要深入了解。推薦書(shū)籍:
《圖解Http》一本小白入門Http協(xié)議的好書(shū)胎挎,有大量圖片示例沟启。
《Http權(quán)威指南》Http協(xié)議最權(quán)威的講解,大部頭著作犹菇,可以看看最基礎(chǔ)的部分德迹。
Linux系統(tǒng)
大部分Python應(yīng)用都是跑在Linux服務(wù)器上的,大部分開(kāi)源軟件使用的也是linux系統(tǒng)揭芍,即使日常工作不使用linux胳搞,一些基本的linux命令也要了解。 比如常用的文件操作称杨,目錄操作肌毅,進(jìn)程操作等。你可以使用類unix系統(tǒng)mac或者linux版本ubuntu作為學(xué)習(xí)環(huán)境姑原。 推薦:
《CONQUERING THE COMMAND LINE》掌握這上面的命令基本就可以滿足日常需求了悬而。
《鳥(niǎo)哥的Linux私房菜.基礎(chǔ)學(xué)習(xí)篇》淺顯易懂,入門Linux命令的好書(shū)页衙。
數(shù)據(jù)庫(kù)
現(xiàn)在用得比較多的有三種類型的數(shù)據(jù)庫(kù)摊滔,關(guān)系型數(shù)據(jù)庫(kù)(mysql等)阴绢,文檔型數(shù)據(jù)庫(kù)(mongodb等),和內(nèi)存型數(shù)據(jù)庫(kù)(redis等)艰躺。三種數(shù)據(jù)庫(kù)各有優(yōu)勢(shì)和特色呻袭,后端程序員需要了解下不同類型數(shù)據(jù)庫(kù)的使用方法和應(yīng)用場(chǎng)景,靈活應(yīng)用到后端代碼中腺兴。關(guān)于各種數(shù)據(jù)庫(kù)網(wǎng)上已經(jīng)有不少資料左电,讀者可以自行搜索學(xué)習(xí)。
版本控制
目前最流行的應(yīng)該就是git了页响。版本控制工具是多人協(xié)作必不可少的工具篓足,入門的程序員需要掌握基本的git命令,可以把github作為個(gè)人練習(xí)的工具闰蚕。
專業(yè)性
公司做項(xiàng)目不是自己過(guò)家家栈拖,需要你具備寫(xiě)文檔,注釋没陡,單元測(cè)試的能力涩哟。如果你現(xiàn)在還不了解一個(gè)正規(guī)python項(xiàng)目都有哪些組件構(gòu)成,請(qǐng)去github克隆一份知名的代碼倉(cāng)庫(kù)盼玄,花點(diǎn)時(shí)間仔細(xì)分析下它的項(xiàng)目結(jié)構(gòu)和源代碼贴彼。github上很多優(yōu)秀資源你可以自己去探索。
軟技能
程序員和計(jì)算機(jī)打交道比較多埃儿,我在大學(xué)的時(shí)候就喜歡一個(gè)人悶頭啃書(shū)器仗。但是工作了你會(huì)和很多人交流協(xié)作,你的同事(前端童番、測(cè)試精钮、運(yùn)維、產(chǎn)品經(jīng)理妓盲、客戶等)杂拨、上司甚至老板,你要學(xué)會(huì)如何有效溝通和表達(dá)悯衬,拋棄一些學(xué)生思維弹沽,從一個(gè)學(xué)生轉(zhuǎn)到職場(chǎng)人士,這其實(shí)是一次很好的鍛煉筋粗。筆者剛?cè)肼殘?chǎng)的時(shí)候就不太會(huì)表達(dá)協(xié)作策橘,而且情緒易激動(dòng),甚至一意孤行導(dǎo)致項(xiàng)目延誤過(guò)娜亿,這些虧我都是吃過(guò)的丽已。希望后來(lái)人吸取教訓(xùn),代碼之外還有很多需要學(xué)習(xí)的买决。
后端技術(shù)棧
對(duì)于技能需求可以在拉勾上搜一下Python的職位沛婴,看看各個(gè)公司對(duì)Python的要求吼畏。或者你可以寫(xiě)個(gè)拉勾網(wǎng)的爬蟲(chóng)嘁灯,對(duì)數(shù)據(jù)做一個(gè)簡(jiǎn)單的統(tǒng)計(jì)泻蚊,筆者當(dāng)初找工作就是這么干的。 另外丑婿,真正做項(xiàng)目還需要你熟悉python的各種庫(kù)和框架性雄,比如django/flask/tornado/requests/sqlalchemy/unittest/pytest/celery等等,掌握了合適的工具才能快速上手做東西羹奉,公司恨不得你第一天入職第二天就能寫(xiě)項(xiàng)目秒旋。 所以,在你入了門以后請(qǐng)盡快熟悉python web的技術(shù)棧诀拭。公司不管你會(huì)什么算法迁筛,只在乎你的生產(chǎn)力嫂粟。 推薦一些文章供參考:
《PYTHON后端相關(guān)技術(shù)/工具椧蚋荆》
代碼風(fēng)格
不一致的開(kāi)發(fā)風(fēng)格會(huì)給協(xié)作開(kāi)發(fā)帶來(lái)困難隧魄,同時(shí)也妨礙代碼閱讀,讀代碼的時(shí)間是多于寫(xiě)代碼的条舔,所以有必要統(tǒng)一編碼規(guī)范。推薦使用pep8或者其子集作為代碼規(guī)范,使用vim插件python-mode開(kāi)啟pep8和pylint對(duì)代碼就行檢測(cè)赋铝。如果使用其他編輯器或者IDE工具最好也使用相關(guān)插件使代碼符合規(guī)范。工程上的代碼應(yīng)該盡可能保持清晰易懂沽瘦,推薦看看requests等優(yōu)秀的開(kāi)源庫(kù)學(xué)習(xí)下革骨。強(qiáng)烈建議新手看看以下參考寫(xiě)出格式規(guī)范的代碼,強(qiáng)烈建議打開(kāi)pep8和pylint析恋,pylint可以幫助你干掉很多低級(jí)錯(cuò)誤良哲。建議使用py的公司都指定好自己的代碼規(guī)范并且嚴(yán)格遵守,同時(shí)做好code review助隧,防止造成以后的維護(hù)噩夢(mèng)筑凫。
《PEP 8 – Style Guide for Python Code》
《Google開(kāi)源項(xiàng)目風(fēng)格指南-Python風(fēng)格指南》google風(fēng)格的docstring比較贊
《編寫(xiě)優(yōu)雅代碼》新浪微博的培訓(xùn)課程,可以學(xué)習(xí)一下
《爛代碼的那些事》Axb的自我修養(yǎng)并村,大神的文章
一個(gè)簡(jiǎn)潔的代碼規(guī)范:
格式請(qǐng)遵守pep8,務(wù)必開(kāi)啟編輯器的pylint和pep8檢測(cè)巍实。vim請(qǐng)?jiān)囋噋ython-mode插件。
模塊哩牍、類和函數(shù)請(qǐng)使用docstring格式注釋棚潦,除顯而易見(jiàn)的代碼,每個(gè)函數(shù)應(yīng)該簡(jiǎn)潔地說(shuō)明函數(shù)作用膝昆,函數(shù)參數(shù)說(shuō)明和類型丸边,返回值和類型叠必。對(duì)于復(fù)雜的傳入?yún)?shù)和返回值最好把示例附上。如有引用妹窖,可以把jira纬朝,github,stackoverflow嘱吗,需求文檔地址附上玄组。 良好的文檔和注釋很考驗(yàn)人的判斷(何時(shí)注釋)和表達(dá)能力(注釋什么)。
動(dòng)態(tài)語(yǔ)言的變量命名盡量可以從名稱就知道其類型谒麦,比如url_list, info_dict_list俄讹,降低閱讀和理解的難度。(我的感覺(jué)就是動(dòng)態(tài)語(yǔ)言易編寫(xiě)绕德,寫(xiě)不好后期更難維護(hù))患膛。比如經(jīng)常用date命名,有時(shí)它是個(gè)datetime.date對(duì)象耻蛇,有時(shí)候是個(gè)字符串踪蹬,還有人喜歡用info結(jié)尾,有時(shí)候是個(gè)dict臣咖,時(shí)候是個(gè)string跃捣,看得我暈頭轉(zhuǎn)向,總不能所有地方都用instance判斷吧夺蛇,怪不得python3加上了type hint疚漆。沒(méi)有注釋和文檔看得我想罵人。命名在動(dòng)態(tài)語(yǔ)言里頭十分考究刁赦,希望你可以注意娶聘。
風(fēng)格上衡量不了請(qǐng)參考知名開(kāi)源項(xiàng)目的做法。以可讀性和維護(hù)性作為標(biāo)準(zhǔn)甚脉。
編程范式
Python支持多重編程范式丸升,過(guò)程式(Procedural),面向?qū)ο?OOP)牺氨,簡(jiǎn)單函數(shù)式(Functional)編程狡耻。不同人,不同語(yǔ)言轉(zhuǎn)過(guò)來(lái)的人猴凹,Python老鳥(niǎo)和菜鳥(niǎo)等寫(xiě)出來(lái)的代碼風(fēng)格迥異酝豪。筆者之前的同事有對(duì)OOP挖掘較深的,一般習(xí)慣寫(xiě)OOP風(fēng)格的精堕,但現(xiàn)在的項(xiàng)目卻很少用類孵淘,之前的代碼都是用一個(gè)個(gè)函數(shù)來(lái)實(shí)現(xiàn)各種功能。對(duì)個(gè)人風(fēng)格喜好不予評(píng)判歹篓,但是個(gè)人感覺(jué)還是需要深挖一些Python的特性瘫证,雖然Python容易入門揉阎,但是有些語(yǔ)言特性還是需要一段時(shí)間才能了解深入的。使用各種風(fēng)格的時(shí)候要酌情判斷背捌,比如一個(gè)過(guò)程需要維護(hù)大量的中間狀態(tài)時(shí)毙籽,單純的使用函數(shù)會(huì)寫(xiě)得很冗長(zhǎng),這時(shí)候可以用類和子函數(shù)的形式簡(jiǎn)化它毡庆。當(dāng)你無(wú)法判斷哪種方式比較好的時(shí)候坑赡,請(qǐng)?jiān)诮忉屍骼镞?import this看看。當(dāng)可以實(shí)現(xiàn)一樣的功能時(shí)么抗,往往簡(jiǎn)單易懂的方式就是最好的毅否。一些參考:
《requests》requests庫(kù)是接口設(shè)計(jì)的典范,可以參考參考蝇刀。
《Python3 面向?qū)ο缶幊獭?/a>關(guān)于Python面向?qū)ο蠛鸵恍┰O(shè)計(jì)模式螟加。
《OOP vs Functional Programming vs Procedural》
何謂Pythonic?
Python的世界里你會(huì)聽(tīng)到這個(gè)詞”Pythonic”,大概就是指代碼符合Python的慣用法吞琐,使用的都是Python的語(yǔ)法糖捆探。比如從其他語(yǔ)言轉(zhuǎn)到Python 的寫(xiě)出來(lái)的代碼很可能受到以前思維方式的影響,寫(xiě)出來(lái)的代碼不夠Pythonic: 比如:
# 不夠Pythonic
if a < b and a > c:
? ? pass
# python里卻可以這么寫(xiě)
if c < a < b:
? ? pass
# bad
i = 0
while i < mylist_length:
? ? do_something(mylist[i])
? ? i += 1
# good
for element in mylist:
? do_something(element)
# bad, 不要使用默認(rèn)可變對(duì)象作為默認(rèn)參數(shù)
def f(a, b=[])
? ? pass
# good
def f(a, b=None):
? ? if b is None:
? ? ? ? b = []
Python有一些語(yǔ)法上的坑站粟,比如默認(rèn)參數(shù)只計(jì)算一次黍图,不要使用可變類型作為默認(rèn)參數(shù)等,看多了寫(xiě)多了就知道了奴烙。尤其是可變類型作為函數(shù)參數(shù)傳入后被改變的情況(函數(shù)盡量不要有副作用)雌隅,尤其要注意。 一些參考幫助寫(xiě)出Pythonic的代碼:
《Pythonic到底是什么玩意兒缸沃?》賴勇浩的博客
《python-guide Code Style》python-guide關(guān)于代碼風(fēng)格的介紹
《Learning the Pythonic Way》一個(gè)cmu的課件
《Writing Idiomatic Python3》一本免費(fèi)小書(shū)
《編寫(xiě)高質(zhì)量代碼:改善Python程序的91個(gè)建議》給國(guó)人的書(shū)捧捧場(chǎng)^_^,類似《Effective python》
《好好寫(xiě)代碼》豆瓣工程師董偉明的文章
敏捷與TDD
筆者非計(jì)算機(jī)科班出身修械,對(duì)于軟件工程的東西也不是很懂趾牧,最近掃了一本《敏捷軟件開(kāi)發(fā)-原則、模式與實(shí)踐》肯污,感覺(jué)有些東西還是挺有啟發(fā)的翘单。在這里稍微提一下敏捷中的TDD(Test-driven development)吧。因?yàn)镻ython是動(dòng)態(tài)類型語(yǔ)言蹦渣,不像靜態(tài)語(yǔ)言可以編譯期檢查哄芜,很多問(wèn)題運(yùn)行時(shí)暴露出來(lái),而且動(dòng)態(tài)語(yǔ)言語(yǔ)法靈活也容易刨坑柬唯。用TDD是可以提升代碼質(zhì)量的认臊,雖然有時(shí)候完全用TDD可能有些死板,但是TDD的一些思想還是很值得借鑒:
測(cè)試最重要的是對(duì)架構(gòu)和設(shè)計(jì)的影響锄奢,不是為了測(cè)試而測(cè)試失晴。一般難以測(cè)試的代碼往往是設(shè)計(jì)不好剧腻,耦合嚴(yán)重的代碼。沒(méi)有測(cè)試的代碼同時(shí)也給重構(gòu)帶來(lái)壓力和隱患涂屁。
編碼的時(shí)候想著如何測(cè)試它书在,甚至都可以改善設(shè)計(jì)。對(duì)于動(dòng)態(tài)語(yǔ)言拆又,一直有『動(dòng)態(tài)語(yǔ)言一時(shí)爽儒旬,代碼重構(gòu)火葬場(chǎng)』這種說(shuō)法,說(shuō)明動(dòng)態(tài)語(yǔ)言如果沒(méi)有良好的設(shè)計(jì)和測(cè)試帖族,以后是會(huì)埋下不少隱患的栈源。 當(dāng)你發(fā)現(xiàn)debug的時(shí)間甚至比寫(xiě)代碼長(zhǎng)很多的時(shí)候,當(dāng)你發(fā)現(xiàn)總是返工對(duì)代碼修修補(bǔ)補(bǔ)的時(shí)候盟萨,或者可嘗試下TDD凉翻。 你可以學(xué)習(xí)使用下python的unittest或者pytest等進(jìn)行單元測(cè)試,以保證代碼質(zhì)量捻激。個(gè)人工作經(jīng)驗(yàn)也表明制轰,難以測(cè)試的代碼往往是設(shè)計(jì)不太好的代碼。 update: 經(jīng)驗(yàn)表明胞谭,TDD未必是必要的垃杖,但是單元測(cè)試是很必要的。如果是新項(xiàng)目建議為所有的復(fù)雜函數(shù)寫(xiě)單元測(cè)試丈屹,為項(xiàng)目質(zhì)量保證调俘。 下邊是一些參考書(shū)籍:
《pytest: helps you write better programs》
《軟件調(diào)試修煉之道》了解下調(diào)試和跟蹤技術(shù)
《代碼大全 (豆瓣)》板磚書(shū),從小白快速邁入職業(yè)程序員
A simple example of Python OOP development (with TDD) - Part 1
開(kāi)發(fā)工具(很多只列舉個(gè)名字旺垒,具體使用請(qǐng)自行g(shù)oogle)開(kāi)發(fā)和編程工具 - python-web-guide 0.1 文檔
Pycharm彩库。專業(yè)的python ide,功能很強(qiáng)大先蒋,特別喜歡它的代碼merge工具骇钦,不想被編輯器折騰死的推薦直接使用。
vim竞漾。本人比較喜歡眯搭,配上各種插件編輯效率很高。Vim Awesome可以到這個(gè)上面安裝排名靠前的那些插件业岁,能夠大大提高編輯效率鳞仙,替代IDE。其他編輯器sublime笔时,atom棍好,vscode,emacs等不熟,根據(jù)個(gè)人喜好來(lái)吧梳玫。(在google搜索python awesome等可以在github上搜索到一些awesome項(xiàng)目爹梁,總結(jié)了該語(yǔ)言很多技術(shù)工具)。炫酷的效果圖:http://7ktuty.com1.z0.glb.clouddn.com/vim_tmux_tdd.gif
tmux提澎。比screen好用姚垃,可以用來(lái)分屏等,ubuntu下基本就不用使用terminator之類的分屏工具了
zsh盼忌。替代原生的bash shell积糯,提供了好多方便的特性。linux/mac下vim+tmux+zsh簡(jiǎn)直是絕配谦纱,甚至可以直接在服務(wù)器上方便地?cái)]代碼看成。
item2(mac)。替代原生的終端跨嘉。
brew(mac)川慌。類似ubuntu下的apt-get,可以方便安轉(zhuǎn)各種軟件和工具祠乃。
autojump梦重。方便在命令行里來(lái)回跳轉(zhuǎn)。
日志收集工具
Sentry.
Fluentd
管理及運(yùn)維工具
Supervisor.進(jìn)程管理
Fabric.應(yīng)用部署
docker.最近比較火的容器技術(shù)
SaltStack和Ansible. 配置管理
StatsDGraphite等web監(jiān)控
調(diào)試工具
curl
http
postman
一些常見(jiàn)原則
對(duì)于什么是好代碼亮瓷,什么是壞代碼我現(xiàn)在還沒(méi)有太多經(jīng)驗(yàn)琴拧,但是最近工作接手別人的代碼感覺(jué)困難重重,還是too naive啊嘱支。每個(gè)人實(shí)力不同蚓胸,風(fēng)格不同,一起協(xié)作的時(shí)候確實(shí)會(huì)遇到很多問(wèn)題和分歧除师。感覺(jué)code review啥的還是很有必要的沛膳,可以讓菜鳥(niǎo)學(xué)習(xí)下老鳥(niǎo)的經(jīng)驗(yàn),也可以讓老鳥(niǎo)指導(dǎo)下菜鳥(niǎo)的失誤汛聚,同時(shí)避免過(guò)于個(gè)人化的糟糕風(fēng)格(比如讓人想立馬離職的高達(dá)成百上千行的復(fù)雜函數(shù)锹安,比如上來(lái)一堆不知道干啥的幻數(shù),比如上來(lái)就 form shit import * 導(dǎo)致俺的編輯工具找不到定義贞岭,比如整個(gè)項(xiàng)目沒(méi)有一行測(cè)試代碼,比如不知道用logger搓侄,全用print+眼珠子瞅瞄桨,一個(gè)bug找半天,比如沒(méi)有pep8檢測(cè)導(dǎo)致你的環(huán)境打開(kāi)別人的代碼彪了一堆警告......)讶踪。說(shuō)好的規(guī)范呢芯侥,說(shuō)好的設(shè)計(jì)模式呢,說(shuō)好的高內(nèi)聚低耦合呢?說(shuō)好的KISS原則呢柱查?說(shuō)好的DYR原則呢廓俭?其實(shí)俺只是想多活幾年,至少不要到三十歲頭發(fā)掉光唉工。啥設(shè)計(jì)模式的可以不用研乒,能干活的代碼就行,牢記幾個(gè)原則淋硝,沒(méi)事的時(shí)候?qū)?fù)雜的東西重構(gòu)下雹熬,代碼不能自解釋的搞搞文檔,不被隊(duì)友坑同時(shí)不坑隊(duì)友谣膳,俺就心滿意足了竿报。最后還是列舉一下常用原則、思想和注意事項(xiàng)吧(最好import this看看python之禪继谚,很多思想是通用的):
KISS原則烈菌,Keep It Simple, Stupid。能簡(jiǎn)單的絕對(duì)不要復(fù)雜花履,不要炫耀代碼技巧芽世,簡(jiǎn)單可讀最重要,后人會(huì)感謝你的臭挽。
DRY原則捂襟。就算咱不懂設(shè)計(jì)模式,只要代碼復(fù)雜重復(fù)了就及時(shí)抽取出來(lái)欢峰,至少不會(huì)碰到大問(wèn)題葬荷。
YAGNI(You Aren’t Gonna Need It),不要猜測(cè)性編碼纽帖。
快速失敗宠漩,靈活使用斷言。契約式編程(先驗(yàn)條件和后置條件)
及時(shí)清理技術(shù)債務(wù)懊直,防止『破窗』扒吁。
一次只做一件事。盡量避免復(fù)雜度過(guò)高的邏輯室囊,盡量做到代碼簡(jiǎn)單雕崩,意圖明確。
高內(nèi)聚融撞,低耦合盼铁。意義相近的東西應(yīng)該放到同一個(gè)地方。寫(xiě)代碼的時(shí)候想著怎么測(cè)試它就能避免過(guò)度復(fù)雜尝偎,耦合嚴(yán)重的代碼饶火。
代碼應(yīng)當(dāng)易于理解鹏控。 《代碼大全》、《編寫(xiě)可讀代碼的藝術(shù)》肤寝、《代碼整潔之道》啥的都是告訴你代碼最好自解釋当辐,好理解。記住代碼首先是給人看的鲤看,其次才是讓機(jī)器執(zhí)行的缘揪,不要過(guò)度設(shè)計(jì)。
不要過(guò)早優(yōu)化刨摩,最小可用原則寺晌。先測(cè)量,后優(yōu)化澡刹。根據(jù)二八定律呻征,大部分性能瓶頸只在20%的部分,這些才是真正需要優(yōu)化的地方罢浇。
不要炫技陆赋,可讀性最重要。合適的地方使用合適的技巧嚷闭,不要過(guò)度炫耀語(yǔ)法糖導(dǎo)致維護(hù)和理解困難攒岛。
Think about future, design with flexibility, but only implement for production. 盡量設(shè)計(jì)良好,避免繁雜和冗余胞锰。好的架構(gòu)和設(shè)計(jì)都是不斷演進(jìn)的灾锯。
文檔化。哪些東西該文檔化嗅榕,哪些該注釋需要做好顺饮,以便新手可以盡快上手。盡量做到代碼即文檔凌那,tornado的文檔和代碼就是典范兼雄。
不要直接吞掉任何錯(cuò)誤和異常,一定要做好記錄帽蝶。血淚教訓(xùn)赦肋,使用Sentry或其他工具記錄好異常發(fā)生的信息,為定位bug提供便利励稳,web端的bug一般不好復(fù)現(xiàn)佃乘。
......還有的大家可以自己補(bǔ)充
還有OOP那一套:
開(kāi)閉原則(Open-Closed Principle)
依賴倒置原則(Dependence Inversion Principle)
接口隔離原則(Interface Segregation Principle)
里氏代換原則(Liskov Substitution Principle)
迪米特原則(Law of Demeter)
合成復(fù)用原則(Composite/Aggregate Reuse Principle)
單一職責(zé)原則(Single-Responsibility Principle)
python代碼壞味道(新手經(jīng)常犯的錯(cuò)誤)
不pythonic,寫(xiě)得很業(yè)余驹尼,真就信了半天學(xué)會(huì)python
上來(lái)就整一個(gè)不知道啥意思的magic number趣避,大學(xué)老師沒(méi)教你不要濫用幻數(shù)?
上來(lái)就from shit import *
復(fù)雜函數(shù)沒(méi)有docstring扶欣,傳入了一個(gè)嵌套字典都不注釋鹅巍,娘來(lái)
變量名亂起,看不出類型料祠,加重理解負(fù)擔(dān)骆捧。我在想是不是動(dòng)態(tài)語(yǔ)言用匈牙利命名法要好一些
不遵守pep8,沒(méi)有pylint檢測(cè)髓绽,打開(kāi)代碼一堆語(yǔ)法警告敛苇,老子的編輯器滿眼都是warnning,編輯器用不好就老老實(shí)實(shí)用pycharm顺呕,用編輯器就老老實(shí)實(shí)裝好語(yǔ)法檢測(cè)和pylint檢測(cè)插件枫攀,沒(méi)有插件請(qǐng)考慮換一個(gè)editor
沒(méi)有單元測(cè)試,不知道怎么寫(xiě)測(cè)試(print大法好株茶?)
超長(zhǎng)函數(shù)来涨,沒(méi)有復(fù)用和拆分,我智商低启盛,不能理解好幾屏都翻不完的蹦掐,見(jiàn)諒。這么長(zhǎng)居然還tm能工作僵闯,牛逼
到處print卧抗,debug的時(shí)候加上,上線再刪除(累不累親鳖粟?)社裆,logging模塊很受冷落
上來(lái)就try/except了,把異常都捕獲了向图,吞掉異常導(dǎo)致排錯(cuò)困難
沒(méi)注意可變類型和非可變類型泳秀,傳入可變類型并在函數(shù)里修改了參數(shù),坑张漂。晶默。。
沒(méi)有邏輯分塊航攒,沒(méi)有美感(這個(gè)就算了)磺陡,就算不限制一行超過(guò)80列,也不能寫(xiě)一行寫(xiě)幾百列吧漠畜,左右轉(zhuǎn)頭腦瓜子疼
嗯币他,一開(kāi)始就開(kāi)啟pep8和pylint檢測(cè)能顯著提升代碼質(zhì)量(各種錯(cuò)誤警告逼著你寫(xiě)出高質(zhì)量代碼)。咱寫(xiě)不了詩(shī)一樣的代碼憔狞,也不能寫(xiě)shǐ 一樣的代碼蝴悉。 可能很多東西對(duì)老鳥(niǎo)來(lái)說(shuō)都是顯而易見(jiàn)的,不過(guò)菜鳥(niǎo)和高級(jí)菜鳥(niǎo)們還是需要多多練習(xí)積累經(jīng)驗(yàn)瘾敢。慢慢摸索吧騷年拍冠。尿这。。庆杜。射众。。
小白的踩坑記錄
文檔化
很多程序員是懶得寫(xiě)文檔的晃财,仿佛牛逼的程序員不需要寫(xiě)叨橱。但是看人家真正牛逼的開(kāi)源項(xiàng)目比如flask和tornado等,無(wú)論是代碼還是文檔都做得相當(dāng)棒断盛。對(duì)于一些項(xiàng)目罗洗,有些東西如部署步驟;常用命令等還是可以記錄下來(lái)的钢猛,可以使用wiki或者readthedoc伙菜,gitbooks等文檔工具記錄一下,方便新人上手命迈。如果不知道記錄啥仇让,就把你發(fā)現(xiàn)不止一次會(huì)用到的東西文檔化。個(gè)人認(rèn)為需求文檔也應(yīng)該有歷史記錄躺翻,方便接手的人可以快速了解業(yè)務(wù)和需求變更丧叽。數(shù)據(jù)庫(kù)字段的含義也應(yīng)該及時(shí)記錄和更新。
注釋
有經(jīng)驗(yàn)的人都知道看別人的代碼是一件很痛苦的事情公你,尤其是沒(méi)有任何注釋的代碼踊淳。代碼除了完成需求外,最重要的就是維護(hù)和協(xié)作陕靠,除非你覺(jué)得你做的項(xiàng)目活不過(guò)仨月(或你自己玩玩的項(xiàng)目隨便你怎么艸)迂尝,否則就一定要重視代碼質(zhì)量,防止代碼腐化(破窗)以至難以協(xié)作和維護(hù)剪芥。有時(shí)候比寫(xiě)注釋更難的是知道何時(shí)寫(xiě)垄开,寫(xiě)什么注釋?python里有規(guī)范的docstring用來(lái)給類和函數(shù)進(jìn)行注釋税肪,除了說(shuō)明功能外溉躲,關(guān)于github,stackoverflow鏈接、復(fù)雜的傳入傳出參數(shù)(比如嵌套字典作為參數(shù)這種你都不注釋就很不合適了)益兄,類型說(shuō)明锻梳、需求文檔和bug的jira地址等都可以注釋。凡是你回頭看代碼一眼看不出來(lái)干啥的净捅,都應(yīng)該有適當(dāng)?shù)淖⑨屢煽荩奖阕约阂卜奖銊e人。當(dāng)然蛔六,最重要的是代碼清晰易讀荆永,好的命名和編寫(xiě)風(fēng)格的代碼往往是自解釋的废亭,看代碼大致就可以看出功能。建議就是給所有的模塊具钥、類和函數(shù)都加上注釋滔以,除非一眼能看出來(lái)這個(gè)東西干啥,否則都應(yīng)該簡(jiǎn)潔注釋下氓拼,讓別人不用一行行看你的代碼就大概知道你這個(gè)東西是干啥的。最后注意的就是一旦函數(shù)更改及時(shí)更新注釋抵碟。qiniu的sdk寫(xiě)得就不錯(cuò)桃漾,可以去github看看∧獯總之撬统,”Explicit is better than implicit.”, 代碼里不要有隱晦的東西,一時(shí)偷懶將來(lái)可能會(huì)付出幾倍的維護(hù)代價(jià)敦迄,請(qǐng)對(duì)將來(lái)的自己和他人負(fù)責(zé)恋追。
Code Review
筆者認(rèn)為code review是一件非常重要的事情,可以有效防止代碼腐化罚屋,同時(shí)方便同事了解業(yè)務(wù)苦囱。可以在公司搭建Phabricator(facebook在用)類似工具進(jìn)行代碼review脾猛。
日志與異常記錄
一定要有良好的日志記錄習(xí)慣撕彤。良好的日志對(duì)于記錄問(wèn)題至關(guān)重要。python有方便的日志模塊幫助我們記錄猛拴,日志輸出的代價(jià)是比較小的羹铅,python的日志模塊盡量做到對(duì)函數(shù)功能沒(méi)有性能影響,可以在線上和開(kāi)發(fā)環(huán)境設(shè)置不同的log等級(jí)愉昆,方便開(kāi)發(fā)調(diào)試职员。注意別再日志語(yǔ)句里引入了bug或異常。 對(duì)于異常跛溉,一定『不要吞掉任何異澈盖校』,常有新手上來(lái)就try/except芳室,也不區(qū)分非退出異常蛛蒙,也沒(méi)有日志記錄(坑啊......)。請(qǐng)先閱讀python文檔的異常機(jī)制渤愁,可以使用Sentry等工具記錄異常牵祟。同時(shí)發(fā)生異常時(shí)候的時(shí)間,調(diào)用點(diǎn)抖格,棧調(diào)用信息诺苹,locals()變量等要注意記錄咕晋,給排查錯(cuò)誤帶來(lái)便利。有些錯(cuò)誤的復(fù)現(xiàn)是比較困難的收奔,這時(shí)候日志和異常的作用就凸顯出來(lái)了掌呜。
每個(gè) Python 程序員都要知道的日志實(shí)踐
調(diào)試
調(diào)試也是個(gè)很重要的問(wèn)題,不可能保證代碼沒(méi)bug坪哄,要命的是有時(shí)候?qū)懘a完成功能的時(shí)間還沒(méi)調(diào)試的時(shí)間多质蕉。注意復(fù)現(xiàn)是排錯(cuò)的第一步,之后通過(guò)各種方式確定原因(訪問(wèn)日志翩肌、郵件報(bào)的異常記錄)等模暗,通過(guò)走查代碼、斷點(diǎn)調(diào)試(二分法等)確定錯(cuò)誤位置念祭,確定好錯(cuò)誤原因了就好改了兑宇。修復(fù)后最好反思下問(wèn)題的原因、類型等粱坤,哪些地方可以改進(jìn)隶糕,爭(zhēng)取下次不犯一樣的錯(cuò)。