‹  技术课程

大器Web开发框架快速认识

课程
阅读量:915
技术范畴
  1. 从Web Server版的Hello world入手,了解一个来自浏览器的Web请求,如何接受、分派、处理并最终响应的全过程;
  2. 学习如何写HTML模板、如何处理Cookie、缓存、会话
  3. 如何在同一服务内支持多个应用
  4. ……
大器Web开发框架快速认识
了解“大器/da4qi4”Web框架如何帮助程序员降低Web应用的开发难度。

1. 为什么要学习Web编程?

为什么要杀入Web编程?对我们学习编程,特别是学习C++,有什么好处?

1.1 学习的需要:你不能永远只练教程上的例子

学习编程的最佳实践之一,是“边学边用,学中用,用中学”。

在编程领域中,很少有独立的知识点;多数知识点,都需要用来和别的知识点“对接”、一块块“组合”起来;才能构成一个软件系统。

假设你学了三个知识点,那么,如果有可能,就应该思考如何将这三个知识点正确地“组装”起来,完成某个功能,这称为一个综合练习。而后又学习第四个知识点,同样,如果有可能,就应该在前面的基础上,加入这个新知识,以继续完善或增强前述综合练习的实践作用。

边学边用对于学习C++这样庞大的语言来说,更加必要。光C++语法,想要学完、理解、用上、用对,3年都不一定搞得定。何况C++语言还在一直发展:11新标、14新标、17新标、20新标,每三年都会有新的知识点需要学习。

就像学习自然语言,背了一堆单词,还得学会组成句子,最终组成一段完整的表达。学习C++更应该阶段性地、持续地将所学的知识点,抓紧用起来。在“组合型”的项目中练习。

问题来了,谁来帮你设计这些组合型的项目呢?显然,一开始只能是老师或教程的设计者。

我是《白话C++》的作者,我一直用上面的思路,作为书里内容的重要编排脉络。也很努力地在书中安排这样的综合项目(“小综”、“中综”、“大综”都有)。

  • 《白话C++》上册 (练功篇) 在此的典型体现是:书中开始不久就安排的《感受一》和《感受二》两章。前者让大家就像在正式观看视频之前,先以1.5倍甚至2倍数观看一遍,从而在脑海里对C++整体知识体系建立一张基本的认识地图。最主要的是,在别的小朋友还只有两块积木,还在360度全方位加上放大镜显微镜细致研究这两块积木的时候,《白话C++》读者手上已经拥有数据、函数、流程(条件、循环)、IO(标准输入输出)、栈对象、堆对象、对象构造、析构、成员数据、成员函数、派生、多态、封装、动态数组(向量)、链表、算法、文件等看似各式各样,其实互有关系的积木块;马上就可以先试着搭建各种小系统——这仿佛就是在脑海里的那张地图加上了一条条连接各个知识点的街道——最后,我们开始第二轮学习。先快速过一轮,再开始第二轮深耕,正是教程的刻意安排。

  • 《白话C++》下册(练武篇) 重点是给你一些不是来自C++内部(语法、标准库)的积木块。这些积木块可能相对更大一些,因为它们往往都有特定的业务倾向。这种帮我们搭建图形界面的“积木块”、帮我们搭建网络程序的“积木块”、帮我们搭建游戏程序的“积木块”、搭建数据库程序的“积木块”等等。而相应用来练习的综合项目,更大、更复杂、更接近实际工作需要、更考验学习者、也更有趣、更有成就感。每个一项目都是作者的刻意安排。

刻意安排?好吗?很好,但也非常不好。因为:学习编程,光有教程上的练习项目,远远不够。教程上的练习项目,永远只能成为你奔跑中的一条腿。只要是课本上的,教程里的练习项目,必然都经过了教程作者或老师的精心安排和巧妙剪裁。案例项目服务于特定阶段的教学目的,如果不安排、不剪裁,将项目的实际功能和全部细节完全展开写入教程,教程写不完(白话C++上下两册2000多页,够厚了),当时的学生也学不完,消化不了。

