0%

编程,并没有想象的那么难

编程,已不再是陌生的技能了。但对很多人来说,还是遥不可及。

很多时候,我们渴望掌握编程技能,但往往因为一些对编程的认识,以及实践中遇到的问题,比如不知道如何开始、没有一个合适的引导等,不得不放弃。

下面,我就从对编程的理解、可能存在的困扰等方面,做一个简单阐述,期望能在编程技能上,助你一臂之力。

编程技能

没有任何一个时代,比现在更需要编程技能。

现在的每个人,既是信息产生的源头,也是信息的消费者。

我们生活、工作,几乎完全建立在,对信息的加工处理上。

查看社交信息、发个朋友圈、使用健康码、处理邮件、制作数据报表、分析股票走势、了解房产价格、搜集决策数据材料,等等,每天都在与信息以及处理信息的机器(程序)打交道。更不用说那些直接从事软件开发、数据分析类工作的人了。

对信息的加工处理需要程序。小到电子设备,大到影响我们生活的应用平台,程序无处不在。

就像前段时间,由于某市健康码系统出了问题,导致无法验证市民健康状态,使得大量市民滞留户外,严重影响了人们的生活。

无论什么样的程序,都是由编程这项技能实现的。

而掌握编程技能,不仅能做出有用的程序,更能使我们的工作效率大幅度提升,将让我们在信息时代更加自由。就像在海洋里会游泳一样。

编程真的很难吗

很多人会认为,编程只有程序员才能用,而且非常复杂难懂,代码就像天书一般。

对程序员的印象往往是:性格孤僻,不善言谈,死板,不好相处……

的确,编程是一个专业性很强的工作,在特别的领域,只有专业人士才胜任,而其很多软件公司对程序员的要求也是很高。

我从事软件开发十几年,经历大小项目不计其数,可谓经验丰富。但还经常会遇到很难解决的问题,还需要不断学习,有时还得工作到深夜。

但随着科技,特别是计算机和互联网技术的进步,编程已经不再是只有专业人员的专属工具了,而且学习应用成本越来越低,就连现在的儿童,都学编程了。

对于大多数人来说,学会编程,并非要成为,软件专业人才,从事精密的研发工。而是用编程技能,来解决生活工作中的问题,提高工作效率。

好比烹饪,对大多数人来说,并不需要成为专业厨师,只需要能炒一盘可口的家常菜就足够了。而要达到这一点,一点都不难。我儿子不到 6 岁,就能做出一盘可口的炒鸡蛋。

什么是工作中的问题呢?

前几天,我在上线系统功能时,不小心更错了版本,涉及到数百个代码文件,导致系统无法正常运行。

解决方法很简单,逐个恢复到正确版本就好了,不过需要用两三个小时。于是就将手工排查过程写成了一个小脚本,几分钟就搞定了。

而用到的只是文件操作的基础技术,初学者不到两天就能掌握。

更有价值的是,这段代码还会在以后发挥作用,节省更多的时间。

类似的问题有很多,如处理相册,过滤邮件,统计数据等等,在后面的文章中将逐步展开。

编程过程

从上面的例子可以看出,编程,就是将我们手工处理事情的过程程序化。

就是说,将要处理的工作信息化(数字化),然后读取这些信息,经过加工处理,最后输出结果就好了。

举个例子,有份用 Excel 记录的签到表,需要统计一下每个人的签到数。

编程处理过程就是:

  1. 读取 Excel 文件
  2. 读取一行签到信息
  3. 判断签到者,并给对应的签到者的签到数加一
  4. 如数据没有处理完成,跳转步骤 2,处理完成则继续
  5. 输出签到统计情况
  6. 结束程序

步骤 1 是输入,步骤 2 - 4 是处理,步骤 5 是输出。

其实 Excel 中就有统计功能,这里仅作为一个解释程序工作的例子,并非最佳解决方法;

另外,Excel 中的功能也是通过程序实现的,不过是用一种更友好的方式呈现的。如果有兴趣,可以了解一下 VBA 编程

不难看出,处理过程,是我们手工处理的明细或者机械版。相比手工处理,程序处理过程相对繁琐和机械。

编程其实就是一个工具,和我们使用的纸、笔、打印机一样,可以帮助我们做简单,重复,有规律的事情。

而我们需要做的就是,找到事情的规律(抽象思维),然后按照一定的顺序(逻辑思维),用合适的编程语言,将其实现(动手能力)。

没有抽象和逻辑能力咋办?

抽象能力对每个人,甚至生物来说都是与生俱来的。

