《代码大全2》学习笔记1

第一部分:打好基础

第一章

构建包括的范围很大:

定义问题

需求分析

规划构建

软件架构(高层设计)

详细设计

编码与调试

单元测试

集成测试

集成

系统维护

保障维护

----------------

平时接触的也就是从详细设计到系统维护,

后面的测试和技术支持都是必须要打交道的,

但是定义问题和需求,基本都属于产品部门。

----------------

P7:“很多项目,程序员得到的唯一文档就是源代码本身。需求规格书和设计文档可能过时,但是源代码是最新的”

——基本如此,很多工程只有在编码之前有需求文档和设计文档,在以后的修改中,基本都不会去修改这2个文档。

----------------

构建活动主要是从详细设计到开发者测试,也就是程序员的工作,从设计到编码实现,到最后的自测试。

P7:“构建活动是唯一一项确保会完成的工作”

因为时间原因,需求可能是临时的,测试可能是不充分的,但是代码必须编码完成。

——以前有个培训,排名程序员的各项条件,我把诚实放到后面了,不是它不重要,而是没有办法去不诚实,跟卖商品不一样,有没有实现需求,靠嘴说谎马上就要露馅。

第二章

“隐喻的重要性。”

“使用隐喻的方法叫建模。比如分子运动理论是撞球,光的波粒二象性。”

“编程最大的调整是问题概念化,编程中很多错误是概念性的错误。”——个人认为,不应该是编程中,开始编程基本概念已经确定了,而是在前三步(定义问题,需求分析,规划构建)

“把软件的构建过程比作房屋的建设过程,移动承重墙肯定比移动隔墙成本低,软件的结构改变也根本比周边功能改动成本高。”

第三章

“准备工作的中心目标是减低风险。”

“建设大厦和搭建狗舍的前期准备肯定不一样。”

“测试不能测试出‘设计了一个错误的产品’,解决缺陷要在构建活动之前完成”

准备工作不周全的原因“

1、绝大多数开发人员没有需求、产品方面的经验和训练。

2、程序员无法抵御‘尽快开始编码’的欲望。

3、管理者对准备工作的重要性不理解。

--------------------

——对2深有体会,每次总是喜欢写个大致的详细设计,然后立刻投入编码,不过似乎只有在编码中才能更好的去构想细节,如果不编码那么脑袋里面就没有具体的印象,可能是没有使用伪代码编程的习惯,在后面的章节里面有伪代码编程的例子。

这也同样导致了我宁愿一个人加班完成工作,也不原因和别人合作完成一个程序。

不过在实际中,可能是我的团队人数都很少,一个人的效率要比几个人合作高的多。而且就算是分开每人维护一个模块,接口的调试都会花去很多时间。如果2个模块是自己一个人负责的,接口的调试很快就通过了。这或许也是最早设计报文格式的时候不周全导致的。

-------------------

“有时候用户一开始不完全确定自己想要什么,找出他们真正想要的,比做一个错误的东西再修正要好多了。”

没有直接面对客户,也没有直接的感觉,但是客户经常会提出永远都用不到还必须要有的功能。

“需求、架构、构建,缺陷越靠前,修改的成本越大。”

------------------

“我们最好立即编码,后面有很多调试要做。”和“我们没有为测试安排太多时间,因为将来不会发现太多的缺陷。”

相对而言,第二个比第一个好。

-----------------

“迭代法开发比序列开发节约成本”

迭代法就是随着项目的进展,开始检查并返工,再进行下一步的开发。

序列法是开发完成后检查并返工。

-----------------

“问题定义只是定义了问题是什么,而不涉及解决方案。”

“问题定义要用顾客的语言来书写,而不是用计算机的专业术语来叙述。”

‘我们的出口带宽总是跑满’,‘我们需要优化缓存系统,让出口带宽不要跑满’

明显前一个是问题,而后一个不像问题,倒像一个解决方案了。

----------------

“明确需求有助于用户驾驭系统功能,有助于避免程序员之间的争论”

——感觉很多程序做出来,发现需求理解的不一样,往往研发之间无关紧要的就糊过去了,最多的争论在于研发和测试对它的不同理解。

“客户经常改动需求,IBM的统计平均开发过程中,需求会有25%的改动。”

“客户往往喜欢拍脑门,用成本和进度可以提醒他们。”

——哈

P42针对功能需求有疑问,这么详细的外部接口,包括握手协议,通信协议到底是属于需求还是属于详细设计?感觉不应该是需求层的啊。

P46数据设计也一样的疑问,不过里面提到的,使用什么数据结构或算法要写出为什么这么用的好处,便于让程序员洞察构架师的思想。

“数据通常只有一个子程序或一个类之间访问”

“程序员会处于专业自豪感,对自己编写的类做过度工程”

——的确是事实啊,但是如果有时间的话,难道不好吗?

“架构应该描述所有主要决策的动机,而不是向来如此”

“优秀的架构很大程度上与机器和编程语言无关,但是也不能忽视环境。独立于环境的好处是避免过度架构。”

第四章

构架决策:

选择编程语言

编程约定(代码规范和风格、性能or稳定)

团队工作(代码管理cvs,如何分工)

质量保证(先写测试用例,评审)

工具(代码管理工具、编译工具)

时间: 2024-10-18 13:12:34

《代码大全2》学习笔记1的相关文章

C专家编程学习 1

1.C语言的基本数据类型直接与底层硬件相对应. 2#define 是可能出现问题 1 2 3 4 5 #define a(y) a_ex(y) a(x)被扩展为 a_ex(x) #define a (y) a_ex(y) a(x)被扩展为 (y) a_ex(y)(x) #define宏的用法 1.简单宏定义 1 #define a y 将文件中的 a 全部换成 y 为了避免出现问题,要将宏展开,根据运算符的优先级判断是否是需要的运算顺序. 2.带参数的宏定义 1 2 #define a(y) a

Java并发编程学习笔记

Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令.   class MyTask implements Runnable {    private String mName;     public MyTask(String name) {    mName = name;   }  

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

JAVA GUI编程学习笔记目录

1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之GUI编程窗体事件 6.JAVA之GUI编程Action事件 7.JAVA之GUI编程鼠标事件 8.JAVA之GUI编程键盘码查询器 9.JAVA之GUI编程列出指定目录内容 10.JAVA之GUI编程弹出对话框Dialog 11.JAVA之GUI编程菜单 12.JAVA之GUI编程打开与保存文件 13.JAVA之GUI编程将程序打包jar JA

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

Java并发编程学习笔记(一)线程安全性 1

什么是线程安全性: 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问."共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化. 一个对象是否需要线程安全的,取决于他是否被多个线程访问.这指的是在程序中访问对象的方式,而不是对象要实现的功能.要使得对象时线程安全的,需要采用同步机制来协同对对象可变状态的访问.如果无法实现协同,那么可能导致数据破坏以及其他不该出现的结果. 如果当多个线程访

FFmpeg编程学习笔记一

FFmpeg编程学习笔记一 1.为了学习ffmpeg编程需要单步调试,参照网上的教程用VS2013编译一次成功,之后随便写了个重采样音轨小程序,也就是把一个5.1声道的AC3文件分解成6个WAV文件的简单功能. 2.编译成功执行也正常,但速度奇慢,比同类软件eac3to慢了约5倍. 3.OK上网搜搜咋回事,一天,二天过去了无果. 4.无奈用VS2013的性能与诊断,分析出最占用时间的函数调用具然是:swr_convert参数里的lrintf() lrint() llrint() llrintf(

Android Socket编程学习笔记

通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 在java中,Socke

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现