从学渣到360技术总监我的编程能力是何时突飞猛进的(直到读研的时候看了大学计算机组成原理教材我才明白指针背后的含义)
(直到读研的时候看了大学计算机组成原理教材我才明白指针背后的含义)
https://m.toutiao.com/is/JbebjsJ/
这是知乎上一个很火热的话题,它让我的思绪回到了多年前,那个疯狂玩游戏住网吧的少年,那个洗心革面之后疯狂看技术书、疯狂编码的少年,彼时的他绝没有想到能在程序的世界走这么远。
窘迫的困局
十多年前的一个夏天,一个少年焦虑的在校园行走。他刚接到学校最后通牒:勒令在半年内补休完缺失的学分,否则按退学处理。
看着这张死缓通知书,这个结局他并不意外,他从大一开始就沉迷于网游无法自拔。几乎没有上过任何课程,挂科无数。所有清醒的时光基本上都在网吧度过。
这个少年就是曾经的我,那时候水到计算机专业大三了,连一个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年出来创业,经历各种社会的毒打和失败的辛酸。
现在,尝试在大厂能做成一个业务,前段时间发过一个朋友圈:人生最大的愿望是:做成一件中国第一的事业,游遍中国所有的名山大川。
但内心深处,依然是一个坚韧、专注的程序员,更愿意跟人介绍:我是一个懂产品运营商业的程序员。
回到最初这个问题:我的编码能力是什么时候开始突飞猛进的?
其实,并没有一个特定的时刻,你能感知到突飞猛进。
成长发生在每一天、每一小时、每一刻和自己做斗争的时候,成长发生在无数次焦虑、痛苦之后的反思和突破,成长发生在咬牙不放弃的每一份努力中。
只有经历了时光的磨砺、痛苦的挣扎、非凡的努力,再回首发现:原来你已经在这里了。
不光是编程,这世间任何一件事,要想取得一点点成绩,必须付出非凡努力。
与君共勉~
https://m.toutiao.com/is/JbebjsJ/