谈谈编程(1) 编程概述

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

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

编程概述

软件开发中的方法论

编程实践

嵌入式编程的特点

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

模块的耦合程度尽可能得低(有人称此为最少知识原则);

接口尽可能简单(有人称此为接口隔离原则);

如果将变化的因素封装到模块中,每个模块应该只封装一个因素(有人称此为单一责任原则);
使特定于应用的代码尽可能得少 。

针对接口编程的好处有两个方面:
信息块可以被复用;

复杂性可以被更好地控制。

人们用各种方式复用知识,其实C语言本身又何尝不是知识的复用呢?其它复用方式包括:库函数、新的语言和编译器、新的脚本、类库、程序框架、设计模式、面向对象、面向组件、面向服务、面向方面、面向领域、各种开源代码、开发环境提供的各种Wizard和糖衣、各种代码生成工具等等。充分了解编程环境,善于复用各种资源,是程序员的基本功。
...全文
235 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
MuseIn 2005-09-27
  • 打赏
  • 举报
回复
8错
nonocast 2005-09-27
  • 打赏
  • 举报
回复
不错的,但似乎感觉层次有些乱
类似interface,reuse这些不应该过早的暴露
而是应该通过一手手法将其缓缓带入
否则跟一个newbie说reuse,interface他能理解吗?
呵呵
不过写的还真不错
Featured 2005-09-27
  • 打赏
  • 举报
回复
楼主的文笔不错
这种理性风格的编程讲义还是第一次见到。我喜欢
bobob 2005-09-27
  • 打赏
  • 举报
回复
不错,应该受到奖励
fisker0303 2005-09-27
  • 打赏
  • 举报
回复
very good!
xx_jj 2005-09-27
  • 打赏
  • 举报
回复
good! thank you!
newghc 2005-09-27
  • 打赏
  • 举报
回复
不错 看了之后觉得很佩服
iamwiner 2005-09-27
  • 打赏
  • 举报
回复
不错.
老夏Max 2005-09-27
  • 打赏
  • 举报
回复
先Mark,中午看看!
ming6424 2005-09-27
  • 打赏
  • 举报
回复
不错
oyljerry 2005-09-27
  • 打赏
  • 举报
回复
最好整理一下,做成一个整的文档 ^_^
nkwesley 2005-09-27
  • 打赏
  • 举报
回复
zhxk 2005-09-27
  • 打赏
  • 举报
回复
帮你顶!

cutexue 2005-09-27
  • 打赏
  • 举报
回复
fmddlmyy 2005-09-27
  • 打赏
  • 举报
回复
最近写了些讲义用于部门内部培训,这几篇是编程基础部分。大家帮着看看有什么错误和不足,以免我误人子弟。
需要程序员经常刷题吗程序员学术写作风格指南 这是为程序员编写的学术写作风格指南,由 . 目录 0. 介绍 0.1 什么是好的写作? 好的写作可以清晰有效地传达一个想法。 (需要有话要说和思路清晰。) 好的写作是优雅和时尚的。 (需要时间、修改和一个好的编辑器!) 0.2 什么是好的作家? 今天有事。 逻辑思维。 一些简单易学的风格规则。 0.3 成为更好作家的额外步骤 阅读、注意和模仿。 放弃“学术”的写作习惯(反编程步骤!) 在尝试写之前先谈谈你的研究。 写作以吸引读者——尽量不要让他们感到厌烦! 停止等待“灵感”。 接受写作对每个人来说都很难。 修订。 没有人在第一次尝试时就做到完美。 学习如何无情地切割。 永远不要太执着于你的话。 0.4 优秀科学写作的主题 复杂的想法不需要复杂的语言。 科学写作应该很容易,甚至阅读起来很愉快! 0.5 概述:有效写作的原则 删除不必要的单词和短语; 学会舍弃你的话! 使用主动语态(主语+动词+宾语)。 用动词写:用强动词,避免把动词变成名词,不要把主要动词埋起来! 1. 减少杂乱 1.1. 自重词和短语 应直接删除自重词和短语。 相反,提供参考

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