首页 > 其他分享 >读书笔记

读书笔记

时间:2025-01-10 16:22:43浏览次数:1  
标签:需要 读书笔记 重复 代码 他们 我们 可以

《程序员修炼之道 - 从小工到专家》吐血解读
博文视点Broadview
2021年08月13日 18:16 听全文
以下文章来源于iOS成长之路 ,作者zhangferry

本篇文章是对《程序员修炼之道:从小工到专家》一书的总结和解读。

该书作者是 Andrew Hunt 和 David Thomas。他们都是敏捷宣言的17个创始者之一。Andrew还是敏捷联盟(Agile Alliance)的创始人。David 则是著名的 DRY(Don't Repease Yourself) 一词的发明者。这本书也广泛出现在各类计算机推荐书单之中,其受欢迎程度不言自明。

该书目前有两个版本,我阅读的是第一版:

图片
第二版是这样的:

图片
两版内容稍有不同。

刚毕业那会读过一遍,但有很多地方没看明白,感觉云里雾里的。今年在制定每天的阅读分享计划时一下就想到了它,结合一定的工作经验再次阅读这本书,然后对每个章节都进行思考和总结,感觉才算是挖掘出了它的价值。这本书写作时间虽然比较久了(初版1999年),里面引用的一些语言,一些技术框架都已经很少使用甚至过时了,但本书强调的如何做一名注重实效的程序员,及众多建议却不会过时。

以下内容是对各个章节的总结,篇幅有些长,12000+ 字,大家可以按顺序或者按自己感兴趣的章节进行阅读。

第一节:我的源码让猫给吃了。
1、开发过程中出现未曾预料的技术问题,交付晚了等情况,没关系,这些是无法避免的。发生了,我们就要尽可能想方设法地职业的去处理它们。程序员这个职业需要诚实和坦率,要敢于承认自己的错误。

2、要对担负的东西负责,如果某些东西真的超出了你的控制范围可以不处理,需要尽早提出这个不可控的点。自己职责所在的事情就需要为其结果负责。当结果不达标,比如磁盘垮了,但你却没有备份代码,那这就是你的错。不要为出错的情况找借口,想老板说"我的源码让猫给吃了”,对问题没有任何帮助,而要向他们提供可行的解决方案,做什么能够最大的挽回局面。

第二节:软件的熵
1、熵是一个热力学概念,指的是在某个系统中的“无序”的总量,热力学定律指出宇宙中的熵总是倾向于最大化。软件工程里中也存在这么一个定律,工程越庞大,代码的“无序”状态越严重。
2、破窗理论指出,当一个东西本身就破旧时,不但没人爱惜,还会朝他仍石头,导致更多破窗。软件开发中也一样,如果我们项目留有很多“破窗户”(低劣的设计、错误的决策、糟糕的代码),之后接手的人也会倾向于是它变得更糟糕。如果代码很漂亮,你自己以及之后接手的人,都可能会格外注意,不把它弄脏的。所以我们应该尽早处理工程中遗留的问题。
第三节:石头汤和煮青蛙
1、三个士兵返乡,路上饿了,路过一个村子,想跟村民借点吃的,但村民粮食贫乏不愿意出借。士兵们没有气馁,他们煮开了一锅水,往里面放了几块石头。村民好奇为他们在干嘛,士兵解释,这叫石头汤,如果能放点胡萝卜的话会更好喝。村民跑回家拿来了胡萝卜,士兵说如果放些土豆会更美味,又有人跑回家带来了土豆。后面又有人加了别的东西,最后士兵和大家一起吃了一顿饱饭。

2、有时候你确切的知道自己需要什么以及怎么做,但请求许可这件事往往会遭遇拖延和漠然,每个人都会护卫他们自己的资源,这让事情变得复杂,这叫“启动杂役”(start-up fatigue)。这时候我们不应该等着所有事情都准备好,而应该先拿出“石头”煮起来,就是想让事情启动起来。只要是有益的事情,你把做出的一部分结果拿给别人看,然后告诉他们如果加的别的什么会更好,大家一般都会帮忙的。

第四节:足够好的软件
1、使质量成为需求问题。很多时候对于质量的评估都是开发人员在进行,我们对质量要求低,交付时会出现很多问题,我们对质量要求高,会很大程度延误工期。所以指定需求时,把质量这一块考虑进去,在商定的时间内,由产品或者客户决定他们可以接受的质量是什么样的。

2、没有完美的软件,应该知道何时止步。今天了不起的软件常常比明天的完美软件更可取。及早让客户使用,他们的反馈常常会把你引向更好的解决方案。

第五节:你的知识资产
1、本杰明·富兰克林说过:知识上的投资总能得到最好的回报。这没问题,但遗憾的是知识是有时效的资产,特别是计算机领域。我们可以把我们了解的技术实现、工作经验视为知识资产,并使用管理金融资产的形式管理这些知识。

2、经营知识资产可以从以下方面进行:

定期投资:定期投入时间学习,即使很小的投资也是很重要的。

多元化:作为底线我们需要对当前所从事的技术熟练掌握。但不要就此止步,技术的发展变化很快,掌握的知识越多,就越能更好的进行调整,赶上变化。

管理风险:不要把所有的“技术鸡蛋”放到一个篮子里。

低买高卖:新技术流行之前就掌握它往往比之后跟风再学得到更大的回报。

这些知道方针里最重要也是最简单的就是:定期为你的知识资产投资。

3、具体方案介绍

每年至少学习一种新语言。

每季度阅读一本技术书籍,习惯之后可以一个月就阅读一本。

也要阅读非技术书籍,记住计算机是由人使用的。

在本地大学或者网上系统地学一门课程。

体验不同的环境,如果你只在 Windows 上工作,可以试下 Unix。如果你只使用某一种 IDE 那可以试试其他 IDE。

第六节:交流
1、知道你想要说什么

当我们面临会议,重要通话,或者只是撰写技术文档,问下自己你要表达的中心想法是什么,围绕这一点进行展开。

2、了解你的听众

比如你要做一场分享,你可以按照 WISDOM 的形式思考这几个问题:

你想让他们学到什么

他们对你讲的什么内容感兴趣

他们有多富有经验

他们需要多少细节

你想要谁拥有这些信息

你如何促使他们听你说话

3、选择风格

传达一个消息,可以是正式的邮件,黑板上的绘图,口头描述,及时消息,选一个适合你的目的的方式。

4、让文档美观

技术文档不光要注意内容也要注意形式,使用 LaTeX 或者 Markdown 进行排版。

5、让听众参与

引导他们提问,以问答的形式推进分享进程。

6、回复他人

你说什么和你怎么说同样重要。尽量不要忽视别人的询问,即使回复他们稍后再联系都会更好一些。

第七节:重复的危害
1、可靠的开发软件,并让我们的开发更易于理解和维护的唯一途径,是遵循我们称之为 DRY 的原则:系统中的每一项都必须具有单一、无歧义、权威的表示。

DRY 是 Dont’t Repeat Yourself 的缩写。

2、重复的产生通常有以下种类:

强加的重复。开发者觉得他们无可选择,其实是有一些方法让我们避免重复的。

无意的重复。开发者没有意识到他们在重复信息。这个需要通过提高代码意识或者 CR 进行减少。

无耐性的重复。开发者偷懒,因为重复可以让事情更容易。有时往往会遇速则不达,在这类重复面前我们应该更慎重。

开发者之间的重复。同一个团队或者不同团队的几个人重复了同样的信息。需要一个统筹的人引导大家交流,提供一个中央区域,管理维护公共代码。

第八节:正交性
1、正交性是一个从几何学中借鉴而来的术语,如果两条直线相交成直角,他们就是正交的。这在向量中的解释是沿着一条直线移动,你投影到另一条直线上的位置不变。

在计算机中,该术语用于表示某种不相依赖性或解耦性。

2、正交的好处是它提高生产效率,各个组件不相互依赖,使得改变得以局部化,促进复用,对于正交组件进行组合也可以提高生产效率,同时它还降低了代码的风险。

3、延伸开来,项目团队的配合也应该遵循正交性。如果成员之间任务重叠较多容易让大家疑惑问题和责任的归属如何划分,这会造成配合的效率低下。

代码设计的时候也应该尽可能考虑正交性,这需要结合一些特定的设计模式以达成目的。

第九节:可撤销性
如果某个想法是你唯一的想法,再没有什么比这更危险的事情了。在设计软件时,我们需要为可能出现的某种错误做准备,比如数据库的更换,开发平台的更换。这需要我们设计之初就考虑到构建一个相对灵活的架构。

第十节:曳(ye)光弹
1、在黑暗中使用机枪射击有两种方式。

方式一:你需要知道目标准确的位置,然后考虑当时的温度、湿度、气压、风力等一系列因素,计算完位置之后进行射击。

方式二:使用曳光弹,发射时,曳光弹中的磷点燃,会照亮它经过的地方和最终位置,我们用曳光弹确认位置之后,就不需要那些繁杂的计算,直接使用机枪进行射击。

2、在黑暗中发光的代码。通常一个项目的开发是非常复杂的,如果只是一个模块一个模块的开发,我们可能直到最后才能确认项目运行情况。更好的做法是,我们要让系统尽早的跑起来,然后根据需要给它完善细节。这样会有以下好处:

用户能够及早看到能工作的东西。

开发者构建了一个能在其中工作的结构。

你有了可用于演示的东西。

你能够感觉到工作进展。

第11节:原型与便笺
1、原型是你可以在忽略细节的情况下,考虑项目走流程,主要使用场景,他们是否正确,是否可行。通常也可以用用于演示

2、原型制作是一种学习经验,其价值并不在于所产生的代码,而在于所学到的经验教训。那才是原型制作的要点所在。

3、制作原型甚至不需要编码,你可以用便笺,白板上制作原型。制作原型时你需要尝试回答以下问题:

主要组件的责任是否得到了良好定义?是否恰当?

主要组件间的协作是否得到了良好的定义?

耦合是否得以最小化?

你能否克服确认重复的潜在来源?

接口定义和各项约束是否可接受?

第12节 领域语言
1、计算机语言会影响你思考问题的方式,以及你看待交流的方式。

2、领域语言通常是为了简化流程,用于配置或者控制应用程序。

3、DSL 可以理解为一个小型语言,它可以是扩展自已有语言。

4、在设计一种 DSL 时,考虑可读性还是简单性时,主要权衡的应该是可扩展性和可维护性,因为通常大多数应用都会超出预期的使用期限。

第13节 估算
1、通过学习估算,并将此技能发展到事物的数量级有直觉的程度,你就能展现出一种魔法般的能力,确定他们的可行性。

2、多准确才足够准确?130 个工作日和大概 6 个月,是不同的,显然,前者表示的精度更高。我们在做估算的时候也需要选好描述估算时间的单位值。

3、估算结果怎么来呢。

首先需要确认你是否理解了需求所涉及的各个方面,这个是前置条件。

然后你需要建立系统模型,在这个系统中,把模型分拆成各个组件,然后给每个参数设置定一个值,最后根据模型计算一个时间。

4、模型应该是一个动态的,它像一个人工智能模型,你需要持续不断的训练它,才能使它真正准确起来。每次的估算都需要记录,反思估算效果,找出影响因素,加入新的影响项或者调整对应参数。

5、被要求进行估算时间时,我们可以这样回答:我等会儿回答你。然后花点时间仔细检查我们在这一节描述的步骤,你总能得到更好的结果。

第14节 纯文本的威力
本节是第三章:基本工具,首节内容,章节介绍里有一句话:

许多新程序员都会犯下错误,采用单一的强力工具,比如特定的集成开发环境(IDE),而且再也不离开其舒适的界面。这实在是一个错误。我们要乐于超越IDE所施加的各种限制。要做到这一点,唯一的途径是保持基本工具集的“锋利”与就绪。

1、纯本文由可打印字符组成,人可以直接阅读和理解其形式。

这里强调可打印含义是字符时经过编码的可阅读字符,而不是二进制。这在现在看来几乎是不用争辩的,谁还会用二进制存储信息,但当时计算机算力和存储都有限,纯文本会占据更多空间,解码会耗费算力。但源于技术的发展,这些都是可以忽略不计了。

2、纯文本的优点之一:保证不过时。这一点需要我们扩展纯文本能够自描述。自描述的含义是它自己能告诉我们它的含义。
上面的例子中下面一条就是自描述的,我们能通过 SSNO 推断出这里存的就是社会保障号,另外根据 这一标记我们可以很轻松的将对应内容提取出来。

3、另外两个优点是杠杆作用和更易于测试。这里说的是我们可以利用各种工具 diff、

标签:需要,读书笔记,重复,代码,他们,我们,可以
From: https://www.cnblogs.com/zhaoyaxuan2024/p/18664167

相关文章

  • 读书笔记6
    第22节:死程序不说谎1、对待程序我们通常会有“它不会发生”的心理状态,这会导致我们忽视一些问题。对于注重实效的程序员来说,如果我们忽略了一个错误,将是非常糟糕的事情。2、我们一些异常情况,我们应该及早崩溃,用于强调问题的存在。3、引起崩溃的时候不要造成破坏,比如申请的资源还......
  • 读书笔记7
    第26节解耦与得墨忒(tei)耳法则1、把你的代码组织成最小单位(模块),并限制他们之间的交互。如果随后必须替换某个模块,其他模块仍能够继续工作。2、应使耦合减至最少。对象间直接的横贯关系,有可能很快带来依赖关系的组合爆炸。比如对某个模块的“简单”改动会传遍系统中的一些无关模块......
  • Effective C++读书笔记——item12(自定义拷贝构造函数和拷贝赋值运算符可能出现的问题
    1.拷贝函数相关背景及编译器行为在面向对象系统中,拷贝构造函数和拷贝赋值运算符统称为拷贝函数,若不自行声明,编译器会按需生成默认的拷贝函数,其会拷贝被拷贝对象的全部数据。但当自行声明拷贝函数后,编译器若发现实现存在错误,往往不会主动提示,比如在新增数据成员却未更新拷贝函......
  • Effective C++读书笔记——item11(自赋值)
    自赋值相关问题自赋值情况示例明显的自赋值如w=w,还有不太容易辨别的情况,像a[i] =a[j](当i和j值相同)、*px=*py(当px和py指向同一对象)等,这些是由别名(有多种引用对象的方式)造成的,尤其在涉及引用、指针操作同类型多个对象以及继承体系中基类和派生类对象引用、指针转换时要考......
  • 《任何一种能够作为科学出现的未来形而上学导论》读书笔记2
    前言第一节形而上学的源泉原文如果想要把一种知识建立成为科学,那就必须首先能够准确地规定出没有任何一种别的科学与之有共同之处的、它所特有的不同之点;否则各种科学之间的界线就分不清楚,各种科学的任何一种就不能彻底地按其性质来对待了。这些特点可以是对象的不同,或者......
  • 《任何一种能够作为科学出现的未来形而上学导论》读书笔记1
    《任何一种能够作为科学出现的未来形而上学导论》其实算是《纯粹理性批判》的导读,众说周知康德的书不是一般的难以理解,所以《纯粹理性批判》出版的时候很多人是看不懂康德的思想的,甚至对其有所误解,所以康德又写了这本“导论”,并写下“如果有谁对于我作为导论而放在一切未来形而上......
  • Effective C++读书笔记——item8(析构函数与异常)
    析构函数引发异常的问题异常同时存在的隐患:C++虽未禁止在析构函数中引发异常,但坚决阻止这样做。以std::vector等容器包含对象为例,当容器析构时要析构其中元素,若在析构元素(如Widget类对象)过程中连续抛出异常,出现两个或多个活动异常时,程序可能会终止或者出现未定义行为,使用其......
  • Effective C++读书笔记——item2(const,enum,inlines取代#define)
    关于用常量取代#define的总体原则在编程中,应尽量减少预处理器(特别是#define)的使用,可通过合适的替代方式来避免#define带来的诸多问题,虽然不能完全消除预处理器相关指令(如#include、#ifdef/#ifndef仍有重要作用),但要让其使用频率降低。简单常量方面问题阐述:使用#defi......
  • 2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情
    2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情屈原班婕妤曹植刘绘卢思道卢照邻苏味道刘希夷李白高适杜甫司空曙白居易温庭筠韦庄窦叔向张泌林逋柳永晏殊欧阳修李觏舒亶秦观陈瓘李清照陆游辛弃疾姜夔蒋捷吴伟业纳兰性德张惠言邓廷桢《飞花令·合》......
  • 读书笔记~管理修炼~避免无意义的内卷
      剧场效应:避免无意义的内卷   电影院里,大家都在认真看电影。忽然,有一个观众站了起来,或许是想看得更清楚,或许是因为前面的人太高挡住了他。他站起来后,他后面的人也站了起来,然后陆陆续续周围的人都站了起来。最后,电影院里的人都站了起来,每个人都累,却没有得到更多的好处......