看了很多技術書,為啥仍然寫不出項目?

我今年大二,計算機專業,在知乎一直聽從大牛們的建議學編程。但最近十分迷茫。比如我一直想照著xv6寫一個微型操作系統加深對操作系統的理解,小的http伺服器什麼的,書讀了很多,比如《現代操作系統》,《CSAPP》,《演算法》,《計算機網路》等,但是看到xv6的源代碼里有多線程,又準備去看《Unix環境高級編程》,《CSAPP》裡面有一個小的web伺服器,但是看完覺得對網路編程理解不深,準備去看《Unix網路編程》。就這樣一直在補知識,到頭來項目還是沒做出來,不知道接下來該幹嘛了,所以來問問各位前輩。


在做項目的時候,要知道目的是做出來。而計算機知識浩瀚無邊,你沒有辦法在一個時間內把所有知識搞懂,所以要注意的是到一個程度,因為有一些東西我們很多時候並不需要完全弄懂也不妨礙我們使用它。

比如我們做一個Android APP,我們很多時候都只是一個API Monkey,並沒有太細緻的去思考每一個API後面的原理,但是這不妨礙我們把APP做出來。等做成功APP後,我們可以更加細緻的去思考我們不懂的地方。在工作的時候,老闆很多時候也是要一個結果,你不可能跟老闆說,我要把這些知識都搞懂了,再把東西給你,遇到一個暴躁的老闆,你第二天就可以滾蛋了。但是你把東西交出來了,而且是提前完成,你就可以再細緻的來思考哪些東西其實是不太懂的,然後跟同事做分享,老闆也樂於看見。

我在大學本科的時候,也做過題主你說的xv6,那一年我有個更重要的任務,是要依據xv6設計出操作系統實驗給以後的學弟學妹使用,而於我自身的目的來說,我也想要更加深刻的理解操作系統,但是我的更重要的目的毫無疑問是要設計出來實驗。而我當初在設計這些實驗的時候,的確是如題主一樣,把xv6涉及到的方方面面幾乎都去涉及補足了(但是我這是設計出好實驗的必須步驟)。而在最後成品的時候,考慮到當時我校的水平,以及課時等等,很多時候只有短短的幾頁文檔而已,有時候有效信息就只有一兩段而已。於是,我也批註出來說,很多東西暫時不需要去搞懂,不妨礙你做出東西,若你時間充足的讓人害怕,歡迎去點擊XX。。。

如我在設計中斷處理實驗的時候,我有幾段是這樣寫道:

「在xv6中,CPU發生中斷後,控制將傳給vectors.S中的vectorX(其中X是中斷號IRQ)。vectorX將IRQ壓入棧後,把控制傳遞給trapasm.S中的alltraps進行統一處理。alltraps將中斷現場(即CPU寄存器的值)壓入棧,最後把控制傳遞給trap.c中的void trap(struct trapframe * tf)函數,參數tf指向剛才被壓入棧的IRQ和CPU寄存器的值,其類型struct trapframe在x86.h中定義,詳細說明見附錄A。

本實驗通過修改trap.c中的trap函數來處理鍵盤中斷,鍵盤的IRQ是1(即代碼中的T_IRQ0 + IRQ_KBD,具體定義在traps.h文件中)。中斷處理完成後,必須調用函數「lapiceoi()」告訴硬體「完成中斷處理(End Of Interrupt,EOI)」,否則系統將不會再觸發相同IRQ的中斷。」

而在這裡,我就隱藏了具體的所有IRQ,隱藏了中斷描述符表(IDT),也隱藏了IDT與GDT的關係等。這些東西有沒有意思?有意思。我也想要給學弟學妹看,但是從我做項目的角度來看,這是屬於次之的東西。所以,當做項目的時候,一定要知道哪一些是重點。

然後總結一句吧:學習的時候就是學習,好好把握大學充足的時間來學習。做項目的最終目的是要做出項目來,一定要分清楚主次,很多時候並不需要把所有東西搞懂才能做出項目,然而在做出來項目以後,有時間反思也是極好的一步。


你下面要做的是用輪子,造輪子,然後再去讀書。

while(True) {

看書();

用輪子();

造輪子();

看輪子();

}

比如,你學java,你是小白,別人都推薦thinking in java 這種入門書(等等,誰他媽說入門書啊)你thinking in java 看了一遍,發現有的東西似懂非懂,這個時候我覺得你再回去看一遍沒有多大意義的,那些涉及設計模式的,你看完理解了你還是不知道怎麼用,還是不知道怎麼寫。這個就是題主現在的感覺吧,每種技術你只看書都會有這個感覺。下面用輪子,造輪子啊。

