读书笔记:《软件开发者路线:从学徒到高手》

32 阅读14分钟

视频讲解:www.douyin.com/user/self?f…

1. 学习与成长

只求最差

  • 问题:当你是团队中最厉害的人时,你的学习速度会急剧下降,因为你缺乏能从中学到东西的榜样和挑战。
  • 解决方案:要有策略地将自己置于一个“最差”的环境中——也就是加入一个比你更优秀的团队。这并不是说你能力不行,而是为了创造最大的学习坡度。与高手为伍,你会被迫快速成长,吸收他们的经验和技能。

正视无知

  • 问题:你意识到自己的知识体系中存在许多盲点和漏洞,而工作又要求你必须懂这些。
  • 解决方案:不要回避或掩饰你的无知,要主动地、系统地去面对它。首先,列出你不知道但需要知道的东西。然后,制定一个学习计划,逐个攻克这些知识漏洞。承认无知是智慧的开端。

暴露无知

  • 问题:你害怕提问或承认自己不懂,担心这会让你看起来很愚蠢或不称职。
  • 解决方案:这与“正视无知”相辅相成,但更侧重于行动。要勇敢地在团队中提问,即使问题看起来很“基础”。这不仅能让你快速学到东西,还能营造一种开放、安全的团队文化。优秀的人会欣赏你的求知欲,而不是嘲笑你的无知。

深入挖掘

  • 问题:你对很多技术都只是浅尝辄止,了解皮毛,导致在解决深层次问题时力不从心。
  • 解决方案:与其追求广度而牺牲深度,不如选择一两个关键领域进行深入研究。当你遇到一个问题时,不要满足于找到一个能用的解决方案就停止,而是要追问“为什么”——深挖其底层原理和机制。这种深度会让你在面对复杂问题时更具洞察力。

漫漫长路

  • 问题:你渴望成为一名大师级的开发者,但这种追求与身边人“找份安稳工作”的期望格格不入。
  • 解决方案:认识到成为大师是一个漫长而需要持续投入的过程。这需要你设定长期目标,并有意识地规划你的职业路径,而不是仅仅着眼于下一个季度的绩效或下一个项目的技术。要接受并拥抱这条需要耐心和毅力的漫漫长路。

白色腰带

  • 问题:你过去的经验反而成了学习新技能的障碍,因为你习惯于用旧的思维模式去理解新事物。
  • 解决方案:在学习新东西时,要保持“白带”心态(源自武术),即空杯心态。暂时放下你已有的经验和成就,像初学者一样谦虚、专注地学习。这能让你更快地掌握新技能的精髓,而不是被过去的成功所束缚。

2. 实践与技能

质脆玩具

  • 问题:在生产环境中,你不敢轻易尝试新技术或进行实验,因为失败的成本太高。
  • 解决方案:为自己创造一个可以随意“破坏”的安全沙盒。开发一些个人项目、小工具或库,这些就是你的“易碎玩具”。在这些项目里,你可以无所顾忌地尝试最新的技术、重构代码、犯错并从中学习,而不用担心影响任何人。

具体技能

  • 问题:你想加入顶尖团队,但你空有理论知识,缺乏能立即上手的实用技能。
  • 解决方案:专注于学习和掌握那些具体的、可展示的技能。与其说“我懂Java”,不如说“我能用Spring Boot和React构建一个RESTful Web应用”。将你的知识转化为实实在在的产出能力,这才是进入优秀团队的敲门砖。

不断实践

  • 问题:日常工作中的编码任务往往是重复性的,无法提供足够的机会去挑战和提升自己。
  • 解决方案:像音乐家或运动员一样,进行刻意练习。日常工作是“表演”,你需要额外的“排练”时间。解决一些编程难题(如Katas)、参与开源项目、重构旧代码等,都是有效的练习方式。

常用工具

  • 问题:技术栈总在变化,你很难精确地估算工作量,因为你对工具总是不够熟悉。
  • 解决方案:精通你的核心开发工具(IDE、调试器、命令行、版本控制等)。对工具的精通可以极大地提高你的生产力,并让你在估算任务时更有信心。不要满足于仅仅会用,要成为工具的主人。

使用源码

  • 问题:当身边缺乏优秀的导师来指导你什么是好代码时,你如何提升自己的代码品味?
  • 解决方案:阅读高质量的源代码是最好的学习方式之一。研究你所使用的框架、库或知名开源项目的源码。看大师级的代码是如何组织的、如何处理边界情况的,这会潜移默化地提升你自己的代码质量。

