如何学习编程

编程入门

大部分人都是通过某一个原因,喜欢上了编程。同样,你也需要一个理由。也许只是走在路上,忽然有人对你说:“年轻人,我看你天赋异禀,骨骼惊奇,我这里有一套编程秘笈,你想不想学啊”

入门编程语言,有很多选择,你可以选择python、JS,也可以选择C。比如我自己,是通过Basic语言入门的,也是因为它喜欢上了编程。

在这一阶段,最容易出现的问题是:Compiler Error,Syntax Error。你还不习惯和计算机进行沟通,你们之间的语言不够顺畅。它听不懂你说什么,当它说Error,你也听不懂它在说什么。你总是很抓狂的问,What’s the Error,一定是计算机出了什么问题,而不是我的代码有任何问题。直到你意识到,计算机没有任何问题,有问题的一定是我的代码,你能够检查你的代码,修复语法错误,恭喜你,你已经入门了。

这一阶段,你对编程有了感性的认识。你为自己写出来的东西感到骄傲,完全不会注意到其实那些代码其实只是piece of shit。你也会遇到很多的问题,即使你已经查阅到了所需要的知识点,还是无法实现你要的功能。就好像已经把所需要的材料全部交给了你,你却无法用这些材料造出你想造的东西。

这一段时间,你的灵感泉涌,有很多的想法想要去做,但却又感觉力不从心。你需要开始补充一些基础知识了,难度也要开始增加。

计算机科学基础

这是一个非常重要的阶段,这一阶段的学习效果,直接决定了你的技术实力。有些知识,并不会立刻用得上,但是,这些知识,已经潜移默化的影响了你的思维方式。你的任督二脉将在这一阶段打开。

算法

算法和数据结构 这是一切程序的基础,你需要恰当的使用这些数据结构,你无法绕开它们。有一些算法,你需要知道它们的原理,这有助于你理解你的代码最终在计算机上是如何运行的。你可能并不需要掌握算法设计的机巧,也不需要去参加一个算法比赛。但你需要理解这些经典算法,记住它们的名字,在你遇到问题时,第一时间想到它们。最终,你可能不需要自己去实现它们,但你需要恰当的使用现有的算法代码。

设计模式

函数式编程、面向对象编程,设计模式。这些方面的知识,你也需要掌握,你需要了解如何将自己的代码组织在一起。这就像你拥有了一些积木,你需要了解玩积木的常用技巧。阅读一些书籍或者阅读他人的代码,都是非常好的途径。学习这些知识,就像是学习作画。这些技巧你一看就会明白,但却不能熟练的使用。这里是考验你艺术天分的地方。

在拥有了以上这些技能后,你已经可以算是一个不错的程序员了。但这些知识可以让你写出很棒的代码,却无法使你的程序有任何的功能。你必须要让你的程序和外界进行交互,它才有存在的价值。

运行环境

你的程序如何和外界进行交互?你的程序是运行在一个封闭的环境之中的。想象一下,一只猴子被关进了一个房间中,房间中有一个操作面板,当它按下某个按钮,外界就会发生某件事情,比如说在你的电脑上打开一个新网页。你的程序就是这只猴子,你必须熟悉你的操作面板,有些时候面对一些奇怪的面板故障,你甚至需要了解它的工作原理,以避免发生那些故障。

网络基础, TCP/IP 协议,HTTP协议,如果你要开发网络应用,这些都是非常重要的基础知识。

操作系统原理,无论你开发桌面应用、移动应用、嵌入式应用、网络应用、服务器端应用,你都应该对你的程序所运行的环境有足够了解。

如果你开发的是Web应用,也许你不需要了解操作系统,但你需要了解你的浏览器,它是你的运行环境。

计算机架构,这个你可以不必知道。但如果你要开发一个操作系统,那么你必须对计算机架构有所了解,还是那句话,你需要了解你的程序所运行的环境。而操作系统所运行的环境就是计算机硬件的体系架构。

交流

