程序员为什么会忽略ISO标准?[关闭]


18

我经常遇到的一件事是由不符合ISO标准的程序引起的问题。

一个示例不是使用ISO国家/地区表,而是自己编写简写,这对于美国(US)或荷兰(NL)来说还可以,但对于英国(GB,而不是英国)或西班牙来说则明显错误(ES,而不是SP)和许多其他国家/地区。

另一个示例是内部日期符号。为什么会有人将日期存储为01/02/2014?目前尚不清楚是2月1日还是1月2日,而如果使用ISO标准,则只存储2014-02-01 *,而2月1日则是明确的。

我的问题:有ISO标准可用时,程序员什么时候以及为什么要自己构造结构?

*存储2014-02-01,并在将其显示给最终用户时相应地格式化日期。


64
因为他们不认识他们,或者忘记了他们!有成千上万的ISO标准...。您知道所有ISO26262吗?
Basile Starynkevitch 2014年

11
通常,缺乏作为程序员的经验会使您做一些事情,而自己却没有意识到后果是什么。通常,很快就会想到“我会这样做”,而无需任何评估是否已经存在。
dammkewl

13
而且,很多ISO标准也不容易找到(通常它们要花很多钱,而找到最新的草案也不那么容易!)。
Basile Starynkevitch 2014年

64
关于标准的伟大之处在于,有太多选择!
约尔格W¯¯米塔格

5
最奇怪的事情是迫使非英语语言环境用户将非英语语言环境的用户更改其本地系统范围设置为小数点才能正常工作的程序。更不用说拒绝工作或仅在非英语字符集(俄语,日语,希腊语)下产生垃圾的程序,更不用说RTL系统(希伯来语,阿拉伯语)了。我想这涉及一些无知。
JensG 2014年

Answers:


63

切勿将愚蠢充分解释为恶意。- 罗伯特J汉隆

那,并且缺乏沟通。

因此,这不是反ISO情绪的阴谋,使人们认为“我知道,我会用英国代替GB”,也不是说“他们知道得更多”,甚至不是说该标准不好的感觉。 。这完全是因为他们只是不知道它在那里,所以他们应该使用它。

我的意思是,对于某些人来说,如果未将其捆绑到Visual Studio中,则它也可能不存在。对于另一些人,也许他们只是不想要完整的清单,或者获取最终清单太困难了,所以他们只是组成自己的子集来解决当前情况。对于其他用户,默认使用的是默认格式-因此日期格式不是“采用ISO格式,甚至不是国家/地区语言环境设置”,而是“采用任何格式设置的格式”,如果适合他们,则工作就完成了(通常是对美国程序员的批评)。


20
许多ISO标准太昂贵和/或难以获得……这无济于事……即使您非常想这样做!
heltonbiker

yyyy-mm-dd ...并不昂贵
Halfbit 2014年

11
@halfbit:购买昂贵,计算资源并不昂贵。认真地浏览他们的商店。您要浮点标准吗?那将是178法郎。
user2357112支持Monica 2014年

32

当我使用Ruby编程时,我通常总是忽略ISO Ruby标准。为什么?因为这是难以置信的限制!ISO Ruby是Ruby 1.8和Ruby 1.9交集的最小子集。当前所有版本的Ruby(或至少即将推出)都支持Ruby 2.1,它具有许多使编程更容易的功能。使用ISO Ruby编程是一种PITA。

当我使用C#编程时,我也忽略了ISO C#,它是C#2.0的子集(更重要的是,ISO类库是.NET BCL的一个很小的子集),而我却使用C#5.0进行编程,不限制自己仅使用ISO CLI中指定的库,而是使用.NET 4.5.2和Mono 3.4.0中可用的库的公共子集。

同样,在进行网页设计时,我非常喜欢使用HTML5而不是ISO HTML(这是HTML 4.01 Strict的一小部分),因为HTML5比功能强大的旧版HTML子集具有更多的功能。

因此,有充分的理由忽略ISO标准。


9
这取决于C,C ++,Fortran ...情况截然不同。
弗拉基米尔F

