编程的美学标准诌议

2023-10-27

编程的美学标准诌议

做了几年的程序员,虽然自己写的代码还远远没有达到要求,但在日复一日的实践过程中,我逐渐开始信奉一条标准:在实现功能的前提下,简单即是美。

其实,编程的过程就好比是一个建模的过程。设计就是将一个现实问题抽象成逻辑模型。而编码则是将逻辑模型进一步表达成程序模型(如果我可以这么叫的话)。建模是数学和物理中的很重要的方法,而数学和物理是强调“简单”的。不知通过这样的论证来给编程引入简单美是否令人信服。

我喜欢从“成本”的角度看程序的简单与否。有三个方面:

实现的便捷(实现成本)

              学习的便捷(学习成本)

              运用的便捷(运用成本)

 

注重实现的便捷就是追求自己写代码时的省力。要实现起来简单,关键应该是平衡好程序的灵活度和复杂度,不能为杀鸡造牛刀。我刚开始写代码的时候犯过这样的毛病,把需求考虑得过于复杂,甚至把以后的复用,扩展都考虑进去了,同时由于经验积累的不足,不知道利用已有的成果――搞得造房子从挖土烧砖开始,结果十天半个月都没完成,而要求实现的功能其实很简单。

 

关心学习和运用的便捷,则是为了让用户省力。这里所说的用户(user)是广义的,不单单指人。一个大型的软件也好,小的程序也好,甚至是由几个类构成的模块,都会提供供用户操控的抓手,就是接口了,想要让用户学着简单,用得方便,关键是要定义好它。

以模块的接口为例,首先注意的是接口函数的规模。有多少个可被用户调用的函数;是使用一次调用一次,还是一旦初始化了就一直起作用等等。接口的规模是和具体问题相关的,不是每个模块都能设计成只有一个接口函数的,但是往简单了去规划,却是不错的。

接口的设计还要注意“语境”。首先是具体业务逻辑的语境,电子商务有电子商务的一套概念体系,电信有电信的,银行金融有银行金融的,这个自不待说,对软件、程序和模块都适用。但对任何一个模块而言,最终都是要用具体的编程语言实现的,所以我们的模块也要注意编程语音的“语境”。比如如果是用C/C++,我们就要考虑指针。如果是用Java,同样也有讲究。比如包、类、函数、变量的命名按习惯来,甚至模仿jkd里的来。如果要把用户定义的对象放在散列(hashcode)容器里,就要求用户定义对象类重载实现Object#equals()hashCode()。如果要排序,就要求实现Comparable或提供Comparator。要复制对象就定义拷贝构造函数或重载Object#clone()方法。总之,跟着大家约定俗成的概念、思路来表述问题,不自创一套,就是为了学习和运用的方便。

接口的灵活性和简洁性是一对矛盾,要学用方便,就要平衡这对矛盾,坚持一个“够用”的原则,不能给用户太多的选择。否则,当你告诉他可以这样用,也可以那样用,反而容易让人糊涂。小时候,我爷爷给我讲三国的故事,说周瑜其实比诸葛亮聪明,周瑜是一步三计,诸葛亮则是三步一计。但结果周瑜还是让诸葛亮气死了,就是因为前者计策太多,不知道用哪个好了。这虽然是虚构的故事,但其中的寓意却让我受益至今。

 

三个“便捷”也有相互矛盾的时候。尤其是实现成本会和学用成本矛盾,个人认为前者应该服务于后者。如果能让用户在调用时少写一行代码,实现因此多一百行代码也是值得的。虽然我在设计用户界面方面经验很有限,但我觉得界面上窗口的布局,菜单和按钮的排布,以及色彩与色调以及它们的搭配,都是很有讲究很有学问的,并不能因为我不懂而轻视它。

实现和学用的矛盾在模块开发中更为突出。因为对一个模块而言,调用者是另一个模块,学习运用者是该模块的开发人员,地位上和你以及你所开发的模块是完全平等的。这时的接口定义就好像是两个帮派在划分势力范围,于是两个模块开发组可能就会在多做些还是少做些的考量中互相踢皮球。这种类似的经历让我至今想起来都仍然感到不愉快。当然在这种局面出现之前,系统工程师或架构师已然缺位或失职,是根本原因。

