自研和外包
一、自研
自研就是“自主研发”,公司有自己的产品,挣互联网用户的钱。所以自研公司通常是互联网公司。
二、外包
外包存在的意义就是:别的公司项目太大了干不了,分出去给别的公司做。外包公司挣的是写代码的钱。项目太大的时候会有很多外包公司参与。甚至可能A分出一部分包给B,B再分出一部分包给C等等。
外包也分项目外包和人员外包。项目外包是把别的公司的项目拿到自己公司来做,人员外包是派人到对方公司参与开发。通常A公司把项目包给B公司,A公司是甲方,B公司是乙方。
项目是怎么从0到1开发出来的?
一、立项
1、传统软件开发项目
企事业单位或政府部门面向社会发布项目招标计划,软件开发企业进行投标、竞标。软件开发企业中标后开始开发。双方会签订合同,在合同中明确所需开发的软件项目应该包含什么功能。开发团队将产品开发完成后需要甲方签字确认。此后如果需要对软件项目进行修改或增加功能则往往需要再付钱才行。
2、互联网项目
①个人发起
②企业发起
二、软件工程
1、概念
随着应用软件的功能越来越复杂,一个能够满足用户需求的软件产品越来越不是一些if…else或for循环的简单组合。复杂的软件产品必须在开发之前进行规划,按照工程化的方式进行管理和控制,协调各个部门、小组、成员才能够有序的推进项目开发工作的进行,进而达到预期的效果。
我们想象一下在建筑工程中建设一座大楼:绝不可能是某个人一时兴起就挥舞铁锹开始挖地基。软件开发也是一样,真正能够在现实生活中投入使用的软件项目是不可能直接从敲代码开始的。
2、瀑布模型
将软件生存周期的各项活动规定为按照固定顺序连接的若干阶段工作,从上到下推进,如同瀑布一样,因此称为瀑布模型。
①瀑布模型的优点
开发规范清晰严格
每一个阶段都严格定义了要完成的任务,每一个阶段都有清晰的目标,甚至有明确的可以检查的结果,从而可以强制要求程序员按照规范开发。
文档齐备
严格规定了每个阶段必须提交的文档,最终在项目开发完成时同时产生一套齐备的项目文档,便于日后维护和新成员接手。
②瀑布模型的缺点
僵硬死板
由于瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真正满足用户的需要。也就是说灵活性太差,越后面的阶段发现问题越难以调整。瀑布模型只适用于项目开始时需求已确定的情况。
总的来说,瀑布模型是一种应付需求变化能力非常弱的开发模型。
3、其他模型
- 边做边改模型(Build-and-Fix Model)
- 快速原型模型(Rapid Prototype Model)
- 增量模型(Incremental Model)
- 螺旋模型(Spiral Model)
- 演化模型(evolution model)
- 喷泉模型(fountain model)
- 智能模型(四代技术(4GL))
- 混合模型(hybrid model)
-
三、敏捷开发
1、曾经
在传统软件项目开发过程中,开发团队会和具体的客户基于项目功能需求签订协议,根据合同中规定的功能进行开发。所以开发过程中能够基于相对稳定的功能需求基于瀑布模型开发。
2、互联网时代的新挑战
发展到互联网时代后,软件开发的方方面面都遇到了前所未有的挑战。在软件工程方面,程序员发现他们不再面对具体的用户,而是互联网上一个又一个人群。你既不能明确说出来他们是哪个城市、哪个公司、哪个部门或学校又更不能跟某个人签订固定功能的软件开发协议来确定任务。所以互联网时代的项目开发面临这样五个问题:
特定受众模糊,所以产品经理们会根据典型用户的特征创建用户画像,作为一个假想的用户个体。
- 项目功能边界不稳定,需要在市场运作中摸索
- 项目功能需要根据用户的新需求进行迭代更新
- 项目的终端设备日新月异,从PC客户端到PC浏览器再到移动客户端再到移动端浏览器不断发展,相应的交互方式和系统界面都需要持续改进
- 竞争激烈,不及时占领市场很可能被淘汰
上述种种情况已经不允许程序员再按照瀑布模型按部就班开发系统,这样太慢而且不灵活。敏捷开发理念就是在这样的时代背景下应运而生。
3、敏捷
①概念
如果把互联网环境比作一个丛林,那么基于敏捷理念进行开发的一个互联网应用就是丛林中奔跑觅食的一只猎豹。为了生存它会在还不是很强大的时候就进入丛林捕猎,在奔跑中强化肌肉,在受伤后修复伤口,甚至是磨砺尖牙厉爪。如果有需要,它会进化出一对翅膀。当然,一个错误的决定也可能导致它的败亡。比如长出三对翅膀后不堪重负无法捕获猎物饿死。
基于敏捷理念开发的项目更应该被看作是一个生命体。环境一直在改变,它也一直在改变。环境发生了变化,它也要及时作出应对:丛林突然变冷,猎豹需要长出更厚的皮毛。它自己新的想法也要尽快付诸实践,在环境中检验自己的想法是不是正确:长出不同花色的皮毛看看异性是否喜欢从而让自己更受欢迎。
虽然敏捷开发和传统瀑布模型开发都会把项目划分为模块分别开发,但是敏捷开发中的大部分时间是在项目正在运行的同时不断做出修正和改进。想象一下一台高速飞驰的汽车,一边行驶一边加装了一门等离子炮,一边行驶一边把燃油发动起替换为了核聚变发动机。
必须指出的是:项目总体采用敏捷方式开发,但是具体模块、具体功能内部开发还是会遵循瀑布模型的顺序:先确定需求、然后设计逻辑结构、代码实现、测试、上线。
②实现
原型
将最初的功能创意想法绘制成草图,基于这个草图让功能需求更加直观,前端和后端工程师据此分头开始各自的工作。相比较瀑布模型省略了大量的中间环节,快速启动项目。
持续部署
项目不能满足于单元测试通过,而需要在开发过程中保证本模块可以在服务器上运行,避免大范围返工。
持续集成
项目不能满足于模块独立运行正确,还必须要保证各个模块集成在一起后可以正常工作,对于庞大复杂的系统尤其如此。
持续交付
要在项目有细微升级时就交付给最终用户,及时获得反馈,而不是很长时间后推出一个重大更新版本——这会导致对用户体验的感知严重滞后。
开发中的常用缩略语(也就是黑话)
开发环境
缩写 | 对应单词 | 含义 |
---|---|---|
PRO、PROD | Product | 生产环境 |
PRE | 预发布环境 | |
DEV | Development | 开发环境 |
测试
缩写 | 对应单词 | 含义 |
---|---|---|
TC | Test Case | 单元测试用例 |
UAT | User Acceptable Test | 用户接受度测试 |
SIT | System Integration Test | 系统集成测试 |
岗位名称
缩写 | 对应单词 | 含义 |
---|---|---|
PM | Project Manager | 项目经理 |
PM | Product Manager | 产品经理 |
RD | Research and Development | 研发 |
FE | Front-End | 前端 |
UE | User Experience | 用户体验 |
UI | User Interface | 用户界面 |
QA | Quality Assurance | 质量保证 |
OP | Operations | 运维 |
DBA | Database Administrator | 数据库管理员 |
文档
缩写 | 对应单词 | 含义 |
---|---|---|
SOP | Standard Operation Procedure | 标准作业流程 |
MRD | Market Requirement Document | 市场需求文档 |
PRD | Product Requirements Document | 产品需求文档 |
FSD | Functional Specifications Document | 功能详细说明 |
团队里有哪些人
你和别人怎么对接?
后端工程师与前端工程师交互
服务器端渲染
除了我们熟悉的JSP,还有Velocity、Freemarker、Thymeleaf等视图模板技术。虽然具体语法各不相同,但是它们都有一个共通的特点,就是在固定内容中可以穿插表达式等形式的动态内容。将视图模板中的动态内容转换为对应的Java代码并执行,然后使用计算得到的具体数据替换原来的动态部分。这样整个文件的动态内容就可以作为确定的响应结果返回给浏览器。在这种模式下,前端工程师将前端页面全部开发完成,交给后端程序员加入到项目中。此时不可避免的需要后端程序员根据需要对前端代码进行补充和调整。
前后端分离
前后端分离模式下,前端程序和后端程序使用JSON格式进行交互,所以项目启动时前端工程和后端工程师需要坐在一起开会,商量确定JSON格式的具体细节。然后分头开发。后端工程师在把后端的代码发布到测试服务器前,前端工程师无法调用后端程序拿到真实数据,所以使用Mock.js生成假数据。直到后端工程师开发完成,后端程序发布到了测试服务器上,前端工程师再从Mock.js切换到实际后端代码。
开发工程师与运维工程师交互
开发工程师有项目需要部署的时候,如果需要交给运维工程操作,那么除了要部署的项目本身,还要编写可以自动化部署项目的Shell脚本,一起交给运维工程师去部署项目。
另外还有一种情况,程序员开发具体模块时需要设计创建本模块的数据库表,本地建表调试确定后,把建表语句发送给运维工程师,在正式环境服务器上创建数据库表。因为正式服务器上通常是不给开发工程师操作权限的。
开发工程师与产品经理交互
你以为完成组长交给的任务就可以轻松优雅的下班?图样图森破!产品经理会直接找到你,让你改需求!你90%的精力其实都用来忍住揍他的冲动。
开发工程师与测试工程师
开发工程师将代码提交到版本控制服务器(SVN或Git的代码托管中心),然后根据版本控制服务器上的代码部署到测试服务器上,测试工程师访问测试服务器上的应用进行测试。发现Bug通过Bug管理软件通知开发工程师。
开发流程是什么?
开发环境有哪些?
下面谈到的各种具体环境不一定每一个团队都要使用,而是根据实际情况灵活组合。但是开发环境一定会有,生产环境一定会有,其他环境根据需求搭建。
开发环境
开发工程师写代码的环境。再具体一点说是开发工程师把写好的代码发布到开发环境中的服务器上,供他人调用。特别是后端工程师发布代码后,前端工程师调用。开发环境不需要搭建集群,但是所需的各种具体服务器都要有。比如:Tomcat、MySQL、Redis、ElasticSearch等等。但是因为不需要考虑性能问题,只要能把代码运行起来即可,所以可以安装到同一台服务器上。
测试环境
测试工程师测试代码的环境。但是为什么不直接在开发环境测试呢?因为开发环境下代码提交非常频繁,代码变化频繁,对于测试人员来说会导致前面一个版本还没有测试完后面又更新了。这种更新既可能是向前推进,又可能是版本回退。这会给测试人员带来很大困扰。所以把测试环境分离出来,开发人员完成一个大版本就部署到测试环境,这样相隔时间较长,测试工作保持一定节奏,开发人员也可以把功能完成再发布到测试环境。有的时候测试环境也叫“系统集成测试环境(System Integration Test)”,这里强调了系统集成。具体是指:一个功能复杂的大系统不能满足于各个模块单元测试通过,而是应该要集成到一起进行测试,从整个系统的角度测试系统故障。
测试环境下测试数据的来源通常要么是手动填充假数据,要么使用爬虫从互联网抓取数据。
用户接受度测试环境
UAT:User Acceptance Test,用户接受度测试,也叫验收测试,主要用于用户体验。所以UAT应该在SIT之后。
预发布环境
预发布环境是正式发布前最后一次测试。因为在少数情况下即使预发布通过了,都不能保证正式生产环境可以100%不出问题;预发布环境的配置,数据库等都是跟线上一样;有些公司的预发布环境数据库是连接线上环境,有些公司预发布环境是单独的数据库。
生产环境
项目正式上线,真正给最终用户访问时使用的环境,项目发布到生产环境就是上线。生产环境不仅要考虑项目的业务功能能够使用,还必须考虑到并发量、分区容错等非业务问题。
项目经理怎么给我分配任务?
一、概述
目前各个公司的研发团队进行任务分配的具体做法可以说是五花八门,大体上可以分成:专业软件、通用软件和其他方式三种情况。
①专业软件统计数据
②通用软件统计数据
③其他形式统计数据
二、jira简介
项目如何部署?
项目部署对应岗位:运维工程师或实施人员。
运维工程师[互联网公司]:搭建服务器运行环境、设置防火墙等安全策略、运行期间解决服务器故障。
实施人员[传统软件公司]:将开发完成的项目安装到用户服务器上以及对用户进行产品操作方法培训。
P.S.:运维工程师部署项目时通常需要开发人员在源码基础上附带部署项目的自动化脚本。
手动部署
自动部署
云原生
建模工具有哪些?
软件开发的本质其实就是把现实生活中的逻辑转变成程序代码执行。而在这个过程中建模工具可以起到很好的思维辅助作用。
StartUML
PowerDesigner
开发时用到哪些服务器?
一、概述
“服务器”是一个非常宽泛的概念,Tomcat是服务器,MySQL是服务器,Redis也是服务器。同时Linux是服务器,阿里云上租用的虚拟机也是服务器。此时有的小伙伴就会混淆。
其实具体来说,服务器分为下面这些类型。
二、硬件服务器
1、刀片式服务器
2、塔式服务器
3、机房
三、虚拟机服务器
1、VMWare虚拟机
通常来说VMWare用于开发人员在本地电脑上搭建一个模拟的服务器环境,或自己装一些东西测试,不是团队共同使用的正式环境。
2、弹性云服务器
使用弹性云服务器最大的好处就是弹性伸缩。什么是弹性伸缩呢?我现在的服务器是20G内存,因为访问量暴涨我需要把内存扩容到80G,要是物理的硬件服务器就需要买来新的内存条插入主板上的内存插槽。而弹性云服务器只需要改一下内存容量的参数就行了,非常方便。等访问量下降了,再把内存容量调回来就可以,不仅方便,而且可以精准的在访问高峰期提高服务器配置而不是一直维持高配,节约成本。
四、服务器系统
1、总述
有了服务器这台计算机,不管它是物理机还是虚拟机,我们都需要在上面安装操作系统,才能进行其他工作。
2、Linux
使用最多的服务器系统,安全稳定、性能强劲、开源免费(或少许费用)。
3、Unix
4、Windows
五、软件服务器
硬件服务器装好系统,就可以安装应用软件了,像我们熟知的Tomcat、MySQL、Redis、FastDFS、ElasticSearch等等都是服务器应用软件。它们分别提供自己特定的服务器功能。如果一台服务器上安装了Tomcat,我们会就会把这台服务器叫做Tomcat服务器;如果装了MySQL,就叫做MySQL服务器。很显然,开发过程中需要很多这样的服务器。