1
这似乎不像是问题所要解决的“忽略”,而更像是“选择可以满足您需求的工具”。如果您需要C#5.0功能,那么使用ISO C#并没有使用ISO C或ISO Fortran那样有意义。那根本不是您要求的工具,而且ISO没有等效工具。您的示例还涉及坚持定义良好的标准,而不仅仅是ISO标准。
Leushenko

3
@Leushenko我不同意;OP似乎认为您应该始终遵循ISO标准。+1为这个“应该”的粗俗反例。
djechlin 2014年

3
很好,但是我认为问题实际上是在谈论数据表示的ISO标准,而不是编程语言的ISO标准。
Aaronaught

4
有人认为(某些)ISO标准是“委员会设计”反模式的完美典范……
heltonbiker 2014年

22

根据您的示例,“ GB”是英国的国家/地区代码。但是,“ UK”曾经是MARC(美国国会图书馆)的标准代码,尽管我认为已经过时了。IANA .uk用于英国的顶级域名。

因此,如果某项不符合ISO标准,则并不意味着使用任何标准。这可能仅表示正在使用其他标准。(正如@Jörg在评论中指出的那样,关于标准的好处是可以选择的标准太多。)在哪种情况下,问题实际上变成哪种标准最适合给定的问题领域,环境等

对这个问题的回答可能很大程度上是基于观点的,很快就会演变成一场“宗教”辩论。但是,符合ISO标准不一定总是最好的答案。例如,如果某个软件需要与图书馆数据库接口,则MARC标准可能比ISO更合适。如果您组织的大多数软件都以某种方式执行操作,那么您可能要坚持使用这种方法,至少在短期内如此—毕竟这是组织的“标准”。


此外,标准的确会发展/变化。昨天的合规可能不是今天。


而且,尽管我不想排除无知和/或懒惰是导致您指出问题的原因……开发人员可能根本没有足够的时间来解决这些问题。


15

符合ISO标准并不总是一项免费活动。如果正在使用的工具包中尚未实现某个特定标准,那么程序员将面临一个必要的选择:现在正确实施该标准还是不实施该标准并稍后处理转换会更便宜?

说“嘿,您应该始终执行该标准”很容易,但是一切都有代价。程序员可能不想实施ISO标准有很多充分的理由。

  • 客户可能遵循专有或非ISO标准。更好地满足客户期望的标准,而不是通过隐藏除了客户所需和您的语言要求之外的其他实现方式,为继任者带来意想不到的麻烦。
  • 可能存在大量现有数据,并且转换或格式中断可能尚不可行。如果您有二十年的客户联系方式和以本地日期时间为键的合同,那么您不一定要将所有数亿个字段都更改为ISO标准日期,直到您正确地做。
  • 遵守该标准可能会带来比提供的好处更大的成本。例如,如果您要处理完全在美国境内的条目,则五个字符的ISO-3166-2代码(US-NY)是标准美国邮政编码(NY)上不需要的三个字符。

1
除了敏捷过程,在设计/规范阶段包含任何功能(包括ISO标准)总是比在实施/维护阶段便宜,因为设计阶段仅占工作的10%。这仅仅是对收益递减规律的颠倒-类似于识别和修复生产中的缺陷所花费的成本比通过单元测试或验收测试所发现的缺陷高出10倍之多。如果您有不使用ISO标准的一个坚实的理由可言,那很好; 如果您说稍后再实现,那是在说谎。
亚伦诺特,2014年

@Aaronaught:您认为我应该澄清一下,“转换”是指外部文件转换,而不是内部重写吗?
DougM 2014年

如果这就是您的意思,那么我肯定会澄清。这通常不是那么简单,因为ISO为数据类型定义了比文件类型更多的标准,并且如果不是大多数开发人员,许多开发人员会处理本身不处理文档或“文件”的应用程序。例如,如果您在数据库中存储了非ISO日期或国家/地区代码(而没有存储相应的ISO日期或国家/地区代码),那么将来的转换成本将非常高。另一方面,如果您只是在谈论导入某些行业特定的文件类型,那么可以肯定的是,您可以随时执行此操作。
亚伦诺特2014年

+1“ ......您不一定要更改所有这亿万个字段...直到您可以正确完成。” 究竟。
大卫

14

