在编程的7点最头痛的问题

这里是龙:编码世界的这些粗糙的角落可以为经验丰富的专业人士是强大的敌人,甚至

有人说,老地图的未知领域往往标有不祥的警告:“这里是龙。”也许是杜撰,当时的想法是,没有人游荡到世界的这些未知的角落应该这样做没有准备好战斗一个可怕的敌人。任何事情都可能发生在这些神秘的地区,往往是什么并不好。

程序员可能有点比中世纪骑士更文明,但是,这并不意味着现代技术世界上还没有它的技术小龙意外地等待着我们的份额:难的问题,等到最后期限是几分钟的路程;有阅读手册并了解还不是很指定的并发症;恶龙知道如何在早期的错误和不及时毛刺潜行,代码致力于常常之后。

会有一些人在晚上安静地休息,天真地自信电脑完全可以预测,并热切地写出正确的答案。哦,他们知道的多少啊。尽管芯片设计人员、语言开发人员和世界各地数以百万计的程序员付出了巨大的努力,但仍有许多棘手的编程问题会让最强大的程序员屈服。

这里是编程世界中最丑陋的七个角落,我们会在其中放置大标记,上面写着:“这里是龙。”

多线程

这听起来像是个好主意:打破你的程序分成独立的部分,让OS运行它们像单独的小程序。如果处理器有四,六,八,甚至更多的内核,为什么不写你的代码,以便它可以有四个,六个,八个或更多独立使用所有核心线程?

当这些部分实际上是完全独立的,彼此之间没有任何关系的时候,这个想法是可行的。但一旦它们需要访问相同的变量或向相同的文件写入位,所有的赌注都是错的。其中一个线程将首先获得数据,你无法预测它将是哪个线程。

因此,我们创建显示器,信号和其他工具组织了多线程的混乱。当他们的工作,他们的工作。他们只是增加了另一层复杂性,把存储数据的行为在一个变量到需要多一点想到了一个项目。

当他们不工作,这是纯粹的混乱。该数据是没有意义的。列不上号。钱从一个账户噗消失。这是在内存中的所有位。祝你好运试图拖住它的任何。大多数时候,开发人员最终锁定下来的数据结构的大块,以便只有一个线程可以触摸它。这可能阻止混乱,但只能通过杀死了大部分上攻有多个线程对同一数据的工作的。你还不如把它改写为“单线程”的程序。

关闭

在这个过程中,有人认为把函数当作数据来传递是很有用的。这种方法在简单的实例中工作得很好,但是程序员开始意识到,当函数到达自身之外并访问其他数据(通常称为“自由变量”)时,问题就出现了。哪个版本是正确的?是函数调用初始化时的数据吗?还是在函数实际运行的时候?这对于JavaScript来说尤其重要,因为两者之间可能存在很长的间隔。

该解决方案中,“封”,是头痛对JavaScript(现在Java和斯威夫特)的程序员的最大来源之一。新手甚至许多老兵想不出什么东西被关闭,其中所谓的封闭的边界可能。

名字没有帮助-它不像酒吧宣布最后一次呼叫一样永久关闭访问。如果有的话,访问是开放的,但只能通过数据时间连续体中的虫洞,一种奇怪的时间转移机制,注定最终会衍生出科幻电视剧。但是称它为“复杂的堆栈访问机制”或“数据控制杂耍系统”似乎太长了,所以我们只能使用“闭包”。不要让我开始讨论是否有人需要为非自由变量付出代价。

过大的数据

当RAM开始填充起来,一切都开始去错了。这不要紧,如果你正在执行的消费者数据的新奇的统计分析或上一个无聊的,旧的电子表格的工作。当机器运行的RAM出来,原来该流溢到superslow硬盘所谓的虚拟内存。这比完全崩溃或结束工作做得更好,但是孩子做一切慢下来。

问题是,硬盘的速度至少比RAM慢20或30倍,而大众市场的磁盘驱动器往往更慢。如果其他进程也试图从磁盘上读写,那么一切都会变得非常糟糕,因为驱动器一次只能做一件事。

激活虚拟内存会加剧软件中其他隐藏的问题。如果出现线程故障,它们就会开始更快地中断,因为在硬盘虚拟内存中突出的线程比其他线程运行得慢得多。但是,这只持续了很短的一段时间,因为once wallflower线程被交换到内存中,而其他线程挂起。如果代码是完美的,结果只是慢了很多。如果不是,这些缺陷很快就会让它陷入灾难。这是一个小例子。

管理这是一个谁是数据的大桩工作的程序员一个真正的挑战。人谁得到一个有点草率与建筑浪费的数据结构与代码最终减缓在生产中爬行。它可以很好地工作了几个测试案例,但实际负荷发送节节攀升失败。

NP完全问题

