软件开发为什么很难

  问题的分类

  最初在1999年被Dave Snowden开发出来的 Cynefin 框架尝试把世界上的问题划分到了5个域中(大类):

  • 简单(Simple)问题,该域中的因果关系非常明显,解决这些问题的方法是 感知-分类-响应(Sense-Categorise-Respond),有对应的最佳实践
  • 复合(Complicated)问题,该域中的因果关系需要分析,或者需要一些其他形式的调查和/或专业知识的应用,解决这些问题的方法是感知-分析-响应(Sense-Analyze-Respond),有对应的好的实践
  • 复杂(Complex)问题,该域中的因果关系仅能够从回顾中发现,解决这些问题的方法是探索-感知-响应(Probe-Sense-Respond),我们能够感知涌现实践(emergent practice)
  • 混乱(Chaotic)问题,该域中没有系统级别的因果关系,方法是行动-感知-响应(Act-Sense-Respond),我们能够发现新颖实践(novel practice)
  • 失序(Disorder)问题,该域中没有因果关系,不可感知,其中的问题也无法被解决

  显然,软件开发过程更多地是一个复杂(Complex)问题。在一个产品被开发出来之前,不确定性非常高,团队(包括业务人员和技术人员)对产品的知识也是最少的,而且需要大量的学习和尝试才可以明确下一步可能的方向。不幸的是,很多时候我们需要在一开始(不确定性最高的时候)就为项目做计划。这种从传统行业中非常适合的方法在软件开发领域不再适用,这也是敏捷开发、精益等方法论在软件开发中更加适合的原因。

  正因为软件开发事实上是一个学习的过程,我们学习到的新知识反过来会帮助我们对问题的定义,从而带来变化。这里的变化可能来自两个方向:

  • 功能性
  • 非功能性

  功能性的变化指随着对业务的深入理解、或者已有业务规则为了匹配市场而产生的变化。比如支付方式由传统的货到付款变成了网银付款,又变成了微信支付、支付宝扫码等等。一个原始的电商平台仅仅提供基本的购物服务,但是后来可以根据已有数据产生推荐商品,从来带来更大的流量。这些变化需要体现在已有的代码中,而对代码的修改往往是牵一发而动全身。

  非功能性的变化是指随着业务的发展,用户规模的增加,数据量的变化,安全认知的变化等产生的新的需求。比如100个用户的时候无需考虑性能问题,但是100万用户的时候,性能就变成了必须重视的问题。天气预报应用的数据安全性和网络银行的数据安全性要求也大不相同。

  而在业务提出一个需求的时候,往往只是一个简化过的版本。

  非功能性复杂性

  这是一个经过设计师精确设计的界面,在它被设计出来之前,用户事实上无法准确的描述出它。设计过程中经历了很多的诸如:

  • 线框图
  • 颜色的确定
  • 交互的动画
  • 信息层次

  往复多次之后,界面确定了。在没有仔细思考使用场景的时候,开发会误以为这个功能非常简单。但是如果你是一个有经验的开发者,很快会想到的一些问题是:

  • 在宽屏下如何展示
  • 在平板上如何展示
  • 在手机上如何展示
  • 即使仅仅支持桌面版,跨浏览器要考虑吗?支持哪些版本?
  • 有些UI效果在低版本的浏览器上不工作,需要Shim技术

  除此之外,依然有大量的其他细节需要考虑:

  • 性能要求是什么样的?
  • 安全性要考虑吗?
  • 在网络环境不好的时候,要不要fallback到基础视图?
  • 既然涉及发送邀请函,送达率如何保证
  • 与外部邮件服务提供商集成时的工作量

  等等。这些隐含的信息需要被充分挖掘出来,然后开发者才能做一个合理的评估,而且这还只是开始。一旦进入开发阶段,很多之前没有考虑到的细节开始涌现:字体的选用,字号,字体颜色,元素间的间距等等,如何测试邮件是否发送成功,多个角色之间的conversation又会消耗很多时间。

  需求的变化方向

  作为程序员,有一天你被要求写一段代码,这段代码需要完成一件很简单的事:

  1. 打印”Hello, world”5次

  很容易嘛,你想,然后顺手就写下了下面这几行代码:

print("Hello, world")
print("Hello, world")
print("Hello, world")
print("Hello, world")
print("Hello, world")

  不过,拷贝粘贴看起来有点低端,你做了一个微小的改动:

for(var i = 0; i < 5; i++) {
  print("Hello, world")
}

  看起来还不错,老板的需求又变成了打印”Goodbye, world”5次。既然是打印不同的消息,那何不把消息作为参数呢?

function printMessage(message) {
  for(i = 0; i < 5; i++) {
      print(message);
  }
}

printMessage("Hello, world")
printMessage("Goodbye, world")

  有了这个函数,你可以打印任意消息5次了。老板又一次改变了需求:打印”Hello, world”13次(没人知道为什么是13)。既然次数也变化了,那么一个可能是将次数作为参数传入:

function printMessage(count, message) {
  for(i = 0; i < count; i++) {
      print(message);
  }
}

printMessage(13, "Hello, world");
printMessage(5, "Goodbye, world");

  完美,这就是抽象的魅力。有了这个函数,你可以将任意消息打印任意次数。不过老板是永远无法满足的,就在这次需求变化之后的第二天,他的需求又变了:不但要将”Hello, world”打印到控制台,还要将其计入日志。

  没办法,通过搜索JavaScript的文档,你发现了一个叫做高阶函数的东东:函数可以作为参数传入另一个参数!

function log(message) {
  system.log(message);
}

function doMessage(count, message, action) {
  for(i = 0; i < count; i++) {
      action(message);
  }
}

doMessage(5, "Hello, world", print);
doMessage(5, "Hello, world", log);

  这下厉害了,我们可以对任意消息,做任意次的任意动作!再回过头来看看那个最开始的需求:

  1. 打印”Hello, world”5次

  稍微分割一下这句话:打印,”Hello, world”,5次,可以看到,这三个元素最后都变成了可以变化的点,软件开发很多时候正是如此,需求可能在任意可能变化的方向上变化。这也是各种软件开发原则尝试解决的问题:如何写出更容易扩展,更容易响应变化的代码来。

  小结

  软件的复杂性来自于大量的不确定性,而这个不确定性事实上是无法避免的,而且每个软件都是独一无二的。另一方面,软件的需求会以各种方式来变化,而且往往会以开发者没有预料到的方向。比如上面这个小例子中看到的,最后的需求可能会变成将消息以短信的方式发送给手机号以185开头的用户手机上。

