序
- 如果你是初学者,可以获取编程技术和方法,拓展你的编程生涯。
- 如果你富有经验
网站:http://www.flyingdonkey.com
- 除了编程语言进行表达,程序还要做些什么?这是更深入的问题。
- 开会-->也是编程,也是思考-->过了几年后就会形成解决方案(模式语言)。
- 作为程序员,你既是倾听者,又是顾问;既是解释着,又是发好死了者,你设法捕捉难以捉摸的需求,并找到表达。设法简历文档让人去理解它。
===>编程是艰难的工作。
注重实效的程序员:
- 早期的采纳者/快速的改编者
- 好奇
- 批判的思考者
- 现实感(问题的本质)
- 多才多艺、
第一章 注重实效的哲学
- 我的源码让猫给吃了
所有弱点中,最大的弱点就是害怕暴露弱点。
1.1 负责(分析和把控)
2 软件的熵(无序“总量”)
不要留着“破窗户”(低劣的设计、错误决策或是糟糕代码)
2.1 灭火
- 石头汤与煮青蛙
有试试请求许可去做,你会遇到拖延和漠然。如果每个人都会护卫自己的资产
- 足够好的软件
欲更好,常常变得更糟。
金融资产管理
- 定期投资习惯
- 多元化
- 保守、高风险之间平衡
- 最大回报
- 周期性评估和平衡资产
知识资产:
- 每年至少学习一种新语言
- 每一季度阅读一本技术书籍
- 也要阅读非技术书籍
- 上课
- 参加本地用户组织
- 试验不同的环境
- 跟上潮流
- 持续投入
学习的机会
- 阅读
- 搜索信息
- 搜索知道信息的人
批判性思考
交流
- 必须的
- 知道你想说什么
- 了解你的听众
- 选择时机
- 调整你的风格
- 让听众参与
- 做倾听者
- 回复他人
提示
- 不要容忍破窗户
- 做变化的催化剂
- 记住大图景
- 使质量成为需求的问题
- 定期为你的知识资产投资
- 批判地分析读到的和听到的
- 你说什么和你怎么说同样重要
第二章 注重实效的途径
重复的危害(不要重复你自己,要有权威规范和标准)
- 强加的重复(改了代码,也要改注释)
- 无意的重复 (设计时没有考量到的)
- 无奈的重复 (这里可以去拷贝?)
- 开发者之间的重复(如何知识管理)
2.1 正交性(消除无关事物的影响)
内聚
- 促进复用。
- 降低风险
- 更好地测试
思考
- 怎么划分职责
- 怎么设计
- 工具箱+库 ==> AOP
需要
- 不断测试
- 写文档
2.2 可消除性
如果某个想法是你唯一的想法,再也没有比这更危险的事情了。
变化==> 灵活架构
代码与 薛定谔的猫。
未来有多少个未来?你敢打开盒子么?
拽光弹
快速、直观和可重复地从需求出发满足系统的某个要求。
让你有方向地调整。
侦察与收集情报。
优点:
- 用户及早看到工作的东西
- 构建一个开发者能在里面操作的结构。
- 有自己的集成平台
- 有了可演示的内容
- 能感觉到工作的进展
抽象,解耦。
11 原型
- 正确性(分析与揭示问题)
- 完整性
- 健壮性
适当使用原型
早期缺点和改正潜在的问题
便宜、容易,节省成本。
12 领域语言
语言的界限就说一个人的世界的界限。——维特根斯坦
计算机世界
- 编程语言会影响你思考问题
- 交流方式
用一个工具去分析需求
- 靠近问题思考
- 抽象层中,专心解决领域问题的自由。
- 构造数据结构
- 可能是小的交互脚本(bat)
思考
- 易于开发还是易于维护?
- 维护性的回报?
13 估算
思考
- 传送一个40m文件需要多久?
- 你编写的时候,知道需要哪些子模块么?
- 多准确才足够准确?
- 估算从哪里来?(模型基础)
- 系统的模型
- 创造性,也说有趣的
- 哪些说确定的,哪些说不确定的。(分解+计算)
- 有问题再重头再来估算
- 项目进度
- 检查需求
- 分析风险
- 设计、实现、集成
- 向用户确认
提示
- 不要重复你自己
- 让复用变得容易
- 消除无关事物之间的影响
- 不存在最终决策
- 用拽光弹找你的目标
- 为了学习而制作原型
- 靠近问题领域编程
- 估算,以避免发生意外
- 通过代码对进度表进行迭代
第3章 基本工具
14 纯文本的威力
工具可以放大你的才能。
你的基本材料是什么?
- 最为重要的知识存储
- 最佳的格式的纯文本
- XML, HTML,还是觉得Markdown比较好
- 不过时,可以阅读
- 杠杆作用,使用vim等小工具
- 补充:
- 代码生成器
- 元程序设计
- 黑板
- 自动化
15 shell游戏
如何启动你的应用,调试器,浏览器,编辑器。
能否超越GUI?
- 比快更快?
- 如何更简略?
- 怎么实现自动化?
- 如何更有效地组合各种工具?
如果你没有花大量的时间研究你所用的系统上的shell命令的各种能力,这些命令会显得很吓人。
学习之后,惊讶怎么能提高你的生产效率。
虽然windows的命令和工具能用,但是。。。
windows集成的Unix工具,区分大小写,空格,分隔符之类的问题。
或则会有奇怪的问题。
16 强力的编辑
工具说手的延伸
思考
- 你精通哪个编辑器
- 最好的编辑器是什么?(Emacs,vi,CRiSP,Brief)
特性
- 怎么配置?
- 扩展
- 可编程(IDE属性)
- 生产率如何?
学习,并用好你的编辑器。
17 源码控制
进步远非由变化组成的,而是取决于好记性。不能记住过去的人,被判重复过去。
关注什么?
- bug追踪
- 审计
- 性能
- 质量
- 源码控制与构建(自动化+单元测试,确保当天提交的代码没有问题)
18 调试
这是痛苦的事:
看着你自己烦忧、并且知道
不是别人、而是你自己一人所致。
—— 《埃阿斯》
bug
软件缺陷以各种各样的方式表现自己,从被误解的需求到编码错误。
糟糕的是,现代计算机系统依然局限于你告诉它的事情,而不一定你说你需要的事情。
关注
- 调试为了解决问题(不要推诿,不要抵触)
- 你的思维是否正确?
- bug报告不是精密的科学,可能被误导。(仔细观察与分析)
- 知道如何重现?定位问题。(是否显而易见?)
- 能知道当前程序做了什么(debug)==>链路与栈踪迹
- 为什么说“不可能”?为什么会吃惊?
此时,你才会意识到单元测试的重要性
相关内容
- 断言式编程
- 靠巧合编程
- 无处不在的自动化
- 无情的测试
19 文本操纵
Unix开发者喜欢利用shell的力量,像awk和sed 。
有的人喜欢用python,有的喜欢用perl
==> 这些都是你的醴陵。
适用于
- 数据库schema维护
- Java属性访问
- 生成测试数据
- 对笔记,文本格式化
- 与C底层接口测试
- 生成web文档
20 代码生成器
使用代码生成器,实际上没有任何代价。
类型
- 被动代码生成器,运行一次来生成结果。(模板性质)
- 创建的源文件
- 在编程语言之间进行一次性转换。(如何检查与修正)
- 生成查找表与其他在运行时计算很昂贵的资源。
- 主动生成器,在每次需要其结果的时候被使用 。
- 能衍生出形式,例如:schema与DB
- 不一定很复杂
- 不一定是代码,可以是文档,或者文本。
提示
- 20 用纯文本保存知识
- 21 利用命令shell的力量
- 22 用好的编辑器
- 23 总是使用源码控制
- 24 修正问题,而不是发出指责
- 25 不要恐慌
- 26 真的没有问题?
- 27 不要假定,要证明
- 28 学习一种文本操纵语言
- 29 编写能编写代码的代码