|
这是知乎上一个很火热的话题,它让我的思绪回到了多年前,那个疯狂玩游戏住网吧的少年,那个洗心革面之后疯狂看技术书、疯狂编码的少年,彼时的他绝没有想到能在程序的世界走这么远。
窘迫的困局
十多年前的一个夏天,一个少年焦虑的在校园行走。他刚接到学校最后通牒:勒令在半年内补休完缺失的学分,否则按退学处理。
看着这张死缓通知书,这个结局他并不意外,他从大一开始就沉迷于网游无法自拔。几乎没有上过任何课程,挂科无数。所有清醒的时光基本上都在网吧度过。
这个少年就是曾经的我,那时候水到计算机专业大三了,连一个HelloWorld都不会写。
本科就读的大学坐落在一座山中,那一天上山再下山,不断往返,完全感知不到时间的流逝。整整走了一个白昼,累得精疲力尽,瘫坐在草丛之中,看着深邃的天空和地上的花朵,那一瞬间我突然做了一个改变自己一生的决定。
那一刻定了一个疯狂的计划:大半年内完成补考修完学分、通过英语四六级、拿到高级程序员证件、考上华科研究生。要通过努力来逆袭这一切,要改变自己的命运。
回头看当年的那一瞬间,所谓的顿悟,恐怕就是这种状态吧。
艰难的爬坡
那一整天的校园漫步,是我逆袭的起点,这之后我告别行尸走肉般的状态,变成一台彻头彻尾的学习机器。
编码的世界,日新月异,发展非常快,但C语言永不过时。那时候我也是从C语言开始学起。
没有了老师,只能自己开始一点点啃,谭浩强的《C语言程序设计》反复看,然后一行行在电脑上敲出来。
当时对计算机缺乏系统认识,最难理解的就是指针,书上说它是个变量地址,那么问题来了,什么是地址?一不小心,指针就让程序Crash了。直到读研的时候,看了大学教材:《计算机组成原理》这本书,我才明白指针背后的含义。
因为要考研,没有时间和C语言缠斗,主要目标是专业课,数据结构才是真正要攻克的重点。
从数组到链表再到堆栈、二叉树、平衡二叉树、红黑树、B+/B-树,简直就像看天书。
还记得二叉树的先序,中序,后序遍历就把我弄晕乎了。更别提后面的AVL树的删除以及B-树。
我应付看不懂的方式也很粗暴:做笔记,勾选出没看懂的部分,反复看。一遍不行看两遍三遍四遍,直到所有内容看懂为止,数据结构这本书,记得来来回回看了10多遍。
这个时期学习编程是为了准备高级程序员考试和考研,离实战还非常远,但打下了编程的深厚理论基础。
成长期
疯狂学习大半年后,拿下高级程序员考试,也考上了华科研究生。定下的目标一一实现之际,居然没有一点点喜悦。
对浪费时光的扼腕叹息和对编程的渴望完全压制了喜悦。
考研专业课最后两个大题,居然连Include都没写(上机太少),但凭借啃书的那股劲,拿到了140多分。
这种水平如果进入社会,会被毒打到什么程度?这点自知之明还是有的。
只知道自己要跟时光赛跑了。不再需要复习专业知识,我开始疯狂的在机房敲代码。
这期间认识了学校的几个同学,他们长期通宵在机房Coding,且伴随着激烈的讨论争吵,有时候一天都不怎么吃东西,他们在做什么引发了我的好奇。
问了问,他们是ACM校队的成员,正在参加集训。ACM全名是国际大学生程序设计竞赛,学校里参加这个竞赛的,基本都是高中就开始编码。而我这个菜鸡,开始硬凑着要和他们一起玩。
遭遇嫌弃是必须的,但没关系我脸皮厚,天天请他们吃饭,帮他们端茶送水。
还记得为了解一个DP问题,苦思冥想三天三夜,找到解法的那一刻如释重负。
刷题的过程是枯燥且伴随痛苦的,提交器报各种不通过的时候让人无比抓狂。
这期间,同时开始系统的学习算法,《算法导论》这本书重复看了N遍之后,终于有了一些心得。
自认为能力不错之际,提出加入校队,但被队长无情拒绝。这让我伤心了很久。
成长的过程,润物细无声,极难察觉。但那段枯燥痛苦的刷题岁月让我未来的道路受益匪浅。
跨越期
很快,到了读研的时光,几乎是两点一线:实验室到宿舍。期间,参加了ACM校队三队,最后铩羽而归,并没有拿到奖牌。
这之后开始系统的学习网络、C++、VC,还记得有一本非常厚的书:《C++ Primer》,可以说上面的每一个例子,都上机造过轮子。
随后开始啃《Effective C++》、《More Effective C++》、《C++程序设计原理》、《深度探索C++对象模型》、《STL源码剖析》、《计算机网络系统方法》、《TCP/IP详解》。
除了疯狂自学,专业课和实验室的项目压力也很重,但掌握的东西越多,你对未来就越笃定。
校园漫步的那次顿悟还给自己定了一个目标:毕业以后做游戏的创造者。
所以,主攻的三大方向很明确:Window C++开发、算法、网络编程,这些都是游戏编程所需要掌握的硬核技能。
毕业后,如愿拿到腾讯游戏的Offer,开启了工作生涯。
突破期
工作第二年,加入360担任高级工程师,入职不久直属Leader就被调整,我开始带团队。
面对前任Leader留下来的数十万行耦合严重的代码和框架,压力巨大。
360素来以打仗凶猛著称,发版以天计,甚至有时候一天好几个版本。面临的最大困境是:如何在高速迭代的过程中重构整个旧的框架。
至今还记得,面对一个两万行的主类的心情,那是崩溃和无力的。但越大的压力,你扛下来往往是更高的成长速度。
一瞬间,又回到了大三的那种疯狂状态,每天极限Coding,甚至接近入定的状态,上班往那一坐基本不动弹,就靠几瓶水几个面包,一天的三餐就对付了。
我们将代码组件化、模块化,实现了一边飞奔一边换轮子。就带了两个实习生,花了3个月搞定了这一堆恐怖的代码。
当系统彻底被改造完毕之际,那种兴奋难以言表。
这段时间,我的架构思维开始突飞猛进,我们在每一次的重构之前,都会先画出业务时序图、类结构图、工程关系图,然后按图索骥,每每在实现的那一刻,不由得惊叹:程序世界,太奇妙了。
这期间,还开始大量阅读优秀的开源代码,比如Google chrome的源码,初看时,真是有一种始惊、次醉、终狂的感觉。
深刻认知到编码差距之后的刻意练习,会让你开启高速进化之路。
说一个诀窍:源码不要只看不上手,编译起来运行起来,多改改看看会发生什么。这个过程即好玩又能加深你对源码的理解。
看完Google Chrome源码之后,开始大量学习游戏开源代码。
2012年动手做了一个Iphone2d游戏引擎,用这个引擎做了一款小游戏上线到AppStore体验了一下独立开发者的炫酷。
写在最后
2014年,基本算是编码能力的顶峰。这以后开始担任部门的产品技术负责人,用于编码的时间越来越少。2015年出来创业,经历各种社会的毒打和失败的辛酸。
现在,尝试在大厂能做成一个业务,前段时间发过一个朋友圈:人生最大的愿望是:做成一件中国第一的事业,游遍中国所有的名山大川。
但内心深处,依然是一个坚韧、专注的程序员,更愿意跟人介绍:我是一个懂产品运营商业的程序员。
回到最初这个问题:我的编码能力是什么时候开始突飞猛进的?
其实,并没有一个特定的时刻,你能感知到突飞猛进。
成长发生在每一天、每一小时、每一刻和自己做斗争的时候,成长发生在无数次焦虑、痛苦之后的反思和突破,成长发生在咬牙不放弃的每一份努力中。
只有经历了时光的磨砺、痛苦的挣扎、非凡的努力,再回首发现:原来你已经在这里了。
不光是编程,这世间任何一件事,要想取得一点点成绩,必须付出非凡努力。
与君共勉~ |
|