程序开发常识感悟

前言

以前学习计算机网络、计算机组成原理、操作系统等基础课程的时候,很多概念都是囫囵吞枣的背过去了,不是很能理解其背后的含义,更无法把它与实际的程序开发、应用结合起来看待。最近研究小程序、安卓开发、网站开发、网络协议、云计算、大数据、AI等基础常识的时候,突然一下子好像有点明白整个网络、程序是怎么转起来的了,以及一些编程语言、设计架构等等一些东西是怎么回事,好像一下子明白了其中的逻辑,或者说是知识体系是怎么回事。虽然说现在让我开发一个什么网站、应用、小程序、软件之类的东西也不是一时半会就能够开发出来,但是至少知道该怎么去做开发了。
可能里面有些理解也不是特别深刻or有错误的地方,希望大家不吝赐教。

网站、程序、APP、小程序

在之前不了解这些产品(姑且统一称作产品)是怎么开发的时候,对他们开发需要用到的编程语言、开发工具等都有种雾里看花的感觉,而且不是很能理解这些产品之间的关系or区别。
实际上,这些产品的开发都可以分为两个部分,一个是前端的界面展示、用户交互逻辑,一个是后端的数据处理、存储逻辑。简单的说,我认为,前端的核心在于展示和交互,后端的核心在于计算和数据。
比如说网站,用户看到的网页界面就是前端,也就是前端工程师的活计,需要了解的基本技术体系是html/css/js,它们三个分别代表了网页布局、网页样式、网页事件/用户交互;之前有一些把网页的内容/数据也算在html里面,后面对内容和布局进行了分离,把数据放在了xml里面;而再后来数据其实是通过与后端进行交互,获取到后端服务器的数据,然后再在前端界面进行展示,也就是说,把数据/内容放在后端进行维护。简单的说,前端工程师,就是设计用户看到的展示界面,与用户进行交互,然后与后端进行交互,显示后端的数据。那么,后端工程师做什么呢?后端工程师需要了解和掌握一些操作数据库的知识,如果项目足够大,有专门的数据库工程师负责建立数据库表,维护数据库;后端工程师接收到前端回传的数据请求之后,访问数据库,可能中间会经过一些数据计算or处理,然后返回数据给前端,前端收到数据就进行展示。至此,这样一个完整的面向用户的网站就建立好了。但是只有这个不够,一般情况下,还会搭配一个网站后台管理系统,具体的说,它其实也是一个网站,只不过它面向的是网站的管理员,而不是普通用户。之前学习的时候很长一段时间把“后端”和“后台”这两个概念没有理解透彻。可以理解“后台”是一个有别于刚刚说的面向用户的网站,它是一个面向网站管理员的网站。为什么需要这个网站呢?有以下几个原因:1. 如果要对网站显示的数据进行修改的时候,在没有“后台”的情况下,需要一个懂数据库操作的程序员,通过对数据库的操作,才能完成对数据库中数据的修改,这样的行为其实十分浪费人力资源;2. 一般情况下会把网站的管理or内容的更新等操作交给一个专门做编辑or运营的小伙伴来管,他不懂技术,而如果有了“后台”系统,他就可以作为管理员通过后台来对数据库的数据进行操作了。那么,“后台”管理系统是做什么的呢?一般情况下后台也会是一个网站,管理员访问后台这个网站页面,登录自己的用户名密码,然后就可以通过后台的一些按钮、对上传文件、修改数据库某个字段,如文章标题、文章内容之类的东西。网站管理员通过后台操作,修改数据库中的数据,前面说的面向用户的网站再次请求数据的时候,就会看到更新后的数据/内容了。所以说,其实后台这个网站也有它本身的前端和后端,它的前端就是展示给网站管理员看到的界面以及管理员能够做的界面交互,它的后端和面向用户的网站的后端功能会有一些重合的地方,但它的后端功能应该会更为强大,比如说面向用户的网站后端只能够查询数据库的数据,而它可以进行修改删除更新。后端涉及到的技术,一个是纯粹的数据库方面的东西,比如说sql语句、oracle/mysql等关系型数据库,以及一些mongodb/redis等nosql数据库等;一个是对数据库的操作,而后端的程序语言有很多,比如说常用的java/c++/python以及比较新的node.js等,每个语言有它自己的使用场景和擅长的地方,选择什么语言都OK。而这里就存在一个问题,前端的开发语言还算是比较统一,而后端的开发语言各种各样,怎么能够进行一个交互?这就需要前端和后端定义一个统一的接口,通过接口去访问数据,比较流行的就是设计一套RESTful API,这样,不管前端用的什么语言、什么技术,后端用的什么语言什么技术,都可以通过这一套定义好的接口实现前后端开发分离,按照某种规范进行通信。而所谓的规范通信,其实就是网络协议。如果说,假设网站前端代码和网站后端代码和网站后端数据库都在同一台服务器or电脑主机上,那么前端向后端获取数据的时候,根本用不到什么网络协议,直接调用网站后端提供的接口代码就可以了,相当于是写个接口函数的路径。这样放在本地,没有网络通信的代码,前端+后端+数据库,其实就是一个单机的桌面程序了。
接着桌面程序说起。当前的用户端主要分两大类,PC端和手机端,一些嵌入式设备or智能设备暂时不是很了解就先不说了,但猜测应该和这两个的实现比较类似。PC端操作系统主要有windows、Mac、linux三种,手机操作系统主要有android、IOS两种。而一般我们把PC端的程序叫软件,而手机端的程序叫app/应用,其实只是名字的区别,以及具体实现的编程语言不一样罢了,但其核心也就是提供一种服务,从这个角度,网站其实也是服务的一种,只不过它的服务资源和计算在远端的服务器上。PC端软件的开发根据不同的操作系统有不同的语言,比如说windows就有C#/C++等,其实还有很多,只要你看到某种编程语言支持的开发环境和运行环境有哪些,就可以在这些开发环境上开发&在这些运行环境中运行。相比于手机端的开发语言,PC端的开发语言更为丰富。事实上,如果在PC端运行的软件和在手机端运行的app不具有网络通信功能的话,那就是一个单机的程序。而如果他们具有网络通信的功能的话,就相当于前面网站的前端界面了。也就是说,在android和IOS中用java和Object-C开发的app,其实只是一个类似网站前端界面,用于展示和用户交互;而他们是具有后端的,后端用于做数据计算处理、存储数据库的。【这里注意一点,所有的后端都是可选择的,可以有,可以没有;没有的时候不是说前端就不能做数据的存储,前端数据的存储叫做缓存,就相当于网页缓存、软件本地缓存,其实也可能是采用数据库存储的比如说前端的数据库SQLite】毫无疑问,没有后端,只有前端的网站、程序,其功能比较受限。受限的地方主要是因为, 前端的运行环境是浏览器(网站)、单台个人主机(软件)、单台个人手机(app),其运行所需要的CPU计算资源,以及内存、硬盘大小是极为有限的,只能够限制在一定大小的数据存储。而如果有后端,所有的前端程序相当于插上了加速外挂,可以扩大CPU的计算资源、内存的存储资源,其支持的功能得到了大幅度的提升。也就是说app是有后端服务器的,之前一直对app有一个误解,以为就是写一个app,安装在手机上就可以了,但实际上,大多数常用的app都是有后端服务器程序的,通过接收app的请求,推送自己的信息到app中。
最后说到新兴的小程序,之前不是很了解,最近调研了发现,小程序其实和网站比较类似。它虽然名字中有"程序",但是其实和网站的实现没什么区别,也就是从对小程序的调研,才最后把这一堆的网站也好,软件也好,app也好给串起来,发现其实他们只是表现形式和表现位置的不同,其实内里的逻辑都是一样的。小程序也是有前端的内容渲染,而如果要进行一些数据的存取,则需要后端的代码部署在远端服务器上进行请求响应。前端用到的技术主要是wxml/wxss/js/wxs,其实看后缀就知道对应的就是html/css/js这东西,虽然有一些自己独有的特性,但是基本技术还是十分相近的。而由于采用restful接口来进行前后端的交互,后端的代码使用的技术和前面网站后端使用的一致,官方建议用node.js+express的框架进行开发,不过其实不管用什么后端开发语言都是可以的。
最后总结一下。首先对于用户来讲,前端是必要的,如果没有前端界面,用户需要直接登录到那台存放代码的服务器上才能够看到想要看到的数据,当然,对于懂技术的命令行工具从业者来说,这点小事都OK,但是对于不懂技术的普通用户来说,这简直是不可能实现的任务;所以必要的前端是需要的。其次,后端不是必须的,比如说就写了一个网页helloworld直接静态显示,需要后端吗?不需要,就写了个桌面本地小游戏,需要后端吗(需要网络通信的那种后端)不需要,写了个单机app小游戏,也不需要后端。【这里注意一下,本地软件和app这种,可能会需要与特定环境的数据库进行交互,有些人认为与数据库交互就是后端,没有交互的就是界面,这种这里暂时不认为是后端,只认为是一种本地缓存】;然后,如果具有后端,网站、程序、app、小程序,就需要具有网络通信的功能,能够与远端的服务器进行通信,请求需要的数据进行显示,而且其功能比没有后端的一般会更为强大,第一是因为它具有网络通信,能够支持多人的网络访问,第二是它的服务器CPU计算资源和内存硬盘存储资源较本地机器更为丰富,能够实现更多更复杂的需求;最后,因为restful接口的实现,其实前后端开发分离,也就是说,如果是一个公司想要在多线发展自己的产品,它可以开发一个网站前端、桌面软件前端、app客户端、小程序前端,而这些前端都需要针对不同的运行环境选择不同的前端技术,比如说html/css/js、C++、Java/Object-C、wxml/wxss/js/wxs,开发不同的前端显示界面,但是,它们可以只需要一个后端程序,共用一套后端代码,包括后端数据计算、处理、存储、数据库等逻辑,这是完全可行的,或者说,就应该这么做。

