一:新手上路

1.1基本储备:入门必学的语言和工具

①入门推荐语言:

Python  JavaScript 这些语言的语法比较简单,有大量的库和语法糖

②入门必学工具

操作系统Windows  编程工具Visual Studio Code

③正式入门语言

Java  它是所有语言中综合实力最强的,除此之外还需要更专业的编程工具,比如更专业的操作系统Linux,更专业的编程的IDE(集成开发环境,比如IntelliJIDEA),版本管理工具Git,相关的编程框架(比如Spring Framework)等。

④数学:

至少要学习离散数学中的数理逻辑和集合论,还有能力的话可以深入一下:数学建模,图论,抽象代数,拓扑学,运筹学,博弈论等这些都是机器学习,AI的基础。

⑤英语

英语是编程技能提升的关键,一定要学好英语,尽可能的用英文去检索技术关键词,在技术方面美国是领跑,学好英语有助于我们去源头学习。

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

选择平台时,新人应该判断两件事:这家公司是否面向未来,是否受技术驱动。

第一,这家公司做的事情,能不能适应未来的发展。计算机与互联网的发展都太快,如果要选择,一定优先选走在未来航道上的那些快速发展的公司。

第二,你要去的这家公司是不是一家技术驱动、以技术文化为主导的公司。也就是说要去对技术和软件工程师都非常重视的公司。

1.3认识自己:找到适合自己的路线

一个人要想认识自己,就得看清自己的特长,兴趣,热情。

①特长

你要找到自己可以干成的事,找到别人找你请教的事,这是找到自己特长非常重要的方法。找到特长后,扬长避短就好。

②兴趣 

如果你没有找到自己的特长,就找自己有兴趣、有热情的东西,即使再难再累都不会放弃的事。不怕困难,痴迷其中,就算你没有特长,有了这种特质,你也是头部人才。

③方法

如果你没有特长,也没有兴趣和热情,就要学方法。比如学习时间管理,学习做计划,学习统筹,学习总结犯过的错误,举一反三,学习探究事物之间的因果关系,等等。

④勤奋

如果你前三者都没有,你还能做的事就是勤奋。勤奋注定会让你成为一个比较劳累的人,也是很有可能被淘汰的人。虽然勤奋越来越不值钱。但是只要你勤奋,至少能够自食其力。

1.4编码规范:不要逆着规范做事

新人动手编码前,必须先熟悉公司的规范,特别是编程规范。这样的目的是为了高效协作,你只需要花很少的时间就能看懂,哪怕这个程序你不熟悉或完全没见过。这对提升团队效率的影响是巨大的。

1.5公司差异:即使没有规范,也得自我要求

新人进了公司先要熟悉规范、按规范做事,这是最基础的训练。即使没有规范,也得自我要求。即使公司没有对新员工做相关培训,自己也要有意识的去关注和学习一些规范。

①编码规范

我们需要关注的不仅仅是编码,还有代码评审、单元测试,这些都属于编码规范。

②设计规范

设计规范包括API(接口规范)、设计模式(比如面向对象的设计模式、设计原则SOLID)、架构规范(比如分布式架构规范)等。

③生产规范

生产规范指的是一套标准化的上线流程。比如软件工程师不是写完代码就行,还要做测试,测试完再上线,整个生产流程里有很多规范。

1.6整洁代码:不是写出来的,而是读出来的

代码的整洁程度代表着一个软件工程师的专业素养,不是写的人说自己的代码整洁就算整洁,而是读的人觉得整洁才算整洁。

判断你的代码整不整洁,一个最基本的标准是,读代码的人根本不用问你,只要上下读几行或者看看注释,顺着逻辑就能知道这些代码是什么意思,以及他要用的话该怎么用。

1.7代码注释:像说明书一样清晰

其实我觉得好的注释是,别人带着问题去看你这段代码和注释,看完以后问题就解决了。当我去调用这个模块或者函数时,好的注释直接摆了个例子告诉我,你这样写就好了,就像一份说明书,你去看的时候,脑海里有一个目标,然后它会非常清晰地一步一步告诉你,这样做就可以了。这就是注释应该起到的作用。