3. 职业规划与心态

另辟蹊径

  • 问题:公司为你设定的传统职业道路(如转向管理岗)并不符合你成为技术专家的愿望。
  • 解决方案:主动规划一条属于你自己的职业道路。如果公司的阶梯不适合你,就自己造一个。这可能意味着成为技术布道师、首席工程师、独立顾问或开源社区的核心贡献者。不要让别人的期望定义你的成功。

自定路线

  • 问题:老板或公司提供的职业发展路径都让你感到不满意。
  • 解决方案:这是“另辟蹊径”的具体行动。坐下来,像规划项目一样规划你的职业。定义你的长期目标(你想成为什么样的人?),然后反向推导出中短期目标和需要采取的具体行动。把这张“地图”展示给你的老板,争取他的支持。

坚守阵地

  • 问题:你获得了一个晋升机会,但新职位意味着你将远离一线编码。
  • 解决方案:如果你对编程充满热情,要警惕那些让你脱离技术的“晋升”。在做决定前,仔细思考这是否符合你的长期职业目标。有时,拒绝一个看起来不错的管理职位,坚守在技术一线,才是更好的选择。

培养激情

  • 问题:糟糕的工作环境或无聊的项目正在消磨你对软件开发的热情。
  • 解决方案:激情不是凭空而来的,它需要被培养和呵护。通过参与有趣的副业项目、加入技术社区、指导新手等方式来重新点燃激情。主动寻找能让你兴奋的事情,并把它带回你的工作中。

释放激情

  • 问题:为了融入团队或避免显得“格格不入”,你刻意压抑自己对技术的好奇和兴奋。
  • 解决方案:不要隐藏你的热情!你的兴奋和好奇心是宝贵的资产,它能感染和激励团队中的其他人。在一个健康的团队里,热情是受欢迎的。如果你的热情被视为异类,那或许该考虑换个环境了(参考“只求最差”)。

持续动力

  • 问题:面对需求多变、目标模糊的项目和令人失望的现实,你感到动力不足。
  • 解决方案:寻找内在的、可持续的动力来源。外在激励(如奖金、晋升)是短暂的。内在动力,如对技艺的追求、解决问题的乐趣、帮助他人的满足感,才能让你在困境中依然保持前行。

4. 团队协作与影响力

找人指导

  • 问题:你经常碰壁,重复造轮子,但不知道该向谁求助。
  • 解决方案:主动寻找一位或多位导师。导师不一定是正式指定的,他可以是任何你尊敬并能从其身上学到东西的人——团队里的资深同事、技术社区的大牛等。虚心请教,并尊重他们的时间。

同道中人

  • 问题:你感到孤单,周围的同事和你的价值观、追求不一致。
  • 解决方案:积极寻找和建立你的“同道中人”网络。这可以通过参加技术会议、混迹线上社区、加入本地用户组等方式实现。与志同道合的人交流,能给你带来支持、启发和归属感。

分享所学

  • 问题:你觉得周围的人学习速度太慢,感到沮丧。
  • 解决方案:将你的知识分享出去。通过写博客、做内部技术分享、指导新手等方式,你不仅能帮助他人成长,更能巩固和深化自己的理解(费曼学习法)。教学相长是最好的学习方式之一。

密切交往

  • 问题:你感觉有很多更高级的技术和方法论,但自己总是抓不住要领。
  • 解决方案:创造与高手“摩肩接踵”的机会。最直接的方式就是结对编程(Pair Programming)。通过与经验丰富的开发者一起工作,你可以近距离观察他们的思维过程、工作流程和编码技巧,这是书本上学不到的。

打扫地面

  • 问题:作为一个经验不足的新人,你需要赢得团队的信任。
  • 解决方案:这个比喻源于学徒制,学徒通过做一些基础、甚至琐碎的工作来证明自己的投入和可靠性。在软件团队中,这意味着主动承担那些没人愿意做的“脏活累活”,比如修复棘手的遗留bug、完善文档、改进构建脚本等。这能让你快速熟悉项目,并用行动赢得尊重。

5. 知识管理与反馈

建立馈路

  • 问题:你不知道自己是否处于“无意识的无能”状态,即不知道自己不知道什么。
  • 解决方案:有意识地在你的工作中建立快速反馈的机制。自动化测试(TDD)是代码的反馈回路;代码审查(Code Review)是来自同事的反馈回路;定期与导师沟通是职业发展的反馈回路。目标是缩短从行动到获得反馈的周期。