当我们看到一个具体的东西,就会自然地将其抽象。

比如看到了一匹马,不需要记住这匹马的具体细节,就能对马有个大致认识,再见到另外一匹马时,就能识别出也是马。

编程中的抽象也是类似的。

比如签到表是个数据表格,那么销售数据也可以是一个表格。是表格就会有个,和,用来记录特定的数据

那么学会了处理表格的方法,遇到类似的问题,我们会先将其转化为表格,再加以处理。

不难发现,小孩子,也是会这样做。他们会用一些自己熟悉的东西,解决新的问题。

这就是抽象思维(能力),或者是总结能力。

而逻辑思维(能力),就是思考或解决问题的顺序或者条件规则。

比如,只有先打开了一个文件,才能读取其中的内容。否则就会出错。

而逻辑的产生是自然而然的,当我们做了一个事情,发生了一种情况之后,我们就会建立这个事情和这种情况的关联,从而形成一个逻辑。

一个孩子,用手碰了热水壶,感受到烫之后,下次就不会再去碰触类似热水壶的东西了。

所以不要担心自己的抽象能力和逻辑能力,这些是我们天生就具备的。

英语和数学不好咋办?

很多人都认为,学习编程需要学好英语和数学。

的确,编程语言都是类英语语法的,并且计算机的基础是数学。

但英语和数学是很多人很畏惧的学科(至少我是这样),英语和数学几乎成了学习编程不可逾越的鸿沟。

事实真的如此吗?

经过多年的编程实践,我一直有个认识,大多数编程只需要初中英语和数学水平就足够了。

这样说并不是说英语和数学对编程不重要,而是大部分情况下的编程活动,并不需要高超的英语和数学基础,甚至不懂英语与数学都没关系。

为什么呢?

因为编程能力看重的是抽象和逻辑能力,并不是语言能力,只要了解简单的关键字,比如 ifelsewhile 等就可以了。就算现学都来得及。

数学,虽然是逻辑科学,但日常能用到的数学知识也不过是加减乘除,再多一点也不过是统计和概率的基本知识。有初中数学基础足够了。

比如,在前面签单表的的例子中,计算出平均签到率,平均签到数等等。

目前火热的 AI (人工智能),确实是以高等数学为基础,但如果不是做原始算法研发,只是应用的话,使用难度和使用微信收发消息差不了多少(后面应用到 AI 时会详细介绍)。

所以完全不用担心英语和数学问题,遇到不懂得,现学就行,不需要高深地理论基础,而且探索过程充满了乐趣。

编程中真正的问题

编程也不是一马平川,毫无障碍的。

并不是说编程语言难学难懂,而是 大多数情况下引起问题的原因,并非事情本身

笑来老师的话说就是:

钥匙一定不会插在锁着的锁孔里

就像炒菜一样,炒菜方法很简单,但是准备材料、控制火候、调料配比等等,很难的,即使方法相同,但做出的效果却千差万别。

一般遇到的问题大致分两类:

1. 环境问题

对编程来说,可能遇到操作系统、资源权限、开发环境等等的外部问题。

比如,前几天有个朋友写的操作 Excel 的代码,出了问题。代码没错,而且在别的电脑上能正常运行。最后发现,真正的问题是:程序试图保存一个被其他程序打开的 Excel 文件,引起的无权存取问题。

严格来说,这个问题并非编程本身的问题,而对操作系统不了解,引起的问题。

操作系统为了保证文件的完整性,规定:一个文件只能同时有一个程序获得写权限。

这就像炒菜时,忘了开火一样。

好在为了方便调试,出错时,程序会给出相应的提示,比如刚才的错误,会得到没有权限操作文件的提示。

因此,编程中,需要 认真阅读错误提示

很多人之所以感觉编程困难,就是因为无法让程按自己想的方式执行。

因为总想让程序按照自的方式走,就会对程序给出的反馈信息视而不见。

就像大人只是按照自己的理解,教育孩子,而忽略了孩子的反应一样。

比起孩子的智力,程序差的太远了,只要有问题,程序只会不厌其烦地给出相同的,可能词不达意的提示。

当然,我们可以把这一点理解成 —— 单纯,因为程序不会撒谎,也不会拐弯抹角哈哈。

因此编程中,需要的最重要的品质是 耐心

只要我们拿出耐心,就没有解决不了的编程问题,用我一位同事的话说就是:

任何诡异的现象,都有其必然原因。

随着实践的深入,就会发现,遇到的问题就那么多种,权限问题,网络问题,编码逻辑问题,边界判断问题等。

