程序员的成长课-读后感

程序员的成长课

第1章 如何选择技术方向

努力只有在方向正确时才有价值

1.1 技术成长三阶段模型

这个阶段最重要的就是提升专项能力,让自己能够迅速搞定一些别人安排给你的事情,体现出你的价值
这个阶段持续的时间长短因人而异,可能会是1~3年。如果超过3年还没有进入下一个阶段,那么你的成长速度就需要提升了。

进入这个阶段非常重要的一种标志就是,你遇到问题,不再从下而上去思考(即从技术实现细节来考虑问题好不好实现、拿技术去裁剪问题或重定义问题),而是从实现细节跳脱出来,站到更高的层面,自顶向下去思考、去分析,先运用框架、逻辑去分析真正的问题是什么、问题的目的、问题的现状、如何去解决。搞明白这些之后,你才会沉降到技术层面去考虑实现的选择,而且实现时,你也不会拘泥于某种技术,而是什么技术合适就用什么技术(你的目的不是“用Java或Redis解决问题”,而是“解决问题”)。简单说,就是你走出了被技术束缚和塑造的过程(前两个阶段),可以反过来回到问题本源来思考了。

1.2 选择技术方向都要考虑哪些因素

林迪效应,即:对于不会自然消亡的事物,生命每增加一天,则可能意味着更长的预期寿命。

1.5 技术转型时的方向选择

这个时候卡位市场缺口,学习将来稀缺的新技术是非常不错的选择。而且在这个阶段,也必须积极主动去探索,最好每年给自己定一个学习某种新技术的目标,在工作之 外完成它

2.3 学习型心态

所谓学习型心态,指的是:有主动学习的意识,时刻以学习的眼光和心态来看待发生在自己身上的事情。

2.4 技术精进之道

别人做得好的方面,都可能是我们努力的方向。我们要用善于发现的眼睛,找到身边人的突出之处。

下面给出一些经过验证切实有效的提升策略,你可以拿来直接用。

  • 尝试用同一技术的不同模块或API来实现,能让你更了解所用技术。
  • 看看你正在用的技术,想想你处在三个层次的哪一层,找到继续提升的空间,去学习、实践。持续这么做,能让你从泛泛的了解、基础的使用,进阶到熟悉、精通。
  • 了解和当前所用技术相关的技术,可以拓展你的知识图谱。
  • 尝试用不同的技术来实现,能加深对问题的理解,也能淬炼新的技术。
  • 看看别人用的技术点、技术栈,尝试了解,能拓宽你的视野。
  • 看看同一项目内他人的设计和代码,有助于理解整个项目。
  • 尝试新的设计,能加深对问题的理解,更能锻炼自己的架构和设计能力。
  • 看看整个项目的需求、设计文档。不要局限于自己负责的模块,这样可以提升全局观和系统观。
  • 迭代式重构老代码,迭代式重构可以解决时间不够用的问题。
  • 阅读优秀源码,看到好的,思考好在哪里,琢磨自己怎么做到,这样你就会日有寸进,终至千里。
  • 参与开源项目,参与开源项目比阅读开源代码的要求高得多,你要能够理解已有的代码,找到你可以做贡献的地方(issue、feature 等),你的代码要符合该项目的规范,还会被项目owner或其他成员Review,这些都是非常大的挑战,能让你快速成长。
  • 写作技术博客,有利于写作、逻辑思考、讲授、设计等能力的提升,也有利于系统化你的知识。最好的学习方式是输出。
  • 讲给别人听,锻炼讲授、演讲、沟通、归纳总结、逻辑思考等能力,对知识的内化与系统化也很有帮助。当你能够把一个知识点讲到别人也能听明白时,你就是真明白了。
  • 与优秀的人和团队在一起,镜像神经元会让你自动学习优秀者的做事方式,所谓“见贤而思齐焉”。

2.5 目标的设定与执行