对于没有经验的程序员/数据库设计师,这是因为不知道。他们倾向于重新发明轮子,因为他们不认识跨行业的一群人,他们已经讨论了这个问题,并提出了所有参加者都认可的标准,通常是经过很长时间的讨论,修订等。最近,一位同事当我告诉他关于某周是一年的最后一周还是次年的第一个星期时,我的一个人表现出一种怀疑的态度(ISO 8601)。他不相信针对如此具体的事物存在标准。我告诉他,许多应用程序的正确性取决于该标准。

对于经验丰富的程序员/数据库设计人员而言,它是由于“了解更好”,此处未发明的综合症和/或过分雄心引起的。他们不信任ISO或任何其他标准机构,因为他们认为ISO代码“不够稳定”,这意味着它有一天会发生变化。因此,他们创建了自己的,在此处发明的或自动递增的代码/标识符,从而阻碍了互操作性,他们也忽略了它们。看到这个类似的问题,高度数据库设计倾斜。他们给出如下原因:

我可能不一定希望我的数据库设计依赖于一堆第三方(IATA,ISO),无论它们的标准多么稳定。或者,我可能根本不想依赖特定的标准。

在此处输入图片说明

奇怪的是,那些不遵守标准的人使用标准USB端口,购买标准尺寸的DVD和BluRays,并使用符合标准的轮胎驾驶汽车。


12
-1适合您的经验丰富的反ISO程序员。
djechlin 2014年

4
@djechlin引号中的短语是所链接问题中真实答案的原义短语。您甚至可以在页面中搜索以查看那些是真实的意见。同样,并非所有有经验的程序员都讨厌标准。
图兰斯·科尔多瓦

2
@djechlin在我的回答中有一个链接的问题,请查找“请参阅此相似问题”。“问题”一词具有链接。您可以在其中搜索引号中的确切短语。
TulainsCórdova2014年

2
@djechlin链路处于答案,不是问题,在这里你有它:programmers.stackexchange.com/questions/204340/...
Tulains科尔多瓦

5
在另一方面,写这个答案的人却歪曲了所链接的问题。并不是人们不想使用这些标准,而是依赖于特定标准的稳定性作为主键的问题。今天,大多数经验丰富的数据库设计人员都将设法使您远离“自然键”时期,因为它们几乎不可避免地会变得不如您最初想象的自然。这只是将物理数据库设计与逻辑数据脱钩的一个论据-没有人说根本不使用这些标准。
2014年

10

嗯,人们倾向于忽略ISO标准:例如,您写了

如果您使用ISO标准,则只需存储20140201 *,就可以毫无疑问地存储在2月1日。

但实际上完全符合ISO8601标准的格式是2014-02-01。(另请参见xkcd 1179


7
ISO8601标准允许使用YYYY-MM-DD和YYYYMMDD格式来表示完整的日历日期。
Pieter B

1
确实; 因此,我的写作“完全合规”。20140201是标准中的“基本”格式。
克莱门特

8
ISO允许使用基本格式和扩展格式,这两种格式都完全兼容。
Pieter B

10
ISO 8601 was published on 06/05/88 and most recently amended on 12/01/04.经典
WernerCD 2014年

8

原因之一是应用程序域和用户可能自己未使用这些标准。即使某些领域使用某些标准,但出于历史原因,其中某些领域可能会做出与ISO标准不同的选择。

如果您的用户已经在其现有过程(1)中使用“英国” 来指代“大不列颠及北爱尔兰联合王国”,则在其数据结构中使用“ GB”并不一定有意义(尤其是如果您表示按国家/地区划分的国家并不是完全“ ISO”国家/地区,例如将英国国家分开或与海峡群岛有细微差别等等。当然,您可以在内部存储和演示文稿之间建立映射,但是有时,它有点过头了。您很少出于编程的目的而进行编程,而通常必须适应您的环境。(2)

您还必须记住,这些标准是与软件并行发展的。您通常必须在其他软件的上下文中进行开发,其中某些软件可能设计不完善,而某些软件仍可能受旧式决策的影响。

即使您查看内部数据存储格式,也很难解决一些歧义。例如,据我所知,Excel使用十进制数字表示时间戳:它使用整数作为自参考日期以来的天数,然后小数之后的数字表示24小时中的分数。 ..问题是,这使您无法考虑时区或夏时制(一天中的23h或25h),并且Excel默认会将任何日期/时间转换为该内部格式。如果您要使用的其他软件没有选择余地,则是否要使用ISO格式无关紧要。

(1)在这里我不是指“编程过程”。

(2)不要问我为什么人们在日常生活中也不使用这些标准。我的意思是YYYYmmdd清晰,dd / mm / YYYY清晰,但是订购具有中,小,大粒度的日期(例如mm / dd / YYYY),这没有意义:-)。


1
哈!你知道没有道理吗?小数点应为逗号!;)
Darkwater23年

