SlideShare a Scribd company logo
1 of 20
注重 效实注重 效实 的偏执的偏执
A Pragmatic Approach
(II)
Horky
28/May,2010
http://blog.csdn.net/horkychen
1
Keywords
• 工具放大你的才能
• 代 生成器码
• 的思 :最容易欺 的人是自己调试 维 骗
• 断言式 程编
• 将 常用于 常的异 异 问题
• 按合约设计
2
Enlarge your capability by tool
• find
• grep
• diff
• emacs
• sed
• M4
• python
• Perl
• ... Thousands more utilities in Unix/Unix like system.
(Windows User also could use them by Cygwin)
3
Sample
• emacs
– 写个小测试程序,还要动用 VS2005 或者 Xcode
吗 ?
– 试试 emacs 或者 vi, 然后使用 gcc 来编译你的程
序。
4
Sample
• sed & m4
– 自动编译环境的应用
5
Code Generator
• 用模具来提高工作效率!
• M4 -> Generate Info.plist
• -> Generate HTML/XML file
• flex -> Parser
6
Sample
• Info.plist Generator
– M4
7
的思调试 维
• 最容易欺 的人是自己骗
– 恐慌 -> 退一步 -> 任何事情都有可能
• 死程序不说谎
8
Story (I)
Andy 曾经参与过一个大型图形应用的开发。快要发布时
,测试人员报告说,每次他们用特定的画笔画线,应用
都会崩溃。负责该应用的程序员争辩说,这个画笔没有
任何问题;他试过用它绘图,它工作得很好。几天里这
样的对话来回进行,大家的情绪急速上升。
最后,我们让他们坐到同一个房间里。测试人员选了画
笔工具,从右上角到左下角画了一条线。应用程序炸了
”。“噢 ,程序员用很小的声音说。他随后像绵羊一样承
认,他在测试时只测试了从左下角画到右上角的情况,
没有暴露出这个 bug 。
思考 :
如何克服这样的问题 ?
9
Story (II)
• 找到问题的原因的一种非常简单、却又特别有用的
技术是向别人解释它。他应该越过你的肩膀看着屏
幕,不断点头(像澡盆里上下晃动的橡皮鸭)。他
们一个字也不需要说;你只是一步步解释代码要做
什么,常常就能让问题从屏幕上跳出来,宣布自己
的存在。
•   这听起来很简单,但在向他人解释问题时,你
必须明确地陈述那些你在自己检查代码时想当然的
事情。因为必须详细描述这些假定中的一部分,你
可能会突然获得对问题的新洞见。
思考 :
问题该在什么时候拿出来讨论 ?
10
Story (III)
我们参加过一个项目的开发,有位高级工程师确信 select
系统调用在 Solaris 上有问题。再多的劝说或逻辑也无法
改变他的想法(这台机器上的所有其他网络应用都工作
良好这一事实也一样无济于事)。他花了数周时间编写
绕开这一问题的代码,因为某种奇怪的原因,却好像并
没有解决问题。当最后被迫坐下来、阅读关于 select 的
文档时,他在几分钟之内就发现并纠正了问题。现在每
当有人开始因为很可能是我们自己的故障而抱怨系统时
,我们就会使用“ select ”没有问题 作为温和的提醒。
思考 :
如何理解经验的益处与坏处?
11
No surprise!
• 在发现某个 bug 让你吃惊时(也许你在用我们
”听不到的声音咕哝说:“那不可能。 ),你必
”须重新评估你确信不疑的“事实 。在那个链表
——例程中 你知道它坚固耐用,不可能是这个
bug ——的原因 你是否测试了所有边界条件?另
——外一段代码你已经用了好几年 它不可能还
有 bug 。可能吗?
思考 :
• 两步曲:如何解决 BUG -> 如何预防 BUG
• 团队的集体智慧能够破除某个组员的误解吗?
12
Crash Early
• “ ”它不可能发生 是不可能发生的!
– 检查了打开的文件是否关闭?
– 检查了内存分配成功与否?
– 检查了不再使用的内存是否已经释放?
– 指针定位是否发生了漂移?
• Solution:
– 防御式编程
• 如果让你做个瓶子,要考虑哪些问题?瓶子装什么该是
首先要考虑的,水、油还是硫酸?
• 尽量提前检测出所有可能的异常!
13
Assertion
• 如果它不会发生,就用断言来确保它不会发生!
• 断言应用以下各项:
– 输入参数或输出参数的取值处于预期的范围内;
– 子程序开始(或者结束)执行时文件或流处于打开(或关闭)的状态;
– 子程序开始(或结束)执行时,文件或流的读写位置处于开头(或结尾
)处;
– 文件或流已用只读、只写或可读可写方式打卡;
– 仅用于输入的变量的值没有被子程序所修改;
– 指针或对象非空;
– 传入子程序的数组和其他容器至少能容纳 X 个数据元素;
– 表已初始化,存储着真实的数值;
– 子程序开始(或结束)执行时,某个容器是空的(或满的);
– 一个经过高度优化的复杂子程序的运算结果和相对缓慢但代码清晰的子
程序的运算结果相一致;
• 断言用于绝不会发生的状况!
14
Assertion
• 只我们才能确保我们的程序是正确的!
• 断言的目的:让你的程序有异常时就早点
死掉! -> 有效地定位问题发生的位置!
思考 :
编译警告有多少价值?
15
Exception
• 可能 -> 错误检查
– 检查传入的文件是否存在
• 不可能 -> 异常处理
– 检查系统目录是否存在
• 错误发生与错误处理分割!
• 思考 :
– 异常与错误检查是否等效?
– 如何抛出异常?是否可以集中管理异常 ?
16
Sample
•
try
{
包含可能抛出异常的语句;
throw 错误 的对象
}
catch( 类型名 [ 形参名 ]) // 捕获特定类型的异常
{
}
catch( 类型名 [ 形参名 ]) // 捕获特定类型的异常
{
}
catch(...) // 三个点则表示捕获所有类型的异常
{
}
17
Story
• Donald E. Knuth在 TeX: The Program 的前言
中说:
" 我相信,在 1985 年 11 月 27 日, TeX 代
码里面的最后一个 BUG 已经被发现和解决
了。但是,如果代码中仍旧有 BUG ,我很
高兴付给任何第一个发现 BUG 的人 20.48
美元 ( 这是前一个金额的两倍,而且我计划
在一年内把它翻倍。你看,我很自信! )"
想知道后来发生了什么吗 ?
18
Design By Contracts
• http://en.wikipedia.org/wiki/Design_by_contract
• 确保程序做该做的事,并且把事做好!
– 前置条件及收尾条件 (Post Condition)
• GNU Nana -> Last updated at 2005!
19
Q&A
20

