因此,出现了很多问题,询问是X邪恶,是Y邪恶。
我的观点是,没有语言构造,算法或任何有害的东西,只有那些被滥用的语言。天哪,如果您看上去很努力,甚至还有goto的有效用法。
那么,在编程中是否存在绝对邪恶的东西,那在所有情况下都与最佳实践完全不兼容?如果是这样,那是什么?还是只是不好的程序员不知道什么时候合适?
编辑:明确地说,我不是在谈论程序员的工作(例如不检查返回码或不使用版本控制-它们是不良程序员做出的选择),我的意思是工具,语言,语句,无论是什么,坏...
因此,出现了很多问题,询问是X邪恶,是Y邪恶。
我的观点是,没有语言构造,算法或任何有害的东西,只有那些被滥用的语言。天哪,如果您看上去很努力,甚至还有goto的有效用法。
那么,在编程中是否存在绝对邪恶的东西,那在所有情况下都与最佳实践完全不兼容?如果是这样,那是什么?还是只是不好的程序员不知道什么时候合适?
编辑:明确地说,我不是在谈论程序员的工作(例如不检查返回码或不使用版本控制-它们是不良程序员做出的选择),我的意思是工具,语言,语句,无论是什么,坏...
Answers:
编程中没有真正的邪恶。
<rant>
许多人认为有邪恶的事情的原因是,当他们第一次上编程课时,它就被捣碎了。“不要使用goto!始终规范化数据库!永远不要使用多重继承!” 之所以采取这些措施,是因为这些“邪恶”的做法很容易被滥用,而不是因为它们本身就很糟糕。它们的用途很少,您一开始只能说“从不”。真正邪恶的是在说:“没有理由考虑不是“最佳实践”的任何东西”,因为总有一个地方是完美的。
</ rant>
枪不杀人,人杀人。
以同样的方式,开发工具不是邪恶的,程序员可以使用它们。
空的通用异常处理程序,即:
catch(Exception ex)
{
}
我毫不怀疑有人可以给我一个有效的用例-但是,老实说,它会非常有创意……至少您需要一个解释。
也许我可以左右翻转的问题,并询问是否有在节目是什么绝对和完全好?如果您无法想到一件事情(我知道我无法做到),那么邪恶的概念也一样混乱。
常见的行为会导致错误,误解和其他普遍的混乱-但是说语言功能X本质上是邪恶的,那就是要承认您真的不了解功能X的目的。
有一些常见的行为可以节省很多心痛并避免一些误解-但是说语言功能Y本质上不错就是承认您不完全了解使用功能Y的所有含义。
我们是一个了解有限,见解深刻的人,这是危险的组合。夸张只是表达我们的观点,夸大事实直到成为虚构的一种方式。
但是,如果我能避免导致问题的行为并追求避免问题的行为,我可能会更有生产力。归根结底,这就是全部。
我唯一想到的是:
#DEFINE TRUE FALSE
#DEFINE FALSE TRUE
但是再一次,这只是普通的误用,呵呵。
我认为剥皮,永久位于系统托盘中的自动更新程序,劫持文件关联和其他系统设置的应用程序都是邪恶的。
以及仅限Flash的网站。
偶然发生的所有工作本质上都是邪恶的。
让我们考虑以下使用默认编译器选项的C程序,它恰好在我的机器上实际工作:
#include <stdio.h>
int main(int argc, char *argv[]) {
char string[10];
int y;
for (y=0; y<10; string[12]++) {
printf("%d\n", y);
}
}
没什么,这个程序增加循环计数器的方式真的没有任何借口。这只是未定义的效果,恰好在我的机器,编译器和默认选项上做正确的事情。
那么,在编程中是否存在绝对邪恶的东西,那在所有情况下都与最佳实践完全不兼容?如果是这样,那是什么?
是; 标准C库函数gets()
。C标准委员会正式弃用它是非常邪恶的,并且有望在下一版标准中消失。由一次库调用引起的混乱比破坏30年以上的旧代码的前景更可怕- 这就是多么邪恶。
gets()
接受一个参数,即缓冲区的地址。从标准输入读取字符到缓冲区,直到看到换行符为止。因为它接收的只是缓冲区的地址,所以gets()
不知道缓冲区有多大。如果将缓冲区的大小设置为10个字符,并且输入流包含100个字符,则多余的90个字符将立即在缓冲区之后写入内存,这有可能破坏堆栈。因此,它是受欢迎的恶意软件利用。它在设计上是不安全和不安全的。
容易,IBM Rational ClearCase是一个暴行。
那么,在编程中是否存在绝对邪恶的东西,那在所有情况下都与最佳实践完全不兼容?
当然不是。这就像问我工具箱中的任何东西是否有害。除非我四岁,否则我的锤子对我来说是一个巨大的“好”。
不要太认真,但是...
我们对“邪恶”有非常近视的看法。杀死很多其他人的人是邪恶的。从别人那里偷东西的人是邪恶的。每个国家(据我所知)过去都有一些邪恶。有些人想否认。
编程中有邪恶吗?我们无辜的程序员可能会想“不是真的”。但是,一旦我与一个广泛使用的分层数据库的发明者进行了交谈,就涉及到这个主题。是否想知道谁是最好的客户之一?共产主义波兰的秘密警察。
现在世界上有邪恶吗?你打赌 他们在使用程序员吗?你打赌
空是邪恶的根源!
十亿美元的错误:我称之为我的十亿美元错误。这是在1965年发明空引用的。那时,我正在设计第一个全面的类型系统,用于面向对象语言(ALGOL W)的引用。我的目标是确保所有对引用的使用都绝对安全,并由编译器自动执行检查。但是我无法抗拒引入空引用的诱惑,仅仅是因为它是如此容易实现。这导致了无数的错误,漏洞和系统崩溃,在最近四十年中可能造成十亿美元的痛苦和破坏。近年来,许多程序分析器(例如Microsoft中的PREfix和PREfast)已用于检查引用,并在有可能不为空的风险时发出警告。诸如Spec#之类的最新编程语言引入了非空引用的声明。这是我在1965年拒绝的解决方案。CAR Hoare,2009年
令我惊讶的是,没有人将Globals视为真正的邪恶。在一个您不了解参数并且几乎无法控制它们发生的情况的环境中,没有更好的编程方法。混沌!我在所有编码中都严格禁止使用全局变量。
我知道我说我不会发帖,但我会写一个答案。正如所有人都说不,没有邪恶,我会说是,绝对有邪恶
Setjmp / LongJmp是纯粹的邪恶。
冗余代码是非常非常邪恶的。
这意味着您通常应该避免某某某事,但并非始终应该避免某某事。例如,每当它们成为“邪恶替代品中的最小邪恶”时,您最终将使用这些“邪恶”事物。开个玩笑,好吗?不要太当真。
尽管任何工具都可以用于善恶,但有些工具却是邪恶的,因为它们经常使不经常使用它们的程序员感到惊讶。
当处理小于32位的整数时,我认为Java中的无符号右移运算符(>>>)是邪恶的(令人惊讶地是不合适的)。
假设您有一个值为-1的字节b。
byte b = -1; // binary: 1111 1111
无符号右移运算符将零移位到最左边的位。因此,假设移位7以得出1。
b >>>= 7; // binary: 0000 0001 ?
但是,此操作完全不执行任何操作。b仍为-1。
甚至以下25个班次都无济于事:
byte b = -1;
for (int i = 0; i < 25; ++i) {
b >>>= i;
System.out.println(b); // always outputs -1
}
发生这种情况是因为b>>>=7
大致翻译为
1111 1111
1) the byte gets widened to a 32 bit int to make shifting possible
1111 1111 1111 1111 1111 1111 1111 1111
2) the shift happens
0000 0001 1111 1111 1111 1111 1111 1111
3) the resulting int gets narrowed to a byte again
1111 1111
您将不得不更换
b >>>= i;
通过
b = (b & 0xFF) >>> (i % 8); // >> would also work this time
使它像预期的那样工作。
用您的母语(不是英语)编写代码,用您的母语编写文档。然后将该项目外包给一家印度公司。
对你来说这是邪恶的!
PS:从记录来看,这确实发生了,印第安人并不觉得这很有趣。
我很想说延续,但是我认为正确的答案是编程中没有客观的,绝对的邪恶。另一方面,即使是最好的工具也可能被滥用。