专栏首页findyi我的编程能力是从什么时候开始突飞猛进的?

我的编程能力是从什么时候开始突飞猛进的?

阅读本文大概需要5分钟。

这是知乎上一个很火热的话题,它让我的思绪回到了多年前,那个疯狂玩游戏住网吧的少年,那个洗心革面之后疯狂看技术书、疯狂编码的少年,彼时的他绝没有想到能在程序的世界走这么远。

窘迫的困局

十多年前的一个夏天,一个少年焦虑的在校园行走。他刚接到学校最后通牒:勒令在半年内补休完缺失的学分,否则按退学处理。

看着这张死缓通知书,这个结局他并不意外,他从大一开始就沉迷于网游无法自拔。几乎没有上过任何课程,挂科无数。所有清醒的时光基本上都在网吧度过。

这个少年就是曾经的我,那时候水到计算机专业大三了,连一个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年出来创业,经历各种社会的毒打和失败的辛酸。

现在,尝试在大厂能做成一个业务,前段时间发过一个朋友圈:人生最大的愿望是:做成一件中国第一的事业,游遍中国所有的名山大川。

但内心深处,依然是一个坚韧、专注的程序员,更愿意跟人介绍:我是一个懂产品运营商业的程序员。

回到最初这个问题:我的编码能力是什么时候开始突飞猛进的?

其实,并没有一个特定的时刻,你能感知到突飞猛进。

成长发生在每一天、每一小时、每一刻和自己做斗争的时候,成长发生在无数次焦虑、痛苦之后的反思和突破,成长发生在咬牙不放弃的每一份努力中。

只有经历了时光的磨砺、痛苦的挣扎、非凡的努力,再回首发现:原来你已经在这里了。

不光是编程,这世间任何一件事,要想取得一点点成绩,必须付出非凡努力。

与君共勉~

PS:实践+读书是成长的最好方式之一,本期继续送书,规则依然是评论点赞前三。


本文分享自微信公众号 - findyi(gh_8766e6feadd0),作者:findyi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 互联网10年,激战如梦

    1969年,美国国防部研究计划署第一次将互联网应用于军事连接。随后美国西南部四所名校的四台计算机通过这项技术连接起来。

    用户6983566
  • 毕业4年年薪200万是怎样的一种体验?

    之前的一篇文章提到过自己毕业4年,年薪就超过了200万。最近有很多读者问我是怎么实现的,过程中有哪些经验可以分享。

    用户6983566
  • 腾讯师弟帅北的编码提升之路!

    觉得挺有意思的,所以顺手回答了下,同时也发到我的公众号上来,这篇文章纯碎是记流水账,也没什么干货。

    用户6983566
  • 每周分享第1期

    这里记录过去一周,我看到的值得分享的东西,以及我的一些奇思妙想,每周五发布。灵感来自阮一峰

    爬虫
  • JDK容器学习之Queue: ArrayBlockingQueue

    基于数组阻塞队列 ArrayBlockingQueue 前面学习了基于数组的非阻塞双端队列ArrayDeque,其内部维护一个数组和指向队列头和队列尾索引的两...

    一灰灰blog
  • 5G啊5G,你是不是只比4G多一G?

    3.机器人管家来到你床边,告知你昨晚的睡眠质量、健康指数并提供相关建议。他投影出了一个全息影像,开始播报你的日程,之后呈现了你可能会感兴趣的新闻。

    昱良
  • JavaScript 对象赋值和浅拷贝的区别

    先看赋值,将一个对象赋值给一个新的对象的时候,赋的其实是该对象在栈中的地址,而不是堆中的数据。也就是一个对象的改变就会改变另外一个对象。

    GopalFeng
  • 第八节 netty前传-NIO 几种channel介绍02

    java bio中的serversocket和nio中的socket有些类似,两者使用可参考如下: BIO模式

    用户1418372
  • 软件开发的必备技能,UML建模思维方法锦集!(干货预警!)

    UML独立于程序设计语言,可用C++、Java等任何一种面向对象程序设计语言实现。

    灰小猿
  • 2020 双 11 京东全民营业一键自动做任务

    又快到了一年一度的双十一,你是不上班/上课时摸鱼做京东/淘宝的双11任务,分享几个工具帮你解放双手,自动帮你做任务领金币。

    苏生不惑

扫码关注云+社区

领取腾讯云代金券