Why is everyone in such a rush?
作者在amazon, power serach 去尋找"teach yourself”', “days” 甚至"hours”等關鍵字,發覺這種速成的書籍96%都是教computer sicense.
在這麼短的時間內學到的可能學到的只是語法(syntax),而無法真正了解這個語言的優點/缺點。
作者引用了下面這段話。
Alan Perlis once said: "A language that doesn't affect the way you think about programming, is not worth knowing".
"一種語言是不值得去了解,如果他無法影響你思考程式的方式" –alan perlis.
小的從會寫verilog 到真的用電路去思考也花了1~2年
但大家為什麼這麼快的要去學習一種語言,有可能你需要了解如何引用一些現成的tool chain, 來完成你自己的任務。
Teach Yourself Programming in Ten Years
"The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes.Then repeat. And repeat again. There appear to be no real shortcuts"
"關鍵是用心的練習:並不只是重複的練習,而是以一種自我挑戰的態度來進行嘗試,並在執行的過程中,與執行完成後,分析並更正自己的做法。然後一再的自我挑戰。在這不斷挑戰的過程中是沒有任何捷徑的。"
作者首先引用了一些papar,來說明為什麼是10年來成為一個專家。舉了許多的例子,演奏鋼琴,游泳,打網球等,然後他提出了上面的關鍵。並以莫札特(Mozart)為例他花了13年來成為音樂神童。再舉披頭四的例子,他們在1964年發行了一炮而紅的專輯。然而他們在1957起就在Liverpool 和 Hamburg 的小酒吧演奏了。然後舉出了最頂尖的演奏家總共會練習100,000小時,而一半的音樂老師大概只有練習4,000小時的量。當然這與他們獲得的回饋有關係。
這與異數這本書提到的好像(必須要有超過100,000小時的練習,才可以成為專家)
之後提了一些要窮盡一生,吃苦耐勞,一心一意等的要件來成為專家。(Samuel Johnson (1709-1784) thought it took even longer: "Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.")就不討論了,但我記得在其他地方也看過類似的論點。
Here's my recipe for programming success:(這是作者寫的,我覺得這邊的資訊比較重要)
- Get interested in programming, and do some because it is fun. Make sure that it keeps being enough fun so that you will be willing to put in ten years.
- 你要對於寫程式有興趣而且因為有趣而作。而且要確認這件事情夠有趣,有趣到你可以做十年。
- Talk to other programmers; read other programs. This is more important than any book or training course.
- 跟其他程式設計者交流,閱讀相關的程式,這比你去看書或者上訓練課程要重要多了
- Program. The best kind of learning is learning by doing. To put it more technically, "the maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve." (p. 366) and "the most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors." (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life is an interesting reference for this viewpoint.
- 成是最好的學習方法是邊學邊做。換個技術一點的說法"…, 最有效的學習需要一個被完整定義的任務,當然他要對於練習者有適當的難度。並且在完成任務後可以得到一些有教育意義的回饋,最好還有機會可以再做一次並更新一些錯誤。"
- If you want, put in four years at a college (or more at a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don't enjoy school, you can (with some dedication) get similar experience on the job. In any case, book learning alone won't be enough. "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter" says Eric Raymond, author of The New Hacker's Dictionary. One of the best programmers I ever hired had only a High School degree; he's produced a lot of great software, has his own news group, and made enough in stock options to buy his own nightclub.
- Work on projects with other programmers. Be the best programmer on some projects; be the worst on some others. When you're the best, you get to test your abilities to lead a project, and to inspire others with your vision. When you're the worst, you learn what the masters do, and you learn what they don't like to do (because they make you do it for them).
- 參加一些專案並與他人合作。試著在某些專案中當一個最好的程式設計者,也試圖去當一個最不熟練的程式設計者。並且試圖去帶領整個專案,而且透過你的觀點給予他人啟發。如果你是最不熟練的工程師,去模仿比較有經驗的人的程式寫法,並且理解他們有禁忌(恩為你要為他們工作)。tw>禁忌翻的或許不夠好,翻成習慣也不錯。
- Work on projects after other programmers. Be involved in understanding a program written by someone else. See what it takes to understand and fix it when the original programmers are not around. Think about how to design your programs to make it easier for those who will maintain it after you.
- 加入一個已經開發完成的專案,試圖去理解其他人完成的程式。看要花多少的工夫去理解並且修正其中的問題。最好原作者並不在旁邊。並且思考如何讓下一個接手的人更容易理解這份程式。
- Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).
- 卻至少六種語言,至少一種語言支援型別,剩下的我不太行了..
- Remember that there is a "computer" in "computer science". Know how long it takes your computer to execute an instruction, fetch a word from memory (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk. (Answers here.)
- 作者提醒既然電腦科學中有"電腦"兩字,你就必須要對他有所了解,你要了解每個指令要花多久的時間執行,與資料在記憶體中與在硬碟中你去取用時所需花的時間。
- Get involved in a language standardization effort. It could be the ANSI C++ committee, or it could be deciding if your local coding style will have 2 or 4 space indentation levels. Either way, you learn about what other people like in a language, how deeply they feel so, and perhaps even a little about why they feel so.
- 最好可以參與語言的制定,可能可以參加ANSI C++的委員會,或許你可以參與討論一些coding sytle。你可以學習到其他人為什麼喜歡這個語言,也可以體會到他們對於這個語言的感覺。
- Have the good sense to get off the language standardization effort as quickly as possible.
- 盡快的有一個感覺去擺脫???(不太懂了)
Fred Brooks, in his essay No Silver Bullet identified a three-part plan for finding great software designers:
- Systematically identify top designers as early as possible.
- Assign a career mentor to be responsible for the development of the prospect and carefully keep a career file.
- Provide opportunities for growing designers to interact and stimulate each other.
This assumes that some people already have the qualities necessary for being a great designer; the job is to properly coax them along.
Alan Perlis put it more succinctly: "Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers".