如何成为一名程序员?

353 查看

如何成为一名程序员
为什么会有这篇文档?

之前有幸看过Eric Raymond(埃里克·史蒂文·雷蒙德)写的一篇文章《如何成为一名黑客》,感觉像黑夜里的灯塔一样,能够给人很多的启迪。在计算机这条道路上,无论是程序员,黑客,网管,还是其他任何相关的角色,有一个老司机带你,能让你看清自己的方向,不至于迷失自我。记得在初二那一年因为老师的一句很看不起人的话,走上了编程这条路。高中,大学,不断的更换自己所学的语言。这期间我学习了VB,Java,Perl,Python,C#,C,C++,汇编,原因就是因为自己不知道该学什么好,究竟应该学什么才是对的,怎么样才能更好的在编程这条路走的更远,我学习VB的时候看到别人说Java如何的厉害,学Java的时候又听别人说Java不能做大型游戏和操作系统…那一刻我是真的迷茫了。这是我下定决定要写这篇手记的初衷,我不奢望它能成为像《如何成为一名黑客》这样被人称为黑客入门宝典的文章,只希望能让看到这篇手记的你,不再迷茫。

什么是程序员?

程序员在外行人看来,可能是一个带着厚镜片眼睛,满脸的胡茬,大T恤,人字拖,双眼无光,整天坐在电脑前噼里啪啦的敲代码,凡是电脑相关的问题,他都要会。
其实并不是那样的,从计算机诞生之初,世界上第一台计算机出现的那一刻,就意味着世界上已经有了第一批程序员。如果非要我说程序员是什么的话,我只能说,计算机就像无所不能的阿拉丁神灯,而程序员则懂得如何与它交流沟通的办法,在网络的世界中,如果说骇客是破坏神,那么程序员就是创世神。(ps:这里不用黑客是因为,传统意义的黑客,像侠客一样,他们不会做无意义的破坏,他们只是乐于追求技术的巅峰和分享自己的技术。)
程序员可以创造任何你所能想到的程序,任何不可思议的东西,任何在别人看来魔幻的东西,程序员都能通过不断的超越自我来一一实现,虚拟现实和人工智能技术的突破,已经说明了这一切。有很多人认为自己是程序员,我想说不,其实你不是,你只是一个码农。而有很多人自嘲自己是码农,其实他们才是真正的程序员。
程序员和码农真正的区别在于,码农只会每天无休止的工作,今天重复昨天的任务,明天复制今天的生活。一年又一年,一个项目又一个项目,同样的框架,同样的配置文件,同样的结构,甚至同样的接口和底层代码。每天他们所做的就是Ctrl+CCtrl+V。甚至,从来不去关心技术,也不会去分享自己的技术,他们闭门造车,生怕自己的技术被公司的新人,被其他的同行学去。自己写的项目要里三层外三层的绕来绕去,防止别人偷窃自己的代码。
而程序员,他们乐于分享,追求技术的巅峰,不断超越自我。码农所关心的是如何尽快完成一个项目,程序员关心的是如何让一个项目更加的优雅稳健

程序员的态度
  1. 这个世界充满了问题,等待我们去解决。
  2. 不要重复的制造轮子
  3. 崇尚自由
  4. 编程使人快乐
  5. 乐于分享
    正如你所看到的,程序员的态度和黑客的态度惊人的相似。实际上程序员和黑客之间并没有太多的不同之处,首先他们都是编程高手,只不过他们所专注的领域不同,黑客研究的是如何让软件拥有更强大的破坏力,而程序员所研究的是软件如何承载更高的并发,如何去抵挡黑客的攻击。

和所有创造性的艺术一样,成为大师的最有效方法,就是模仿大师的精神——智力上的模仿还不够,还要从感情上进行模仿。
修行之道:
关注大师的言行,
跟随大师的举动,
和大师一并修行,
领会大师的意境,
成为真正的大师。
引用自《如何成为一名黑客》

1. 这个世界充满了问题,等待我们去解决。

