# 开始之前

## 这份文档的目标读者

### 有困惑的软件开发人员

* 希望能写出别人容易读懂的代码，但不知道如何做的开发者
* 希望能够看懂别人代码的开发者

### 软件开发初学者

这是一份面向软件开发初学者的文档，所谓初学者，可以定义为：学过的语言不超过2种，在已经学过的语言技能方面，能够完成课程上的大部分习题。从高校教育的通常情况来说，基本能够完成老师布置的最后的课程大作业。如果要说学得很出色，大概谈不上，要想进一步提高，也很困难。

对于大学毕业（前后1～2年）的同学们来说，他们很难接触到真正较为复杂的项目，即使参与到复杂的项目之中，也会是其中非常细枝末节的部分。他们渴望快速地提升自己的软件开发能力，而恰恰最缺乏提升自身能力的机会。

因此，本文希望能够介绍一种较为合理的方法，帮助各位“同学”，以较为科学合理的方式，提高软件开发的实力。

### 开源软件的初次使用者

在软件开发这个领域，完全不接触开源项目，几乎是不可能的事情。在日常开发工作中，如何借助开源项目提高开发效率，减少重复劳动；如何从开源中受惠，而不是因开源而受害，也是一个很有意思的课题。简单地说：不读源代码，直接拿来使用，其实是有风险的（这和使用普通的闭源软件、闭源的类库，就没有区别了）。但如果我们能阅读、理解源代码，就能避免这种风险，同时理解得越是透彻，越是能够用好一个软件。开源软件正为我们提供了这种可能。

本文也希望能够通过分享过来人的经验，帮助那些初次接触开源、想要用好开源的朋友。

### 开源社区外徘徊的爱好者

想要成为开源社区的一份子，在享受到开源带来的好处之后，或许也能够回馈一些帮助给开源社区？开源社区到底是怎么一回事？有很多人对于开源有着天然的好感，希望能够加入进来，更快的融入开源社区，为开源做出更多的贡献，甚至启动一个自己的开源项目，拉起一支队伍来做些了不起的事情。有这样想法的朋友，应该也不少，希望本文的介绍能够起到一定的帮助。

由于这是一份开放式写作的文档，因此，当我写下这段话的时候，其实并没有特别确定的把握，这份文档将只有以上四类目标用户。也许，它能够对更多的人产生价值。

## 基本条件

### 一台能够上网的电脑

如果我说，以上就是全部的基本条件，似乎是太不负责任了。但是，真的也就够了。假设你只是研究JavaScript的开源项目的话，装一个FireFox/Chrome这样的对开发者友好的浏览器，基本上就可以开始学习了。

再进一步，当然可以有更多的考究。比如：究竟是选择Windows还是Linux/MacOS？Linux又应该选择什么发行版？等等等等，一旦深入，自然有无穷无尽的问题在等着你。

### 首选Ubuntu

首先解释为什么要选择Linux，因为开源软件，在很多情况下都是Linux的版本更加稳定可靠，在解决版本依赖问题的时候，也更加容易些。当然，在Windows下面，也有非常非常多靠谱的开源项目，因此选择Linux更多的是出于一种多多使用开源的偏好。金庸先生的《神雕侠侣》中提到的寒玉床，可以用来解释这其中的奥妙。当你完全处在一个开源的环境，当你的各种操作都会接触到与开源相关的各种概念时，你就时时刻刻都在进步中，这样获得进步自然会更快一些。

再说为什么选择Ubuntu，这就更是个人偏好了，因为Ubuntu的易用性目前看来还是最好的。对于初学者来说，也更加友好一些。网络上的中文资源，也更多一些。

