《这就是软件工程师》读书笔记

第一部分  行业地图

选择:一线和次一线城市机会巨大

1.北京

2.上海、深圳、杭州

3.成都、广州、南京、厦门

4.福州、苏州

软件工程师的四大台阶:

阶段

能力

1

新手阶段

执行力

2

进阶阶段

设计能力

3

高手阶段

融会贯通的能力

4

行业大神阶段

沉淀方法论和开创新领域的能力

35岁不是年龄的坎儿,而是能力的坎儿。

持续学习是刚性要求。

分类:交互(UI)、系统(前后端)、算法、数据分析、测试、运维

第二部分  新手上路

1.入行前

正式入门语言:Java

操作系统:Linux;

编程IDE:IntelliJ IDEA;

数据库设计工具;

编程框架(Spring Framework)

离散数学中的数理逻辑和集合论 (数学建模、图论、抽象代数、拓扑学、运筹学、博弈论(机器学习、AI的基础))

选择平台:去面向未来、技术驱动的公司

  1. 这家公司做的事情,要适应未来的发展
  2. 技术驱动、以技术文化为主导的公司

需求分析——>设计(技术调研、原型设计、架构设计等)——>编码——>测试

新人阶段: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.学习进阶

打牢基础,以不变应万变

打牢自己的理论基础,比如编程的一些方式、修饰模式(添加新的行为的设计模式)、解耦、提升代码重用度等。

技术基础

程序语言

语言的原理,类库的实现,编程技术(并发、异步等),编程范式,设计模式……

系统原理

计算机系统,操作系统,网络协议,数据库原理……

中间件

消息队列,缓存系统,网关代理,调度系统……

理论知识

算法和数据结构,数据库范式,网络七层模型,分布式系统……

搭建体系:用知识树系统学习

主动学习:提高你的学习效率(讨论实践,教授给他人(写博客、做分享))

第四部分 高手修养

预见未来:软件工程师要有前瞻能力

权衡利弊:软件工程师要有取舍能力

攻克难题:主动寻找技术难题;尝试不同解决方案

关键决策:技术选型的六大要素

  1. 看这项技术解决的是不是大问题。(主观)
  2. 看这项技术解决问题的方式是否让人有想象空间。(主观)
  3. 看有没有大公司撑腰(客观)
  4. 看有没有很好的技术社区(客观)
  5. 看有没有杀手级应用(客观)
  6. 看有没有经历10年以上的时间(客观)

代码评审:不是“做出来”,而是“做漂亮”。

Google’s Code Review Guidelines

  1. 设计:代码是否经过精心设计并适合系统?
  2. 代码是否符合开发者意图?代码对用户是否友好?
  3. 复杂性:代码是否可以更简洁?未来其他开发人员接手时,是否易于理解与易用?
  4. 测试:代码是否经过正确且设计良好的自动化测试?
  5. 命名:开发人员是否为变量、类、方法等选择了明确的名称?
  6. 注释:注释是否清晰有效?
  7. 风格:代码是否遵循了谷歌的代码风格?
  8. 文档:开发人员是否同步更新了相关文档?

含金量高的比赛:

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.影视

《黑客帝国》、《硅谷传奇》、《代码奔腾》、《骇客追缉令》、《代码》、《社交网络》、《源代码》、《环形使者》、《她》、《模仿游戏》、《互联网之子》、《史蒂夫•乔布斯》

你可能感兴趣的:(读书笔记,软件开发,软件工程师)