崎山小鹿
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件开发困难的根本原因
Easteq的专栏
12-07 2725
软件开发困难的核心是繁琐,是海量的细节的堆积所造成的麻烦。打开随便哪个软件,单独拿出某一段程序,看上去很简单,比如:IF AGE > 6 and AGE 。谁不会写这样的语句?没有经验的经理会问:写这样的东西需要大学毕业生?还是清华的?还要2年工作经验?这还要6个月才能做好?但是当他必须把成万上亿这样貌似简单的,互相关联的语句揉合到一起时,发现自己束手无策了,发现看似简单的东西
软件开发为什么失败?
君子藏器于身,待时而动
07-09 4926
我从事软件开发工作已经有十年了,这十年中,亲眼所见、亲耳所闻,报纸、杂志、网络上有各种各样软件项目开发的经验和教训,总的感觉是,成功的少,而失败的多,有的是部分失败,有的是完全失败,我在软件的开发中,也有许多失败的教训,那么软件为什么会失败呢?对于这个问题的回答,有各种各样的答案,我所经历的软件开发中的失败,总结起来,大概是这么几种: 遇到了技术难关项目管理错误,软件失去了控制。 用户需求变化
为什么建议大家使用 Linux 开发?爽(外加10个感叹号)
dirft_lez的博客
11-05 439
Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上。当我告诉他或者建议他使用 linux 时,会一脸惊讶的问我,那个怎么用(来开发或者日常使用)? 这是我使用了近两年的“国产”操作系统 deepin ,界面美不美观我不知道,能用是肯定的。 关于其他 linux 可以参考: 八款精美的 Linux 发行版!https://www.linuxprobe.com/eight-linux-distribution.html 2018年10大最漂亮的 Linux 发行版 ht
Cynefin框架重新理解不确定性管理
Agilean 的博客
01-25 681
本周三(1月26日)晚8点,吴穹博士也将与技术琐话共同推出一期直播,其中将重点讲解“不确定性”这一主题,欢迎大家来与吴穹博士共同探讨: Cynefin FrameworkCynefin...
【干货】工业软件为什么这么难?
粉丝们务必加入微信粉丝群
06-22 2631
全文字数4800字阅读时间11分钟文章由知识自动化(zhishipai)授权转载工业软件中几乎最难啃的三座大山,就是CAD、CAE和EDA,大山中间还穿插了许多小的丘陵,如CAM、拓扑...
敏捷项目管理(SCRUM+看板+极限编程XP)
06-04
<img src="https://img-bss.csdn.net/201906041218355994.jpg" alt="" /><img src="https://img-bss.csdn.net/201906041218515773.jpg" alt="" /><img src="https://img-bss.csdn.net/201906041218594760.jpg" alt="" /><img src="https://img-bss.csdn.net/201906041219054538.jpg" alt="" />
软件开发究竟是“难”还是“复杂”?
03-23
 软件开发的难度更多的类似于后者,表现为繁杂,而不是类似于前者表现为“搞不定”或“做不出来”。总是有人喜欢把问题绝对化,所以这里补充一句,软件涵盖的范畴可以很广,因此确实有很难搞定的,类似于弹射器的...
