《程序员修炼之道》读书笔记(下)

程序员修炼之道(下)

Friday, March 30, 2018

15:17

就如同我在上篇读书笔记中说的那样,这本书中的一些方法和思想,需要我们在之后的编程学习过程中一点一点的参悟和领会。

曳光弹

比如说从我的第一次个人作业中,我对书中提到的曳光弹代码就有了很深的感触:根据书中给出的例子,我对“曳光弹”的理解是MVP,最小可用产品。甚至是比MVP更简单,进一步最小化的,一段核心算法,一个可操作的简单界面...等等。避免从复杂繁重的文档和大而全的设计开始,直击要害(或者说是你认为的“要害”),实现一个可供操作和评估的东西,观察用户的反应。一旦命中,再对其进行修缮和完备,反复在系统的各个部分实施这样的动作,形成最终的产品。在这次第一次的个人作业代码编写中,有一个很重要的功能实现就是文件夹的遍历,这是我所不熟悉的文件操作里面的,但我可以应用曳光弹的这个想法,让我的代码在黑夜中发光!!

预备:我首先在网上查找相关系统函数的资料,然后写了一段递归的代码

开火:我将这段曳光弹代码的输出功能设定在简单的输出所有的文件名,然后用数据进行训练

瞄准:根据这个简单的输入和输出,我就可也直观的看出代码中间的核心逻辑部分是否存在问题根据问题指向就能轻松地对代码进行修正。

这样我就得到了一定没有错误的一段文件遍历的核心代码,之后我再这个代码的基础上增加文件读取等其他功能的时候就不会担心文件遍历这个核心逻辑的正确性。

同时就像书中所说,曳光弹代码不是用过就扔掉的代码,编写它,是为了保留它。我同样可以将这个没有问题的简单的读取文件名称的代码保存起来,等到以后有用到文件遍历的时候就在其基础上进行开发。

代码管理

在书中,作者在基本工具的建议中建议使用源码管理工具。

在第一次的个人作业中,我使用了git作为我的源码管理工具,在使用的过程中,发现了这样做的好处。我可以大胆的修改我的代码,而不用担心我的代码不能回到原来的版本。其次,我还能在branch中规范自己分支的主要目的,这样可以明确目标。在git log中可以跟踪自己的commit,跟踪自己的开发进程,同时还可以通过github进行代码同步和跨平台开发。

调试

不要慌张。就像老师在课上提到的,真正有经验的程序员会花上几个小时的时间去修复一个bug而十分的平静。

开始修复bug的最佳途径就是再现bug

跟踪,发现一个预料之外的坏变量时候,当你准备修复之前应该快速的看一下这个变量旁边的几个变量的值。

不要靠巧合编程

在书中,作者举了一个例子,说明了很多时候,当我们测试时代码没有明显的错误,但是之后出现bug很大的一个原因就是,我们根本不知道这段代码为什么可以工作

这里和老师在课上提出的意见:不要复制和粘贴代码,如果有需要,我们也应该一行一行的重新抄写,同时,理解这段代码的逻辑。

在这次的个人作业中,我就遇到了这个问题,在设计这个一个hash函数的代码中,我为了可以是字符在表中可以尽可能的散开,我在网上找到了一段有名的hash代码(针对于输入字符串)。

然后稍微看了一下后直接替代了原来的hash函数,在小的数据集中没有出现明显的错误,于是我就觉得这段代码没有什么问题,但是在应用到大的数据集的时候,就出现了大的冲突错误(我本来已经开了足够的哈希表空间)但是还是放不下。一开始,我不能很快的发现问题所在,因为我以为这个hash函数是没有问题的,在花费了大量的时间查找问题之后,才发想了这个问题出现在这个hash函数中,复制粘贴虽然节省了我几分钟的时间但是之后的debug却花费了我数百倍的时间,所以我感触极深。

不要猜想,要勇于尝试

可以编写,断言来验证我的猜想(断言式编程)

结合我第一次代码编写的经历,我在对string数据类型的还是操作时候不是很熟悉,不是很有底,在需要用的时候就会在shell里面开一个小的程序来验证我的想法,当然按照这本书的建议,我之后可能可以尝试去使用assert断言,

#include <assert.h>

void assert( int expression );

早测试,常测试,自动测试

不是很了解自动测试的概念,去网上查找了一下后,发现了几款自动测试的工具,争取下次用到个人作业或者结对作业中。

好记忆不如烂笔头

要把英语(中文)当做一种编程语言

文档分为外部文档和内部文档,内部文档包括源码注释,设计和测试文档,外部文档包括用户手册,技术文档等。

在这里,作者推荐我们学习一下标记语言,可以提高效率。

所以找时间把markdown学一下。

