Blog


《敏捷软件开发:原则、模式与实践》笔记(3)

  • 2019年3月17日
  • 读书

第二部分 敏捷设计

敏捷团队不会花费许多时间去预测未来的需求和需要,也不会试图在今天就构建一些基础结构去支撑那些他们认为明天才会需要的特性。

第 7 章 什么是敏捷设计

软件系统的源代码是它的主要设计文档,用来秒回源代码的图示只是设计的附属物而不是设计本身。

设计的臭味:

  • 僵化性(Rigidity):很难对系统改动,一个改动需要其他部分一起改动。
  • 脆弱性(Frgility):系统的改动会导致其他概念无关的地方出现问题。
  • 牢固性(Immobility):很难解开系统,抽取出重用组件。
  • 粘滞性(Viscosity):做正确的事情比做错误的事情更难。(实现或变更一个需求时,生硬的方法很简[……]

    继续阅读




《敏捷软件开发:原则、模式与实践》笔记(2)

  • 2019年3月10日
  • 读书

第六章 一次编程实践

原文保龄球规则:(文末)

https://www.twblogs.net/a/5b957acb2b717750bda47bd5/zh-cn/

原文需求:

记录一届保龄球联赛的所有比赛,确定团队等级,确定每次周赛优胜者和失败者,每场比赛成绩

初步分析数据结构:

  1. 计分数据

不存储最终该轮得分,该轮得分由函数提供计算,防止冗余数据和出现数据冲突。

  1. 团队数据

  1. 比赛数据

[crayon-5df4e0036c29a79[……]

继续阅读




《敏捷软件开发:原则、模式与实践》笔记

  • 2019年3月2日
  • 读书

第一章:敏捷实践

敏捷开发要点节选:

  • 结对编程
  • 集体代码所有权:所有人可以在任何时候改进所有代码
  • 隐喻:团队提出一个程序工作原理的公共景象

如果把程序员团队当做是组件(component),那么就无法对他们进行管理。人不是“插入即兼容的编程装置”。如果想要项目取得成功,就必须构建具有合作精神的,自组织的(self-organizing)的团队。

一个大而笨重的过程会产生它本来企图去解决的问题。它降低了团队的开发效率,使得进度延期,预算超支。它降低了团队的相应能力,使得团队经常创建错误的产品。

代码是唯一没有二义性的信息源。

计划会遭受形态(shape)上的改变,而不仅仅是日期上[……]

继续阅读




深入理解计算机系统(第三版)/ CSAPP 杂谈,第12章:并发编程

  • 基于进程的并发编程:accept 后 fork。优点:虚拟空间独立,不容易出 bug;缺点:创建进程开销大。需要处理 SIGCHLD 来回收僵死子进程。
  • 基于 I/O 多路复用:传递待读描述符集合给 select 函数,以此响应所有描述符的 I/O 事件。select 会修改描述符集合,改为可读子集返回,所以每次使用都要重新更新待读描述符集合。

  • 基于 I/O 多路复用的并发事件驱动:保存所有已连接的客户端,每次循环检测监听套接字,然后更新客户端集合,并执行相应操作

  • 状态机就是一组状态(state),输入事件(input event),和转移(transition)

  • 基于线程的并发:accep[……]

    继续阅读




深入理解计算机系统(第三版)/ CSAPP 杂谈,第11章:网络编程

  • IP 协议提供基本的命名方法和递送机制
  • UDP 稍微扩展了 IP 协议(增加端口概念),使其从原来的主机间传送变成可以在进程间传送(通过端口区分不同进程),通讯粒度从主机变为进程
  • TCP 基于 IP 协议提供进程间可靠通信
  • 网络通信总是使用大端传输(网络字节序=大端)
  • Linux,Mac,Windows 都是使用 socket 通信。

  • HTTP 请求由 request line,request header,空行 组成。




深入理解计算机系统(第三版)/ CSAPP 杂谈,第10章:系统级I/O

  • 每个打开的文件,内核都保持着文件位置
  • Linux 每个进程都有当前工作目录
  • stat 和 fstat 可以读取文件的元数据(metadata)
  • readdir 以流形式读取目录内容
  • Linux 使用了 3 个数据结构表示打开的文件:
    1. descriptor table 描述符表。每个进程独立维护,通过打开的文件描述符索引
    2. file table 文件表。所有进程共享,持有 vnode 指针,文件位置,引用计数,引用计数为 0 时删除表项
    3. v-node table v-node 表。所有进程共享,包含 stat 结构的大部分信息。
  • I/O 重定向通过 dup2 函数实现。
  • 标准 I/O 库将[……]

    继续阅读




深入理解计算机系统(第三版)/ CSAPP 杂谈,第9章:虚拟内存

  • 所有程序共享内存资源,这容易造成很多问题。虚拟内存用于管理内存,协调各程序之间的内存占用和释放,但对程序来说无感知。
  • 物理寻址流程:CPU 执行加载指令时,生成一个物理地址,通过内存总线传递给主存。主存取出物理地址对应的内存,并返回给 CPU,CPU 将其存放在寄存器中
  • 虚拟寻址流程:CPU 执行加载指令时,生成一个虚拟地址,通过内存总线传递给主存,主存将其转换成物理地址。主存取出物理地址对应的内存,并返回给 CPU,CPU 将其存放在寄存器中。转换过程叫做地址翻译 address translation。
  • address translation 需要硬件和操[……]

    继续阅读




深入理解计算机系统(第三版)/ CSAPP 杂谈,第8章:异常控制流

  • 异常控制流(Exceptional Control Flow,ECF)是操作系统为应用提供的一种访问处理器资源之外的能力,对应于嵌入式和CPU等硬件的中断概念。
  • 系统调用,进程管理,并发,IO 访问都属于异常控制流。

  • 异常(exception)是控制流的突变,用来处理处理器状态中的某些变化。异常通过事件(event)触发,有专门的异常表(exception table)用于事件的跳转。

  • 每种类型的异常都有唯一的异常号(exception number),有可能是处理器设计时分配的零除,缺页,内存访问违例,断点和算术运算溢出;也可能是操作系统分配的系统调用,外部IO设备信号。操作系统的异常号是[……]

    继续阅读




深入理解计算机系统(第三版)/ CSAPP 杂谈,第7章:链接

  • 链接器主要完成符号解析和重定位两个任务。
  • 目标文件有三种形式:可重定位目标文件(.so);可执行目标文件(.exe),共享目标文件(.so)。

  • linux x86-64 的可重定位目标文件使用 ELF 格式。ELF 头的前 16 字节描述文件对应系统的字的大小和字节顺序,后面还有头的大小,目标文件类型,机汽类型,各 section header 的文件偏移,以及它们的大小和数量。

  • 一般 ELF 包含以下几种 section:

    • .text:可执行机器码
    • .rodata:只读数据,如字符串常量和 switch 跳转表
    • .data:已初始化的全局和静态变量
    • :bss:未初始化或初始化为 0 的[……]

      继续阅读




深入理解计算机系统(第三版)/ CSAPP 杂谈,第6章:储存器层次结构

  • SRAM 贵,稳定,集成度低,用于高速缓存存储器
  • DRAM 较便宜,不稳定,集成度高,需要定时重新读写和纠错码,用于主存和帧缓冲区

  • DRAM 的存储单元(超单元)以二元阵列排列而不是线性排列,这样可以节省管脚。请求某个超单元先发送行,此时会将行缓存到内部行缓冲区;然后发送列,此时将该行该列的超单元数据返回给请求者。传统的 DRAM 会将剩余的数据丢掉,而 FPM DRAM会缓存整行。这两种DRAM早就已经停产了,现在主流是 DDR3/4 SDRAM。

  • 可擦写编程器 EEPROM 掉电数据不丢失,主要用于存储数据,如闪存(U盘)

  • 一般的程序都具有良好的局部性,即访问的数据都是在一个较密集的区间[……]

    继续阅读