怎么部署一个具有前端和后端的程序?

首先,你需要有一台服务器,你的电脑可以当服务器,也可以自己在阿里云、腾讯云上租一台服务器,还可以直接上淘宝买一台实体服务器。【其实所谓服务器可以简单理解为就是性能更好的个人电脑主机】。
其次,你需要一个具有公网IP的服务器。如果你只想要在同一局域网中的人访问你的程序,那么直接把你的主机当做服务器,这样在这个局域网中的人,就能够访问到你的主机,进而访问到你的程序。而如果你想要上线,想要全世界的人都能够访问你的程序,一种方法是把你的主机or你自己买的实体服务器设置成支持访问的服务器(其实就是分配一个公网IP给这台机器),windows上有IIS支持配置,linux上更容易,一搜肯定就能搜到;一种方法基于阿里云、腾讯云租用的服务器,当你买的时候,它已经默认给你配置好了它的公网IP,直接使用即可(毕竟花钱买服务,省心不少)
然后,这时候,其实就已经可以在这台服务器上部署你的后端代码、后端数据库;网站前端和小程序的前端代码文件也是放在这台服务器上面,用户请求的时候,才把这个前端的页面文件返回给用户,然后通过浏览器or微信进行渲染,展示到用户的面前。而桌面程序和app就需要从官网or应用商店,下载本地的一个客户端程序,下载安装OK了,前端就有了。
按理说,有一个前端,有一个后端,再加上resetful接口来实现网络通信就可以完美访问服务了。实现restful的途径有很多,最基本的还是采用http的实现,就是前端发送http的请求,后端根据http请求的参数,返回对应的数据。其实http是支持直接输入公网IP作为host字段的,但是,如果直接用ip进行访问,数字对于用户来说很难记忆,而且如果直接把IP暴露在http中,很容易遭到攻击,因为IP很容易伪造,可能会返回给你一个错误的服务内容;所以网站和小程序基本上是采用host为域名的请求方式去把前端页面请求回来,而桌面程序和app的前端是已经下载好了,不用请求获取,只用请求后端服务器上的资源即可,而用户的请求都是通过一些点击发起的,用户不用直接自己输入IP,ip已经是写死在程序代码or配置文件中的;不过也是因为前面说的容易遭受攻击的原因,有些程序和IP也是通过域名进行请求的。
也就是说,你需要有一个域名。域名就涉及到找一个域名注册商,买下某个域名,然后在该域名注册商的操作下,把这个域名和你刚刚服务器公网IP的对应关系存到DNS中,基于DNS的策略,把这个DNS记录存到对应的域名服务器中。然后当用户通过域名host发起HTTP请求的时候,就可以利用DNS解析出这个域名对应的公网IP(就是买的那个服务器的公网IP),然后就可以根据IP路由寻址找到那台服务器了。域名是有使用期限的,一般从1年到10年不等,可以通过阿里云和腾讯云进行购买,他们提供了比较好的域名解析、配置服务,比较方便省心。

云计算、大数据、AI

刚刚有说到,之所有要有后端程序,很大程度上是因为远端服务器的计算和存储资源更为丰富,能够提供更多的需求和响应。这也就是引入云计算、大数据、AI的契机。
前面开发的那些程序,开始可能会比较小,功能也不够完善,只能支持上百个人的同时访问,但是当使用的用户越来越多的时候,就会遇到高性能、并发性的问题。此时最简单的方案就是增加机器,增加后端服务器的个数,自然同时支持提供的服务就多了。
慢慢的,当服务器增加到一定量的时候会发现一个问题。那就是资源浪费,举个简单的例子,淘宝双十一的时候,同时那么多订单,淘宝的后端服务器都能够支撑下来,那时候的CPU可能是100%在使用,但是在平时的时候,那些服务器的资源可能只用了20%就支撑了平时状态的访问。难道要删除服务器,不行,等双十一的时候就崩了,那这些服务器怎么办?废物利用,就是云计算。大厂商把自己平时闲置的服务器资源共享出来,出租给其他小厂商,他们不用自己购买服务器实体,直接租用大厂商的云服务器,把自己的后端程序部署在所谓云上,利用云的计算资源来做自己的东西。当然云计算不仅仅是这点东西,还包括并行计算、分布式计算、虚拟化等等技术,这个就需要深入了解了。
当用户越来越多,后端数据库中的数据、用户产生的数据也会越来越多,慢慢的就达到了大数据的标准(这里简化了,真正大数据是要达到好几个V的才算大数据,具体可以查一查),产生的这么多的数据肯定是有用的,可以利用云计算的技术对这些数据进行处理。大数据相关的技术架构很多,主要是hadoop那一堆,从数据的传输、处理、存储,都有对应的技术路线,大数据工程师就是做这个的,其实他们和后端开发工程师一样,都是在后端干活,但是感觉他们更加的细分,而且需要较大的应用场景、用户规模的时候才会用到他们,而如果只是简单的一个什么程序之类的,根本用不到大数据工程师。
而AI,则是对数据处理的算法,用户产生了这么多的数据,大数据工程师还是更偏开发层面,也就是说用一些技术去开发支撑这些大数据的传输、处理、存储。但是AI则是对数据内容的本身进行挖掘发现,以支撑决策。这样的就是对应算法工程师的职业需求了。

