跳至主要内容

10年工作经验与1年工作经验用10年?


 一、前言

先听一个故事:
程序员明明:“大师为作为一个具有 3 年工作经验的人,为啥别人 2 年工作经验比我还强呢?”
大师回答道:“你只是工作了三年,未必有三年的经验。”
程序员明明:“大师此话怎讲?”
大师回答道:“说来话长....,你还是直接去看悟鸣同学的文章吧.....”
不知道大家想过没有,同样是在软件开发行业工作 3 年,为什么有些人经验丰富,可以独当一面,而有些人却还和工作一年的人差不多?为什么一起参加工作的人,同一批人中很多人都升到了团队主管的职位,而还有很多人还是普通的开发?
如果你对此话题感兴趣,并且想了解如何更快速成长,且听我慢慢道来。

二、为什么?


2.1 客观原因:工作简单、枯燥、重复

很多人成长缓慢的一个重要原因是:总是干一些相对简单、枯燥而且重复的工作。
曾经当面试官的时候我就面试过一些外包同学,简历上的很多项目问项目的价值就是“别人就这么安排的”,问技术都是“调调别人封装好的接口”,没有自己的思考和技术沉淀。也有一些国企工作想来互联网公司发展的程序员,工作四五年了技术栈比较陈旧,还是 SSH 那一套,连分布式缓存、分布式消息队列等都没用过、问其原理也不太清楚。结果就不用多说了。


2.2 主观原因:不愿出舒适区

俗话说,“只要思想不滑坡,办法总比困难多”。
虽然各种客观条件能够限制一个人的发展,但是本质上限制人的是主观原因,其中一个非常重要原因是很多人不愿意走出舒适区。
舒适区、学习区和恐慌区是美国心理学家Noel Tichy提出的理论,用于描述人类对外部世界的认识和处理方式。所谓舒适区,是指我们熟悉、能够轻松应对的领域或任务,不需要太多的学习和思考,通常会带来舒适感和满足感。在舒适区,我们不需要付出太多的努力,也不需要冒太大的风险,因为我们已经掌握了相关的知识和技能,能够应对各种情况。所谓学习区,是指我们不太熟悉、需要学习和探索的领域或任务,需要花费较多的时间和精力去掌握相关的知识和技能。在学习区,我们需要不断地学习和实践,才能够取得进步和提高。学习区通常会带来一定程度的挑战和不适感,但也会带来成就感和满足感。所谓恐慌区,是指我们完全不熟悉、无法应对的领域或任务,需要付出极大的努力和冒极大的风险才能够应对。在恐慌区,我们会感到极度的不安和恐惧,因为我们不知道该如何应对和解决问题。恐慌区通常会带来极大的压力和焦虑感,可能会导致我们出现负面情绪和行为反应。
不断走出舒适区是指走出原有舒适区的范围,将原本的学习区的范围纳入到舒适区中。比如虽然你所在的公司用到的技术有些陈旧,但并没有人阻止你去学习新技术,你完全可以主动掌握大厂面试所需的技术;虽然大家都在写 “CRUD” 代码,但有些同学却能够主动研究代码规范,努力写出高质量的代码;有些同学能够主动学习代码审查的经验,能够在代码审查中给出非常关键和靠谱的建议;虽然都是在做传统的业务开发,有些同学却能够抓住每个 BUG ,深入其原理,彻底掌握某个知识;虽然有些技术直播或演讲可能略显枯燥,但是有些同学总能从中学到一些东西,比如学习人家 PPT 的排版,学习人家演讲的技巧等;虽然大家都在做相对简单的业务,但有些人能够思考产品的价值,能够提出自己的优化建议,能够从每个项目中发现自己的不足,持续改进。比如 IDEA 刚出来那几年,很多人由于习惯使用 Eclipse,总是能找出各种理由说 IDEA “不好用”,而有些人却能成为最早一批使用 IDEA 的人。比如 AI 时代来临,明明 AI 可以极大提高效率,但是很多人总爱提 AI 有各种缺点而拒绝使用,而有些人却能够研究提示词技巧,充分利用 AI 来为生活和工作提效。

三、怎么做?

想要快速成长,方法有很多,每个人可能都会有自己的版本。
在我看来,问题的关键就在于你是否有主动走出舒适区的意愿,并且能够明确目标有的放矢、能够找到动力,坚持下去,能够真正找到行之有效的方法,并且持续改进。
我认为首先要知道目标在哪里,才能有的放矢。然后不断突破舒适区,需要反本能,需要有主动性,主动学习、主动思考、主动复盘,提高硬实力的同时还要提升软技能。


3.1 明确目标,有的放矢

对于还没有毕业的学生来说,多去看大厂实习和校招的要求。做到“人无我有,人有我优”。