很多时候我们学完一本编程教程,并且是类似《C++ Primer》这样著名的书,或者是《白话C++》这样充斥大量实践项目的书(把自己的书和名著安排在一起,感觉有点够不要脸),觉得似乎学到了很多,但一旦遇上实际需求,需要将所学的知识点来个大综合时,就发现没有思路,做不出来。为什么?答案就在你只有一条腿在走路,无论如何使劲地快速蹦跶,都很别扭、很费劲。

教程上的案例,好就好在“精心安排、巧妙剪裁”;坏也坏在“精心安排、巧妙剪裁”;仅仅在这些项目上练手,仿佛在温室里栽花,在世界公园里环玩世界。

总而言之,教程上的案例还是太假,太像作业(本来就是作业),复杂度上还是太小儿科。可以这样问自己:有人愿意花钱来买你写的课程上的例子程序吗?如果是《白话C++》,身为这些教学案例的设计者,我觉得没有。

所以,学习编程,一定要让自己有机会去接触、参与教程之外的,也就是社会所需的项目,或者更具体的,就叫“商业项目”;经由商业项目的洗礼,方能“成人”。就好像练武,你不能长年躲在深山老林里跟着师傅苦练,然后就自以为已经是高手。你终得下山、上擂台和别人比划比划才成。

问题又来了。谁来给你这些实战项目呢?很多很多学校出来的这个行业的人,都是在进入企业之后,有一个师傅带着度过三个月的试用期。这三个月里,事实上他都仍然是在学习,但和在校学习最大的不同是:学的是真的项目,指导你的是真的程序员。

但是,不是没有人都能有机会进入企业找人带,并且,现在这一行的人才竞争更厉害了,有没可能让我们在面试前就拥有更强大的实战能力呢?

我的实例:在我的学习历程上,曾有多次边学、边用、边赚钱的实例。最早的一次是在2000年,我学习 Delphi 正好一周,遇上一个机会,加上钱迷心窍,我就大胆地接下一个约需两个月,报酬5000元的“三手”转包单(有些记得是北京双鹤药业出的赞助费,不一定对)。这个项目让我收获巨大,显然我不是在说那5000元。

现在已经2019年,在我国,诸如信用保障、支付体系、中介平台等商业体系高度成熟,最主要的是,全中国,包括你身边所能接触到大大小小的企业,都高度需要以及信赖信息科技。如果你真能写出他们所需要的程序,那么,自然就不愁没有可供实战的商业项目。

很多人觉得,上面那句话应该改成“自然就不愁没有钱赚”。这就错了哦。阅读至此,一定要搞清楚谁先谁后、孰轻孰重。钱不是第一目的——如果钱是第一目的,各位学C++的同学应该首先换一门编程语言学习。有许多相对简单的编程语言,反倒更容易赚到钱。

所以,请注意此时的语境:出于更好的学习C++的目的,我们也想接一些实战的小单,可能的话,顺便赚钱。 在这个上下文中,钱的作用是让我们拥有相对的衡量标准。有人愿意出钱可以体现你写的程序真正有用能用;但就算暂时拿不到报酬,只要别人愿意使用你的程序,一样证明了你写的代码的实用价值,证明它满足了真实用户的需求。而这番经历与成就,你大可写入简历。因为它一样证明了你的能力成长。

答案已经呼之欲出,只需我们再问一个问题:当前,拥有什么领域的编程能力,能让我们更有机会接触参与或主动创造出商业项目的机会呢?

1.2 社会的需要:Web应用是当今最流行的模式

问:当前,拥有什么领域的编程能力,能让我们更有机会接触参与或主动创造出商业项目的机会呢?

答:是Web应用。为什么?

答案非常简短:因为Web架构的应用系统,特别是广义上Web程序,是这20年来最成功的商业化系统,没有之一。换句话说,你身边的大大小小的企业以及他们的老板需要的是信息化系统最有可能的形式,就是Web应用。