用過log4j嗎?造一個啊。

用過消息隊列,造一個啊。

用過rpc,造一個啊。

大數據工具spark用scala寫的,java造一個?scala看不懂,學啊,卧槽,技能樹又長了一個點,好像可以造更多了呢?

大數據處理工具flink怎麼搞的,要不要造一個?flink是java寫的,我他媽剛學完scala,造....

造出來一個,媽蛋,方的,怎麼辦?看看別人怎麼造的。

輪子哥準備了一套面向組合子的編程:

Java寫一套漂亮的代碼,哪些設計模式比較常用? - vczh 的回答

卧槽,我寫的就是一堆,不不不,一坨——屎。

這時候再去看看log4j的包裡面怎麼搞的,再回去看書,感覺會不一樣了吧。

這也就是為什麼經典的書要反覆去讀,反覆去理解和領會的原因,因為你沒達到那個高度,看到的東西是不一樣的,看到同一個東西聯想起的東西是不一樣的。

溫馨提示:造輪子的時候找局部功能去造,不然很有挫敗感,不要一上來就要搞個大新聞的感覺,容易把自己玩死。你需要的僅僅是持續的正反饋。

//分割線

總有人說找不到輪子造,推薦java同學看一些輪子,比如hadoop自己實現的rpc框架,自己實現一個小的MR框架,guava包,fastjson,慢慢的看多了寫多了就可以動大的東西了。很多東西需要時間去堆積,急不得。


static_cast&<編程&>(C++)要不斷地練習。

-- vczh


古人學問無遺力,少壯功夫老始成。

紙上得來終覺淺,絕知此事要躬行。

作者:陸遊


【學而不思則罔】,思而不學則殆。


因為現實本來就是知易行難的。

我的建議是,繼續寫代碼,遇到不懂的,查資料查書,繼續寫,寫的爛一點沒所謂,只要求先能跑起來,然後再對之前理解不深的地方慢慢深入,慢慢修改。

編程是件實踐為主的活,你不能一遇到不會的就直接說去看書然後就停下來不寫了,那樣你永遠都寫不下去。


看了很多健身教程,為啥仍然沒有成為壯漢?


這就好比:即使看了許多年AV,通曉各種姿勢技巧,真上場了,依舊抓瞎一個道理。


編程開發這事情,真的和木工,雕工啊等傳統工匠沒多大區別,特別在學習,練習以及提升能力這些方面。可能最大的區別,大家用的工具不一樣,別人是刀斧鑿子,我們用的是電腦。

編程不是純理論研究,更多的是實際操作,在入門練習上,也是要花費足夠的時間去練習的。這點是絲毫無法取巧的地方。

多多練習吧。


Http服務:

如果不限制語言,推薦Python + Django

Django官網有個六節的tutorial,只要看(1)創建項目(2)添加App(3)urls(4)views 即可,model可以不看,因為多數項目都會有自己的資料庫,Form也可以不用看,推薦用各種組件搞定【如果用了組件+Post,建議禁止csrf功能,等時間充足了再來看csrf如何使用】

如果限制用c++的話,推薦cppnetlib + rapidjson【用rapidjson是因為現在流行用json在前後端傳遞信息】,c++做http服務各種坑,真心不推薦。


先上圖

後上文:

著作權歸作者所有。

商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

作者:phodal

鏈接:http://zhuanlan.zhihu.com/p/20504744

來源:知乎

還在繼續開發Growth(Github: phodal/growth · GitHub)的路上,很多功能似乎已經趨於完善,有些功能也讓我百玩不厭——如最近添加的規則引擎。接著我開始陸陸續續地添加了這麼多功能。直接今天我想我需要一篇文章放在最前面來告訴用戶,你需要怎樣去學習?因此,也就有了此文。

我不是一個學霸,大學掛了六科。也沒有受過非常好的教育,上大的大學是二本倒數的。好在計算機學得比較早,也可以混點自學能力,也算混得還行。一直想著做一些有意義的事,並且可以獲得更多的用戶反饋。想法一直有的,直到有一天在整理資料的時候才想起來可以整理出一個APP。

儘管之前已經有技能樹、成長書單和Web Developer 成長路線圖的經驗,說到底這也是很大的挑戰。

一次語言學習體驗

