什么是骇客?[关闭]


55

我经常听到同事互相说:“这是一个可怕的骇客。”

我可以摆脱的是那不是很好。当我问他们是否可行时,他们说“是的,但是不好”。这是否意味着它不是一个好的解决方案?如果可行,解决方案有多糟糕?是由于良好的做法吗?还是无法维护?它是否将代码的副作用用作解决方案的一部分?

当某物被归类为骇客时,这对我来说很有趣。您如何识别它?


5
某些方法可能会起作用,但工作缓慢,脆弱,丑陋且难以维护。这是一个hack。
Trezoid

1
贫民区操纵的代码== hack
Garet Claborn

我并不是说这是黑客,但是您想重新思考动态猴子修补程序,+以根据启发式方法进行划分。
Dietbuddha 2011年

对于所有声称黑客是肮脏的创可贴的人,请访问outpost9.com/reference/jargon/jargon_23.html#TAG824-2 . /n./令人难以置信的好,也许是非常耗时的工作,可以准确地产生所需的内容。

1
尚未按照通用标准或上级标准实现的功能。
Aditya P

Answers:


97

它正在为大的伤口使用临时创可贴。目前,它已修复,但稍后会引起更多问题。

我最近看到的一个示例:您希望一个名为的人"Jim"始终始终出现在字母列表中。为了快速解决,您将他重命名为" Jim"。这是一种hack,以后肯定会再次咬住您。


34
或者您可以称他为“ AAA Jim”。
compman

4
另一个示例是由于时间限制而扩展了if ... else ... else ... else,而不是更具扩展性的解决方案。
Phil Lello

29
当然,让Jim出现在字母顺序列表中第一位的真正解决方案是重新排列字母顺序。
artem

1
@artem是对的,它看起来像这样jzbcdefghiklmnopqrstuvwxya(您不想重新排序字母,取下a并调出z)
显示名称,

1
用项目管理的术语来表述:hack是一种解决方案,可能会使未来付出时间/工时的负担,并且/或者违反最佳实践或标准约定。
隐身

60

每个工程决策都需要在立即成本和延迟以及随之而来的成本和技术债务之间进行权衡。

hack是一种情况,前者是首选,而结果是后者。

没有经验的开发人员(部分是由于工程教育系统的工作方式)将重点放在前者上,并且没有足够的经验来真正地理解或估计后者。

有经验的开发人员可以这样做,但是出于各种原因(很多合法的理由)选择前者。

术语“ hack”几乎总是表示要临时解决问题并“在事后立即解决”的意图,但是经验丰富的开发人员知道,代码中最永久的东西是临时hack。


13
+1表示“但经验丰富的开发人员知道,代码中最永久的东西是临时hack”!这也意味着懒惰永远不会阻止您做对事情。
Matthieu M.

20

如果可行,解决方案有多糟糕?

考虑一下

2 + 2 <-- Correct.  Elegant.  Simple.

(2/1 + 2/1) * 1/1 <-- Also Correct.  Lots of useless weird code.  

第二个例子,不过,可能是因为得到一个更好的做法的无知或一种假设,即由使用黑客/1似乎简单的时间或在作出一个库中的缺陷/1正常工作。

是由于良好的做法吗?

不会。黑客是“方便”的代码。有三个四个原因。

  • 无知适当的设计原则。(即SOLID原则)

  • 关于API或语言构造的傲慢态度(即错误的假设)。

  • 尚未解决但可以解决的实际错误。

  • 管理层不顾良好的设计和校正假设。“预算”是一个常见的理由,但这本质上是上述三种(无知,傲慢或错误)中的一种,具有非技术性的根本原因。

还是无法维护?

这才是重点。骇客是基于无知,错误或假设。

它是否将代码的副作用用作解决方案的一部分?

这可能是无知或错误假设的例子。


很好的答案,但没有考虑到由于质量,时间和成本三边形,有时会用质量来捏写hack。
StuperUser 2011年

1
我曾经和客户一起玩那个游戏。我要他们从质量,时间和成本中选择项目的两个最重要方面。几乎总是选择时间和成本,然后他们就质量问题讨价还价。具体而言,以我是一名顾问的事实为依据,我应该能够按时,按成本和出色的质量交付这三个项目。这种情况就像母鸡的牙齿!
OptimizePrime

1
@优化:母鸡的牙齿很罕见。这种情况罕见吗?
马特·艾伦

@马特·艾伦(Matt Ellen):“母鸡的牙齿”一词的用法可能有所不同。它可能意味着“矛盾”而不是“罕见”。
S.Lott,

我发现这几乎总是“管理优先”决定。
马克·麦当劳

15

在编程环境中进行黑客攻击相当于用鸭嘴磁带或泡泡糖修复某些东西。

黑客经常会涉及使用一些未记录且不受支持的功能,这些功能将来可能会在破坏您的代码时发生变化。它们也可能涉及硬编码的值。