至于学习和运用,大部分情况下是一致的,但偶尔也会出现矛盾。比方说对同一个功能有两种实现方法(决定了对外接口的差别),第一种实现是符合人们常识的,所以易上手。而第二种则另辟蹊径,在性能或其他方面有很大提高,但要向人解释清楚则颇费一番周章。这种情况下,我还是支持采用第二种方法,如果有好的使用效果,学习上的成本提升一些也是值得的。

 

总之,我觉得一个好的程序模块(我是一个程序员,不敢说的太大,还是以模块来说事儿吧),应该像一台同时支持专业摄影功能的傻瓜照相机。如果你想要它工作,只需摁一两个按钮,一张还过得去的照片就出来了。否则,捣鼓半天成不出个像来,用户多半会因为挫败感而放弃使用。另一方面,“简单”放低了使用的门槛,只有在使用的过程中,才能加深体验,才会不满足于简单功能,从而有动力去追求更复杂更灵活的配置,到了那个时候,原来一直支持的那些专业摄影功能就派上用场了。同时寓学于用,更有感性的认识。

我想用GNU C中提供的socket编程APIJava中提供的socket编程java.net包作比较来说明。首先要承认这和实现语言的不同有关系,并且GNU C的支持更灵活。但从易用这个角度,我无疑会支持Java的方案。在GNU C中,socket地址结构体因为不同地址类型的所有变数,以及其中的参数(AFPF,地址、端口字节顺序),还有在建立套接字时协议参数、套接字数据类型等的取值,统统都暴露给我们用户了,大大提高了学用成本。而这些在Java提供的socket编程接口中就得到了很好的封装,同时不失可扩展性。让我们一般的使用者免于关注这些细节,而专注于你到底是要一个UDP还是TCP的连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程的美学标准诌议 的相关文章

  • socket连接超时问题

    一部分 把CSDN与中文yahoo翻了底朝天 也没找到如何设置socket的连接超时的满意方法 问此问题的兄弟已有一大堆 这里偶就讲一下win下如何设置socket的connect超时 设置connect的超时很简单 CSDN上也有人提到过
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • 程序员水平分级

    导读 近日 whattofix com刊登了一篇 DanielMarkham的文章 What Level Programmer Are You 文内将参差不齐的程序员按照技术水平分为从 只读 到 上帝 共十一个阶段 以帮助广大程序员找到自身
  • 期货开户顺大市而逆小市

    期货的行情 有人愿意以更高的价来买入 就会涨 有人买意以更低的价格卖出 就会跌 现货市场上 一个馒头5角钱的时候 在期货市场上 如果有很多人争着买 这个馒头可能会涨到5块 或者50块 也是可能的 在这个馒头5块钱一个的时候 你感觉这个馒头太
  • 工控上位机程序为什么只能用C语言?

    工控上位机程序并不只能用C 开发 实际上在工业自动化领域中 常见的上位机开发语言包括但不限于以下几种 C C 是一种常用的编程语言 在工控领域中被广泛使用 它具有良好的面向对象特性和丰富的类库支持 可以实现高性能的上位机程序开发 C C C
  • 观点

    原文地址 https www sohu com a 315434322 672569 作者 中国工商银行业务研发中心 郝毅 霍嘉 肖烨 金石乔 本文笔者着重介绍了金融行业软件自动化测试的相关实践与思考 近两年来 多家金融机构和专业测试组织开
  • Python沙雕故事生成器

    Python故事生成器 本文章小编来给大家分享使用Python制作一个故事生成器 仅供娱乐 一 知识归纳 StringVar 控件变量 python中在使用界面编程时 用于跟踪数值不断发生变化的变量 确保数值的变更可以随时在根窗口上面显示出
  • “条件递进式编程”技巧两例

    什么是 条件递进式编程 呵呵 这是我自己起的名字 所谓条件递进式编程 就是指需要一系列相关函数组合执行的情况下 后续函数执行的必要性由前面所有函数执行是否成功来决定 比如说 有一系列函数如下DoSomething1 DoSomething2
  • 【CSDN】删除文章后,浏览量会减少吗?了解软删除和硬删除

    hello 我是小索奇 如果你也在博客写作的话 有没有考虑到一个问题 文章删除后 浏览量会减少吗 下面就给大家阐述一下 当在CSDN中删除已发布的文章后 该文章的浏览量统计会有以下情况 软删除状态的文章 浏览量统计会保留 不会下降或者重置
  • java 字符串拼接

    最常用的有4种方法 运算符 如果拼接的都是字符串直接量 则适合使用 运算符实现拼接 public static void main String args method1 字符串拼接 public static void method1 S
  • Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言 首先需要区分一下关闭socket和关闭TCP连接的区别 关闭TCP连接是指TCP协议层的东西 就是两个TCP端之间交换了一些协议包 FIN RST等 具体的交换过程可以看TC
  • vim菜鸟学习-中级篇2(经典配置)

    参考资料 http www cnblogs com striveford archive 2011 02 09 1950369 html http blog csdn net xjanker2 article details 5832784
  • Qt实现窗口关闭时提示确认退出

    Qt实现窗口关闭时提示确认退出 在Qt中 当用户点击窗口关闭按钮时 程序会直接退出 这样可能会导致数据丢失或其他不必要的操作 为了提高用户体验 我们可以在窗口关闭前给出一个提示框 询问用户是否确认退出 一 实现思路 通过重写QWidget类
  • 在Qt Creator中实现Android设备调试

    在Qt Creator中实现Android设备调试 要在Qt Creator中调试和运行Android应用程序 需要先连接设备并设置Qt Creator以使用适当的工具链 本文将介绍如何在Qt Creator中连接Android设备并配置Q
  • python能用来做什么?这3大主要用途你一定要知道!(实用)_python能做什么

    导读 如果你想学Python 或者你刚开始学习Python 那么你可能会问 我能用Python做什么 这个问题不好回答 因为Python有很多用途 但是随着时间 我发现有Python主要有以下三大主要应用 Web开发 数据科学 包括机器学习
  • 使用Draw.io制作泳道图

    使用Draw io制作泳道图 一 横向泳道图 1 有标题泳道图 2 无标题泳道图 3 横纵向扩展泳道 二 纵向泳道图
  • C++简易计数器

    Created by Carlgood Note This program is written in version DEV C 5 11 include
  • C语言是否已经跟不上社会需求?

    今日话题 C语言是否已经跟不上社会需求 一个问题的提出者说 几天前他受到老板的批评 因为他只精通C语言编程 无法满足老板的需求 实际上 C语言在嵌入式行业中仍然具有极高的价值 它高效 可移植 并广泛用于嵌入式系统的开发 然而 嵌入式系统的多
  • Java18都在路上了,你还在用Java8吗?

    Java18都在路上了 你还在用Java8吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 8
  • Java语言真的跌落神坛了吗?

    Java语言真的跌落神坛了吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 888 即可拿走

