|
|
当用户说要有增删改功能(前提是表结构已经设计好了)。
几乎所有的程序员都明白了这个需求的全部含义。然后埋头干活去了。往往开发的代码数量远远大于3行。可能做了30天。
为什么需求描述和实现的工作量如此不对称呢?
仔细分析之后,发现问题在于:需求里的词汇非常抽象,属于专业词汇。而开发平台是非常通用的,2者不在一个抽象层次。
假设存在一个相应的开发平台,那么,开发也就非常简单,简单到在增删改3个复选框上打勾而已。
用户的需求可能是任意的。这里的任意指抽象层次。比如在那个3字需求之上,又要求字体用宋体。或者又要求在内存256的机器上运行。……
显然,上述要求,或者说约束是属于不同抽象级别的。我们假想的开发平台是不可能无限满足用户的。即不可能在每一个抽象级别上都允许定制。打个比方,我们不生产任意直径的螺丝,我们只生产直径位为1,3,5厘米的螺丝。
所以,若要把成本控制住,用户就只能选择现有可选项,而不能任意提需求。
比如,选os就选Windows,Linux而不是Symbian
选语言就选Java,C#而不是erlang,
用户选常见标准实现的代价小很多。
开发平台提供了常见抽象层次上的定制。
再举一个生活一点的例子:
你说吃饭去。
这吃饭2字,看似简单,其实实现起来要做很多事情,比如订位子,打车,喝茶,点菜,更加细节一点,运动你的牙床肌肉进行咀嚼,以及如何运动舌头,分泌唾液,。。。无穷无尽。
对应的举一个软件的例子:
做一个界面输入一个数字。
具体实现起来,如果是web界面,要有html页面,里头包含各种tag,css,javascript,还有浏览器,web服务器,http协议取得参数,甚至更细节一点jsp,servlet,把字符串转换到整数,没提到structs的mvc框架呢。
为什么一个简单的词汇,具体实现起来那么麻烦呢?在vb里,我们创建一个form,拖拽一个文本框和一个按钮,然后双击按钮写事件处理的代码。似乎比jsp,css,html,javascript这种开发要简单多了。
这里问题的本质是,你在哪个抽象层次上思考问题。越细节的层次上,越复杂。
理想的软件开发,就应该在合理的抽象层次上开发。尽量让开发的抽象层次和需求的层次在一个级别上。
比如吃饭,那么就应该存在一个默认的吃饭实现类,包含了默认的订位子,打车,喝茶等流程。
比如一个文本框,就应该存在一个默认的样式的文本框,无需我每次去采用html,css,javascript去设计一个文本框。开发的时候,也只要说“new 文本框()”几个字就可以了。
回到开头,当用户简单的说“增删改”的时候,有一个默认的操作类实现了默认的增删改功能,开发人员也一样写下简单几句代码就完成了整个后台维护程序的开发。
//set tablesapp.setTables("table1","table2","table2");//set operationsapp.enableOperations(OperationType.Create,OperationType.Delete,OperationType.Update);//run programapp.run(); |
|