广义上的Web应用系统至少包括:

  1. 桌面Web应用:就是你打开电脑浏览器看的所有互联网网站;

  2. 移动Web应用:在手机浏览器打开的网站;

  3. 公众号应用:典型的如微信公众号,只是将前端换成微信内嵌的浏览器而已;

  4. 小程序应用:典型的如微信小程序,只是将前端用于展现的报文协议等,出于安全、性能以及可按度进行定制而已;

甚至,部分手机上的APP,在服务端,一样使用兼容Web应用Ajax技术的API接口形式。

得益于这20多年的快速发展与广泛应用。当前Web应用系统在开发标准、开发理论、开发方法、开发技术、开发产品以及用户教育等方面,都高度成熟。并且,相当难得地在各大厂商或组织(Google、Microsoft、Facebook、Mozilla、IBM、Apache等)间,(在恶斗多年后,终于)取得较好的一致,不再互相无谓开撕。

举个近例:这几年来,Micofsoft公司先是放弃标准度实现差的IE浏览器,倒最近则干脆放弃自家浏览器的新内核,改用Google家。这对浏览器的竞争发展,长期看恐怕不是好事;但对前端开发而言,倒是扎扎实实地免除了两个浏览器内核的兼容工作。特别是抛弃IE,简直能让前端开发人员喜大普奔。

2. C++可以开发Web应用系统吗?

首先,值得再强调一次:我们的目的是:我们希望能接触到商业项目, 为了提升我们的C++编程能力。也就是说,你的C++学习一半左右,感觉能力不上不下,此时可以学习本站相关课程以快速掌握编写高性能Web应用的能力,最终提高C++水平。如果你不在学习C++,只是想学习Web编程,那当然有更多的语言可供选择。

提示:学习Web编程不仅仅只对提升某一门语言的能力有效。不管是使用Java、PHP、Python、Golang、Rust还是C++开发Web,实际上这里的“开发”都只是一个Web系统中的一小部分,即后台业务逻辑的实现。我个人评估在15%~35%之间。以25%来说,那就意味着,其余的75%的知识,它们可以完全与后台语言无关。在通过C++学习Web时,你也将学到其余75%的许多知识,将来你用不用C++编写Web后台,这些知识点都依然有效。

接下来我们从几个方面,描述一下,C++语言为什么也可以编写Web应用。

2.1 Web应用系统最早的开发语言正是C/C++

当Web系统来到人间……也没有几个人关心它,没有人能在那时看出它将拥有如此辉煌的未来。最主要是,那时它的内部实现基本不分工,而最早用来开发它的,就是C/C++这两门语言。当时人们称之为CGI编程,即:Common Gateway Interface,意为“通用网关接口”。

这里在百度搜索“网关”图片得到的结果:

没错,全是硬件,所以它使用“C/C++”这种距离底层硬件更近的语言,也就不奇怪(当然,真实原因是当时也基本只有C和C++可供选择)。

以C++写的CGI为例,你应该觉得非常熟悉:

cout << "Hello World" << endl;

没错,在CGI程序中,原本代表程序标准输出设备(也就是程序所运行控制台),摇身一变,变成了一模拟的“网关”,它会将问候语通过网络,发送到当前网站访问者的电脑上的浏览器的页面上……

那后来,为什么C/C++会基本退出Web编程世界呢?原因是这样——

开发了一段时间的CGI,C/C++程序员们纷纷发现用C/C++写Web应用有一些不爽。这里仅举一下最典型的例子:那就是当时的CGI程序必须花很多代码在大量字符串用以生成要”吐“给前端浏览器的网页内容。请看下图:

如图,我们看到的漂亮的新浪网站的内容,其实背后全是由Web服务端”吐“出给前端浏览器的字符串。而在当时(哪怕现在也一样),C/C++语言自身没有多少处理字符串的功能函数。于是,问题变成“能不能用不擅长做字符串处理的C/C++”语言写出一门新的语言,让那门语言擅长做字符串处理?答案是:能,很难,当然能。