Hack通常也可能是使用某些库/服务来临时解决代码,而不是解决根本问题。如果以后无法控制,那么hack可能是处理它的唯一方法。


21
用鸭嘴胶带
作风

嘎嘎嘎嘎
Mateen Ulhaq 2011年

11

该术语有时以相反的含义使用,例如“聪明的黑客”。仅仅因为搞砸比做一件出色的事情更常见,所以听到可怕的骇客比说出出色的骇客要普遍得多,但是我听说过这两种方式都使用过。

积极意义上使用的“ Hack”基本上是一种优雅的解决方案,它以一种意想不到的,特别聪明的方式解决了问题。消极和积极的含义实际上是接近的,因为出色的破解通常涉及利用该技术的意外方面。


1
这是一个绝妙的技巧,因为很难在表面上看到您的操作,但是在进一步详细检查后,很明显这是非常聪明的左字段代码。我可以指导您了解地震平方根的魔力
罗伯特·马赛奥利

10

一个可行的解决方案,现在,但可能会导致长远的问题。

示例:您需要生成一个HTML文档,以动态填充一些值。正确的方法是使用为此目的而实际设计的工具之一,例如Freemarker,XSLT或JSP。但是您不能使用其中任何一个,或者只是不愿意正确地进行操作,因此您可以编写以下内容:

public String getGreetingPage(String name) {
    return "<html><body>Hello, "+name+"!</body></html>";
}

9

hack是解决问题的巧妙方法,通常取决于开箱即用的思维方式并利用有关环境的意外事实。关于原型黑客,有一种说法是观众同意它的巧妙,但无法弄清楚它是美妙还是可怕。这是您不需要维护修复中的事情。

解决问题的黑客很可能取决于环境的详细信息,工具的未记录功能或类似内容。它可能是一个脆弱的解决方案,现在可以运行,但是当某些更改发生时可能会崩溃。可能很难理解它是如何工作的,并且任何维护程序员都会讨厌难以理解的代码。它的副作用暂时不会对您造成任何伤害,但将来会在一段遥远的距离内产生完美的代码段问题,这可能是一场噩梦。


9

hack一词被滥用。如果您想真正了解一下历史,可以在Wikipedia上找到它。hack是一个词,用来描述调整事物以执行其本不应该做的事情的过程。在电气工程方面,这很好。对此,维基百科上有更好的描述。

现在,在计算机科学的背景下。骇客通常是不好的。是的,它确实有效,但是通常它意味着程序员编写了一些不符合软件设计的模棱两可的代码,这会使必须阅读该代码的每个程序员感到困惑。当然,程序员的时间是昂贵的,因此作为经理,人们希望拥有最容易维护的软件。这对程序员同样有效。另外,黑客往往会破坏软件中的其他内容。

是否接受黑客攻击是一个判断电话。至少您希望高级软件工程师批准该骇客,因为他有更多经验并且能够做出更有根据的决定。绝对您不希望初中生们做出接受黑客的决定。他们可以提出一个建议,并与高级人员讨论这些好处是否值得维护黑客的痛苦。


6

如在Thereifixedit.com上所发现的,这是一个黑客。

哈克

实际上,该网站上的所有内容都是骇客。

骇客是在其上下文之外对某些事物的巧妙而大胆的使用。
骇客之妙在于,您有一个既定的问题和一些从未打算解决它的工具,但您仅用那些工具解决了问题(而不是找到合适的工具)。他们聪明,快速,有趣。不利的一面是,结果通常易碎且对局外人使用很危险。
我的意思是,如果您喜欢如图所示解决问题,那没有问题。当您解决其他人的问题时,就会出现问题。在这种情况下,它们可能会被电击或烧伤或其他东西。

在软件开发中,您希望您的代码可以被其他人(包括您的未来)处理,而不会造成致命的伤害。正如Dijkstra所说:

胜任的程序员完全意识到自己的头骨有限。因此,他要谦虚地完成自己的任务,并避免诸如瘟疫之类的巧妙技巧。

黑客是最聪明的把戏。

骇客在代码中的某个地方滴答定时炸弹,因为常见的天生就是基于太多的假设(相对于正确的去耦,“仅仅这样做”更为可取)。一旦这些假设不再成立,您的整个系统就会崩溃,而您不知道发生了什么。


4

该术语不是很精确,但是它可能是针对难以正确解决的问题的快速解决方案。有问题的解决方案可能会起作用,但可能不是很好的实现,可能有细微的错误,也许是一些已知的小错误,如果时间允许,稍后重做。我认为您听到的被称为“ hack”的内容有时也被称为“ kludge ”。

