文章目录

  • 墨菲定律
  • Knuth 定律
  • North 定律
  • Conway 定律
  • 琐碎定律(帕金森琐碎定律)
  • 结论

定律-或称法则,可以指导我们并让我们在同伴的错误中学习。这篇文章中,我将介绍我每次设计或实现软件时出现在我脑海的五大定律。其中有些和开发有关,有些和系统组织有关。它们可以帮助你成为合格的软件工程师。

墨菲定律

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

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

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

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

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

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

Knuth 定律

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

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

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

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

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

North 定律

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

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

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

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

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

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

重复一遍

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

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

Conway 定律

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

结论

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

文章来源:
https://linux.cn/article-8894-1.html

每个程序员都该知道的五大定律相关推荐

  1. 100%的程序员都想挑战的算法趣题!| 码书

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  2. 凌晨三点,各类程序员都在干吗?

    1.凌晨三点,各类程序员都在干吗? 我想问,前端是不是提早下班了? 2.三天后再回头看看自己写的代码 3.代码质量 VS 开发时间 4.程序员的爱情观 5.一定要看到最后 记得点击「在看」,然后转给你 ...

  3. 每个程序员都应该知道的10件事!

    如果你已经编程了一段时间,并且想学习编程,那么你可能在想什么才是一个好的程序员?计算机科学与技术专业毕业生能做些什么,来为软件开发职业生涯做准备? 在本文中,我将分享10件我认为每个程序员都应该知道的 ...

  4. 老程序员都去哪儿了?

    摆在老程序员们面前有三条路,一是转行,二是继续钻研成为技术大牛,三是转型为管理人员. 我最近采访了十五位30岁以上的老程序员们,在此我想发表下我的观点. 网络上总有这类观点-- 「如果所有的技术都想着 ...

  5. 我敢打赌,这是98%的程序员都想挑战的算法趣题!

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  6. 优秀的程序员都在哪里 如何寻找优秀的程序员?

    优秀的程序员都在哪里 这是你第一次公开招募雇员.如同大多数人一样,你会发布广告,可能也会浏览一些大型的网上论坛,然后你就收到了一吨的简历. 一份份看下去,你会想:"嗯嗯嗯,这人应该可以.&q ...

  7. 每个程序员都应该读的书

    在国外一网站stackoverflow看到了一篇贴子,<每个程序员都应该阅读的书>,里面有上百种书,部分图书已由图灵教育出版.因为除了这里面的书,图灵教育认为还有一些值得程序员去阅读的书, ...

  8. 为什么优秀的程序员都成了无能的领导?

    作者 | Zachary Minott 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 以下为译文: 小明是一位雄心勃勃且成绩斐然的开发人员. 他工作非常努力,每天都会想方设法磨练自己的 ...

  9. 35+的大龄程序员都去哪里了?

    作者 | 年素清 来源 | 码农故事汇(ID:sunianqingshi) 对于互联网人,尤其是程序员来说,35岁是个尴尬而危险的年纪,业内时常传出清退大龄程序员的消息.那么,那些35岁以上的程序员都 ...

最新文章

  1. 修改cpu型号重启不变_猫头鹰展示D系列新款140毫米CPU散热器:更大散热片,能压400瓦...
  2. 两个栈实现一个队列,两个队列实现一个栈
  3. 我的世界服务器怎么修复锁链甲,我的世界手机版锁链甲怎么做 怎么获得
  4. 记录4 最近贺题时做的题 cf611e,cf873f,cf264d,cf1320d,cf1438c,hdu6833,hdu3602,cf1187g,cf1051e,cf925d,cf840c,etc
  5. 小米 samba linux,解决小米路由器升级固件后samba无法访问一例
  6. linux搭建认证服务器,Linux上搭建FreeRadius服务器
  7. Python实现最简单的深度学习任意层神经网络算法,通熟易懂,里面包括了详细注释的源码
  8. 【菜鸟学开发系统】学生成绩管理系统(二)
  9. 女孩不是拜金,是败给了生活
  10. 7.ratings评价列表页的实现
  11. java fop_XSL-FO 和FOP相关技术详解(转载)
  12. oracle数据库用户状态失效Expired
  13. Python点击Pycharm按钮Run的时候出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
  14. 华测教育入选【腾讯课堂 · 薪选课程】--这可能是你进腾讯的最好机会!
  15. 中国农业科学院培训中心职业技能等级证书及培训证书
  16. 1024-开启人工智能学习之旅
  17. 世界上最悲惨的人……
  18. 【备忘】最新spark/hadoop/hbase/hive/kafka/redies大数据视频教程
  19. 大数据量报表展现慢容易卡死,怎么办?
  20. [EDI 案例] 汽车地带/Autozone EDI解决方案

热门文章

  1. 大类资产配置(三)市场择时能力模型T-M
  2. 【论文写作】LaTeX学习笔记:一文入门LaTeX(超详细)
  3. MNF最小噪声分离变换
  4. 蒲公英 · JELLY技术周刊 Vol.11 Lighthouse 测试报告生成
  5. v.douyin.com/xxx v.ixigua.com/xxx抖音西瓜网址官方生成制作抖音西瓜缩短口令网址(仅供参考学习)
  6. oracle imp exclound,Ce este o bază de date cloud | Oracle România
  7. c语言 最长单词,c语言求最长公共单词
  8. uhs3内存卡有哪些_UHS-3标准加身 东芝新款Exceria Pro存储卡性能堪比SSD
  9. 根据需求设计并实现数据库
  10. Oracle使用ancestor incarnation完成基于时间点的不完全恢复