2. 编码规范问题

除了常见的环境问题,更多的问题是由于 不规范的编码 所造成的。

一方面,不规范的代码容易造成逻辑混乱;另一方面,在出现问题时,不易排查。

反之,具有良好编码规范的代码,语义明确,逻辑清晰,拆分得当,标准统一,不仅不易出现问题,而且出问题时很容易找到问题所在。

比如这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
;
; RI.ASM Revision 2.12 [ July 12, 1994 ]
Revision equ 'V2.12 '
;
; **************************************************************************
; * *
; * RAMinit Release 2.0 *
; * Copyright (c) 1989-1994 by Yellow Rose Software Co. *
; * Written by Mr. Leijun *
; * *
; * Function: *
; * Press HotKey to remove all TSR program after this program *
; * *
; **************************************************************************

; ..........................................................................
; Removed Softwares by RI:
; SPDOS v6.0F, WPS v3.0F
; Game Busters III, IV
; NETX ( Novell 3.11 )

...

LeftAlt equ 00101000b
RightAlt equ 10001000b
LeftCtrl equ 00010100b
RightCtrl equ 01000100b
LeftShift equ 00000010b
RightShift equ 00000001b
HotKey db LeftCtrl or RightCtrl

DataBegin dw 0
NextDataSeg dw 0ffffh
oldInt2F_addr dw 0, 0
XMS_control dw 0, 0
Handle_begin dw 0
cvtOfs dw 0 ; DOS 3.0 equ 0 and above DOS 4.0 is 1
org 104h
db 0dh
db Revision
db ??date
db 26
org 114h
tsrLength dw 0
MachineID db 0FCh ; IBM PC/AT

...

可能不好懂,不过没关系。

这是小米创始人雷军,在 1994 年做程序员时候写的一段汇编代码,在这里看完整代码

这段代码更像是一件艺术品。其远超了实用性和功能性的价值,无论从美观程度,还是从阅读和排查错误的角度上,都是很好的范例。

总的来说,在编程中,遇到问题是很正常的,只要我们有 耐心编写规范的代码,并 认真阅读错误提示,所有的问题都将褪去可怕的外衣,变得通情达理。

从哪里开始

如果你读到这里,其实就已经开始了。

编程世界并没有想象中那么神秘,只是我们思想和逻辑的程序化而已。

但无论我们的思考多深彻,逻辑多严谨,也需要有个能表示和表达的工具,就像文字对语言的意义一样。

因此我们需要了解一种编程语言,用它来表示和实现我们的想法。

多年来,我用过多种编程语言,从 C、C++、VB、C#、Java、Javascript,到 Go、Python、Lisp,还有其他领域性语言,比如 Html、Sql 等等。

一直以来,我认为,编程语言没有明显的好坏之分,只有效率区别。而效率取决于要解决的问题,和自己对语言的熟悉程度。

所以,无论从哪个编程语言入手都可以。当熟悉了一种语言,再根据需要切换到别的语言,就很容易了。

但是,选择一个易学的、便捷的、强大的编程语言,还是有很大的优势,能起到事半功倍的作用。

所以在后面的讲解与实践中,我将选择 Python 作为主要的编程语言。

这是因为,首先,Python 是一个完整的、全面的、能解决各种需求问题的编程语言

然后,Python 具有很强的表现力,所以更适合学习和应用

例如,比起用 Java 编写同样功能的方法,要小巧很多。

此处并不是说 Python 比 Java 更好,在性能和稳定性方面远不如 Java)。

当然在小巧性方面不如 Lisp,但 Lisp 的展现形式会让很多人眩晕,并不适应作为一种初学或者日常使用的编程语言。

曾经一度,Python 被认为是胶水语言,即像胶水一样,起到粘接作用。因此易用性很强。

最后,Python 在人工智能,数据分析等领域有其独特的优势,同时在扩展性方面也极具优势

总结

我们从编程的意义,编程的理解、编程的问题,和编程语言的选择对编程这个话题做了初步的阐述。

在接下来的日子里,我们将从一个个日常问题开始,学习和了解编程技能,并高效地解决这些问题。过程中,我们将会对编程这个话题做更深入的理解。

同时也期待读者的积极参与,将自己实践中障碍、感兴趣的方向,或者有趣的例子等,附在留言中。让我们一起打造一个美妙的编程之旅。

另外,笔者的水平有限,文章中难免出现各种错误和问题,恳请读者不吝批评、指正。十分感谢!

比心!