医生转行程序员竟然是最简单的?转载自宅客学院

“现在的编程工作就像是对你需要解决处理的部分做科学研究。”

——Gerald Sussman

设计和维护好的软件就像是一个抵制复杂度的永无止境的奋斗过程。任何足够大小的应用程序的代码路径和组件都能迅速成长成令人眼花缭乱的组合爆炸。

一点都不简单。

当部署类似于Heroku和AWS的平台时,单服务器的Web应用程序成为了分布式系统。现代浏览器模糊了客户端和服务器之间的界线。当简单程序在多个CPU内核上运行时,它们就会成为复杂的协调问题。虽然像测试驱动开发等实践和SOLID原则等指导,可以帮助我们模拟问题,简化解决方案,但大多数软件应用程序都是一些复杂的系统,每个组件也会以意想不到的方式进行交互和组合。

当软件系统中发生意外情况时,会造成很严重的后果。幸运的是,软件开发人员可以借鉴另一门更古老的学科,来应对对于复杂系统的关注、维护和调试,这门学科就是——医学。

鉴别诊断是医生用来匹配系列症状及其可能病因的系统化方法。一个好的鉴别诊断包括以下4个步骤:

  1. 列出所有观察到的症状。
  2. 列出可能的病因。
  3. 按轻重缓急给这些病因排名。
  4. 按照优先顺序进行测试,以排除病因。

虽然上面这4个步骤是为医生而整理的,但是我们同样可以像一个医生一样思考,用一种强有力的方式来找到并消除软件缺陷。将诊断过程分解为一个一个目的单一的步骤,确保每个步骤都能得到应有的重视。按照优先顺序是为了保证专注检查的重点,并作出务实的干预措施。然后进行测试,排除假设,以确保调试的严谨。

白板是个好东西

当错误发生时,我们大多会想也不想地立马去调查最可能的原因。懂得向后跟踪和少许背景知识,人性就会趋向于投机主义。但是好的诊断始于列出的症状,而不是病因。写下可以观察出来的所有症状,无论是异常处理,还是错误代码,哪怕只是异常的行为,都可以。可以使用文本编辑器或者白板,但是,你最好能对诊断过程中的每一个步骤做笔记,这很重要。从假设出发分开观察,有助于确保你不会排除或忽视潜在原因。并且多数时候,列出更多的症状反而会缩小可能范围,避免你将时间浪费在测试不正确的假设上。

写好了一系列症状,那么接下来就可以开始考虑原因了。

斑马和马

“当你听到马蹄声的时候,找的应该是马,而不是斑马。”

在应用程序中出现代码bug的可能性比在Web框架中出现bug的可能性要大,而在Web框架中发现bug又比在操作系统中发现bug更容易。当然让别人来审查代码是个好主意,但事实是,大多数bug审查起来特别无聊。所以在开始考虑进阶到更复杂的问题之前,先给出最简单的解释。

话又说回来,正如同一个症状却又可能是完全不同的病因引发的,所以我们应该将所有能想到的相关病因都写下来。就像原先我们对症状直接描述为“what”,后来用“how”区分开来,头脑风暴解释法的目的是用“how likely”来区分“how”。捕捉任何看似合理的要点,以便于节约分析。

重中之重,不能有害

鉴别诊断与其他的演绎方法不同,因为医生必须不断地评估风险,并权衡对病人生命的影响。当然如果我们的产品中存在着bug,虽然不会像医生那样负有生命责任那般严重,但是停顿修复会产生既现实又痛苦的成本费用。就像威胁生命的疾病事件一样需要立即进行干预,严重的bug可能需要粗暴的简单修复,例如回滚和重新启动。将假设按优先顺序排列,然后再考虑权衡,并判断决定是否启动测试假设或立即进行干预。

准备图表

正如患者会有医院病历和其他背景信息的图表,你的软件系统可能也需要具备图表。从日志和错误报告系统收集信息,来说明你的分析。至于系统指标和跟踪误差,你不妨将它们当作是明智的预防性药品。

如果你的病人尚未处于严重危险之中,那么可以先进行假设-演绎。从你定义的优先级最高的假设开始,一个一个地证明它们是错误的。虽然支持性证据有时候或许能有助于你找到bug的所在,但是失败的测试驱动了演绎过程。这乍一看上去似乎有悖直觉,但是测试-消除假设策略是追溯bug到它的起因的最快方式。在许多情况下,一些简单的测试就可以一次消除几个假设。当然,也有时候,为了否决假设你就得执行更多的测试。

实验室工作

不同于医疗世界的令人难以接受,只要你愿意,你随时都可以克隆软件应用程序,执行可怕的人体实验。如果你有足够的信息来触发你要诊断的bug,那么可以将它复制到受控环境中,例如一个有着最新数据库备份的临时服务器。当你消灭原因,收集到新的数据,并完善假设之后,你的bug的真正原因线索将变得更加清晰。

清楚地思考复杂系统需要小心谨慎与全神贯注。采用结构化的诊断过程来指导检查可以节省时间和避免挫折感,最重要的是,它很有用。下次你再陷入bug之中时,那么不妨试试抛开键盘,将步骤一步一步写到白板上,像一个医生诊病一样进行调试。

时间: 2024-11-08 22:04:45

医生转行程序员竟然是最简单的?转载自宅客学院的相关文章

怎样成为一名“喜鹊”程序员? 转载自宅客学院