我经常看到黑客在时间紧迫的情况下完成任务,因此实施了黑客解决方案,因为它“足够”有效地通过了质量检查,并希望以后可以解决。不幸的是,以后的修复/清理并不总是会发生的:(


我不确定您所说的“不是很精确”是什么意思-我会说大多数程序员会确切地知道说某些编写的代码是hack是什么意思。但是剩下的答案是正确的,它可以工作,但是由于某种原因(架构,性能等),它不是最佳解决方案。
ozz 2011年

@james:根据我的经验,两个程序员可以看一些代码,一个会称其为hack,另一个则不会。没有真正的方法可以将一段代码量化为hack。每个人对于骇客是什么都有自己的想法,通常他们很相似,但并不总是一样。写为某人的代码被其他人称为“ hackish”,并且不同意。而且我将其他人的代码称为“ hackish”,但他们不同意。没错,这些可能是边界情况,但是边界有时可能是模糊的……
FrustratedWithFormsDesigner

1
@FWFD-只是不同意某事是否是黑客。如果有人“说”某些代码是黑客,那么您就会知道他们的意思。
ozz 2011年

4

我花了大量时间作为前端开发人员,所以我对hack的定义是:

一个基于对环境缺陷和未记录行为的深入了解的解决方案。

该环境可以是您的框架,Web浏览器,数据库,ATM(自动提款机),法院案件。任何您知道漏洞并利用漏洞解决问题的“规则系统”。


4

hack通常是一些看起来确实可以提供所需输出的代码,但是以次优的方式提供。

它通常以某种方式被一些未记录或模糊的语言/库功能使用,而这种方式是始发者所不希望的,因此混淆了其意图。

有时候可以解决某些语言或库错误,但是在大多数情况下,主要原因通常是无知。

用锤子把一切都看成是钉子。

通常在空间和时间上都是以低效的方式进行的事情,但最终会产生所需的输出,但是要付出一定的代价,而且可能会出现无法测度的边缘情况,并且没有可测试性和可维护性。通常是由于缺乏对逻辑或语言习语的基本了解。另请参阅“困难的方式”。

通常,代码是具有适当经验的人甚至不会考虑做的事情,或者必须经过漫长而艰苦的思考才能使其变得与他们发现的黑客攻击一样复杂和低效。

例子

Vista修复

电子邮件验证有效性

软件单位

非确定性哈希


+1对于次优。而且因为黑客不一定是投票最高的“临时”黑客。
rlb.usa,2011年

2

光头轮胎可以工作,但没有人会称其为刺破的理想解决方案。这可能会带来更严重的问题。

通常,我会将黑客视为解决当前问题的快速而肮脏的解决方案。它通常可能不符合编程商店中的常规编程惯例(例如,使用大量硬编码)。这可能是一个小的解决方案。

不好的一个关键原因是:a)可能导致不可预测的结果b)可能与所讨论代码的原始设计不匹配,这将导致维护问题。以我的经验,黑客通常也很少被记录在案。


2

我听过并尊重的简短定义:

“无法在所有情况下都不能完全解决问题的症状解决方案”

丑陋的代码可能是hack,也可能不是hack。另一个答案中的2 + 2示例不是hack,它是一个丑陋的代码解决方案,从代码理解的角度来看很糟糕,但是在所有情况下它都能提供正确的解决方案。考虑一下数学中的因式方程式-行为/关系在两个版本中都是相同且正确的,但是形式不同。嗯,分解方程式,重构方程式,重构代码...不,没有相似之处,我敢肯定:)

在另一个答案中,关于将名字更改为“ Jim”的示例是一个hack:它解决了症状(列表中的名字是Jim),但没有完全解决问题(列表未排序)或以适用于所有条目的任何方式确定优先级)。


1

骇客正在做的事情可以返回预期的结果,但是这样做的方式很奇怪(通常会导致性能下降)。

例如:

任务:将整数变量转换为双精度型

解决方案:使用强制转换运算符。即:dblVar = CType(intVar,Double)

哈克:除以双。即:dblVar = intvar / 1.0


+1是一个出色的例子。在旧的AS400代码中,我将看到欧洲日期乘以一些古怪的小数,从而输出美国日期。当某些编码人员开始将其泄漏到我们的.Net代码中时,问题就开始了……好!
Morgan Herlocker 2011年

0

想象一下,如果您的腿被感染了,必须将其切除以使您存活下来。您是希望医生用斧头快速砍掉它,还是在检查问题并选择适当的工具,程序等之后以手术方式将其切除?软件也一样。


在攻击者有机会侵入我的大脑之前,我会让他破解。
Mateen Ulhaq 2011年

如果您只有几分钟的时间怎么办?
StuperUser 2011年

0

当负责的编码人员宣布“我会稍后再解决此问题”时,黑客发出信号表明它已经诞生。

值得一提的是,OP上下文中的骇客虽然可以达到预期的结果,但是使用临时或不可靠的方法来达到目的。

另一个常见定义是一种利用边缘案例行为来规避平台中的限制/保护措施的技术。

第二种情况下的Hack在“特立独行”(阅读:危险)英雄编码者中有一定的声望。

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.