程序员就是为解决问题而生的,如果这个世界不存在任何问题,那么就不需要程序员。当人们需要通讯,需要沟通的时候,诞生了MSN,QQ,Skype。当人们需要社交的时候诞生了FaceBook。当人们需要网络购物的时候,诞生了亚马逊,天猫。就和所有先有鸡还是先有蛋的问题一样,到底是什么先需要网络通讯后诞生的通讯软件,还是先有的通讯软件,后来人们才适应了网络通讯。这些问题,人们不得而知,但是上面提到的每一个人,他们如今都在福布斯富豪榜位列前茅。你所发现的问题,或者你所要解决的问题,他的受众面有多广,那么你对于人类的贡献就有多大,而你的名字也会被篆刻在历史的丰碑上。这个世界拥有无数的问题,即使百度,腾讯,阿里,拿掉了所有的技术,依然有无数的问题等待我们去发现,去解决。你要相信,即使是谷歌的产品经理,也不如一个专修平房漏水的大爷更了解他所在行业的问题。从你最熟悉的环境出发,发现问题,并解决它。

2. 不要重复的制造轮子

对于已有的东西,程序员不会去重复的创造它,除非之前的东西非常的差。如果他是一个开源项目,应当提出你的修改意见,或直接贡献你的代码。除非它毫无亮点可言,否则你不需要重复制造轮子的过程。要相信一句话,最出色的程序员,也不如一个社区的人共同努力所创造出来的产品完美。你应当将时间和精力放在更有意义和价值的事情上。

3. 崇尚自由

如果你跟我说,程序员是没有自由的,那么我想你可能是在生活的压力下迷失了自我。自由并非是来去自如,而是你的工作岗位可以由你自己去支配,你可以选择是在天台或者坐在滑滑梯上,甚至是在家里办公。要记住一句话,自由永远是属于强者的,为了追寻自由,你必须不断的突破和超越自我。还要记住自由并非是不工作,事实上如果能够处在一家伟大的公司,和一群伟大的人共事,那将是一件非常令人愉快的事情。

4. 编程使人快乐

你是否每天上班以后,打开电脑和你的编程工具以后,就开始了自己一天的工作,浑浑噩噩直到吃午饭。下午继续重复这一过程,日复一日,你已经忘记了你的初心,忘记了你一开始学习编程时的那种激情和梦想。没错,并非每个人都有梦想,也并非每一个梦想都可以实现,更不是说每一个程序员都要去实现自己的梦想。我认为,程序员最大的梦想就是快乐的编程。试想一下,在一天的清晨,一杯青柠檬茶和一个机械键盘,听着你所喜欢的音乐,跟着欢快的节拍敲打着。就好像多年前的那个深夜,一个人,一架钢琴,一轮明月,一杯苦酒,造就了永世流传的月光交响曲。

5. 乐于分享

如果你觉得程序员都应当牢牢地保护好自己的代码,那么绝对不会有今天的Github这种开源项目托管的网站。更不会有一个个流传至今还被人使用着的项目,可能有人会说某些著名的产品都没有开源。相信我,他们不开源是因为他们的代码写的太烂,如果被别人看到就没有人敢使用他们的产品了。一个人,一个团队,一个公司的力量,绝对比不上全世界的程序员。计算机之所以发展的如此迅猛,就是有无数的乐于分享的你们,这些分享并非仅限于你某个项目的源码,也可以是一篇文章,甚至是一次回答,这对于你来说,都是分享,这一过程将使你得到快乐,并获得行业其他人的认同。

程序员的基本技能
  1. 学习如何编程
  2. 学会使用互联网
  3. 能够看懂英语

1. 学习如何编程

