學習一門新的編程語言有什麼推薦的輪子可以拿來練手的?

比如忘了之前在哪兒看到的,」實現一個分散式索引系統的模擬實驗「這種

恩再詳細一點就是:已經看了基本語法比如表達式、數據類型、控制結構、函數、文件、一些基礎模塊這種,然後還有就是比如像lua的元表、面向對象這種層次的東西。然後就是想找一些那種可以兩三天就能做完的小東西來練習,比如上面說的那個實驗。


雖然本科是CS科班,但是在大一C語言入門之後,其他語言基本都是靠自己寫Project掌握的(因為不同語言差別真的沒那麼大)。下面分語言,舉我自己寫過的項目作為例子(僅以入門作為目的,不完全是輪子,因為我覺得既然目的是練手,不一定非得是造輪子才算練手)

  • Java
    • ftp伺服器和客戶端
    • 新聞網頁解析程序:自動解析新聞網頁中的正文、標題、時間、來源
    • 利用Java RPC實現分散式文件系統的伺服器
    • 寫Android App
  • C++(包括C吧)
    • 自己從頭寫個搜索引擎
      • 分詞
      • 倒排文檔索引
      • ……
    • 實現一個B+樹(當初實現了很多個數據結構,但這個可能是最複雜最考驗人的了)
  • Scala
    • 用Play寫網頁
    • 寫ML演算法,放到Spark上面跑
  • Python
    • 寫網站後端,很多很多的網站後端,用Django/Flask/web.py/Tornado
    • 用scikit-learn做機器學習
  • Javascript
    • 寫網頁前端,很多很多的網頁前端,用各種各樣的庫,jQuery/AngularJS, ReactJS
  • C#
    • 大一時我們自己寫了一個Naive的QQ,雖然實現得完全不scalable和robust,但是能實現那麼多功能也是不容易的好嗎(C#的好處就是拖界面比較簡單)
    • C#有自己的MVC框架,所以,寫網站……
  • Swift
    • 寫iOS app

……大家可以看得出來我寫了很多網站,和少量的app……真的隨便找個idea就可以妥妥的開始寫了……刷代碼量最有效的方式,沒有之一

如果入門了,還不滿足,建議找對應的開源項目跟進參與,或者自己寫個輪子然後開源,拿我自己舉例……

  • Java
    • Cassandra 分散式資料庫,最近在跟進issue並check-in code
  • Python
    • Tornado,我讀了一遍關鍵源碼

  • Javascript
    • 寫前端的時候為了實現特定功能,我hack過無數javascript庫……包括AngularJS……

我不是語言狂人,一方面我覺得語言不重要,解決問題才重要,二來我覺得給任何一門新語言都能迅速上手才應該是真正追求的目標,這也是我努力的方向。希望能幫到題主。


其實我覺得學以致用是最好的,如果自己開發的東西以後用不到,也就很難繼續改進和深入下去。本人帶過一些新人,我曾經讓他們開發過一些有實用價值的小程序,都不難也不需要底層知識,如下:

1. 查找電腦里重複的大文件,或者查找電腦里重複的手機或數碼相機的相同文件。現在電腦硬碟雖大,但是幾年以後總是感覺各個磁碟吃緊,這個小程序搞好後,可以很方便清理掉幾十G。

說明:回復里有個人說清理的程序無法運行了,可見這個程序還需要改進,對我們來說不停的改進和更深一步的需求是學習的動力。這個例子的難度不大,不過也要看你自己想要做多深。剛開始我自己做的時候,覺得只要大於50M的文件列出來,然後自己篩選,等到你做出來以後會發現有很多的問題,比如圖片可能以前複製到電腦里了,後來又複製了一遍,這些一個文件也就3M-4M但是多了還是很占空間的,這個要解決。其次索引一次非常耗費時間,要是能用everything的原理就好了。還有文件對比也很麻煩,你就想計算每個文件的MD5值,文件很多,你就想存到資料庫裡面,這樣一個小項目可以用來學的知識就多了。

2. 寫個查找域名是否註冊的程序,只要了解html表單原理就可以,代碼一般也就20行而已。

說明:這個難度不大,不過你也需要了解html是怎樣提交表單的,需要知道get或者post,你覺得速度慢,還需要用到多線程,還要把每次的查找記錄保存下來,也可以用資料庫等等。

3. 淘寶上買個verycd賬號,抓取verycd的全部書籍內容簡介和下載地址,畢竟國家對知識產權侵權抓的肯定越來越嚴格,說不定哪天就沒了,留著有備無患。

說明:verycd需要登陸才能查看到下載地址,這個不僅需要熟悉表單提交還需要了解cookie和身份驗證的http原理,其餘需要了解的同上一個。

4. 如果學手機開發,做個答案傳送機。基礎版:當別人給你發簡訊內容為ABCD時,手機依次震動1 2 3 4下。當然這個要求別人在場外能夠給你發答案,於是需要搞個進階版:學霸顛下腳代表A,顛兩下代表B,學渣能夠自動收到答案。當然你可能會說考場有信號屏蔽器,你可以用藍牙傳輸呀,藍牙也屏蔽了,你可以一個手機開WIFI熱點,另一個手機開WIFI啊!當然只是技術鍛煉,用來非法應用,後果自負!

說明:這個讀取簡訊或者web版本的非常簡單,但是用藍牙或wifi開熱點的比較難,但是對於有些同學來說或許是剛需,開發的興趣就大一些,當然你想再來個更具挑戰的,你可以用手機向手環傳送信號。

5.寫一個學英語的視頻播放器,視頻中的字幕只顯示不會的英文單詞和對應的英文解釋,設置個重播按鈕,可以重複播放最近一句的視頻,就和過去的復讀機一樣。

說明:很多程序員的英語都不好,但英語對這行的作用太重要了,對我們來說可以先從聽力和閱讀練起。我自己把所有認識的單詞做了個列表,然後從iciba主頁抓取了大概英語專八的單詞列表,把詞性變化也抓取了下來,這樣再做閱讀前搞個小程序先把生詞抓出來,自己預習一遍,你會發現學英語事半功倍,聽力也是如此。你會和我說沒有電子版的,我才不告訴你微軟的OneNote的OCR識別率秒殺一切市場上其他同類軟體呢。

6. 1024網站有很多優秀資源(不僅僅是愛情動作片),但是沒有賬號的人就無法搜索,可以這個爬蟲自己爬下來,就可以搜索了。

說明:本人過了看片的年紀了,不過技術討論區還是有很多的優秀非成人資源的,譬如你想找羋月傳的下載版,度娘是真的很難找到。

7. 我有個想法,自己也沒有做。整理出英語單詞之間的關係,比如名詞形式、動詞形式、副詞形式等等,然後開發一個測試英語辭彙量的功能,這樣只要把一本英文原版書導進去,就知道這本書的生詞率大概有多少,其中生詞中可以根據原單詞推斷出意思來的有多少,可以用來指導大家閱讀英文書籍,提高英文水平。


按照你的描述,我覺得你應該先過REPL這一步。

「看」了基礎立即找項目未必平滑,因為看懂和把看「懂」的東西立即放入項目練手之間其實還有一個步驟的欠缺,這個步驟是對所看懂的東西的熟悉,或者說初步的熟練。我認為能幫你完成這個步驟的最好工具是REPL而不是項目。

幸運的是,幾乎所有的現代語言都有REPL,有些是自帶的,有些需要簡單的安裝步驟。

比如學PHP,通常認為練手的項目是一個簡單的Blog,在寫這個項目之前,我會多花一點時間在PsySH里寫上大半天的PDO語句,對一個資料庫驅動的應用來說,資料庫操作通常是關鍵功能之一,在你沒有比較熟練這個部分的API以及它們的使用之前鑽進一個項目容易產生兩個問題,第一,你會急於完成這個「項目」,過分專註功能實現而忘記花時間沉浸你做這個項目真正需要學到的東西上,所以結果項目表面做成了,但該學的東西沒學到,這就像你能用二十種語言的語法寫二十遍Hello World,但基本什麼也學不到;二,你會因為缺乏事先的熟悉而把項目開發變成反覆擠牙膏的過程,反覆地在線搜索或者文檔閱讀不停打斷讓你失去做項目練手另一個重要目的:培養代碼架構的感覺,積累架構的經驗,如果做項目的時候不得不過多糾纏去熟悉自己不熟悉的細節,這個部分的能力就容易在不自覺中忽略。

如果你能在開始練手項目之前花幾個小時作小規模集中練手,比如WEB開發的例子,在REPL里把資料庫操作的核心API先充分熟悉了,甚至把資料庫模塊的輪廓寫了出來,你實際已經不知不覺進入項目的設計了。

另外,我認為最好的練手項目是你感興趣想知道它怎麼實現的,除非你對項目本身不缺興趣,不如多給自己一點時間,在REPL里基礎訓練久一點,個人的經驗,初學所花在基礎上的時間一直到職業的後面幾年都是有積極影響的。多少人從一個項目鑽到另一個項目,但掌握的技能未必有應有的深度和廣度。

如果你過了REPL這一步,項目練手就可以開始了。


實現PL/0


LISP 解釋器啊


這完全取決於你熟悉哪個領域的語言無關知識。

比如說,寫一個線性代數庫需要掌握相應的數學知識,寫編譯器需要知道編譯原理,做圖像解析需要閱讀對應協議。而當你知道了這些事情該如何被完成的時候,造輪子來練手就是一件比較trivial的事情了。

可以嘗試實現一個簡單的lisp解釋器,網上很多write you a scheme interpreter in 48 hours的教程了


未來兩到三年會學習c#,如何做好自己的學習計劃? - 丁衛鋒的回答

參考這個吧,懶得重新寫一遍了。


寫個網路爬蟲爬美女頁面

====

這裡發現了個現成的例子:當一個顏值很高的程序員是怎樣一番體驗? - 藍色的回答

當年為了上手go,我寫了個爬蟲程序,不過爬的是豆瓣的美女


在各大著名的代碼託管網站上有很多項目可以學習、參考、參與。開源軟體社區有各種各樣的軟體,多看一看,找幾個感興趣的項目參與進去,從一點一滴的代碼貢獻開始。


從爬知乎的問題開始,使用了模擬登陸和beautifulsoup


寫個抓取 是先網路小說追更 自動抓取 斷章

從你自己的興趣寫一個小軟體


推薦閱讀:

程序員平時沒事,做什麼?
單片機為什麼還在用C語言編程?(C語言為什麼不合理地增加一點面向對象的特性)
想轉行做程序員應該考哪些證?
C++ 編程中是否可以使用Objective C動輒幾十個字元的變數/函數命名方法?

TAG:學習 | 編程語言 | 編程 | 計算機科學 |