比如很多在校的学生都没用过 Redis 和 HBase,如果你没用过可以搭建一个简单的环境自己尝试使用,并且购买讲解原理的书籍反复学习,面试时可以从容应对,就会有很多优势。
比如很多学生还有参加过知名开源项目,你可以参与一些主要的开源项目并且得到一定成绩,竞争优势非常大。
比如你能够参加一些有分量的国家级甚至国际的软件比赛并拿到好的名次,就可以甩掉一大堆竞争者。

对于已经工作的同学来说,可以研究公司内部或者大厂对外公开的对你后面一个和两个职级的要求。

比如这里提到的一些多线程编程、设计模式、 Java 虚拟机;中间件的原理;抽象能力;风险意识;复杂问题的分析和解决能力;沟通表达和团队协作的能力,业务经验等。


3.2 突破舒适区,持续成长

3.2.1 做略有挑战的任务

《论语》中有言:“欲谋其中,必求其上,欲谋其上,必求上下;欲求上下,必求其实之内。” 只有不断地做更有挑战的事情、确定更高的发展目标,才能在不断的竞争中实现自己的目标。
之前有个学弟,还没有毕业就主动参与国内知名开源项目,贡献了一些不错的 Feature 后,成为了 MVP ,校招找工作具有极大的优势,最终也轻松收获多个大厂 Offer。

认识一个从 P5 快速升到 P6 的优秀同学,他平时承担的项目复杂度高、有挑战性,短短一年内通过设计复杂的技术方案取得了快速成长。

可以主动争取去承担一些略有挑战性的任务。就算没有机会亲完整负责一个有挑战性的项目,只是参与其中一个部分,也不要只顾自己的“二亩三分地”,要主动了解整个项目的设计。

3.2.2 持续学习(夯实基础、向身边人学习,利用好工具)

所谓:“基础不牢,地动山摇。”在工作过程中需要不断夯实专业基础,才能能走的更远。工作几年你会发现,日常方案设计和一些疑难问题的解决最终依赖的大多还是来源于专业基础,如操作系统、计算机网络、数据结构与算法、计算机组成原理和软件工程中的一些经典知识理论。如果能熟练掌握经典的中间件的设计思想,如 Redis、Hbase、EleasticSearch、RocketMQ 等,也将对你的方案设计有一个质的提升。个人建议每种技术选择一本经典的图书,反复阅读几遍,做到原理可以信手拈来才行。如 《MySQL 是怎么运行的》、《Redis 深度历险》、《HBase 不睡觉书》、《深入理解 Apache Dubbo 与实战》、《深入理解 Kafka 核心设计与实践原理》、《ElasticSearch 实战》、《设计模式之禅》、《深入理解 Java 虚拟机》等等。

所谓:“三人行,必有我师焉”。只有能从身边的优秀同事身上不断学习,才能成长更快。比如有些同学特别擅长做 PPT,可以观察和请教,争取自己的 PPT 水平也能有提升;比如有些同学做技术方案非常出色,主动对比他的方案和自己的差异,并主动请教。比如有些同学了解很多 AI 工具,知道很多提示词技巧,可以主动请教,让 AI 也能给自己的生活和工作提效。比如有些同学做项目质量很高,很少出现故障和 BUG,可以向他请教一些经验和技巧。比如有些同学总是能很快定位到问题的原因,可以向他学习排查问题的思路和工具指令等。

利用好工具。尤其现在 AI 时代来临,利用好工具尤为重要。AI 工具大大降低了学习成本,可以针对一个问题不断追问快速得到想要的答案,可以让 AI 给你举例子,让 AI 给你用浅显易懂的语言进行解释等。有了 AI 的加持,我们可以更快速学习知识,能够更快速地解决问题。还有一些其工具,比如一些可以提效的 IDEA 插件(有些插件可以一键可视化查看 class 结构,有些插件可以一键根据类构造 JSON 字符串等等),还有方便排查问题的 arthas(有些问题使用 arthas 瞬间可能就可以解决问题,但是很多人宁愿改代码打日志来回发布好几次),各种常用的 Linux 指令(有些人使用 grep 指令看日志,从来没有用过 -A 查日志很费劲)等。

3.2.3 持续思考

