想做 C++ 方面開發,是基於 Linux 還是基於 Windows 平台?

小碩一枚,面騰訊、阿里均被鄙視 C++ 方面項目不咋地。最近在看 C++ 方面深入的書籍,但感覺沒有動手效果並不是很好。導師沒有關於 C++ 方面的項目,現在想做一些 C++ 方面的項目有以下幾點疑惑:
1. 不知道選擇什麼系統,是 Linux 還是 windows?
2. 台選好了之後是做開源項目還是模仿某個項目,有沒有什麼建議?
3. 如果項目是為了面試做準備,項目的側重點應該是什麼?


C++、OS和項目是正交關係。

C++本身是跨平台的。

OS對開發來說主要是其API、架構特性等。

項目才是問題。如果做後台方面,Linux比Windows更為普及。如果是前台方面則是相反。如果是移動應用,Android主要是Java,iOS主要是OC。而如果是遊戲,用C++跨Windows、Android、iOS開發不是難事。

C++就只是一個語言而已。都讀研了,不是應該做某些領域的研究項目麼?


我覺得故事是這樣發展的....

先是糾結語言

  • (lisp沒聽過
  • 聽說python效率不高還縮進
  • 原來ruby是小鬼子弄的
  • 那個什麼叫lua的只能用來寫遊戲腳本
  • 放眼望去java只能做民工啊
  • 那個c語言土掉渣, 過時幾百年了
  • 還得是cpp適合干大事, 老師也這麼說

就是cpp了!


語言選完了選win/*nix

  • M$罪惡滔天罄竹難書啊, 我們要抵制這些罪惡的大公司
  • *nix代表了不為常人所理解的先進與自由

就是*nix了!

定下*nix後拿不準BSD和Linux

  • Linux仿製unix是山寨貨
  • BSD學院出身高貴典雅

就是BSD了!


選了BSD後三選一

  • NetBSD安全穩定簡潔, 哎喲沒程序呀, 換!
  • OpenBSD聽說更安全, 我操安裝好麻煩, 換!
  • FreeBSD傳說最通用, 怎麼安裝還這麼麻煩??? 操, 換!

得, 還是委曲求全用Linux!


選了Linux後要挑發行版

  • redhat是給傻逼企業做的, 不geek, 滾
  • centos是redhat的山寨翻版, 和redhat一起滾
  • 國產發行版滾
  • gentoo感覺不錯, 尼瑪怎麼每個軟體都要編譯燒CPU? 滾
  • fedora/opensuse包管理器不好, 滾
  • arch太小眾又標新立異, 滾
  • ubuntu是給土鱉用的, 滾
  • debian出身高貴血統純正平易近人

就是debian了!

挑了Debian後猶豫sid/testing/stable

  • stable太保守了, pass
  • testing還是太保守了, pass
  • sid好, 要的就是這種最新最酷炫的感覺

就是sid了!

然後是KDE和Gnome啦

  • Gnome自由
  • 可是Gnome是土掉渣的c語言寫的
  • 但是KDE不自由
  • 可是KDE是高大上的cpp寫的...

雖然自由誠可貴, 而且Gnome逼格高, 不過為了cpp, 區區自由算個鳥
就是KDE了!


挑選桌面管理

  • Gnome已經出局
  • KDE默認太臃腫
  • xfce不夠精簡
  • e17不過如斯

既然用linux了, 不DIY怎麼能體現自己的geek精神呢?
自己湊吧!

怎麼湊呢?

  • *wm系列都好土啊
  • *box系列都好遜啊
  • awesome好帥啊

就awesome了!


湊出桌面後, 終於可以開始開發了....做什麼項目呢.....?

  • 網路程序很好的樣子
  • 畫圖也是不錯的分支啊
  • web開發好像很緊俏
  • 移動互聯網已經來了?
  • 手機app好像可以日進斗金

還是先看看網路吧!

網路要選庫啊...

  • libevent好像太老了, 還是c語言寫的
  • libev快多了, 等等...怎麼又是c語言寫的? 為什麼老有人喜歡用土掉渣的c語言?
  • asio好像太簡陋了啊
  • ACE太複雜了啊
  • 自己寫不會啊

還是試試畫圖好了, 這次一定不改了!

畫圖又是選庫....

  • SDL太老, 還是c語言寫的
  • OGRE太複雜啊
  • irrlicht太簡陋啊
  • 一大票捆腳本的不可靠啊

還是看看web開發吧, 這次真的不再改了!

web開發的選擇....

  • cpp裸寫cgi好像有點麻煩啊
  • lua寫cgi好像方便多了但是lua只能用來寫遊戲腳本啊
  • perl據說寫完看不懂被淘汰了啊
  • jsp是民工的東西啊
  • ruby的ror好像好新潮但小鬼子的東西堅決不能碰啊
  • python效率不高而且縮進啊
  • go沒有成熟框架肯定不好用啊

聽說PHP是世界上最好的語言以至於連facebook都主要用它, 就是PHP了!

呵呵..... (咦, 說好的cpp呢?)


感覺很多人的學習編程的方式有問題,他們的學習是圍繞著語言開展的.

比如,學習某語言有什麼項目的代碼可以推薦.
比如,在什麼平台下學習某語言最合適.

等等,這樣就會造成,對語言的偏執和宗教信仰,再以後找工作了又非該語言的事情不做.

我覺得這樣的思路很有問題.

每一門語言,都有其適應的領域,這裡不再展開討論.我認為更好的學習方式,是以項目展開來學習.首先選擇自己興趣的方向,然後圍繞這個方向,學習其相關知識,其中就包括了適用該領域的語言.

以我自己為例,我想學學分散式相關的知識.目前在基於riak學習Dynamo的實現,這樣就順便能把Erlang學習了,後續我還想基於另外的分散式開源項目來學習Java/Scala.


文人相輕。程序員也一樣。互相鄙視的還少嗎?linux鄙視windows,C鄙視C++,java鄙視C#,python和ruby和javascript互相鄙視,so what?工作還不是為了賺錢,用C++賺錢比做python的多,還有什麼不滿意嗎?你要注意,互聯網上什麼人最多,當然是做互聯網的。他們有自己的領域特徵。雖然互聯網的盈利也只是整個IT行業一個不起眼的小角落,但是出來喊喇叭的人就是多,啊哈哈哈。

你不要被這種言論誤導了,最終讓你自己自身價值發揚光大的,是你的領域知識,而不是工具。沒有什麼人規定說,做linux一定比做windows牛逼,或者做windows一定比做linux牛逼。牛逼的都是人,不是工具。在絕大多數情況下,你用windows和用linux寫程序其實沒什麼太大的區別,因為OS之間的差異其實跟你沒什麼關係,哪個順手用哪個。


靠譜的程序員,從來都是因為寫出來的代碼靠譜而讓自己變得靠譜。二逼的程序員,從來都是通過宣傳自己的工具……


1.選Linux
不管你打算學C,C++,JAVA,LISP,Scheme,Opengl,統統選Linux。
除非你要做Window的客戶端和DirectX遊戲。

2.強迫自己寫個最簡單的Ftp或Http伺服器,然後把並發容量做到單機1w
中間你能學會讀標準,網路介面,隊列,回調設計,內存管理,異常處理原則和性能定位工具的使用(別用已有網路庫,只依賴系統調用)。
別在軟體工程這類雞湯上浪費時間。
把gdb和windbg的使用作為最重要的技能發展。

3.做到2,你已經能滅掉市面上大多數30歲左右的面試官和不少35歲以下的面試官。
如果你能在面試前看完下面的書:
計算機程序的構造和解釋
軟體調試
深入理解計算機系統
程序員的自我修養

基本上你和牛逼面試官的差距就只在:
資料庫
分散式理論
架構
項目管理
某些工業語言

而其他方面都不吃虧,甚至會佔優。

上面這些會真正讓你在技術上變強,兼顧職業發展。

只要有機會,就經常自己造輪子,和造輪子無用黨比,過幾年會發現
你能輕易看到他們看不到的風險。
你能輕易做到他們認為做不到的事。
你能更容易認識到很多問題的本質,而且並不只局限在軟體技術層面。

追逐某些大公司的職位而建立知識體系其實是很短視的,可惜我很晚才明白這個道理。

還有最重要一點,你足夠聰明又能吃苦,又想賺大錢,這個方向的投入和回報會很容易讓你灰心


為什麼要選定一個平台?
一個真正的C++程序員,可以在Mac上用xcode 混合寫C++和OC,用Android NDK寫庫通過JNI給Java用,在Windows上用Mingw交叉編譯dll用VC++調用,在Linux上用C++寫服務端,最後用Qt寫GUI客戶端通吃 Windows Linux Mac平台。


關於平台。。。
建議還是linux,沒有鄙視win的意思,正是因為linux 的"簡陋"才會學到更多東西。
win下的ide容易寵壞人,configure,make都被ide搞定了。。。其實自己弄很有樂趣的說。。。而且linux下好玩的東西更多。無關優越感。。。linux下寫win程序其實也很容易,不用很糾結,交叉編譯+qt分分鐘搞定。

關於進階。。。
別想著飛了,上網把經典例題都吃透了就好。其餘的邊做邊學吧。

關於面試。。。
要搞定面試無非也就是那些經典的面試題,把常式都自己重寫一遍調試通過就好,如果碰到變態公司直接要求寫編譯器的,當場認輸,能談則談,不能就繼續投簡歷吧。。。
。。。。。過去的分割線。。。。。
上任boss是個變態,說現在年輕人太狂妄,只有筆試打到他們灰頭土臉他們才不敢開價。順便說下boss北大少年班的,可以算天才那類。之後就有了本猿這輩子見過最bt的面試題。具體忘了,反正最難兩題一個狀態機,一個是簡單編譯器。。。
語言無關,平台無關,寫偽代碼都行。
*這是本猿最敬畏的一個變態,沒有之一。
。。。。。。。。。。。。。。。。
上上回面試的公司,問題如下,假設伺服器是個集群,壓力大時反應可能會慢,但是絕對不會死。客戶端由客戶操作發送數據給服務端,問怎樣提高服務端高壓,保證數據不丟失時,客戶端發送數據的速度。
我給了一個分散式發送的答案,結果我被out。因為正確答案是在客戶端建立一張發送列表,並按照2^發送次數間隔重試送信。囧rz。。。。。
。。。。。。。。。。。。。。。。
最弱的公司,考的是字元串拷貝,不許用strcpy,實在懶得猜測弱智的提問邏輯,直接memcpy+strlen一行就回答掉了,雖然過了面試,但是沒去那家公司。
*雖然大致能猜到是想考指針和循環,但是實際工作中自己造輪子是往往有害無利。所以回答實在讓人進退兩難。後來面試官只看了一眼就說俺不專業,當場就掀桌翻臉了。
。。。。。。。。。。。。。
以上是想說明,面試這事,沒有工作經驗的情況下,基本看人品。一家公司不行就多試兩家吧,先入行,再擇業。干這行,換個工作可能又重回初學者,永遠不存在全能的高手。表想太多,也表計較太多,有熱情,多試試就是了。無非就是笑笑別人,被別人笑笑而已。

少年,如果你真的愛這行,加油吧!


都可以。 C++ 是通用程序設計語言。


我來說點實際的:
Windows開發,主要使用C#、C++(很多企業現在還在使用古董VC6.0來搞),做一些客戶端工具;
Windows開發就業,在騰訊裡面混,就是QQ之類的客戶端軟體了;

選擇linux,主要就是做伺服器端,也就是我們通常說的後台;
後台就是一篇廣闊的天地;
相比前端,你會更多的關注性能、關注架構、關注更多牛逼的面點;
後台是企業的根基,有了後台,才有了更多前端接入的可能;
前端可以是QQ客戶端(windows平台開發),可以是QQ移動版(移動平台,Android、iphone開發),也可以是WEB端(WEB開發)

最後的建議,
如果你是兩頭空白,選擇Linux 作為方向吧;
語言嘛,C++不錯,腳本當然也得會,python,bash什麼的得來點;
至於項目嘛,能搞透一兩開源項目就不愁了。推薦一個?redis的源碼吧,清晰,簡單易懂;
還有空閑時間,自己做點東西吧,能解決自己的問題;如果能分享到網路上,讓大家用到,那就更happy了


1.不知道選擇什麼系統,是linux還是windows
真正的C++是和平台無關的。。不管是linux還是windows。。
如果推薦我推薦Linux,GCC編譯器更嚴格,很多在windows vs下可以編譯的程序在GCC下不通過或者有警告。。推薦自己裝一個虛擬機CentOS之類,然後學習。
2.平台選好了之後是做開源項目還是模仿某個項目,有沒有什麼建議
平台學好之後,比較容易上手的可以學習ACE,學習ACE是對C++提高最大的,而且裡面很多設計模式的東西。。我負責任的說,你能搞懂ACE,找工作應該沒問題。。
其他還有boost,這個也是一個很好的庫。。
你沒看招聘上一般都會寫,對ACE或者boost有一定了解么。。

學編程語言一定要寫,自己寫個小程序,比如做個基於ACE的客戶端,伺服器程序,可以測試一下。。面試的時候也可以講。。

3.如果項目是為了面試做準備,項目的側重點應該是什麼
應屆生面試,一方面看你的學習能力,一方面看你的本性。。當然,有些基本的排序時間複雜度什麼的也要知道。。然後把你做的東西說一下,我覺得就ok了。。

順便說一句,我覺得會腳本比如python,shell之類很加分。。這種腳本上手快,編寫簡單,功能強大,使用範圍多。。我覺得是真正做事情的人懂得語言。。比那種會記住幾種排序演算法的人高大上多了。。


我本來想吐槽來著......但是上面的朋友們都吐完了,對於我這種C狗來說,實在是找不到什麼可吐的~~~~

我覺得對於題主來說,現在最重要的是先動手吧,我的建議是找一個項目,先不管他用的是什麼系統,人家本來用的是啥,你就用啥.記住,是選擇一個你喜歡的方向,根據這個方向找項目,項目可以用什麼平台你就用什麼平台;不是選擇一個你喜歡的平台,之後根據這個平台選項目.操作系統是一個很厲害的東西,但對於你來說,僅僅是工具而已.你沒有必要去了解它的每一個細節,你需要的,是找到自己的方向,找到可以讓你奮鬥的目標.不要讓這些工具,成為你停滯不前的理由.

關於項目選擇的問題,開源不開源,有沒有源代碼,都沒有太大關係.源代碼的問題,其實和操作系統的問題一樣,舞者是要在舞台上跳舞,而不是去研究舞台的結構.當然了解舞台的結構是一件好事.但是,這件事最好在你的舞已經跳得很好的基礎上面做.

第三個問題,不要為了面試而做項目,過幾年你會發現,這是多麼愚蠢的一個行為.首先,你做項目是為了在面試中有東西可講,但是你知道嗎?面試官根本不會在意這種項目,想想我當時講的,什麼俄羅斯方塊,什麼校園網路系統,在面試官的眼中,這些東西和小孩子玩泥沙差不多啊~~~我依稀記得,當年我在和面試官吹噓我那個校園網路系統的所謂框架,所謂從應用到底層都是自己做的時候,人家一句話就把我問倒了:"你們的網路PHY,用的是哪種MII介面."當時我覺得沒答上這個問題沒什麼,但是工作幾年再去回想,當時答不上這個問題,是有多白痴啊~~~~~

不要為了一份工作去改變你自己,可能你的確是需要改變,但是,原因千萬別是:"這份工作需要我這樣啊~~~."一個大學生,一個研究生,寒窗苦讀二十幾年,就為了一份工作,磨平你稜角?!變得適應這個社會?!拜託,你的夢想呢?你的野望呢?如果你讀書這麼多年,出來只是想得過且過的混日子,這是何等浪費資源啊!可能你的確是需要一份工作,可能你還要這份工作很體面,但是這些都不是改變你自己的理由,如果一份工作要你改變你的理想,要你放棄你所學,這份工作未必如你想像中適合你.

可能有很多不恰當的話,但是這些話如鯁在喉,不吐不快,見諒,最後祝你如願!


學什麼c++,win linux,俗人,都沒前途,直接學安卓和java,做個app然後賣個1000w趕快買房。再找個輕鬆點的國企工作,平時工作之餘,幫別人代做app,然後搞一個工作室,立志未來做一個app包工頭,別人吃肉,你跟著喝湯就行


自己寫個平台吧!


Do it now, or never!

手邊的電腦是什麼系統就用什麼系統,馬上開機,下環境,照著教材開始寫!什麼平台了,語言了,構架了,工具了。。。基本你大學/碩士畢業後兩年能說上話,工作5年的時候才能拍板決定。等你到那個年紀,接觸的多了,自然就明白了。現在更重要的是馬上開始動手,即使以後你發現要換,今天的努力也不會白費!專業知識/技能的廣度也是程序員的必要維度。


大師有理想。做你想做的事情


windows吧,雖然我似乎不該這麼說,但是linux上c++寫的程序確實非常的少。
unix推崇的是蝗蟲似的大量小程序的協作,試想,一個進程足夠小的時候就近似等於線程了,所以我們都拚命縮小程序的體積,所以莫名其妙就大了很多的c++天生不適合unix系的操作系統,解決軟體複雜性的層次不一樣。
個人覺得windows捨命推廣c++主要還是解決閉源軟體的資源管理和重用問題,看不到源代碼的情況下當然就需要誰申請的資源誰來管理嘛。linux下面這是不必要的。


如果是學習c++ 難道不是基於IDE編程嗎?我覺得還是選個順手的IDE,不要把你有限的精力花在各種神級編輯器上。也不要去折騰系統。
平台的區別主要是API的區別。選什麼平台得根據你的需求來。
如果是做桌面開發,可以選Qt
如果做伺服器開發就買陳碩老師的書看
編程思想都是一樣的
等你感覺寫程序就是調用各種API,然後感覺沒意思的時候,你可以去學操作系統原理,編譯原理,圖形學原理,網路安全等底層知識。然後各種造輪子。造完輪子後,再回到以前調各種API。但是心裡有底了


頭一次聽說為了面試準備項目的……一般不都應該去刷題目么?
吶,既然是為了面試,只要有個像模像樣的東西就成了吧?糾結做哪方面看著還靠譜,頭一次見上來先糾結往哪個操作系統做的……又不是要開公司喂

正經點說還是確定想做啥,再選平台吧……不管基於哪個平台,我覺得都能做出來面試可用的玩意兒的。當然後端嘛似乎linux多一些,除了我軟很少聽到用windows server的。前端……除了做遊戲,很少有人拿c++開發了吧

話說回來這公司啥毛病挑人「c++」的理?你是只有c++不行呢,還是都不行?我覺得不管啥語言,只要有能拿得出手的項目就行吧?

當然也有可能是簡歷上吹了個c++精通,然後被人拍死了……精通啥都好,慎寫c++……


我承認,答主裡面有很多很專業的人,但其實絕大部分答非所問,根本沒有認真的看完題主的問題。題主不是說一定要做某某項目,而是因為沒有c++相關項目經驗而求職受挫,從而想要增加這方面的能力和經驗,著重於求職。

國內的小碩,我們那時候叫大本,基本上是在學技能,那本科在幹嘛?在蹉跎在浪費時間。猜測題主本科一定不是計算機專業的,對於某一門編程語言也不是很精通。我覺得應聘不上的原因不是你的c++項目經驗不夠,而是兩點:1,你的計算機基礎知識太差;2,你的實現能力太差。如果是剛上碩士,這兩點在三年時間內完全可以有質的提升;如果還有幾個月就要面臨畢業求職,那建議搞一些速成的,比如,找相關師兄去了解一些現成的項目,拿到源碼和文檔,好好的學習,研讀,變成自己面試的資本,同時閱讀一些經驗總結面試寶典啊之類的,設計模式沒時間就拉倒了,運氣好的話可以應聘上騰訊之類。

騰訊當年也面過,筆試不談,技術面試無非是要實現一些演算法的題目,你用c,c++,c#,都沒有問題,但是你要準確,要迅速,代碼效率要高,當然還會問一些計算機基礎的知識,如果你簡歷寫了項目肯定會問一些項目的問題,一般會問問軟體的架構,實現演算法,你獨立完成的部分等等。

其實說到頭還是最開始的那兩點,其他的真的不是很重要。如果你真的是感興趣,學習的過程中,會接觸到不同的語言不同的平台,什麼簡便什麼效率高就用誰。

祝你好運!fighting!!!


https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System


推薦閱讀:

如何用 iPad 遙控 PC 關機?
為何微軟不在新的操作系統中讓 32 位支持大於 4GB 的內存?
Windows NT 內核與 Linux 內核相比哪個更安全?
微軟 Build 2014 上有哪些消息發布?

TAG:Microsoft Windows | Linux | C++ |