小强升职记,一书中介绍了撰写下一步行动的4个秘诀:
·动词开头。一个好的行动应该是以动词开头的,比如“打电话给某某”“准备会议资料”“回复E-mail”等,以动词开头才能保证它具备可执行性。
·内容清晰。比如“准备会议资料”,虽然是动词开头,但是描述得不是很清晰,“需要准备哪些资料”“几点开会”“会议上要提出什么问题”,这些都需要进一步落实。所以说这样的下一步行动是失败的。
·描述结果。在任务开始之前对想要的结果进行描述,描述得越清晰,产生的能量就越大。比如这样:“早晨9点带着做好的计划书在1号会议室讨论营销计划,说服与会者认同我的营销方案。”
·设定开始时间、周期、最后期限。在设定了这三个和时间有关的属性之后,就可以更合理地安排自己的时间,把握行动的进度,照顾别人的时间。

当你能从目标分解出能够立刻开始的下一步行动序列(最少三个)后,就可以做起来了。做完一个,分解新的下一步行动,加入到行动序列中,然后开始新的下一步行动。这样跑起来,你的目标就会稳步实现。

2.6 精进的4个习惯

  • 每天晚上下班时记录完成了什么、遇到了什么问题、明天准备做什么。记录在纸质的笔记本上。
  • 每天早上正式开始工作前,审视昨天记录的内容,决定今天要做哪几件事(最好不要超过三件),今天就聚焦在这些事情上。

非常简单,但是好用。坚持这么做,你的工作就会越来越高效、轻松。最重要的是,你会知道自己每天都有成就,不会感到焦虑和恐慌。

所谓复盘,就是在头脑中对过去所做的事情重新“过”一遍。它通过对过去的思维和行为进行回顾、反思和探究,实现能力的提升。

很多开发者忙于做项目,往往是赶工、交付、开始新项目,很少去思考做过的项目做得怎么样,什么好什么坏,原因在哪里,怎么改进和提升,陷入马不停蹄做项目、一年经验用十年的怪圈,多年之后才发现自己的经验对不起工作的年限。

2.7 习惯养成指南

只要你能做到以下5点,习惯培养就会容易很多:
·找到内在驱动力。
·降低改变的难度。
·让改变可视化。
·奖励。
·允许例外。

要想让一个习惯真正在自己身上落实,这个习惯必须是由你发自内心的渴望驱动的,只有你从自身出发,由衷地想要去做,你才可能养成这个习惯。

我们养成一个习惯,目的并不是追求这个习惯本身100%准确,而是利用习惯的力量,让我们的工作像自动化脚本一样高效执行

2.8 超越技术层面的核心竞争力

所以,当你学习使用某一技术时,着眼点应该放在如何运用它来解决问题,如何在解决问题中淬炼自己的应用流程。这才是打造核心竞争力的正确姿势

决定程序员是否具有优势的,是应用流程方面的能力,即逻辑能力、思维能力、想象力、架构设计、解决问题的框架、快速学习、自我管理、创新与创造等。

3.1 真的要做管理吗

老陆对技术管理工作有清晰的认识,从事技术管理工作,能够带领团队完成更大的目标,做出更好的产品,它需要你慢慢放弃对技术执行层面成就感的追求,转而把自己当作催化剂,来激发别人的潜能,让团队发挥最大的效力。

3.3 理解管理角色

管理者通过他人完成工作。这是管理者的定义。
管理者有两大任务:
·完成工作目标
·培养下属

即便你有点内倾,依然可以尝试去做管理者

因为管理者不是天生的,是可以培养的,管理和沟通,都是技能,技能都是可以习得的。只要你掌握一定的方法,通过练习,一定能胜任管理岗位的工作。

从表现上看,优秀管理者应当做到这几点:
·下属可以各尽所能,都能得到成长,个人目标可以在实现团队目标的过程中得以实现。
·下属信任你,愿意跟着你干。
·实现团队目标。
·上司信赖你,愿意把团队交给你管,愿意把复杂的事情交给你的团队去做。

这4点中没有一点是轻轻松松就可以做到的。你看到某个管理者轻松,他要么没做到这几点,要么是把自己的努力、用心、辛苦包裹了起来,故意表现出举重若轻的样子。

《代码之道》中说:“成为一名优秀的管理者,所有你要做的就是确保你的人能够工作,并且把他们当人(而不是资源)去对待。”

这话之所以被强调,其实是因为:关注人,真正做到关注某个人、关心某个人,真的是非常艰难的事情。

我们挑几种重要但作为执行者的程序员又不太具备的能力来展开描述一下。
1)共情

