编程中最伤脑筋的7个问题

这里是龙:编码世界的这些粗糙角落可能是可怕的敌人,即使对经验丰富的专业人士也是如此

据说,旧地图上未标明的领域通常都标有不祥的警告:“这里有龙。”可能是杜撰的他的想法是,如果没有准备好与可怕的敌人战斗,任何人都不应该游荡到世界上这些未知的角落。在这些神秘的地方,什么事都有可能发生,而且往往都是坏事。

程序员可能比中世纪的骑士要文明一点,但这并不意味着现代技术世界没有在不可预见的地方等待着我们的技术龙:直到最后期限前几分钟才会出现困难问题;有并发症的人读过手册,知道什么是不明确的;邪恶的龙知道如何潜入早期的错误和不及时的故障,通常是在代码提交之后。

会有一些谁在夜晚安静地休息,由他们天真的自信,电脑是完全可预测的温暖,切实培养出正确的答案。呵呵,怎么一点他们知道。对于芯片设计,语言的开发者,以及数以百万计的程序员的辛勤工作无处不在,还有的,可以把连最强大的程序员自己的膝盖编程问题棘手的灌木丛。

以下是我们会投入大量的标记读取,编程世界的gnarliest角落七“这里是龙。”

多线程

这听起来是个好主意:将您的程序分解为独立的部分,让操作系统像运行独立的小程序一样运行它们。如果处理器有4个、6个、8个甚至更多的核,为什么不编写代码,使它可以有4个、6个、8个或更多的线程,独立地使用所有的核?

这个想法的作品,在这些部分实际上是完全独立的,并没有任何关系彼此。但是,一旦他们需要访问相同的变量或写位相同的文件,所有的赌注都关闭。其中一个线程是要获取数据第一,你无法预测它会是哪个线程。

因此,我们创建监视器、信号量和其他用于组织多线程混乱的工具。当他们工作时,他们就工作。它们只是增加了另一层复杂性,把在变量中存储数据的行为变成了需要更多思考的项目。

当它们不起作用时,就会变成一片混乱。这些数据毫无意义。这些列加不起来。“噗”的一声,账户里的钱就消失了。都是内存中的比特。祝你好运。大多数时候,开发人员会锁定数据结构的大块,以便只有一个线程可以接触到它。这可能会阻止混乱,但只有通过消除让多个线程处理相同数据的大部分好处。您也可以将它重写为一个“单线程”程序。

闭包

某处沿线,有人决定,如果他们的数据将是有用的,以绕过功能。这简单的情况下运作良好,但程序员开始意识到,问题出现了,当函数本身以外达到并访问其他数据,通常被称为“自由变量”。哪个版本是正确的?是它的数据是发起函数调用时?抑或是当函数实际运行?这是对JavaScript那里可以在之间的长差距尤为重要。

解决方案“闭包”是JavaScript(现在是Java和Swift)程序员最头疼的问题之一。新手甚至很多老兵都不知道什么被关闭了,所谓的关闭的边界在哪里。

名称不帮助,它不是像访问被永久关停像酒吧,宣布最后一次通话。如果有的话,访问是开放的,但只能通过在数据时间连续虫洞,绑定到最终酿出的科幻电视节目一个奇怪的时移机制。但称这是一个“复杂的堆栈访问机制”或“数据控制系统杂耍”似乎太长了,所以我们坚持用“倒闭潮”。不要让我开始对是否有人需要支付的非自由变量。

太大的数据

当内存开始满的时候,一切都开始出错。不管你是在对消费者数据进行新奇的统计分析,还是在处理枯燥的旧电子表格。当机器耗尽RAM时,它就变成了所谓的虚拟内存,溢出到超低硬盘中。这总比彻底崩溃或工作结束要好,但男孩做每件事都慢下来。

问题是,硬盘是比RAM和大众市场的磁盘驱动器速度较慢至少20或30倍往往较慢。如果一些其他进程也试图写入或从磁盘读取,一切都变得急剧恶化,因为驱动器可以在一个时间只能做一件事。

激活虚拟内存加剧等,隐藏的问题与你的软件。如果有螺纹毛刺,他们开始打破更快,因为这是在硬盘的虚拟内存运行伸出所以比其他线程更慢的线程。这种情况只会持续一小段时间,但是,因为一次局外人线程被换入内存,其它线程挂断。如果代码是完美的,结果是仅仅慢得多。如果不是,该漏洞快速发送它摔碎在灾难。这是一个小例子。

对于处理大量数据的程序员来说,管理这些数据是一个真正的挑战。任何在构建浪费的数据结构方面有点马虎的人,最终都会在生产中得到非常缓慢的代码。它可能在一些测试用例中工作得很好,但是实际的负载会使它螺旋式地失败。

非完全多项式

