【轉】最牛B的編碼套路

最近,我大量閱讀了Steve Yegge的文章。其中有一篇叫“Practicing Programming”(練習編程),寫成于2005年,讀后令我驚訝不已:

與你所相信的恰恰相反,單純地每天埋頭于工作并不能算是真正意義上的鍛煉——參加會議并不能鍛煉你的人際交往能力;回復郵件并不能提高你的打字水平。你必須定期留出時間,集中鍛煉,這樣才能把事情做得更好。

我認識很多杰出的程序員——這是在亞馬遜工作最好的額外“福利”之一。如果仔細觀察他們,你會發現他們時時都在鍛煉。他們已經很優秀了,但他們仍然不忘鍛煉。他們鍛煉的方法林林總總,而我在這篇文章中只會介紹其中的幾種。

據我了解,這些杰出程序員之所以如此成功,就是因為他們一直在鍛煉。完美的身材要靠定期的鍛煉才能獲得,而且必須堅持鍛煉才能保持,否則身材就會走形。對于編程和軟件工程來說,道理是一樣的。

這是一個重要的區別——我每天都開車去上班,但我的駕駛水平遠遠不如專業車手;類似的情況,天天編程可能并不足以使你成為一名專業的程序員。那么,什么才能把一個普通人變成一名專業車手或者專業程序員呢?你需要鍛煉什么呢?

答案就在《科學美國人》的一篇名為“The Expert Mind”(專家思維)的文章里:

愛立信提出,重要的并不是經驗本身,而是“努力的學習”,也就是要不斷地挑戰自身能力之外的東西。一些狂熱的愛好者花費了大量的時間去下棋、打高爾夫球或者玩樂器,但他們可能始終停留在業余水平上,而一個訓練有素的學生卻可以在相對較短的時間里超越他們,原因就在這里。值得注意的是,在提高水平方面,花費在下棋上的大量時間(即使參加各種比賽)似乎還是比不過專門的訓練來得更為有效。訓練的主要價值在于發現弱點,并有針對性地進行提高。

“努力的學習”意味著,要常常去處理那些剛好在你能力極限上的問題,也就是那些對你來說有很大可能失敗的事情。如果不經歷一些失敗的話,你可能就不會成長。你必須不斷地挑戰自我,超越自己的極限。

那樣的挑戰有時會在工作中碰到,但也未必。將鍛煉從職業工作中分離出來,這在編程領域常被人稱為“編碼套路”(Code Kata)。

Code Kata的概念是由David Thomas提出的,他是《程序員修煉之道:從小工到專家》的作者之一。這個概念主要指的是,針對某一種特定技術或技能進行重復性的練習,從而將其熟練掌握。——譯者注

?

所謂套路,就是一系列的招式。這個概念借鑒于武術。

如果你想要看一些編碼套路的例子(也就是努力學習和磨練編程技能的方法),SteveYegge的文章里倒是提出了一些不錯的建議。他把它們稱作為“實踐演練”:

1.?????寫一份自己的簡歷。把自己所有的相關技能都羅列出來,然后把那些在100年后還用得到的標出來。給每個技能打分,滿分為10分。

2.?????羅列出你所景仰的程序員。盡量包括那些與你一起工作的人,因為你會在工作中從他們身上獲取一些技能。記錄下他們身上的1 ~ 2個閃光點,也就是你希望自己有所提高的方面。

3.?????去查看維基百科(Wikipedia.Org)上“計算機科學”欄目,找到“計算機科學的卓越先驅”這部分,從這個列表中挑選一個人,閱讀他的事跡,并且在閱讀時打開任何你感興趣的鏈接。

4.?????20分鐘通讀別人的代碼。讀出色的代碼和讀糟糕的代碼都是有益的,兩者都要讀,輪流切換。如果你無法感覺出它們之間的區別,可以求助于一位你尊敬的程序員,讓他給你展示一下什么是出色的代碼、什么是糟糕的代碼。把你讀過的代碼給別人也看看,問問他們的看法。