领导者不能把人当作完成任务的机器,一定要尊重下属,把下属作为活生生的、独特的个体来看待

作为一个鲜活的个体,他有倏忽来去的情绪,有自己的想法和看法,有自己喜欢与讨厌的东西,有特定的家庭环境,所有这些,会让他和你不一样,和你预期的不一样。他一定不是你期望的那个样子,总会有这方面或者那方面和你的想法不一致,这些不一致,一定会体现到工作中来。

所谓共情,是指一种能进入到对方内心世界并体验对方内心感受的能力,然后将对对方感受的理解用自己的言语表达出来,使对方感受到被理解、被接纳。共情是从对方的角度,而不是从自身的参照体系出发去理解对方的能力。

简单说,共情就是换双鞋子走路,你要时常穿着下属的鞋子走走看,这样你就能体会到他的想法、问题和难处,就能理解他为什么最近工作消极效率低下,为什么三不五时要请假,为什么早上老迟到,为什么不按照你说的方法去做事……

职场上很少存在非黑即白的情景,也很少有人能只凭逻辑正确和就事论事就把工作做好,相反,每个人都是情绪化的,往往只有情感才能让一个人自发自愿做事情。而要撬动情感的力量,共情,就是一种必需的基础技能,有它的加持,工作才能越做越顺。

2)委派任务

分配任务时,遵循两方面的原则:既要让某位成员做其擅长的,还要给他一些超出能力范围的、带些挑战的;既要给某位成员他愿意做的任务,也要给他一些他可能不是特别乐意做的任务。

3)目标统合

4)反馈

当员工为了上线新版本通宵加班时,哪怕出了问题上线失败,也要适时地表达感谢,抚慰其情绪。当员工出色地完成了工作之后,一定要慷慨地表扬,肯定其做得出色的部分。当员工把事情做砸之后,一定要就事论事,不要评判其人品,要和他一起找到改善的方法,让他知道怎样提升自己。

假如你只想享受权力和回报而不愿承担责任,那么你就不配做一个管理者——承担责任和压力是管理者的基本要求。

3.4 走向技术管理的4种方式

当你找准定位、决定要向技术管理转型时,必须考虑一个问题:怎样才能从开发岗位走到管理岗位?

通常来讲,有4种路线:
·技而优则管。
·从打杂到管理。
·从大公司跳入小公司。
·获取PMP证书,切换到有需要的环境。

在这个模型中,要特别提醒一点:营销展示。因为很多人还秉持着这样一种观点:只要我认真、努力地工作,总有一天领导会发现我,给我想要的机会。但实际上,除非你的优秀超出别人10倍,否则别人很难主动跑过来发现你的特别之处并把机会送给你。

所以我们不但要有效工作,做出成绩,还要展示成绩给别人看。

3.5 怎样为成为管理者做准备

要成为有准备的人,关键就在于:你还没负责某事时,就做好了相关的方案;你还不是某个角色时,就准备了它所需要的能力。

一个人的能力其实分为两个层面:知识和技能。
所谓知识,就是你知道的、能引发你改变的信息。
举个例子,C++的虚函数就是知识,你学会了虚函数,就学到了这个知识。
所谓技能,就是你运用知识解决实际问题的能力。

延伸虚函数的例子,你能运用虚函数的原理,设计出一个接口,对线段、三角形、正方形、矩形、椭圆形、五角星等形状进行抽象,实现2D绘图,最终完成一个流程图软件的制作,这就是技能。

要为技术管理者做准备,可以从知识和技能两方面着手。
首先,你要储备管理知识,这一点可以通过阅读来完成。其次,你要想办法实践你学到的知识,把各种管理知识内化为你的技能

学习管理知识,最便捷有效的方法是阅读。
在阅读时,可以先学习纲要,再学习专项。