你需要一个目标,你定下的这个目标可能就是下一个facebook。带着目标学习,这是我所推崇的方式。对于还处于学习阶段的你来说,这是一段幸福的时光。你不必为了生计而学习,你可以纯粹的为了爱好而学习。

你需要加入开发者交流的社区,加入论坛、QQ群、讨论组、邮件列表。与别人分享你的收获与挫折,社区的氛围也是你继续学习的动力之一。当你遇到难题,可以在社区里提问。但是你应该学习一些提问的智慧,不要做伸手党,这对你的学习不会有任何帮助。你应该至少已经阅读了相关的书籍、资料,并借助搜索引擎(不要使用baidu,中国可以用bing)来寻求答案。记住一点:社区不能给你想要的东西,但社区可以解答你的疑惑。社区是用来交流的,你也可以通过回答别人的问题来提高自己的知识。

开源社区,也是你获取知识技能的主要来源之一。当你需要某个功能,有人可能已经实现了他,并将他开源在了github(目前最大的开源社区)之类的地方。这些开源项目可以帮助你解决某些细节问题,使你可以更专注在你的主要目标上。对于优秀的开源项目,你可以阅读他们的代码,学习他们的机巧。

再论运行环境

如果你仔细体会的话,你会发现,编写代码只占到你学习编程中的很少的一部分时间,而大部分时间,你是在查阅资料。你需要花大量的时间在学习程序的运行环境上,而不是学习编程语言上。运行环境会提供给你很多的编程接口,一般被称之为API。

我这里所说的运行环境,并不是仅仅指操作系统运行环境,它也可以是浏览器,Java运行环境,Sevlet容器,node.js,unity3D运行环境,flash运行环境,directX,OpenGL,cocos2d游戏开发框架。

你可能注意到了一点,我将开发框架,视作了一种运行环境。为什么这么说呢?因为框架是对运行环境的再次封装,在框架之上,你将看到更加易用,更加人性化的接口。有一些框架,还额外提供了很多辅助的库,甚至插件机制,让你可以直接使用整个社区贡献的插件。你只需要面对框架编程,借来几个插件,再搭配几个辅助库,就可以完成一个作品。

你明白了吗?编程就是这么简单!这也是为什么有那么多平庸的程序员的主要原因————他们只懂得在框架之上编程,使用别人写好的现成的代码。可是一旦他所赖以生存的框架或插件或库,出现了任何问题,他们的平庸就会显现

如果你是初次接触编程,还不知道什么是开发框架(framework)什么是库(library)的话,没关系,你只需要记住一点:Library决定了你能做什么,framework决定了你不能做什么。如果有一个新的框架,让你眼前一亮,蠢蠢欲动,请保持冷静,先想一想,如果你用了这个框架,你将失去哪些能力,是否是可以接受的?我看过太多的项目因为框架的限制,而不得不使用一些旁门左道来突破框架的限制,从而失去了代码的美感。抑或是自己动手,将框架改的面目全非,完全失去了框架的意义。

对于初学者,我强烈建议远离框架。框架是一种捷径,但对于一个以学习阶段的人来说,捷径是并不是什么好事。如果你已经有了足够的经验,对你的运行环境足够了解了之后,你应该在你的运行环境之上,寻找一个优秀的框架,学习它的设计思想。更进一步的,你可以搭建一个你自己的框架。我并不反对使用框架,但我反对不求甚解的使用框架。

修炼是一个长期的过程,即使你已经成为了一名优秀的程序员,你依然需要不断的修炼。记住一点:修炼的捷径就是不走捷径

Hack

你可能想要做一些看起来不可能的事情,这通常是从某个夸张的想法而引起的。Hook、反射,这些略有些高级的技巧。

软件工程

你已经找到了你的第一份工作,你加入了一个团队,经过一段时间,你又被提升为了项目组长。你需要开始考虑一些团队管理问题、系统架构问题

专业方向

一些资源:

MIT 6.828 操作系统工程
github.com
stackshare.io
stackoverflow.com