1.8编程原则:教科书没有告诉你的“为什么”

①避免重复原则

写代码的时候,如果出现雷同或相似的片段,就要想办法把它们提取出来,抽象成一段独立的代码.然后用这一段代码去解决多种问题。因为这样做既能降低程序的复杂度,又能减少维护的工作量。用一种方式解决多种问题,是避免重复原则的精髓,所以写代码写到高级阶段,其实是做数学建模。

②单一职责原则

一个类或者模块应该有且只有一个职责,简单来说就是各司其职。单一职责原则除了可以把复杂的问题简单化、模块化,从而降低问题的复杂度,让你更容易实现和驾驭,它还是一个可以让你的组件不断复用的原则。

③高内聚、低耦合原则

这是UNIX操作系统设计的经典原则,其中内聚指的是一个模块内各个元素彼此结合的紧密程度,耦合指的是不同模块之间的依赖程度。高内聚,低耦合(也叫解耦)简单来说,是让每一个模块做到独立,做到精益求精,同时把模块间的耦合降到最低,不会因为动了一个模块,而导致其他模块出问题。

④开闭原则

开闭原则具体来说是指,对修改是关闭的,对扩展(协议)是开放的,这是为了保证把稳定的东西放在内核,把易便的东西扔出去,最终保证稳定性和重用性。

1.9解决问题:别把原则当教条

毕竟我们编码的最终目的不是符合哪项原则,而是解决实际问题。程序就是一个解决问题的手段,核心问题是:这个程序真正要解决的问题是什么。

1.10全面思考:做测试比写代码难

①单元测试,一般是白盒测试

单元测试的目的就是测试这些零件是否都能正常工作,可以说,单元测试实力问题最近的地方。

②功能测试,一般是黑盒测试

一个功能是由很多个单元模块组装起来的,如果这些单元模块没有很好地配合在一起,互相矛盾,那整个功能也就不能正常实现了。因此,软件工程必须有功能测试,测一测各个模块合在一起能否正常运转。

③集成测试

从测试的角度来讲,单元测试测的是家庭,功能测试测的是社区,集成测试测的是整个城市的交互。具体到软件工程上,集成测试其实模块和模块之间或者系统和系统之间的测试。

④非功能测试

比如性能测试、安全测试、稳定性测试、健壮性测试、破坏性测试、可用性测试、灵活性测试,等等。非功能测试主要用来检查软件应用程序的非功能性方面(性能、可用性、可靠性等),帮助降低与产品非功能性方面相关的生产风险和成本,优化产品的安装、配置、执行、管理和监控方式。

⑤回归测试

回归测试的意思是把以前做过的测试以及犯过的错误再测一遍。它的主要目的是确保代码或配置的修改、需求的增加不会影响现有的功能。通常来说,回归测试的成本是非常大的,尤其是对那些使用人肉测试方式的公司来说。所以一般来说,回归测试意味着自动化测试。

1.11程序测试:对软件工程师的基本要求

①测试要自己做,尤其不能让用户称为你的测试工程师

②除了测试基本输入以外,还要努力构想更多的边界条件

③测试接口定义的程序语意,而不是当前实现的具体行为

④对重要的模块,编写的时候就要做到基本性能测试

⑤对程序交付以后出现的问题和Bug,要构建相应的测试程序并提交代码库,保证以后回归测试可以自动运行这个测试

二:进阶通道

2.1需求分析:明确模糊不清的问题

①明确问题的边界条件。

比如金额必须要有明确的数字,才算有边界条件,否则程序就没法写。只有把边界条件明确地说清楚,定义出其中的规则和决策方式,软件工程师才能写出程序来。

②关注不可预期案例。

绝大多数人都会把时间花在可预期的事情上,而忘了关注不可预期的、可能出现故障的一些问题。比如当这个程序走到某一步,走不下去了,怎么办? 而软件工程师必须把这些环节明确出来。