如果你是一个新手,对于编程一无所知,恭喜你,你将在这里找到你的路。如果你是一个入门者,对于编程略有了解,恭喜你,你将在这里坚定你的路。如果你是一个老鸟,对于编程早已融会贯通,同样恭喜你,你将在这里成为开拓者。
在过去的几年里,我学习了多门编程语言,我发现其实他们都大同小异,一旦你掌握其中一门,想学习其他任何一门都会很容易,是真的非常的容易,我可以毫不客气的说,你可以一周之内就学会别的语言。除非你并没有真正的掌握编程的思想,我们总是强调思想,这就像小说中的法则一样,领悟其中一门法则,再去领悟其他法则,可能还不是特别的快,但是参考起来还是比新手要快。但是一旦领悟了法则的本质,那么再领悟其他任何一门法则都会很轻松。你并不需要苦恼你不理解这些,放松你的心态,学习和工作中,一切都会水到渠成。
编程语言众多,条条大路通罗马,忘记你在任何位置看到的任何关于某个语言不好的地方,也忘记你看到的任何关于某个语言的优势,那些都是毫无意义的。实际上你点开任何一个语言的官网,他总有一个与其他语言的对比图,对比的结果它总是比其他语言更有优势,那么这些毫无意义的评价又有什么价值呢。
即使是世界上人口最少的冰岛,那里的人民使用他们独有的语言,依旧能够快乐幸福的生活着。
不管我下面说了什么,如果你已经决定或者正在学习一门语言的话,坚定的走下去,如果今天因为我的话而放弃你目前的所学,你还是趁早离开这个行业吧。如果你还没有选择一门语言,那么你或许可以参考我的建议。
在我学习的多门语言中,从来没有哪一门语言能让我感到惊艳,或者说,像弹钢琴一样的写代码,Python做到了。最初接触Python是因为要写一个网络爬虫,当时看了一些参考资料就写出来了,而且代码十分的简洁,只有短短的三十多行代码。不过但是并没有太大的惊喜,只是觉得,哎呦,这个语言,不错哦。因为Java我也完全可以自己整合一个包,只用几句代码,也能完成这一切,但是当时想到这个时候,我忘记了一个很严重的问题,那就是我在自己造轮子。
Python带给我的惊喜远远不止于此,又一次偶然的机会让我使用Django(Python的一个开发网站的框架),这一次我是彻底的被它的简单,优雅而吸引。很多人推荐初学者学习Java,C++,甚至是VB和汇编。
实际上,我曾经也经常推荐想学习编程的朋友,去学习Java,因为它没有像C++那么难以理解的东西。但是Java的面向对象的思想,足够没有编程基础的人喝一壶了,所以我不建议新手学习Java。而Python被列为黑客必须要掌握的技术之一,同样,我认为程序员也必须掌握Python。因为它真的非常的简单和强大。有人称Python为瑞士军刀,还有人称它为胶水语言,在国外很多学校都是以Python作为教学的语言。Python拥有庞大的用户群和社区,Google,NASA。所有你耳熟能详的公司,他们或多或少都在使用着Python。事实上,Perl也同样简洁,而且它对于正则表达式的支持是难以置信的,但是它的用户群体并不多,而且不够活跃,选择一个用户群体活跃的语言,将会让你语言问题时,获得更多人的帮助。
而学习编程,最好的方法就是阅读,不管是官方的文档还是别人写的教程,如果是视频教程就更好了。一开始学习的时候,不要太过于纠结底层的原理,就像你开车一样。一开始你只是学习怎么开这个车,你并不了解内部的构造,所以你不会修理它,但是随着你经验的加深,你开得多了,对它内部的了解就多了,慢慢的你也可以修理它了。
最后强调一次,坚持你目前所学的。

2. 学会使用互联网

身为一个程序员,如果你不会使用互联网,那就太弱了。学会使用百度和翻墙,这对于每个程序员来说是必备的技能。

3. 能够看懂英语

英语对于你来说是必要的,如果你的英语不好,你不必苦恼。编程这么难的东西,你都敢于学习它,英语又算得了的什么?26个字母分开认识,组合起来一样能够认识,更何况还可以借助翻译工具。这并非让你在学习编程之初就需要掌握英语,而是在你编程达到一种比较高的层次以后可以考虑的事情。英语可以让你和国外众多的高手交流心得,同时还可以让你参与国外大型的开源项目开发。

提高自己在编程圈中的地位
  1. 贡献开源项目
  2. 帮助测试并调试开源项目
  3. 发布有用的信息
  4. 帮助新人

和其他行业不同,程序员想要提高自己在圈中的地位,并不需要多么惊世骇俗的经历,甚至不需要多么厉害的技术。提高自己的地位,可以让你在求职或创业过程中,获得更多同行业的帮助,你的付出都会得到回报,相信我。

1. 贡献开源项目

