演算法跟數學公式沒太大的關係,演算法講究的是邏輯思維能力,其中重點在邏輯思維,不是各種公式,涉及到的數學公式只是都相當簡單的小兒科。相信你能學好的。數學不是必須學好的,但是學好數學對理解和編寫演算法特別有用的,演算法就是給你的一種思維,所以你要做的是好好理解並吸收。計算機語言非常之多,不同的領域使用的語言不會一樣,一時半會講不完,這些都是其次,關鍵是要懂得程式設計的思想,理解計算機的想法,讓計算機按你的想法去替你做事情(各種演算法),那你就會是乙個合格的計算機磚家,你可以看到類似google,微軟等國際大公司招聘程式設計師時候出的題目,不會像中國應試教育那樣出一大堆應試題,更多的是主觀題,演算法題,以及一些精闢的語言理解題,有乙個系列的書都用 thinking in *** 命名,實際上玩計算機也是如此,先想好你要做什麼,然後用某種途徑(語言+演算法)去讓計算機照你的想法做。學會讀**,說明你已經學會了一門語法,學會寫**,說明你已經學會了一門技術。並且它們考慮的思維是相反的,所以,只有不斷讀**---總結思路,逆向思維--才能學會寫**!
數學對於程式設計師來說到底重不重要?!類似這樣標題的討論,在網路上已經不知道被討論多少次了。前兩天又在小白的blog上看到了他的看法。以前正方總是喜歡拿演算法與效率來表明數學很重要的立場,反方或是最近普遍的觀點是要依照需求。兩方都沒錯,我也有一點心得跟大家分享。
先來談談數學在大家的心中是長什麼樣子。研究所順利考上的嚮往已久的計算所,成為名符其實的本科系學生,本以為可以不用再玩數學了,但我發現我錯了,是不用再玩那些抽象的高等數學沒錯,但線性代數、機率統計、離散數學等…用了更多的數學,我想不出來有哪門研究所的課沒用到數學的。而且你最後的碩士**要寫出來,數學更是不能少的。你以為玩網路不需要數學?大錯特錯,裡面一堆機率統計的東西。電機需要數學嗎?當然需要!最基本的傅利葉轉換就夠搞死你了,所有工科的系所都逃不了數學的魔掌。就算你到了管理學院,會計系要用數學、經濟系要用數學、連心理系中有些領域也需要數學。雖然所需要的數學不盡相同,但都在數學的領域裡。我開始後悔當年沒把數學念好,博士班念到一半念不下去了,其中乙個原因是我數學太爛了。
寫程式需要數學嗎?要看程式的目的?那我們就像討論乙個簡單的程式,算出1加到100的總和。完全以程式結果為導向的人,或是訓練有素的程式女/男工,甚至有時連我都會直覺地寫出這樣的程式:
int sum1to100()
return sum;
}
上面這個程式片段還算很容易讓人一眼就看懂,可是我們明明高中時就學過了這種數列級數的演算法了,怎麼還會寫出上面這麼笨的程式呢?
int sum1to100()
稍微動一下腦袋,可以讓你的程式變得很有效率。怕別人看不懂?是不會加個批註在程式**裡面喔!
相信聰明的你,很容易就可以分析出來這兩個例子的兩種寫法,在效能上迶多大的差異,但這不是我在這裡想要表答數學是如何增加效率的。我想要表答的是,我們明明辛苦了12年,學了一堆的數學,為什麼我們要放棄這樣的基本訓練?我們笑美國人的數學不好,請問你又用了多少的數學來幫助你的生活和你的工作?學了又不用,那不如從小學開始就分科繫好了,不喜歡數學、怕數學的,就選則完全用不到數學的科系。
我今天不是要大家在寫程式是時鑽研哪種演算法、公式等,去計較那些在現在動不動在2ghz, 3ghz,雙核、四核所省下的那微小的效率。而是你的態度!你寧願多打一些code,也不願動一下腦筋,如果你的態度是這樣子的話,那也是活得下去啦,不過你的水平就不過如此而已。
你會反駁說,需要用到演算法、要講求效率時,我再去研究一下就好了,幹嘛說的很嚴重似的。今天我們一時興起要去爬陽明山,沒問題啊,那種程度的山,只要雙腳健全走得動的人都能爬。如果換成現在流行的登山步道呢?這需要一點點體力才行。如果你要去爬台灣百岳呢?合歡山的東峰算是最簡單的吧?開車到山腳下,穿個好一點的鞋子、好一點的衣服、多一點的體力,也還不是太大的問題。那爬玉山呢?雖然現在爬玉山已經很方便了,連行李都可以請人幫你背,但平常沒有一些訓練,要爬上去不是那麼容易的事。你要站在世界的最高點,去挑戰聖母峰,那全世界沒幾個人辦得到,而且辦到的人事前可是經過了嚴格的訓練。
你想把自己擺在什麼位置?你想要成就到什麼樣的高度?如果你只想在
二、三流的公司裡,打專案游擊戰,賺個還算可以的薪水,那的確,你不怎麼需要數學,連軟體工程的理論也不太需要,最重要的唬弄客戶的技術純熟就可以了。去年tx面試後,我才知道必需十倍努力才行。而這個努力不是我在面試前,看看什麼教戰手冊、寫寫網路上的考古題我就能夠通過的,而是必需把一些數學的訓練熟到變成很自然的反應才行。簡單的問你就好了啦,上面那個用迴圈寫的1加到10000的那個例子,如果10000改用n的話,那需要多少時間,用大o(big o)來表示。如果你不能很快的推論出是o(n)的話,那你的履歷連投都不要投。
為什麼google會這麼重視演算法和效率?應該說世界級的大公司都重視,yahoo、微軟、youtube…,因為你寫的程式不是給幾十個人、幾百個人用而已。而是同一時間有幾百萬,甚至上千萬人使用。乙個人慢0.1秒好了,一百萬人就10萬秒,超過一天耶。瀏覽乙個網頁,慢幾秒鐘你都不能忍受了,更何況是一天。你說能不計較演算法和效率嗎?
你想過什麼樣的生活是你自己決定的,但你想要當個世界級的軟體工程師的話,把學數學就當作是一種修行吧!不要怕沒地方用,因為你時時刻刻都可以用到它。當你的修行到了某個程度,要挑戰高山,就比別人容易多了。
好好,不想深入就算了,但你不覺得放棄12年的數學訓練很可惜嗎?至少花點腦筋用一下嘛~~,大家都多少用一點,軟體的水平就會慢慢提公升了,你說是嗎?
永久不是一種間隔,而是一種決議
永久不是一種間隔,而是一種決議 我可笑的看著過去的承諾 直到淚流滿面。我把愛情還給你,但把我的驕傲還給我好不好。個性簽名 解釋得太多就像我在怪你不懂我。人生就像一場旅行,在乎的不是目的地,而是沿途的風景 依然可以驕傲放肆的笑,只不過再也沒有曾經的天真和無邪。我們不怕衰老,不怕逝去,害怕的是,在凝固的...
測試思維是怎樣的一種思維?
宣告 該文不是我的原創作品,是我的同事魏增藝的大作,獨家授權我來進行發表。平時和測試團隊討論一些基本認知問題的時候,總繞不開這個問題 測試思維是怎樣的一種思維。首先,為什麼總繞不開呢?測試被視為研發系統的反饋迴路,其所有活動的背後是一種區別於領導層 產品經理 開發人員的思考。在研發團隊中,每個角色都...
有一種思念不是愛情
有一種思念不是愛情!有乙個女孩失戀了,她傷的很深很深,覺得整個世界都拋棄了她,甚至想到了死。她發誓這輩子再也不談戀愛了。她把這個訊息告訴了乙個男孩,於是男孩開始不斷的安慰她,鼓勵她,每天編好玩的簡訊逗她開心,就這樣,女孩漸漸從痛苦中恢復過來,又變得和往日般活潑可愛。忽然有一天,女孩沒有收到他發來的簡...