软件真的好难做啊

  文/陈皓

  还记得以前本站的那一篇“编程好难啊”吗,那是一篇众程序员调侃程序新手的文章,有恶搞的成分在里面。今天要和大家说的这个事没有一些恶搞和调侃的意思,是比较严肃的话题,你一定可以从中收获一些东西。这个话题来自StackOverflow上的一个问题——Cycle in Family Tree Software,这个程序员问了下面这个问题:

  我是一个写家族族谱软件的程序员(我用的是C++和Qt),这个软件基本上没有什么问题,真到有一天有个用户报告了一个bug。这个问题是这样的——我这个用户和他女儿生了两个孩子。

  于是,我程序员的一些断言和硬性条件导致程序报错,因为我的程序在处理这个关系的时候,其发现X即是Y的爸爸,又是Y的爷爷,所以只能报错。

  请问,在不需要移除我的断言和数据验证的情况下,我怎么才能解决这个问题?

  看到这里,请重点阅读一下下面的两点:

如果你看到这里开始兴奋了,请你为你阴暗的心理去面壁反省10分钟,因为这是一个很技术的问题。 如果你开始陷入了深深的思考如何解决这个问题,
那么你绝对是一个合格的程序员,因为你已陷入技术已经很深了,有点呆了。

  我在前面说过,“这个是一个严肃的话题,你可以从中收获一些东西”,当然,我并不希望你来收获乱伦的知识和心得,酷壳是一个技术博客,应该是收获技术方面的东西。

  从技术的角度上来说,这是我们经常在设计软件时犯的错误——

  1)作了错误的假设(Assumption)

  Assumption是软件设计的重大天敌,Assumption的动词Assume意为Ass u me – Ass you and me 。你的假设做得越多,你的设计就越不靠谱。这里的假设是——我们以为family tree是一个tree,其实并不是tree。Assumption是魔鬼。

  还有一些经典的Assumption如下所示

最著名的就是那个y2k臭虫。 不要以为没有2月30日,在瑞典1712年有2月30日 一分钟有60秒?闰秒呢? 双胞胎的生日是同一天吗? 双胞胎的父亲是同一个? 性别只有男和女? 婚姻只能是异性?关于这一点,推荐一篇强文——Gay marriage: the database engineering perspective (同性婚姻:数据库工程)

  2)没有认真分析用户案例(Use Case)

  在设计软件时,我们需要考虑各种各样的用户案例,比如如下的东西:

私生子的问题。 一夫多妻或一妻多夫,同父异母,同母异父。 就算一夫多妻制违反法律,也会有离异再婚的情况。 同性恋的问题,虽然不能繁衍,但可以领养。 换妻活动。 各种乱伦关系——这种东西那个民族都不少,尤其是古时候,比如: 先后嫁了两个人其是父子关系(昭君) 达尔文同学和他的表妹,爱因斯坦的二婚是和他的表姐,埃及艳后嫁了她的弟弟,…… 顺治同学娶了四个老婆,这四个人还是一家人:姑姑,侄女,妹妹,女儿。(参看这里) 刘邦同学的母后干出来的事,相当变态(参看这里) 中国古代的“扒灰老”(类似于楼主那个问题的Use Case)

  不想再列下去了,人类真TMD恶心,有点要吐了。

