醉酒的剽窃者
与副驾驶员合作
在尝试使用这些工具之前,您需要了解它们的作用,至少在表面上是这样,因为即使是它们的创造者也自由地承认他们不了解它们是如何在从当前互联网上抓取的所有统计数据和文本的深处工作的。LLM 的诀窍是使用一点随机性和大量文本来高斯猜测句子中的下一个词。这看起来有点微不足道,真的,当然不是任何理解该术语的人可能会使用的智能衡量标准。
在不稳固的基础上建设
我们有责任让世界上的系统安全可靠地运行。
CrowdStrike 灾难的发生是由于硬件和系统软件中的架构问题。我们应该构建使编写病毒变得困难的系统,而不是儿戏。但这现在是一个昂贵的命题。
不想要的惊喜
当那个玩笑般的 API 落在你头上时
还有一个更高层次的问题,即具有强制类型的松散类型语言是否从一开始就是一个好主意。如果您不知道您正在操作什么,或者预期的输出范围可能是什么,那么也许您一开始就不应该操作该数据。但是现在这些语言已经进入了野外,我们将永远无法足够快地追捕并杀死它们,以满足我的喜好或为了更大的利益。
重复、再现、复制
发表的压力与捍卫科学主张的意愿
除非结果依赖于特定的硬件技巧,例如专有的加速器或修改后的指令集,否则一个小组的结果可以被另一个小组再现。与物理学家不同,我们不必建造第二个大型强子对撞机来验证第一个的结果。我们有数百万个类似,有时甚至相同的设备,可以在其上再现我们的结果。所需要的只是这样做的意愿。
构建成功
软件结构的问题在于人们在真正需要它之前不会真正学习它。
软件结构的问题在于人们在真正需要它之前不会真正学习它,而您的作业必须迫使他们仔细研究他们如何解决问题,不仅通过算法,还通过结构。
软件漂移
开源分支
由于这些系统有一个共同的父级,它们可能在相同的技术领域工作,因此将要添加的功能和修复程序可能相似。KV 碰巧手头有一个示例案例:两个操作系统在添加 SMP(对称多处理)支持之前就已分叉。当操作系统向现有内核添加 SMP 时,我们首先想到的是锁,这些方便的小型性能杀手,自 Dennard 缩放结束以来,我们一直在代码中撒上它们。
还有其他系统吗?
计算机科学是研究可以自动化的事物。
确定您是否处于风险之中的最简单测试之一是认真审视您每天所做的事情,看看您自己是否可以将自己编码失业。编程涉及大量重复性工作:模板、样板等。如果您能看到一种编写系统来替代自己的方法,要么这样做,不要告诉您的老板,并在您的小隔间里阅读小说时领取工资,要么寻找更具挑战性的工作。
亲爱的日记
关于保持实验室笔记本
虽然调试日志很有帮助,但它与实验室笔记本不同。如果更多的计算机科学家像科学家一样行事,我们就不会争论计算是艺术还是科学。
环游世界半圈
学习语言,结识人们,品尝美食
不同文化不仅对待不同功能的方式不同,而且彼此对待的方式也不同。人们如何相互尊重是一个可以而且确实写满卷帙浩繁的书籍的主题,作为书呆子,我们可能从未读过,但了解一些您要去的地方是个好主意。您可以尝试询问当地人,尽管人们通常都沉浸在自己的文化中,以至于他们很难向他人解释。
石刀和熊皮
如果您查看软件工具领域,您会看到大多数开发人员使用开源工具;或来自最近改革的专有软件之家 Microsoft 的工具,该公司已经发现其 Visual Studio Code 系统是将人们吸引到其平台上工作的好方法;或者最终是 Apple,其工具仅适用于其平台。在专业市场中,例如深度嵌入式、军事和航空航天,存在专有工具,这些工具通常比其开源同类产品差得多,因为此类工具的市场很小但利润丰厚。
人性化的一面
良好的、直接的、诚实的培训是无可替代的。
在面对此类社会工程攻击时,提供安全的通信环境的挑战不仅仅是技术;还有人。正如任何从事计算机安全方面认真工作的人都知道的那样,最大的问题出在键盘和椅子之间。大多数人默认情况下信任他人,并愿意给予他们信任。
羊皮纸之路?
是否有任何时候学习没有价值 - 为了学习本身?
风险越大,回报越大,如果您成功了,这将是一项值得您回顾并苦笑的成就。博士后永远不会笑,因为博士后是后笑时代。但是,在支付申请费并撰写所有论文之前,有一些事情需要考虑。
所有滑块都向右
硬件过剩
今年型号不如去年的型号有许多原因,性能无法扩展也有许多原因,其中一些 KV 在这些页面中已经介绍过。确实,每年升级并获得免费性能提升的日子已经一去不复返了,因为我们并没有真正获得比 4GHz 更快的单核。许多软件开发人员未能理解的一件事是他们的软件在其上运行的硬件的足够深层的水平。
房间里的大象
是时候把 POSIX 这头大象从我们的脖子上移开了。
通过为 Posix 这头大象编写代码,我们失去了利用现代硬件的机会。
软件项目衰败的四骑士
不要让苍白的骑士用异常抓住你。
KV 在过去的专栏中谈到了软件质量的各种衡量标准,但也许软件质量下降是团队失败的最客观的衡量标准之一。这种瘟疫是由战争和饥荒在团队中产生的士气低落引起的,这清楚地表明出了问题。在现实世界中,可以淘汰患病的动物,以防止疾病蔓延并成为土地上的瘟疫。错误计数的增加,尤其是在功能没有增加的情况下,是即将到来的项目末日的可靠迹象。
保卫公司的珠宝
GitHub 和运行手册安全
通常,运行手册的问题不是运行手册本身,而是运行手册的运行者很重要。运行手册或清单应该有助于记忆,而不是取代仔细和独立的思考。但是,由于我们这个行业就是这样,我们现在看到人们将这些东西推向了不合逻辑的极端,我认为这就是您在使用本地运行手册运行程序时遇到的问题。
黑盒何时应该透明?
何时替代品不是替代品?
在这些情况下,正确的答案是向供应商索取尽可能多的信息,以减少接受这种所谓的替代品的风险。首先,索取测试计划和测试输出,以便您可以了解他们是否以与您的用例相关的方式测试了组件。仅仅因为他们测试了该东西并不意味着他们测试了您的产品关心的所有部分。事实上,他们不太可能这样做。
数据的规划和维护
无缘无故地重新排列桶
诸如“我们如何保护这些数据?”之类的问题只有在您一开始就提出这些问题时才有效,而不是当一些律师或政府官员坐在会议室里,翻阅您的数据和日志,并在他们呼吸时发出威胁性的声音时。我们关心的所有关于数据的事情都需要预见,但是似乎在我们急于创造“利益相关者价值”的过程中,我们愿意牺牲这些重要属性,就像数据美食家一样行事,直到像先生一样。
摆脱疯狂之路
调试器和断言
KV 继续咬牙切齿,因为他看到代码中加载了调试语句,如果编写代码的程序员能够自信且熟练地使用他们的调试器,这些调试语句将完全没有必要。如果一个人足够幸运能够访问到好的调试器,那么他应该对他通常感谢的任何事物表示极大的感谢,并使用该死的调试器!
专利荒谬
无知是最好的政策的情况
律师不阅读软件专利的主要原因是,如果您违反了专利,并且可以证明您了解该专利,那么您的公司将遭受三倍的损害,如果您不了解该专利,他们本来会遭受的损害。这似乎是避免阅读它们的充分理由,但还有一个更好的理由,那就是,作为设计或技术文档,软件专利很糟糕。
分而治之
二分法的应用和局限性
如果您有一个只在不时发生故障的 heisenbug,则二分法毫无用处。这些微妙的错误是最难修复的,也是导致我们批判性地思考我们正在做的事情的错误。时序错误、分布式系统中的错误以及我们在构建越来越复杂的软件系统时面临的所有难题,目前还无法通过简单的二分法来解决。通常情况下,为一个复杂问题编写一个可用的二分法测试比在树的尖端分析问题花费的时间更长。
赞扬反汇编器
从硬件的底层细节中可以学到很多东西。
当您刚开始时,您希望尽可能将整个程序保存在您的头脑中。一旦您熟悉了您的第一种简单的汇编语言和您正在使用的机器架构,您将完全有可能查看一两页汇编代码,不仅知道它应该做什么,还知道机器将为您逐步做什么。当您查看高级语言时,您应该能够理解您希望它做什么,但通常您不知道您的意图将如何转化为行动。
厌恶版本
解决代码依赖性问题
永远不应在代码本身内部硬编码版本或路径。代码需要是灵活的,以便它可以安装在任何地方并在任何地方运行,只要必要的依赖项可以解决,无论是在静态编译代码的构建时,还是在解释型代码或具有动态链接库的代码的运行时。目前,有很多很好的方法可以做到这一点,所以很多人仍然做错是可耻的。
非精神病患者管理开源项目指南
尊重您的员工,向他人学习,并知道何时放手。
从技术忠实者之一过渡到受人憎恨的 PHB(尖头老板)之一,无论是在公司界还是开源世界中,都是一个非常困难的过渡。除非您是那种一直注定要进入高层管理人员的人,否则要完成这种过渡需要大量的工作和大量的耐心,主要是对自己。
Kabin Fever
KV 的 KFH(在家编码)指南
让我邀请您参加我的下一个关于如何主持 Zoom 会议的 Zoom 会议!作为移动计算和远程工作的爱好者,从我大学的早期开始,随着时间的推移,我养成了一些有用的习惯来保持良好而富有成效的工作节奏,并且我发现其中许多习惯非常适用于那些刚开始在家工作的人。
移除 Kode
无效函数和无效功能
从系统中删除无效代码是 KV 最喜欢的编码消遣之一,因为没有什么比摆脱您知道没有被使用的东西的感觉更好的了。代码删除就像打扫房子,只是有时您用火焰喷射器打扫房子,这说实话,非常令人满意。由于您使用的是版本控制系统(您最好使用 VCS!),因此无需担心即可轻松删除代码。如果您需要删除的代码,您可以随时从 VCS 中检索它。
理智与不可见标记
制表符与空格
不可见和几乎不可见的标记将我们带到问题的“人”的部分?并不是说代码编辑器作者不是人,但我们大多数人不会编写新的编辑器,尽管我们所有人都会使用编辑器。众所周知,曾经有一段时间计算机内存很小,制表符(单个字节)与相应数量的空格 (8) 之间的差异可能是存储在珍贵磁盘上的源代码大小以及通过任何原始而缓慢的总线从存储器传输到内存的显着差异。
破碎的心和咖啡杯
安全审查的折磨
总的来说,安全审查有两种主要类型:白盒和黑盒。白盒审查是指攻击者几乎完全访问诸如代码、设计文档和其他信息的信息,这将使他们更容易设计和执行成功的攻击。黑盒审查或测试是指攻击者只能以普通用户或消费者相同的方式查看系统。
Kode Vicious 在交通中玩耍
随着复杂性的增加,风险也随之增加。
对于如何将软件应用于实际上可以杀死我们的系统的问题,没有唯一的答案,但是有一些模型可以遵循,这些模型可能有助于减轻风险。这些系统中涉及的风险来自三个主要领域:营销、会计和管理。并非不可能安全地设计此类系统,但自动化系统的历史告诉我们,以低廉且快速的方式做到这一点很困难。
工单大师
重视工作的质量,而不是数量
已经创建了许多愚蠢的指标来衡量工作,包括工单关闭的速度、程序员一天编写的代码行数以及作者在一小时内可以撰写的字数。所有这些措施都有一个共同点:它们未能考虑到输出的质量。如果 Alice 一天编写了 1,000 行难以阅读、有错误的代码,而 Carol 在同一时间内编写了 100 行精心制作、易于使用的代码,那么应该奖励谁呢?
数字是给计算机用的,字符串是给人用的
软件应如何以及在何处将数据转换为人类可读的形式
除非您正在处理、存储或传输的内容确实是来自人类并旨在展示给人类的字符串,否则您应该避免将该数据作为字符串进行处理、存储或传输。请记住,数字是给计算机用的,字符串是给人用的。让计算机完成以人类可能觉得可口的形式向人类呈现您的数据的工作。这就是应该花费那些额外的字节和指令的地方,而不是做相反的事情。
Koding 学院
成为前端管道工的低风险途径
鼓励您的朋友选择一门课程,该课程将介绍可以在未来使用的概念,而不仅仅是今年流行的特定的一组流行语技术。大多数课程都基于 Python。鼓励您的朋友学习 Python 作为第一门计算机语言,因为在 Python 中学习的概念可以应用于其他语言和其他领域。
CSO 有什么用?
安全需要的不仅仅是现成的解决方案。
CSO 不是安全工程师,所以让我们对比一下这两项工作,以描绘出我们应该看到和不应该看到的画面。
必须和禁止
关于编写文档
没有背景或解释性材料的声明对于那些没有深入研究计算机安全或一般安全艺术和科学的人来说是无用的。像攻击者和防御者一样思考需要一种特殊的思维方式,大多数人都没有能力做到这一点;因此,如果您希望阅读文档的人遵循您的指导,那么您必须带领他们从无知走向知识。
有史以来最糟糕的主意
100 期的启示!
2004 年 2 月,我与 Queue 编辑委员会的其他成员一起参加了我们的每月一次的面对面晚餐会议,我们在会议上聚在一起提出有趣的讨论主题,这些主题将产生面向从业人员的文章(以及撰写这些文章的最佳作者),以便在 Queue 中发表。这只是我们开展业务的第二年,尽管我们已经发表了一些成功且被广泛阅读的文章,但 Queue 仍然没有固定的专栏作家。我最初是由另一位编辑委员会成员 Eric Allman 邀请参加董事会会议的,并为该出版物撰写了几篇文章。我也是我的第一本书的合著者,但从未担任过专栏作家。
了解你的算法
停止使用硬件来解决软件问题。
知道您的 CPU 100% 的时间都在使用并不能告诉您关于整个系统的太多信息,除了它很忙,但忙于什么?也许它正处于一个紧密的循环中,或者某个小丑在测试期间添加了一堆不再需要的延迟循环。在您分析系统之前,您不知道 CPU 为何繁忙。所有系统都提供某种形式的分析,以便您可以追踪瓶颈所在,并且在您花钱购买全新的硬件之前,应用这些工具是您的责任。
编写测试计划
建立您的假设、方法和预期结果。
如果您可以将您的每个测试都视为一个具有假设、测试方法和测试结果的实验,那么一切都应该到位,而不是出现漏洞。
机会园丁
收获开源产品并种植下一季作物
对于一家公司来说,从纯粹的开源消费者,到通过补丁提交与项目交互,再到成为直接贡献者,这是一个非常自然的过程。没有人会期望一家公司成为其消耗的所有开源项目的直接贡献者,因为大多数公司消耗的软件远多于它们生产的软件,这就是开源花园的恩惠。然而,每个消费开源的公司都应该回馈一些东西,以便其花园继续结出果实,而不是腐烂的蔬菜。
被称为意大利面条式代码的淫秽耦合
教你的初级程序员如何阅读代码
由于您都在同一个代码库上工作,因此您也有充足的领导机会,通过向这个人展示您是如何编码的。您必须小心地做到这一点,否则初级程序员会认为您在拉等级,但是,通过一点温和的展示和讲述,您可以让您的 Padawan 明白您的意图。对于我们这些喜欢与看似逻辑的机器共度时光的人来说,这种人际互动通常很困难。
每朵乌云都镶有银边
缓存为王。如果你的缓存被削减,你将会感受到它。
显然,您的管理层从未听说过“一分钱一分货”这句话。或者他们可能听过,但没有意识到它适用于他们。云计算的节省是以失去对系统的控制为代价的,这最好地概括在流行的书呆子贴纸中,上面写着“云计算只是别人的计算机”。一些提供商现在有一种叫做金属即服务的东西,我真的认为这应该意味着一支 80 年代的金属乐队出现在您的办公室,演出一场演出,砸碎家具,并在地毯上小便,但唉,这只是云提供商最终承认云计算并非所有应用程序的正确答案的方式。
监视器与雪花
做出大胆的猜测
系统可能随机卡顿不仅表明系统中存在严重错误;这也是风险的主要来源。您没有说您的分布式作业控制系统控制什么,但让我们假设我希望它不是像发电站、喷气式飞机或金融交易系统那样具有重大、现实世界副作用的东西。当然,风险在于系统会卡顿,不是在有人方便添加虚拟作业来清除卡顿时,而是在某些可能导致数据丢失或返回不正确结果的操作期间。
弹出内核
在内核或用户空间中进行编程之间进行选择
在一个高性能代码继续用花哨的汇编器(又名 C)编写的世界中,没有内存安全性和许多其他风险,唯一的补救措施是坚持软件工程基础知识。减少处于危险之中的代码量,保持子系统之间的耦合高效且显式,并努力为工作提供更好的工具,例如静态代码检查器和大型运行时测试套件。
减少攻击面
有时你可以给猴子一个不太危险的棍棒。
减少软件攻击面的最佳方法是删除任何不必要的代码。既然您现在有两个团队要求您保留代码,那么可能是时候考虑制作两个不同版本的二进制文件了。该应用程序听起来像是一个嵌入式系统,所以我猜它是用 C 语言编写的,并从那里开始。
冷酷的缓存
关于缓存的实现和维护
亲爱的 KV,我们最新的工作项目需要在我们的云基础设施中部署大量略有不同的软件堆栈。借助现代硬件,我可以在笔记本电脑上测试此部署。我一直遇到的问题是,我们的部署系统似乎秘密缓存了我的某些文件和设置,并且即使我反复发出命令这样做,也不会清除它们。我已经求助于反复使用 find 命令,以便我可以清除有问题的的文件。我发现系统在很多地方缓存数据,所以我已经开始列一个列表。
物联网:恐怖互联网
如果看起来像天要塌下来了,那是因为它确实要塌下来了。
确实,许多以安全为重点的工程师听起来可能像小鸡莉特尔,到处宣布天要塌下来了,但是,除非您一直生活在岩石下,否则您会注意到,天确实要塌下来了。几乎每天都有针对联网系统的重大攻击登上新闻,而恐怖互联网正在率先将分布式系统带入地狱之路——一条您希望用您的良好意愿铺平的道路。
观察者效应
在零和最大值之间找到平衡
问题在于未能意识到当您轮询系统以获取信息时,您要求系统做什么。现代系统包含数千个可以测量和记录的值。盲目检索系统可能暴露的任何内容已经够糟糕了,但是以高频轮询方式索取它会更糟。
强制异常处理
你永远不能低估编程中的人为因素。
是的,KV 也阅读“The Morning Paper”,尽管他不得不承认他没有阅读收件箱中来自该列表的所有内容。当然,您提到的论文引起了我的兴趣,而您没有指出的一件事是,它实际上是对分布式系统故障的研究。现在,我们如何使编程更难?我知道了!让我们在一个系统上解决一个问题并将其分布式化。有一天,我想看到一篇论文告诉我们,分布式系统中的问题是否会随着节点数量或互连数量的增加而增加。
不会递盐的棋手
人工智能:软和硬,弱和强,狭隘和通用
几乎所有非专业人工智能工作中固有的问题是,人类实际上从一开始就不太了解智能。现在,计算机科学家经常认为他们了解智能,因为他们经常是“聪明”的孩子,但这与理解智能实际上是什么关系不大。在不清楚人类大脑如何产生和评估想法的情况下,这可能不是智能概念的良好基础,我们引入了许多智能的替代品,其中第一个是游戏行为。
软件开发的不圣洁三位一体
测试、文档和代码
像这样的问题让人想起源代码、文档和测试是软件开发的不圣洁三位一体,尽管许多组织喜欢将它们视为独立的实体。有趣的是,虽然许多团体口头上支持“测试驱动开发”,但他们并没有将文档包含在 TDD 中。
云卡尺
命名下一代并记住云计算只是别人的计算机
目前,由于语言的限制,我们可能会继续拥有对其函数进行版本控制的程序员,但让我们希望我们能够阻止他们以下一代之后的名字命名他们的下一代。
冷落信使
在软件设计审查中排除自我
试图纠正刚刚完成大量工作的人,即使最终,这项工作不是正确的工作,也是一项艰巨的任务。相关人员无疑相信他已经非常努力地为团队的其他成员创造了一些有价值的东西,而走进并对其吐口水,无论是字面上还是比喻意义上,都可能越过您的“冒犯”线——至少我认为是这样。我有点惊讶,因为这是第一个 sprint 并且已经编写了这么多代码,软件不应该在 sprint 确定了需要什么、利益相关者是谁等之后才出现吗?
你想干什么?
单个缓存未命中比许多指令更昂贵。
保存指令——他真有 90 年代的风格。人们关注细节总是好的,但有时他们只是不关注正确的细节。虽然 KV 永远不会鼓励开发人员浪费指令,但鉴于现代软件的状态,似乎已经有人这样做了。KV 会像您一样,站在可读性一边,而不是节省一些指令。
GNL 不是 Linux
名字里有什么?
名字里到底有什么?正如您已经看到的,这个准技术性话题继续在软件社区,特别是在开源世界中引起一些争议。您可以通过单击本文附言中提供的链接找到来自 GNU 方面的叙述,但 KV 发现该叙述不足,因此,违背我对猪和跳舞的更好判断,我将发表一些评论。
代码囤积
提交提交,以及总结图的美妙之处
亲爱的 KV,为什么开源项目的这么多有用功能都隐藏在晦涩的配置选项下,这意味着它们几乎不会被使用?这只是典型的文档和推广不力,还是有什么东西让这些开发人员隐藏他们的代码?代码似乎并没有损坏。当我在最近遇到的一些代码中打开这些功能时,系统在测试和生产中仍然保持稳定。我认为代码应该要么被使用,要么从系统中删除。如果代码在源代码存储库中,那么它并没有真正丢失,但它也没有使系统的其余部分变得混乱。
腌制补丁
关于补丁存储库以及安全专业人员与内部开发人员之间的紧张关系
我最近遇到了一个软件存储库,它不是代码存储库,而是补丁存储库。该项目似乎由几个其他组件构建而成,然后有复杂的脚本以特定顺序应用补丁。我不得不查看这个存储库,因为我想修复系统中的一个错误,但是试图弄清楚在任何特定时间点代码的实际外观都令人困惑。是否有工具可以帮助像这样工作?
Hickory Dickory Doc
关于空加密和自动化文档
尊敬的 KV,在审查我们产品中的一些加密代码时,我偶然发现了一个允许空加密的选项。这意味着可以开启加密,但是数据永远不会被加密或解密。它将始终以“明文”形式存储。我从我们最新的源代码树中删除了这个选项,因为我认为我们不希望毫无戒心的用户开启了加密,但数据仍然以明文形式存储。我团队中的另一位程序员审查了这项潜在的更改,并阻止了我提交,说空代码可以用于测试。
拉撒路代码
没人料到西班牙宗教裁判所。
我被要求研究一下是否有可能采用一个 15 年前的开源软件,并更新它以使其在我们公司目前使用的系统上工作。代码本身似乎还不错,至少不比我习惯阅读的代码更糟糕,但我怀疑从头开始编写一个新版本可能比尝试理解我没有编写且多年来无人积极维护的代码更容易。
原始网络
相关性和可重复性
尊敬的 KV,我工作的公司已决定使用无线网络链路来减少延迟,至少在站点之间的天气良好时是这样。在我看来,对于通过有损无线链路的传输,我们希望使用自己的传输协议,该协议直接位于无线电提供的任何协议之上,而不是将位浪费在 IP 和 TCP 或 UDP 标头上,对于点对点网络而言,这些标头实际上并没有用处。
大到不能倒
可见性带来可调试性。
我们的项目一直在我们的基础设施上部署一个著名的分布式键/值存储,但我们不止一次地惊讶地发现,客户端数量的简单增加不仅减慢了速度,而且使它们完全停止运行。这导致回滚,而我们中的几个人则在网上论坛上搜索,以弄清楚是否有人遇到过同样的问题。使用这个项目软件的全部原因是为了增加大型系统的规模,因此我很惊讶于负载的少量增加竟导致了完全失败的次数如此之多。
端口抢占
别惹恼你当地的系统管理员。
尊敬的 KV,几年前,您曾责备一些开发人员在向 IETF(互联网工程任务组)请求保留网络端口时没有遵循正确的流程。虽然我明白抢占已使用的端口是不良做法,但我想知道您自己是否尝试过让 IETF 分配端口。我们最近在一个开源项目的新协议中经历了这种情况,这是一个非同小可且令人沮丧的练习。
外包责任
当你的调试器让你失望时,你会怎么做?
尊敬的 KV,我被分配去协助一个新项目,并且一直在查看团队放在内部 wiki 上的公认简略的文档。我花了一天左右的时间盯着似乎是一长串他们打算集成到他们一直在构建的系统中的开源项目,但我找不到他们在哪里描述了他们的原创工作。
分叉结束
开源软件的偷工减料
当大多数开源项目只是建议你从 GitHub 或 SourceForge 获取最新版本时,如何基于开源软件制作合理的软件包?我们可以像 GitHub 鼓励我们做的那样,分叉代码,然后制作我们自己的版本,但这会将我们期望项目承担的发布工程工作转移到我们身上。
日志记录的逻辑
以及 PDF 的非逻辑
我在一个非常开放的环境中工作,我所说的开放是指许多人都有能力成为我们服务器上的 root 用户,以便他们可以在服务器崩溃时修复问题。
这是 Foo 字段
位的含义以及避免升级瓶颈
什么时候有人会编写文档来告诉你位的含义,而不是它们设置了什么?我一直在努力将一个库集成到我们的系统中,每次我试图弄清楚它想要从我的代码中得到什么时,它都只是告诉我它的一部分是什么:“这是 foo 字段。”问题是它没有告诉我当我设置 foo 时会发生什么。就好像我应该已经知道了一样。
漏洞和吹牛的权利
重要的不总是大小。
尊敬的 KV,我一直在处理一个用 Java 编写的大型程序,该程序似乎大部分时间都在要求我重新启动它,因为它已经耗尽了内存。
资源管理课程
不要浪费内存,不要渴望内存——除非这无关紧要
尊敬的 KV,我一直在为高端、高性能网卡重新设计设备驱动程序,并且我遇到了资源分配问题。我正在使用的设备有多个网络端口,但这些端口并非总是被使用;事实上,我们的许多客户只使用四个可用端口中的一个。如果我可以在设备驱动程序首次加载到系统时,为所有端口分配资源——无论有多少端口——而不是在管理员启动接口时才处理分配,这将大大简化我的驱动程序中的逻辑。
主机的命名是一件难事
还有,过早重启的危险
主机的命名是一件难事,它与编码风格、编辑器选择和语言偏好在计算机人员争论不休的事情中并列,而这些事情对世界上其他任何人来说都无关紧要。
精挑细选和科学方法
软件应该成为计算机科学的一部分,而科学需要证明。
因此,在与樱桃卖家讨价还价时,很明显,购买整箱樱桃比购买单篮樱桃更划算,即使那才是我们真正想要的。然而,不想错过这笔交易,我的朋友买下了整箱,我们出发了,边吃边聊。又过了 45 分钟才到家,在那段时间里,我们已经吃掉了半箱以上的樱桃。
被自动化淹没
无论何时有人要求你信任他们,都不要信任。
所以你的团队中了“只需安装此软件,一切都会好起来”的诡计。这是一个古老的伎俩,它继续困扰着系统管理员和其他在开发人员周围扮演支持角色的人。无论何时有人要求你信任他们,都不要信任。虽然这可能很愤世嫉俗,但总比被愚弄要好。
被除法分割
软件有最佳使用期限吗?
你知道关于软件应该多久需要维护一次的任何经验法则吗?我不是在考虑错误修复,因为错误从代码编写的那一刻就存在,而是在考虑代码中似乎不断进行的重构。有时我觉得程序员将重构作为保住工作的一种方式,而不是提供任何真正的改进。
代码滥用
一个程序员的扩展是另一个程序员的滥用。
在最近一次工作停机期间,我一直在清理一组库,删除死代码,更新文档块,并修复一些烦人但不关键的小错误。这种代码探险揭示了一些库不仅被使用,而且还被滥用。每个人和他们的姐妹都将定时库用于他们能想到的几乎任何事件这一事实还不太糟糕,因为它是一个旨在定期调用代码的库(尽管有些事件似乎根本不需要成为事件)。
更多代码意味着更少错误吗?
你今天节省的字节可能会在明天咬你一口
尊敬的 One,你差点用你对简洁性的呼吁说服了我,即在其中一行中使用 system() 可以减少出现错误的可能性。差点,但还差一点。
一段不错的代码
生动的隐喻和正确地重用函数
在上一期 Kode Vicious(系统不是产品,《》10 (4),2012 年 4 月)中,我提到我最近读了两段代码,它们实际上降低而不是升高了我的血压。正如承诺的那样,本期 KV 涵盖了第二段代码。
系统不是产品
在浪费时间重新输入配置数据之前,停下来闻闻代码的味道
偶尔,我会遇到一段好的代码,并想花点时间来认识到这一事实,哪怕只是为了在年度体检前保持我的血压较低。第一段引起我注意的代码是 Linux 中的 clocksource.h。Linux 通过一组像俄罗斯套娃一样组合在一起的结构与硬件时钟(例如主板上的晶振)进行交互。
规模失败
将工具用于错误的工作是可以的,直到有一天它不再可以。
尊敬的 KV,我一直在深入研究工作中的一个基于网络的日志记录系统,因为该系统时不时会卡住,即使似乎没有充分的理由这样做。我发现的东西会很有趣,如果它不是我的工作来修复它的话:整个日志记录系统的中央调度器是一个简单的 for 循环,围绕着一对 read 和 write 调用;for 循环从一组文件描述符中获取输入,并将输出发送到另一组文件描述符之一。只要没有远程读取器或写入器阻塞,系统就可以正常工作,并且通常这不是问题。
网络协议之战
一个关于傲慢和狂热的故事
尊敬的 KV,我一直在做一个个人项目,该项目涉及创建一个新的网络协议。出于好奇,我试图找出为我的项目获得官方协议号需要做些什么,并发现这可能需要一年时间,并且可能意味着与 IETF 的当权者进行大量来回沟通。我知道这不会像在网页上点击某些东西那么简单,但一年似乎过长了,而且实际上这不是工作的主要部分,因此这似乎主要是分散注意力。
代码旋耕
KV 讨厌不必要的工作。
尊敬的 KV,每当我工作中的某个程序员需要在函数中添加一个变量,并且名称与先前使用的名称冲突时,他都会将所有先前实例更改为新的不同名称,以便他可以自己重用该名称。这导致他的差异比他们需要的要大得多,并且让我非常恼火。每当我对此提出质疑时,他都会说旧用法无论如何都是错误的,但我认为这只是他的借口。
肆意的调试行为
保持你的调试消息清晰、有用且不烦人。
尊敬的 KV,为什么那些向他们的程序添加日志记录的人缺乏区分他们的日志消息的创造力?如果它们都说同样的话——例如,DEBUG——就很难分辨发生了什么,甚至很难分辨之前的程序员最初为什么要添加这些语句。
在生产系统上调试
这更多的是一个社会问题,而不是技术问题。
我一直在尝试调试工作中系统上的一个问题,但是运行我们生产系统的控制狂不希望让我访问始终发生错误的系统。我无法在我的桌面上的测试环境中重现该问题,但是每天该错误都会发生在多个生产系统上。
如何提高安全性?
这需要不仅仅是一年刷一次牙线。
我们最近在工作中遇到了安全漏洞,现在整个 IT 部门都在争先恐后地提高安全性。整个事件暴露出的一个问题是,如此多的安全建议都是通用的。这就像被告知晚上外出时要锁门,但没有说明你应该拥有哪种锁或多少把锁才足以保护你的房子。我认为现在大多数人都知道他们需要锁门,那么为什么没有更多关于保护系统的具体指南呢?
文件系统垃圾
快速有效地清理你的存储空间
尊敬的 KV,我们最近在一个非常大的文件服务器上耗尽了存储空间,经过仔细检查,我们发现只是一个员工用完了所有空间。空间几乎完全被运行一些数据分析脚本产生的小文件占用。这些文件在被读取一次后就完全没有必要了。生成文件的代码没有很好的方法在创建文件后清理它们;它只是继续相信存储空间是无限的。现在我们不得不在我们的文件服务器上设置配额,当然,还要每周处理对更多磁盘空间的呼喊。
面试技巧
将优秀的程序员与糟糕的程序员区分开来
我的工作组刚刚获得批准雇用四名新程序员,现在我们所有人都必须面试人员,包括电话面试和现场面试。我讨厌面试别人。我从不知道该问什么。我还注意到,人们在撰写简历时往往对真相漫不经心。我们正在考虑为我们的下一轮面试者进行编程测试,因为我们意识到之前的一些候选人显然无法编写出纸袋。必须有一些加快招聘速度而不损害我们雇用的人的技巧。
存储冲突
注意以二进制格式保存数据
在我工作的地方,我们非常重视将我们所有的数据,而不仅仅是我们的源代码,存储在我们的源代码控制系统中。当我们创办公司时,我们决定尽可能多地存储在一个地方。问题是,随着时间的推移,我们已经从纯粹的编程环境转变为有其他人的环境——那种使用 Outlook 发送电子邮件并将他们的数据保存在二进制和专有格式中的人。
使用 Autotools 进行移植
将 Automake 和 Autoconf 等工具与预先存在的代码库一起使用可能是一个主要的麻烦。
我最近一直在处理的一段 C 代码需要移植到另一个平台,在工作中,我们正在考虑使用 Autotools,包括 Automake 和 Autoconf,来实现这一点。问题是,每次我尝试使用这些工具构建代码时,我都感觉自己像迷宫中的老鼠。我几乎可以构建东西,但又不太能构建。
受光速限制
你可以为 WAN 上的 NFS 优化做的只有这么多。
我被要求优化我们用于全球网络的 NFS(网络文件系统)设置,但是 NFS 在长链路上的工作方式与在 LAN 上的工作方式不同。管理层一直喊着我们在远程站点之间有千兆比特链路,但是我们的用户尝试通过 WAN 链路访问他们的文件时所体验到的确实令人沮丧。这仅仅是一项不可能完成的任务吗?
园艺技巧
一个好的库就像一个花园。
在过去的一年中,我一直在为我的公司维护一组库。这些库用于连接我们销售的一些特殊硬件,而我们销售给最终用户的所有代码都运行在库之上,这些库几乎直接与我们的硬件对话。我一直遇到的一个问题是,应用程序员不断绕过库直接与硬件对话,这会在我们的系统中引起错误,因为库代码维护有关硬件的状态。如果我使库无状态,那么每个库调用都必须与硬件对话,这将减慢库以及所有使用它的代码的速度。
端口短缺
调试一个短暂的问题
我一直在调试一段简单的网络代码中的一个网络问题。我们有一个小型服务器进程,它侦听来自我们数据中心中所有其他系统的命令,然后将命令分发给其他服务器以供运行。对于发出的每个命令,客户端都会建立一个新的 TCP 连接,发送命令,然后在我们的服务器确认命令后关闭连接。
收集计数器
收集统计数据很重要,但让其他人可以使用它们也很重要。
在过去的一个月中,我一直在努力解决当网络负载过重时我们的系统上发生的问题。大约两周后,我能够将问题从“网络坏了”(我的同事们主要用来惹恼我的短语)缩小到我们系统中网络接口上出现的问题。
避免过时
过度专业化可能是系统管理员的死亡之吻。
尊敬的 KV,系统管理员面临的最大威胁是什么?不是技术威胁(安全性、中断等),而是系统管理员作为一种职业面临的最大威胁?
构建失败
频繁的构建失败可能表明开发项目内部存在更深层次的问题。
有什么比团队成员签入破坏构建的代码更让程序员恼火的吗?我发现自己不断追踪其他人代码中的小错误,仅仅是因为他们没有检查他们的更改是否破坏了构建。最糟糕的是,当有人破坏了构建,而我指出这一点时,他们却愤愤不平。有什么更好的方法可以防止这些类型的问题吗?
提交问题
什么时候是提交更改的正确时间?
我的项目中的另一个人坚持以大批量签入不相关的更改。我说的不相关是指他会修复几个不相关的错误,然后在整个源代码树中对间距和缩进进行一些小的更改。然后他会一次性提交所有这些更改,通常会附带一个简短的提交消息,其中仅列出他声称已修复的错误。你认为我在要求每次签入只解决一个问题或问题方面是否过于挑剔?
标准建议
减轻实施标准的痛苦
我的母亲非常认真地对待语言,包括书面语言和口头语言。当我给她看我为学校写的论文时,我最不想听到的就是“把红笔给我拿来”。在那些日子里,我没有电脑;我所有的作业都是手写或用打字机写的,所以红笔意味着完全重写。她是一位严厉的编辑,但质疑她的工作质量或她对写作过程的热情是不可能的。
尽早合并,经常合并
在分支开发中集成更改
在进行合并开发时,应该多久合并一次?很明显,如果我等待太久,那么我会在合并地狱中度过数天,在那里似乎什么都无法正常工作,并且在那里我最终使用 revert 命令的频率高于 commit;但是分支开发的全部意义在于能够保护开发的主分支免受不稳定的更改的影响。是否存在一个快乐的中间地带?
维护的意义
软件维护不仅仅是错误修复。
软件维护不是用词不当吗?我从未听说有人每年审查一段代码,只是为了确保它仍然处于良好状态。软件维护似乎真的只是错误修复的掩盖。当我想象维护时,我想象的是将我的汽车送去更换机油,而不是修复一段代码。有人真的会在代码在生产环境中运行后审查代码吗?
给自行车棚刷漆
一种结束无意义的编码辩论的万无一失的技术
上周,我们一位较新的工程师签入了一个简短的程序,以帮助调试我们正在开发的代码中的问题。即使这是一个测试程序,也有几个人阅读了代码,然后评论了他们希望看到的更改。代码没有任何主要问题,但对于正在签入的内容,似乎产生了大量电子邮件。最终,线程中的评论比程序本身还要长。在线程中的某个时刻,提交代码的程序员说:“听着,我已经签入了代码;你现在可以把你想要的任何颜色刷到自行车棚上了”,然后拒绝再对代码进行任何更改。
不要被定型为软件开发人员
Kode Vicious 的脾气显然受到了不得不清理他的同行的错误的影响。他希望他们现在学习什么,以便他可以期待优雅而温和的晚年?
我想认为学习更多知识将有助于我作为系统集成商的日常工作,即编写粘合和定制代码。但是显而易见的适用知识特定于工具和软件包,这些工具和软件包甚至可能在项目的生命周期内变得过时或停止使用,并且在某些情况下已经达到了这个目的地。
傲慢与偏见:(瓦萨号)
软件工程师可以从造船商那里学到什么?
我在加利福尼亚州的一所学校向本科生教授计算机科学,而我在英语系的朋友,不知怎的,前几天对我说了一句有趣的话。他想知道我的学生是否读过《弗兰肯斯坦》,以及我是否认为这会让他们成为更好的工程师。我问他为什么认为我应该布置这本书,他说他觉得一本书可以改变人们思考他们与世界,特别是与技术的关系的方式。他不是在屈尊俯就;他是认真的。鉴于似乎使用信息技术构建的类似弗兰肯斯坦的项目数量,也许向计算机科学本科生教授这些课程,让他们对自己的社会责任有一些概念,这并不是一个坏主意。
调试设备
调试故障硬件的正确方法是什么?
我建议拿一把非常锋利的刀,随机切割电路板走线,直到它工作或闻起来很奇怪!我想你不是在问导致我在另一列中使用 changeineer 这个词的同一个问题。我认为你有一个实际故障的硬件,并且你已经将之前的三个版本退回给了制造商,并附带了带有法律行动的隐晦暗示的讨厌信件,如果他们继续向你发送损坏的产品。
认清实时
尊敬的 KV,我正在开发一个对时序问题变得非常敏感的网络系统。
我正在开发一个对时序问题变得非常敏感的网络系统。当系统最初开发时,带宽要求完全在现成的硬件和软件的容忍范围内,但在过去的三年中,情况发生了变化。数据流保持不变,但现在系统被要求对事件的到达做出更快的反应。该系统是用 C++ 编写的,并在 Linux 之上运行。在最近的项目会议上,我建议减少延迟的最快途径是转向 Linux 的实时版本,因为实时操作系统旨在为应用程序提供最低延迟的服务。
美丽的代码是存在的,如果你知道在哪里寻找
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
我已经阅读你的咆哮有一段时间了,我不禁要问,有什么代码是你喜欢的吗?你总是显得如此消极;我真的很想知道你是否真的相信编程世界是如此丑陋的地方,或者在某个地方,有一个快乐的地方让你去,但从不告诉你的读者。
美丽的代码是存在的,如果你知道在哪里寻找
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
我已经阅读你的咆哮有一段时间了,我不禁要问,有什么代码是你喜欢的吗?你总是显得如此消极;我真的很想知道你是否真的相信编程世界是如此丑陋的地方,或者在某个地方,有一个快乐的地方让你去,但从不告诉你的读者。
美丽的代码是存在的,如果你知道在哪里寻找
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
我已经阅读你的咆哮有一段时间了,我不禁要问,有什么代码是你喜欢的吗?你总是显得如此消极;我真的很想知道你是否真的相信编程世界是如此丑陋的地方,或者在某个地方,有一个快乐的地方让你去,但从不告诉你的读者。
系统容量规划
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我正在开发一个网络服务器,该服务器陷入了您在之前对一封信的回复中称为活锁的情况(Queue 2008 年 5 月/6 月)。我们的问题是我们的系统只有固定数量的内存来接收网络数据,但是系统经常不堪重负并且无法取得进展。当我向我们的应用程序工程师询问他们期望有多少数据时,我得到的唯一答案是“很多”,这没什么帮助。我如何才能弄清楚如何适当地规划我们的系统容量?
偏执狂的美德
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我刚刚加入一家公司,该公司将大量数据按摩成内部格式,供其自己的应用程序使用。尽管数据已定期备份,但我注意到对这些数据的访问安全性不是特别好,这些数据已累积到几 PB 的大小。没有加密,尽管数据不容易从 Internet 访问,但公司中的每个人都可以始终直接访问卷,包括物理访问和电子访问。
延迟和活锁
有时数据就是不能像它应该的那样快速传输。
尊敬的 KV:我的公司有一个非常大的数据库,其中包含我们所有的客户信息。该数据库已复制到世界各地的多个位置,以提高本地性能,以便亚洲的客户想要查看他们的数据时,不必等待数据从我的公司所在的美国传来……
有毒的程序员
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我不介意问你一个与工作无关的问题,尽管我想如果你介意你就不会回答。当我有时间时,我会参与一个开源项目,并且我们有一些令人讨厌的非技术问题。问题实际上是人,我想你知道我指的是哪些人:那些经常因为似乎最琐碎的点而与其他项目成员争吵的人,或者那些对项目贡献很少但似乎需要大量帮助来满足他们特定需求的人。我发现自己认为如果这些人只是离开就好了,但我认为在我们的邮件列表中就这些事情发起一场口水战真的无济于事。
进行他妈的测量!
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
你是否曾与一个对测量一切都完全混蛋的人一起工作过?
下一个大事件
函数式编程的未来和 KV 的五大协议设计技巧
尊敬的 KV,我知道您之前写过一篇文章,列出了一些值得阅读的书籍。我想我也应该加上《How to Design Programs》(如何设计程序),这本书可以在网上免费获取。这本书非常适合解释编写程序的过程。它使用 Scheme 语言并介绍了 FP(函数式编程)。我认为 FP 可能是编程的未来。IBM 研究实验室的 John Backus 在 1977 年就提出了这个观点。甚至微软也屈服于 FP,在 C# 中通过 LINQ 引入了 FP 的概念。
理清思路
代码恶棍(Kode Vicious)饿了。他靠你们这些来自软件开发前线的提问(以及大量的啤酒)维持生计。没有你们每月寄来的信件,KV 就像离水的鱼,或者像科学家没有问题可解决一样。所以请尽你的一份力量,让他保持理智(或至少免于精神错乱),让他忙碌起来,发挥作用。
尊敬的 KV,我遇到的最大的问题之一是记忆力。不是我电脑里的 RAM,而是我脑袋里那团湿糊糊的东西。似乎无论我在我的隔间周围贴多少提示,或者无论我多么频繁地关闭所有我工作需要使用的烦人的即时通讯客户端,我工作的时间都无法超过 15 分钟,就会有人打断我,然后我就失去了思路。如果这发生在我阅读电子邮件的时候,那不是问题,但是当我在编写代码时,特别是当我在调试代码中一个棘手的问题时,这让我的生活变得非常困难。
大嘴巴 KV
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
Unclear 构建 P2P 文件共享系统是为了满足什么需求?根据答案,使用现有的开源项目或购买商业软件来满足业务需求可能更有效,甚至更安全。
给新手的建议
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我是一个编程新手,刚开始阅读一些关于编程的书籍,特别是 C++ 和 Visual Basic。我真的非常喜欢编程,以至于在过去的几个月里,我没有一天不编写一些代码。我现在主要关心的是程序员的未来。如果一个人被称为程序员(即,专业人士),他或她真的会编程什么?比如,你会一直发明新的软件吗?或者到底会做什么?这主要是针对那些不为别人工作的人的情况。
贪婪的 API
又到了大家最喜欢的话题:API 设计。这个话题永远不会过时,不是吗?好吧,也许会,但请相信代码恶棍(Kode Vicious)会为这个古老的编程挑战注入一些新鲜的见解。本月,KV 将聚光灯投向了 API 大小调整的微妙艺术。
尊敬的 KV,这听起来可能对你来说很可笑,但我的一位同事最近称我的一个设计为“臃肿”。我的项目是定义一组数据库 API,供各种不同的前端 Web 服务使用,以存储和检索数据。问题是,一刀切的方法行不通,因为系统的每个客户都有不同的需求。有些人存储图像,有些人存储文本、声音、视频,以及几乎任何你能想到的东西。在当前的设计中,每种数据类型都有自己特定的一组 API 来存储、搜索、检索和操作其自身类型的数据。
代码恶棍的许可证
代码扫描软件很昂贵,我不确定它是否值得。您怎么看?
虽然有时很想责怪程序员,但许多问题的种子早在任何代码行(即使它们可能很糟糕)被编写之前就播下了。从工具的选择到软件许可证的选择,一切都可能影响产品的质量、可用性和商业潜力。本月,代码恶棍(Kode Vicious)将目光从编码技术上移开,探讨开发人员必须应对的一些艰难的决策。
无与伦比的 P2P
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我刚刚开始一个关于 P2P 软件的项目,我有一些问题。现在,我知道你在想什么,不,这不是一些侵犯版权的牛仔代码。这是一个受人尊敬的企业应用程序,供人们用来交换数据,例如文档、演示文稿和与工作相关的信息。这个项目我最大的问题是安全,例如,意外泄露我们用户的数据或让他们容易受到病毒攻击。肯定还有更多需要担心的事情,但这是最重要的两件事。所以,我想问“如果是 KV,他会怎么做?”
理解问题
是否有任何数据显示 Java 项目比使用旧语言的项目更成功或更不成功?
我上过一天的 Java 入门课程,也读过一本关于 Java 的书,但从未用它编写过任何严肃的代码。然而,作为一名管理员,我曾近距离接触过许多 Java 服务器项目,这些项目似乎都有一些共同的问题。
骑上马鞍,有抱负的代码骑师们
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我是一名 IT 顾问/承包商。我主要从事网络和微软操作系统方面的工作。我已经做了这项工作超过八年了。不幸的是,它开始让我感到厌烦。我的问题是:我该如何重新开始编程?我说“重新开始”是因为我有一些经验。在高中时,我上了两节 Applesoft BASIC 编程课。我非常喜欢它,所有科目都拿了 A,并且是老师见过的最好的编程学生。这激发了我对计算机科学的兴趣,我在大学里继续学习了计算机科学。在大学里,我学习了 C++、Java 和 Web 开发课程。
面对压力
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我一直在一个软件团队工作,该团队在几个不同的操作系统平台上生产最终用户应用程序。我最初是构建工程师,负责设置构建系统,然后是夜间测试脚本,现在我负责其中的几个组件,以及维护构建系统。我在构建软件方面看到的最大问题是 API 缺乏稳定性。当添加新 API 时,这没关系——如果你愿意,你可以忽略它们——当 API 被删除时,我知道,因为构建会中断。最大的问题是当有人更改 API 时,因为这要等到某个测试脚本——或者更糟糕的是,用户——执行代码并崩溃时才会发现。
毫无意义的 PKI
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
我们过去在内部妥协方面遇到过问题,管理层已经决定,保护信息的唯一方法是在传输过程中对其进行加密。
使用 KV 登录
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我被困在为公司一个新的支付处理系统编写日志系统。正如你可能想象的那样,这需要记录大量数据,因为我们必须能够在每个结算周期结束时将我们日志中的数据与我们的客户和其他用户(如信用卡公司)进行核对,并且如果对账单本身有任何争议,我们必须做好准备。我被分配到这项工作有两个原因:因为我是团队中最晚来的人,而且因为没有人认为编写另一个日志系统很有趣。
网络钓鱼解决方案
关于网络钓鱼,URL 本身难道没有泄露足够的信息吗?
尊敬的 KV,我注意到您在之前的几期中讨论过跨站脚本攻击,我想知道您是否对另一个 Web 问题——网络钓鱼——有任何建议。我在一家大型金融机构工作,每次我们推出一项新服务时,安全团队都会找我们的麻烦,因为登录页面看起来不同,或者他们声称很容易使用我们的某个表单从我们的用户那里钓取信息。我们并不希望我们的用户被钓鱼,但我不认为这是一个技术问题。我们的用户只是太蠢了,把他们的信息泄露给任何看起来愿意伪造我们页面的人。
代码恶棍(Kode Vicious)抓狂
当工具失效时,你会怎么做?
本月,代码恶棍(Kode Vicious)为大家带来了一份混合大礼包,包括解决海森堡 bug 的不确定性——一种臭名昭著的 bug 类型,它会让程序员真正发疯。他还为我们列出了他的必读书单。你的最爱在榜单上吗?继续阅读,找出答案!
人机(KV)交互
我们不能保证你会同意他的建议,但它可能比你迄今为止尝试过的任何方法都更有效。
欢迎来到新一期代码恶棍(Kode Vicious)专栏,这是 Queue 杂志的常驻代码专家和偶尔的煽动者每月举办的论坛。KV 喜欢听到你们在编码前线的故事,最好是以一个关于编程的有针对性的问题结尾。KV 还拥有一套久经考验的技巧来处理人际关系,所以请随时寻求他的帮助来处理那些角色。
开始你的代码之旅
尊敬的 KV,一个简单的问题:什么时候是调用字符串的 c_str() 方法来获取实际指针的正确时机?
新的一年又开始了,我们很高兴代码恶棍(Kode Vicious)仍然在咆哮着反对不安全的编程、注释不足以及其他各种形式的编码失误。然而,尽管他尽了最大的努力,但苦乐参半的真相是,这些问题不会很快消失,因此应该继续为未来的 KV 专栏提供充足的素材。哦,生活在一个不需要 KV 的建议或医生的世界里该多好。
恶毒的 XSS
对于那些怀疑 KV 的建议是否相关的读者,请看看 10 月份发生在 MySpace 上的 XSS 攻击。
对于那些怀疑 KV 的建议是否相关的读者,请看看 10 月份发生在 MySpace 上的 XSS 攻击。本月,代码恶棍(Kode Vicious)正讨论这种 XSS 攻击。幸好跨站脚本攻击没有缩写为 CSS,因为 MySpace 黑客使用了 CSS 来实施他的 XSS 攻击。否则这将是一个多么令人困惑的故事,嗯?
Kode Vicious
医生来了
KV 重返岗位,准备治疗另一种编码疾病:糟糕的 API。这是影响我们所有人的最广泛的病理之一,有时甚至会感染我们。但是,无论我们是编写 API 还是仅仅使用 API(或两者兼而有之),我们都应该好好阅读并听取这位恶棍的建议。
代码恶棍(Kode Vicious)即兴发挥
问题?计算机让复制数据变得太容易了。
有些月份,当他感觉雄心勃勃时,代码恶棍(Kode Vicious)会仔细阅读你们的所有来信,为回复哪封信件而苦恼好几天。然而,大多数时候,他采取一种不那么谨慎的方法。这通常包括打印出信件,将它们抛向空中,看看哪封信件正面朝上,重复这个过程直到只剩下两封信件。偶尔,KV 会完全不理会读者的反馈,就像本月的情况一样。
征服者 KV
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
假设我是 Sincere-and-Authentic 公司的客户(“代码恶棍继续战斗”,2005 年 4 月:15-17),并且假设我的 ISP 的系统管理员是一个肆无忌惮,但又热爱音乐的极客。他发现我在 Sincere-and-Authentic 公司有一个帐户。他在接入路由器中设置了一个过滤器,以记录属于我和 S&A 之间会话的所有数据包。他稍后会挖掘日志并检索音乐——而无需付费。
代码恶棍继续骑行
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
加利福尼亚不仅给你充足的阳光,显然也有雇主给你充足的时间来玩弄你喜欢的小问题,使用一种与后续实施无关的编程语言。
代码恶棍(Kode Vicious)变得肮脏
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的代码恶棍(Kode Vicious),我是公司内网一个(相当新的)网站的新任网站管理员。最近我注意到,虽然我已经实施了一些用户身份验证(一个链接到 SQL 服务器的启动 *.asp 页面,其中包含用户名和密码),但一些用户发现也可以输入一个较长的 URL 到该网站内的特定页面(而不是输入主页),他们可以直接访问该页面而无需身份验证(并且他们的登录没有记录在 SQL 数据库中)。
代码恶棍(Kode Vicious)大战魔斯拉
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,我的同事们一直在代码中做一些非常糟糕的事情,例如编写带有 goto 语句跳出宏的 C++ 代码,以及在低级函数中使用 assert 作为错误处理机制。我一直在努力让他们停止做这些事情,但我得到的标准回应是,“是的,这不好看,但它能用。”我怎样才能让他们开始问,“有没有更好的方法来做这件事?”他们听取我的论点,但似乎并不信服。在某些情况下,他们甚至坚持认为他们遵循的是良好的实践。
代码恶棍(Kode Vicious)继续战斗
代码恶棍(Kode Vicious)再次出击,将你从编码泥潭中拉出来,与常识的敌人作斗争。
尊敬的 KV,我在工作中维护一些 C 代码,这些代码快把我逼疯了。似乎我在任何文件中都无法超过三行代码,就会遇到一段有条件编译的代码。
代码恶棍(Kode Vicious)重装上阵
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
该程序应该是一个小型项目,但每次我开始指定对象和方法时,它似乎都会变得非常庞大,无论是在行数还是最终程序的大小方面。
代码恶棍(Kode Vicious)火力全开
编码难题让你抓狂?同事让你发疯?不用担心,代码恶棍(Kode Vicious)会为你解决问题。
尊敬的 KV,我的同事编写的方法有 1000 行长,并声称它们比分解成更小的方法集更容易理解。我们如何才能让他相信他的代码是维护的噩梦?
代码恶棍(Kode Vicious):归来
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的 KV,每当我的团队审查我的代码时,他们总是抱怨我不检查系统调用的返回值。我可以理解需要检查常规函数调用,因为我不信任我的同事,但系统调用是由知道自己在做什么的人编写的——而且,此外,如果系统调用失败,我也没有太多可以恢复的方法。何必呢?
代码恶棍(Kode Vicious)再次出击
叫我们疯子吧,但我们将使代码恶棍(Kode Vicious)成为常态。
尊敬的代码恶棍(Kode Vicious),我遇到了这个问题。我似乎永远找不到我知道我写过的代码片段。这与其说是工作代码——工作代码在我们的源代码服务器上——不如说是,你知道的,那些我上个月编写的测试代码片段,我永远找不到它们。您是如何处理这个问题的?
代码恶棍(Kode Vicious)前来救援
一个有态度的 koder,KV 回答你的问题。他不是曼纳斯小姐。
尊敬的代码恶棍(Kode Vicious),在我工作的地方,我们的产品中混合使用了 C++ 代码、Python 和 shell 脚本。我总是很难弄清楚在特定工作中何时使用哪种语言是合适的。您只用汇编语言和 C 语言编写代码吗?还是这对您来说也是一个问题?