物理專業自學計算機應該學些什麼?

我是理論物理大四學生,即將去美國讀物理學博士。讀這個物理博士完全是出於興趣,而非對於職業規劃的考慮,但是未來職業規劃又是一個不得不面對的問題,所以我需要在接下來讀物理PhD的五年裡面自學計算機,在此徵求一下大家的建議:
我的背景:學過數值計算方法,計算物理(主要是各種蒙特卡洛還有元胞自動機之類的)數據結構和一些簡單的演算法,高中時參加過信息學奧賽不過只拿了個省二。會的語言包括Pascal,C,python,Matlab(Octave),Mathematica,能用這些語言做一些不太複雜的科學計算(包括物理實驗的模擬和數據處理)。操作linux比較熟練但是不太會折騰,遇到各種問題都需要google。前端方面會寫HTML,CSS,了解一些HTML5和CSS3的知識,能看懂Javascript但是自己寫不出來。大三的時候被哥們拉著創業做了點網站不過擱淺了。自認為在理論物理裡面培養出來的數學比較好。
期望:本人對三個方向感興趣:
1)計算機圖形學。這個來自於學習計算物理的時候,編寫物理模擬程序(比如隨即行走,晶體生長,元胞自動機)產生出來的一些數據用圖畫出來感覺非常有成就感,而且我特別喜歡線性代數,對遊戲動漫之類也很有興趣,小時候經常拿3dmax建模。本來我想說是對設計感興趣的,因為小時候就想當個藝術家,陰差陽錯的後來喜歡上了物理,計算機圖形學是我唯一能想到的藝術與數學物理結合的比較好的東西
2)移動開發,最好是軟硬結合的那種,我沒什麼經驗就是覺得非常酷。而且覺得在五年之後可穿戴設備智能家居什麼的的時代就會來臨。
3)數據類,包括機器學習數據挖掘之類的。我現在就在學coursera上的機器學習課,才上了三個星期,感覺有點意思。
我現在的問題是,感覺無從下手。想學的各種東西要用到的庫或者api都很龐大,學起來很煩。而且不知道是否有必要去學操作系統,編譯原理這些課程。
請各位給予指點


每個人站的角度不同,現在的答案基本都是從圖形學的角度建議,我換個角度。

從研究生計算機科學做研究的角度來講,我認為本科最適合的專業首先是物理,其次是數學,再次才是計算機。數學學的太抽象,抽象層次太高,研究現實問題的人往往處在鄙視鏈的底端。計算機學的太底層,對於概率論、隨機過程、線性代數等學科學的太少,不了解建模分析的那套方法論。而物理學一方面的數學知識足夠多,另外一方面主要研究的方法也是對這個世界建模,然後進行觀測,這與前沿的機器學習領域做的事情幾乎是一樣的。至於會不會寫代碼,其實科研裡面要寫的代碼不多,主要都是在推公式,研究如何設計模型使得其擁有很多良好的性質。代碼很多時候寫寫matlab就可以了。

所以恭喜你,如果你想轉行做CS的科研,你有很大的優勢。事實上,很多CS領域的大神都是學物理的,比如華人圖靈獎得主姚期智,CMU Machine Learning領域大神Alex Smola。

如果你真的勵志做CS相關的研究的話,物理PhD的選擇最好到CS極好的學校,比如UCB, CMU, MIT, Stanford,一般這些學校都可以輔修Machine Learning的Master, 多修CS相關的課程,都是很好的選擇。Coursera上的Machine Learning課程都很入門,如果想進階,你可以看看CMU 10701(Machine Learning), 10702(Statistical Machine Learning), 10708(Probabilitic Graphic Model) 課程的課件、視頻、相關閱讀和作業,基本都不需要寫代碼,主要是數學證明、建模和分析。

當然,如果你想做應用而不是做理論什麼的,當我以上沒說。


我個人覺得上邊的答案,都不符合一個非計算機的對於學習計算機的真正渴求。

以我對於國內計算機專業的了解,國內的大多數計算機學院,倒不如稱之為WEB學院,我不是有意看低做WEB的同胞們,我也是你們中的一員。現在工科專業中大部分都要求編程,但是卻不給講計算機基礎架構的知識,即使是計算機專業的人,對於計算機的學習和理解都是半吊子水平。所以就出現了非計算機專業對於計算機的好奇,因為他們發現,解決問題的絕大部分時間都耗費在跟計算機糾結去了。

當我還是一個無知少年的時候,最讓我興奮的事情莫過於解決了一個物理或者數學問題。高中畢業時,最吸引我的莫過於核物理專業、應用數學專業、化學專業了。那個年代我對於技術的了解還是最多停留在19世紀。當時的我曾經狂言,世界上的有關科技的東西我都了解的差不多了,只是還有一個東西我沒法看懂它是怎麼運作的,就是一個小小的計算器,算是當時我理論水平一小片烏雲。當時完全沒把它當回事,現在想來,教育讓我有知識的同時,也讓我變得愚蠢。我大學學的是計算機專業,是因為這一小片烏雲。

幾年前,我也是個門外漢,我曾經想花一天的時間搞懂計算機是怎樣工作的,為什麼計算機就算不錯,編程到底是個什麼東西。在實驗室困頓了這麼多年,終於有了一點自己的理解,但是這也只是冰山一角。

現在回答問題
可以肯定的是:必須要學CPU架構、操作系統、編譯原理、Linux程序設計相關課程,但是是以一種理解的方式。當你理解了我說的這些個東西,你說的那些個問題都不是個問題,只是細節的問題,你也會發現學計算機是有通法的。希望題主將目光放遠。我覺得每個人都應該懂計算機如何工作,就像理解發動機的四衝程、發電機電動機的電磁感應。這是個信息社會,計算機是個工具,必須理解這個工具,因為這個工具正在讓我們的各行各業都在發生一個爛大街的變化:智能化。

不要讓自己的時間過多的浪費在怎麼使用工具上,計算機就是一個就在我們手中,但鮮有人能說我就是理解它的一個工具。如果你能像理解物理定律一樣去理解計算機,你就有睥睨天下的資本。這是一個信息化的時代,可是有好大一部分人都好像還沒有適應,工科基本被信息化、計算機化了,這是一個時代的趨勢。

編程是一個基本能力,就像你出國就必須會說英語一樣。
看我的這篇回答:程序員向底層探索是不是到計算機體系結構就差不多了?
這篇文章大概講了一個計算機人或者說程序員大概需要的知識結構。


爪機主動答。我覺得考慮職業發展要向前看,囿於「要把原來學過的domain knowledge用上」沒有必要,基本上都是在限制你的思路,constrain太多最後得到的local optimal很有可能就不是你真正適合去做的了。具體來說,圖形學的大多數東西依舊是程序和數學,跟物理學關係大的只有Physically-based Computer Animation/Simulation,就這個領域用到的物理知識也絕對沒有超出普物,反而跟數學關係更大,而且做的好的人大多數也不是物理出身的(比如stanford的Rom Fedkiw讀的數學)充分說明很懂物理不是必要條件。而且如果你要真的想以這個為工作並且要求做的理論背景比較深的話就會發現job market異常的小…總之,這個領域跟物理學之間的match很小(雖然確實很有趣ww)。
其實我覺得你才本科的話基本上沒有什麼沉沒成本可說的,程序員大把不是CS本科出身的,不用把自己想得太特別,就把自己當成一個數學和物理基礎比較好的新手,然後使勁學你感興趣的就好。祝你成功。


這個得看你的boss push你狠不狠了

可以找找計算機系的培養方案,再去亞馬遜豆瓣上看看書評,就可以確定下一個書單

可以選擇按照科班路線來,也可以自己先搗鼓項目然後再帶著問題看書

至於庫或者APi這種東西會查文檔就好

總之,你要花大量的時間,前提是你以後的boss會給你寬裕的時間

祝好運


看了一下別的答案我覺得得多寫幾句

一個沒有系統學習過物理學,但是編程很叼的人,能做計算物理么?

反過來,如果對計算機這個學科缺少整體了解,但是物理很強,就真的能勝任計算機中和物理緊密相關的分支么?

顯然,兩者都不可能。前者只能成為實現別人思想的工具,後者只能空談。

每個人總覺得自己已經掌握的東西是理所當然的,而往往特別憧憬自己不熟悉不了解的東西。