——————为了缓解一下恶心的气氛,请允许我插入一个搞笑短文——————

  一位自杀者在他的遗书里讲述了他自杀的原因,听起来实在让人头痛。遗书这样写道:“我和一个寡妇结了婚,她有一个已成年的女儿,我父亲跟我妻子带过来的女儿结了婚。所以我父亲就成了我的女婿,女儿就成了我的后母,我管父亲叫爸爸,而我父亲也管我叫爸爸;我女儿管我叫爸爸,但我却管她叫妈妈;我还得管我妻子叫姥姥,因为她是我后母的母亲。不久我女儿,也就是我后母生了一个儿子,他是我同父异母的弟弟,他也得管我叫姥爷,因为他也是我的外孙。后来我妻子,也就是我姥姥生了一个儿子,他是我后母的弟弟,我是他的外甥,所以儿子管我叫爸爸,我管儿子叫舅舅。另外我是我妻子,也就是我姥姥的外孙,同时也是我姥姥的丈夫,所已我也是我的外祖父。又因为我妻子是我的外祖母,我的儿子,也就是我的舅舅是我的弟弟和我女儿的弟弟,所以我……我的天哪,这么复杂的关系实在让我伤透了脑筋,我只有一死才能得以解脱……”

  看完上面这个短文,不知道你是否和我一样,觉得这么一个简单的程序将是如此难做啊。另外,我决定在下一次的面试中让应聘者来设计Family Tree的程序。

  我又说多了,现在还是让我们回到技术上来。除了上面那几个观点,我在回复中还看到了如入一些有意思的回复:

“我的软件没有bug,是你的生活有bug”——让我想到了程序员惯用的借口 “算法中不应该加太多的限制,限制多了反而让算法不灵活。” “移除断言,并不代表就不出错,对于这种rare case,我们
最好给一个Warning提醒用户,让用户确认确实是这样的。” “关于解决这个问题,移除那个断言,如果显示上会有问题的话,那就复制一下有不同关系的人就可以了” “你真的应该想想你的软件的价值是什么?市场在
哪里?你真的要照顾这样的用户吗?”

  挺好的,相信你对软件开发又学到了一些东西。

时间: 2024-10-22 17:43:12

软件真的好难做啊的相关文章

地区站点目前真的很难做吗?

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 大家好,我是一名新手,以目前的技术水平 还不能称之为站长,只能说是一名网站爱好者,以前从没接触过互联网,但是后来渐渐喜欢上了.喜欢上了聊天,喜欢上了网络世界的精彩,同时也喜欢上了网站,一年前的我连ftp都不知道是什么,就萌生了一个梦想,做一个网站,当一名站长,原来以为做一名站长真的好令人羡慕,有自己的网站有丰厚的广告费用.下定决心后就开始操作

图片站真的是那么难做优化吗?

摘要: 网站的类型多种多样,从企业类站到产品类站,从服务类站到商城类站,各种各样的网站都需要运用其特有的思路去优化.去运营.而最为让站长们头疼的莫过于是苦逼的图片站了,每 网站的类型多种多样,从企业类站到产品类站,从服务类站到商城类站,各种各样的网站都需要运用其特有的思路去优化.去运营.而最为让站长们头疼的莫过于是苦逼的图片站了,每当看到自己的网站排名一降再降,站长们就不禁苦叹自己是多么的苦逼. 图片站真的是那么难做优化吗?如果运用老一套思路,拼命做内容,发外链,做起来可能就相当困难了.但是为什

做论坛有感:一个人做,真的好难

众所周知,一个坛子的兴衰很大程度上取决于它的人气. 而提高人气,初期应该是增加论坛帖子的数量,多发些引人注意的信息,这应该是每一个做论坛的朋友都比较拿手的. 其次,就是持之以恒. 认真看过"新人导读"之后才发现,原创才是最最重要的,论坛的本质也在于此,论坛是用来交流的,而这种交流是建立在深切体会的基础上的.都知道,要学好英语,必须每日都得练习.论坛也是一样,要把它做好,不可能是三两天的事情,必须保持论坛每天都有新的信息,最好多一些原创内容,这里少不了版主和各位会员的功劳. 到后期,管理

想要成为真正优秀的程序员是不是真的很难?

