阅读更多

10顶
0踩

编程语言
许多年前在编程语言设计和操作系统设计上的选择可能当时看起来无关紧要。但是,这些远古的决定至今仍然继续困扰着软件开发者。

程序员使用的是别人开发出来的编程语言和操作系统以及各种开发工具。一些语言开发和系统设计行业里的前辈以前所作出的决定在那个时候可能是很有意义的,不过在现在看来可能是多此一举。

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

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

1. Unix隐藏点文件

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

从那时起,点文件经常性的会被忽视掉,同时也成为恶意文件藏身的一种简单方法。



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

2. JavaScript使用“+”来连接字符串

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



可是最后结合JavaScript的弱类型发现,使用+操作符通常会导致数值变量的连接,而不是数值的加减。其他的编程语言同样选择了不同的连接操作符,或者是安排专门的程序员严格输入变量,以防混淆。
引用
“当我第一次学习JavaScript的时候,真的把我害惨了,因为前后不一致的的输入行为使得很难在最后的检查过程中发现bug。”——Chris Dutrow

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

在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

关注ITeye官方微博 @ITeye官微,获得更多更新资讯和社区精彩内容。
  • 大小: 16.2 KB
  • 大小: 28.2 KB
  • 大小: 23.5 KB
  • 大小: 13 KB
  • 大小: 31.7 KB
  • 大小: 28.4 KB
  • 大小: 27.5 KB
来自: InfoWorld
10
0
评论 共 11 条 请登录后发表评论
11 楼 shuhen2011 2014-04-10 12:20
微软的反斜杠确实很蛋疼,另外,第6条的自动加分号是怎么个意思?
10 楼 zoozooll 2014-03-25 10:57
leffxa2012 写道
做了5年python,苦不堪言,比起c和java,差太多了,根本不适合做系统,只适合写一些简单的小工具

你用python做操作系统?
9 楼 scbzly_4223 2014-03-24 18:31
啊飒飒
8 楼 ray_linn 2014-03-21 14:54
斜杠和反斜杠怪不到微软头上吧。原因是出在 CP/M 身上, CP/M 以反斜杠来接受命令参数,作为CP/M的山寨版,DOS 就只能接受斜杠来作为路径分隔符了。

