电源插座和软件设计

2002年的冬天,我在北京联通出差。刚参加工作,有点小紧张,给电脑接电源,插三孔插座的时候错位60度,噗哧一下冒起了火花。没有酿成事故,但是这件事情一直没能忘记。其实国标的三孔操作在设计规范上已经考虑了这种错误,三个插孔的开口方向是不一样的。问题出在插座上面,当时用的是万能接线板,除了国标,欧标和美标也能插进去,因此国标插头即便错开60度,用点力气也能插进去。此后到其他地区出差,特别留意他们的插座,发现最安全的是欧标,三相插孔的设计两阴一阳,根本没有错位的可能。

欧标插头和插座

欧标插座还有其他优点,比如最多调整90度就可以对准;插头作为整体嵌入插座,不用担心金属部分暴露漏电;圆柱状金属头加球面前端设计,省力且牢固。这些暂且按下不表,今天想谈的是程序设计语言中的安全措施。

程序语言的插座--类型系统

最近用python开发过几个小工具,颇为趁手。原因之一是python支持duck typing。可以把任意类型的对象赋值给变量,运行时系统在访问到这个对象的时候才会判断其类型是否正确。换句话说,实现了类级别的运行时多态(对比一下,C++/JAVA通过接口和虚函数支持函数级的运行时多态,而模板支持类和函数级别的编译时多态)。

首先,不要求提前定义接口。可以边思考边写代码,不用在接口部分和实现部分之间来回切换。

其次,不要求统一的对象界面。实现多态的时候不需要对象都是从统一接口上扩展出来的,对象可以拥有只在某些特定分支下会被调用的接口,其他对象,如果不会命中这些分支,就可以不用定义这些接口。如果习惯了c++/java,这种风格就是脑残,但是对快速开发真的很有效。想象一下,在静态语言的OOD中,如果原来设计的统一接口满足不了需求,通常意味着概念抽象出了问题。乐观情况下,要么扩展原有接口方法的内涵,并在调用者和被调用者之间重新分布职责;要么把无法涵盖的部分抽取出来,增加一个接口方法。

凡事必有两面,首先是正确性不易验证。类型错误只有程序运行时才能检测出来,通电以后才能发现抽头插错了,用静态语言,同样的错误最晚编译时就能检查出来。

其次是代码结构不易理解。阅读静态语言,看看数据结构、函数原型(C语言),或者类型/接口定义(C++/JAVA),对程序结构能了解个八九不离十。动态语言,非得把对象间的调用代码读完,才能把握程序的设计结构。

JAVA是相反风格的代表,典型的“欧标插座”。不支持动态类型,更不支持内存这种“万能插座”。做一件事情,JAVA只给你一种方法。

语言设计和程序设计要考虑两个认知因素,一是方便写,一是方便读。动态类型方便写,静态类型方便读。动态语言编写结构复杂,确定性要求高的程序还是面临挑战。语言没有内置“欧标插座”,必然要求语言的使用者自律,尤其是团队协作开发时必须遵循一致的设计策略。

提升安全的语言特性

程序设计语言一直在往里面添加安全特性。比如ANSI C添加对函数原型的支持(最古老的C语言只关心函数名字,不检查返回值和参数类型,C的链接器现在还保留这样的设计),const和static修饰符;C++链接器的隐式函数类型检查,引用类型,类成员的可见性修饰;java对指针的弃用,package,等等。恰当使用这些特性,可以把错误捕获在编码阶段。

不止是软件设计

但凡人会犯糊涂的地方,都是“欧标插座”的用武之地。只能单向打开的消防门,电脑机箱里的各种接线缆接头,优秀软件的人机界面等等。程序设计语言和API,本质上是一种抽象的人机界面。程序语言是人和计算机之间的界面,API是人和另外一堆代码的界面。记得读大学的时候,学校里有个工业心理学实验室,主任是现在阿里的王坚,他们的主要方向就是各种人机界面设计问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,287评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • 一年前的今天,5.27,“我爱妻”,我们欢乐领证。 从此,我们成为相亲相爱的一家人。 那时,我已经怀上了悟空宝贝,...
    黄_悟空阅读 246评论 0 0
  • 弹指一挥间,终于到了年底。这大半年来,对面婆娘的所作所为我都记得帐。也该是清算的时候了。 临近春节,每个水果摊位上...
    大張冰阅读 154评论 4 1