随机推荐

  • priority_queue删除

    在STL中 priority queue的底层实现是利用堆 priority queue没办法实现O 1 复杂度进行任意元素的删除操作 可用利用两个priority queue来实现 具体代码如下所示 push 给队列中插入元素 pop 弹
  • tex常用函数 上下行对齐_tex常用函数 上下行对齐_【学术写作】如何优雅地(用TeX)写AI论文...

    公众号关注 ML NLP 设为 星标 重磅干货 第一时间送达 作者 石昊悦 https zhuanlan zhihu com p 103519006 本文已由原作者授权 不得擅自二次转载 副标题 博士这一年多里老板都教了我些什么 划掉 Fl
  • Mybatis框架:foreach循环遍历字段以及mybatis取值报错There is no getter for property named '__frch_item_0'问题的记录

    估计这时候会有人想 查询动态字段返回值为tableName 就可以了啊 的确 但是个人原因吧 不太喜欢用 来做为查询返回字段 而且用 会影响数据库查询性能 因此才想到用foreach来循环遍历所需字段 foreach 基本语法 标签体内主要
  • 完整的蓝屏错误代码大全详解

    完整的BSOD错误代码列表从STOP 0x1到STOP 0xC0000221 一个死机 BSOD 的蓝屏 技术上称为一个STOP错误 若在Windows遭受了严重的错误 被迫 停 的问题 在任何Windows 操作系统中都会出现BSOD错误
  • CSS基础 —— 浮动布局实例详解和清除浮动的方法

    案例解析 非浮动布局时 包裹元素高度自适应 若给p标签增加浮动属性 包裹元素高度为0 出现高度塌陷问题 在实际应用中 这并不是我们想要的效果 这时就需要清除浮动 即闭合浮动元素 解决办法 方法1 为包裹元素追加一个内容为空的元素 设置cle
  • Linux命令之sed批量替换字符串

    使用sed命令可以进行字符串的批量替换操作 以节省大量的时间成本 将多个文件中的字符串1替换为字符串2 使用的格式如下 sed i s oldstring newstring g grep oldstring rl data a 该组合操作
  • 数据结构链表基本的增删改查源码

    include
  • 火山OpenSSL支持库-04-RC加解密

    本源码转载自利快云https www lkuaiy com 火山OpenSSL支持库 04 RC加解密 一 需要调用的模块 视窗基本类 MFC界面基本类 OpenSSL 二 RC加解密简单介绍 1 RC算法的速度可以达到DES加密的10倍左
  • Ironsource sdk在Unity 2019.3.x下代码过时bug

    报错 Assets IronSource Editor FacebookSettings cs 18 48 error CS0619 PBXProject GetUnityTargetName is obsolete This functi
  • Java 面向对象

    1 继承 1 extends 用于类的继承 implements 用于接口的继承 2 extends 不能多重继承 但是 implements 可以多重继承 3 super关键字 用来引用当前对象的父类 this关键字 指向自己的引用 4
  • k8s-client-go源码剖析(一)

    简介 云原生社区活动 Kubernetes源码剖析第一期 有幸参与云原生社区举办的Kubernetes源码剖析活动 活动主要以书籍 Kubernetes源码剖析 为主要思路进行展开 提出在看书过程中遇到的问题 和社区成员一起讨论 最后会将结
  • 简述ospf的工作原理_全方位了解OSPF的工作原理以及涉及到的重要技术

    OSPF协议是IGP中的一种动态路由协议 它属于链路状态协议 交互的是LSA 链路状态通告 信息 对路由信息的认知很清晰 该文主要阐述了OSPF协议的工作原理 OSPF状态机以及OSPF协议中涉及到的重要技术 关键词 OSPF协议 LSA
  • 快乐数

    编写一个算法来判断一个数是不是 快乐数 一个 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是无限循环但始终变不到 1 如果可以变为 1 那么这个数就是快乐数 示例
  • uni-app的生命周期

    uni app的生命周期包括应用生命周期和页面生命周期 应用生命周期涵盖了整个uni app应用的启动 运行和销毁过程 主要包括以下几个生命周期函数 onLaunch 应用初始化时触发 只触发一次 onShow 应用启动或从后台进入前台时触
  • 自动化测试 selenium 解决selenium.common.exceptions.SessionNotCreatedException: Message: session not created

    问题 selenium common exceptions SessionNotCreatedException Message session not created 原因 selenium模拟的客户端对浏览器的操作 相应浏览器的驱动版本
  • java模拟post请求发送json数据

    import com alibaba fastjson JSONObject import org apache http client methods CloseableHttpResponse import org apache htt
  • Python3中pickle模块介绍

    Pyhton3中的pickle模块用于对Python对象结构的二进制进行序列化 或pickling 和反序列化 或unpickling pickling 是将Python对象及其所拥有的层次结构转化为一个字节流 byte stream 的过
  • 首次使用计算机 鼠标没反应,鼠标没反应各种解决方法教程

    我们在使用鼠标的时候开始肯定没问题 但长期使用下来 总会出现一种故障 比如最常见的鼠标没反应的问题 也就是说不管你怎么滑动鼠标 显示器里的光标都不动了 这种问题怎么解决呢 我们要分成有线鼠标和无线鼠标两种情况 一 有线鼠标没反应 一般有线鼠
  • kalilinux搭建DCN漏洞靶场

    kalilinux系统搭建DCN漏洞靶场 前言 安装kalilinux 搭建靶场 WinSCP连接kalilinux实现文件上传 导入镜像 前言 最近想学一下WEB安全 顺便学习一下靶场环境的搭建 之前搭建过webug玩了一下 但自己电脑运
  • 编程的美学标准诌议

    编程的美学标准诌议 做了几年的程序员 虽然自己写的代码还远远没有达到要求 但在日复一日的实践过程中 我逐渐开始信奉一条标准 在实现功能的前提下 简单即是美 其实 编程的过程就好比是一个建模的过程 设计就是将一个现实问题抽象成逻辑模型 而编码