《程序员修炼之道:从小工到专家》1~3章

  1. 如果你是初学者,可以获取编程技术和方法,拓展你的编程生涯。
  2. 如果你富有经验

网站:http://www.flyingdonkey.com

  • 除了编程语言进行表达,程序还要做些什么?这是更深入的问题。
  • 开会-->也是编程,也是思考-->过了几年后就会形成解决方案(模式语言)。
  • 作为程序员,你既是倾听者,又是顾问;既是解释着,又是发好死了者,你设法捕捉难以捉摸的需求,并找到表达。设法简历文档让人去理解它。
    ===>编程是艰难的工作。

注重实效的程序员:

  • 早期的采纳者/快速的改编者
  • 好奇
  • 批判的思考者
  • 现实感(问题的本质)
  • 多才多艺、

第一章 注重实效的哲学

  1. 我的源码让猫给吃了

所有弱点中,最大的弱点就是害怕暴露弱点。

1.1 负责(分析和把控)

2 软件的熵(无序“总量”)

不要留着“破窗户”(低劣的设计、错误决策或是糟糕代码)

2.1 灭火

  1. 石头汤与煮青蛙

有试试请求许可去做,你会遇到拖延和漠然。如果每个人都会护卫自己的资产

  1. 足够好的软件

 欲更好,常常变得更糟。

金融资产管理

  1. 定期投资习惯
  2. 多元化
  3. 保守、高风险之间平衡
  4. 最大回报
  5. 周期性评估和平衡资产

知识资产:

  1. 每年至少学习一种新语言
  2. 每一季度阅读一本技术书籍
  3. 也要阅读非技术书籍
  4. 上课
  5. 参加本地用户组织
  6. 试验不同的环境
  7. 跟上潮流
  8. 持续投入

学习的机会

  • 阅读
  • 搜索信息
  • 搜索知道信息的人

批判性思考

交流

  • 必须的
  • 知道你想说什么
  • 了解你的听众
  • 选择时机
  • 调整你的风格
  • 让听众参与
  • 做倾听者
  • 回复他人

提示

  • 不要容忍破窗户
  • 做变化的催化剂
  • 记住大图景
  • 使质量成为需求的问题
  • 定期为你的知识资产投资
  • 批判地分析读到的和听到的
  • 你说什么和你怎么说同样重要

第二章 注重实效的途径

重复的危害(不要重复你自己,要有权威规范和标准)

  • 强加的重复(改了代码,也要改注释)
  • 无意的重复 (设计时没有考量到的)
  • 无奈的重复 (这里可以去拷贝?)
  • 开发者之间的重复(如何知识管理)

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

软件缺陷以各种各样的方式表现自己,从被误解的需求到编码错误。
糟糕的是,现代计算机系统依然局限于你告诉它的事情,而不一定你说你需要的事情。

关注

  1. 调试为了解决问题(不要推诿,不要抵触)
  2. 你的思维是否正确?
  3. bug报告不是精密的科学,可能被误导。(仔细观察与分析)
  4. 知道如何重现?定位问题。(是否显而易见?)
  5. 能知道当前程序做了什么(debug)==>链路与栈踪迹
  6. 为什么说“不可能”?为什么会吃惊?

此时,你才会意识到单元测试的重要性

相关内容

  • 断言式编程
  • 靠巧合编程
  • 无处不在的自动化
  • 无情的测试

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 编写能编写代码的代码
posted on 2017-11-22 22:21  魔术师Carvendy  阅读(165)  评论(1编辑  收藏  举报