永远不要以为在Github上贡献一个项目有多么的困难,一次机缘巧合之下,我发现Python中一个很大的开源项目Requests文档中有一句代码书写错误,于是我修改了它,我的提交得到了项目管理团队的认同,他们收录了我的修改。就是这么的简单,细心和简单的英语水平,就能让你贡献一个几百万人使用的项目。甚至,你可以自己发起一个开源项目,正如我所说的,程序员都是乐于分享的,如果你发起某个项目,并且说的足够的详细,一定会有人非常乐意和你一起开发和维护这个项目的。

2. 帮助测试并调试开源项目

如果你费尽心机也没有能够贡献一个开源项目的话,千万不要灰心,你还可以帮助开源项目进行测试和调试。如果发现其中的问题,可以去他们的主页提出问题,如果能够给出解决意见,那真是太好不过了。帮助测试开源项目是一件非常容易的事情,在Github任何一个项目的主页中,他都拥有当前稳定版本和测试版本以及过去版本。当前稳定版本就相当于正式版,是经过测试没有问题,发给用户使用的。测试版本就是目前正在开发的版本,修改或增加了很多新的内容,但是没有经过详细的测试,开发团队也不确定会出现什么问题,于是发出来希望有经验的开发人员能够协助他们共同去测试。

3. 发布有用的信息

你还可以活跃在各大程序员社区,慕课网是一个不错的选择,在这里有很多的新人,也有很多的前辈。无论发布任何的信息,都会帮助到别人。无论你是新人还是老手,都可以发布手记,这可以是你学习的心得体会,也可以是你面试的经历,还可以是你学习编程之路的微笑与眼泪,或是你工作中的所见所想。都会得到大家的阅读,不会有任何人会出言不逊或否定你的技术,即使写错了也不用担心,别人会指出你的错误,这样才能一直进步。永远不要担心别人指正你的错误,除非他说的是不对的。

4. 帮助新人

你曾经和他们一样,永远不要忘记这句话,当新手提问一些在你看起来非常可笑的问题时,要告诉自己,曾经我和他一样。不要去嘲笑他,在解答他问题的同时,记得告诉他,如何学会排查这些问题,以及如何更好的使用搜索引擎去寻找答案。要记住,你轻蔑的回答,可能毁灭了一个和曾经的你一样有梦想的人。工作之余和假期无聊的时候,浏览一下别人的问题,选择一些回答,这都可以帮助你提升自己的技术和地位。记住,这是一件长期的事情,一天回答一百个问题,然后九十九天不回答,不如一百天每天回答一个问题,你说呢?

最后几点疑问

我需要掌握数学吗?

我希望你今天能够记住我说的这几句话,程序员的工作和数学真的没有太大的关系,只要你能够了解加减乘除,大于小于这些基本的关系就足够了。就像那些年中柯景腾说的,“就算十年后我连log都不知道是什么,一样可以活的很好”。我们程序员同样如此,就算你不知道什么叫做正弦余弦,一样可以很好的编程。真正需要数学来做的工作,都是那些博士的工作,我们的任务只是改变世界而已,所以我们不需要数学的基础。当然,如果你拥有这个技能,也不会影响什么,相反它还会让你在理解程序逻辑的时候简单一些。

程序员就要会修电脑吗?

没有任何人下过这个规定,修电脑是网管的任务,程序员所要思考的就是如何更优雅的工作。

程序员都很内向吗?

这取决于个人,我觉得学习的同时应当不要忘记健身和娱乐,周末可以约几个朋友一起出去唱唱歌,吃个烧烤什么的。不是说某个行业的人都要内向,我身边很多同事都特别的外向,并且桃花运不断。

怎么样才能知道自己已经是一个合格的程序员了?

恭喜你,当你对自己问这个问题的时候,你已经是一个合格的程序员了,接下来你所要做的就是,把你所决定的付诸行动。从今天开始,分享一个学习的小心得,回答一个小问题。请记住,这并不需要你有多么高深的技术,哪怕你今天才开始学习编程,依旧可以写出一篇文章来,向人们分享你成长的同时,还可以给其他人以帮助。程序员圈子是一个乐于分享和有爱的圈子,请分享你每一次成长的经历,一定会得到别人的赞同,而如果有人出言不逊,你不必理会,他一定是一个没有素质的人。

我需要一台高配置的电脑吗?

