【干货】我是怎么走进阿里做程序员的?

一个非科班专业的大学生,没有上过任何编程相关培训,是如何一步一步走进阿里做程序员的?本文记录了我的大学时期的心路历程,有迷茫与思考,有徘徊和坚定,但是从来没有放弃与后悔。这条路上,我还要走得更远!

在阿里做程序员两年了,在慕课网也讲课一年多了,在这期间,认识了很多人,包括学员,包括微信群里的一些人,很多人都对互联网比较感兴趣,也想学一些东西,但是总是找不着门,徘徊在门外苦苦探索,浪费了很多时间,下面我也总结一下我这一路是怎么走过来的,希望给大家一点参考。

我的专业并不是计算机,甚至和计算机相差很远。在大学,我们主要学电子电路,机械,陀螺,惯性原理什么的,在大一的时候,上过一节C语言的课,那是整个大学唯一一门与软件编程相关的课程,但是那时候哪里能够意识到C语言的重要性,所以也只是普通的学了,考试过了也就算了。其实在整个大一大二期间,我几乎没有考虑毕业后要做什么,也没有想过以后要怎么谋生,还是沿袭高中时候的学习方式,觉得考试都过了就可以了,工作肯定会有的,船到桥头自然直。

到了大二下学期的时候,我们有一门电路实践课,其中一节是学习FPGA,需要用VHDL语言进行硬件编程,当时班上几个“触觉”比较灵敏的同学找到了上一届的实验报告,里面有完整程序,但是他们看不懂,就拿过来问我。我也研究了一番,大概半小时吧,把整个程序搞懂了,然后去告诉他们。那次上课的时候,我是我们班第一个做完实验的同学,老师临时加了两三个需求,比较简单,我也都完成了。

从那天起,我开始思考一些事情,我是一个动手能力比较差的人,平时在金工实习,组装机械啥的,一般都是倒数完成,电子实习,连电路什么的,也是中等,虽然我学习也算比较认真,但是总会出现各种各样的问题,也可能是运气比较差吧。但是在软件编程方面,我好像比较占优势,比同学们更有天赋。那天起,我决定去看看软件相关的东西。

我开始重拾C语言,那时候,我们还在用TurboC作为开发环境,那是在DOS环境下运行的程序,后来,我又折腾了BorlandC,devC等环境,最后才发现,原来VisualC++6.0的开发环境才是最适合的,光是一个开发环境,我就折腾了好一阵,但是我也没有放弃。记得最清楚的是,当时用VisualC++6.0编写hello world,总是编译不过去,搞了很久,最后才知道,原来我建的不是c文件,而是txt文件,当时的我是一个完全的小白,不知道怎么去学习,不知道怎么去找资料,也不知道该问谁,只能自己一个人慢慢摸索。

开发环境只是第一步,当我知道怎么编写hello world的时候,也把当时C语言学的什么if,while,数组,指针,结构体都实践了一遍,接下来该干嘛?总不能一辈子在这个黑乎乎的屏幕下面编写程序吧(后来我才知道它叫控制台)?这时候,我开始去寻找一些能够编写窗体程序的资料,当时可以选择的有VB、VC、Delphi、C#、Java等等,我没有办法选择,我想一一了解一下,再选择,所以那时候,我去图书馆一下子借了十几本书,回来看,两三天后,通过初步浏览和网上搜索,我决定先从VC入手(后来证明我的选择是正确的)。

学习软件编程有几个很好的优点,第一、成本低,不需要有电路板,不需要有车床啥的,只要一台电脑,你就可以随便学;第二、很稳定,不像电路一样,可能有点干扰,整个电路就不行了;第三,可以随便折腾,最多能把电脑搞死机,重启一下就好了,不像电路啥的,随便插错一根线就可能烧板子;第四、资料很多,很多问题在网上都能找到答案或者资料,而不像硬件,型号繁多,要在网上搜到一个可行的方案比较困难,验证起来也很麻烦。所以综合来说,学习软件比学习硬件要好很多。

