計算機學生想通過造輪子學習伺服器端編程開發請教?

前輩們好!我對linux 伺服器端編程很感興趣。目前已經有了語言(C++)、演算法和數據結構計算機網路操作系統linux的基礎。

我的想法是「造2個經典的小輪子」的學習方法。

Tiny:STL(深入C++)、Nginx(深入sever)共2個輪子。

如何用C++語言開發 tiny Nginx並真正鍛煉C++的使用(不僅僅是C和class)?請舉具體點的例子。謝謝!

相關問題:
如何用C++語言開發 tiny Nginx並真正鍛煉C++的使用? - 伺服器


有些書是要看準時機讀的,要考慮性價比。與其吃力萬分地過早讀了,不如等有了充分的邏輯能力和相對完備的知識體系後再讀。


讀了題主的原描述,感到奇怪同時也感到高興。

奇怪是因為題主才大二,為什麼就這麼早早地把自己地方向定為linux C++伺服器端編程?為什麼不是web開發/ios/安卓,或者別的方向?我姑且認為大二還沒有去公司實習過,那你怎麼知道這個工作就適合你?不是怕你堅持不下去,就怕你葉公好龍,最後吃虧的還是自己。另外,linux C++伺服器端編程也分很多子方向,有想過到底要做哪塊,遊戲開發?基礎平台開發?如果很幸運地進入了遊戲開發行業,加班是經常發生的,在遊戲上線期凌晨被電話叫起來修bug也是可能的,題主準備好這樣的生活節奏么?

高興是因為雖然原描述里有一些值得吐槽的地方,但題主才大二,只要轉一個思路很容易就朝著更加正確的道路前進。

有答案里說題主功利,大概是因為看到題主目標太直接了(BAT/FLAG),我覺得題主不是功利,而是對大學CS的本質目標有點理解分歧。

大學CS的目的不是教你編程,而是讓你學會如何發現問題,抽象問題,設計演算法,然後解決問題。編程只是在你解決問題時的一個工具而已。所以從這個意義上說,CS只是一個基礎科學,學完4年以後你應該具備解決問題的能力,它可以幫助你進入其它任何領域,金融、航天、物理、科學計算、人工智慧...

另外,本科CS教育也應該是一個掃盲的過程,也就是說,讀完了4年,你應該知道你學的東西在CS這張「大地圖」的哪個坐標上面,你左邊是什麼地方有哪些怪,你右邊是什麼地方有哪些怪,並且想深入研究應該走哪條路,你應該瞭然於心。

而從大二開始就朝著linux C++伺服器端編程方向走,很容易讓你一葉障目,並且知識面不廣,而這很有可能成為你之後的上升瓶頸。我更推薦的方式是,從解決生活中的問題學習,不要局限自己的思路,任何領域的問題,並且做出原型來。

我結合你的情況給你舉幾個例子:
1. 大二你在學大物吧?那能不能寫出個小球在平面碰撞的物理引擎,然後寫個UI把整個過程動畫化?這裡你要學習UI怎麼寫,事件驅動怎麼寫,碰撞理論是怎麼樣的。
2. AI怎麼寫?先從最簡單的斗獸棋或者井字棋開始寫吧。這裡你要學習一個重要的概念叫狀態機。
3. 我想要發一段加密文字怎麼辦,該怎麼加密?那加密圖片呢?加密和Hash的區別是什麼?這裡你需要學習基礎密碼學。
4. 你說你是A,我怎麼就知道你是不是真的A?這裡你要學數字簽名。

這樣的問題有很多,等待著你自己去發現,鍛鍊出解決問題的能力和廣泛的知識面才是你的核心競爭力。等你畢業的時候,我扔你一個實際問題,你能獨立地抽象出問題,設計出演算法,然後用任何一個編程語言實現出來,之後還能對程序profile提速,我會覺得你是一個非常優秀的CS畢業生。

