在准备这个专栏的时候,我跟专栏策划和一些朋友探讨过专栏的内容和提纲。大家一致认为,内容都还不错,涉及到了软件开发的很多重点。但是覆盖面太广,每个知识点可能都不会太深入,当时我们还开玩笑说这是“浅显易懂”。然而前几天我请学校的朋友帮我在学校推广的时候,却得到了这样的反馈:感觉有点懵,甚至有些标题都看不懂。得到这个反馈之后,我恍然大悟:浅不一定显,浅显也不一定易懂。因此,我写这篇导读,希望对软件开发实践尚浅,甚至刚接触软件开发相关知识的同学们有些帮助。

772msc.com:软件工程和大学课程

本文地址:http://795.ib911.com/cloumn/blog/390
文章摘要:772msc.com,辉煌开元棋牌 是另一个局面竟然能逼得钟柳使出隐藏手段 气势直接把他锁定但师徒二人谁也说服不了谁葵水之精和离火之晶一寒一热。

同学们都是在学或想学软件开发的,那么我们不妨了解一下软件开发过程中的一些关键节点。整个软件开发的过程是软件工程,包含了从想要制作一个软件开始到制作该软件结束的整个过程,如下图所示:

同学们从学校课程中学习的知识,都是为软件工程的各个节点服务的。

  • 需求工程相关的课程是为需求阶段服务;
  • 程序设计、面向对象程序设计、程序设计语言等课程是为开发阶段服务;
  • 数据结构、算法、数据库原理、设计模式与重构等课程是在为设计阶段服务;
  • 软件测试相关课程是为测试和验收阶段服务;
  • 计算机网络、安全对抗相关技术是为运维阶段服务;
  • 软件工程、项目管理等课程是为整个软件工程和产品迭代服务;

可能到这里有些同学就开始懵了 —— 好多课程的名称都没听说过啊!是的,计算机科学还有不同的分支,有倾向于工程管理的软件工程专业,有倾向设计开发的应用程序开发专业,有倾向于信息传输和信息安全的信息工程专业……每个专业都有不同课程安排,目的是为了让同学掌握某一个方面的专业知识,之后再从这个集中的知识点逐渐向相关知识扩散充实。学习快的同学,在学校就可以通过选修课来扩充自己;稍慢一些的同学,也可以在工作中逐渐接触、学习和领悟相关的内容。

本专栏导读

这些知识和我们这个专栏有什么关系呢?

我们的这个专栏叫做《JavaScript 全栈工程师养成记》,其中“全栈”就表示这个专栏涉及到的知识点会非常多,要多到一定的程度,才可能称为全。“工程师”表示这个专栏讲述的是软件工程相关的内容。软件工程的理论中涉及到很多抽象的概念,这些概念在专栏中通过“JavaScript”相关的知识来落地。

JavaScript 是一种编程语言,主要用于 Web 编程,所以本专栏的内容除了通用的软件开发知识之外,还会涉及到 Web 软件开发的一些相关知识。JavaScript 目前还少有学校选入教学课程,但是同学们对它也不会感到特别陌生,因为 JavaScript 是从 Java 语言发展而来的,它和 C/C++、Java、C# 等语言具有血亲关系,语法非常相似。

我们这个专栏从需求开始,逐渐带领同学样了解开发各个阶段的知识。同时通过一些实例帮助同学们理解。本专栏除开序和导读,共有 16 章内容:

1. 需求

做软件首先要确定我们的目标 —— 要做个什么样的东西出来。搞明白要做个什么东西是需求工程的主要工作。需求工程就是通过需求调研、挖掘、分析和整理、设计等过程,最终将需求从一句简单的描述,勾勒出最终要实现的软件长什么样子。

同学们在学校做课程设计的时候,老师会明确的告诉你需要做一个什么样的东西,达到什么效果可以得分。但是在实际工作中,大部分客户不能描述清楚他们需要的东西长什么样子,这就需要利用需求工程的相关知识去找出客户真实想要的东西。

2. 设计

