1.务实的(Pragmatic)程序员,不仅把工作做完,并且把工作做好。
【Chap1 务实的哲学】
1.务实的编程 源于 务实思考的哲学。
2.不要放任破窗
“破窗”:指的是糟糕的设计、错误的决定、低劣的代码等。
3.石头做的汤
做推动变革的催化剂(驱动力)。
找出你的合理请求,然后不断完善。
4.煮熟的青蛙
牢记全景:持续审视你身边发生的事情,而不要只专注于你个人在做的事情。
5.“投资知识,收益最佳”------本杰明.富兰克林
6.知识组合
程序员所了解的一切有关计算过程的事实、工作的应用领域、经验等。
7.对知识组合做定期投资。
8.时间总是不够用的,所以请提前准备好,确保在无聊的时候有东西可读。
9.批判性地分析你读到和听到的东西。
要有自己的思考,而不是全盘接收。
10.说什么和怎么说同样重要。
What、How
【Chap2 务实的方法】
1.ETC(Easier To Chang) 更易变更
优秀的设计比糟糕的设计更容易变更。
2.ETC是一种价值观念,不是一条规则。
说明:Java中23种设计模式,本质就是为了使代码ETC!
3.DRY(Do not repeat yourself) 不要重复自己
4.DRY-在一个系统中,每一处知识都必须单一、明确、权威地表达。
好处:项目更容易理解和维护。
5.正交性
象征:独立性 或 解耦性
好处:提高生产力 和 降低风险。
6.“改了一个代码Bug,但又出现了多个新Bug。”---周同学
说明目标代码未遵循正交性设计,耦合度太高,请及时重构代码。
7.计算机的语言会影响你怎样思考问题。
说明:同一个问题,用Java 或 Python解决时思路是完全不同的。
8.所有的估算都是基于对问题的建模。
9.估算技巧:PERT(Program Evaluation Review Techningue)计划评审技术
每一个PERT任务都有一个乐观的、一个最有可能的、一个悲观的估算。
10.不断提升你的估算能力
将你的估算做一个记录,跟踪估算准确程度。
如果误差超过了50%,试着找到估算错误的原因。
【Chap3 基础工具】
1.自省、机敏
每次发现自己又在重复做某件事情的时候,要习惯性地想到“或许有更好的方法”,然后找到这个方法。
以此精进自身的技能、提高开发效率。
Eg: 项目升级脚本、IDEA JPA Buddy插件(由表自动生成bean)等。
2.永远使用版本控制。
3.去解决问题,而不是责备。
没有人能写出完美的软件,既然Bug无法彻底避免,那么发现Bug时,请集中精力在解决问题上,而不是归咎他人。
4.不要恐慌,冷静思考解决。
代码出Bug时受到惊吓的程序,与对正在运行的代码信任程度城正比。
5.Bug复盘
如果修复一个Bug花费了很长时间,寻找一下原因。
思考能做些什么让下次修复这个Bug更加容易?
6.工程日记
上面记录所做的事情、所学的东西、想法的草图和代码调试时的当前值等---基本上都是各种与工作相关的东西。
7.工程日记的好处
1> 比记忆可靠;
2> 利于保证概念的完整性。
【Chap4 务实的偏执】
无
【Chap5 宁弯不折】
1.所有的程序其实都是对数据的一种变换---将输入转换为输出。
2.编程讲的是代码,而程序谈的是数据。
我们在构思设计时,不仅要考虑类和模块、数据结构和算法、语言和框架,还要将程序视为从输入到输出的一个变换。
好处:结构更清晰、错误处理更加一致、耦合性降低。
【Chap6 并发】
1.使用黑板来协调工作流。
保障项目相关人员对同一个需求的概念一致性。
【Chap7 当你编码时】
1.重构:代码需要演化,它不是一个静态的东西。
2.重构的开始时机、结束时机要恰当。
1>不要过早地优化:在投入宝贵的时间改进算法之前,确保算法确实成为了瓶颈。
2>对重构优化的目标要明确,一旦达到目标就请结束重构。
3.读读《重构:改善既有代码的设计》---重构方面的著作。
4.命名:好好取名,需要时更名。
1> 命名时,不断寻找更合适的名称阐明你的意思,这种行为本身将使你在编写代码时更好地理解代码。
2> 如果你不注意随时更新名字,很快就会陷入比毫无暗示的名字更糟糕的噩梦:误导性的名字。
【Chap8 项目启动之前】
1.需求之坑:无人确切知道自己想要什么。
2.程序员帮助客户理解他们想要什么。
这可能是程序员最有价值的属性。
3.需求是从反馈循环(Feedback Loop)中得到的。
开发者获取需求(所有50美元以上的购书订单免除运费)并将结果反馈给客户,这开启了探索之旅。
在探索的过程中,随着客户尝试不同的解决方案,你可能得到更多的反馈。
这是所有需求采集的现实情况。
4.和用户一起工作以便从用户角度思考。
5.需求不是架构、需求无关设计、也非用户界面---需求就是需要的东西。
6.维护一张项目术语表
1> 项目术语表,记录项目中所有额定术语和词汇的定义。
2> 项目的所有参与者,都使用同一张术语表来确保一致性(使用相同名称指代相同的事物)。
7.跳出框框思考的关键---找到框框。
当遇到难题时,经常使用“跳出框框思考”提醒自己。
关健不在于你是在框框里还是在框框外思考,而在于找到框框---识别真正的约束条件。
8.找到框框的具体方法
1> 当面对一个棘手问题时,把你能想到的所有解决方法都列举出来,不要忽略任何东西,无论听起来多么无用。
2> 现在遍历列举出来的方法,逐条阐述为什么不能选择当前这个方法。
你确定吗?你能证明吗?
以此找到真正的约束条件,而非臆想的约束条件。
9.结对编程
结对编程 是 极限编程(XP) 的实践之一。
在结对编程中,一个开发人员操作键盘,另一个不操作。他们一起解决问题,还可以根据需要切换打字任务。
10.结对编程的好处
1> 充当打字员的开发者专注于语法和编码风格的底层细节,另一个开发者可在更高层次范畴思考问题。
由于人类大脑带宽有限,这样做将带来更多的脑力供我们支配。
(尤其是当凌晨通宵发布遇到棘手问题时,结对编程通常是更好的选择)
2> 有助于克服脆弱的瞬间,提振面对问题的勇气,并且便于尽早避免低级代码错误。
11.敏捷的本质:对变化的响应。
【Chap9 务实的项目】
1.程序员有点像猫:聪明、独立、意志坚强、固执己见。
2.维持小而稳定的团队。
3.排上日程以待其成
如果团队对改进和创新是认真的,那么就需要将其排入日程表。
“只要有空闲时间”就去做,意味着这件事永远不会发生。(真实且深刻)
4.团队的工作,不应仅致力于开发新功能,还可能包括:
1> 旧系统的维护;
如果团队被赋予这样的任务,那么就去做吧,真正地去做。
2> 流程的反思与精炼
太多的团队忙于排水,而没有时间修补洞口(点餐对账服务开发)。
3> 实验新技术
慎重考察候选技术,尝试后分析结果。
4> 学习和提升技能
个人学习和提高是一个很好的开始,但很多技能在团队范围传播时更有效。
5.使用版本控制来驱动构建、测试和发布。
6.测试环境应与生产环境紧密匹配,任何缝隙都是Bug的滋生的地方。
7.务实程序员的本质---是解决问题的人。
用户真正要的不是代码,他们要的是某个业务问题,在目标和预算范围内被妥善地解决。
如果你的头衔只是“软件开发者” 或 “软件工程师”的某种变体,而事实上这个头衔应该是“解决问题的人”。
网友评论