软件开发过程的质量管理体系.docx
最新发布
12-03
3. 软件产品之间很难进行横向的质量对比。 4. 满足了用户需求的软件质量,就是好的软件质量。 5. 软件的类型不同,软件质量的衡量标准的侧重点也不同。 软件产品质量管理的特点: 1. 软件质量管理应该贯穿软件开发...
提高软件开发效率经验
04-21
软件开发过程中,员工的需求也很重要。员工的需求包括薪酬、福利、好上司、好师傅、领路人、公司稳定、和谐的人际关系和成就感等。软件企业需要关心员工的需求,提供良好的工作环境和发展机会,提高员工的工作 ...
Practical.Data.Science.with.Python.3.(2019).pdf
10-20
This book amalgamates data science and software engineering in a pragmatic manner. It guides the reader through topics from these worlds and exemplifies concepts through software. As a reader, you will gain insight into areas rarely covered in textbooks, since they are hard to explain and illustrate. You will see the Cynefin framework in action via examples that give an overarching context and systematic approach for your data science endeavors.
系统开发软件中的需求分析.pptx
11-24
其次应当赶紧补习应用域知识,不论是通过自学还是培训的方式,否则他很难与用户交流。如果可能的话,开发方最好请既懂软件又懂应用域知识的行家来帮忙。 态度问题:相当多的开发人员习惯于被动地对待需求开发。每当...
零编程软件开发工具NCA
05-18
因有些环节很难大幅提高效率,故在编程方法上大下功夫,经多年 努力开发了一款完全可视化的《零编程应用软件快速开发系统NCA》, 系统短小精悍,使用方便,大大提高了开发效率,降低了劳动强度, 非常愿意免费提供给...
在敏捷软件开发中使用虚拟化技术
02-26
很难收集相关方面的需求,因为由于市场战略和/或技术条件的变化,需求可能会变化。敏捷开发有助于为软件开发确定需求。本文讨论可以在敏捷产品开发中使用以适应市场需求的各种虚拟化技术。虚拟化以符合逻辑的方式把...
嵌入式软件与硬件选择总是很难?1秒钟教你选择.docx
08-21
嵌入式开发主要分为嵌入式软件和嵌入式硬件两大方向。硬件工程师负责设计电路原理图、PCB板,选择合适的电子元件,确保硬件的可靠性和稳定性。这需要扎实的模拟电路、数字电路和电磁兼容理论基础,以及丰富的实践...
为什么软件开发很难?真相了
weixin_44749255的博客
03-04 577
标题为什么软件开发很难?真相了 作者:Jeremy Mikkol 本文认为这种困难与编程语言无关,因为现代的编程语言已经足够好了。那么,原因到底是什么?有一种观点认为,使用更好的编程语言就会让软件开发变得更容易、更高效。在汇编或 Fortran 时代,这种观点无疑是对的。然而,现代的编程语言已经足够好了,目前的主要困难和改进机会出现在其他方面。编程仍然很难,但导致这种困难的原因却与所使用的编程语言无关。# 安达尔定律当你有一系列需要完成的连续性任务时,安达尔定律就会发挥作用。安达尔定律告诉我们,通过加快其中
软件开发为何这么难???
emowuyi
10-31 208
对于企业应用而言,目前主要的模式就是C/S或B/S,它们都可以归入客户机-服务器模式,如下图所示: 客户端输入一些信息提交后,服务器进行加工处理,然后返回一些信息。就如此简单,但为什么我们的软件开发却如此之难啊!这么多年来我们怎么还没摆脱Brooks先生的魔咒,在焦油坑中苦苦挣扎。 这算我发起的一个话题,希望大家广泛参与讨论,看看问题到底出在哪里,如何破解。 软件的第三次...
理解软件工程软件开发模型与危机
瀑布模型强调文档完整性和严格的阶段间依赖性,但它的缺点在于缺乏灵活性,一旦一个阶段完成,很难回溯更改。 2. **螺旋模型**:螺旋模型结合了瀑布模型的线性顺序和快速原型模型的迭代方法。它强调风险分析,每个...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • XLFQ分析 25377
  • SVN 远程主机强迫关闭了一个现有的连接 18424
  • 博客能赚钱吗?如何赚钱 15799
  • getField用法总结 13564
  • 利用Google地图查询指定IP地址的位置 10327

分类专栏

  • 神经网络 16篇
  • 心情 7篇
  • 编程 21篇
  • EA 1篇
  • 数据库 2篇
  • 我的世界 9篇
  • android 5篇
  • java EE
  • python
  • c++ 1篇
  • PHP 22篇
  • 金融 1篇

最新评论

  • 对于老百姓而言VR到底能做什么?

    ha_lydms: 大佬牛X,为大佬点赞👍👍🏻

  • 月赚3000不是梦(谷歌广告联盟)

    2401_85748298: 怎么进入谷歌看视频收益

  • 好用且简单的本地大模型聊天工具LM Studio

    xiamingyang70: 安装好了,对话产生乱码,怎么解决啊?谢谢!

  • 构建中国人自己的私人GPT

    崎山小鹿: 加我微信

  • 实时智能应答3D数字人搭建2

    崎山小鹿: 什么型号的显卡?

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 对于老百姓而言VR到底能做什么?
  • 开发者聊科学作息时间表
  • 剪映数字人口播原理终于搞清楚了
2024年17篇
2023年9篇
2022年65篇
2017年52篇
2015年105篇
2014年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码坪地网站制作龙岗SEO按天扣费广州百姓网标王南联SEO按天计费坪山网站设计模板广州营销网站惠州建网站坑梓阿里店铺运营爱联标王坪山模板制作横岗SEO按天计费双龙seo网站优化南澳营销型网站建设坂田网站推广工具深圳网络推广福田网站推广方案龙岗企业网站设计惠州设计公司网站吉祥网站关键词优化大芬网页设计石岩网站开发同乐阿里店铺运营塘坑关键词按天计费龙岗外贸网站建设松岗网站制作广州建站南澳网站制作福田外贸网站建设龙岗seo网站推广光明外贸网站设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化