原文地址:https://www.cnblogs.com/huangzp1104/p/8678347.html

时间: 2024-11-09 04:57:00

《程序员修炼之道》读书笔记(下)的相关文章

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询

SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别名并不存在.例如: SELECT orderid, YEAR(orderdate) AS orderyear FROM Sales.Orders WHERE orderyear > 2006; 这是错误的,WHERE子句中并不能识别orderyear别名,应该改为: SELECT orderid,

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-06 集合运算

T-SQL支持3种集合运算:并集(UNION).交集(INTERSECT)和差集(EXCEPT).集合运算涉及的两个查询不能包含ORDER BY子句. UNION ALL集合运算 UNION ALL不会对行进行比较,也不会删除重复行.假设查询Query1返回m行,查询Query2返回n行,则Query1 UNION ALL Query2返回(m+n)行. SELECT country, region, city FROM HR.Employees UNION ALL SELECT country

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-07 透视、逆透视及分组集

透视转换 透视数据是一种把数据从行的状态旋转为列的状态的处理.每个透视转换将涉及分组.扩展及聚合三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的分组或行元素,扩展阶段处理相关的扩展或列元素,聚合阶段处理相关的聚合元素和聚合函数.现在假设有一张表数据如下: 我现在需要查询出下面的结果: 需求分析:需要在结果中为每一个雇员生成一行记录,这就需要对Orders表中的行按照其empid列进行分组:从结果看,还需要为每一个客户生成一个不同的结果列,那么扩展元素就是custid列:最后还需要对数

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-10 可编程对象

关于批处理 下列语句不能在同一批处理中和其他语句同时编译:CREATE DEFAULT.CREATE FUNCTION.CREATE PROCEDURE.CREATE RULE.CREATE SCHEMA.CREATE TRIGGER及CREATE VIEW.例如,以下代码包含一个IF语句,之后在同一批处理中跟着一个CREATE VIEW语句,SQL Server将会报错: IF OBJECT_ID('Sales.MyView', 'V') IS NOT NULL DROP VIEW Sales

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改

插入数据 T-SQL提供了几种数据插入的语句:INSERT VALUES.INSERT SELECT.INSERT EXEC.SELECT INTO及BULK INSERT. INSERT VALUES语句: INSERT INTO dbo.Orders(orderid, orderdate, empid, custid) VALUES(10001, '20090212', 3, 'A'); SQL Server 2008增强了VALUES语句的功能,允许在一条语句中指定由逗号分隔开的多行记录:

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-05 表表达式

一般来说,表表达式既不会对性能产生正面影响,也不会对性能产生负面影响. 注意下面这种代码风格: SELECT orderyear, COUNT(DISTINCT custid) AS numcusts FROM (SELECT YEAR(orderdate), custid FROM Sales.Orders) AS D(orderyear, custid) GROUP BY orderyear; 公用表表达式 公用表表达式(CTE,Common table expression)是用WITH子

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-03 联接查询

联接有三种基本类型:交叉联接.内联接和外联接.交叉联接只有一个步骤——笛卡尔积:内联接有两个步骤——笛卡尔积.过滤:外联接有三个步骤——笛卡尔积.过滤.添加外部行. 内联接 代码: SELECT E.empid, E.firstname, E.lastname, O.orderid FROM HR.Employees AS E JOIN Sales.Orders AS O ON E.empid = O.empid; 另一种写法: SELECT E.empid, E.firstname, E.la

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-09 事务和并发

事务必须有四个属性:原子性.一致性.隔离性.持久性,这四个属性的首字母可以缩写为ACID. 以下代码定义了一个事务,插入新订单数据: -- Start a new transaction BEGIN TRAN; -- Declare a variable DECLARE @neworderid AS INT; -- Insert a new order into the Sales.Orders table INSERT INTO Sales.Orders (custid, empid, ord

《MySQL技术内幕InnoDB存储引擎》读书笔记 第一章

Mysql体系结构和存储引擎 1.1 定义数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.    数据库文件可以使frm,MYD,MYI,ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共享内存区组成.    数据库实例才是真正用于操作数据库文件的. 实例与数据库的关系通常是一一对应的,在集群情况下可能存在一个数据库被多个数据实例使用的情况. MySQL被设计为一个单进程多线程架构的数据库,这点与SQL Server比较类似,但与Oracle多进程的架构有所不同(Or

《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视(Pivoting)就是把数据从行的状态旋转为列的状态的处理.其处理步骤为: 相信很多人在笔试或面试的时候被问到如何通过SQL实现行转列或列转行的问题,可能很多人当时懵逼了,没关系,下面我们通过例子来理解. (1)准备数据 --1.0准备数据 USE tempdb; IF OBJECT_ID('dbo