学校的课程中会在程序设计语言、数据结构、算法、设计模式等课程中讲到设计的一些理论。做课后习题通常是非常小的任务,不需要专门去进行设计,但在做课程设计和时候就需要同学样去思考如何实现各种需求,这个思考过程就是一个设计过程。设计的过程中我们可能会用到一些工具,比如流程图、时序图、类图、IOP图等等,它们可以辅助思考过程。关于设计的思考会产生设计文档这样的输出,用于固化设计成果和交流。不管怎么样,对于设计,思考才是最重要最核心的部分。

本专栏的设计分为了前端设计和后端设计两个部分。

前端主要思考的是呈现和操作,即内容呈现、布局、操作(交互)以及多个界面之间的调用关系等。专栏文章中还提到了一些用户体验感相关的内容,这部分相对来说不是那么容易理解。不过换个角度,把我们自己当作软件的用户,要怎样的设计才会让我们觉得好用(注意是“好用”而不是“能用”) —— 这就是用户体验感。

后端的设计侧重于数据、业务和安全。大学里数据结构、数据库原理及应用等课程就是数据设计的基础。业务设计主要根据需求来进行,和数据密不可分。举个例来说,我们做一个任务管理系统,实际就是对任务数据进行添加、删除、修改、改变状态和显示等。

在专栏的前几章中,设计可能是最难理解的部分,因为建立设计概念是一个缓慢渐进的过程,需要学习思考方式,掌握方法,总结经验并灵活运用。所以这一部分如果实在看不明白也没关系,通读一遍,在脑海中形成一些印象,在以后的学习和实践中慢慢领悟吸收。

3. 数据

相对于设计来说,数据就要好理解得多,因为我们的生活中到处都是数据以及对数据的应用。比如去超市买东西,所有物品的单价就是数据,收银的时候根据购买各种物品的数量,乘以单价,再进行汇总就得到了一次购物需要支付的金额 —— 这些都是数据以及对数据的应用。

离同学们近一些的例子就是成绩。每个学生每个学科的考核成绩都是一个个单一的数据,汇总起来可以分析哪个班的同学学得好,哪个同学比较擅长哪些专业方向,甚至,如果发现一个一惯成绩优秀的同学在某科上考砸了,那他是不是在那段时间发生了什么事情,是否需要特别关怀?

数据很重要,但也不能随意保存,保存得太散乱就难以查找,保存得过于冗余会大大增加占用的存储空间……所以我们会学数据结构、数据库原理、数据库应用相关的课程来把数据设计好、保存好、利用好,让他们以较低的存储和传输成本,发挥较大的作用。

4. 程序

程序在专栏中是放在第 4 章,但对于计算机专业的同学们来说,可能最先接触的专业课程却是程序设计 —— 因为程序设计相对容易入门,也是其它专业知识落地实践不可或缺的工具。

专栏中主要介绍了 JavaScript 以及由它发展而来的类型化语言 TypeScript。好多同学学的第一门语言可能是 C 或者 C++,也有可能是 Java,它们都是强类型语言。类比之下,有强类型约束的 TypeScript 可能会比 JavaScript 更容易理解。所以同学们在学习 Web 编程语言这件事情上,在 JavaScript 和 TypeScript 中可以选择一门自己更容易懂的语言来学习,采用先易后难逐个击破的策略。

无论如何,最终还是需要搞明白 JavaScript,毕竟 TypeScript 在现阶段仍然需要转译成 JavaScript 来执行,TypeScript 中有些坑(比如类型擦除)还是要从 JavaScript 的角度思考才能理解。

5. 开发不只是写程序

专栏前面几章都是知识性的内容,这一章却是讲的编程习惯。习惯对于一个人来说是非常重要的资源,如果利用好了会事半功倍。想想,刚开始学打字的时候是不是非常痛苦,但后来为什么可以达到想到什么就打出来什么的程度呢?这就是因为长期练习打字养成了一种条件反射般的习惯。

所以,从字第一句程序开始,就按照良好的编程规范来编写程序,长期坚持,就会形成一个良好的习惯。乍看起来这个习惯只是带来了语法规范的好处,实际上,它带来的好处还包括大辐提升开发效率,甚至可以养成良好的开发逻辑思维。

