0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

每次设计或实现软件时出现在我脑海的5个定律

Linux爱好者 来源:未知 作者:李倩 2018-06-21 17:45 次阅读

定律或称法则,可以指导我们并让我们在同伴的错误中学习。

这篇文章中,我将介绍我每次设计或实现软件时出现在我脑海的 5 个定律。其中有些和开发有关,有些和系统组织有关。它们可以帮助你成为合格的软件工程师

墨菲定律

“凡事可能出错,就一定出错。”

这条定律来源于 Edward Murphy —— 一名航天工程师在 50 年代初对火箭测试失败的回应。这条定律给我们的启示是永远在系统关键地方使用防御性设计,因为系统某些地方总会出错!

这条定律很容易引入软件工程领域。当你将软件暴露给终端用户,他们会创造性地输入一些出人意料的内容,使系统宕机。所以你需要让你的软件足够健壮,能够检测并警告非预期行为。

当你在机器上运行软件时,任何地方都有可能发生问题 —— 从硬盘上的系统到数据中心的电力供应。所以你必须确保你设计的架构在每个层级都可以应对故障。

我曾经有机会领略过几次墨菲定律。 举个例子,我曾经在一个批处理框架中使用字符串 null 来表示空值,我并不认为这有问题,直到有个名字叫 Null 的用户提交了一个交易订单,我们的报表流程中断了几个小时…… 还有一次,在另一个项目中。当所有东西都准备好部署到生产环境了,突然 Azure 基础设施故障导致我们运行自动化脚本的服务器宕机了。

现实世界中的经验教训提醒着我生活的艰难 —— “凡事可能出错,就一定出错”。 所以,心中牢记墨菲定律,设计健壮的软件。

Knuth定律

“在(至少大部分)编程中,过早优化是万恶之源。”

这条定律也是 Donald Knuth 的经典语录之一,它告诫我们不要过早优化应用程序中的代码,直到必须优化时再优化。

的确,简单易读的源码可以满足 99% 的性能需要,并能提高应用的可维护性。最开始使用简单的解决方案也让后期性能出现问题时更容易迭代和改进。

垃圾自动回收的编程语言中,字符串的连接常常是过早优化的例子。在 JavaC# 中,String 对象是不可变的,我们学会使用其他结构动态创建字符串,比如StringBuilder。但事实上直到你分析完个应用程序前,你并不知道 String 对象创建了多少次并对性能的产生多大影响。所以首先编写尽可能整洁的代码,之后在必须的时候再优化,往往这样做更有意义。

然而,这条规则并不应该阻止你去学习编程语言的性能权衡和正确的数据结构。并且,正如所有其他性能问题,你在优化前要测量开销。

North定律

“每一个决定都是一次权衡”

好吧,我承认这是取自 Dan North 的演讲Decisions,Decisions,它目前还不是公认的定律。 但这条语录影响了我做的每个决定,所以我把它放在这。

开发者日复一日的生活中,我们每天都做无数个大大小小的决定。从命名变量到自动化(手动)任务,再到定义平台架构。

这条语录强调无论你做的选择是什么,你总会放弃一个或多个选项

但这不是最重要的。 最重要的是理智地做出决定,了解其他选项,清楚你为什么不选择它们。你要始终根据当前你掌握的信息来权衡并做出决定。

但是如果后来你了解到新的信息,并发现之前的决定是错误的,这也没关系。关键是记清楚你为什么做出那个决定,重新评估新的选项之后再做出新的理智的决定。

重复一遍

“每一个决定都是一次权衡”

所以,做出选择并对所有选项心知肚明。

Conway定律

“系统设计的架构受限于生产设计,反映出公司组织的沟通架构”

在 60 年代,一位名叫 Melvin Conway 的工程师注意到公司组织结构影响到他们开发的系统的设计。他用一篇论文描述了这个观点,并命名为“Conway定律”。

这条定律很适用于软件开发领域,甚至体现到代码层面上。交付软件组件的各个团队组织结构直接影响到组件的设计。

举个例子,一个集中式的开发者团队会开发出各组件耦合的整体应用。另一方面,分布式的团队会开发出单独的(微)服务,每一部分关注点分离清晰。

这些设计没有好坏之分,但它们都是受到团队沟通方式的影响。在全球有大量独立开发者的开源项目,通常是模块化和可重用库,这就是很有说服力的例子。

如今,将大的集成应用解耦成微服务已成趋势。这很棒,因为这可以加速交付使用项目。但你也应该牢记 Conway 定律,在公司组织构建中投入与技术开发同样多的工作。

琐碎定律(帕金森琐碎定律)

“组织成员投入大量精力到琐碎的事情上。”

这条定律论点是在会议中花费的时间与事情的价值成反比。的确是这样,人们更愿意把注意力和观点放在他们熟悉的事物上,而不是复杂的问题上。

帕金森给出一个例子,一场会议中,成员们讨论两件事:为公司建核反应堆和为员工建车棚。建反应堆是一件巨大而复杂的任务,没有人能完全掌控全局。他们完全信赖流程和系统专家,并很快接受了项目。

另一边,建车棚是一般人都可以做的,每个人都可以对颜色有意见。事实上,每个会议成员都会表达自己的意见,使得建车棚的决议所花费的时间远远超过建反应堆的。

这条定律在软件行业十分出名,这个故事随后也被称为车棚效应

举个例子,开发者会花费更多时间到讨论正确缩进或函数命名,而不是讨论类的职责或应用架构。这是因为每个人都能认知几个字符的变动,但项目架构的变动则需要巨大的认知负载