在我們開始學習一門語言或者技術的時候,我們可能會從一門hello,world開始。

好了,現在我是Scala語言的初學者,接著我用搜索引擎去搜索『Scala』來看看『Scala』是什麼鬼:

Scala 是一門類Java 的編程語言,它結合了面向對象編程和函數式編程。

接著又開始看『Scala "hello,world"』,然後找到了這樣的一個示例:

object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}

GET到了5%的知識。

看上去這門語言相比於Java語言來說還行。然後我找到了一本名為『Scala 指南』的電子書,有這樣的一本目錄:

  • 表達式和值
  • 函數是一等公民
  • 借貸模式
  • 按名稱傳遞參數
  • 定義類
  • 鴨子類型
  • 柯里化
  • 范型
  • Traits
  • ...

看上去還行, 又GET到了5%的知識點。接著,依照上面的代碼和搭建指南在自己的電腦上安裝了Scala的環境:

brew install scala

Windows用戶可以用:

choco install scala

然後開始寫一個又一個的Demo,感覺自己GET到了很多特別的知識點。

到了第二天忘了!

接著,你又重新把昨天的知識過了一遍,還是沒有多大的作用。突然間,你聽到別人在討論什麼是這個世界上最好的語言——你開始加入討論了。

於是,你說出了Scala這門語言可以:

  • 支持高階函數。lambda,閉包...
  • 支持偏函數。 match..
  • mixin,依賴注入..
  • 等等

雖然隔壁的Python小哥贏得了這次辯論,然而你發現你又回想起了Scala的很多特性。

你發現隔壁的Python小哥之所以贏得了這場辯論是因為他把Python語言用到了各個地方——機器學習、人工智慧、硬體、Web開發、移動應用等。而,你還沒有用Scala寫過一個真正的應用。

讓我想想我來能做什麼?我有一個博客。對,我有一個博客,我可以用Scala把我的博客重寫一遍:

  1. 先找一Scala的Web框架,Play看上去很不錯,就這個了。這是一個MVC框架,原來用的Express也是一個MVC框架。Router寫這裡,Controller類似這個,就是這樣的。
  2. 既然已經有PyJS,也會有Scala-js,前端就用這個了。

好了,博客重寫了一遍了。

感覺還挺不錯的,我決定向隔壁的Java小弟推銷這門語言,以解救他於火海之中。

『讓我想想我有什麼殺手鐧?』

『這裡的知識好像還缺了一點,這個是什麼?』

好了,你已經GET到了90%了。如下圖所示:

希望你能從這張圖上GET到很多點。

輸出是最好的輸入

上面那張圖『學習金字塔』就是在說明——輸出是最好的輸入。

如果你不試著去寫點博客、整理資料、準備分享,那麼你可能並沒有意識到你缺少了多少東西。雖然你已經有了很多的實踐,然並卵。

因為你一直在完成功能、完成工作,你總會有意、無意地漏掉一些知識,而你也沒有意識到這些知識的重要性。

從我有限的(500+)博客寫作經驗里,我發現多數時候我需要更多地的參考資料才能更好也向人們展示這個過程。為了輸出我們需要更多的輸入,進而加速這個過程。

而如果是寫書的時候則是一個更高水平的學習,你需要發現別人在他們的書中欠缺的一些知識點。並且你還要展示一些在別的書中沒有,而這本書會展現這個點的知識,這意味著你需要挖掘得更深。

所以,如果下次有人問你如果學一門新語言、技術,那麼答案就是寫一本書。

如何應用一門新的技術

對於多數人來說,寫書不是一件容易的事,而應用新的技術則是一件迫在眉睫的事。

通常來說,技術出自於對現有的技術的改進。這就意味著,在掌握現有技術的情況下,我們只需要做一些小小的改動就更可以實現技術升級。

而學習一門新的技術的最好實踐就是用這門技術對現有的系統行重寫。

第一個系統(v1): Spring MVC + Bootstrap + jQuery

那麼在那個合適的年代裡, 我們需要單頁面應用,就使用了Backbone。然後,我們就可以用Mustache + HTML來替換掉JSP。

第二個系統(v2): Spring MVC + Backbone + Mustache

在這時我們已經實現了前後端分離了,這時候系統實現上變成了這樣。

第二個系統(v2.2): RESTful Services + Backbone + Mustache

或者

第二個系統(v2.2): RESTful Services + Angular.js 1.x

Spring只是一個RESTful服務,我們還需要一些問題,比如DOM的渲染速度太慢了。

