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,別告訴我你不知道這貨是啥~


怎麼說那

  1. 你會突然發現 現實社會(原諒我用這個詞)中大部分的開發基本和競賽沒什麼關係 不用貪心 動歸 甚至連堆排都不用 尼瑪幸虧脫離組織早啊...
  2. 這是說大部分開發 像客戶端 前端 一部分網站的後台 但是你要是真的演算法很NX完全不需要轉型 直接研究像搜索引擎 資料庫 或者很多高深的東西 你比一般程序員研究那些會很有優勢

像你說的「有界面,實用」的應用程序 不幸的是 他是前種 所以 你現在掌握的那些 唯一對「有界面,實用」有用的是語法 你也有優勢 很多東西一說就懂
現在你要想想你要學什麼方向了 是移動開發 還是網站
移動開發無非就是iOS Android WP7 (其實我還挺喜歡WebOS) 如果你真想賣個產品

  1. 最推薦你研究下WP7 微軟的東西 砸錢也會做起來 而且還有Nokia的支持 而且C#最接近C (相比Java 和 Objc)
  2. iOS也不錯 但是要學Objc 開發還有門檻(需要Mac OS 估計你用的PC)
  3. 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 到底有多重要?
脫單有沒有類似數學公式或者編程之類的東西?
完全用彙編寫成的最複雜的商用軟體是什麼?
在數模競賽中負責編程的同學需要學習哪些知識?
如何編寫一個分散式計算框架?

TAG:程序員 | 軟體開發 | 演算法 | 編程 | 程序設計競賽 | ACM競賽 |