我本人是从机械专业转过来学习编程的,在这个过程中我大概跟大多数半路出家的人一样,迷茫过,纠结过,努力过,也怅然若失过,同时也有在意想不到的拐角处收获到额外的惊喜。这一路不能说顺顺利利,但也算是跌跌撞撞地走过来了。虽然我的水平还远不至于到了能给别人指点一二的地步,不过我倒不介意把我认为最重要的几点浅薄的看法分享给大家。

选择好一个方向很重要

我相信大多数想入门编程并且未来想在 IT 领域中找到一份工作的人都听过几个热门的词,一会儿是人工智能(AI),一会儿是大数据,一会儿是 Android 开发 iOS 开发之类的,不然就是运维,或者前端、后端之类的。在最开始选择进入 IT 领域的时候,你必须花时间在这些五花八门的方向中找出一个你最感兴趣并且认为自己能够持之以恒地坚持学下去的方向。你可以向有经验的人了解这些方向都是干嘛的,找不到人的话也可以通过互联网求助,譬如知乎等等各大网络平台,搞清楚了这些方向是干嘛的,接下来就是好好规划自己的学习路线,第一步做什么,第二步做什么等等等等,现在网络资源这么发达,想找到自己的学习路线并不难,况且还有慕课网、coursera、edx 等在线教育平台可以利用。总之,利用一切你可以利用到的手段,选择一个你真正感兴趣的方向,即便为了钱而感兴趣也行,只要你认为碰到困难的时候你能坚持下去。

几个方向都精通只是锦上添花

在寻找学习方向的时候,可能很多人会觉得自己好像对好几个方向都非常感兴趣,这个时候怎么办呢?我想对你说的是,虽然方向很多,但是在最开始学习的时候,你必须选择并且仅仅只能选择其中的一个,付出努力持之以恒地把它学好即可,其他的,无论你再有兴趣,也应该暂时地舍弃掉,不要去管它。我这么说主要是基于以下两点:

第一,你在真正找工作的时候,是凭借你的一技之长去投岗位的,请注意,一定是一技之长,每个公司列出那么多岗位给应聘者,并没有要求应聘者同时兼顾好几个方向的技能,相对于什么都知道一点但是什么都不够深入的人,他们一定是要那些在某一个方面有所长能够给他解决这一个方面的实际问题的人,至于其他方面,他们可以再去招聘那些在其他方面有所长的人,而不需要一个人兼顾这么多,大多数时候,一个人来做反而做不好;

第二,人每天的精力是有限的,无论你用它做了什么,每天用完即没有,我曾经对自己专注在一件事情上的时间做了一个粗略的统计,我指的是严格专注在一件事情之上,减去那些喝水、散步、走神的时间,一天顶多顶多只有 6 个小时,而且每周并不能做到每天都能有这么高的效率,通常工作日五天能有两天有这个效率就非常不错了,而且人会感觉非常疲劳。一天 24 小时,全身心铺在一件事情上的时间只能有 6 个小时,换而言之,只有 1/4 的有效工作时间,事实上 5 天的工作日只有顶多只有两天有这么高的效率,这个数字说出去是很吓人的,但是对不起,这真的就是事实,我不知道大家统计过没有,虽然每个人的精力略有差别,但是我相信这个数字的上下浮动不会太大。而随着你在某一个技术方向深入程度的增加,你一定会觉得你不会的东西需要弄明白的东西太多了(当然你也许会觉得有些东西我不需要弄得那么明白和熟练,用到的时候查一查会用就行,下文我会说明为什么这么想是有问题的),你的精力有限,想要弄明白这么多的东西,进一步做到让你的一技之长足够长,真的很难,这是我的切身体会,你真的不太可能让你的一技之长足够长的同时又能兼顾好其他方面的技术。

事实上,我见过在某一个技术方向足够熟练之后,由于个人的兴趣或者个人的需要在其他方面也做得比较好的人,但是,我还真没有见过同时一下子从很多个技术方向出发最后都能够做得非常非常好的人,我相信这种人即便有,也是在少数中的少数吧。先做好自己的一技之长,还有一个原因是,有很多技术方向是有共通点的,你做好了这个方向的一技之长,将来有需要精通其他方向的技术之后,触类旁通会相对容易一些。行业里所说的“全栈工程师”,这大多是环境要求,后来技术背景不断更换之后所带来的一个结果,而不是最初出发的一个目的。总而言之一句话,几个方向都精通只是锦上添花,但这并不要求是必须的,最初学习的时候,你最好只选择一个方向进行突破。

专注、持续、有效的投入

在最初选择技术方向的时候,我刚说了最好专注在一个方向上,事实上不仅如此,在你严格按照学习路线图进行学习的时候,你接触到某一方面的知识,譬如 Linux shell 脚本编程,那么,你也需要在短期内只专注 shell 怎么写,否则,一个基础没打牢固就跑去弄别的,最后的结果只能是捡了芝麻丢了西瓜,狗熊掰棒子而已。明确学习路线之后,需要一步步按照学习路线的规划,稳扎稳打地一个个把每一步要求的知识过关。