回到我学习VC的路子,那也不是一帆风顺的,而是遍地的坎坷。一开始去图书馆找书,哪里知道要看什么书,关于VC的书太多了,对于一个初学者来说很难选择。当时网上说,《Window程序设计》很不错,就先借了一本《Window程序设计》,拿回来看,看了两周了,大概看了两章,实践了两个程序,看到第三章的时候实在是看不懂了。那时候我才意识到,我可能是看了一本比较高深的书(现在我知道,那是讲得很深的一本书了,对于那时候的我,就像没有学过小学数学就直接学微积分)。然后我马上调整,果断放弃了那本书,回去借了一些比较基础的书,会讲得比较细,但是会从开发环境介绍一步一步讲起的,然后跟着一起实践,终于编出一个对话框的程序。那是我编出来的第一个窗体程序,虽然很简单,就是按照步骤新建一个工程,然后运行就好了,但是还是满满的成就感。后来就跟着那本书,慢慢地知道怎么在对话框添加一个按钮,怎么点击按钮的时候显示一个文字,怎么去显示一个图片等等。等把那本书的前面几章基础都看完,后面讲原理的部分又看不懂了。那时候很多概念比较晕,什么析构、继承、多态、回调、句柄等等,根本不知道在讲些什么。

这时候我在网上搜索下才知道,窗体程序的框架MFC是基于C++的,C++是C的一个拓展,在C的基础上增加了面向对象的特性,所以我又放弃了之前那本书,借了一本C++的书来看。这回算是找对路子了,C++的书看起来还是比较轻松比较简单的,很快我就知道了C++里面的构造和析构是怎么回事,继承是怎么回事,多态是什么,不过说实话当时多态并没看懂,还有虚函数什么的,不是特别懂,不过对于理解MFC的原理还是有很大帮助。

看完C++之后,我杀了个回马枪,把MFC的原理大概搞明白了,然后又去借了一本书,这本书是专门讲案例的,每一个案例都有源码,但是没有详细的解释。我就照着源码一个一个字母地敲,有时候会敲错,要调试很久,但是最终总是能够调试成功。然后我再去尝试理解里面的逻辑,尝试去改动代码,再运行,看看是不是和我想象的一样。就这样,30多个案例,大概每天啃一个,啃了一个月,全部啃完了,到此,我已经能够按照书本编写一些贪吃蛇呀、俄罗斯方块呀、猜数字呀、24点呀这样的小游戏和小案例了。但是我从来没有完全自己动手写过程序,所以我决定给自己布置一个期末考试,考试内容就是完全自己编写一个中国象棋的程序,那个程序花了我大概一周的时间,磕磕绊绊地编写完毕了,成就感爆棚,而且感觉自己对MFC已经非常了解了。

所以到这里其实又是一个坎,因为不知道下一步该学点什么了。那时候有些实验课要处理数据,学了下matlab,不过那都相对比较简单。然后去参加了一些比赛,比如数学建模、比如学校的冯如杯、用到了很多matlab和vc的东西,只要团队中有关软件的工作,都是我来做,还帮助其他很多团队做了他们的一些软件工作,在这个过程中,我用MFC已经大大小小做过十多个项目了。后来实在是有点闲,去看了一些VB呀、Delphi呀、C#呀、Java呀、linux呀、shell编程呀这样的书,但是因为没有重点,所以也只是草草地看看,没有深入,甚至还看了一些PS、Flash、Firefox、Dreamweaver的书,当时特别想做一个网站,因为这样我可以给别人看,去炫耀一下啊。但是当时根本不懂什么域名、服务器啥的,也根本无从下手。

后来我们学校的BT火了,上面有很多学习资料,我下载了一个孙鑫的VC++视频教程,总共20节课,那个时候我看过的VC相关的书已经不下几十本了,但是还是不得不说,真的很专业,看完之后,我觉得那套视频的知识点涵盖了我知道的几乎所有知识,而且解决了我很多困惑,多态的深刻理解就是在他的讲解中顿悟的,所以这时候我发现,对于一个初学者来说,看视频远远比看书效率高很多,因为视频上老师可以一步一步带着你来做,而且讲到这的时候,会讲解它的原理,这时候上下文都有,就很容易听懂。而看书,很难在脑海里构造出上下文,所以很多时候其实是似懂非懂。

