喬希·考夫曼談學習編程

寧皓網不交會員費雖然看不了視頻,但是左邊的介紹文本還是可以看得。
光是這個文本,就已經比很多文檔要強了。

出自《關鍵20小時:快速學會任何技能》第五章

本來打算將該章錄制成電臺,但是幾次嘗試都被無情打斷。夜間爸爸的業務電話和微信視頻突然發聲,媽媽下班回家。白天姥爺時不時“報個賬”,狗叫、大隊廣播、豆腐叫賣 …… 總能將我好不容易醞釀的靜謐打破。每次成功地打破我的感情之后,他們就又躲起來了,直到下次你再準備錄音。

農村,絕對不是可以安靜學習的地方。
成道莫還鄉,還鄉道不成。溪邊老婆子,喚我舊時名。

既然天時不與,地利不奉,那就不錄音了。只是簡單摘錄一些筆記吧:


  • 筆記內容:
    1. 學習心得:復雜的東西拆解之后就會變得簡單。(decompose,divide&conquer)
    2. 自己的網站一下子擁有成千上萬的粉絲的確是一件美妙的事情,但這樣的美妙需要條件,即每個訪客都能順利訪問該網站。然而,我的網站一旦接受到大量的訪問請求,系統一定會在“無上的榮光”中徹底崩潰,草草留給訪客一條無奈且神秘的錯誤信息。這讓我非常頭疼。
    3. 訪客蜂擁而至,不出意外地我的網絡服務器(計算機對訪客每一次訪問要求均會發送一個網頁)一定會以崩潰收場。這種情況下,訪客再也無法找到我的網頁,相反,服務器會返回一條“數據庫連接錯誤”或“錯誤503”的頁面提示。
    4. 營銷工作固然做的漂亮,然而我的系統卻無力應對激增的訪問請求。
    5. 最初,我通過增強處理能力和擴大內存來改善服務器。那樣做有用,但只起到一定的作用。(超出仍然崩潰)
    6. WordPress易于安裝和使用,運行無負擔。
      在他的默認配置里面,每一個網頁請求都會引起級聯服務器的活動,它會產生數以百計的隱形請求,最終把網頁發送給訪客。
      注: WP的底層是PHP,訪客訪問的是PHP腳本文件,該腳本文件接收到HTTP請求后,就會開始運作,即通過解釋器執行腳本命令,比如調取數據庫里的數據“填空”,生成最終的HTML頁面,再經由網頁服務器以HTTP響應的方式發回瀏覽器。
    7. 這樣的話,每一個單獨的網頁請求就會變得麻煩。也就是說,每一個請求都對內存和處理能力有很高的要求。(1000個訪客同時請求瀏覽同一個頁面,那么服務器就會試圖同時啟動1000個相同的流程。)
    8. 每個請求都涉及大量資源。服務器在完成所有請求之前就將耗盡內存。
      注: 資源(Resource)是對網站文件、處理能力等的抽象。
    9. 突然間,我意識到我在保持網站在線方面所花的時間比我在為讀者搜索資料和寫作方面所花的時間還要多。這簡直毫無意義。
    10. 我不僅浪費了生產力,而且還未真正學會如何編程。我只是在學習一大堆針對特定情況的技巧和方法,而且這些技巧和方法只能用于WP的運行。這一點也不酷。
    11. Jekyll的網頁功能。當運行一條指令,Jekyll就會使用你計算機上的文檔(包含你的網站信息和設計模板)創建一個完整的網站。如果你需要對頁面設計或頁面內容做出修改,那么只需要再次開啟Jekyll,整個網站就會進行自動更新。
      注: 靜態建站。同類工具如 Hexo。網站運行速度極快,超級穩定。
    12. Jekyll是使用Ruby編寫的。
    13. 創建網頁的HTML和CSS語言叫做“標記”語言。HTML和CSS語言根本不智能,他只是簡單地以特定方式告訴計算機把文本文檔展示給用戶(例如,“使該文本變成粗體”或者“這部分標題的大小是24號的字體”)。
    14. 服務器設置也是如此。我只是把實現寫好的程序安裝好,然后變更一些設定而已。在不需要任何編程知識的情況下,我只是使用它們而已,真正書寫它們的是程序員。服務器設置和管理的確是一項有用的技能,但那畢竟不是編程。

