编程离软件工程有多远?

2023-10-27

原文地址: http://kb.cnblogs.com/page/160717/
作者: 周爱民  来源: VeDa原型  发布时间: 2012-10-19 11:31  阅读: 5135 次   原文链接    全屏阅读   [收藏]  

  语言只是工具

  我曾经是非常执著的开发人员。我有连续几天几夜 Coding 的经历,也曾经为了一个技术问题耗上三四个星期而导致项目一再延迟,还曾经为了一个实现细节与项目相关的人员逐一争论。

  我也曾经像大多数的开发人员一样热衷于争论语言之间孰优孰劣。我在“Delphi大富翁论坛”上写过一个简介,其中个人特长是“擅长 Turbo Pascal、Delphi、TASM 系列语言,痛恨 C/C++。(凡见有价值之 C 代码,先读通,后写成Pascal/Delphi,最后骂一句:C 写得真笨!)”。我至今保留这段文字,因为那的确是真实的经历。

  如今我已经不再专注于语言,正如我在第一章中写到的一样:成天讨论这门语言好,或者那门语言坏的人,甚至是可悲的。

  然而就在我写这段文字之前的一年,我还在写《Delphi 源代码分析》,我还在无休止地深入语言的细节,深入操作系统的细节,以及深入……开发的细节。

  就在 2004 年 3 月间,我接受一个朋友的邀请,去北京做一个名为“Delphi &Delphi .NET 源码分析”的专题培训。我用了近两周的时间,做了 50 页的幻灯,全面讲述 Delphi 和 Delphi .NET。然而在临行前的一晚,我辗转反侧,一直在思考一个问题:我究竟做了些什么?或者说,我究竟想告诉学员些什么?