结局就是:很快有人操着C/C++语言写出了Perl、PHP、Python、D、Java、C#、Go、Rust、Ruby……这些语言都热衷而擅长Web编程。

程序员最“简捷”的证明自己能力的方法:第一步,熟练C或C++;第二步,大批C或C++;第三步:使用C或C++写出新的语言。

除了忙着写其它语言之外,C/C++程序员这二三十年都忙什么了呢?还真一点都没闲着,随手一列就有:

操作系统(Windows、Linux)、 浏览器(IE、Chromme、Firefox 48 以前版本)、 图形驱动(OpenGL、Direct X)、 图形处理(PhotoShop、CoreDraw)、 办公软件(MS-Office、WPS、OpenOffice)、桌面应用(QQ、WinRAR)、网络基础设施(交换机软件、OpenSSL)、游戏引擎(Cocos2d、Panda3D)、科学计算(Blitz++、POOMA)、音视频处理(ffmpeg、Audacity)、编译器及架构(GCC、LLVM)、虚拟机和解释器(JVM、Python解释器)、机器学习与人工智能(Tensorflow、CNTK、mlpack)……

2.2 C++一直没有完全离开Web应用编程

Web应用系统它首先也得是一个应用,而是应用就得有业务逻辑存在,其中涉及需要较强CPU计算能力的部分,有能力的企业就会使用C/C++参与开发。典型的Google、Microsoft、Facebook等。这些大企业都贡献了许多优秀的C++开源代码库。

什么叫业务逻辑?举个例子。一个在线商城,就是一个典型的Web应用系统。商城中有个实体商品被买走,该商品的库存就需要做对应的变化。这就叫业务逻辑。会有人因为这个业务逻辑来自一个在线商城,就认为会有特定的某某编程语言实现不了它…?

前面提到,“Web应用系统在开发标准、开发理论、开发方法、开发技术、开发产品……等方面都高度成熟”。一个产业的高度成熟,往往都会造成其内部实现上的精细分工。Web编程也是如此。原来是一门语言近乎要开发整个Web应用系统,比如CGI模式下的C/C++,或者接班的PHP或Java语言;慢慢的,大量可重复的工作被分化出去,于是后台语言所需要承担的开发工作,越来越单纯;越来越专注业务逻辑。这也正是我前面提到的预估:后台语言所开发的模块,在整个Web应用系统中也就35%的形成原因。

一句话:当今的Web应用系统开发中,后台语言越来越只需专注在业务逻辑上;而C++处理业务逻辑一点也不弱。

2.3 C++在Web开发的许多问题,没有解决,但问题消失了……

由于Web系统的内部的高度分工,因此当我们使用C++语言编写Web应用时,事实上大量的外围工作和使用Java、PHP等其它语言开发是一致的:通通都有其它成熟的子系统加以解决;于是,很多原本拿C/C++开发比较棘手的问题并没有因为C++的自身进步而得以解决——但问题消失了。

前面提到C/C++离开Web编程领域的原因之一:C/C++不擅长处理字符串。现在的C/C++虽然有进步,但在处理字符串方面,还是差许多脚本语言很远——但是,现在写Web系统的后台程序还有哪门后台语言需要大量处理字符串呢?HTML的生成工作,早就交由后端甚至前端的HTML的模板引擎负责。

Web 的开发已经形成了成熟的MVC模式。其中Model(模型)主要表达数据,View(视图)主要表达展现(即HTML渲染),Controller(控制器)负责从视图输入输出数据。在实际实现上,View的部分的基础基本使用外部模板文件表达。好的MVC实现,都会竭力避免在控制代码中大量处理和展现相关的逻辑。甚至,当前这部分工作已经可以部分甚至大部分地从后端移交到前端。而哪怕是是在前端,其主要编程语言JavaScript也并不直接处理数据,而是在DOM模型的基础上,对节点对象加以处理。