@ Darkwater23哈,我不介意任何一种方式,这只是一个约定,不需要讲得通。只是我一直发现mm / dd / YYYY似乎完全缺乏逻辑,为什么不为时间戳加上mm-MM-dd-HH-YYYY ;-)但是,我同意,这就是方法是的,所以我们必须忍受它。
布鲁诺

2
@ Darkwater23实际上,ISO标准对键盘上的小数点分隔符使用了一个奇怪的unicode符号(this:),而且我认为普通的刻度线(')也对数字分组进行了标准化(尽管我现在找不到它)
Izkata

+1指出夏令时浪费时间的另一个原因。
ctrl-alt-delor 2014年

1
@richard我不一定会介意DST,但是程序员肯定应该将目标时区信息一起存储起来。无论如何,跨多个时区(独立于DST)使用应用程序并不少见,确保在存储时间戳时留出尽可能少的歧义空间应该是初始设计的一部分。(它可能并不总是适用,但有疑问,它总是值得考虑的。)当然,这是一个复杂的问题(例如,不仅是+01小时,而且位置也可能很重要,取决于使用情况)。
布鲁诺

8

为什么我不使用ISO 3166-1 alpha-2国家/地区代码?

因为我使用的是STANAG 1059国家/地区代码,因此,英国是英国的代码(而不是根据ISO 3166-1的GB)。

另外,我可以使用FIPS国家代码-再次,英国是英国的国家代码。

有许多标准(ISO和非ISO),有时特定领域会使用/要求与ISO标准不兼容的标准。


7

存储20140201一点也不明确。仅当您包含遵循ISO标准的知识时,它才变得明确。2014年1月2日也是如此:当您包含格式为mm / dd / yyyy的知识时,它也是完全明确的。

只要该应用程序不必与其他应用程序接口,任何记录良好的标准都可以正常工作。

对于人类(我倾向于使用1-2-2014)和计算机(使用二进制表示法而不是ISO更好的计算机)之间存在权衡。新手程序员倾向于坚持他们容易理解的内容,更多的经验使程序员开始看到面向计算机的存储的优点。


4
同意 如果我正在编写国际消费申请,我会更关注ISO。我在中美洲的应用不需要任何开销或限制。
Darkwater23

4
通过编写“只要该应用程序不必与其他应用程序交互”,您就有充分的理由使用ISO标准。
图兰斯·科尔多瓦

5
您的个人资料没有列出您的位置,因此我不知道您的采样日期是在一月还是二月。
djechlin

6
-1表示不会与其他应用程序交互。这与整个编程行业相反。
djechlin

18
@Jeff:除了声称可以进行这种编码以外,我从未见过将其编码为YYYYDDMM的日期。你有吗
超级猫2014年

5

到目前为止尚未提出的一点是国际标准的文化适用性。

考虑测量的国际标准。让我们向美国用户展示这些内容。我不确定您所有的美国用户是否会对公里,千克和升感到满意。

考虑到国际标准是政府制定的。如果西班牙政府选择不承认巴斯克语,那么它将如何获得ISO规范?边缘化群体的方言和克里奥尔语尤其如此。

甚至国家代码也可能会出现问题:克里米亚现在是否拥有自己的国家代码?最终会找到公式(例如,“前南斯拉夫的马其顿共和国”),但是您的申请可能需要一定的支持,直到外交或战争结束。

考虑到编写国际标准时要考虑到特定的应用。这些可能并不完全适合您的应用程序。例如,如果您存储语言以发送信件,那么您可能希望对盲人进行清晰编码,即使他们精通美国英语。统计机构充分意识到有必要指定变量的确切含义(又称变量的“元数据”),因为它们在人口普查期间遇到了每种可能的边缘情况。对于数据库字段而言,其中一些严格的条件非常值得。

最后一点是,在做出这些选择时,您的程序可能会做出政治声明。这种现实可能会干扰最好的代码(例如,对于一种语言,您可能需要多个语言名称)。


我相信大多数盲人都能找人读给他们的信。您并不是第一个向他们发送信件的人(或公司)。
2016年

5

以我的经验,由于各种原因,程序员无法使用ISO标准,例如:

  • “我不知道有ISO标准”(一旦被告知,这就是一个正当理由!)
  • “无法访问该标准(找不到/ afford副本)”(真的吗?)
  • “标准太严格了”(通常,如果标准说“不要”,那是有充分理由的。忽略它会对您和您的客户造成危险!)
  • “该标准不包含最新的功能/库”(任何标准都不包含您将要使用的每个库,因此请遵守该标准中包含/覆盖的所有事物,并与该事物的标准保持一致它没有)
  • “该标准难以实施”(过度使用的借口,但请参见下文)

我从我的工作人员那里接受的唯一理由不是“ me脚的借口”,这是“标准确实不是一个很好的'合适'”-有证据支持。有时,适用的ISO标准的复杂性与问题/解决方案不成比例。有时,您将要实现解决方案的环境与标准所假定的环境大不相同。有时可以改进标准-这就是进展的方式。

通常,未能使用ISO标准的原因可能是缺乏经验,懒惰或自大。我很遗憾地说,说英语的程序员在国际化方面特别懒惰,我们的美国同事倾向于将ISO视为“无关紧要的欧洲事情”(对对此不适用的少数人表示歉意)。


5
这不一定与欧洲无关,除非您需要与关注它们的人进行互操作,否则这无关紧要。欧洲人多久遵循ANSI标准,而没有其他理由成为标准?
stonemetal

1

ISO有很多标准。CCITT / ITU也是如此。这些标准中的一些是“理想的”标准,而另一些是最低要求的功能。经常不清楚哪个是哪个。

我记得在1980年代问过为什么某些设备供应商实施标准的一个子集,而其他供应商实施另一种子集。从那时起,通常是在某些工作奏效之前就制定了标准。而且,供应商经常故意选择不实施标准,以便他们妨碍互操作性,从而为他们带来优势。

这就是为什么我喜欢IETF RFC。直到有RFC的3个独立实现,它们才成为RFC。


2
IETF的“粗略共识和运行代码”模型至少早在1995年就被放弃了。在那个时代,我也参与了IETF,该模型是“我视的规范,甚至不是参考实现。 ”。可以使用“运行代码”标准,而不是弄清楚如何实现一个完全未指定的协议,并使它与必须猜测的其他实现一起工作,这真是太好了。
msw

1
当我开始使用IETF RFC时,我使用的是1995年之前开发的RFC。运行的代码规范是最好的。否则,您最终会遇到太多象牙塔制图软件工程师梦dream以求的规格,而没有使它们运行的​​责任。
杰伊·戈德斯

1

如果要构建Oracle数据库,并且要存储日期,则将使用Oracle DATE数据类型。我不知道或不在乎Oracle是否符合ISO标准。这确实是我符合其他标准(Oracle标准)的一种情况,与ISO标准的差异不大。请参阅@David的回复。

在某些情况下,当我意识到自己设计的东西已经有了ISO标准时,退回和重新设计的成本本来是过高的,或者至少可以这样看。

在短期内,通过仔细研究现有标准,通过使用可用的标准或通过发明新的标准,可以产生更多的工作代码。当大规模集成需要互操作性时,就会出现不利的一面。这几乎总是在以后的项目中发生。


1
我不熟悉Oracle,但是在使用SQL Server或MySQL时,我当然也使用它们各自的日期数据类型来存储日期。但是,当编写带有日期的查询时,它们都很好地识别yyyymmdd,当您使用语言环境日期时它会被命中或遗漏。
Pieter B

那是个很好的观点。存储的标准和接口的标准可能不同。
Walter Mitty 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.