The Kollected Kode Vicious

Kode Vicious - @kode_vicious

  Download PDF version of this article PDF

Kode Vicious 重装上阵

一位态度鲜明的程序员,KV 回答您的问题。他可不是曼纳斯小姐。

尽管他不情愿承认,但 Kode Vicious 乐于为需要帮助的程序员提供免费建议。但是,如果没有您源源不断的提问,他就会开始枯萎,或者更糟的是,表现出鲁莽和危险的行为,坦率地说,这真的把我们吓坏了。因此,我们恳求您,通过将您的编程问题发送至 [email protected],帮助我们将他控制住。他的智慧(和尖刻的讽刺)正等待着您……

尊敬的 KV,

我一直在公司用 C++ 编写一个程序来处理一些简单的数据分析。这个程序应该是一个小型项目,但是每次我开始指定对象和方法时,它似乎都会变得非常庞大,无论是在代码行数还是最终程序的大小上。我认为问题在于系统中需要分析的东西太多了,每个都需要一个特殊情况,这需要多一点代码,或者创建另一个子类。救命啊!

抽象的驱动

尊敬的 DA,

当人们使用面向对象的语言时,最大的问题之一是,当他们意识到创建另一个类是多么容易时,他们就会这样做。他们没有弄清楚实际问题的关键所在,而是找到了不切实际的解决方案。

当然,在没有看过您的代码的情况下——而且根据您的描述,我真的不想看您的代码——我无法给您一个敷衍的答案。而且我对敷衍的答案收费很高。

当我发现我的一位同事花费数天时间指定一个又一个类,但没有编写任何实现代码时,我首先会在大楼周围走很长一段路。我的治疗师说,对人尖叫对任何人都没有帮助。我不同意他的看法,但目前,我正在配合。

当您发现某些您认为应该很简单的事情开始占用大量时间和空间时,我有一些建议。第一个建议是将编译型语言(如 C++)切换到解释型语言(如 BASIC)。哦,等等,抱歉,不是 BASIC。我的意思是 Python,我目前选择的脚本语言。我建议使用 Python 的原因是,它也是面向对象的,并且更容易将用一种 OO 语言构建的想法转移到另一种语言。您甚至可能发现 Python 完全适合您的需求,而您不必迁移到编译型语言,但这个决定还很遥远。

我建议使用脚本语言是因为我的第二个建议。尝试解决问题的一个较小部分。程序员和工程师经常试图一口吃成胖子。我们是一群奇怪的乐观主义者,除非我们与营销人员交谈。在这种情况下,解决诸如 2 + 2 之类的方程式似乎需要数百万美元的投资、一整套机房、到每个人家的高速网络链接,以及如果您得出正确结果,则可以享受六周的带薪巴塞罗那假期。也许您不是以这种方式对待您的营销人员,但我强烈建议您这样做。

使用脚本语言,您可以小口小口地解决问题并进行尝试。如果您可以解决问题的一部分并获得一些输出,那么您可能就可以弄清楚接下来要做的五六件事,然后完成它们,依此类推。以小块工作的好处在于,您会更快地得到结果,这比拥有成堆的 UML 图表和空口承诺,以及承诺在您完成时会有一个美好的新世界要令人满意得多,而按照您目前的速度,您可能永远不会完成。

所以,把你的想法从空中拉回现实,脚踏实地,先实现一些东西,而不是试图一次解决所有问题。

KV

*

尊敬的 KV,

我在一家公司工作,该公司构建各种不同的 Web 应用程序。我们做从博客和新闻站点到邮件和金融系统的一切。这取决于客户想要什么。

目前我们在工作中最大的问题是与输入验证相关的错误数量。这些错误非常令人恼火,因为每次修复其中一个错误时,同一代码中都会弹出其他问题,并且检查代码正变得非常接近意大利面条式代码。有没有办法摆脱这种混乱,而无需像自然语言理解这样的神话般的技术?

输入无效

尊敬的 II,

您遇到了自我们愚蠢地让非工程师(即用户)接触我们精美的玩具以来最大的编程问题之一。当然,如果计算机不为真正的人们做些什么,它们就不是很有用,但这是一件痛苦的事情。没有用户,系统会干净得多。唉,用户输入是生活中的一个事实,是我们每天都必须处理的事实。用户输入也是软件中最大的安全漏洞来源之一,任何 BugTraq 邮件列表的读者都可以告诉您这一点。

处理用户输入的第一条规则是“不要信任任何人!”,尤其是您的用户。尽管我确信他们中有 90% 是非常好的人,他们每周都会在指定的时间去他们选择的宗教圣地,或者其他非常好的人会做的事情(我实际上不认识任何非常好的人,但我听说过他们),但总会有少数小偷、混蛋和纯粹的白痴会把您漂亮的 Web 表单视为窃取金钱、玩弄花招和制造混乱的地方。其余的人,那些我从未见过的非常好的人,实际上不会攻击您的系统;他们只是以他们认为合乎逻辑的方式使用它,如果他们的逻辑和您的逻辑不匹配,那就糟了!Kode Vicious 讨厌爆炸。它们意味着深夜,以及我的医生对酒精和咖啡因摄入量的抱怨。如果他在处方药方面很吝啬,我也无能为力,但我们现在先不谈这个。

