我经常听到同事互相说:“这是一个可怕的骇客。”
我可以摆脱的是那不是很好。当我问他们是否可行时,他们说“是的,但是不好”。这是否意味着它不是一个好的解决方案?如果可行,解决方案有多糟糕?是由于良好的做法吗?还是无法维护?它是否将代码的副作用用作解决方案的一部分?
当某物被归类为骇客时,这对我来说很有趣。您如何识别它?
+
以根据启发式方法进行划分。
我经常听到同事互相说:“这是一个可怕的骇客。”
我可以摆脱的是那不是很好。当我问他们是否可行时,他们说“是的,但是不好”。这是否意味着它不是一个好的解决方案?如果可行,解决方案有多糟糕?是由于良好的做法吗?还是无法维护?它是否将代码的副作用用作解决方案的一部分?
当某物被归类为骇客时,这对我来说很有趣。您如何识别它?
+
以根据启发式方法进行划分。
Answers:
它正在为大的伤口使用临时创可贴。目前,它已修复,但稍后会引起更多问题。
我最近看到的一个示例:您希望一个名为的人"Jim"
始终始终出现在字母列表中。为了快速解决,您将他重命名为" Jim"
。这是一种hack,以后肯定会再次咬住您。
每个工程决策都需要在立即成本和延迟以及随之而来的成本和技术债务之间进行权衡。
hack是一种情况,前者是首选,而结果是后者。
没有经验的开发人员(部分是由于工程教育系统的工作方式)将重点放在前者上,并且没有足够的经验来真正地理解或估计后者。
有经验的开发人员可以这样做,但是出于各种原因(很多合法的理由)选择前者。
术语“ hack”几乎总是表示要临时解决问题并“在事后立即解决”的意图,但是经验丰富的开发人员知道,代码中最永久的东西是临时hack。
如果可行,解决方案有多糟糕?
考虑一下
2 + 2 <-- Correct. Elegant. Simple.
(2/1 + 2/1) * 1/1 <-- Also Correct. Lots of useless weird code.
第二个例子,不过,可能是因为得到一个更好的做法的无知或一种假设,即由使用黑客/1
似乎简单的时间或在作出一个库中的缺陷/1
正常工作。
是由于良好的做法吗?
不会。黑客是“方便”的代码。有三个四个原因。
无知适当的设计原则。(即SOLID原则)
关于API或语言构造的傲慢态度(即错误的假设)。
尚未解决但可以解决的实际错误。
管理层不顾良好的设计和校正假设。“预算”是一个常见的理由,但这本质上是上述三种(无知,傲慢或错误)中的一种,具有非技术性的根本原因。
还是无法维护?
这才是重点。骇客是基于无知,错误或假设。
它是否将代码的副作用用作解决方案的一部分?
这可能是无知或错误假设的例子。
在编程环境中进行黑客攻击相当于用鸭嘴磁带或泡泡糖修复某些东西。
黑客经常会涉及使用一些未记录且不受支持的功能,这些功能将来可能会在破坏您的代码时发生变化。它们也可能涉及硬编码的值。
Hack通常也可能是使用某些库/服务来临时解决代码,而不是解决根本问题。如果以后无法控制,那么hack可能是处理它的唯一方法。
hack一词被滥用。如果您想真正了解一下历史,可以在Wikipedia上找到它。hack是一个词,用来描述调整事物以执行其本不应该做的事情的过程。在电气工程方面,这很好。对此,维基百科上有更好的描述。
现在,在计算机科学的背景下。骇客通常是不好的。是的,它确实有效,但是通常它意味着程序员编写了一些不符合软件设计的模棱两可的代码,这会使必须阅读该代码的每个程序员感到困惑。当然,程序员的时间是昂贵的,因此作为经理,人们希望拥有最容易维护的软件。这对程序员同样有效。另外,黑客往往会破坏软件中的其他内容。
是否接受黑客攻击是一个判断电话。至少您希望高级软件工程师批准该骇客,因为他有更多经验并且能够做出更有根据的决定。绝对您不希望初中生们做出接受黑客的决定。他们可以提出一个建议,并与高级人员讨论这些好处是否值得维护黑客的痛苦。
如在Thereifixedit.com上所发现的,这是一个黑客。
实际上,该网站上的所有内容都是骇客。
骇客是在其上下文之外对某些事物的巧妙而大胆的使用。
骇客之妙在于,您有一个既定的问题和一些从未打算解决它的工具,但您仅用那些工具解决了问题(而不是找到合适的工具)。他们聪明,快速,有趣。不利的一面是,结果通常易碎且对局外人使用很危险。
我的意思是,如果您喜欢如图所示解决问题,那没有问题。当您解决其他人的问题时,就会出现问题。在这种情况下,它们可能会被电击或烧伤或其他东西。
在软件开发中,您希望您的代码可以被其他人(包括您的未来)处理,而不会造成致命的伤害。正如Dijkstra所说:
胜任的程序员完全意识到自己的头骨有限。因此,他要谦虚地完成自己的任务,并避免诸如瘟疫之类的巧妙技巧。
黑客是最聪明的把戏。
骇客在代码中的某个地方滴答定时炸弹,因为常见的天生就是基于太多的假设(相对于正确的去耦,“仅仅这样做”更为可取)。一旦这些假设不再成立,您的整个系统就会崩溃,而您不知道发生了什么。
该术语不是很精确,但是它可能是针对难以正确解决的问题的快速解决方案。有问题的解决方案可能会起作用,但可能不是很好的实现,可能有细微的错误,也许是一些已知的小错误,如果时间允许,应稍后重做。我认为您听到的被称为“ hack”的内容有时也被称为“ kludge ”。
我经常看到黑客在时间紧迫的情况下完成任务,因此实施了黑客解决方案,因为它“足够”有效地通过了质量检查,并希望以后可以解决。不幸的是,以后的修复/清理并不总是会发生的:(
hack通常是一些看起来确实可以提供所需输出的代码,但是以次优的方式提供。
它通常以某种方式被一些未记录或模糊的语言/库功能使用,而这种方式是始发者所不希望的,因此混淆了其意图。
有时候可以解决某些语言或库错误,但是在大多数情况下,主要原因通常是无知。
用锤子把一切都看成是钉子。
通常在空间和时间上都是以低效的方式进行的事情,但最终会产生所需的输出,但是要付出一定的代价,而且可能会出现无法测度的边缘情况,并且没有可测试性和可维护性。通常是由于缺乏对逻辑或语言习语的基本了解。另请参阅“困难的方式”。
通常,代码是具有适当经验的人甚至不会考虑做的事情,或者必须经过漫长而艰苦的思考才能使其变得与他们发现的黑客攻击一样复杂和低效。
例子
我听过并尊重的简短定义:
“无法在所有情况下都不能完全解决问题的症状解决方案”
丑陋的代码可能是hack,也可能不是hack。另一个答案中的2 + 2示例不是hack,它是一个丑陋的代码解决方案,从代码理解的角度来看很糟糕,但是在所有情况下它都能提供正确的解决方案。考虑一下数学中的因式方程式-行为/关系在两个版本中都是相同且正确的,但是形式不同。嗯,分解方程式,重构方程式,重构代码...不,没有相似之处,我敢肯定:)
在另一个答案中,关于将名字更改为“ Jim”的示例是一个hack:它解决了症状(列表中的名字是Jim),但没有完全解决问题(列表未排序)或以适用于所有条目的任何方式确定优先级)。
骇客正在做的事情可以返回预期的结果,但是这样做的方式很奇怪(通常会导致性能下降)。
例如:
任务:将整数变量转换为双精度型
解决方案:使用强制转换运算符。即:dblVar = CType(intVar,Double)
哈克:除以双。即:dblVar = intvar / 1.0
想象一下,如果您的腿被感染了,必须将其切除以使您存活下来。您是希望医生用斧头快速砍掉它,还是在检查问题并选择适当的工具,程序等之后以手术方式将其切除?软件也一样。