你能注意到的车棚效应的另一个例子是 Scrum 演示。不要误会我,我喜欢演示,我认为这是一个很好的机会来面对用户并获得对应用程序的反馈。但通常 Scrum 演示过程中的讨论会转向琐碎问题,而不是审视全局。这些讨论也很重要,但你应该注意权衡更重要更复杂的问题。

一旦你了解这种规律,你将在会议和交流中发觉这种行为。 我并不是让你在每次讨论中避免“小”问题,提高你的意识可以帮助你关注真正的问题,并为这些会议做好准备。

结论

这五条定律只是我们行业中总结出的教训中一些例子。随着软件开发经验的增长,我们将会学会更多。 尽管其中某些定律现在看起来是常识,我始终坚信了解这些原则可以帮助你识别这些模式并做出反应。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    9

    文章

    1874

    浏览量

    32920
  • 软件工程
    +关注

    关注

    1

    文章

    29

    浏览量

    10973

原文标题:每个程序员都该知道的 5 个定律

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    git merge后,原分支的内容没有出现在新的master分支中。

    新建了一rico分支,现在想把rico分支的内容合并到master分支,但是合并之后,在rico分钟中新建的文件夹,并没有出现在mas
    发表于 03-12 00:48

    ADC采样保持时钟(S/H时钟),请问如何控制这个时钟的占空比,使采样的时候采样时钟正好出现在信号的中间位置?

    ,使采样的时候采样时钟正好出现在信号的中间位置,看数据手册,怎么就是找不到相关的,难道信号一进来就开始采样吗?如果是正弦信号,采样得到的岂不是误差很大。怎么也搞不明白,希望望指教啊~
    发表于 06-06 01:12

    三星evo ssd硬盘驱动器没有出现在bioswindows 10中

    刚买了一三星evo ssd硬盘驱动器并把它放在第二插槽中作为辅助驱动器。它没有出现在bioswindows 10中?这些驱动器只能在
    发表于 11-20 11:27

    PSoC5中的UART没有出现在终端

    World!\r\n);之后。然而,当Ireset的开发工具包,没有出现在终端。在原理图设计中,RX和TX引脚自动地连接到RXY1和TXY1,假设是RX和Tx,它们被路由到9PIN D子连接器。任何提示
    发表于 04-10 13:58

    为什么线程和帖子从未出现在Unread、Latest、MyThreadsMyPosts?

    发帖到:Home|AllFor.|8位微控制器|.pherals/Core Independent.pherals|Timing and.emements。尽管线程和帖子出现在那里,但它从未出现在
    发表于 08-08 06:03

    为什么新组件不出现在组件目录中?

    在文档A82156(Rev)中遵循UDB DATAPACTH教程,“在UPDB数据通路中设计PSoC创建者组件”,在第17页,在生成符号之后,步骤19,DOC .CabLogPosie= AN82156/Digital /CNTR8。组件从不出现在组件目录中,既不在这里
    发表于 10-31 08:52

    如何获取.m文件中的变量出现在监视列表中?

    您好,如何获取.m文件中的变量出现在的监视列表中?可以使SFR出现,但不能使由“EQU”形成的变量
    发表于 10-31 09:45

    为什么cy8ckit-059未出现在目标设备中?

    的名字出现在设计器中的目标设备上。没有把代码浪费在时间上。不知道发生突变的原因。如果有人面临类似的问题解决方案,请帮帮我。
    发表于 11-01 13:44

    求助mos管GS振铃出现在奇怪的地方

    求助mos管GS振铃出现在奇怪的地方,拜托大佬们帮忙分析分析, 出来的振铃如图放大一点
    发表于 07-22 22:22

    为什么次核的任务调度出现在msh命令之后?

    SMP运行之后,使用串口打印调试,为什么次核的任务调度出现在msh命令之后?导致使用不了msh的一些指令了,输入msh的一些指令没反应。
    发表于 04-03 16:04

    不能让ESP8266板出现在Arduino中是什么原因?

    再也不能让 ESP8266 板出现在 Arduino 中了。如果它在几周前工作,但现在不工作了。 当我进入 Boards Manager 时,它甚至会出现在下面。
    发表于 05-08 06:38

    随着5G牌照发放 物联网概念和生僻的词语频繁地出现在我们的眼前

    随着5G牌照发放,我国正式进入5G商用元年,5G概念被炒得火热的同时,也带火了物联网概念,而与之相关的技术如NB-IoT、LoRa等生僻的词语,也开始频繁地出现在我们的眼前、出现在媒体、出现在展会上。
    的头像 发表于 07-10 09:13 3573次阅读

    LED出现在了哪一些场景

    随着半导体技术的发展,LED 路灯、LED 显示屏、LED 背光源等新事务纷纷出现在人们的视野。
    发表于 04-02 11:07 992次阅读

    Google现在决定暂时删除出现在搜索结果顶部的Twitter卡

    是的,出现在搜索结果顶部并指向最新故事,最新更新等内容的Twitter卡现在不见了。这是SEO顾问Brodie Clark在本周早些时候在Twitter上首次发现的。来自SEMRush和FiveBlocks的数据确认删除了Twitter块。
    的头像 发表于 07-23 15:40 1231次阅读

    this可以出现在类方法中吗

    是的, this 关键字可以出现在类方法中。在Java中, this 是一个引用,用于引用当前对象的实例。它可以在类的实例方法中使用,以访问该实例的成员变量和方法。 当在类方法中使
    的头像 发表于 11-28 16:24 415次阅读