學C++人不得不看的好帖! 做者 棗子 原做者姓名 棗子 讀者評分 114 評分次數 29 正文 棗子原創 作爲一名大四的學生,我面試過很多的單位,有成功的也有失敗的,可是對我來講全部的失敗在某種意義上都是一種成功,特別是我下面寫的這些,寫這篇文章的時候,我已經簽了南京的一家軟件公司,可是想起今年2月21日我面試蘇州臺灣的IT公司的經歷聯想到咱們如今 學習編程的一些狀況我真的深有感觸,此次面試使我深深的體會到了失敗但也收穫了不少。我要說的將分紅三部分,1.是 我面試的具體通過2.是由面試想到的3.現今我應該作的。固然這些話很大程度上是我我的的意見,不可能徹底獲得你們的贊同,因此 在某些觀點上若是哪位朋友以爲跟個人有很大出入,請不要介意,也不要對我***,就當我沒有說過,歡迎和我聯繫共同探討這些問題!個人EMAIL:wutao8@263.net 1.面試通過 大約在年前我接到了臺灣瑞晟(Realtek)蘇州公司的面試通知,通知我2月21日到蘇州工業園區面試,接到面試後的幾天我把一些專業 課溫習了一遍,特別是C++和數據結構,因爲大學幾年裏,我一直專研這些方面,加上經過了高級程序員的考試,對於一些經常使用的算法 我差很少也達到了爛熟於胸的地步,當時的感受是若是問了我這些方面的問題我應該是沒有問題的! 21日那天我被安排在4:30面試,由一位技術人員單獨給我面試,在問了一些簡單的問題以後他給我出了一道編程題目,題目是這樣的: (因爲具體面試的題目比較煩瑣,我將其核心思想提取出來分解成了兩個獨立的簡單的問題,有可能問題分解的不當,請你們見諒,實際面試了一個的問題但比其複雜不少,並且涉及一些高等數學變換) 1) 寫一個函數計算當參數爲n(n很大)時的值 1-2+3-4+5-6+7......+n 哼,個人內心冷笑一聲!沒想到這麼簡單,我有點緊張的心情頓時放鬆起來! 因而很快我給出個人解法: long fn(long n) { long temp=0; int i,flag=1; if(n<=0) { printf("error: n must > 0); exit(1); } for(i=1;i<=n;i++) { temp=temp+flag*i; flag=(-1)*flag; } return temp; } 搞定!當我用期待的目光看着面試官的時候,他微笑着跟我說,執行結果確定是沒有問題!但當n很大的時候我這個程序執行效率很低, 在嵌入式系統的開發中,程序的運行效率很重要,能讓CPU少執行一條指令都是好的,他讓我看看這個程序還有什麼能夠修改的地方, 把程序優化一下!聽了這些話,個人心情當時變的有點沉重,沒想到他的要求很嚴格,以後我對程序進行了嚴格的分析,給出了改進了的方案! long fn(long n) { long temp=0; int j=1,i=1,flag=1; if(n<=0) { printf("error: n must > 0); exit(1); } while(j<=n) { temp=temp+i; i=-i; i>0?i++:i--; j++; } return temp; } 雖然我不敢保證我這個算法是最優的,可是比起上一個程序,我將全部涉及到乘法指令的語句改成執行加法指令,既達到要題目的要求並且 運算時間上縮短了不少!而代價僅僅是增長了一個整型變量!可是我如今的信心已經受了一點打擊,我將信將疑的看者面試官,他仍是微笑着 跟我說:「不錯,這個程序確實在效率上有的很大的提升!」我內心一陣暗喜!但他接着說這個程序仍然不能達到他的要求,要我給出更優的 方案!天啊!還有優化!我當時真的有點崩潰了,想了一會後,我請求他給出他的方案!而後他很爽快的給出了他的程序! long fn(long n) { if(n<=0) { printf("error: n must > 0); exit(1); } if(0==n%2) return (n/2)*(-1); else return (n/2)*(-1)+n; } 搞笑,當時我目瞪口呆,沒想到他是這個意思,這麼簡單的代碼我真的不會寫嗎,可是我爲何沒有往那方面上想呢!他說的沒有錯,在n很大很大的時候這三個程序運行時間的差異簡直是天壤之別!當我剛想開口說點什麼的時候,他卻先開口了:「不要認爲CPU運算速度快就把全部的問題都推給它去作,程序員應該將代碼優化再優化,咱們本身能作的決不要讓CPU作,由於CPU是爲用戶服務的,不是爲咱們 程序員服務的!」多麼精闢的語言,我已經不想再說什麼了!接着是第二個問題: 2). 他要求我用一種技巧性的編程方法來用一個函數實現兩個函數的功能n爲如:fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6! fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9! 如今用一個函數fn(int n,int flag)實現,當flag爲0時,實現fn1功能,若是flag爲1時 實現fn2功能!他的要求仍是效率,效率,效率!說實在話,若是我心情好的話我應該能給出一種比較好的算法,但我那時真的沒有什麼心思 再想了,我在紙上胡亂畫了一些諸如6!=6*5!的公式後直截了當的跟他說要他給出他的答案!面試官也沒有說什麼,給出了他的思路: 定義一個二維數組 float t[2][5]存入{{2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!}}而後給出一個循環: for(i=0;i<6;i++) { temp=temp+n/t[flag]; } 最後獲得計算值!呵呵,典型的空間換時間的算法! 這些總共花了50分鐘的時間,還有十分鐘我就跟他很隨意的聊聊天,聊了一些編程以及生活的問題,那時的我已經很放鬆了, 由於我知道此次面試結果只有一個:失敗。5:30的時候面試官要我等通知,因而我離開了他們公司。這就是面試的整個通過! 2.由面試想到的 真的是很失敗啊!我記得那天下好大的雨,氣溫也很低,我邊走邊想,從5:30一直走到7:30,全身都溼透了,又冷又餓,可是我只是一直走,腦子裏面充滿了疑惑,我也想讓雨把本身淋醒!看到這裏有些朋友可能以爲那些面試題目不算什麼若是讓本身作的話確定能所有答對,我確定相信你,由於我從未懷疑過中國程序員的能力,我認爲中國有世界上最好的程序員,我也從未認爲本身是高手,因此我作不出來不表明中國程序員比臺灣或者別的地方的程序員差,因此我就從個人角度,個人所見所想來談一些感想: 不錯全世界都有優秀的程序員,中國也不例外,可是我疑惑的是:到底中國和臺灣或者國外的優秀的程序員的比例究竟是多少?臺灣我不知道,中國100個程序員裏有幾個是優秀的呢?我根本算不上,從上面的表現就足以說明一切了!是1個?5個?10個?50個?這個數字我不敢亂猜,恐遭網友一頓痛罵,那麼咱們國內有多少人學習計算機呢?拿咱們學校來講,計算機97級4個班,98級5個班,99級10個班,2000級17個班,人多了,老師怎麼辦?咱們學校的作法是讓研究生上課,而後呢?補考一抓一大把,大把大把的補考費落入了學校的口袋,還說如今的學生素質低!真是可笑,我都不知道學校這麼作是爲了什麼,爲國內培養大量的程序員嗎?學生們能真正學到計算機知識嗎?好了,我敢講,在咱們學校學習編程學生和優秀程序員(注意我指的是優秀,只會編幾個糟爛程序的人算不上)的比例應該是100:0.1 在這種比例下雖然咱們中國學習編程的人鋪天蓋地,可是想一想有多少我的能真正爲中國軟件業發展做出貢獻,有多少人能真正寫出優秀的程序名揚海外! 我從學習編程以來,無論是自學仍是老師指導,歷來都是解決問題就好,編出程序來就行,個人疑惑是:咱們有真正的強調過程序的效率,程序的質量嗎?咱們有仔細分析過咱們寫的東西,看看有沒有能夠改進的地方,看看有沒有簡單的方法來達到一樣的目的呢?我問心自問,我發現,我歷來沒有對我寫出來的程序進行過優化,最多就是進行詳細的測試,而後Debug,可是這就足夠了嗎?這些天我偶爾發現我曾經寫過的一個遊戲,那是一年前我剛加入vcroad.net作爲其中一員時候,感受應該拿點東西出來,而後花了一個星期的時間寫出來的!程序不算複雜,可是用到了很多數據結構的東西,也用到了一些精彩的算法,加上windows的界面和遊戲的可玩性,寫完後受到了很多好評,我當時真的很佩服本身!可是如今看呢:沒有一句註釋,好多醜陋的函數名好比:void chushihua(),好多沒有必要的變量,能夠用簡單語句完成工做的我使用華麗的算法,大量使用全局變量.....,說很差聽的話,六百多行的程序除了能運行以外就是一陀屎!若是一年前我能聽到一些反面意見的話,大概我能早一點覺悟,可是自從原代碼在網站發佈以來聽到的都是讚美之詞,沒有一我的向我提出程序改進的意見,這又說明了一個什麼問題呢?很值得思考啊! 還有一個疑惑是:咱們說的和作的真的同樣嗎?我在學校的時候曾經受學院指派承辦過一個計算機大賽,請了一個老師出決賽的題目,主要是一些算法題目,這個老師多是我上大學以來惟一敬佩的老師了,從程序調試到打分,對於每一個程序都仔細分析其時間效率和空間效率,而後綜合打分,四十我的的卷子,老師從下午三點一直調試到晚上十點,在有些寫的精彩的語句後還加上批註。我真是高興很遇到這樣的老師而且和他作深刻的交流,但在過後,卻發生了一件不愉快的事,在比賽中得到第二名的學生找到我,說他程序所有調試成功應該給他滿分,而且應該得第一,我說不過他,最後調出了他的原程序和第一名的原程序對比,不錯,兩個程序都運行的很好,這時,那個同窗開口了:「個人程序寫的十分簡捷明瞭,僅僅數行就完成了題目要求,而他的卻寫了一大堆,爲何給他的分多過給個人分。」我當時非常氣憤,若是不是老師負責的話,那麼如今第一名和第二名的位置真的要互調了,拜託,不是程序的行數越少程序的質量就越高,我記得我跟他大談這方面的道理,最後說服他了!哈哈,可是我,只能說說而已,我不知道還有多少人同樣,提及來頭頭是道,但內心卻壓根就從未重視過它! 3.我打算作的! 其實那天我想到的遠不止上面那麼多,可是我不想再說了,由於我猜測看這篇文章的網友大概都有一肚子的感想,一肚子的抱怨,借用這篇文章發泄可不是我想達到的目的,在上面我把本身罵的一文不值也不是妄自菲薄,可是在某些方面我真的作錯了,或者說是偏離了正確方向,如今是矯正方向和重整旗鼓的時候了,就象我前面說過的,我相信中國有世界上最好的程序員,我也相信個人水平不會一直保持現狀,我如今就收拾起牢騷真正的實幹起來! 真的很巧,就寫到這裏的時候我在網上偶爾發現了這篇手冊,我不知道這預示着什麼,可是我想若是我照下面這個基本原則一直踏實作下去,我必定會實現個人理想---一名優秀的軟件設計師! (下面這些文字不是個人原創,是我偶爾在網上發現的,我真的很幸運能看到這些,這篇文章也隨着下面的文字而結束,我真心的但願您能從這篇文章中獲得啓發,這篇文章歡迎你們隨意轉載,您能夠不寫做者是誰,可是請您寫上vcroad.net原創,謝謝您的支持) 做者:金蝶中間件公司CTO袁紅崗 不知不覺作軟件已經作了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱本身是高手,由於和我心目中真正的高手們比起來,還差的太遠。世界上並無成爲高手的捷徑,但一些基本原則是能夠遵循的。 1. 紮實的基礎。數據結構、離散數學、編譯原理,這些是全部計算機科學的基礎,若是不掌握他們,很難寫出高水平的程序。據個人觀察,學計算機專業的人比學其餘專業的人更能寫出高質量的軟件。程序人人都會寫,但當你發現寫到必定程度很難再提升的時候,就應該想一想是否是要回過頭來學學這些最基本的理論。不要一開始就去學OOP,即便你再精通OOP,遇到一些基本算法的時候可能也會一籌莫展。 2. 豐富的想象力。不要拘泥於固定的思惟方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想象力是創建在豐富的知識的基礎上,除計算機之外,多涉獵其餘的學科,好比天文、物理、數學等等。另外,多看科幻電影也是一個很好的途徑。 3. 最簡單的是最好的。這也許是全部科學都遵循的一條準則,如此複雜的質能互換原理在愛因斯坦眼裏不過是一個簡單得不能再簡單的公式:E=mc2。簡單的方法更容易被人理解,更容易實現,也更容易維護。遇到問題時要優先考慮最簡單的方案,只有簡單方案不能知足要求時再考慮複雜的方案。 4. 不鑽牛角尖。當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當我遇到難題的時候會去玩遊戲,並且是那種極暴力的打鬥類遊戲,當負責遊戲的那部分大腦細胞極度亢奮的時候,負責編程的那部分大腦細胞就獲得了充分的休息。當從新開始工做的時候,我會發現那些難題如今居然能夠迎刃而解。 5. 對答案的渴求。人類天然科學的發展史就是一個渴求獲得答案的過程,即便只能知道答案的一小部分也值得咱們去付出。只要你堅決信念,必定要找到問題的答案,你纔會付出精力去探索,即便最後沒有獲得答案,在過程當中你也會學到不少東西。 6. 多與別人交流。三人行必有我師,也許在一次和別人不經意的談話中,就能夠迸出靈感的火花。多上上網,看看別人對同一問題的見解,會給你很大的啓發。 7. 良好的編程風格。注意養成良好的習慣,代碼的縮進編排,變量的命名規則要始終保持一致。你們都知道如何排除代碼中錯誤,卻每每忽視了對註釋的排錯。註釋是程序的一個重要組成部分,它可使你的代碼更容易理解,而若是代碼已經清楚地表達了你的思想,就沒必要再加註釋了,若是註釋和代碼不一致,那就更加糟糕。 8. 韌性和毅力。這也許是"高手"和通常程序員最大的區別。