就这样,会点VC和MFC,我已经混到研究生了,当时智能手机出来了,我买了一个小米手机,决心学习安卓编程,好歹将来也能混口饭吃。当时在网上搜索到一个叫Mars的老师,他正好在做Android的视频教程,而且大概每两三天更新一次,课程还是不错的,那就是我的Android入门老师,当时重新捡起了java,然后也把孙鑫的Java视频下下来看了几遍,最后跟着mars老师一起实践他的Android教程。当时Google还没有被封得这么严,但是搭建一个android的开发环境就花了我大概三天的时间,那时候搭建环境真的不像现在这么方便,但是当自己写出第一个Activity,在手机里面运行的时候,心里还是出现了久违的成就感,就像第一次编写出窗体程序一样。就这样,我慢慢地学习了怎么编写Android的程序,但是在一些需要与服务器发生交互的地方,Mars老师讲得并不是很清楚,所以到了那部分,我实践起来非常吃力。所以我下决心,一定要先搞定服务器、网站搭建什么的。

那时候也是在网上搜,发现大家都说韩顺平老师不错,惊喜地发现在BT上有他的全套课程,总共40多个G,内容包含Java基础、html、css、js、php、linux、mysql数据库等等,很多很多,我全部下下来,然后开始一点点看。先从最熟悉的地方看起,Java基础,虽然学习过Java基础,但是韩老师讲课又与其他人不一样,很多内容讲得比较透,而且案例丰富,所以我又系统地学习了一遍。然后就开始疯狂地征战我不熟悉的领域,记得那时候,html+css+js是一套课程49节十几个G,是mp4的格式,那是唯一可以在手机里播放的视频,我一点点把它倒到手机里,中午睡午觉的时候,我就拿起手机来躺着看,晚上睡觉前,也能看一会儿,就这样,每天也能多看几十分钟。平时在实验室电脑旁,就先把手机里看过的东西实践一遍,然后看别的只能在电脑前看的视频,边看边跟着做,周末也是一有时间就看视频。就这样,大概花了一两个月把所有视频都过了一遍。说实话,很多东西没看懂,那时候印象最深的就是,用Servlet和jsp搭建了一个简易淘宝功能的网站,实现购物车功能,然后放到自己笔记本的服务器上面,这样,同一个实验室的电脑能够访问到我的网站了,然后我又把实验室路由器配置改了,过来的请求代理到我的笔记本上面,这样,外面的网络也能访问我的网站了。通过这次实践,我才彻底理解了什么是局域网,什么是公网,理解了什么是服务器。

然后我就想着去租一台服务器,网上搜到主机屋这样一个网站,可以免费租一个空间(当时还不知道服务器和空间有什么区别),但是必须是php的,所以我又把php看了一遍,记得php有108节课,也是里面最长的教程,看完后,把自己实践的网站放上去,空间只需要自己通过ftp把源码文件传到它指定的目录就可以了,而且还自动给你一个域名,当时还觉得挺爽的,只是这服务器不是很稳定,有时候有点慢。

后来我又去搜索一些其它的教程,比如老外的一个jQuery的教程,其它老师的iBatis教程,来补充韩老师没讲过的一些知识,然后也不忘去参加一些比赛。印象最深的是Yahoo北研举办的黑客日,当时是第一届,可能没有太多人知道,先是初赛,总共5道类似acm的题目,两个小时,我一道都没有完全做出来(对于一个没有搞过acm和算法的人,这很正常),但是也通过了初赛(所以参加的人真的不多),到了决赛,需要几个人组团参加,我加入了一个团队,总共四个人。团队里面有一个大神,那是我第一次预见大神,神到什么程度?才大三,已经用linux做为日常学习系统了,敲击键盘速度飞快,根本看不清,学习能力超强,才一个月就掌握了Yahoo官方的YUI框架(到决赛时我还不知道YUI是啥),最关键的是,他是学电子专业的。当时他来负责我们团队的前端,我和另外一个人负责后端,还有一个打酱油的。我会点php,所以也很快搭建好了数据库,搭建好了后台,另外一个哥们学计算机的,也是大三,php很久前用过,可能不太熟了,但是搞过acm,算法还是比较厉害,跟他们交流的时候,明显感觉不在一个频道上,科班和非科班出身的果然不一样,大神就更不用说了,完全不太听得懂他在说什么。

