热门标签 | HotTags
当前位置:  开发笔记 > 开放平台 > 正文

【畅言】软件工程的根本问题

软件工程基于思维承载之物的特质,必然会有清晰的适用边界。但实际上恰恰与此相反,每当一种工程方法出世的时候,它的作用总是潜在的有扩大的趋势,似乎一旦锤子在手之后,所有身边的东西就都变成了应锤一锤的钉子


软件工程存在什么问题?直接讲这一问题是:当一个人一个组织提倡一种方法时,不单要阐明方法自身,还要阐明方法自身的边界。而不是潜在的认为每一个自己创建的方法都是全能型的。

因为软件是一个庞杂的概念,基于其本质(参见:你真的了解软件开发的本质吗?)来看只有设计模式、正交、信息隐藏这样基于纯粹思维的东西有可能是共通于所有软件的,而软件工程由于更多的要基于思维承载之物的特质,所以必然会有比较清晰的适用边界。

所以说更合理的状态是不只要有通用的软件工程,也应该有适用于互联网的软件工程,适用于国防部软件的软件工程等,后者才是真正面向实践的。敏捷,CMMI这类东西在描述方法的同时既要描述自己的方法论本身,也要描述自己面临的约束和适用边界。最好能说清楚,自己哪些东西是变量,面对哪类现实时要进行何种伸缩。

但实际上恰恰与此相反,每当一种工程方法出世的时候,它的作用总是潜在的有扩大的趋势,似乎一旦锤子在手之后,所有身边的东西就都变成了应该锤一锤的钉子。

这有市场的因素,因为扩大了后相关生意更好做一些,也可以拿到一些奖励什么的,但更多的还是因为自身并不做太多思考。作为一种结果,过去十年里种种方法论兴亡过手,但开发水平很可能并没因此而提高多少。有点年纪的人大致应该记得由ISO到CMMI,再到敏捷的故事。当前应该是敏捷正处在兴盛期,但反敏捷的声音已经出现。

这进一步导致了一个奇葩的结果:现场的人非常反感软件工程,说:我一看到软件工程的书我就略过。很多人不再相信什么工程方法,更多的跟着感觉走,但与此同时则是《人月神话》中描述的猛犸象挣扎于焦油坑现象一再上演。

如何定义或寻找方法论的边界

那究竟怎样才能去定义或寻找一种方法论的适用边界?

如果把所有影响软件的因素都涵盖于软件工程之内,那么这事儿就变成无边界的了,财务、公司运营、市场营销全对软件有影响,如果把他们都包含到软件工程的概念内,软件工程就变成了四不像,什么都是可也什么都不是。

这点上可以向经济学家取经,经济学家研究经济学的方法是:先假设某些因素不发生变动,进而观察几个特定因素的变化和关系。

 我们可以先抽去商务因素、市场因素对软件的影响,寻找本质规律,用的时候再把商务因素、市场因素的权变加回来,看看如何弯曲本质规律以适应现实。

 好比我们随意画圆的时候画出的圆很容易是不理想的,但只要我们知道了圆的理想方程,我们就总可以画出尽可能完美的圆。

带边界和约束的方法论示例

下面说个例子来看看这种带边界和约束的方法论可以是什么样子。一般来讲做软件的时候我们总会谈到自顶向下与自底向上,前一个在设计上还有个专有名词叫:Big Up Design Front。理想中的瀑布模型是比较纯粹的自顶向下,而迭代则是自底向上多些。

从开发模型的角度看,它们看着是对立的,但如果你把开发模型看成是最佳组合人与事的方式时,这种对立就会消失。

瀑布模型下,把软件构建的活动分解为:需求、设计、编码、单元测试、集成测试、系统测试等环节,并期望逐步推进。这一开发模型似乎从诞生那一天起,就开始饱受批评,比如被指摘不能很好的应对需求变化等。但这一模型根基是工作分解间的时序和因果关系,其本身并无错处。

其成立前提和适应场景是:

  • 有人能够预先了解要开发产品的各种细节
  • 成员能力差异明显,构成明显的金字塔结构(少量极其优秀的人和较多能力较弱的人)

