如何讓停留在語法層面的 C++,變成實際工程中的 C++?
本人是魔都二本大三信息安全專業的學生,對安全行業不感興趣,想當程序員。學校學的是C++,自己也看過C++primer,也自學linux。撇開「入門」 「精通」這些飽受爭議的辭彙,我知道自己現在這個階段只是停留在語法階段,但是可以通過什麼方式,讓自己去實踐(自己感覺無從下手)?想過用QT來作為自己加深C++理解的工具,寫過一個簡單的音樂播放器,但是感覺不是很好。看著隔壁軟體專業,用java能寫出一個界面軟體而且可以在網路方面有涉獵的時候,自己內心也是非常疑惑,邊學邊在搖擺。曾經求過業內人士幫助,他說學學Python(自己也在看)也不錯。我擔心1.C++後面學習難度非常大2.找工作方面,C++和Python不是很好找(其實自己也沒有這方面的信息,只是推測)。是繼續C++(和Python)?還是趁入門不深轉而學習JAVA(我是希望能先專心學習一門)?或是有其他路?我的疑惑也代表了相當一部分同學的疑惑,所以希望各位大神能耐心解答!
沒什麼可困惑的。
我不敢說自己能有多厲害,沒有任何能夠拿出來的東西,我只敢說一句就是我是因為*興趣*而不是*工作*才去學編程的,更進一步地,我覺得我不是在*學習*(傳統意義上的需要預習、複習、考試的那個過程)編程,而是興趣在指導我著去*探索*。
我覺得既然題主都大三了肯定不是停留在初學者的層面了吧,自學過Linux的話也應該知道並不一定非要GUI才算真正的*軟體*(程序、應用,whatever)吧,用Qt寫過程序,那也應該知道Qt的哪些東西跟C++標準庫裡面的設計有不一樣吧。好吧不要求太高,既然用Qt寫過GUI肯定能夠找到Qt哪兒不爽的吧。如果到了這個地步都還沒有對自己現有的知識體系提出問題,我就開始懷疑題主「想做程序員」的目的了。好吧,題主發現問題了,然後做了一點事情,然後就停下來了:「寫過一個簡單的音樂播放器,但是感覺不是很好」。然後就沒有然後了嗎?
@vczh還不是覺得現有的C++ UI框架(包括題主用過Qt)太難用才有了現在的GacLib。
而題主所謂的「工程」不也是因為發現問題然後解決問題這個循環執行了太多次之後才形成的么?
好吧接下來正式回答問題:=============================================我知道自己現在這個階段只是停留在語法階段,但是可以通過什麼方式,讓自己去實踐(自己感覺無從下手)?
我覺得在這個方面我最沒有發言權,因為沒有做出過任何一個能夠給人看的東西。但是建議還是有一些的。
- 繼續做你的音樂播放器。既然用了Qt,可以想辦法繼續踩坑下去,甚至可以用Qt for Android(大坑預警)做一個手機版,然後再把它移植到其他OS上去。再試著通過Crawler來爬取主流平台的音樂然後做一個在線播放的功能,加上歌詞顯示,加上個性化功能,甚至是實現豆瓣FM - Beta的音樂推薦功能。也許你覺得這很難,請看AIRPLAY。
- 去找一些實戰的項目,看有沒有自己感興趣的。比如GitHub。認真對待C++的開發者 / 開源組織很多,即便是不能參與開發,也能通過構建、使用和讀代碼學到很多的*實踐*。
是繼續C++(和Python)?還是趁入門不深轉而學習JAVA(我是希望能先專心學習一門)?或是有其他路?
- *專心*去學習一門語言,帶給你的不一定能夠比廣泛涉獵更多。我是喜歡去了解更多東西,去發現不同然後比較,vczh也提到過這點。畢竟新的東西對於人思想的影響也是可以轉移到其所做的事情上來的。
- 要去*專心*的事是認真地把事情做好。你堅持一件事情坐下去做好,再簡單的一個東西最後也能收穫很多(參考)。
- 所以我能給題主的建議就是Learn by doing,去選一個項目(參見上面)專心的做一年(正式的測試、構建和發布,甚至是推薦給大家用),然後對於這個過程中遇到的問題去針對性的學習一下(我覺得題主會出來問這個問題也就是因為書看的太少對業界了解也太少了吧。
關於如何找工作,你認真的把上面做過的事情簡要的寫到簡歷裡面,去投那些個招C++的公司就OK了。說不定到時候在知乎都有人直接給你內推的。
謝邀。題主問的是C++,那我們就不扯其他語言。
我認為學習C++並深入理解各種高級功能和語法的最好途徑就是自己去實現所有需要用到的STL的功能,例如Vector, String, Dictionary, SmartPtr等等。這可以迫使你了解幾乎所有的語言特性以及C++的RAII機制。C++11的vararg templates有什麼用?你去實現一個類似C#裡面的Func&<&>類就知道了。
總的來說,從使用類庫(如qt)的角度去理解一個語言是低效的。應該自己去開發一個充分利用語言特性的庫。
你也學過Qt,但是沒學到精髓。
Qt是一個設計優秀的C++項目,這種優秀不只體現在架構和代碼上,還體現在工程管理上。思考以下幾個問題,帶著這些問題再去看Qt代碼:
1. Qt是怎麼編譯的,它為什麼要搞出 qmake,.pro文件是如何組織的?2. Qt的頭文件是怎麼擺放的,頭文件的命名規則是怎樣的,為什麼這麼做?3. Qt的類聲明是怎麼寫的,為什麼有 private類,它怎麼維持二進位兼容的?4. Qt的模塊是怎麼劃分的,模塊間依賴關係是怎麼設計的,為什麼這麼設計?5. Qt編譯速度為什麼這麼快,比同等規模的其他C++項目都要快,為什麼?
6. 它是如何抽象各個平台的差異的,如何做到跨平台跨編譯器跨CPU的?把Qt這些問題看懂了,吃透了,駕馭個50+萬行代碼的C++項目就沒啥問題了。占坑,慢慢說。
--------------------------------------------------------------------------------------------------------這個問題升華之後是:學習一門(計算機)技術的時候實際上在學習什麼?我用幾個問題來開場好了:- 我會PHP了,是不是就能開發網站了?
- 我會java了,是不是就會寫伺服器了?
- 我會java了,是不是就會寫Android了?
- 我會C/C++了,是不是就能開發Windows/Linux程序了?
第一問的答案:是、又不是
第二問的答案:是、又不是第三和第四問:不是。為什麼呢?因為PHP這個語言就是為了開發網站而誕生的。java自帶的核心類庫里也有用於伺服器傳輸的相關內容,但是只是學會了語言本身(語法)以及相關核心類庫,是不足以應付日益複雜的開發的。這類似於「我考好了駕照是不是就能去參加F1比賽了」。
對於後兩個,java之於Android,類似於26個英文字母與英文文章之間的關係。語法相同,但是開發過程中主要使用的是Android SDK 而非java的jdk。而第四個答案,我覺得不需要解釋。@robbin 在 《Ruby社區應該去Rails化了》 提到這麼一個觀點:掌握一門編程語言實際上包括兩部分:
- 編程語言語法以及核心類庫
- 開發特定領域應用所需要的第三方類庫
對於這個觀點,我表示部分贊同,我覺得可以修正/擴展一下:
- 狀態A 掌握一門編程語言,意味著你掌握了該語言的語法和核心類庫,可以使用該語言完整無誤的將思維邏輯轉化成可以運行的代碼。
- 狀態B 精通一門變成語言,意味著你對於該語言的細枝末節都瞭然於心,知其然知其所以然,知道每一處語法產生的目的和它的使用技巧,知道每一處妥協的原因,知道每一處「便利」帶來的代價。你已經不僅僅可以簡單的講邏輯轉化成代碼了,你已經知道每一處邏輯對應的「最優」的代碼了。
- 狀態α 掌握一門技術,意味著你已經掌握了該技術需要的語言知識,同時,掌握了相應的理論知識,學會了相關領域所需要的其他類庫。
- 狀態β 精通一門技術,表示你對該技術的相關理論知識都瞭然於心,知道它們的來龍去脈,對相關的內容已經有了自己很獨特的見解,然後你會將你獨特的見解轉化為實物——類庫,你開始寫相關的自己的類庫,為了寫類庫,開始慢慢精通該語言。
題主現在應當是在狀態A,目標應該是狀態α、狀態β。
A-&>B-&>α-&>β 或者是 A-&>α-&>β-&>B,這應當是一個完整的成長之路。
按照上文提到,「掌握一門技術...掌握了相應的理論知識,學會了相關領域所需要的其他類庫」,那麼題主第一步應當做的是,確定領域。在這之前,我先反對 @梅騰天 所說的觀點。
不同領域所需要的相關知識是不一樣的。如果你做硬體開發、嵌入式、實時系統,那麼多線程在你的世界中不存在,執行效率就是一切。如果你的目的不是做CTO做架構師,大型多模系統的架構設計,不是你需要考慮的問題,你只是整個軟體生產線上重要但普通的一環,你做個猛將就夠了,不需要考慮將軍的煩惱。(無論已承認與否,計算機(軟體開發)領域都是一個極其看中天分的地方,有些人畢業年薪6W,有些人畢業年薪60W都不止。保持上進心,但是要選中方向。)最重要的一點,「演算法無大用」。 「程序=數據結構+演算法」這個計算機領域的重要等式都已經產生這麼多年了,居然還有人說「演算法無大用」。「實際工作里除了瓶頸處,高級演算法毫無用處。」說出這句話,已經說明了他對演算法的認識有偏差。什麼演算法?演算法是解決問題的方法,是解決問題的方法(因為很重要所以要說兩遍)。問題層出不窮,演算法層出不窮,但是問題與問題之間有共性,所以有了某一類「演算法」。演算法的高級低級之分也是因為其解決的問題的複雜程度有區別。「高級演算法毫無用處」是因為你遇到的問題太簡單了,不需要使用高級演算法就可以解決。但是,僅精通高級演算法一項,就已經讓你成為了很多領域的高手。(我說很多領域,有些領域確實不需要高級演算法,不需要並不代表不重要,學習、使用這些演算法是本身就是對邏輯思維的一種鍛煉)。"高級演算法的模塊包",我很難想像,一個不懂高級演算法的人,如何使用高級演算法的模塊包,能夠將一個具體的問題抽象成為某類抽象的問題,這就是"懂得高級演算法",是使用模塊包的前提。說到演算法就不能不提數據結構,演算法與數據結構,相輔相成,但是在具體使用的方式上卻迥然不同。數據結構可以不求甚解的使用,直接使用相應的類庫即可,完全可以做到只需懂得它的優劣無需知道它的實現細節,這因為二者在抽象層次上的差別所導致的。對於高級數據結構,我個人的意見是,如果你無意向某些高端領域發展,你只需要能夠熟練使用即可。綜上所述,在沒有確定領域之前,側重數據結構和演算法,因為他們二者大部分領域都要用到,是程序的內功,確定了領域之後,就要開始學習相關領域的理論知識,學習相關開發所需類庫的知識。(所以,對於應屆生,很多大公司/好公司會看中數據結構和演算法,這代表著你的能力,意味著你的基礎知識很紮實,所欠缺的只是實踐,他們需要這樣的「好苗子」,所以即使沒有實踐經驗無所謂,較為一般的公司則更看重你的技術領域實踐經歷,他們需要「熟練工」)
---------------------------------------------------------如何確定領域-------------------------------------------------------首先要明確一點,人與人之間是有差別的。
你如果智力拔群、或者耐得住寂寞,你應當去鑽研演算法、數據結構,畢業後去各大廠,他們很願意招這樣的好苗子,進去之後他們會很據需要給你安排領域,或者畢業之後繼續深造,成為「計算機科研工作者」,而非程序員,你的使命就是就是研究吊炸天的演算法,你的歸宿是各大研究院,寫代碼這種俗事就交給我們來做。就算這些不適合你,那麼適當學些演算法、數據結構來磨練思維也是不錯的。
如果你偏好硬體,喜歡一切盡在掌握的感覺,單片機、嵌入式、和底層驅動開發會比較適合你。淘寶上一些單片機的板子,幾百塊錢買回來,有教程,練練手也是不錯的,學校里一般都會有類似的實驗室,講明了意圖過去學習應該也沒人阻止你。需要知識:C/C++語言,嵌入式開發相關知識
如果你不喜歡這麼原始的,寫寫Android(iOS) APP也可以,Android的投資很少,一部Android手機用於開發,一個VPN用來訪問Android開發者文檔。iOS開發的投資略大,mac和iPhone(pad/pod touch)怎麼也得有一個。當然,二者都需找本相關語言的書籍Java或者Object-C或者Swift。學習過程:相關語言語法,然後是對應平台的sdk。
如果你喜歡桌面端應用:- Windows上的Windows API/ MFC。這條路你不需要重新學習語言,只需要學習相關類庫,或者使用C#/WPF的組合,這個組合你不需要學習「第三方類庫」,因為開發windows程序所需要的一切,都包含在C# 大而全的「標準庫」內了。
- linux 如果你選擇了這條路,這就是一條註定寂寞的道路,QT/GTK+/KDE...等等,選擇一個的GUI類庫,學習linux系統的相關開發知識。你將成為孤獨而偉大的人,為linux桌面應用添磚加瓦。在語言方面,由於開源社區的特性,除了C/C++以外,你還有各種腳本語言可供選擇,但本質上還是在調用C/C++的底層庫
- Mac OS 沒玩過,不清楚,但是和iOS的有些類似,語言上都是使用Object-C和Swift,類庫的相關介面上也類似。
(忘了說,其實你可以選擇使用Java開發桌面應用,不過這基本是一條不歸路,成熟的java桌面應用寥寥無幾)
這三者,你都需要學習相關操作系統的知識以及多任務處理的知識。如果你喜歡「互聯網」,可以學習一門動態網頁技術,學習使用Ruby on Rails/Express(nodejs)/ASP/JSP/python/PHP(排名分先後,後面再講)。嘗試著自己設計、規劃、實現一個站點。在這個過程中,同時會涉及到資料庫、HTML、CSS、Javascript的相關知識,這樣一個學習過程是痛苦且迷茫的,但收穫巨大。Ruby on Rails被我放到了首位的原因是因為它是一套完整且成熟的全棧技術框架,包含了很多優秀的理念。Express則是因為nodejs屬於當前的技術趨勢,快速演進意味著更多的機會與更多的資金投入,ASP/JSP無需多言,成熟的商業解決方案,而python的web框架我不清楚,但是python是一門不錯的語言,PHP放在最後則純粹是因為我個人的好惡,我對它存有偏見,我認為它是一種相當原始和粗鄙的語言。
如果你喜歡「網路」,認真學習java中的網路模塊,學習多線程,然後通過底層協議實現簡單的上層協議伺服器,,然後嘗試著如何去優化它的效率。(如果你有耐心,或者對抵觸java,也可以通過c/c++ 完成)你理想的歸宿就是某個伺服器軟體的開發者(之一)。
還有一些發展方向就偏離了「程序員」的道路,比如 數據挖掘、圖形學、人工智慧、機器學習等等這些屬於計算機中「科學」的一面,而逆向工程屬於技術的一面但它不是直接生產軟體而是在分析別的軟體,還有軟體工程更加偏向管理學,我們不做過多的討論。但是在許多人看來,這些都是在搞IT,這些人應該都會修電腦裝系統(笑)
再一點就是「遊戲」,對於遊戲而言,重要的是創意,開發只是把它實現的過程,如果感興趣,開發 遊戲引擎更多的是計算機圖形學與架構設計上的難度,而使用特定引擎開發不過是普通的開發而已,沒有其他更大的意義。
-------------------------------------------------------------總結-----------------------------------------------------------------------竊以為,對於程序員來講,最重要的能力是通過代碼來解決問題的能力。「項目」和「程序競賽」就分別考量了解決實際問題和解決抽象/邏輯問題的能力。這個能力是一名程序員的內功。這個能力只能依靠思考與實踐來提升。(寫代碼-&>看代碼[自己的/高手的]-&>重寫代碼...)關於相關領域的知識,隨著移動互聯化的推進(好俗氣),移動開發與互聯網開發(特指HTTP/Web)的應用越來越廣泛,無論是從就業、還是日常應用,這方面的知識都應該了解、學習,無論將來是否從事相關的工作,但當涉獵,總有裨益。
------------------------------------------------關於問題中三個問號的解答----------------------------------------------------1.是否需要繼續學習C++(python) 當你能夠熟練使用STL的時候,理解了C++的面向對象概念的時候,你就可以考慮學一門新語言了。 而對於Python,我覺得更重要的是學會常用的語法,能夠使用py寫幾個輔助的小程序的時候,你就可以考慮學一門新語言了。2.不知從何下手來進行實踐
如果你還處於學習C++的階段,可以嘗試著自己解決一些經典問題,實現它們。比如一個「高精度類庫」,一個支持加減乘除括弧的命令行計算器,一個可以自動生成迷宮地圖程序,一個走迷宮的程序。
如果你在學習Python,做一些練手但具有實際意義的小工具吧,比如把某個網站上的圖片全部下載下來的程序,比如把統計硬碟上所有文件/文件夾信息的程序。 如果你在學習移動應用開發,那麼計算器依舊是不錯的開端。 如果你在學習Web技術,那麼可以嘗試著做一個個人博客,或者簡易的微博系統。 如果你在學習硬體開發,買一個帶鍵盤(觸摸屏)的開發版,別猶豫,計算器! 如果你在開發桌面應用,也可以寫個計算器啊(你夠了),比較推薦的實踐案例是區域網的聊天程序。3.是否還有其他路 我已經把我能想到的路,都羅列在此了。 每個人都有自己的特點,有適合自己的發展方式,如果你現在迷茫,不知所措,說明你還沒找到自己所擅長所喜愛的那個,那就多多嘗試吧。 如果可以,不要讓工作決定愛好,寫程序是對於我是一門工作,同樣也是愛好。---------------------------------------------------完結,如有必要可能會進行修訂------------------------------------------------
本人做程序有17年了,這裡說說個人的感受
--------------------------------------------------------------------------光吐槽了,忘了實際給出切實的建議,辦法就是自己實際的做東西練習。具體來說就是不斷選擇一個自己喜歡的題目(比如開始時候做個貪吃蛇,後期做些近似能商用的信息系統這類的),儘可能的自己完成。同時大量的聯繫基礎演算法及各種基礎技術,這在下面有敘述。注意這裡說的自己完成,是儘可能的:1.不要看別人的思路2.查資料儘可能的查小問題,比如不要查怎麼顯示貪吃蛇,而可以查怎麼繪製個方塊3.充分調試和升級,在基礎功能上,盡最大可能的添加功能和完善,直到你的項目崩潰。(比如嘗試讓俄羅斯方塊在區域網對戰)-------------------------------以上為補充---------------------------首先,本人不贊同梅騰天 回答中的大部分觀點,人在進步,在學新東西,在學校時水平差,到工作中水平上升了,就一定是因為工作好么?如果你在學校中就永遠是那個水平了么?這裡就大家經常提到的幾點說幾句。1.演算法:就個人帶徒弟的經驗來看,演算法絕對不是沒用,而是大大的有用。只不過大部分菜鳥不知道演算法的用途,所以覺得多學幾個庫更實在。演算法,對絕大部分程序員來說,意義不是「學會XX排序和XX樹」這樣的實際用上的機會比較低的東西,而是「理解計算機是在如何解決問題」以及「我們應該如何看待這些問題」。你說演算法沒用,確實,絕大部分演算法你用不上,但沒有演算法基礎,你怎麼設計自己的東西?學庫、學系統、學環境、學設計、學架構都不能讓你更多的理解這些,當然,學體系結構、學編譯原理、學離散數學等對這些有幫助,但是我還真不相信看不起演算法的人會去學這個。所以說,如果你把演算法作為【工具集】來學,那沒有任何用,但作為【基礎觀點】來學,就是重中之重。
2.語言:經常見到人說XX語言怎樣怎樣的,有人鼓吹某個語言的優秀,有人妝模作樣的說什麼「語言一通百通」。個人的觀點是:成熟的商用的開發語言之間很難有明顯的優劣,但在特定領域中,是否適合這個領域卻有著巨大的差別。比如說,C#和JAVA之間,語法上面差距有多大?表達能力上呢? 但是如果進一步考慮上所處的開發環境(如.NET)和應用領域(如移動開發),那麼差別立刻就能看出來了。所以,如果就短期(幾年這個量級)來看,考慮學什麼語言的首選因素應該是考慮你期望從事的行業的主流技術,而非語言本身。如果長期來看,語言上的選擇更要多樣化,面向對象是主流的基礎技術,其對應的JAVA或C#是一定要選一個的,C語言在很多場合有其重要的意義,也要了解,用於快速開發的語言可以多學幾種,畢竟學習成本不是很高,另外函數式語言對糾正程序員的語言偏見和慣性思維有著重大意義,個人推薦在其他學的小成的時候一定要至少學一門。特定領域(或廣義一些,針對某類問題的,比如R)語言就那麼回事,對你理解語言的幫助不會很大,不用就不學沒關係。
3.系統:不要迷信什麼linux才是王道的這種鬼話,linux唯一的優勢就是便宜(和B格,不過近年好像也不行了),然後由於便宜帶動了一個圈子,所以也有了一些只能在linux下用的東西。用我一個朋友的話說,在國內,linux就是傳銷,上當的人一定要拉一些新人進來才能平衡。國外呢?確實不一樣,因為全用windows買不起。但是,並不推薦新手學習linux,因為他會讓你長時間的糾結在基礎問題上,而沒有機會學習更重要和有意義的知識(滯後你5年的學習進度跟玩似的)。比如說吧,makefile這個東西,憑良心說,你讓一個十萬行積累的新手理解這東西有什麼用?最後不是還在那裡浪費時間?是的,我們可以通過這個實現一些有意思的功能,但我覺得把這些推薦給新手是不負責任的。當然,如果你嚮往的那個領域主打linux,那還是學學吧,入鄉隨俗。
4.工具:很多人進入公司後會被公司使用的各種輔助工具震驚:哇!調試可以這麼簡單!哇!原來github的除了社區好以外其他就渣一樣!沒錯,很多商用級的工具可以巨大的提升你的工作效率,但請注意一個基本事實:這些工具的學習成本都很低。什麼意思?就是說,你用的時候再學也不影響什麼。當然,這不能一概而論,比如單元測試、重構這樣的工具,就應該早學,為什麼?因為他影響你的開發習慣。調試類的工具個人反而不是那麼推薦,因為在腦子裡面模擬程序運行結果,並由此設計測試程序問題的方法對程序員來說非常重要,使用一些工具就好像用外掛越級打怪一樣,是鍛煉機會永久的缺失。
5.維護性:關於維護性的觀點上面的朋友沒有問題,但這裡有一個基本問題,就是高代碼維護性是通過學習得來的么?對沒有大量實戰經驗的程序員來說,和他談論維護性就是對牛彈琴,你甚至都沒有辦法讓他真正理解為什麼命名要注意大小寫,更別說解釋明白為什麼不能用匈牙利命名法了。涉及設計架構的東西就別指望了,對他來說就是」無意義的加入一堆不知道什麼時候會有用的代碼「。沒真正自己設計一個較大的系統、不斷升級調試、最終代碼失控推倒從來,你永遠別指望這個人會去考慮維護性,相反,經歷過2、3次這種事情的人,除非沒聽說過,否則都會主動的看書學習。所以才會有所謂的」十萬行「這個門檻,沒有自己寫(抄書後修改調試、下別人的修改、看開源項目統統不算)夠十萬,沒有資格學維護性,這就是現實。
6.多線程:既然提到了,就說幾句,在程序設計中,多線程和資料庫什麼的一樣,是單獨的一個課題,學語言沒學到多線程,那很正常。而且甚至來說,多線程和大規模的並發控制所用的技術和基礎都不一樣。如果這樣區分學院和實際,那可說的就無窮無盡了。當然,就目前趨勢看,並發很重要,非常重要,但,這絕對不是學編程的人過度需要關心的問題。掌握各種同步非同步機制,會用框架提供的並發庫,對數據並發和任務並發的概念有了解就可以了。大規模並發、高效的緩衝、大量的任務調度需要用到的知識基礎很多,不是你需要理解的。
7.架構:這個問題,我之前向一位大牛(世界級)請教了多次,主要就在架構學習和培養方面,基本結論就是,架構師是無法培養的。在十萬行的基礎上(這點很重要,提前只會浪費你的時間),去了解主流的程序架構觀點,可以提升你對架構的鑒賞能力,多看一些大師寫的案例反思類的東西,比如代碼之美這類的,很多,去體會在具體問題上面大師的糾結,尤其是一眼看上去答案明顯的問題,如果大師還在糾結,就更要引起你的注意。架構不是技能,不是方法的集合,而是觀點的水平,這和上面的各個問題都有本質的區別。所以,對一般程序員來說,需要的是」看懂架構的能力「而非」具有大型系統架構的能力「,這點需要注意,無需太過冒進。
P.S.最後隨便說兩句C++,個人的觀點是:學語言C++是比較差的選擇,因為C++是多風格語言,對高手【注意,這裡的高手是指那些能清晰分辨各種設計、編程風格並在恰當的時候使用的人,如果僅僅是JAVA,c#,c++通吃這樣的不算】來說,確定可以帶來很多空間,但其複雜混亂的語法很容易讓新手找不到重點。確實有」你要搞定c++,其他都沒問題「這句話,但問題是你要花很多很多成本去搞定C++。所以,如果不是領域問題,個人並不推薦。我是今年剛拿offer的大四狗。一些想法,不一定對。
曾經求過業內人士幫助,他說學學Python(自己也在看)也不錯。
學Python沒有問題,我大一開始到大三擼了快兩年Python,基本上已經很熟了。如果從就業角度來考慮,你去看下歷年BAT各個職位的要求,就會發現「熟悉Python」只是加分項,不是必需要求。當然,語言這種東西,在深入掌握之後很多經驗是可以leverage的,不要太過糾結。
1.C++後面學習難度非常大2.找工作方面,C++和Python不是很好找(其實自己也沒有這方面的信息,只是推測)。是繼續C++(和Python)?
如果已經把C++ Primer仔細看過一遍,那麼足以用來應付校招了(當然,實際工程開發還遠遠不夠),我在面鵝廠後台開發的時候基本上也是Primer看過一遍的水平。考慮到你現在已經大三了,離校招也只有半年左右的時間,我還是建議你多去刷刷leetcode,補補基礎知識吧。
我也困惑過好一陣。
高頻量化交易對策略師的程序設計能力要求很高,雖然是計算機系出身,力不從心感還是長伴左右。
後來工作里遇到兩位大牛,我分別像他們提問學院程序設計和工業程序設計的區別,才發現原來學校里教的都是坑爹的90年代的思維方式。
最震撼的區別:演算法無大用
學校里各種比賽各種考試將演算法提到無限高度。實際工作里除了瓶頸處,高級演算法毫無用處。而且工作里高級演算法通常有專門的模塊包提供,沒人會當傻子自己動手寫。最全面的顛覆:易維護性高過執行效率
工業程序設計多是大組協作完成,程序員離職跳槽換組很正常,所以工作中最大的問題是讀懂別人的代碼和寫出別人能懂的代碼(不要告訴我你都單獨寫文檔,文檔維護成本很高,常常有文檔代碼不匹配問題反而很混亂)。所以懂得在效率和易維護性的平衡才是走出學院派的標誌。最好用的工具:profiler
我身邊的這位大牛寫程序的方式是:花很多時間設計好架構,然後以最快最易讀的方式寫出實現,然後profiling,深挖瓶頸再做改進。一開始就考慮細節設計是學生常犯的錯誤。最大的鴻溝:多線程
世界上只有兩種程序員,一種能左右互搏,另一種不能叫自己程序員。如果不能玩轉多線程設計,還是轉行做其他有前途的職業好些,比如很多人就回學校當了老師教編程。最大的挑戰:大型多模系統的架構設計
出色的架構師好似樂隊的指揮,他們懂得一個很現實的問題:不同的模塊是不同的人寫出來的,他們能力參差,相互可能不熟,甚至沒有見過,更有甚者相互敵視。架構師必須有威望,不然各個組都會找架構師抱怨自己的模塊活兒太多可以讓別的模塊分攤點兒。架構師必須有領導才能,不然上線後出了問題各個組會相互推脫踢皮球。所以架構並不只是程序和程序怎樣溝通,還有不同組的人溝通。好的架構可以讓不同模塊指責分明,不同組的人分工明確,這不僅有利於初期功能的實現,對之後的系統健康的維護和成長也是至關重要。這一點在學校是學不到的。
暫時就想到這些。我已經因為無法左右互搏而退居二線做量化策略去了。所以只能以旁觀者給個2cents
來值乎問我問題在有壓力的情況下寫代碼,例如限時完成一個實際工程,並且有一定質量要求。
在我看來,coding時能不分心的程序員 就很強了~~好辦啊,找一家用C++的公司去實習,把你的代碼干進他們的代碼庫!弄上他們的伺服器!run起來!上線!!你的代碼就是實際工程中的C++了。
嗯我不是抖機靈,實際上工程師就是在實踐中從學生變成工程師的。實習是一種比較容易的渠道(相比於成功插手知名大型開源項目),而且還有錢拿。
任何脫離操作系統的開發,在應用層次上基本上沒有什麼意義。
所以,比如windows,請學習任何有關和系統相關的代碼是如何編寫的。UI機制線程機制文件系統IO,網路,視頻,聲音等等等等等。明顯想的太多。我做出的第一個程序是用delphi寫的,那時跟你差不多大,但是我根本不糾結該學什麼語言,我那時候就是什麼簡單順手學什麼。如果你按照就業趨勢去學,你很難安心學一門語言。不要總覺得學精一門語言你就不愁了,好的程序員重要的是學習能力,設計能力和debug能力,以及擼的能力。別糾結了,隨心走,無所謂的,都一樣,語言不就是明文二進位么
還是多寫代碼吧小馬過河,深淺自知。
一句話,缺實戰。如果不是對編程有很大興趣的人,往往缺乏動力和能力做一個像樣的項目。怎麼辦,很簡單,實習。你既然學過cp,憑在魔都的機會優勢,找個實習應該不難。CPP和python好不好找工作?去求職網站搜索頃刻就知道了。
用C++寫一個有真實用戶的工程就好了。
我能想到大的就是多寫軟體,看優秀的開源程序
1. 要知道你要寫什麼程序2. 要知道你寫這程序幹什麼3. 要有寫這程序的動力4. 寫程序沒錢賺跟寫個JB沒區別, 除非對JB有莫大的興趣(所以程序員都是基佬).
學語言沒這麼難,多寫寫就知道了。寫個4,5年,你就會發現,新語言來了,拿本參考書,語法看個幾十分鐘就懂了,查查api,就可以工作了。懂編譯器的話,就更快。
然而作為程序員,競爭力在哪裡?寫代碼的規範?還是對某個語言的庫的熟悉程度?或者是對一些框架的熟練程度?我認為都不是。
不容易學習的東西是你的競爭力,演算法始終是第一位,真正需要的是對各種演算法的理解而非背誦。
建議考研,其他的別想了
少寫奇怪的代碼。就變成工程代碼了、
第一,熟悉語法,多看書。知乎這種地方可以用來開拓視野,但是不可能教給你系統性的知識!系統性知識還是要看書來學。第二,造輪子,我做計算流體力學是從數值計算裡面向量矩陣運算的輪子開始造起來的。第三,跟著一些高水平庫去學習,stl,boost,Qt等等。
推薦閱讀:
※有哪些有趣的反爬蟲手段?
※python爬蟲實習?
※只針對 Python 爬蟲,該如何學習?
※pymongo 查詢時,顯示循環不同,為何效率相差百倍?