这就是软件工程师-概
Part1——行业地图
什么人?
软件工程师喜欢简单,行事简单,穿着也简单,喜欢格子衬衫。
他们喜欢让程序代替他们干活,喜欢创新。
当然这都是夸的——“普世低调的创新精神,理想主义的工匠精神”
tips:看来我还没有入行,以上说的我都喜欢,但是只能够买得起格子衬衫……
薪资高?
各个国家的软件工程师薪资都很高,企业架构师、软件工程经理、软件开发经理、应用开发经理、解决方案架构师、数据架构师、IT项目经理、程序架构师、用户体验经理、网站运维工程师——这些都属于软件工程师的范畴,并且他们的薪资都很高,Top前25的那种。
并且软件工程师的全球化程度很高,内部流动性大,所以其收入水平接近,整体都很高。
驱动力?
从敲出Hello World!
,到做出自己的小玩意儿,成就感真的是满满的,软件工程师最底层、最原生的驱动力是成就感,高收入只是副产品。代码开源能够说明——自己的代码开源后能够被大家使用,有极大的满足感和荣耀感。
tips:书里说比尔盖茨和贝索里是利益驱动型的,收入高也能够带来满足感和成就感啊;没人和钱过不去,只是别太看重?
就业选择?
推荐想要成为软件工程师的同学去大城市:
- IT公司多,就业机会要更大——北上广深的上市IT公司数量已经占了全国的80%以上。
- 人口多,软件工程师的学历和工作经验的溢价高——在大城市,因学历和工作经验高低造成的薪资差距更大。
- 大城市的软件工程师年均工资增速快
- 人口流动大,工作机会多。
996?
996就是早上9点上班,晚上9点下班,一周工作6天。
为什么会有996?而且仅在国内?
- 行业的发展是有其规律的。国内的互联网行业处于原始积累阶段,人口多,利益多,争流量才是王道。国内的互联网公司大都不在创新,而是在现有基础上搞营销、搞模仿,先把同行比下去再说,所以为了竞争,工作量变得很大,挣得的利益也不多。实际上,占领创新的高点才能够减轻企业的危机感。
- 公司的组织管理能力不足。国内很多公司的组织效率有问题,导致软件工程师白天不停地被打断,杂事一大堆,只能晚上加班。不能够混淆行动与进展、忙碌与多产。早上组织会议,将一天的工作分配下去,会议上重要说事情,之后的工作时间专心工作不被打扰。
四个阶段?
- 新手阶段——执行力,初入职场,上级分配任务明确,更多需要行动起来,保质保量完成工作即可;
- 进阶阶段——设计能力,上级给出问题,自己需要把问题抽象拆解,并独自设计解决方案;
- 高手阶段——融会贯通,这个阶段对应的通常是架构师,需要其明白各种变化、导致变化的原因以及未来发展方向,将技术演进、需求变化、未来发展等多个维度结合考虑;
- 大神阶段——沉淀方法、开拓创新,通过行业内的经验总结沉淀出一个方法,适用于各类问题,能够被别人学习使用;顶尖的人才会创新出新的技术。
四个阶段是一个金字塔,半数以上的软件工程师都能够到达进阶阶段,不到三分之一能够到达高手阶段,不到百分之一的人能够到达大神阶段。
35岁就完了?
35岁的问题出在国内……
一般来说,35岁前能够学到高手阶段附近,差不多干到退休也没问题,但是国内的氛围不允许。国内的许多公司面临较大的变化,今天做这个,上线之后发现没用就不做了,换别的,公司觉得你只要把这个功能实现了就行,不需要考虑的面面俱到,整体上对专业技术的能力重视程度不够。
到了35岁左右,即使硕士毕业也有10年了,如果10年还没有到达一个资深工程师的水平,被淘汰也是不可避免的。
IT行业不存在年龄的坎儿,只存在能力的坎儿。
公司的核心成员
创始人/合伙人
需要拥有的素质和能力:
- 做出贡献——能够引进资源、吸引人才、带来经济效益和社会效益
- 带动团队——自主驱动,带领团队制定、实施计划,推动落地
- 创新优化——能够提出创新,并将创新推动和执行
- 前瞻能力——感知行业变化,思考行业未来并做好准备
- 总结能力——问题抓重点,能够标准化问题,实现规模化、平台化
贡献者
需要具备的能力:
- 拓路能力——只要方向没问题,就能够无路开路
- 贡献方法——提出好的方法和创意
- 解决难题
- 提高标准——自身进行反馈,提高标准
行家
- 降低成本——为公司在执行层面上降低时间、财力、物力、人力成本
- 提高效率——能够找到最佳路径
- 防火能力——提前发现重要问题,提前解决,避免意外发生
持续学习?
软件工程师是在读一所终身大学,需要不断地学习提高自己。如果能够因为每天学到新东西取得进步而感到高兴,这类人就很适合成为软件工程师。
持续学习的最低标准是与时俱进学习新技术,否则逆水行舟,不进则退,被行业淘汰。
工种多?
上面介绍薪资的时候就提到了,软件工程师的工种很多。大体分为:交互、系统、算法、数据分析、测试、运维六个方向。
IT行业不仅工种多,而且还会有新工种频繁出现,有了大数据分析后就出现了算法工程师和数据工程师等。
将来还有虚拟现实、脑机接口、城市大脑等相关技术,相对应也会有新的工种出现。
遍布各行各业?
打字机刚刚诞生时,会有打字员这一职业。但是现在几乎人人都会用电脑,打字员的工作也基本消失了。
汽车刚刚普及起来的时候,拿到驾照的人很少,司机算是一个好职业,但是现在驾驶技能也普及了。
现在会编程看似门槛很高,可能一两代人之后的孩子们会从小就很熟悉编程,现在编程就已经在少年儿童中大规模普及了。
软件工程师也不会仅仅呆在软件公司和互联网公司中,各行业都会有软件开发部门,软件工程师也会成为各行各业的基本人才配置。
Part2——新手上路
语言工具
入门必学:操作系统Windows、编程工具Visual Studio Code
入门语言:Java
额外掌握:数学知识——离散数学、数学建模、图论、代数、拓扑学、运筹学、博弈论;英语语言知识(因为好多技术源代码大多是美国领跑)
平台选择
选择能够适应未来发展,有光明前途的平台。IT行业发展速度太快,新陈代谢也很快,不要因为高薪资而加入一个即将淘汰的公司。优先选择未来能够高速发展的公司,他们解决的问题是新的,学习的技术是新的。职业生涯初期,应当培养好扎实的编程能力和良好的职业素养,将来才能够走远
路线选择
路线选择依据:特长——>兴趣——>方法——>勤奋
编码规范
每个公司都有自己的编码规范。日益增加的代码库,若是不统一规范,就会将大量时间花在读懂代码上面,更加不好维护。为了高效工作,大家会遵循同一套规范,这样不管代码是谁写的,不管是谁看都能花很少时间看懂代码。
有规范的公司会对新员工进行相关培训。有:
- 编码规范:大部分公司的编码规范都是公开的,其中还包括代码评审、单元测试等。
- 设计规范:包括接口规范、设计模式、架构规范等等。
- 生产规范:是指一套标准化的上线流程。
每个公司都会根据自己的发展方向对以上规范做出调整。
优质代码
- 初级:可读,命名意义明确、布局清晰、注释明确、逻辑合理。
- 中级:可扩展,可以维护,可以更方便的添加新功能。(面向对象、函数式设计模式)
- 高级:可重用,写出一次可以用在很多的场景中。(DSL、Web Service、Codeless)
整洁代码
心里装着将来要阅读这段代码的人,从方便阅读的角度去布局设计;因为不是写的人说自己的代码整洁就算整洁,而是读的人觉得整洁才算整洁。
编程原则
编程原则的目标是优化,基础分为四个
避免重复原则、单一职责原则、高内聚低耦合原则、开闭原则
程序测试
单元测试,对单个组件、模块进行测试
功能测试,对某个功能进行测试,而不关心其内部设计
集成测试,测试模块与模块之间或者系统与系统之间的继承
非功能测试,测试用户不直接关心,开发者关心的部分,性能测试、安全测试、稳定性测试、健壮性测试等等
回归测试,将之前做测试的错误再测一遍
修改BUG
初入公司的任务多是修改BUG,修改BUG需要缕清上百万行代码的结构逻辑,不停改代码和重启服务器,试错成本也大大提高。
寻找BUG可以模拟BUG、二分法找BUG、调试工具找BUG、极限测试、通过一步步解释代码找到BUG
阅读代码
阅读代码和阅读书籍是类似的。
被反复使用的代码要详细读,他往往是标杆;
经过时间沉淀的代码要细读,其设计思想还在流行;
易调试的代码要多读,好调试也就比较容易读
学习指导
学习牛人的方法,别抄答案;和高手一起解决问题;和优秀的人一起工作;
Part3——进阶通道
交流沟通
需求时,一定要明确模糊不清的问题,明确边界,关注不可预期的案例
程序设计
学会谋篇布局,有核心、有偏重、无遗漏
学会抽象,即找到一种通用的方法和规则,对于软件的抽象常用有二,过程抽象和数据抽象
过程抽象是将要解决的问题抽象成一个一个可解决的小问题,最后组织起来解决大问题
数据抽象是将数据使用和构造分离开,前者使用数据接口,后者借助数据结构,降低系统复杂度
原型设计
原型设计最根本要注重接口。
好的接口设计要多想几步,注重其在方案中的作用
架构设计
分而治之
考虑异常、极限情况
项目管理
瀑布式开发,一层一层的开发,分析需求——概要设计——技术选型——详细设计——编码测试——上线项目
敏捷开发模式,将项目模块化,每个团队负责一块,根据协议并行开发,最后拼在一起
班车模式,每一段时间发布一次,赶不上就等下一班车
分布式微服务开发模式,将代码库数据库分开,每个服务都由一个团队负责,便于维护和上线
技术基础
- 程序语言:语言的原理,类库的实现,编程技术,规范变成,设计模式
- 系统原理:计算机系统,操作系统,网络协议,数据库原理
- 中间件:消息队列,缓存系统,网关代理,调度系统
- 理论知识:算法和数据结构,数据库范式,网络七层模型,分布式系统
Part4——高手修养
前瞻能力
有知识的广度,要去读论文,读业内各大公司的资料,去各个公司做广泛的交流,保证有足够多的不同信息进入你的视野
多做跨行业的交流,特别是投资人创业者等见多识广的人群
取舍能力
明确目标也就是做好决策,之后做好预测最终完成取舍
技术选型
宏观上看这项技术解决的是不是大问题,以及预测是否有很大的进步空间
微观上看有无大公司撑腰,有无成熟的技术社区,有无杀手级应用,是否经过时间沉淀
代码评审
谷歌的评审指南
- 设计:代码是否经过精心设计并适合系统?
- 功能:代码是否符合开发者意图?代码对用户是否
友好? - 复杂性:代码是否可以更简洁?未来其他开发人员接
手时,是否易千理解与易用? - 测试:代码是否经过正确且设计良好的自动化测试?
- 命名:开发人员是否为变量、类、方法等选择了明确
的名称? - 注释:注释是否清晰有效?
- 风格:代码是否遵循了谷歌的代码风格?
- 文档:开发人员是否同步更新了相关文档?
管理者?
实力服众,要证明自己有一定的技术水平和素养。
摒弃个人英雄主义,核心功能交给团队去做
有说服他人的理由,会说服他人的方法
Part5——行业大神
大神们的传奇故事