做一张桌子看起来十分的简单。任何人都可以做,不是吗?找个大块的四方形木板,四个等长的木头柱子,四个钉子和一个锤子。把四个柱子钉到四方板的四个角上,你就做成了一个桌子。当当当!

现在来让一个真正的木匠为你打造一张桌子。首先他要花时间跟你讨论桌子的用途和功能——用在室内还是室外,厨房还是餐厅,主要用来展示还是使用,它需要能够承受多大的负载。然后他需要确定使用什么样的材料——软木还是硬木,用木板还是三合板还是铁轨枕木。然后他会研究桌子的风格——桌边的截面设计,桌腿底座设计,桌腿是按在中央还是四角。这最后,他才去动手做这张桌子,他花大量的时间去斜截,凿眼,契合所有的连接点,安装撑条,使用高质量的粘胶,木钉,螺钉,他要检查表面平整,打磨它,着色,封蜡,抛光——打造出一张能够引以为豪的桌子。看起来是一大堆的事情要做,不是吗?它只是一张桌子,不是吗?

两种做桌子的方法存在着很多不同之处,你看出来了没有?

只用了四个钉子的桌子看起来很毛糙,它不稳,因为桌腿不牢固,桌脚不平,顶多能用一个星期,它的一个腿就会扭断,根本承受不起一个盐罐子的重量。木匠的桌子看起来更好,好用而且美观,它很牢固,不摇晃,桌腿经过矫正,直的,很平,没有棱角,能用很久,你完全可以放心的在它上面摆上一顿丰盛的晚餐跟一群客人享用。你更想要哪个?

当人们谈论起软件,大多数人想像的工作量很像第一张桌子的建造过程。只需要创建一个数据库,填上一些数据,画出一些界面,这就完了,你就得到了一个软件产品。我无论如何都想不出人们这样的一种认识是怎么产生的。也许是人们用惯了Excel——“我可以用Excel做这些,所以编程应该很简单”。什么?

开发软件不容易。需要做很多的工作。非常像那个木匠做桌子的方式。作为设计师和程序员,我们需要理解业务、用户用例,以及产品功能。我们需要讨论和理解谁将要用它,它有什么功能,它如何和其它软件集成,它要用在什么地方,数据量如何,等等,等等。我们然后才去花大量的时间搭建架构,确保它能承受用户和数据负载压力,要能够升级和扩展,要能处理大数据量情况(例如单表负载)。我们然后需要更多的时间写出有质量的、可读的、可维护的代码,测试每个组件,确保它们正确、快捷的运行,改正bug,清除瓶颈(在数据库表模型上使用正确的结构和关联)。我们还要使用更多的时间来把这些组件组合到一起,确保每个接口都正确的调用,确保错误都被捕捉到,确保界面设计可用,简单,美观(桌子的切截,钻孔,契合,打磨,着色,抛光)。最终,我们交付客户一个完整的可信赖的产品,一个符合需求的产品,一个我们和你们都引以为豪的产品。

我相信,木匠很少会遇到像程序员需要面对的那样让人抓狂的事。也许他的客户也会抱怨做这个桌子花了太长的时间,或造价太高。也许他的客户并没有说桌子的用途或应该是个什么样,然后大声的抱怨它跟他从未说出的期望的样子不一致。也许他们的客户会瞪着他说做这样的桌子只需要几块木板和几个小时,木匠做桌子已经有几千年的历史了,这种桌子能有什么不同。也许他们的客户会说这很简单,所以应该很快,很便宜,魔术般的做出来,我猜测他们是这样想的。

我们的客户完全也是这样。而且几乎每次都这样。从没例外过,最初给我们新需求时说“这只需要你花几个小时的时间…”,或“你可以这样做…这样更简单”,或“你只需要简单的把它改成…”。什么?

对软件产品增加新功能可不像多钉一颗钉子或多加一个柱子。我们需要理解新功能的形式和功用,创建它,测试它,写文档,确保新增加的功能不会影响现有的系统。如果我们不这样做,软件就会做出错,到处是bug,不能正确的运行,给用户来带来大量的问题。有很多软件项目都是这样,任何用过这种有问题的软件的人都不会信任它,甚至不愿意使用它。就像那个摇晃的桌子。

如果你需要一个新功能,尽管提,但你要做好准备跟我们的木匠——程序员们认真仔细的讨论它。我们会用正确的方案开发你要的应用,保证让它正确的运行,一直正确的运行。你到我们这里来是想要有质量、可信赖的软件,就像是你要从木匠那得到一个有质量的桌子。

千万不要告诉我们这样多简单,多容易——除非你自己做过。如果你真的认为能既迅速又简单的做出来,你自己试试。干吧,拼装出一个摇晃的桌子。

如果你希望得到一个好的产品,你要理解明白开发需要时间和技能,有很多你根本想象不到的问题在里面,工匠们也是人,是有感情的,一个好的产品是一个永远让人快乐的事,值得我们付出努力和耐心,这样,它将成为我们所有人能引以为豪的东西。