任何受过计算机科学大学教育的人都知道包裹在一个很少被解释清楚的首字母缩略词中的神秘问题:不确定性多项式完备,又名np完备。这些细节往往要花一整个学期的时间去学习,即便如此,许多计算机专业的学生还是会产生一种模糊的想法,认为没有人能解决这些问题,因为它们太难了。

np完全问题通常是相当困难的——如果您简单地使用蛮力攻击它们的话。例如,“旅行推销员问题”可能需要指数级长的时间,因为销售路线包括越来越多的城市。通过寻找最接近某个值N的数字子集来解决“背包问题”,可以通过尝试所有可能的子集来解决,这是一个非常大的数字。每个人都对这些问题感到恐惧,因为它们是硅谷最大妖怪之一的完美例子:无法伸缩的算法。

棘手的部分是一些np完全问题很容易用近似来解决。这些算法不能保证得到精确的解,但它们已经很接近了。他们可能不能为旅行推销员找到完美的路线,但他们可以在正确答案的几个百分点之内。

这些很好的解决方案的存在只会让龙更加神秘。如果你愿意满足于一个足够好的答案,没有人能确定这些问题真的够难还是够简单。

安全

“有已知的已知的;有些事情我们知道我们知道,”唐纳德拉姆斯菲尔德,布什第二任期的国防部长,曾在一次新闻发布会上说。“我们也知道有已知的未知;也就是说,我们知道有些事情是我们不知道的。但也有未知的未知——那些我们不知道我们不知道的。”

拉姆斯菲尔德说的是伊拉克战争,但这也适用于计算机安全。最大的问题是我们甚至不知道可能存在的漏洞。每个人都知道你应该让你的密码难以猜测——这是众所周知的。但谁曾被告知网络硬件内部有自己的软件层呢?有人可能会跳过黑客攻击你的操作系统,转而攻击这个秘密层,这是一个未知的未知。

那种破解的可能性可能不是现在是未知的给你,但如果有其他人?我们不知道,如果我们可以变硬,我们甚至不知道其存在的漏洞。您可以封舱以防暴风雨的密码,但也有你甚至无法想象的裂缝。这是计算机安全工作的乐趣。而且,当涉及到编程,安全意识的思维变得越来越重要。你不能离开它的安全人员来清理你的烂摊子。

加密

当执法官员到国会面前要求通过官方漏洞来阻止加密时,加密听起来强大而不可破解。问题是大多数加密都是建立在这个基础上的不确定性的雾云。我们的数学证明是建立在不确定的假设上的,就像很难因式分解非常大的数字或计算离散对数。

这些问题真的很难吗?没有人公开描述过任何可以打破它们的算法,但这并不意味着解决方案不存在。如果你找到了一种偷听每一次谈话并闯入任何一家银行的方法,你会立即告诉全世界并帮助他们堵住漏洞吗?还是你会保持沉默?

真正的挑战是在我们自己的代码中使用加密。即使我们相信基本算法是安全的,在处理密码、密钥和连接时仍有很多工作要做。如果你犯了一个错误而让密码不受保护,那么一切都会失败。

身份管理

人人都爱的是纽约客漫画与点睛之笔“在互联网上,没人知道你是一条狗。”它甚至有拥有包含四个详细章节的维基百科页面。(在互联网上,没有人知道分析幽默和解剖青蛙的老看到。)

好消息是,匿名是一种解放和有用的方式。坏消息是,除了匿名通信,我们什么都不知道。有些程序员讨论“两因素身份验证”,但聪明的程序员会跳到“n因素身份验证”。

在输入密码和发短信到手机之后,我们没有多少东西是非常稳定的。指纹识别器看起来令人印象深刻,但很多人似乎愿意透露它们是如何被黑客入侵的这里,这里,这里对于初学者)。

对于在Snapchat或Reddit上闲聊的人来说,这些都无关紧要,但被黑的Facebook页面让人有点不安。没有简单的方法来处理像财产、金钱、医疗保健或生活中几乎所有的事情,除了毫无意义的闲聊。比特币迷们喜欢喋喋不休地说区块链是多么坚如磐石,但不知何故,这些比特币还是不断被人偷走(见下文)这里这里)。我们没有真正的方法来处理身份。

测量硬度

当然,当涉及到编程,甚至有通过它我们可以衡量一个问题的难度呢?没有人真正知道。我们知道,有些问题是很容易解决的,但它是完全不同的,以证明一个硬。NP完全性是只有一个精心尝试编纂的算法和数据分析的复杂性的一部分。该理论是有用的,但它不能提供任何担保。人们很容易说,这是很难知道的一个问题是很难的,但好,你得到的笑话。

相关文章

这个故事,“编程中最伤脑筋的7个问题”最初是由信息世界

加入网络世界社区有个足球雷竞技app脸谱网LinkedIn对最重要的话题发表评论。
相关:

版权©2016Raybet2

工资调查:结果在