6. 数据结构和算法

数据结构和算法是软件开发中最重要的内容,所以被称为程序的灵魂。学校里学习的数据结构和算法课程都是基础课程,实际工作中开发应用软件的时候,对数据结构和算法的要求也不是特别高。因为大部分常用数据结构和算法都已经被各种库封装好了,可以直接拿来使用。

不过即使如此,同学们还是需要掌握数据结构和算法基础,并在实际学生和工作中去思考如何应用这些已知的数据结构和算法库。专栏中通过一个简单的例子说明了算法的重要性,也介绍了一些常用的数据结构,希望同学们在学校的学习中特别重视这两门课程。

7. 设计模式和重构

软件业发展这么多年,前辈门积累了大量的经验和教训,于是总结出来一些“武功秘籍”,这就是设计模式。GoF 的 23 种设计模式只是最常见的设计经验总结,并非全部。我们在软件设计和开发的过程中,也并不是一开始就严格的按照设计模式来进行,而是在软件演进的过程中逐渐地演变和应用设计模式。

专栏中以几个设计模式为例,对设计模式和重构在软件演进过程中的应用进行了讲解。帮助大家理解,软件并非一次就能完美成型,它需要不断的变化,改进。

8. 运维

一个软件开发出来,最终总是要运行的,任何软件在长期运行的过程中需要进行维护。运行和维护,就是运维。

软件要能运行,这是一个最基本的要求,所以对于运行,不需要过多的去说明。但是维护却往往被忽略,相对于运行来说,维护是一个保障工作,它分为外部维护和内部维户两个部分。外部维护通过对软件环境的优化、清理,对运行日志的分析等手段来优化和保障正常运行。而内部维护则是在软件设计和开发过程中给软件添加功能以外的一些特性来保障软件的正常运行。这些特性包括:容错性、安全性、可维护性等等。

对于一个软件工程师来说,内部维护非常重要也非常容易被忽略。希望同学们在开发软件时,哪怕只是一个课程设计作业,也不要忘掉容错、安全和可维护性,把思考这些问题变成一种习惯,时刻融入到设计当中。

9. 软件工程

软件从开发到生成并不是一个简单的过程。同学们可能会觉得,写一个 HelloWorld 很简单啊,打开 IDE,几句话,F5 就运行出来了。但是谁会在实际工作中使用一个 HelloWorld 来提高工作效率呢?

通常一个应用系统会有非常复杂的程序结构,这些程序结构可能是从最简单的语句,通过不断的改进和重构写出来的,但是这些复杂的源代码如何组织,如何最终生成可执行的程序(目标代码)?

一个人难以完成的情况下,多人如何进行协作开发?开发过程中发生意外,代码不见了怎么办?交给客户运行的到底是从哪里编译出来的软件?

严格的说这些问题不是技术问题,而是管理问题。我们可以通过一定的技术手段和工具来协助管理。作为一个工程师,不管你是管理者的角色还是被管理者的角色,都不可能避开管理问题。所以软件工程就算不是兴趣所在,也还是需要了解一下的。

10. 前后端分离架构

从第 10 章开始,我们的专栏内容开始从概念和理论逐步向实践转移了。前后端分离很流行,但到底是个什么东西呢?学校的课程里似乎没学过啊!

那么,有没有学过模块呢?如果不清楚什么是模块化,在学习程序设计语言的时候,学过函数吧。我们把一些处理封装在函数中,只提供简单的输入输出接口,可以将程序中的部分职责分离出来,让程序的最外层结构变得简单,这就是模块化思想。

举个例来说,每次大扫除,妈妈会指挥:小明你去厨房扫地,小红你去房间收拾桌面,小明你去擦客厅的窗子,小红打房间的地,小明把水倒了……一次大扫除下来,就算妈妈什么都不做,也累得够呛。于是妈妈决定给小明和小红分工,每次大扫除,小明都负责厨房,小红都负责房间,分别按照特定的打扫顺序进行打扫。然后妈妈的指令开始变得简单:小明,开始;小红,开始 —— 这就是模块化带来的优势。

