首页 > 编程语言 >阅读笔记之《程序员修炼之道-从小工到专家》六

阅读笔记之《程序员修炼之道-从小工到专家》六

时间:2023-06-07 23:33:45浏览次数:39  
标签:重构 小工 向导 黑板 程序员 算法 修炼 测试 代码

第30节 黑板

1、设想侦探破案的过程,他借助于一块黑板,把不同线索写出来;其他侦探也可以写下自己的推断和已掌握的案情细节。所有这一切串联起来将共同帮助案件侦破,但不同的线索之间是可以独立进行的。

2、这里的黑板可以抽象为一种处理事件的模型。不同于原始的工作流需要考虑各种状况,不同组合,先后顺序等,黑板系统只管写入,读取,查询,通知等基础功能,任意符合条件的事件都可以进入这个系统。

3、黑板模型也是一种解耦形式。

第31节 靠巧合编程

从本节开始进入书目的第6章,本章主要讲在编码时应该注意的各类事项。传统智慧认为,项目一旦进入编码阶段,工作主要就是机械的把设计转换成可执行语句。我们认为,这种态度是许多程序丑陋、结构糟糕、不可维护的最大一个原因。编码不是机械工作,要想让程序长久无误的运行,每一分钟都需要做出决策,且需要对这些决策进行仔细的思考和判断。

1、靠巧合编程即代码正好是可运行的,至于为什么能够正常运行,却不清楚。这是我们应该极力避免的。

2、在打算重构某个看起来有问题的代码时,我们会面临这样的疑惑,是否有必要冒着把能工作的东西弄糟的风险呢?这时我们可以考虑一下几个理由:

  • 它也许不是真的能工作,只是看起来能工作。

  • 你依靠的边界条件也许只是一个巧合。

  • 多余和没必要的调用会让你的代码变慢并增加新 bug 的风险。

3、如何深思熟虑的编程,有以下建议:

  • 总是意识到你在做什么。
  • 按照计划(设计)行事。
  • 依靠可靠的事物而非假设。
  • 不要只是测试你的代码,还要测试你的假定。
  • 不要让已经做完的事情限制你的下一步,做好重构的准备。

第32节 算法效率

1、注重实效的程序员几乎每天都要使用估算,估算的资源包括:时间、处理器、内存等等。

2、估算算法即是我们熟知的时间复杂度,用O()表示,它有以下几种常见类型。

  • O(1),常量时间,不随数据的多少变化
  • O(n),线性时间,简单的循环
  • O(m*n),嵌套循环
  • O(log(n)),二分法,平衡二叉树的查询
  • O(nlog(n)),分而治之,快排
  • O(2^n),指数级,斐波那契数列

3、不同的时间复杂度在达到一定数量级的时候将相差很多,所以某些情况我们要想方设法优化算法的效率。我们主要需要关注的是是复杂度的阶。在确认了算法之后,还需要对其进行测试。

4、最好的并非总是最好的,是否使用最优算法,还需要根据我们遇到的实际情况。有时数据量很小的情况,算法的效率是可以忽略不计的。

第 33 节 重构

1、重写、重做和重新架构代码合起来,称为重构。

2、当代码出现以下特征,就应该考虑重构了:

  • 出现重复内容,违反DRY原则。
  • 非正交的设计。
  • 知识过时了,或者你对某部分的了解更深一步。
  • 对性能造成了影响。

3、重构的原则:早重构、常重构。重构面临的敌人通常都是时间,但这个借口并不成立,因为之后由此引发的时间额外消耗很可能更多。

4、如何重构。

  • 不要试图在重构的同时增加功能。
  • 重构之前,确保拥有良好的测试。
  • 采取短小,深思熟虑的步骤,不要一次改动太多内容。

第34节 易于测试的代码

1、软件 IC 是人们在讨论可复用性和基于组件的开发时喜欢使用的比喻。意思是集成电路芯片可以很容易的进行组合,我们希望软件开发也能达到这个效果。芯片的设计有完善的测试,同样的软件开发也可以做同样的事情。

2、针对合约进行测试及为测试而设计,即 TDD 测试驱动开发。

3、编写单元测试,对比较大的项目,将每个测试都放进一个子目录。

4、使用测试装备。构建一套完善的测试体系,它能够记录测试状态,分析输出结果是否符合预期,以及选择和运行测试。

