说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

编程语言中一些令人抓狂的规则

HTML文档下载 WORD文档下载 PDF文档下载
许多年前在编程语言设计和操作系统上的选择可能当时看起来无关紧要。但是,这些远古的决定至今仍然继续困扰着软件开发者。下面所介绍的就是一些在编程语言和操作系统里的那些让开发者头疼的过时的选择。

众所周知,软件开发者每天都要做各种各样的决定:如何最好的实现功能、如何修复bug、如何提升应用程序的性能等等。但是他们同样是在别人的劳动成果下面继续做自己的决定的,比如说:他们使用的是别人开发出来的编程语言和操作系统以及各种开发工具。一些语言开发和系统设计行业里的前辈以前所作出的决定在那个时候可能是很有意义的,不过在现在看来可能是多此一举。

举例而言,在2009年的时候,互联网创始人蒂姆·伯纳斯-李就承认,互联网网址中http:后面的两条斜线//其实并无必要,他为这带来的不便致歉。蒂姆以幽默的环保角度道歉说:真不知道这两条斜线浪费了多少时间、打印墨水和纸张。


除此之外,对于每天都要写代码的软件开发者来说,前辈们当时做出的令后人觉得蛋疼的决定还远不止这些。接下来就介绍一下在编程语言和操作系统里的那些让开发者头疼的过时的选择。

1. Unix隐藏dot文件(“.” 文件)

早期的Unix操作系统就这样设计过:当通过ls命令把目录内容列出来的时候,任何以 . 开始的文件或目录会在默认情况下被隐藏起来。


从目录列表里隐藏当前(.)或者是隐藏根目录(. .)的方法将所有带 . 的文件有效地隐藏起来了。从那时起,点文件经常性的会被忽视掉,同时也成为一种提供恶意文件的简单方法。

“在之前的40年里,因为这一个小小的走捷径而导致多少bug的出现?浪费了多少CPU循环?出现了多少人为失误?所以我们应该记住:下次如果你还想在代码里抄近路的话,一定要想想之前的教训。”——Rob Pike

2. JavaScript使用+字符串连接

大约在20年前,当Netscape首先开发JavaScript的时候,他决定大量使用+操作符来连接字符串,主要是用在数字加法运算和字符串连接这两方面上。


可是最后结合JavaScript的弱类型发现,使用+操作符通常会导致数值变量的连接,而不是数值的加减。其他的编程语言同样选择了不同的连接操作符,或者是安排专门的程序员严格输入变量,以防混淆。

“当我第一次学习JavaScript的时候,真的把我害惨了,因为前后不一致的的输入行为使得很难在最后的检查过程中发现bug。”——Chris Dutrow

3. Microsoft选择反斜杠作为路径分隔符

在1983年的时候,微软发布了MS-DOS 2.0,它包括了一个目录层次结构,就像Unix。但是和Unix有所不同,Unix使用正斜杠(/)来分割目录路径,微软使用了反斜杠(\),原因是,正斜杠已经被用于表示命令行选项,所以微软选择了反斜杠。


反斜杠在Unix和其他的例如Perl 和 C语言中主要是用来区分后后面紧跟着的字符,所以这给程序员带来的痛苦就是要经常在正斜杠和反斜杠之间来来回回的兜圈子,以免出错。

“回想起来,我觉得这是一个可怕的决定,但是换成是我的话,当时可能会做出同样的举动。”——Dave Lindbergh

4. Python使用缩进表示块

绝大多数编程语言使用明确的分隔符,例如用大括号来表示语句的分组,而 Python却不是这样的,它使用前导空白(空格和制表符)来表示哪一个块属于哪一行代码。


事实上,只有那些经验丰富的Python程序员比较倾向于使用这个功能,而对于那些新手或者是不常使用它的程序员来说,别提有多恼怒了,尤其是剪切代码、粘贴代码、改变平台,或者是重构代码的时候。

“在两个平台之间转换的过程中,你会发现这真是编程语言里的极品功能啊!”——Joe Zitzelberger

5. Tony Hoare发明了空引用

在1965的时候,英国著名计算机科学家Tony Hoare将空引用概念引入到ALGOL W语言里,以确保所有使用的引用内容都是安全的。一直到现在,这一发明都存在于大部分编程语言里。