任何拥有计算机科学的大学教育都知道的包裹在真实很少拼写的首字母缩写神秘的问题:不确定性多项式完整,又名NP完全问题。细节往往需要一整个学期的学习,即使如此,许多CS学生拿出一个有雾的概念,因为他们太辛苦没人能解决这些问题。

该NP完全问题往往是相当困难的,如果用蛮力只是攻击他们。该“旅行商问题”,例如,可以作为销售途径包括越来越多的城市采取成倍长的时间。解决通过查找来最接近的一些值N号的子集的“背包问题”是通过尝试所有可能的子集,这是一个非常大的数字解决。恐惧从这些问题大家都跑,因为他们在硅谷最大的精灵之一的一个很好的例子:不会缩放算法。

最棘手的部分是,一些NP完全问题是容易的近似值来解决。该算法不保证确切的解决方案,但他们来八九不离十。他们可能找不到旅行商完美的路线,但他们可以来正确答案的几个百分点之内。

这些不错的解决方案的存在只会让龙更神秘。没有人可以肯定,如果问题是真正的硬或容易不够的,如果你愿意的答案,这只是不够好满足。

安全

“不知之不知;有些事情我们知道我们知道,”拉姆斯菲尔德,国防部第二届布什政府期间的秘书,在一次新闻发布会上说。“我们也知道有已知的未知;这就是说,我们知道有些事情我们不知道。但也有一些未知的未知,在我们不知道我们不知道的人“。

拉姆斯菲尔德是在谈论伊拉克战争,但同样适用于计算机安全如此。最大的问题是孔,我们甚至不知道是可能的。大家都明白,你应该让你的密码难以猜测,这是一个众所周知的闻名。但是,谁曾经被告知,你的网络硬件有自己的软件层埋里面?有人可以跳过黑客你的操作系统,而是针对这个秘密层的可能性是未知的未知。

现在,这种黑客攻击的可能性对您来说可能不是未知的,但是如果还有其他黑客呢?我们不知道我们是否能加固那些我们甚至不知道存在的洞。你可以把密码加密,但有些漏洞你甚至无法想象。这就是从事计算机安全工作的乐趣。当涉及到编程时,安全思维变得越来越重要。你不能让安全专家来收拾你的烂摊子。

加密

当执法人员在国会面前得到,并要求官员的漏洞来阻止它加密的声音强大和坚不可摧的。问题是,大多数加密是建立在不确定性的雾云。我们有什么数学证明停留在不确定的假设,就像是很难的因素非常大的数字或计算离散对数。

那些问题真的很难吗?没有人曾公开描述的任何算法打破他们,但这并不意味着该解决方案并不存在。如果你找到一种方法来窃听每次谈话,并打入任何一家银行,你会及时告诉世界,并帮助他们堵塞漏洞?或者你会保持沉默?

真正的挑战是在我们自己的代码中使用的加密。即使我们相信基本的算法是安全的,还有很多工作要做杂耍密码,密钥和连接。如果你犯了一个错误,并留下一个密码保护,一切都属于开放。

身份管理

人人都喜欢《纽约客》(New Yorker)的这幅漫画,它的笑点是:“在互联网上,没人知道你是一只狗。”它甚至有自己的名字自己的维基百科页面有四个精心部分。(在互联网上,没有人知道关于分析幽默和解剖青蛙的老话。)

好消息是,匿名可以解放和有益的。坏消息是,我们不知道如何做任何事情,但匿名通信。一些程序员谈“双因素身份验证”,但聪明的人跳到“N因素身份验证。”

密码也许一条短信到手机之后,我们没有太多说的非常稳定。指纹识别器看起来令人印象深刻,但很多人似乎愿意透露他们如何被砍死(见这里这里这里对于初学者来说)。

没有太多这个问题上Snapchat或reddit的闲聊,但黑客攻击Facebook页面流的世界有点令人不安。有没有简单的方法来处理像财产,金钱,医疗保健,或几乎一切生活中除了无意义的闲聊严肃的问题。Bitcoin的fanbois爱闲聊关于如何坚如磐石的blockchain可能,但不知何故,硬币不断得到扯掉(见这里这里)。我们必须处理的身份没有真正的方法。

硬度测量

当然,说到编程,有没有一种方法可以让我们衡量一个问题的难度?没有人真正知道。我们知道有些问题是容易解决的,但是证明一个问题是困难的就完全不同了。np完备性只是编纂算法和数据分析复杂性的复杂尝试的一部分。这个理论是有帮助的,但它不能提供任何保证。我们很容易说,甚至很难知道一个问题是否困难,但是,好吧,你明白这个笑话。

相关文章

这个故事“在节目中7点最头痛的问题”最初发表InfoWorld的

加入对网络世界的社足球竞猜app软件区Facebook的LinkedIn对那些顶级心态的话题发表评论。
有关:

版权所有©2016足球竞彩网下载

IT薪资调查:结果是