More Related Content

Similar to 注重实效的编程(2)

Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)Gelis Wu
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
Android裝置開發過程的軟硬整合關鍵及挑戰
Android裝置開發過程的軟硬整合關鍵及挑戰Android裝置開發過程的軟硬整合關鍵及挑戰
Android裝置開發過程的軟硬整合關鍵及挑戰tick
 
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)My own sweet home!
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
EtherCodes中的HTML5
EtherCodes中的HTML5EtherCodes中的HTML5
EtherCodes中的HTML5Garry Yao
 
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)My own sweet home!
 
课题二:Node.js那些事儿
课题二:Node.js那些事儿课题二:Node.js那些事儿
课题二:Node.js那些事儿Liu Allen
 
网站前端代码静态检查工具研究
网站前端代码静态检查工具研究网站前端代码静态检查工具研究
网站前端代码静态检查工具研究pop2008
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述pop2008
 
Build desktop app_by_xulrunner
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunnerRack Lin
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?Andy Dai
 
Ch3 basic command(2013 ncu-nos_nm)
Ch3   basic  command(2013 ncu-nos_nm)Ch3   basic  command(2013 ncu-nos_nm)
Ch3 basic command(2013 ncu-nos_nm)Kir Chou
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計Amigo 陳兆祥
 
TQC+ 程式語言 Python 05:函式
TQC+ 程式語言 Python 05:函式TQC+ 程式語言 Python 05:函式
TQC+ 程式語言 Python 05:函式neochen2701
 
