career-anchor-study

程序员练级

无论做什么事,都会遇到各种困难,这对每个人来说都是一样的。兴趣、热情和成就感让你不惧困难,哪怕只有一丁点,也应该坚持。

入门

加速度过拐点,从学习技能到自己解决问题:The Key to Accelerating Your Skills While You Learn to Code

  1. 起点:教程阶段(约3-8周)。初学者通过结构化教程学习基础技能(如开发、测试、部署)。
    • 挑战:常被错误信息困扰。
    • 重点技能:关注细节,调试错误,识别模式。仔细阅读文档避免拼写错误。初期需花时间理解错误信息,之后定位和解决问题的速度会提升。
    • 方式:
      • 穿插挑战问题:在教程中主动尝试超出范围的任务,减少对教程的依赖,多阅读文档(如 GitHub 文档)。
      • 重复练习基础技能:如从零搭建应用、部署到 GitHub 和 Heroku、数据库迁移等。
  2. 拐点:快速编写代码,自信的脱离教程,独立解决问题(比知道具体知识)更重要
    • 挑战:学习速度下降10-20倍,质疑自己是否有能力成为程序员,产生不安全感和怀疑,但这是学习程序知识的关键时期。
    • 重点技能:自主搜索解决方案(错误信息不再令人恐慌 → 能快速定位问题)、参考文档、代码(参考,并将已有的教程和代码作为备用,根据自身需求进行修改和适配,形成最佳实践,遵守代码规范和最佳实践,产生好质量,如结构清晰、逻辑严谨、易于维护)。
    • 重要拐点:框架理解 + 算法,这是可迁移技能
      1. 实现功能,Web开发:掌握CRUD应用、集成第三方库。
      2. 关注性能,算法与数据结构:实现排序算法、链表、栈/队列/树操作、递归/迭代。
    • 效果:
      • 你已经见过足够多的错误信息,它们不再让你感到惊讶。相反,你知道如何解读这些信息的含义,以及在代码中的何处查找问题。
      • 你很擅长在谷歌上搜索解决方案。当你努力添加一项功能或看到一条令人困惑的错误消息时,你知道该搜索什么来找到所需信息。
      • 你可以引用在应用程序其他部分编写的代码,并遵循其中的模式,而不必总是寻找逐步的指导。
    • 建议:
      • 真正的目标不是 “学尽所有知识”,而是培养 无论遇到什么问题都能 “自主解决” 的能力。初入编程时,人们常误以为存在一个 “终点”—— 当掌握所有必要知识后,便能轻松解决所有问题,但编程的本质是 “解决问题的能力” 而非 “知识堆砌”,无需等待 “学完所有知识” 再动手,而是在实践中边学边解决问题,有经验的工程师主动“寻求未解决的问题”,而不是 “应用已学知识”。
      • 信心是出来的,而不是等出来的:不被情绪左右,坚持拆解问题:当面对代码调试、需求变更、技术选型等复杂问题时,可将任务拆解为 “定位错误→逐行检查调试代码,搜索文档→重构代码尝试最小化修复→总结可复用的方法强化信心” 等具体步骤,用 “行动量” 替代 “情绪内耗”
      • 直面怀疑是建立信心的唯一路径,获得信心的最佳方法就是克服你心中的任何疑虑。你的情绪可能会像坐过山车一样起伏不定。情绪波动源于 “从依赖到自主” 的认知冲突:既渴望独立解决问题,又因未知挑战感到无力。直面怀疑是建立信心的唯一路径。当学习者强迫自己在怀疑中行动时,本质是在训练 “程序性知识”(如自主学习、调试策略),而这些能力正是突破拐点的核心。接受 “不确定性” 为常态,“错误信息是编程的一部分”,而非能力不足的信号,而应对不确定性的能力,正是从一次次解决未知问题中积累的。“持续行动” 比 “等待信心” 更有效,就像调试错误信息一样,经历的次数越多,对不确定性的耐受度越高。
      • 刻意挑战舒适区。真正的成长源于主动解决 “超出当前技能范围” 的问题。如果不知道某件事会花费你 5 分钟还是 5 小时,这可能会让人沮丧,但每次你努力完成并成功实现一个新功能时,随之而来的自信感将是你所需要的一切。在无需任何帮助就解决了一些难题后,你会对在舒适区之外创造事物的感觉上瘾。
      • 调整预期:接受学习速度放缓,避免与教程阶段对比。
      • 寻求支持:与已突破拐点的人交流,缓解焦虑。
      • 合理安排时间:每天高效工作不超过 6 小时,避免疲劳。
  3. 拐点后:问题可解决 = 可拆解->可搜索->可验证
    • 能独立解决未知问题,无需依赖详细指导,对编程的认知从 “学习知识” 转变为 “解决问题的能力”。
    • 你永远不可能知晓所有的知识,所以你需要能够自学如何解决眼前的问题。你无需再等待他人来帮你解决问题。这意味着,对于你需要学习的大部分内容,你只需在互联网上搜索,阅读各种你需要了解的相关资料即可。这并不意味着你能立刻 “知晓” 一切,而是意味着一切如今都是 “可弄明白的”,所以从本质上讲,你势不可挡
    • 面对新挑战时,你感觉缺乏准备,这是正常的。积极解决,如学习新知识、寻求帮助或逐步积累经验,逐步增强解决问题的信心和能力。
    • 接受编程是持续学习的过程,当有了 “已掌握一切” 的感觉时,仅仅意味着可以开始思考如何解决更复杂的问题
    • 编程需要同时学习领域特定知识(如编程语言语法、框架使用)和程序知识(自主学习、解决问题的方法),其中程序知识更为关键。领域特定知识只需一两周甚至几天的教程就能灵活掌握新的概念。

编程技能

编程工具

实践项目:投票

修养

分享

专业基础

专业方向

软件设计

需要你自己去实践、用时间、错误、教训、痛苦 才能真正体会到精髓,除了理论知识,你需要大量的工程实践,每过段时间要把自己设计的东西回炉下,需要反复推敲,需要有足够的耐心和恒心

Linux 系统、内存和网络

学习到一定程度,从书本中走出去,到社区里和大家一起学习,需要自己找食了,你不需要特别努力,只要日进一步

系统底层:Linux内核,网络,异步IO,Lock-free 无锁编程
Linux系统

内存

计算机网络

异步IO模型和Lock-Free

IO:selec, poll, epoll, aio, libevent, libuv

Lock-Free:Non-blocking, Read-copy-update, Seqlock
Is Parallel Programming Hard, And, If So, What Can You Do About It? (kernel.org)

Java底层

字节码:运行时修改字节码和代码注入,不需要在代码中埋点统计或监控
JVM

数据库

NoSQL 解决了 MySQL的问题

设计模型,保证系统稳定性和可用性,数据库是最关键的

关系型数据库

分布式架构

工程设计

微服务

容器化和自动化运维

Docker,K8s

机器学习和人工智能

前端

基础和底层原理

性能优化和框架

UI-UX设计