……(待續)

  • 筆記內容2:

    1. 我知道程序員“編寫”程序是一件創造性活動,可以通過很多種方式來完成。
    2. 程序經常被稱為“應用”,它們(作為名稱)之間可以互換。
    3. 一旦計算機程序被“運行”或“執行”,不管接下來會發生什么,它們一定會按照編寫的程序命令做事情。
      注: 程序是靜態的概念,放在硬盤上。 程序被拉入內存,由處理器執行,或者說作為腳本解釋器程序的“輸入”。 程序執行,就變是“進程”,即“進 (運、執) 行中的程序”。
    4. “輸入”就是程序所使用的信息或數據,而“輸出”則是當程序運行的時候,你得到的東西。
    5. “變量”基本上就是一些變化的占位符。你可以創建任意數量的占位符,然后讓那些占位符代表你所想要的。
    6. “程序”本身實質上是一套詳細的指令和規則,他們精確地告訴計算機使用“輸入”做什么。當程序運行完成,他就會給你“輸出”。
      注: 程序的最終結果。即你想要計算機做的事情。
    7. 當出錯時或者計算機無法弄清楚接下來該做什么時,程序就會“癱瘓”或者會顯示一條錯誤信息。
    8. 錯誤恢復編程語句被稱為 Exceptions 函數,即針對錯誤的條件句:如果程序將要以 X 方式癱瘓,那么做 Y 可避免癱瘓。有點像醫院大樓里的備用發電機。
    9. 本質上,計算機通過特殊的方式翻轉微型電子開關來工作。計算機不能把人類語言的命令轉換成為電子開關的布爾翻轉(真/假變量被稱為布爾變量,用于只有兩個選項的奇特語句)。
    10. 編程語言的作用:賦予人類程序員一種特定的方式來告訴計算機何時開始、做什么以及何時停止。他們還允許程序員定義輸入、流程以及輸出的樣式,以及程序的執行完成之后將會獲得怎樣的輸出。
      每種編程語言都有一種特定的編寫命令的方式,這叫做語法。語言的語法包括計算機用來將程序命令轉換為微型電子開關翻轉的規則。
      基本上,每種語言都有一種定義變量、條件句和 Exceptions函數 的方式。細節雖有差異,但核心卻是相同的。
    11. 網絡應用程序:在網絡服務器上運行的應用程序。
      服務器:一臺可以公開訪問、長期開機的電腦(計算機)。
    12. “我需要學習什么”的簡單框架:變量、條件句、Exceptions函數、本地/生產環境、數據庫(活字)和用戶本地終端上的數據(Cookies)。
      注: HTML只會展示文檔中的文本,而這個文檔是不允許自我更新的“無狀態”資源。
    13. 熟悉術語 —— "terminology" site:stackoverflow.com
    14. 經驗豐富的網絡開發人員認為初學者可以先從兩種常見語言中選擇一種學習,比如 Ruby 或者 Python。
      對于程序員而言,專注網絡應用的 Ruby 更受歡迎一些;而 Python 則在科學、數學以及圖形庫領域更受科學家和數學家歡迎。
  • 框架:

    1. 除了編程語言的選擇之外,網絡應用程序員對框架的選擇也有自己獨到的見解:代碼程序庫可以幫你更容易地完成大部分應用需要做的事。
      2.程序庫(一系列程序形成的軟件,你寫的一個.java文件叫程序,這些程序分包合作形成的一個完整的軟件,這里叫程序庫,即發布好的程序包,Java叫jar包)非常重要,因為計算機會完全按照你的程序要求去做。物理學家卡爾·薩根:“如果你想從頭做蘋果餡餅,你就必須首先創造宇宙。”
      注: 這段看完下一段再返回來理解。
    2. 程序的“宇宙”:①內置包和命令 ②別人寫的包,lib/jar ③程序運行系統(jvm)
      大部分編程語言都包含大部分程序所需的常見程序庫,但里面的專業工具非常少。這時就需要選擇框架(一套專業工具包)。從頭開始編碼會花費很長時間,然而,如果有一套框架的話,輸入和使用可以得到測試,在完成專業任務時擁有可靠程序庫。這樣,就能專注于應用的核心部分,完全不必重新創造“宇宙”。
    3. Rails 非常依賴“生成器”,他是用單一命令創建大量樣板代碼的內置程式。樣板代碼可以根據程序員的不同要求做相應修正。有了 Rails,程序員無須從頭開始花大量時間創建一個應用。只要他們知道接下來怎么做,費不了多少工夫就可以創建出一個功能性應用來。
    4. 從 Sinatra 開始學起。小型項目,語法清晰。
  • 開工:

    1. 目標:編寫一個可以服務于 Jekyll 網站的 Sinatra 應用。
    2. 安裝 Git。Heroku 是一個網絡應用服務器主機公司。Heroku Toolbelt 是一個程序,負責安裝程序員需要的一些常見軟件開發工具,以便在 Heroku 上開發應用。
    3. 安裝 Ruby。
      rbenv 用于管理系統中安裝的多個 Ruby 版本。它不能直接安裝 Ruby,但它有個流行的插件叫 ruby-build 能夠安裝 Ruby,且能在任意目錄中編譯和安裝不同版本的 Ruby。ruby-build 也可以不依賴 rbenv 而單獨使用。
      這兩個工具都支持 OS X、Linux 和其它類 UNIX 操作系統。
    4. 記住!沒有人天生就會這些東西。大多數時候,你需要做的只是花幾分鐘時間閱讀這些文件,然后按照它們所說的去做就行了。
    5. Ruby 的包(程序庫)叫做 gem。
    6. 《笨方法學Ruby》以變量賦值、基本算術、字符串操作以及基本條件語句作為開始,這些與我之前提到的例子類似。對于基礎知識的學習,他是一種非常具有結構性和邏輯性的方法。
      在嘗試編寫我的第一個“真正意義上”的程序之前,我原本的計劃是先讀完 Eloquent Ruby 和 The Well-Grounded Rubyist,然后完成《笨方法學 Ruby》里面的所有練習。雖然只有10課,然而,我注意到了一件重要的事情:我越來越焦躁不安,而且正在失去興趣。
      我好像正在復制另外一個人創建的程序,并且正在解決另外一個人所定義的問題。問題來了:編程開始變得像一種學術活動,而不是一項有用的技能。
      我需要跳出研究模式,進入實施模式。
      在開始編程之前,我不需要讀完所有的書籍、課本、教程和其他我已經收集的資料。我需要立即開始編寫真正的程序,如果遇到任何問題,在參考我準備的資源。
      是時候行動了……
    7. 《自述文件驅動開發》(Readme Driven Development),有別于沒幾年就會轟動軟件行業一次的項目管理技巧,該文章旨在說明創建一個應用的最好方式,即做其他任何事情之前,編寫一個自述文件。
    8. 讓 SQL 或任何其他數據庫查詢語言與像 Ruby 這樣的語言很好的契合是非常不容易的。使用一種語言進行編程已經很困難了,更別提同時使用幾種語言了。
      這就是 ORM 們產生原因:它們允許程序員使用一種語言編程,然后用 ORM 將它們轉換為數據庫的語言。這就簡單多了。
    9. Bootstrap 是一個預先編寫的免費使用的 HTML 和 CSS 程序庫。使用 Bootstrap 可以節省大量的時間:你可以幾分鐘內把你想要的應用程序的基本原型放在一起,無需花費數天時間。