简单来讲就是在“想的人”对问题域非常清楚的情况下,比较彻底的分离想和做,最终“做的人”不用想。

虽然敏捷类思想不太考察这个维度,但事实上当组内一个人极度优秀,而其他人员平均水平比较差的时候,从项目的角度看,比较适合偏向瀑布,而不太适合导入敏捷类的迭代。

这个时候使用瀑布,可以获得更佳的生产率---当然你不能走极端,把瀑布绝对化。

但同样是使用瀑布模型如果上面的条件不具备,就会导致灾难:

没有合适的人确定需求,大部分勉强决定的规格可能完全没有意义。设计如果只是纸上谈兵,编码的人又无法修改,那么就会发生无休止的讨论,加剧内耗。

也就是说,假如说团队中的成员A,在经过一定的思考后可以预见到当前的实现方法会导致性能问题,那么就比较适合预先把应对措施定义下来(即使是Big Up Design Front),而不能等迭代出问题再进行解决,后者的内耗明显是高的。

从上面的例子里我们可以得到两个彼此关联的结论:

  • 人和项目特征决定了开发模型,而非反过来需要根据开发模型来调整人员配置等。这是因为在特定时空背景下,调整人和项目特征的可能性小。
  • 假如人和项目的变化是连续的,那么无疑的绝对的瀑布和迭代之间程度的变化也是连续的。作为结果,大多时候最优的开发模型必然既不是绝对的瀑布,也不是绝对的迭代,而是一种具体情境下的选择,可能偏向于瀑布,也可能偏向于迭代。

开发模型的价值就在于,如果我们能够在连续中找到这一最佳平衡点,在这一点上内耗最低。

这种对方法论的描述无疑是与许多教科书上相差很大的,但我比较相信这才是一种正确的方式。

结束语:关于行文方法

近来在《畅言》这个栏目里发了几篇文章,有时候会被抱怨看不懂,装什么的。我对回这类评论没什么兴趣,但比较想解释下自己的写作方法。

我写东西一般是《几何原本》式的:基于几个显然成立的假设,进行逻辑推理,只在特别需要的时候求助于数据和个人判断。这在IT圈子里好像有点特别,我不知道还有谁这么干(大家如果看过《大道致易》可能会发现周爱民同学有点这个路数)。这么写的好处是逻辑严谨;坏处是会比较抽象,读起来没故事的感觉,会觉得比较硬。我比较相信读者如果跟着走下来会有些收获的。

我个人其实是个懂技术的管理人员,因为喜欢哲学,所以对技术、对管理等做了些哲学式的思考,有点偏理论。接下来会零散的观点陆续整理下,发在这栏目里,与大家切磋下,这些观点符合逻辑,可能会比较另类,但只要与逻辑和事实相符,个人其实不太在意与多少人观点不一致,何况在思考上世上也没那么多高手,人云亦云的还是多些。再接下来应该会在实践V众投上花更多时间,偏宏观,本质的思考类事情会做的少了。写作风格上会尽量控制,让它容易懂些。

当然我也很欢迎大家指出真正错误的地方,有的话也可以发在畅言这个栏目,毕竟有这种真正的切磋,才会有真正的进步么,瞎骂的就算了。

作者介绍:李智勇,V众投发起人,《完美软件开发:方法与逻辑》作者。目前正在免费发布《程序员生存定律》,微博:李智勇SZ,微信:vfacebook。


《畅言》第八期:【[畅言]让软件公司的管理多一点“灵魂”】不少软件公司的成功是源自产品、人口红利,而不是因为管理,甚至有的公司的管理带来的是负值。这样的公司之所以成功,只是因为正面值太大。而另外一面,现实中很多的软件公司,其管理很可能已经陷入了困境。而这是慢性毒药,带来了恶性循环。如何解决?

《畅言》第九期:【[畅言]你真的了解软件开发的本质吗?】我们总是喜欢用自己的经历来定义软件是什么以及判断标准,但如果这种经历来自完全不同的两个领域,并且互相矛盾,那么就有可能让大家吵来吵去……是的,各位在忙于解决具体问题时,谁还会想到谈谈软件开发的本质?