5.?????羅列出你最喜歡的10個編程工具——那些你覺得你用得最多、非有不行的工具。隨機挑選其中的一個工具,花一個小時去閱讀它的文檔。在這一個小時里,努力去學習這個工具的某個你不曾意識到的新功能,或者發現某種新的使用方法。

6.?????想一想,除了編程之外你最擅長什么事情?再想一想,你是通過怎樣的鍛煉才變得如此熟練和專業的?這對于你的編程工作又有什么啟發呢?(怎么把這些經驗應用到編程方面?)

7.?????拿出一疊簡歷,并和一組面試官在同一個房間里待上一個小時。確保每份簡歷都至少被3個面試官看過,并且要給出1 ~ 3分的評分。針對那些不同面試官評判大相徑庭的簡歷展開討論。

8.?????參與一個電話面試。事后寫下你的反饋,拋出你的觀點,然后與主持電話面試的人聊一聊,看看你們是否達成了一致的結論。

9.?????進行一次技術面試,并且被面試的人應該是某個你不太了解的領域里的專家。讓他假定聽眾在該領域里一無所知,因此請他從最基礎的講起。努力去理解他所說的,必要時問一些問題。

10.???有機會參與別人的技術面試。期間,你只是認真地聽、認真地學。在應聘者努力解決技術問題的同時,你也要在自己腦子里嘗試解決這些問題。

11.???找到一個能和你交換實際問題的人,每隔一周,相互交流編程問題。花10 ~ 15分鐘來嘗試解決這些問題,再用10 ~ 15分鐘進行討論(無論能否解決)。

12.???當你聽到任何你一時之間也無法解決的面試問題時,趕緊回到你的座位上,把這個問題用電子郵件發給自己,以留作日后的提醒。在那一周里找出點時間,用自己最喜歡的編程語言來解決它。

我之所以喜歡Steve開出的這個清單,是因為它看上去很全面。有些程序員一想到“鍛煉”,總認為就是一些編碼上的難題。但在我看來,編程更在于人,而不是代碼。因此,通過解決世上所有的、并且晦澀的編程面試題目,在提高你的個人能力方面,這種方法是有局限的。

關于“努力的學習”,我也很喜歡Peter Norvig在“Teach Yourself Programming in TenYears”(花10年時間自學編程)一文中提出的諸多建議:

1.?與別的程序員交流。讀別人的代碼。這比任何書籍或培訓課程都更重要。

2.?動手寫程序!最好的學習方法就是邊做邊學。

3.?在本科或研究生的課程中學習編程課程。

4.?找一些項目來做,并且需要與其他程序員形成團隊來合作。在項目的進行過程中,學會辨別最出色的程序員以及最糟糕的程序員。

5.?在項目中跟隨別的程序員一起工作,了解如何維護那些不是你寫的代碼,并且學習如何寫出利于他人維護的代碼。

6.?學習多種不同的編程語言,特別是那些與你現在所熟悉的語言有著不同的世界觀和編程模型的。

7.?了解硬件對軟件的影響。知道你的電腦執行一條指令需要多少時間,從內存中取出一個字(在有緩存或沒緩存的情況下)需要多少時間,在以太網(或者因特網)上傳輸數據需要多少時間,從磁盤中讀取連續的數據或者在磁盤上跳轉到另一個位置需要多少時間,等等。

你還可以從Dave Thomas的21種實用的編碼套路中獲取靈感(CodeKata.com),或者你更愿意加入一個你家當地的“編程武館”(CodingDojo.org)。

對于“努力的學習”,我無法像Steve,Peter或者Dave那樣提供一個長長的建議列表。我遠不如他們有耐心。實際上,在我看來,“編程套路”只需兩個招式:

1.??????寫博客。我在2004年初創辦了CodingHorror.com博客,作為我自己努力學習的一種形式。它在一開始很不起眼,到后來成為我職業生涯中做過的最重要的一件事。所以,你也應該寫博客。最后“聞達于天下”的人,往往就是那些能夠有效書寫和溝通的人。他們的聲音最響亮,是他們在制定游戲規則,并且引領世界的潮流。

2.??????積極參與著名的開源項目。所有的高談闊論聽起來都很好,但是,你是一個大話王還是一名實干家呢?別光說不練,這個非常重要,因為人們會用你的行動來衡量你,而不是你的言論。努力在公眾面前留下些實實在在有用的東西吧,到時候你就可以說,“我在那個項目中出過力。”

當你能編寫精彩的代碼、并且能用精彩的言辭向世人解釋那些代碼時,到那時候,我會覺得你已經掌握了最牛的編碼套路!

?

轉自:http://blog.csdn.net/happydeer/article/details/17023229

轉載于:https://www.cnblogs.com/misul/p/3453473.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ecshop 廣告設置

最近公司準備做個商城,讓我從JAVA轉過去,好吧,先看下吧,反正也得做。接到手里的是一套已經成型的模板,但是二次開發必須得了解下機制、文件、響應、設置什么的,也是個新手,寫點東西給后面更新的…

linux 信號_Linux信號機制

信號就是一條消息,通知進程系統中發生了什么事,每種信號都對應著某種系統事件。一般的底層硬件異常是由內核的異常處理程序處理的,它對用戶進程來說是透明的。而信號機制,提供了一種方法通知用戶進程發生了這些異常。例如&#xf…

DOxygen for C++使用說明——添加數學公式

公式 Doxygen允許你把 公式顯示在最終的輸出中(這個功能僅限于HTML和輸出).為了可以在HTML documentation顯示公式(轉化為圖片),你必須安裝以下軟件: latex: 編譯器, 被用來解析公式, 首先提取公式寫到一…

VC2010下Qt5的中文亂碼問題

要搞清楚這個問題,先要弄明白編碼。但是編碼問題實在太復雜,這里肯定講不開。 我先找一個例子,比如:“中文” 的 Unicode 碼點/UTF8編碼/GBK 分別是多少。 先去這個網站,輸入 “中文” 查詢對應的 Unicode 碼點/UTF8編…

Tomcat 的 DefaultServlet

問題描述: 群里有人測試 Spring MVC,沒有配置任何Controller,只配置了一個view resolver,指定了前綴后綴。 然后,他問的是 當訪問 localhost:8080/test 的時候,為什么會被重定向到 localhost:8080/test/ &a…

Python學習(七)面向對象 ——封裝

Python 類的封裝 承接上一節,學了Student類的定義及實例化,每個實例都擁有各自的name和score。現在若需要打印一個學生的成績,可定義函數 print_score() 該函數為類外的函數,如下: 1 class Student(object):2 def …

spss練習數據_SPSS篇——如何在成千上百萬個數據中標識重復個案

本文就帶大家來學習一個小技巧,如何運用SPSS標識重復個案。我們都知道在Excel中,通常會用到“篩選”功能來選出指定條件相同的單元格。那么在SPSS中,如何在成千上百萬個數據中篩選出重復的個案呢? 小編就是要告訴你,幾…

DOxygen for C++使用說明——Markdown支持

自Doxygen 版本1.8.0,Markdown被引進。 接下來,我們將先簡單介紹標準的Markdown語法,讀者可以進入Markdown官網查詢更詳細的細節。然后討論一下Doxygen支持的Markdown擴展,最后討論一下Doxygen對Markdown標準的實現細節。 Stand…

方程式漏洞之復現window2008/win7 遠程命令執行漏洞

前幾天就想寫的,因為一些緣故就沒寫。此次是在外網環境下進行的。大家在內網中也一個樣。 方法: 使用Eternalblue模塊,劍測是否有漏洞然后msf生成一個dll直接反彈shell. PS:win版本的不知道緣何生成出來的dll是0kb 我就在自己本地…

C++空類和string類