软件开发如同木匠做桌子相关推荐

  1. 直播网站源码直播平台软件开发iOS动手做一个直播(原理篇)

    直播网站源码直播平台软件开发iOS动手做一个直播(原理篇) 上篇文章主要给出了代码,但是并没有详细说明直播相关的知识,这篇文章就说一下直播的相关理论知识.附上直播代码篇地址. ###推流 腾讯直播平台 ...

  2. 软件开发公司怎么做网络推广

    如今科技发展的越来越好,我们的生活也离不开互联网,因此各大软件公司开始注重网络推广,那么我们今天来分享一下软件开发公司怎么做网络推广,希望能对你们有所帮助. 要想把自己的企业宣传推广出去可以从以下5个 ...

  3. 进展-《IT男潘加宇:老婆在孩子班级群里怒怼数学老师》-是的,我是用软件开发思维来做这个事情

    <IT男潘加宇:老婆在孩子班级群里怒怼数学老师>的链接>> 一.引爆点:表扬垃圾分类 首先要说清楚的,<IT男潘加宇:老婆在孩子班级群里怒怼数学老师>一文(以下简称 ...

  4. 重塑软件产业,华为云软件开发云能做些什么?

    每隔几年,变革这个词就会被推至每个人.每个企业.每个行业.每个领域的面前,而保持基业常青只有一个办法,那就是积极响应变化. 眼下就是一个正在经历巨变的时期,然而就像移动互联网时代到来之前,没人会想到微 ...

  5. 软件开发面试_如何为成功的软件开发工作面试做准备

    软件开发面试 Job interviews are stressful for many people. Besides the pressure of getting hired, you have ...

  6. 软件开发中,做产品与做项目有什么区别?

    对于个体程序员对于产品与项目的选择性问题 在IT行业,产品和项目一直是程序员们讨论的热话题.下面是我看到的一篇文章,我觉得写的比较不错.和大家来共享一下. 我始终不能避免的是程序员的最终归宿,人都有老 ...

  7. 软件开发流程包含哪些内容

    2019独角兽企业重金招聘Python工程师标准>>> 能否开发出一个好的软件,关键是看软件开发前期所做的工作,重点是这个软件有没有一个好的 软件开发流程,因为一个好的软件开发流程关 ...

  8. 关于工作的选择之软件开发还是软件维护的建议

    今天是周六休息,好可爱的双休日啊.下周一出差去四平,要和我们单位另外2名工程师一起去给四平的一个公司安装调试一个机房的设备,大概需要三天的时间吧.昨天晚上去个朋友家做客,朋友他侄子大学是学计算机软件的 ...

  9. 软件测试和软件开发哪个发展更好

    经常有想转IT行业的同学,在了解软件测试和软件开发之后不知道转那个岗位好,今天就系统的,从多个维度来比较软件测试与软件开发,具体包括从基本素质要求.性格要求.入职门槛.知识结构.竞争压力.职业发展.职 ...

最新文章

  1. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式
  2. 使用for循环遍历文件
  3. 关于vc中Warning: skipping non-radio button in group的警告
  4. QDoc包括代码内联includecodeinline
  5. webpack4 入门配置研究
  6. MyEclipse创建struts.xml
  7. 数据结构与算法——二叉树与图
  8. oc c语言,OC之C语言的基础知识
  9. Android模拟器环境下SD卡内容的管理
  10. 安装step7 v5.6报错的解决方法
  11. “深入浅出”学Golang!就选《Head First Go》
  12. Android webview网页截取长图
  13. Android5.0系统下代码格式化sd卡方法
  14. “期货投资管理”的资管软件开发都需要用到什么开发语言和环境
  15. ArcGis Engine二次开发入门(1)
  16. bitcode 是什么_dictate什么意思
  17. 浙江正高级计算机职称,浙江省厅:最终名单!共5207人通过高级职称评审/272人通过正高级职称!附全名单...
  18. 部门来了个卷王之王,真的让人奔溃
  19. 转帖——李开复:我的大学生活琐忆
  20. 如何对接第三方分账系统?

热门文章

  1. 【转】C# DataTable使用方法详解
  2. SharePoint PowerShell命令系列
  3. 一步步编写操作系统 23 重写主引导记录mbr
  4. 一键锁屏_ios快捷指令一键登录校园网(桂航为例,哆点认证)
  5. python 字典、列表、字符串 之间的相互转换
  6. 【Uva - 10935】 Throwing cards away I (既然是I,看来还有Ⅱ、Ⅲ、Ⅳ?)(站队问题队列问题)
  7. 详解车道线检测数据集和模型 VIL-100: A New Dataset and A Baseline Model for Video Instance Lane Detection
  8. 2)机器学习基石笔记Lecture2:Learning to Answer Yes/No
  9. mysql 递归实现树形_Mysql实现树形递归查询
  10. JAVA线程并发数量控制_线程同步工具(二)控制并发访问多个资源