编程的本质探索Nature of Coding

   很多朋友对“成为编程高手”都很有兴趣,但对我的那篇文章提出很多批评,多是指出该文对这个话题说得不够深入。事实上在一篇短文中把这么大的问题说清楚是很难的事,所以从本篇开始,我们从几个方面入手,详细讨论一下这个问题,今天我们讨论一下编程的本质。

   在探讨编程之前,我们先看看我们生活的这个世界,这个世界五彩缤纷,丰富多彩,但都是由元素周期表中的108个元素构成,而这108个元素又主要由电子、质子和中子组成,其中中子不带电荷,可以忽略。一个电子带一个负电荷,一个之子带一个正电荷。如果把电子用0表示,质子用1表示,有没有发现我们这个世界其实就是由0、1构成的,是不是跟我们coding一样。质子、电子按照一定规律编码,形成了我们这个世界存在的108个元素,这是第一层编码。原子与原子之间需要通过“键”建立关联,形成分子。“键”是由两个电子组成的电子对构成,一个电子属于A原子,一个电子属于B原子,A、B原子通过这个“键”紧密的联系在一起。如果一个原子有一个孤立的电子游离在原子外层,这个电子就有机会与别的原子的电子形成“键”,我们可以形象把这个孤立的电子比喻为一只手,有一个孤立的电子就有一只手,有两个孤立的电子就有两只手,以此类推。对于原子来说,最多只有四只手。比如氯原子有一只手,氧原子有两只手、氮原子有三只手,炭原子有四只手。形成键的规则可以说是原子编码的规则。

   这里提出一个问题:这个世界有108个元素,什么元素是最重要的?

   我们把这个世界上的物质分为无机物和有机物,无机物是有限的,而有机物是无限的,正因为有有机物,我们这个世界才会如此多彩。有机物是什么?我们以前学过,有机物就是碳水化合物。我们知道无机物的分子都很小,而有机物的分子都很大,这个很大的分子的骨架是由炭原子构成的。这个世界有108个元素,为什么是炭?氧不可以吗?氮不可以吗?硅不可以吗?这里分析一下炭的特点,炭(C)有四只手,可以用两只手、三只手或四只手来构建分子的骨架,用一只手或两只手去链接其他元素的原子,形成分子的枝叶,由于骨架不同、枝叶不同就会形成功能不同的有机分子。这种变化是无穷的。有一只手的氯元素只能两两配对,形成的是一个点。有两只手的氧元素可以连接成一条线,比如双氧水H-O-O-H。有三只手的氮元素则能形成面。只有有四只手的炭元素才能形成立体的结构,线和面都很脆弱,容易断和折,而立体的结构就很稳定。这种稳定有多强,我们只要看看由炭元素构成钻石有多坚硬。有四只手的不止有炭,还有硅,但硅的原子核已经太大了,“键”不再那么强劲,所以也无法形成大分子。可以说炭是这个世界编码的核心元素。我们现在可以理一理自然界的编码过程,首先通过质子和电子编码出108个元素,这108个元素通过价键编码出各种化合物,而炭元素由其特殊性开始缓慢地编码出各种简单有机物,再到复杂有机物,再到细胞、再到各种动植物。这个过程经历了45亿年。

   我们现在回到软件编程,软件是由表示0、1的二进制开始,0、1只能表示两个状态,很简单,但两个二进制数就可以表示四种状态,三个可以有8种状态,依此类推。这些状态还没有意义,所以需要进行第一步编码,赋予其含义。我们都知道,最初使用8位进行编码,后来发展到16位、32位、64位编码,现在是使用64位编码,用这64位二进制数来定义最基本的东西,比如数字、字母、汉字等。有了基本的编码定义就可以定义规则了,用这些规则来构建我们现在复杂的程序。我们熟悉的编程语言C#、Java都是是来定义这些规则的。

   这些编程语言首先都会定义一些基本类型,比如整型、浮点数、双精度、字符串、日期等。这些基本类型是编程的基础。基于基本类型可以构建复杂的类型:比如对象、集合等。对象是由基本类型和对象、集合构成的。集合是由多个对象或集合或基本类型构成。

   这些编程语言还会定义编程的规则,这些规则也不复杂,比如流程的定义,比如线性、循环、分支等流程。通过这些规则就可以编写完成各种任务的程序了。

   对象是一个很重要的概念。对象的变化是无限的。正因为有这无限的变化,才能方便的构建出如此多样复杂的软件。但对象不是必须的,因为早前很多编程语言是没有对象这个概念的,也同样完成很多任务。

   编程的基础要求很低,编程的规则也很简单,很容易上手,但要想编出好的代码却不容易,这是因为变化太多,这些变化中有一些可以沉淀下来,形成所谓的编程模式,但更多的还只是存留在每个程序员脑中的经验。

   编程的本质是用简单编码编写成复杂的程序,编写的过程中的变化是无穷尽的,这形成的复杂程序要能满足用户的需求。

   简单来说,就是用简单编码、规则来构建复杂程序。从简单到复杂其中有巨大的鸿沟,这种鸿沟很难从书本上得到,往往需要经过多年的积累才能在其中行走自如。


 

本文转自 陈革 51CTO博客,原文链接:http://blog.51cto.com/chenge/1238936 ,如需转载请自行联系原作者

上一篇:圆通快递快速免费对接快递鸟单号查询api接口


下一篇:递归模板解决二叉树的前中后序遍历问题