一个好的程序员,写的代码,一定像好文章那样容易理解。不同的语言,指令有点不同,但差不太远。所以学会一种语言,再学一种难度就没那么大。
很多人觉得编程是很高端神秘的事情,觉得自己可能学不来。但是了解到程序员的工资比较高,所以又蠢蠢欲动,想进入这个领域。那么,在回答这个问题前,我们先了解一下什么是编程吧。
什么是编程
编程,也叫程序设计,其实就是用编程语言处理数据,以达到你想要的效果。有一本书的名字很清楚地表达了这个观点。
Algorithms + Data Structures = Programs
算法 + 数据结构 = 程序
什么是数据结构
数据结构其实就是数据存储的方式。我们不妨用下面几个生活中的例子来理解。
地铁站X光机上的一件件行李
行李是排成一排,按顺序进入 X 光机处理的。排最前面的,先处理。最后进的,最后处理。如果把行李看作是数据,这种数据结构其实是队列。队列的特点是先进先出。
超市里叠在一起的一箱箱牛奶:叠在一起的箱子,最开始放置的肯定是最下面的那个,然后一箱一箱往上垒。要拿出来的时候,当然是先拿最上面的,最下面的最后才拿。这种结构就是栈。栈的特点是先进后出。
电脑的文件夹:文件夹可以包含有子文件夹和文件,子文件夹又可以再包含下一层的文件夹和文件。这个结构可以理解为树型结构。文件是树的叶子节点,子文件夹可以是树的分支,也可以是叶子。树的特点是分支和层级关系。
什么是算法
算法就是对数据进行处理的方法。
从数据层面看,结构不同一般需要不同的处理方式。从处理效率看,对同一种数据结构,也可以有多种不同的处理方式。有些算法,可能要处理的数据量越大,时间就会成倍增加。有些却无论数据多大,时间都基本恒定。举一个例子:
假设你买了一个圆柱型的水果软糖,里面有 9 粒糖果。如果它的包装开口是在某一边,你需要拿第 5 粒,那么你就必须先把前面 4 粒拿出来,才能拿到第 5 粒。而且你想拿的糖果越在后面,花费时间就越多。但是,假设有一种包装是横着把圆柱形打开(结构不同了),你一次可以看到和拿到 9 粒糖果。那么无论你拿哪一粒,花费的时间都是一样的。
在电脑里是怎样的?
假设我把上面的糖果问题抽象到计算机里面,是什么样子的呢?下面用一段 JavaScript 代码来模拟吧。(懂编程的朋友,别吐槽顺序取的代码,我知道可以按位置,这里只是说明一下。)
function showMeTheCandy(candy) { console.log(candy) } // 排成列,顺序取 var candy = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] // 我有9粒字母糖果 var toPickCandyLocation = 5 // 我要取的糖果是第5粒 var currentCandyLocation = 1 // 现在我要开始取的是第1粒 var candyPicked = null // 我取的糖果要放这,但现在还不存在 while (currentCandyLocation <= 5) { // 当我要取的糖果还不是第5粒的话,重复下面的事情 candyPicked = candy.shift() // 从最前面取1粒 currentCandyLocation = currentCandyLocation + 1 // 挪到下一个位置 } showMeTheCandy(candyPicked) // 看看拿到的糖果是什么字母 // -> 'E' // 做成特定的,可按位置/编号取的结构 var candy = { '1': 'A', '2': 'B', '3': 'C', '4': 'D', '5': 'E', '6': 'F', '7': 'G', '8': 'H', '9': 'I', } showMeTheCandy(candy['9']) // -> 'E'
从上面可以看到,同样的数据,可以按照不同的结构来存放。不同的处理逻辑/算法,效率不同。所以,从这种角度来看,学习编程和程序设计,是学会抽象,学会如何把现实问题,在计算机里面表现出来。还有数据处理。
从另一种角度来看,编程和程序设计,就像写作。从上面第一段顺序取数据的代码看,我就像写作一样。我在用计算机能理解的语言,写操作指引出来。一个 好的程序员,写的代码,一定像好文章那样容易理解。不同的语言,指令有点不同,但差不太远。所以学会一种语言,再学一种难度就没那么大。
应该不应该学习编程
其实编程和程序设计并不难,尤其是当你能把它和实际问题结合,理解。回到最开始的问题,我应该学编程吗?首先,问问你自己,你学编程的目的是什么?
你觉得通过指尖敲击的指令,就能创造无限可能,这实在是太酷了。 — 你绝对应该学习。
你目前遇到些繁琐而重复的事情,想看一下计算机能否代劳。 — 你应该尝试。
你想找一份工资相对高的工作,不用搬搬抬抬,还能在办公室吹空调。 — 这也是不错的选择。
你想学到一种编程语言让你当金饭碗用,拿高工资。 — 早早死了心算了。
计算机应该是变化越来越快的领域,虽说有不少语言诞生的时间已经几十年,但是它们也是持续演化的。说不准你刚学会没多久的东西,两三年后就没什么人用了,就像现在的前端框架。所以,如果你想把程序设计作为你的职业,请做好长期持续学习的准备。
但是,即便你不需要把它当作职业,我认为,多少具备一些编程的能力,让计算机辅助你解决问题,提升思考方式和效率,真的非常有好处。送上 Linus 大神的话:
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
怎么开始?
如果你已经下定决心要学习程序开发。那怎么开始?
从问题出发
你想解决什么问题?处理什么数据?最后达到什么效果?从事哪个领域?
比如说,如果你要处理 Excel,做各式各样的报表。或者要从固定格式的 Excel 里面抽取数据。那你可能只要学习 VBA 就可以了,或者用 JAVA。因为 Excel 这种企业级的东西,你用回微软自家的语言会方便些。企业级的 JAVA 语言也是不错的选择,因为已经有很多写好的工具,你学会拿来用就可以了。但是如果你非要选 Node.js 和 JavaScript 来处理,就真有点作死。
还有,很多人想学数据分析,一上来就学什么 Spark, Hadoop,搞大数据,但我觉得那是不对的。只学会搭建工具环境,却不会数据分析的基础,难道不是本末倒置吗?况且,工具和框架更新换代比语言变化得还快,一年后说不定又换新了。
数 据分析最主要的是有数据思维,基本的统计学知识和数据分析的能力。如果你用 Excel, SQL 就能挖掘出数据里面的商业价值,看到别人看不到的规律,那就牛了。当然你还可以学习 Python 或者 R 这种最基础的数据分析领域的语言,因为它们提供丰富的数据分析算法和展示工具,让数据分析工作更简单。所以,我觉得只有真的具备一定的基础,而且数据真的 大到一定程度,你才需要去用那些大数据的处理工具。
Web Application 开发领域,无论前端后端,我觉得肯定要学的是 JavaScript, HTML, CSS。如果你打算在前端发展,不管你是打算用 jQuery, AngularJS,React 或者 VueJS 也好,原生 JavaScript 都是基础。即便你想从事后端,拥有基本的前端知识,可以让你方便和前端沟通合作。后端的语言选择相对较多,一般是 Ruby, Node.js, Python,PHP, Java。Java 在传统企业领域用的比较多,初创公司一般选其它的来起步。Go, Rust, Clojure 比较新,用的人相对少一些。
如何起步
现在互联网如此发达,书,视频,在线教育和练习编程开发的资源都相当得多,对于一个稍微有点编程经验的人来说。自学应该完全不是问题,不愁没有资源。但是,对于一个完全是自学起步,没有任何编程背景的人来说,最好找一个靠谱的师傅来指引起步。
首先,从上面说的问题出发,新手是不可能有答案的。即便在论坛上提问,用什么语言,什么建议都会有。你可要知道程序员最喜欢讨论什么语言,什么框架好。所以有个笑话说,你想让程序员们吵起来,只要在里面喊一句,XXX 语言是最好的语言就可以了。
其次,开始学习编程开发遇到的最大的障碍是搭建环境。很多新手都是在最开始的时候就遇到各种环境问题,导致完全无法跟教程练手,挫败感太强而放弃。所以,如果有人在身边指导,至少先把搭建环境这关过了,后面会顺畅很多。
再说,一个有经验的靠谱的老师,还可以告诉你学习使用某一种语言的最少必要知识,不至于让你迷失在太多技术细节中,真的可以事半功倍。
如果确实身边和网络上找不到这样的朋友,老师,又不舍得花钱去培训班,要如何降低遇到障碍的可能性和提高问题解决效率呢?最好选择 Mac 来开发,学会如何使用 Google和正确提问。
最后,无论有没有老师,学编程最重要就是:模仿,模仿,模仿;练习,练习,练习。