凌晨 5 点,我在幻灯的末页后面插入了一张幻灯,标题是“语言只是工具”,而幻灯的内容是下面这样一张图。

  这是与培训完全无关的一张幻灯。然而,这是我自 1997 年接触到管理,以及 1998年接触到工程以来,第一次正视“软件工程”这四个字。我第一次看清楚代码、方法、过程、工程与组织的关系!

  对于一个程序员,或者以程序员自命的人来说,看清楚这一切的第一步,竟是一句“语言只是工具”!猿之于为人,“学会制作和使用工具”是最重要的标志。因而我不知道“语言只是工具”这句话,究竟是对语言的膜拜,还是漠视。

  然而从那一刻开始,我才真正地知道工程。

  关注点

  在前面的模型图中,每一条纵向的细线用于定义一个关注点。我在另一次培训中为这些关注点加上了标注,如下图所示。

  这被我命名为软件工程层状模型(EHM,Engineering Hierarchy Model)。EHM 模型不描述工程元素间的关系,甚至在试图割裂这些元素,以使得工程角色定位及各自的视角更加清晰明确。

  从这个模型中可以看到,在“程序”与“方法”层面,是关注于“(具体的)实现”的;而在“过程”和“工程”层面,更首要考虑的是团队问题。从角色的角度上来说:开发经理思考项目的实施方案和管理具体的开发行为,而项目经理则保障团队的稳定性和一致性。

  程序

  EHM 模型图中,在最内层的环里,是“程序=算法+结构”。这是编程的本源定义,也是原始的状态。与代码相关的任何工作,最终仍旧会落足于这样的一条规则。

  编程的精义在于此。从有开发行为开始,它就存在了。愚公在数千年前就在用类同的行为做编程实践,而几十万年前的智人,也在循环与分支所构成的逻辑中打转。

  方法

  推动这种逻辑向前发展的,是“方法”和“方法论”的出现。长期的编程实践,自然的归演与总结,必须沉淀为某种(软件开发)方法,于是“过程”出现了,于是“对象”出现了,于是相关的方法论也就出现了。

  这是实践的成果。方法不是某个人或者某个组织创造的。瓜熟而蒂落,实践积累达到一定的程度,微软不提出某个方法,IBM 也会提出这个方法。即便他们都不提出,可能你自己已经在使用这个方法了。

  方法并不神秘,因为它就是你今天正在做的、从事的和实现的。正如“模式”是一种方法,而模式就是你昨天书写代码的那个行为。只不过,GoF 归纳、抽取、提升了这些行为的内在规律。

  你看不到你做事的行为,也就不能理解“模式”作为一种方法的价值。所以大师们众口一词:模式需要一定的编程经验才能理解。

  同理,理解过程也需要编程经验,理解对象也需要编程经验,理解 MDA(模型驱动架构)与 SOA(面向服务的体系结构)还是需要编程经验。

  ——这可能就发生在你去回顾你的上一行代码编写的经过,或者上一个项目失败的经历的那一瞬息。经验来源于回顾、理解与分析,而不是你将要写的下一行代码。

  有人在寺院扫了一辈子的落叶而得道,也有人因为一句话而得道。

  GoF 因为无数次的代码回顾而得道。

  过程

  过程伴随工程而出现。过程解决的是工程中角色间的关系问题。

  过程说的是很多的人(团队)如何组织在一起进行开发的问题。它首先把工程中的环节分解出来。这样,有了环节,就有了角色;有了角色,就有了沟通。

  因此过程中的问题,就是角色、沟通和环节的问题。哪些环节重要,取决于具体的编程行为,也就是具体的项目。

  例如产品开发的周期可以一再拖延,因为对产品来说,更重要的是品质和技术壁垒。因此你可以看到暴雪公司(Blizzard)的游戏总是一再跳票,而它从来都是将大幅的玩家测试和开发人员的个性特征放在第一位。与此相同,DOOM 与 QUAKE 系列的灵魂就是在游戏引擎的开发和设计上。

  如果用这样的模式去做项目,可能软件公司没死掉,工程需求方也被拖死掉了——你有看见客户因为你对技术的远景描述而憧憬吗?不,你只会看到他们因为项目的一再延迟而懊恼、沮丧,或……暴怒。

  憧憬这种事情,只会发生在那些铁杆玩家的身上。

  分不清玩家与客户的区别,对项目经理来说,是可怕的。这将意味着他不能清楚地知道哪个环节更加重要。

  角色的确定,以及角色间的沟通问题,在项目过程中也同样重要。工程组织是否合理,相互的协作是否紧密,是这个项目能否成功的保障。

  “合作无间”通常是流于书面报告中的措辞。真正的“无间”,应当是沟通的结果。然而 UML,则可能是你与客户,以及项目经理与开发人员被“离间”的第一因素。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程离软件工程有多远? 的相关文章