就是从这次的比赛,我才知道了算法的重要性,才开始去看一些算法和acm方面的书,我的数学很好,高中曾经考过全省数学竞赛第二名的成绩,大学也拿过数学竞赛一等奖,所以学起算法来比较占优势,自己磕磕绊绊也学会了点,不过那时候已经面临找工作了,所以算法并没有学得多深。看到这里,大家不要以为我研究生期间很闲,有很多时间学习。其实不是的,我每天顶多能够平均抽出一个半小时来学习额外的东西。平时要写论文,要做实验室的项目,还是在用MFC,还要学习FPGA和CC2530,zigbee编程,总之就是一些类似单片机的硬件编程,还要画电路板,自己焊板子、组装机械,总之就是做得很多,学得很杂,但是还是很充实的。

找工作我可以详细说一说,首先,到那个时候,我在互联网方面,其实没有一个拿得出手的项目,都是自己按照教程学的一些小案例,所以挑了大概5个比较综合的案例,写在简历上,然后MFC呀,硬件呀那些全部砍掉,就专门写我在互联网方面的技能。所以说那时候其实是两手准备,两个简历,一个是纯面向研究所的,写的就是一些论文啊,专利啊,电路技能,MFC技能等等,另一个就是纯面向互联网的,写的是html、css、js、java、php、mysql、linux、android和做过的一些小案例。面试的时候其实更偏向互联网方向,因为很早我就拿到一个上海的不错的一个研究所的offer,但是那其实真的不是我内心想去的地方,所以我放弃了。面试互联网企业的时候,首先去了一些小公司,他们的问题都比较专业,不像是问一个大学生,好像是在问一个工作多年的社会人士,所以我都被虐的体无完肤,但是每次面试完,我都会把他们问的问题搞清楚,下次问的时候,我基本就知道了。然后这时候才是我心仪的公司,比如百度、阿里、腾讯、微软等等。参加完笔试后,也有很多公司给了我面试机会,但是很多我都拒绝了,因为那时候真的没有这么多时间和精力一个一个去试,面试和笔试都太密集了,需要学会取舍,我印象比较深刻的面试有京东、阿里和百度。其实真正到面试才发现,没有实习真的是硬伤,很多有实习经历的人,即使学校比我差N倍,也可能更容易获得面试官的青睐,但是现在已经太晚了。京东和百度都问的比较偏技术,京东我答得不好,百度答得还行,阿里问的比较偏项目,所以答得也还行,最终百度和阿里给了我offer,综合来说阿里给的薪水稍微高一点点,白菜价20w一年(其实后来第一年税前超过了20w,而现在我已经远不止这个数哈),所以去了阿里。后来我才在一个论坛上看到,原来阿里的简历筛选要求里有一条,如果参加过一些比赛,比如Yahoo黑客日等,可以无条件入面试。也许是这条救了我,否则我的简历可能都过不去。

来到阿里之后,我其实是一片白纸,什么都不会,什么日常环境、线上环境都搞不懂,产品、运营、开发、测试以及一整套流程都不知道。还有很多内部系统,都不会用,给我配的师兄也不是很容易交流,问他回答得有一搭没一搭的,所以后面也就懒得问了,慢慢地学会自己摸索。那时候,先开发了一个Android的sdk,然后被调到其它团队轮岗一个多月,学习其它团队的一些东西,那时候直接去杭州出差一个多月,之后的一年内,几乎隔一周去一次杭州,一次就一周呆在那,一下子成为团队中的飞人。第一次技术飞速成长是在我负责的第一个项目,那个项目用到了一些比较高级和专业的知识,也是在那个项目,我熟悉了阿里整个项目发布上线的一整套流程,非常感谢当时的一个同事,那个同事真的非常好,有问必答,还经常亲自过来帮你调代码,从他那里我学到很多代码调试技巧。这个项目过后,我的java又深入了一层,感觉很多经络都打通了。第二次技术飞速成长是在另一个项目,这次是个大项目,到现在还在做,并且已经向外部收费了,那时候团队缺前端,我恰好会一点,就由我牵头来搞,不过真正做项目就发现,拿到UED设计好的视觉稿,就完全懵逼了,之前学的那点三脚猫的html+css+js哪里够啊,其实之前学得也不精,什么相对布局、绝对布局的几乎没怎么用过,全都忘光了,还有阿里前端还有一套自动化的流程,grunt构建,用seajs加载模块,所以那时候只能请教别的组的一个前端,那个同事也人比较好,慢慢地,冲破几道难关后,我的前端页面整个都实现好了,那段时间我的前端水平得到了一个质的飞跃。第三次技术革命是在一个新的项目里,那个项目真的很厉害,从底层c、c++到Android到前后端,用到的都是比较前卫和拉风的知识,我几乎又是从零开始,但是我一点都不畏惧,甚至有点兴奋,因为我知道,我又要有一次质的飞跃了,在短短一个月里面,我又从零学习了七八种技术,并且把它们运用到项目中,那个成就感还是有点的。整个职业生涯两年多,大概有这三次比较大的技术飞跃吧,也就在今年的时候,我的级别也晋升了一级。

