知道和做到之间有一道鸿沟,要想跨越它,你不但要努力,还要讲究方法。《程序员的成长课》不仅传授知识,更教给读者如何做好。《程序员的成长课》中的理念、方法、工具可以指导读者更好地看清定位及发展方向,设计未来。如果读者不知道选择什么技术栈来学习,困惑于怎样在技术上持续精进,想转技术管理却没途径,想有章法地为跳槽加薪做准备,或者想转型却不知道自己除了技术还能干什么,建议认真读本书,它提供的方法和工具可以帮助读者很快找到答案。
《程序员的成长课》适用的读者:所有程序员,IT 相关专业的学生、教师、培训机构学员等。
安晓辉,资深开发者。拥有十余年开发与管理经验,经历过软件开发工程师、研发经理、项目总监、研发总监等岗位。著有《 Qt on Android 核心编程》《 Qt Quick 核心编程》《你好哇,程序员》《解忧程序员》等图书,电子工业出版社优秀作者。
知乎优质答主,关注者过万。知乎 Live 讲者,设计开发了面向开发者的知乎 Live 专题“程序员的成长课”。个人 Live 被参与超过2万次。 CSDN 知名博主,粉丝超过2万人,2014年、2015年两届博客之星,博客阅读量500多万次,排名100以内。职业规划师,对程序员的职场发展与个人成长具有浓厚的兴趣,通过订阅号“程序视界”、CSDN 博客、知乎专栏、在行、分答、值乎等渠道,以文章、咨询、问答等形式提供各种生涯服务,超过50万人受益。
购买纸质版请点击这里
作为一名普通的程序员:
这些想法不能实现,会经常性地带给你痛苦。这种痛苦,会随着你工作时间的增长而加深,渐渐变成你生活的底色——你的底色原本简单明快,现在幽暗阴郁。
实际上,这些所谓的痛苦,有 90% 都可以通过钱来解决。前提是:你的价值能够不断提升,赚钱速度超越需求膨胀。消除了这些痛苦,幸福感就有生长的环境,就不那么容易被淹没。
可是作为普通的程序员,你却发现瓶颈一个接一个地扑过来。做技术,不知道怎么做到持续精进、怎么坚持;转管理,又不知如何开始。结果还没等想明白呢,半载一年就过去了,蓦然回首,好像自己的能力没怎么提高,薪水增速却越来越跑不过通货膨胀了。
有时候你觉得开发工作越来越吃力,转型的呼声越来越高,却不知道如果离开开发岗位自己还能干什么。看着别人可以选择当自由职业者,或者能实现财务自由,内心羡慕,然而转过身却只能叹息:自己的路,究竟在哪里?
仔细想想,你就会发现,要搞定这些事情和问题,只要能赚到更多的钱就可以了!
这个结论很俗吗?
不,现实正是如此!
对于大部分开发者来讲,工作和生活的诸多烦恼,其实都源自于:怎么赚到更多的钱。
要想赚到更多的钱,就要回到问题的原点,想想个人赚钱的本质是什么。
个人赚钱的本质是——出售时间!对吗?
从出售时间的角度来看:
个人收入=每天可售时间数量×单位时间价格×单位时间出售次数
在这个公式里,有三个要素,简单描述就是:
结合开发者的具体情况,可以找到多种提升收入的方式。参考下表:
或许你知道所有这些方式甚至知道更多,但是,怎么做到呢?
这是个大问题!
知道和做到之间有一道鸿沟,要想跨越它,你不但要努力,还要讲究方法。
这本书不会承诺“看完本书就能快速赚钱”,不提供任何安慰和幻觉,它只是一本工具书,仅仅是发出一份邀请,让你看到有一些方法可以用来分析自己、帮助自己去有效选择和提升,但最终你是否可以用书里的理念、方法、工具指导自己的工作和生活,则取决于你的认真程度和执行力!
所以,如果你愿意付出努力让改变发生,那么我们现在开始一起行动!
本书共有8章。
第1章,介绍如何选择技术方向,我们结合技术成长三阶段模型,讨论在入行、构建技能树、技术转型、团队技术方案选型等常见场景中如何选择适合自己的技术,提高增值的效率。
第2章,讲述如何在技术上持续精进,着重讨论如何在工作中将持续提升自我能力和价值落在实处。为此我们引入了个人对标管理法,让你从优秀的同行者、一般性规律、技术自身的深浅层次和软件项目指标四个方面出发,找到随时随地可以引领自己前进的小目标、小台阶,再配合职业目标的指引,小步快跑,日有寸进。
第3章,探讨了开发者无法回避的发展方向——技术管理。从开发者到管理者,不是职位序列自然发展的结果,而是一种转型,且并不适合所有人,因此我们提供了一些工具和方法,让你自测一下,看看自己是否适合。如果你发现自己很想试试管理路线,可以接着看走向技术管理的4种常见方式,然后了解怎样为成为管理者做准备。从概率上讲,成为管理者后,可以通过团队实现更大的产出,也会因此赚到更多的钱,你的未来会有更多可能性。
第4章,讨论了技术管理新人面临的18种常见挑战,比如角色适应、委派任务、激励他人、冲突管理、一对一谈话等。如果你刚刚升任管理者,一定会碰见这些挑战,翻翻本章提到的应对策略,会对你有所帮助。
第5章,介绍了开发者在跳槽时常见的 8 个问题。比如什么时候跳槽好、依据什么跳槽、选大公司还是小公司、去北上广深等一线城市还是找个小地方享受生活等。这些问题会给你触动,引发你思考自己的选择。
第6章,讨论了如何针对匹配度来优化你的简历。最关键的要点有两个,一是一个岗位一份简历,二是分析目标职位的要求,针对要求呈现你的价值点。你能注意到这两点,就可以大大提升简历的通过率,为自己赢得机会。
第7章,如何在跳槽时获得想要的薪水,这恐怕是每个人都关心的话题。其实从你决定应聘这家公司职位的那一刻就开始涉及这一点了,核心要点是匹配度。所以,从简历优化到了解公司、产品、部门、职位,再到了解目标岗位薪酬区间,你都要围绕匹配度做准备。如何准备?这一章提供了流程、框架和方法。
第8章,转型,也许有一天,我们会离开软件,想要去做别的事情。那么你还适合做什么?想做什么?如果你“拔剑四顾心茫然”,可以看看这里的人、事、物模型和发现职业方向的5步法。只要你做好准备、花些精力,就可以找到适合自己的转型方向。这一章还讨论了转型时如何准备目标职业所需的知识、技能,并提供我和我的朋友们实践过的最佳方法:双职业策略。
在正文之后,有一个附录,是我个人分类总结的书单,对开发者的综合素养提升大有助益。
努力只有在方向正确时才有价值。
开发者选择技术也是如此。假如你阴阳差错选择了一门过时的技术或者在当地没什么单位使用的技术,你在找工作时就会不断受挫,即便你找到了工作,也会忧心自己的发展前景。
所有这些问题,我们都会在本章讨论,我们会找到选择技术方向时要考虑的各种因素,然后结合特定的场景,看看你在选择时需要考虑哪些因素。
通过本章的学习,作为个人,你会掌握怎么选择一个适合自己的技术方向,好的方向会让你越来越有竞争力,越来越值钱;作为团队的一员,你会知道在为某个项目选择技术时该如何综合考虑,在风险、成长、代价之间进行权衡。
为了更好地选择技术方向,我们先来介绍一个模型,我给它取了个名字,叫“技术成长三阶段”,如图1-1所示。
图1-1
我们在一个专业领域内的成长,基本上都会经历三个阶段:
1.初级阶段:专项能力的提升
专项能力提升阶段是初级阶段,你为了做事情,必须先具备某些基础能力,比如从事软件开发工作,你要学会某种语言、某个 IDE、某种技术框架。
如果你刚刚从学校毕业开始做开发,或者刚刚从别的跑道转换到开发领域,那么你就处在这个阶段。这个阶段最重要的就是提升专项能力,让自己能够迅速搞定一些别人安排给你的事情,体现出你的价值。
这个阶段持续的时间长短因人而异,可能会是1~3年。如果超过3年还没有进入下一个阶段,那么你的成长速度就需要提升了。
2.中级阶段:技能体系的构建
这是中级阶段,你拥有了一组技能,围绕某个方向构建了自己的知识图谱,能够用自己的方式来解决问题。比如你使用 Java 语言做后台方面的开发,你的技能体系可能由 Java、MyBatis、Spring、SpringMVC、Netty、MySQL、Python、Linux 等组成。此时你在团队中,应该已经可以独立负责某个模块,能够完成模块的设计和开发工作,也能够指导初级阶段的同事进行开发。
你可能需要2~3年,经历2~3个项目才能慢慢构建起自己的技能树,然后还会在这个阶段待上1~2年,不断练习你的技能体系中的各项技能。所以当你能够拥有一棵强大的技能树时,距离你刚从事开发工作可能有5~8年了。
假如你超过这个年限,用过的技术还是散乱的,东一榔头西一棒槌,不能有机组合在一起,那么你的开发经验和能力,肯定大大落后于你的工作年限。换句话说,你可能把一年工作经验学到的知识、技能机械地重复了几年,没有获得应有的成长。
3.融合创新
这是高手阶段,你具有了丰富的实践经验,具备了T型知识结构,形成了自己的思维框架和解决问题的框架,能够融合不同领域的知识,组合各种资源,创造性地解决各种问题。
进入这个阶段非常重要的一种标志就是,你遇到问题,不再从下而上去思考(即从技术实现细节来考虑问题好不好实现、拿技术去裁剪问题或重定义问题),而是从实现细节跳脱出来,站到更高的层面,自顶向下去思考、去分析,先运用框架、逻辑去分析真正的问题是什么、问题的目的、问题的现状、如何去解决。搞明白这些之后,你才会沉降到技术层面去考虑实现的选择,而且实现时,你也不会拘泥于某种技术,而是什么技术合适就用什么技术(你的目的不是“用 Java 或 Redis 解决问题”,而是“解决问题”)。简单说,就是你走出了被技术束缚和塑造的过程(前两个阶段),可以反过来回到问题本源来思考了。
在这三个阶段中,我们都会遇到选择技术方向的问题。比如在初级阶段,入门时要选择,发现某种技术不适合自己时要重新选择;在中级阶段,我们要选择某些技术来构造我们的技能树,或者要做技术转型,需要重新选择技术方向;再比如在高级阶段,我们往往会负责产品的技术方案探索与选型,免不了要选择技术方向,甚至在这个时候,我们个人也可能会在技术方向上转型,必须有所选择。
所以,我们根据成长阶段的划分,挑选了下面几个可能需要选择技术方向的时机,分开来讲在这些时机怎么选择技术方向。
但在展开之前,我们需要先通盘梳理一下选择技术方向都需要考虑哪些因素。
我们先来看看选择一种技术可能会考虑的因素,然后看看在每个选择时刻运用哪些因素。
1.就业机会
这个因素,考虑的是哪种技术更容易就业,需要结合特定地区、特定行业来看,因为你找工作是面向地区和行业的。
这中间又有两种典型的策略,热门的和冷门的。比如 Java 和 JavaScript 是典型的热门语言,你可以选择学习它们;再比如汇编语言、R 语言、Scala 语言、Qt 框架就没那么热门。
热门和冷门是相对的,根据开发者多少、市场需求而定。
2.自我感觉的难易程度
比如我当年就在 Java 和 C 语言当中选择了 C 语言,因为《The C Programming Language》比《Java 2核心技术》薄得多,面向过程的语言也比面向对象更容易入门(对我来讲)。
难易程度与人相关,所以最好的方法,就是把你感兴趣的语言,都学学试试,可能每种语言花上一到两个星期,你就可以做出判断。
3.兴趣
很多人做开发可能是出于某种兴趣,比如对游戏感兴趣就做游戏开发,对智能手机感兴趣就做 APP 开发,对电子商务感兴趣就做前端开发。
当你喜欢某一类产品时,这类产品往往可以关联到技术。比如你喜欢做手机游戏,那么可能会选择 Unity 3D 或者 Cocos 2d-x;如果你喜欢樊登读书会这种学习类 APP,可能会选择 Java、Android、Objective-C、Swift 等。
4.薪水高低
大多数人选择技术的出发点是工作和未来发展前景,而选择工作时一定会把薪水作为参考因素,而且是非常重要的因素。所以我们在选择技术时,也可以考虑某种技术对应职位的薪水高低。
要了解这一点,可以去看各种薪酬报告,如100 offer 每个季度都会有类似的报告出来,拉勾网也会发布互联网职场生态白皮书,你用“互联网人才流动报告”“开发者薪酬报告”或者“互联网薪资调查”为关键字搜索,能搜到很多这类报告。
通过报告,你可以看到使用不同语言的开发者的薪水差异。图1-2是我从100 offer 2016年春季互联网高端人才流动报告中截取的。
从图1-2中可以看出不同编程语言所关联职位的平均年薪差异。
5.技术在将来的发展前景
你肯定不愿意看到这种情况发生:选择了一门技术,结果1年后它就没人用、没市场了。所以我们在选择时就要考虑这一点,做一些判断。
选择技术时存在两种考虑:一种是选择稳定的、经典的技术,一种是卡位将来的市场缺口,选择将来可能需要用到的技术。
前者考虑的是林迪效应,即:对于不会自然消亡的事物,生命每增加一天,则可能意味着更长的预期寿命。用林迪效应来看开发技术,一项技术存活的时间越久,其预期剩余寿命就越长。比如 C 语言(1967年诞生),存活了几十年,可能还会存在几十年。所以你可以选择像 C、C++、Java 这些经典的编程语言,它们流行了几十年,还将流行几十年。
回顾历史,经典技术都是从新技术发展来的,展望未来,一定也有一些现在的新技术会发展成将来的经典技术。如果你能抓住它,就可以享受它带来的技术红利。
要抓住可能成为经典技术或热门技术的新技术,就要应用卡位策略。
卡位策略是指看到某种技术会在未来具有稀缺性,非常有价值,选择提前介入,让自己在未来具备竞争优势。比如2007年 Google 发布了 Android Beta 操作系统的 SDK,就有人预见到 Android 开发需求将会爆发,果断学习 Android 开发;比如现在 VR、AR、机器学习、深度学习,其实都还没出现普适性的应用,但是将来一定会出现,此时学习相关技术,将来一定会占据先机;再比如2009年大数据概念兴起,如果那时选择 Hadoop、Scala 等技术,你现在可能就很值钱了。
运用卡位策略时,有两种方式。
一种卡位方式是根据市场需求和未来预期,就像图1-3所示,左下角是我们现在看到的现状,某些需求处在萌芽期,但是将来可能爆发。这个需求对应的产品、服务可能会用到某种技术,甚至这个需求本身就是由技术驱动的。这时候,你就可以分析从现在抵达将来可能需要用到的技术,提前做准备。
图1-3
还有一种卡位方式,是根据技术本身的发展程度来说看。采用高德纳曲线(参考 http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp),如图1-4所示。
图1-4
图1-4(来自 https://stateofdev.com/)展示了机器学习相关的三种技术:OpenAI、TensorFlow、Watson。从曲线可以看出,OpenAI 处于成长期,TensorFlow 处于成熟期,而 Watson 的地位正在受到挑战。如果你现在要选择一种机器学习框架,TensorFlow、OpenAI 是比较好的选择。
6.你接触的人的推荐
我们是否选择某种技术,和我们看到的可能性有非常大的关系。只有看到它,它才会进入你的选择范围,如果你看不到它,它再牛,对你也没意义。
比如我2005年自学编程,面临两个选择:C 或者 Java。我知道 Java 的存在就是因为读研同学的推荐,而 C 语言,则是当时大唐电信做开发的同事推荐的。我再没考虑其他编程语言——因为我根本不知道还有什么编程语言。
你看到的可能性,限制或决定你的选择。
7.相近性
当我们已经掌握了一些技术,要学习新技术时,就可以根据一种技术是否和自己已经掌握的技术比较接近来选择。相近的技术,学起来会更容易上手。
8.互补性
和相近性类似,互补性也常用在拓展我们技术能力的情景下。它指的是,有一些技术可以和你已经掌握的技术互相补充,组合在一起,形成更完整、更系统的技术图谱,给你带来更大的竞争力。
9.团队的技术图谱
我们所在开发团队的技术图谱,也可能会影响我们的选择。比如我们基于 CEF 开发浏览器,团队以 C++ 为主要开发语言,如果自己本来会 C++,再学习 JavaScript,就可以在 JavaScript 与 C++ 衔接这部分起到关键作用,从而具有特殊地位。
在做选择之前,应该先想想自己的目标,根据目标选择技术,是更理想、更靠谱的。
为了明确自己的求职目标,可以问问自己下面的问题:
当你能够勾画出工作目标的大概轮廓时,对应的技术方向就会浮现出来。
比如你特别喜欢使用蘑菇街或者美丽说买衣服,尤其喜欢商品展示页面,那么你的目标可以是到美丽联合集团做电商前端开发岗位……此时学前端开发对你来讲可能就是合适的选择。
比如你特别喜欢上海,又喜欢用爱奇艺看视频,对视频类产品很感兴趣,那么你的目标可以是到上海爱奇艺做视频产品开发……此时学习 C++、FFmpeg 等技术可能有助于你实现目标。
当你有目标时,学习会更有动力,效率也会更高。
一个公司是否选择你,取决于你本身和公司招聘需求的匹配度,而不是某个技术本身是热门还是冷门的。所以在初入行选择技术方向时,一定要先考虑你将来准备做什么(城市、行业、公司、产品),针对你的目标来选择技术。
当然你可能在想做开发时并没有明确的职业目标(你不孤单,大多数人都是如此),此时你考虑的是这些因素:
考虑就业机会,有热门、冷门两种策略。热门还是冷门,可以通过各种排行榜看出来,也可以通过在招聘网站挖掘相关职位信息来判断。
选择热门技术,比如 Java、JavaScript、C++ 等,一定有很多机会,看起来你能接触到更多的公司、职位,这会在心理上给初入行的你一种安慰。但并不能说你找到合适工作的概率就很大,因为具体到每个职位,招募方都是选择和自己的需求更匹配的求职者。在这个前提下,因为竞争者众多,且其中有很多有经验的选手,用人单位有更大概率找到比你更匹配他们的需求的开发者,所以你作为初学者可能常常过不了简历关,或者过了简历关又过不了面试关,往往会面临更大的求职压力。
选择冷门技术,机会可能相对较少,但是竞争者也会比较少,而且机会相对确定。比如在西安,如果你以 Qt 来求职,那么常见的公司可能就有广联达、诺瓦电子、和利时、有智等公司。你可以仔细斟酌它们的招聘要求,运用心力打造自己的某个亮点,认真地准备简历、笔试、面试等环节,极有可能获得想要的工作。
从心理和统计意义上讲,当你没明确目标时,选择当地需求比较旺盛的技术来学习,是相对稳妥的。至于哪种技术需求量大,到智联、51job、猎聘、拉勾等网站,以地区、技术为条件来搜索职位,看结果多少,就能大概判断出来。
当你这样选择技术方向时,也能够降低他人推荐中携带的个人主观性对你最终选择的影响。
薪水高低这些信息,可以通过招聘网站、行业薪酬报告等来获得,后面我们在介绍工具时会讲到,在“如何在跳槽时获得想要的薪水”那一章会展开介绍。
要想知道自己能不能学会某种技术,最好去试试看、做做看。现在网上有很多免费的学习资源可以利用,我建议初入行的你,根据兴趣和他人的推荐,得到一个技术清单,每一种都摸索、感受一下,然后决定选择哪一种。
对开发者来讲,自主学习能力是非常重要的,这一关一定要过,这也是我建议读者先自己摸索学习的原因。当你自己学到了一些东西,想找人带或者加速的时候,可以寻找私教或者培训结构。
我了解到有这些资源:
如果你选择的技术能够和你感兴趣的产品、服务关联起来,那么你学习时会更有动力。所以也请考虑这一点,从你感兴趣的产品、服务出发,找找看它们是使用什么技术实现的,整理出一个清单,帮助你去选择。
再来看一下成长阶段模型,如图1-5所示。
图1-5
当我们过了专项能力提升的初级阶段之后,就应该开始构建自己的技能体系了。在为搭建技能树而选择技术时,通常考虑下面两个原则:
1.相近原则
相近原则指和你当前所用语言、技术框架比较接近的其他语言和框架。
比如你使用 C 语言,可以学习 C++、Lua、OC、FFmpeg、OpenGL。比如你使用 C++,可以考虑 Qt、CEF、Apache C++ Standard Library、Libsourcey、WebRTC、WTL 等。比如你用 Java 开发,可以学习 Scala、Groovy/Grails、MyBatis、Hadoop 等;比如你用 Python,可能对 Django 或者 TensorFlow 感兴趣。
2009年到2014年,我个人一直在用 C++ 和 Qt Widgets 做互联网视频盒子,后来发现 Qt 里出了新的界面框架 Qt Quick,我就去学习,在学习的过程中,我发现 Qt Quick 内置了 Google V8 引擎,QML 支持嵌入 JavaScript 语言来脚本化应用,这引起了我的兴趣,就买书学习了 JavaScript。在这里,我学习 Qt Quick 和 JavaScript 就符合相近原则:Qt Quick 和 Qt 是关联的,JavaScript 和 QML 是关联的。
2.互补原则
互补原则指那些能够组合在一起完成特定任务的技术。比如你学习 Scala,可能就会用到 Akka;你学习 Node.js,可能需要学习 MongoDB、AngularJS 等。比如你使用 PHP,那么可以扩展开来,学习 Linux、Apache、MySQL,合起来是 LAMP,搭建网站的经典组合。
我们的流媒体系统中有个视频搜索功能,它的实现分为前台和后台。
前台在机顶盒、手机等终端呈现,你输入一个首字母、全拼、混频或者汉字,可以搜索到对应的电影、电视剧、演员等信息。
后台面向前台提供的搜索服务,是用 C++ 结合 MySQL 实现的。要实现全网范围内的搜索,我们就需要能够跟踪各个视频网站的视频动态,一开始有个同事用 C++ 和 HTML 来爬取常见的视频网站,后来发现一旦网站结构有变动,修改和验证就特别麻烦,于是就学了 Python,用 Python 来做爬虫,获得原始视频信息,进行初步的结构化处理,然后再入库。
我这位同事学习 Python,就是互补原则的应用。这也是我们在做后台开发工作时的常见做法:静态语言做核心业务开发,动态语言负责编译流程、自动化部署、系统资源监控、日志分析、非核心业务处理、测试工具等工作。
做了几年开发工作之后,你很可能会面临技术转型。通常有两种情况:
2017年4月25日,在行约见过我的一位朋友 W 突然给我打电话,说他要做一个 Offer 选择,很急。
原来北京有一家在人工智能方向创业的公司愿意给他 Offer,要他明天答复。他老婆、孩子在西安,父母也不愿意他抛家舍业去北京。另外现在所服务公司有一个他可以负责新项目的机会。凡此种种,令人纠结,无法决断。
我想起 W 之前通过在行约我的话题“聊聊程序员职业规划那些事儿”,也是聊如何学习人工智能,意识到这是他真正想要尝试的方向。
在电话里,我问了 W 一些问题,将他面临的情况简化到3个问题:
2017年5月21日我在微信上问 W:“北京人工智能那个机会,你后来怎么决定的?”他说:“我已经入职两周了,感觉还不错,每天都在进步。”
这就是一个典型的技术转型案例,W 从企业服务外包方向的开发,转向了人工智能,用到的语言、技术框架、SDK、算法等,全都换了。
W 这个转型,正是第一种情况:因强烈渴望参与到新技术、新市场当中去而主动转型。这是积极的选择,方向明确,不需要考虑那些选择因素,因为自己的明确目标,已经决定了要用什么技术,所要做的,就是抓紧一切时间去学习目标技术,了解目标市场,寻找机会进入那个市场。
第二种情况的转型,即被迫做技术转型,就需要考虑比较多的因素,与入行时选择技术方向类似。所以,请先回顾一下我们在那里分析的薪水、就业前景(热门/冷门)、兴趣、难易程度、他人推荐等因素。
有经验的开发者做技术转型时,通常有三种情况。
1.在原有技术的基础上做关联转型
比如从 Android 开发转向使用 Java 做后台,这是2016年、2017年很多开发者在移动端遇冷时的选择,因为有关联性,转型相对还是比较容易实现的,推荐先在公司内寻找机会。
2.抛弃原来所用技术
比如一直用 C#,转换为 Go。这相对较难。
我认识一位朋友,做了10年 C# 相关的开发工作,决定转用其他语言,找工作时,别人总是劝他不要放弃在C#相关技能栈上的积累,劝他继续用 C# 做开发,他拒绝了十几家这样的公司,为的就是不再用 C#。
在用人单位看来,这位朋友放弃 C# 是极不明智的,因为他已经做得很好,技术积累的价值都在这个方向上。反过来,我们自己也会这样想问题,你在一个方向沉浸得越久,就越难放弃它去尝试新的方向并以新的技术方向作为自己的主方向。
3.卡位
这个时候卡位市场缺口,学习将来稀缺的新技术是非常不错的选择。而且在这个阶段,也必须积极主动去探索,最好每年给自己定一个学习某种新技术的目标,在工作之外完成它。
要实现这种过渡,一个现实的策略是:一边工作,一边学习。
我个人一直用 C++ 做开发,2013年 Android 系统在网络机顶盒普及,我们也开始做 Android 视频盒子。我为了学习 Android 开发,就给自己安排了一些与 Android 相关的任务,在工作中完成了对 Java 语言和 Android 开发框架的学习。这就是合理利用当下工作中的机会来实践新技术的案例。
你在实际的工作中,可能也存在这样的机会。要勇于去尝试,不要怕多花时间和精力。
如果你在工作中无法应用新技术,可以利用业余时间。比如下班后的几个小时,早起的一两个小时,周末的两天,都可以用来学习新技术。前面我们提到的W为了向人工智能方向转型,买了不少书,还在网上买了很多课程,利用业余时间学习算法、框架,并且自己做一些小练习。
如果你觉得自己很忙,老婆、孩子、父母、朋友都要管,还有各种娱乐也会占用你不少时间,那就测量一下,记录你一周的业余时间都干了什么。数据出来后,你就可以分析,看看哪些事情可以不干,哪些事情可以采用更有效率的方式来干。分析之后,你就能找到时间来学习。
当你构建了自己的知识图谱、能够胜任比较复杂的工作后,在团队中就会越来越重要,就有机会参与到新项目、新产品、新服务的方案选型中来。
做方案选型时,目标是得出现实可行、成本可接受的方案,需要综合考虑各种因素。
1.某种技术适合解决某类问题
很多开发者容易犯“拿着一把锤子看什么都是钉子”的错误,用自己熟练的语言、技术来解决一切问题。比如我喜欢 C++ 语言,就会琢磨怎么用 C++ 语言来做 Web 服务器,甚至动态 Web 页面也要用 C++ 来生成;我喜欢 Qt,就曾认真考虑过用 Qt 来做 APP,支持 Android、iOS、Windows Mobile 等平台。
这是典型的被技术塑造、束缚的案例。
实际上,很多技术都有它比较适合的应用场景,比如说 Java 天生就适合用来做企业应用、服务端应用;C 语言离底层就是近,在自动化控制、系统底层、驱动、单片机等领域是无冕之王;R 语言被广泛用在大数据分析上……
我们在为新产品、新服务、新项目选择技术方案时,一定要跳出自己已经掌握的技术,首先站在问题域去考虑,想想这个问题到底是什么、哪种技术更适合问题场景,这样才能选择好方向,后期开发、维护才会更顺利。
2.新技术的成熟度
有的开发者喜欢新技术,什么新用什么,把公司的项目、产品当作新技术的试验田,而不考虑试错的代价。这对个人来讲固然可以积累经验,但对公司来讲,往往是一种灾难。
所以,我们在做技术方案选型时,一定要考虑这种技术有没有顶级公司支持、有没有知名产品。假如什么都没有,那么最好先不要用,或者先在非核心业务上应用。
举个例子,很多人都觉得 Rust:
可是如果让你负责一个要求高并发的服务端应用,你会选择它吗?你能找到一个使用 Rust 的重量级的后端应用吗?你能找到一个大型软件公司(除 Mozilla 外)在使用它吗?
3.生态
2014年我负责组建一个团队做互联网彩票,合伙人在邀请我加入前,先找了个小伙伴做后端。这个小伙伴学习能力、编程能力、解决问题的能力都超强,他熟悉 Java 后端开发、熟悉 Scala,熟悉 PostgreSQL,还能做 Android APP 开发,C# 也可以。
这个小伙伴为我们的后台选择的技术栈是 Scala + Play + Akka + PostgreSQL。Scala 发展了几年,也有 Twitter 这样的公司在使用,应该是比较成熟的。
但当时我们在西安,真的很难找到一个了解 Scala 语言的开发者!我花了几个月时间才联系到一个懂 Scala 的小伙伴,可他还不愿意来。最后我只好自己学、安排公司的其他小伙伴学。
这就是最大的问题——没有一个良好的生态。此时
非常痛苦。
4.团队的技术图谱
我们做方案选型时,也要考虑团队已有的技术积累。
比如你的团队原本是做机顶盒的,主要使用C、C++和汇编语言,现在因为卖产品的缘故,需要做一个简单的电商的后台,由你负责。
你会选用什么技术来做?C、C++、Python、Ruby、Java、Scala 还是 Go、Rust?
你会招募一个小伙伴,还是要你现有的成员学习后端开发?
假定你想让现有的成员学习电商网站开发(很多中小公司都会这么搞),那么选择什么技术栈?Python + Django 还是 Ruby on Rails?
如果我是负责人,恐怕会选择 Python,因为它与 C 语言更亲近,而团队里的小伙伴都熟悉 C 和 C++。
5.技术引入的成本
引入一种新技术的成本,包括:
学习成本是引入任何新技术都必须要负担的,就看新技术对你的团队成员来讲学习难度如何。前面讨论团队技术图谱因素时引入的例子——嵌入式团队做电商站点,使用 Python + Django,学习成本可能会较低;使用 Java + Spring + SpringMVC + MyBatis,学习成本就会高很多。
考虑学习成本,要结合现有技术积累来分析。
为了新技术要招募新的开发人员时,就会产生招聘成本,招聘的成本包括笔试、面试、时间、新成员与团队成员磨合等,成本非常高。
时间成本主要是指引入一种技术,从学习到产出结果之间的时间周期。这个时间周期分为两部分:验证周期和产品化周期。
所谓验证周期,指你通过了解该技术的适用场景、测试关键技术特性、构建 DEMO 等手段来验证该技术对你的产品的可行性所花费的时间长度。这个周期,从几周到几个月不等。
所谓产品化周期,指过了验证周期,使用该技术把产品做出来的时间长度。可能是从零开始做,也可能是在验证周期内搭建的 DEMO 的基础上来做。
如果验证周期内你做了一个产品 DEMO,简化实现了产品的大部分功能,项目的相关干系人就会大概率地错误评估产品化周期——他们会认为 DEMO 已经出来,产品化指日可待。也许只要一周、两周、最多一个月,这就是他们的想法。而实际上,你的 DEMO 仅仅是最小化验证可行性,简化了功能,忽略了异常,各种功能之间也没有按产品化所需的逻辑链接起来,总之它离一个产品还有十万八千里,你要想产品化,其实和没有 DEMO 时花费的时间差不多——从零开始需要10个人月,有了 DEMO,可能需要9.5个人月,事实就是如此。
机会成本有两层含义:
举个例子,2013年,你们公司要做一个 Web IM 产品,支持文字、图片,声音、视频等形式的聊天,希望它能在各种浏览器上都可以使用,能无缝集成到客户的电商网站上。
考虑到各种浏览器的历史版本兼容问题,你选择了使用 Flash 来实现,经过测试,在 IE、FireFox、Chrome、Opera、360安全浏览器、搜狗、QQ 浏览器、猎豹等浏览器上都可以正常使用,考虑到电商网站主要通过桌面计算机访问,所以最终你们采用了 Flash 的方案。
可是后来移动互联网快速发展,iPhone、iPad 用户很多,默认浏览器是 Safari;Android 手机星火燎原,内置浏览器也不支持 Flash。使用这些设备的用户无法使用你们的 IM 产品,导致集成你们 IM 产品的电商公司不断投诉你们。这时你才发现,再想换到 WebRTC 或者其他技术框架,已经很难了——因为你们前端用 Flash 技术,后端用 Wowza,音视频传输用 RTMP,和 Flash 技术栈深度绑定了。
这里推荐一些工具或者方法,你可以使用它们来判断某种技术的状况,决定自己是否选择。
1.Stack Overflow
Stack Overflow 的开发者调查:http://stackoverflow.com/insights/survey/2016。更改最后的年份,比如将2016年修改为2015年,即可查看对应年份的调查结果。这个结果里有开发者最喜欢的语言、最想要学习的语言、开发者年龄分布、Stack Overflow 上的热门技术等,很有参考意义。
比如2016年最流行的技术如图1-6所示。
图1-6(来自 Stack Overflow)
哎,JavaScript,前端还是热啊。
比如2016年 Stack Overflow 上的热门技术,如图1-7所示。
图1-7 (来自 Stack Overflow)
哇,JavaScript、JavaScript……
比如最被热爱的技术,如图1-8所示。
图1-8 (来自 Stack Overflow)
需要提请注意,Stack Overflow的统计结果受样本范围和数量影响很大,仅供参考。比如Rust最被热爱,并不代表它未来就可以获得大面积应用,也不代表它的生态很快就能完善,很快就会出现杀手级应用。
2.TIOBE 编程语言排行
TIOBE 编程语言排行:https://www.tiobe.com/tiobe-index/。会有 TOP 20 编程语言及 TOP 10 的走势曲线。比如现在 T0P 20 语言,如图1-9所示。
图1-9 (来自 TIOBE 网站)
看到了吧,很多人黑 C#、黑 C、黑 C++,但是它们依然排在前几位!有时小圈子的热烈讨论会遮蔽事实的真相——新生的、非主流地位的语言更容易引起开发者的讨论,这些频繁的讨论,会让人误以为这些新语言很热、很火。
再看看 TOP 10 语言多年的走势曲线,如图1-10所示。
图1-10 (来自 TIOBE 网站)
3.技术热门度曲线
全球最大的 IT 咨询公司高德纳提出了一个“技术热门度曲线”模型,把一门技术的发展过程分为启动期、泡沫期、低谷期、爬升期和高原期5个阶段。https://stateofdev.com/ 这个网站根据高德纳的模型,做了各种开发技术的曲线(部分曲线的阶段划分和描述与高德纳的技术热门度曲线模型有所区别)。
机器学习框架的曲线,如图1-11所示。
图1-11 (来自 stateofdev 网站)
可以看到,TensorFlow(Google)已经处于成熟期,OpenAI(诸多硅谷大亨联合建立,开源非盈利组织)在成长期,而 Watson(IBM),正在被挑战,快要进入衰退期。那么如果我们要做出选择的话,可能会优先选择 TensorFlow 或者 OpenAI 来学习。
后端开发语言的技术热门度曲线,如图1-12所示。
图1-12 (来自 stateofdev 网站)
前端框架的发展阶段曲线,如图1-13所示。
图1-13 (来自 stateofdev 网站)
4.GitHub
GitHub 也有一些统计数据,说明各种语言、技术在 GitHub 上的活跃程度,可以登录这里查看:https://octoverse.github.com/。另外,你也可以自己在 GitHub 上按关键字(比如 Qt)来搜索,看某种技术是否有很多的项目,以此来判断技术的活跃度,如图1-14所示。
图1-14 (来自 GitHub)
5.招聘热度挖掘
像智联、51job、猎聘、拉勾、100offer、大街网等招聘网站,都是很好的技术需求数据来源,你可以用某个关键字(比如“Java开发工程师”)来搜索,看相应的招聘需求是否旺盛。
6.薪酬报告
以“互联网人才流动报告”“开发者薪酬报告”“互联网薪资调查”“程序员薪酬报告”“互联网薪酬报告”等为关键字在百度搜索,就可以搜到拉勾、智联等网站发布的互联网人才薪酬报告,可以根据这些内容了解某些岗位的薪资状况。
如果你想了解特定地区、特定岗位的薪水状况,也可以到猎聘、拉勾等网站上去,按地区搜索目标岗位,很多岗位都会给出薪水范围,多看一看,就能了解到平均水准。
图1-15所示是我在猎聘网上搜索西安地区的C++开发岗位得到的结果。
图1-15
图1-16所示是我在拉勾网上搜索西安高新区、有3~5年经验的 C++ 开发工程师得到的结果。
图1-16
可以看到,现在很多公司在招募人才时都会提供薪水范围,这是因为它可以大大提升匹配成功率,节省公司和应聘者双方的成本。
作为开发者,工作2~3年后,往往会感到迷茫:能够使用一种或者几种技术解决一些问题了,却觉得自己停滞了,不知道接下来怎么办。于是我们有时羡慕做管理的,觉得他们轻松,地位高,赚钱多;有时又羡慕技术大咖,觉得他们能搞定别人搞不定的问题,像神一样会发光,可是回看我们自己,到底是接着做技术还是转管理呢?如果选择做技术,接下来该怎么精进?如果不做,又该怎么转型?这都是问题,每日煎熬着我们。
我有十几年的开发和管理经验,对于开发者的各种迷茫,深有体会。一般来看,开发者的迷茫分两个层面:
本章就从这两方面来展开,先讲如何确认自己要继续做开发还是转管理,这部分会提供一些方法(比如工作的三种分类、成就感来源等),让大家能够自我觉知和判断;然后我们会沿着开发这条线继续前进,看看如何在技术上持续精进,这部分最重要的是对标管理法及其四种典型标杆;再接下来会讲怎样设定有效目标,找到下一步行动;最后,我们会介绍四个习惯,让精进成为你自身的一部分。
先给出本章的思维导图,方便对照阅读和快速抓取要点,如图2-1所示。
图2-1
我们的假设是:你已经走在软件开发的道路上了,做了一段时间软件开发,1~2年,或者3~5年,对接下来该继续做开发还是转向技术管理产生了困惑。
在此前提之下,有三种方法可以帮助你进行判断:
1.工作的三种维度
根据交互对象不同,工作可分为三类:
假如你发现自己更愿意围绕着人际交互来做事情,希望自己的工作中大部分时间都在和人打交道,那么你可能更适合做管理、销售、市场、客服、咨询师等方面的工作。
假如你发现自己更愿意做操作性的工作,比如修理电脑、组装电脑、搭建局域网、修理汽车等,那么软件开发工作可能不太适合你,运维或者网管也许和你更匹配。
假如你觉得信息很迷人,很享受与信息和数据之间这种确定性、一致性、可预期性较高的互动方式,也很享受通过组织、修改、整合、创造信息来解决问题这种工作方式,那么你现在正在做的开发工作,基本上和你的偏好是吻合的——因为开发者偏重于和数据、信息打交道,以信息和数据为输入,也以信息和数据为输出。
2.成就感来源
2015年年底创业失败,我决定找一家单位上班。彼时我35岁,在很多人眼里这个年龄的程序员已经要被淘汰了。我面临的选择是:做开发还是做管理。
从2009年开始我就在做技术管理工作,这时比较传统的做法是,找一个研发经理的职位来做(当时有几个不错的机会),一来职业生涯有延续性,二来薪水也高。可是我后来选择了到全时云商务做开发工作,让很多朋友大跌眼镜。
我为什么这么选择?其中的关键点是:我觉得亲力亲为解决问题更有成就感。
回顾我多年的开发和管理经历,我发现在我写作《Qt Quick 核心编程》时,在我一周7天不休息,加班加点重构智能机顶盒播放器时,感觉最为充实,最有意义。而在我做管理工作时,带领团队完成了某项任务,自己也没什么特别的感觉,即便有一些兴奋感和成就感,也很快会被委派任务、一对一谈话等事情淹没。
所以我思来想去,决定做回开发工作,这样我更能感受到意义和价值,更有成就感。
每个人的成就感来源都不一样,假如你像我一样,成就感在于自己动手解决具体的技术问题,那么开发工作就更适合你;假如“领导和管理别人、通过别人完成工作、看到别人成长”让你更有成就感,那么管理工作适合你。
实际上这一点和前面介绍的“工作的三种分类”是类似的。你越倾向于做人际互动类的事情,就越适合做管理工作,你越倾向于和数据、信息交互,就越适合做开发工作。
可以遵循下面的步骤寻找成就感来源:
可能有的朋友会说,即便有这4个步骤,也判断不出自己的成就感来自哪里,不怕,第8章——转型——还有更简洁的方法可以帮到你。
3.未来的样子
问自己两个问题:
在你的身边找比你大5岁、8岁、10岁的开发者,看看他们的工作状态、生活状态、个人风貌,是不是你想要的,或者反过来,是不是你讨厌的。
假如看到他们你觉得看到了自己的未来,这个未来你无论如何无法接受,那么,很可能软件开发并不是你的长久之道,你可能要考虑技术管理岗位。
那就在你的身边找管理者,看看直接上级,看看其他部门的经理,看看其他公司的管理者,找5个以上的人出来,观察、了解、搜集他们的工作状态、生活状态、个人风貌等方面的信息,看看这样的人是不是你想成为的,或者反过来,是不是你讨厌的。
假如你也很讨厌你能接触到的这些技术管理者,那么,可能这条路也不是你的长久之道。你的未来应该在别处。你可以考虑转型,那么请去看第8章的内容。
你之所以愿意做软件开发,一定是有原因和目标的。比如:
……
请问一问自己为什么要做软件开发,找到几个理由,记录下来。
它们会帮助你渡过后面会遇到的倦怠期。
进入软件开发领域后,你从对什么都好奇、积极学习,慢慢变成机械地完成领导分配的任务,3~5年后就可能会感到无聊、困惑、迷茫,丧失前进的动力,进入倦怠期。
这个时候,你对工作的态度是“差不多就算了”,干什么都没心思,开始思考朝九晚五打卡上班有何意义,整个人陷入“有事不想做、没事又无聊”的倦怠之中,更谈不上什么技术精进了。
这是一种危险的状态,要让自己走出来,有两个方向:
具体可以像下面这么做,想想你之前记录的做开发的理由,问自己几个问题:
做软件讲究迭代,讲究热更新,我们个人也是一样的,要不断自我探索和更新,找到技术在不同阶段对自己的不同意义,只有找到开发工作对个人的意义所在,你才可能有动力去精进。如果你觉得做不做开发、做好做坏无所谓,那么你铁定是无法持续精进的。
所谓学习型心态,指的是:有主动学习的意识,时刻以学习的眼光和心态来看待发生在自己身上的事情。
举个例子,作为开发人员,你做完了一个功能,展示给领导看,结果他说你做出来的东西根本不是他们想要的,简直一无是处。这个时候,你会怎么办?
一个选择是怼回去,大家吵一架,然后不欢而散,甚至因此和领导不睦,最终觉得领导太没水平,此地无法发展,离职。
另一个选择是坐下来分析:
后面这个选择就是积极主动的选择,是面向解决问题的,是学习型心态的开发者会采取的方式。他们会考虑自己怎样去改进、怎样能达成目标、通过这件事自己能收获什么。
作为软件开发人员,其实有很多提升自己的机会和方式,而最终你能不能提升,除了要看你是否有内在动力,还要看你是否拥有学习型心态。
做了各种铺垫,我们终于可以开始介绍精进的方法了。
对标管理法
在专业领域成长的一般模型如图2-2所示。
图2-2
模型中有三个要素:
每个人都可以评估自己的现状,自己在做什么、用什么技术、技术达到了什么程度、拿多少薪水、是什么职级、是否被领导认可、与人协作是否顺畅……有很多维度,静下心来思考一下,在纸上列一列,就能得出自己当下的状态。
而目标则很可能随着旧目标的达成而消失,或者随着日复一日的编码、Debug、交付而褪色,或者随着每个月的薪水蒸发掉。一旦我们失去目标,就会陷入迷茫,被动工作,进而慢慢失去竞争力。
所以,要想日有寸进,必须要在日常的开发工作中找到努力的目标。这非常关键——很多人就是因为没有目标而放任自己随波逐流、被动工作,最终变得庸常而被组织淘汰。
因此我们引入原本用于企业的对标管理法,帮助自己在日常工作中找到贴合自己的目标。一旦我们找到目标,对比现状,就可以找到差距和前进方向,有了方向,就可以制定计划,稳步前进,获得提升。
图2-3是实践对标管理法指导个人成长的基本过程。
图2-3
以下解释来自百度百科:
对标管理,由美国施乐公司于1979年首创,均将其视为现代西方发达国家企业管理活动中支持企业不断改进和获得竞争优势的最重要的管理方式之一,西方管理学界将对标管理与企业再造、战略联盟一起并称为20世纪90年代三大管理方法。
对标管理是指企业以行业内或行业外的一流企业作为标杆,从各个方面与标杆企业进行比较、分析、判断,通过学习他人的先进经验来改善自身的不足,从而赶超标杆企业,不断追求优秀业绩的良性循环过程。
所谓“对标”就是对比标杆找差距。推行对标管理,就是要把企业的目光紧紧盯住业界最好水平,明确自身与业界最佳的差距,从而指明工作的总体方向。
在针对个人运用对标管理法时,可以从4个方面来寻找标杆:
接下来我们就从这4个方面展开,看看怎么寻找我们的目标。
1.从优秀者身上找目标
我们身边一定有人在某方面做得比自己好,比如:
……
别人做得好的方面,都可能是我们努力的方向。我们要用善于发现的眼睛,找到身边人的突出之处。
在向优秀者对标时,下面的问题清单可以帮助我们有序、系统地分析标杆:
举个例子。
袁大每天都能准时下班,工作还完成得很好。你对这一点很感兴趣,就暗中观察他是如何做事的,发现他过一段时间就会翻看一下纸质笔记本,或者用笔在本子上记录点什么,还有,每天下班的时候,他都会在本子上写点东西。
于是你跟他聊天,发现他每天下班前都会在笔记本上记录今天完成了什么、遇到了什么问题、明天做什么。还了解到他每天都会早到半个小时左右,利用这段时间规划一天的工作。
后来你明白了,袁大培养了一个“早规划晚回顾”的工作习惯,通过这个习惯,保证每天都有几件重要的事可做,每天都有目标、有节奏,这样就可以不慌不忙地工作。
于是你就会思考:袁大的习惯是否可以成为我的习惯?
这个时候,你就找到了一个提升的方向:培养每日完成三件事的习惯。一旦你养成这个习惯,习惯的力量就会帮助你集腋成裘,完成从量变到质变的过程。
再举个例子。
你发现组里的袁二,排查 Bug 特别厉害,像一休哥一样,点点头沉思一下,就可以说出问题所在。即便是别人的代码引入的 Bug,他也可以很快找到原因——只需要翻翻代码,和对方聊几句。
为什么袁二这么牛?
你向他请教,发现他做到了以下几点:
好了,正好你总是被 Bug 困扰,往往一个 Bug 能让你愁烦一个星期,这下是不是有努力方向了?
2.一般性规律
所谓一般性规律,指的是那些通用的、可以指导我们在什么时候做什么事情的规律。
举个例子,舒伯的生涯发展阶段理论就是一般性规律,男大当婚女大当嫁也是一般性规律。
对于开发者来讲,要关注专业能力成长的一般性规律,即技术成长三阶段。如图2-4所示。
图2-4
在技术领域内的成长,基本上都会经历三个阶段:
对开发者来讲,若拥有一年左右经验,多数人处在第一个阶段——专项能力提升的阶段,熟悉某种编程语言,可以完成别人安排的一个小模块的开发。
若拥有三年及以上的经验,就应该进入第二个阶段了。当你在某个技术方向上构建了技能体系后,就可以完成相对复杂的工作,可以独立做一些事情,甚至可以辅导初级开发者来完成工作了。这个时候,你往往已经是团队里富有生产力的成员了。
若有五年以上开发经验,应该进入融合创新阶段,能够独当一面,可以独立完成特定项目的评估、设计、技术方案选择等事情。此时你往往是团队里的技术领袖或者技术管理者,具有比较大的影响力。
假如一个开发者干上八年十年,还到不了第3个阶段,可能就需要考虑通过其他方式来提升自己的竞争力,保住自己在团队中的位置。
这个模型更适合应用开发人员,对于做基础研究(比如音频算法、图像处理算法等)的开发者,在第3阶段,可能在他所在领域内钻得更深,成为专家。
我们了解了技术成长的三个阶段,就可以结合自己的工作情况,判断自己当下处于哪个阶段,该做什么事情了。
比如你做了2年 PHP 开发,可能你处于从第1阶段向第2阶段转型的过程中,此时提升的方向,就可以考虑和 PHP 相关的技术栈,比如了解 HTTP 服务器是如何和 PHP 整合在一起的,再比如了解数据库、操作系统,这样你就可能会定下掌握 LAMP(Linux/Apache/MySQL/PHP)或者LNMP(Linux/Nginx/MySQL/PHP)技术栈的目标。
3.技术本身的知识层次
一门编程语言、一个技术框架,其本身的知识层次也会有深浅,在学习时,也存在先后顺序和一般性规律。从这个角度讲,技术本身的深浅层次也可以用于个人对标管理。
一般来讲,学习一门技术时,有三个阶段:
我比较熟悉 Qt,Qt 这个应用开发框架,三阶段的划分可能是图2-5所示这样的。
图2-5
多数技术框架,通过分析,都可以划分出类似上面的知识层次和学习阶段。
以此作为对标的标杆,就可以弄明白每个阶段应该达到什么程度,还可以定位自己处在哪个阶段,当前阶段的任务有没有完成,接下来该学什么。
4.项目指标
开发者的工作往往是由一个又一个项目串起来的,每个项目都会有预期结果,都会界定怎么样才算是完成,然后会有一系列的指标用于衡量项目做得怎么样,比如 Bug 率、延期时间、并发用户数、持续运行时间、单元测试覆盖率、安全性等。
我们在做项目时,就可以用这些指标来要求自己,这样每个项目都有目标,都可以制定一些策略,帮助自己来实现这些目标。
很多开发者其实不太关心交付时间、Bug 率、冒烟测试通过率、并发用户支持、内存占用、CPU 占用、电池消耗等问题,往往是做完了,能跑,觉得就可以了。
以这样的态度来应付开发任务,其实损失最大的是自己,因为你白白失去了锻炼和提升的大好机会。
如果以项目指标来要求自己,把项目指标分解到开发工作中,并且在开发过程中贯彻执行,收获一定比被动完成任务多得多。
举个简单的例子,如果你用 Java 开发一个电商类的 Android App,内存占用就应当是你关心的一个指标,否则你的应用就会经常出现 OOM 错误,严重损害用户体验,导致用户大量卸载,最终影响产品的市场。
如果你把内存占用作为重点考虑的指标,一定会考虑如何使用图片预缩放、重用、解码格式、缓存等策略来优化内存占用,你甚至会自己设计一个图片缓存池或者特殊的 ListView 来专门处理用户快速浏览商品时巨大的内存消耗。
你有了这样的考虑,做出来的 APP 肯定比你从未考虑过内存占用问题而做出来的稳定得多。
拿来即用的自我提升方法
前面介绍了如何从4个方面寻找目标提升自己,只要你遵循那些策略,付出一些努力,就可以找到适合自己的提升策略。
下面给出一些经过验证切实有效的提升策略,你可以拿来直接用。
阅读全文: http://gitbook.cn/gitchat/geekbook/5a3b26e89ba9580e1eaa587c