2008年5月2日
摘要:
抽象类型——实中之虚(
介绍抽象类型的种类、意义及其用法)
• 浅显的比方只是门槛前的台阶,借之或可拾级入门,却无法登堂入室
• 具体类型是创建对象的模板,抽象类型是创建类型的模块
• 抽象数据类型的核心是数据抽象,而抽象类型的核心是多态抽象
• 必先以术养道,而后以道御术
• 以社会身份而非个人身份作为公民之间联系的纽带,正是针对接口而非实现来编程的社会现实版
• 个体身份对应的规范抽象借助封装,以数据抽象的形式出现
• 家庭身份对应的规范抽象借助继承,以类型层级的形式出现
• 社会身份对应的规范抽象借助多态,以多态抽象的形式出现
阅读全文
摘要:
多态类型——静中之动(
通过实例展示多态类型的三种用法)
• 继承是多态的基础,多态是继承的目的
• 多态是动静结合的产物,将静态类型的安全性和动态类型的灵活性融为一体
• 前者(参数多态)是发散式的,让相同的实现代码应用于不同的场合
• 后者(包含多态)是收敛式的,让不同的实现代码应用于相同的场合
• 模板方法模式突出的是稳定坚固的骨架,策略模式突出的是灵活多变的手腕
阅读全文
摘要: 终于有了自己的独立博客
http://blog.zhenghui.org,以后就在那儿安家落户了。
阅读全文
摘要:
后台脚本——敏捷开发的利器(
简谈Perl、PHP、Python和Ruby)
• 语言的发展趋势一定是动静结合、刚柔并济
• Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯
• 或许优雅正是来自对细节和规范的重视
• (RoR)与Ruby结合之后,便如一只猱身而上灵猫,立刻衬托出Java和.NET大象般的身影
阅读全文
摘要:
前台语言——视觉与交互的艺术(
简谈VB、Delphi和JavaScript)
• Delphi让复杂的事情变得简单,VB让简单的事情变得更简单
• 它(JavaScript)宛如一只神奇的魔袋,乍看平淡无奇,却总能变出意想不到的宝贝
• 待友之道,贵在放大其优点而缩小其缺点,对待语言亦当如是
• 大道相通,难者亦易,易者亦难
阅读全文
摘要:
平台语言——先搭台后唱戏(
简谈Java和C#)
• Java的目的是让一种语言在多种平台上运行,而C# 的目的是让多种语言在一种平台上运行
• 两个平台语言(Java和C#),一个重在语言,让语言向平台扩散;一个重在平台,让平台来凝聚语言
• C++提供了一马平川的大路,也提供了陷阱密布的小道;Java则在大路上铺设水泥,同时封锁了捷径小道;C#同样填平了大路上的坑坑洼洼,但把一些小道上“此路不通”的牌子悄悄换成了“此路危险”
阅读全文
摘要:
系统语言——权力的双刃剑(
简谈C、C++和D)
• 通禅悟道者拈花不语,坐井观天者蛙鸣鼓噪
• Java程序员大多被惯坏了,环保意识要淡薄得多
• (指针)用得好可以是削铁如泥的神兵利器,用得不好则可能是自我毁灭的罪恶渊薮
• OOP又不是金子,含量越高越好。试图把一切都装进OOP的箱子里的想法无异于削足适履
• 它们(系统语言)的理念是:优化机器的时间而不是人的时间,优化机器的记忆而不是人的记忆;假设编译器是愚蠢的而程序员是聪明的,因此赋予程序员更多的权利、义务与责任
• C++是匹无辔无鞍的野马,看似桀骜不驯,若能顺性而御,必能足踏飞燕,行千里而不劳
阅读全文
摘要:
语言误区——语言的宗教情结(
关于编程语言的一些误区)
• 如果说编程范式是一种文化,那么编程语言更像是一种宗教——尽管它本不该是
• 语言只有两种:一种怨声载道,一种无人问津
• 对待一门语言的态度应该是:与其抱怨争执,不如扬长避短
• 过分拔高一种语言与抹煞语言之间的差别是两种极端,皆为秕言谬说
• 这些人若有幸拜关公为师,他们最艳羡的一定他的赤兔马和青龙偃月刀,或许还会抹红脸蓄长须什么的,就是不太愿学他的盖世武功
• 理想的架构师应当如文学大师,既有恢弘大气的构思,又有细腻深刻的笔法;应当如统军大帅,既有运筹帷幄的韬略,又有冲锋陷阵的武功
阅读全文
摘要:
动态语言——披着彩衣飞舞的脚本语言(
动态语言简谈)
• 程序是为终端用户服务的,而脚本是为程序员服务的
• 动态语言秉承的一个理念是:优化人的时间而不是机器的时间
• 待静态语言披盔戴甲、备马抬枪之际,动态语言已衣袂飘飘,长剑出手了
• 当脚本语言披上动态语言的彩衣,昔日不起眼的毛毛虫便羽化成碟,开始飘舞在众人追逐的目光之中
阅读全文
摘要:
数据类型——规则与变通(
关于数据类型的讨论)
• Duck类型的哲学是:名义不重要,重要的是能力
• 将一个会叫会游的家伙放进池塘看起来不算坏主意,但如果一艘轮船趁机也轰隆隆地开了进来,事情恐怕就不那么美妙了
• 静态类型检查类似“疑罪从有”的有罪推定制,动态类型检查类似“疑罪从无”的无罪推定制
• 尽可能守规则,必要时求变通
• 规则如裤带,过于宽松和过于束缚都不好
阅读全文
摘要:
教学计划——接下来的故事(
讨论下一步教学计划)
• 编程水平的提升之道是:在实战中演练招法,在招法中领会心法,心法反过来提升招法,进而提高实战水平,如此循环往复呈螺旋式上升过程。正所谓熟能生巧,巧能生通
• 迭代学习法:即在具体知识与抽象理论之间进行折返式学习
• 网页的迷人之处就在于,能够用精美的画皮来包裹冗长低效的代码
• 无论干哪一行,要想胜任愉快,离不开四样东西:才能、兴趣、方法和努力
阅读全文
摘要:
情景范式——餐馆里的编程范式(
编程范式在餐馆中的应用)
• 厨师只需提供一种服务:把纸上菜变成盘中菜,至于蒸、煮、炒、炖等具体做法纯属实现细节
• 可以这么理解(闭包):所谓包,指函数与其周围的环境变量捆绑打包;所谓闭,指这些变量是封闭的,只能为该函数所专用
• 合理地使用闭包能使代码更加简洁清晰,散发出函数式特有的优雅气质
• 换盘子有两种方式:一种是服务员主动换,一种是客人要求换。前者是轮询,后者是通知
• 如果把待加工的菜看作数据,技法看作算法,将数据与算法分离,以算法为中心,那是什么范式?
阅读全文
摘要:
汇总范式——一张五味俱全的大烙饼(
总结编程范式)
• 设计模式好比组合套路,能在一些特定场合下克敌制胜;编程范式则好比武功门派,博大精深且自成体系
• 一种编程范式之所以能独树一帜,关键在于它突破了原有的编程方式的某些限制,带来革命性的新思维和新方法,进一步解放了程序员的劳动力
• 因其长而容己,因其短而容他,此万物之理也
• 语言为形,范式为神。若能以神导形、以形传神,则看似平白无趣的程序也能写出诗画般的意境
阅读全文
摘要:
逻辑范式——当算法失去了控制(
再谈逻辑式编程)
• 评价代码的复杂度,长短只是一个因素。程序员不是打字员,花在思考上的时间和精力远远超过花在键盘上
• 算法=逻辑+控制。其中逻辑是算法的核心,控制主要用于改进算法的效率
阅读全文
摘要:
函数范式——精巧的数学思维(
再谈函数式编程)
• 单靠记忆只能触及知识之表,单靠练习只能深入知识之里,唯有培养方能渗透知识之根
• 学会适度地容忍无知
• 不仅需要强调钻劲和深度的“钉子精神”,还需要强调磨功和广度的“刨子精神”
• 编程语言的语法、语义等都是从编程范式的树根衍生而出的枝叶,把握了这种脉络和节奏,代码才会如音乐舞蹈般韵律有致
• 每种范式擅长的问题领域不尽相同,只有博闻广识,方可扬长避短,程序才会如行云流水般流畅自然
• 程序员更习惯机器风格的过程式思维和现实风格的OOP思维,不容易接纳数学风格的函数式思维
阅读全文
摘要:
事件驱动——有事我叫你,没事别烦我(
事件驱动式编程简谈)
• 它们(同步回调和异步回调)都使调用者不再依赖被调者,将二者从代码上解耦,异步调用更将二者从时间上解耦
• 它们(控制反转、依赖反转和依赖注射)的主题是控制与依赖,目的是解耦,方法是反转,而实现这一切的关键是抽象接口
• “回调”强调的是行为方式——底层反调高层,而“抽象接口”强调的是实现方式——正是由于接口具有抽象性,底层才能在调用它时无需虑及高层的具体细节,从而实现控制反转
• 控制反转导致了事件驱动式编程的被动性
• 事件驱动式还具有异步性的特征,这是由事件的不可预测性与随机性决定的
• 独立是异步的前提,耗时是异步的理由
• 出版/订阅模式正是观察者模式的别名,一方面可看作简化或退化的事件驱动式,另一方面可看作事件驱动式的核心思想
阅读全文
摘要:
切面范式——多角度看问题(
AOP简谈)
• 从宏观角度看,太阳底下没有新鲜事——AOP无非是SoC原理和DRY原则的一种应用
• 从微观角度看,太阳每天都是新的——AOP虽自OOP的土壤中长出,却脱离藩篱自成一体
• 抽象是前提,分解是方式,模块化是结果
• 在常人眼中复杂的牛体,庖丁经过抽象,已目无全牛,及至提刀分解,自是游刃有余。待牛如土委地,模块化既成
• 两条(抽象与分解的原则):单一化,正交化。每个模块职责明确专一,模块之间相互独立,即高聚合低耦合
• 对程序员来说,英语也是一门计算机语言,而且是必修的语言
• OOP只能沿着继承树的纵向方向重用,而AOP则弥补了OOP的不足,可以在横向方向重用
• 如果一个程序是一个管道系统,AOP就是在管道上钻一些孔,在每个孔中注入新的代码流
阅读全文
摘要:
超级范式——提升语言的级别(
元编程简谈)
• 元编程作为超级范式的一个体现是,它能提升语言的级别
• 如果说OOP的关键在于构造对象的概念,那么LOP的关键在于构造语言的语法
• 离开IDE就无法编写、编译或调试的程序员,如同卸盔下马后便失去战斗力的武士,是残缺和孱弱的
• 既然有重复的代码,不能从语法上提炼,不妨退一步从文字上提炼
• 元程序将程序作为数据来对待,能自我发现、自我赋权和自我升级,有着其他程序所不具备的自觉性、自适应性和智能性,可以说是一种最高级的程序
阅读全文
摘要:
泛型范式——抽象你的算法(
泛型式编程简谈)
• 算法串联数据,如脊贯肉;数据实化算法,如肉附脊
• 泛型编程是算法导向的,即以算法为起点和中心点,逐渐将其所涉及的概念内涵模糊化、外延扩大化,将其所涉及的运算抽象化、一般化,从而扩展算法的适用范围
• 思想是鸡,结论是蛋
阅读全文
摘要:
并发范式——合作与竞争(
并发式编程简谈)
• 有谁愿意驾驶一辆启动后不能刹车、不能倒车、不能变速、油尽方停的汽车呢?
• 并发式编程以进程为导向、以任务为中心将系统模块化
• 并发式编程以资源共享与竞争为主线
阅读全文
摘要:
对象范式——民主制社会的编程法则(
OOP简谈)
• 如果把整个流程看作一颗倒长的大树,过程式编程自树根向下,逐渐分支,直到每片树叶,类似数学证明中的分析法,即执果索因的逆推法;OOP则从每片树叶开始,逐渐合并,直到树根,类似数学证明中的综合法,即执因索果的正推法
• 与其说OOP更具重用性,不如说更具易用性
• 函数是被动的实体,对象是主动的实体
• 过程式程序的世界是君主制的;OO程序的世界是民主制的
阅读全文
摘要:
声明范式——目标决定行动(
声明式编程简谈)
• 命令式编程是行动导向的,因而算法是显性而目标是隐性的;声明式编程是目标驱动的,因而目标是显性而算法是隐性的
• 声明式编程重目标、轻过程,专注问题的分析和表达而不致陷入算法的迷宫,其代码也更加简洁清晰、易于修改和维护
• 归根结底,编程是寻求一种机制,将指定的输入转化为指定的输出
阅读全文
摘要:
命令范式——一切行动听指挥(
命令式编程简谈)
• (命令式编程)其世界观是:程序是由若干行动指令组成的有序列表;其方法论是:用变量来储存数据,用语句来执行指令
• (结构化编程)在微观上,主张循规守矩;在宏观上,主张分而治之
• 一个按结构化编程思想设计的流程图,每个模块大小适中、模块之间关系简明、模块内部线路清晰,单从视觉上就会给人一种美感
阅读全文
摘要:
开班导言
1开班发言——程序员的四层境界
• 学会不如会学,会学不如会用,会用不如被用
• 知识之上是思想,思想之上是精神
2首轮提问——什么语言好?
• 没有激情作氧气,灵感的火花注定转瞬即灭
3语言选择——合适的就是好的
• 评判语言优劣,如同争论兵器高下,倘若撇开使用的主体和对象,皆为空泛之谈
• 西门吹雪的西来一剑,那是C语言;李寻欢的小李飞刀,那是汇编语言;陆小凤的灵犀一指,那是机器语言
4初识范式——程序王国中的世界观与方法论
• 当你编程之时,便进入到自己创造的世界之中。这是你的世界,只有注入你的想象力、创造力和激情,它才有勃勃生机。你编写的岂止是代码,分明还有乐曲;你敲击的岂止是键盘,分明还有琴键;你运行的岂止是程序,分明还有世界。当优美的旋律奏起,整个世界都随之翩然起舞,一种莫可名状的满足是否会充溢你的全身?
5软件技术——实用还是时髦?
• 知识的学习有几种方式:一种靠记忆,一种靠练习,一种靠培养
• 学习编程范式能增强编程语言的语感
阅读全文
摘要: 《冒号课堂》是系列《冒号和他的学生们》的升级版。新版本以课时为单位,并加上导读、总结、思考和附注,内容上也作了一定的更新和充实。
阅读全文
摘要:
软件接口服务的主客双方应遵循的准则
叹号幡然反省:“以前我们做OOP编程时,总是专注于如何利用其他类来解决问题,而较少考虑自己设计的类对其他类的影响。”。。。
作为服务的提供者,最重要的是讲诚信。首先,服务要有可靠性,不能阳奉阴违——即接口必须履行它的承诺;其次,服务要有稳定性,不能朝令夕改——即接口一经公开,不得随意变更。。。
此外,高质量的服务还要有纯粹性和完备性。Unix有一个哲学:‘一个程序只做一件事,但要做好’。用在OOP上,则是:‘一个类只提供一套服务,但要完善’。。。
关键不在于服务数量的多寡,而在于服务的一致性和关联性。。。
作为服务的享受者,最重要的是讲规矩。。。
以违背服务初衷的方式享受的服务,如同盛夏的豆腐——即使没有变质,也是不能持久的。。。
阅读全文
摘要:
OOP中的访问控制
问号提问:“信息隐藏是否专指用private来控制访问?”。。。
初级程序员的理想是为所欲为——能用编程解决一切问题;中级程序员的理想是尽善而为——追求最佳解决方案;高级程序员的理想是有所为有所不为——重在整体设计的选择,能抵制局部技巧的诱惑;最高理想是无为而无不为——无论宏观设计还是微观实现,均非刻意选择,却自然合度。。。
从软件应变的角度来看,访问控制是对修改所带来的副作用的控制。。。
客户意识对一个程序员的重要性,丝毫不亚于对一个企业的重要性。。。
千万不要为追求廉价的重用而轻易扩大接口范围,莫以自身之便而致客户之不便,莫以一时之便而致长期之不便。。。
阅读全文
摘要:
适应变化的能力是衡量软件质量的重要标准
第七课刚一开堂,冒号就提了一个问题:“如果把一个Java程序中所有的private关键字换成public,请问该程序还能工作吗?”。。。
软件的难点有二:其一是逻辑的复杂,其二是需求的变化。许多程序员看重前者而看轻后者,大部分时间花在寻求解决方案上,而不是在选择解决方案上。。。
软件之软,体现在适应变化的能力。。。
软件的变化大致分两种:一种是出于内在需求而作的结构性变化,通常以改善软件质量为目的,即所谓的重构(refactoring);一种是出于外在需求而作的功能性变化,通常以满足客户需要为目的。。。
信息隐藏虽能将抽象接口与具体实现分离,但仍然封装在同一类中。桥梁模式则让二者彻底解耦(decouple),增强了对变化的适应力,具有更大的灵活性和可扩展性。。。
阅读全文
摘要:
OOP中的封装与信息隐藏
“用广东话说,真是有型有料又有性格啊!”叹号啧啧连声,“这哪里是在设计软件,分明是在设计心仪的对象嘛。”。。。
广义的封装仅仅只是一种打包,即package或bundle,是密封的但可以是透明的。。。
狭义的封装是在打包的基础上加上访问控制(access control),以实现信息隐藏。。。
抽象意味着用户可以从高层的接口来看待或使用一类对象,而不用关心它底层的实现,而黑盒封装意味着用户无权访问底层的实现。。。
访问控制不仅是一种语法限制,也是一种语义规范。。。
“通,则大处圆融合一而小处各具其妙;不通,则大处千变万化而小处无所分别。”冒号又打起了禅语 ,“领会OOP的精髓绝非一年半载之功,但若以抽象与封装为钥,必可早日开启通达之门。。。”
阅读全文
摘要:
介绍抽象数据类型
问号抢着说:“我知道了:过程抽象的结果是函数,数据抽象的结果应该是数据类型。”。。。
数据结构强调具体实现,侧重应用;抽象数据类型强调抽象接口,侧重设计。。。
接口是纲,实现是目。纲若不举,目无以张。。。
人们多采取‘整体设计以数据为中心,局部实现以算法为中心’的方针,以增强系统的可维护性。。。
数据类型的接口与实现的分离,有利于开发时间的分离以及开发人员的分离。。。
抽象——接口与实现相分离;数据——以数据为中心组织逻辑;类型——单纯而定义良好的概念。。。
抽象——尤其是数据抽象——才是OOP的核心和起源,尽管它们并非OOP的专利。。。
只有贯彻ADT思想,设计出来的类才会是‘万人迷’:有优雅的外形——抽象,有丰富的内涵——数据,有鲜明的个性——类型。。。
阅读全文
摘要:
软件设计中的抽象思维
冒号健步走进教室,学员们立刻正襟危坐,进入战备状态。。。
语言是形,范式是神,这次我们将二者融合,争取做到形神兼备。。。
我们的重心不在知识的枝节,而在知识的本源。因此无论讨论Java还是OOP,我们不追求系统和全面,但力求从不同的选点、角度和深度来展示知识的活性。。。
那么什么是抽象呢?不妨概括为:去粗取精以化繁为简;由表及里以异中求同。再精炼些,抽象就是作减法和除法。。。
软件设计者的任务是将复杂混沌的现实世界映射到精确严格的虚拟世界,要完成这种多对一的映射,抽象无疑是必由之路。。。
这种通过规范使代码的功能与实现相分离的方法称为规范抽象。。。
阅读全文
摘要: 本文系《冒号课堂》(又名《冒号和他的学生们》)系列的目录提纲,随着写作的深入将逐步完善。欢迎大家多提意见!
阅读全文
摘要:
讨论Perl、PHP、Python和Ruby 语言
“剩下四种动态语言,我们将之归为后台脚本语言。”冒号说着画了张图表。。。
Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯。。。
叹号——没有最好的语言,只有最合适的语言。
逗号——没有糟糕的语言,只有糟糕的程序员。
问号——没有一种语言是万能的,只会一种语言是万万不能的。
引号——废除对语言的宗教信仰,建立对语言的哲学思维。
句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。。。
阅读全文
摘要:
讨论VB、Delphi和JavaScript
稍事休息后,冒号切换了话题:“接下来简单聊聊Visual Basic和Delphi。”。。。
在以网络为中心的企业解决方案中,作为平台语言的Java和C#是两棵比肩而立的大树,在它们周围生长着郁郁葱葱的动态语言的小草。。。
待友之道,贵在放大其优点而缩小其缺点,对待语言亦当如此。其实JavaScript的强大和优雅是超乎想象的,它如一只神奇的魔袋,乍看平淡无奇,却总能变出意想不到的宝贝。。。
前台编程涉及面专,绚丽花哨的界面更容易让初涉编程者产生成就感;后台编程涉及面广,需要深厚的技术积累和缜密的设计思维;底层编程涉及面深,给人神秘莫测之感。然大道相通,难者亦易,易者亦难。。。
阅读全文
摘要:
讨论Java和C#
逗号提出:“现在应该到了Java时间吧。”
冒号顺水推舟:“下面谈论的重心从刚才的系统语言转到平台语言——Java和C#。”。。。
这既是程序员之幸——语言之间可以互相取长补短,共同进步;也是程序员之不幸——往往不得不在众多语言中作艰难选择,或者多花精力学更多的语言。。。
以前人们试图在语言的威力(power)和生产率(productivity)中寻求最佳平衡点,现在似乎更想鱼与熊掌兼得。。。
Java的目的是让一种语言在多种平台上运行,而C# 的目的是让多种语言在一种平台上运行。
两个平台语言,一个重在语言,让语言向平台扩散;一个重在平台,让平台来凝聚语言。。。
编程语言绝非象牙塔中之物,实乃技术和商业合力推动的结果。。。
C++提供了一马平川的大路,也提供了陷阱密布的小道;Java则在大路上铺设水泥,同时封锁了捷径小道;C#同样填平了大路上的坑坑洼洼,但把一些小道上‘此路不通’的牌子偷偷改成了‘此路危险’。
阅读全文
摘要:
讨论C语言 , C++ 和D语言
问号忙问:“您打算比较哪些主流语言呢?”。。。
关于C语言,前面多次提到。这是一把历久弥新的宝剑,一旦出鞘,依旧寒光逼人,锋利无俦。有了它,便如战将有了佩剑,平添一分独闯敌营的胆气。。。
能力越大,责任越大,风险越大。此话既适用于编程语言,也适用于程序员。。。
指责C++不是100%OOP的说法更是荒谬之极。OOP又不是金子,含量越高越好。试图把一切都装进OOP的箱子里的想法无异于削足适履。。。
C与C++同为系统语言,决定了它们的理念是:优化机器的时间而不是人的时间,优化机器的记忆而不是人的记忆;假设编译器是愚蠢的而程序员是聪明的,因此赋予程序员更多的权利、义务与责任。。。
C++是匹无辔无鞍的野马,看似桀骜不驯,若能顺性而御,必能足踏飞燕,行千里而不劳。。。
阅读全文
摘要:
关于编程语言的讨论
教室里,学员们正热火朝天地讨论着流行的编程语言。。。
通禅悟道者拈花不语,坐井观天者蛙鸣鼓噪。。。
如果说编程范式是一种文化,那么编程语言更像是一种宗教——尽管它本不该是。。。
对待一门语言的态度应该是:与其抱怨争执,不如扬长避短。。。
对一种语言最大的批判是发明一种与此语言有类似功用的新语言;从另一个角度看,发明一种语言也是对先前语言的一种最高的赞美。。。
过分拔高一种语言与抹煞语言之间的差别是两种极端,皆为秕言谬说。。。
语言为本,余者为末。许多人偏偏本末倒置,常常为在IDE、框架、设计工具等中挖掘到某一新功能而欣喜不已,或者津津乐道于各种语言的优劣高下,却对正在使用的语言中大量的宝藏视而不见。这些人若有幸拜关公为师,他们最艳羡的一定他的赤兔马和青龙偃月刀,或许还会抹红脸蓄长须什么的,就是不太愿学他的盖世武功。。。
阅读全文
摘要:
动态语言简谈
叹号急不可耐地问:“现在可以谈动态语言了吧?”
冒号感言:“曾几何时,动态语言还只是陪太子读书的角色,那时候它们的名字是‘脚本语言’。近来却迅速崛起,俨然有与静态语言分庭抗礼之势。”。。。
程序是为终端用户服务的,而脚本是为程序员服务的。。。
动态语言秉承的一个理念是:优化人的时间而不是机器的时间,因此为提高人的生产率而不惜牺牲部分程序的性能。。。
两类语言的风格的确大相异趣:待静态语言披盔戴甲、备马抬枪之际,动态语言已衣袂飘飘,长剑出手了。。。
当脚本语言穿上动态语言的彩衣,昔日不起眼的毛毛虫便羽化成碟,开始飘舞在众人追逐的目光之中。但静态语言也绝不会淡出人们的视线,它如矫健的苍鹰,依然有搏击长空的雄力。程序员只要保持严谨的作风和开放的心态,既有稳如泰山的马步,又有一跃凌空的飞腿,静如处子,动如脱兔,如履平地般游走于高高的梅花桩上,绝无跌落之虞。。。
阅读全文
摘要:
关于数据类型
待教室平静下来,冒号再度开腔:“在谈论动态语言之前,最好先澄清一下它与动态类型语言之间的区别。”。。。
数据类型既有针对机器的物理意义,又有针对人的逻辑意义。。。
静态类型检查类似‘疑罪从有’的有罪推定制——在被证明合法之前是非法的,动态类型检查类似‘疑罪从无’的无罪推定制——在被证明非法之前是合法的。。。
阅读全文
摘要:
讨论下一步教学计划
一阵商讨之后,众人似乎未能达成共识。冒号见状,便让他们一一道来。。。
网页的迷人之处就在于,能够用精美的画皮来包裹冗长低效的代码。。。
无论干哪一行,要胜任愉快,离不开四样东西:才能 、兴趣 、方法和努力。没有才能则难以胜任;没有兴趣则难以愉快;没有方法则事倍功半;没有努力则一事无成。。。
阅读全文
摘要: 评论网友Plusy对《关于信息系统组织方式的一个提案》的评论
阅读全文
摘要: 昨日整理Gmail信箱之时,觉有不便之处,于是进入“Suggest a feature for Gmail”的页面,准备提些建议。不意一只灵感的小虫悄悄爬上脑梢,急欲捕之而后快。遂作“A Proposal on Organization of Information System”一文,以备Gmail参考之用。甘冒不谦之嫌,窃以为该提案是对包括文件系统、邮件系统等在内的信息系统的组织方式的一种创新。。。
阅读全文
摘要:
关于信息系统组织方式的一个改进方案
Information itself is great, but storing and retrieving information sucks.
From a user’s view, most information systems are essentially organized in hierarchical structure. The major flaw of this kind of structure is that it only provides a single path to the target information. Aiming at this, this article proposes a practical solution by borrowing some ideas from Gmail system.
阅读全文
摘要: 在这样一个非常时期,任何激情均无以挣脱悲情,创作的灵感也随之芳踪难觅。与此同时,《冒号和他的学生们》系列也到了下一个驿站。。。
如果说这个系列是一粒种子,BlogJava便是肥沃的土壤,关注的目光便是和煦的阳光,真诚的留言便是滋润的雨露。。。
阅读全文
摘要:
编程范式总结
众人落座之后,冒号开始了第四课的讲授:“我们已经涉及了不少编程范式,虽只是走马观花,亦可管窥一斑。现用表格归纳如下——”。。。
编程水平的提升之道是:在实战中演练招法,在招法中领会心法,心法反过来提升招法,进而提高实战水平,如此循环往复呈螺旋式上升过程。正所谓熟能生巧,巧能生通。。。
软件工程中有个迭代开发法,本班则采用迭代学习法:即在具体知识与抽象理论之间进行折返式学习。当然这种迭代不是机械式的重复,而是增量式的循环。。。
阅读全文
摘要:
餐馆里的编程范式
叹号摘下眼镜,揉了揉眼:“范式再好,多了也难免有些审美疲劳。”
逗号也搓着太阳穴:“现在脑子被灌得沉甸甸的。”
“彼此彼此!你们的脑袋闹涝灾,我的喉咙闹旱灾。”冒号说着,拿起矿泉水瓶一饮而尽。
大伙听着怪别扭的,这不是拐着弯说我们脑子进水了吗?
冒号清了清嗓子:“为尊重民意,也为避免消化不良,大家先放松一下。下面我们来个情景编程。”。。。
阅读全文
摘要:
AOP简谈
引号重开话题:“OOP方兴未艾,AOP又开始崭露头角。AOP算是OOP的一种分支、一种补充还是一种超越?”。。。
“准确地说,抽象是前提,分解是方式,模块化是结果。”冒号很讲究精确,“大家记得庖丁解牛的故事吧?在常人眼中复杂的牛体,庖丁经过抽象,已目无全牛,及至提刀分解,自是游刃有余。待牛如土委地,模块化既成。”。。。
问号提问:“抽象与分解的原则是什么?”
冒号作了个V字:“两条:单一化,正交化。每个模块职责明确专一,模块之间相互独立,即高聚合低耦合。。。
何谓横切关注点?顾名思义,乃是与程序的纵向主流执行方向横向正交的关注焦点。。。
对程序员来说,英语也是一门计算机语言。。。
阅读全文
摘要:
元编程简谈
引号忽然想起一事,问道:“有一本名为《C++模版元编程》的书,既然提到了模板,想来也属于泛型编程吧?”。。。
“元程序将程序作为数据来对待,能自我发现和自我赋权,有着其他程序所不具备的自觉性、自适应性和智能性,可以说是一种最高级的程序。它要求编程者超越常规的编程思维,在一种崭新的高度上理解编程。想象一下,”冒号激情勃发,“如果有一天机器人能自我学习、自我完善,甚至能生产机器人,实现‘智能繁衍’,是不是很美妙?”。。。
阅读全文
摘要:
泛型式编程简谈
冒号重新开讲:“你们会不会经常遇到这种情景:一遍又一遍地写着相似的代码,有心将其归并,却因种种原因无法践行。”
逗号心有戚戚焉道:“是啊,有时明明两个函数的实现几乎一模一样的,就因为某些参数不匹配,无法合而为一。”
“有一种编程范式可以解决这个问题,它打破了不同数据结构之间的壁垒,让你的代码不再臃肿,这——就是泛型编程。”冒号的语调和说辞不免令人联想到电视上的减肥广告。。。
算法串联数据,如脊贯肉;数据实化算法,如肉附脊。。。
泛型编程是算法导向(Algorithm-Oriented)的,即以算法为起点和中心点,逐渐将其所涉及的数据结构内涵模糊化、外延扩大化,从而扩展算法的适用范围。。。
在数学家眼里,思想是鸡,结论是蛋。。。
阅读全文
摘要:
并发式编程简谈
逗号好奇地问:“还有其他类型的编程范式吗?”
“不但有,而且有很多。”冒号喝了一口水,悠悠地说,“并发式编程就是其中之一。”。。。
并发式编程以进程为导向(Process-Oriented),以资源共享与竞争为主线——与当今世界形势何其相似乃尔!这意味着程序设计将围绕进程的划分与调度、进程之间的通讯与同步等等来展开。。。
如果将程序系统视作公司,那么并发式系统是产品型公司,每个进程是一名工人,其职责是执行单一任务;对象式系统是服务型公司,每个对象是一名服务员,其职责是提供系列服务。。。
阅读全文
摘要:
OOP简谈
短憩之后,引号迫不及待地问:“面向对象的范式应该是一种特殊的命令式吧?”。。。
与其说OOP更具重用性,不如说更具易用性。。。
如果把整个流程看作一颗倒长的大树,过程式编程自树根向下,逐渐分支,直到每片树叶,类似数学证明中的分析法,即执果索因的逆推法;OOP则从每片树叶开始,逐渐合并,直到树根,类似数学证明中的综合法,即执因索果的正推法。。。
函数是被动的实体,对象是主动的实体。过程式程序的世界是君主制的,主函数是国王,其他函数是臣民,等级分明,所有臣民在听命于上级的同时也对下级发号施令,最终为国王服务;OO程序的世界是民主制的,所有对象都是独立而平等的公民,有权力保护自己的财产和隐私并向他人寻求服务,同时有义务为他人提供承诺的服务,公民之间通过信息交流来协作完成各种任务。。。
阅读全文
摘要:
命令式编程与声明式编程简介
第二课伊始,冒号开门见山:“首先介绍的是最基本的两种编程范式:命令式和声明式,其中命令式又称过程式。。。”
命令式编程是行动导向(Action-Oriented)的,因而算法是显性而目标是隐性的;声明式编程是目标驱动(Goal-Driven)的,因而目标是显性而算法是隐性的。。。
归根结底,编程是寻求一种机制,将指定的输入转化为指定的输出。三种范式对此提供了迥然不同的解决方案:命令式把程序看作一个自动机,输入是初始状态,输出是最终状态,编程就是设计一系列指令,通过自动机执行以完成状态转变;函数式把程序看作一个数学函数,输入是自变量,输出是因变量,编程就是设计一系列函数,通过表达式变换以完成计算;逻辑式把程序看作一个逻辑证明,输入是题设,输出是结论,编程就是设计一系列命题,通过逻辑推理以完成证明。。。
阅读全文
摘要:
关于框架、设计模式、架构和编程范式的讨论
“现在我们具体介绍一下编程范式。”冒号忽然顿住,隐觉一抹失望从众人脸上掠过,问号更是欲言又止,便鼓励他开口。
问号略显迟疑:“您说编程范式是一种心法,那框架、设计模式还有架构呢?”。。。
“自以为懂的未必真的懂,自以为不懂的未必真的不懂。” 冒号玩起了玄学,“有些概念和技术即使背得烂熟,甚至用得烂熟,那也不代表真正掌握;有些概念和技术看起来很新奇,却不过是新瓶装旧酒。”。。。
框架与工具包最大的差别在截然相反的设计理念上:库和工具包是为程序员带来自由的,框架是为程序员带来约束的。。。
设计模式是软件的战术思想,架构是软件的战略决策。。。
知识的学习有几种方式:一种靠记忆,一种靠练习,一种靠培养。。。
句号悟道:“您是想告诉我们,编程范式就是编程语言的语感?”。。。
阅读全文
摘要:
关于编程心法
问号第一个从小说里走出来,问道:“刚才谈到了低级语言和中级语言,现在该谈高级语言了吧?”。。。
掌握一门语言的语法、工具和技巧固然重要,但那只相当于学会一门兵器的招法,更重要的当然是心法。招法重形,心法重意。得形而忘意,无异舍本逐末;得意而忘形,方能游刃有余。下面要谈的就是一种心法:编程范式。。。
当你编程之时,便进入到自己创造的世界之中。这是你的世界,只有注入你的想象力、创造力和激情,它才有勃勃生机。你编写的岂止是代码,分明还有乐曲;你敲击的岂止是键盘,分明还有琴键;你运行的岂止是程序,分明还有世界。当优美的旋律奏起,整个世界都随之翩然起舞,一种莫可名状的满足是否会充溢你的全身?。。。
句号一语惊人:“找对象是‘对象导向’的,去约会是‘面向对象’的。”。。。
阅读全文
摘要:
简要回顾计算机语言
问号觉得自己的问题并未解决,追问:“这么多种语言,仅凭流行度就能分出主次优劣吗?”
“流行度当然不是唯一的指标。”冒号答道,“语言的主次优劣因人而异,答案在你们自己身上。还是刚才那句话,唯一的老师是你自己。”
期待的目光如风中之烛般开始黯淡。。。
好的语言就是适合编程者和解决对象的语言。。。
句号灵光一闪:“我明白了——西门吹雪的西来一剑,那是C语言;李寻欢的小李飞刀,那是汇编语言;陆小凤的灵犀一指,那是机器语言。”。。。
阅读全文