当然,除了工作,平时我也会自己做一些个人项目,比如之前想给别人做网站外包,自建了一个网站,放在阿里云上面(现在我想自己搭个网站简直易如反掌,不租空间了,直接租服务器自己搭环境)。想把我的一些学习路线分享给大家,自己搭了一个学习教程网站,做情景教程,还自己搭建了纯手写的博客系统。也正是在这个过程中,我发现了慕课网,并且成为了他们中的一名讲师。

那时候,我正在做自己的情景教程网站,写自己的教程,偶然发现慕课网,看了一下,想都没想,就应聘了讲师,然后讲了一个自己做的教程网站里的一个贪吃蛇案例,轻松通过了面试,从此踏上了IT讲师的道路,负责讲解前端知识。其实讲课后才知道,讲课和自己编程完全是两码事。自己编程的时候,用到一个领域的知识点,可能只用到其中的20%就够了,但是要讲一个领域,你必须把这个领域的知识点100%搞清楚和讲清楚,所以其实每次讲一门课,对于我自己来说,是一个很大的挑战和一次很好的学习机会。一年多了,虽然讲的课不多,但是这个过程还是很开心很享受的,所以我还会继续做下去。

到此大概总结了一下从大学到现在我所经历的一些事情,有几点我觉得是很有参考意义的:

一、大学期间真的和高中不一样了,你必须想清楚你将来要干什么,你要拿什么本事吃饭,所以并不是每门课都要去学好,有些没价值的课,混够学分也就可以了,去做一些自己觉得有意义的事情,才是大学最重要的;

二、学会取舍,走进社会,很多事情都不能周全,比如我转行互联网行业,可能之前的电路机械知识完全用不到了,要学会抛弃,但是如果物联网时代到来,没准电路知识又能重新派上用场,所以塞翁失马,焉知非福;

三、学习能力始终是最重要的,这个时代的知识,你不可能都能学完,但是给你一个新的课题,怎样能够迅速找到解决方案和落地,这才是最重要的,而这种能力的积累,就是在平时自学的过程中点点滴滴总结出来的;

四、到了现在这个层次,倒觉得技术不是最重要的了,更重要的是管理能力,社交能力和一些软实力,它们才是能够让你脱颖而出的一些能力,当然这是我所欠缺的,大家可以有自己的思考。

还是说我自己吧,总结一下不足。首先技术上,还缺些大数据处理的技术,比如Hadoop呀、R语言呀这些,虚拟机技术,如docker呀,还有ios技术,这三个是我接下来需要恶补的;其次是管理上,自己刚刚带团队,虽然团队人员都比较优秀,但是自己的管理水平还是有点欠缺,自己要慢慢补上来;然后就是社交,这也是程序猿的先天不足吧,以后慢慢改正。

好的,就到这里吧,一起努力和共勉。

最后作诗一首,唤作《蓄》:一滴两滴化作无,平日如镜赛西湖。忽有一夜狂风起,摧枯拉朽似提壶。

0?wx_fmt=jpeg

你可能感兴趣的:(【干货】我是怎么走进阿里做程序员的?)