比如沟通和说话方面,看《所谓情商高就是会说话》《关键对话》和《内向者沟通圣经》;比如委派任务方面,看《交办的技术:职场晋升第一课》和《别让猴子跳回背上》;比如带人方面,看《带人的技术:不会带人你就自己做到死》;比如目标管理方面,可以看《目标管理实务手册》;比如辅导能力方面,可以看《高绩效教练》;比如演讲、表达方面,看《高效演讲》《金字塔原理》及《演讲的力量》;比如感染力和影响力方面,看《影响力》《横向领导力》《你的团队需要一个会讲故事的人:用故事思维解决问题》和《认同感:用故事包装事实的艺术》;比如时间管理方面,看《小强升职记》和《搞定》;比如高效工作方面,看《高效能人士的七个习惯》和《做事的常识:事情一来,马上就知道怎么做》……

当你储备了技术管理所需的知识之后,就要努力去发现工作中管理相关的机会,去应用你所学到的知识,把这些知识慢慢地变成你的技能。

要在工作中发现管理相关的机会,关键在于你要跳出工作内容和岗位职责的范围,放眼全局来思考。

在工作中,在还未成为管理者之前培养相关能力,有4种策略。
1.站在项目管理角度看问题

站在项目管理角度看问题,琢磨现在的项目是怎么管理的,有哪些问题,怎么改善。给自己定一个目标,争取每天挑出一个问题来琢磨解决之道。

2.主动承担职责外的杂事儿
主动承担与组织、协调、沟通、管理相关的事情,比如组织会议、跟踪计划、分派任务、推动多干系人协作等。

3.设想你是技术管理角色

站在管理者的角度思考,向身边的管理者学习,复盘身边的管理者,看他们哪里做得好、怎么借鉴,哪里做得不好、怎么改进,设想如果自己是管理者会怎么做

4.找一位职业楷模

假如你想成功地走向技术管理岗位,自己学、自己琢磨是一方面,另外还有一个非常重要的提升途径:在组织内找一个从事技术管理岗位的人作为自己的职业楷模

不论是在工作中还是在生活中,只要你记得自己的目标,就可以发现很多练习的机会,只要你主动把握每一个机会来练习、提升,你就能慢慢地为成为技术管理者做好准备。
在准备的过程中,有两点非常关键:
·用心发现那些衔接不同环节的、需要有人组织协调的工作。
·站出来,主动承担责任。

4.1 挑战1:角色转变

当你作为开发者时,是个人贡献者,管理好自我即可,你有过硬的专业技能和到位的职业意识,可以积极追求并实现个人的高绩效。但你一旦成了技术管理者,角色就变了,除管理自我之外,你还要管理他人。你的工作是通过他人完成的,一定要重视管理工作,而不是凡事亲力亲为(不管出自什么原因)。

团队更需要你做规划,定目标,跟踪计划,协调资源,他人更需要你辅导而非代替他们做事情,甚至你告诉他们怎么做他们也会厌烦——因为每一个合格的开发者都希望自己搞明白怎么做,都希望自己搞定而不是成为你的某一只手,时刻被你控制。你也许更擅长发现并解决问题,你看着他们找不到方向会难以克制替他们解决的冲动,但你依然应该袖手旁观,让下属自己搞定——顶多给予指导。这样他们才能成长。

谨记,一定要把更多的精力放在人、流程、项目上,你的工作是保障别人的工作能够顺利开展,是创建一个可以让大家各尽所能、实现团队目标和个人成长的环境。

4.4 挑战4:委派任务

·你不必也不能让所有人满意,只要让大多数人满意即可

4.6 挑战6:资源管理

开发者的时间,也需要好好管理。这方面需要提醒几点:
·不要把开发者的时间排满,到70%就可以了。
·安排工作时不要把加班时间计算在内。
·要遵循串行工作的原则,不要给一个开发者同时安排多个任务。

5.4 跳槽还是卧槽

跳槽的一个关键属性:不确定性。无论你权衡多少因素,都无法保证这次跳槽一定比上一次好。

所以跳槽时一定要优先考虑某个机会是否有助于实现自己的中长期目标,这样才能大概率地做出有价值的选择,避免越跳越糟,越回首越后悔。

持续性积累非常重要。不管是跳槽还是卧槽,我们都要以自己能否在某个方向建立积累为原则。符合你职业目标的跳槽,能持续为你在某个方向带来积累,能让你的职业生涯更上一个台阶,就是好的选择

5.5 要不要追薪式跳槽

最理想的跳槽是:既符合职业发展方向,薪水又高。