[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204CAVEDU Education
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術Yu Lung Shao
 

Similar to 注重实效的编程(2) (20)

Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)Multi thread 多執行緒程式設計(use c#)
Multi thread 多執行緒程式設計(use c#)
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
Android裝置開發過程的軟硬整合關鍵及挑戰
Android裝置開發過程的軟硬整合關鍵及挑戰Android裝置開發過程的軟硬整合關鍵及挑戰
Android裝置開發過程的軟硬整合關鍵及挑戰
 
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
EtherCodes中的HTML5
EtherCodes中的HTML5EtherCodes中的HTML5
EtherCodes中的HTML5
 
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)開放原始碼 Ch1.3   intro - oss - google codes (ver 2.0)
開放原始碼 Ch1.3 intro - oss - google codes (ver 2.0)
 
课题二:Node.js那些事儿
课题二:Node.js那些事儿课题二:Node.js那些事儿
课题二:Node.js那些事儿
 
善用工具
善用工具善用工具
善用工具
 
网站前端代码静态检查工具研究
网站前端代码静态检查工具研究网站前端代码静态检查工具研究
网站前端代码静态检查工具研究
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述
 
Build desktop app_by_xulrunner
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunner
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
 
Ch3 basic command(2013 ncu-nos_nm)
Ch3   basic  command(2013 ncu-nos_nm)Ch3   basic  command(2013 ncu-nos_nm)
Ch3 basic command(2013 ncu-nos_nm)
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計
 
TQC+ 程式語言 Python 05:函式
TQC+ 程式語言 Python 05:函式TQC+ 程式語言 Python 05:函式
TQC+ 程式語言 Python 05:函式
 
[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
 

More from Horky Chen

程序员发展漫谈
程序员发展漫谈程序员发展漫谈
程序员发展漫谈Horky Chen
 
编程语言与自然语言
编程语言与自然语言编程语言与自然语言
编程语言与自然语言Horky Chen
 
Tow points of WebKit in design
Tow points of WebKit in designTow points of WebKit in design
Tow points of WebKit in designHorky Chen
 
第五项修炼 (学习型组织的艺术与实践)
第五项修炼 (学习型组织的艺术与实践)第五项修炼 (学习型组织的艺术与实践)
第五项修炼 (学习型组织的艺术与实践)Horky Chen
 
代码大全(内训)
代码大全(内训)代码大全(内训)
代码大全(内训)Horky Chen
 
程序员实践之路
程序员实践之路程序员实践之路
程序员实践之路Horky Chen
 
注重实效的编程(3)
注重实效的编程(3)注重实效的编程(3)
注重实效的编程(3)Horky Chen
 
注重实效的编程(1)
注重实效的编程(1)注重实效的编程(1)
注重实效的编程(1)Horky Chen
 
Java scriptcore brief introduction
Java scriptcore brief introductionJava scriptcore brief introduction
Java scriptcore brief introductionHorky Chen
 
JavaScript closures
JavaScript closuresJavaScript closures
JavaScript closuresHorky Chen
 

More from Horky Chen (10)

程序员发展漫谈
程序员发展漫谈程序员发展漫谈
程序员发展漫谈
 
编程语言与自然语言
编程语言与自然语言编程语言与自然语言
编程语言与自然语言
 
Tow points of WebKit in design
Tow points of WebKit in designTow points of WebKit in design
Tow points of WebKit in design
 
第五项修炼 (学习型组织的艺术与实践)
第五项修炼 (学习型组织的艺术与实践)第五项修炼 (学习型组织的艺术与实践)
第五项修炼 (学习型组织的艺术与实践)
 
代码大全(内训)
代码大全(内训)代码大全(内训)
代码大全(内训)
 
程序员实践之路
程序员实践之路程序员实践之路
程序员实践之路
 
注重实效的编程(3)
注重实效的编程(3)注重实效的编程(3)
注重实效的编程(3)
 
注重实效的编程(1)
注重实效的编程(1)注重实效的编程(1)
注重实效的编程(1)
 
Java scriptcore brief introduction
Java scriptcore brief introductionJava scriptcore brief introduction
Java scriptcore brief introduction
 
JavaScript closures
JavaScript closuresJavaScript closures
JavaScript closures
 

注重实效的编程(2)