我听说过最小化代码和最大化数据的概念,我想知道其他人可以给我什么建议,让我在构建自己的系统时如何/为什么应该这样做?
发布于 2011-01-29 02:32:03
在现代软件中,代码和数据之间的界限可能会变得非常细小和模糊,并且并不总是很容易区分两者。毕竟,就计算机而言,一切都是数据,除非现有代码--通常是操作系统--决定了它不是数据。即使是程序也必须作为数据加载到内存中,然后CPU才能执行它们。
例如,假设有一个计算订单成本的算法,其中订单越大,每件商品的价格就越低。它是商店中一个更大的软件系统的一部分,用C语言编写。
该算法是用C语言编写的,并读取一个文件,该文件包含一个由管理层提供的输入表,其中包含各种单项价格和相应的订单大小阈值。大多数人会争辩说,具有简单输入表的文件当然就是数据。
现在,假设商店将其策略更改为某种渐近函数,而不是预先选择的阈值,以便它可以容纳疯狂的大订单。他们可能还希望将汇率和通胀因素考虑在内--或者管理层提出的任何其他因素。
商店雇佣了一位有能力的程序员,她在原来的C代码中嵌入了一个很好的数学表达式解析器。输入文件现在包含一个带有全局变量的表达式、log()和tan()等函数,以及一些简单的内容,如Planck constant和carbon-14降级速率。
cost = (base * ordered * exchange * ... + ... / ...)^13大多数人仍然会争辩说,即使表达式不像表那样简单,实际上也是数据。毕竟,它可能是由管理层按原样提供的。
这家商店收到了大量的抱怨,客户在试图估计他们的费用时变得头脑发热,会计人员也抱怨找零钱太多。商店决定回到表中处理小订单,并使用Fibonacci sequence处理大订单。
程序员厌倦了修改和重新编译C代码,所以她嵌入了一个Python解释器。输入文件现在包含一个Python函数,该函数轮询满屋子的Fib(n)猴子以了解大额订单的成本。
问题:是输入文件数据吗?
从严格的技术角度来看,没有什么不同。表和表达式在使用之前都需要进行解析。数学表达式解析器可能支持分支和函数-它可能不是图灵完整的,但它仍然使用自己的语言(例如MathML)。
然而,现在许多人会争辩说,输入文件只是变成了代码。
那么,将输入格式从数据转换为代码的区别特性是什么呢
L。在我看来,这两个标准都不是真正的区别特征。我认为人们应该考虑其他的事情:
当然,这意味着系统是否是数据驱动的,至少应该与目标受众相关-如果不是与客户相关的话。
这也意味着这种区别可能会受到可用工具集的影响。UML规范是一场噩梦,但现在我们有所有这些图形化的UML来帮助我们。如果有某种第三方高级AI工具可以解析自然语言并生成XML/Python/任何内容,那么即使对于复杂得多的输入,系统也会变得数据驱动。
一家小商店可能没有专业知识或资源来雇佣第三方。因此,对于这些受众来说,一些允许员工利用在一般管理课程中学到的知识来改变自己行为的东西--数学、图表等--可以被认为是足够受数据驱动的。
另一方面,一家拥有数十亿规模的跨国公司通常在其工资单上有一群IT专家和网页设计师。因此,XML/XSL、Javascript,甚至Python和PHP都很容易处理。它也有足够复杂的需求,简单的东西可能不会减少它。
我认为,在设计软件系统时,应该努力在所使用的输入格式中实现微妙的平衡,使目标受众可以做他们需要做的事情,而不必频繁地访问第三方。
应该注意的是,外包更是模糊了界限。有相当多的问题,对于这些问题,目前的技术根本不允许外行接近解决方案。在这种情况下,解决方案的目标受众可能应该被认为是将操作外包给的第三方。可以预期,第三方将雇用相当数量的专家。
发布于 2011-01-26 16:40:53
通常,数据驱动的代码更容易阅读和维护。我知道我见过一些情况,数据驱动已经走到了极致,最终变得非常不可用(我正在考虑我使用过的一些SAP部署),但是编写您自己的“领域特定语言”来帮助您构建软件通常会节省大量的时间。
在我的脑海中,pragmatic programmers仍然是我读过的编写小型语言的最生动的倡导者。运行少量输入语言的小型状态机可以用很少的空间完成很多任务,并且可以轻松地进行修改。
一个具体的例子:考虑一个累进所得税系统,其税级分别为1,000美元、10,000美元和100,000美元。1,000美元以下的收入免税。1,000美元至9,999美元之间的收入按10%的税率征税。10,000美元至99,999美元之间的收入按20%的税率征税。超过10万美元的收入按30%的税率征税。如果你用代码来写这一切,它看起来就像你所怀疑的那样:
total_tax_burden(income) {
if (income < 1000)
return 0
if (income < 10000)
return .1 * (income - 1000)
if (income < 100000)
return 999.9 + .2 * (income - 10000)
return 18999.7 + .3 * (income - 100000)
}添加新的税级,更改现有的税级,或者更改税级中的税负,都需要修改代码和重新编译。
但是如果它是数据驱动的,那么您可以将此表存储在配置文件中:
1000:0
10000:10
100000:20
inf:30编写一个小工具来解析这个表并进行查找(不是很难,对吧?)现在,任何人都可以轻松地维护税率表。如果国会认为1000个括号会更好,任何人都可以使这些表与IRS表对齐,并完成它,不需要重新编译代码。相同的通用代码可以用于一个括号或数百个括号。
现在来看一些不太明显的事情:测试。AppArmor项目有数百个测试,测试系统调用在加载各种配置文件时应该做什么。一个示例测试如下所示:
#! /bin/bash
# $Id$
# Copyright (C) 2002-2007 Novell/SUSE
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, version 2 of the
# License.
#=NAME open
#=DESCRIPTION
# Verify that the open syscall is correctly managed for confined profiles.
#=END
pwd=`dirname $0`
pwd=`cd $pwd ; /bin/pwd`
bin=$pwd
. $bin/prologue.inc
file=$tmpdir/file
okperm=rw
badperm1=r
badperm2=w
# PASS UNCONFINED
runchecktest "OPEN unconfined RW (create) " pass $file
# PASS TEST (the file shouldn't exist, so open should create it
rm -f ${file}
genprofile $file:$okperm
runchecktest "OPEN RW (create) " pass $file
# PASS TEST
genprofile $file:$okperm
runchecktest "OPEN RW" pass $file
# FAILURE TEST (1)
genprofile $file:$badperm1
runchecktest "OPEN R" fail $file
# FAILURE TEST (2)
genprofile $file:$badperm2
runchecktest "OPEN W" fail $file
# FAILURE TEST (3)
genprofile $file:$badperm1 cap:dac_override
runchecktest "OPEN R+dac_override" fail $file
# FAILURE TEST (4)
# This is testing for bug: https://bugs.wirex.com/show_bug.cgi?id=2885
# When we open O_CREAT|O_RDWR, we are (were?) allowing only write access
# to be required.
rm -f ${file}
genprofile $file:$badperm2
runchecktest "OPEN W (create)" fail $file它依赖于一些助手函数来生成和加载配置文件,测试函数的结果,并向用户报告。扩展这些小测试脚本要比编写这种没有语言的功能容易得多。是的,这些是shell脚本,但它们与实际的shell脚本相去甚远;)它们实际上是数据。
我希望这有助于激发数据驱动编程的动力;我担心我不像其他写过数据驱动编程的人那样雄辩,我当然也不擅长这一点,但我会尝试。
发布于 2011-02-01 14:16:21
Rob Pike提出的Unix Philosophy的五条准则之一是:
如果你选择了正确的数据结构并且组织得很好,算法几乎总是不言而喻的。数据结构,而不是算法,是编程的核心。
它通常被缩写为“编写使用智能数据的愚蠢代码”。
https://stackoverflow.com/questions/4397883
复制相似问题