至于 UNIX 和 CP/M ,大家一样古老,谈不上谁该迁就谁。反正当时就是一盘散沙,各爱各妈。
7 楼 canon99 2014-03-21 14:25
斜杠反斜杠傻傻分不清楚,特别是js用+号连接字符串然后又加入变量
6 楼 如若_晴 2014-03-21 08:40
一直在想http后面的双斜杠有什么用,原来根本就没用
5 楼 sgq0085 2014-03-20 17:55
现在ITEYE首页新闻只剩下抄袭了啊
4 楼 dsjt 2014-03-20 16:08
分不清 斜杠 反斜杠
3 楼 leffxa2012 2014-03-20 11:27
做了5年python,苦不堪言,比起c和java,差太多了,根本不适合做系统,只适合写一些简单的小工具
2 楼 文仁126520 2014-03-19 16:06
没有关注过啊!
1 楼 ansjsun 2014-03-19 14:10
有几点还是很赞同的

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 研发周报:编程语言中一些令人抓狂的规则

    编程语言中一些令人抓狂的规则。 在上一周,最值得程序员关注的某过于Java 8正式版的发布。经过2年半的努力、屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本。同时,发布的还有...

  • PHP语言最令人“抓狂”的十二种特性

    如果真是这样,我们就不会如此广泛地使用Drupal、WordPress以及其它一些同类框架。假设我们真的讨厌PHP,那么最直接的办法是转向Java而非在这里放什么厥词。不过需要提醒各位拥护者的是,也别因为熟悉而对P

  • Lisp 是怎么成为上帝的编程语言的

    尽管 Lisp 是广泛使用的编程语言中第二古老的(只比 Fortran 年轻一岁),程序员们也仍旧在互相怂恿。想象一下,如果你的工作是为某种组织或者团队推广一门新的编程语言的话,忽悠大家让他们相信你的新语言拥有神力...

  • GO语言-第一节-初识Go语言

    本章将简要介绍Go语言的发展历史和关键的语言特性,并引领读者对Go语言的主要特性进 行一次快速全面的浏览,让读者对Go语言的总体情况有一个清晰的印象,并能够快速上手,用 Go语言编写和运行自己的第一个小程序。

  • 牛客网最全在线笔试、编程攻略(建议收藏)

    答:牛客在线编程题目前支持C++11、C++14、Java、C、Python、Python3、pypy2、pypy3、C#、PHP、JavaScript、R、Go、Ruby、Swift、ObjC、Pascal、Sql、TCL、matlab、bash等 ...,不同企业可能会对编程语言有限制要求...

  • 【Python学习教程】Python编程基础

    文章目录编程语言是什么编译型语言和解释型语言的区别编译型语言1) 可执行程序不能跨平台2) 源代码不能跨平台解释型语言关于 Python总结Python是什么,Python简介Python的特点(优点和缺点)Python 的优点1) 语法...

  • [转]主流编程语言优劣考

    前言 本文的目的并非是想挑起语言之争,而是希望通过客观地分析每一种主流语言的能力,辨明其长短,让程序员... 正文 这里,我将比较一下几种主流编程语言:C,C++,Java,.NET,Ruby,JavaScript。其他主流编程语

  • [译] 编程语言和平台:对一条推特思路的评论

    原文地址:Programming Languages and Platforms: an annotated twitter thread 原文作者:Steven Sinofsky 译文出自:掘金翻译计划 ...语言和平台的交织通常源于平台开发商有意选择语言。本文基于近期对 ...

  • 编程心得分享,送给刚入门学编程的小伙伴

    下面给大家分享下,众多小伙伴的编程心得,希望对你有所帮助。 这篇文章我是在知乎上看到的,感觉很不错。原作者回顾了自己漫长的编程学习之路,从中总结了许多个人经历,走的弯路,和教训。我摘抄了过来,希望能...

  • 2014以及未来几年编程语言趋势

    2014以及未来几年编程语言趋势 热门还是冷门?从Web到主板再到培训工作,一同探讨哪些项目正当其时、哪些则逐渐退出历史舞台。 程序员总是喜欢对时尚界冷嘲热讽,认为那里的风潮总是一波接着一波、令人莫衷一是...

  • 《Python游戏编程入门》——1.3 Python中的对象

    本节书摘来自异步社区《Python游戏编程入门》一书中的第1章,第1.3节,作者...Python是面向对象编程语言,这意味着,它至少支持一些面向对象编程概念。现在,我们将花一些时间来介绍这些概念,因为这是一种编写代码...

  • 浅谈编程能力的培养与提高——写给编程初学者的话

    很多初学者常常为如何培养自己的编程能力以及如何写出优秀的程序而困惑,即使是掌握多门计算机语言,或者某些信息学竞赛的获奖者,再或者是有过一定编程经验的人也都会在达到一定程度后,因为无法再向前走一步而苦恼...

  • 常用1.SchLib

    常用1.SchLib

  • tokenizers-0.26.0.jar中文文档.zip

    # 【tokenizers-***.jar***文档.zip】 中包含: ***文档:【tokenizers-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【tokenizers-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【tokenizers-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【tokenizers-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【tokenizers-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: tokenizers-***.jar***文档.zip,java,tokenizers-***.jar,ai.djl.huggingface,tokenizers,***,ai.djl.engine.rust,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,djl,huggingface,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【tokenizers-***.jar***文档.zip】,再解压其中的 【tokenizers-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>ai.djl.huggingface</groupId> <artifactId>tokenizers</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'ai.djl.huggingface', name: 'tokenizers', version: '***' Gradle (Short): implementation 'ai.djl.huggingface:tokenizers:***' Gradle (Kotlin): implementation("ai.djl.huggingface:tokenizers:***") ``` # 含有的 Java package(包): ``` ai.djl.engine.rust ai.djl.engine.rust.zoo ai.djl.huggingface.tokenizers ai.djl.huggingface.tokenizers.jni ai.djl.huggingface.translator ai.djl.huggingface.zoo ``` # 含有的 Java class(类): ``` ai.djl.engine.rust.RsEngine ai.djl.engine.rust.RsEngineProvider ai.djl.engine.rust.RsModel ai.djl.engine.rust.RsNDArray ai.djl.engine.rust.RsNDArrayEx ai.djl.engine.rust.RsNDArrayIndexer ai.djl.engine.rust.RsNDManager ai.djl.engine.rust.RsSymbolBlock ai.djl.engine.rust.RustLibrary ai.djl.engine.rust.zoo.RsModelZoo ai.djl.engine.rust.zoo.RsZooProvider ai.djl.huggingface.tokenizers.Encoding ai.djl.huggingface.tokenizers.HuggingFaceTokenizer ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.Builder ai.djl.hu

  • 电力系统PMU优化配置研究——基于MATLAB的多种算法实现与性能比较

    内容概要:本文详细探讨了电力系统中PMU(相量测量单元)的优化配置问题,旨在确保系统完全可观测的同时尽量减少PMU的数量。作者介绍了六种不同的算法,包括模拟退火、图论方法、递归安全N算法等,并通过MATLAB实现了这些算法。通过对IEEE标准测试系统的实验,展示了各种算法在不同规模系统中的表现。文中不仅提供了具体的MATLAB代码实现,还分享了许多实用的经验技巧,如邻域解生成、退火速率设置、拓扑排序等。 适合人群:从事电力系统研究的技术人员、研究生以及对组合优化感兴趣的科研工作者。 使用场景及目标:适用于电力系统状态估计、故障诊断等领域,帮助研究人员和工程师找到最优的PMU配置方案,提高系统的可靠性和经济性。 其他说明:文章强调了在实际应用中需要注意的问题,如变压器支路的影响、节点编号不连续等问题,并推荐了几篇相关领域的经典文献供进一步学习。此外,还提到了一些有趣的发现,如某些中间节点装PMU反而能减少总数。

  • spring-ai-mistral-ai-1.0.0-M5.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

  • 三菱FX1s与台达MS300变频器基于Modbus RTU通讯的实战指南

    内容概要:本文详细介绍了三菱FX1s PLC与台达MS300变频器通过Modbus RTU协议实现通讯的方法。首先,文中列举了所需的硬件设备及其连接方法,确保PLC与变频器能够正常通信。接下来,针对频率设定、频率读取及正反转启停控制三大主要功能进行了详细的编程讲解,提供了具体的梯形图代码示例并解释了每一步的作用。此外,还涉及到了触摸屏(MCGS和威纶通)的配置步骤,使用户可以通过触摸屏方便地操作变频器的各项功能。最后,作者分享了一些实用的小技巧和常见错误避免方法,帮助使用者快速解决问题,提高工作效率。 适合人群:从事自动化控制系统集成的技术人员,尤其是那些需要将三菱PLC与台达变频器进行互联的工程师。 使用场景及目标:适用于工业自动化领域的项目实施过程中,旨在帮助技术人员掌握三菱FX1s与台达MS300变频器之间的高效通信技术,从而更好地完成系统集成任务。 其他说明:文中不仅包含了详细的理论知识和技术要点,还有丰富的实践经验分享,有助于读者全面理解和应用相关技术。同时,提供的完整工程文件可以直接应用于实际项目中,极大地节省了开发时间和成本。

  • winrar免费版压缩工具

    winrar免费版压缩工具

  • 基于CEC21测试函数的灰狼、鲸鱼、人工蜂群优化算法性能对比及Matlab实现

    内容概要:本文详细介绍了灰狼算法(GWO)、鲸鱼算法(WOA)和人工蜂群算法(ABC)在CEC21标准测试函数集上的性能对比。通过设定相同的实验条件(种群数量50,迭代次数500次,30维问题空间),分别探讨了各算法的关键参数调整及其对不同类型函数(单峰、多峰、复合)的影响。文中提供了每个算法的核心代码片段,并针对具体函数给出了优化建议。最终结果显示,GWO在单峰函数上有优势,WOA擅长处理旋转和平移问题,而ABC在高维复杂环境中表现出色。 适合人群:从事优化算法研究的科研人员、研究生以及对智能优化算法感兴趣的开发者。 使用场景及目标:适用于需要评估和比较不同优化算法性能的研究项目,特别是那些涉及高维、多峰、旋转平移等问题的实际应用场景。目标是帮助研究人员选择最适合特定任务的优化算法,并提供参数调优的经验。 其他说明:文章不仅提供了理论分析,还分享了许多实践经验,如参数调整技巧、初始化方法等。此外,所有实验均基于Matlab平台完成,附带完整的代码实现,方便读者复现实验结果。

Global site tag (gtag.js) - Google Analytics