引子
儒、释(佛)、道三家思想:
释(佛家):处理好人与心的关系,我们要战胜自己;
儒(儒家):处理好人与人的关系,我们要团结好他人;
道(道家):处理好人与自然的关系,我们应该顺势而为。
明人陆绍珩《醉古堂剑扫》自叙有云:
一愿识尽人间好人,
二愿读尽世间好书,
三愿看尽世间好山水。
或曰:静则安能,但身到处,莫放过耳。旨哉言乎!
余性懒,逢世一切炎热争逐之场,了不关情。
惟是高山流水,任意所如,遇翠丛紫莽,竹林芳径,偕二三知己,抱膝长啸,欣然忘归。
加以名姝凝盻,素月入怀,
轻讴缓板,远韵孤箫,
青山送黛,小鸟兴歌,
侪侣忘机,茗酒随设,
余心最欢,乐不可极。
若乃闭关却扫,图史杂陈,
古人相对,百城坐列,
几榻之余,绝不闻户外事。则又如桃源人,尚不识汉世,又安论魏晋哉?此其乐,更未易一二为俗人言也。
又云:宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒。
其实就是讲内心修炼到了一种心境平和,淡泊自然的境界。
技术人成长的悖论
在程序员界有一个悖论持续在困惑着很多技术人:
1、在写代码的人的困惑是一直写代码是不是会丧失竞争力,会不会被后面年轻的更能加班写代码的人汰换。典型代表就是工作5年左右的核心技术骨干,此时正处于编码正嗨但也开始着手规划下一个职业发展阶段的时候。
2、没在写代码的人困惑是我长时间不写代码(或者代码量较少)我的技术功底是不是在退化,我在市场上还会有竞争力吗,我的发展空间是不是被限制住了。典型代表就是带业务项目的架构师或者团队Team Leader,他们更多的精力是在业务需求理解和拆分,团队事务的管理上。
这种“内卷”现象非常严重,也是技术人在职业发展过程中必定会面临的困境。
但要回答清楚这个问题,其根源不在于是写不写代码或者代码量的多少,其本质还是要回到什么叫技术能力以及如何提升技术能力这个根节点上来。我把我的一些观察和思考总结下来,供大家参考。
技术能力是什么?
技术能力本质就是解决问题的能力。
在编程领域,就是对遇到的业务问题进行抽象、提炼以及逻辑的构建,通过研发工具以提升解决问题的效能,降低人工低效的重复工作。
提升技术能力的方法:寻找成长的源动力;常态化的总结与反思;实用技巧(写文章)以写代想,以想促讲,以讲验真。
程序员日常工作:重复琐碎类工作;抽象复杂类工作。
重复琐碎类工作的不同做法
第一种:就事论事,把这个问题回答了结束。到这个程度你只是解决了一个具体的问题。很可惜我们很多技术同学都是处于这个层次。
第二种:解答完这个问题后即整理成文档,把排查步骤写清楚,提升自己和同组人的工作效率。到这个程度说明你看到并解决了内部效率问题。
第三种:将此排查问题的方法和逻辑固化为小工具给到咨询的同学去用,让他以后可以自助排查解决,这样既解决了别人的问题也彻底释放了自己和同组人的效能。到这个程度说明你重新定义了效能问题并找到更好提效的办法。
第四种:将此问题背后根因找到,从业务原理或者产品功能上去找解法。将技术工具抽象为业务功能的完善。到这个程度说明你已经从单纯的技术提效看到了架构合理性问题,并尝试在业务上寻求彻底根治的办法。
抽象复杂类工作的不同做法
第一种:找到抱怨的同学,问一问具体的问题是什么,然后针对性解决。
第二种:更加广泛收集问题,然后列出来表格,归类分析并安排负责人跟进解决,最后定期跟踪进度。
第三种:深入分析表格的中的问题并对问题进行抽象,从架构调优和产品功能的角度去寻找原因,并寻找解决这些问题带来的业务价值,并确定目标拆解路径,最后按照任务推进和跟踪进展。
第四种:从更全局角度去思考此目标与年度目标的关系,与组织发展的关系,思考如何扩大此事的效益,思考如何通过这些事的解决锻炼和培养团队同学。
成长的维度
技术能力层次模型
通过上面两类日常工作的分析,我们很明显可以看到有技术能力的做法特征是能够通过现象看到本质,并能够通过对问题的抽象归纳进行技术架构层调优以解决同类问题。
因此我对技术能力的定义是:技术能力是一种以解决某种问题为目标的思路、方法与执行手段,其本质就是解决问题的能力。在编程领域,就是对遇到的业务问题进行抽象、提炼以及逻辑的构建,通过研发工具以提升解决问题的效能,减低人工低效的重复工作。
如果用技术能力这个定义的方法论对“什么是技术能力”进行剖析,我提炼了一些模型来表达。
这个能力模型按照逐步境界阶段分为了三层:
术:硬核技术能力
术这个层面其实更多是硬核技术能力,基本上就是技术的基础功底(如计算机基础,分布式技术,质量意识等)。虽然这个归为是基础类,但这也是技术人的立身之本。工作3-5年的同学基本上都还是处于这个阶段,即需要大量的练习使得自己的技能非常娴熟。
处在这个阶段最重要的就是需要有技术好奇心,要有技术的专研力,通过时间的磨炼持久去学习去练习,使得自己能够成为团队的核心骨干力量。
法:技术架构能力
法这个层面其实更多的是技术架构能力,即通过现象看透本质,通过模型、原则来表达本质以解决抽象复杂类问题。这是一种高阶的技术架构思维,基本上5-10年的同学会处在这个阶段。这个阶段更多强调问题发现,问题定义,问题分析,问题解决的能力。
处在这个阶段是需要很强大的认知能力提升,这里必备的素质就是皮实和包容,要容得下不同的观点也要禁得起各种挑战。但这个阶段也有很大的误区,即非常容易被简化为就是要学习很多方法论或者套路。
道:技术领导力
道这个层面其实更多的是技术领导力,即通过技术影响力去寻找愿景和目标,带领组织拿取结战略结果。在这个阶段我们要基于深厚的技术架构能力和技术硬核能力。通过技术思维去解决超越纯技术领域的问题,一般来说10+年的同学会遇到这类问题。这个阶段的成长也会更多面临人的底层素质能力升级,需要更多靠领悟而不是纯粹的训练和问题驱动的思考。这个阶段其实也有很大的误区,即很多人只学到了表面功夫而没有深得要领,纯粹就变成是对己就是自我修养的提升,对别人就是PUA。
如何提升技术能力
随着把技术能力层次模型定义出来,其实如何提升也有了一定指南。后续有机会可以分章节来论述这个技术能力的提升过程。但产出详细章节的实践论述前,还有一篇“内功心法”可以分享给大家:
寻找成长的源动力
大家往往对这个问题不以为意,觉得成长是每个人都想要的,但是大家没有仔细琢磨过促进你成长的到底是什么:是你自驱想要享受这个练、思、悟的过程 还是 因为渴望得到周边人的认可/反馈/评价。这两者在你顺利的时候可能没什么感觉,但当你面对晋升失败,项目不利等挫折的时候就会有非常大的差异。
如果你能够找到自己成长的源动力,那么在遇到真正的困难和迷茫时候才能够摆正好自己的心态,寻找突破口,让自己走出困境,得到长足的成长。
常态化的总结与反思
不管是编码类的技术基础学习成长,还是相对抽象的问题解决,还是技术领导力成长。只要是成长,只要能够抓住这两个关键就一定能够成功。
第一个就是反思,能够敏锐地反思自己的不足,然后不断去修正自己的心态和行为让自己蜕变。
第二个就是总结,总结的过程是不断梳理自己的过程,把自己迷迷糊糊,是是而非的东西分类归类,而且总结越多就能够用好时间的复利,就能够越促进成长。
找到了源动力就解决了底层动机问题,通过总结和反思是能够利用上时间的复利,通过这两样心法就能够使得自己成为一个能够不断丰富完善自己的人,达到这样的状态必定能够成为技术强人。
实用技巧
要做到常态化的总结与反思,最简单的技巧就是写文章,通过文字的整理可以让自己的思考更加成熟,想得更加成熟以后自然而然对外就能够讲得更加清楚,能够对外讲清楚就能够更好分享交流才能够真正去校正自己的想法是不是正确。所以我提了,以写代想,以想促讲,以讲验真的 实用技巧。
程序员的理性与感性活动:程序员的自我修养
理性与感性活动
- 梳理和熟悉业务。需要方法和细心。请教、询问、交谈、文档阅读、代码阅读和语义还原、思维导图、文档写作。先找人,再读文档,最后理解代码。
- 新功能设计和编程:原则与方法指导、结构化建模与逻辑推理、经验复用、方案评审,构造完整的数据和流程,仔细自测。
- 改动与影响评估:逻辑推理与工程思维,理性和细心。遍历所有相关业务关联性,方案评审、反馈风险。
- 功能和质量优化:理性与工具。发现、测量、定位“问题”区域、制定和评审可行方案、实现方案、功能与质量测试、回归测试。
- 沟通协作:理性与感性并重。说理表达要条理清晰,交谈要心平气和,照顾对方感受。
- 任务评估:理性为主。细化和分解任务到能力范围内,记录用时,统计与评估,参考以往经验,考虑 buffer 。
- 表达写作:清晰条理、通俗易懂地阐述和传达设计和见解。
- 排查和解决问题:专业知识、观察力、经验、直觉、快速而合理的决断和行动、对异常数字敏感。
- 项目管理:理性与感性并重。理性方面,任务评估合理,定期关注进度,尽早评估和反馈风险;感性方面,激励和推动,照顾成员感受。
- 团队管理:理性与感性并重。理性方面,能识人德才和分配任务,关注进展;感性方面,照顾成员感受,关注成员状态。
- 客户支持:理性与感性并重。扎实过硬的专业知识和技能、有礼有据的表达与沟通、机敏应变能力。
- 年度规划。环境观察、评估和预测变化、规划能力和事项。
- 关注和参与公司活动。主要是感性。乐趣、体验。
与系统和人打交道
与系统打交道,主要靠理性;
与人打交道,七分理性三分感性。
宏观与微观层面
宏观方面:工作规划、系统设计、业务梳理、项目与团队管理。
微观方面:编程与设计、沟通协作、排查解决问题、优化与评估、支持与活动。
关于影响力
一般理解的影响力应该包括以下几个方面:
- 存在感:你的意见别人会认真听。
- 说服力:当别人和你意见不同的时候,能有效地让对方真的明白你的出发点,虽然不一定百分之百地采纳,但会认可你的观点。
- 谈判力:双方共同完成一个项目,让职责划分尽可能公平,对双方都有利。
- 协调力:多方合作的时候,你能起到桥梁的作用,促进多方更好地沟通。
- 鼓舞力:也就是我们平时说的灌鸡汤、打鸡血的能力。
那么作为技术人,建立个人影响力就可以从以上5点入手:
我先说存在感。如何让别人能够认真听取你的意见呢?换位思考一下,如果别人发现,每次你给出的意见都会让事情变得顺利,或者避开了一些可能会栽进去的坑,那他一定会变得更尊重你的看法。
我的建议是:不要在一些可有可无的事情上纠缠,非让别人尊重你的意见。
再说一下说服力。说服别人之前,要尽可能保证自己观点清晰,条理清楚。
谈判力取决于你的知识、智慧、经验和直觉。
我们再来说说协调力。培养多方协调的能力,需要从平时做起。工作中你需要和经常一起合作的人保持良好关系和顺畅沟通,学会成为团队里“让事情发生的人”,搞清楚各组人员之间的相关性,项目进度之间的依赖性等。
最后说说鼓舞人的能力。如果你是一个技术领导者,就应该培养自己“振臂一呼,应者云集”的能力,这是技术领导力的体现之一。
那么,如何去鼓舞人呢?当众演说能力当然很重要,不过我在这里要强调的是对个人的鼓舞。
总结一下:
建立个人的影响力并不是为了凸显你自己有多重要,或者让别人更加认可你,而是通过影响力把事情做成。
在一个技术团队里,影响力很多时候与你的贡献紧密相关。如果你的存在能够让别人的工作更好地推进,让别人更容易取得成就,久而久之,伙伴们就会很自然地认可你,信服你,有问题的时候,也会想到要咨询你的意见。帮助别人成功,帮助别人成就梦想,你就会具备积极正向的影响力。
程序员的技能素养
素养可以理解为基本素质,会左右你的技术高度。就像一个道德高尚的人,很大的概率是不会犯罪的。同理具备基本的技术素养的人,具备成长为一个优秀的技术人。
不教条
自驱力、学习力
勇气
结构化思维
批判性思维
不教条
在软件领域,没有任何技术和框架是银弹,也没有程序设计原则是适合所有的场景,还有代码规范。本意是约定最佳实践,提升协作效率和代码质量,但有些场景却有违背初衷。不要为了DDD而DDD,也不要为了微服务而微服务,单体应用也有它存在的价值和适合场景。
尤其是职场菜鸟,更不要教条,但这往往很难,就像做菜一样,所有的大师傅都说少许盐,往往学习的人根本不知道多少,只有做的多了,才会领悟少许是多少。
自驱力、学习力
我把自驱力和学习力放在一起,是因为这两个往往是分不开的。拥有自我控制的能力,是很难的,你可以尝试去坚持跑步,你大概就能明白这个难度。
在程序员的世界里,需要保持不断的学习新技术的能力,这一点我想大家应该都能理解。作为基本入门,我们要具有一定的学习力,在此基础上,还应该拥有快速学习的能力。快速学习是建立在拥有大量基础知识之上的。
不知道有没有人有这样的痛苦:学习一门新语言,新框架。刚开始的一两周特别痛苦。不仅你是这样的,我也是这样,还记得之前学习react,go都特别痛苦,但是往往两周以后,回过去看这个旅程,想着也就没有那么难。
自驱力+学习力=竞争力
勇气
勇于面对未知领域和问题,这个算是核心竞争力吧。
结构化思维
结构化思维可以从逻辑和套路两个方面来说:
逻辑可以分为四种:
(1)演绎顺序:比如“大前提、小前提、结论”的演绎推理方式就是演绎顺序的。
(2)时间(步骤)顺序:比如“第一、第二、第三”和“首先、再者、然后”等,大多数的时间顺序同时也是因果顺序。
(3)空间(结构)顺序:比如“前端、后端、数据”和“波士顿、纽约、华盛顿”等,化整为零(将整体分解为部分)等都是空间顺序。在做空间分解时,要注意满足“相互独立,完全穷尽”(Mutually Exclusive Collectively Exhaustive,MECE)原则。
(4)程度(重要性)顺序:比如“最重要、次重要、不重要”等。
套路:是指我们解决问题的方法论、路径和经验。
比如,5W2H分析法,Why、Who、When、Where、What、How和How much。任何问题都可以从这七个方面思考。
最清晰和实用的结构化表达是“提出问题,定义问题,分析问题,解决问题,最后展望未来”。
另一个有用的思维框架是“zoom in/zoom out”
批判性思维
批判性思维是以一种合理的、反思的、心灵开放的方式进行思考,从而能够清晰准确地表达、逻辑严谨地推理、合理地论证,以及培养思辨精神。
批判性思维强调求知中证据、逻辑的重要性,反对依靠权威和流行观点,要求能够区分理性和情感的观念。其倡导理性的公共说理,因此也应该成为现代公民的基本素养。
技术人的四大出路,你适合哪一个?
技术人的未来在哪里,这个问题,相信很多技术人扪心自问过,也在不断思考,我也不例外。一般来说,会有以下的方向。
第一:成为技术大神,比如架构师,及技术专家等。
第二:技术转技术管理,比如技术总监等。
第三:技术转型,如转项目管理,产品等,你牛逼的话,说不定下一个张小龙就是你(哥们,想多了,那有这么容易)。
第四:自主创业。
技术之路
的确,一名技术人员一般会选择以上四个方向。如果你想成为一名技术大神(业内 top 10,top 30),说一句政治正确的话,只要你不断努力,在将来的某一天你肯定能成为一名技术大牛。但事实真的是如此吗?成为一名技术大牛真的没那么简单,第一:需要你不断地学习,还要有相应的天赋。第二:业内优秀的人才太多了,这就意味着你需要跟大多数的精英(985,等各种牛逼高校的学生 )PK。第三:技术这条路,如果不是真心热爱它,走到后面,会越走越枯燥,随之丧失热情。
当然,我不是说技术这一条路走不通,只是说你想成为业内 top 10 真的挺难的,需要你不断的学习,且要有足够的天分。
成为一名技术大牛,并不仅仅依靠技术,影响的因素很多。技术并不是全部,它可能占 70% 左右,剩下的 30% 取决你的综合能力。往大的方面说,指在业界的影响力,在公司的影响力。具体到能力方面,可能是你的产品能力,管理沟通能力,演讲能力等等。
对于一名技术人来说,首先,你要先钻研你的专业,争取有所建树。
要进入互联网要写程序的话,算法一定要学好这是肯定的;
要学习好计算机的体系结构,不管你是学前端、后台还是挖掘;
要给自己定好一个学习方向,就这个方向进行深入。
其实技术不管怎么变,核心的东西从来没变过,底层的操作、思路、逻辑、系统等,首先我们要把这些最核心最基础的东西学好。
在业余的时候,多开阔你的眼界。我建议,在职场初期,把 80% 左右的精力放在你的专业能力上面,剩下的 20% 用在提高你的各方面能力,开阔眼界。在职场中期,当你在业界已经有一定知名度的时候,这时候可以尝试 73 或者 64 的比例,来全面提高自己。
技术管理之路
技术转技术管理,一般有以下两种情况。
第一:你在公司的技术能力得到一定的认可,且口碑也比较高,公司内部把你推上这个岗位的。到了这个位置,很多技术人刚开始可能会不太习惯带着团队做事,担心这,担心那。其实,大可不必。因为是公司内部把你推上去的,代表大家对你都是比较认可的,你只需要做好你自己就行了。技术方面,掌控大的技术方向,解决一些重难点。接人处事,尽量做到公平公正,同时,尽量帮助大家成长。
第二:自己主动转型。主动转型的,一般自己已经想清楚了,才会主动转型,这种情况就不多说了。
技术转型之路
技术转项目管理,产品,这也是挺多人选择的一个方向。技术人员一般思维比较缜密,理性,考虑事情比较全面,转型当产品一般有挺大的优势。第一:思维比较缜密,考虑得比较全面,会考虑实现的成本,提出的需求可能会比较合理,不会太浮夸。第二:自己懂得技术,能更好地跟技术,测试人员沟通。
当然也有相应的劣势,技术人员在做产品的时候,第一:可能会受技术思维的影响,首先考虑的是技术难度的问题,而不是用户体验。第二:技术人员思维方面可能会比较窄。做产品,应该多从市场,竞品,商业,运营等多方面考虑。一个产品的成功,不仅仅只能依靠技术,技术的可行性上。更多的应该着手于市场和用户。 第三:沟通能力。受职位影响,程序员工作的时候比较少跟市场,运营的人交流,沟通能力可能没那么强。而产品经理处在沟通的中心,不仅仅是将需求告诉别人,重要的是表达清楚。技术人应该多加强这一方面的能力。
技术人考虑问题的时候大多数时候是从技术的角度出发的,对性能,代码可扩展性有偏执。这在产品经理看来可能是不懂用户,不懂商业,只会闷头写代码。互相看不顺眼这太 TMD 正常了。
因此,最好的解决方案是,技术人懂点产品思维,产品懂点技术,考虑问题多从对方的角度出发,沟通起来就比较顺畅了。
技术人自主创业
自主创业并不仅仅指自己出来单干,创办公司。在我看来,做自媒体(比如运营公众号,写书,出教程,做一些顾问等),也都属于创业。
技术人自主创业,对于很多普通的技术人来说,一辈子可能也只有一两次出来创业办公司的机会,我们不是王思聪,生下来就有一个牛逼的爹,有足够的钱和资源。失败了我们可能就很难东山再起了。因为我们害怕,也输不起了。因此,如果想要自己出来创办公司,建议你先对创业想要从事的行业有足够清晰的了解再开始,不要脑门一热。
自媒体呢,我们完全可以在课余时间的时候去从事自己的副业,逐渐提高自己的影响力。
技术人职业发展
一般来说,技术人员对职业发展有两个发展方向,一个是技术方向,另外一个是管理方向,这两条路径侧重的能力点不同,需要根据自己的兴趣、能力优势有侧重的进行能力培养,成长路径如下图所示。
在刚入职的 1~3 年内,技术人员的发展路径比较单一,主要是从工程师往高级工程师发展,这个阶段主要目标是积累,夯实后续发展的基础,重点提高自己的工作基础能力,培养技术深度和广度,对不同方向的新技术保持强烈的好奇心和学习心。
在一路打怪升级为高级工程师之后,就会面临发展方向的选择:技术 or 管理。
- 如果打算往技术方向深挖,上升通道有:资深工程师、技术专家、高级技术专家、研究员、科学家等。需要你重点培养技术攻坚能力,包括疑难问题的排查、大型项目的功能拆分、技术品牌的塑造等。具体的工作包括:原理、实现、注重架构能力的培养,更深一层还有:大规模、高并发场景,高可用、可扩展措施和方案、业务的抽象、架构能力、分布式服务设计原则的理解等。
- 另外一个方向就是管理。管理序列偏重于团队把控,需要让团队形成技术战斗力,利用一切资源推进项目,让团队完成作战目标。另外,做好团队内和跨团队的沟通、协作也是管理工作很重要的一环。
在实际工作中,这两个序列没有特别明显的边界。例如做管理不表示远离架构设计;而技术专家也不是单兵作战,也需要带领团队。这两个方向区分点在于工作内容的侧重点不同:到底是更偏技术架构,还是更偏管理与项目推进。
回到最开始的面试问题,“你的职业规划是什么?”,答案并不是在面试前打个腹稿就完成任务了,而是在你进入职场,准备成为一位工程师时,心里就该有个谱的。
这里给你个面试小诀窍,也许这么回答能加分很多:“从过往的经验来看,我对项目的整体规划、管理推进比较感兴趣,在任务推进、协调沟通方面也有比较突出的表现,所以我的职业规划是成为一名优秀的技术经理,并以管理方向为发展目标。“这么接下去,面试官可能会对你的相关经历开始询问。
常见技术岗位划分
除了有明确的职业规划外,想要往高处走还得了解职级划分与对应的软、硬技能要求。这样你在工作的时候可以有意识得补足欠缺,提高水平。
应聘不同公司、不同级别的岗位时,要重点提升哪方面的技能呢?答案非常简单。
对照下图,简单介绍 BAT 、BJMD 的技术序列的岗位划分、对应的工作年限及职级。
- 1~3 年的初级工程师,这个级别的岗位在阿里、百度、腾讯等大厂很少进行社招,一般是从校招生内部晋升。
- 高级工程师一般需要有 2~5 年的工作经验,这个岗位对应百度中的 T4、阿里的 P5,以及腾讯的 T2-2(对应腾讯最新职级体系 T7)。
- 资深工程师一般要求 3~6 年工作经验,这个岗位一般对应百度中的 T5、阿里的 P6,以及腾讯的 T2-3(对应腾讯最新职级体系 T8)。高级工程师和资深工程师是各个公司中的绝对技术主力,公司非常看重这部分人才的成长和培养。技术专家、高级技术专家至少需要 5 年以上的互联网从业经验。至于,总监、总裁、CEO级别的就需要更加突出、更加优秀、高级自律的人才了。
小结
技术人成长的路上,我们会碰到很多坎坷,当然其他职业也不例外。但,从本质上面说,自身竞争力下降占很大一部分原因。毕竟,优秀的人才从来不缺少机会。为了未来有更多的选择,从现在开始,朝着自己的目标努力奋斗吧,书写属于自己的人生。
【更多阅读:禅与计算机程序设计艺术】
从程序员成为技术领导者:掌握全面解决问题的方法(温伯格)
程序员学会深度思考系列1:阻碍深度思考的 9 个思维定式
“自然”语言编程(NLC)的到来比你想象的要快
程序员架构修炼之道:架构设计中的人文主义哲学
程序员架构修炼之道:软件架构设计的37个一般性原则
软件架构设计的核心:抽象与模型、“战略编程”
“封号斗罗” 程序员修炼之道:通向务实的最高境界
编程语言:类型系统的本质
版权归原作者 禅与计算机程序设计艺术 所有, 如有侵权,请联系我们删除。