2.2设计程序:学会谋篇布局

软件工程师设计程序更多需要的是谋篇布局的能力、思考总结的能力。到这个阶段,就要有一定的独立思考的能力。别人只给你一个问题,你要给出合理的科学的解决方案。

2.3高度抽象:设计需要抽象的能力

所以,从众多的实例、案例中归纳总结出通用的方法和规则,是抽象的核心思想。简单来说就是,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。

①过程抽象

所谓过程抽象,就是把要解决的问题分解为一个个小的子问题,然后用一个个独立的代码模块(如函数、类、API等)来完成,再把这些代码模块组织起来构建成一个复杂的系统。在组织的过程中,消除相似的模块,消除模块间的依赖,尽可能让每个模块都能重用到其他业务场景下。这样就完成了抽象。

②数据抽象

而所谓数据抽象,就是将复杂数据的使用和它的构造分离开来,数据结构用于定义数据的构造,数据接口用于定义数据的使用。通过隐藏数据对象的内部特征,定义数据的外部使用,大大降低系统的复杂度。

2.4原型设计

①从最难得做起

先做最难的部分,既能提早发现问题,又能节省开发时间。如果在原型设计阶段解决了最难的问题,那么后期整个项目的推进就非常顺利。当然,如果你对最难的部分做了评估后,觉得以当下的技术和人员难以攻克,那么整个项目可能就要往后放一放,不必继续浪费时间。

②原型设计的关键是接口

原型设计最根本的哲学不是实现功能,而是要注重接口。因为接口的好坏会直接决定整个项目设计的好坏。做接口设计时,要想一想每个阶段可能会调用哪些接口、每个接口需要哪些字段、怎样定义数据,等等。只有把这些问题想清楚,才能避免不确定因素对项目整体的影响。

2.5架构设计

①分而治之,理清思路

架构设计就是把需求进行抽象和分解。作为设计架构的人,首先你要知道怎样把同类型的内容抽象出来,还得知道实现目标要分成哪些步骤,以及怎么从大的步骤里切出小模块(设计模式)

②考虑异常情况和极限情况

第一,考虑系统的异常情况。我们必须假设任何环节都会出问题,都会出现异常,并基于这种假设,去做更周全的架构设计,我们需要知道每个异常出现后应该怎么解决。

第二,考虑系统的极限情况。我们做一个系统,就要提前考虑这个系统最大能承受多大的流量,在发生一些极限情况时,系统会怎么反应。

2.6技术调研:寻找最优解决方案

技术团队经常会接到一些以前没做过的需求,不太确定实现细节,这时候就需要做技术调研,看看同样或类似的需求在业内有没有被实现过,分析不同方案的优缺点,得出结论,做出决策。

①调研做得好不好,和阅读代码的能力高度相关。代码读得越快,意味着你的搜索能力越强,越能快速定位自己想要的东西。

②分析优缺点,结合场景才有效。做技术调研会涉及分析不同方案的优缺点,这时候需要注意,分析优缺点不能泛泛而谈,因为优缺点只有在场景下才成立,如果缺少场景,那么只有特点,没有优缺点。

2.7软件工程:不同的开发模式

①瀑布式开发模式。这是一种传统的软件开发模式,简单来说就是一层一层地开发。先分析需求,产生需求文档;再做概要设计,技术选型等;接着做详细设计,事无巨细地梳理流程和细节;最后编码、测试、上线。它的缺点就是慢。

②敏捷开发模式。它的意思是我在做雕像前,先由一个高手把框架开发出来,然后把后续的任务拆解成一个个小模块,拆得越碎越好,接着让每个团队(甚至每个人)负责其中一块,大家根据协议并行开发,最后拼在一起。它的本质是化繁为简,比较高效。