所谓:“学而不思则罔”,想要快速成长离不开对业务、对技术的持续思考。
我们不能仅成为项目的执行者,需要思考项目的价值,要有一定的产品思维,思考怎么可以把产品做的更好,少走一些弯路,思考如何在业务发展和技术实现之间取得更好的权衡。
持续思考,挖掘本质,增加深度;持续学习,夯实基础,知识串联,增加广度。越来越融会贯通。
在日常开发中难免会遇到一些 BUG,很多人着急寻找解决问题的方法而忽视探究问题的根本原因,我认为这是很多人不能快速成长的一个重要原因。在我看来,每个 BUG 都是检验和提升你技术水平的绝佳机会。当遇到一个问题时(应急场景除外,应急需要降低业务影响优先,而不是查根本原因),一定要找出根本原因,甚至可以写成文章分享出来,通过每个问题带动某个知识的深入理解,这样遇到的问题越来越多,你对知识掌握也越来越好。但一个人能够遇到的问题是有限的,想要一年有两年的经验,还需要你一年遇到两年的坑,需要你主动通过各种方式去了解公司内外的一些故障和 BUG 的原因,这样你才能积累更多经验。

3.2.4 持续复盘

我认为很多人工作三年还是一年经验,最根本的原因是缺乏复盘。如果一直采用相似的方法做事,大概率还是会得到相似的结果。就像不同的算法的时间和空间复杂度是确定的一样,如果不能更换算法,很难有质的飞跃。就像不同的 AI 模型的能力相对固定一样,如果不能够换不同的模型或者同一个模型的不同版本,也很难有本质区别。之前读过这样的一句话:“愚蠢的人,总是希望采用同样的方法,每次却能得到不一样的结果”。很多成长缓慢的人很少去主动思考目前的工作中存在哪些不足,主动寻找解决办法,不断对方法进行迭代以便取得更好的效果。
比如你可以在做完每个大型项目后进行复盘,如果有些需求开始没对清楚导致后面返工,那么下个项目要重视需求对齐;如果这个项目前端工作量不大,你联系她联调时她才说要开发,下次可以在联调前一两天就问一下是否可以正常联调;比如某个大佬对你项目的技术方案设计,提出了一些建议,那么下次做技术方案时不要再存在类似的问题;比如这个项目上线之后出现一个 BUG,而这个 BUG 是完全可以通过单元测试提前发现的,那么下次做项目要重视单测覆盖率,重视边界条件的单元测试;比如,这次项目的发布计划写得比较粗糙,导致发布时还需要找人补充一些配置信息。下次的发布计划应该更加详细;比如这次开发中遇到一个疑难杂症,请教周围一个大佬,大佬使用 arthas 很快查到了根本原因,那么自己也要学会使用 arthas ,甚至主动学习一些高级技巧。
不仅要做项目的复盘,对自己的学习方法,对自己的解决问题的方法,对自己和同事的沟通方法等都需要持续复盘,并且找到行之有效的改进办法,才能一次比一次做得更好,快速全面成长。

3.2.5 提升软实力

对于技术成长来说,光提升“硬实力”还不够,还需要提升“软实力”。
比如写文档、写文章、做 PPT 和演讲的能力;跨团队沟通交流、协调资源的能力;合理规划时间和任务的能力。
还包括掌握一些经典的思维框架和方法,如结构化思维、本质思维、逆向思维、创新思维、批判性思维、SWOT 分析、 3W2H 方法等。(本文不详细展开)

总之,晋升到更高的职级意味着你需要从专注于单一任务(点),到管理整个项目流程(线),再到全面掌握业务和团队协调(面),甚至是跨部门合作,再到跨公司合作(体)等。要求更强的硬件能力(编码能力,专业基础)的同时对软技能(做 PPT 的能力,逻辑思维能力,沟通协作能力)有更好的要求。

四、总结

总而言之,想要比别人更快速地成长,需要不断走出舒适区,接受更有挑战性的任务,需要持续思考、持续的复盘、持续学习,提高硬实力的同时提高软实力。

评论

此博客中的热门博文

Docker-Compose 安装 PolarDB

 version: '3.1' services:   polardb:     container_name: polardb     restart: always     image: polardb/polardb_pg_local_instance     ports:       - 5432:5432     networks:       - net_db     environment:       TZ: Asia/Shanghai     volumes:       - ./polardb:/var/polardb networks:   net_db:     external: true

Docker-Compose 安装 xxl-job-admin

 version: '3' services:  xxl-job-admin:    image: xuxueli/xxl-job-admin:2.3.0    restart: always    container_name: xxl-job-admin    #environment:    #  PARAMS: '--spring.datasource.url= jdbc:mysql://192.168.1.110:3305/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false --spring.datasource.username=root --spring.datasource.password=123456'    ports:      - 80:8080    networks:      - net_db    volumes:      - ./data/applogs:/data/applogs networks:  net_db:    external: true

Docker-Compose 安装 Portainer

 version: '3.1' services: portainer: image: portainer/portainer-ce:latest container_name: portainer hostname: portainer restart: always volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./portainer_data:/data" - "./portainer_cn:/public" environment: TZ: Asia/Shanghai LANG: en_US.UTF-8 ports: - "9001:9000" networks:      - net_db networks: net_db: external: true