随机推荐

  • FDR土壤水分检测传感器设计方案

    频域反射法 FDR FDR通过发送特定频带的扫频测试信号 在导体阻抗不匹配处会产生较强的和发射信号同样频率但不同时段的反射信号 通过傅立叶转换方式分析这些信号 并且通过量测反射信号峰值的频率换算出到线路障碍点的距离 频域反射法 FDR 利用
  • Spring——三级缓存解决循环依赖详解

    三级缓存解决循环依赖详解 一 什么是三级缓存 二 三级缓存详解 Bean实例化前 属性赋值 注入前 初始化后 总结 三 怎么解决的循环依赖 四 不用三级缓存不行吗 五 总结 一 什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形
  • C++容器之list

    简介 List是一种可在常数时间内在任何位置执行插入和删除操作的顺序容器 list是双向链表 其迭代器是双向的 与其他顺序容器 array vector deque 相比 list容器在任意位置执行插入 提取 和移动元素的操作更高效 但它不
  • "XXXXX" doesn't include the application-identifier and keychain-access-groups entitlements.

    前日真机调试 报错如下 Showing All Messages Automatic signing is unable to resolve an issue with the xxxxx target s entitlements Au
  • 中国天气网-天气预报接口api

    中国天气网地址 http www weather com cn 请求服务 查询实时天气信息 http www weather com cn data sk 101110101 html 在浏览器中输入请求地址 获得西安的天气 其中10111
  • 怎样引用另一个js文件中写好的函数

    index js function subForm return axios url employee testget method get 在浏览器环境中使用 window myModule subForm subForm 或者在Node
  • opengles3.0源码下载

    The sample code for the OpenGL ES 3 0 Programming Guide can be downloaded from https github com danginsburg opengles3 bo
  • Hook技术3 建立远程线程的方法

    Hook技术3 建立远程线程的方法 分类 Hook技术心得 2008 08 31 20 00 400人阅读 评论 0 收藏 举报 hook null winapi attributes windows module 这是我觉得一种非常好的H
  • 修复dubbo注册中心警告bug

    1 dubbo注册中心服务提供者界面显示警告 点击提示不同服务名注册了相同服务 这是界面显示逻辑bug 源码文件位置 dubbo admin src main webapp WEB INF templates governance scre
  • EGE-UNet, 轻量化U-Net

    随着transform 的出现 现在语义分割网路结构越来越复杂 轻量化网路也较少了 有些轻量化也只是名义上的轻量化 今天我看到一篇很好的论文 上海交大发表在 MICCAI 2023 的最新研究工作 一个称为Efficient Group E
  • 干式真空泵原理_如何安装干式墙锚在墙壁上悬挂重物

    干式真空泵原理 If you ever plan to mount something to the wall that s even remotely heavy you ll need to use drywall anchors if
  • 干货分享——产品经理必备的技能:专业技能和软技能。

    TOP1 沟通 作为一种软技能 沟通不是多种语言或激动人心的演讲 善于沟通的人能够根据听众的不同 调整自己的语气和风格 理解并有效地执行指示 向同事和客户解释复杂的问题 沟通也是领导力的一个重要方面 因为领导者必须能够清晰而全面地授权 TO
  • RISC-V学习笔记【系统设计】

    蜂鸟E200系列处理器简介 特色 开源 免费 高能效比 针对IoT领域设计 支持RV32I E A M C F D等指令子集和机器模式 2级流水线 功耗和性能均优于主流商用的ARM Cortex M处理器 提供完整的配套SoC 包括中断控制
  • C++使用curl实现https、http通信

    curl实现https http通信 curl实现https http通信 代码实现 依赖库和实现类文件 添加Body curl实现https http通信 代码实现 post http int CHttpClient Post const
  • GIt 上传

    自从使用github以来 一直都是在github网站在线上传文件到仓库中 但是有时因为网络或者电脑的原因上传失败 最重要的原因是我习惯本地编辑 完成以后再一起上传github 看过了几个教程 总结出最适合自己的比较简单的方法 两种方法上传本
  • 微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    原文地址 http skaka me blog 2016 04 21 springcloud1 不同于单一架构应用 Monolith 分布式环境下 进行事务操作将变得困难 因为分布式环境通常会有多个数据源 只用本地数据库事务难以保证多个数据
  • 14:00面试,14:06就出来了,问的问题有点变态。。。

    从小厂出来 没想到在另一家公司又寄了 到这家公司开始上班 加班是每天必不可少的 看在钱给的比较多的份上 就不太计较了 没想到5月一纸通知 所有人不准加班 加班费不仅没有了 薪资还要降40 这下搞的饭都吃不起了 还在有个朋友内推我去了一家互联
  • eclipse环境问题-java版本不兼容

    https www cnblogs com hellowhy p 9651559 html
  • 离线地图显示连接服务器未打开,如何在uwp中使用OSM离线地图?没有可用的互联网连接时出现问题...

    在脱机映射运行良好的情况下 OSM的所有位图都来自同一台计算机上的localhost服务器 一切正常 可以看到我的所有地图 但是 如果wifi未连接到互联网 则该地图将完全停止工作 并显示黑屏 wifi关闭时 我已经测试了服务器 并且似乎在
  • 编程离软件工程有多远?

    原文地址 http kb cnblogs com page 160717 作者 周爱民 来源 VeDa原型 发布时间 2012 10 19 11 31 阅读 5135 次 原文链接 全屏阅读 收藏 语言只是工具 我曾经是非常执著的开发人员