天天看點

【閱讀心得】Python程式設計無師自通——專業程式員的養成

讀書筆記:

筆者是一個稍微有點程式設計基礎的人,學習python一開始是從吳恩達的視訊入門的,但是直接套用架構,使用子產品,對python的文法卻不甚了解,我也試過直接去廖雪峰的python學習網站上面學習,學得睡意朦胧。這本書,在我花了三天時間學習完之後,發現的确是一本比較好的入門書籍,是以在此推薦給大家。

這本書并不包含所有的細節,因為很多細節都能單獨出書,作者在很多地方也是淺嘗辄止,介紹完最基本的概念和操作就進入了下一個話題,是以其實有優有劣,但也因為可以讓你保持着充足的好奇心和動力繼續閱讀。書本結構非常清晰,從概念介紹,到操作說明,每段代碼都有詳細的解釋,緊接着還有對之前出現過的本章的術語的說明,最後搭配一些簡單的課後題。

書籍簡介:

《Python程式設計無師自通——專業程式員的養成》作者科裡•奧爾索夫是一名自學成才的程式員,作為一名文科生他通過自學程式設計,掌握了程式設計技能并在eBay找到了一份軟體工程師的工作。這本書是作者結合個人經驗寫作而成,旨在幫助讀者從外行成長為一名專業的Python程式員。

這本書可以滿足幾乎所有想要學習程式設計的初學者。本書适合高中、大學階段想要自學程式設計的學生,以及其他行業想入門程式設計的人,同時也适合作為程式設計入門的教育訓練教材。

《Python程式設計無師自通——專業程式員的養成》

作者:[美] 科裡•奧爾索夫(Cory Althoff)

書籍和源碼連結隻有聰明的人才能拼湊起來

關于python的一些學習細節,這裡就不再贅述了,主要是書本的第一和第二部分,比較新穎的是之後的章節。第三部分講解了一些程式員必備的程式設計工具,主要介紹了Bash(指令行接口)、正規表達式、包管理器、版本控制以及如何用python進行簡單的爬蟲,第四部分簡單講解了計算機科學中常用的資料結構和算法知識,最後一部分講解了他在學習和找工作的過程中所獲得經驗,我覺得這部分比較重要和有用,是以我将在下方簡單羅列一下:

https://pan.baidu.com/s/

普遍的程式設計原則:

1、寫代碼是最後的手段

       作為一名軟體工程師,你在工作時應盡量少寫代碼。碰到問題時,你首先想到的不應該是“我怎麼解決這個問題”,而是“其他人是不是已經解決了這個問題,我能使用他們的方案嗎?”如果你自己去解決一個常見的問題,很有可能别人已經有了解決方案。先在網上檢索解決辦法,隻有在确定沒人解決過該問題之後,才開始自己動手解決。