③班车模式。意思是我的发布每周一次(比如每周二),如果你能赶得上就跟着一起发,如果赶不上就等下一班。这种模式看上去像是瀑布和敏捷的一种折衷方式。为了控制变更的需求,开发不要太快,也不要太慢,按一定的节奏来。

④分布式微服务开发模式。也就是把代码库、数据库全部分开,每个服务都由一个全功能的小团队(前端、后端、开发、测试、运维、产品)来负责,这样就可以把一个大部门拆分成多个小分队,让代码更容易维护和上线。团队之间也能非常方便和高效地协作。

2.8外部沟通:知道怎么“规训”业务

要告诉业务,不要把技术仅仅当做需求的解决方,只有真正的把技术当做解决问题的参与方,技术的主观能动性才能被调用起来。其次,不要直接将需求丢给技术,而是要告诉技术真正想解决的核心问题是什么。最后,我们面临的所有问题都不是单纯的技术问题,大家一起努力,才能从根本上解决问题。总之,技术只有知道如何和业务沟通,才能把需求实现好。

2.9内部协作:平衡前台团队和中后台团队

在技术团队里,我们通常把离业务近的团队叫作前台团队,把离业务远的团队叫作中后台团队。之所以出现问题,就是离业务近的同学觉得离业务远的同学做的东西都没用,离业务远的同学觉得离业务近的同学做的东西太短视。

这其实是一个长期目标和短期目标平衡的问题。

这时候,就需要大家相互理解,从后向前,中后台要有意识,主动去理解前台团队的需求;从前往后,前台团队也不能仅仅因为业务的压力,就用短期目标来要求中后台团队做不合理的事情。中后台团队要围绕着前台团队去建设,去创造价值,去解决前台的需求和痛点,甚至在前台团队还没有看到之前就预见出一些可能发生的问题,从而给前台团队提供有价值的服务,这样双方都能达到一个比较好的平衡。

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

①用好知识树。

任何知识,只在点上学是不够的,你需要在面上学,这叫系统地学。系统学习要求你去总结并归纳知识树或知识图。我们以C++为例,看一下知识树是什么样的。对于一棵树来说,“根基”是最重要的,所以,学好基础知识非常重要。

②探索知识缘由。

任何知识都是有缘由的,了解一个知识的来龙去脉和前世今生,会让你对这个知识有非常好的掌握,而不再只是靠记忆去学习。当然并不是所有的知识我们都需要了解缘由,对于一些操作性的知识,比如一些函数库,只要学会查文档就好了。

③掌握方法套路。

学习不是为了找到答案,而是为了找到方法。就像数学一样,你学的是方法,是解题思路:会用方程式和不会用方程式的人,在解题效率上不可比较。掌握高级方法的人比别人的优势有多大,学习的目的就是为了掌握更为高级的方法和解题思路。