另外，网络上有一篇非常著名的文章叫做：《[开发人员为何应该使用 Mac OS X 兼 OS X 小史](http://blog.youxu.info/2010/02/28/why-mac-os-x-for-programmers/)》，也写得非常有说服力，推荐阅读一下。

### 如果你真的喜欢Windows

必须承认，在Windows环境下，还是可以学习开源的。也有很多很多开源人，努力地在Windows平台下工作。很多环境的搭建工具，被一点一点的开发出来。比如：RubyInstaller；XAMPP；以及cygwin等等。（具体的名词这里不解释）

但是，很多时候，你会遭遇莫名其妙的报错，很多人会在某个深夜，突然抬头望天，破口大骂：“这个烂Windows！”不是没有道理的。

### 不会被阻隔的网络

是的，这篇文章如果有幸被翻译为英文，这一段话完全可以被删除，因为他们无法想象我们还会遇到这样的困难。而克服这种困难，对于学习软件开发，又是绝对必须的一种技能，所以......如果你真的发现目标网站无法访问，那就寻求帮助吧。(抱歉，无法在这份文档里提供帮助。不过，我留了email。)

Google在大多数时候，对于软件开发来说，都是更好的搜索引擎，所以，哪怕你费尽千辛万苦，也一定要用Google来搜索想要寻找的项目、文档和资料，必须的！

参考资料：

* [霍炬：google百度和谷歌的那些事](http://blog.devep.net/virushuo/2010/01/14/blog56google_blogtinyfool_1_go.html)
* [陈皓：作环保的程序员，从不用百度开始](http://coolshell.cn/articles/9308.html)

## 你需要明确的一些事情

### 你真的想学习软件开发吗？

在正式开始学习之前，我实在是忍不住，我想一遍又一遍的询问你：你真的想吗？你真的想成为一个“码农”吗？你真的想掌握软件开发这门手艺，甚至以此来谋生吗？那么好，我得告诉你一些事实：

* 软件开发工程师，绝非你想象中的事少钱多责任轻的那种高薪白领。很多程序员会自称“码农”，就是因为这份职业非常的辛苦，而且做好不易。
* 另外，这是一个需要终生学习的职业，很多很多的其他领域，没有那么快的知识更新速度。但是软件开发这个领域，1～2年不接触技术最新的进展，你就OUT了！
* 还有，软件开发这个行当，真的未必就那么好找工作。就业前景什么的，也并非像那些传说的成功故事一样光明。

但是，真的有一些人，热爱这个行业，编程不但是他的工作，他的业余爱好也是Coding。

如果，你确信自己不仅仅是靠编程来维生，更是将编程作为自己最大的爱好，那么欢迎您，来到一个神奇而充满魅力的世界。这里有智慧、有乐趣、更有热心的朋友和充满前途的事业！（太像传销课了...）

### 你真的适合软件开发吗？

虽然，软件开发并非像传说中的那样，是一个需要高智商的Nerd的行业。但是，他的确需要一些品质和能力，如果你发现自己并不具备，或者要很辛苦才能做到，那么，你不适合这个行当。

* 懒惰：有一句名言这么说：“懒惰是程序员的美德”，因为真正的程序员，一定痛恨反复做同一件事情，至少他们会写一个函数来替自己完成。如果发现代码里重复出现相同的段落，他们会无法抑制地想要消除这种重复。
* 条理：如果这是一个复杂的事情，那么我可以分成三个阶段来着手去做它。如果仔细想想，第一个阶段，还可以分为5个部分。在开始第一阶段之前，还有4个准备工作，必须首先考虑。
* 耐心：很多时候，程序里的麻烦会来找你，如何解决？解决“bug”需要洞察力，需要细心，而最需要的，则是耐心。有些时候，我会非常享受这种“破案”的过程。
* 好奇心：值得好奇的事情太多了，永远学不完的新技术，最近的进展和最佳实践，甚至其他行业和领域的究竟，我们都有充沛的好奇心，因为无论哪个行业，他们早晚都会来找到我们帮他们编写代码的。
* 较真：很多事情，据说都差不多就可以了。但是，计算机是那么严格，快百分之一毫秒，也是快了。一个万分之一概率下会出的bug，还是bug。如果你不是一个足够较真的人，就会放过很多问题，而那些问题，往往就会酿成大祸。

### OK，闲话少叙，咱们开始吧！

[下一章](start)
