对这个问题感兴趣的同学,主要分两种。
第一种是对编程有着无限兴趣的,想要在编程之路上精进专研的人。这些人学习编程,是出于自己自己的兴趣,而这种兴趣,几乎从很早的时候就耳濡目染,被培养起来了。
第二种,或是因为生活所迫,或是阴差阳错,走上编程道路的人,他们学编程,真的只是为了挣口饭吃。
我属于后者,可以说,是从一个不得不学习编程的人,吃过很多苦,最终,有了一丢丢收获。
这个回答戳到自己心上了,码的字有点多,如果你和我一样,最开始学习编程,只是为了谋生,痛苦而挣扎,那或许,我的经历值得你看下去。
1.窘况
上大学前,我没有接触过电脑,高考志愿是写在纸上,让同学帮忙填到系统。
初入大学,误打误撞从数学系转到了计算机系,第一节计算机课程上,当同学们都在嚼里啪啦的敲字时,我却还在奇怪这机器怎么显示屏不亮,是不是除了啥问题。
为啥,因为我连电脑开机键是哪个都不知道。什么,你说你不信,是的,我现在也不信,没办法,就是这么苦涩。
笨归笨,上进的心思还是有的,学校里的各种知识讲座,不管能不能听懂,都会去凑凑热闹。有一次去了ACM讲座,被学长们的激情所打动,一激动就报名参加了学校的ACM社团,然后,噩梦和惊喜,同时开始了。
ACM,名为国际大学生程序设计竞赛,学校里参加这个社团的,基本都是从高中甚至初中就玩程序竞赛的「老同志」,很多都是在省级甚至国家级赛事上拿过奖的。我一个编程基础为О的小白,厚着脸皮每天和他们一起训练,精神的痛苦远远超过了肉体的折磨。
要知道,每天在一个团体里出现,但是没人会注意到自己,任何有意思的话题,永远都没法插上嘴,是一件非常打击自信心和尊严的事情。
你会问我,编程能力差可以努力呀,可以学呀,是呀,我也很努力,我也很痛苦,可这知识不进脑子呀。
最终参加ACM的成绩很差,第一年在学长的带领下拿了个铜牌,第二年自己参加,什么牌也没捞上。
做过ACM比赛的通知,都清楚,铜牌是不好意思说出口的成绩,相当于安慰奖吧。我自己都想不通,每一个假期,都能看到自己在机房的身影,取得的成绩,真的对不起自己投入的时间。
直到很久之后,我才开始释怀,因为我发现,有时候努力的成果是在当下能够看到的,而另外—些时候,可能在稍远的未来,才能开花结果。
尽管第二年还没取得什么成绩之后,我就放弃ACM了,但不得不承认,经过了一年多的练习,我已经基本上拥有了扎实的数据结构算法功底,对程序效率的敏锐程度,也比没有接受过专门训练的同学要好。
另外,我自己都没有意识到,这一两年的ACM酱油之旅,竟然成了我和计算机领域竞赛的相爱相杀的起点,那时候的我,从没意识到,几年后自己能够在另外一个竞赛赛道上,取得不错的成绩。
大学时光的中后期,基本是在刷绩点+保研面试+实习工作中度过的,有点焦虑,有点充实。
第一次实习是以失败告终的,但是保研结束后的大三暑假,一身轻松,于是联系上了一家创业公司实习,做的PHP开发。
去了之后,发现同时入职的还有本校的另外一个小伙伴,是个技术极客,编程能力强悍。
由于之前没有接触过中大型项目的开发,编程思维还是处于面向过程,对于面向对象的开发方式很不熟练,另外各种框架、组件十分生疏。
我还记得入职一个月后的一天,Leader和我说,我这一个与千的活,他可能花个半小时就干完了,我知道,他说的不是玩笑话,我的玻璃心,在那一瞬,碎的稀里哗啦。
第二天,我逃避了,找了个理由离开了公司,那一刻,我觉得心底里有个声音对自己说:你真的不适合学技术,可以去试试运营呀、销售呀,之前很多兼职中,你不是做的很出色吗。
如果不是因为侥幸保研成功,继续在计算机的道路上折腾,或许,我现在是一位出色的金牌销售呢,我时常这么想。
2.转机
如果说学计算机的过程中,有什么时候是我一直做对的,那就是长期坚持和不断尝试。经过一次次磨炼之后,终于迎来了一次对我来说很不多的经历开端。
大四在做完毕设之后,已经是五月中旬了,离九月份研究生开学还有一点时间,刚好可以做一份实习。于是在实习僧上寻找实习机会,很幸运的,拿到了一家从百度出来的创业公司的
Offer,方向是做机器学习自然语言理解领域的。
当时很穷,这家公司给出的日薪是300,每天还有30的饭补,说实话非常开心,还记得从公司结束面试出来的第一时间就是掏出手机给女朋友报喜。那时候未谙世事的自己,能够因为一小点事情欣喜若狂,因为一小点事情沮丧懊恼。
我未曾想到,这家公司,给我的生活带来的改变,有如此之多,直到现在,虽然已经离开两年多的时间了,但我们之间的故事和记忆,我想我会记上一辈子了。
在这个公司里,我从最开始的小白,一点一点逐渐的对NLP领域有了一定的掌握,非常感谢当时带我的师傅。
他是从百度出来的一位技术大牛,严谨的代码风格,清晰的编程逻辑,让当时的我受益匪浅。后来的实习经历让我们明白,不是每一次都有机会遇见这样棒的 Leader的。
开始对于NLP的了解是一穷二白的,那就从最简单的文本数据处理开始,学习基础的NLP知识。
还记得当时做的第一个项目是实现并优化检索问答服务,中间遇到了不少坑。没办法只能一点点的熬过来,最终项目成功上线,也赢得了客户的赞赏。
在这家公司实习期间,公司成功的进行了两轮融资,金额过亿。我获得了一次季度优秀员工以及一次优秀员工提名,可以说为公司做出了一些贡献。
后来又面试了滴滴、百度以及头条的核心算法部门,都通过了面试,最终去了头条的人工智能实验室实习。
选择头条的原因是头条的发展前景很好,年轻人也很多,在一起工作很开心。再后来,又去了微信。也许有的人会疑惑,为什么要跳来跳去呢,待在一家不好吗?
这可能和每个人的选择有关,在职场里,需要注意的一条是不要频繁跳槽,不然会给面试官留下不好的印象。但这条金科玉律有个小前提,是对正式工作的人而言的。
实习一般四五个月就已经算不短的时间了。还有着一个隐形福利,社会对学生很包容,使得我们有机会在短时间内快速体验不同量级、不同理念公司之间的文化碰撞。
我可以在两年之内快速体验到创业公司的快速崛起,小巨头的工作热情,还有大巨头的核心部门的闪光时刻。全职工作的人有这样的机会吗?
当然不太可能了,除非愿意给自己打上一个频繁跳槽、不靠谱的标签。当有这样的机会时,要好好把握,多了解未来要去打拼的世界,不至于毕业找工作吃亏入坑。
就这样,陆陆续续辗转几个公司,认识了很多技术大牛,有一些长进,更多的是感到自身的不足,不论是技术层面,还是认知层面的。最重要的一条认知是,厉害的人永远非常多,不要和目前实力远超自己的对手比较,那样除了能够打击自己,没有其他用处。
3。爬坡
实习了大半年之后,对理论知识和实践应用有了一定的掌握之后,通过同学了解到国内外的数据科学竞赛正在兴起,查看一些比赛平台之后,发现有一些任务在工作中遇到过,就抱着在实践中学习交流的心态,参与其中,对于比赛的结果,既没有底,也没有期待。
很庆幸自己做出这个尝试,因为在真正的参与比赛之后,每一次提交结果之后,看到排行榜上的名词变动,是非常紧张刺激的事情,很容易激发竞争意识,于是更为精细的处理分析数据,对采用的算法模型进行修改,使其更适应于当前任务。
我参加比赛的时间跨度其实并不长,前后一年的时间,最开始参加的是中国计算机协会联合BDCl举办的CCF-BDCI2017系列比赛,在其中的一个赛道上,很幸运的取得了第三名,这对初次参赛是来说,还是挺不错的,我们队伍拿到了一万元的奖金。
第二个比赛,是参加了京东举办的对话比赛,这次我承担了队长的角色,邀请了一批小伙伴,一起攻克难关。我记得中秋节三天,还在办公室优化模型,提交结果,一刻都没有休息。最终取得了亚军的成绩,与第一名失之交臂,亚军的奖金是十万元。
第三个比赛,参加了Al Challenger比赛,也是选择文本NLP相关的赛道,同样的很是拼命,中间通宵了两个夜晚,很幸运,最后拿到了第一名的成绩,奖金是四十万。
那一年之后,由于写论文、找工作各种琐事,基本没有参与任何比赛了。当短暂的一年数据竞赛生涯,极大的锻炼了我的编程能力,主要体现在,正对特定目标快速实现和迭代优化。
现在国内外的数据竞赛平台还是有很多,很多国内巨头每年都会举办规模浩大、奖金丰厚的赛事,这里给出一些常见的赛事和平台:
1、最推荐的两个主流平台
Kaggle: https://www.kaggle.com天池: https://tianchi.aliyun.com/home
2、国内其他主要平台
DataCastle: http://www.pkbigdata.comDatafountain: https://www.datafountain.cnBiendata: https://www.biendata.comKesci: https://www.kesci.com
FlyAl: https://www.flyai.com
除了这些平台,每年可能还会新冒出来一些平台,竞争力比较小,这就需要大家自己多留意各路消息了。
当然,除了编程能力的提升,还认识了很多朋友,因为不少互联网员工也来参加比赛,基本年龄比我大几岁,所以认识了一些前辈,后来成为了常约饭的好朋友,天南海北,基本涵盖了互联网的大小公司,对于增长见识非常有用。
4.近况
看到这里,你会觉得,我已经精通编程了,各种任务游刃有余了。其实,说实话,编程硬实力,虽然不能说菜,但还是普通。
有心人会留意到,无论实习还是比赛,我的技术栈是围绕着算法来走的,导致我的纯开发技能欠缺不少。这着实很让我头疼,尤其是我今年毕业入职之后。
正式工作了,虽然是算法工程师,但也会经常接到开发量不小的活,刚开始我很不适应,因为之前做算法主要是Python技能栈点的比较多,对Java和后端开发框架用的比较少,任务需要就直接切换过来了。
然后,之前做算法开发,更多的是追求指标的效果,在比赛中尤其是如此,但到了公司,开始考虑到性能开销、投入产出比等各种因素,复杂度上升不少。
有一段时间,活非常赶,我又是新手,导致任务的进度卡在我这里,压力是非常大的,朋友吃饭时见到我,都会察觉我脸色的异样,会关切的问我发生了什么事。
没到这个时候,我还是会想,如果写程序让自己这么痛苦的话,我为什么要一条路走到黑?产品经理或者其他的岗位也许对我来说更为合适呢,毕竟我是一个善于总结和沟通的人。
后来,逐渐熬过来了,我之所以没有转行,一方面是遇到的问题还没到无法解决的地步;另外一方面,再和一切其他岗位的前辈交流过,才发现每一行都有相应的痛处。譬如说,产品经理经常会为项目各方面的进度折腾的焦头烂额,毕竟写代码的是程序员。这一点来说,作为程序晨更好把控—此
就这样,打算在程序员的道路上继续走下去,那相应的技术书籍,就得花功夫啃起来。于是买了很多书,早饭或者午饭后的半小时,就会拎起技术书来翻翻,别小看这一个小时,我已经利用这时间翻完了之前很抗拒的基本大块头,虽说做不到细嚼慢咽,但对于查漏补缺、在脑海中建立完整的知识体系很有帮助。
人往往高估自己短期的成长,而低估长期的变化。现在遇到一些暂时无法解决的困难,心理还是会觉得有些难过甚至绝望,对自己很容易产生自我怀疑。但转念一想,比起数年前刚上大学时,那个连电脑开机键都不知道的懵懂男孩,我掌握的专业技能知识,何止是翻番。
难过的时候,积极一点看问题,往前看,找出自己这几年的进步;往后看,期待此后数年的成长。这样—想,日子或许活好过不少。
回到最开始的问题,我的编程能力从什么时候开始突飞猛进?
答:没有任何时候一下子,就突飞猛进了,而是一次次的挫败、失望甚至打算放弃之后,无论是为生活所迫,还是不甘心,继续坚持下来了,开始新的学习和尝试,都会有一点点的进步。这个世界有一个很美妙的东西叫复利,它不是金融的专有词,学习的复利,更值得被我们这些普通人拥有。
以上,与君共勉,不限于编程,在学习的道路上,我们从未突飞猛进,我们正在突飞猛进,只要我们一直在前进,这两者就不会矛盾。