目录
1 码农的自我修养
1.1 软件工程的定义
根据1993年IEEE为软件工程赋予的规范定义:软件工程是把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件。
1.2 软件工程的本质特征
(1)软件工程堆较大型的程序构造起着重要作用
(2)软件工程的研究中心是会程序复杂性的控制
(3)软件工程需要对软件进行经常化
(4)软件工程中软件的开发速度与质量至关重要
(5)开发软件是一件需要多方进行配合与合作的事情
(6)软件需要为其用户提供支持与存在感
1.3 软件工程的基本原理
(1)要对生命的周期做出有计划的分阶段专业管理
(2)要坚持进行阶段性的评析和审视
(3)对产品质量与走向进行严格控制
(4)不断采取和学习现代程序设计新技术
(5)对结果要有清晰明了的审查
(6)软件开发人员要重质量轻数量
(7)要不断的进行软件工程的实践探究
1.4 课程教学目标
需求分析:分析现有软件,
归纳初步需求;基础差的同学学习技术
设计阶段:用快速发布来证明设计是有效的,
能适应变化的
。
实现阶段:用各种软件工程的衡量手段来证明大家实现的能力。
稳定阶段:证明测试能否覆盖代码的大部分。
发布阶段:
如期发布
,
用户量
,
用户评价
。
维护阶段:网上的观众或下一个年级的同学能很愿意接手你们的软件。
最后大部分同学们能说:
自己做了一个有人用,有生命的软件
。
然后下个学期,新的一批学生进来提高这一过程
…
2 工欲善其事必先利其器
2.1 Typing
通过
Learn Touch Typing Free - TypingClub学习标准指法,并测试打字速度。虽然码农的优秀与否与打字速度毫无关系,但其却是每个码农必备的且不可忽视的,要求打字速度>50WPM为优秀,>30WPM为及格。
2.2 Visual Studio Code
2.2.1 简介
Visual Studio Code(以下简称vscode)是一个轻量且强大的代码编辑器,支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来支持C++、C#、Python、PHP等其他语言。
2.2.2 vscode为什么能这么牛
简介而聚焦的产品定位,贯穿始终
进程隔离的插件模型
UI渲染与业务逻辑隔离,一致的用户体验
代码理解和调试——LSP和DAP两大协议
集大成的Remote Development
2.3 Git
2.3.1 Git与版本控制
版本控制系统有很多:独立文件方式,比如另存为;补丁方式,不如diff;中心版本控制系统,比如Concurrent Version System/cvs和Subversion/svn。分布式版本控制系统,比如Git,是目前世界上最先进的版本控制系统(没有之一)。
2.3.2 Git的基本操作逻辑
对于本地Repo,可能有多个branch,至少有一个叫master
本地Repo,可能有多个branch,至少有一个叫master
2.3.3 Git的设计理念和时间线
2.4 Vi/Vim
2.4.1 简介
几乎所有的Unix-Like系统一般都会预装vi文本编辑器,其他的文本剪辑器不一定预装。POSIX标准中就有vi命令。
vim具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
vim是vi发展出来的一个文本剪辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说,vi仅仅是文本编辑器,不过功能已经很齐全了。vim则是程序开发者的一项很好用的工具。连vim的官方网站(http://www.vim.org)也说vim是一个程序开发工具而不仅是文本编辑器。
2.4.2 vi/vim的三种模式
命令模式(Command mode),用户刚刚启动vi/vim,便进入了命令模式。此状态下敲击键盘动作会被vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式(Insert mode),在命令模式下按下i就进入了输入模式,按ESC退出输入模式,切换到命令模式。
底线命令模式(Last line mode),在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。基本的命令有q(退出程序)、w(保存文件)等。按ESC键可随时退出底线命令模式。
2.5 正则表达式
2.5.1 简介
正则表达式是对字符串操作的一种逻辑公式。
正则表达式的应用范围非常之广泛,最初是由Unix普及开来的,后来在广泛运用于Scala、PHP、C#、Objective-c、Perl、Swift、VBScript、JavaScript、Ruby以及Python等等。
学习正则表达式,实际上是在学习一种非常灵活的逻辑思维,通过简单快速的方法达到对于字符串的控制。
正则表达式是程序员手中一把威力无比强大的武器!
2.5.2 为什么使用正则表达式
测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模·式或信用卡号码模式。这称为数据验证。
替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该
HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
3 工程化编程实战
3.1 代码规范和代码风格
3.1.1 代码风格原则
代码风格的原则:简明、易读、无二义性
一个项目代码的风格就如同一个人给人的印象,代码风格之所以那么重要,是因为它往往决定了代码是否规范、是否易于阅读。
代码虽然最终是要给机器看的,但毕竟还是面向程序猿们的编程,程序猿们是要陪伴整个项目开发过程的。在编写代码的过程中,尤其是在协作开发的过程中,如果对方的代码杂乱无章,读起来都费劲,更别说还需要在此基础上进一步开发,这对程序员来说是个巨大的挑战。
好的代码风格不仅易于代码的阅读和理解,还能在很大程度上减少一些不必要的语法错误,例如少了 "}" ,如果在编码的时候严格遵循了花括号的对齐规则,那此类错误将容易被避免
。
3.1.2 代码风格三重境界
一是规范整洁。遵守常规语言规范,合理使用空格、空行、缩进、注释等;
二是逻辑清晰。没有代码冗余、重复,让人清晰明了的命名规则。做到逻辑清晰不仅要求程序员的编程能力,更重要的是提高设计能力,选用合适的设计模式、软件架构风格可以有效改善代码的逻辑结构,会让代码简洁清晰;
三是优雅。优雅的代码是设计的艺术,是编码的艺术,是编程的最高追求。
一般来讲,我们对代码风格的基本原则要求是简明、易读、无二义性。
3.1.3 代码风格规范中介
命名:合适的命名会大大增加代码的可读性;
类名、函数名、变量名等的命名一定要与程序里的含义保持一致,以便于阅读理解;
类型的成员变量通常用m_或者_来做前缀以示区别;
一般变量名、对象名等使用LowerCamel风格,即第一个单词首字母小写,之后的单词 都首字母大写,第一个单词一般都表示变量类型,比如int型变量iCounter;
类型、类、函数名等一般都用Pascal风格,即所有单词首字母大写;
类型、类、变量一般用名词或者组合名词,如Member
函数名一般使用动词或者动宾短语,如get/set,RenderPage
;注释和版权信息:
注释也要使用英文,不要使用中文或特殊字符,要保持源代码是ASCII字符格式文件;
不要解释程序是如何工作的,要解释程序做什么,为什么这么做,以及特别需要注意的地方;
每个源文件头部应该有版权、作者、版本、描述等相关信息。
3.1.4 编写高质量代码的基本方法
通过控制结构简化代码
通过数据结构简化代码
一定要有错误处理
性能优先策略背后隐藏的代价
拒绝修修补补要不断重构代码
极限编程中不同的两类参与者的合作
结合编程中同类参与者的合作
3.2 模块化软件设计
3.2.1 模块化的基本原理
模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独立地进行设计和开发。这个做法背后的基本原理是关注点的分离 (SoC, Separation of Concerns),是由软件工程领域的奠基性人物Edsger
Wybe
Dijkstra(1930~2002)在1974年提出,没错就是Dijkstra最短路径算法的作者。
关注点的分离在软件工程领域是最重要的原则,我们习惯上称为模块化,翻译成我们中文的表述其实就是“分而治之”的方法。
关注点的分离的思想背后的根源是由于人脑处理复杂问题时容易出错,把复杂问题分解成一个个简单问题,从而减少出错的情形。
模块化软件设计的方法如果应用的比较好,最终每一个软件模块都将只有一个单一的功能目标,并相对独立于其他软件模块,使得每一个软件模块都容易理解容易开发。
从而整个软件系统也更容易定位软件缺陷bug,因为每一个软件缺陷bug都局限在很少的一两个软件模块内。
而且整个系统的变更和维护也更容易,因为一个软件模块内的变更只影响很少的几个软件模块。
因此,软件设计中的模块化程度便成为了软件设计有多好的一个重要指标,一般我们使用耦合度(Coupling)和内聚度(Cohesion)来衡量软件模块化的程度。
3.2.2 模块化代码的基本写法
命令行菜单在开源社区中常见的写法
将数据结构和它的操作与菜单业务处理进行分离处理,尽管还是在同一个源代码文件中,但是已经在逻辑上做了切分,可以认为有了初步的模块化。