第1章 程序猿 && 程序媛
1.1 装备篇
1.1.1 衣着
程序猿们通常并不在意穿着,整天西装革履的基本上都是销售人员。一般的程序员日常的穿戴通常都是牛仔裤和T恤衫,其中一个最主要的原因在于这种穿戴根本不用花时间去打理。牛仔裤很难用眼睛来判断已经多长时间没洗过了,除非你用鼻子靠近去闻一闻。T恤衫虽然比较容易脏,但是可以一次买7件,一周7天每天换一件,不同的颜色和图案还可以代表本日不同的心情。周一可以穿一件有熊图案的T恤,代表这一天基本上自己会比较“熊样”;周五的时候可以穿一件有鸟图案的T恤,代表下班以后自己就会比较“鸟样”了。或者可以在各种开源大会上领取免费的T恤,上面印着Ruby on rails,Eclipse什么的,让别人一看就知道自己是干什么的,这样小偷不偷,女孩不理,连狗都不咬。
有人说,这种穿着主要为了随意,或者套用时髦的话叫做“小清新”。但是我个人的感觉是,程序员在个人生活上好像都比较懒惰。如果既不想在衣服上花太多时间,又不想显得自己太脏,那么牛仔裤和T恤衫应该就是首选了。除此以外,程序员还有三宝:眼镜、胸卡、双肩包,再加上一头凌乱的发型,那100%是一个程序猿了。俗话说:“嫁人就嫁程序猿,钱多话少死得早”,看来程序猿这个职业在相亲市场上还是比较有吸引力的。不过如果一个程序猿不仅水平高超,而且衣着整洁、光鲜,那么各位MM就不要再打他的主意了,因为他可能已经有了一位贤惠的妻子。
资深的程序员或大牛通常一般都在家里工作,或者类似于家里的环境工作,所以穿着上可能就是大短裤和拖鞋了。说起拖鞋,不能不提到图1-1。这是一款程序员专用拖鞋,不经意间,它就暴露了你的身份,同时它还有脚底按摩的功效。
图1-1 程序员专用拖鞋
好的,如果召开一次运动会,那么下面这段话就是程序员代表队的出场辞:“现在向主席台走来的是程序员方阵!他们套着拖鞋,穿着短裤,披着毛巾,左手拿着键盘,右手举着鼠标,腋下夹着USB移动硬盘。他们头发凌乱,眼睛因睡眠不足而显得迷离,喊着微弱的口号走过主席台,主席问候道:“程序员们辛苦了!”程序员方队异口同声地答道:“Hello World!”
1.1.2 键盘和鼠标
虽然穿着键盘形状的拖鞋,但是你一定要知道,键盘是用手敲的,而不是用脚踩的。伴随着Windows等图形界面操作系统的流行,鼠标得到了广泛的普及和应用,以至于有的人由于频繁地按鼠标而得了一种名为“鼠标手”的关节病。苹果的Mac OS系统中自带的Spotlight可以让你很大程度上脱离开鼠标,如果想在Mac OS上启动Word程序,只需要利用快捷键启动Spotlight,在Spotlight上面输入wo,在出现的提示里面选中Word程序,然后回车就可以了。最新版的Window 8也在快速启动上下了一番功夫,它分别支持在应用程序中、设置中或者文件系统中快速地查找你感兴趣的内容。例如:如果想增加一个蓝牙设备,首先按Winkey+w,启动搜索功能,然后输入“蓝牙”,就可以看到所有与蓝牙功能相关的设置和操作了。
整个过程中,双手根本不需要离开键盘,所以效率会比较高。作为程序员,可以不考虑健康,但是一定不能不考虑效率,如果能把快捷键用得非常流利,那么无疑会大幅度提升你的效率。
为了减少用鼠标的次数,有些人坐到电脑前的第一件事就是把鼠标翻过来,让它四脚朝天。这样就强迫你多用键盘来完成以往用鼠标完成的任务,比如打开一个文件等。不过这只是训练的初级阶段,训练的高级阶段是在以往放鼠标的地方放一个仙人球或仙人掌,不仅净化空气,而且经过几声惨叫后,会对鼠标产生一种莫名的恐惧并终身彻底脱离鼠标。
如果想熟练地使用键盘,就不能不提到Ctrl、Shift、Alt三个功能键。这几乎是所有快捷键组合中必须要用到的。正确地按Ctrl的方法不是用小手指,而是应该用你的手掌。Shift键必须用小手指。然后就是Alt键,正确的方法是用大拇指,因为Alt键就在空格键的两边,所以大拇指往里弯一点,就可以够得着了。总结为一句话就是:“Ctrl用掌拍,Shift用小指按,Alt用大拇指抠。”用这个方法手不用移动位置就可以很方便地按住这三个功能键了。抱歉我对此方法的描述有点普通,不够文艺了。其实我也能够写得很文艺,比如说:“当日华山论剑,先是他用黯然销魂掌,破了我的七十二路空明拳;然后我改打降龙十八掌,却不防他伸开右手食指中指,竟是六脉神剑商阳剑和中冲剑并用,又胜我一筹。可见天下武功彼此克制”。这段话够文艺了吧,但是你能明白我在说的是石头、剪子、布游戏吗?
目前市面上常见的键盘有一个问题,那就是左右不对称,如图1-2左面的键盘所示,键盘左侧的三个功能键可以用前面提到的方法敲击到,但右侧的三个功能键却不行了。为了解决这个问题,生产厂家也推出了很多人体工学键盘,如图1-2中右面的黑色键盘所示。
图1-2 常见键盘(左)与人体工学键盘(右)
利用这种键盘的好处就是可以左右开弓,唯一的缺点就是由于敲击速度过快,会有噼里啪啦的声音,正所谓:“嘈嘈切切错杂弹,大珠小珠落玉盘。”
如果你只是一个电脑的普通用户,对键盘这个问题不用这么纠结。但是如果你是一个追求效率的程序猿,或者是在Linux下用Vim或者是Emacs这样的命令行编辑器的神人,一个布局合理的键盘才显得非常重要。关于Vim和Emacs,我们在2.4.2节会作进一步地介绍。
1.1.3 电脑
编程序不太需要很power的电脑。作为父母,如果有一天,你的孩子对你说:“我的电脑编程序的时候不够用了!”这个时候你一定要拒绝他。你可以这样对他说:“登月的阿波罗13号飞船电脑里面只有64KB内存,而你的电脑中有1GB内存,是它的1万5千倍,而你还不知足!”我知道的唯一非常依赖于硬件的一个软件就是游戏,非常有可能他是要更新电脑来玩游戏。作为程序员,电脑越破,也许水平越高。就像武侠小说里面真正的高手,都是不拿兵器的,或者飞叶伤人,或者隔空打牛什么的。当然了,你我皆凡人,不可能用家里的固定电话就编写出一个程序,所以电脑还是需要一个的。我的建议是主流配置偏下就可以了。如果你很看重便携性,笔记本当然是必不可少的,买一个主流品牌的就行。现在的电脑价格已经不是太贵了,如果还想省点,DIY或者是二手的都可以考虑。如果程序真的运行很慢,在更新电脑之前,先更新一下程序的算法试试!
有些同学不差钱,喜欢买一个强悍的电脑,希望能在开机速度上击败全国99%的电脑,但是自己的起床时间却输给了全国99%的同学,这也不是正确之道。毕竟,在软件领域,最有价值的是人,而不是机器。乔布斯就算拿一个破不锈钢饭盒子,也会被人认为是iPad又出全金属加厚版本了,你说是不是?
电脑可以破点,不过如果有可能,最好买一个好一点、大一点的显示器。现在笔记本都支持外接一个显示器,好一点的台式机显卡也都有两个输出接口,支持连接两个显示器。两个显示器的好处在于,你可以一边写程序,一边查看相关的帮助文档。现在任何一门语言都有非常丰富的库,要记住这些库的全部细节是不可能的,所以必须能够随时查找到相应的定义、说明、例子等。这样,两个显示器可以帮助你减少很多窗口切换的时间和操作。
不过凡事都有个度。一般两个显示器也就够了,如果像图1-3中那位妹妹整三个显示器,玩飞车或看电影比较爽,开发软件有点浪费了。
图1-3 三个显示器并用
1.2 程序猿和互联网
虽然你可以对电脑的硬件要求不高,但是对另外一个功能还是应该严重关切一下的,那就是联网功能。最方便的联网方式无疑就是3G联网方式了,可以做到随时随地上网。我在北京上班的时候,地铁车厢里有时会有人拿着笔记本通过3G在上网。因为我还没有忙到这种程度,所以一般我在地铁上经常干的就是防范小偷、应付要饭的、还有偷眼看看周围的美女。
有了互联网,就有了一个巨大的宝藏,你需要了解一些知识,同时还需要能够利用一些工具从这个巨大的宝藏中获得你需要的信息和资源。本节的“搜索引擎”、“夺宝奇兵”分别介绍了一些常见的在互联网上发掘宝藏的知识和工具。同时,互联网也是一个社会,只不过在互联网的社会中,我们用假名说真话;而在现实社会中,我们用真名说假话。既然是一个社会,你就需要和别人进行联络和交流,也需要在互联网上交朋友。互联网是一个大舞台,不仅可以看别人的表演,还可以亲自上台表演。下面的“通信”、“社交”、“论坛与博客”小节分别介绍了相关的内容。
1.2.1 搜索引擎
在学习的过程中,别忘了还有一位时刻陪伴你的很好的老师,他的名字就叫Google。对于将Google翻译成“谷歌”,我一直耿耿于怀,就是搜点东西,装什么大尾巴狼呢!就应该叫“狗哥”才对。狗狗就是搜得准,称兄道弟的还显得亲切。而且,最重要的是,贱名好养活!要想在中国出人头地,必须要领会老子、庄子和孙子的精神,简称“老庄(装)孙子”精神。Google不懂得中国文化的博大精深,难怪在全球市场上如此成功的明星公司,最终没有在中国市场占据第一。
Google上的所有服务,包括搜索引擎,都是免费的。真正支撑起Google大厦的就是搜索结果网页上的那个Google广告条。你还别不信,就那豆腐块大小的文字,就是Google的聚宝盆,给他带来滚滚的财源。
当然,这背后其实蕴含着一个自动、高效、准确的广告投送机制。内部的原理非常简单,那就是姚明绝不会利用Google来搜增高鞋垫,所以Google也不会把增高鞋垫的广告发到姚明的电脑上。原理虽然简单,但是实现起来也蛮复杂的。就像我们都知道飞机能飞的原理,但是真要造一架飞机,却不太容易。
我不清楚Google没有赚到钱的真实原因,也许是国人都不太愿意相信别人和广告,也许是因为有大量黑客控制“肉鸡”去骗取广告点击等。总之,与另外一家主流搜索引擎相比,Google的本土商业化比较失败。虽然商业化失败,但是搜索结果的质量还是很高的。对于另外一家中文主流搜索引擎,有两点必须承认,第一,它并不支持英文检索;第二,它支持竞价排名。对于这个我不想多说。在这两点上,Google与它做的正好相反。
作为一名老师,我在第一堂课就告诉我的学生,有问题问我,我不会,再去问谷老师,或者直接问谷老师也行。因为绝大多数时候,你问我的问题我也不会,我都是再偷偷地去问谷老师才得到答案的。所以说,大家都要养成一个好习惯,那就是“内事不决问老妈,外事不决问Google。”
利用Google搜索貌似简单,只要在搜索框中输入查询字符串就行,但是如何构建高质量的查询字符串还是需要一定的技巧的。利用Google搜索时,需要知道一件事,所有的搜索引擎后台都是机器,不是人。例如,如果你看上某个女孩子,不过人家一定要在宝马车里面哭。这个时候,你一定想知道宝马车值多少钱?你可以输入查询字符串“养一个宝马需要多少米啊”,这个查询字符串和人说一点问题都没有,但是电脑却不懂。这倒不是因为搜索引擎很愚蠢,而是你有点难为人家了。
如果想高效地利用搜索引擎,我们需要遵循一个最基本的原则,那就是以网页撰写者的角度构建查询字符串。现在换个思路,如果让你写一个网页,来介绍宝马车的价格,你会怎么写呢?
很简单,直接写:“宝马车1234元人民币”好了。现在我们把思路换回来,如果让你查询这个问题,你该如何构造这个查询字符串呢?输入“宝马车 人民币 元”试试看!你会发现,结果非常地优雅,直中靶心。你会直接看到价格而不需要再继续点开结果网页,同时我相信,当看到价格后,你也不需要再去追那个爱哭的女孩子了。
如果有闲心和空闲时间,可以把这个查询字符串再输入到其他搜索引擎,看看返回的结果是什么。如果还有闲心和空闲时间,再试试这个网站“http://www.baigoogledu.com”,你会发现这个世界上像你同样闲的人还真的不少:)。
另外一点需要注意的是:构建查询字符串的过程一般是一个动态交互的过程。在构建查询字符串的时候,应该优先考虑简单的单词,避免使用比较复杂的查询句法和技巧,使用复杂的语法和一些高级的技巧会漏掉一些有价值的结果。即使简单的查询会返回很多噪声,也不用介意。构造查询字符串是一个动态交互的过程,可以通过开始返回的结果,不断调整查询字符串,或逐步使用一些高级的技巧来缩小查询结果。例如,想查找《天龙八部》这本书,输入“天龙八部”查询字符串的时候,返回的结果有很多是游戏方面的内容,这个时候可以调整查询字符串为“天龙八部 -游戏”来去掉不需要的内容。这里我要说明一点,并不是高级查询技巧不应该用,而是应该避免上来就用或者查什么都用。
这里我们只是简单地介绍了两条基本的使用搜索引擎的原则,如果想高效地利用Google搜索引擎,有一篇文章非常好,那就是http://www.hrbxinzhi.com/internet/resource2.html上的“Google搜索从入门到精通”,强烈推荐大家仔细研读。我个人非常喜欢的一个功能就是在特定文件类型中查找。这个功能很多时候非常有用,例如你可以用它来查找别人的学术论文,因为很多学术论文目前都是.doc类型的文件,这样你就可以构造“C语言filetype:doc”这样的查询字符串。
1.2.2 通信
互联网上常用的通信工具主要包括电子邮件和即时通信两种。
本书的读者一定可以很熟练地使用电子邮件了,要不然你不会开始学习编程的知识,所以我只对使用电子邮件提三点建设性的建议。
❖ 狡兔三窟
电子邮件目前已经成了网上的身份证,如果你只有一个电子邮件账号,并且利用这个电子邮件账号在很多网站上注册,那么你会饱受垃圾邮件的困扰。所以,拥有一个电子邮件账号一定是不够的。我个人通常使用三个电子邮件账号,分别为主力邮件账号、候选主力邮件账号和注册邮件账号。主力的和候选主力的服务商最好一个选国际的,另外一个选国内的。这样遇到国际线路不通的时候,至少保证有一个能用的电子邮件。除非到了世界末日,否则这两个邮箱总该有一个是可用的。
轻易不要在网上公布自己的主力邮件账号,用注册邮件账号,而不是用主力邮件账号去注册一些不太经常使用的网站。保持主力邮件主要用于自己的工作、朋友的联络和注册一些正规和大牌的网站。账号的名字最好用自己的姓名,这样也方便别人记忆。但是中国人的名字重复很严重,通常需要在名字后面加上数字,比如自己的出生年月等。不过一般女生不愿意暴露自己的年龄,就像男生不愿意暴露自己的体重一样,这个时候你也可以用你电话号码的后几位。
❖ 密码一定要长
安全的密码至少包含两种以上的字符,如字母和数字,如果能加上特殊的字符就更好了。有些人说复杂的密码有时候会忘掉,所以你应该选择一些对自己有特殊含义的字符来帮助自己记忆。
前一阵CSDN被爆库,很多用户的密码被公布于众,其中评选出最有创意的密码有三个。他们分别是季军:FLZX3000cY4yhx9day(飞流直下三千尺,疑似银河下九天);亚军:hanshansi.location()==[gusucity](姑苏城外寒山寺);冠军:hold?fish:palm(鱼和熊掌不可兼得)。另外有一些人的密码是暗恋人的手机号或者是姓名,被暗恋的人知道后,成就了好多对幸福的姻缘,可以说是不幸中的万幸。就像是一艘游轮沉没,对游客来说是没顶之灾,对游轮厨房中活着的龙虾来说,简直就是生命的奇迹!
❖ Gmail
为了管理自己的邮件,你还需要一个邮件管理程序。你可以使用本地邮件管理程序,例如Outlook或Foxmail等。Outlook等邮件管理程序设置比较简单,任何一个电子邮件服务商的帮助文件上都有详细的说明,教你如何配置。本地邮件管理程序的一个缺点在于如果你使用两台以上的电脑,那么你需要配置两次,而且两台电脑的同步问题也很令人讨厌。比起本地客户端,我个人更喜欢Web Mail这种方式。只要有移动终端设备,并且该设备能联网使用浏览器,你就可以收发电子邮件了,这多少有点“云计算”的意思。因为所有的邮件都在“云”里,所以也不存在同步的问题,两者的区别见图1-4。Web Mail也有很多对应的服务商和产品。我个人使用的是Gmail。
图1-4 Local Mail(左)与Web Mail(右)
上面说到也许你会有多个账号,你可以利用其他邮件账号的转发功能或者是Gmail的Import功能同时集中管理几个不同的账号,这样就不用分别去访问不同的邮箱了。那么,转发功能和Import功能具体怎么使用呢?问Google啊,要学以致用啊!
另外一种常用的联系方式是即时通讯,比较著名的有QQ、MSN和Skype等。目前国内以QQ为主,一骑绝尘,不过在国外QQ基本没有。如果你需要和外国朋友经常进行联系,那么Skype就是首先了。Skype支持网络电话功能,可以直接利用Skype拨打对方的电话,而且话费真的很便宜。
我个人在使用邮件和即时通信上各有侧重,如表1-1所示,你可以参考一下。
表1-1 邮件和即时通信的使用比较
这里说点题外话,那就是聊天的风险。Internet上有一个著名的漫画,那就是“在互联网上,没有人知道你是条狗”,如图1-5所示。俄国的契诃夫曾经说过“大狗有叫的权利,小狗也有叫的权利。”这里我借用这位大文豪的话,那就是:“大狗有上网的权利,小狗也有上网的权利。”
图1-5 在互联网上,没有人知道你是条狗
其实,这些话背后的含义就是:在互联网上,你没有办法确定和核实任何用户的个人信息。这种匿名性使得一些别有用心的人可以利用互联网来达到某些不可告人的目的。
也就是说,如果一个人花很多时间聊天,那么他的目的一定不是聊天来的。这句话有点绕嘴,但是绝对是真的。所以我强烈不推荐大学以前的孩子聊天。就算你长大成人了,我也不推荐你花太多时间聊天。我在最loser的时候,也疯狂地上网聊天。现在有了一份自己的事业,无论是大是小,都会忙得没时间聊天。这回你明白了吧!当然,我并没有说聊天不好,永远记住一句话,聊天只是工具,带给你快捷、方便,但是别沉迷于此。
1.2.3 社交
所有的社交网站背后,都有一个基本的理论,那就是六度空间理论。世界上无论任何人,你都可以通过区区六个人,和它发生关联或者产生联系,这也充分说明了人是一种社会动物,如图1-6所示。基于这个理论,互联网上出现了一类交友网站,通过这个网站,你可以认识朋友,还可以认识你朋友的朋友。请注意“朋友的朋友”这一点,通过这一点,你就可以不断地扩大你的交友圈子。
图1-6 六度空间理论
有一天我实在闲的没事干,想了想如何通过六度空间理论把我和美国总统奥巴马联系起来。首先,我和我们大学的校长聊过天,然后校长出访芬兰的时候,曾经受过芬兰总理的接见,再然后,我猜芬兰总理一定也和奥巴马见过面。你看,还没经过6个人,我就已经和奥巴马联系起来了,看来六度空间理论也并不是浪得虚名啊!
最先利用这一理念的是美国的“脸谱”(Facebook)网站。国内也有非常成功的网站,如人人网和开心网等。我经常使用人人网,主要的朋友基本上都是我的学生和同事。社交网有个特点,那就是基本上都是实名的。
在社交网站上,你可以查找、增加、删除你的好友,还可以发表你的文章、你的照片,也可以发布你的动态等。当然,作为一个开发平台,网站上面还有很多其他的应用,其中最经典的一个应用莫过于曾经风靡一时的在线游戏“偷菜”。
其实,社交网络最核心的一个用处就是帮助你获得有价值的信息,目前,我们面临的问题不是能否获得信息,而是获得的信息太多,让人没有办法甄别。这个时候,从朋友或熟悉的人那里获得的信息相对来说就是有价值的。例如,你可以搜索出很多的饭馆,无论饭馆的介绍有多好,你可能并不是太动心。但是如果一个很要好的朋友推荐说某某饭馆很好吃,你一定非常想去尝试一下,这就是社交网络与搜索引擎最大的区别所在。
我在人人网上的账号是www.renren.com/zhaoyanhrb,欢迎大家加我为好友。我在人人网上主要关注朋友们共享或推荐的文章、视频、资源等。现在互联网上东西太多,良莠不齐。朋友们喜欢的东西,质量还都不错。就像在市场买菜,只要跟住某个老大妈,准能做到物美价廉,这样就没必要再上网去“偷菜”了。最后顺便说一句,我在人人网上也有块菜地,已经荒废好久了。写书我还行,但是种菜实在不在行!
伴着朋友数量的增多,大家的喜好和口味就很难一致和统一了。有些女性朋友经常发一些关于星座方面的东东,而我是研究五行的,这个时候该怎么办呢?作为社交网站的后起之秀,Google+的一个创新是支持把朋友分成不同的圈,圈和圈之间彼此是隔绝的,这样圈内朋友的喜好就更加一致了,大家可以尝试一下。
1.2.4 论坛与博客
论坛只是一个电子布告板,你在上面公布一个信息,别人回复这个信息,然后你再根据别人的回复回复,然后别人再根据你的回复回复回复……。
事实上,网络上有很多论坛,有的大,有的小。如果你愿意,你自己就可以就某一专题开一个论坛,但是有没有人来就不一定了。衡量论坛最重要的指标就是他的用户人数,人越多,这个论坛就越火,就更能吸引更多的人,看来“马太效应”真的无处不在。对于程序员来说,stackoverflow.com是比较经典的技术论坛之一,国内比较火的就算是CSDN.net了。如果你开发的项目可以开源,你也可以把这些项目放到github网站上。如果你在以上的论坛和网站上不仅有账号,还有很高的积分和活跃度,在面试的时候无疑会秒杀其他竞争对手。毕竟,简历上所有人都说自己“精通”C语言,如果想脱颖而出,你总不能说自己“发明”了C语言吧!
除了纯技术性的论坛以外,还有很多综合性的论坛,如清华大学“水木论坛”http://www.newsmth.net/,我也经常会去关顾。大的论坛还有很多,像百度贴吧等,萝卜白菜,各有所爱,你可以自己去看看符不符合自己的口味。
博客起源于Web log,翻译成中文就是网络日记,然后慢慢的演变成一个词:blog。从名字上看,他应该类似于你的日记,你可以按照日期组织你的文章,在其中发表一些你的生活记录,思想感悟等。blog类似于日记,但是还不是日记。首先它不追求私密性。其次,很多博客都是有关社会事件的看法和自己的态度,而不是关于自己的生活琐事的记录。这一点在优秀的博客网站中表现得特别明显。如果你每天就是说早上吃了两鸡蛋、中午吃了一根油条等等,估计你的博客也只有买鸡蛋和油条的人看。
与个人网站相比,博客是动态的,而个人网站基本上很少变动。博客的时效性特别强,你可以发表最近经历的事情,你的心情,还可以发布你最近的照片、观点、思想等。而通过一些领域专家的博客,你还可以了解很多业界的动态和进展,所以博客的内容也是多种多样的。
不仅博客的内容多样,而且任何人都可以写博客,只要你的博文质量高,你就会受到关注,就有成功的可能。草根博客中最著名的成功例子就是当年明月,他把《明朝那些事》首先通过博客发表,很多网友非常地喜欢,最后出版成书,成为仅次于毛选的畅销书。不知道你是否看出来了,本书的风格有点模仿《明朝那些事》。这里我借用当年明月的一句名言,“其实C语言可以写得很有趣。”这也是我一直追求的目标。
坦白地说,发表在博客上的文章的质量要好于论坛。论坛上多为非常零散的只言片语,如果你写得很长,反倒没人看了。所以论坛上经常有“长文慎入”的字样,提醒你如果对长的文章不感兴趣,可以直接跳过。而博客是一段时间的思考和梳理,如果你写得不好,那就没人看了。不过这只是我个人的一点认识而已,并不是绝对地说论坛就不好,论坛上有些文章也非常地有水平,例如,本人曾将在清华水木的家版上发表过一篇文章,进入了十大主题并被斑竹收录到精华区。
无论是论坛上或是博客上的文章,每个人都可以通过回复来发表自己的意见。回复按顺序排列在一个网页中,像一层一层的楼房。所以就有了“楼上”、“楼下”这些专有的指代,同时“楼主”就是指最开始发表文章的那个人了。
有趣的是,论坛上和博客上的文章,回复也各有特点。针对博客文章的回复,相对比较聚拢,基本上都是直接回复楼主,并且和原文章的主题相关,如图1-7的左面所示。而针对论坛文章的回复,则明显比较松散,通常都是针对回复的内容再进行回复,如图1-7的右面所示。这样经过几次回复以后,就已经明显地偏离了原文的主题,变成大家各说各话了。而且无论是国家大事,还是鸡毛蒜皮,大家都会吵得一塌糊涂,骂得狗血喷头。
论坛上这种回复的风格,和酒桌上的风格类似,基本上总要经过和风细语、豪言壮语、窃窃私语、胡言乱语,最后统统不言不语几个阶段。难怪网上有网友说,最和谐的论坛就是成人论坛,所有的回复一律都是“楼主辛苦了!”,“楼主再接再厉啊!”
图1-7 博客回复(左)和论坛回复(右)的区别
就我个人理解,博客和论坛的不同如表1-2所示。
表1-2 博客和论坛的不同
我们知道,如果你要发表一篇博客,你需要一台连接到Internet上的计算机,这就限制了发表博客的时间和地点了。很快人们发现,可以利用手机的短信功能,随时随地发表博客。这不是更方便吗?但是,由于手机的短信限制,每次你只能输入不到200个字,这种博客就被叫做微博—微型博客的含义,同时也被称为懒人的博客。因为微博的内容通常都很短,所以微博可以通过手机快速地发表和获取,正是有了这一差别,微博的时效性才变得非常好。
微博发表每时每刻的事件,包括热点事件、随笔、灵感等。微博中,你可以follow某个对象,这样就可以第一时间知道你follow的对象做了什么事,当然别人也可以follow你。Follow你的就算是你的粉丝了。最先提出这个概念的是Twitter,国内比较火的是新浪微博。我新浪微博的帐号是http://www.weibo.com/zhaoyanhrb,目前也有接近1500个粉丝了。
无论是社交网站、论坛、博客还是微博,他们都是Information Technology发展的产物。但是,它们更关注的是Information,而不是Technology。从技术角度来说,它们的实现和使用门槛都不高,可以说没什么难度。从媒体的角度,他们完全可以当成一个个人化的媒体,再通俗点,你有了一个自己的电视台。你可以及时地、大声地、不断地发表自己的观点,而且还不用插播广告。有了博客、微博和社交网站,我们的生活已经不再依赖于某一个或两个中心媒体了。每个人都能发消息,而且非常方便,快捷。如果你的话题非常热门,马上这个话题自然就形成了一个中心。就像一场风暴,以前只有一场大风暴,现在是有无数的小风暴,每个小风暴都能形成自己的中心。
也有的学者把目前这种依托于社交媒体,由用户主导生成内容的web使用方式称为Web 2.0。Web 2.0的核心概念是互动、分享与关系。典型的Web 2.0站点有:社区、网络应用程序、社交网站、博客、微博、Wiki等。目前的研究热点,例如“大数据”等,也与社交媒体有紧密的联系和依存关系。感兴趣的读者可以自行查找这方面的内容。
调查显示,在社交媒体上的自我表达可以促使大脑释放多巴胺—一种让人获得满足感、幸福感甚至是强迫自己持续某种行为特征的神经介质。这或许就是社交媒体让人痴迷的一个很大原因。多巴胺这种东西一般我们会在自己吸烟、喝酒、恋爱、花钱和美食时分泌更多,这回你知道抑制自己使用社交媒体该有多难了吧!
1.2.5 夺宝奇兵
有时,我们需要找一本书,或者是一段教学视频等,这时需要通过下载的方法来得到这些“宝贝”。以前无论是利用http下载,还是利用ftp下载,其遵循的都是中心节点方式,如图1-8左侧所示,这种方式有个最大的缺点就是,一旦访问者过多,中心服务器就会瘫痪了。就像是一个最简单的黑客攻击方法,如果大量的用户一起访问某个网站,这个网站就会down掉了。
图1-8 中心服务器(左)与p2p(右)
为了有效解决这个问题,有人在技术上提出了P2P的概念,如图1-8右侧所示。这个概念其实很简单,就是每个下载的用户计算机本身也是提供下载服务的服务器。这句话有点绕嘴,我举了例子。比如你和另外一个人都在下载同一部电影。你下载了电影的后半部分,而另外一个人下载了电影的前半部分。这个时候,你们就不再需要中央服务器了,你们两个私下交换就可以了。如果有三个人一起下,那你只需要下载三分之一就够了。与中央服务器不同,P2P方式下,下载的人越多,下载就越快。这就是P2P的含义。
从技术上来说,它很完美,但是在法律上,却给侵权和盗版提供了便利。P2P方式本身就是发散的,没有人监控得了。同时,每个人都可以在网上发布东西,别人又都可以自由地下载。所以,目前国内已经对P2P软件采取了一些管制的措施。
常见的三种P2P下载软件分别为迅雷、电驴和bt。他们的区别如表1-3所示。
表1-3 P2P三种下载方式的区别
具体使用何种方法下载,我给出三点建议。
● 常用、经典的资源用迅雷下载。
● 生僻、旧的资源用电驴下载。
● 新的、热门的资源用bt下载。
最后一条建议就是,哪个有你需要的,就用哪个下载!这个有点类似于一个经典的调查问卷题目,如果卢浮宫着火,你先救哪幅画?最终拔得头筹的答案是“救离门口最近的那幅!”
1.2.6 互联网精神
Internet是一个大的图书馆,你也可以给这个图书馆贡献你自己的力量和观点,观点本身没有对错,不同的观点才非常的宝贵。如果每个人都热情地参与,那么互联网上的内容才能越来越丰富。互联网上内容越丰富,我们得到的就越多。就像交换苹果,每个人还是一个苹果,如果交换思想,每个人就有两个思想了。所以,互联网精神的第一个重要原则就是积极参与。
感谢网络,让我们坐在家中,就已经拥有了整个世界。无论是提出问题,还是回答别人的问题,都会对你本人有极大的提升。我和这本书就是一个最好的证明,在学校教了两年C语言以后,从同学们的问题中获益良多,最终决定鼓起勇气写这样一本书。同样,《C Programming FAQs》一书更是直接来源于论坛上问题的总结。
在网络上,大家都是比较欢迎转载的,无论是你的文章被转载,还是你转载别人的文章,都会有更多的人有机会看到这篇文章了。转载其实也是人们对信息的一种选择过程。越好的、越有特点的帖子,被人转贴的机会就越多,但是别忘了,一定要尊重别人的劳动成果,如果是你转载的,你最好注明原始作者和出处,不要硬说成是你自己的。
当然了,最核心的精神就是鼓励原创。别忘了,在你的领域,你是专家。每个人都把自己宝贵的知识、心得、观点等放到互联网上,互联网上的知识才能越来越多,互联网才能变成真正意义上的金矿。
最后就是要注意一下网络的礼仪。网络是自由的,在这个自由的环境中,你应该理性思考,文明发言。语言暴力不会有任何好的效果,只会暴露发言者低下的素质。虽然目前没有什么相关规范规定什么不应该说,但是我有一条建议,那就是如果有些话你不能对你的妈妈和女儿说,那么也不要在网上说。
1.3 熬夜指南
乐学网上我的课程中,我建立了一个在线论坛用来和同学们进行课下的互动和交流。我那些天才的学生们在论坛上发表了一些很好的帖子,本书中有两部分直接来源于论坛中同学们发布的帖子,这是其中的一个。
内容上基本没做什么改动,只是加了一点内容让它读起来更有趣一点。写书和教课一样,没必要总板着脸,以为只有这样才有权威,才有人尊重。人们喜欢你,才会尊重你;人们佩服你,你才有权威。而如果人们只是怕你,大部分只是因为你的位置,怕的不是你,而是你的位置而已。我的话说完了,下面是一条华丽的分割线,分割线下面就是原文的帖子。
天生乐观的程序员,多数都是平时不用功,到了要交付的时候才伴随着最后期限呼啸而过的声音熬夜赶进度,如图1-9所示。所以熬夜这种活动,一定必不可少。
图1-9 创作过程
熬夜前的下午,不要吃泡面来填饱肚子,以免火气太大。晚餐应多补充一些含维生素C或含有胶原蛋白的食物,如鱼类、豆类这些。开始熬夜前,来一颗维生素B营养丸,它能够解除疲劳,增强人体免疫力。
熬夜的人,最先想到的就是喝咖啡提神。但是咖啡因虽然提神,相对地会消耗体内与神经、肌肉协调有关的维生素B。更可能形成恶性循环,养成酗茶、酗咖啡的习惯,需要量愈来愈多,效果却愈来愈差。因此,我个人比较推荐喝茶,绿茶很不错,可以提神,又可以消除体内多余的自由基,据说还有些防辐射的作用。熬夜时不要吃太多甜食,高糖虽有高热量,刚开始让人兴奋,也会消耗维生素B,会让人容易疲劳,也容易引来肥胖问题。熬夜时最好的食物是水果。值得注意的是,花生米、杏仁、腰果、胡桃等干果类食品,含有丰富的蛋白质、维生素B、维生素E、钙和铁等矿物质以及植物油,而胆固醇的含量很低,对恢复体能有特殊的功效,绝对是熬夜必备之选。
熬夜时,大脑需氧量会增大,最好隔一个小时到室外做一些简单易行的肌肉放松动作,一方面舒缓筋骨,预防颈椎病之类的;另一方面,可以多呼吸一些新鲜空气,提神又减压。有一个故事是这样的,一民警深夜巡逻,突然对一人大喊:“站住!你说,C语言中用什么定义一个整型数?”那人回答:“int”。民警说:“你可以走了。”那人非常诧异地问道:“为什么问这样的问题?”民警说:“深夜还在街上瞎逛,一脸苦瓜相,不是小偷就是程序员。”
其实,熬夜时因为要忙着码代码,精神一直紧绷着,倒是并不难受。反倒是熬夜之后,才是真正痛苦的时候,精神萎靡、头疼欲裂都是常事儿。所以,能不熬夜最好不熬夜,经常熬夜有三大弊端:第一,记忆力越来越差;第二,数数经常数错;第五,记忆力越来越差……
1.4 程序=数据结构+算法
程序员首先要有自己的想法,而写程序只是为了实现自己的想法而已。
而程序员的想法就是用数据结构+算法来描述的。如果程序是一个人,正确的数据结构就像是强壮的体格,高效的算法就像是高尚的性格,而语言,只是一件外衣而已。不同的场景,你会穿不同的外衣,而且外衣可能还有一定的流行趋势,但这些真的不重要。
纠结于语言的程序员,就像是只关注外衣是否漂亮的小姑娘。凡是能够流传千古的作品,你会发现都是不穿衣服的,如图1-10所示的罗丹的思想者;更有甚者,不仅衣服没有了,就连两个胳膊都是多余的,如维纳斯。
图1-10 就是因为熬夜,我的衣服忘记放哪了
1.4.1 数据结构
数据结构是任何计算机专业的必修课,但是目前有些程序员越来越不重视它。不重视它并不是因为它不重要,而是目前市面上两种主流的面向对象高级语言C++和Java中,都包含比较完整的基本数据结构的库实现,它们分别是C++中的Standard Template Library(STL)库和Java中的Container类。对用户来说,只要直接拿来使用就可以了。
为了使某种特定的数据结构能够支持所有的数据类型,C++和Java分别使用了两种泛型技术,分别是C++的模板技术和Java中面向对象的继承技术,如程序1-1所示。
在Java中,所有的数据类型都继承于Object,同时ArrayList支持装入任何继承于Object的数据类型,用一句俗话讲就是:“ArrayList是一个筐,乱七八糟都可以装。”不过需要注意,从ArrayList中取出数据的时候需要转换回正确的原始类型,如果没有转换回原始的类型,运行时就会出错,同时转换也有一定的效率损失。
程序1-1 C++和Java的两种泛型技术
1 /*java实现*/ 2 ArrayList List = new ArrayList(); 3 List.Add( 1 ); 4 List.Add("string"); /*正确*/ 5 /*C++实现*/ 6 vector<int> v1; 7 v1.push_back(1); 8 v1.push_back("string"); /*错误*/
C++的模板技术就没有类似的问题。你在声明一个vector对象的时候,必须如程序1-1中第6行所示,指定它要保存的数据类型为int,以后这个v1只能存入你指定的数据类型int了。对于模板技术,C++的STL无疑是模板技术的杰出代表,目前它已经成为C++语言标准的一部分,可见确实不同凡响。对于STL有三层境界,第一层为会用STL,大家可以参考《Effective STL》[6]。第二层为明白其中的原理,对应的参考书为《STL源码剖析》[7]。借用书中的一段话为:“源码之前,了无秘密”,确实如此。第三层为能扩充STL,这个层次就需要你自己来写本参考书了。
关于泛型技术的模板实现和继承实现,也有很多优劣的争论。吵架这种事通常我都会躲得很远,这次我依然不例外。值得注意的是,新版的Java也支持模板技术。你需要根据特定的场合来决定使用哪种方法。
有趣的是,当有人在热烈争论模板好还是继承好的时候,还有些工程师却在认真地思考,最终他们写出了这样的C++语句:class String: public Array<char,String>。这种混合使用继承和模板的技术详细的讨论可以参考《ATL Internals》[8]的Appendix A。利用模板可以避免继承中动态绑定的效率代价。利用继承可以提供模板技术不能提供的多态行为,这种思想可谓鱼和熊掌兼得。基于这种思想,微软建立了一套用于快速开发组件(COM)的Active Template Library(ATL)。可见,少批评、多借鉴、多思考才是我们对待不同技术的正途。
虽然有了很多优秀的数据结构库实现,但是我们还需要认真学习数据结构的基本知识和思想。现实世界中的问题往往比较复杂,很难用一两种基本的数据结构来模拟和解决,往往需要你综合利用各种基础的数据结构。同时,用户的需求千变万化,千差万别,有的时候需要你构造一个全新的数据结构才行。这些都要求你有扎实的数据结构基础知识。
1.4.2 算法
算法到底是什么?以下是Wikipedia的定义:an effective method expressed as a finite list of well-defined instructions for calculating a function. In simple words an algorithm is a step-by-step procedure for calculations。如果你不明白也没关系,其实我也不明白。算法本身就没有一个准确的、排它性的定义,正可谓:“道可道,非常道!”
你可以不知道算法的准确定义,但是一定要知道算法很重要。算法是计算机科学的核心,如果没有算法,计算机几乎不配再称为科学。虽然计算机语言和开发平台日新月异,但万变不离其宗的还是那些算法和理论。是否精通算法是菜鸟和老手的区别,也是低薪和高薪的区别。IT领域500强公司面试基本上都是算法题。算法也是区分一般任务和艰巨任务的一个指标。一般任务就是指做一个网站,只会给你3千块钱,是产业链的低端;而艰巨任务就是指解决北京的交通问题,国家会给你10个亿的。但是这种问题,绝对是一个算法密集性问题。
描述算法有两种方法,一种是利用流程图方式,如图1-11所示。
图1-11 算法流程图描述
这个算法是我最钟爱的一个算法,每当生活中出现一些烦心事,这个算法都能给我终极的答案。这就是一个好的算法的威力所在。
另外一种描述算法的方法是基于伪代码方式,如图1-12所示。比起流程图,它更加精练,也更贴近实现算法的代码,所以目前伪代码的表示方式应用得比较广。
图1-12 Algorithm 1
你想知道Algorithm 1是怎么生成的吗?其实我早就等你问这个问题了!首先它不是画出来的,而是自动生成的。它是用LaTeX软件并利用了algorithm2e.sty包编写完成的。生成Algorithm 1的Latex源码内容如图1-13所示。有了LaTeX下这些功能扩展包,撰写计算机语言的书籍变得如此便捷和充满乐趣。有关LaTeX的一本经典参考书是《The Latex Companion》[9]。
LaTeX与Word是目前两种主流的文本编辑系统,在使用便捷性和学习难度上,Word明显优于LaTeX,这点从Algorithm 1的LaTex源码上你就能有所体会。仅“所见即所得”一项,LaTeX就弱爆了。但如果应用在学术报告、科技论文以及教材方面,Word就有些力不从心了。至少如此美观、整齐的Algorithm 1,利用Word是很难高质量、大批量地生成出来。关于LaTeX与Word的区别,大家可以参考本书网站上“扩展内容”网页中的“LaTex和Word的不同”。
图1-13
LaTeX是基于TeX的一个排版系统,TeX是一个很好的排版工具,特别是在处理复杂的数学公式时。提起TeX,就必须提到它的开发者、大名鼎鼎的美国计算机教授高德纳(Donald E. Knuth)。高教授还撰写了《The Art of Computer Programming》一套书,计划写7卷,目前完成了前4卷。本套书在1999年底被美国国家期刊(American Scientist)列为20世纪最佳12部学术专著之一,与狄拉克的量子力学、爱因斯坦的相对论齐名。
在中国,本书被称为算法领域的“葵花宝典”。光凭“葵花宝典”这个比喻,就已经吓得我直到现在都没有胆量去读。所以我选择了一本相对初级的“独孤九剑”来读,那就是《算法导论》[10]。等以后我的功力增长到一定程度,再和媳妇商量商量,然后再去读“葵花宝典”。
算法很有用,但是,算法真的很难学,需要一些抽象的思维和数学基础,不是一朝一夕就能搞定的。我的建议是,如果你立志当一名程序员,就要把学算法、用算法当成毕生的事情,所以我们的口号就是:“随时随地快乐学”。记住,任何一本算法书都应该随时、随地拿来读,不要指望着几天读完了事、收工。
1.5 内功修炼
1.5.1 数学
作为一个门外汉,我真的不敢在这里谈论数学的话题。直到我在网上看到南京大学数学系张高飞老师的一篇文章,我决定将全文转述在下面,下面分割线之间的就是张高飞老师那篇文章了。文章不长,但是让我这个悲情人物找到了自信,数学里面是有属于我的一个分支的,那就是计算数学!
正如大家所知,代数几何是现代数学的主流。当代大多数一流的数学家都工作在这一领域。因此如果你觉得自己天赋异禀,并在代数、几何与分析各方面都有着扎实的基础,我建议你绝不要浪费自己的天赋:应义无反顾地选择代数几何这一专业。当然把代数、几何与分析这三门基础功课同时学好的人很少。比如有些同学有着很好的分析功底,但代数中的抽象思维能力却相对显得薄弱。如果是这样的话,我建议你选择分析方面的专业,比如:复分析,分形,调和分析或微分方程。
除以上三部分同学之外,还有这样的一部分同学:他们对代数,分析与几何都不擅长,但却一直坚信自己在数学上仍能有所作为,并幻想有朝一日成为中国数学界的中流砥柱。如果你属于这部分同学中的一位的话,我建议你选择动力系统。动力系统这一学科其实就是专门为这部分同学开设的。
当然即使是动力系统也不是人人都能学的。因为动力系统需要大量的微积分。可总有那么一部分同学还没来得及把极限的概念搞清楚就大学毕业了(本文作者中枪)。如果你不巧就是这样一位同学,也就是说你大学四年压根儿就没学数学,但仍希望自己将来能在数学上一展宏图的话,我建议你选择组合数学这一专业。这一专业的特点就是它只用到中学的数学。如果你在中学时参加过数学竞赛并获过奖项的话,这一学科正是你大展身手的地方。
我想大多数同学看到这儿之前已经找到了适合自己的专业了。可若仍有人羞怯地说他在中学时早恋,因此连中学的数学也没学好,我想告诉这部分同学不要怕。在我们系有专门为你们开设的一个专业:统计学。这一学科只要求懂得小学数学中的加减乘除四则运算就够了。更重要的是,选择这一专业的大多都是女同学。在你准确无误地把成千上万个数据加起来并娴熟地计算出他们的均值时,你也赢得了众多师姐师妹的芳心:短短三年的研究生生活或许能让你再次体会一次那如花美眷,似水流年的往事……
最后这一条是专门针对那些悲情人物的。他们连小学的数学也没学好。不要说把上千个数加起来,就是把两个数加起来,对他们来说都是件很吃力的事。然而这一切丝毫没有削弱他们对数学的一片痴情。他们日日夜夜泡在图书馆里。他们翻阅了所有的数学文献,却从未找到一本能读懂的。但他们仍坚持不懈,为的就是找到一个适合自己的专业。他们的行为感动了上帝。上世纪的某一天,上帝为他们创造了一台机器帮他们计算,这就是计算机。借助计算机,他们可以很快地进行加减乘除的运算。这就是计算数学。
张老师的文章转述完毕,看来张老师也同意这样一种观点:数学学不好的学统计,统计学不好的才学计算机,这句话多少有点道理。确实,很多的计算机研究领域并不需要高深的、抽象的数学知识。但是大家千万不要以为学计算机就可以轻视或忽略数学。关于计算机和数学的关系,我只想说两点。第一点,数学很有用。数学对我们理解和使用数据结构和算法有很大的帮助。数学中,不仅数值分析、集合论、概率统计与分析这些课程可以直接应用到计算机相关应用中,同时,坚实的数学基础会给日后从事研究性质的工作带来巨大的帮助。如果你的数学学得非常好,你不仅拥有数学的知识,更重要的是拥有数学的思维,而数学的思维对从事计算机职业来说至关重要。
第二点,如果从应用的角度来理解数学,数学很简单。我们来举个例子。由一个最简单的问题谈起,我们要铺正多边形地砖,能够使得拼接处没有缝隙,正几边形能够满足这个要求?这个问题可以化解成另外一个问题,正多边形的一个内角的整数倍等于360度。我们继续推导这个问题,正n边形总可以分割成n-2的三角形,所以正n边形内角和等于 (n-2)×180°。
这样,正n边形的每个内角就是
假设正n边形恰好需要m个围绕在一起而没有空隙,那么就可以得到
经过简单地推导,最后可以得到(m-2)(n-2)=4,其中m和n必须为正整数,经过简单的口算,你就可以得到n只能是3,4,6。与之对应的是三角形,正方形,和正六边形。正八边形好像是满足要求,但是如果你尝试铺一下,就会发现这是不行的。也就是说,能够无缝隙的平铺一块地方的正多边形中,最大的就是正六边形。通常情况下,边数越多,周长相等的情况下所占面积就越大。所以……所以你想到了什么没有?蜂巢!没错,就是蜂巢。聪明的蜜蜂早就知道了这一原理,把自己的巢建成正六边形,如图1-14所示;另外,我们的手机采用的都是蜂窝网,这回你知道为什么了吧!怎么样,数学真的不难,而且非常有用吧。
图1-14 蜂巢
既然正六边形有如此优良的特性,为什么我们超市里面装牛奶的盒子都是正方形,而不是正六边形的呢?这是因为牛奶一般都是放到货架上,正方形可以保证你能很方便地抽取出来啊!那为什么不设计成圆形呢?因为牛奶必须需要放到冰柜里,正方形可以保证最大限度地利用冰柜的空间啊!那为什么可乐瓶子都是圆的啊?因为一般可乐都是用手拿着喝的啊!那为什么……。好了,为了系统回答你的所有问题,我需要引入一门新的课程,这门课程叫做《软件工程》。他包含了商业、沟通、管理、市场、开发等方方面面。一个软件产品,技术很重要,但不是全部。这一点,苹果的乔布斯应该深有体会,下面我就叨咕叨咕软件工程这个东西。
1.5.2 软件工程
对于软件工程,有一句表扬它的话,那就是:“懂得软件工程的程序员就不再是妓女了!”这句话来源于程序员圈内用于自嘲的一个类比,那就是程序员和妓女都是吃青春饭的。不过说句实话,我对表扬软件工程的这句话理解的并不是很透彻。
话说回来,软件工程这东西,真的很重要。如果有一个产业,大家都很努力工作,但是结果却会很差,那就是软件这个行业了。开发一个软件包含很多步骤,从需求设计与分析、系统设计,到软件实现、软件测试、部署和维护,其中每一个步骤又涉及到很多人,从用户到销售,从经理到程序员,从架构师到测试人员等。一个常见的情况就是程序员不了解用户,用户也不了解程序员;大部分时候,用户也不了解自己。这就造成了如图1-15所示的一个项目悲催的一生。
图1-15 一个软件项目悲催的一生
说到软件工程,不能不提到CMM(软件能力成熟度模型),这个是软件工程和软件管理的一个比较主流的模型。我曾经听过一个故事,国内的一个企业曾经派一些资深的员工去印度一家公司学习CMM模型。学习一年回国以后,中国员工并没有学会CMM,但是印度那家公司从此却不用CMM,改用中国模式了!后来这个公司改变了战略,第二次派了一批刚从学校毕业的学生去学习,终于取得真经,修成正果。从这个故事中,大家得到了什么结论呢?
还有一个真实的案例那就是微软公司,它开发软件的时候不用CMM进行管理,而是使用开发、测试、项目经理三个团队互相配合的方式来进行管理。
看来CMM这个东西也并不是传说中的那么神。就像炒菜一样,只要好吃就行,没必要偏得按照菜谱来。关于软件工程,我基本上不懂,所以也只给大家介绍这么多了。
我个人的一个感觉就是,软件工程这个东西很赚钱,而且无论是从课本上,还是从课堂上,你都学不来。