笔记 | 这就是软件工程师(一)相关推荐

  1. 《这就是软件工程师》里的推荐书单

    这本书是访谈了四位一线软件工程师,个个都是大牛: 郄(qiè)小虎,腾讯公司副总裁.用吴军老师的话说,"谷歌中国历史上最好的工程师,没有之一,当属郄小虎." 陈皓老师,是软件工程师 ...

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

    第一部分  行业地图 选择:一线和次一线城市机会巨大 1.北京 2.上海.深圳.杭州 3.成都.广州.南京.厦门 4.福州.苏州 软件工程师的四大台阶: 阶段 能力 1 新手阶段 执行力 2 进阶阶段 ...

  3. 《这就是软件工程师》- 每位软件工程师值的看的一本书,尤其是刚刚步入IT行业的年轻人

    文章目录 第一部分|行业地图 1.现实:为什么会有996? 1)行业处于特定的发展阶段 2)公司组织管理问题 2.进阶:软件工程师的四大台阶 1)新手阶段[执行力] 2)进阶阶段[设计能力] 3)高手 ...

  4. Udacity机器人软件工程师课程笔记(五)-样本搜索和找回-基于漫游者号模拟器-自主驾驶

    9.自主驾驶 在接下来的环节中,我们要实现漫游者号的自动驾驶功能. 完成这个功能我们需要四个程序,第一个为感知程序,其对摄像头输入的图片进行变换处理和坐标变换使用.第二个程序为决策程序,功能是帮助漫游 ...

  5. 汇编程序设计与计算机体系结构软件工程师教程笔记:总结

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  6. 汇编程序设计与计算机体系结构软件工程师教程笔记:处理器、寄存器简介

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  7. 赞!Google 资深软件工程师 LeetCode 刷题笔记首次公开

    有人说写代码就像我们平时开车,仅凭经验你就可以将车开走:但当有一天,这辆车出问题跑不起来的时候,你不懂汽车的运行机制,你要怎么排除和解决问题?所以拥有扎实的数据结构和算法,才能开好编程这辆车. 作为程 ...

  8. Google 资深软件工程师 LeetCode 刷题笔记首次公开

    BAT 等国内的一线名企,在招聘工程师的过程中,对算法和数据结构都会重点考察.但算法易学难精,我的很多粉丝技术能力不错,但面试时总败在算法这一关,拿不到好 Offer.但说实话,数据结构和算法花点时间 ...

  9. 软件工程师的核心竞争力是什么-笔记

    前言 干了几年的开发,最近也在思考我的核心竞争力是什么.现在是90后出道了,我该怎么不被替代呢.最近看极客时间<软件工程之美>发现了几个要点.以下是学习笔记. 作者提出软件工程师的核心竞争 ...

最新文章

  1. mysql建索引java_MySQL 索引
  2. .net面试题汇总-第二篇
  3. 申请阿里云服务器并远程登录
  4. (Mybatis)缓存
  5. 成长为一名Java架构师需要掌握的技术有哪些呢?
  6. app 之间发送文件 ios
  7. 《丁丁历险记系列之委托》改编自《.NET委托:一个C#睡前故事》
  8. 小白盒子无线打印服务器,玩转无线打印、共享打印机,蒲公英X1盒子和小白学习盒子谁更好...
  9. NoSuchMethodError: No virtual method(Ljava/io/File;)V in class Landroid/media/MediaRec
  10. JSONP跨域以及CORS跨域
  11. Githut Token (hidden): Githut 安装验证
  12. 广东电大计算机绘图试题,电大CAD计算机绘图本实验1小抄参考
  13. 必备的网络常用测试命令(ping命令)
  14. 本地计算机用户组,管理本地用户与组账户
  15. 如何用git命令生成Patch和打Patch(git format-Patch和git am)
  16. 省钱兄(APP+H5+公众号+小程序)自营商城源码分销系统社区团购线上线下核销吃喝玩乐系统源码前端模板
  17. composer windows 下面内存溢出 Allowed memory size of 1610612736 bytes exhausted
  18. 金纳米粒子修饰MIL-101骨架材料(AuNPs/MIL-101)/负载COF-TpPa-1(Au NPs/COF-TpPa-1)|齐岳试剂
  19. 从 1 秒到 10 毫秒!在 APISIX 中减少 Prometheus 请求阻塞
  20. 互联网日报 | 快手电商8月订单量超5亿单;阿里犀牛智造正式亮相;中通快递启动香港首次公开募股...

热门文章

  1. python集合可以修改吗_python集合是可变的吗
  2. PHP实现文件下载的两种方式(GuzzleHttp和Curl)
  3. php study 配合伪静态,phpStudy V8 Apache伪静态的配置教程图文说明,快米云
  4. 机器人布里茨说什么_蒸汽机器人布里茨攻略是什么(机器人重做)
  5. android settext内容乱码,Android解决TextView setText显示乱码
  6. java 字符串所在位置_java 查找字符串所在的位置
  7. 在AE中,通过表达式实现数值增长,文本数字变化
  8. [发布]看天气WeatherCan V1.0 ---气象数据分析系统web版
  9. 高速公路ETC卡签之我见5-国标密钥体系介绍
  10. 网站安全评估系统的设计概述