還有一點,在你的原描述里提到了很多書,都說看完了,和我本科的時候一樣,看了很多經典的計算機書籍,這很好。但我本科時犯了一個極大的錯,以為看完就是理解,以為看完就沒事了,以為看完一遍就可以。其實看完書和深刻理解是完全兩碼事,並且有些書隔個一年半載再讀會有不同的體會。

讀書本身不能讓人變聰明,讀書本質上是一個「輸入」過程,只有對輸入物進行分析、思考、然後得出結論,才是在把知識轉化為智慧。

我舉一個最簡單的例子,你一定學過各種排序演算法吧,那扔你一個實際問題,比如排序一條公路上一上午經過車輛的車牌號碼,該用什麼排序演算法最好?換一個問題,排序一條公路上一周內經過車輛的車牌號碼,該演算法是否還合適?

沒錯,書上教的都是磚,你需要自己思考如何把磚建成房子。

寫了那麼多不是想讓你放棄原來的方向,畢竟我不了解你的實際情況,上文的很多假設如果對你不成立的話還需要你選擇性地接受觀點。深入一個技術領域是非常有必要的,而且是你以後的立身之本。我對自己的技術要求是「一專多能」:一專是指有一個擅長的領域特別懂,專家級別,別人不懂都會問你;多能是指廣泛地知道各個領域的問題以及它們的解決方法,拓展思路,同時也能參與別人的討論中。

希望對你有幫助。


1、能。
2、這種東西根本不算技能,你想多了。
3、我覺得你能模仿STL(的容器、&和&),然後在上面再套一層linq(vczh_toys/CppLinq/CppLinq at master · vczh/vczh_toys · GitHub ),那C++的模板至少沒問題了。


所有為了不用cpp而不用cpp的都是沒事幹閑得


題主有沒有女朋友?
如果沒有,我建議你先抽點時間找個女朋友。
大學這個時間點最適合干這個事情了,過了這個時間以後難度陡增!
輪子什麼的等有女朋友以後再說也是可以的。


把一個東西先搞精通了再做這些范范的事吧,學習要有計劃性,大而全的事少做。
比如os,你知道bootloader如何載入os?驅動向量表怎麼分配地址?多核cpu時間片如何調度?虛擬頁如何保證命中率?
再比如網路,tcp4層和osi7層的本質差異在哪?對端不可達有哪些場景?窗口的局限性是什麼?tcp和udp應用場合有哪些?
你說的這5大項你要能一年內全精通了,那我佩服你,你真的很有天賦。
否則還是挑重點慢慢來吧,具有重度學習障礙的我也是年輕時每天下班看書,半年才初步掌握一項知識的。


一年造不完這4個輪子吧。。


瀉藥。
雖說我寫了幾個輪子但都還比較簡單,除了題主說的STL,其他的四個輪子我都不敢妄加評論。

我建議題主從實際出發,既然大二就好好學數據結構,演算法,這兩個夠學一學期的,下學期學有餘力可以自己學學操作系統,組原,網路。

初學者的一個誤區就是以為看了什麼書,寫了什麼樣的程序就會到達什麼樣的水平,這樣下去容易走火入魔,還容易盲目自大。


第一個輪子還好,後面幾個能有一個做的比較完善的話,特別是第二個,進BAT應該沒問題。
以BAT的情況,基礎知識紮實,演算法過關,有些應用型項目,差不多就可以進了。


題主的想法很好。寫stl可以學習數據結構和演算法,寫server可以學習網路的應用層,寫內核和shell可以學習操作系統。學linux c++,學到的不僅僅是linux c++。

一切cs的理論知識都要通過造輪子來驗證和鞏固。題主不用擔心學的太狹窄或是怎麼樣,一是這個方向本來就比單純的應用開發需要更多知識,二是無論你選了哪個方向,本科的核心知識,該學的總歸要學。我不反對有能力者可以提前預習,但是跟著課程體系的進度(不是內容)已然足夠了。

造輪子的話,當然是每個都造。理想情況下平均四個月造一個。當然如果你們學校好的話,課程的大作業會讓你們造輪子,好好利用這個機會。