我们看一个Offer,不仅要关注薪水数字,更要关注:它能提供给我们什么发展空间和成长机会。

在有发展的前提下考虑薪水,这是我们跳槽时要遵循的原则。

5.6 选大公司还是小公司

假如你很难确认自己想要什么,但又必须做出选择,考虑到“从大公司进入小公司容易,从小公司进入大公司比较难”这种现状,那就选择大公司,去享受它的各种好处。这样当你发现了自己的职业目标或者厌倦了大公司,需要离开时,这段经历也可以为你的履历增色。

7.4 薪资谈判的6个秘密

绝不要主动谈论薪水,除非他们问你

有的公司只想找能干活、要钱少的员工,一上来就问你期望的薪水,你可以回答:
“我想在你们决定录用我时讨论薪水会更合适。”
“我很愿意回答,但我想先了解一下,这个工作都需要做什么。”
“我期望的薪水是30000元50000元/月”或者“我期望的薪水是30万元50万元/年”,注意要给一个范围,不要给固定数字

5.千万别先提数字
先提薪资数字的人,往往会输
如果对方让你先提数字,你可以这样回答:“你们对这个职位的薪水一定是有所考虑的,我想先听听那个数字。”

如果对方执意让你说,就说一个范围(这时此前的调查工作就有用了),这个范围要夹住他们的薪水范围上限,类似于图7-8所示的这样。

注意,要事先琢磨一下你最看重哪个福利,比如公积金、医疗保险和年假。如果你什么都一板一眼地去抠,有可能给对方留下负面印象。

7.5 什么时候可以降薪求职

强烈建议你在跳槽之前,梳理出自己最看重的几个点,像上面那样排排序,优先级最高的放在第1位。

7.6 薪水与幸福成正比吗

金钱在你贫穷(所谓贫穷,指的是你为了买一件生活必需品而必须舍弃另一件这种状态)时会带来比较直接的幸福感,而一旦你的生活离开了贫穷状态,金钱的增加可能会降低幸福感——因为你为获得更多的金钱而牺牲了更多东西,比如时间、兴趣爱好、陪伴家人和朋友。

8.2 程序员转型的难处

关键是要有一种学习型心态,要能够归零、空杯,要相信一切皆有可能

如果你一直将焦点放在专项能力的淬炼上,忽略沟通、协调、管理、讲授、分析等通用能力,久而久之,你就会发现自己在工作上很难再有大的突破,会陷入“明明我技术很厉害可是却无法获得与其匹配的工作成果”这种怪圈。
这往往是因为你忽略了一点:所有问题,最终都是人的问题。

而要解决人和人之间的问题,专项技术能力很难派上用场,你必须得综合运用你的各种通用能力,才能给自己打造一个和谐的工作环境。有了和谐的工作环境,你才可能用你的专业能力来解决问题。

你的价值来源于你能做什么事情、能解决什么问题,你是因为做了什么事情而成为了你,而不是别人的评价——那是后发的,是你做了事情之后他们才走的马后炮。

所以,Go your own way; let others talk!

同样的行为产生同样的结果,这是软件开发中的一致性。这种一致性,在人身上也是一样的。你一直做一件事情,就一直会得到同一个结果。你一直做,反复做,做到轻车熟路,还一直做,还是那个结果,你不愿意尝试其他的事情,那么你就不会有大的变化,就会一直在老路上徘徊,很难有新的发展

要想让工作和生活走出枯井无波的状态,就要引入一些变化,承受这些变化发生过程中伴生的不确定性。你不断给自己尝试的机会,就能不断拓展自己的认知和能力边界,就能不断发现自我,就极有可能找到自己的天赋,发展出新的事业。

8.5 如何确认哪个职业适合你

问自己一个问题:在职业上,最看重的因素是什么?
注意,只选一个因素。当你只用一个要素来选择职业时,选择就变成了判断,Yes or No,就很简单了。
这一点,我特别喜欢《反脆弱》中的观点:

如果你做某事的理由超过一个,那就不要做。这并不意味着一个原因比两个原因更好,只是说,通过努力想出一个以上的原因,你实际上正在试图说服自己做一些事情。显而易见的决定(在错误面前是强韧的)不需要一个以上的原因。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kaihuishang666/article/details/107947826