原创 2016-06-29 周瑞珍 学习学习再学习
版权声明
本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi);
无需授权即可转载,甚至无需保留以上版权声明;
转载时请务必注明作者。
以下是《共同成长社区》第 39 次分享,分享者是周瑞珍。
个人简介:
周瑞珍,计算机软件专业硕士。目前从事系统维护工作,业余时间喜欢阅读和健身。追求持续的自我成长。
《共同成长社区》的分享,并不是 “私密” 的,我们不在乎分享内容是否流出去,事实上,我们会主动拿出绝大多数的内容分享至社区之外 —— 因为所有的分享,最终传播得越广越有价值。
若要进一步了解《共同成长社区》,请在后台点击 “收费社群” 的子按钮 “共同成长” ……【请注意:共同成长社区已停止接受直接加入,请参阅这篇文章。】
今天,我分享的主题是零基础怎样进入编程的世界。
提起编程,很多人都会直觉地认为:
这是一件很难的事情。
包括以前带的很多学生。
其实,就像学英语,学了基本的音标和语法,就可以开始去听、去看、使用英语。编程也是一样的,入门并不难。只是面对一个全新的领域,难免会感觉一片茫然,不知道从哪里下手。今天我要分享的内容,就是让大家对编程有一个总体的了解,知道要学哪些内容,减少盲目摸索的时间。
以下是今天分享的一个提纲。
一、为什么学习编程
优酷上有一个奥巴马的讲话视频:
http://t.cn/R5HYND4
呼吁每个美国人都学习编程,这是他 2014 年参加 http://code.org 发起的“编程一小时”活动时拍的一个宣传片。他说:
如果我们希望美国走在科技前沿,就需要年轻的美国人掌握这些工具和技术,它将改变我们的做事方式。
就我个人认为,假如你不以编程为职业,学习编程有这几个作用:
1. 减少重复性劳动
我们来看一个实例。这是一个中英文对照的文本文档。假如我要把里面的全部中文句子和英文句子提取出来,分别存到新的文本文件中。
方法 1:
直接复制粘贴。最直接,但是最耗时,特别是当你有许多这样的文档要处理的时候。
方法 2:
找工具。网上有很多处理文本的工具,但是不容易找到符合自己要求的。
方法 3:
写程序。可以完全符合要求,需要一定的编程基础。
2. 收集自己想要的信息
前面这种文本文件,就是我之前学英语的时候用的,下载这些含有中英文对照的文本,经过处理,再倒入到一个叫是 Supermemo 的软件里面,用来做翻译练习。
再如,有些做量化交易的人,编程抓取行情数据,用在自己的交易系统里面。网上有非常丰富的信息资源,当你掌握了编程技术,就可以更充分地使用它们。
类似的例子还有很多,但是除开前面所说的,我认为学习编程更重要的是培养一种新的看待问题和处理问题的方式。
乔布斯在一次访谈中也提到:
学习编程教你如何思考,就像学法律一样,学法律的人未必都成为律师,但法律教你一种思考方式,同样,编程教你另一种思考方式。
巴菲特的伙伴查理芒格很喜欢说一句话,
在拿着锤子的人眼里,整个世界都是钉子。
人很容易被自己原有的思维固化,所以查理芒格在他的交易系统中使用了很多学科的模型和方法。
当你进入一个陌生的领域,掌握了这个领域中的模型和方法,并且把它和你原有的思维体系结合,你会获得一种新的分析和解决问题的方法。
二、什么是编程
编程的目的是为了解决问题。实质就是把生活中的问题转化成计算机可以处理的模型,并且交给计算机处理。
以我们常用的网上购物为例,在没有电商之前,我们购物是这样一个流程:
1. 商场把商品放在橱窗或货架上
2. 我们查看,挑选物品,放到购物车里
3. 付钱结账
4. 取走商品
现在,我们购物则是这样一个流程:
1. 卖家把商品添加到淘宝店铺或其他网店中
2. 我们通过浏览器浏览,添加到购物车
3. 提交订单,付款
4. 收货,确认完成
通过对比,大家可以发现:
两者的流程其实是非常相近的,实质就是把现实生活中的场景切换到了虚拟的网络中,把之前人工完成的许多操作交给了计算机处理。
当我们编程时,通常是为了解决一个问题(一系列问题)。所以,首先要确定问题是什么?手里有哪些工具和方法?
前面那个问题,我们可以用以下步骤解决:
1. 打开目标文本文件
2. 读取一行英文句子(偶数行)
3. 写入到一个新的文本文件中
4. 重复步骤【 2 】
但是这并不是一个很好的方案:
假如文件当中出现空行,或者中英文的顺序换一下,程序就不能再使用了。
如果仔细观察,发现所有英文句子是以英文字母开头,所有中文句子是以数字开头。可以采用正则表达式把所有符合要求的句子直接提取出来,写入新的文件。
三、当我们学习编程时我们在学些什么?
编程思想
所谓编程思想,就是我们在编程时看待事物,分析问题的思维方式。
1. 面向过程的思想
以功能为中心,按照完成功能的步骤来编写程序。
西红柿炒鸡蛋
{
x g 西红柿洗净,切块
y g 鸡蛋打入碗里,加少量水,打散
起锅,倒油 z g,倒入鸡蛋翻炒,盛出
放入西红柿翻炒
放入炒好的鸡蛋,放盐q g,糖p g
}
我们把这个过程写成一个函数,每次需要的时候调用就可以了。
西红柿炒鸡蛋(西红柿 x,鸡蛋 y ,油 z,盐 q,糖 p)
2. 面向对象的思想
世界是由一个个对象组成的,每个对象都隶属于某一个类。例如学生是一个类,每个特定的学生张三、李四就是学生类的对象。
Class西红柿炒鸡蛋
{
西红柿 x g
鸡蛋 y g
油 z g
盐 q g
糖 p g
构造函数{
西红柿洗净,切块
…….
放入炒好的鸡蛋,放盐,糖
}
加热{
…
}
摆盘{
…
}
}
每个类拥有特定的属性和方法。属性可以理解为它的构成成分。方法则是它可以做哪些事情。
每个类可以做些什么事情,就取决于我们为它编写了哪些方法,如上面的类中,我们还写了一个加热方法,一个摆盘方法。这些方法可以按我们的需求来写,但构造函数是必须的,因为通过构造函数才能生成一个具体的对象,才可能完成后面的操作。
类是虚的,相当于一个规范,对象是实的,真正可以操作。对象是类的实例化。就像上帝在造人之前,先设定好,人这个类有什么属性,有眼睛鼻子嘴巴,再用泥巴捏出亚当、夏娃。
3. 引入面向对象,可以起什么作用?
安全性和独立性
类包含的属性和方法是一个整体,可以对外界封闭起来,同时为外界提供一定的访问接口。使用类的人不需要关心内部的实现细节,只要知道是怎么用就可以。就像厨师长对手下的厨师说,做一份西红柿炒鸡蛋,厨师就负责去做,至于是怎么炒出来的,厨师长不需要了解,他只关心是否可用。
可重用
类和类之间可以形成树状的继承关系。子类可以继承父类所拥有的一切。可以全盘接收,也可以自己做出修改。
Class 西红柿鸡蛋盖饭:西红柿炒鸡蛋
{
米饭 t g
}
Class 西红柿鸡蛋面:西红柿炒鸡蛋
{
面条 z g
}
上面用冒号表示继承关系,西红柿鸡蛋盖饭和西红柿鸡蛋面都是继承自西红柿炒鸡蛋这个类。子类可以直接使用从父类继承的属性和方法,比如构造函数,同时自己添加新的属性和方法。所以这里就不需要再定义西红柿、鸡蛋这些材料了。
灵活的扩展
假设有这样一个继承关系
这三种菜各自有自己的摆盘方式。但是在目前还不确定究竟是哪一道菜,可以先用父类来写:
{
主菜 meal
meal .摆盘
}
程序运行的时候会根据最终的情况,生成的究竟是父类还是子类的对象,自动选择对应的摆盘方式。
以上三种面向对象编程的特点在教科书里面称为封装、继承和多态。
面向过程和面向对象这两种编程思想其实并不冲突,只是适用于不同的情况。我个人的理解是,面向过程相对微观的,朴素的思维方式,而面向对象则是相对宏观的,需要更多的归纳和抽象,更接近我们看待世界的方式。
如果以造房子来比喻的话,面向过程是一个从地基、墙壁、门、窗一步步建造的过程,而面向对象则是把门、窗、墙壁都做成一个个有特定接口的组件,需要使用的时候就把它们组合起来。
四、 编程语言
前面所说的编程思想并不局限于某种特定的语言。而编程语言则是落实到最终要做的事情,写代码,要有一个特定的选择。和我们生活中学习的语言其实是类似的,学习外语是为了和别人交流,学习编程则是为了和计算机交流,让它听懂我们的指令并按照要求操作。
学外语时,我们要学习单词、语法、句子,同样的,编程语言也包含这些要素。但是这里有一个区别,说外语的时候即使单词发音错误,语法不正确,对方也可能听得懂,但是在编程中,一个再细微的错误,也可能导致程序无法运行,或者得不到正确的结果。
打开任何一本编程语言的教材,基本上都包含以下几大块:
1. 数据类型 运算符
对于编程人员来说,数据类型是最底层的。因为我们所处理的所有内容都是以数据的形式存储和处理的,无论在我们眼里是怎样的表现形式,无论是数字、文字、图像、音频、视频,对于计算机来说全部都是数据。
回想我们从小学习的数学,数据类型从整数、小数,到后来的有理数、无理数,再到集合,运算符从最简单的加减乘除到乘方、开方,到集合的运算,是一个逐步扩充的过程。编程中的数据类型和运算符其实也是类似的,只是更加丰富和多样。
2. 控制语句
控制语句的作用是对程序流程的选择,决定下一步该做什么。通常包含顺序、选择和循环三种。顺序指一行行地按
选择
有一个关于程序员的段子:
老婆给当程序员的老公打电话:“下班的时候买一斤包子回来,如果看到卖西瓜的,就买一个。”
当晚,程序员老公手捧一个包子进了家门……
老婆很生气:“你怎么就买了一个包子?!”
老公答曰:“因为看到了卖西瓜的。”
在程序员的眼里,问题是这样处理的:
循环
假如体育老师让你在操场上跑 10 圈。
3. 语言自身的类库
五、怎样开始编程
1. 学习基础概念和知识
2. 实践,实践再实践!
结合你的专业、行业背景
计算机发展到今天,已经和各行各业的专业技术紧密的融合在一起。你自身拥有的专业、行业知识,在编程的时候也是一种资源。假如你是学财务的,对于财务软件的理解,就会比其他人更到位。
结合你的爱好、对应用的需求
如果你的工作涉及到很多在电脑上做的重复性的工作,可以考虑使用脚本提高工作效率。或者,从自身的兴趣和需求出发。例如:
我对微信公众号的阅读体验感到不满意,那是不是可以做一个爬虫,把指定公众号的全部文章一起抓取下来?甚至做成电子书,可以很方便的阅读?
有了这个念头,先在网上搜索,看有没有人做过类似的东西,有什么样的解决方案,需要哪些方面的技术。假如已经有类似的方案,就先拿来,看自己能否理解里面的代码,再针对自己的需求进行改动。
3. 解决问题,纠正错误
4. 回到步骤 【 1 】