很多人认为要想成为一名优秀的程序员,那就需要一天24小时每天不断地编程--睁开眼睛要编程,闭上眼睛睡觉的时候还要梦到编程--我认为这是一种矫枉过正的方法.沿着这条路走,只会让你精疲力尽,犹如夸父逐日一般,死在半道上. 我觉得问题的关键是要想明白你为什么要编程.坦率地说,我编程是因为我喜欢别人用我的程序,这也是我之所以在读书的时候成绩不怎么优秀的原因(我并 不热衷于参加编程竞赛以及类似事情).因此,我也不喜欢参与纯研究的项目--只在论文上讨论各种点子,而不付诸于行动不去写代码(除非恰巧碰到的是研究

硬件难做不赚钱?其实控制权的争夺战刚要开始

数字化后的软件和数据因为复制和重用成本为零,所以骨子里是可以免费的,这一特征让开源永久性的摧毁了微软的那种License fee模式,并让竞争的本质变成控制权的争夺战.在这一过程中,软件可以扮演什么样的角色,大家已经谈的很多,但基于原子的硬件究竟可以扮演什么样的角色,则很少被谈及,这篇文章探讨下这个问题. 数字世界的抓手 数字化程度的加深是毫无疑问的:每个人生活的记录几乎已经百分百的数字化,企业的行为数字化程度则几乎和个人差不多,随着万物互联的发展行业里的产品比如涡轮机也会生成自己的数字描述.这

推广一个网址导航站真的好难啊

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 看了介绍大家也能看出我想AD下本人的小站,哎 不知道各位站长有没有我同样的感受,现在推广一个网址导航站真的好难 如何搞流量已经成了我生活中不可缺少的一部分先给大家分享一下网上对于网址导航站的推广方法吧. 1.五花大绑式:就是捆绑软件.像搜狗输入法,就捆绑了搜狗搜索.假如能够捆绑我的网址导航站,那我就发了.114啦也是靠种方式起家的. 2.草船

如何使用小脑袋百度竞价软件给婚庆网站做推广

成婚,是人一辈子最重要的工作之一,跟着这些年咱们生活水平的不断提高,一般大众在成婚方面的花费越来越大,如何使用 小脑袋百度 竞价软件给http://www.aliyun.com/zixun/aggregation/31040.html">婚庆网站做推广 然后便形 成了婚庆工作这个无量的工业,由于进入门槛低,致使婚庆公司数量多,比赛也越来越剧烈.   宣扬,是婚庆公司必定要思考的疑问,特别是对于刚进入这个工作的公司,由于短少堆集,显得尤为重要.   婚庆公司传统的推行办法首要是抢占酒店本钱.

让天下没有难做的研发:解读阿里CI/CD、DevOps、分层自动化技术

在互联网时代,产品快速迭代的重要性不言而喻.不管是传统企业还是初创企业,在提升研发效能方面都有很强的需求,如果能使用一套对项目流程管理和专项自动化提效工具,来支持项目的快速迭代发布,实现24小时持续集成.持续交付整个流程,不但可以提高研发效率,还能增强产品的竞争力! 1月12日,阿里巴巴旗下一站式研发提效平台--云效联手 InfoQ 在阿里巴巴西溪园区举办了一场旨在帮助研发团队提升研发效率的线下沙龙,邀请了阿里巴巴技术专家之岳.许晓斌.鲁小川和一佛,分享了阿里云效平台从生态规划,到 CI/CD

云效专场直播5月盛大开启|让企业没有难做的研发效能

天下武功,唯快不破!互联网时代,业务发展迅猛,随之而来研发团队规模.应用规模都将加速扩张,这对于产品的快速迭代,对于研发人员协同合作的要求越来越高.然而,传统的项目集成及交付软件已经不能满足企业需求,很多研发同学也觉得持续集成持续交付说起来容易做起来难!  为了让企业没有难做的研发效能,云效将于5月9日-6月22日在开启4场直播,由4位阿里巴巴专家和大家一起分享持续集成持续交付之路的技术实践,从云上企业的持续交付之路到研发管理实践到自动化测试再到大规模代码构建,为企业提供切实可行的解决方案. >