別的人給題主的建議當然是好的,卻未必能解答題主的困惑。

打個比方,你們已經在代碼的千軍萬馬之中殺了幾進幾齣,發現一個難以攻克的據點需要物理學的知識才能拿下。你們說,快來啊題主,這裡是需要你的地方。而題主此時還在戰場之外看的雲里霧裡,雖有心但是卻還沒有融入戰場的環境。

所以題主還是現需要融入戰場的環境,該學的還是得學,該搞明白的還是得搞明白。


其實在計算機圖形學裡有很多與物理相關的課題,例如物理模擬(剛體、柔體、流體等)、基於物理的渲染(光源、材質、媒介等),還有一些涉及物理的跨學科課題,例如生物力學、基於物理的聲音渲染、光場攝影等等。簡單介紹幾本書

  • Physically Based Rendering, Second Edition (豆瓣)
  • Fluid Simulation for Computer Graphics (豆瓣)
  • Game Physics (豆瓣)
  • Physics Based Animation (Graphics Series) (豆瓣)

有空可以看看最前沿的圖形學發展,特別是當中涉及物理部分的

  • SIGGRAPH 2013 Papers

看看那些文獻的作者網站,可能會發現不少研究者都有物理背景。

我覺得能做理論物理研究的人,其智商做哪種科學問題也不大吧。而計算機科學之本就是演算法,無論是哪一個應用方向都是必須的,建議深入學習。個人不建議浪費時間在API、OS、UI編程上面,不竟這些東西許多人都能做,有研究能力的人可以探索新世界。因為遊戲、動畫、電影這些娛樂工業,計算機圖形學的職位在行業上也有需求。


我是理論物理大二的…給師兄回答這個問題吧。
================================================
當師兄看到很多API繁雜但無從下手,答案是唯一的:多寫。
再說說我的建議吧,
掌握一門快速開發語言:強力推薦Python,因為有scipy和numpy存在。可以把這玩意當Matlab用。我做過測試,進行大矩陣乘法numpy的速度比matlab快50%,這二者都比mathematica快20倍…而且python有一個很好的web framework django,結合html css,可以寫出不錯的網站(比如知乎)

如果你是OI的,數據結構神馬不用太多慮,直接上計算機圖形學吧。
建議可以OpenGL+PhysX(物理引擎)+.NET/Cocoa(win/mac)一起做一個項目,像我做的是一個無人機控制的模擬平台。這個對於學習三這玩意都有效。特別是mvc的構建方式。
另外還有一個很輕巧的構建計算機圖形學的方式是webgl,很漂亮。或者直接unity3d(遊戲引擎)引擎亦可。
如果你會了html也就是如果你會了javascript,建議入手node-webkit,二十分鐘構建一個跨平台桌面應用。

對於交互UI我比較傾向於兩種,一個是輕量級的html+js的形式,好看簡單,一個是unity虛擬現實,我最近做的一個項目就是這兩種結合的模式。

強力推薦CUDA(GPU計算),物理口必備…想在自己的PC上模擬核聚變CUDA絕對是居家旅行,殺人放火必選。而且CUDA的模型天生是為物理學家設計的。同時需要學點cpp,可以把鄙校丁澤軍老師計算物理A書上的習題全部CUDA一遍基本就練習的差不多了
http://micro.ustc.edu.cn

ML/DataMining我只看過一些些,這些東西如果自己寫演算法的話需要用c/cpp如果只是玩玩可以用python+一堆庫的方式來搞。主要可能還是數據源吧。

嵌入式單片機,如果不慎入實驗物理坑會點單片機嵌入式還是有必要的,入個樹莓派玩玩ROS吧。從樹莓派+arduino玩的方式入手玩起來很簡單無壓力,最練手的就是寫機器人控制了。這個是從機械折騰到前段的。
樹莓派既是典型的嵌入式Arm開發版,優勢在於社區龐大。
arduino是一種高度簡化後的單片機。比起51等用起來真的簡單多了

移動開發:學習學習swift吧。玩玩iOS。。總是覺得Android怪怪的

