五千年(敝帚自珍)

主题:【原创】编程心得 -- 荆棘探兴

共:💬198 🌺258
全看分页树展 · 主题 跟帖
家园 编程本质上将自然语言转换成死的机器语言

我编程也有6年多了,在西西河应该不算多,不过最近天天猛写代码,遇到各种各样的需求,也写了各种各样的代码,对编程中同到的各种难题和各种相似的工作思考了很多,也说一说我的想法。

我暂且将普通人描述出的语言称为自然语言,自然语言具有模糊,逻辑不严密,不确定性非常多。人脑可以走一步看一步,具体问题具体分析,“如果这样就那样,如果再这样还可以再这样”,可以拥有所有的信息,“当XX在XX的时候就XX,当XX发生XXX的时候就XX,如果那个XX是XX的状态就XX;如果在XX的同时又发生XX且XX的状态是XX的时候就XX”之类;

但写好的程序不行,写的时候是什么样跑的时候就是什么样。计算机语言就是非常确定,不能看情况而定。程序没有人耳朵没有人眼,不能在需要时随时去查看发生的所有情况,除非程序预先将各种数据记录下来了(并及时保持更新)。

所以,编程主要解决两个问题:

1.将抽象的自然语言转换成严密的机器语言,不能错,不能漏,无不确定性;所有情况要考虑到,所有数据要组织好。

2.从需求中抽象出真正的需求,并建立相应的模型,然后用程序描述之。

1偏向于coding,而2更偏向于design一点,中间到没有明显界限。

在1里需要处理太多流程太多细节太多信息,以普通的人脑不可能同时装下所有东西,所以很容易遗露,要么是没考虑到特殊情况,要么是设计出的代码非常难懂难看难改难复用,要么就在一些小地方犯一些弱智的错误,比如变量名写错之类的。对于这些问题有一些解决办法,比如建立好的编程习惯编程规范(用习惯杜决意外的小错误),测试驱动开发(用测试保证在持续开发中没有新问题),耦合内紧外松(集中思维到部分点避免网状关系),面向对象编程(数据与操作的集中,并提高抽象层次),设计模式(现成成熟模式直接利用)。这些好东西都是尽量让程序员需要考虑的东西简单化,集中化,模式化;减少了写程序里程序员大脑里要考虑的东西,解脱程序的大脑,那就减少了出错的机会。

关于2,稍微偏设计一点,更多的像是对需求的一种翻译,建立起的模型既要灵活易扩展,又要简单易懂易实现,更重要是要很严密的实现需求(按1的标准)。这里的需求不只是指来自客户的需求,也有来自软件开发本身的,比如可复用功能,模块通信机制,模块生命周期管理等等。

编程中我还遇到的一个比较突出的问题就是重复机械劳动非常多,这里的重复并不是指完全的重复,往往很多需求是大体上基本一样,但细节却各不相同,程序员不得不花大部分时间去处理这类毫无新意的东西;而如果建立和实现一个能适合所有这类变化的模型的话,它需要的代价有时候却又远超过手工完成两个或三个需求的代价; 甚至有时候“细节是魔鬼”,一个细节分析深一点就会发现之前模型都不能复用了。把大部分时间花在这些毫无创新的事上让我很有挫败感,但感觉解放程序员唯一办法是继续提高程序的抽象层次,让程序员可以在更接近自然语言的层次上思考问题,避免过多细节,有一个思路就是走以前汇编-》C语言-》C++的路子,当然这要求底层有更好的支撑库,以及更好的硬件。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河