career-anchor-study
程序员练级
无论做什么事,都会遇到各种困难,这对每个人来说都是一样的。兴趣、热情和成就感让你不惧困难,哪怕只有一丁点,也应该坚持。
入门
-
后端:Python
-
前端:JavaScript、HTML 、 CSS,关注相互作用展示数据
- HTML 基本语法
- CSS 选中HTML元素并应用样式
- Chrome 查看网页结构并动态修改;
-
操作系统:Linux
- 配置环境,Ubuntu/Nginx/MySQL
实践项目:Blog系统
- 配置环境,Ubuntu/Nginx/MySQL
-
功能:登录、注册(密码用密文)、权限、发帖评论(按权限编辑和重新编辑)、图片验证码、图片上传、防SQL注入
-
数据库设计
-
注重细节,调试错误:经验积累→错误理解能力↑→问题定位(when no idea) 准确性↑→获取修复信息↑→调试/搜索/参考代码/修复时间↓ → 总结模板 → 重用 -> 自信
- 你已经见过足够多的错误信息,它们不再让你感到惊讶。相反,你知道如何解读这些信息的含义,以及在代码中的何处查找问题。
- 你很擅长在谷歌上搜索解决方案。当你努力添加一项功能或看到一条令人困惑的错误消息时,你知道该搜索什么来找到所需信息。
- 你可以引用在应用程序其他部分编写的代码,并遵循其中的模式,而不必总是寻找逐步的指导。
-
bug detail, debug, google, reference code and find patterns to reuse
- True confidence comes from struggling through a problem you have no idea to solve, and discovering a solution on your own
- you will never know everything you need to know to solve all your problems. the day you are waiting for will never come, And that is a wonderful thing. 认知有限,持续学习,团队合作。真正的目标不是 “学尽所有知识”,而是培养 “无论遇到什么问题都能自主解决” 的能力 —— 这正是文档中 “突破拐点” 的本质意义。经验丰富的软件工程师会努力寻找尚未解决的问题的解决方案,因为这让他们有机会学到更多东西。你永远不可能知晓所有的知识,所以你需要能够自学如何解决眼前的问题。你无需再等待他人来帮你解决问题。这意味着,对于你需要学习的大部分内容,你只需在互联网上搜索,阅读各种你需要了解的相关资料即可。这并不意味着你能立刻 “知晓” 一切,而是意味着一切如今都是 “可弄明白的”,所以从本质上讲,你势不可挡。
-
its the point when you phase out of using tutorials and begin solving problems for which no one has lined up a solution for you 没有指导,独立解决问题,用自己的知识、创造力和批判思维
- you will feel you are not ready to tackle
加速度过拐点,从学习技能到自己解决问题:The Key to Accelerating Your Skills While You Learn to Code
- 起点:教程阶段(约3-8周)。初学者通过结构化教程学习基础技能(如开发、测试、部署)。
- 挑战:常被错误信息困扰。
- 重点技能:关注细节,调试错误,识别模式。仔细阅读文档避免拼写错误。初期需花时间理解错误信息,之后定位和解决问题的速度会提升。
- 方式:
- 穿插挑战问题:在教程中主动尝试超出范围的任务,减少对教程的依赖,多阅读文档(如 GitHub 文档)。
- 重复练习基础技能:如从零搭建应用、部署到 GitHub 和 Heroku、数据库迁移等。
- 拐点:快速编写代码,自信的脱离教程,独立解决问题(比知道具体知识)更重要
- 挑战:学习速度下降10-20倍,质疑自己是否有能力成为程序员,产生不安全感和怀疑,但这是学习程序知识的关键时期。
- 重点技能:自主搜索解决方案(错误信息不再令人恐慌 → 能快速定位问题)、参考文档、代码(参考,并将已有的教程和代码作为备用,根据自身需求进行修改和适配,形成最佳实践,遵守代码规范和最佳实践,产生好质量,如结构清晰、逻辑严谨、易于维护)。
- 重要拐点:框架理解 + 算法,这是可迁移技能
- 实现功能,Web开发:掌握CRUD应用、集成第三方库。
- 关注性能,算法与数据结构:实现排序算法、链表、栈/队列/树操作、递归/迭代。
- 效果:
- 你已经见过足够多的错误信息,它们不再让你感到惊讶。相反,你知道如何解读这些信息的含义,以及在代码中的何处查找问题。
- 你很擅长在谷歌上搜索解决方案。当你努力添加一项功能或看到一条令人困惑的错误消息时,你知道该搜索什么来找到所需信息。
- 你可以引用在应用程序其他部分编写的代码,并遵循其中的模式,而不必总是寻找逐步的指导。
- 建议:
- 真正的目标不是 “学尽所有知识”,而是培养 无论遇到什么问题都能 “自主解决” 的能力。初入编程时,人们常误以为存在一个 “终点”—— 当掌握所有必要知识后,便能轻松解决所有问题,但编程的本质是 “解决问题的能力” 而非 “知识堆砌”,无需等待 “学完所有知识” 再动手,而是在实践中边学边解决问题,有经验的工程师主动“寻求未解决的问题”,而不是 “应用已学知识”。
- 信心是做出来的,而不是等出来的:不被情绪左右,坚持拆解问题:当面对代码调试、需求变更、技术选型等复杂问题时,可将任务拆解为 “定位错误→逐行检查调试代码,搜索文档→重构代码尝试最小化修复→总结可复用的方法强化信心” 等具体步骤,用 “行动量” 替代 “情绪内耗”
- 直面怀疑是建立信心的唯一路径,获得信心的最佳方法就是克服你心中的任何疑虑。你的情绪可能会像坐过山车一样起伏不定。情绪波动源于 “从依赖到自主” 的认知冲突:既渴望独立解决问题,又因未知挑战感到无力。直面怀疑是建立信心的唯一路径。当学习者强迫自己在怀疑中行动时,本质是在训练 “程序性知识”(如自主学习、调试策略),而这些能力正是突破拐点的核心。接受 “不确定性” 为常态,“错误信息是编程的一部分”,而非能力不足的信号,而应对不确定性的能力,正是从一次次解决未知问题中积累的。“持续行动” 比 “等待信心” 更有效,就像调试错误信息一样,经历的次数越多,对不确定性的耐受度越高。
- 刻意挑战舒适区。真正的成长源于主动解决 “超出当前技能范围” 的问题。如果不知道某件事会花费你 5 分钟还是 5 小时,这可能会让人沮丧,但每次你努力完成并成功实现一个新功能时,随之而来的自信感将是你所需要的一切。在无需任何帮助就解决了一些难题后,你会对在舒适区之外创造事物的感觉上瘾。
- 调整预期:接受学习速度放缓,避免与教程阶段对比。
- 寻求支持:与已突破拐点的人交流,缓解焦虑。
- 合理安排时间:每天高效工作不超过 6 小时,避免疲劳。
- 拐点后:问题可解决 = 可拆解->可搜索->可验证
- 能独立解决未知问题,无需依赖详细指导,对编程的认知从 “学习知识” 转变为 “解决问题的能力”。
- 你永远不可能知晓所有的知识,所以你需要能够自学如何解决眼前的问题。你无需再等待他人来帮你解决问题。这意味着,对于你需要学习的大部分内容,你只需在互联网上搜索,阅读各种你需要了解的相关资料即可。这并不意味着你能立刻 “知晓” 一切,而是意味着一切如今都是 “可弄明白的”,所以从本质上讲,你势不可挡。
- 面对新挑战时,你感觉缺乏准备,这是正常的。积极解决,如学习新知识、寻求帮助或逐步积累经验,逐步增强解决问题的信心和能力。
- 接受编程是持续学习的过程,当有了 “已掌握一切” 的感觉时,仅仅意味着可以开始思考如何解决更复杂的问题。
- 编程需要同时学习领域特定知识(如编程语言语法、框架使用)和程序知识(自主学习、解决问题的方法),其中程序知识更为关键。领域特定知识只需一两周甚至几天的教程就能灵活掌握新的概念。
编程技能
- 技巧:代码大全
- 语言:
- core java-语法、Head First Java、
- Spring In Action、Spring Boot 实战-IOC, AOP
- Guava(集合,缓存,原生类,并发库,通用注解,字符串处理,IO库)、Effective Java、Java并发编程实战、Java性能权威指南、深入理解Java虚拟机、Java编程思想、精通Spring 4.x、设计模式、Head First 设计模式
- 操作系统:鸟哥的Linux私房菜-管理和操作Linux
- 网络协议:HTTP头、请求方法、响应码、缓存、会话、链接管理;MDN-HTTP
- 数据库设计:MySQL必知必会,官方文档- 范式,SQL语法
- 前端:JQuery-Javascript Ajax请求后端/Promise、Bootstrap-CSS
- 字符编码:ASCII 和 Unicode
编程工具
- IDE:IDEA
- 版本管理:Git;Pro Git 第二版
- 调试前端:Chrome;http://www.igeekbar.com/igeekbar/post/156.htm
- 数据库设计工具:MySQL WorkBench
实践项目:投票
- 用户登录后,生成投票表单
- 投票项可以单选/多选
- 其他用户投票后显示当前投票结果(不能刷票)
- 投票有相应的时间,页面需要出现倒计时
- 投票结果需要用不同颜色、不同长度的横条,显示百分比和人数
技术需求 - SpringBoot 返回JSON数据给前端
- 前端JQuery 操作HTML 动态生成展示页面
- 前端页面响应式,可以在手机端和电脑端有不同的呈现,Bootstrap完成
挑战 - 微信授权记录用户信息,防止刷票
- 不用刷页面,动态看到投票结果
- Google 一些Javascript 库,把图表做的漂亮一些
大致掌握可以找到至少年薪20w 的工作,选择一个方向开始深入,你并不知道未来有多大的可能性,也不知道你会成为什么样的人,为什么不再更努力一把?
修养
分享
- 英文:官网阅读手册、StackOverflow 问问题,Youtube 看演讲和视频,Github 参与社区,Google 查询知识,国际名校参加公开课
- 坚持英文关键字
- Github 上只用英文,用英文写注释代码,写 Code Commit,写 Issue 和 Pull Request,写 Wiki
- Youtube 上每天看5min 的视频
- 坚持用英文词典
- 坚持用英文教材
- 提问
- 事前应做好什么,不该做什么,让问题易于理解,发问者也能学到很多东西
- http://www.catb.org/~esr/faqs/smart-questions.html
- https://meta.stackexchange.com/questions/7931/faq-for-stack-exchange-sites
- XY问题:X是问题,Y是可能的解决方案;那么,两个都要说明
- 写代码
- 重构:改善既有的代码、修改代码的艺术、代码整洁之道、程序员的职业素养、Code Review
- 安全防范:OWASP 开源的全球安全组织、HTTP、防御性编程
- 软件工程和上线:测试,上线前检查上线后监控;
- 完美软件-对软件测试的各种幻想:人的思维不完美,测试是信息获取过程,可以改善软件和开发过程
- Google 软件测试之道:测试技能,管理,在产品生命周期的职责
- 系统检查:
- 运维:Monitoring 101: Collecting the Right Data | Datadog (datadoghq.com)
- 编程规范和最佳实践
- Java
- API:
- How to Design a Good API & Why it Matters (infoq.com)
- Best Practices for Designing a Pragmatic RESTful API | Vinay Sahni
- Ideal REST API design | betim drenica's blog (wordpress.com)
- GitHub - interagent/http-api-design: HTTP API design guide extracted from work on the Heroku Platform API
- The Hypertext Application Language (stateless.co)
- GitHub - shieldfy/API-Security-Checklist:
- RESTful API Designing guidelines — The best practices | HackerNoon
- API Design Guide — API Design Guide 0.1 documentation (apiguide.readthedocs.io)
- GitHub - microsoft/api-guidelines: Microsoft REST API Guidelines
- GitHub - watson-developer-cloud/api-guidelines: :cop: REST API guidelines created for the Watson Developer Cloud services
- Zalando RESTful API and Event Guidelines
- 开发工具:
- Shell
- Markdown:
- JSON
- Git
- 正则
专业基础
- 编程语言:Java、Go
- 理论学科:数据结构和算法、网络模型、计算机原理
- 数组、链表、哈希表、二叉树、排序算法;路径规划、背包、字符串匹配、动态规划、递归遍历
- 应用:比较数组差异的Bloom过滤器;监控实时统计过去一分钟P99的蓄水池算法;数据库B+树索引;Linux内核 epoll 的红黑树;服务调度的背包问题
- 《算法》《算法图解》《算法导论》《编程珠玑》
- Leetcode题目分类:GitHub - haoel/leetcode: LeetCode Problems' Solutions
- 算法:递归(深度优先、广度优先)、动态规划、二分查找、回溯、分治;操作-数组-链表-字符串-哈希表-树
- 编程:atoi, strstr, add two nums, 括号匹配、字符串乘法、通配符匹配、文件路径简化、text justification,反转单词
- https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
- 数据结构与算法分析、数据库系统概念、现代操作系统、计算机网络、计算机程序的构造和解释、编译原理
- 数组、链表、哈希表、二叉树、排序算法;路径规划、背包、字符串匹配、动态规划、递归遍历
- 系统知识:是理论的实践,如 Unix/Linux、TCP/IP、C10K;操作系统资源,性能故障解决
- 深入理解计算机系统(底层数据在内存的表示,流水线指令构成,虚拟存储器,编译系统,动态加载库,用户态应用,描述程序如何映射到系统上和程序如何执行,理解程序的行为和效率低下的原因)
- Unix 高级环境编程、Unix 网络编程、TCP/IP 详解
- Linux C 编程一站式学习、TCP/IP 网络编程、图解 TCP/IP、The TCP/IP Guide;Wireshark 数据包分析实战
- 学习要点
- 操作文件系统,实现一个可拷贝目录树的小程序
- fork/ wait / waitpid 写一个多进程的程序,pthread 写一个多线程带同步或互斥的程序,如 多进程购票的程序
- signal / kill / raise / alarm / pause / sigprocmask 写一个多进程间的信号量通信程序
- gcc 和 gdb 来编程和调试程序
- makefile 来编译程序
- Socket 进程间的通信,C语言写一个 1对1 的聊天小程序,或是简单 HTTP 服务器
- C10K 问题: 操作系统处理大并发请求的问题:请求导致频繁的数据拷贝(缓存IO、内核将数据拷贝到用户进程空间、阻塞),进程/线程 上下文切换的开销大,资源耗尽而崩溃
实践项目
- telnet 写聊天服务器
- 每个客户端使用 telnet ip:port 连接到服务器
- 新连接需要用户名和密码
- 可选择一个聊天室加入聊天
- 管理员有权创建和删除聊天室,普通人员智能加入、退出、查询 聊天室的权限
- 聊天室需要有人数限制,每个人发出的话,其他人都能看到
- HTTP 服务器
- 解释浏览器传来的 HTTP协议,只需要处理 URL PATH
- 列出所有代理目录
- 可以在浏览器上浏览目录下的文件和下级目录
- 点击文件,则把文件打开传给浏览器
- 点击子目录,则进入子目录,把子目录种的文件列出来
- 生产者/消费者的 消息队列服务
- 消息队列采用 Ring-buffer 的数据结构
- 有多个topic 供生产者写入消息和消费者取 出消息
- 支持多个生产者并发写
- 支持多个消费者消费消息
- 消息队列做到不丢数据
- 做到高性能
专业方向
- 底层:操作系统、文件系统、数据库、网络
- 架构:分布式、微服务、DevOps、Cloud Native
- 数据:大数据、机器学习、人工智能
- 前端:用户体验、交互
- 安全开发、运维开发、嵌入式开发
经验积累是看书看不来的,这是转方向的成本
软件设计
需要你自己去实践、用时间、错误、教训、痛苦 才能真正体会到精髓,除了理论知识,你需要大量的工程实践,每过段时间要把自己设计的东西回炉下,需要反复推敲,需要有足够的耐心和恒心
- 编程范式
- DRY、KISS、最少知识、
- SOLID
- SRP Single Responsibility Principal,单一职责;职责是引起变化的原因,一个类只做一件事
- OCP Open Closed Principal,开闭原则:扩展现有代码而不修改
- LSP 里氏替换原则,子类可代表基类
- ISP Interface Segregation Principal,接口隔离原则;使用多个专门的接口,而不是使用单一的总接口,如工作学习接口,上网娱乐接口,计算和数据服务接口
- DIP Dependency Inversion Principal 依赖倒置原则;底层模块依赖高层抽象
- CCP Common Closure Principal 共同封闭原则:一起修改的类放在一个包里,将修改范围限定在一个最小范围的包里使用包的用户必须在新环境下验证;包内加入功能相关的类
- CRP 共同重用原则:一起被重用的类组合在一个包里;包内剔除不使用的类
- 好莱坞原则:组件初始化和调用由容器负责,体现在 1. 容器创建对象 2. 容器连接对象和服务
- 高内聚低耦合:耦合是一个软件中不同模块间互连的度量,内聚则重用和独立,减少多米诺骨牌效应
- Convention over Configuration 约定大于配置:给配置加默认值
- Soc Separation of Concerns 关注点分离;1. 标准化 2. 抽象与包装
- ADP Acyclic Dependencies Principal 无环依赖原则;解决包间的耦合关系 1. 创建新的包:AB相互依赖,把共同类抽在包C中,变成 A依赖C,B依赖C 2. DIP依赖倒置/ ISP 接口隔离
- The Problem With Logging (codinghorror.com)
- Concurrent Programming for Scalable Web Architectures (berb.github.io)
- The Twelve-Factor App (简体中文) (12factor.net)
- 领域驱动设计、UNIX编程艺术,Clean Architecture
Linux 系统、内存和网络
学习到一定程度,从书本中走出去,到社区里和大家一起学习,需要自己找食了,你不需要特别努力,只要日进一步
系统底层:Linux内核,网络,异步IO,Lock-free 无锁编程
Linux系统
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9
- GitHub - 0xAX/linux-insides: A little bit about a linux kernel
- https://lwn.net/Kernel/Index/
- http://learnlinuxconcepts.blogspot.com/2014/10/this-blog-is-to-help-those-students-and.html
- https://www.kernel.org/doc/
- https://planet.kernel.org/
- https://lenovopress.com/redp4285.pdf
- http://www.brendangregg.com/linuxperf.html
- https://blogs.dropbox.com/tech/2017/09/optimizing-web-servers-for-high-throughput-and-low-latency/
内存
计算机网络
- 学习
- 调优
- 协议
异步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的问题
- Schema 非常多,用关系型数据库表示 Schema 很笨拙
- ACID 影响数据库性能和扩展性
设计模型,保证系统稳定性和可用性,数据库是最关键的
关系型数据库
- Oracle:Oracle Database 9i/10g/11g 编程艺术
- MySQL:官方手册、高性能 MySQL、MySQL 技术内幕
- https://shlomi-noach.github.io/awesome-mysql/
分布式架构
工程设计
微服务
容器化和自动化运维
Docker,K8s
机器学习和人工智能
前端
基础和底层原理
性能优化和框架