我之死,有子存焉;子又生孙,孙又生子;子又有子,子又有孙。子子孙孙,无穷匮也。而山不加增,何苦而不平?” ——《愚公移山》,《列子·汤问篇》
1、 编程的精义
仅仅就编程序来说,实在是一件很简单的事,甚至可以说是一件劳力活。两千年前的寓言中,已经成就了一位工程名家:愚公。在这位名家的身上,浓缩了项目组织者、团队经理、编程人员、技术分析师等众多角色的优秀素质。他的出现,远远早于计算机发展的历史,甚至早于一些西方国家的文明史。
汤问篇中所述的愚公移山这一事件,我们看到了原始需求的产生:
“惩山北之塞,出入之迂”
我们也看到了项目沟通的基本方式:
“聚室而谋曰”
然后,我们看到愚公确定了一个项目的目标:
“毕力平险,指通豫南,达于汉阴”
并通过研讨,择定了一个井然有序的、可以实现的技术方案:
“扣石垦壤,箕畚运于渤海之尾”
在这个项目中,动用了三名技术人员和一名工程管理人员:
“(愚公)率子孙荷担者三夫”
并获得了一名力量较弱,但满富工作激情的外协:
“邻人京城氏之孀妻,有遗男,始龀,跳往助之”
基本上,这已经描述了“愚公移山”整个工程的概况。接下来,我们应该注意到愚公作为编程人员的基本素质。在与“河曲智叟”的对答中,他叙述了整个工程的实现程序:
“虽我之死,有子存焉”,这里描述了可能存在的分支结构,即“IF”条件判断。
“子又生孙,孙又生子;⋯⋯子子孙孙,无穷匮也”,这里描述了完成这个工程所必须的循环结构。
作为优秀的程序分析师,愚公论述了这个循环的可行性:由于“山不加增”,所以条件“山平”必将成立(“何苦而不平”),所以这不会是一个死循环。
在愚公的论述中,我们看到了编程的根本:顺序、分支和循环。庞大若“愚公移山”这样的工程,都是可以通过这样简单的编程来实现的。这,就是编程的精义了。
2、 会或者不会写程序的问题
我经常会被人问到“(我)能不能学会写程序”这样的问题。
这个问题由来以久。上溯七、八年,程序员还是少有人从事的职业。听说的人少,真正了解的人也不多。而当一个程序软件被装在电脑里并开始运行时,人们便开始惊讶于程序员的厉害。所以“能不能学会写程序”甚至成了一些人对自己的智力考评,所以便有人向我这样发问。
愚公都能明白的编程精义,那些向我发问的智叟们又怎么会不明白呢?
所以除了先天智障或后天懒惰者,都是可以学会写程序的。如果你能确信,自己知道在早上起床后需要:
如果天冷则先穿衣服后洗漱
如果天热则可反之
日复一日直到死亡
那么你就可以开始编程了。甚至,如果你认为以下条件成立:
如果有类似于生病、不能行动、以及意外的紧急事件,则当日可以略过
那么你就可以开始向设计师发展。因为你已经具备了一项常人不具备的基本素质:折衷。
3、程序 = 算法 + 结构
编程作为一种行为,只需要知道其逻辑方法就可以了。所谓编程实际上是把一件事情交给计算机去做,你认为这件事该如何做,就用“程序语言”的形式描述给计算机。如果你原本就不明白如何去做,那么你也不要期望计算机去理解你想要做什么。
所以编程的第一要务是先把事情分析清楚,事件先后的逻辑关系和依赖关系搞清楚,然后再去代码实现。一接到任务就开始Coding的程序员,通常就是加班最多的程序员。
记住:积极工作和勤于思考都要占时间。
第一个完成关于编程本质的思考的人,提出了一个公式“程序 = 算法 + 结构”。这个公式的精彩之处,在于它没有任何的地方提及到Code。甚至可以说,在这个公式里,代码是不存在的。
存在的只是思想。
算法是对一个程序的逻辑实现的描述,而结构是逻辑实现所依附的数据实体。只要开发人员将这个程序的算法设计出来了,把结构描述出来了,那么程序就已经定型了。剩下的事,简而言之,就是劳力活。
在计算机专业所学的课程中,同时讲述算法和结构的,是“数据结构”。现在,你放下手边这本书,再去读读被你扔到不知哪个角落的《数据结构》,你仔细看看,在所有的算法描述中,有且仅有三种执行逻辑:顺序、分支和循环。简单若顺序表,复杂如树、图,它们的算法都是用上面这三种执行逻辑来描述的。
4、语言
当你熟悉了一门语言之后,你会发现,编程语言只有喜欢与不喜欢的问题,没有会不会的问题。任何的一门语言,你都可以在两周内掌握并开始熟练编程。因为任何的一门语言,他们的底层函数库都是那么的相似,而他们API都是那样的依赖于操作系统。A语言里有的,B语言里也基本都有。
通常而言,语言的差别主要表现在适用范围上。一些语言适合做数值处理,小数点后可以精确到原子级,而小数点前则可以表达到宇宙之无穷;另一些语言则适合做图形处理,它的底层函数库比其它语言可以快上十倍或数十倍;还有一些语言则适合于做网页,要用它来做一个通讯薄软件都将是史无前人的挑战。
成天讨论这门语言好,或者那门语言坏的人,甚至是可悲的。不但是悲其一叶障目,更要悲叹于那种大愚若智的自得心态。
5、在没有工程的时代
在没有工程的时代,上面所说的就是一个程序员的全部。他们掌握了一门语言,懂得了一些生活中最常见的逻辑,他们用程序的方式思考和学习了一些算法,并根据前人的经验,把这些算法跑在了一些数据结构之上,最后,我们就看到了他们写的程序。
在没有工程的时代,出现了非常非常多的人物。其中算法大师,有游戏大师,有语言大师,有挣钱的大师⋯⋯
唯独,没有工程大师。嗯,可以理解嘛,那是没有工程的时代。好蛮荒,好远古的。
分享到:
相关推荐
2. **VCL框架**:Visual Component Library是Delphi的组件库,包含了大量的预定义控件和类,允许开发者快速创建用户界面,如按钮、文本框等。 3. **RAD(快速应用开发)**:Delphi以其快速应用开发闻名,通过可视化...
7.如何装入一个系统预定义光标?(Visual C++编程 源代码)7.如何装入一个系统预定义光标?(Visual C++编程 源代码)7.如何装入一个系统预定义光标?(Visual C++编程 源代码)7.如何装入一个系统预定义光标?...
在《小土豆》编程系统150308中,用户可以找到各种预定义的代码块,这些代码块代表了常见的编程操作,如变量定义、条件判断、循环、函数调用等。用户只需要选择合适的代码块,然后按照逻辑顺序排列它们,就能创建出...
《三国故事-桃园结义》是一个以Scratch少儿编程为平台的经典教学作品,旨在培养儿童的编程思维和益智能力。在这个项目中,孩子们可以通过编程实现一个基于三国历史故事的游戏,具体是“桃园结义”的场景。Scratch是...
5. **代码模板**:预定义的代码模板可以加速常见任务的编码,例如创建事件处理程序、数据库连接代码等,只需简单地插入模板,然后根据需要进行定制。 6. **集成开发环境(IDE)增强**:VB编程助手可能扩展了标准VB ...
JAVA编程规范.pdf 本文档提供了JAVA编程规范的详细说明,涵盖了类和方法的设计、编程原则、命名约定等方面的内容。 类和方法的设计 在设计类和方法时,需要遵守一些基本原则。首先,类应该具有强大的内聚力,即类...
用户可以通过选择预定义的功能模块,然后将它们连接起来,形成程序的流程图。这种方式不仅使得编程过程更为直观,也减少了错误的发生,因为大部分语法和逻辑错误在设计阶段就能被发现。 此外,雅奇MIS支持多种编程...
"精义模块"是易语言生态系统中的一个重要组成部分,它是一系列预先编写好的功能模块,供用户在自己的程序中调用,以实现特定的功能。在"精易模块 V3.2.ec"这个压缩包中,我们看到的是一个易语言的精易模块版本3.2,....
- **通用功能块库**:提供了丰富的预定义功能块,覆盖了常见的控制需求,如定时器、计数器等。 - **系统功能块库**:专门用于实现M218的特殊功能,如高速计数、脉冲输出等。 #### 四、编程实践与实例 - **快速入门...
UEFI在启动过程中会加载一系列预定义的驱动程序,称为UEFI驱动,它们实现了UEFI协议标准,是UEFI软件基础的组成部分。 UEFI编程的一个重要方面是理解其启动流程,包括初始化、运行UEFI应用程序、加载操作系统等。...
windows
VC++6.0包含了MFC(Microsoft Foundation Classes)库,这是一个强大的类库,提供了大量的预定义类,如CButton、CEdit和CListBox等,用于构建Windows GUI应用程序。编程助手会在编写类相关的代码时提供类成员的自动...
模块和包是组织代码的方式,Python的标准库提供了大量预定义模块,如os、sys、math、numpy和pandas等,涵盖了系统交互、数学计算、数据处理等多个领域。同时,你也可以自定义模块,方便代码的管理和共享。 在实际...
5. **模板支持**:预定义的代码模板可以帮助快速生成常见的代码结构,比如类、函数等。 6. **资源管理**:可能提供对项目文件、头文件和库的更好管理和组织,提高工作效率。 7. **多语言支持**:尽管标题中只提及了...
在C++中,`type_traits`库是模板元编程的一个重要工具,提供了许多预定义的元函数,用于检查和操作类型属性。例如,`std::is_same, U>`元函数可以判断两个类型T和U是否相同。 模板元编程的高级概念包括lambda表达式...
3. **VCL框架**: Visual Component Library是Delphi的核心库,包含了大量的预定义组件,用于构建用户界面和实现各种功能。 4. **RAD(快速应用程序开发)**: Delphi以其快速应用程序开发能力著称,允许开发者通过...
数控编程培训(果义围).pptx
例如,`java.util.function`包下提供了多个预定义的函数式接口,如Predicate、Function等。 #### 七、其他新特性 除了以上介绍的主要新特性外,Java 8还包含了其他一些重要的改进,例如: - 新增Default方法和静态...