作者:安晓辉
出版社:中信出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
程序员的成长课试读:
前言
作为一名普通的程序员:
·你想买一套房子,不想再租住在远离公司的偏僻地带每天通勤4个小时上下班
·你想买一部车子,可以周末开着去山里转转,看看红叶听听鸟鸣
·你想买衣服时去窗明几净微笑服务的商场而不是每次都找一个不知名姓的小二网购经济适用款
·你想每年出去旅游10次8次,今天在苏梅岛潜水明天在魁北克吃枫糖
·你想每年给爸爸妈妈5万块的生活费,让他们露出欣慰的笑脸
这些想法不能实现,会经常性地带给你痛苦。这种痛苦,会随着你工作时间的增长而加深,渐渐变成你生活的底色——你的底色原本简单明快,现在幽暗阴郁。
实际上,这些所谓的痛苦,有90%都可以通过钱来解决。前提是:你的价值能够不断提升,赚钱速度超越需求膨胀。消除了这些痛苦,幸福感就有生长的环境,就不那么容易被淹没。
可是作为普通的程序员,你却发现瓶颈一个接一个地扑过来。做技术,不知道怎么做到持续精进、怎么坚持;转管理,又不知如何开始。结果还没等想明白呢,半载一年就过去了,蓦然回首,好像自己的能力没怎么提高,薪水增速却越来越跑不过通货膨胀了。
有时候你觉得开发工作越来越吃力,转型的呼声越来越高,却不知道如果离开开发岗位自己还能干什么。看着别人可以选择当自由职业者,或者能实现财务自由,内心羡慕,然而转过身却只能叹息:自己的路,究竟在哪里?
仔细想想,你就会发现,要搞定这些事情和问题,只要能赚到更多的钱就可以了!
这个结论很俗吗?
不,现实正是如此!
对于大部分开发者来讲,工作和生活的诸多烦恼,其实都源自于:怎么赚到更多的钱。
要想赚到更多的钱,就要回到问题的原点,想想个人赚钱的本质是什么。
个人赚钱的本质是——出售时间!对吗?
从出售时间的角度来看:
个人收入=每天可售时间数量×单位时间价格×单位时间出售次数
在这个公式里,有三个要素,简单描述就是:
·每天可出售的时间数量
·单位时间价格
·同一份时间的出售次数
结合开发者的具体情况,可以找到多种提升收入的方式。参考下表:
或许你知道所有这些方式甚至知道更多,但是,怎么做到呢?
这是个大问题!
知道和做到之间有一道鸿沟,要想跨越它,你不但要努力,还要讲究方法。
这本书不会承诺“看完本书就能快速赚钱”,不提供任何安慰和幻觉,它只是一本工具书,仅仅是发出一份邀请,让你看到有一些方法可以用来分析自己、帮助自己去有效选择和提升,但最终你是否可以用书里的理念、方法、工具指导自己的工作和生活,则取决于你的认真程度和执行力!
所以,如果你愿意付出努力让改变发生,那么我们现在开始一起行动!
本书共有8章。
第1章,介绍如何选择技术方向,我们结合技术成长三阶段模型,讨论在入行、构建技能树、技术转型、团队技术方案选型等常见场景中如何选择适合自己的技术,提高增值的效率。
第2章,讲述如何在技术上持续精进,着重讨论如何在工作中将持续提升自我能力和价值落在实处。为此我们引入了个人对标管理法,让你从优秀的同行者、一般性规律、技术自身的深浅层次和软件项目指标四个方面出发,找到随时随地可以引领自己前进的小目标、小台阶,再配合职业目标的指引,小步快跑,日有寸进。
第3章,探讨了开发者无法回避的发展方向——技术管理。从开发者到管理者,不是职位序列自然发展的结果,而是一种转型,且并不适合所有人,因此我们提供了一些工具和方法,让你自测一下,看看自己是否适合。如果你发现自己很想试试管理路线,可以接着看走向技术管理的4种常见方式,然后了解怎样为成为管理者做准备。从概率上讲,成为管理者后,可以通过团队实现更大的产出,也会因此赚到更多的钱,你的未来会有更多可能性。
第4章,讨论了技术管理新人面临的18种常见挑战,比如角色适应、委派任务、激励他人、冲突管理、一对一谈话等。如果你刚刚升任管理者,一定会碰见这些挑战,翻翻本章提到的应对策略,会对你有所帮助。
第5章,介绍了开发者在跳槽时常见的8个问题。比如什么时候跳槽好、依据什么跳槽、选大公司还是小公司、去北上广深等一线城市还是找个小地方享受生活等。这些问题会给你触动,引发你思考自己的选择。
第6章,讨论了如何针对匹配度来优化你的简历。最关键的要点有两个,一是一个岗位一份简历,二是分析目标职位的要求,针对要求呈现你的价值点。你能注意到这两点,就可以大大提升简历的通过率,为自己赢得机会。
第7章,如何在跳槽时获得想要的薪水,这恐怕是每个人都关心的话题。其实从你决定应聘这家公司职位的那一刻就开始涉及这一点了,核心要点是匹配度。所以,从简历优化到了解公司、产品、部门、职位,再到了解目标岗位薪酬区间,你都要围绕匹配度做准备。如何准备?这一章提供了流程、框架和方法。
第8章,转型,也许有一天,我们会离开软件,想要去做别的事情。那么你还适合做什么?想做什么?如果你“拔剑四顾心茫然”,可以看看这里的人、事、物模型和发现职业方向的5步法。只要你做好准备、花些精力,就可以找到适合自己的转型方向。这一章还讨论了转型时如何准备目标职业所需的知识、技能,并提供我和我的朋友们实践过的最佳方法:双职业策略。第1章如何选择技术方向
努力只有在方向正确时才有价值。
开发者选择技术也是如此。假如你阴阳差错选择了一门过时的技术或者在当地没什么单位使用的技术,你在找工作时就会不断受挫,即便你找到了工作,也会忧心自己的发展前景。
·你刚进入软件开发领域时,需要选择适合你和市场的技术才能更好地就业。
·你做了一两年技术工作,开始构建自己的技能树(知识图谱),需要选择与你现有技术相互补充、1+1>2的技术来学习和运用。
·你的技术能力慢慢在团队里凸显出来,成了先锋官,有新的项目、新的产品时,你总是被赋予探索技术方案的角色,可是一着不慎,你选择的技术就可能导致整个项目的失败。
·你使用C++语言做了5年开发工作,越来越觉得这门语言不适合自己,想要学习一种新技术作为自己以后的主要开发技术,很担心再选错——因为你做开发的黄金时间,加起来也不过三四个5年。
·你成为技术负责人或者研发经理,需要决定团队的技术图谱,需要为团队承接的新项目选择技术方案,要考虑哪些因素呢?
所有这些问题,我们都会在本章讨论,我们会找到选择技术方向时要考虑的各种因素,然后结合特定的场景,看看你在选择时需要考虑哪些因素。
通过本章的学习,作为个人,你会掌握怎么选择一个适合自己的技术方向,好的方向会让你越来越有竞争力,越来越值钱;作为团队的一员,你会知道在为某个项目选择技术时该如何综合考虑,在风险、成长、代价之间进行权衡。1.1 技术成长三阶段模型
为了更好地选择技术方向,我们先来介绍一个模型,我给它取了个名字,叫“技术成长三阶段”,如图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.2 选择技术方向都要考虑哪些因素
我们先来看看选择一种技术可能会考虑的因素,然后看看在每个选择时刻运用哪些因素。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.薪水高低
大多数人选择技术的出发点是工作和未来发展前景,而选择工作时一定会把薪水作为参考因素,而且是非常重要的因素。所以我们在选择技术时,也可以考虑某种技术对应职位的薪水高低。
要了解这一点,可以去看各种薪酬报告,如100offer每个季度都会有类似的报告出来,拉勾网也会发布互联网职场生态白皮书,你用“互联网人才流动报告”“开发者薪酬报告”或者“互联网薪资调查”为关键字搜索,能搜到很多这类报告。
通过报告,你可以看到使用不同语言的开发者的薪水差异。图1-2是我从100offer 2016年春季互联网高端人才流动报告中截取的。
从图1-2中可以看出不同编程语言所关联职位的平均年薪差异。5.技术在将来的发展前景
你肯定不愿意看到这种情况发生:选择了一门技术,结果1年后它就没人用、没市场了。所以我们在选择时就要考虑这一点,做一些判断。图1-2
选择技术时存在两种考虑:一种是选择稳定的、经典的技术,一种是卡位将来的市场缺口,选择将来可能需要用到的技术。
前者考虑的是林迪效应,即:对于不会自然消亡的事物,生命每增加一天,则可能意味着更长的预期寿命。
用林迪效应来看开发技术,一项技术存活的时间越久,其预期剩余寿命就越长。比如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++衔接这部分起到关键作用,从而具有特殊地位。1.3 入行时怎么选择技术方向
在做选择之前,应该先想想自己的目标,根据目标选择技术,是更理想、更靠谱的。
为了明确自己的求职目标,可以问问自己下面的问题:
·在哪个城市工作
·想在哪些行业、领域发展
·想去什么样的公司
·想做什么产品
当你能够勾画出工作目标的大概轮廓时,对应的技术方向就会浮现出来。
比如你特别喜欢使用蘑菇街或者美丽说买衣服,尤其喜欢商品展示页面,那么你的目标可以是到美丽联合集团做电商前端开发岗位……此时学前端开发对你来讲可能就是合适的选择。
比如你特别喜欢上海,又喜欢用爱奇艺看视频,对视频类产品很感兴趣,那么你的目标可以是到上海爱奇艺做视频产品开发……此时学习C++、FFmpeg等技术可能有助于你实现目标。
当你有目标时,学习会更有动力,效率也会更高。
一个公司是否选择你,取决于你本身和公司招聘需求的匹配度,而不是某个技术本身是热门还是冷门的。所以在初入行选择技术方向时,一定要先考虑你将来准备做什么(城市、行业、公司、产品),针对你的目标来选择技术。
当然你可能在想做开发时并没有明确的职业目标(你不孤单,大多数人都是如此),此时你考虑的是这些因素:
·就业机会
·薪水高低
·难易程度
·他人推荐
·兴趣
考虑就业机会,有热门、冷门两种策略。热门还是冷门,可以通过各种排行榜看出来,也可以通过在招聘网站挖掘相关职位信息来判断。
选择热门技术,比如Java、JavaScript、C++等,一定有很多机会,看起来你能接触到更多的公司、职位,这会在心理上给初入行的你一种安慰。但并不能说你找到合适工作的概率就很大,因为具体到每个职位,招募方都是选择和自己的需求更匹配的求职者。在这个前提下,因为竞争者众多,且其中有很多有经验的选手,用人单位有更大概率找到比你更匹配他们的需求的开发者,所以你作为初学者可能常常过不了简历关,或者过了简历关又过不了面试关,往往会面临更大的求职压力。
选择冷门技术,机会可能相对较少,但是竞争者也会比较少,而且机会相对确定。比如在西安,如果你以Qt来求职,那么常见的公司可能就有广联达、诺瓦电子、和利时、有智等公司。你可以仔细斟酌它们的招聘要求,运用心力打造自己的某个亮点,认真地准备简历、笔试、面试等环节,极有可能获得想要的工作。
从心理和统计意义上讲,当你没明确目标时,选择当地需求比较旺盛的技术来学习,是相对稳妥的。至于哪种技术需求量大,到智联、51job、猎聘、拉勾等网站,以地区、技术为条件来搜索职位,看结果多少,就能大概判断出来。
当你这样选择技术方向时,也能够降低他人推荐中携带的个人主观性对你最终选择的影响。
薪水高低这些信息,可以通过招聘网站、行业薪酬报告等来获得,后面我们在介绍工具时会讲到,在“如何在跳槽时获得想要的薪水”那一章会展开介绍。
要想知道自己能不能学会某种技术,最好去试试看、做做看。现在网上有很多免费的学习资源可以利用,我建议初入行的你,根据兴趣和他人的推荐,得到一个技术清单,每一种都摸索、感受一下,然后决定选择哪一种。
对开发者来讲,自主学习能力是非常重要的,这一关一定要过,这也是我建议读者先自己摸索学习的原因。当你自己学到了一些东西,想找人带或者加速的时候,可以寻找私教或者培训结构。
我了解到有这些资源:
·http://tutorialspoint.com,各种入门教程,基本上你能想到的语言和技术框架,这里都有。赞,图文为主,英文版。
·http://www.w3school.com.cn/,网站开发相关技术和教程,非常全。赞。
·慕课网(http://www.imooc.com),有很多免费的课程,Java、C、PHP、Python、Android都可以找到。
·网易云课堂(http://study.163.com),有很多免费课程。
·中国大学MOOC网(http://www.icourse163.org/),也有很多。
·http://codepad.org/,在线代码编辑与调试。
·http://ideone.com/,在线代码编辑与调试。
如果你选择的技术能够和你感兴趣的产品、服务关联起来,那么你学习时会更有动力。所以也请考虑这一点,从你感兴趣的产品、服务出发,找找看它们是使用什么技术实现的,整理出一个清单,帮助你去选择。1.4 构建技能树时选择技术方向
再来看一下成长阶段模型,如图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,就是互补原则的应用。这也是我们在做后台开发工作时的常见做法:静态语言做核心业务开发,动态语言负责编译流程、自动化部署、系统资源监控、日志分析、非核心业务处理、测试工具等工作。1.5 技术转型时的方向选择
做了几年开发工作之后,你很可能会面临技术转型。通常有两种情况:
·有新技术、新市场出现,你想试试
·你掌握的技术的应用场景萎缩,前景黯淡,你想跳出来
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.6 方案选型
当你构建了自己的知识图谱、能够胜任比较复杂的工作后,在团队中就会越来越重要,就有机会参与到新项目、新产品、新服务的方案选型中来。
做方案选型时,目标是得出现实可行、成本可接受的方案,需要综合考虑各种因素。1.某种技术适合解决某类问题
很多开发者容易犯“拿着一把锤子看什么都是钉子”的错误,用自己熟练的语言、技术来解决一切问题。比如我喜欢C++语言,就会琢磨怎么用C++语言来做Web服务器,甚至动态Web页面也要用C++来生成;我喜欢Qt,就曾认真考虑过用Qt来做APP,支持Android、iOS、Windows Mobile等平台。
这是典型的被技术塑造、束缚的案例。
实际上,很多技术都有它比较适合的应用场景,比如说Java天生就适合用来做企业应用、服务端应用;C语言离底层就是近,在自动化控制、系统底层、驱动、单片机等领域是无冕之王;R语言被广泛用在大数据分析上……
我们在为新产品、新服务、新项目选择技术方案时,一定要跳出自己已经掌握的技术,首先站在问题域去考虑,想想这个问题到底是什么、哪种技术更适合问题场景,这样才能选择好方向,后期开发、维护才会更顺利。2.新技术的成熟度
有的开发者喜欢新技术,什么新用什么,把公司的项目、产品当作新技术的试验田,而不考虑试错的代价。这对个人来讲固然可以积累经验,但对公司来讲,往往是一种灾难。
所以,我们在做技术方案选型时,一定要考虑这种技术有没有顶级公司支持、有没有知名产品。假如什么都没有,那么最好先不要用,或者先在非核心业务上应用。
举个例子,很多人都觉得Rust:
·比Go好
·比C++好
·比C好
·比××好
可是如果让你负责一个要求高并发的服务端应用,你会选择它吗?你能找到一个使用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.7 工具推荐
这里推荐一些工具或者方法,你可以使用它们来判断某种技术的状况,决定自己是否选择。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所示。
需要提请注意,Stack Overflow的统计结果受样本范围和数量影响很大,仅供参考。比如Rust最被热爱,并不代表它未来就可以获得大面积应用,也不代表它的生态很快就能完善,很快就会出现杀手级应用。2.TIOBE编程语言排行
TIOBE编程语言排行:https://www.tiobe.com/tiobe-index/。会有TOP 20编程语言及TOP 10的走势曲线。比如现在T0P 20语言,如图1-9所示。图1-8 (来自Stack Overflow)图1-9 (来自TIOBE网站)
看到了吧,很多人黑C#、黑C、黑C++,但是它们依然排在前几位!有时小圈子的热烈讨论会遮蔽事实的真相——新生的、非主流地位的语言更容易引起开发者的讨论,这些频繁的讨论,会让人误以为这些新语言很热、很火。
再看看TOP 10语言多年的走势曲线,如图1-10所示。图1-10 (来自TIOBE网站)3.技术热门度曲线
全球最大的IT咨询公司高德纳提出了一个“技术热门度曲线”模型,把一门技术的发展过程分为启动期、泡沫期、低谷期、爬升期和高原期5个阶段。https://stateofdev.com/这个网站根据高德纳的模型,做了各种开发技术的曲线(部分曲线的阶段划分和描述与高德纳的技术热门度曲线模型有所区别)。
机器学习框架的曲线,如图1-11所示。
可以看到,TensorFlow(Google)已经处于成熟期,OpenAI(诸多硅谷大亨联合建立,开源非盈利组织)在成长期,而Watson(IBM),正在被挑战,快要进入衰退期。那么如果我们要做出选择的话,可能会优先选择TensorFlow或者OpenAI来学习。图1-11 (来自stateofdev网站)
后端开发语言的技术热门度曲线,如图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章如何在技术上持续精进
作为开发者,工作2~3年后,往往会感到迷茫:能够使用一种或者几种技术解决一些问题了,却觉得自己停滞了,不知道接下来怎么办。于是我们有时羡慕做管理的,觉得他们轻松,地位高,赚钱多;有时又羡慕技术大咖,觉得他们能搞定别人搞不定的问题,像神一样会发光,可是回看我们自己,到底是接着做技术还是转管理呢?如果选择做技术,接下来该怎么精进?如果不做,又该怎么转型?这都是问题,每日煎熬着我们。
我有十几年的开发和管理经验,对于开发者的各种迷茫,深有体会。一般来看,开发者的迷茫分两个层面:
·方向上的迷茫,即自己到底是否适合做开发、是否要继续在开发的路上走下去。
·执行层的迷惑,即自己继续做开发,该怎么找目标、学点什么、学到什么程度、如何能持续精进。
本章就从这两方面来展开,先讲如何确认自己要继续做开发还是转管理,这部分会提供一些方法(比如工作的三种分类、成就感来源等),让大家能够自我觉知和判断;然后我们会沿着开发这条线继续前进,看看如何在技术上持续精进,这部分最重要的是对标管理法及其四种典型标杆;再接下来会讲怎样设定有效目标,找到下一步行动;最后,我们会介绍四个习惯,让精进成为你自身的一部分。
先给出本章的思维导图,方便对照阅读和快速抓取要点,如图2-1所示。图2-12.1 做开发还是转管理
我们的假设是:你已经走在软件开发的道路上了,做了一段时间软件开发,1~2年,或者3~5年,对接下来该继续做开发还是转向技术管理产生了困惑。
在此前提之下,有三种方法可以帮助你进行判断:
·工作的三种维度;
·成就感来源;
·未来的样子。1.工作的三种维度
根据交互对象不同,工作可分为三类:
·数据和信息处理;
·人际互动;
·事务型操作。
假如你发现自己更愿意围绕着人际交互来做事情,希望自己的工作中大部分时间都在和人打交道,那么你可能更适合做管理、销售、市场、客服、咨询师等方面的工作。
假如你发现自己更愿意做操作性的工作,比如修理电脑、组装电脑、搭建局域网、修理汽车等,那么软件开发工作可能不太适合你,运维或者网管也许和你更匹配。
假如你觉得信息很迷人,很享受与信息和数据之间这种确定性、一致性、可预期性较高的互动方式,也很享受通过组织、修改、整合、创造信息来解决问题这种工作方式,那么你现在正在做的开发工作,基本上和你的偏好是吻合的——因为开发者偏重于和数据、信息打交道,以信息和数据为输入,也以信息和数据为输出。2.成就感来源
2015年年底创业失败,我决定找一家单位上班。彼时我35岁,在很多人眼里这个年龄的程序员已经要被淘汰了。我面临的选择是:做开发还是做管理。
从2009年开始我就在做技术管理工作,这时比较传统的做法是,找一个研发经理的职位来做(当时有几个不错的机会),一来职业生涯有延续性,二来薪水也高。可是我后来选择了到全时云商务做开发工作,让很多朋友大跌眼镜。
我为什么这么选择?其中的关键点是:我觉得亲力亲为解决问题更有成就感。
回顾我多年的开发和管理经历,我发现在我写作《Qt Quick核心编程》时,在我一周7天不休息,加班加点重构智能机顶盒播放器时,感觉最为充实,最有意义。而在我做管理工作时,带领团队完成了某项任务,自己也没什么特别的感觉,即便有一些兴奋感和成就感,也很快会被委派任务、一对一谈话等事情淹没。
所以我思来想去,决定做回开发工作,这样我更能感受到意义和价值,更有成就感。
每个人的成就感来源都不一样,假如你像我一样,成就感在于自己动手解决具体的技术问题,那么开发工作就更适合你;假如“领导和管理别人、通过别人完成工作、看到别人成长”让你更有成就感,那么管理工作适合你。
实际上这一点和前面介绍的“工作的三种分类”是类似的。你越倾向于做人际互动类的事情,就越适合做管理工作,你越倾向于和数据、信息交互,就越适合做开发工作。
可以遵循下面的步骤寻找成就感来源:
·回顾你做过的事情,找出那些让你情感反应强烈的,记录下来。
·分析你的情绪底色,是快乐、高兴、振奋、愉悦、充实等积极情绪,还是沮丧、灰心、挫败、失落、空虚、失望等消极情绪。
·挑选出带给你强烈积极感受的事件,它们就是你的成就感事件。
·分析成就感事件,看看它们用到了什么知识、技能、软能力,看看在这些事件中,你印象深刻的交互对象是什么(数据、人、事务)。
可能有的朋友会说,即便有这4个步骤,也判断不出自己的成就感来自哪里,不怕,第8章——转型——还有更简洁的方法可以帮到你。3.未来的样子
问自己两个问题:
·一直做开发,我会变成什么样子?
·如果转向管理,我会变成什么样子?
在你的身边找比你大5岁、8岁、10岁的开发者,看看他们的工作状态、生活状态、个人风貌,是不是你想要的,或者反过来,是不是你讨厌的。
假如看到他们你觉得看到了自己的未来,这个未来你无论如何无法接受,那么,很可能软件开发并不是你的长久之道,你可能要考虑技术管理岗位。
那就在你的身边找管理者,看看直接上级,看看其他部门的经理,看看其他公司的管理者,找5个以上的人出来,观察、了解、搜集他们的工作状态、生活状态、个人风貌等方面的信息,看看这样的人是不是你想成为的,或者反过来,是不是你讨厌的。
假如你也很讨厌你能接触到的这些技术管理者,那么,可能这条路也不是你的长久之道。你的未来应该在别处。你可以考虑转型,那么请去看第8章的内容。2.2 找到激励你前进的动力
你之所以愿意做软件开发,一定是有原因和目标的。比如:
·它可以带给你丰厚的薪水和优裕的生活;
·它能让你成为自己想要的样子;
·它可以不断给你挑战;
·它让你有成就感;
·它能让你获得认可;
·它让你觉得自己有价值。
……
请问一问自己为什么要做软件开发,找到几个理由,记录下来。
它们会帮助你渡过后面会遇到的倦怠期。
进入软件开发领域后,你从对什么都好奇、积极学习,慢慢变成机械地完成领导分配的任务,3~5年后就可能会感到无聊、困惑、迷茫,丧失前进的动力,进入倦怠期。
这个时候,你对工作的态度是“差不多就算了”,干什么都没心思,开始思考朝九晚五打卡上班有何意义,整个人陷入“有事不想做、没事又无聊”的倦怠之中,更谈不上什么技术精进了。
这是一种危险的状态,要让自己走出来,有两个方向:
·为你的工作重新赋予意义。
·为你的工作引入变化。
具体可以像下面这么做,想想你之前记录的做开发的理由,问自己几个问题:
·这个理由是否还存在?
·为什么这个理由还在但是无法激励我了?是不够量化,不够可视化,还是太遥远?
·有哪些新的工作内容可以去尝试?
·有哪些新的职位可以去尝试?
·有哪些新的方法、工具可以提升开发效率?
·当下,软件开发对我的意义在哪里?
·三五年后,我会变成什么样子?
·我希望自己变成什么样子?
·该怎样才能变成我想要的样子?
做软件讲究迭代,讲究热更新,我们个人也是一样的,要不断自我探索和更新,找到技术在不同阶段对自己的不同意义,只有找到开发工作对个人的意义所在,你才可能有动力去精进。如果你觉得做不做开发、做好做坏无所谓,那么你铁定是无法持续精进的。2.3 学习型心态
所谓学习型心态,指的是:有主动学习的意识,时刻以学习的眼光和心态来看待发生在自己身上的事情。
举个例子,作为开发人员,你做完了一个功能,展示给领导看,结果他说你做出来的东西根本不是他们想要的,简直一无是处。这个时候,你会怎么办?
一个选择是怼回去,大家吵一架,然后不欢而散,甚至因此和领导不睦,最终觉得领导太没水平,此地无法发展,离职。
另一个选择是坐下来分析:
·哪里不对?该怎样调整才符合需求?
·这个“不对”是在何时被引入的?
·以后如何避免开发过程中的走样?
·沟通机制是否存在问题?如何改进?
后面这个选择就是积极主动的选择,是面向解决问题的,是学习型心态的开发者会采取的方式。他们会考虑自己怎样去改进、怎样能达成目标、通过这件事自己能收获什么。
作为软件开发人员,其实有很多提升自己的机会和方式,而最终你能不能提升,除了要看你是否有内在动力,还要看你是否拥有学习型心态。2.4 技术精进之道
做了各种铺垫,我们终于可以开始介绍精进的方法了。
对标管理法
在专业领域成长的一般模型如图2-2所示。图2-2
模型中有三个要素:
·现状
·目标
·执行计划
每个人都可以评估自己的现状,自己在做什么、用什么技术、技术达到了什么程度、拿多少薪水、是什么职级、是否被领导认可、与人协作是否顺畅……有很多维度,静下心来思考一下,在纸上列一列,就能得出自己当下的状态。
而目标则很可能随着旧目标的达成而消失,或者随着日复一日的编码、Debug、交付而褪色,或者随着每个月的薪水蒸发掉。一旦我们失去目标,就会陷入迷茫,被动工作,进而慢慢失去竞争力。
所以,要想日有寸进,必须要在日常的开发工作中找到努力的目标。这非常关键——很多人就是因为没有目标而放任自己随波逐流、被动工作,最终变得庸常而被组织淘汰。
因此我们引入原本用于企业的对标管理法,帮助自己在日常工作中找到贴合自己的目标。一旦我们找到目标,对比现状,就可以找到差距和前进方向,有了方向,就可以制定计划,稳步前进,获得提升。
图2-3是实践对标管理法指导个人成长的基本过程。图2-3
以下解释来自百度百科:
对标管理,由美国施乐公司于1979年首创,均将其视为现代西方发达国家企业管理活动中支持企业不断改进和获得竞争优势的最重要的管理方式之一,西方管理学界将对标管理与企业再造、战略联盟一起并称为20世纪90年代三大管理方法。
对标管理是指企业以行业内或行业外的一流企业作为标杆,从各个方面与标杆企业进行比较、分析、判断,通过学习他人的先进经验来改善自身的不足,从而赶超标杆企业,不断追求优秀业绩的良性循环过程。
所谓“对标”就是对比标杆找差距。推行对标管理,就是要把企业的目光紧紧盯住业界最好水平,明确自身与业界最佳的差距,从而指明工作的总体方向。
在针对个人运用对标管理法时,可以从4个方面来寻找标杆:
·优秀的人
·一般性规律
·技术本身的知识层次
·项目指标
接下来我们就从这4个方面展开,看看怎么寻找我们的目标。1.从优秀者身上找目标
我们身边一定有人在某方面做得比自己好,比如:
·张三的设计文档写得结构合理、条理清晰;
·李四的UML图表画得准确;
·王五对ES6标准掌握得好;
·赵六擅长做代码管理;
·钱七的架构设计能力超群,对产品的架构如数家珍;
·毛八每天上班前都会列出要完成的三件事,每天下班时都会总结;
·胡九学习新技术特别快,总是在项目组中担任技术预研角色。
……
别人做得好的方面,都可能是我们努力的方向。我们要用善于发现的眼睛,找到身边人的突出之处。
在向优秀者对标时,下面的问题清单可以帮助我们有序、系统地分析标杆:
·他在什么事情上做得突出?是怎么做到的?
·他有哪些知识、技能是我不具备的?
·他有哪些提升效率的工具?
·他有哪些好的工作习惯?
举个例子。
袁大每天都能准时下班,工作还完成得很好。你对这一点很感兴趣,就暗中观察他是如何做事的,发现他过一段时间就会翻看一下纸质笔记本,或者用笔在本子上记录点什么,还有,每天下班的时候,他都会在本子上写点东西。
于是你跟他聊天,发现他每天下班前都会在笔记本上记录今天完成了什么、遇到了什么问题、明天做什么。还了解到他每天都会早到半个小时左右,利用这段时间规划一天的工作。
后来你明白了,袁大培养了一个“早规划晚回顾”的工作习惯,通过这个习惯,保证每天都有几件重要的事可做,每天都有目标、有节奏,这样就可以不慌不忙地工作。
于是你就会思考:袁大的习惯是否可以成为我的习惯?
这个时候,你就找到了一个提升的方向:培养每日完成三件事的习惯。一旦你养成这个习惯,习惯的力量就会帮助你集腋成裘,完成从量变到质变的过程。
再举个例子。
你发现组里的袁二,排查Bug特别厉害,像一休哥一样,点点头沉思一下,就可以说出问题所在。即便是别人的代码引入的Bug,他也可以很快找到原因——只需要翻翻代码,和对方聊几句。
为什么袁二这么牛?
·你向他请教,发现他做到了以下几点:
·对业务特别熟悉,非常清楚某个业务到底是什么,用户在软件上怎么使用这个业务。
·对业务逻辑和代码的映射关系特别熟。
·爱看代码,所有人的代码他都看。
好了,正好你总是被Bug困扰,往往一个Bug能让你愁烦一个星期,这下是不是有努力方向了?2.一般性规律
所谓一般性规律,指的是那些通用的、可以指导我们在什么时候做什么事情的规律。
举个例子,舒伯的生涯发展阶段理论就是一般性规律,男大当婚女大当嫁也是一般性规律。
对于开发者来讲,要关注专业能力成长的一般性规律,即技术成长三阶段。如图2-4所示。
试读结束[说明:试读内容隐藏了图片]