前几天我司Android开发小组的几个伙伴感觉写代码比拼不够,还要写文章较劲。身为本文作者何晓杰的前同事&现同事(下面是他的官方介绍),加上这篇文章提到的问题——程序开发人员的成长——确实困扰着很多人,我决定友情背书。
何晓杰,知名开发者、开源作者。是国内互联网行业第一批开发者,Andorid 行业第一批开发者。擅长 Linux,Android 开发,曾就职于 IBM、盛大、安居客等企业,现沪江前端开发部高级架构师。
我们都只休息了 7 天,医生你凭啥休了 8 天,当然最后一天也情有可原,毕竟医生生日嘛,为了庆祝,这几天全部门的饮料都归医生请客了。
为什么会有这一篇,是因为昨天医生的鸡汤给了我相当大的感触(可点击页末“阅读原文”),于是纠集了一帮人在某神群里进行了一番讨论,可以很明显的发现,大家都很希望学习、提高,但是却很少有人知道应该如何『正确的』去进行学习。难道学会 Google Everything 或者跟着一个大牛就能自己成为大牛吗?
这个答案完全是否定的。对,完全!
首先我认同医生所说的,典型的问题是『没有将别人的知识转化为自己的知识』,好了,那么为什么会有这个现象,大致来说,会有几个方面的原因
被业务压力搞垮,没有时间精力去钻研新事物
没有方向和目标,或者目标只在眼前,或者不尽人意的方向和目标
工作时受到打击
长久都接触不到大牛的境界,不自信了
懒
业务压力的问题很好理解,也是最直接的问题,所谓的经验不足就用大量的实践来补,补的方法就是做业务,这个时候就算想自行研究,也心有余而力不足,不是因为业务压力,而是因为本身基础还没打扎实,这个时候去搞研究,着实有点力不从心。但是这个问题是必须去面对的,当你有了一定的工作经验,拥有了较好的基础之后,就应该去寻找自己擅长,并且喜爱的领域进行深造。
我见过很多人,在某一技术岗位上工作了很多年,超过10年的也有,打代码的速度堪比电影桥段,但是却在整体技术水平上无所建树,换一份工作之后,就和普通的新人没什么差别,甚至还要更差一些。当然我也见过很多牛人,工作时间不长,但是技能、眼界都已属一流。为什么会有这样的差别,主要原因还是在于自己的学习、前进的欲望。
那么接下来肯定会有人说了,业务都把我压死了,还谈什么钻研,我光是把公司交待的任务完成就已经谢天谢地了,回家只想睡觉,甚至晚上能不能回家还是问题呢。这也是群内讨论中,被讲得最多的那几句话。下面我会详细解释的,这种情况并非无解。
没有方向和目标是很多新人会遇到的一大难题,在编程领域,目标是一个比较让人觉得悬乎的东西。拿学英语来说,你可以说你的目标是明年考出六级,而编程却不能以此作为目标,总不能说我的目标是明年写出贝塞尔曲线,或者看完某大牛的开源项目,这些都不现实。那么说点现实的吧,很多新人的目标都是尽快完成眼前的任务,比如说短期内学会 Python, RN,并且让 APP 上线。
那么上线后做什么呢,等待上级的下一个指示。
可能问题就出在这个『指示』上,之前我带团队的时候,我不会给予任何具体的指示,我只会告诉团队,比如说列表滚动会卡顿、GPS定位时间太长、或者支付的流程太长了,不方便等等。那么真正对技术方案作出指示的人,就是工程师自己,你看到列表卡顿,会怎么思考,会从什么角度去尝试解决,万一这个问题超出了你当前的能力范围,你又会怎么做。这种很小很小的自我指示,积累起来就会成为一种靠谱的方向和目标,因为你会慢慢的发现自己的思路方向,并且为最终的目标作出引导。
那么不尽人意的方向和目标又是怎么回事呢?其实这样的事情可能很多公司的技术 Leader 都没少做,但是可能自己都没感觉到。举个例子,很多公司的 Leader 都会告诉下属,你学 XXX 技术呀,这个东西将来有前途的,你现在所熟悉的 YYY 技术将来会淘汰的。这样的话我虽然能理解为 Leader 一番好意(甚至好意里还带着公司对于技术发展的后续策略),但是对于工程师来说,这种说辞是非常不负责任的,不要让工程师被特定工种的枷锁锁住。
当然了,话说回来,也有很多方向上的指引是靠谱的,比如说引导新人尽快摸清行业,熟悉所在岗位的职责与发展的可能性等。当然作为我个人来说,我觉得我没那能力去指示什么,我最多告诉你当前行业情况下哪些东西值得研究,可能的技术走向是什么样的,但是具体用什么解决方案去搞,这样的话我是一点都不敢讲的,每个人应当都有自己的判断。
受到打击也是在职场上的一大要素,基本上充斥在整个职场生涯中,最简单的例子就是与同事争论技术方案,不论最后哪个赢了,输了的那个必然受打击,特别是两个大牛一起争论,场面特别精彩火爆,当然最后受到的打击也特别大就是了。而在我们的讨论中发现,有相当多的工程师害怕受到打击,打击的理由可能是:
单纯的害怕被骂,被自己隐藏起来的问题一旦暴露,就会受打击
我会的东西在工作中都用不上,觉得在学校白白浪费了四年,大受打击
一个问题我来解决完全搞不定,身边的大牛两分钟就搞定了,大受打击
花心思学了个东西,结果解决了某个问题后再也没用到过,大受打击
害怕争论,控制不住争论的方向,最后输的总是自己,大受打击
害怕被骂,这一道大坎是必须越过去的,至少不应该害怕争论。争论是一种非常好的沟通方式,会让人很快成长,前提是你把每次争论当成是一个学习的机会,听别人如何表达,同时自己的想法与之有什么差异,有没有考虑不完善的地方。要知道,争论的时候,争论双方都不得不快速思考,以寻找对自己更有利的论据。当然了,不要一开始就去找大牛争论什么,人家随便丢出一段你听不懂的东西,争论也就结束了,没有任何的好处。
其次,不要试图隐藏任何问题,我带过应届生,的确有一些人胆子很小,不敢和自己的主管或是同事沟通,而对于分配的任务又不知道如何上手,自己很苦恼,但是或许出于需要这份工作,或是别的什么原因,任何人去问情况,他都会说目前进展很顺利,从来不把问题说出来。到最后要 Review 了,要绩效检查了,那就完全不是被骂的结果了。
再说一下会的东西用不上这个事情,其实这个是很多人会遇到的问题。因为技术在发展,不断的会有更先进的技术面世,不持续跟进学习是很难在技术领域里站稳的。另外,每个公司都有自己的积累,更加希望员工在自己的积累上持续积累,而不是自己另起一套,这样无疑是无限增加成本的。
参考之前与一家做 JavaEE 的公司的两位工程师的交流,我得到的信息与此也是类似的,他们其中一个人是新人,大学里只学了 C 语言,进了公司让他搞 Java,他觉得很痛苦。而另一个人是有了 2 年左右 JavaEE 开发经验的,照理说跳槽去另一家公司不会差得太远,但是他告诉我的却是,这家公司用的框架和上一家完全不同,完全没接触过,还是要花点时间来熟悉框架,另外,这里的代码规范也与上一家不同,要把习惯改过来真不容易。好了,还说什么会的用不上呢?老老实实学习提升才是正道(当然这引申出来另一个话题是员工挑选公司的问题,这里不想多谈)。
不自信这种情绪,正是和大牛一起工作的典型情绪,大牛是各种技能各方面都已经有了相当火候的人,一个新人跟了一个大牛,只有两种感觉,一是『哇,这个人好牛』,二是『我估计一辈子赶不上了』。随着工作的开展,第二种情绪慢慢的会越来越多,上面也说了,一个问题自己怎么都搞不定,大牛来了两分钟完事,后面就没你的事了,实在是大受打击,更可怕是,大牛写的代码我看不懂啊,又不好意思去要求他讲解。
这样的事情多发生个几次,心里面赶不上,比不了的感觉就会越来越强烈。这个时候有一些人就产生了依赖心理,反正有大牛在,搞不定就找他,而另一部分人产生了自暴自弃的心理,反正一辈子也做不到他那样了,我就混日子吧,饿不死就好,要么就转个行。只有很少的人可以正确的对待这些事情,并且为自己找到正确的路。
懒癌这种东西,虽说工程师必备,都说不懒的工程师写不出好代码,但是要是真的懒到连代码都不愿写,用了别人的轮子还不求甚解,那还是趁早改行吧,技术行业不适合你。
另外,不要通过任何途径给自己找借口,不会就是不会,不懂就是不懂,给自己一个期限,学起来就好,千万不要去找一些外部的原因,试图让别人理解这事情并非因为你不会而引起的,这么做百害而无一利。
毒鸡汤一锅
那么,没有解决方案你说个 Java Eight,下面就给大家上个汤,有毒,慎喝。
沟通的最佳目标
和比自己水平高一点点的人沟通,效果往往是最好的,双方思想和对问题的理解都比较接近,可能某一方稍领先一点,这样的两个人沟通时,都能够很快的并且正确的理解对方的意图,并且在可控的范围内达成一致。这个时候通常两人都有收获。
然后就是在不断的提升中,慢慢的去接触到更高层次的大牛,到了那个时候,你跟本不会觉得大牛讲的东西是你不能理解的,甚至你还可以反将他一军,提出一些异议。
在这个过程中,需要注意的是,尽可能的找与自己方向和目标一致的人进行沟通,而不是抓着一个看着水平相似的就一顿说。很容易理解的,你是一个做 Android 开发的新人,你去问一个做 iOS 的人如何做列表,那你得到的答案可能永远都无法让你在 Android 上顺利走出一步。当然了,我讲这个话是有前提的:新人,如果你已经有了一定的积累,一定的知识面,那么这种跨界的沟通将会有非常大的好处,叫做借鉴,往往也可以发现新天地。
相同的方向,在刚开始学习的时候,应当有一个非常具现的深入学习的计划。还是拿学习 Android 开发为例,除去常规的 SDK 等是必修之外,还应该先明确一个要学习的子目标,Android 很大,要完全掌握是要耗费时间的,决定好轻重缓急后逐一攻破,甚至有一些领域可以完全不攻。举例来说,新人往往被要求实现 UI 设计,而不是参与一些具体业务,那么你的阶段性目标可能就会是学会使用 PullToRefresh、掌握 Animation 等。
另外再多说一句,还有很多情况下,技术方向与具体实现的平台,语言都关系不大,比如说 IM,当你作为一个 Android 工程师,想实现 IM 功能时,你更应该去找 IM 开发的大牛讨论,而不是找 Android 开发的大牛讨论(虽然他可能也精通)。
最佳的短期目标
不好意思,在这里我想说的绝对不是短期内学会一门语言,或是掌握一种框架,也不是看完一本书,看完一份开源代码。而是把自己所学、所掌握的一项技能,转化成开源项目。让自己所会的东西暴露在大众的面前,接受检验。同时要给自己一个预期,可能会收到多少星,多少 fork,会收到很多 Issue,Pull Request 等。还是说项目跟本无人问津(可能会有宣传的问题,不表),那么原因是什么,是别人没兴趣,还是项目做得不好别人都懒得说,又或者是你做的东西太超前了,别人跟不上(这个情况应该很少见)?当你的预期与实际情况接近时,这样的短期目标也可以算是达成了。
看到进步
技术圈子崇尚大牛,导致了很多人工作了很久,看到的依然是满地跑的大牛,但是自己却似乎可能好像也许永远都与大牛无缘。其实要我说啊,是不是大牛真有那么重要?
重要的是知道自己在哪个层次,明确自己的技术水平在同事里属于哪一层,在同领域里属于哪一层,在行业里属于哪一层,从而你可以找到更多志同道合的人进行沟通,持续进步。是不是被人称为大牛跟本无关紧要,只有确确实实的进步才是值得赞赏的。大家应该更多的看得到自己的进步,独立解决了一个问题,提交了一段没有 bug 的代码,在 Github 上被接受了 Pull Request 都是进步,不要不重视它。
另外,大牛和普通工程师之间的差距,其实就差一件事,那就是求甚解,普通工程师往往头痛医头,而大牛往往举一返三。正如昨天一位朋友所说,很多事情明明再多思考一下,就知道原因了,但是却就是没去思考,白白错过一次成长的机会,而下次再遇到类似问题还不知要什么时候呢。
工作压力与自我提升的平衡
这本来不是什么难题,在此给大家一些做法供参考。最完美的情况是,你的工作在做的事情,正是你的兴趣点所在,你非常喜欢非常投入的去做,最终项目上线,你的技术能力得到较大的提升,同时也积累了一笔项目奖金。如果你感兴趣的东西,在当前的工作中无法得到体现,你有几个途径去实现:
与主管沟通,尝试与公司的技术方向达成一致,并使他们接纳你想做的东西
自行研究,并在适当的时候与同行分享
换一份工作,那份工作包含你想做的事情
按我经历过的那些公司,基本上从技术上说服领导不会特别困难,大多数公司都是开明的,会允许你尝试新技术,在实际工作中进行自我提升无疑是最高效的。
而若是公司不接受,可能就会变得有点麻烦,但是也不是无解,你可以先提升你当前的工作技能,用高效的工作来免去自己加班的困扰(这是我一贯的观点,加班不代表你勤劳,只能说明你能力不足,效率低下,这句话也会不代表某些以加班为文化的企业的立场),从另一角度来说,提升工作技能也是一种提升,虽然可能你对你的工作不感兴趣,只是为了糊口,但是不可否认这是一种提升。这个时候你会拥有时间精力来研究一些自己感兴趣的东西,找好方向后,依然是要找到最佳沟通目标,一起前进。
而最坏的情况也只有换一份工作了,你会发现,其实要谈平衡,也没啥好谈的。究其根底,无非是想借用公司的环境与资源,来完成更多对个人成长有益的目标,当然这一定有个前提,就是你必须能先伺候好公司当前的需求,不然公司又凭什么给予你发展呢?
找兴趣点
缺少了兴趣,就算全世界的大牛围着你转都没用。
『没有将别人的知识转化为自己的知识』的众多原因,归根到底就一点,你的兴趣还不足以作为起你学习的动力,它无法支撑你的梦想。如果真的兴趣很强烈,
怎么会在一点点压力下就觉得身体被掏空,怎么会没有方向,怎么会被简单的挫折打倒,怎么会看到大牛就不自信了,怎么会懒,怎么会找借口。
只有感兴趣的事情,才会『求甚解』,才可以思考得很深入,否则就很难真正深入的去思考为什么了。
除了兴趣之外,没有任何东西能让你坚持把一件事做上几十年,甚至做一辈子。如果没有这样的觉悟,还是先花点心思,找找自己倒底喜欢什么吧。
我司Android开发人员的公众号“Android群英传”,欢迎订阅。
与何晓杰讨论的徐宜生也是沪江的Android开发人员,他写的《Android群英传:神兵利器》正在亚马逊热销,评价不错,有兴趣的朋友不妨一看。