应用的前端和后端职责分离开来,各司其职,就是前后端分离架构。

11. 前后端通信技术

什么是通信?我告诉你一些信息,你反馈我一些相关的信息,这就是通信。所以函数调用的本质是一种通信。

前后端分离之后就不能简单地通过函数调用来通信了,因为前端和后端之间被网络隔离,需要更复杂,更宏观的通信技术。最基本的当然是 Socket 通信,但是自定义通信协议很是麻烦,为了解决这个麻烦,发展出了基于 Socket 的 RMI、Remoting 等通信技术规范;然而这些通信技术规范与特定的开发言语强相关,为了进一步分离,发展出了 Web Service 规范;目前应用较为广泛的是不需要太多封装就能实现的 Web API,严格的说它是 Web Service 的一种形式,但是我们一般习惯于将它独立出来讨论。

12. UI 设计

UI 设计与前端的各个技术部分相关性不是太大,但 UI 是人机交互的重要界面,简单地说,UI 实现了人和机器的通信。所以,在这里我们要研究和解决的问题是,如何让人与计算机的通信变得轻松,而且实现起来还能有条理,结构化,易于修改。

13. 前端框架

UI 设计中我们学习了设计的理念和方法,可是一步步实现起来还是非常耗神费力的。那么,为什么不用别人的设计呢?网络上、社区内存在大量成品 UI 框架,选一个自己喜欢的,符合设计需求的不就好了?如果现成的 UI 都不能满足要求,在现有的框架基础上进行扩展修改也比从头开写轻松得多啊。那么我们应该如何来选择框架呢?

14. 后端框架

JavaScript 的重心虽然在前端,但是全栈嘛,怎么能把后端忘了呢。不过后端同样存在大量的框架可以选择。这些框架是什么?有何特点?又该如何选用呢?

15. 打磨轮子,让架构更合用

软件界有句很经典的话“不要重复制造轮子”,意思是不要把别做过的东西再做一次。我并不完全赞同这句话,但至少我们已经在前两章中找到了轮子。别人的轮子不一定适用于我们的车体,所以还需要打磨。

这一章会基于特定的应用场景,应用前面提到的前后端通信,讲解异步思想在前后端通信和其它一些地方的重要性,以及各种各样的工具库。在做这些事情的同时,我们还要思考,是否把它做成好多种车体都可以使用的“底盘”,还是连整个车架都做成通用的,在通用和个性之间,如何找到一个平衡。

16. 全栈无止境

作为专栏的结尾,我给读者们留下一些思考的空间 —— JavaScript 在行业发展的过程中应该如何发展,适应这个新技术新概念层出不穷的环境呢?

寄语

对于在样大学生来说,学习专业知识固然重要,应用这些专业知识更重要。学校安排的必修或选修课程,可以让同学们系统地学习专业知识,各种实验课和课程设计可以让同学们在一定程度上将所学的理论知识应用于实践。

但是,这远远不够。同学位应该在大学期间,从中学的被动学习逐渐转变为自己主动学习的方式。希望同学们能够理解,这些知识并不是老师要教给你,而是你需要去学习;也并不是学校教给你这些知识就足够,而是要你在实践中去发现自己不足,去加强相关知识的学习;学习知识的目的是为了应用,而作为一个工科学生,或者说工科类学科研究者,实验是必不可少的学习方法。

希望本专栏所介绍的知识能引导同学们找到自己有兴趣的研究方向,尝试着由浅入深做一些东西出来。每接触或学习到新的知识点,都不妨应用在自己的旧作品或新作品中,改善或重新创建自己的实验作品。

如果在专栏的学习中遇到什么困难或者不明白的地方,请大胆地在专栏文章后面留言,我会尽已所能进行解答,或者推荐相关的书籍、知识产品。如果你发现专栏中有讲得不对或有争议的内容,也请大胆的发表评论,学术研究不是纯粹的授与受的关系,还需要争论和思想的的碰撞。

最后祝各位同学能找到开发的乐趣,在快乐中学习和工作!