PS:

其他關于本書想要說的。

  • 封底原印:
    1. 學習一門新知識或新技能的最快時間是多久?
      答案:20小時!
    2. 快速學習技能四大步
      答案:分解步驟,充分學習,克服困難,集中練習。
      注: 對比,我的體系是 “收集資料” + “學、習、修、證”。
扉頁自結:
  1. 目標不同,手段不同,效果(效率)不同。求仁得仁。
  2. 初學時不要盲目追求質量(勿過度準備),必要的訓練量和訓練速度(計時訓練)才是制勝法寶。
  3. 沒有改進的簡單重復是沒有意義的。
     刻意練習、微小改進、「即時」反饋、高水平重復一萬小時。 ——雕爺
  4. 天時不可為,人和在自己,唯借地利(掃除環境干擾)。
  5. 看買來的好書,學日語,寫論文,(20160524)做以上任何一件事兒即使理論上占用了做其他事兒的時間(時間/機會成本),但絕不會產出悔、罪惡感。
     “我們寧愿把大部分時間消磨在電視和電腦上,也不愿意為夢想付諸行動,因為看電視、玩電腦簡直太容易做到了。久而久之,我們的夢想,僅僅是夢想。而,很多技能在學會之前是體會不到他的樂趣的。”

PS2:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,269評論 25 708
  • 本文把程序員所需掌握的關鍵知識總結為三大類19個關鍵概念,然后給出了掌握每個關鍵概念所需的入門書籍,必讀書籍,以及...
    dle_oxio閱讀 11,207評論 6 244
  • TITLE: 編程語言亂燉 碼農最大的煩惱——編程語言太多。不是我不學習,這世界變化快! 有時候還是蠻懷念十幾、二...
    碼園老農閱讀 5,367評論 2 35
  • 首先,還是有困,這是亙古不變的。在看之前有聽室友簡介過,所以大致知道會發生什么。我覺得還是有bug的,一路都在想威...
    Super_亭小亭閱讀 310評論 0 0