# 【知識精講】編程與軟件工程
## 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++)編譯這段代碼,然后你就可以看到一個圖形界面的對話框了:

# Part5
同學們這個時候可能會覺得驚訝:為什么看起來高大上的,圖形界面的對話框,只用了一句代碼就顯示出來了?
這,就是軟件工程,跟建筑工程等其他現實世界中的工程活動,所存在的決定性的不同——代碼是可以被復用的,前人已經造好的“輪子”(即代碼庫),你不需要再從頭寫一遍,你只要直接拿來用就可以了。
我們上面那段代碼,使用了 Windows 提供的 API(應用程序接口)——你根本就不需要從零開始在屏幕上畫一個對話框出來,你只需要告訴 Windows 系統,“我需要一個對話框,內容是XXX”就可以了,然后系統就會為你生成一個對話框,并且顯示出來。
#Part6
這,就是我們目前的編程學習活動,所具有的意義——對于任何軟件來說,外在的圖形界面都只是表皮,內在的邏輯才是核心。對于大部分開發者來說,看似“高大上”的圖形界面,實際上只要用很簡單的幾句代碼調用現成的 GUI 庫和框架就可以了……

一個基于 C# 語言開發的桌面應用程序,界面部分直接使用了 WPF (Windows Presentation Foundation,一種基于 .Net 平臺的 GUI 框架)進行繪制。
#Part7
實際上,有些同學如果繼續在 C++ 學習的道路上前進的話,還可能會從事服務器端開發工作——這樣的工作甚至是根本就不需要跟 GUI 打交道的。

一個基于 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循環的使用
- 【程序設計】一大波好玩兒的程序
- 《代碼能力快速提升》
- 《基礎數據結構》
- 《搜索入門》
- 《動態規劃基礎》
- 《數論和基礎數學》
- 《圖和數基礎》