编程术可以看作实用魔法的一个分支。编程魔法师用时间和精力做祭品,与生活在计算机中的精灵订立契约,以换取驾驭代码的能力。
---fmddlmyy
要提高编程水平,唯有多看多写。这篇文章看似经验之谈,实质还是灌水。本次灌水,拟定了以下几个主题:
- 编程概述
- 软件开发中的方法论
- 编程实践
- 嵌入式编程的特点
编程概述
本文将从不同角度讨论“什么是编程”,或者“什么是编程的本质问题”。这些讨论并不是要得出什么定义,我们实际上是在表述各种编程思想,以期加深对编程的理解。
1 编程不是艺术
我们的世界是模糊的、连续的、不精确的,但软件是精确、离散的、形式化的,这就注定了软件不能完全描述现实世界。因此我们需要知道描述哪些部分,忽略哪些部分,这就是软件的本质问题。
--- Tom Demarco
编程不是艺术。编程不追求完美,它的目的是解决问题。
和艺术上的“只能意会,不可言传”相反,编程甚至不能忍受自然语言的模糊性,它要求问题被表述成可编译、可运行的代码,文字和图表只是辅助交流的工具。
每个程序员有两个面具:职业的和专业的。戴上职业面具后,程序员会用能找到的最好用的工具,以尽可能简单的方式,在合理的成本内解决问题中必须解决的部分。
而戴上专业面具的程序员,会不厌其烦地学习各种编程知识(很多都不是职业需要的),积累经验值,吸收可复用的模式和思想。他们会用大量时间去理解程序的表象和CPU的汇编代码之间究竟发生了什么。他们有着探索未知领域和练功升级的强烈欲望。
他们在不断接近技艺的完美,而这个技艺本身是以不谈完美、但求有效的方式解决问题。他们付出了大量的努力,而这些努力的驱动力是好奇心和进取心。如同《魔法学徒》中描述的魔法师,一个魔法师所追求的东西只有志趣相投的魔法师才能理解,而不管他们出于哪个阵营。了解事物真相本身带来的满足就可以作为一切努力的回报,
2 控制复杂性
任何一个正在构建大型系统的人,天天面对的中心议题就是:如何剔除不必要的、人为的、自找的复杂部分,并控制好剩下的,无可逃避的复杂性。
--- Betrand Meyer
编程可以被看成一种管理工作,管理的对象是代码,控制的对象是代码的复杂性。
中国的传统思维比较喜欢谈本质,追求一种称作“道”的东西。而在编程上,表象和本质同样重要。所有程序说到底不过是一些汇编语句的组合,但了解这个本质在大多数场合都不能有助于解决实际问题。
写代码是为了解决实际问题。当代码的数量增加到一定程度,对代码自身的控制也会成为一个重要的问题。数量改变了本质。
管理的要诀是削弱、孤立被管理的对象,“使民无知”,“使民”“鸡犬之声相闻”却“至老死”而“不相往来”。每个被管理的对象在完成自身工作的前提下,对其它对象的了解应当尽可能少。通过尽量降低对象间的耦合程度来控制复杂性。
只有有效地控制复杂性,我们才能使用越来越大的信息块,驾驭越来越多的代码,用这些0和1的操作去实现前人没有,甚至无法完成的工作。
3 复用
编程技艺的核心是代码的复用。复用已有的知识是积累、提高的前提,否则就会像谁谁谁那样每天推石头上山,而不能累进。在上帝看来,重复是一种惩罚的手段。
编程这个职业知识更新比较快,可以学习的东西也很多。有些人觉得累,但有些人却觉得其乐无穷,觉得从事这个职业是很幸运的事情。
编程的实质是建筑,根据应用的需求,不断建筑更大的信息块。我们所写的所有程序,都可以被看作对语言的扩充。事实上,我们在不停地开发新的语言,我们所写的每个函数、每个类都是在为现有语言增加新的功能。我们按照适合特定应用的模式,组合各种信息块,完成实际的应用。这些信息块有的是我们自己做的,有的是拿来的。
信息块可以被组合的关键就是简单、明确的接口。所以,我们应当针对接口编程,而不是针对应用编程。应用意味着变化和不可复用。将应用合理分解为模块,定义好模块间的接口,然后按照接口构建模块。模块分解的原则是:
- 模块的耦合程度尽可能得低(有人称此为最少知识原则);
- 接口尽可能简单(有人称此为接口隔离原则);
- 如果将变化的因素封装到模块中,每个模块应该只封装一个因素(有人称此为单一责任原则);
- 使特定于应用的代码尽可能得少 。
针对接口编程的好处有两个方面:
人们用各种方式复用知识,其实C语言本身又何尝不是知识的复用呢?其它复用方式包括:库函数、新的语言和编译器、新的脚本、类库、程序框架、设计模式、面向对象、面向组件、面向服务、面向方面、面向领域、各种开源代码、开发环境提供的各种Wizard和糖衣、各种代码生成工具等等。充分了解编程环境,善于复用各种资源,是程序员的基本功。
分享到:
相关推荐
文章目录引出问题(代码示例)问题原理说明问题解决方法1:使用锁机制方法2:原子类AtomicInteger原子类CAS机制实现线程安全概述源码分析CAS与Synchronized:乐观锁,悲观锁。 概述:所谓的原子性是指在一次操作或者...
1.说说什么是架构模式。 2架构的5大要素是哪5大要素? 3.说说什么事集群,什么是分布式。 4.说说对Redis的理解 5.你所了解的NoSq|除了Redis还有哪些? 6.谈谈对消息队列的理解 7.说说你对数据库读写分离的理解 8.如果...
UltraEdit 7.2 WebGain Studio 4 with VisualCafe Forte for ...概述 Servlet2.1规范 Java 在Client/Server 网络中的应用 Java 编程技术中汉字问题的分析及解决 利用JAVA语言实现支持视频点播的...
流行电影第1阶段项目概况我们大多数人都可以躺在沙发上和与亲朋好友一起欣赏电影。 在此项目中,您将构建一个应用程序,以允许用户发现最流行的电影。 我们将把这个应用程序的开发分为两个阶段。 首先,让我们谈谈第...
1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short ...
1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short ...
2.3 谈谈WinMain 函数 (例子代码EX02-00) 2.3.1 WinMain 函数的定义及功能 2.3.2 窗口及其生成 2.3.2.1 如何设计一个窗口类——步骤1 2.3.2.2 注册设计好的窗口类——步骤2 2.3.2.3 创建窗口——步骤3 2.3....
放弃“学术”的写作习惯(反编程步骤!) 在尝试写之前先谈谈你的研究。 写作以吸引读者——尽量不要让他们感到厌烦! 停止等待“灵感”。 接受写作对每个人来说都很难。 修订。 没有人在第一次尝试时就做到完美。 ...
Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位...
编程编程 编程 言 语言语言 语言 C# 未来 未来未来 未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越...
1 第一章 系统概述 2 1.1 系统介绍 2 1.2 课题目的及意义 2 1.3 主要设计功能 3 第二章 开发方法的选择 4 2.1 开发工具的选择 4 2.2 WINDOWS下的VISUAL BASIC 编程环境介绍 4 2.2.1 Visual ...