老子《道德经》开篇第一章为“天地之始”,原文是这样写的:
道,可道,非常道。名,可名,非常名。无,名万物之始。有,名万物之母。故常无,欲以观其妙;常有,欲以观其徼。此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。
这其中“故常无,欲以观其妙;常有,欲以观其徼”一句的意思为:我们需要经常从“无”中去观察“道”的奥秘,要经常从“有”中去认识“道”的端倪。
不知不觉编程已有三年之久,这三年也写了不少的代码,从最开始学习C语言,输出个HelloWorld,那个时候觉得指针好难,内存更是没有接触过,到后来玩stm32,玩ARM9,玩操作系统,指针和内存管理已经是最基本最基本的东西了~
除了C语言之外,还用Java写过服务器,用Qt写过界面,用C#写过串口上位机,用Python写过爬虫~
其实这些都是“有”,学习一些具体的语法和知识点,我们从“有”中去体会编程之道,比如完成一个小的项目,无论是纯C写的学生信息管理系统,还是嵌入式中的智能小车等等,毫无疑问,这些是需要我们花费大部分的时间和精力去做的,只有在亲自动手实践中才能体会到编程的“道”。
偶尔,我们也需要找一个安静的下午,泡一杯热热的咖啡,放一首轻音乐,跳出这些具体的知识,将自己所处的境界提升一个档次,用宏观的角度去看待编程,体验编程的妙处,这也就是老子道德经中启示我们的:故常无,欲以观其妙。
我们为什么要进行程序设计?程序设计不就是用计算机技术解决生活中的问题吗?各个领域的人都在使用计算机技术来解决问题,程序设计只是一个工具,程序设计只是达到目的的一种手段。
举几个例子来说明问题:
- 设计一个学生信息管理系统不就是为了学校可以更好的管理吗?
- 设计一个挂号叫号系统不就是为了医院可以更有秩序,人们更方便吗?
- ……
那么,如何进行程序设计呢?
用一个具体的例子来说,比如要在1000页的电话簿中快速的找到Mike的信息,有以下两个解决方案:
- 从第一页开始查找,直到找到为止;
- 从中间开始找,然后进行判断,只留有用的一半,依次重复;
如果电话簿以数字形式存储在计算机中,两种方案都可以写出对应的程序,但是相比较而言:
- 根据第一种解决方案所编写的程序耗费了大量的资源(CPU、时间、内存),如果寻找Z开头的联系人,那么这种方案几乎遍历了整个电话簿,如果电话簿非常大,这种方案就会耗费越来越多的资源,显然非常愚笨。
- 根据第二种解决方案所编写的程序,即使在最坏的情况下,总共有1000页,也只需要查找10次(1000 -> 500 -> 250 -> 125 -> 62 -> 31 -> 16 -> 8 -> 4 -> 2 -> 1),便一定可以查找到联系人,显然比第一种办法节省了太多的资源,速度也更加快。
- 还有更简洁的方案在此不多说,仅以这两个解决方案为例。
这个例子非常能说明问题:
在电话簿中查找联系人这个问题,设计编写一个程序只是达到目的的一种手段,当然,不同的人有不同的方法,这个称之为问题的解决方案,也叫做算法,正如上面两种算法一样,根据解决问题的速度,所耗费的时间,所耗费的内存的等等要求相比较,算法有好的也有不好的,在计算机科学中我们追求最优的算法,即速度最快,耗费时间最少!
那么,当我们有了好的解决方案(算法)之后,需要编写程序实现这个算法,这句话其实补充完整是:
用编程语言编写程序实现算法,让计算机根据我们所编写的程序完成这件事。
编程语言就是规定了如何和计算机交流(的语法) ,编程语言非常多,常用的有C语言、C++、Java、C#、Python、PHP、JavaScript、Go语言、Objective-C、Swift、汇编语言等,各有各的优点,从低级语言一直向高级语言进化:
- 机器语言:由0和1组成,机器可以直接执行;
- 汇编语言:将各种指令用助记符表示,需要汇编器汇编为机器码;
- 高级语言(面向过程 —— C):对用户更友好,需要编译器编译为汇编语言,再汇编为机器码;
- 高级语言(面向对象 —— Java):更加符合现实,需要编译器编译为汇编语言,再汇编为机器码;
- 高级语言(脚本语言 —— Python):语法简洁,可以单行执行。
每种编程语言都有自己擅长的方面,选择自己需要的就好,甚至还有图形化的编程语言 ——Scratch,下面这一张表可以简单的介绍一下这些编程语言:
其实程序设计就是为了用计算机技术去解决现实生活中各个领域的问题,在进行程序设计的时候,首先需要确定这个问题如何解决,提出一些解决方案,找出最优的解决方案,这些解决方案称之为算法,最后,选用合适的编程语言实现这个算法,告诉计算机该做哪些事,剩下的,尽情交给计算机去做吧~