2018-10-16 23:53:49

有一些理解or感悟是从别的地方看到、记下的,忘了引出参考文献。以后如果有更深的感悟or更详细的调研结果,再对本文进行更新。

2018-10-22 15:14:47

今天看了个推送,他提出了9大平台的及对应的指标比较。看完,搜了下他提出来的 uni-app 的前端框架,基于vue.js,参考微信小程序,能够同时编译成 android IOS wx小程序三种;主要好奇的是怎么编译成 android 和 IOS 的,明明之前的android和IOS开发都需要对应的java和Object-C语言,他是怎么把vue.js写的代码编译成功的?而且感觉他说的这个框架和最初文章中的统一的全端框架不是一回事,他开发的原生app是能够达到和本身的原生app一样的效果吗?他说能够达到和小程序一样的效果,而且比小程序的确多了一些原生sdk的支持但是个人感觉还是有点不太对。但是毫无疑问的是,如果有这么一个全端开发接口,可以极大的降低个人开发者的开发难度,而且它那篇文章的分析还是很不错的。之前考虑的是后端代码统一,现在连前端代码都统一的话……不过参考他说的研发做薄、运营做厚,如果是不同的用户群体,既要在全端做到最基础的功能需求,又要在原生app中提供更多的功能,其实也只能部分代码重用吧,不过最主要的是,如果能够简化学习语言的成本就的确很不错了。
可能以后真的会出现一种完全统一的全平台框架,这样同一套代码能够编译成全平台的各个程序了。

posted @ 2018-10-16 23:58  Chayeen  阅读(256)  评论(0编辑  收藏  举报