面向健忘软件工程师的 .NET 脑力转储设计






2.12/5 (7投票s)
2004 年 12 月 9 日
13分钟阅读

78236

1012
在实际设计或编程之前,捕获、存储、查询和转换快速笔记和图纸。
引言
如果您想在不先了解一些背景信息的情况下阅读有关代码的内容,请转到名为使用脑力转储的部分。
本文档仍在进行中,包含使用 XML、Forms、网络、数据库和 Web 的 C# 示例。随着时间的推移,我将添加 C# for .NET 的示例设计。本文的代码使用了 Microsoft .NET 1.1 SDK、DotGNU Portable.Net(请参阅 Linux 的 build.sh 和 run.sh)以及 Mono(尚未成功运行)中提供的 C# 和 .NET 的便携式子集。我选择 C# 来开发此项目,因为它拥有强大而扩展的 API(XML、网络、GUI),并且可以轻松访问几乎所有平台服务(数据库、Web)。本文中的思维导图是使用 FreeMind 生成的。此处显示的思维导图包含在上面的演示下载中。
为了获得竞争优势,或者仅仅是为了能够工作,软件工程师通常会开发自己的一套软件设计和编程工具、宏和库。通常很少会产生设计和文档,并且这些项目处于不同的开发和调试阶段。这就是程序员的工具棚(或阁楼)。
主要问题是
- 当我需要时,我如何找到任何东西?
- 我如何记住这些项目的目的、设计和实现?
- 我能多快地将这些东西转化为产品和文档?
- 删除和废弃过时项目的标准是什么?
多年来(因此 API 版本不同),在不同编程语言和多个平台上,相似想法的多个化身使这些问题更加复杂。
而市场上常见的工具数量也让这一切变得不那么容易。
- 用于桌面的黄色便签;多个 Windows 应用程序,看起来像真实的 PostIt (TM) 便签。
- 概念和对象的图/地图;自由定位的标签与 Visio 中绘制的线条混合,或 ViewYourMind / FreeMind / MindManager。
- 数据库;包括掌上电脑和手机上的卡片数据库。
- 文件系统;文件夹和文件的森林。
- 文档管理系统;大量的项目、版本、笔记、超链接。
背景
脑力转储规范。
这一切都始于阅读关于 Lucy the robot 和书籍 Growing up with Lucy。
如果我写出的软件能匹配大脑的工作方式,而不是训练我的大脑像计算机一样运作呢?这就是经典的“让计算机为我服务,而不是我为计算机服务”。
应该可以设计一个“对大脑友好”的软件,它将在软件开发工具(例如 Microsoft 和 Borland 的 IDE 产品)之前使用。该程序将捕获并允许利用“可用的快速笔记和图纸”。最后,大多数软件包都针对特定类别的用户(初学者、专家、办公室职员、软件工程师);这个项目针对的是“健忘的程序员”。
对大脑友好
在传统的专业 IT 环境中,软件是为特定目的而编写的,并且将在一个静态的固定版本中使用多年。这不适合真正的思维导图。线性的固定向导式大脑捕获方法将无法胜任。兼容脑力转储的思维导图工具应
- 允许使用各种思考技术,提示用户输入一些想法(短笔记)和图纸;这里引入了 De Bono(和其他人),例如参见 Lateral Thinking。
- 允许用户编辑捕获的想法(文本或图纸)的属性并添加解释。
- 生成一些元数据(或通用符号),以便将脑力转储通用地转换为其他对象(例如,新产品的一部分)。
思维提示
为了充分发挥其绝妙的想法,软件工程师需要各种“捕获技术”(或思考方法,根据 De Bono 等人)。这些可以在软件中通过向导、受限的“游戏”(参见现代 FPS 游戏,其中场景迫使玩家遵循预设路径)或思维导图捕获工具来实现。
例如,如果您采用现有的任何思维导图程序,一个兼容“脑力转储”的版本将被配置为允许使用 De Bono 的任何技术输入(如果选择了“De Bono”模式)。
在“思维帽”技术的情况下,对于任何给定的根节点(正在倾倒的大脑部分),将只有六个子节点(六个思维帽)。在输入阶段,任何时候只有一个子节点可以处于活动状态,并且按选定的顺序。这些输入约束是一个关键的思维过程,依赖于一次只戴一顶帽子,并按适合所寻求目标的顺序进行。
另一个特点是添加(和删除)约束。在设计制造工厂的例子中,可以添加额外的、非法律要求的约束,例如环境保护、使用有机非转基因材料、隔音。在总成本分析期间,整个供应链会被绘制到思维导图中,并且尽管这些人工约束不必全部保留,但它们会引导思维过程朝着更便宜的工厂设计方向发展。这表明通过设置额外的约束可以帮助倾倒大脑。
相反,移除约束(尽管它们是真实的且不可避免的)有助于形成一个不显而易见的设计,当您清楚地看到问题的解决方案,但缺少所有中间步骤(或部分中间步骤)时。通常在初始设计阶段,一些人会倾向于将其留给其他人来解决。
#include <miracle.h>
暂时移除所有约束有助于找到设计的所有中间步骤,然后当重新添加约束时,人们常常会意识到这些约束根本不必被移除。
这表明,通过不首先考虑约束,可以帮助倾倒大脑,因为这些约束可能会掩盖大脑中存在但由于看起来像障碍物而“回避”的想法。
这是原始捕获的第一步。通常,一些初步的后处理(润饰)可以为最终转化为产品做准备。
思维导图节点的属性页
捕获后,可以为创造的宝石赋予评分卡(质量因子)、故事线中的位置(逻辑/哲学上的优先顺序,不一定是时间顺序)、一组约束(或限制/阻塞想法、概念或失败实现的示例)以及一组相关性指示器,通过添加使用多个节点之间跳跃的所有估计,或通过使每个想法与其他所有想法连接起来,将每个想法与所有其他想法链接起来。
然后,思维导图 GUI(如 FreeMind,见上文)将始终首先显示最相关的想法(有点像 Internet Explorer 的“后退”按钮的历史记录,但以图表而不是列表的形式)。
此时,脑力转储已准备好进行最后一步:标准化。
元数据和通用语言
在尝试解决问题或编写新软件时,大脑有时能够在实际设计和编码之前就看到解决方案。想出设计和实现通常是一个转换过程,从程序员大脑中的解决方案开始,然后她将其写在纸上。其中一些可以自动化(或外包给其他人),但前提是她的笔记能够在正确的上下文中被理解和阅读。
在简单的情况下,思维导图是用英语书写的,元数据(例如,proto UML 类型)也是用英语。这使得将思维节点转换为初始 UML 图和初始编码模板向导变得容易。
然而,对于地球上的大多数人来说,脑力转储过程是以英语以外的语言进行的。目前为 PC 组件编写软件的软件工程师(主板 BIOS 是一个很好的例子)可能会用中文进行思考和设计。将用中文写的思维导图翻译成计算机编程语言以供普遍使用(即与其他人的共享)通常意味着用英语编写所有文档和实际代码。
因此,任何兼容脑力转储的思维导图工具都应该允许使用预定义的、可国际化的元数据属性来编码其数据(脑力转储)。这将允许将脑力转储转换为几乎任何内容(Word/Excel/Project 自动化、数据仓库馈送或数据挖掘控制、英语查询配置、UML 预生成、C# 基本类模板向导等)。在翻译过程中,所有选定的思维导图节点都需要翻译成英语,然后可以将其反馈到脑力转储中(如果尚未存在)。
即使是从母语英语翻译到特定应用程序的英语(例如行业术语),也需要这个翻译阶段。现在和将来,初始词汇(例如 Longhorn)在产品发布前不久会被营销(或用户)修改。
处于这种准备就绪状态的脑力转储由注释过的快速笔记和图纸(或 3D 模型,可能带有物理特性)组成。
可用的快速笔记和图纸
本节的主要灵感来自 Microsoft Data Transformation Services 和 English Query,正如 SQL Server 7(和 2000)所介绍的那样。DTS 允许用户设计可以执行的数据转换图。English Query 帮助设计英语语言和数据库字段之间的映射。因此,一个精心包装的脑力转储可以自动转换为数据库(DBMS、OLAP 或 XML),然后映射到英语以便进行进一步的查询。
对于图纸,需要矢量格式或 3D 文件格式(例如带有内联行为和物理参数的 VRML 文件)。可以演变成产品的图纸示例:列奥纳多·达·芬奇的蓝图,被捕获为 3D 模型,导出到 CAD 包,最终由工程师用于制造原型。
所有这些结构良好的数据现在都可以用来为设计和编码新产品的软件工程师提供一种非常具体的帮助:提供上下文相关且适当的提示。程序可以被视为“读取程序员的思想”,或者至少是预测/推断 UML 图和 C# 代码模板的结构和命名。
健忘的程序员
此项目的目标受众和用户:健忘的软件工程师(大脑中充满了完整的 API 规范和整个 UNIX 命令行手册页,更不用说计算机设备的单个零件号)。任何这样的人的大脑都会随着时间的推移,有时甚至在同一句话中,产生矛盾的概念、好主意和坏主意、现实的计划和理想主义的计划。任何捕获这些想法的软件都必须接受全部内容,没有任何阻碍(没有 IDE 的红/绿下划线,没有编译器的警告/错误,没有运行时异常,如“概念引用了无效的概念,正在倾倒核心...”)。
然而,在设计和编码阶段(不属于本文范围),脑力转储的内容可以用来补充现有 IDE 的代码完成功能,实现“结构和命名完成”。
使用脑力转储
这是一个使用脑力转储思想的示例设计。
在我们开始查看代码之前,先就编码风格和技巧做一些一般性的说明。
- 使用斜杠星号星号(而不是斜杠斜杠斜杠)进行文档注释。
- 由 csc /doc 创建的文档文件(请参阅 braindump_src.zip 中包含的 build.bat)
- Internet 贡献的 C# 文档样式表(毫无疑问,您可以从本站使用更好的 ;-))。
- 接口定义用于允许未来的扩展或不同的实现(此处使用了 COM 接口设计建议)。
设计中有五个阶段
- 大脑捕获。
- 捕获的大脑内容存储。
- 捕获的大脑查询。
- 捕获的大脑转换。
- IDE 扩展(用于 UML 设计和 C# 实现)。
大脑捕获
这与人工智能(或专家系统)不同,因为它不假定要捕获的大脑是专业的或连贯的。捕获大脑也应该允许矛盾,并且不应该对脑力转储进行评论,也不应该改变原始思维。它所做的是促进想法的诞生,并允许注释和排序笔记和图纸。
代码:笔记和图纸的图形 GUI
C# .NET Forms,标签自由放置在可滚动面板上,通过线条和箭头连接。
规范是关于
- 一种对大脑友好的想法捕获方式,可以按任何顺序,无论捕获顺序是否有明显的逻辑。例如,VYM 和 FreeMind 强制使用单个根节点(主要思想),每个子节点可以有多个子节点;然而,这是一个树结构,而不是图(不允许循环)。
- 节点(想法、想法、快速笔记、图纸)可以是独立的,也可以是根节点(任意数量),或者与其他任意数量的节点链接。
- 每个节点可以有一个或多个父节点。
- 在父链接和子节点链接之间进行选择完全取决于被捕获大脑的主观选择。
- 需要提供不同的节点布局选项,至少提供一个低调视图,屏幕上显示非常少的节点(以模仿大脑短期记忆的明显浅层容量)。
在本文中,我选择了一种可扩展的设计(基于接口)
- 一个主 `IBrainDump` 接口,它公开任何脑力转储应用程序(或窗体)的 API。
- 所有视图的 `IBrainDumpView`(捕获、存储管理、查询、转换)。
- `IBrainDumpCapture` 用于捕获视图。
- `IMindMap` 用于捕获以思维导图形式呈现节点(想法等)的视图,类似于 VYM/FreeMind...
- `IMindMapLayout` 用于布局思维导图。
- `IMindNode` 用于脑力转储视图中的节点(想法、想法、快速笔记、图纸)。
示例实现(请参阅附件源代码 ZIP 文件)包含以下类
- `BrainDump` 主演示类,包含 `Main` 方法。
- `MainForm` 一个实现 `IBrainDump` 的 `System.Windows.Forms.Form`。
- 各种实用类,用于实现菜单和工具栏。
- `MindMapPanel`,一个 `System.Windows.Forms.Panel`,实现了 `IMindMap`。
- `MindMapLayout` 一个实现 `IMindMapLayout` 的对象。
- `MindNode` 一个实现 `IMindNode` 的 `System.Windows.Forms.Button`。
第一遍
- 用户界面;主菜单、工具栏、思维导图区域(带按钮的面板)、工具提示和上下文菜单。
- 编码风格; GUI 元素的子类化。
- 请参阅附件 braindump_src.zip 中的文件;braindump.cs。
捕获的大脑存储
XML(文本文件)和数据库。FreeMind 生成的思维导图是 XML 文件(但扩展名为 .mm 而不是 .xml)。此代码示例将加载 XML 数据并在 .NET Panel 上显示为标签(点击时为编辑框)和线条/箭头。
代码:XML 加载和保存,数据库
C# .NET XML,数据库创建、管理、访问。即将推出...
捕获的大脑查询
网络和 Web,英语查询,OLAP 多维数据集,数据挖掘。
代码:XML 查询,数据库查询和报告
C# .NET XML,数据库 SQL 查询,Web。即将推出...
捕获的大脑转换
DTS,清理,归档,废弃(删除)。还包括变更管理、风险评估、后果可视化。
代码:多线程,外部程序调用
C# .NET 线程,外部操作系统接口(Windows、Linux),便携式代码,国际化,多平台支持。即将推出...
关注点
C# for .NET 使我能够以便携的方式展示我的想法,并让读者能够自己编译、运行、测试、基准测试和判断。尽管需要编写相当数量的软件,但通过利用现有的高级 API 和服务(最著名的是基于 COM 的 Microsoft SQL Server),这项任务变得更加容易和可管理。本文是使用迭代过程编写的,其中使用了文章中描述的思想和工具。
可能会提出一个扩展现有 IDE 代码完成功能的建议,以允许“结构和命名完成”,这也许是另一个 IDE 扩展文章的主题。
历史
- 2004/12/17,进行了一些清理,添加了资源和版本信息。
- 2004/12/16,布局工作基本完成,线条绘制仍待完成。
- 2004/12/13,对初始 GUI 进行了更多工作,几乎完成了(布局和线条绘制仍待完成)。
- 2004/12/11,修复了拼写错误,添加了一些代码。
- 2004/12/10,添加了初步内容(第一个演示文件,尚无源代码)。
- 2004/12/09,撰写了标题和关键字。