编译器是不会抱怨空指针的,但是想要废弃一个可能会导致运行时错误或系统崩溃的引用的话,那么程序员必须设法做一些防御措施或者是调试工作。

“我认为它是一个导致数十亿美元损失的错误。”——Tony Hoare

6. JavaScript使用分号插入

JavaScript中分号表示语句结束,但JavaScript会自动的在它认为合适的地方插入分号。例如在程序结尾,或者在紧接1个新行的return语句后面。


在某些情况下,return后面可能会有大括号和新的代码块,这种情况下,如果自动插入分号,就有可能导致语法错误。

“这一功能着实让开发者的工作出现了一点混乱,尤其是当你为一个生产环境压缩代码的时候。”——Mike Nelson

7. 如何表示日期

在如何表示日期这一问题上已经产生过很多比较有效地选择方案了,例如只使用两个数字或者是更少的数字来表示年份,可以被四整除的年份是闰年,或者是像Unix系统那样提供的基本时间服务是国际标准时间公元1970年1月1日00:00:00以来经过的分秒,这种秒数是以数据类型time_t表示的。我们称它们为日历时间,日历时间包括时间和日期。


只使用两个数字或者是更少的数字来表示年份就会导致众所周知的Y2K问题,计算闰年的过程中也是会出现很多bug,有些系统照样会出现Y2K38 问题。

“在20世纪60年代的时候,内存的价值大约为1美元/字节。所以,在60年代或者是在80年代的时候使用2个数字来表达年份是很合理的。可问题就在于是稳定而精确的软件所运行的时间完全超出了其预期的设计时间。”——Fred Krampe

原文:InfoWorld

