前言
聊聊大学期间学习的《软件工程导论》吧,长这个样子:
刚上这门课的时候,我上课是很认真的,我很致力的去听课去学习,然而我发现我对书上的这些 UML 办法、麻利开发流程啊,有一点了解,但如同又悬浮在我四周。于是在学了一个月之后,我就开始翻起了我所感兴趣的书籍,有的时候是玩手机。课程完结之后,我感觉如同学到了一些货色,比方 UML、软件工程开发模式(瀑布开发、麻利)、ER、面向对象五个根本准则等。然而我感觉又是什么都没学到,随着这门课的完结,这些概念缓缓的从我的脑袋缓缓中淡去,随着编码的变多,我开始扫视我的代码,以下问题呈现在我的脑海:
- 面向对象的五个根本准则该如何取舍,这五个根本准则是无条件要恪守的吗?
- 该如何对待咱们的软件?
- 那些软件开发模式又是什么?
- 该如何掂量一个软件工程师?
- UML 有那么重要吗?
- 设计软件该如何设计?
- 设计一个框架、一个库、一个应用型软件的不同在什么中央?
这兴许就应该是软件工程答复的问题,但为什么我过后学习《软件工程导论》的没有这种感觉呢? 兴许是过后的代码量比拟少吧,我在上《软件工程导论》的时候,还没尝试构建过一个小型的我的项目,兴许是教学方式的问题,这门课的授课形式还是那种老师在下面讲书上的概念,相似于语文课的模式,老师是经验过软件开发的,然而过后的咱们没有合作开发过,兴许对”软件”有一点了解了,但此时对于工程还没有领会。兴许《软件工程导论》这门课自身就应该是在实践中学习 (learning in doing) 的课程。
我心愿失去以上问题的答案,于是我打算重学软件工程,然而我并不想再用《软件工程导论》这门教材,我在豆瓣中发现了另一本软件工程的教材《构建之法》,我大抵试看了几章,感觉这本书能答复下面我提出的问题,于是我就买了下来,认真读了一下发现还有意外播种,现将读书笔记分享给诸君,心愿对诸君会有所帮忙。
该如何掂量一个软件工程师?
往年我换了工作,也经验将近十几场面试,我是一名 Java 后端工程师,所以面试的次要技术点如下:
- 汇合: LinkedList ArrayList CopyOnWriteList HashMap ConcurrentHashMap
- 框架: Spring Spring MVC Spring Cloud Spring Boot MyBatis
- 数据结构与算法: 排序算法、二叉树
- 计算机网络: UDP、TCP、HTTP、HTTPS、WebSocket
- 数据库: 索引、SQL 优化、事务、事务的隔离级别
- JVM: 垃圾回收算法、垃圾回收器
- 多线程: 线程池 CountDownLatch 锁
面试的根本流程个别是: 口试 -> 技术面(可能是几面)->HR 面。面试官面试的办法大多都是问答题模式,有的是看了我的博客和冀望薪资问的特地细节往偏了问,而有的则是想到哪问到哪,也有一些让我感觉比拟有意思的面试,逐层深刻。面试之后我就在思考这么一个问题,这样的形式面试是对的吗?这样就可能掂量一个软件工程师吗?我之前加过一些技术群,看到了一些应届生的面大厂的状况,大厂仿佛也是这么个面试办法,问答题。大厂是可能引领技术风潮的,我在跟他们交换的时候,仿佛普遍认为搞搞分布式、算法和数据结构、设计模式、源码,这些是最能掂量一个软件工程师。这也造成了一个循环圈,大厂面这些技术点,而后各个技术视频讲如何答。那这些是对的吗?这样的形式仿佛从我毕业开始面试就是这样,问了之前教训比拟丰盛的同时,仿佛三年前的面试也是这样,从来如此,便对么。
那我问我本人如果让你去面试呢?你会如何面试一个人,你会如何问呢?或者更进一步如何掂量一个软件工程师呢?
问: 你的职业是软件工程师吗?
答: 是
问: 你感觉你的”职业”到哪一水平?
答: 嗯,我在一个能发工资的中央下班,靠我的软件技术挣钱,所以我相当的职业。
问: 像职业篮球队员那样职业?
答: 差不多吧。
问: 职业篮球队员都有很具体的记录阐明,例如,上面的表格阐明了 NBA 职业篮球远动员的赛场体现:
图表显示了队员出场次数、首发、工夫、投篮、命中率等。作为一个职业软件工程师,你有相似的数据阐明你所有的职业流动和问题么?
答: 嗯…… 没有。。惟一的数据是我的”上场工夫”还是挺长的,而且常常打加时赛—加班。
要用图表来掂量一个软件工程师仿佛有点艰难,软件工程师从事的工作仿佛更为简单一点,那如何掂量一个软件工程师呢?
我认为能够从以下几个方向去掂量,或者软件工程师能够思考从以下几个方面去成长:
- 积攒软件开发相干的常识,晋升技术技能(如对具体技术的把握,入手能力)。
-
积攒问题畛域的常识和教训(例如: 对游戏、医疗和金融行业的理解)
第一点和第二点在简历上大多都能够看失去,也能够比拟容易的检测进去,随着教训的增长,一个工程师能够把握更宽泛、更深刻的技术和问题畛域的常识。
-
对通用的软件设计思维和软件工程思维的了解
这一方面就比拟虚,什么是好的软件设计思维?什么是好的软件工程思维? 一个工程师开了博客,转发了很多他人的文章,折算有思维吗?另一个工程师保持做任何设计都要画 UML 图,这算有思维吗?
- 晋升职业技能(区别于技术技能)
职业技能包含: 自我管理的能力,表白和交换的能力,与人单干的能力,按质按量实现工作的执行力,这些能力在 IT 行业和其余行业都很重要。 - 理论成绩
绝大部分软件工程师的工作成绩都是能够公开的,你参加的产品用户评估如何?市场占有率如何?对用户有多大的价值。你在其中起了什么作用?行胜于言,这些理论工作成绩,是最重要的评估规范。
我目前浅显的认识是绝大多数软件工程都会抉择第一个方面去成长,残余几个方面大多没人会想,也很少会有人去想到。
该如何对待软件工程
该如何对待软件
简直所有的程序员都晓得: 程序 = 数据结构 + 算法。那这里咱们天然提出了一个问题软件是什么? 软件对应的英文是 software,
是能够运行在计算机及电子设备中的指令和数据的有序联合。软件有各种分类办法,个别咱们将软件分为上面几种:
- 系统软件: 操作系统、设施驱动程序、工具软件等
- 应用软件: 用户应用它们来实现工作,从治理核电厂到写文章,或者是通信、游戏、浏览网页、播放视频等。
- 恶意软件: 软件病毒等。
那么我用 Java 写了一个 HelloWorld , 像上面这样:
这个算是一个程序吗?算是。算一个应用程序吗?勉强算是,它的用户仿佛只有我,利用场景就只有输入 Hello World 保保平安。那他算是一个软件吗?仿佛并不算是,回顾一下《软件工程导论》中介绍的软件,参与者和面向的用户都比拟多,而且相对来说生命周期比拟长。像我下面写的那个程序仿佛运行后果进去之后,他的生命周期就完结了。因为它的作用仅仅是给我贴图用的。那么当一个程序有了许多用户之后呢?这些用户都对这个程序有着不同的需要,咱们思考的仿佛就要很多了,咱们不仅要保障满足需要,而且要保障服务质量。这让我想起小孩子在沙滩上会用沙子搭建小的城堡,那这些小孩子用沙子搭的小房子算的上是建筑物吗?并不算是,因为这些小房子没人能够住进去。那么咱们要搭建起供人所寓居的房子呢?咱们就应该用工程的角度去考量了,因为这要思考的货色很多,比方工期(预计多长时间实现)、建筑面积、建筑风格,房子的使用寿命。
咱们将建房子类比到开发软件,也是同样的,当这个软件一开始的设计初衷是面向一定量的用户的时候,写程序就不可能那么涣散随便,咱们也要思考工期,软件架构,软件的使用寿命。那么咱们能够将软件这个概念往前推广和拓展一下,即软件 =
程序 + 软件工程。为什么是软件工程呢?因为软件工程不同于土木工程,比方一栋曾经修建实现的二十层高楼,快竣工的时候,没人会提出在这二十楼层上面加一个地下室,然而软件开发畛域你会经常看到这样的改变需要。
该如何对待工程
工程是罕用在日常呈现的频率是很高的,生物工程、土木工程等等,那什么是工程?
工程: 创造性地应用科学原理,设计和实现修建、机器、安装或生产过程; 或者是在实践中应用一个或多个上述实体;或者是实现这些实体的过程。
从远古到当初,人们相互合作建成了不少工程奇观,其中有些当初还能看到(例如希腊雅典的帕萨特神庙、古罗马帝国的罗马水道、中国的长城等),封面选的图片是阅江楼,一座六百年后才实现的设计,对于阅江楼的介绍能够参看文末的参考资料。
咱们设想这些工程在设计和建造的过程中肯定牵扯了大量的打算、计算、各类角色的合作,以及成千盈百的人、动物、机械经久不息的劳作。这些因素在起初呈现的各种”工程”(如化学工程、土木工程、软件工程)中仍然存在。
写到这里,我忽然想起了在大学的时候,班里组织过的一次我的项目较量,就是用本人的所学写一个我的项目,咱们过后刚学完 Servlet、JDBC、HTML、CSS、JavaScript、JQuery,咱们过后天然自信满满,跟有的同学在探讨,有的同学信念满满的示意 Java 不就是 CRUD(增删改查)嘛,咱们找个后盾模板,写写 CRUD 就行。过后基本上所有的同学都这么想吧,于是找了个后盾模板,节俭在前端页面的工作工夫,没有什么设计指标,很简略的调配。有些同学在数据库上花了一段时间,用 ER 图画了又画,但最终大同小异,最终做进去的软件都是为了应酬作业而已。我过后参加的项目组是这样的,我的我的项目组长打算做一个美妆社区,项目组有个同学想用原型图画一下软件应该是什么样,然而起初有同学反馈咱们做的我的项目还太小,杀鸡焉用牛刀,具体的分工就是这个页面相干的表、后盾设计都划分到一个人身上,但最终目标是什么呢?咱们仿佛也没有一个明确的共识,合作也是随便的划分了一下。过后做的软件就像是一间压根就没打算给人住的茅草屋,一阵风吹来,这间房子就塌了。
然而如果是真的是面向用户呢,就是你做的软件是要有人用的呢?咱们就须要设计指标,工作加护,开发流程。软件在某种程度上像是屋宇,但有点不同,一栋楼建完之后构造上曾经根本不可能有太大的变动了,然而软件不一样,软件又很像一座城市,在布局城市倒退的时候,咱们不可能欲速不达,把城市建设搞得太超前,城市总是随着经济的倒退,人口的增多,扩路、布局新城区(对应软件的用户质变多之后的代码重构)。
从修建的角度来说,没有人会认为建房子只有搬砖、和水泥,这仿佛对应到服务端就是增删改查,咱们是在用这些构建一个工程,在构建的过程中,咱们思考的点有: 安全性、易用性、性能。这也就是思考问题要思考全面,不要做盲人摸象,只看到一部分便感觉那是一个整体。
该如何去对待软件工程?
到了这里咱们曾经探讨过了软件、工程,大抵失去了一个推论: 软件 = 程序 + 软件工程,那什么是软件工程:
软件工程是把零碎的、有序的、可量化的办法利用到软件的开发、经营和保护的过程。
软件工程包含下列畛域: 软件需要剖析、软件设计、软件构建、软件测试和软件维护。
软件工程和下列的学科相干: 计算机科学、计算机工程、管理学、数学、我的项目管理学、品质治理、软件人体工学、系统工程、工业设计和用户体验设计。
下面的公式是一个相对来说有点狭窄而简略的公式,狭义的软件工程也包含用户体验、用户界面设计等。
咱们下面提到过程序 = 数据结构 + 算法,那是不是能够把这个等式带入到下面等式中呢?
软件 = 程序 + 软件工程 = 数据结构 + 算法 + 软件工程。
这样带入是不能够的,事实上,下面的加号咱们能够了解为和,一个好的软件,即便性能和同类软件区别不大,但却会让人感觉十分好用。这就是软件的用户体验(User Experience)。用户体验和数据结构、算法并没有间接的关系(如果你非要说我写的 SQL 让响应速度很慢,这样用户体验也很差,你也看到很多修建品质十分好,然而也被评为失败的修建),然而很多十分胜利的软件就赢在这个方面。
对于程序 = 数据结构 + 算法这句名言,简直所有的程序员都晓得,然而在理论的学习和工作中,也有不少人产生了疑难:
- 我用 C 语言实现了二叉树的遍历算法。在这里,二叉树是数据结构,遍历的实现细节是算法,C 程序是后果。然而这个程序有什么用途呢? 在 Java 和其余一些语言中,仿佛没有指针,那我能够不用理解二叉树吗?
- 我成了一名职业程序员,然而我发现所有的算法他人都曾经实现了,我只有调用就能够。仿佛咱们公司的软件与数据结构、算法的关系不大。那我当初辛辛苦苦学习的数据结构和算法有用吗?如何辨别一个好的程序员和不好的程序员呢?
- 我下班后,发现以前共事写的程序真垃圾,基本看不懂,无奈保护。我要颠覆重写! 起初一个老员工笑嘻嘻地通知我,咱们当初看到的程序,就是去年的新员工推到重写之后的后果,大家反映还没有以前的版本好用呢。
我这里想有的重构只是将原先他人的代码格调换成本人的格调而已。到这里咱们仿佛能够得出这么一个论断,程序 (算法、数据结构) 是基本功,然而在算法和数据结构之上,软件工程决定了代码的品质;商业模式影响了一个软件企业的成败。
写在最初
本文次要是《构建之法现代人软件工程》的读书笔记,以我的形式将《构建之法》讲述的货色组合了一下,是一篇读书笔记。
封面的图片是阅江楼,过后在写这篇笔记的时候,感觉软件工程和土木工程有点像,于是就想想找一些漂亮而又胜利的修建图片,然而我又想一栋高楼建完之后,还会大规模的调整结构吗?应该是不会的,这是相当危险的行动,然而一个软件在面对不同的用户量,是会缓缓的调整外部的构造的,这是软件工程绝对于其余工程的不同点。
参考资料
- 新中国成立后建成哪些特地有格调的修建?
- 《构建之法古代软件工程》第三版 作者邹欣