新手?为什么需要关怀》在42区上挺热,看到很多人留言说新手,诚惶诚恐。我说你们也别太那啥了,一般只要不是求作业求妹子的,基本都还是能忍的。就算你问问题前言不搭后语,问题叙述的乱七八糟,老是求解释。通常我最多告诉你看某文档就不再回话——意思是事情到此为止。你不用担心我恼怒或者生气,我的时间很宝贵,没空浪费在这么无聊的事情上。如果下次你问出个有内涵的问题,咱们不妨讨论讨论。

写这篇的主要目地,是给新手一个指导。我不知道现在所谓新手的水准,以我在42区上看到的而言,是高的吓人。但是我实际接触到的,可能如一位朋友所说的垃圾,水准是差的吓人。其中有很多是不高兴学,或者打算做了再说的。您走好,这篇文章不是给您的。这篇文章是告诉一些真的是新手的程序员,如何稍微的提高一点水平。我假定你们会用vc写一些简单的程序,拖拖拉拉控件能做一个简单的计算器。在计算机上,我相对偏向实用。您和我说在算法课上能拿多少分,对我今天所说的内容意义不大。所以无论您课业上不及格也好,满分也好,本文告诉你如何成为一位牛逼或者可以装逼的程序员——如果你做了整个过程,学到了东西,那就是前者。如果没学到,没关系,至少你可以拿着本文的经历去装逼。

首先,请保存好你们的照片什么的,然后,把你们面前的电脑格式化掉。对,所有windows的内容一点不要留,已经是linux的朋友,请确保你“没有”windows了。作为程序员,你无论如何都需要自己做很多事情,直接使用linux是一个良好的开端。但是学linux是痛苦的,只要有退回windows的可能,你就没法真的学会linux。学着用linux工作和学习(对于某些人来说,娱乐更重要,在这方面,linux确实不怎么样,幸好,如果您是这样的人,本文也没看的必要了),并且熟悉整个系统,最快需要2-3个月的时间,慢的话需要半年到一年的努力。你需要不断磨合,学习新的程序使用方法,请教前辈,实验,最终能够掌握这一系统。掌握的标准是什么?你知道哪些事情是不能用linux做的。之所以这么说,是因为新手根本不知道哪些事情是不能用linux做的,他们所有事情都没法用linux做。而老手会使用最合适的方法来用这个系统。

当你已经能够熟练使用linux,甚至比windows还熟的时候,你的桌面装什么东西就随便你了。我的桌面是win7,因为老婆需要。我知道不少程序员的桌面是mac,这也很好。不过一旦你熟悉了linux,你最少会装个虚拟机来做开发,并且觉得试图在windows下做这些事情很蠢。windows的console是cp936编码的,网页很多都是gb2312编码的,但是用gb2312去读他们却未必能行(这是因为windows下的gb2312/gbk说的都是gbk,抽风啊)。linux下面大多数term都是utf-8,世界清静很多。windows下开个小网页服务器要跟着一个图形管理界面,linux下服务就是服务。总之,如果你真的打算开发,你会发现windows其实非常不友好。所谓友好是指已经被微软封装过的部分,还有他们的文档——那个真的非常不错。

第二步,你得打造一个自己的工作环境。我知道你习惯了微软的IDE,进入linux后还试图用一些WYSIWYG的系统。不是每个WYSIWYG都是错误的,然而作为最适合你的程序而言,他未必就是WYSIWYG的。你在windows下一般用什么开发工具?vs?盗版吧?好吧,你是学生。但是你能用vs编译一个linux kernel么?在没有SDK扩展包的情况下,vs也不能用来做android开发吧?这就是vs的真相,将一些特定的开发,做相当程度的简化,以换取大量的初级开发者。当然,你会反驳说vs可以开发WDM,或者做DDK级调试都可以。然而,这也是特定领域——凡是微软给你能做的领域,你都可以做。但是微软不允许你做的领域呢?虽然微软允许的范围很大,但是作为初学者,了解开发是如何工作的更加重要。

你可能需要一个编辑器,通常这只有三个选项,vim/emacs/其他。而后你需要一个编译器,如果使用C,多半就是gcc。调试工具一般会选用gdb,编译项目管理工具一般是make。这四者的用法都可以google到,并且通过合适的配置配合到一起,达到和vs类似的结果——你写一些代码,然后按开始调试,程序就开始一步一步运行。到你需要的地方,输出一些数据看看?然后再继续运行。和vs没有什么太大差异。不过作为自行配置环境努力的回报,你有两项比较大的优势。一个是你的各种工具都是千锤百炼的,最优化的工具,他们一定真的能工作,而且可以信赖。另一方面,当你需要改变工具的时候,你可以保持其他工具不变。例如,你现在需要通过go语言快速的开发一些web程序,你需要将gcc换成gogcc,gdb也需要换掉。然而make只需要新增一些规则,vim/emacs也无需变化。回想一下你在vs里面如何编写go代码?——这个——好像——似乎——需要第三方插件吧。找找看?运气好的话有收费插件可以达到这个目地,找一个破解版来——如果开发者都对破解无动于衷,你还如何指望别人来尊重你的知识产权?也许你想,我可以不使用go语言来编写。好吧,go的效率是编译型语言中比较高的,你要和go比效率,可选的只有C语言。那么你准备在vs上用C开发一套web?——我尊重你的选择,并为你逝去的人生默哀。

第三步,找一个合适的项目。这点我在《如何参与一个开源项目》一文中有说,不过那篇文章建议你尽量做一些代码之外的工作。为了磨练你的水平,你可能需要做一些和代码有关的事情。不过无所谓,大概来说事情是不变的。找一个合适的项目,和他的领导者谈谈,看看有什么可以干的,并且努力干完。

第四步?没有了,继续这么干吧,应该没多久,你就是N个项目的参与者,有一定的代码贡献,并且和一些大牛们交流一些业界最新的东西。如果这样都不算入门,我真不知道你入门的标准是什么了。

听起来很简单,那么事情的难点在哪里?

关键在于,无论事情看起来多么困难,多么不可能,你觉得多么辛苦,你都立刻,马上的去做。而不是看完文章后点一下“mark”,“like”,“+1”,然后让他躺在你庞大的文库里面生灰。