事实上,当初的C/C++程序员他们的“第一感受”是正确的;任何需要写大量字符串处理的逻辑,都会让优秀的程序员感到不安,以至烦恼,不管他用的是哪一门编程语言。倘若优秀的程序员对大量字符串处理甘之若饴,整个Web应用的编程理论、方法、产品、工具,都不可能取得今天的成就。

2.4 C++自身及其周边支撑环境,一样取得巨大的进步

从11新标以来,C++自身的标准越来越完善,语法越来越友好。线程、智能指针、lambda等基础功能设施让普普通通的C++程序员,就可一边写出更强大的功能,一边得到更健壮的程序。

在外围,强大的boost库、前面提到的Google、Microsoft、Facebook等大公司以及还有许许多多其他企业及个人,开源了许多优秀的C++代码。苹果公司基于LLVM上的CLang编译器等,都让C++开发如虎添翼。

2.5 C++语言自身的先天优势

第一,超强的抽象能力

C++语言超复杂的一个重要来源,就是它是一门少见的,多范式的编程语言。支持包括:面向过程、基于对象、面向对象、泛型等编程模式。尽管这么拿这么多型式来开发Web应用,的确杀鸡使用牛刀。但这终归是它的原生优势:抽象表达能力强。

第二,超强的运行性能

C++在具有超强的抽象表达能力的同时,更难的是,这门语言一直在坚持的,它真正的安身立命的原则:“零成本的抽象/zero-cost abstractions”(作为新来的竞争者,Rust语言也把这句话贴在自家墙上)。因此在具备超强的抽象能力的同时拥有很强的计算性能。

第三,超强的周边力量

除自身优势以外,由于C/C++是过去数十年来构建整个IT世界基础设施的语言。要不要再列一遍?好吧,重复一遍。

先是问题:

除了忙着写其它语言之外,C/C++程序员这二三十年都忙什么了呢?

然后是答案:

操作系统(Windows、Linux)、 浏览器(IE、Chromme、Firefox 48 以前版本)、 图形驱动(OpenGL、Direct X)、 图形处理(PhotoShop、CoreDraw)、 办公软件(MS-Office、WPS、OpenOffice)、桌面应用(QQ、WinRAR)、网络基础设施(交换机软件、OpenSSL)、游戏引擎(Cocos2d、Panda3D)、科学计算(Blitz++、POOMA)、音视频处理(ffmpeg、Audacity)、编译器及架构(GCC、LLVM)、虚拟机和解释器(JVM、Python解释器)、机器学习与人工智能(Tensorflow、CNTK、mlpack)……

如果把C/C++比喻成教父……那么这二三十年(其实是四十多年)来,他们的门徒遍布整个IT世界……

除了像机器学习与人工智能这样使用起来超级复杂的库,由于作者担心大多数程序员搞不定,于是优先照顾Python语言的接口以外,多数C/C++的门徒都是优先提供C/C++的接口。

比如:前面说的”大器“模块所使用的HTTP解析的两个核心模块,都来自Node.JS。这两个模块由于事关运行性能,所以自然不可能使用JavaScrtip写成,实际是用C写的,是C/C++的门徒。所以,Node.JS用得,”da4qi4“也用得,并且由于没有跨语言调用的“中间商”,所以性能更高。

再如:用”da4qi4“开发网站时,我想要个简单的图形验证码功能。上github一搜索,出来绝大多数都是各类脚本语言的实现……”这不科学……“当时我想。于是我翻了几个,很快发现它们都是在调C/C++的模块……

2.6 后台语言只是Web系统的一小部分

尽管前面已经提到过,但我们需要将此列为C++可以开发Web应用的单独一点理由;这很重要。

下面我们用一张图表示一个相当基础的Web应用所需要的典型组成:

图中,只有模块4,是后台语言变更时,主要的有影响的模块。一个优秀的Web系统,必然不会因为在此更换语言,而造成其他模块设计上的变化。比如,将Java语言改为C++或PHP,定然不会引起模块5中的数据库设计的变化,也不会引起模块6中缓存数据设计的变化,更不会引起模块2中JS的脚本代码的编写……

