学C++人不得不看的好帖!

学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. 韧性和毅力。这也许是"高手"和通常程序员最大的区别。