5、推进测试文化,尽可能完善地测试你的软件,否则你的用户就得替你测试。

第35节 邪恶的向导

1、这里的向导指的是那些用于帮助我们构建程序自动生成的代码,通常他们还被称为脚手架。为什么称向导(wizard)是邪恶的呢,这是因为通过工具生成的代码,很容易被我们忽略,在这种情况下你编写的过程更倾向于靠巧合编程。

2、这里不是抵制向导代码,而是在强调,不要使用你不理解的向导代码。如果使用,一定要清楚它的机制。

3、开发每天都在使用不完全理解的事物,比如集成电路的工作原理,处理器的中断结构、用于调度的算法、各种系统库的工作机制等。需要注意的是,这些属于底层依赖,他们也是向导,但不是应用本身的一部分,我们可以对这部分有所了解,但他们不属于邪恶的向导。

标签:重构,小工,向导,黑板,程序员,算法,修炼,测试,代码
From: https://www.cnblogs.com/fengjiale/p/17464895.html

相关文章

  • 阅读笔记之《程序员修炼之道-从小工到专家》七
    第36节需求之坑从本节开始进入了第七章节:在项目开始之前。本章节讨论了在项目开始之前的一些建议。1、完美,不是在没有什么需要增加,而是在没有什么需要去掉时达到的。这句话的一种解读时,不要搜集需求,需求太多,容易让我们抓不住重点,更应该深挖需求,围绕核心功能不断打磨。2、挖掘......
  • 程序员如何成长
    做技术是打怪兽不是养宠物,为什么要打怪兽?因为难;为什么难很重要?因为难的事情才能带来成长;为什么要成长?承认吧,因为「如何成长」是当代人,包括你我他在内焦虑的源泉。过去几个月内我在写一系列主题为「NodeJS实战」的文章,内容来源是过去两年独自开发和运维site2share网站的经验,本篇......
  • 程序员常说的“钩子”
    百度定义勾子   ......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的右视图
    1.简述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例2:输入: [1,null,3]输出: [1,3]示例3:输入: []输出: []2.代码实现:classSolution{publicList<I......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树中的最大路径和
    题目:二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。 示例1:输入:root=......
  • ChatGPT 时代,程序员的生存之道 | 人工智能 AI
    前言ChatGPT近期炙手可热,仿佛没有什么问题是它不能解决的。出于对ChatGPT的好奇,我们决定探索下它对于前端开发人员来讲,是作为辅助工具多一些,还是主力工具更多一些?2D能力测试我们就挑选一个著名的递归回溯问题——“八皇后”,看看ChatGPT的表现如何。什么是“八皇后”首......
  • 程序员在Ubuntu安装之后的配置 - 2
    这是一篇记录Ubuntu服务器安装后基本软件安装、信息配置的帖子,主要内容以若干个bash文件的格式给出。详情可以参考我之前写过的文章:https://www.cnblogs.com/Higgerw/p/14036700.html#:~:text=https%3A//pan.baidu.com/s/1hNJ5Y7fqs6ONbwvHzv5qnA代码片段1有很多软件工具不需......
  • w15-小工具
    w15-小工具功能​ 该工具可以完成检测图像中鼠标点击位置像素点的rgb值或者hsv值等的颜色像素值,并能够用鼠标在图像中画出一个封闭的轮廓,可以求出轮廓的面积和周长要求将结果显示在控制台或者图像上合适的位置(将结果显示在图像上时注意调整字体和大小合适)。思路​ 由于openc......
  • 沪漂程序员的两年,终说再见,你会不会是下一个离开的人?
    始于云南,梦出发的地方       在昆明读了四年的本科,那是一段没有太多焦虑的日子,这所美丽又悠闲的城市,位于西南边陲常常被人所遗忘的角落。       2019年,和很多憧憬北上广的同学一样,并没有太多犹豫就来了上海,当时是和同学院的同学潘先生一起来到了上海。最开始在张江软......
  • 《程序员修炼之道-从小工到专家》阅读笔记
    第15节Shell游戏1、对于操纵文本的文件的程序员,命令Shell就是工作台。我们可以利用Shell启动各种应用、搜索文件、查询系统状态,甚至还可以构建复杂的宏命令,完成各种常见活动。2、对于习惯GUI的开发者来说一直使用Shell有些极端。GUI的好处是所见即所得,但他的缺点却是......