编程,已不再是陌生的技能了。但对很多人来说,还是遥不可及。
很多时候,我们渴望掌握编程技能,但往往因为一些对编程的认识,以及实践中遇到的问题,比如不知道如何开始、没有一个合适的引导等,不得不放弃。
下面,我就从对编程的理解、可能存在的困扰等方面,做一个简单阐述,期望能在编程技能上,助你一臂之力。
编程技能
没有任何一个时代,比现在更需要编程技能。
现在的每个人,既是信息产生的源头,也是信息的消费者。
我们生活、工作,几乎完全建立在,对信息的加工处理上。
查看社交信息、发个朋友圈、使用健康码、处理邮件、制作数据报表、分析股票走势、了解房产价格、搜集决策数据材料,等等,每天都在与信息以及处理信息的机器(程序)打交道。更不用说那些直接从事软件开发、数据分析类工作的人了。
对信息的加工处理需要程序。小到电子设备,大到影响我们生活的应用平台,程序无处不在。
就像前段时间,由于某市健康码系统出了问题,导致无法验证市民健康状态,使得大量市民滞留户外,严重影响了人们的生活。
无论什么样的程序,都是由编程这项技能实现的。
而掌握编程技能,不仅能做出有用的程序,更能使我们的工作效率大幅度提升,将让我们在信息时代更加自由。就像在海洋里会游泳一样。
编程真的很难吗
很多人会认为,编程只有程序员才能用,而且非常复杂难懂,代码就像天书一般。
对程序员的印象往往是:性格孤僻,不善言谈,死板,不好相处……
的确,编程是一个专业性很强的工作,在特别的领域,只有专业人士才胜任,而其很多软件公司对程序员的要求也是很高。
我从事软件开发十几年,经历大小项目不计其数,可谓经验丰富。但还经常会遇到很难解决的问题,还需要不断学习,有时还得工作到深夜。
但随着科技,特别是计算机和互联网技术的进步,编程已经不再是只有专业人员的专属工具了,而且学习应用成本越来越低,就连现在的儿童,都学编程了。
对于大多数人来说,学会编程,并非要成为,软件专业人才,从事精密的研发工。而是用编程技能,来解决生活工作中的问题,提高工作效率。
好比烹饪,对大多数人来说,并不需要成为专业厨师,只需要能炒一盘可口的家常菜就足够了。而要达到这一点,一点都不难。我儿子不到 6 岁,就能做出一盘可口的炒鸡蛋。
什么是工作中的问题呢?
前几天,我在上线系统功能时,不小心更错了版本,涉及到数百个代码文件,导致系统无法正常运行。
解决方法很简单,逐个恢复到正确版本就好了,不过需要用两三个小时。于是就将手工排查过程写成了一个小脚本,几分钟就搞定了。
而用到的只是文件操作的基础技术,初学者不到两天就能掌握。
更有价值的是,这段代码还会在以后发挥作用,节省更多的时间。
类似的问题有很多,如处理相册,过滤邮件,统计数据等等,在后面的文章中将逐步展开。
编程过程
从上面的例子可以看出,编程,就是将我们手工处理事情的过程程序化。
就是说,将要处理的工作信息化(数字化),然后读取这些信息,经过加工处理,最后输出结果就好了。
举个例子,有份用 Excel 记录的签到表,需要统计一下每个人的签到数。
编程处理过程就是:
- 读取 Excel 文件
- 读取一行签到信息
- 判断签到者,并给对应的签到者的签到数加一
- 如数据没有处理完成,跳转步骤
2
,处理完成则继续 - 输出签到统计情况
- 结束程序
步骤 1 是输入,步骤 2 - 4 是处理,步骤 5 是输出。
其实 Excel 中就有统计功能,这里仅作为一个解释程序工作的例子,并非最佳解决方法;
另外,Excel 中的功能也是通过程序实现的,不过是用一种更友好的方式呈现的。如果有兴趣,可以了解一下 VBA 编程
不难看出,处理过程,是我们手工处理的明细或者机械版。相比手工处理,程序处理过程相对繁琐和机械。
编程其实就是一个工具,和我们使用的纸、笔、打印机一样,可以帮助我们做简单,重复,有规律的事情。
而我们需要做的就是,找到事情的规律(抽象思维
),然后按照一定的顺序(逻辑思维
),用合适的编程语言,将其实现(动手能力
)。
没有抽象和逻辑能力咋办?
抽象能力对每个人,甚至生物来说都是与生俱来的。
当我们看到一个具体的东西,就会自然地将其抽象。
比如看到了一匹马,不需要记住这匹马的具体细节,就能对马有个大致认识,再见到另外一匹马时,就能识别出也是马。
编程中的抽象也是类似的。
比如签到表是个数据表格
,那么销售数据也可以是一个表格。是表格就会有个列
,和行
,用来记录特定的数据
。
那么学会了处理表格的方法,遇到类似的问题,我们会先将其转化为表格,再加以处理。
不难发现,小孩子,也是会这样做。他们会用一些自己熟悉的东西,解决新的问题。
这就是抽象思维(能力),或者是总结能力。
而逻辑思维(能力),就是思考或解决问题的顺序或者条件规则。
比如,只有先打开了一个文件,才能读取其中的内容。否则就会出错。
而逻辑的产生是自然而然的,当我们做了一个事情,发生了一种情况之后,我们就会建立这个事情和这种情况的关联,从而形成一个逻辑。
一个孩子,用手碰了热水壶,感受到烫之后,下次就不会再去碰触类似热水壶的东西了。
所以不要担心自己的抽象能力和逻辑能力,这些是我们天生就具备的。
英语和数学不好咋办?
很多人都认为,学习编程需要学好英语和数学。
的确,编程语言都是类英语语法的,并且计算机的基础是数学。
但英语和数学是很多人很畏惧的学科(至少我是这样),英语和数学几乎成了学习编程不可逾越的鸿沟。
事实真的如此吗?
经过多年的编程实践,我一直有个认识,大多数编程只需要初中英语和数学水平就足够了。
这样说并不是说英语和数学对编程不重要,而是大部分情况下的编程活动,并不需要高超的英语和数学基础,甚至不懂英语与数学都没关系。
为什么呢?
因为编程能力看重的是抽象和逻辑能力,并不是语言能力,只要了解简单的关键字,比如 if
、else
、while
等就可以了。就算现学都来得及。
数学,虽然是逻辑科学,但日常能用到的数学知识也不过是加减乘除,再多一点也不过是统计和概率的基本知识。有初中数学基础足够了。
比如,在前面签单表的的例子中,计算出平均签到率,平均签到数等等。
目前火热的 AI (人工智能),确实是以高等数学为基础,但如果不是做原始算法研发,只是应用的话,使用难度和使用微信收发消息差不了多少(后面应用到 AI 时会详细介绍)。
所以完全不用担心英语和数学问题,遇到不懂得,现学就行,不需要高深地理论基础,而且探索过程充满了乐趣。
编程中真正的问题
编程也不是一马平川,毫无障碍的。
并不是说编程语言难学难懂,而是 大多数情况下引起问题的原因,并非事情本身。
用笑来老师的话说就是:
钥匙一定不会插在锁着的锁孔里
就像炒菜一样,炒菜方法很简单,但是准备材料、控制火候、调料配比等等,很难的,即使方法相同,但做出的效果却千差万别。
一般遇到的问题大致分两类:
1. 环境问题
对编程来说,可能遇到操作系统、资源权限、开发环境等等的外部问题。
比如,前几天有个朋友写的操作 Excel 的代码,出了问题。代码没错,而且在别的电脑上能正常运行。最后发现,真正的问题是:程序试图保存一个被其他程序打开的 Excel 文件,引起的无权存取问题。
严格来说,这个问题并非编程本身的问题,而对操作系统不了解,引起的问题。
操作系统为了保证文件的完整性,规定:一个文件只能同时有一个程序获得写权限。
这就像炒菜时,忘了开火一样。
好在为了方便调试,出错时,程序会给出相应的提示,比如刚才的错误,会得到没有权限操作文件的提示。
因此,编程中,需要 认真阅读错误提示!
很多人之所以感觉编程困难,就是因为无法让程按自己想的方式执行。
因为总想让程序按照自的方式走,就会对程序给出的反馈信息视而不见。
就像大人只是按照自己的理解,教育孩子,而忽略了孩子的反应一样。
比起孩子的智力,程序差的太远了,只要有问题,程序只会不厌其烦地给出相同的,可能词不达意的提示。
当然,我们可以把这一点理解成 —— 单纯,因为程序不会撒谎,也不会拐弯抹角哈哈。
因此编程中,需要的最重要的品质是 耐心!
只要我们拿出耐心,就没有解决不了的编程问题,用我一位同事的话说就是:
任何诡异的现象,都有其必然原因。
随着实践的深入,就会发现,遇到的问题就那么多种,权限问题,网络问题,编码逻辑问题,边界判断问题等。
2. 编码规范问题
除了常见的环境问题,更多的问题是由于 不规范的编码 所造成的。
一方面,不规范的代码容易造成逻辑混乱;另一方面,在出现问题时,不易排查。
反之,具有良好编码规范的代码,语义明确,逻辑清晰,拆分得当,标准统一,不仅不易出现问题,而且出问题时很容易找到问题所在。
比如这段代码:
1 | ; |
可能不好懂,不过没关系。
这是小米创始人雷军,在 1994 年做程序员时候写的一段汇编代码,在这里看完整代码。
这段代码更像是一件艺术品。其远超了实用性和功能性的价值,无论从美观程度,还是从阅读和排查错误的角度上,都是很好的范例。
总的来说,在编程中,遇到问题是很正常的,只要我们有 耐心,编写规范的代码,并 认真阅读错误提示,所有的问题都将褪去可怕的外衣,变得通情达理。
从哪里开始
如果你读到这里,其实就已经开始了。
编程世界并没有想象中那么神秘,只是我们思想和逻辑的程序化而已。
但无论我们的思考多深彻,逻辑多严谨,也需要有个能表示和表达的工具,就像文字对语言的意义一样。
因此我们需要了解一种编程语言,用它来表示和实现我们的想法。
多年来,我用过多种编程语言,从 C、C++、VB、C#、Java、Javascript,到 Go、Python、Lisp,还有其他领域性语言,比如 Html、Sql 等等。
一直以来,我认为,编程语言没有明显的好坏之分,只有效率区别。而效率取决于要解决的问题,和自己对语言的熟悉程度。
所以,无论从哪个编程语言入手都可以。当熟悉了一种语言,再根据需要切换到别的语言,就很容易了。
但是,选择一个易学的、便捷的、强大的编程语言,还是有很大的优势,能起到事半功倍的作用。
所以在后面的讲解与实践中,我将选择 Python 作为主要的编程语言。
这是因为,首先,Python 是一个完整的、全面的、能解决各种需求问题的编程语言;
然后,Python 具有很强的表现力,所以更适合学习和应用。
例如,比起用 Java 编写同样功能的方法,要小巧很多。
此处并不是说 Python 比 Java 更好,在性能和稳定性方面远不如 Java)。
当然在小巧性方面不如 Lisp,但 Lisp 的展现形式会让很多人眩晕,并不适应作为一种初学或者日常使用的编程语言。
曾经一度,Python 被认为是胶水语言,即像胶水一样,起到粘接作用。因此易用性很强。
最后,Python 在人工智能,数据分析等领域有其独特的优势,同时在扩展性方面也极具优势。
总结
我们从编程的意义,编程的理解、编程的问题,和编程语言的选择对编程这个话题做了初步的阐述。
在接下来的日子里,我们将从一个个日常问题开始,学习和了解编程技能,并高效地解决这些问题。过程中,我们将会对编程这个话题做更深入的理解。
同时也期待读者的积极参与,将自己实践中障碍、感兴趣的方向,或者有趣的例子等,附在留言中。让我们一起打造一个美妙的编程之旅。
另外,笔者的水平有限,文章中难免出现各种错误和问题,恳请读者不吝批评、指正。十分感谢!
比心!