工程哲学
工程哲学适用于软件开发、产品管理、架构设计、用户体验设计等多个工作领域。
软件工程
虽然我们在工作中会不断面对新技术、新名词、新实践方法,但就世界运行的底层逻辑来说--一切都是哲学问题。
系统设计 101 使用视觉效果和简单的术语来解释复杂的系统,帮助我们快速进入架构设计的世界。
Unix 设计哲学
17条Unix的设计哲学, 引用自 《Unix 编程艺术》
Python 之禅
云原生 12 要素
系统架构演进
Scaling webapps for newbs & non-techies
面向对象设计原则
Principles of Object-Oriented Design
敏捷开发
敏捷实现过程会划分如下几个颗粒度:
- Task(任务)
- Millstone(里程碑)
- Release(发布版本)
多个任务=新版本,若新版本周期比较长,用户可能会焦急等待,这时候就会发布 Millstone 的中间结果。
多元化团队
一个优秀的软件团队,需要各种不同类型的人才:
- 具备商业思维和产品化思维的高层
- 具备产品化思维的产品经理
- 人际关系良好的团队粘合剂人才
- 卓越的项目解构能力的项目经理
- 单点突破的技术好手
- 指哪打哪的技术执行者
- 有耐心的重复任务执行者
看板
看板是一种简单高效的工具,它适用于多人协作的任务视图
Issue
将问题分解成可以由个人主导完成的 Issue 是至关重要的工作哲学。
文档
软件工程文档是一个总称,涵盖了涉及软件产品开发和使用的所有书面文档和材料。所有软件开发产品,无论是由小型团队还是大型公司创建,都需要一些相关文档。整个软件开发生命周期(SDLC)会创建不同类型的文档。存在文档来解释产品功能,统一与项目相关的信息,并允许讨论利益相关者和开发人员之间出现的所有重要问题。
文档类型众多,但抽象起来,其实就是两种类别:
- Product documentation(产品文档):包含描述产品生命周期的需求、设计、架构、原型等开发者所需的相关的文档,另外一方面包括用户所需的操作手册、管理员手册、API手册等
- Process documentation(过程文档):管理产品开发过程的项目计划,测试计划,报告,标准,会议记录等
产品文档中的需求文档(PRD)又是最为关键的部分,它包含用不同的角色的所需解决的问题、人机交互设计、是否符合商业目标等内容,它需要用精准的文字来描述目的、功能和行为。
编写需求文档的时候,很多人会不经意陷入技术陷阱:“谈需求的时候,牵扯实现;讲宏观的时候考虑微观”。
Websoft9 工程化过程中,主要有如下几种必须的文档:
- 需求说明书(PRD):成品需求的描述
- 备注(Notes):产品开发过程中的注意事项与创意想法记载
- 用户手册(User Guide):最终用户的操作指南
- 管理员手册(Administrator Guide):软件安装、维护的系统管理手册
- 开发者手册(Developer Guide):软件架构说明、软件核心功能(函数)参数说明、软件插件的开发指南、软件代码合并与开源协作等面向开发者指南
多路复用
线程与进程
开源思维
传统的开发(相对于开源来说),受制于封闭的代码和自雇团队的人力模式,导致有局限性。
长期在这种环境下工作,可能会养成如下的思维定式:
- 任何事情喜欢自己动手折腾到底,即调研和实施全过程都独立完成
- 觉得沟通成本高,还不如自己搞定来得方便
- 编写的文档主要是给“懂的人”看,文风晦涩难懂而当事人未察觉
- 80%的时间用在基于已有的知识和技能创作解决方案,20%的时间寻找工具,重复低效地造轮子
与传统开发局限性思维相比,开源思维的好处更多:
- 集成化思维:先设计架构,再找工具(组件),最后通过集成形成解决方案,减少重复造轮子
- 全球化视野:产品面向全球开源,推动文档、readme、issue英文化,自然形成全球化思维
- 广泛的人力:全球开源参与人才广泛,理论上都为我所用
- 利他主义观:开源文化倡导“我为人人,人人为我”
协作
代码分支
项目在 Github 存在 main 和 dev 两个分支,其中 main 是主分支,dev 是开发测试分支。
- 本地同步-dev分支
- dev 分支合并到 main 分支需要人为确认
两人协作工作制
在复杂任务中采用专业协作、多人分工的工作流程。
一般有两种角色:
- 需求者
- 架构师
需求者即工作的发起者、业务负责人,例如:产品经理、营销经理等。
架构师是具备专业素养的技术设计能力,两者角色配合的工作流程如下:
最核心的原则:
- 需求方自行在设计工具上创作一个草图,同时编写设计需求
- 设计师在需求方的工作成果基础上进行进一步创作
包管理
测试
以下是对软件测试理论进行的结构,便于快速掌握测试技术哲学:
测试工作先要明白测试对象是什么?测试对象是对软件组件或模块进行功能、性能和接口三方面的测试。
测试对象是主线,结合下面的几个维度,最终转换成一个个具体的测试任务(通常叫做测试用例):
- 时间:开发、上线前、上线中、维护中
- 方法:白盒、黑盒、灰盒、静态、动态、自动、手工
- 维度:函数级测试、最小单元功能级测试、场景级测试
UI 设计工程
UI 设计也是一门技术,而且是对综合知识要求极高的工程技术。
如下想系统的学习 UI 设计,最好的方式是研读:《了解 143 个设计系统》
UI 设计技术的本质:设计单元化组件的组合,最终形成统一的风格。
它与软件技术是同等的技术哲学,最好由三层结构实现:
- 单元化组件:单元化组件是可以被图片引用,并无需任何更改即可使用的设计元素。 例如 字体、颜色、矢量图标、插画、照片等
- 盒子化中间件:具有一定的“盒子化”特征,单元的设计具有整体性,不可被分割,但又比最小单元展示出更多的内涵
- 整体系统:网页、画册、场景化图片
架构师
企业架构师
所谓架构师,就是掌握大量设计理念和原则、落地到各种语言及附带工具链(生态)下的实践方法、垂直行业模型理解,定制系统模型设计和工程实践规范细则,进而控制30万+行代码项目的开发便利性、可维护性、可测试性、运营质量的资深研发群体。
设计架构师
如果我们准备在设计上提升能力,那么必须有一个设计架构师的角色。
之所以称之为架构师,是因为需要这个角色能够对设计进行系统化设计,包括:
- 设计工作整体规划
- 设计建模
- 业务流程规范化
- 单元化组件制作
- 设计工具选型
- 设计风向与迭代
当前,我们继续解决的问题包括:
- 设计工具选型
- 单元化组件制作
技术高手-不可低估的意志
掌握了方法论,也只是解决故障的一个方面。实际上,还有一个方面与它是相辅相成的,那就是问题处理者的软实力。
个人软实力(Soft Power ),是指难以直接估量的能力,比如思维学习、沟通表达、文化修养、团队协作等能力。
技术价值观
技术价值观就是:摆正位置,放弃陈旧观念,从思想上彻底改造自己。
- 一切的软件问题均可解决,解决不了是因为你还没有驾驭此项技术的能力
- 事出必有因,请找出符合逻辑的因果关系
- 故障归因于成熟的组件错误(或缺少基本功能)时,不妨扪心自问自己对它了解了多少
- 故障天天有,解决一个算一个,生命不止解决问题不息
- 对于新事物,在没有深度研究与实践下,请勿妄下结论
- 解决问题的工具是存在的,普通能力的人十有八九找不到合适的
- 敢于担当 Owner,是快速成长的关键
- 解决问题后收获不到快乐,说明你不合适
学习、思考与总结
- 广度与深度:微观蕴含宏观,宏观包含微观,广度与深度并不冲突
- 通俗化:对于精英人才来说,承担总结、辅导和架构的责任,以通俗易懂的方式掌握核心要点方可引领团队
- 战略思考:不谋全局者,不足谋一域;战略上清晰,执行上少走弯路;战略上模糊,执行上低效
- 实践效率:做精准的实验,少做类比实验
- 搞清楚一个系统的主要突破口:系统架构以及组件的连接关系
- 解决掉一个问题的主要突破口:主要矛盾与次要矛盾,矛盾的主要方面与次要方面
沟通、表达与协作
- 理论实践结合:一边解决问题,一些总结别人看得懂的文字
- 说不清楚 && 写不清楚 = 没有掌握;说得不通俗 && 写得不通俗 = 没有深刻掌握
- 三个臭皮匠=一个诸葛亮,多邀请他人参与故障会诊可事半功倍
- 沟通=问问题或反馈问题
- 任何情况下的低级错误,都不可以推卸责任,即便是“我是按照×××说的去做的”
- 驾驭效率工具和能人,集中可用的资源进行问题单点突破
斗争与意志力
方面 | 强者表现 | 弱者表现 |
---|---|---|
定位 | 为结果负责 | 别人怎么看我(刷存在的价值) |
犯错 | 发自内心的自我批评和反思 | 不断安慰自己并告诫外界:这事情本来就很难 |
心态 | 与问题斗争,其乐无穷 | 视问题为严重的精神负担 |
耐力 | 咬住不放,问题没有解决,吃不下饭,睡不着觉 | 找到问题无法解决的理论依据,草草了事,快速交差 |
人际关系 | 扫清解决问题路上的一切人际沟通障碍,深刻理解“胜利者是不受谴责的” 的做事哲学 | 不好意思打扰别人,不好意思得罪别人,担心别人不爽,担心他人对自己有看法 |
参考书目
- 《计算机体系结构》 智能时代计算机类专业教育计算机类专业系统能力培养 2.0 研究组
- 《Linux从入门到精通》 何明 中国水利水电出版社
- 《计算机组成原理》 电子科技大学精品课程
- 测试理论基础(思维导图)
- Unix 哲学基础
- CSE 代码-与工程手册(微软开发手册)
- Kubernetes 中文指南/云原生应用架构实战手册