【连载】优秀程序员的 45 个习惯之习惯35
对问题各个击破
—— 高效程序员的 45 个习惯之习惯35
“逐行检查代码库中的代码确实很令人恐惧。但是要调试一个明显的错误,只有去查看整个系统的代码,而且要全部过一遍。毕竟你不知道问题可能发生在什么地方,这样做是找到它的唯一方式。”
单元测试(在第 76 页, 第 5 章)带来的积极效应之一,是它会强迫形成代码的分层。要保证代码可测试,就必须把它从周边代码中解脱出来。如果代码依赖其他模块,就应该使用 mock 对象,来将它从其他模块中分离开。这样做不但让代码更加健壮,且在发生问题时,也更容易定位来源。
大型系统非常复杂 —— 在执行过程中会有很多因素起作用。从整个系统的角度来解决问题,就很难区分开,哪些细节对要定位的特定问题产生影响,而哪些细节没有。
答案很清晰:不要试图马上了解系统的所有细节。要想认真调试,就必须将有问题的组件或模块与其他代码库分离开来。如果有单元测试,这个目的就已经达到了。否则,你就得开动脑筋了。
于是,他们俩开发了一个小型的原型系统,并展示了类似的症状;然后将其发送给厂商作为实例,并询问他们的专家意见,使用原型帮助他们对问题理解得更清晰。
而且,如果他们 无法 在原型中再现问题的话,原型也可以告诉他们可以工作的代码示例,这也有助于分离和发现问题。
隔离问题不应该只在交付软件之后才着手。在构建系统原型、调试和测试时,各个击破的战略都可以起到帮助作用。
对问题各个击破在解决问题时,要将问题域与其周边隔离开,特别是在大型应用中。
切身感受
面对必须要隔离的问题时,感觉就像在一个茶杯中寻找一根针,而不是大海捞针。
平衡的艺术
- 如果将代码从其运行环境中分离后,问题消失不见了,这有助于隔离问题。
- 另一方面,如果将代码从其运行环境中分离后,问题 还在 ,这也有助于隔离问题。
- 以 二分查找 的方式来定位问题是很有用的。也就是说,将问题空间分为两半,看看哪一半包含问题。再将包含问题的一半进行二分,并不断重复这个过程。
- 在向问题发起攻击之前,先查找你的解决问题日志(见第 129 页上的习惯 33 )。
【连载】优秀程序员的 45 个习惯之习惯35相关推荐
- 【连载】优秀程序员的45个习惯之39——架构师必须写代码
架构师必须写代码 -- 高效程序员的 45 个习惯之习惯39 "我们的专家级架构师Fred会提供设计好的架构,供你编写代码.他经验丰富,拿的薪水很高,所以不要用一些愚蠢的问题或者实现上的 ...
- 【连载】优秀程序员的45个习惯之45——及时通报进展与问题
好消息: 本书今天互动网有货,当当网.卓越网也会陆续有货. 及时通报进展与问题 -- 高效程序员的 45 个习惯之习惯45 "管理层.项目团队以及业务所有方,都仰仗你来完成任务.如果他们想知 ...
- 【连载】优秀程序员的45个习惯之42——允许大家自己想办法
允许大家自己想办法 -- 高效程序员的 45 个习惯之习惯42 "你这么聪明,直接把干净利落的解决方案告诉团队其他人就好了.不用浪费时间告诉他们为什么这样做." "授人以 ...
- 【连载】优秀程序员的45个习惯之37——提供有用的错误信息
提供有用的错误信息 -- 高效程序员的 45 个习惯之习惯37 "不要吓着用户,吓程序员也不行.要提供给他们干净整洁的错误信息.要使用类似'用户错误.替换,然后继续.'这样让人舒服的词句. ...
- 【连载】优秀程序员的 45 个习惯之习惯33
记录问题解决日志 -- 高效程序员的 45 个习惯之习惯33 "在开发过程中是不是经常遇到似曾相识的问题?这没关系.以前解决过的问题,现在还是可以解决掉的." 面对问题(并解决它们 ...
- 【连载】优秀程序员的 45 个习惯之习惯25
代码要清晰地表达意图 -- 高效程序员的 45 个习惯之 习惯25 "可以工作而且易于理解的代码挺好,但是让人觉得聪明更加重要.别人给你钱是因为你脑子好使,让我们看看你到底有多聪明.&quo ...
- 【连载】优秀程序员的 45 个习惯之习惯27
动态评估取舍 --高效程序员的45个习惯之习惯27 "性能.生产力.优雅.成本以及上市时间,在软件开发过程中都是至关重要的因素.每一项都必须达到最理想状态." 可能曾经身处这样的团 ...
- 优秀程序员的45个习惯
优秀来自好的习惯.怎样成为优秀的开发人员?图灵公司最近热销的<高效程序员的45个习惯>一书给出了很好的解答,非常值得一读. 这本书的英文原版荣获了有软件奥斯卡之称的Jolt生产效率大奖,在 ...
- 转:优秀程序员的45个习惯
今天看到这篇文章,觉得有我们要学习的地方,不过有几条不大符合中国的国情!!! 拿过来给大家看看. 优秀来自好的习惯.怎样成为优秀的开发人员?图灵公司最近热销的<高效程序员的45个习惯>一书 ...
最新文章
- Kettle系列文章二(安装配置Kettle+SqlServer+简单的输入输出作业)
- 《Android/OPhone 开发完全讲义》样章和目录下载
- python个人赚钱攻略-每个懂Python的人都必须知道的赚钱神器
- JS子元素oumouseover触发父元素onmouseout
- bean validation校验方法参数_Spring Boot 之使用 validation 验证参数
- C++使用localtime函数需要注意的地方
- 软件自动化测试面试三部曲:第三是经验,第二是技术,第一是...
- JVM :执行jinfo命令报错Can't attach symbolicator to the process
- docker下centos7 systemctl启动报错 docker Failed to get D-Bus connection 报错
- 每日一道剑指offer-替换空格
- NMS 非极大值抑制原理及实现
- 嵌入式单片机网络链路测试
- Chrome谷歌浏览器连接路由器不上
- Shell ${!shuzu[@]} 获取数组的所有下标
- 喜讯 | 联诚发斩获2020年度LED显示屏十佳品牌
- 理解echo openssl概念、用法、常用参数
- 解决联想电脑自带麦克风不能使用
- 瓶中阳光——雪莉之美
- Stub和Mock的区别
- linux系统文件系统格式转换--不丢文件
热门文章
- 家长学校.net keti.html,家长学校教科研的工作制度
- 51单片机usb烧录电路_51单片机怎么用usb烧写程序 - 全文
- 7-21 求特殊方程的正整数解 (C语言)
- 洛谷P1006 传纸条 (棋盘dp)
- 何玺对话苏宁金融洪蜀宁:区块链是颠覆性技术,意义远超互联网
- 中国人工智能学会通讯——智能语音技术与产业应用展望 1.2 智能语音产业应用的现状和挑战...
- 安装Ubuntu13.10后必做的10件事
- 近期笔试小结(附数据库工程师面试准备)
- 发测试邮件或垃圾邮件node脚本
- VMware几个版本的比较