1. 空類 1.1 空類默認哪六個成員函數。 1 class Empty2 {3 public:4 Empty(); //缺省構造函數 Empty e;5 Empty( const Empty& ); //拷貝構造函數 Empty e2(e1);6 ~Empty(); //析構函數7 Empty& operator( const Empty& ); //賦值運算符…

客服會話 小程序 如何發起_小程序、公眾號、App三者如何融合布局?這里有一份避坑指南...

對產品經理來說,小程序無疑是2020年最火爆的詞之一了。我們能看到,就在今年疫情期間,小程序DAU達到4.5億,而超市、生鮮果蔬、社區購物等都同比增長100個點左右,小程序的商業價值很明顯地在快速釋放。小程序如此火爆&am…

DOxygen for C++使用說明——注釋代碼二

這一次我在谷歌搜索中檢索到了Doxygen在github的倉庫,進去一看,令人大喜,github倉庫里含有了一個Doxygen的官方配置文件Doxyfile,于是下載下來,發現Doxyfile已經配置了將倉庫中的\src文件編譯成Documentation,并且將結果放在了dox…

python super()(轉載)

一、問題的發現與提出 在Python類的方法(method)中,要調用父類的某個方法,在Python 2.2以前,通常的寫法如代碼段1: 代碼段1: class A:def __init__(self):print "enter A"print "…

Swagger+Spring mvc生成Restful接口文檔

2019獨角獸企業重金招聘Python工程師標準>>> Swagger 是一個規范和完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務。總體目標是使客戶端和文件系統作為服務器以同樣的速度來更新。文件的方法,參數和模型緊密集成到服務器端…

JavaScript——變量與基本數據類型

前言 JavaScript中的變量為松散類型,所謂松散類型就是指當一個變量被申明出來就可以保存任意類型的值,就是不像SQL一樣申明某個鍵值為int就只能保存整型數值,申明varchar只能保存字符串。一個變量所保存值的類型也可以改變,這在Ja…

vscode可以打開jupyternotebook嗎_剛剛,官方宣布 VS Code 支持 Python 全開發了!

關注Python高校每天早上23:10準時推送北京時間 2019 年 9 月 21 日,PyCon China 2019 在上海舉行。在下午的演講中,來自微軟開發工具事業部的資深研發工程師韓駿做了主題為《Python 與 Visual Studio Code 在人工智能應用中的最佳 Azure 實踐》的演講。在…

C++類的內聯成員函數應放在哪

今天復習C Primer的時候,看到了關于C類的內聯成員函數的放置,應該放在頭文件中。那么這到底是為什么 呢?僅僅是一種代碼規范問題還是必須這樣做呢? 下面我就來講講我自己的理解吧。要徹底理解這個問題,首先就要了解下函…

python selenium自動化(三)Chrome Webdriver的兼容

當一個自動化測試被實現在一個瀏覽器之后,我們會希望我們的測試能夠覆蓋到盡量多的別的瀏覽器。通過跨平臺的測試來保證我們的程序在多個瀏覽器下都能正常工作。 在安裝了selenium之后,firefox webdriver和IE webdriver就已經是ready to use的了&#xf…

NDK 編譯armebai-v7a的非4字節對齊crash Fatal signal 7 (SIGSEGV) 錯誤解決

一直都是編譯armabi的。沒有不論什么問題,這個架構是軟件模擬浮點運算的。后來看到NDK文檔上說armabi-v7a是針對有硬件處理浮點計算的arm cpu的。 于是就改動配置編譯armebai-v7a的so文件。 結果是編譯沒問題。一執行就是crash掉,Fatal signal 7 (SIGSEG…

作業三

作業三 第一章問題:書上寫的“Bug的多少可以直接衡量一個軟件的開發效率、用戶滿意度、可靠性和可維護性”,那么一個比較完好的軟件中一般大概會出現多少Bug? 第二章問題:現在開始訓練寫更多的程序能否更早地達到軟件工程師的標準&#xff1…