學習軌跡:
1.熟練使用linux/unix(格式化硬碟一個月內可以生存)
2.選一個自己順手的IDE(vim/emacs/VS),基本熟練cpp、python(均指一萬行代碼,可以寫寫計算物理習題)
3.搭建一個自己的伺服器(using http://aws.amazon.com ec2)
4.寫一個桌面app .net/cocoa,(學c#/o-c),在這裡折騰OpenGL CUDA等
5.寫一個絢爛的個人網站use Djangohtml5css3webgl
6.研究妹子回你簡訊速度和她對你好感度的關係(使用支持向量機/deep learning)
7.學習CUDA並在你的pc上模擬EAST using MHD model in FEA
(其實能跑出來一個N-S方程出來個卡門渦街就很好了)
8.學習單片機並且控制一架四軸飛行器給那個追了四年沒追的女神潑一盆冷水(someone你丫兩年以後給我等著)。
可以適當從ROS+樹莓派入手,加上一些有意思的硬體比如kinect什麼的,就很好玩,推薦學習OpenCV(人臉識別)+訊飛各種介面(語音)。


對了。。。工程式控制制論,或者什麼ML,DataMining的數學比物理口的數學真的是弱爆了。一群不用解偏微分方程的渣渣。

順便拋我的blog http://stlover.org(呃最近好像資料庫掛了)
就這些差不多了…剩下做點小項目自己也就會了
=====================
操作系統建議看看,就是看看而已。。我大二選了操作系統課最後發現完全沒聽。
編譯原理沒有必要,想深入學推薦MIT的計算機結構和解釋同時學習LISP


推薦你一本書:《game physics engine development》,講剛體物理引擎的。國內似乎還沒引進,只能看盜版。


https://en.wikipedia.org/wiki/Computer_science
https://en.wikipedia.org/wiki/Computer_programming


要是抽象點,可以去common lisp或者 erlang 這種很函數化的,要是像具體點,寫JavaScript 好了。當然,這些都是編程語言。個人認為還是碼程序開始吧,寫大了就知道OOP, design pattern, architect 甚至是哲學問題了;寫難了,就會弄弄動態規劃,看看數據結構,甚至嘗試和學科交叉的部分,如機器學習。

Code to learn, learn to code....


&命你寫個生成服從正態分布的隨機數吧,語言自選 (erlang 最佳),祝好運。&


建議去MITBBS生物轉行版找找長者的人生經驗。我是認真的。


作為物理系的計算機圖形學自學者,我恰好可以說一下。
計算機圖形學裡所謂的基於物理動畫,其實倒不如說是基於「力學」動畫。固體力學、流體力學現在基本都不在物理學的範疇內了。這些內容都在力學系的範疇,而且現在的「力學」都差不多是獨立的一個分支了,這也是很多不是物理系的(包括我剛開始的時候)不清楚的地方,雖說「力學」實質上更靠近數學(因為涉及物理圖像的東西不多),基本上都是各種複雜的偏微分方程,但過了理論物理一關就算從頭學也不至於遇上很大的困難。
如果說基於物理渲染,基本上也在光度學打轉,用到波動光學的機會都不多,至於理解熒光、磷光要用到的量子理論,還是老老實實用經驗公式吧。當然,會更高層次的光學理論,會有不一樣的看問題方式。
總的還是來說,你學的物理對圖形學有一定幫助,但幫助其實不大,但理論物理都搞的定,還怕圖形學這點問題,我覺得只要有耐心,沉得住氣就行了。


如果讀完PhD在轉計算機,真真是浪費了。計算機對高等物理那些基本不需要,倒是數學是很需要的,但PhD依然是浪費。
那些圖形學,雖然涉及到物理,但是最多也是本科就夠了,圖形學的很多東西都是在投機取巧,那些有顛覆的理論基本上根物理無關,細節的東西都是在拼奇技淫巧。不是不懂物理,而是上帝的高度凡人根本無法企及。你想兩面鏡子相互反射這種東西,在計算機看來就是無限循環(卡死),但是上帝那裡卻是realtime的,一點都不卡。
其他很多計算機領域跟物理就更加沒有關係了,互聯網,大數據,人工智慧都沒有。

如果你對兩者都割捨不了的話,那你應該關注計算機基本理論這些東西。你對軟硬體結合很感興趣,但是這些難度不大,而且你一旦了解之後估計很快就失去興趣了,因為很容易理解掌握。真正難的是計算機物理基礎層面的東西,那才是真正軟硬結合的地方。半個多世紀之前,貝爾實驗室發明了三極體,現在半導體技術已經日漸遲緩了,量子計算機,量子傳輸這些技術充滿想像。當然未來很難說,但發言權在於那些位於基礎理論前沿的那些人,很明顯你有機會。實用技術有時的確很吸引人,但那些都是細緻末節,你窮盡一生改變的只是一枝一葉,並且或早或晚都將墜落。


都會這麼多了還不知道要學什麼,差評 -_-#


重要的是目的,所有選擇的手段都圍繞目的 == 高效。

先搞清楚目的,「想去什麼樣的公司,做什麼方面的開發」,這個確定了以後,方法和手段google幾下就能獲得。
如果目的難以確定的話,就暫且選擇自己覺得好玩的領域,自己做一個小產品,給自己玩或給自己用。做到後來覺得不好玩了,就換個方向,逐漸深入的過程中,你會找到屬於自己的道路。
不要以上什麼課為出發點,要在開發自己的產品過程中需要什麼就學什麼,學了就用到產品中去。


如果想學習計算機科學,而不是玩玩而已淺嘗輒止的話,建議先看離散數學(主要涵蓋數理邏輯,素樸集合論,圖論,抽象代數,組合數學,數論。非數學或計算機專業基本不會接觸,非常重要,屬於理論基礎。基礎不牢後面所有的研究都是空中樓閣),再看具體數學(難度很高,要有非常好的數學分析與離散數學基礎),隨後演算法導論(大篇幅的理論證明,可以開闊演算法設計的思路,且非常有助於提高演算法分析能力)。
同時,可以看計算機組成原理與系統結構(關注程序的執行過程,深入理解程序設計語言。需要有電路分析和數字電路的基礎),編譯原理(高級語言如何轉化為機器語言),操作系統原理等。但這些不是最主幹的部分。


建議,找工作之前,參與一些實際項目。不建議: 再去啃書本,做練習了。你掌握的知識已經夠多了。


首先,我想問你,你真的是出於興趣讀物理博士嗎?那麼你對計算機的興趣如何呢?
如果你喜歡計算機大於物理,那麼可能放棄物理的phd或者只拿一個master或許是更好的選擇。這個提議可能現在對你來說too crasy,但以後你就會明白了,有些事越早決定越好,有些事放棄不一定是壞事。
anyway,不管你出於什麼目的,如果未來想從事計算機行業,可以再修一個計算機的學位,如果條件允許,將來找工作會有些優勢。當然你想自學的話,我覺得需要理論實際相結合比較好。學理論,特別是計算機的基礎知識,最好能選修或旁聽計算機系的課,不論本科和是研究生的,視個人情況和興趣而定。然後輔助於實踐,多編程,多參與一些open source的project,有機會去實習那叫更好了。
另外再多強調一句,基礎很重要,實際同樣也很重要,要兩手抓兩手都要硬。


做計算物理,圖形學可以當副業,小意思了


物理學得應該搞量化投資


做遊戲去吧,會用到你的大量物理學的知識的。而且你會參加底層的開發,因為那些公式是你的長處。


讀phd時,自考一個計算機本科學歷,然後讀個在職計算機碩士學歷。就可以了。


話說我想問些相反的,本人是本科是電子專業出身。研究生轉讀了計算機,一是有興趣。二是就業規劃。但是,我個人對理論物理確實也十分感興趣。如果想自學了解一下,相關。該從哪裡入手呢?應該是主要去補欠缺的數學知識吧。在這裡也問問各位知乎的大牛們。


兩點
一,學底層,做硬體做驅動
二,學圖形,做遊戲

或者,學上層抽象的JAVA之類也是好東西


推薦閱讀:

最近十年,編程領域有什麼重要進展?
用小猿搜題、學習寶這類產品是否真能搜到題?
為什麼圖片反覆壓縮後會普遍會變綠而不是其他顏色?
怎麼勸大四室友不要考計算機研?
特效化妝在計算機影視特效如此發達的今天是否是雞肋?

TAG:軟體 | 編程 | 計算機 | 機器學習 | 計算機圖形學 |