`
saybody
  • 浏览: 903128 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

谈谈编程(1) 编程概述

阅读更多

编程术可以看作实用魔法的一个分支。编程魔法师用时间和精力做祭品,与生活在计算机中的精灵订立契约,以换取驾驭代码的能力。
---fmddlmyy

要提高编程水平,唯有多看多写。这篇文章看似经验之谈,实质还是灌水。本次灌水,拟定了以下几个主题:

  • 编程概述
  • 软件开发中的方法论
  • 编程实践
  • 嵌入式编程的特点

编程概述

本文将从不同角度讨论“什么是编程”,或者“什么是编程的本质问题”。这些讨论并不是要得出什么定义,我们实际上是在表述各种编程思想,以期加深对编程的理解。

1 编程不是艺术

我们的世界是模糊的、连续的、不精确的,但软件是精确、离散的、形式化的,这就注定了软件不能完全描述现实世界。因此我们需要知道描述哪些部分,忽略哪些部分,这就是软件的本质问题。
--- Tom Demarco

编程不是艺术。编程不追求完美,它的目的是解决问题。

和艺术上的“只能意会,不可言传”相反,编程甚至不能忍受自然语言的模糊性,它要求问题被表述成可编译、可运行的代码,文字和图表只是辅助交流的工具。

每个程序员有两个面具:职业的和专业的。戴上职业面具后,程序员会用能找到的最好用的工具,以尽可能简单的方式,在合理的成本内解决问题中必须解决的部分。

而戴上专业面具的程序员,会不厌其烦地学习各种编程知识(很多都不是职业需要的),积累经验值,吸收可复用的模式和思想。他们会用大量时间去理解程序的表象和CPU的汇编代码之间究竟发生了什么。他们有着探索未知领域和练功升级的强烈欲望。

他们在不断接近技艺的完美,而这个技艺本身是以不谈完美、但求有效的方式解决问题。他们付出了大量的努力,而这些努力的驱动力是好奇心和进取心。如同《魔法学徒》中描述的魔法师,一个魔法师所追求的东西只有志趣相投的魔法师才能理解,而不管他们出于哪个阵营。了解事物真相本身带来的满足就可以作为一切努力的回报,

2 控制复杂性

任何一个正在构建大型系统的人,天天面对的中心议题就是:如何剔除不必要的、人为的、自找的复杂部分,并控制好剩下的,无可逃避的复杂性。
--- Betrand Meyer

编程可以被看成一种管理工作,管理的对象是代码,控制的对象是代码的复杂性。

中国的传统思维比较喜欢谈本质,追求一种称作“道”的东西。而在编程上,表象和本质同样重要。所有程序说到底不过是一些汇编语句的组合,但了解这个本质在大多数场合都不能有助于解决实际问题。

写代码是为了解决实际问题。当代码的数量增加到一定程度,对代码自身的控制也会成为一个重要的问题。数量改变了本质。

管理的要诀是削弱、孤立被管理的对象,“使民无知”,“使民”“鸡犬之声相闻”却“至老死”而“不相往来”。每个被管理的对象在完成自身工作的前提下,对其它对象的了解应当尽可能少。通过尽量降低对象间的耦合程度来控制复杂性。

只有有效地控制复杂性,我们才能使用越来越大的信息块,驾驭越来越多的代码,用这些0和1的操作去实现前人没有,甚至无法完成的工作。

3 复用

编程技艺的核心是代码的复用。复用已有的知识是积累、提高的前提,否则就会像谁谁谁那样每天推石头上山,而不能累进。在上帝看来,重复是一种惩罚的手段。

编程这个职业知识更新比较快,可以学习的东西也很多。有些人觉得累,但有些人却觉得其乐无穷,觉得从事这个职业是很幸运的事情。

编程的实质是建筑,根据应用的需求,不断建筑更大的信息块。我们所写的所有程序,都可以被看作对语言的扩充。事实上,我们在不停地开发新的语言,我们所写的每个函数、每个类都是在为现有语言增加新的功能。我们按照适合特定应用的模式,组合各种信息块,完成实际的应用。这些信息块有的是我们自己做的,有的是拿来的。

信息块可以被组合的关键就是简单、明确的接口。所以,我们应当针对接口编程,而不是针对应用编程。应用意味着变化和不可复用。将应用合理分解为模块,定义好模块间的接口,然后按照接口构建模块。模块分解的原则是:

  • 模块的耦合程度尽可能得低(有人称此为最少知识原则);
  • 接口尽可能简单(有人称此为接口隔离原则);
  • 如果将变化的因素封装到模块中,每个模块应该只封装一个因素(有人称此为单一责任原则);
  • 使特定于应用的代码尽可能得少 。

针对接口编程的好处有两个方面:
  • 信息块可以被复用;
  • 复杂性可以被更好地控制。

人们用各种方式复用知识,其实C语言本身又何尝不是知识的复用呢?其它复用方式包括:库函数、新的语言和编译器、新的脚本、类库、程序框架、设计模式、面向对象、面向组件、面向服务、面向方面、面向领域、各种开源代码、开发环境提供的各种Wizard和糖衣、各种代码生成工具等等。充分了解编程环境,善于复用各种资源,是程序员的基本功。
分享到:
评论

相关推荐

    Proxy源代码分析--谈谈如何学习linux网络编程

    对于想要深入了解Linux网络编程的初学者来说,《Proxy源代码分析——谈谈如何学习Linux网络编程》是一篇非常有价值的资料。它不仅提供了具体的源代码分析,还通过实例帮助读者理解Linux网络编程的基本原理和技术要点...

    谈谈在.NET下的多线程编程

    ### .NET下的多线程编程概述 #### 一、引言 随着计算机技术的发展,现代操作系统大多支持多线程机制,这一特性极大地提高了程序的执行效率。微软的.NET框架不仅支持传统的单线程应用程序开发,同时也提供了强大的多...

    捕获HTTP包,网络编程实现

    1. 初始化Winsock:调用`WSAStartup`函数初始化Winsock库,并设置合适的版本。 2. 创建监听SOCKET:使用`socket`函数创建一个SOCKET,指定为监听类型(如AF_INET,IPv4协议)。 3. 绑定SOCKET:调用`bind`函数将...

    谈谈如何提高学习效率[文].pdf

    但我可以从标题“谈谈如何提高学习效率[文].pdf”和描述“谈谈如何提高学习效率[文].pdf”中,以及基于我自身专业领域“软件网络技术”进行相关知识点的概述。 提高学习效率是每个学生和终身学习者都追求的目标。...

    Algorithmic-Toolbox:在这里,我将概述使用算法和数据结构的位置,并逐步解决一些示例编程难题,并尝试使用不同的算法解决它们

    接下来,我们谈谈算法。算法是一系列解决问题的清晰指令,可以用于计算、数据处理和自动推理。典型的算法类别包括排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图算法...

    谈谈你对机器人的认识.pdf

    1. **示教再现型**(第一阶段):这类机器人只能执行预编程的任务,不具备感知环境或适应变化的能力。它们的操作基于固定的工作流程,对于可能出现的问题或异常情况缺乏应对策略。 2. **感觉型**(第二阶段):随着...

    谈谈你对机器人的认识 (3).pdf

    【机器人技术概述】 机器人,源于捷克作家卡雷尔·卡佩克的科幻剧本,这个词在1920年首次提出,预示了机器人可能带来的社会影响。自20世纪60年代起,随着微电子学和计算机技术的快速发展,机器人技术开始兴起。1959...

    VB+ACCESS计算机等级考试管理系统(源代码+系统+答辩PPT).rar

    此外,答辩PPT通常会包含项目概述、系统架构、主要功能介绍、技术难点与解决方案、系统性能和优势等内容,帮助开发者向评审委员会展示其设计思路和实现成果。 学习这个项目,不仅可以提升VB编程技能,还可以掌握...

    谈谈自动化控制工厂中电气自动化制约技术.rar

    一、电气自动化概述 电气自动化是利用电子设备和信息技术对电力系统进行自动控制的过程,其核心包括自动控制系统、传感器、执行机构、计算机监控系统等。这些技术的融合使得工厂能够实现无人或少人操作,提高了生产...

    谈谈电话信号的检测与判别.pdf

    #### 电话信号概述 电话信号通常是由电话交换机发送到电话机中的,主要包括铃流信号和音频信号两大类。音频信号进一步细分为拨号音、忙音、回铃音和长途音等几种。这些信号的特点如下: - **铃流信号**:交流电压...

    数据库应用开发技术上机实验_简易计算器_delphi 7(含源程序、代码和报告)

    1. 项目概述:对计算器应用的简单介绍,包括设计目标和功能。 2. 技术实现:详细描述所用技术和方法,比如Delphi 7的组件使用,事件处理机制等。 3. 功能实现:逐个解释各个功能的实现细节,比如运算逻辑和错误处理...

    VB添加注释与滚轮工具

    - 在每个函数、过程或模块的开头提供概述,解释其目的和使用方法。 - 对复杂代码块进行解释,以便理解其工作原理。 - 保持注释的更新,当代码修改时,确保注释也同步更新。 接下来,我们谈谈“滚轮工具”。在VB环境...

    JSP訳文--工具--Java

    UltraEdit 7.2 WebGain Studio 4 with VisualCafe Forte for ...概述 Servlet2.1规范 Java 在Client/Server 网络中的应用 Java 编程技术中汉字问题的分析及解决 利用JAVA语言实现支持视频点播的...

    谈谈C++学习之Pair的使用方法

    **一、Pair类型概述** `std::pair` 是一个模板类,用于封装两个不同类型的数据。它的基本定义形式为 `pair<类型1, 类型2>`,其中 `类型1` 和 `类型2` 分别代表两个数据的类型。例如,以下代码创建了一个包含一个...

    Ber_erxiang.rar_二相码_二相码频谱图_相关函数图

    接下来,我们来谈谈自相关函数。自相关函数衡量一个信号与自身在不同时间延迟下的相似度,是分析信号周期性、统计特性和时延性质的重要工具。对于二相码,自相关函数可以揭示码元间的相关性,这对于评估码间干扰...

    程序员、研究生等简历模板(通用型模块)

    8. **自我评价**:这是你展示个人特点和优势的机会,可以谈谈你的学习能力、团队协作精神、解决问题的能力等。 【设计与格式** 1. **清晰布局**:简历应有清晰的版式,便于阅读。使用合适的标题和子标题,保持段落...

    C语言41:.rar

    首先,让我们来谈谈指针,这是C语言的一个核心特性。指针允许我们直接操作内存地址,这使得程序能够实现高效的数据处理和动态内存分配。理解指针类型、指针变量的声明、初始化、解引用以及指针算术是至关重要的。...

    spring面试题宝典

    1. **AOP(面向切面编程)**:用于实现代码的解耦,提供如日志、事务管理等横切关注点。 2. **数据访问/集成**:包括JDBC模板、ORM支持(Hibernate、MyBatis等),简化数据库操作。 3. **MVC框架**:用于构建Web...

Global site tag (gtag.js) - Google Analytics