第三個系統(v3): RESTful Services + React

系統就是這樣一步步演進過來的。

儘管在最後系統的架構已經不是當初的架構,而系統本身的業務邏輯變化並沒有發生太大的變化。

特別是對於如博客這一類的系統來說,他的一些技術實現已經趨於穩定,而且是你經常使用的東西。所以,下次試試用新的技術的時候,可以先從對你的博客的重寫開始。

原文鏈接: https://www.phodal.com/blog/how-to-learn-language-technology/

更多精彩內容請掃描下面的二維碼,或者搜索Phodal


我個人感覺是這樣的,看參考書或者學習資料,然後動手做東西,常常會遇到以下幾個難路虎:

1.設計問題。不是說設計有問題,而是設計功能的時候,因為並沒有具體項目中的需求啊,目的啊,領導排版啊,pm扯淡啊,所以來來回回定不下來,最後不了了之。很多時候,想做的東西只有個大概的概念,具體的設計沒有計劃好,最後就導致了流產。比如功能做哪些,交互做哪些,後台怎麼做,前台怎麼展現。

2.非主要任務不定。比如想學ssh,看了半天書,最後特么js框架選來選去沒有個中意的,流產···資料庫用關係還是nosql,流產····

3.難點突破沒動力。做項目,遇到了難點,那特么是又項目壓力的,各種熬夜查資料,通宵debug,去年做mysql同步,曾經遇到個大bug,最後是三個人搞了三天,各種人工讀byte流排查才解決的,這種強度的難點解決,在自學的時候基本就是不想幹了,流產····


我對編程書的理解,就是一個字典。能替代搜索引擎難以做到的知識集合。


實際操作太少,看書的時候也要結合實際工作經驗。不知道推薦操作系統真象還原 這本書能不能幫到你。


因為看比做易得多。很多當你以為看懂的知識,其實連怎樣運用都不知道。事實上你只是跟著書作者的思路走了一遍而已。


任何程序設計的問題都可以通過引入一個中間層來解決,所以在實際開發中,為了解決某一個問題常常會產生一個新的問題,當你在互聯網、書籍中都找不到這個問題的答案的時候,你應該慶幸,因為解決了這個問題,就是你生命中的一個進步,所以首先我想告訴你,從實踐中找到答案,所謂「紙上得來終覺淺」;

其次,孔夫子教導我們「學而不思則惘」,我們在學習的時候要注意思考和總結,試著從不同的角度去理解同一個問題,試著在不同的技術領域尋找共性的答案,那些和語言、和平台無關的東西常常可以伴隨我們一生,而流行的、熱門的常常如曇花一現,除了讓你疲於奔命以外對技術本身可能並沒有幫助,架構比框架更為重要,不要為了學習框架而學習框架。


兄弟。你這個問題問的人膽寒。全世界能寫操作系統的人也沒有幾個啊!你寫不出來是正常的,你大二就自己隨便弄出來一個豈不是中國的Linus Torvalds了?


同感。

在最開始接觸到一個新技術的時候我會想將項目設計的所有方面都去深入了解,彷彿想要面面俱到才能做好一個項目。這有點類似完美主義,或者優化一樣,項目只有優化的很好才能繼續往下做。

但其實並不是,項目當中設計的技術自然有主次之分,如web後端,servlet當然是當之無愧很重要的,對於我們初學者來說,前端html css js 這些花一周掌握個初步的就可以了。

learn by doing ,哪怕不明白,先動手做記錄每一步的現象出錯了或者需求更改需要變動架構了再回來看這個時候會有更深的印象,看書固然好。但如同第一哪位朋友說的一樣,第一要義是先做出來。

看書肯定知道的更多,但對於整個項目來說,正兒八經看完整本書反而不會是最優的選項,學會如何快速入門是一項很值得學習的方法。


?編程核心能力包括抽象能力和工程能力

?抽象能力,從業務工程到邏輯理論的抽象。

?工程能力,從編程理論到業務應用的組織

?題主看技術書的思路側重於前類。


因為你雖然通過了自身的努力,但還沒有考慮到歷史的進程


推薦閱讀:

C++ 如何生成大隨機數?
C++ 如何寫一個函數,使得它的返回值是指向該函數自身的指針?
斷言、異常和返回值的選擇問題?
Qt 為什麼在桌面應用(Windows 平台)中不流行呢?
當面試官問我C++ 11新特性的時候,應該怎樣回答?

TAG:操作系統 | 編程 | Java | 計算機網路 | C |