第一部分 行业地图
选择:一线和次一线城市机会巨大
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
一个人就是一支队伍