如果加上开发一个软件所需要的其他工作:需求、设计、界面、用户体验、安全、性能、调试……

这张图还可以用来佐证前面所说的:C/C++的门徒遍天下……9个模块中:

  1. 前端展现:浏览器。排名第一浏览器Chrome,使用C++开发;

  2. 前端交互:JavaScript。速度最快的 JS 引擎 Chrome V8, 使用C++开发;

  3. WEB接入:前三名:Nginx、Apache、IIS,分别是C、C、C++;其中Nginx 截至2019年,正在为3亿7千5百万个网站提供服务;

  4. 业务逻辑:大多数用于Web后台业务逻辑开发的语言,使用 C/C++开发;

  5. 持久数据:数据库。排名第一 MySQL,C/C++开发;

  6. 缓存数据:排名前二的:Redismemcache,均使用C开发;

  7. 运维脚本:Linux下Shell由Linux解释,但Shell所调用的Unix风格的单一工具和它们的宿主Linux一样,使用C语言开发;

  8. 网络通信基础组件:网络主要设备(交换机等)及基础软件(协议栈、OpenSSL等),多数使用C开发;

  9. 操作系统:Linux、Windows,前者C为主,后者C/C++为主。

3. 使用C++开发Web应用,需要什么基础

如果是《白话C++》上册(练功篇)的读者,并且已经学完它。那么非常合适来学习本课程。哪怕,只是差不过已经将第七章《语言》看完(也就是说,你还没完整学习该书的“面向对象”和“泛型”的部分,那么也可以加入学习。

未来如果你学习了《白话C++》下册(练武篇),那么你就可以不仅仅是使用“大器/da4qi4” 框架,你完全可以通过阅读它的源代码来深入理解框架的一些实现原理。

除了C++知识,如前所述还需注意:一个Web应用系统还需要用到大量的其它知识。前端的HTML + CSS + JS、后端的数据库、Web接入服务程序(比如 nginx)、缓存系统Redis的常用指令等,如果你已经具备,那再好不过。但如果你就是完全不懂,也不太影响本课程的学习。我们一是会在本课程中做好这方面使用的控制;二是会对遇上的这类知识做入门学习;三是未来也会提供配套课程方便大家进一步学习。

4. 有兴趣?那么,可以开始课程的第一课了

肯定还有许多有关大器框架的问题,比如:

  • 大器框架能做的具体功能有哪些?
  • 想看详细的演示以展现使用大器框架开发的便捷性?
  • 大器框架在实现上的技术基础与原则是什么?
  • 大器框架在设计上的主要参考与原则有哪些?
  • 大器框架当有实际使用情况、包括性能怎样?
  • 针对中国典型开发需求,提供哪些周边组件?
  • 大器框架还存在哪些问题,未来的发展路线?
  • ……

所有这些问题,都在课程里;现在就开始学第一课《Web Server版的Hello World》吧!再次强调:整个快速了解“课程过程中”你只“袖手旁观”即可。

课程目录
第1节:Web Server 版 “Hello world”
基于大器框架,快速写出可向浏览器返回“Hello world”的Web后端。
从经典C++“Hello world”,到将问候输出到用户浏览器的Web Server版“Hello world”,变化是什么?注意,还将学习到C++11新标中,使用lambda表达式表示动作。
第2节:使用模板输出HTML
通过大器框架、方便的向前端浏览器输出来自模板文件HTML
请理解文字课程中提到的MVC的思想。
第3节:模板数据+输入数据+逻辑处理
依据特写的业务逻辑,组织模板数据和输入数据,形成最终展现
视频中的“学习一点理论”是重点。
第4节:记录系统运行日志
如何在大器Web后台程序员记录系统运行日志
除掌握如何初始化日志对象以外,还需重点理解为何需要记录日志、为何需要区分服务日志和应用日志、为何需要制定日志级别、各个级别如何划分等知识点。