从零开始带人学开发(2)

1.背景介绍:近几年互联网快速发展,导致开发技术栈不断发展,对于一个啥都没接触的小白来说,想要入门互联网开发,越来越困难,虽然对于老手来说回过头了看好像也没啥东西,但是如何让学过计算机基础知识的新手(学生)快速入门,也是一件非常有价值的事情。

2.本文内容:本文想通过技术栈分类,实际需求,发布服务从上到下来讲解一下具体的开发过程。

3.问题引入
如何理解开发行业为啥需要这么多技术栈呢?难道真是互联网行业真有那么多知识需要学习吗?其实不然,现在绝大部分的技术栈的出现就是为了节省开发成本,防止重复造轮子,快速提高开发速度和迭代速度。其中迭代速度其实包含开发速度和发布速度。
开发层面
比如著名的spring,spring-boot,spring-cloud的无一不是为了简化开发的重复工作。其中spring的出现是为了帮助程序员合理的管理对象的生命周期,让项目运行的资源分配更加合理有效。spring-boot的出现为了解决程序员开发过程中经常需要配置的困难,提出了autoconfig自动装配的思想,spring-cloud是为了更好更快迭代项目而提出的微服务等一系列的概念。
那难道这些工作的封装,是更高效的吗?显示不是,并不是任何方法或者任何技术都是完美的,正式由于这些工作的封装会导致spring也不是很轻量的框架,学习成本的加大,一项技术的出现,都是有利有弊,现代计算机的各种技术都是时间和空间的一种权衡,是在当时某种场景的一种最佳解决方式。
但是对于其他场景或者其他时间,这种方法可能效果不佳,正是因为这种特性,才会出现各种各样的技术栈,很多技术栈都是同一个问题的不同场景的解决方式,大家不必害怕。
在我看来,技术栈类型大致分了解决两种问题而出现。1:解决io速度比较慢,而出现了各种各样提升io速度的技术栈,比如mysql(b,b+树局部性原理,索引等加速io读取)
,比如redis基于内存的中间件,利用内存特性减少io读取,mongodb,neo4j等非关系型数据库的设计为了减少io的读取次数等,这些不同技术栈只是为了解决不同场景下的io速度慢的问题。
2:解决基于tcp/ip为基础架构的现代互联网技术的通用问题,tcp/ip有不可信,不可靠的特点,就会引出消息队列等技术来解决数据一致性问题,会引入cap原理,分布式事务问题等解决高可靠问题。这样就会诞生各种各样的技术来平衡性能,资源占用。不同的技术栈仅仅是不同场景下的解决方法,比如caffine和redis其实类似,一个是基于jvm的内存优化,一个是基于内存的优化,落到操作系统层面都是使用的内存。如何高效的利用内存redis底层设计运用到压缩数组,双向链表等来做时间和空间的权衡。

发布层面
对于发布层面的话,如何能将写好的代码快速的部署在服务器上,并且快速的启动服务,更高效的利用容器资料这个其实就是目前的容器技术所做的事,如docker等新技术。docke技术的出现是为了帮助程序员高效管理微服务,并快速服务发布。你可能不知道发布流程是在干啥事?通俗易懂的说法是发布其实在准备环境,即把你写的代码需要的环境准备好,然后把你编写的二进制文件在操作系统上运行起来的过程。又有人会问,我写的是java或者c++代码为啥你说的是二进制文件,这个其实涉及到编译的过程,以java代码为例,idea或者eclipse在你运行代码的第一时间会编译代码变成.class文件,并把代码打包成.jar文件这些文件一般在target目录下。编程二进制可运行文件之后 直接java -jar文件名就把二进制可执行文件运行起来,python也类似输入python 文件名就能运行,但是如果服务众多,如果每个服务发布都需要把打包好的可执行文件复制到服务器上,并在服务器上修改可执行文件为可执行,并java -jar执行的话,工作太繁琐并且很麻烦。正是这样子,docker容器的出现是为了解决机器不浪费。并且方便开发快速迭代和发布。

4.整个开发流程总结
作为新人的你,第一次做项目怎么样怎么快速融入团队,并开发出自己的第一个需求呢?你需要知道这些内容:1.开发工具有哪些idea还是eclipse,pycharm还是anaconda(开发环境安装) 2.有了开发环境你需要听懂需求,怎么去拆解需求。一般在拆解需求的过程中你会反复去理解需求,当你完成的写出了开发方案,你就理解了需求,接下来其实就是最无脑的coding过程。开发流程一般包括:1.需求评审(产品经理描述他需要什么样的产品) 2.开发方案设计(开发听懂了,设计方案),开发方案包括接口设计(包含出参,入参),数据库设计(表字段设计),时序图设计(交互流程,谁调用谁),性能和可靠性设计(是否使用缓存,是否需要保证服务宕机,恢复服务,是否需要限流降级让服务恢复) 3.方案评审(通知到开发组长,产品经理)确认这个方案是否可行 4.开始开发 5.自测(填写自测报告,列出风险点让测试注意这些点) 6.测试(功能自测完成之后把,代码功能提交给测试,让测试测试) 7预发布(测试通过,可以进行灰度发布,如果一台服务器发布成功) 8 发布(验证一台服务发步完成,可全量发布)

发布的话一般你需要弄懂怎么样使用发布工具,在公司里面用的大多都是自动化发布平台,通过工具进行发布k8s是目前大多数公司使用。dockerfile的编写其实是编写shell命令,通过shell来复制一些服务器资源,方便容器的更好的启动。

5.代码是如何在服务器上运行起来的
目前很少有书籍会讲你在本地运行的编译器上写一行代码是如何运行在远程服务器上的,其实其中涉及的各种各样的技术为你保驾护航,1.编译器:把可阅读的代码->转换成可执行的代码 这个过程叫编译,把编译好的文件复制到你要发布的服务器上,执行一下就能运行起来。 2.jar -jar运行起来的原理其实就是帮你去找java代码的main函数,通过main函数入口去启动一个庞大的java代码,找到入口之后java jvm会去把代码一行一行的加载到内存中,然后通过jvm和汇编指令对应,这样就帮我们把java代码和汇编指令联系起来,并将数据存到寄存器中,同时java jvm通过高效的垃圾回收器等把对象合理的管理起来。

你可能感兴趣的:(从零带人学技术,java,spring,boot,spring)