第二条规则是“不要相信自己!” 这是另一种说法,即您应该检查您的结果以确保您没有遗漏任何内容。仅仅因为您向用户发送了一些东西,并不意味着他们在返回给您之前没有对它做一些奇怪的事情。一个快速的例子是 Web 表单:如果您依赖于您在 Web 表单中发送给用户的数据,您最好检查整个表单,而不仅仅是您期望用户使用他们的浏览器更改的部分。通过发送略微更改的表单并包含正确的用户输入来利用表单提交代码中的错误,这是一个简单的技巧。

从您的描述来看,您使用的系统似乎是使用所谓的黑名单编写的。这是一组规则,用于说明哪些事情是坏的。在冷战期间,美国维护黑名单以阻止它不喜欢的人找到工作。您的名字在名单上,抱歉,没有工作。同样,软件使用黑名单来说明哪些类型的操作(在本例中为用户输入)是不好的。黑名单的问题在于它们难以维护。它们一开始很简单,比如“不要接受包含 URL 的输入”,但很快就会失控,其中包含 JavaScript 名称的列表(有很多)和要检查的不同类型的标记,以及,以及,以及……我希望您明白我的意思。在可能的情况下,最好使用白名单。

不出所料,白名单与黑名单相反。白名单仅包含允许的事物,并且通常非常短。一个例子是,“仅接受 ASCII 字母字符。” 白名单可能非常严格,但它们比黑名单具有明显的优势,因为您唯一需要更改白名单的时间是使其更宽松。默认情况下,黑名单大多是宽松的,只有少数例外是列表中的条目。

我的建议是切换到使用白名单,并对用户可以给您的内容非常严格。最初这看起来有点苛刻,但这可能是保护您的代码免受用户侵害并防止其变成意大利面条式代码的最佳方法。

KV

KODE VICIOUS,凡人称之为 George V. Neville-Neil,以网络和操作系统代码为乐和盈利。他还教授与编程相关的各种主题的课程。他的兴趣领域是代码探险、操作系统和重写您的糟糕代码(好吧,也许不是最后一个)。他在马萨诸塞州波士顿的东北大学获得了计算机科学学士学位,并且是 、Usenix 协会和 IEEE 的成员。他是一位狂热的自行车爱好者和旅行家,自 1990 年以来一直以旧金山为家。

© 2005 1542-7730/05/0300 $5.00

想向 Kode Vicious 提问吗?给他发送电子邮件至 [email protected]——如果您敢的话!如果您的信件被刊登出来,他甚至可能会送您一个 Queue 咖啡杯,如果他心情好的话。哦,对了,我们会为了内容、风格以及为了您好而编辑信件!

acmqueue

最初发表于 Queue 第 3 卷,第 2 期——
数字图书馆 中评论本文





更多相关文章

Catherine Hayes, David Malone - 质疑评估非加密哈希函数的标准
尽管加密和非加密哈希函数无处不在,但在它们的设计方式上似乎存在差距。存在许多受各种安全要求驱动的加密哈希标准,但在非加密方面,存在一定的民间传说,尽管哈希函数历史悠久,但尚未得到充分探索。虽然针对实际数据集的均匀分布很有意义,但在面对具有特定模式的数据集时,这可能是一个挑战。


Nicole Forsgren, Eirini Kalliamvakou, Abi Noda, Michaela Greiler, Brian Houck, Margaret-Anne Storey - DevEx 在行动
随着领导者寻求在财政紧缩和人工智能等变革性技术的背景下优化软件交付,DevEx(开发者体验)在许多软件组织中受到越来越多的关注。直观地说,技术领导者普遍认同良好的开发者体验可以提高软件交付效率和开发者幸福感。然而,在许多组织中,旨在改善 DevEx 的拟议倡议和投资难以获得支持,因为业务利益相关者质疑改进的价值主张。


João Varajão, António Trigo, Miguel Almeida - 低代码开发生产力
本文旨在通过展示使用基于代码、低代码和极端低代码技术进行的实验室实验结果,研究生产力差异,从而为该主题提供新的见解。低代码技术已清楚地显示出更高的生产力水平,为低代码在短期/中期内主导软件开发主流提供了强有力的论据。本文报告了程序和协议、结果、局限性和未来研究的机会。


Ivar Jacobson, Alistair Cockburn - 用例至关重要
虽然软件行业是一个快节奏且令人兴奋的世界,其中不断开发新的工具、技术和技巧来为商业和社会服务,但它也很健忘。在快速前进的过程中,它容易受到时尚潮流的影响,并且可能会忘记或忽略针对它面临的一些永恒问题的成熟解决方案。用例于 1986 年首次引入,并在后来得到普及,就是这些成熟的解决方案之一。





© 保留所有权利。

© . All rights reserved.