3.3 切面范式——多角度看问题
3.4 事件驱动——有事我叫你,没事别烦我
第4课 重温范式
4.1 函数范式——精巧的数学思维
4.2 逻辑范式——当算法失去了控制
4.3 汇总范式——一张五味俱全的大烙饼
4.4 情景范式——餐馆里的编程范式
第5课 语言小谈
5.1 教学计划——接下来的故事
5.2 数据类型——规则与变通
5.3 动态语言——披着彩衣飞舞的脚本语言
5.4 语言误区——语言的宗教情结
第6课 语言简评
6.1 系统语言——权力的双刃剑
6.2 平台语言——先搭台后唱戏
6.3 前台语言——视觉与交互的艺术
6.4 后台脚本——敏捷开发的利器
下篇:抽象机制与对象范式
第7课 抽象封装
7.1 抽象思维——减法和除法的学问
7.2 数据抽象——“做什么”重于“怎么做”
7.3 封装隐藏——包装的讲究
第8课 抽象接口
8.1 软件应变——随需而变,适者生存
8.2 访问控制——代码的多级管理
8.3 接口服务——讲诚信与守规矩
第9课 继承机制
9.1 继承关系——继承财富,更要继承责任
9.2 慎用继承——以谨慎之心对待权力
第10课 多态机制
10.1 多态类型——静中之动
10.2 抽象类型——实中之虚
第11课 值与引用
11.1 语法类型——体用之分
11.2 语义类型——阴阳之道
第12课 设计原则
12.1 间接原则——柔胜于刚,曲胜于直
12.2 依赖原则——有求皆苦,无欲则刚
12.3 内聚原则——不是一家人,不进一家门
12.4 保变原则——与魔鬼打交道的艺术
第13课 设计模式
13.1 创建模式——不要问我从哪里来
13.2 结构模式——建筑的技巧
13.3 行为模式——君子之交淡如水
13.4 闭班小结——软件无形,编程有道
索引
设计手记
编辑手记
序序
去年3月的一个下午,过于明媚的春光唤醒了一份久违的情怀,书摊上的一本《青年文摘》便成了合宜的载体。与其说是为了阅读,不如说是为了回忆——对20年前读书心境的回忆。孰料读罢开篇,怀旧
之窗随即悄然关掩,一扇求新之门却戛然开启。那是一篇人物介绍,讲述一位籍籍无名的年轻人是如何因撰写博客而声名鹊起的。抚卷思之,网络平台已成大众舞台,人人皆可登台献技,自己何不前去
一试?心念甫动,顿感技痒难耐,当晚寝不安席,于辗转反侧之中磨出了一本书的轮廓。
尽管钟书先生认为鸡与蛋应为松耦合关系,但一只来历不明的鸡确会招致人们对其产品可靠性的怀疑。故而在介绍《冒号课堂》的创作思路之前,先自我介绍一番。1986年我怀揣着成为数学家的梦想,
考入武汉大学数学系。7年的大学生涯在浑浑噩噩中度过,毕业后在广州一所高校教了3年的高等数学。在混沌与迷茫中挣扎了10年,终于不堪蹉跎,1996年赴美攻读数学博士。始料不及的是,在大洋彼
岸不仅没能一圆数学之梦,反倒从一个未曾碰过鼠标的电脑排斥者变成了一名IT工作者。“罪魁祸首”正是电脑和Internet,它们潜移默化地改变了人们的生活和思维方式,我亦未能幸免。1998年开始选修计
算机课程,两年后拿到硕士学位,并在华尔街的一家软件公司找到了工作。2004年年底,选择回国发展,再度主导了人生的一次急转弯。回到广州后,顺利地进入了一家著名的外企。平淡而安逸的生活
似乎注定与我无缘,不久又转去一家小公司作技术总监。如果用一句话来描述自己的职业生涯,那便是:数学是我的初恋情人,计算机是我的终生伴侣。无论成败,都是命运与人生双向选择的结果。
本书的创作虽出偶然,却也有其必然性。一方面,市面上的计算机书籍多为拼凑之作,且不少带有应试教育的痕迹。另一方面,论坛上充斥着各种谬言妄论,人们或目空一切,或人云亦云;每当争论一
起,常常硝烟弥漫,出言无状者甚众。如此诸般,不忍卒睹。深感激浊扬清之必要,此念一直郁积于心,终至一朝爆发。自知虽无澄清玉宇之力,唯奢念带来一缕清风。
《冒号课堂》采用对话体,是为了借不同背景、不同水平、不同性格的人物之口,多层次、多维度、多角度地展现知识的内涵与活性。人物皆以标点符号命名,是为了塑造让人过目不忘的形象:冒号善
解释,引号善引用,问号善提问,逗号善缓冲,叹号善感叹,句号善总结。此外,6个标点符号还对应着每小节的6个部分:冒号是正文讲解,引号是文献参考,问号是问题列表,逗号是补充插语,叹号
是精华预览,句号是本节总结。与一般纯技术类图书不同,本书非常强调学习方法和学习精神的重要性。在内容组织上也一反常规,以思想为主、以知识为辅,以抽象为主、以具体为辅,以范式为主、
以语言为辅。人们常把书籍比作一种食物,其实书籍也是一种药物。一本书应当同时提供两种价值:一种是让人获取正确知识的食用价值,一种是让人抛弃错误观点的药用价值。《冒号课堂》更侧重后
者,这多少给读者带来一定的阅读障碍,因为抛弃往往比获取更加困难。此外,全书涉及的知识点较多,覆盖的知识面较广,一些流行的语言或技术反被刻意地淡化。假如读者没有足够的计算机理论和
实践基础,难免会感到一些困难和不适。古语有云:“学然后知不足”,认识到不足何尝不是学习的一种收获呢?从另一面说,假如读者发现书中疏谬,还请不吝赐教,本人将不胜感激。坦而言之,随着
写作的深入,自得之心日敛,惴惴之心日甚,正应了上面古语的后半句:“教然后知困”。
本书的完成首先需要感谢3位母亲:我的母亲、我太太的母亲、我女儿的母亲。没有她们默默无闻的支持和帮助,冒号课堂只能在梦中开班。还要感谢博文视点的周筠老师对本书的大力支持和关怀;白爱
萍编辑负责而又耐心,不厌其烦地和我讨论一个个文字和版式的细节;博文的陈宜、杨小勤、陈琼、徐定翔、许莹、胡文佳等编辑也以同样的热情带给我很好的出版体验。我从其他亲友和网友那里也得
到了许多热情的鼓励和有益的启示,是他们让虚拟的课堂变得真实和生动。
郑晖
2009年8月24日于广州
上篇:编程范式与编程语言上篇:编程范式与编程语言
第第1课 开班导言课 开班导言
课前导读课前导读
第1课为整个课堂学习的内容和风格定调,主要围绕3个问题展开:要成为一个优秀的程序员,最须要学习什么知识?领会什么思想?具备什么精神?
1.1 开班发言 开班发言——程序员的程序员的4层境界层境界
授人以鱼,不如授人以渔。
——古语
关键词:关键词: 程序员;学习;知识;思想;精神
摘要:摘要: 对程序员的一些忠告和建议
预览预览
学会不如会学,会学不如会用,会用不如被用。
如果知识是水,我们要挖掘最先涌动的泉眼。
如果知识是火,我们要捕捉起初点燃的火花。
如果知识是树,其树大根深,不究立固之本则无以知过去;其枝繁叶茂,不握支撑之干则无以知当下;其蓬勃旺盛,不察生长之点则无以知将来。
越是喧嚣的世界,越需要宁静的思考,让躁动的心灵得以平息,让蕴藏的灵性得以释放。
知识之上是思想,思想之上是精神。
提问提问
软件开发者的成长须要经历哪些阶段?
要想在IT业中生存与发展,传统的学习方式是否够用?
优秀程序员应该具备哪些素质?
讲解讲解
冒号开了个程序员提高班,今天迎来了首期学员,他们是问号、句号、逗号、引号和叹号,皆为IT业的新兵。望着台下洋溢着青春与渴望的脸庞,冒号开始了他的开班发言—— 大家好!先自我介绍一
下,本人姓冒名号字解之。诸位不必叫我老师,就叫老冒好了。比在座各位痴长几岁,“老”是担得的,“师”却不敢妄言。在下编程多年,自觉小有所成,不敢专藏,特开此班与众共享。虽系一家之言、一
孔之见,若能抛砖引玉,又何惧方家之哂?疏谬之处,还望海涵斧正,不致自误误人。
客套已毕,言归正传。本班主要采取讨论的形式,只要是软件开发中值得讨论的,但凡本人力之所及,均可共同探讨。
本班的宗旨是:学会不如会学,会学不如会用,会用不如被用学会不如会学,会学不如会用,会用不如被用 。对于一个软件开发者来说,这意味着4个阶段:
学会学会 (知其所然)——掌握一些具体编程知识的初级程序员。
会学会学 (知所以然)——能快速而深刻地理解技术并举一反三的程序员。
会用会用 (人为我用)——能将所学灵活运用到实际编程设计之中的高级程序员。
被用被用 (我为人用)——能设计出广为人用的应用程序(application)、库(library)、工具包(toolkit)、框架(framework)等的系统分析师和架构师。
至于被用的更高层次,如发明出主流的设计模式、算法、语言,乃至理论等,则可称得上计算机专家了。本班的目的,正是为各位向更高阶段的提升助一臂之力。
大家可能都习惯了在小学、中学和大学里的课堂,那里的知识大多是系统而完备且貌似终极的,那里的学习大多是单向而被动的。但习惯并不意味着享受,更多的是因为别无选择。你们曾被引入一座座
知识殿堂,被告知它们如何美轮美奂、巧夺天工,尽管很多时候你们或不以为然、或不解其妙,但还是不得不记下每一处被指点的细微结构。很少有人带你们看看当初为建造这些殿堂而打下的地基、搭
设的脚手架,哪怕只是上漆前的模样也好,更遑论一瞻数易其稿的设计图纸了。那些与殿堂相比显得有些原始、甚至丑陋的东西,被有意无意地挡在视线之外。可没有那些,你们将来如何为这些宫殿添
砖加瓦,又如何另起楼阁呢?
中国学生恐怕是世界上最擅长考试、最习惯考试、也最厌倦考试的群体了。你们告别了学生生涯,踏上了职业之旅。首先我要恭喜你们,脱离苦海了!同时也要悲告你们,掉进火坑了!危言耸听吗?如
果你选择了做程序员,你时时都得学习,没有手把手教你的老师,没有指定的教科书和参考书,有的是层出不穷令人眼花缭乱的新概念、新技术、新问题,好不容易学到一些皮毛,有的已成明日黄花。
你时时都得考试,每提交一段代码就是上交一份答卷,你不知道什么时候、什么人会批改,直到——开发组同事发现你的代码难以看懂,系统分析员指出你的程序不符合规范,测试工程师检验到你的软
件有缺陷,客户抱怨你的产品太慢太难用,最后老板倒可能告诉你一个好消息:明天起放长假!
其实,又有哪行哪业的人不需要学习和考试呢?IT业只是相对更激烈、更富挑战性而已。在这个瞬息万变、适者生存的时代,如果还沿用封闭、被动的学习方式,恐有淘汰之虞。有鉴于此,本班的风格
与你们习惯的课堂氛围有所不同:这里的知识不一定是系统或完备的,但一定是生动鲜活的。如果知识是水,我们要挖掘最先涌动的泉眼;如果知识是火,我们要捕捉起初点燃的火花。如果知识是树,
其树大根深,不究立固之本则无以知过去;其枝繁叶茂,不握支撑之干则无以知当下;其蓬勃旺盛,不察生长之点则无以知将来。这里的问题不一定是预设的,结论不一定是终极的,甚至不一定是正确
的,但一定是有的放矢、发人深思的。由此决定了这里的学习方式将是开放多元、双向互动的。
越是喧嚣的世界,越需要宁静的思考,让躁动的心灵得以平息,让蕴藏的灵性得以释放。学习编程没有速成大法、没有必杀之技、没有锦囊秘笈、没有终南捷径,只有思考、实践、再思考、再实践。中
国的IT界乃至整个学术界都过于浮躁和急功近利,既盲从又自大,缺乏务实精神与研究精神、独立精神与合作精神、批判精神与自省精神。如果一个程序员沾染这种风气,哪怕有再好的学习方法和学习
能力,他都注定与“优秀”绝缘。这就是本班极力倡导并将贯穿始终的理念——知识之上是思想,思想之上是精神知识之上是思想,思想之上是精神 。
我的开场白到此为止,现在把话语权交给你们,大家自由发问吧。
总结总结
➢ 软件开发者的成长阶段:学会学会→会学会学→会用会用→被用。被用。
这是一个从“知其所然”到“知所以然”、从“人为我用”到“我为人用”的历程。
➢ 传统的学习方式大多有如下特征:
封闭——系统完备的终极式知识。
单向——师教生学的单向式传输知识。
被动——师命生从的被动式接受知识。
静态——只注重知识的现状,忽略知识的起源、历程和未来趋势。
继续沿袭这种学习方式,是很难在竞争日趋激烈、技术日新月异的IT业中求生存、谋发展的。开放多元、双向互动的现代课堂乃大势所趋。
➢ “知识之上是思想,思想之上是精神。”
一个优秀的程序员,除了要迅速掌握知识、善于领悟思想外,还必须具备务实与研究精神、独立与合作精神、批判与自省精神。
1.2 首轮提问 首轮提问——什么语言好?什么语言好?
敬畏老师莫如敬畏真理。
——题记
关键词:关键词: 计算机语言;编程语言
摘要:摘要: 讨论流行的计算机语言
预览预览
真正的老师是你自己。
没有激情作氧气,灵感的火花注定转瞬即灭。
提问提问
谁是你真正的老师?
程序员是吃青春饭的吗?
计算机语言这么多,到底学哪个好?
讲解讲解
众人面面相觑,一阵沉默后开始窃窃私语,显然有些不太习惯这种教学方式——笔记本上还没写两个字呢,老师就把球给踢回来了。
冒号也不说话,只是微笑地望着大家。
还是问号打破僵局,开始发问:“老师——”
冒号扬手打断他:“请不要管我叫老师,真正的老师是你自己真正的老师是你自己 。本班的一个特色是:师生角色模糊,大家自主学习,相互启发,教学相长。”
“老冒——”问号顿了顿,全班哄堂大笑,“学软件开发,当然得先学语言,计算机语言这么多,到底哪个好,或者说学哪个好?”