你也能用程序干活
1996 年末,我去位于张自忠路段祺瑞旧政府院子的社科院亚非所,在连襟办公室里,看见他们在手工翻译一本书。书名叫《世界各国商务指南》。材料来自联合国出的一张光盘,他们在把光盘数据库里一条一条的商业信息翻译成中文。我一眼看出,这件事可以交给程序做。理由不是它重复,是它的规则说得清。所要翻译的字段取值种类有限。大豆、小麦、玉米这类农作物和商品的名字,国家、城市、港口的名字,几张表列得完。列得完,就可以做成一边英文、一边中文的对照表,机器照表查。能这样交出去的只是这些字段,书里那些整段的说明文字翻译,当年交不出去。我取了 2000 条数据,用电子邮件发给我的计算机老师袁俊立。他当时在中科大读研究生。对照表他自己列。他很快发回一个 .exe 文件。袁俊立用什么语言写的,我没有问。我估计是C。我在 DOS 下,用这个 .exe 文件跑了另外任意抽取的几段数据,都自动而且准确地翻成了中文。另外抽这一下要紧。抽到的数据里要是冒出对照表上没有的词,说明那几张表还没有列全。需要补表,或者把这些词挑出来另办。几轮都没冒出来,只说明这几轮没抽到生词,不等于整部数据库再没有生词。这本书 4 卷,几千页,大部分内容是这些数据库的翻译。这部分全部用程序跑,没有再逐条人工翻译,只留了抽检。我没有写一行代码,那张对照表也不出自我手。我做的是两件事:认出这堆活儿的规则可以写下来,以及拿结果回去核对。我凭什么一眼看出来那一次,靠三样东西。第一样,1990 年我学过数据库,还用 dBASE III 写过一个通讯录。数据库怎么存、怎么查,字段是什么意思,我动手做过。第二样,我有字典程序的设计概念。一边英文,一边中文,照表查。这是一种现成的形状,见过就认得出。第三样,我有袁俊立。他程序写得好,写得快,也愿意帮我写。前两样是概念,编程思维,第三样是人。学过,还要用过1990 年我写的那个通讯录程序没派上什么大用场。但数据库这件事在我脑子里落下了,6 年之后用在了图书的自动翻译上。在大学里学过编程语言,考过试,成绩单上有分数,不等于遇到一件事就知道怎么用。毕业以后如果一次也没有用过,语法会忘,概念也未必真正建起来,更别提主动想到了。会写循环,和看见一件事就想到该用循环,是两件事。课堂上把循环写对,还得在课堂外认出什么地方用得上。先看两件事一件日常工作值不值得交给程序,先看两件事。第一,量有多大。量可以来自次数,也可以来自一回里的件数。1996 年那本书只翻一回,但是几千页。每个月给月报换表头,一年 12 次。两种都算。35 乘以 12的任务,按一次计算器就完了,通常不值得专门写程序。第二,规则说不说得清。1996 年那批词能交出去,靠的是这一条:词汇范围有限,对应关系可以一条一条列出来。开头说的那些整段说明文字,当年交不出去,因为它们不能靠这几张对照表翻译。量大提醒你停下来看一眼,也决定值得投入多少工夫。规则说得清,才知道该让程序怎么做。下面六个概念,能帮助你理清规则,把一件事交代到机器能执行。变量变量是给一个值起名字,后面可以反复使用。特别是后面方便修改。单价 = 35一份报价单里 40 处都引用这个单价,涨价到 38,改一处单价=38就够。手动改 40 处,漏掉一处就是错账。条件条件让程序根据判断结果,执行不同的动作。余额不够,就不扣款。“余额不够”还得往下说清楚:扣完以后余额恰好为零,算不算够?正在处理中的那一笔,算不算已经扣掉?每一条都要事先定下来。定的过程会逼出一批你原本没想过的情形。这一步本身就是把规则说清楚。循环循环是把一件事重复做,直到条件不再成立。在日常里找循环,可以先数次数。同一串动作做到第三遍,停下来,看看这几遍有没有共同的规则。第三遍是提醒自己检查的门槛,不是规律成立的证据。相册里 300 张截图按日期分文件夹,规则说得清。一年 12 份月报换掉表头的月份,规则说得清。这类活儿多半已经有人写过程序。文件管理器的批量重命名、表格的填充柄,都能替人重复执行动作。你不写代码也能用,前提是先认出自己的活儿符合什么规则。函数函数是把一组动作装在一起,起一个名字,以后直接调用。程序长起来之后,函数帮助你分开各项工作。起名字本身不会让你少犯错。有用的是一个名字底下管什么,要分清楚。出门前要做的八件事,可以分成“锁门窗”“检查电器和燃气”“带齐随身物品”三项。哪一项出了问题,先到对应的地方找。八件事都放在一个叫“出门”的名字底下,也可以。只是任务多起来之后,再往下分,才容易知道出了问题该查哪里。分开各项工作,分的是责任,不是数量。列表和字典列表是一串按顺序排列的东西,可以按照位置取用。播放列表里,取第一首、最后一首、第三首。字典是一组对应关系,可以按照名字或编号查找。给出“张三”,取出张三的电话。“张三”就是拿去查的那个名字,写程序的人管它叫键。1996 年那张对照表就是一部字典:给出 soybean,取出大豆。选哪一个,先想取用的办法:按位置找,还是拿一个名字、编号去查对应的内容。顺序不是根本区别,字典也可以保留顺序。一个反驳这些东西,日常生活里本来就有。下雨带伞是条件,每天刷牙是循环,通讯录是字典。学编程,难道只是给熟悉的事情换几个名字?换掉的是执行者。刷牙这个循环,每一遍都要你自己去执行,你不去,它就不发生。写进程序的循环,机器可以接着做。下雨带伞这个条件,平时要你抬头看天;程序拿到天气信息,就可以按条件提醒你带伞。执行者换成机器,好处和代价一起来。机器不会累,但也不会因为做了 700 遍,就自行发现规则有错。人看错一行,可能只译错一个词。对照表里一个词译错,程序遇到这个词一万次,就可能重复同一个错误一万次。看上去整整齐齐。同一种错误也有便于修正的地方。找到表里那一条,改过来,再把受影响的数据重新跑一遍。但前提是你得先把它找出来。所以,交出去之后还有一步:检查它做对了没有。编程是:提假设,做实验,然后核对可以分四步。第一步,找一件最近反复做过的事,或者一堆正等着处理的活儿。第二步,把规则写下来:输入是什么,输出是什么,遇到对不上的情况怎么办。写不下来的地方,先列出来,再想清楚。这套规则可能有遗漏,也可能有错,第四步要检查的就包括它。第三步,找现成的办法,或者把规则说给大模型,让它写。第四步,核对。先拿几条自己知道正确答案的数据,看最基本的结果对不对。再另外抽几批没有拿去作样例的数据,重新跑,核对结果。抽查之外,还要专门挑容易出问题的条目:特别长的、空着的、带特殊符号的、正好卡在条件界线上的。看看程序遇到这些情况怎么办。你给它的那批样例当然要测,但是不能只测这些。通过这些样例,不能说明换一批数据也能做对。结果不对,先分清是哪一头出的事:规则没说全,对照表有误,还是程序没照规则做。三样修法不同。几轮都过,不等于都对,只说明这几轮没抓到错。找了 20 分钟还没找到办法,可以先停下来。这一次没找到,不等于办法不存在。继续找值不值得,要看它以后还能省下多少工作,以及核对、维护还要花多少工夫。暂时不学的三样暂时不学面向对象,不学 Python 里的装饰器,不学框架。眼前的任务需要了,再查,不必提前预习。用程序干活,不必先掌握一门编程语言。袁俊立给我的是一个 .exe 文件。他用的什么语言,我没问,也不需要知道。这没有妨碍我使用程序,也没有妨碍我核对结果。第三样,今天不难找当年我得有一个袁俊立,还得他肯帮忙。今天可以把规则说给大模型,让它写代码。三样门槛里最难凑的那一样,今天已经不难凑。前两样仍然有用:知道数据怎么组织,知道动作怎么交代。这六个概念可以帮助人开始,还得动手用一次。1996 年我动的手就是这些:取 2000 条数据发过去,另抽几段跑一遍,把结果核对一遍。留给人的还是 1996 年那两头。前一头,认出这件事的规则可以写下来。后一头,拿结果去核对,确认它做的是你要的那件事。中间写代码的那一段,当年归袁俊立,今天可以交给大模型。两头都长在现场。你不把那间办公室里的人在做什么告诉大模型,它就不知道有这堆活儿。你只给它 2000 条数据,它也无从知道其余数据里藏着什么例外。规则写得下来,结果核得住,中间那一段谁做都行。
页:
[1]