# 【知识精讲】编程与软件工程
## Part1
既然同学们选择了学习这门课程,那么接下来的一段时间里,大家就都需要跟命令行界面(Command Line Interface,缩写为 CLI)打交道。面对黑乎乎的界面,很多同学就会有这样的困惑:
为什么我们自己写的程序只能用键盘输入,而且输出结果也只能在一个黑屏上显示是一些字符?为什么我见到的软件,都是用鼠标输入,而且输出一个图形界面(Graphic User Interface,缩写为 GUI),上边有可用鼠标此操作的按钮?
## Part2
这个问题归根结底可以总结成一句话,我们学习到的编程,怎么才能与现实中的应用软件(比如 QQ、Word 等)联系起来?有些不是计算机相关专业的同学还会因此而感到绝望——我付出了如此多的努力,可是写出来的程序却看起来那么单薄而简陋,这岂不是说明,软件开发实在是太难了,我根本就不适合学习编程?
这些同学们的疑惑甚至绝望,都是很有代表性的——不过这并不是因为编程,或者说软件开发,真的就那么高大上。同学们会有这样的疑惑,其实是因为大家对软件开发,存在着一些误解。这篇阅读课,将会破除这些误解,让大家理解大家现在学习的编程课程,到底是为了什么。
## Part3
虽然名字里都带着“工程”两个字,但是“软件工程”,跟“建筑工程”,存在着本质上的差异——因为代码是可复制的,而现实中存在的物质则不是。
我们都知道,要盖一栋高楼,必须要从零开始打地基,一点一点地先把楼房的主框架结构建好,然后再逐渐完善最后变成成品楼房。而软件工程,则存在着一个决定性的不同……
## Part4
对于使用 Windows 的同学,在学完这门课程的第一章之后,可以在你的文本编辑器界面中,输入以下代码:
```
#include <windows.h>
int main() {
MessageBoxA(NULL, "Hello, world!", "Message", MB_ICONINFORMATION);
return 0;
}
```
然后使用任何一种 Win32 环境下的 C++ 编译器,例如 Visual C++ 或者 MinGW(注意必须是 Win32 环境下的编译器,不能使用 Ubuntu Subsystem 提供的 g++)编译这段代码,然后你就可以看到一个图形界面的对话框了:
![](https://box.kancloud.cn/b0f379b5c2c07e44570d1dfd7691baaf_586x388.png)
# Part5
同学们这个时候可能会觉得惊讶:为什么看起来高大上的,图形界面的对话框,只用了一句代码就显示出来了?
这,就是软件工程,跟建筑工程等其他现实世界中的工程活动,所存在的决定性的不同——代码是可以被复用的,前人已经造好的“轮子”(即代码库),你不需要再从头写一遍,你只要直接拿来用就可以了。
我们上面那段代码,使用了 Windows 提供的 API(应用程序接口)——你根本就不需要从零开始在屏幕上画一个对话框出来,你只需要告诉 Windows 系统,“我需要一个对话框,内容是XXX”就可以了,然后系统就会为你生成一个对话框,并且显示出来。
#Part6
这,就是我们目前的编程学习活动,所具有的意义——对于任何软件来说,外在的图形界面都只是表皮,内在的逻辑才是核心。对于大部分开发者来说,看似“高大上”的图形界面,实际上只要用很简单的几句代码调用现成的 GUI 库和框架就可以了……
![](https://res.jisuanke.com/img/upload/20170116/00d43c06e4d7de011b443fbb44912276a5e31306.png)
一个基于 C# 语言开发的桌面应用程序,界面部分直接使用了 WPF (Windows Presentation Foundation,一种基于 .Net 平台的 GUI 框架)进行绘制。
#Part7
实际上,有些同学如果继续在 C++ 学习的道路上前进的话,还可能会从事服务器端开发工作——这样的工作甚至是根本就不需要跟 GUI 打交道的。
![](https://res.jisuanke.com/img/upload/20170116/31437337ab57adb9eaaed34eefcdd555355f0663.png)
一个基于 C 和 C++ 语言开发的简易 Web 服务器,使用了 Linux 系统提供的网络相关系统调用。
#Part8
如果把现实中的软件开发,类比成武侠小说中的武学的话,那么我们现在学习的编程基础,就是基本的刀枪剑戟与拳脚功夫;接下来要学习的数据结构与算法,则是一些诸如“黑虎掏心”之类的招式;更高一层的软件设计模式,以及某种流行技术栈(例如使用 JAVA 开发 Android APP,或者使用 C# 开发移动游戏)的使用方法,则是一些武功套路,例如蛤蟆功和葵花宝典之类的;最顶层的软件工程,则是诸如少林武学之类的,一系列成体系的思想与方法。
正所谓“根基不牢,地动山摇”,如果大家想要在未来的软件工程师的职业生涯中,站的更高,走的更远,那么现在的初学阶段,大家就一定要勤学多练,把自己的编程基础打好。
- 教材介绍
- 《编程初学入门常识》
- 什么是程序语言
- 【知识精讲】编程与编程语言
- 【选择测试】编程语言分类
- 【知识精讲】高级语言分类
- 【选择测试】编译与解释
- 【选择测试】程序员笑话-Java
- 熟悉键盘上用于编程的键位
- 【知识精讲】认识你的键盘
- 【知识精讲】中文和英文字符
- 【匹配测试】识别中英文符号
- 【选择测试】中英文符号的影响
- 【伴随编程】不要使用中文引号
- 【伴随编程】不要使用中文分号
- 【伴随编程】正确地输入符号
- 【选择测试】找出程序中的错误
- 初始工程师思维
- 【知识精讲】二进制思想
- 【选择测试】程序员笑话-凑整
- 【知识精讲】闭合的逻辑
- 【选择测试】程序员笑话-条件
- 程序员职业与生活
- 【知识精讲】程序员的发展方向
- 【知识精讲】程序员的装备
- 【知识精讲】程序员的健康
- 【选择测试】做一名健康的程序员
- 《C++程序设计》
- 前言
- 【知识精讲】编程与计算机科学
- 【知识精讲】编程与软件工程
- 【知识精讲】如何学习编程
- 你好C++
- 【知识精讲】你好,C++
- 【知识精讲】C++程序是如何开发的
- 【知识精讲】成为一名Power User
- 【伴随编程】让我们一起说你好
- 【知识精讲】你的第一个C++语言程序
- 【伴随命令】编译、运行你的程序
- 【伴随编程】将变量流式输出
- 【选择测试】变量的作用域
- 【知识精讲】变量与数据类型
- 【匹配测试】C++语言的入门概念
- 【知识精讲】在程序中学会换行
- 【选择测试】正确地换行
- 简单数学运算
- 【知识精讲】重新认识基本运算
- 【选择测试】运算符的理解
- 【伴随编程】做一下简单的运算
- 【伴随编程】a 的 n 次方
- 【知识精讲】数学函数
- 【伴随编程】让C++语言变成计算器
- 【伴随编程】计算球的体积
- 【匹配测试】数学世界知多少
- 【知识精讲】在程序中添加注释
- 【选择测试】正确地写注释
- 从伴随输入到变量地址
- 【伴随编程】 一个数字复读机器
- 【选择测试】理解标准输入输出
- 【伴随编程】一个加法计算器
- 【程序设计】A+B+C问题
- 【伴随编程】简单的I/O格式控制
- 【知识精讲】地址与取地址符
- 【伴随编程】看看我们的地址
- 习题一:面积与周长
- 【程序设计】矩形面积与周长
- 【程序设计】三角形面积与周长
- 【程序设计】圆形面积与周长
- 程序中的是与非
- 【知识精讲】是非的表示与关系运算
- 【伴随编程】验一验关系运算式
- 【选择测试】关系运算式求值
- 【知识精讲】如果的意义
- 【伴随编程】分段函数求值
- 【知识精讲】如果之后的如果
- 【伴随编程】五则运算器
- 【选择测试】分支的嵌套
- 【伴随编程】问号表达式
- 【知识精讲】是非之间的逻辑组合
- 【伴随编程】判断闰年
- 【程序设计】日期合法性
- 【知识精讲】多路顺序结构
- 【知识精讲】在程序中学会缩进
- 【选择测试】正确的缩进
- C++程序中的苦力
- 【知识精讲】使用循环结构
- 【选择测试】对比两种循环
- 【伴随编程】使用while循环
- 【填空测试】理解循环结构
- 【知识精讲】自减和自增运算符
- 【伴随编程】使用自增运算符
- 【知识精讲】for循环
- 【选择测试】for循环的使用
- 【程序设计】一大波好玩儿的程序
- 《代码能力快速提升》
- 《基础数据结构》
- 《搜索入门》
- 《动态规划基础》
- 《数论和基础数学》
- 《图和数基础》