实际上是不需要的,你只要拥有一个搭载512MB内存和单核的处理器,以及一块50G硬盘的电脑足以。当然,它可能不足以让你运行大型的开发工具,但是小型的sublime或是Vim,也是一个很不错的选择,至少他们比文本文档漂亮的多。

我的家人建议我去学习其他行业,我该去吗?

再从头看一遍我们的文章,然后问自己,我想要做一个程序员吗?如果你得到的答案是确定的,那么我为你感到骄傲,无论谁的否定,都不能阻挡你在这条路走下去。你不仅不能放弃,反而要努力拼搏,拥有一片属于你的天空,让否定你的人刮目相看。而如果你得到的答案是否定的,那么我为你感到遗憾的同时,我建议你选择一个你真正喜欢的行业,即使这个行业不是程序员,我也会为你喝彩。你是一个独立存在的人,所以,你要自己决定你未来的路,不管你喜欢的职业是什么,走下去,别回头。

我该从哪里开始学习?

如果你想寻找一个友好免费全面的学习平台,那么我建议你选择慕课网,这真的不是在安利什么广告,事实上你在这里看到这篇手记,已经说明你在这里学习了。我接触过许多的学习网站,他们拥有很多的问题,比如说太多的收费内容,以及社区不够全面化。慕课网则不同,不仅有用大量的免费课程,还有便宜的实战课程,要知道的是,实战课程通常都是大型项目,看完以后对于之前基础知识的整合是非常有帮助的,而非实战内容,都是免费的。并且还有猿问和手记能够帮助成长。
同时Github,Google+和stackoverflow也是非常好的,能够帮助你成长的平台,但是这三个平台都需要有一定的英文基础。其中Github能够和许多开源项目的作者面对面交流,而Google+则拥有很多的社区,能够找到你所学习语言的社区,并且其中有很多的大神,至于stackoverflow则号称如果它里面都没人能解决的问题,那你的问题一定是无法解决的,可想而知它的魅力之所在。

人工智能会让我丢失工作吗?

至少,在我们活着的时候,不需要担心这个问题。人类的大脑又岂是简单的算法能够完成的?

开源是否会让我得不到任何的收入?

我想这个问题,Linux之父从来没有担心过,因为他一份简历投去任何一家公司,上面只需要写一行字:我创造了Linux。他所得到的工资恐怕是数以千万而且还有公司的股权,这难道不比一个收费软件赚得多吗?更何况他得到的远不止于此。

我已经年纪很大了,现在学习是不是晚了?

从来没有人给程序员入门限定一个年龄,以前没有,现在没有,未来更不会有。

我需要多久才能掌握?

这取决于你的努力程度和你的聪明程度,虽然我不想提到这个问题,但是我不得不说,聪明才智也是一个重要因素。值得庆幸的是,我们大部分人的智商都是差不多的,只有个别智商超群的人,那是他们的天赋。我们只要付出更多的努力,同样可以超过他,勤能补拙不是说着玩的。通常情况,能在半年内使用一门语言进行开发,两年内能够对一门技术有非常高的了解。但是真的想在这个行业达到令人尊敬的地位,你需要一生去学习。

最后说几句
  1. 永远不要嘲笑新手
  2. 记住你的初衷
  3. 任何时候都不要忘记代码的美观
  4. 优雅高效
  5. 乐于分享

感谢能够看到最后的你,希望这篇文章,能够给你带来一些帮助,起码能让你觉得不再迷茫,我的目的就达到了。你可以将本文以文字或是链接的形式分享到任何地方,如果可以的话,我希望你能够直接分享文章的地址或者是在转载的时候加上出自哪里,以便更多的人加入我们这个大家庭。世界的未来,依靠各位去改变,记住我所说的,从现在开始行动,从码农转变为真正的程序员。从今天开始,乐于分享,快乐编程。

(注:如果有错别字,给大家带来阅读上的困难,我表示歉意,同时希望你能够指出错误的位置,以便于我来修改它。我将会在文章的底部增加上提出修改意见人的名字。多人提出同一修改,则以最先提出的人为准。)

本文由以下人员共同协作完成(排名不分先后)

@秋名山车神

@qq_癫狂是一种病_03633840

@小丨小菜鸟