2、DRY

       DRY是不要重複自己(Dont't Repeat Yourself)的簡稱,指的是不要在程式中編寫重複的或是基本相同的代碼。正确的做法是将代碼封裝至函數中,後續可重複使用。

3、正交性

       正交性(Orthogonality)是《The Pragmatic Programmer》中提倡并普及的另一個重要程式設計原則。亨特和托馬斯認為,“該術語已經被用來表示某種獨立性或解禍化。如果兩個或多個事物之問的變化不會互相影響,那麼它們之問就存在正交性。在設計優良的系統中,資料庫代碼與使用者界面之問是正交的;調整使用者界面不會影響資料庫,替換資料庫也不會改變使用者界面。”實踐中記,"A不應該影響B"。假設我們有兩個子產品module a和module b,module a不應對module b中的内容進行修改,反之亦然。如果設計的系統中A會影響到B,而B又影響C,很快就會失去控制,系統将變得無法管理。

12nH904OWPley

4、每個資料都隻應儲存在一處

       假設手上有一個資料,我們隻需要将其存儲在一個地方。例如,我們正在開發用來處理手機号碼的軟體,其中有兩個函數要使用地區編号的清單,這裡要確定程式中隻有一個地區編号清單,而不是為每個函數重複建立。正确的做法是建立一個儲存地區編号的全局變量。更好的解決方案則是将資訊儲存在檔案或資料庫中。

5、函數隻做一件事

       我們寫的每個函數應該隻做一件事。如果發現函數太長,請檢查其是否在完成多個任務。将函數限制為隻完成一個任務有很多好處。首先,代碼可讀性增強,因為函數名稱可以直接說明其功能。如果代碼出錯,調試也将更加友善,因為每個函數隻負責一個特定的任務,我們可以快速隔離并調試問題函數。用許多知名程式員的話來說:“軟體的複雜性大多源自試圖兩件事當一件事做。”

6、若耗費時間過長,你的做法很可能就是錯的

       如果你不是在處理非常複雜的問題,比如處理大資料,但是程式卻要花很長時問才能加載,這時可以認為你的做法很有可能錯了。

7、第一次就要用最佳的方法完成

       在程式設計時你可能會這樣想:“我知道有一個更好的做法,但是我已經開始編碼了,不想回頭重寫。”那我建議你停止編碼,改用更好的方法來完成。

8、遵循慣例

       學習新程式設計語言的慣例,能夠提升閱讀用該語言編寫的代碼的速度。PEP8是一系列編寫Python代碼的指南,強烈建議閱讀,可前往https://www.python.org/dev/peps/pep-0008/檢視。

9、使用強大的IDE

       到目前為止,我們一直使用的是Python自帶的 IDLE來編碼。但是IDLE隻是衆多可選IDE中的一個,而且我也不推薦長期使用它,因為其功能有限。例如,如果使用更強大的IDE打開Python項目,每個Python檔案都會有不同的頁籤。在IDLE中則是每個檔案新開一個視窗,操作煩瑣且檔案之問來回切換困難。

       筆者使用JetBrains公司開發的一款名為PyCharm的IDE。他們提供了免費版和專業版兩個版本,這款IDE有如下特性能夠幫助我們節省時問。

7MsVz4DZBw

10、記錄日志

       記錄日志(logging)指的是在軟體運作時記錄資料的做法。我們可通過日志來協助程式調試,更好地了解程式運作時的狀态。Python自帶了一個logging日志子產品,支援在控制台或檔案中記錄日志。

       程式出錯時,我們不希望沒有感覺—我們應該記錄下相關資訊,友善以後核查。記錄日志也有助于收集和分析資訊。例如,可以搭建一個Web伺服器來記錄資料,包括每次收到請求的日期和時問。我們可以将所有的日志記錄在資料庫中,編寫程式分析其中的資料,并生成圖表展示通路網站的人次。

       部落格作者亨瑞克·沃納(Henrik Warne在部落格中寫過這樣一段話:“偉大程式員與平庸程式員的差別之一,就是偉大的程式員會做日志記錄,使得出錯時的調試變得更簡單。”可檢視https://docs.python.org/3/howto/logging.html中的教程,學習如何使用自帶的

logging子產品。

提取碼: jqff

11、測試

       程式測試指的是檢查程式是否“達到了設計和開發要求,對各類輸入傳回正确的結果,功能執行耗時在可接受範圍,可用性足夠高,可在目标環境下安裝和運作,并且實作了相關利益方所期待的效果。”為了進行程式測試,程式員要額外編寫程式。

       在生産環境中,測試是必須完成的。對于計劃部署在生産環境的程式,我們應當認為在沒有編寫測試之前都是不完整的。但是,如果是一個不會再使用的臨時程式,測試可能有些浪費時問。如果編寫的是其他人也将使用的程式,則應該編寫測試。很多知名程式員都曾說過:“未經測試的代碼就是漏洞百出的代碼。”可在網頁https://docs.python.org/3/library/unittest.html學習如何使用Python自帶的unittest子產品。

12、代碼審查

       在代碼審查(code review)時,同僚會閱讀你的代碼并提供回報。建議盡可能多地進行代碼審查,尤其對于自學成才的程式員來說。即使你遵守了本章中所列的所有最佳實踐,也有可能存在錯誤的做法。你需要有經驗的程式員對你的代碼進行檢查,指出所犯的錯誤,這樣才有可能解決。

       Code Review是一個專注于代碼審查的程式員社群。任何人都可以登入該網站,送出代碼。社群的其他成員會審查代碼,并回報做得好的地方以及可以改進的地方。網站位址為:http://codereview.stackexchange.com

13、安全

       對于自學的程式員來說,安全是一個很容易忽視的問題。在面試時也很少會被問到安全問題,在學習程式設計時我們也不會去考慮安全問題。但是,在實際工作中,我們需要對自己代碼的安全性負直接責任。本節将給出幾個提高代碼安全性的建議。

       我們在本書中已經學習了使用sudo指令以根使用者的身份執行指令。非必要情況下,務必不要在指令行使用sudo執行指令,因為如果有黑客侵入程式的話,将會獲得根通路權限。如果你是伺服器管理者,還應該禁止根使用者登入。每個黑客都會盯着根賬号,在攻擊系統時是首要選擇的目标。

       另外,總是假設使用者的輸入是惡意的。部分惡意攻擊的發生,就是利用了可接受使用者輸入的程式漏洞,是以我們要假設所有的使用者輸入都是惡意的,并以此為依據進行編碼。

       另一個提高代碼安全性的政策,是最小化你的攻擊面積(attack surface,即黑客可從程式中提取資料或攻擊系統的相關區域。通過最小化攻擊面積,可以減少程式出現漏洞的可能性。最小化攻擊面積的兒種常見做法包括:避免儲存敏感資訊,賦予使用者最低的通路權限,盡可能少用第三方庫(代碼量越小、漏洞越少),剔除不再使用的功能代碼(代碼量越小、漏洞越少)等。

       避免以根使用者身份登入系統,不要信任使用者輸入,以及最小化攻擊面積,是確定程式安全性的兒個重要手段。但這還隻是提升安全性的一小部分。我們應該試着從黑客的角度進行思考。他們會如何利用你的代碼?這樣可以幫助我們找到之前可能忽略的漏洞。有關安全的話題非常大,不是本書所能涵蓋的,是以建議大家時刻思考并學習如何提升安全性。布魯斯·舒奈爾(Bruce Schneier)對此的總結十分精辟:“安全是一種思維狀态。”

尋找工作和繼續提升:

(1)尋找方向

       python的方向有不少,web開發和移動開發是兩個非常流行的程式設計方向,包含前端後端或全棧,另外在資料處理和預測、自然語言處理、圖像處理、人工智能等等方向,python也有不俗的應用。

(2)積累初期經驗

       在成功應聘上第一個程式設計工作前,你需要積累經驗。但是如果沒有公司願意在你沒有經驗的情況下雇傭你,怎麼積累經驗呢?有兒個解決辦法。首先,你可以參與開源項目,自己啟動一個開源項目或向GitHub上的其他開源項目送出代碼。

       另一個方式是做外包。在Upwork等類似網站建立賬号,試着申請規模較小的程式設計工作。我建議去找确實有程式設計外包需求的朋友,讓他們在Upwork等網站新增賬號,然後正式雇用你完成任務。這樣後續可以給你很不錯的評價。其他人看到你至少成功完成了一項工作之後,被雇傭的機率就會提高,因為你已經成功建立了可信度。

(3)拿到面試機會

       通過開源項目獲外部工作成功積累程式設計經驗後,可以開始尋找面試機會。我發現一個有效地擷取面試機會的方法,就是通過LinkdedIn。如果你還沒有LinkedIn賬号,建議建立賬号并試着與潛在雇主進行溝通。在個人檔案中留下自我描述,突出自己的程式設計能力。例如,很多人會在檔案上這樣寫,“程式設計語言:Python, JavaScript",會吸引來不少關注這些關鍵詞的招聘者。務必将自己的開源項目或外包經驗列為近期的工作。

       完善個人檔案後,可以開始與技術招聘人聯系。LinkedIn上有許多技術招聘人,他們一直在尋找新的人才,也會樂意與你溝通。他們在接受你的邀請後,你要主動聯系并詢問有沒有招聘的崗位。

(4)面試和技巧

       如果招聘者認為你适合他們的崗位,則會在LinkedIn上發消息請求發起電話面試。電話面試是與招聘者進行的,是以通常不涉及技術問題,但是我也在第一輪面試中被問過技術問題。面試内容為你熟悉的技術,之前的工作經驗,并判斷能否适應公司的文化等。

       如果面試效果不錯,将進入第二輪技術電話面試,與技術團隊成員進行交流可能會問與第一輪面試中相似的問題,但是這輪中的問題會新增一個技術測試。試的工程師會提供一個網址,上面有已經準備好的程式設計問題,需要你來解決。

       如果順利通過第二輪,通常還會有第三輪面試。第三輪面試一般會在公司當面進行。和前兩次面試一樣,你會見到團隊中的其他成員。他們會詢問你的能力和經驗情況,要求完成更多的技術測試。有時候可能要留下來一起吃廠!幾飯,觀察與團隊成員的契合度。

       第三輪中會有著名的白闆程式設計測試。如果你面試的公司有這個傳統,面試者會要求你通過這種方式解決多個程式設計問題。我建議買一塊白闆提前練習,因為在白闆上解決程式設計問題比在計算機上解決問題要難得多。

      大部分程式設計面試聚焦兩個主題:資料結構和算法。要想順利通過程式設計面試,你需要精通這兩個領域。這也會幫助你成為一名更優秀的程式員。

      你還可以從面試官的角度來思考,将可能涉及的問題範圍進一步縮小。有人說,軟體從來無法完成,對于面試官來說也是如此。他很可能手頭上有許多工作,不想花太多時問面試。他們會花寶貴的時問來白己列程式設計問題嗎?很可能不回。他們會去搜尋“程式設計面試問題”,挑選其中某一個提問。這就導緻不斷地出現同樣的面試問題,是以網絡上積累了諸多寶貴的資源,幫助大家練習如何回答。我強烈建議使用LeetCode網站練習,因為我發現别人在面試中問的問題,在這個網站上都可以找到答案。

更多學習資料:

       Medium上有位工程師寫了一篇名為《ABC:  Always Be Coding))(生命不息,程式設計不止)的文章,文章标題就是核心思想:生命不息,程式設計不止。如果再做到ABL(學習不止),你的職業前途必将一片光明。在本章中,我将向大家介紹一些有價值的程式設計資源。

1、經典書籍

      有一些程式設計書籍是必讀書目。《程式員修煉之道》《設計模式》《代碼大全》《編譯原理》,以及MIT出版社出版的《算法導論》均為程式員必讀書目。另外,我強烈推薦一個免費的互動式算法入門教程,名為《Problem Solving with Data Structures andAlgorithms )),這本書比《算法導論》更加容易了解。