題主需要關心的不再是技術方面,而是這方面的工作內容是什麼,實際上需要什麼。以及崗位有多少,工作強度大不大之類的事情,不要去了之後發現工作環境或內容你不喜歡。


1、不要把進入BAT或者FLAG當作源動力,最強的動力永遠是自己的興趣。


2、題主你列舉的這些東西,說句實話,只是一些比較好的大學(比如我旦)計算機相關專業的課程作業。當然並不是所有人都有獨立完成這些作業的能力。

3、你才大二,務必不要把自己就限定在C++伺服器開發這個細分領域,編程的世界那麼大,到處看看是有好處的。


謝 3人 邀請,不一一列出,這種造輪子的事情,就諮詢輪子哥吧。我真心不懂,別邀請了~


這五個都可以用C++,除了第2個可能需要剪裁一下。


這問題看上去像是為我量身定製的 - 我從事伺服器開發也挺久了,大學的時候也自己做過不少東西,面試工作也做過不少。

1. 能,並且非常好。
2、3. 沒必要想這麼多

對於本科學生來說,面試的時候如果能夠把課程學好,並且還能做一些實際的東西,我認為就非常出色了,從技能角度來說,我會毫不猶豫的錄用這種人。

但是看了你的計劃,我覺得有些好高騖遠並且本末倒置。大學首先要把課程學好,編程是技術工種,如果你要走更遠的路,應該注意學好基礎知識,也就是大學課程不能荒廢。不客氣的說,初中學生就足以進行你現在計劃的編程技術訓練,那大學生的價值在哪裡?技術很重要,但是若荒廢理論學習,有點旁門左道的感覺。

你在課程學好的前提,任選一個輪子造好就足夠了。如果說選哪個最好,我推薦的是Tiny STL,適用性最廣,也最基礎。


單說linux開發的書的話,我覺得The Linux Programming Interface (豆瓣)這本更好點


計算機科學我算晚輩,說個題外話。
題主兩次提到目標,一為FLAG/BAT,二為名企。我感覺學習動機不純。不是說為了高薪名企offer不好,而是戰線拉的太長,要每天十五小時學習持續兩年。如果是有興趣、好奇、覺得碼的東西很酷,不斷地獲得正反饋,很有利於克服挫折、持續學習;如果是為了高薪offer,太遙遠了,這個過程中稍有挫折,會不堪一擊,會動搖,思想會走死胡同。是因為有興趣所以熱愛所以高精尖所以高薪offer,而不是為了高薪offer而去高精尖而去強迫自己學習、打上『每日十五小時』的刻苦標記。
所以說,還是希望題主能找到興趣所在、讓興趣與熱愛成為你的源動力,當然你也可以找個女朋友共度難關,不過對於我們計算機科學的男孩子來說,顯然前者更容易一些。


我是本科正常學,但在學習和項目中都有比較大的收穫,今年校招拿到中興華為和差不多的offer七八個,離題主目標差挺遠,但可以代表很多普通學生。

個人建議學習的時候不要想太多,現階段只要扎紮實實學習好本職課程,業餘學學感興趣的東西就好,還可以課餘時間可以找小夥伴做做項目等等。
總之不要帶有「我要去BAT」之類的思想去學,要在學的過程中有所思有所感,而且跟著興趣來學的也比較有動力。


想做就做,想的越多做的越少。


題主這樣學,去BAT什麼的肯定沒什麼問題。
但是不覺得以「去BAT什麼的」為目標很沒意思嗎?


好程序員很多。

成為溫兆倫需要運氣,不只是努力。

努力可以體面,不能天才。


推薦閱讀:

如何評價可以自動更換 User-Agent 的爬蟲設計?
谷歌爬蟲主要是用C++開發嗎?
Linux下connect函數埠連到自己, 這種問題怎麼解決?
C++ 中的命名空間和類有什麼區別?
單元測試到底是什麼?應該怎麼做?

TAG:Linux | 伺服器 | C | TCPIP |