PS:观后大有启发,遂转至本博客,望众博友共进。十分抱歉,由于文字限制,删减了优质学生评论以及部分章节,想看其他内容请去原博客(http://www.cnblogs.com/glaivelee/archive/2010/01/25/1656082.html)或者购买正版书籍。


IT学生解惑真经


肖舸  杨中科 左飞  著


目    录


l       大学计算机课程学习路线


l       考研还是不考?


l       做什么样的软件才能赚钱?学什么样的知识才能赚钱?


l       程序员如何踏上社会


l       (删减章节)职业生涯第一步----选择你的城市


l       关于女生的程序员之路


l       如何找需求练技术


l       修炼编程的内功


l       (删减章节)7000块钱能买什么?--答一位同学的培训问题


l       (删减章节)构建自己的不可替代性


l       简述C和C++的学习历程


l       (删减章节)IT业的职业细分


l       (删减章节)选择技术还是选择销售?


l       这么多技术我该怎么学


l       (删减章节)金融危机下的职业思考----答一位同学的问题


l       简述如何书写工程化的简单代码


大学计算机课程学习路线


左飞老师


如果你是一个计算机相关专业大学低年级学生,那么这篇文章就是为你写的。


我之前曾经发过一篇博文《大学计算机专业那些课》来谈论大学中各门课程的意义和重要性。那是针对更宽泛的范围来说的,这篇文章则更加精要和简约。因为这里研究的仅仅是核心计算机课程,更重要的是,这里要说的是这些课程之间的关系,以及它到底讲得是些什么东西。我想这些课程最终是要组成一个体系的。


请注意我这里所说的是通常情况下的核心课程,每个学校在课程设置是可能是存在差异的,但总体上框架应该是不变的。


最开始的第一门课应该是“C语言程序设计”,这基本上属于你日后一切学习的开始,简单说这门课程的主要目的和内容就是介绍一种计算机语言的语法内容,至于怎么学好它,之前的文章都谈过了,这里就不罗嗦了。


之后的课程会分为三条线,第一条线的第一门课程是“数据结构与算法”。这很简单,一些有了语言基础之后,为了更好的使用语言去解决问题,就必须学习结构知识和算法。至于怎么学好它,之前的文章也谈过了——请注意,如何学都不是本文的重点。本文的重点在于告诉你你将来都会学些什么以及该学些什么。


“数据结构与算法”的后续课程是什么?答案应该是《编译原理》。很奇怪吧?课程就是这样设计的,其实这个路线也不是我发明的,国外大学的CS Course的体系也是这么设计的。编译原理说白了就是介绍编译器如何工作的,是让计算机理解计算机语言的一种方法和理论。这个工作过程之中蕴含了大量的算法,而且是非常复杂的算法,很多人甚至认为编译原理是计算机专业本科阶段最难的一门课程。主要就是因为这里面的算法太复杂,当然也会用到很多结构,树可能是用得最多的。当然,这就是相当于是数据结构与算法课程的一个后续性课程,类似一道附加题。最近听一个学生说有些学校本科已经取消这门课了,我想应该是较少一部分学校的做法吧。不过,中国的学习并不太重视这门课倒是真的。一般课程设置就是一个学期左右的课时。但是一般的国外学校这门课都要学上1年,甚至两年之久。这条线路到编译这里就应该是终点了。


下面我们来谈谈大学计算机课程学习的第二条路线。


在你具有了一定C语言基础之后,除了前面讲的第一条路线以外,你已经可以开始下面这条路线的学习了。


为了更好地探究计算机系统的研究机制,在学习了C语言之后,下面一门需要学习的课程是“汇编语言和微机接口技术”,这门课程包含两部分的内容,一部分就是汇编语言,汇编是一种更底层的语言(相对于C而言),说白了它就是一种“用助记符描述的机器语言”。很多人刚学汇编的时候都觉得很复杂,因为它跟硬件紧密相关,就是那些个寄存器也够初学者糊涂一阵子的。这门课程的另外一部分内容是微机接口技术,目前国内高校这部分内容都是基于80X86系列芯片的。已经可以看到这门课其实涉及到了很多硬件的知识,其实还不止,关于I/O控制,寄存器,中断,这门课里都有体现的。


接下来要学习的内容就是《计算机组成原理与体系结构》。其实我特别奇怪,我在写学习路线1(也就是前一篇文章)的时候,有读者认为在学习C语言之前,或者在学习其他专业课程之前,最先要学的就是这个东西。我不知道大家是不是觉得大学第一门专业课就是这个,我觉得这么想的人是不且实际,信口开河的。这门课程还是比较深的一门课程,在汇编和接口之后安排这门课程是比较的。不过国外的一些先进的计算机教育体系确实也有在较开始的时候开设一门概论课来作为导引,有时候叫Computer System Introduction,有时候叫Computer Culture,其实内容差不多,但作为计算机专业课程的导引课程,这些课程的设置里面已经设计到组原和OS的初步内容了。但这和Computer Structrue & Architecture还是有区别的。


接下来的一门课程是《计算机操作系统》,如果外行听起来可能觉得这个课应该是学如何使用操作系统的吧,就像“WindowsXP 速成”?非也!这门课程是讲OS是如何设计的,或者说是如何实现一个OS(当然做要比说起来难多了)。之所以这门课程被安排在组原之后,那是因为这反映了一种自底向上的学习路线。操作系统当然是在计算机系统之上来搭建的。向调度啊、虚拟内存啊这些问题都是由操作系统来控制的。我最近所写的《代码揭秘》基本上是属于这条路线上的内容的,不同的是我采用了一种更贴合读者理解方式的描述,因为在讲述这些原理之前,我都是采用C语言实例来作为引子的。有空也推荐大家看看,应该学校里的图书馆是可以借到的。前一阵子一位四川大学的计算机青年教师给我写信谈起我这本书时,我才知道高校的图书馆里原理已经可以借到了。以上就是大学计算机课程学习的第2条路线,下面我们来讲最后一条路线。


最后一条路线属于应用型的,也就是说当你学完了基本的原理之后,一方面为了日后更好的工作,另一方面如果从事研究工作也可择其一而继续深入探究,那么最好总之要上升到一定应用层面的东西。


在你有了一定的C基础之后,学校可能会开一些面向对象程序设计方面的课程,可能是C++或者Java,因为面向对象的语言在实际开发中正广泛的被使用。无论是C++还是Java,跟C来说本质上都是语言,只不过他们多了一些OOP方面的特性。如何学好它们,我前面的文章中已经谈过,这里就不多言了。


接下来的一门课程应该是“数据库系统”,这门课不是教你怎么使用SQL SERVER或者DB2的,学校里的课程远没这么前沿。数据库系统这门课依然偏重更多理论,尽管数据库相比于组原和OS来说已经是上层建筑了。这门课讲的多是些数据库系统设计方面的原则,例如如何解决关系问题或者SQL语言等等。


再之后可能会学的课程是“计算机网络”,这门课里会更加系统的向你介绍网络方面的知识,TCP、UDP,HTTP这些名词会粉末登场。注意这门课一般不是教授你如何布网的,例如如何配置路由器这种东西一般是CCNA里面的内容了。这门课里讲的更多的是上层原理与协议。


以上就是一般的大学计算机课程学习的几条路线。他们彼此联系,共同作用。注意我这里讲的内容不是给你推荐学习方向,而是告诉你大学里会学什么,之间联系如何。从之前的文章评论里不难看出,有的同学好像根本没理解文章的意思,说自己好像更适合哪条路线的样子,其实适不适合哪条线的问题根本不存在,这些东西你都得学,既然学就要学好。本身就是一个体系的,怎么能做瞎子摸象的事情呢?现在CSDN学生大本营搞得不错,资源很多,访问量很大,但也能客观的看出浏览的人真的是分好多等的,有的是谦逊而好学的,有的则是蜻蜓点水的过客。浮躁之气甚嚣尘上,胸中无物自然谈吐轻浮,看什么都不求甚解,浅尝辄止,多少有些自以为是、妄自尊大了。这也是我在此开博四个月余来的感受吧。希望大家都能保持一颗平常心,戒骄戒躁,平和的埋头学习吧。


考研还是不考?


杨中科老师


有很多同学发出过这样的疑问“到底应不应该考研?”,很多同学都被这样的问题困扰着。我今天在这里向同学们统一解答一下,因为内容比较多,我是一边写一边发表,因此这篇文章会分几期贴在学生大本营。


“考研”这个词围绕在我们每个人周围,学校海报栏中最大的广告一定是考研培训班的,不仅很霸道的贴满所有区域,而且“野火烧不尽,春风吹又生”;学校书店里卖的最火的书一定是考研的辅导书;每到临近考研,学校里的自习室、图书馆一定被考研的同学长期“占座”;同学们之间经常聊的也是“你考不考研,想考哪儿的研?”,仿佛不想考研就是没追求的表现。


到考研报名的时候每个班都有相当一部分同学报了名,问到选择考研的原因,回答一般都是:“大家都考研”、“上大学就是为了上研究生”、“工作不好找,只能读研争取好的发展”、“读研能找到更好的工作”、“想读研进一步深造,研究专业知识”、“我一直成绩很好,不读研可惜了”、“我父母让我考研”。


首先我对一些同学的误解进行一一破解。


误解一、“大家都考研,我也考”


“从众心理”是大部分人的心理特点,就像葛优在广告里说的那样“哪儿人多我去哪儿,我就是相信群众”。在大街上大家都爱往扎堆儿的地方走;在火车站里哪怕不知道哪儿是进站口,只要跟着大流走,一般都不会走错;组织班级活动的时候,也经常选择其他班级去过的地方玩儿。因为“跟着大伙走,一定不会有错”。在很多情况下“哪儿人多我去哪儿”是非常合理的一种“选择”方式,因为根据概率来讲,大部分人选择的道路有非常大的概率是正确的道路。好像根据这种说法,“大家都考研,我也就考研”是非常合理的一种想法,可是实际并非如此,因为考研和上边举的这些例子有太多的不同。


首先,目的性不一样。逛街的时候大部分人的目的就是“看热闹”,人越多的地方肯定越热闹;在火车站里,几乎所有人的目标都是“进站”,因此跟着大家走也肯定没错;班级活动,大家的目的都是“玩儿好”,其他班级都选择的地方肯定都挺好玩。可是考研却不一样,考研的目的是什么呢?有人说是“考研成功读研”,注意“读研”只是过程,而不是目的,因为你不可能一辈子“读研”,因此“读研”的目的才是“考研”的目的。很显然,不同的同学考研的目的是不一样的:有的同学是为了考更高的学位,增光耀祖、显耀门庭;有的同学是为了读研、读博,继续深入学习专业知识;有的同学是为了逃避就业压力,拿更高的文凭,找更好的工作;有的同学是为了跨专业考研,去学自己感兴趣的专业;有的同学是为了能从普通大学考入名校,圆自己的“名校梦”。看似大家的共同目标都是“考研”,但是其实每个人都有自己不同的目标,如果没有自己明确的目标就加入考研大军的话,无疑是成为了“群体性盲动”大军中的一员。


其次,选择错误路线后的后果是不一样的。大街上有利用大家的从众心理专门找托儿撑场面的,如果被托儿吸引到这里,却发现没什么意思的话,大不了再去其他的地方;火车站中偶尔也会有临时性的调度,你随大流到了目的地以后却发现,其实那些人是出站,大不了再走回头路重新找进站口;选其他班级都选择活动线路的后才发现其他班的同学太低级趣味了,不符合你们的喜好,大不了这次玩儿的不开心,没有太大的损失。但是考研就不一样了,考研失败了的话,就业的黄金时间已经过去了,再找合适的工作非常难;即使考研成功了,上研以后才发现研究生生活不像自己想像的那样,各种原因导致研究生毕业以后发展还不如那些没上研的同学。一旦考研这条路选择错了,你是没法走回头路的。


从众最大的好处是不用担责任,不用担心选错了道路造成的后果,因为“大不了大家一起死” 。“死亡率”只是一个统计学上的概念,对于我们每个个体来说,死亡率只有0%和100%,因此在决定从众之前,需要掂量一下是否这件事情是否“值得”。


在决定是否考研的问题上,千万不能有“大家都考,我也考”的想法,考研还是不考研,都请“给我一个理由先!”,找到了理由,再往下看。


误解二、“上大学就是为了上研究生”


很多同学从上大一开始就定下了考研的目标,理由很简单“上小学的目的是上初中,上初中的目的是上高中,上高中的目的是上大学,上了大学当然要读研了”,“我一直成绩很好,不读研可惜了”,在这些同学心中,人的前进就是不停的考,有一个网络上流传很广的笑话就很能反映这个现象:“学士上面是硕士,硕士上面是博士,博士上面是博士后,那博士后上面呢? 如果你够勇敢再读2年是勇士,再读5年是壮士,再读7年是烈士,烈士以后呢? 教育部会推出圣斗士,读满2年是青铜圣斗士,5年是白银圣斗士,7年是黄金圣斗士。毕业以后愿意再读上去的女孩子有机会考出--雅典娜”。


如鹏网的朱老师讲过一个真实的故事,他认识的一个人,学习非常厉害,上大学、考硕士、考博士,都是一路顺风,毕业后又考过了司法考试(难度非常高的考试),能考得试都让他考过了,然后发现自己“没得可考”了,失去了奋斗的目标。最后只好进入法院工作,发现自己无法适应实际的工作,找不到以前那种考试时春风得意的感觉,每天都要处理很多自己不愿意处理的事情,最后竟然精神分裂进入了精神病院。


上大学的目标不只有“考研”这一条所谓的“出路”。按照严格的区分,研究生是为有志于从事本专业深层次理论知识钻研而设置的,其培养的目的是“研究员”甚至“科学家”。但是,由于大学扩招、国家产业结果不合理等原因造成大学生就业率和就业质量严重下降,而“研究生扩招”则可以暂时“饮鸩止渴”性质的提升所谓的“就业率”,同时,有些人出于不同的目的也想利用“研究生扩招”大捞一把,因此他们利用在社会上、媒体上的话语权,大肆鼓吹“本科毕业以后还是考研好”,这更是使得很多同学认为“上大学就是为了上研究生”。


同学们可能已经看到了我在上边给“出路”两个字加了双引号,的确,考研不是本科生的“出路”,因为“考研、读研”只是过程,不是出路,除非你想一辈子考呀考,以死前考上“雅典娜研究生学位”为目标,否则一切过程的真正的目标都是“工作、赚钱、娶媳妇、生孩子、养二老、买房、买车、买油、买面……买坟”,你所做的一些事情都应该围绕这个最终目标而进行规划。


不要把“考研”当成唯一的出路,考虑自己的情况,考虑“工作、赚钱”这一终极目标,做出自己的决定。


误解三、“现在工作不好找,只能读研争取好的发展”


这是相当一部分同学决定考研的理由,因为听说毕业工作不好找,害怕“毕业即失业”,因此把希望寄托于通过读研进一步提升自己的实力;有的同学则是到了大四才发现自己没有工作所需要的本领,害怕面对找工作,“考上研究生就能多争取两三年学习时间,上了研一定好好学”。


现在的工作真那么不好找吗?就业机会真的那么少吗?别的专业我不敢妄加评论,看这篇文章的同学大部分都是可能毕业以后要从事IT相关工作的,根据我工作这些年接触的来看,很多IT企业有“人才荒”的现象,也就是很多职位长期缺人,招不到人。有同学听到这里疑惑了“怎么可能缺人呢?每年毕业这么多学生?”,有一句话很伤人、也很找骂,但是我又不得不说“企业不是招要饭的,不是随便招一个阿猫阿狗凑数就行;企业要招的是能帮它赚钱的能人”。


难道是企业里对学生们的要求太高了吗?来听听企业招聘人员的评论吧:


“招聘启事发出去了,邮箱很快就被简历撑爆了,但是大部分简历都是只有个人信息、专业课程设置、从小学到大学的考学履历,最后跟着一封热情洋溢、废话连篇,却空无一物的求职信,好像这几千份简历都像是一个人的简历一样,没有丝毫自己的特色。真不知道除了他满足我们在招聘启事中说的‘2010届应届生’以外还有什么其他条件满足。”


“一个学生来应聘网络管理员,我问他一台计算机连不上网了,有可能有哪些问题,你会怎么进行故障排除。那个同学竟然支支吾吾半天,一句完整的话都没说出来,哪怕说一句‘可能是网线断了’都行呀!”


“一个学生来应聘软件工程师,我问让他写一个打印菱形的控制台程序,这是C语言教材上前几页的最简单的程序,竟然愣了半天一行代码都写不出来,问他当时C语言考试是怎么过的,他回答的很干脆‘就那么过的’!”


其实企业里对应届生要求并不高。比如对于软件开发职位的学生来说,企业里的要求就是“有编程的感觉、动手能力强、好学”,不需要你懂这个工具、那个工具,不需要你会这个语言、那个语言,不需要你懂这个框架、那个框架,只要“有编程的感觉、动手能力强、好学”,那些工具、语言、框架公司只要培训一下就可以掌握,“有编程的感觉、动手能力强、好学”也不是只有聪明的学生才能具备的品质,只要智商正常,平时多动手、多写程序,成为“有编程的感觉、动手能力强、好学”一点都不困难。可是实际情况是,纵观一个有50个学生的班级,有10个人对学习完全不感兴趣,有10个人对本专业完全不感兴趣,有10个人迷迷糊糊,有10个人只会死读书,还有5个人今天学两页C语言、明天学两页Java、后天学两招***技术,真正能踏实下心来多动手、多写程序的能有两三个就相当不错了。


有一个笑话大家都听说过: 有两个人在森林里散步,忽然出现了一只大老虎,一个人忙伏下身去系鞋带。


另一个人问:“你系什么鞋带啊?你难道还能跑得过老虎吗?”


这个人说:“我那能跑得过老虎啊。不过我只要跑的过你就行了!”


在班级里学习成绩名列前三名是比较困难的事情,但是成为被企业相中的两三个人却是非常轻松的事情,因为大部分人不会“多动手、多写程序”,而你只要“多动手、多写程序”就足够了。有同学会问“我们班的同学都看了这篇文章,那岂不是他们都和我一起努力竞争了,我又没有优势了?”,同学们太高看我了,我没那么大的能量,我不比游戏更能吸引同学,很多你的同学根本不会看到我这篇文章,哪怕有人看到也只会随便瞄一眼,而能认真看完这篇文章的则又少之又少,认真看完这篇文章并且相信我讲的这些道理并且长期坚持照着做的能多一个我就很欣慰了。


因此那些害怕工作不好找而想考研逃避的同学大可不必担心,只要你能比身边的同学多努力一小点儿,就可以很轻松达到企业对应届生的要求。及时那些大一、大二、大三都玩儿过来的同学也不必担心,踏实下心来,用剩下的半年到一年的时间集中强化一下自己,想搞编程的吃准自己最熟悉的语言多练、多写,想搞网络管理的同学报一个思科培训班苦练实际的技能,想搞嵌入式开发的同学弄个开发板把常用的嵌入式功能实现……,相信半年之后达到企业的要求轻而易举。


如果你只是怕工作不好找而考研的同学到这里就不用往下看了,关了这个网页抓紧“系鞋带”去吧。


误解四“我父母让我考研”


现在有一些大学生让人感觉很可怜,从小就被家长安排着,早餐吃什么、买什么衣服、放学了去哪儿玩、周末做什么、上哪所小学、上哪所中学、学文科还是学理科、报哪所大学、考哪个专业……一切一切都听父母的。


在我们小时候,父母在我们心中就是超人,什么都懂、什么都能干,可是你在茁壮成长,父母却在慢慢老去,总有一天在知识、阅历、判断力上会不如你。父母永远是爱孩子的,做的一切的决定的初衷也是会孩子好的,可是有时候他们的好心会办成坏事的。


我认识的一个在读硕士的朋友说,他父母在规划他未来的时候,说他家里几代人没出一个“有文化”的人,希望他好好努力,能考多高就考多高,“硕士上完了,考博士,博士考完人考博士后,无论你考多高我和你妈都全力供你上学,咱们要增光耀祖!”,可怜×××呀,希望孩子成为地位高的人,这样以后就可以说“我们家孩子是博士后!”,他们连“博士后其实是找不到工作的博士,不是比博士更高的学位”这样的事情都不知道,他们的安排我们怎么能听呢?


父母给了我们生命,供养我们长大、上学,是永远值得我们去尊重和孝敬的,但是他们的想法并不总是对的,如果不自己分辨只是一味听他们的话,早晚有一点会被他们的好心害惨的。


有一个很老的纪录片叫做《狐狸的故事》,它讲述了一个自然界的生存法则:一窝小狐狸出生了,在老狐狸的呵护下成长,小狐狸渐渐长大了,外形已经显得跟父母一样高大。老狐狸一朝突然变脸,驱赶小狐狸出门。被赶出家门的小狐狸好生可怜伤悲,不愿离开,一次次回家门口,但是老狐狸不仅不让小狐狸进门,反而以“疯狂地嘶咬”的方式,生把小狐狸撵走。从此,小狐狸一个个无依无靠,形单影只,在饥恶、天敌和猎人的胁迫下到处流浪。经过重重考验,小狐狸终于获得了在恶劣的条件下顽强的生存的能力。狐狸尚且懂得这个道理,那我们人呢?


有的家长是懂得这个道理的,从很小就培养孩子独立做事、独立思考的能力,家长不对孩子轻易做干涉,最大程度的尊重他们自己的意愿,这样环境中成长的孩子往往能成为社会中的强者。但是不幸的是,大部分的家长是不懂得这个道理的,只要他们还能动,就尽他们的一丝力为孩子创造条件、选择道路、扫清障碍,慢慢的培养了一批离了父母就无所适从、没有任何生存能力的孩子。


如果你的父母还在尽力为你做着决定,那么请你很尊敬的告诉你的父母:“爸!妈!谢谢你从小到大为我做的一切。现在我长大了,我要学着自己做决定了。我会向着进步的方向前进的,不要担心我。是不是考研我会自己决定的,我会认真考虑你们给予我的建议的。我会找到自己的路,无论做什么决定,我都会做一个好孩子。我要成长为一个有能耐的孩子,然后有能力孝顺你们,赡养你们!”。


无论是在是否考研这件事情上,还是在以后的其他事情上,把父母的建议当成一个朋友、一个长者的参考,然后最终自己决定吧!


误解五“很多工作都要求硕士学历,找工作的时候满地都是硕士”


   很多同学听说过类似的传言:现在找工作的时候大部分公司都要求硕士以上学历,哪怕只要求本科学历的门前也会有好多硕士生来求职,我们“小本”在他们面前没有任何的自信,不读研怎么行。


“大部分公司都要求硕士以上学历”这是明显带着偏见得出来的结论,很多同学看到如鹏网的“就业信息”贴出的招聘信息以后就感叹“怎么这些公司都要求硕士学历呀!”,但是其实理性的统计一下,要求硕士以上学历的职位不足10%。经过分析可以很容易的发现,要求硕士以上学习的公司或者职位一般都有如下的特点:国字头、中字头的单位,比如中国移动、国家电网、中国工商银行;国家机关、事业单位,比如省公安厅、红十字会;高校、科研机构。由于众所周知而在这里又不方便说明(害怕被河蟹)的原因,国字头、中字头、国家机关、事业单位中人才的浪费现象非常严重,招博士生去看大门的事情都是屡见不鲜的,但是这是事实,他们招聘的时候就要尽可能招高学历的人,这样才能达到他们的某些目的;高校、科研机构由于特殊的原因,招聘的人员也必须是高学历的。如果想去国字头、中字头、国家机关、事业单位、高校、科研机构任职的话,必须有高学历,否则哪怕你能力再强也没用,没有那张文凭一切都是白搭。


其实还有另外一些职位也是经常标明“硕士学历”的,那就是一些公司的“研究院”,比如微软亚洲研究院、IBM研究院等,这些职位通常都是进行一些前沿领域理论、技术的研究,由于大部分本科生的知识深度没有达到这些职位的要求,因此这些公司要求硕士博士学历也是非常合理的,同时这些职位中也一般都是被一些名校的硕士、博士占据着。但是凡事无绝对,比如微软亚洲研究院也不乏优秀的本专科学历的人员。


   除了这一小部分要求硕士以上学历的职位以外,大部分职位都是只要求本科或者专科学历的,道理很简单,企业招聘员工的目的是让员工去帮着企业赚钱,因此本科还是硕士对于企业来说并不是重要,哪怕公司所有人都是博士,只要没赚到钱,公司照样倒闭。公司招聘一部分高学历人士的的初衷也是希望他们干一些其他人“很可能”干不了的事情,仅此而已。只要你有能力,能给企业带来收入,人家才不管你什么学历呢。


“要求本科学历的门前也会有好多硕士生来求职”,这是事实,也是很多同学在招聘会上底气不足的原因。道理也很简单,为了提升本科生所谓的“就业率”、缓解就业压力,研究生一再扩招,这批研究生毕业以后早晚还是要流入就业市场,因此就与当时毕业的本科生产生的撞车。有同学会说了:“我一个本科生和一堆研究生挣一个职位我肯定被淘汰呀”,这个担心完全没有必要。理由如下:首先,企业招聘的时候都会控制不同学历人员的比例的,比如招聘20%的硕士生,招聘70%的本科生,招聘10%的专科生,因此不同学历人员并没有直接的竞争,和你竞争的还是那些本科生;其次,现在很多硕士毕业生的质量也大大下降,我面试过很多硕士毕业的人,问他做过什么项目,最后支支吾吾说出来的是做硕士论文的所谓项目,而且明显是抄别人的,问他计算机的一些基础知识,竟然连“队列和堆栈的区别”这样简单的问题都回答不出来,问了问他对读研的感受,他说“我和很多我同学感觉都一样,后悔读研了”,听了这些你还害怕和这些硕士生们竞争吗?


   因此,如果你是想去国字头、中字头、国家机关、事业单位、高校、科研机构熬日子的话,还是去考一个高学历吧,而且还要把其他的方面也补足一下;如果你是想去国际性大公司的研究院工作的话,也尽可能的去考高一点的学历,并且不要光有学历,在研究能力、动手能力方面更要努力,这些公司是靠一分钱一分钱的赚活命的,你没有能力给他们带来符合你职位的收入的话,即使你成为“黄金圣斗士”他们也不会要你。


误解六、“研究生就业的起点更高”


   听到有同学说“研究生就业的起点更高,毕业后就能进入高一个层次的岗位,不用从基层还是熬。”这肯定是同学们臆想出来的,或者说是听那些去国字头、中字头、国家机关、事业单位等单位的人说出来的。对于大部分企业来说,其实不同学历人员的起点并没有实质的差别。如果非要说差别的话,也是有的,那就是“基本工资”,每个公司都有自己的薪资架构标准,比如新入职本科生的基本工资是3500、新入职双学士的基本工资是3800、新入职硕士生的基本工资是4000,一般新入职本科生和新入职硕士生的基本工资起点的差超不过1000元。为什么企业里会给新入职硕士生的基本工资高一点呢?决定一个员工工资的唯一标准就是这个员工对公司的贡献度,虽然新员工通过了公司的笔试、面试,但是企业仍然无法分辨出不同员工对公司的贡献度,只有实际工作中真刀×××的实干才能分辨出来,但是在入职定基本工资的时候必须对不同的人进行分别待遇,既然硕士生有实际经验、学过更深入的知识,那么就有更大的概率进行更高的贡献,因此给他们稍微多一点的基本工资也是合理的,但是一个员工的工资不是固定不变的,通常入职后根据贡献不同都会给予调薪的,这时候学历就靠边站了,谁贡献大谁就拿钱多。


   有同学说“不对呀,听师兄说,和他一起进公司的硕士生工资涨的比他快呀!”,大家忽略了一个事实,那就是“年龄差”、“加速度”!这位和硕士生比较的本科生师兄年龄估计也比硕士生小三岁吧?硕士学习了三年,知识、经验都会肯定比和他一起入职的本科生更高一些。因此不要和与你一起入职的研究生比,和那些比你晚三年进入公司的研究生比。就像下面的这张图一样:


黑色的线是新入职研究生的能力变化曲线,那么你究竟是深红色的线还是蓝色的线则取决于你自己的努力了。


三年的研究生学习和三年在企业中实际工作的经验也是不对等的,在学校里读研要学公共课、准备论文、搞乌七八糟的事情,其对人工作能力的锻炼绝对和在企业中真刀×××干的锻炼强度不一样。因此那些想利用研究生阶段积累工作经验的同学也要仔细考虑一下了,是去企业里积累三年的工作经验(赚钱)更重要还是去读研积累三年(花钱)更重要,每个人的价值观不一样,请根据自己的情况判断。


有一些同学认为的“毕业后就能进入高一个层次的岗位,不用从基层还是熬”也是错误的,任何脑子正常的企业都不可能会让你一个刚毕业的学生当领导,因为人家根本不了解你,怎么能让你当领导?任何人刚进入公司都要从基层干起,然后根据不同人的能力才得到一步步的提升。


说了上面几个误解,还有一些同学们的关于考研的想法也需要梳理一下。


想法一“想读研进一步深造,研究专业知识”


这样的同学是中国未来的希望,中国在基础理论方面太差了,需要这样有抱负的同学。但是有这样想法的同学一定要做好心理准备。在国内的很多大学里,研究生每天做的工作已经不是“做研究”了,而是在“乱七八糟”。如果你问问很多读硕士的同学,他们评价导师好坏的标准就是“是不是有活儿干”,好的导师可以揽到很多项目,然后分给研究生干,这些研究生都管导师叫“老板”;坏的导师则是什么项目也没有,学生研一去老老实实上一年课,和在本科的时候一样,研二上半年稀里糊涂的,有门路的自己出去找兼职,没门路的则像本科一样继续在宿舍里魔兽、睡觉、上网,研二下半年就开始准备论文开题,开始了东抄西抄的生活,然后很快研究生三年就过去了,进来时候是0,出去还是0,唯一的区别就是多了一张硕士学位证和老了三岁。


因此如果你的梦想是“进一步深造,研究专业知识”,那么在选学校、选导师的时候一定要多注意,最好选在这个领域有名的学校和导师,如果有可能的话能去美国等发达国家留学最好,因为在很多领域特别是计算机领域这些国家都是处在前沿,而且他们的科研气氛也更浓一些。


想法二“想通过读研实现转专业、进名校的愿望”


有的同学由于高考时的种种原因,在本科期间没有读自己满意的专业、大学,想通过跨专业或者跨校考研来圆自己的梦。


我的习惯还是先泼冷水:企业里是招聘人去帮它赚钱的,因此专业、学校都不是他们关注的对象,根据我工作这么多年的经验来看,企业里同事之间根本不知道彼此的专业、学校、学历是什么,甚至连领导都不清楚。无论是你决定考研还是直接就业,那么都应该把提升个人实力作为首先考虑的因素。


如果你还是决定跨专业、跨学校考研的话,需要做好心理准备,首先导师对于跨专业、跨学校考研的人通常是有歧视的,因为考研录取的时候导师有很大的自主性,因此经常会出现有些同学考试成绩非常高,但是最后仍然落选的情况;其次有的企业里也对跨专业、跨学校的硕士毕业生有一定的歧视,很多企业招聘里都注明“要求本科和硕士期间的专业基本一致,本科期间院校必须是211院校”等。虽然这些都是一些软性的门槛,只要有能力,这些都不是问题,但是同学们仍然必须做好比别人努力更多、受更多打击的心理准备。


想法三:“不想找工作,考一考看,万一考上呢”


有一部分同学是怀着“撞大运”的想法考研的,他们的想法就是“万一能考上呢?就省得找工作了”,这些同学通常都是用“我准备考研,不去找工作”为理由逃避就业,但是平时不看书,连考研的辅导资料都是从图书馆借的,看两页就扔到一边儿去了。用脑子想想看,那些每天都没白天没黑夜备考的同学都不一定能考上,这样的大运怎么可能让你撞上呢?


每年研究生考试的时候都有相当数量的考生根本没去参加考试或者考了一两门就再也没去考,理由很简单,他们根本没任何准备,怎么可能考上?


因此那些只是“撞大运”、“借考研逃避就业”的同学还是醒醒吧,面对现实,想一想下一步该怎么办才是实际的事情。


想法四:“考研很难,一个名额有好几十个人报考”


很多同学描述一个研究生名额难考的证据就是“有100个人报那个导师,那个导师只招10个”,其实还是我在这个系列的文章一开始提到的那样大部分报名的同学都不努力,一部分是撞大运去了,一部分是自我约束力不强没有认真备考,真正用心准备的没有几个人。高考和研究生考试的最大区别就是所有的同班同学都是参加高考的,大家有统一的目标、统一的时间点、统一的学习计划,而研究生考试则不一样,不是所有的同学都考、时间进度靠自己安排,因此能从始至终坚持下来,学习方法得到的人没有几个,因此只要你能坚持下来,并且学习方法得当的话考试取得好成绩并不是非常困难。


想法五:“从大一开始就准备考研”


有一部分同学是从大一就开始准备考研的,大一就开始做考研题、看考研书,这可能是从高中带过来的学习习惯,这也是很多人管大一叫做“高四”的原因。其实也完全没有这个必要。在决定考研之前,先把假定自己不考研,然后自己给自己考研的理由,如果决定了考研再想后面的事情。刚才我说了,考研并没有想像中的那么难,没必要这么过早准备。如果你们学校有保研的机会,并且保研的专业、导师也比较满意的话,只要把高数、英语等考研公共课以及主干专业课学好,然后在期末考试中尽可能的拿到好成绩、拿奖学金就可以,这样能争取到保送名额的机会的话就轻松了,可以利用剩下的一年大四的时间继续充实自己,即使没有保研成功的话,因为之前高数、英语以及主干专业课等考研课程学的都不错,只要花上半年复习一下考研成功的几率也是非常高的。剩下的时间还是要用来多动手、多参与实践,如果自己在大学前三年把动手能力锻炼的很好了,那么如果考研成功,你在导师眼中也是红人(考研成功并不是最终的成功,如果在研究生期间是失败的人的话你最终仍然是失败的),也就赢得更多的机会;如果考研失败,凭着自己很强的动手能力和扎实的专业知识、基础知识,找到一份好工作也并不是很困难的事情。


无论是否考研,大学前三年都应该是以学好专业知识,提高自己动手能力为主。


说了这么多,很多同学看到我很多时候都是在说研究生的坏话,“是不是因为杨中科老师没有读研,而吃不到葡萄说葡萄酸呢?”。说实话研究生教育本不应该像我说的那样不好,但是这是现实。任何事情都有两面性,我相信质量过关的研究生学习的利还是大于弊的,只不过现在很多同学被蒙蔽了眼睛,只看到它好的一面,而没有看到他坏的一面,我在这里把坏的一面讲出来,同学们自己根据这些进行判断自己是否应该考研。


也许你认为我的这篇长达九页的“解惑”系列文章是我在学生大本营、如鹏网里发表的最没意思的文章,因为这篇文章根本没有告诉你是否应该考研。考研与其他事情不一样,如果你问我是不是应该喝农药,我肯定告诉你不应该,因为谁喝农药谁都会死;如果你问我你中了一百万,是不是应该去兑奖,我肯定告诉你应该去,因为谁不去谁是傻子。但是考研则不一样,考研对不同的人、不同的环境有不同的取舍,你只能根据自己的情况进行选择。我不可能给你答案,因为每个人都不一样,如果非要一个答案的话,我建议你抛硬币,正面朝上就考研,背面就不考,这样你就不用选择了,可是你愿意把自己的命运交给硬币吗?


我这里列出了考研的好处与坏处,请根据自己的情况来决定。很多同学害怕做决定、害怕自己选择道路,因为习惯了家长为你选择道路,但是大家要知道做选择的权利是一个人最应该珍惜的权利,别人可以给你讲不同的路的差异,但是不同的人走一条路会有不同的结果,最后走路的是你,究竟走哪条路没有人可以代替你,希望大家珍惜选择的机会,选择好自己的路,然后勇往直前的走下去,不要停止!


The End!


做什么样的软件才能赚钱?


学什么样的知识才能赚钱?


肖舸老师


这是发在我的邮箱里面的一封信,这里做个统一回答。一家之言,欢迎拍砖哈。


(原信篇幅过长,请大家到原帖去看)


我的回答:


这位同学你好,从这封信看得出来你的心情还是很急迫的,你这种心情我完全能够理解。我把问题分几点说,尽量说细一点,希望能对你有所帮助。


首先,你说你是09年毕业的大学生,那么算下来,你应该上班才几个月而已,就这一点,你能在新的单位几个月时间就把工作拿上手,首先恭喜你,这说明你是真的很有实力,当年我转行游戏编程,用了差不多两年才真正想清楚程序设计的真意,我觉得你比我强。呵呵。


你说Java基本上都是做B/S数据库,觉得没有意思,其实这个我也很理解,不过,我觉得你可能不是很了解实际情况。这里我需要给你讲清楚,其实不仅仅是Java程序员,只要到企业中做应用开发,或多或少都和数据库沾点边。当年我用VC还写报表系统呢,你能说这不是数据库?


其实有个问题可能大家都没有关注到,至少,我到学生大本营半年,发现大家都没有讨论过。那就是,做什么最赚钱?无可否认,软件可以实现各方面应用,不过,就我的观察,在现实生活中,有两种软件最赚钱,一种是数据库,一种就是嵌入式底层的东东,嗯,随着互联网的发展,目前做网络程序也很赚钱。


其实原因很简单,就是因为软件的盗版问题。我想看到我这篇文章的每个人,或多或少都用过盗版软件,包括我自己,呵呵,咱们中国人穷啊,动辄几百上千的软件费用,咱们买不起的,所以电脑城的光盘市场才这么火爆。


但是,这带来了另外一个问题,就是当有一天,我们自己成为软件开发者的时候,才发现,盗版导致我们自己的收入降低,无法维系生活。这时候,恐怕再来大声疾呼,杜绝盗版,已经晚了,你说是不?


其实我们可能对市场不敏感,反正每个月发薪水,收入基本上旱涝保收,但是公司的老总们对这个很敏感,软件卖不出钱,公司就亏本,亏多了,就垮掉了,最终程序员还是没有收入。


因此,公司里面做软件,一般都做上面的软件,即数据库应用,嵌入式应用,控制类应用,网络服务应用较多。因为这几种应用,不容易被盗版,能卖到钱。通用性的应用,比如操作系统,比如很多工具软件,比如PC游戏,其实很难卖钱的。


数据库应用,一般数据库本身是使用成熟的商用系统,如MySQL,SQL Server,Oracle等,我们小公司拿来,再根据具体应用需求,做二次定制开发,这是一大类市场,其实这个市场的真正名字叫做“企业数据应用定制市场”。由于是定制的,自然没有通用性,也就不会有盗版了。


控制类,嵌入式类,很多都和具体硬件设备相关,换个硬件平台就不通用了,大家知道,中国的东东,要防盗版,最好和硬件相关,只要绑定硬件,软件一般不好到,以前出的防病毒卡,汉卡什么的,其实利用的就是这个市场规律。


服务应用呢,就更好说了,由于主要程序逻辑都在服务器端,基于B/S的模型,客户端连个软件都没有,服务器的管理自然比卖出去的软件好管理,不容易盗版。因此,这类企业也活得长,比如各个网站,各种网游什么的。所以我一直觉得,以后云计算发展起来后,很多软件可能会把零售制改为租用制,比如photoshop,大家买套软件几千,但一般人就是处理一下自家照片,自然不划算,因此盗版很多,但以后假如软件公司把它做成服务器版,大家把照片上传,处理,最后再存回来,这个过程每次租金1毛钱,每个人都花得起的话,我看以后就没那么多盗版了。另外,服务器应用其实大多数也是数据库应用。


所以,我首先要说,不管你是不是换工作,以后你恐怕会一直遇到数据库类的应用,不管你喜欢不喜欢,但这是社会的现实,你必须承认。你说对吧?


在这个共识下,我们再来看,其实我们会发现,三大主流应用中,只有嵌入式不适合Java,其他的数据库和服务器应用,其实Java比C和C++方便得多,因此,我建议你就在Java这条路上走下去,不一定非要转C和C++。本来你的强项就是Java,而且这也是主流的可以卖钱的市场,为啥不坚持呢?


从另外一个角度说,我也认为你应该坚持,你毕竟毕业不到半年,对社会,对公司,对本职工作其实了解并不深入,你认为Java就那么几个设计模式,没有挑战性,这个我能理解,但是,我觉得你说的不全面。起码我做程序做了这么多年,到底有多少种设计模式,我也说不清楚,我相信很多人都说不清楚。需要具体应用具体分析。


我不是Java程序员,不过我觉得,如果要做一个合格的程序员,首先不应该是程序设计的大师,而应该是理解客户需求,并迅速拿出解决方案的专家,这个,不管用什么语言,不管在哪里工作,都是必须的,同时,这也需要很长时间的积累。


准确的讲,我认为,一个人不在一门语言,一种业务领域努力3年、5年乃至10年,是很难成为专家的。因此,我建议你完全没有必要这山望着那山高,轻易就决定跳槽,建议你就这个环境,先锻炼自己,我这里放句话,你可以试着验证一下,两三年以后,你再看Java语言和数据库开发,都还是会找到自己不会,值得学习和钻研的东西的。因为最起码,客户的需求是千变万化,永无止境的。


当然,话分两说,如果你真的喜欢C,很想做嵌入式应用,就是不想做Java,那也无可厚非,因为毕竟每个人都有选择的权利。


不过,我仍然不建议你辞职回家学习。我以前有句话,大学毕业,才是学习的开始,不过,这个大学毕业后的学习,和学校中的学习,有很大差别,突出的几点:没有老师,没有教材,都是自己主动学,针对自己的需求来学习,学技巧多,学原理少,并且一般都是干中学,而不是学完了再干,我总结就是“用以致学”,而不是“学以致用”,这是我总结的学习经验。


同时,毕业了,总不好意思再向家里面父母要钱,总得自己赚钱养活自己。你说是吧?你说辞职半年,专心学习,那你没有收入吃啥?还不是吃父母的?这样不是很好。


C语言没有那么神圣的,也没有太高的门槛的,不要想太复杂了。另外,指针,内存什么的,学习C语言确实能接触到,但是,我还是要说,C语言并不是因为有了指针和内存的直接访问,才牛叉,C语言是因为大量的程序员用它解决了很多具体应用,才牛叉的。请你注意不要学偏了,不要为学指针而学指针。指针就是指针,仅仅是个访问工具而已,不是用来显得很酷的,需要了才用它。


Java语言用个数组,其实也能模拟指针的大部分功能的。其实我作为C程序员,我们平时工作时对指针是很谨慎的,能不用都不用,尽量用引用来代替,为啥,因为危险,容易出错。


数据结构,计算机组成原理,算法语言,编译原理,嗯,还有个图论,这几门应该算最经典的计算机理论了,但是,也没那么神秘的,书店里面有,自己没事买几本回来看看就好了,生活是没有考试的,不需要你必须考够100分才能找到工作,了解,理解就好了,背书是背不出好程序员的。你说对吧?


其实这几门,不用C和C++语言,用Java语言一样可以学习的。嗯,编译原理可能够呛,需要理解一点C。


另外,我再给你透露一点点,其实真正实际应用中,我们对于上述基础知识用得很少,用得最多的,其实就是数据结构里面的队列了,其他,包括栈都很少用,C程序员也不是每天都从底层,从0做起的,还是有很多工具套用的。这和Java语言从框架开发是一个道理。


反而有一门课程建议你好好学,就是概率和统计学,这门知识是我现在应用最多的,很多时候,我们评估软件系统性能,瓶颈优化,都是在用这个学问。程序员做久了,可能大多数时候都是和这个在打交道,建议买本好好看。


总结一下吧,建议你目前暂时不要辞职,既然选择了Java和数据库应用开发,选择了B/S模型,你耐心做3年再看,也许3年后,你自己的想法就变了。


C可以学,你说的课程都可以学,不过,不要辞职专门学,先赚钱养活自己,再利用时间学习,你这么大的决心,每天晚上就不要看电视了,那你每天晚上,19:00~24:00,至少有5个小时来学习,利用好了,我敢说比你在大学里面效率高。


看书学习不是什么神秘,神圣的事情的,也不需要什么斋戒沐浴,念几天经才能学习,我觉得就和我们吃饭喝水一样,随时都可以学的,找几本书,就在床头放着,每天晚上看看,几个月也就看完了,又有多难嘛?


关键是,养成习惯。


      你说对不?呵呵,先说到这里,有问题再问哈。


最后补充一点,如果学习C,并且有一定基础的话,等我书出来看看吧,里面的跨平台开发工程库,可以帮助你迅速掌握嵌入式底层的一些技巧。不过,要有基础哈,一点不会C看不明白的。


(该位同学继续来信咨询并表示了决心,原信过长,这里不转贴了,请大家到原帖来看吧)


我的回复:


这位同学你好,我昨天其实已经说明了我的一个观点,虽然我建议你继续努力学习Java,不过,每个人都有选择的自由,因此,如果你还是坚持要学习C的话,我也不反对。


你在两封信里面,都强调你原来是个差生,但最后半年知道发奋学习,最终过五关斩六将,成功拿到offer,超过了很多同学,也让老师的眼镜掉了一地,呵呵,我真心恭喜你,也很佩服你。


其实我以前有笔记说过,人要发奋,什么时候都不晚,苏东坡的爸爸是这样,小时候我们学的《周处除三害》也是将这个道理的。你能把计算机里面200G的游戏和电影删掉,换成学习资料,嗯,了不起,比我强。


不过,如果我们要讨论C的学习路径,恐怕要让你失望了。因为C和Java语言并不一样。并没有前人规划好的必然成功之路。


Java语言由于面向应用面相对狭窄,框架模板众多,最重要的,其主要工作方向比较确定,就是做基于网络的跨平台数据应用为主,因此,其发展方向很容易确定,学习路线也比较好规划。


但C显然不是这样,C应用面太广,可以说,汇编能做的事情,C就能做,甚至做得更好,也就是说,我们能想出来的计算机软件应用,其实都可以由C来实现,仅仅是成本高低而已。


而不同的应用,除了计算机软件编程知识之外,还需要很多应用相关的知识,这就造成了C程序员往往也需要成为自己应用方向上的半个专家,这就比较麻烦了,这么多的应用方向,写游戏的知识储备,和写驱动显然不一样,与写操作系统和编译器的方向又显然不一样,因此,很难说一个C程序员需要掌握哪些知识,才够用。


以我自己为例子,我做程序差不多快20年了,做C也超过15年,做过游戏,工业控制,电子教育,网络传输等各种软件,我总结自己的知识储备,也仅仅觉得自己在数据传输方面有一点心得,并且对于C和C++语言怎么实现0Bug程序设计,有点经验而已,真不敢说自己什么都会。


另外,C语言之所以难学,并不是说它自己多难,真正的问题在于,C语言偏底层,只要我们一做应用程序,或多或少都需要调用很多操作系统相关的api来完成工作,Windows下,如果我们不懂Win32API,则很难写出合用的代码,C语言玩得再熟都不行,Linux下对于各种系统和应用级api,也需要不断查询man,否则根本写不下去。所以,要想成为C程序员,至少要学习操作系统,通常,至少应该把Windows和Linux常见的api学一遍。MFC是Win32API的C++框架表示,最好也学一点。


其实这已经带出另外一个话题,现×××发,C和C++一般不分,C++到了函数内部,其实是C,而C呢,有很多特性写程序不够方便,也需要使用很多C++的特性,如默认参数,如引用等等。所以,学习C,最好和C++套着学,都看看。呵呵,这已经是两门语言了。


还有一个问题,不管是C还是C++,总是各个具体的操作系统上开发,Windows和Linux有差异性,很多库函数,常量定义都不一样,因此,C和C++一般说来,很难做到程序通用,需要使用大量的编译宏,这需要了解语言之外的东西,即编译器的很多特性,不过,很可惜,关于编译器特性,目前的资料很少,我很多都是摸索的。


另外,现代的操作系统,都是多任务操作系统,多任务开发是个难点,这个多任务计算其实就是并行计算了,必须对进程,子进程,线程有很清楚的认识,对于时间片有清醒的认识,对于锁的使用,锁的作用域,去锁优化要很熟悉。但是,也很可惜,目前市面上的书籍,讲语言的就讲语言,讲操作系统的就讲操作系统,对于这个多任务开发这块,同时需要结合语言和操作系统两方面知识的,几乎没有,需要自己摸索。其实我写《0 Bug ---- C/C++商用工程之道》,有很大一部分目的,就是希望填补这个空缺的。即从语言和操作系统中,抽象出来,站在更高的角度,从较为宏观的立场探讨并行计算程序的开发之道。所以我说如果你要学C,等我书出来最好看看。


嗯,还有一个很重要的问题,C语言的基本库相对薄弱,很多近年发展的高级语言,对于哈希,List,队列,栈,树等常见数据结构都提供标准库函数,或者库模块来支持,但C一般是没有的,偏偏实际应用开发还经常用到,得自己找开源,或者程序员自己写,这也会耽误程序员很大一部分精力。


这里就出现了C语言一个不好不坏的特性,或者说既好也坏,C语言没提供这些工具,程序员自己写,很麻烦,但是,由于是自己写的,自己掌握所有底层代码,因此,优化变得很容易,一个队列,我随手加个队尾指针做加速因子,可以规避大量的递归操作,效率提升百倍甚至千倍以上,这在C里面就是加几行代码而已,但是对于Java等语言,由于底层库是厂商提供,甚至根本就不是本语言开发的(很多高级语言底层库其实是C和C++写的),程序员一般没有修改能力,有时候,遇到性能瓶颈,大家就只有干看着,没有任何办法。因此,同样的应用,C语言可能一台服务器就够,但是Java语言呢,可能需要3~5台,就是因为这些语言做的太完善,而太完善的东西,一般不好做优化,性能就不及经过专项优化的C代码。


就是因为这个原因,在很多嵌入式等小终端场合,由于CPU计算能力有限,需要使用C来做优化,而不能使用Java等高级脚本语言,否则程序跑不过乌龟。


另外,现代的数据应用,出于优化起见,一般趋于功能细分的设计模型。比如一个数据库应用,存储模块专门负责高速出库和入库,中间甚至添加cache机制作专业的优化,而业务模块则强调设计一套嵌入式脚本语言做二次开发,保持最大的业务开发灵活性。其实Java,PHP,很多都是这种模型,MySQL底层模块实现高速存储,上层则使用apache和PHP、Java等语言,灵活二次开发具体应用。


但是,C由于一般都是编译执行,不是解释执行,一般很难做到这么大的灵活度,不能用户仅仅加个字段,就跑过去把整个服务器重新改写编译一遍,这样维护成本太高了。因此,C程序员的解决方案,一般是自己实现底层的高速数据应用,再自己写个脚本语言的解释器,提供给用户做二次开发。


你发现什么没有,其实C程序员如果做企业数据应用,一般需要具有编译原理的知识,我们一方面要实现用户的业务,还需要写一套Java这类脚本语言给用户做二次开发用,说白了,就是我们自己实现一套lamp体系,呵呵,这不是又费马达又费电嘛,因此,我前文说,做数据库应用,最好直接用Java,直接用C,成本太高,而且不容易满足用户需求。


说到这里,你又发现什么没有?C语言之所以难学,并不是C本身难学,而是如果要成为一个C程序员达到实用级的地步,需要掌握很多方面的知识,这些知识,书上可能有,也可能没有,没有的,就要靠钻研,靠实战,靠自己去想通,因此,很难通过K书成为C程序高手的。建议你学习时,关注C这个特点。


不过好在你强调做游戏和嵌入式两种,这两种呢,我可以根据经验讲一点:


如果从事游戏的话,很多时候是和图形打交道,目前的游戏,趋向是大型化的视频图形游戏(包括大型网络游戏、电视游戏机的游戏)和小型化的终端游戏(手机类、PDA游戏),这两种比较好卖,至于中型规模的PC游戏,由于盗版太严重,已经很少人做了。仅仅是一些游戏公司为了宣传自己,会出一些经典的大作。


嗯,硬件厂商为了宣传自己的新板卡,如新的图形显示卡,会拿出钱来,请游戏公司做一些针对该型板卡特定优化过的游戏,以刺激广大用户对硬件升级换代,这也是一条财路,很多游戏,在面市之前,就已经从硬件厂商获得了足够的利润,并不需要从零售市场获取利润。我们在电脑市场看到,几乎每出现一款游戏大作,就带来一次显卡,甚至PC机硬件的升级换代热潮,其实背后就是这个故事。


不过呢,游戏引擎我还是建议你最好不要去做,因为做这个成本太高了,很少有公司去做,而这些公司,一般都是欧美公司,对人员要求很高,轻易不会招收亚洲国家的程序员,因此,学这个好比屠龙之技,看起来是很酷,但是实际上工作机会很少,甚至不比中×××来得高。


另外,做游戏引擎不好玩的,因为现在也都细分了,做引擎的公司一般自己不出游戏,最多出点Demo,他们就是提供高性能引擎,而不是好玩的游戏,而游戏公司,则是购买引擎,然后开发具体的游戏内容。比如Quake和虚幻的引擎,就很多家游戏公司买去做自己的游戏。其实很多游戏引擎,目前也提供脚本语言,即里面用C实现了另外一套语言。


游戏公司其实主要是美工建模,绘图,企划编故事情节,程序员反而很少,更多地是使用脚本语言,在引擎基础上做二次开发而已。因为游戏公司就是做好玩的游戏,至于具体用什么技术,其实他并不是很关心。说不定,如果你哪天进个游戏公司,会发现自己又见到Java语言这个熟人,呵呵,那个时侯会不会有欲哭无泪的感觉?


其实这也是社会分工的不同,好的引擎程序员,更多的是个数学家,强调逻辑思维,你让他去写个美少女梦工厂,如何抓住少女的心,还不如杀了他,呵呵。


而做嵌入式系统,其实也有诀窍。嵌入式系统,目前我们看到的手机应用仅仅是很小很小的一类,更多地,嵌入式系统是应用到工业控制领域,从大型机械设备的控制,飞机、汽车轮船的控制系统,甚至到十字路口一个红绿灯,里面都是嵌入式系统。


目前有个现象,嵌入式好赚钱,很多学软件的同学都想找嵌入式工作,但是,毕竟在这个领域里面,给手机做游戏的就那么几家公司,不可能吞下所有的人才,更多的是需要自动化控制人才,因此,这类软件转嵌入式的人,进去一般都有点缚手缚脚的感觉,总觉得知识上欠一点,又不好补。


其实,嵌入式应该是最简单的,比如说驱动,就很多硬件厂商要人,而驱动其实就是做一套打口读口的api,很简单,最多做的时候注意点,别用太复杂的算法,保证计算速度而已。


但是你注意到没有,嵌入式其实主要是和硬件打交道,硬件知识必不可少,至少,计算机组成原理,数字电路,模拟电路要很熟,最起码,你要知道开关量和模拟量,要知道集成电路的选通信号和真值表,对于地址表的编址要很敏感,对于常用的集成电路块的特性,比如8235等,要比较了解。否则,是写不好嵌入式程序的。


因此,我以前有笔记说,嵌入式开发,很多时候软硬件不分,我见过的很多嵌入式工程师,其实也能自己画一些简单的电路板,至少,他在设计时,知道哪些功能硬件来做更合适,而不是一味的走软件路子。


不过,嵌入式学习要钱,这是肯定的,最起码,你自己手边要有个基本的嵌入式平台,不过好在这个并不贵,一个arm9的开发板,目前也就500多元,淘宝上就有卖的,买块回来自己做练习,应该不难。


如果要我给你职业路线建议,我还真想建议你就走这条路子,原因很简单,工作好找,进去之后的门槛并不高。你花点时间,自己钻一下数字电路等前面说的几本书,对于底层的汇编看看,主要看看arm的和51系列的就好了,也不用看太精,嵌入式程序大段大段的都还是C,仅仅部分端口动作,为了协调时序,采用用到汇编,而且,用得最多的还是NOP指令,就是强制CPU延时,这个很容易的。


最关键的是,嵌入式设备在很多工业设备制造公司都有用到,他们也需要大量的人才,并且,我们都知道,公司里面,普遍学历最高,年龄最低,门槛也最高的就是IT软件企业,这些工矿制造企业反而门槛比较低,进去之后,老板也比较看重人才,因为制造业的产品一般立竿见影,开发一套设备半年就开卖,不像软件,一般要开发到3.0版才有市场,呵呵,老板看得到钱,自然也比较看重赚钱的人的。


虽然你是软件人员,上述硬件知识没有学过,不过就我学习的经验,其实反而门槛还低,甚至比学个Java的框架来得还容易,建议你可以考虑从这条路上走。


嗯,先说到这里吧。有问题继续探讨。


最后我还是要劝你一点,生活不是PK,生活也不是孤注一掷,没必要什么时候都把自己逼到绝境,想成功其实很容易,只要制定一个目标,一个计划,然后按部就班走就好了,不需要找锥子扎自己屁股的,那是自残,呵呵。


自然一点,看开一点,少给自己太大压力,看书累了,看看电视也没啥,出去走走也没啥,没事的时候,眼睛从计算机屏幕上转一下,看看身边有没有合适的女孩,谈谈朋友也不错,如果那个错过了,才是一辈子的遗憾。


成功的道路,应该是很快乐的,如果都是眼泪和汗水,即使做到百万富翁,又有什么意思?


你说呢?


程序员如何踏上社会


肖舸老师


这是发到邮箱里面的一封信件,个人觉得比较有代表性,特地在此公开作答。还是那句话,一家之言哈,欢迎拍砖!


原文:


老师好!我是河南较好的一个二本大学学生,信息与计算科学专业,开设的课程大多是数学和信号,计算机的只学了C和C++,以后还有操作系统、数据结构和数据库等课程,我们专业就业形势不好,我不准备考研,想毕业后从事计算机方面的工作,例如做软件编程,可是学校开的相关课程就我说的那几个,所以我只能平时自学。我发现编程是个大学科,光语言就十来种,我在学C++可是人家说学C++得三五年才能学成,我现在都快大三了,毕业时C++水平肯定很菜,今天又XX培训机构的老师聊天,他说现在企业用JAVA和.net的多,他们都不开设C/C++的课。我现在真的迷茫了,我是继续学C++还是改学其它的呢?我只想毕业时能找个工作,以后去深圳慢慢发展。我该怎么办?请老师指点一下啊,不盛感激!


我的回答:


这个问题相对比较复杂,也很宽泛,很难简单回答,我这里,也仅仅就个人的一点认识,谈谈看法。


目前在学生大本营里,我也观察到,很多二本,三本的同学,在心里上有种自卑感,总觉得考分低了,出来就低人一头。这点,我是万万不赞同的。很多时候,我对小弟讲,我相信你们的老师,师兄,师姐,前辈,都有讲过:“大学毕业,仅仅是开始,不是结束。”


中国的社会,越来越商业化,其实商业化有一个好处,就是这个社会给每个人的机会,总的来说还是越来越公平。这个问题分怎么看,名校毕业,高官子弟,亿万富豪的孩子,总会比我们站在更高的一个起跑线上,这是事实,但是,也仅仅是起跑线而已。在社会上,也有太多的故事,从一个穷家子弟,经过努力奋斗,最后成功的事实,因此,首先我觉得大家不必气馁,万事有拼才会赢,只要敢拼敢做,没什么大不了的。


肖老师自己的学历就不高的,经过这么多年奋斗,也取得了一点成绩,这里就不多说了,总之,请大家记住,这个世界,还是相对比较公平的,只要肯努力,就会有回报。反过来说,当我们认为社会不公的时候,不妨问问自己,自己尽到自己最大努力没有?


第二个问题,关于学校里面开设的课程,大家可能会觉得不够时髦,不够酷。净是一些计算机组成原理,数据结构等老掉牙的课程,远没有什么spring框架来得过瘾。呵呵,不过根据我的经验,工作几年以后,大家可能会觉得,最值钱的,恰恰是这些最土气的课程。用框架,永远不算本事,也没有什么核心竞争力的,哪天框架死了,你就死了。会做框架,才叫本事,才叫公司里面的骨干人才,才可能成为架构师。而另一方面,框架也是人做的,大家以为,做框架需要哪些知识?是不是上述old的知识?


因此,我的建议,大家好好学好自己的课程,在这几门课上,清华的老师,比起你们的老师,未必有优势,因为这些知识太经典了,也没有给老师什么推陈出新的发挥余地,学这几门课,大家和清华的学子,是站在同一个起跑线上的。


第三个问题,学习C和C++的问题,大家不用想,我的经验,别说这两门相对复杂点的语言,就算是Java,PHP等语言,没有指针的干扰,要想学精学透,没有3到5年、5到10年的刻苦,也是不行的,大学毕业就想做大师,不太可能的。因此,建议大家不必妄自菲薄,你做不到,别人也做不到,大家还是一个起跑线,关键看,以后工作中,能不能扎下来潜心研究,仔细揣摩,不断增长自己的经验值。


第四个问题,关于培训机构不培训C和C++的问题,我也很好奇,好像是有这么回事。我曾经研究了一下,认为原因是这样的:


培训机构也是商业公司,主要目的是赚钱。对他们来说,赚钱有两个重点,第一是短平快,要短期出成果,让学生和家长有看得见的进步,给客户以信心,好让客户买单。第二则是成本够低,在同样营业收入的情况下,培训时间越短,请的老师价格越低,老师的沟通成本越低,培训机构的利润越大,因为企业做生意,核心问题是利润,即他真正赚到手的那部分钱。


这就很好理解了,无论从哪个方面理解,C和C++都不是最佳的选择。大家可能没有讲课的经验,但是我本人有一点。我讲课时,发现最难和同学们沟通的细节就是指针,翻过来揉过去说,几个小时下来,就是有人搞不懂指针,至于指向指针的指针,就更晕了。更不要说C中的函数指针,C++中的对象指针,泛型设计等复杂概念,反之,Java,.net都有比较成熟的应用程序框架,同学们可以快速搭建一些立竿见影的应用,因此,从短平快角度,从利润最大化角度,C和C++都不是最好的教学语言。


如果我开培训公司,我的目的是赚钱的话,我也不会教C和C++,太费神了。当然,有人说你贵买贵卖吗,收费贵点,把成本补回来。那样也不太现实,因为,太贵的费用,就没有客户了,大家试想一下,如果开个培训C和C++的培训班,保证出来会写操作系统,收费20万,大家学不学?我估计就算这个课程值这个价,恐怕也卖不出去。


所以,这位同学说的培训机构的意见,我的建议是,听听就好了,不要太认真。


不过,这里肖老师提示大家一点。任何东东,价格和价值是不等的,价值取决与这个东东本身值多少钱,价格则更多地取决与市场需求。大家可以想象一下,目前100个培训班,90个都在教Java,这意味着什么?是不是以后Java程序员暴多。暴多的结果是什么?肯定是跌价啦,因此,我曾经推论,Java程序员以后的薪情堪忧。


反过来,C和C++,如果我们自己肯钻研,钻出成绩来,前景还是很可观的。我们要坚信,C和C++的市场需求还是有的,在游戏业,在通信业,在很多嵌入式场合,C和C++语言都有不可替代的作用,程序员少而市场大,大家知道意味着什么吗?薪水高是不?呵呵,这是肖老师自己YY,乱讲的,大家可以自己想。


反过来说,C和C++的培训班少,我们找不到,清华北大的同学出来,是不是也找不到?这是不是说,在C和C++这条路上,我们和他们又站在一个起跑线上了?呵呵,可能有人会说,那些名校毕业,不需要培训班,当然。但是,名校毕业,我想也不会成为大师,他们工作一开始,还是得老老实实地学,大家说是不?


最后一个问题,去深圳发展。我的建议是不要去了,深圳目前已经比较成熟了,相对来说,机会比起刚刚改革开放时,已经少多了,我们贸然过去,期待有个好的工作,这是不了解导致的幻想。深圳工资高,相对物价也高,大家找工作,不要单纯比较工资绝对值,好好比较一下两地的房价,会发现,深圳的工作,性价比不高的。


深圳还好点,北京上海,就更过分,房价高不说,把个户口看得跟什么似的,外地人过去,很难在当地买房,落户,扎下根来的,会有很多看不见的杠杠在阻碍你。我是这么看的,打工者和城市是互动的,诚然,打工者需要城市提供的环境赚钱,而城市也需要打工者增加税收和消费,进一步增加城市收入。一个城市把自己看的太高傲,不是好的合作伙伴,也不是适合长期呆的地方。我自己就是这么看的,从成都出来,没有选择那些一线城市,选择了西安,主要就是看城市的包容度,基本的物价指数。


嗯,还有个很具体的问题,就是找对象结婚。大家不要笑啊,人之常情,谁也不想一辈子当和尚。 据我所知,越是大城市,北京、上海,甚至成都、西安也有,很多女孩,很浮,看重表面的东东,看不起外地来打工的人。这也没办法,这个社会随着商品化思维的加深,每个人都有一种交易心态,女孩希望嫁好一点,无可厚非。但是,由于她们这个心态,一般都看重一个男人有什么,而不是很细心地观察这个男人的潜力如何,因此,大家就算专业技术再有优势,但只要手边没有现金,没有房子,车子这些硬件,恐怕过去找媳妇,也很困难。大家刚毕业可能感觉不明显,不过,我想过几年,大家就有感觉了。


当然,有人说,我大学里面有女朋友,或者说,我过去也找打工的。完全可以,不过,两个人都是打工的,处于一个陌生的环境,奋斗起来,可能会比较艰难一点。建议大家做好思想准备。


这个话可能某些同学不爱听,不过我放在这里,欢迎PK。


因此,我最后的建议:人一生是很复杂的,和邓大爷一样,三起三落不到头,现在我们看到的,不一定就是一生中最重要的。仔细去看一些最古老的道理,有时候反而更有用。


关键是,这辈子给自己一个目标,定一个计划,只要能坚持走,最后一般都能成功。这个计划,可能很小,比如我一定要成为C和C++的高手,也可能很大,我要成为某方面的专家,我要成为北京人,上海人,甚至我要出国等等,都可以。


关键是,你现在准备做什么?你能坚持多久?


关于女生的程序员之路


肖舸老师


这是发到邮箱里面的一封信,感觉近期讨论女性程序员居多,有一定代表性,这里尝试作答。一家之言哈,欢迎拍砖。


原文如下:


肖老师:


     您好!


     我是在大本营上认识的您,首先感谢您在大本营中给予我的帮助和指导,我真的从中获得不少收获。


     说实话,我之所以加入大本营是因为在大学中课程学习的需要,但是随着学习的深入,我对编程产生了很浓厚的兴趣,但是关于女生从事程序员之类的工作,我有很多疑惑。


     首先程序员是份耗脑力和体力的工作,熬夜加班出差都是常事,不管有多大的兴趣,身为女性的体质能否胜任其中种种艰辛?


     其次,有多少公司愿意招收女程序员?性别歧视仍然存在是不可否认的事实,要获得肯定,女性势必要付出更多。更何况是刚毕业的女大学生?


     我很迷茫。是不是应该在编程这条路上继续走下去?关于大本营中的各个课堂,什么JAVA,PHP,NET,嵌入式,等等。我都没有接触过,我只是个编程初学者,只是学习了数据结构和C++,考试和实验成绩也不错,很多人说我有这方面的天赋。而且我自己也很有兴趣,希望能继续走下去。但是接下去该怎么走,完全没有头绪。


    其实现在所有烦恼都是来自于就业和未来的生活,我希望能从事我喜欢并且适合我们女孩子的工作。男孩子喜欢了就会不顾一切,但是女孩子难免有很多顾虑。希望老师能给我建议,或者能指点我方向。能让我从迷茫中走出来。。。。


   期盼您在百忙之中能给我回信,谢谢!


                                                                   您的学生


===========================


我的回答:


这位同学你好,呵呵,首先声明,肖老师是男生,从来没有站在女生的角度思考过问题,因此只能就自己的角度来探讨一下问题,说得不准,勿怪。


嗯,说个现象吧,我在成都呆了12年,确实没怎么看到女性程序员,有几个,生了娃以后,都回家带孩子去了,不过我到西安来以后,吓了一跳,程序员中男女比例接近1:1,呵呵,确实给我上了一课。


所以,就我的经验值,我发现你说的其实不准确,起码中国北方城市,女性就业率还是比较高的,至于是不是程序员职业,并不重要,也有很多女性做的,你大可不必担心这个问题。


当然,女性有女性的弱点,生理上的咱们就不说了,其实对于办公室工作来说呢,问题不大,关键是结婚生孩子,根据劳动法,女性一般是4~6个月的产假,这在很多小公司来说,一个人接近半年不上班,还拿薪水,确实有点难以接受,因此,在招聘时,不知不觉就对女性有点回避倾向,就造成了女性求职困难的现状。


但是呢,我觉得这是短期现象,为什么呢?一个公司,如果要做大做强,做正规,必须正视这些劳动法规定给员工的基本福利,如果老板刻意回避这些话题,应该说,这家公司也确实做不大。至少,我到现在没有看到哪家超过1000人的大中型企业,里面一个女人都没有的。你说是吧?


所以,这个问题,归根到底,我的理解,还是市场经济的初级阶段问题,即中国的企业刚刚出现,还在进步,目前实力还弱,无力承担太多的社会责任,无法承受女性结婚、生子的一系列额外成本增加,因此导致女性就业渠道偏弱。


就我的经验而言,目前国有大型企业、欧美外资企业,嗯,台资和港资等企业也是,对劳动法遵守比较好,反而是中国的民营企业,遵守得不好,让买个社保都磨磨唧唧的,更不要说女性的产假等问题了。因此,如果求职时主要针对上述企业来说,应该问题也不是很大。嗯,国内华为、中兴等大型企业,对女性歧视也很小,可以考虑。


但是,要注意,这里面也有个门槛问题,国有大型企业,其实福利是比较好的,但是,工资待遇偏低,尤其是进去主要靠关系,很少有凭借真本事能进去的,这个难度很大。其他三资企业,人家是典型的资本主义社会原则,看人部分男女,都是成本,每个人必须创造出效益来,因此,首先必须要真本事才进得去,其次,进去后,人家用人也比较狠,我们常说“女生当男生用,男生当畜生用”就是这个道理,如果进这类企业,要做好被扒层皮的思想准备。


第二个提法,我觉得目前女性就业困难,关键还在女性自己。


目前大学里面有句话:“干得好不如嫁得好!”,我想大家都听说过。其实是人就有惰性,也有一些劣根性,都想找一些活少拿钱多的工作,舒舒服服地赚钱,这种思想,其实不管男人女人都有。我自己也有,呵呵。


关键是,社会是公平的,一分贡献,一分收获,哪有那么多不劳而获的事情。但现在的女生,我觉得普遍有点问题,都想走捷径,都想一次革命成功,目前大学校园中,傍大款的不少,很多女生一门心思嫁个好老公,认为这辈子就有靠了,不需要奋斗了。


因此,在求职市场上,很多女生不是找不到工作,是根本没有一心一意地去找,因为对女生而言,通常都有第二选择,可以靠家里,靠男朋友,等等。这种求职态度上的不坚决,其实无形中,已经给自己关闭了很多企业的大门。有个现象,同等条件的两名女生都面试,一名犹犹豫豫的,一名态度极其坚决,一定要拿到这份工作,通常都是后者获胜,因为企业认为这个人既然这么需要这份工作,那不管能力怎么样,进来后起码会拼命做事。


那我们再来比较男生和女生,就可以看出显著差异了,其实男生有时候也想靠,但是没得靠啊,反而,还有个女生在靠自己,自己还要撑起一片家庭,那么,你说男生求职拼命不?


但我还是得说,前面女生的这种思维是严重错误的,夫妻也是经济共同体,双方需要共同完成家庭建设,这样的家庭才稳定。一个女性,如果觉得职场艰难,就打退堂鼓,那,不管是不是程序员,其实我觉得她什么职位都找不到的。


这样还有潜在的恶果,现在有很多闪婚族,出了校门就结婚,我认为和女性的这种依赖思想有一定关系,但这样的婚姻,是不是稳定呢?


其实我不讲,大家都应该清楚,女性凭借个人的外貌实现魅力,男人更多的是凭个人的内涵和事业的成就实现魅力,这就决定了,一个女人,魅力最大的时候,是18~28这个年龄段,而男人恰好相反,一个男人最有魅力的时候,是35~45岁这个年龄段。这中间有落差。


一个女性,如果坚持以漂亮为本钱,早早地就嫁人,在家里相夫教子,那么,在她30多岁,年华老去的时候,情况就比较危险了。首先,男方逐渐进入事业巅峰,很多更为年轻漂亮的女性,会青睐这种男人,男人面临的诱惑在加大,其次,这个家庭,十几年其实都是男方一点点赚出来的,女方是享受者,不是建设者,在这个家庭里面渐渐就没有发言权,经济基础决定上层建筑,不要说对方爱你就会一辈子听你话,很多事会变的。


如果此时女性再不注意,试图通过控制经济等手段压制男人不会变心,或者采用跟踪,哭闹等极端方法,往往适得其反,最终导致男人离他而去。一旦出现这个问题,女性的问题就比较危险了,十几年没有上过班,自己的专业能力,恐怕仅仅剩下一张文凭了,知识都还给老师了,那她在社会上可以说没有任何竞争力可言。那么,她以后靠什么生存?


所以我这里提醒一句,现代女性,最好有一份自己的事业,不要轻易依赖别人,记住,今天你有优势,别人会爱你,但是明天当你优势丧失,而男方优势突显的时候,很多时候,家庭并不是很稳固的。最好的方法,有份自己的工作,有份自己赚的薪水,可能不多,但是家庭建设有你一份,男方如果动不动就动歪心思,就是他无理取闹,打官司他都打不赢的。这也是保护自己必要的方法。


当然,也不要走另外一个极端,动不动就以女强人自居,你的事业是第一位的,男人天天在家里要给你扫地做饭端洗脚水,这也不好,中国社会,毕竟几千年,有个文化风俗在里面,女性再赚钱能力上,总的来说还是不如男方的,以后家里的顶梁柱还是男方,那么平时在家里,让着男方一点,家务活多做一点,让男方回到家,有个休息的感觉,能放松能感到温馨,这样的话,这个男人就是你的,打都打不走。呵呵。


总结一下,女性的工作问题其实比男性复杂,中国的男性,一般都是一门心思顾事业,把事业做到最好,而中国的女性,永远需要在事业和家庭之间求得平衡,既不能没有自己的事业,也不能放弃家庭,这很难的,不过,慢慢锻炼,总会找到办法。我的经验,能把握好这个平衡的女性,一般这辈子都比较幸福。


所以,针对你的问题,我觉得要辩证地看,既要看到,找份工作对你很重要,也要看到,作为以后家庭中,主要负责家庭事务的成员,你的工作不要一味追求高薪高职位,要寻求一个合适的职位,能满足长期工作不失业,但也不能太苦太累,搞得家庭无法维系。这才是比较周全的解决之道。


现在我们回过头来看看程序员,其实程序员这份工作,我觉得女性可以做的,程序员有很多加班的,但是这往往是工作刚开始,没有太多经验的情况,待工作一定年限,掌握了一定经验,加班会越来越少,其实大多数程序员工作岗位,是不出差的,基本上是朝九晚五制,做久了,收入也不低,可以满足一个女性对事业和家庭的平衡。因此,我建议你大大方方就做程序员,找不到,努力找咯。


嗯,再多说一点,就我个人的经验,程序员的加班,往往都是由于bug导致的,大多数时候,公司在安排项目开发时间时,时间还是给得比较够的,至少是评估过的,但是,往往是后期出现了很难跟踪,很难解决的bug,导致项目进度大大滞后,时间突然变得很紧,于是出现大量的加班,有经验的朋友可以想想,自己以前的加班是不是这样。


其实这个问题和男女无关,实实在在是每个程序员的问题,我本人以前也深受其害。后来我痛定思痛,准备彻底解决这个问题,于是我用了大约8年的时间,研究了一种方法,叫做《C/C++无错化程序设计方法》,出来后,我的bug果然少了很多,几乎达到0 bug的地步,自然而然,我加班也变得很少了。


这种方法我在我的新书《0 Bug ---- C/C++商用工程之道》里面,已经share出来,供大家参考,如果你以后希望过的轻松一点,能更好地在事业与家庭之间求得平衡,少加班,多陪家人的话,建议书出来你看看。呵呵,也算我做个小广告。这种方法虽然是C和C++的,但里面的原则都是跨平台跨语言的,因此,其他语言的朋友,建议也看一看。会有帮助的。


如何找需求练技术


肖舸老师


被很多同学问,怎么才能知道用人单位的需求。


这个给个建议哈:去CSDN或者其他什么网站的项目外包栏目看看,里面的需求,就是别人肯付钱的需求,自己试着实现一下,比较练技术。如果能卖出去,就表示技术练差不多了,可以凭这个项目经验找工作了。个人感觉,这个项目经验在找工作的时候,有时候比学历证书管用。


嗯,这里面有几点请注意:


1、不要做外挂!不要做***!不要去破解!这短期内能帮你赚钱,但长期看,相当于自己封杀自己这辈子到达程序设计巅峰的机会。靠偷东西,是没有办法受人尊重的。就算以后赚很多钱,脑门上还是写了个“贼”字。


2、不要去评价对方要求合理不合理,他肯花钱,就是客户,客户永远是正确的。


3、不要去嫌钱少,你觉得你已经很努力了,用了很多技巧,用了很多技术,但是,你干的活,对客户产生的价值,就只有那么点。


4、有些太大的需求别怕,比如20000做个带VoIP的IM软件之类的,那明显不是给你的,是某些人,希望做套IM系统,但又舍不得花钱,希望用这点钱,诱惑某个正在做这个IM软件公司的员工,把公司的源代码偷出来卖给他的,这是一种诱惑,算是引人犯罪,别理他,堂堂正正地做人,比什么都强。


5、别怕别人的回复,很多人回复,说是什么什么的成熟团队,其实可能就做过一两个项目而已,你找几个朋友也可以,尝试给客户发发电子邮件,低调一点,慢慢谈,刚开始甚至免费做,就期待对方给你一个机会。只要做过,你已经赚到项目经验了,已经获得很多了。


6、不要想着一个人做事,有人看见一条自己合适做的,激动万分,生怕别人知道了,恨不得这条消息马上下线,免得有竞争对手,其实,有竞争才有进步,找几个同学,一起做,你会发现,你的同学比你聪明的。学着欣赏他们,以后你就是项目经理。


7、不要气馁,千辛万苦做出来,对方客户一句话,不要,很正常,市场竞争就是这样,千万别跳楼,自己再来就是了。大不了重新来过,怕个P啊!


8、用心做事,既然做了,目的就是卖钱,不是过家家,不是开玩笑,用尽全部心思,让客户买单,不管最后结果如何,只要你做了,就问心无愧,而且,你会发现这个过程给你带来的,比你卖的钱要多得多!


9、最后一条,如果你赚到钱了,有低年级的小弟,请教你如何赚钱,把我这篇文章推荐给他,这不是培养竞争对手,是把软件外包这块市场越做越大,钱是赚不完的。帮别人就是帮自己,以后你做项目经理,如果你手底下的技术骨干是你这么培养起来的,你说轻松不?


修炼编程的内功


肖舸老师


这也是一直想写的一个话题。近期,在坛子里也回复了一些帖子,感觉同学们在这方面认识也有一些偏差。干脆就写一篇吧。这里是两篇同学们的帖子,大家可以参考一下。


老师,给有点迷茫的学生一些指导吧,谢谢谢谢谢……杰杰 2009-06-02 04:12 http://student.csdn.net/space.php?uid=46110&do=thread&id=1840


也来出道题郭晓 2009-06-03 23:26 http://student.csdn.net/space.php?uid=54179&do=thread&id=1921


(特别注明啊,在郭晓同学的题目中,肖老师被狠狠地鄙视了,呵呵。)


还是那句话,一家之言哈,欢迎拍砖。


很多年以前,我还是一个学建筑的学生,但是很喜欢学计算机。不过呢,由于专业限制,我没有计算机用的。学校只开了一个学期的Fortran语言,上机时间只有可怜的5节课,那会把我憋坏了,呵呵。


大家不要笑啊,90年那会,生活不富裕,PC机还是一个很贵的东东,一般家庭都还停留在18吋电视机的时代,大学生又是最穷的,物质条件更为匮乏,我当时有个小收录机,京华牌的,呵呵,在同学中已经很牛叉了。因此,像现在的同学们,一考上大学,MP3、MP4、笔记本电脑家里给配齐的,在当时是根本不可能想象的事情。我作为过来人,还是要说大家一句,大家真是生在好时代了,很幸福的。


不过呢,我很喜欢编程,就养成一个习惯,想象编程,找一个题目,自己在脑子里把程序构思出来,写在纸上,然后自己模拟电脑的run,把程序过一遍,看能不能执行正确。这个习惯现在都还有。呵呵,我老是劝大家写简单的程序,其实和这个习惯有很大关系,因为我比较笨,稍微复杂的程序,脑子就想不过来了,就晕了。


也正因为有了这个经历,我就开始思考一个问题,编程究竟是什么?呵呵,当时我在学校,也是小有名气,大家都知道有这么个程序疯子,没事喜欢发呆,喜欢想程序。在一次舞会上(别激动,我也是过来人,也会跳舞的,虽然很难看哈,呵呵),一个计算机专业的师姐就考我,问我编程是什么?


我当时想了一下,很郑重地回答她,我的理解,编程就是拆解任务,把一个任务,拆解成很细很细的步骤,一步步教计算机去做。计算机很笨的,举个例子,我们说早上起来去上课,是个人都知道做什么,但是它不知道,因此,我们要告诉它:


起床--穿衣--拿饭盒--去食堂--买早饭--吃饭--洗饭盒--回宿舍--放饭盒--拿书--出门--如果人都走完,要记得锁门--去教室--推门--找到自己的座位--走过去--坐下来--等待上课--上课。


说到这里,我突然自己有点明悟了,编程,就是把复杂的问题简单化,简化到每个动作都是1+1=2那么简单,然后计算机照做就好了。这就是我理解编程的真谛。我师姐听到了,也若有所悟,这个话题就没有再说了。


我们来分析一下计算机的特点,准确的讲,目前我们这个社会的计算技术,还很原始,说它是计算机,正确,它确实只能计算,说它是电脑,太抬举它了,它不可能有思考能力。


在冯诺依曼体系架构中,计算设备就是具有一定计算能力,有能力和外界做出IO互动,并且能高速重复动作的这么一种设备,这可能和大家在教科书里面学到的不太一样啊,不过,我是这么理解的。


因此,我从一开始,就没有把计算机作为一个伙伴,一个可以帮助我出主意,或者代替我思考的伙伴,仅仅是看做一种工具,这种工具有什么用呢?我认为它最重要的,有两个作用:


1、无限可重复性,一个动作序列,一旦编订程序,计算机就可以无数次重复这个序列,不会感到累。这特别适合于那些乏味的,不断重复的劳动,比如,我们一个学校每天要敲钟,打上课铃,如果让人来做,这个人会很乏味,做久了,就可能出错,但是让计算机来做,它可没有什么思想,不会觉得累,而且做的很好。计算机特别适合做重复性工作。


2、服务品质的稳定性。计算机适合做重复工作,还有个有点,就是每次执行结果都是一样的。这体现了工业化时代最重要的一个思想:量产思维,大家可以看到,现在的社会,不可重复的艺术固然很好,但公众需要的是量产的产品,因为质量稳定,产量稳定,能满足大众需求。劳斯莱斯虽然很美,但绝大多数人在开大众、丰田等低端车。就是这个道理。还是打铃那个例子,如果是人,可能会生病,可能会请假,或者干脆搞忘了,但计算机不会,只要有电在正确工作,打铃就不会出错。


这样,我就慢慢理解到了,计算机其实就是能以恒定品质不断重复输出服务的机器而已。


ok了,这我们是不是可以理解到,计算机编程,其实首先是人的工作,当我们遇到一个服务需求,我们人来做一次,嗯,获得一个比较满意的结果,然后我们觉得这个动作可以重复,下次遇到类似的问题,照做就好了。于是,我们就安排计算机来做这件事了。是不是这样?


这是不是说明,程序,其实是在讲一件事应该怎么做,这个做的过程,以及这个过程的含义,其实是人定义出来的,然后通过编程,教给计算机来做而已。


我以前经常有种感觉,计算机编程,是两层意思,一层,是程序本身的含义,就是怎么做事,另一层,是隐含在程序下面的逻辑含义,就是做事的意义,程序只是字面上的意思,而逻辑,是程序段落组合起来,共同表述的一层意思。现在想想,其实就是这个道理。


嗯,既然我们知道,编程,就是把做一件事情的步骤,分拆开来,教计算机去做,但,分拆到什么粒度呢?这个很重要。如果分拆的粒度太细,白白浪费程序员的时间和精力,这些都是成本。而分拆得太粗,计算机还是弄不明白,做事不对,就是bug了。


这说明,编程有个很重要的概念,就是粒度,也就是我们对问题描述的精细程度。


最开始的计算机是最笨的,学过计算机组成原理的同学大概知道,只要有个累加器,其实已经可以算一台计算机了,只会做加法计算。因为从数学上,我们可以知道,任何计算,最终都可以演化成加法计算,事实上,现在的CPU,在最底层核心的部分,也还是这个加法逻辑。


这样做当然没什么不好,不过,有个小小的问题,就是粒度太细了。如果每件事情,都要程序员去拆解成很细的加法计算,这个工作就几乎不是人干的事情了。难道就无解了吗?


呵呵,前面我们说过,计算机的特点是什么?无限重复,大家就发现,一个事情,比如7*24,这是乘法计算,但是,我们最终要拆解为加法计算去实现,但是,不是说我们每次都要这么拆解,乘法计算也是一个工作,有规律的,因此,当我们拆解一次之后,我们当然可以把这次拆解过程本身,编订为程序,下次遇到类似问题,让计算机把这个程序再跑一遍就ok了。呵呵,大家以为Intel的CPU里面的乘法计算指令是怎么实现的?大家又以为AMD的CPU内部的微代码体系是怎么实现的?


就是这么一个思维,解决了所有的问题,遇到需求,首先拆分,然后不断检索我们以前是不是以前拆分过了,遇到能套用的程序段落,就直接用,不用每次都拆分那么细,减少工作量,当然,遇到新问题,还是需要自己拆解的,不过,拆解后,最好把拆解本身,也写成程序,下次重用。


大家玩各种语言,一般都提供基本库,这个基本库,其实就是前人已经拆解过的结果,软件公司觉得有代表性,可以满足大多数应用场合,就编订到基本库里面,以后程序员直接用,不用自己重复了,大家说是不是这样?


现在,大家知道怎么看待C的stdio.h,stdlib.h这些基本库了吧?C++的iostream是什么含义,知道了不?MFC知道了不?Java的运行时库是什么意思,也知道了吧?


不过呢,这个世界的需求总是很多的,并且,计算机的能力也是不断在进步,以前不适合计算机做的事情,现在也慢慢变得适合了。因此,大家总能遇到一些新问题,需要自己重新拆解,基本库中没有提供,这就是程序员这个职业存在的真实含义。帮助用户不断拆解新需求,解决新问题。当然,库本身也在进步,不断把已经被证明拆解成功的问题,修补到库中,避免以后的程序员做重复工作。就这么简单。


呵呵,啰嗦了这么多,可能很多同学看的一头雾水,肖舸老师你到底想说啥?


我想说的,其实很简单,编程序,就是拆解问题,但讲究个拆解的技巧和方法,以前人做过的,别做,尽量用,没有的,做过一次,尽量保留下来,供下次使用,就这么简单。


那,这和本文的题目“修炼编程的内功”有啥关系呢?


当然有关系了,什么叫编程的内功?我的理解,就是对这个世界的抽象化理解能力以及描述能力。一个工作,能迅速从中提炼出下次可以重复的套路,并且能以一定的规则,就是计算机语言规范,描述出来,拥有这两个能力,就能保证遇到任何问题,都有办法写出程序来。


所以,大家学校中学了很多数学,语言,算法,数据结构,甚至编译原理,操作系统,其实这些统统是工具,不是写程序的目的。


写程序,就是遇到需求,能迅速抽象,理解其共性,并能以清晰的语言描述出来。上述学科,不是帮助提升你的抽象能力,就是帮助提升你的描述能力,大家看是不是这个道理?


所以,我在带徒弟的时候,有时候喜欢说一句话,其实作为程序员,学习一点语文有好处,因为最能培养描述能力的,其实还是语文。英语不算啊,英语虽然也是一门语言,但中国的教育,一般是能看懂,很少从一个英文文学家的角度培养学生用英文的描述能力。只有我们的语文课,这不但是教语言,而且通过无数次造句和作文,在教大家描述问题的组织能力,这个能力在写程序的时候,很有用。


这个时候,话题就出来了。中国的语文,先是甲骨文,然后古文,然后白话文,大家发现没有,总体是越来越简单,这是发展的趋势。为什么呢?因为大家觉得,语文就是让人懂的,太深奥的东东,不太适合普及,就没有生命力,反而越简单的东东,普及越快。


因此,请大家注意,写程序时拆解,是把问题简单化,不是说把一个问题描述得晦涩难懂,才叫本事。真正的程序高手,都是简化问题的大师。


当然,从这个话题,我们是不是可以得出一个结论,其实写程序的方法本身,编程的内功本身,其实是没有什么语言特性的,C、C++、Java、PHP、Python。。。是不是都用的同一种方法在做事情?


因此,我这里提出,修炼编程的内功,是学习抽象能力和描述能力,与语言无关,换而言之,从任何一门语言入门,都可以修炼到内功的极致,关键看你用不用心。


因此,学习期间,我的建议,不要好高骛远,不要去评价语言的好坏,平台的好坏,没有多大意义的,你并不能确定这辈子最终能在哪个平台下用哪种语言开发。捡着手边有的书,老师教的课程,埋进去学扎实,出来后,换语言比吃盘菜也难不倒哪去,呵呵。这算是正式回答杰杰同学的问题。


再说一下郭晓同学的问题。他列了一个很偏的题目,就是有两个变量a和b,不用if、?:、switch或其他判断语句,找出两个数中比较大的那个。


这个问题,我不认为是个好问题,因此提出异议。主要的原因就是基于上述的讨论,我认为评价一个程序员好坏的标准,应该是考察其简化描述问题的能力,而不是把问题复杂化的本事。


这在学院派里面很多,这里大家可不要生气啊,我知道大家现在基本上都是大学学计算机专业的,算是学院派,但肖老师我的实战出来的,看法很多都和大家不一样。


学校里面,老师的任务是把尽可能多的东东教给大家,因为他不知道以后你做什么工作,哪些知识没用,因此,学校老师会尽量培养大家描述复杂问题的能力,这就造成了,学校里面的考试,是尽量把问题复杂化,多考察大家几个项目。学校里面的风气,也认为能解决复杂问题算高手,甚至问题本身不复杂,大家把它造复杂,来考核自己的能力。


但实际工作中不是这样的,实际工作中,大家最看重的是能用最简单的办法解决问题的能力,因为这样成本最低,无形中,大家赚钱最多。所以,对问题的抽象拆解和清晰描述非常看重。


很多同学刚刚上班,会很不适应,其实就是这个思路的转换。学院里,以复杂为美,而商业公司中,以简单为美。这应该是一个很大的思想转变,甚至是世界观的改变,很难的。一般转的比较快的同学,在公司里面进步就比较快,但我也见过工作几十年了,还是没有转过来的程序员,一般在公司里面活的就比较累一点。


建议大家好好思考一下我今天的提法,看问题抓本质,只要能及时理解商业公司的开发思路,理解简单这个要素,我不敢说大家一定能找到工作,但只要找到了,在公司里面,基本都能快速融入公司。


呵呵,先说到这里,好累。大家有问题,欢迎探讨啊。


简述C和C++的学习历程


肖舸老师


总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。


一家之言,欢迎拍砖哈。


1、可以考虑先学习C。


大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。


C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。


毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。


因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。


2、学习C的过程中,一定要理解结构化编程思维。


为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。


这是现代工程化开发的核心和灵魂。


因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp内部私有变量的差别,其使用原则,这些都能学到很多结构化开发思维。


3、开始学习C++


C++不难学的,很多人觉得C++难学,其实是因为它在C之外,又提供了很多的概念,尤其是对象,很难以理解。


不过我经过这么多年,把这个问题反而看淡了,我认为面向对象相对面向过程,仅仅是结构化程序设计的一个具体体现,是编译器提供手段,强迫程序员必须遵循数据私有化的一个实例,C++和C的关系,最核心的莫过于此。


现在我们回到C再看看,如果我们把一个全局变量,写到一个cpp里面,并且在对应的h文件中不声明,它是不是就只有这个模块可以使用?它是不是就是私有变量,以这个理解,类能明白了吗?


4、学习C++的深入技巧


C++在类的基础上,经过这么多年的发展,其实提供了很多深入的概念,看起来很复杂,其实我看也很简单。比如模板,我的理解就是“类的类”,大家说是不是?


既然模板理解了,STL,ATL这些,静态模板库,动态模板库,还难理解吗?就是一大堆类的类,可以借此实现很多应用中需要的类,不需要程序员再自己写而已。


ok,STL都理解了,泛型开发还难吗?所谓泛型开发,其实就是我做一个模板,来定义一套算法规则,但是呢,我希望这个算法规则,能进一步抽象,对核心数据类型不要限死,我把各种数据套进去,都可以用,这样,仅算法这部分,我不需要重写了。你想想是不是这个道理?


学到这里,C++和C,其实已经差不多了。再学语言,就是求全责备,过于钻牛角尖了。


5、学习应用开发


前面说了,学习语言,目的不是让别人认为自己是专家,是为了写程序赚钱。因此,语言学完,要学习应用开发。


什么叫应用开发呢,我会一门语言,但是,客户不懂,客户说的很直接,在Windows下给我写个程序,我要什么什么功能。为啥Windows呢?因为我习惯。


OK,很多时候,应用开发要尊重客户习惯,一般说来,语言这个东东,还是要结合具体平台的开发,才能开发出有意义的应用程序卖钱。那么,一般说来,客户端是Windows系统,服务器是Linux,这些都是行业习惯,嵌入式不好说,各种平台都有,Palm,S60,Linux,WinCE,等等。要根据自己的目标客户来定。


当我们选定目标平台后,有一个问题,选什么语言,很多时候,学生和商用程序员差别就在这里,学生一般没得选,自己会啥就用啥呗,企业里的程序员不会,要先评估需求,看哪个语言更合适,不会的语言,要去学。


ok,假定我们选了C和C++,那么,我们需要选择开发平台,Windows下不用说了,VC,这是最好用的,Linux下呢,gcc,其他的也差不多。


假如我们开发VC,并且使用C++,这个时候,才需要考虑学习MFC了,因为这是微软的标准类库,至少Windows平台下,它最权威,你看见没有,我们从学习开始,走了多少步,才走到MFC?是不是MFC不是学习C++上来就必须学的?


6、学习MFC


学习MFC,很多人一上来就开始看其体系架构,看得一头雾水,那个模块关系依赖图,我到现在都看不懂。


呵呵,其实不是啦,和学语言一样,我们学MFC的目的,也不是希望成为MFC的专家,而是要利用MFC开发Windows应用程序,为我们赚钱。看见没?MFC是手段,不是目的,目的是开发Windows程序。


其实Windows下,有一套很标准的C接口,叫Win32API,这个才是Windows的标准编程核心,因此,学习MFC,真实的目的是理解Windows程序开发,建议可以先学习Win32API,看来我们又回到C了哈,呵呵。刚开始学C有用吧?


7、Win32API


其实Win32APi不难学的,因为虽然它很大,有很多接口,但不是必须的,我们真正做个简单的Windows应用,其实用不到这么多的。做个简单的Dialog,然后实现个功能,你遇到的接口函数,其实绝大多数,就是以后常用的了。把常用的记熟练,就ok了。


关键是,这个时候要通过WinMain方式,去理解Windows的事件机制,这是核心,其实说起来简单得要死。就是以前你的程序,由于没有系统支撑,很多事必须自己做,比如检查鼠标和键盘输入,你需要写个死循环,自己不断去看,而Windows说,这些事你不要做了,我来做比你好。你没事就玩去吧,我把和你相关的消息放到一个队列里,就是你的事件队列,你自己没事去找找看,有没有新消息来,有就做事,没事就玩好了。很简单是不?


     当然,Windows是多任务操作系统,有时候,我们的逻辑需要并发一些功能,比如说,我在等鼠标键盘消息的时候,需要再看看打印机准备好了没有,这里就需要理解并行计算了,这和语言无关,和操作系统无关,这是另外一个话题,这里不多说了,你可以自己找找线程开发的相关资料看。


看见没,为了学习好Windows编程,其实我们不仅仅需要学习语言,还要学习操作系统,并行计算原理,内存原理,可能有时候还需要学习网络通信,等很多知识,所以说,单凭学习语言,是成不了商用程序员的,一个合格的程序员,需要理解的东西,太多了,要广为学习。


当我们把Win32API,以及基本的窗口化程序设计理解了,就可以回到MFC继续学习了。是不是有点递归返回的意思?呵呵。


8、回到MFC


原来学MFC很难的,因为其封装了太多细节,很难理解透彻。不过还好,我们有侯老师的深入浅出MFC,去找本来看看,如何从Win32API的纯C编程,改变为MFC的C++方式,看这个最快,基本上前6章看完,已经会了,这里我就不多说了。


9、COM


COM、COM、COM,我最头疼的COM,呵呵。


COM就是一种远程过程调用,即你请求的代码是在另外一个进程中运行的,通过某种通信协议来回传递参数和结果。仅此而已。DCOM进了一步,服务者可以在另外一台计算机上。在公司开发中,大家可能各做一块,如果要合作,Windows下建议多使用COM。(我个人喜欢socket通信哈)


简单说,COM提供了一种机制,可以跨进程通信,甚至跨机器通信。不过,为了传递各种类型的参数,COM可谓是无所不用其极,它发明了智能指针,可以指向任何类型的数据,同时,为了实现智能指针,它使用了大量的C++泛型设计,看见没,C++的基本功就起作用了,还用到了ATL。


学习COM,要注意一个接口的概念。由于开发者是不同的人,调用程序和服务程序,可能不是同一种语言,OK,不能简单提供一个C或C++的.h文件来解答接口,因此,COM提供了标准接口,使用者在程序内部,以查询方式获得可用接口,进而以接口ID调用。很累人的。


学会了COM,就可以多理解一点ActiveX了,那么再学习一点dll(动态链接库)的知识,我们就已经可以写OCX控件了。一般说来,OCX控件是个很好的设计,哪都能用,一个软件的模块,最理想是开发成这个样子,比exe灵活。


10、没了。


按少林派说法,学了上述这些,其实已经算打过18铜人阵了,已经可以下山助明主,扫奸佞,扭转乾坤,解万民于倒悬了。


不过,关键是你通过上面的过程,是不是已经学会了学习的方法,再遇到新的东东,是不是已经不难学了?这大概就是武学中的悟性了,有了这个根基,以后只要慢慢修炼,估计20年后,可与天下英雄一较短长了。


呵呵,你说是不是?


呼呼,好累。


这么多技术我该怎么学


杨中科老师


一、这多东西啥时候能学完?


现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统平台有unix/linux,windows系列;开发工具有VC、VisualStudio2008、Eclipse、NetBeans等;每个大平台下,还有很多的的方向:如网络、数据库、脚本、HTML、动态网站、游戏开发等;有人还在学Dreamweaver做网页、Flash做动画、Photoshop做美工、3DMax做三维动画…………是的,我们什么都想学。恨不得把所有的知识统统都塞到肚子里去。看到什么,想学什么!


今天看这VC的书,明天又看Java,后天又看C#,东搞西搞!看到别人做网页。自己兴趣了来了。好,学html语言,我也做网页,听说做网页要会“网页三剑客”,所以又想学Dreamweaver、Flash。后来开始知道有JSP、PHP、ASP.NET做动态网站这玩意儿。也想去学,学学学……


这是几乎所有在校大学生的通病。但是,这不是坏事,甚至可以说是好事。说明了你“求知欲”高!总比那些,生活没有激情,整天知道泡妞、上网、打游戏、混日子的强。


但是如果你今天想学这个,明天又想学那个。这样你就能永远徘徊在技术的门外。很多人都有过或者正在经历这样的苦闷日子:总觉得有“太多东西”要学了,然而人的精力是有限的,总有永远学不完的感觉,所以心理特别急,整天惶惶不可终日,不知道先要学哪个,一会儿拿起这本书,一会拿起那本书,折腾了几个月,突然发现自己什么都没有学到……


每一个大方向如果没有上几年的学习,很难能学习出什么来。但程序设计的最根本的东西是相同的。所以我们学习要抓根本。俗话说:通一理,融百里。


学程序设计就像习武一样,如果内功学的好,其他功夫就很容易上手。君不见《倚天屠龙记》中的张无忌练了“九阳神功”8年,练“乾坤大挪移”只需12个时辰吗?


习武之人,谁不想在“江湖”上扬名立万,谁不想成为万人敬仰的大侠?大侠之所以能成为“大侠”,当然有他们的看家本领。狄云的“神照神功”,金世遗的正邪融合的“乔北冥内功心法”,张无忌的“九阳神功”,段誉的“六脉神剑”,令狐冲的“独孤九剑”,哇,太多了...


古人历经千辛万苦才能找到这些“武功秘籍”。我们现在这些后辈,比起古人来说:简直太幸运了。去书店,各种各样的心功心法,剑法,拳法,应有尽有,看得你眼花缭乱...


      你选什么呢?今天练“六脉神剑”几式,明天去学“降龙十八掌”几招,后天又去练“发暗器”,这样何时才有个尽头呢?你说,你什么武功都会,但是“形似而神不似”,不得要领,不够火候。一上擂台,就被别人一掌打趴了。试问哪个软件公司敢要一个号称任何编程语言都会,而是每种语言只能写出个“hello world!”的程序员,你不被人家扫地出门才怪。


二、学**还是学**更有前途?


看了上面的话,有的同学已经开始烦了,“知道了知道了,不止一个像你这样的所谓的‘老前辈’跟我说过‘学什么都一样,思想才是最重要’的大道理,可是你们站着说话不嫌腰疼呀,现实是有很多技术需要学,比如做Web开发就有JSP、PHP、ASP.NET等好多方向,我总得选一个吧!到底学哪个有前途呢?我必须要选择一个有前途的,选错了就麻烦了。”


其实像“学**还是学**更有前途”的话没意义,因为“选择JSP还是选择PHP”的前途的差别不像“选择英语还是选择日语”的前途差别那样大,不存在“选错方向”的问题,因为都是相通的,你也不能保证你毕业以后搞的就是你学的那个方向,更不能保证你靠你学的这点东西就能吃一辈子。比如我上大学的时候一直在钻研是Delphi语言,可是毕业校园招聘的时候我照样在Java职位的考试取得了第一名,而且工作以后经过简单的学习就掌握了Java语言,并且后来还写了三本关于Java语言的书;再如我毕业后两年多的时间一直在用Java开发,后来公司要做一套基于.NET的产品,我只用了一个礼拜熟悉了.NET体系以及C#的语法,然后就开始进行开发。


不过就像上边说的“做Web开发就有JSP、PHP、ASP.NET等好多方向,我总得选一个吧!”这个问题是非常实际的,因为只有先学一个才能深入这个方向,把这个方向学通了才能想以后“一通百通”。因此我的建议就是学校教过什么语言,你就继续深入学习这么语言,而不要去问“这么语言有没有前途”这样的傻问题。尽量不要去学一门所谓“有前途”的新语言,因为你去学一门新语言就要把很多精力耗费在语言、语法本身,而耽误了编程的实战,而以一个已经学过的语言来学习的话,起码语法本身不用再去学、开发工具本身不用再去熟悉,只要研究怎么使用这门语言开发有用的程序就ok了。比如大部分同学都学过C语言(有的学校直接开了C++的课,但是C++的面向过程编程部分还是C语言),所以咱们就开了《C语言也能干大事》的课程,让同学们把精力放到学以致用上,而不是学“有前途”的新语言上,这也是这个思想的一个体现。


举几个例子。咱们如鹏网的《计算机专业职业发展测评系统》是我用PHP开发的,但是在这之前我从来没写过PHP程序,但是我以前写过JSP、ASP的程序,因为写网站程序的原理都是相通的,只是语法不同而已,因此我只用了几个小时的时间熟悉了开发PHP用的工具并且快速浏览了一下PHP的语法,然后用半天时间就开发出了这个测评系统。想像一下一个整天在今天学JSP,明天学ASP,后天学PHP,大后天仰天长叹“到底学哪个有前途”的人能用半天时间学会一门新语言吗?


我大学时有一个同学,他看我当时Delphi学的比较好,写了很多程序,他就说他也想学软件开发,让我教他Delphi,可是我们专业前一个学期已经开了PowerBuilder的课,因此当时我就建议他还是继续深入学习PowerBuilder,用PowerBuilder写又实用价值的东西,而不是像上课那样写HelloWorld的程序。当时Delphi还是如日中天的流行的编程语言,而PowerBuilder则市场占有率比较小,他就说不想继续学PowerBuilder,因为PowerBuilder没前途,我就给他讲了“一通百通,从自己最熟悉的入手”这个道理,然后他就踏实的深入研究PowerBuilder起来,到了毕业的时候他已经能用PowerBuilder写非常复杂的程序而且还学习了用PowerBuilder写Web程序。毕业后没多久就应公司的要求用Delphi写程序,他只用了不到一周的时间学习了Delphi,然后就写出了一个符合公司要求的系统,当时他就给我打电话向我报喜。前一阵子我听说他已经开始指导一些新员工用Java开发一个中型规模的企业级系统了。可以说他的成功就得益于“一通百通,从自己最熟悉的入手”这个原则。


总结一下,不要管“哪门语言好就业、有前途”,因为那些“好就业、有前途”都是纸老虎。尽量不要学新语言,从自己最熟悉的语言入手,深入研究,出山后你就是被用人单位争抢的红人。


三、企业里都需要什么方面的才能?


这个要视用人单位的要求而定了。你现在还没有毕业,也不知道未来要面对什么样的岗位。因此建议大家在上学期间不要偏科,所以的课程都要好好学,学好专业课,培养自己的“内功心法”,然后进入一个大公司,那么大公司自然会为你安排一个人才培养计划,在工作的环境中学习就更有目的性。


简述如何书写工程化的简单代码


肖舸老师


在坛子里混了这么久,看了很多同学的代码,感觉到大家的代码,学校里面的书生气有点重,对于细节考虑不够,有时候,感觉和吃了颗苍蝇一样,确实很不舒服。


这里根据我个人的经验,给大家简述一下,工程化代码,以及简单代码,不容易出错的代码的一些基本写法。


     1、工程化代码,首先考虑是团伙作案,独行大盗的时代已经过去了,呵呵,因此,特别强调“人”能看懂,很多教科书上给出的示例,一切以计算机能正确run为准则,写出的代码只有计算机能看,作者本人再看都要想半天,这不是好代码。


工程项目团队,很多时候都是大家合作开发,你的代码,可能使用者不是你,下一个维护者也不一定是你,与人方便,与己方便,当有一天你对着一堆看不懂代码大骂的时候,想想,从我做起,给别人点方便。


2、简简单单写程序,不是说惜墨如金,多敲一个字符都嫌累。


在Unix时代,没有显示器,都是电传打字机,编辑器也是行编辑器,因此,每多敲一行字,都是钱,再加上那会内存小,编译器能用的空间有限,因此,Unix的老程序员,对于变量名,函数名,标签,珍惜得很,很少用2字符以上的,这是历史因素,人家穷,小家子气。


不过,现在大家用的都是以G为单位的内存,液晶显示器,IDE又那么强悍,拜托,起名字给长点,有点表意性好不好,别一段程序写下来,满篇都是“你猜”两个字,看程序的人要疯。


3、注释,很多教科书,一说编程规范性,就是注释,好像这是程序易读的唯一方法,大学里面的老师,没见识过大型工程开发,没一次干过几十万,上百万行代码,这么说也是可以理解的。


不过,工程程序员,项目压力一般都很重,在开发时,所有的注意力都在如何实现需求上,很少有人能有闲心,有耐心,精雕细琢自己的代码,甚至,很多代码,都是交工前最后一刻写出来的,因此,要求详细注释,在工程开发中,实际上没有可操作性。


起码我自己都做不到,这就是为什么我特别强调命名表意,程序写短点。即使程序员没有注释,看字面意思,也能大致理解。这么说吧,看别人的工程代码,没有注释,是正常,有注释,是福气。


嗯,有时候是霉气,很多程序员,开发时写注释,后期出现bug,开始疯狂Debug的时候,那会哪有时间改注释哦,能把程序改对,都是烧高香了,最后,很可能注释和代码是反的,顺着注释看,顺理成章就掉坑里去了。


还是那句话,别期待注释,别全信注释,注意自己的程序,自身的表意性,至于你自己写不写注释,如果在我的团队里面,.h文件里面的公有函数和方法,一定写全,每个入口参数的含义,返回码的含义,越多越好,别人正确调用你的程序,bug就不会找你麻烦,这是为了你自己。至于其他方面,爱写不写,我不管。


4、再说简单,简简单单写程序,可不是说你惜墨如金,是说让读的人,感到简单,脑子里不转弯。这很好理解,我们做出一个产品,好不好,用户说了算,你的软件产品可能有特定的用户,但你的代码本身,也是产品,你的团队伙伴就是你的用户,大家可能听说过换位思考,我们写程序的时候,除了想象客户会不会骂娘,还有没有想想,以后读我们代码的人会不会骂娘?


团队中有规范,按照规范来,不要讨论合理不合理,先照做,大家养成阅读习惯,看代码就不难。


写代码,不要耍酷,年轻人,或多或少都有点爱表现自己的欲望,人之常情,可以理解,不过要控制。哪些为了一个算法的优化,绞尽脑汁,最后把三个变量节约成一个变量,把四重循环节约成一重,看似水平高了,可是,算法复杂度高了,看的人就晕了。


不想挨骂的话,老老实实的写吧。函数内部的变量,只要不是动态申请的,一般都建立在浮动栈上,随着函数的退出,就会自动拆除回收,给下一个函数使用。对象内部也差不多。所以,不妨多用几个变量,老老实实地写,不玩什么花样,看得人看得轻松,其实自己脑子也清晰,不容易出错。


武侠小说中,说越是大宗师,越不喜欢用奇门兵器,一路简简单单的太祖长拳,破尽少林寺七十二绝艺,这说明什么?把事情弄复杂,弄玄妙,不算本事的,能用最简单的招式,化解最复杂的问题,内力够了,自然可以。修炼内功,就是减少对招式的依赖,简单,直接,直奔要害。以最小的成本,获得最大的收益,大家说,是不是?


5、规矩,很多人,一说工程化开发,就认为编程规范很重要。于是开始找大公司的开发规范,于是,网上的华为软件开发规范,传来传去,大家奉为圣旨。谁要敢说半个不字,管杀不管埋。


规矩是人定的,每个人群,每个开发团队,都有自己的开发方向,常用工具,所以,编程规范其实是很小范围的东东,都是针对目前项目最有效的,很难想象,一个做.net的开发团队,拿着华为用gcc做VxWorks工程的编程规范,能做好事情。


什么规矩是最好的?我的理解,最合用的就是最好的。系统设计完成,开发之前,项目团队在一起开个短会,讨论一下规范,把大的几条定出来,之后就随着项目的进行,不断补充罢了。很多时候,项目经理也要尊重程序员的习惯,一个程序员用VC的IDE习惯,总不能为了写gcc,强迫大家都用vi吧。这里面有个个性化的规矩问题。


大家别不习惯,出去之后,走上社会,大家会发现,很多东东都是灵活的,不是一成不变的,很多人就在哭,这个世界太黑暗了。其实是自己不能灵活变通。项目组,有牛人,大家一般会跟着牛人走,他的恶习都可以变成团队规矩,这也合理,没有牛人,大家一盘散沙,就在接口处统一,里面程序乱点没啥,也可以,方法太多了,只要能出活,出来的代码,大家基本能看懂,其实就ok了。


像那种,还没做事,先说一大堆规矩,程序员学习规矩和习惯养成都要半天,这些,最后都是项目成本。江山易改,本性难移,做项目管理,何苦来和每个人作对,尊重一下大家的习惯,直接把习惯做成规矩,不是更好?


6、轮子,笔者生活中,遇到很多了,坛子里面喜欢拍砖的人,也不少,开口就说,这个世界需要依赖工具,自己造轮子的人是笨蛋。


这个话确实见仁见智。很难说对不对,不过,笔者建议,初学者还是少用别人的轮子。


大家毕业,走上工作岗位,还有几十年呢。谁都不知道这辈子是不是一定在某个平台,或者某种语言,某种框架下写代码。


一旦年轻时,习惯了享受某种框架的便利性,就很难深入思考了。那随着年纪增大,走向架构师岗位的时候,由于很多底层的特性思考不够,会后继乏力。我们说,出来混,总是要还的,现在享受了,但是,这辈子的债,总得换,到三四十岁再来重新学习研究,会很难的。


很多人大言不惭,一说就是框架,以框架搭建工程固然很快,但是,想想看,做框架的人,和用框架的人,哪个水平高?哪个收入高?其实很多时候,企业的架构师,就是针对项目或产品,为项目团队制定本企业合用的框架的。


学着自己写队列,学着自己写堆栈,再代入到实际工程中测试,做一些量身定做的优化,你的水平会迅速提升的。