玩转物联网之MQTT 专访都灵创客教育奚炎:被忽视的Maker教育 13岁iOS开发者:Swift开发Sprite Kit游戏实践 专访豌豆荚「自动装」开发团队:无需Root即可批量点击「下一步」 iOS项目的持续集成与管理 《近匠》谛听科技,探索智慧家庭的智能网关 【简讯】Python 3.5.0b1发布 《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀 专访李祎:Java在Testin的技术应用 React首部经典图书推荐:全程经典实例,360度剖析React.js 再做一个Android!Google发布第二代VR眼镜Cardboard Go语言开发常见陷阱,你遇到过几个? 奏响年度最强音 第七届中国云计算大会日程全公布(表) 【CTO讲堂】请在还年轻的时候,尽量多踩些坑 以细分使用场景为突破点 探究墨迹天气的体验创新 熟练成就创造——MathWorks全球副总裁Richard Rovner、产品市场经理赵志宏专访 Objective-C编码规范:26个方面解决iOS开发问题 豌豆机器小组发布最新WRTnode2R,支持华为Liteos、QQ物联与AllJoyn [新书推荐]Node.js项目实践:构建可扩展的Web应用 【简讯】Perl 5.22.0 发布,大幅改进代码! 【征文】特别策划——群雄逐鹿共话新型数据库 针对DCloud侵权质疑,APICloud发布声明 《近匠》小鱼天气,中国风与细粒度空气质量检测 Xcode 7 beta发布,Swift 2.0带来哪些新变化? 【有奖征集】MDCC 2015演讲议题征集全面启动 Swift语言那些鲜为人知的特性 《开源者说》08期:聊聊Java那些事儿 专访唐成:从小工到专家,PostgreSQL的修炼之道 《瞬间之美》作者Robert Hoekman Jr:如何成长为UX领袖人物? TIOBE 2015年6月编程语言排行榜:Swift份额上升,Objective-C成自由落体 【CTO讲堂】Box首位华人核心工程师的回国创业之路 注册表的问题,有什么方法*****(送100分) 请问黑龙江中程成绩怎么查呀? 请问.net能在linux等操作系统上运行吗? 一个简单的问题? 请问哪里有delphi第三方控件开发和使用的书籍下载啊? 请问.net能在linux等操作系统上运行吗? 请问awt和swing有什么本质的不同呢?! 有点难度的sql 90分!看看这段JSP程序为什么出错。谢了! 模式窗体的postback 求教:在在模式对话框BOOL CXXX::OnInitDialog()中InitSocket()初始化失败,怎样退出该模式对话框 关于JTable,如何设置一行的颜色。 一个很简单的问题 读取远程的页面文件内容,但需要搜索结果的页面,请问如何实现??? 写了一个telnet服务器端程序,不能用exit退出,请大家帮忙看看~~谢谢! ?!我怎么看不了帖子内容啊?!点开每一贴都出现同样的页面如下,各位是怎样? 我只能看见标题:( 图片文件上载页,在上载页中实现预览的问题?急! 我的Asp为什么不能执行? 请教xml问题。 如何动态获得表单中checkbox中的name的值还有获得其值。 如何在UNIX下配置 Tomcat4.0 + Apache1.3 + JDK1.3? 在线等待! 请问版主:为何我在本版搜索“多语言”,找到的结果中没一个打得开? 如何在一个菜单项里控制另一个菜单项的状态(如变灰) 菜鸟问题 关于几个按钮布局?急 求救:关于在程序中运行其他程序的问题! 请问哪有Report Machine的下载? 请问只知道备份文件如何恢复数据库? To:qxjavajava: 哪里可以找到scjd的题目大家先做一下? 高程水平压线通过后的一点总结 请帮初学者看看这段简单的代码!感激t0 '_bstr_t' : missing storage-class or type specifiers 文件操作安全问题,请微软专家和各位高手进来看看 请教tdbgrid如何在非绑定模式下加入新行写入数据 问一下,在datagrid里加入comboBox控件后,怎样使comboBox的边框不可见? ==高手请看,数据库备分恢复问题== 这两种赋值方法真的有区别吗?内有代码,请指点 关于与后台连接的问题 请问黑龙江中程成绩怎么查? 如何用sql语句统计满足条件的记录数? 用ASP作下拉式菜单怎么坐呀?蛮着急的呀!! 一个看似简单实则绕脑的小问题 pb8是否内嵌easerver服务器? help 请教高手:一个写输出的问题,再线等待 我在一个组件中定义了一个Text2的属性,可如何让它显示在VS。NET的属性框中呢。 用了XTREME后,它自己生成的SDI框架中,菜单.状态栏的字体太小,我想改成9号宋体,怎么办? 怎样在数据库里保存文件! 急急。。得到树的导航?在线等待!! 刚才忘记说了,如何在sql里给中文排序? 请问有什么函数可以将BigdDecimal类型转换成为String类型??(很着急!) 来者有分 杭州东站屋顶发电站昨并网发电 可供电浙江4个普通收费公路项目今日24时提全国人均月薪杭州4595元排名第五(杭州火车南站7月1日起全封闭改扩建杭州今起出梅 一年中最热酷暑到来新老年法7月1日起实施 常回家看看被金华市唯一五星级酒店卫生检测不合格生态日杭城开展骑行活动铁路杭州南站6月30日落幕等待扩建张鸿铭任杭州市委副书记 提名为市长候买房配套利用率不高 业主争论12万改东站乘车设施不完善 网络购票需提前取杭州气象台发布高温报告 未来最高温可温州整顿行政审批搭车服务 对强制收费高铁开放五种买票方式 换乘时间要预留宁波首趟高铁列车发车17分钟时速达3杭州东站换乘有攻略 每层都设购票点宁波今明最高气温达38℃ 夏季小儿易杭州朝晖六区房屋变形 倾斜远超危房标杭州昨首发高温橙色预警 今明预计最高宁波到上海高铁昨天中午在杭州东站停靠驻贝宁大使陶卫光拜会贝宁总统亚伊驻墨西哥大使邱小琪会见墨西哥革命制度“北大仓”回归“北大荒”:中国发展的驻克罗地亚大使邓英会见海南省省委副书驻黑山大使崔志伟会见黑中友好协会主席两部门下拨蒙辽豫鄂宁2.81亿元中央国民党发言人陈以信:不动产98%已回台湾“九合一”选举11月9日编造选举特写:探访草原上最大的侵华日军要塞组团进城学科技兰西农民心欢喜澳官员帕尔默发表“辱华言论” 悉尼亚男童嫌楼外“蜘蛛人”施工太吵割断安全老年人的幸福生活:醉心“戏迷”你唱罢生饮山泉水 妇人肚中长两条蛲虫海峡两岸诗书画交流展启幕 连战吴伯雄欧洲央行选定ABS计划顾问柯震东获释在即 传被下“封口令”河南拟推旅游小费合法化美国国会预算办:预算和经济前景喜忧参江苏吴江女大学生失踪案告破 嫌疑人购悉尼亚裔社区要求帕尔默在电视上公开道
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