其实软件工程发展到现在,因为公司的大小规模、业务方向产生了各种各样的变化,我们也往往说很多什么数据库工程,什么前端工程,什么分布式乱七八糟的一堆和工程搭边的概念(当然,这里也存在一些程序员水货,没事瞎造概念,故意复杂化一些简单事务,搞得自己很高大上),这里笔者就从很基础的概念慢慢拓展,讲述一下工程体系,当然,看官要是有什么想要补充的完全可以留言哦~
零工程
其实我们初步涉及计算机开发的时候,必然就是先学语言,甭管什么java、python、js,先不管三七二十一,语法学完再说,这个时候,我们和工程没有半毛钱关系,当然,这个时候你学完语言后,这个语言能干啥你也完全不知道!只知道自己学会了一个语言的语法了,但仅此而已,当然如果你学的是类似于java的后端语言,至少语法书里还会说个JDBC让你连连数据库,但这个时候也不能算是一个工程,只能算你做了一个连接数据库的工具,画个图大概就是这个样子:
这个就是实现一个数据库功能的最直接的方式,但凡我们想要再加点功能还是做别的,就还是得重新回到源码上去修改(用我们贫瘠的代码能力撸很可能出bug的功能代码),相当费时费力……更别提我们还要有搭建网站的各种需求了!
基础工程
ok,相信80%的程序员基本上都是做网站相关的活,但是做一个网站要你自己手撸服务器,静态资源管理库,代码管理仓库明显不可能(当然你非要和我说你拥有无限寿命当我没说),一个网站的开发涉及到的内容点实在是多如牛毛,那么为了使我们程序员的再网站开发领域上的开发效率上有所提升,java出现了spring,node出现了express,python出现了django和flask这些大家现在耳熟能详的开发框架,目的就是为了加速简化程序员的开发,那么sping、flask、express就是针对网站开发领域的基础工程了!
工程分类
其实说实话,所谓的工程就是为了解决我们某个特定问题的工具,因为解决这个问题的成本(包含难度、代码量)超过了一定的量化标准,所以我们统称为工程,一如为了解决前端的快速开发有vue、react,后端开发有sping、flask,机器学习有tensortflow、静态管理有nginx、服务器有tomcat、游戏测试有AIrtest等等五花八门的工程工具,但其实归根结底,他们都是用某个特定语言编出来,并被封装的工具罢了,那么作为一个小白CTO,我们要如何进行工程的开发呢?
小公司的标配
其实小公司就保证一个产品上线的话可能一个程序员就够了,以java为例子,他需要做的就是自己写前后端,然后自己部署发布,就没了,就很土鳖,做成图大概这样:
从这个图上可以看到就针对与开发的需求环节我们是有工程的,但是到开发完成去部署的时候,就还是人肉去做,就很无奈~嘛,你还指望一个程序员能做得有多好呢~
小公司开始赚点小钱了
当你作为一个CTO居然赚到钱了,开始膨胀的你打算再找个人来分担你的痛苦,这个时候业务也变复杂了一点,于是你和新来的程序员打算把部署的流程给简化一下,于是新来的同学就帮你做了这个活:
这时候就不需要自己再去远程登陆线上的服务器,然后还可以美滋滋的一键发布,你们感觉惬意了很多,但你们的问题才刚开始
小公司业务变多了
公司正常运作了一段时间后,你和新来的程序员突然感到很矛盾的一件事情,就是你们的代码有时候都衔接不上,哪段代码是谁开发的都不知道好生气哦!而且出了bug都不知道是谁的责任,为了防止这种情况你们打算进行代码的管理,直接从一个中央的代码仓库里去发布代码:
当然,这里只是举个例子,很多公司其实也会使用码云或者别的乱七八糟的玩意儿,但至少代码的权责分清了这样就算出了bug也知道找谁解决了
小公司开始搬家啦
我们终于有钱搬家了,当然业务也拓展了,但是两个人写前后端实在是太累了,而且我们都是java工程师,前端说实话也写不好,索性直接在外面去找一个前端工程师吧,还专业!听说最近挺流行前后端分离的,就这么干吧,于是你们的架构就变成了这样:
这时候后端就不关心前端了,劳动力又解放了!
小公司融资,变身中型企业
你们的劳动效率越来越高,钱越赚越多,然后也有钱找更多的人了,但是,突然出现了很致命的问题,就是你们的bug越来越多了,但是你们也越来越难发现bug的所在之处了,而且网页打开越来越慢,这时候你们又找了一个测试工程师和一个前端一个后端工程师,这次问题又会怎么解决?
公司上市啦
嘛,一堆精英的辛苦耕耘总算有了成果,我们也能买下越来越多的机器了,但是随着员工越来越多,每个人又专门针对自己的业务进行了一些轮子的开发,老的业务依然还是强耦合的状态,于是前端的CTO打算使用lerna去管理复杂紊乱的包,而后端也开始使用springCloud进行分布式微服务管理隔离开不同的业务代码,再加上我们可是互联网企业,我们流量大大地多!,于是在发布的时候我们顺带做了灰度控制,甚至还可以进行ABCD各种Test流量测试,但是我们业务实在太多了还有啥工程可以造真的是数不清啊~
总结
说白了,一家成熟的公司至少会有开发工程、测试工程、代码管理工程、发布工程,一般都是以开发工程为主,为了保证业务的稳定性我们基本会就这四个大模块进行工程的优化(因为这是核心),而剩下的就是新生的业务工程,但是业务工程也基本是按照你维护的开发、测试、代码管理、发布工程为基座进行开发的,一般而言,以流量为主的业务也都少不了灰度工程,以运算服务(如图像算法、爬虫)为主的业务也少不了算法和数据库的合并工程,当然,当你的公司业务多到极致的时候,你就不得不去做BUC工程了~在未来的时候,我也会不定期介绍各种类型工程的架构应该怎么做了~