且行且思

  • 问题:你工作了很多年,但感觉自己只是在重复劳动,没有质的飞跃。
  • 解决方案:经验不等于经历。真正的经验来自于对经历的反思。养成反思的习惯,比如每天下班前花5分钟,或者每周固定时间回顾:这周我学到了什么?什么做得好?什么可以改进?这能将你的日常工作转化为宝贵的经验。

记录所学

  • 问题:你发现自己反复在学同样的东西,经验教训总是留不住。
  • 解决方案:用文字或其他形式将你学到的东西记录下来。可以写博客、记工作笔记、或者做一个私人的知识库。记录的过程本身就是一个很好的反思和梳理过程,而且这些记录未来可以随时查阅,避免重复学习。

坚持阅读

  • 问题:虽然你学得很快,但总有更深层次的概念不断涌现,让你感觉基础不牢。
  • 解决方案:保持持续、广泛的阅读习惯。不仅要读技术博客和文章,更要读那些探讨软件开发思想、原则和历史的经典书籍。阅读可以为你提供一个坚实的理论框架,帮助你理解“为什么”而不是停留在“怎么做”。

钻研名著

  • 问题:团队里的资深开发者总是在引用一些经典书籍里的概念,而你却一无所知。
  • 解决方案:系统地去阅读那些被公认为“经典”的软件开发著作,比如《代码大全》、《设计模式》、《重构》、《人月神话》等。这些书提供了业界通用的词汇和基本原则,是每个专业开发者的必修课。

阅读列表

  • 问题:要读的书太多了,你根本读不完,感到无从下手。
  • 解决方案:有策略地管理你的阅读清单。不要试图读完所有书。根据你当前的需求和兴趣,对书单进行优先级排序。可以采用“广度优先”(了解大概)和“深度优先”(精读一本)相结合的策略。同时,不要害怕放弃一本读不下去的书。

6. 处理困境

以退为进

  • 问题:当你面对大片的未知领域时,感到不知所措,快要被淹没了。
  • 解决方案:暂时从挑战中后退一步,回到你擅长的领域。通过完成一些你拿手的任务来重建信心和动力。这就像是战略性撤退,调整好状态后,再重新去挑战那些未知的领域。

学会失败

  • 问题:虽然你努力提高成功率,但失败和犯错依然不可避免。
  • 解决方案:将失败视为学习的机会,而不是耻辱。分析你的每一次失败:失败的原因是什么?我能从中吸取什么教训?下一次如何避免?了解自己的弱点和常见的失败模式,是成长的关键一步。

深水区域

  • 问题:你担心自己的职业发展停滞不前,陷入了舒适区。
  • 解决方案:主动跳出舒适区,挑战那些让你感到不舒服和有压力的任务(即“深水区”)。承担一个更有挑战性的项目、学习一门全新的技术、或者在一个陌生的领域做一次公开演讲,都是将自己推向深水区的方式。

技重于艺

  • 问题:在交付方案时,你面临选择:是做一个简单有效的方案,还是趁机创造一个新奇精妙的“艺术品”?
  • 解决方案:优先选择“技艺”(Craftsmanship),而不是“艺术”(Art)。真正的工匠精神是为客户创造价值,用最合适、最可靠、最易于维护的方式解决问题。追求个人艺术表达应让位于专业的责任感。

入门语言

  • 问题:你了解多种编程语言,但没有一门是真正精通的。
  • 解决方案:选择一门语言,深入地学习它,让它成为你的“母语”。精通一门语言,意味着你不仅了解其语法,还了解其标准库、生态系统、设计哲学和最佳实践。这种深度会让你在学习其他语言时触类旁通。

使用头衔

  • 问题:在介绍自己时,你总觉得自己的头衔和实际能力不符,需要额外解释。
  • 解决方案:让你的能力超越你的头衔。与其纠结于头衔本身,不如专注于提升自己的技能和影响力,让你的实际表现为你代言。当你的能力足够强时,头衔自然会变得名副其实,甚至你会被赋予更高的头衔。

提高带宽

  • 问题:你的视野很窄,只关注日常工作的具体细节,缺乏对整个软件开发领域的宏观理解。
  • 解决方案:拓宽你的“认知带宽”。除了代码,还要学习软件架构、项目管理、商业需求、用户体验等。理解你的工作在整个产品和业务中的位置。这能让你做出更明智的技术决策,并提升你的价值。