2、線上課堂

      線上程式設計課堂也是提升程式設計技巧的一種方式。我在http://theselftaughtprogrammer.io/courses網頁中列出了值得推薦的課程。

3、駭客新聞

      駭客新聞(Hacker News是技術孵化器Y Combinator推出的一個使用者新聞分享平台,網址為hops://news.ycombinator.com,能夠幫助大家及時掌握最新的趨勢和技術。

提升手段:

1、找到導師

      導師能夠幫助你将程式設計能力提升一個檔次。學習程式設計的一個困難在于,有太多你做得不夠好的地方,但是你白己不知道。我前面也提到,可以通過代碼審查來發現不足。導師可以和你一起做代碼審查,幫助你優化編碼過程,推薦優秀的書籍,教會你之前不了解的程式設計概念。

2、加深了解

      程式設計領域中有一個叫“黑盒”的概念,指的是某個你在使用,但是并不了解其工作原理的東西。剛開始程式設計時,對你來說一切都是黑盒。提升程式設計能力的一個最好的方式,就是打開碰到的每個黑盒,努力掌握其原理。有位朋友曾經跟我說,他白己的一個重大的“啊哈”時刻,就是意識到指令行本身其實就是一個程式。打開黑盒,就是我所說的加深了解。

      撰寫本書加深了我對程式設計的了解。有一些我認為已經了解的概念,在寫書時才發現無法清楚地解釋給讀者。    另外一種加深了解的方法,便是親白去開發希望獲得更深了解的東西。不懂版本控制?那就試着業餘時問白己開發一個簡易的版本控制系統。投入精力去完成此類項目是值得的,可以有效地提升你對相關話題的了解。

3、其他建議

      我曾在論壇上看到讨論程式員如何提升能力的帖了。獲贊數最高的答案出人意料:做程式設計以外的事情。後來的經驗告訴我,這句話是對的。讀完丹尼爾甲蔔伊勒的《The TalentCode》提升了我的程式設計能力,因為他教會了我掌握任何一個技能所需要的方法論。時刻注意程式設計領域之外的動态,注重吸收那些有助于程式設計的知識。

      我要給你的最後一個建議,是盡可能多花時問閱讀其他人的代碼。這也是程式員白我提升的最好辦法之一。在學習過程中,記得保持寫代碼和讀代碼之問的平衡。剛開始時,閱讀其他人的代碼會有些困難,但是要堅持,因為你可以從其他程式員身上學到寶貴的财富。