梦断代码 读后感(III)远虑和近忧

2024-03-23 21:20

本文主要是介绍梦断代码 读后感(III)远虑和近忧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

梦断代码 读后感(III)远虑和近忧

原文地址:http://yishan.cc/blogs/xin/archive/2008/11/18/iii.aspx

[part 3]

几个星期前,我给《现代软件工程》课的每一个团队都发了一本 《Dreaming In Code》的中文版 《梦断代码》,要求写读后感。这本书讲了这样的故事:一群很有经验的代码牛人在先进软件开发模式的指导下,没有资金压力,在更多大牛的带领下,原计划用一到两年的时间开发出一个备受期待的个人信息管理软件(PIM),后来花了七年时间才完成这一创举,但是已经无人喝彩。我是9月份读的英文版,后来又翻阅了中文版,也有一些感想如下。

Dreaming in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One Quest for Transcendent Software

Kapor 的团队看起来非常重视“远景”, 他们似乎没有近忧 - 这也许是致命的。

他们对于软件的基本架构/infrastructure 非常关心,例如对于存储系统,它们提出了下列需求:[p103]

  1. it has to make life easy for the Python programmers
  2. it has to operate efficiently over a network
  3. it needs to be able to handle very large individual date items and very large numbers of items
  4. it has to be reliable, using database "transactions."
  5. it has to support searching and indexing
  6. [0] User experience  //Kapor 后来加上去的,似乎不相干的一条远景。

后来对于Data Storage,又有如下构想:[p109]

  1. Provide programmers with as revolutionary a data model as users
  2. data can live anywhere.
  3. Data is safe from corruption.
  4. Data is quick to get.
  5. Data can be large.

非常令人佩服的远虑。 如果一个项目能同时实现其中3个目标,就已经能实用并吸引客户,开始赚钱了。 但是Chandler 项目的同志们不满足于只实现两三个,他们要实现全部5个梦想。

一群牛人在 “没有近忧,只有远虑” 的条件下讨论问题,最后只能议而不决。 在一次次延续到深夜的讨论中,有人感慨 - "How is this night different from all other nights?" //[p110]

没有近忧,或者说不用为近忧而负责 - “我们这个月的目标没完成不要紧,但是我们的远景一定要讨论好”。 导致了项目不能收敛 - 一个项目的一个里程碑中,不确定的事情应该越来越少,bug 也越来越少,直到产品发布。

Making firm technical choices was hard in the absence of a settled design, and settling on a design was hard in the absence of a technical roadmap. [p150 - 151]

正因为大家没有近忧,所以大家可以继续等待,设计要等技术决定后才好做,而技术的选择要等设计决定后才好开始。就这样,大家折腾到2005年的时候,他们才从高瞻远睹的远虑的云端中下来,有了第一个脚踏实地的计划:

But for the first time, at least, they could see they had a plan grounded in reality, rooted in estimates that ... [p232]

Kapor 毕竟是聪明人,很多年以后,他说到了教训:

We've consistently overinvested in infrastructure and design... [p342]

收敛的另一个特点是 - 做过了的决定,就要执行,不要反复。事实上,Chandler 团队在很多决定上摇摆不定。 架构师Hertzfeld 度假回来,发现他带领其他同事奋战一个夏天得到的 Document Architecture 被扔到一边,原来 Kapor 决定 “We'll have to come back and realign things”  [p168]。 如果你是做义务劳动的 Hertzfeld,你还能做下去么?

回到 “远景”, 我相信几乎没有合适的解决方案能满足“远景” 中的所有要求,很难找到 “多快好省” 的解决方案(书中提到 fast|cheap|good 不能兼得,这也是MSF 中 time | resource | feature 三个元素的矛盾)。但是往往存在若干方案,从不同的角度逼近最优,但是有各自令人讨厌的缺点。我们能否有智慧来选择这样一个方案,把近忧,远虑都慢慢解决?

我自己在微软正在做一个创新项目,前几天一位加入这个项目不久的优秀的开发人员对我说,我们去年设计的数据库问题太多了,如果我们早就像我这样设计,估计会好很多。我不是数据库的专家,我只能对他说,如果我们当时坚持要做到今天这样才发布,这个项目也许就做不到今天了。

换句话说,正是因为早期那些不完美,但是及时的设计,让后来者有挑剔这些不完美的奢侈机会。

我们每个人在使用这些不完美的软件(Windows, Outlook, 甚至Linux)的时候,都应该感谢当初设计者做出了正确决定,而那些坚持完美设计远景的项目,它们都到哪去了?

这篇关于梦断代码 读后感(III)远虑和近忧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839553

相关文章

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by