第一部分 行业地图
选择:一线和次一线城市机会巨大
1.北京
2.上海、深圳、杭州
3.成都、广州、南京、厦门
4.福州、苏州
软件工程师的四大台阶:
阶段 | 能力 | |
1 | 新手阶段 | 执行力 |
2 | 进阶阶段 | 设计能力 |
3 | 高手阶段 | 融会贯通的能力 |
4 | 行业大神阶段 | 沉淀方法论和开创新领域的能力 |
35岁不是年龄的坎儿,而是能力的坎儿。
持续学习是刚性要求。
分类:交互(UI)、系统(前后端)、算法、数据分析、测试、运维
第二部分 新手上路
1.入行前
正式入门语言:Java;
操作系统:Linux;
编程IDE:IntelliJ IDEA;
数据库设计工具;
编程框架(Spring Framework)
离散数学中的数理逻辑和集合论 (数学建模、图论、抽象代数、拓扑学、运筹学、博弈论(机器学习、AI的基础))
选择平台:去面向未来、技术驱动的公司
- 这家公司做的事情,要适应未来的发展
- 技术驱动、以技术文化为主导的公司
需求分析——>设计(技术调研、原型设计、架构设计等)——>编码——>测试
新人阶段:1.养成良好的工作习惯 2.培养自己的执行力
2.编码
代码规范、设计模式、架构模型、运维和开发的最佳实践
(1)编码规范
行业规范:《代码大全(第二版)》、《代码整洁之道》、《重构:改善既有代码的设计》、《程序员修炼之道:通向务实的最高境界》
(2)设计规范 (API接口规范、设计模式、架构规范)
《设计模式:可复用面向对象软件的基础》、《架构整洁之道》、《微服务设计》、《数据密集型应用系统设计》、《Web API的设计与开发》
(3)生产规范(一套标准化的上线流程)
《人月神话》、《SRE:Google运维解密》、《持续交付:发布可靠软件的系统方法》
优质代码:
(1)初级:可读
命名有意义;布局清晰;注释明确……
(2)中级:可扩展
可维护(面向对象和函数式的设计模式,比如状态机、声明式编程、SOLID、IoC/DIP)
(3)高级:可重用
代码可以用在很多场景(轮子可以用在马车、汽车、飞机上)
DSL、面向对象的设计模式、Web Service、”Codeless”
复杂度一般由业务逻辑、控制逻辑和数据逻辑组成,业务逻辑决定了复杂度的下限,控制逻辑决定了复杂度的上限。 分开è 解耦
设计模式、函数式编程、DSL、状态机、插件、依赖倒置和反转控制等
整洁代码:不是写出来的,而是读出来的(方便他人阅读)
代码注释:像说明书一样清晰(函数的功能以及如何使用它,example)
编程原则:
(1)避免重复原则(DRY, Don’t Repeat Yourself)
抽象成数学模型,数学建模;用一种方式解决多种问题
(2)单一职责原则
一个类或者模块应该只有一个职责(各司其职)
简单化、模块化、让你的组件不断复用
(3)高内聚、低耦合原则
内聚:一个模块内各个元素彼此结合的紧密程度
耦合:不同模块之间的依赖程度
让每一个模块做到独立,做到精益求精,同时把模块间的耦合降到最低,不会因为动了一个模块,而导致其他模块出现问题。(没有依赖就没有伤害)
(4)开闭原则
对修改是关闭的,对扩展是开放的。
3.测试
程序测试包括:单元测试、功能测试、集成测试、非功能测试、回归测试等。
种类 | 目的 |
单元测试(白盒测试) | 测各个模块(零件)是否都能正常工作 |
功能测试(黑盒测试) | 各个模块合在一起能否正常运转 |
集成测试 | 模块和模块之间或者系统和系统之间的测试 |
非功能测试 | 检查软件应用程序的非功能性方面(性能、可用性、可靠性等) 性能测试、安全测试、稳定性测试、健壮性测试、破坏性测试、可用性测试、灵活性测试等 |
回归测试 | 把以前做过的测试以及犯过的错误再测一遍,确保代码或配置的修改、需求的增加不会影响现有功能 |
- 做测试最好的方式不是用人工,而是写代码。自动化测试
- 想要做好测试,先训练自己全面思考的能力。
4.成长论
1.拆分任务:动手工作前,先做任务分解
2.阅读代码:重要的不是写代码,而是读代码
读什么样的代码?(1)被反复使用的代码(2)穿越时间的代码(3)好调试的代码
3.找到捷径:通读牛人代码
4.追本溯源:多读文档,多读书
第三部分 进阶通道
1.设计程序
原型设计:面向用户,提前打个样。
(1)先做最难的部分,既能提早发现问题,又能节省开发时间。
(2)原型设计的关键是接口
架构设计:面向开发人员,一份详细的施工蓝图。
包括概要设计(high level desogn)和详细设计(low level design)
《设计模式:可复用面向对象软件的基础》
(1)分而治之,理清思路。
(2)考虑系统的异常情况和极限情况。
技术调研
(1)调研做得好不好,和阅读代码的能力高度相关。
(2)分析优缺点,结合场景才有效。
2.项目管理
开发模式
开发模式 | 特点 | 具体实现 |
瀑布式开发模式 | 传统,一层一层开发 缺点:慢 | 先分析需求,产生需求文档; 再做概要设计,技术选型等; 接着做详细设计,事无巨细地梳理流程和细节; 最后编码、测试、上线。 |
敏捷开发模式 | 做一点发一点,小步快跑,快速迭代 本质:化繁为简 | 先把框架搭出来,把后续任务拆解成一个个小模块,让每个团队负责其中一块,大家根据协议并行开发,最后拼在一起。 |
班车模式 | 瀑布和敏捷的折衷 按一定节奏 | 我的发布每周一次,赶得上就跟着一起发,赶不上就等下一班。 |
分布式微服务开发模式 | 所有团队之间没有工程上的依赖,大家耦合在一个标准的开发模式和框架上,能非常方便和高效地协作。(DevOps开发模式) | 把代码库、数据库全部分开,每个服务都由一个全功能的小团队来负责。 |
验证效果:做A/B test,用数据说话。
监控打磨:上线前做好监控与压测(一般可上10倍的压力)
3.学习进阶
打牢基础,以不变应万变
打牢自己的理论基础,比如编程的一些方式、修饰模式(添加新的行为的设计模式)、解耦、提升代码重用度等。
技术基础
程序语言 | 语言的原理,类库的实现,编程技术(并发、异步等),编程范式,设计模式…… |
系统原理 | 计算机系统,操作系统,网络协议,数据库原理…… |
中间件 | 消息队列,缓存系统,网关代理,调度系统…… |
理论知识 | 算法和数据结构,数据库范式,网络七层模型,分布式系统…… |
搭建体系:用知识树系统学习
主动学习:提高你的学习效率(讨论,实践,教授给他人(写博客、做分享))
第四部分 高手修养
预见未来:软件工程师要有前瞻能力
权衡利弊:软件工程师要有取舍能力
攻克难题:主动寻找技术难题;尝试不同解决方案
关键决策:技术选型的六大要素
- 看这项技术解决的是不是大问题。(主观)
- 看这项技术解决问题的方式是否让人有想象空间。(主观)
- 看有没有大公司撑腰(客观)
- 看有没有很好的技术社区(客观)
- 看有没有杀手级应用(客观)
- 看有没有经历10年以上的时间(客观)
代码评审:不是“做出来”,而是“做漂亮”。
Google’s Code Review Guidelines
- 设计:代码是否经过精心设计并适合系统?
- 代码是否符合开发者意图?代码对用户是否友好?
- 复杂性:代码是否可以更简洁?未来其他开发人员接手时,是否易于理解与易用?
- 测试:代码是否经过正确且设计良好的自动化测试?
- 命名:开发人员是否为变量、类、方法等选择了明确的名称?
- 注释:注释是否清晰有效?
- 风格:代码是否遵循了谷歌的代码风格?
- 文档:开发人员是否同步更新了相关文档?
含金量高的比赛:
GCJ(Google Code Jam)、Facebook Hacker Cup、KDD Cup
第五部分 行业大神
丹尼斯.里奇(Dennis Ritchie) | C语言之父,UNIX系统联合发明人 | 保持简洁 |
林纳斯.托瓦兹 | Linux之父,开源运动的发起人,发明git版本控制器 | 只是为了好玩 |
吉多.范罗苏姆(Guido van Rossum) | Python之父 | 允许不完美、保持开放 |
玛格丽特.汉密尔顿(Margaret Hamilton) | 拯救人类登月计划 | 制定规范,严格测试 |
杰夫.迪恩 | 开创分布式系统 | 开创新领域 |
法布里斯.贝拉 | QEMU、FFmpeg、TinyC、QuickJS | 一个人就是一支队伍 |
第六部分 行业清单
1.书籍
零基础
《python编程快速上手》、《python编程:从入门到实践》
正式入门
《代码大全(第2版)》、《Java核心技术卷I》、《Spring Boot实战》、《鸟哥的Linux私房菜:基础学习篇》、《MySQL必知必会》、《重构:改善既有代码的设计》、《修改代码的艺术》、《代码整洁之道》、《代码整洁之道:程序员的职业素养》、《程序员修炼之道(第2版):通向务实的最高境界》、《高效能程序员的修炼:软件开发远不只是写代码那样简单……》、《人月神话》、《编码:隐匿在计算机软硬件背后的语言》、《黑客与画家:硅谷创业之父Paul Graham文集》、《完美软件:对软件测试的各种幻想》、《Google软件测试之道:像Google一样进行软件测试》
专业进阶
(1)编程语言
Effective Java、《Java并发编程实战》、《Java性能权威指南》、《深入理解Java虚拟机(第2版)》、《Java编程思想(第4版)》、《精通Spring4.x:企业应用开发实战》、《设计模式:可复用面向对象软件的基础》、The Go Promramming Language
(2)理论学科
《算法(英文版第4版)》、《算法图解》、《算法导论(原书第3版)》、《编程珠玑(第2版)》、《数据结构与算法分析》、《计算机程序设计艺术》、《数据库系统概念》、《现代操作系统》、《计算机网络(第4版):自顶向下方法》、《计算机程序的构造和解释(原书第2版)》、《编译原理:原理、技术与工具》
(3)系统知识
《深入理解计算机系统(原书第2版)》、《Unix环境高级编程(第2版)》、《TCP/IP详解 卷1:协议》、《TCP/IP网络编程》……
(4)软件设计
《领域驱动设计:软件核心复杂性应对之道》、《Unix编程艺术》、《架构整洁之道》
(5)高手进阶
《计算机网络(第5版)》、《HTTP权威指南》、《高性能MySQL(第3版)》、《深度学习》、《从0到1:开启商业与未来的秘密》……
2.影视
《黑客帝国》、《硅谷传奇》、《代码奔腾》、《骇客追缉令》、《代码》、《社交网络》、《源代码》、《环形使者》、《她》、《模仿游戏》、《互联网之子》、《史蒂夫•乔布斯》