《畅言》第十期:【[畅言]程序员可以只关心技术么?】不少程序员爱维护喜欢的技术,虽然他们说的有道理,但程序员价值的实现并不取决于技术。模式不一样,程序员价值也不一样,而这也暗含了程序员生涯的两个进阶模式,读完此文,相信你会重新思考个人生涯发展方向。

《畅言》是CSDN新栏目,供大家各抒己见。只要你看完CSDN文章或评论后有话说,都可以通过电子邮件(zhangyong@csdn.net)投稿,从而获得上CSDN首页表达自己观点、想法的机会。《畅言》不怕观点“雷人”,只要你逻辑表达清楚、数据引用可靠,你敢投稿,我们就敢首页!欢迎大家畅所欲言。


推荐阅读
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • QQ推出新功能:个性化QID身份卡
    您是否还记得曾经风靡一时的即时通讯工具QQ?近日,QQ悄然上线了一项新功能——QID身份卡。这项功能将如何改变用户的社交体验?本文为您详细解读。 ... [详细]
  • 新浪微博热搜暂停更新;即刻APP回归;Android 11 Beta版发布 | 科技新闻速递
    为您带来最新的科技资讯,涵盖社交媒体动态、软件更新及行业重大事件。CSDN携手您共同关注科技前沿。 ... [详细]
  • 使用 Vue3 Script Setup 语法糖构建双人联机俄罗斯方块
    作为一名前端开发者,Vue3 是一个不可或缺的工具。本文通过一个实战项目——双人联机俄罗斯方块,详细介绍如何利用 Vue3 的 Script Setup 语法糖进行开发,帮助读者掌握最新的前端技术。 ... [详细]
  • 本文讲述了一位80后的普通男性程序员,尽管没有高学历,但通过不断的努力和学习,在IT行业中逐渐找到了自己的位置。从最初的仓库管理员到现在的多技能开发者,他的职业生涯充满了挑战与机遇。 ... [详细]
  • 微信小程序中的ActionSheet和Picker组件详解
    本文详细介绍了微信小程序中ActionSheet和Picker组件的使用方法及示例代码,帮助开发者更好地理解和应用这些组件。 ... [详细]
  • 本文介绍了实现人工智能的多种方法,并重点探讨了当前最热门的技术——通过深度学习训练神经网络。文章通过具体实例详细解释了神经网络的基本原理及其应用。 ... [详细]
  • 1、什么是过滤器管道使用竖线(|)将两个命令隔开,竖线左边命令的输出就会作为竖线右边命令的输入。连续使用竖线表示第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入, ... [详细]
  • Windows环境下Python和pip命令无法识别的解决方案
    本文详细介绍了在Windows操作系统中遇到Python和pip命令无法识别的问题时的解决方法,帮助初学者快速配置Python开发环境。 ... [详细]
  • 大数据领域的职业路径与角色解析
    本文将深入探讨大数据领域的各种职业和工作角色,帮助读者全面了解大数据行业的需求、市场趋势,以及从入门到高级专业人士的职业发展路径。文章还将详细介绍不同公司对大数据人才的需求,并解析各岗位的具体职责、所需技能和经验。 ... [详细]
  • 美欧计划下周重启数据传输谈判
    据知情人士透露,欧盟法院去年夏天的一项裁决限制了企业将欧洲用户的个人信息传输至美国的方式。主要原因在于,法院认为欧洲客户在美国难以获得有效的法律保护。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • Facebook开发先进AI系统,深入解析个人生活视角
    Facebook正大力投资于增强现实技术,与Ray-Ban合作开发AR眼镜。目前,这些设备主要用于图像的记录和分享,但公司展望未来,认为这些装置将具备更广泛的功能。一个由研究人员组成的团队正在开发先进的AI系统,旨在深入解析用户的个人生活视角,从而提供更加个性化的体验和服务。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • PostgreSQL 与 MySQL 的主要差异及应用场景分析
    本文详细探讨了 PostgreSQL 和 MySQL 在架构、性能、功能以及适用场景方面的关键差异。通过对比分析,帮助读者更好地理解两种数据库系统的特性和优势,为实际应用中的选择提供参考。 ... [详细]
author-avatar
手机用户2502898443
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有