关于编程的文章我想了很多

2020-07-21 11:02:21

每隔一段时间,我就会读到一篇文章,最后我会反复思考,并在谈话中引用这些文章。

这是我能记住的所有这些的索引!我会尽量使它保持最新,因为我想更多。

(他们中的一些人非常出名。不管怎样,我还是把它们放在这里,以防你是这10,000名幸运儿中的一员。)。

我很好奇这一类的文章是给其他人看的--把你的文章贴在评论里吧!

我对软件有一种根深蒂固的信念,那就是计算机和软件系统是可以理解的。合并(&A;M)。

在某些方面,这种信仰在今天感觉很激进。现代软件和硬件系统在许多不同的层之间包含几乎不可想象的复杂性,每个层都在彼此之上。合并(&A;M)。

面对这种复杂性,很容易假设有太多的东西需要学习,并采用心理上的简写,即我们使用的系统最好被视为黑匣子,不需要理解任何细节。

我反对这种做法。您永远不会理解该堆栈上每个级别的实现的每一个细节;但是您可以在一定程度上抽象地理解所有这些细节,并且可以从本质上理解任何特定层到任何用途所需的任何深度。

假设每家公司获得大约三个创新代金券。你可以随心所欲地花这些钱,但是供应是固定的,需要很长一段时间。在你达到一定的稳定性和成熟度之后,你可能会得到更多,但总体趋势是高估了你钱包的内容。显然,这个模型是近似的,但我认为它是有帮助的。

如果您选择用NodeJS编写您的网站,那么您刚刚花费了您的一个创新令牌。如果您选择使用MongoDB,那么您只花了一个创新令牌。如果您选择使用已存在一年或不到一年的服务发现技术,您只需花掉您的一个创新令牌。如果您选择编写自己的数据库,天哪,您就有麻烦了。

程序员B觉得保留现有的抽象是义不容辞的,但是因为不是每种情况都完全一样,所以他们修改代码以接受一个参数&;mldr。

你出现在关于这里的故事里,你的生活发生了戏剧性的转折。

亚历克斯的背景中没有任何迹象表明这种情况会发生。他有沃尔特·怀特的简历,但有海森堡的才能。我们都没料到会这样。我的名字是托马斯·帕塔切克,我赞同这个可怕的双关语。亚历克斯是那个不肯说的人。

几年前,Matasano不可能雇佣亚历克斯,因为我们依赖于面试和简历来招聘。然后我们做了一些改变,成为了一台发现并招募像Alex这样的人的机器:保险公司的.NET开发人员从第一个小时的代码查看中拉出了Rails核心CVE。为电话芯片组提供硬件反向组装固件的系统管理员。顿悟:人才是存在的,但你在简历上找不到。

我们这个领域选择工程师的过程比读鸡内脏还糟糕。就像面试一样,“家禽肠报”几乎没有什么可以告诉你是否雇佣某人的信息。但与午餐面试相比,这是一次更愉快的就餐体验。

积极主动地提出产品想法/意见·对业务、用户行为和这方面的数据感兴趣·好奇心和对“为什么?”的浓厚兴趣·强大的沟通者和与非工程师的良好关系·预先提供产品/工程折衷·务实地处理边缘案例·快速产品验证周期·端到端产品功能所有权·通过反复学习具有强大的产品本能

如果我们将“代码行”视为“花费的行”,那么当我们删除代码行时,我们就降低了维护成本。我们应该尝试构建一次性软件,而不是构建可重用的软件。

业务逻辑是以一系列无休止的边缘案例和快速而肮脏的黑客行为为特征的代码。这样挺好的。我对此没意见。其他风格,如“游戏代码”或“创建者代码”也是一样的:偷工减料,节省大量时间。

原因呢?有时候,删除一个大错误比尝试删除18个交错的小错误要容易得多。很多编程都是探索性的,犯错几次然后迭代要比认为第一次正确要快得多。

回到TCP。之前,为了简单起见,我撒了个小谎,你们中的一些人现在耳朵里冒出了蒸汽,因为这个谎言快把你们逼疯了。我说TCP保证您的消息会到达。实际上,不是这样的。如果您的宠物蛇咬破了通往您计算机的网线,并且没有IP数据包可以通过,那么TCP对此无能为力,您的消息也不会到达。如果你对公司的系统管理员很粗鲁,他们惩罚你,把你插到一个超载的集线器上,只有一些IP数据包可以通过,TCP可以工作,但一切都会很慢。

这就是我所说的漏洞百出的抽象。TCP试图提供底层不可靠网络的完整抽象,但有时,网络会通过抽象泄漏,您会感觉到抽象不能完全保护您免受的影响。这只是我称之为“泄密抽象法则”的一个例子:

抽象失败。有时很少,有时很多。有漏水。事情变得不对劲了。当你有抽象概念时,这种情况随处可见。这里有一些例子。

用户更喜欢速度更快的软件,这可能是相当直观的,如果工具速度更快而不是速度更慢,那么执行给定任务会有更好的体验。

或许不太明显的是,拥有更快的工具会改变用户使用工具或执行任务的方式。用户几乎总是有多种策略可用来追求一个目标--包括决定完全致力于其他事情--而且他们会越来越频繁地选择使用更快的工具。快速工具不仅允许用户更快地完成任务,还允许用户以全新的方式完成全新类型的任务。在制作冰糕和Livegrep时,我清楚地看到了这种现象:

我想让您相信,ACID数据库是现有的确保大型生产系统中可维护性和数据正确性的最重要工具之一。让我们从深入研究它们的每一个同名担保开始。

HTTP请求和数据库事务之间存在惊人的对称性。就像事务一样,HTTP请求是一个事务工作单元-它有明确的开始、结束和结果。客户端通常期望请求自动执行,并且会表现得像是这样(当然,这会根据实现的不同而有所不同)。在这里,我们将查看一个示例服务,以了解HTTP请求和事务如何很好地相互应用。

在API中,幂等是一个强大的概念。幂等端点是指可以调用任意次,同时保证副作用只发生一次的端点。在一个混乱的世界中,客户端和服务器可能偶尔会崩溃或在请求过程中连接中断,这对提高系统的故障健壮性有很大帮助。不确定请求是成功还是失败的客户端可以简单地继续重试,直到得到确定的响应。

分布式系统不同,因为它们经常出现故障·在整个系统中实施反压力·想方设法部分可用·使用百分位数,而不是平均值·学习评估您的容量·功能标志是基础架构的铺设方式·明智地选择id空间·将缓存数据写回永久存储不好·提取服务。

本文提出了一种有助于指导分布式计算机系统各模块间功能布局的设计原则。这一原则被称为端到端论证,它表明,与在较低级别提供功能的成本相比,放置在系统较低级别的功能可能是多余的,或者没有什么价值。本文讨论的示例包括比特错误恢复、使用加密的安全性、重复消息抑制、从系统崩溃中恢复以及传递确认。支持这些功能的低级机制只能作为性能增强来证明是合理的。

多年来,我花了很多时间制作创意工具,使用创意工具,想了很多,现在我开始相信:创作者需要与他们正在创作的东西有直接的联系。

我不能真正摘录任何实际的演示,这是最好的部分。相反,我只想认可它:这个演讲戏剧性地、富有成效地提高了我对编程工具(以及一般工具)的认识。看着它,让你惊叹不已。

其中相当多在我的清单上,下面是我经常重复的其他一些: