ACMer 或者 OIer 怎麼轉型開發呢?
從高中以來因為參加信息學競賽,對演算法和一些數據結構都比較熟悉,刷完USACO。SGU,PKU,URAL等題庫也做過一部分。對ACM要求的演算法和數據結構都掌握得比較紮實。但是一直有遺憾就是沒有寫過真正意義上「有用」的程序。語言什麼的都不是問題,我現在要學習一些什麼才能真正寫出一個「有界面,實用」的程序呢。謝謝
趁演算法知識還熱乎趕緊更上一層樓啊,學習計算機科學的專業課程,帶著演算法的眼光去看,然後自己動手去實現。
比如上資料庫的課,你可以擼一個單用戶的DBMS,兼容度可以比SQLite還差(SQL也算個比較冗餘的語言),但是作為演算法黨,徒手擼B樹是不是無壓力。。還可以加其他的數據結構進來,比如做支持按地理坐標檢索前k近鄰的特性,這個feature做約炮app的後端有用,做機器學習里的instance-based learning也有用,我想這種題目肯定有做到過吧!
然後acm的演算法沒有並行演算法,沒有近似演算法,去學人工智慧和機器學習相關的課,有基礎了,學習和實現各種新演算法不就應該事半功倍么!其他各種方向的課同理。
總之我覺得把時間浪費在學api/文檔上就為了畫個界面寫個app,雖然挺有趣,但趁搞過acm腦子好使,在cs路上繼續精進吧。本科生少湊熱鬧多學經典,終會有豐厚的回報。
首先恭喜你,你的演算法知識和代碼經驗也已經足夠了。
之後的事情異常簡單了,只要確定你要做的方向。無論是移動開發,做網站還是企業級的開發,找對了方向,買一本行業比較優秀的書籍就可以開始了,我具體說一下。
首先現在比較大的兩個網站是做網路和移動開發。
網路方面語言的主流無非是三個,PHP、Python和Ruby。前者框架比較豐富,後兩者主要集中在Python+Django和Ruby on Rails上。作為一個ACMer或者OIer的話學起來PHP速度肯定會非常快,但如果不著急工作的話,還是去學學Python或者Ruby,前期學習曲綫會比較陡峭,但爬過一段艱難期後就會很有成就感,加上強大的框架自己實現個網站也相對輕鬆的多,現在創業公司大量開始採用Python和Ruby。工作的機會也會增加。
PHP方面的書籍主要推薦三本
- 《Core PHP Programming》:這本書的作者之一就是PHP的發明者,裡面除了講了語言性的內容,在第四部份還講了一些實際工程方面的知識,非常非常的有意義,尤其對於並沒有太多實際開發經驗的ACMer。
- 《 PHP and MySQL Web Development》:這本書太經典了,很多人都是看著這本書上道的,內容比較實用化,同時也講了一些MySQL的內容。
- 《PHP Architect"s Guide to PHP Design Patterns》:整本書都在灌輸的是面對對象的思想,後面講MVC的部份是精華中的精華。
Python方面推薦兩本
- 《Learning Python》:封面是個老鼠,基本上看這本書你就能很清楚的知道什麽事Python了,但是書裡廢話特別特別多。
- 《Practical Django Projects》教你怎麼用Django的,內容很簡單,但是看完也入道了。之後建議好好看看Django的官方文檔,質量不比這本書差。
Ruby方面推薦兩本
- 《Programming Ruby》:傳說中的「鎬頭書」,內容豐富,只是可能出門有點困難,但熬過去就可以了。另外還有一本很Q的書叫做《Why"s (Poignant) Guide to Ruby》,內容比較簡單,可以當廁所書看看。
- 《Agile Web Development with Rails》:一步一步帶著你走了一個Rails的項目,但也可能會有入門困難的情況,一邊看一邊Google吧。
移動開發方面的大頭還是做iOS和Android,關於這兩者的比較看下面兩個問題的回答自己去辨別:
iOS 和 Android 到最終誰會勝出?http://www.zhihu.com/question/19571027
Android 如何才能變得比 iOS 更有吸引力?http://www.zhihu.com/question/19639031
學習方面先說iOS的,最理想的學習方法是看Stanford的開發視頻,iTunes上可以直接搜到,點開iTunes U就看到了。在配上一本《Beginning iOS 5 Development Exploring the iOS SDK》就足夠了。看完之後自己想著寫一個項目基本上就夠了。
Android的可能會比較麻煩,首先要學Java,個人建議就是看《Thinking in Java》,之後趙本市面上差不多的書籍看看就可以了,或者看看官方文檔。
至於Windows Phone我並沒有做過,所以不發飈觀點了。
最後如果有興趣可以看看我之前一個問題的回答:http://www.zhihu.com/question/19768115/answer/12900842
我覺得你最需要的還是一個書單吧:
- 體系結構方面可以看看《Unix 高級編程》一類的書籍。甚至侯捷的《Windows 95 程式設計指南》也行。主要是進程,線程,線程同步,IPC,內存保護之類的話題。
- UI Framework 方面要掌握一種 event-driven framework。我是從 Win32/MFC 看起,看了 Swing,然後是 Cocoa 的文檔才完全明白。最後我覺得 Cocoa 的文檔非常好,Apple 網站上有明確的閱讀路線。如果你不打算搞 Mac 開發,或者覺得 Cocoa 很難(畢竟我不能體會初學者看到 Cocoa 文檔的感覺),可以看《Visual C++ 技術內幕》這本書。
- MVC 方面看《Design Pattern》。
- 然後,其實寫有用的東西也是 top-down, divide and conquer。大問題分解成小問題,單個解決再合併起來。和 ACM 要解決的虛擬問題沒有本質區別。
- 越早動手練習越好。
很簡單,放手去做就好了。本來這事就是變左邊學的過程。
混github,自己寫些小工具什麼的都好。多研究研究別人的開發模式,學會寫文檔,做一個東西能夠讓其他人看了文檔就能用起來。
其實做項目並不會太複雜,重點在去做。可以從做Online Judge開始嘛,從看開hustoj源碼開始,把自己訓練中的需求寫出來,變成自己或者學校訓練用的Judge,別告訴我你不知道這貨是啥~
怎麼說那
- 你會突然發現 現實社會(原諒我用這個詞)中大部分的開發基本和競賽沒什麼關係 不用貪心 動歸 甚至連堆排都不用 尼瑪幸虧脫離組織早啊...
- 這是說大部分開發 像客戶端 前端 一部分網站的後台 但是你要是真的演算法很NX完全不需要轉型 直接研究像搜索引擎 資料庫 或者很多高深的東西 你比一般程序員研究那些會很有優勢
像你說的「有界面,實用」的應用程序 不幸的是 他是前種 所以 你現在掌握的那些 唯一對「有界面,實用」有用的是語法 你也有優勢 很多東西一說就懂
現在你要想想你要學什麼方向了 是移動開發 還是網站
移動開發無非就是iOS Android WP7 (其實我還挺喜歡WebOS) 如果你真想賣個產品
- 最推薦你研究下WP7 微軟的東西 砸錢也會做起來 而且還有Nokia的支持 而且C#最接近C (相比Java 和 Objc)
- iOS也不錯 但是要學Objc 開發還有門檻(需要Mac OS 估計你用的PC)
- Android 分裂太嚴重 開發成本也挺高的 (UI很多東西不是現成的) 不過靈活度高 適合折騰
網站要選個語言 Python PHP Ruby 推薦Python 我用不到一個月的業餘時間 就大致弄明白Python Django 可以寫個小網站
做界面的話,多年的ACM就白練了,去玩後台吧。當然做著玩也很容易啊,學C#,拖一拖控制項也能做界面。。。
做伺服器相關的技術,更適合ACMer,在千萬上億流量的伺服器上做性能優化,聽起來就讓一個ACMer熱血沸騰,不是嗎?哈哈!
找個公司去實習是最好的。別人帶你學比自己學更輕鬆。
不要將界面理解的太難,你的能力可以開發大多數程序了,翻一翻 業務模式,設計模式,UI界面設計的書看看,閑時用腳本寫寫好玩的東西,或者用javascript 寫寫UI
競賽高手不等於應用能寫好,畢竟競賽是寫不超過500行的程序,而實際應用得有幾萬行,而且一般不需要實現複雜的演算法。軟體設計的方法學,軟體工程的方法學,反而比演算法更重要。
基本贊同王亞暉的回答,我再補充一些:
你提到有界面、實用的程序。
普通的界面程序(下簡稱GUI程序)一般只需要學習下一些GUI的庫就可以了,這些包括C++的Qt,Java的awt和swing,Python的PyGtk、PyQt,等等(不勝枚舉),喜歡哪門語言哪種環境選擇一個對應的庫學習一下就差不多了(這些庫在網上都有比較豐富的教程的,同王亞暉所說的,這些也建議看英文的)。一般寫GUI程序用這些庫就可以了,如果你想體驗人生的話還可以考慮直接調用windows或者linux或者其他種類的你的操作系統的API。
不過GUI程序經常需要是多線程的,而這也可能是OIer或者ACMer從學術轉向技術領地時會覺得有些無措的地方(至少我當初是……),雖然有些GUI庫讓你很多情況下不用自己去操多線程的心,但是你還是有必要知道線程是什麼和多線程解決了什麼等問題,否則肯定還是會犯很多愚蠢的錯誤的。
如果想整點更酷的東西,比如3D的程序的話,可以學一學DirectX(僅限於微軟家的操作系統)、OpenGL(跨平台的)這些東西的編程介面。如果想寫遊戲的話則可以選擇學習一些遊戲引擎,比如C++的OGRE(這個其實是一個圖像引擎)、Irrlicht,Java的jMonkeyEngine,Python的Pygame、Panda3D,等等(同樣不勝枚舉)。
學會了上面這些庫或者引擎中的一種,就完全足夠寫出來一些「有界面、實用的程序」了。不過IT界沒有不深的坑,雖然對於ACMer或者OIer,一般演算法不會是大問題,但是如果想要追求更進一步還有很多技術上和設計上的東西要學習。
如果去做界面什麼的,那多年的ACM功力就白費了,王亞輝提到的各種框架什麼的,都是很簡單的東西,可以做為業餘時間搞著玩的東東,比如用來做一個自己博客網站什麼的。
能用到大量演算法的工作,目前來說是在搜索引擎領域,包括現在很火的推薦系統,有如此大量演算法經驗,強烈推薦去做數據挖掘、機器學習、自然語言處理等方面的工作,可以去百度、谷歌等公司的NLP部門實習或工作,如果需要lz可以私信我幫忙推薦。
其實學怎麼搞開發的話最主要是要去做一些實際的項目,你可以去外面找個實習或者兼職,跟著別的團隊做幾個項目就知道這個要怎麼做了……
ACRush是創新工場一個項目的技術總監。所以我覺得,牛人么,寫什麼都牛 。
表示到現在還不知道怎麼搞「有界面」的程序,其實,也有很多不是干這方面的工作,對著一個黑乎乎的終端一整天。去那邊看看,就能找到很多之前搞競賽看到的影子了,而且,還是跟實際結合的,不再是杜撰的題面了。能用上所擅長的東西自然好,暫時沒需求,也別擔心,在你能發現同事navie的方法可以優化的地方時,你就又開心了。當然,還有很多更實在的東西得掌握,不過肯定不是所謂」有界面「的東西。
其實個人覺得演算法要都會,寫代碼要流暢,都沒問題,其實最難的問題是實際策略的制定,這個遠遠凌駕於碼農層面
對於學過演算法的人推薦學習一下machine learning,雖然我不知道他的商業用途是什麼,但是裡面又更多新鮮的演算法
推薦閱讀:
※VLOOKUP 到底有多重要?
※脫單有沒有類似數學公式或者編程之類的東西?
※完全用彙編寫成的最複雜的商用軟體是什麼?
※在數模競賽中負責編程的同學需要學習哪些知識?
※如何編寫一個分散式計算框架?