我时常在想,软件开发人员在某些方面和喜鹊——一种臭名昭著地喜欢偷发亮的物品来装饰它们巢穴的鸟类非常类似.像喜鹊,从定义上说明软件开发人员是一种异常聪明,又有好奇心的动物.但是,我们非常非常容易因为闪亮的新玩具而分心. 我 一点也不觉得阅读类似Scott Hanselman的<Ultimate Developer Tool list>鼓舞人心.相反,它令人疲劳.软件世界前进的改革步伐是无情的.我们的周围充斥着各种所谓闪亮和新的东西,其概念本身开始瓦解,一遍一遍又一遍 地重复这些陈词滥调,直到它们

初级程序猿到大神的晋级之路转载自宅客学院

工作了五年的工程师,算不算高级开发者?归类开发者不是简单地看工作年限,因为经验这种东西千金难换但又一文不值. 我们现在工作的行业很奇怪.明明每年都有新的从业人员涌入人才市场,但企业依旧诉苦自己迫切需要大量的开发.这种问题存在已久,而且已经越发严峻. 开发者这个行业非常年轻,也面临着很严重的人才短缺问题.大部分的软件开发项目无疾而终,原因是后期开支过于庞大.那些行业里的大佬是怎么建议我们的,他们说「世界上永远存在解决问题的办法,但我们还是会遇到各种难题.因为除非我们真正去尝试解决,否则永远不知道哪

转行程序员难么?编程学不好的只有3种人

程序员是这几年最热门的职业,即便是很多外行人分不清前端.后端.工程师.架构师,除了格子衬衫头发少加班多,大家都还有一个共同的认知:那些对着电脑噼里啪啦敲着看不懂代码的人,工资都很高. 很多人羡慕程序员除了羡慕有一个不错的收入外,还觉得程序员的技术也是一技傍身,在科技是第一生产力的今天,编程的技能能让他们走到哪都不怕.羡慕的人多,想转行的也不少,但很多人在学习一段编程的时间之后,就会厌倦,感觉编程太难,自己不适合编程,最后不了了之,还是回到羡慕别人拿高工资,自己只能幻想能不能突然变身一名技术高超的

我为什么自学编程?如何转行程序员小型攻略

很多人在遇到事业瓶颈,或者从事一份自己不喜欢工作,又或者对未来迷茫的时候,总能看到很多人说,转码农,当程序员. 诚然,转行当程序员不仅是政治正确还是事实正确,但是这个过程其实并不容易,倒不是因为程序员门槛高,而是很多人认为学编程很难,并且拒绝尝试. 其实掌握方法后,并且拉近自己与编程的距离,你会发现,你完全可以做到. 刚好这半年,自己一直在学习Python,根据自己这半年自学编程的经历,班门弄斧,分享一下自己自学编程上的一些学习心得. 另外这边大神较多,本篇文章只是抛砖引玉,肯定有不靠谱地方,麻

程序员初见Maya 之 简单骨骼蒙皮动画

作为一个Unity3d程序员,和3D动画打交道的时间占了工作的大半.每天从美术手里接过热乎乎的FBX,导入到Unity3d,对其进行一番Clip切割,修改一下Scale比例,然后到代码中修改一下状态机,调试每一个动作. 但是终究是用别人的成品. FBX导入到编辑器中,看到有Root.LeftBone.Bone123456这些节点,不知道是什么东西. 这种很迷糊的感觉. 趁清明回家,花一天熟悉Maya的基础知识,做一个最简单的骨骼蒙皮动画. 开发工具: Maya2015 Unity3d 安装May

linux运维转行程序员

最近有朋友来信说,半路出家做的linux运维,一度从网络做起.随着工作的深入发现自己欠缺很多基础知识,问我是不是应该从C语言开始学起. 这也许是每个半路转行的童鞋面临的问题,在北上广拿到15K很容易,是否是对口专业似乎也不是那么重要.可是慢慢的你会发现,计算机基础显得越来越重要. python对于做运维的人来说非常重要,不过如果你想后期从运维转成程序员,甚至有些人想做黑客,C语言还是要学的.当然你不要指望用C言语再写一个linux系统或者MySQL数据库 而且不建议大家在走嵌入式开发路线,嵌入式

.Net程序员学习Linux最简单的方法(转载)

有很多关于Linux的书籍.博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机. 就如同所有的的网络游戏都要先介绍游戏的历史观,然后再介绍游戏的操作. 大多数初学者在刚刚接触Linux都会有非常陌生的感觉.往往会有一些疑惑和问题.而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽. 问题1:Winows有注册表,为什么Linu

就国内某个程序员问答网站的简单的分析

一.数据抓取 分析页面数据,设计数据表结构 数据只要包含投票.回答数.问题状态.最后谁回答过.浏览数.问题标题.标签,数据样例如下: 由于一开只打算爬问题标题,问题ID.问题详情也没有记录下来,最后谁回答过也不算很重要. 最后使用python的urllib2抓取数据,BeautifulSoup对数据进行数据解析,mysql存取数据 写好代码就开始跑,由于页面没有限制,几分钟就全部抓完,或许是问题比较少,2011至今总有3.8W问题,这个还是有点失望的. 二.数据分析 数据只有那么几项,到底能分析

.Net程序员学习Linux最简单的方法

有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机. 就如同所有的的网络游戏都要先介绍游戏的历史观,然后再介绍游戏的操作. 大多数初学者在刚刚接触Linux都会有非常陌生的感觉.往往会有一些疑惑和问题.而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽. 问题1: Winows有注册表,为什么Lin