软件开发如同木匠做桌子

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

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

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

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

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

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

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

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

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

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

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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django加载静态文件

方法一: 1.在app目录中创建static 目录,并在该目录下创建存储css,img,js的子目录. 2.在相应的目录下创建相对应的静态文件. static/css/mystyle.css, static/img/timg.jpg,(保存图片) static/js/myjs.js 3.在模板文件中加载静态文件 例: mystyle.css: bo…

Flsak爱家租房--实名认证

0.页面展示效果 1.设置用户实名认证信息–后端代码 api.route("/users/auth", methods["POST"]) login_required def set_user_auth():"""保存实名认证信息"""user_id g.user_id# 获取参数req_data request.get_json()if …

IntelliJ 启动不同端口的两个spring cloud项目

IntelliJ 启动不同端口的两个spring cloud项目 1,使用maven进行clean package 2,在Terminal界面,输入java -jar xxx.jar --server.port8001就可以更换server的启动端口了;

python sort怎么用,Linux Sort命令详细用法(有实例)

Linux Sort命令详细用法(有实例)sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始!Linux sort命令进阶:1 sort的工作原理sort将文件的每一行作为一个单位,相互比较…

需求分析阶段各种图的功能

实体联系图,描绘数据对象及数据对象之间的关系,是用于建立数据模型的图形。数据流图是建立功能模型的基础。状态转换图描绘了系统的各种行为模式和在不同状态间转换的方式。

python面试题总结(7)--操作类

1. Python 交换两个变量的值 答:在 Python 中交换两个对象的值通过下面的方式即可 a , b b ,a 但是需要强调的是这并不是元组解包,通过 dis 模块可以发现,这是交换操作的字节码是 ROT_TWO,意思是在栈的顶端做两个值的互换操作。…

选择让孩子练习羽毛球的家长好好看看!

一、初级阶段 主要要练习小孩的各项身体素质指标、基础的发球和高远球、最基础的步伐训练。根据小孩年龄的不同以及练习频率的不同,大概需要100-300小时的训练量(训练间隔天数越多,时间需要越长)。 二、初级提高阶段 高远球对抗能…

LOJ#6281. 数列分块入门 5

内存限制:256 MiB时间限制:500 ms标准输入输出题目类型:传统评测方式:文本比较上传者: hzwer提交提交记录统计讨论 1测试数据题目描述 给出一个长为 nnn 的数列,以及 nnn 个操作,操作涉及区间开…

版本控制工具历史的10个里程碑

导读:作者Eric Raymond在flourish上发表的一篇《Astonishments, ten, in the history of version control》,文中总结了版本控制工具的重要10个里程碑,一起与开发者分享下。 如果你想要了解真正的历史,你需要回到在打孔卡上进行人…

php把语音转成帧,[转载]用TCP/IP实现自己简单的应用程序协议:成帧器部分

在前面《字节和字符,对信息进行编码》,《Socket>流,TCP连接,TCP可靠性概述》一系列的随笔中我们已经表述了相应的理论知识,现在可以动手实现一个自己的应用程序协议。将 数据转换成在线路上传输的字节序列只完成了一半的工作,在…

实体联系图简介

通常,使用实体联系图(entity relationship diagram)来建立数据模型。可以把实体联系图简称为ER图,相应地可把用ER图描绘的数据模型称为ER模型。 ER图中包含了实体(即数据对象)、关系和属性3种基本成分,通常用矩形框代表实体,用连…

Flask爱家租房--城区信息

0.效果展示 城市列表使用缓存的过程 1.后端代码 # coding:utf-8from . import api from flask import g, current_app, jsonify, request, session from ihome.utils.response_code import RET from ihome.models import Area, House, Facility, HouseImage, User, Order from …

数值计算算法-多项式插值算法的实现与分析

数值计算是指在数值分析领域中的算法。数值分析是专门研究和数字以及近似值相关的数据问题,数值计算在数值分析的研究中发挥了特别重要的作用。 多项式插值是计算函数近似值的一种方法。其中函数值仅在几个点上已知。 该算法的基础是建立级数小于等于n的一个插值多项…

HIVE ORC 报错ClassCastException

HIVE ORC格式的表查询报错 Failed with exception java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.BinaryComparable 建表语句如下: CREATE EXTERNAL TABLE test_orc( te…

程序型语言VS.编译型语言

导读:每日[快讯精选]是由CSDN研发频道推出的特色栏目,每一天我们将从国外技术媒体(例如Hacker News、Reddit...等等)中挑选出有价值的新闻简讯,让您在第一时间掌握业界主流的技术文摘,每天清晨为您献上第一份技术早餐。 [1]程序型…

ancestral 箭头符号,译林版《牛津高中英语》模块五 高二上学期

《牛津英语》由译林出版社和牛津大学出版社联合编写出版。通过在南京和苏州开始的试用,取得了非常良好的效果,己在省内全面推广。有人认为新教材在教育观念和编排体系上的改革力度是八十年代以来最大的一次。它带给我们一线教师的冲击无疑是巨大的。二、…

[NOI2012]骑行川藏

题解: 我发现拉格朗日乘数法真是个好东西。。 我是不会说我数学竞赛求最值都是用这个东西的 由于我不太会打那个符号就用li代表通常偏导数中的lanmuda 。。。 这题里化简一下就可以得到 2 li * ki * ​(vi​−vi′​)* vi^2​1 然后一旦li确定 我们会发现这个三次函…

MAC地址和IP地址的关系

简单地说:ip地址是服务商给你的,mac地址是你的网卡物理地址。 一、IP地址 对于IP地址,相信大家都很熟悉,即指使用TCP/IP协议指定给主机的32位地址。IP地址由用点分隔开的4个8八位组构成,如192.168.0.1就是一个IP地址…

Linux中断 - tasklet

一、前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bottom half,。具体…