一个技术岗位的价值,首先取决于这个技术方向本身,如果你选择的技术方向是一个急需紧缺的类型,那么这个技术方向肯定价值会比较高(说的俗一点,就是钱多);其次取决于选择这个技术岗位的人本身的不可替代性,也就是说,一个技术岗位的人能够把工作做得越出色,别人越难以取代,这个人的价值也就越大。那么,怎样变得越来越不可替代呢?或者,换句话说,怎样把工作做得比大多数人都优秀呢?那就需要在很多别人难以下功夫的地方多下功夫。譬如很多重要的东西,别人由于畏难而退却而你搞明白了,别人忽略的一些重要的细枝末节你掌握了,等等等等,就是静下心来把别人啃不好的硬骨头给啃下来,并且这些硬骨头还是能有效提高你能力的知识点。这也就是我上文说的需要把一些别人不在意的同时又很重要的一些东西弄得比较明白的原因,因为这是你与其他人的差别所在,你做的越好,你的不可替代性就会越强,从而你的价值就会越大。做到这些,就需要专注、持续、有效的投入了,所谓专注就是一心一意做好一件事情,do one thing and do one thing well,所谓持续就是不能三天打鱼两天晒网,大家估计都有体验,如果学习一门技术,刚入门然后断了一段时间,再次投入进去感觉很多东西特别陌生,捡起来重新开始花的时间代价会比较大,长此以往会陷入低水平重复的怪圈,所以我这里强调持续性,打铁要趁热,不要轻易被其他的事情所打断,所谓有效的投入指的是不能低水平重复,每一次的努力都要给自己带来实实在在的成长。

一万小时理论被认为是成为某个领域专家所花费时间的及格线,也是其必要条件,但如果只是低水平地做一些简单的重复工作的话,那再怎么样也成不了杰出专家,我们需要啃一些能有效地提高我们水平的硬骨头。顺便说一下一万小时,我算了一下,如果每天 6 个小时的投入的话,10000 小时的花费大概需要 1667 天,大概需要 4.5 年的时间,这还不包括周末和各种假日。所以,在一个领域内成为专家级的水平需要付出多少大概可想而知了,沉下心来戒骄戒躁好好努力才是王道。

系统的知识体系很重要

做事情专业还是业余,成系统的知识在其中起着非常重要的作用。那么什么是专业呢?这不仅仅是面对已知的问题你能提供有效的解决方案,还有就是针对未知的问题,你能通过有效的规范的步骤,一步步地找出问题症结所在,一点点地让问题浮出水面,或者至少,你能提供一些有利于问题解决的有价值的参考出来。而业余的人,解决问题有时候就跟碰运气一样,有时候能得到解决,有时候却不怎么灵。在一个领域内比较专业的人,他的努力所带来的后果在很大程度上是可以预期的,究其原因,就是其背后有系统的知识体系作为支撑。拿算法来说吧,很多人觉得不重要,怎么说呢?重不重要的结论我先不给出来。我只想说,你认真地掌握了它,再来谈重不重要,得出的结论会更靠谱。实际上,在大多数编程场景中,很少让你写出具体的算法,但算法思想的应用还是比较多的,受过良好算法训练的人,拿来一些实现同样功能代码,他能很快分辨出代码是写的好还是烂,这就是专业与不专业的区别,而对于算法思想的领悟,又需要一定的计算机数学基础为铺垫,这背后就是一整套的系统知识体系。所以说,系统的知识体系,直接关系到你专业还是不专业,而你专业还是不专业,背后又关系到你是不是不可取代的,你的价值是多少。

到底要不要自学编程

经常听到有人问,我不是计算机科班出身的,可是我对编程很感兴趣,到底要不要学编程?或者,我现在年纪也不小了,二十四五岁的高龄了(我笑而不语),学编程还来得及吗?等等诸如此类的要不要学编程问题。我首先是不太愿意回答这样子的问题,原因是我觉得这些人中有相当一部分在提出这个问题的时候心里其实早就有答案了,就是觉得自己可能不太适合,而且岁数比较大等等各种能够说服自己放弃的理由,即便被我说服了,一个脑袋发热一头扎了进去,一碰到困难马上就觉得自己不合适了,想放弃了。对此,我只能说,你不仅仅只是不适合学习编程,你干其他的事情估计也不太可能干得好。我总认为,只要自己努力和积极向上,那么无论处于什么样糟糕的境地,都能找到自己的出路,没有这个自信人生简直都不要活了。有了这个自信的话,对于很多自己内心真正想从事的一些工作,只要是积极乐观的,又何妨一搏呢?梁漱溟先生不也是自学成才,当上了北大教授吗?一般人像他那样子才中学毕业,在这条路上估计早就自我放弃了,他不但通过自学成为了北大教授,而且还教出了像冯友兰、朱自清等一批优秀的学生。毛泽东主席在年轻的时候就写下了这样子的诗:自信人生两百年,会当水击三千里。当然了,不是一般人都有伟人一般的豪迈意气,但是对于我们每个人自己的人生,豪迈豪迈的勇气我们还是应该有的。总之,大胆去选择自己的梦想,只要是积极向上的,尽可努力去拼搏,人立于天地之间,无论现实怎么糟糕,都能找到自己的出路,反正,我就这么自信。

最后,祝学习愉快。