故事开始。java
小李是一个一线的java程序员,作软件开发多年,有一天,被邀请去参加一个大厂的面试,面试前他作了各类准备,有软件原理方面的,软件设计方面的,还有软件架构方面的知识。并不断总结提炼成了一张知识图谱。想着即便不成功,也是一次不错的技术交流,至少能够知道目前大厂须要的程序员具有的技能深度和广度,给本身定定位。下面是技术一面。程序员
小李:你好,我是李x,今年y岁,作一线开发z年,我来面试。web
大厂牛逼架构师:你好,小李。我是a厂的面试官b,我来给你面试。直接开门见山了。问题1,简单说一下软件研发的过程?面试
小李:按照软件工程的瀑布模型.算法
软件研发分为可行性分析,需求分析,概要设计,详细设计,编码,测试,发布,交付,维护,下线等节点。可是这些流程比较重,每每当软件开发完成交付的时候,客户的需求已经发生了变动,软件须要从新打回需求分析和概要设计阶段开始,致使软件的工期远远超出预期,并且开发方耗时间耗人力,客户方并不满意。sql
那么怎么破呢?数据库
按照当下流行的敏捷研发模式,软件在需求分析阶段,按照优先级别分批次设定发布计划,而后基于发布计划规划迭代,针对单个小迭代,开发,测试同一时间点参与,研发完成立马发布交付客户验收,客户快速反馈,针对反馈的问题,及时调整规划的需求,这样小步快跑,快速迭代的而方式去管理软件的研发过程,解决研发方研发的时间和人力成本高,客户还不满意的难题。设计模式
大厂牛逼架构师:问题2:系统概要设计阶段的非功能需求有哪几种?缓存
小李:软件除了实现客户的基本功能需求以外,还要知足预设的非功能性需求,比如冰山下的庞大底座,看不见的东西每每最耗费和考验软件工程师的功力,对架构能力,编码能力要求比较高。主要包含高性能,安全,高可用等。安全
大厂牛逼架构师:问题3:简单介绍一下高性能的指标?你使用过的性能调优方法?以及你的一个性能调优经历?
小李:高性能是软件系统的核心非功能需求,性能调优是软件架构师的核心职责,通常由高并发引发性能问题。要进行系统的性能优化,必须先进行性能测试。
软件系统的性能指标以下。
第一,响应时间,即用户发出请求到得到响应的总时间;
第二,并发数,即软件系统能够同时处理的请求数量,即HPS;
第三,吞吐量,有两个个基本指标,TPS(每秒处理事物数),QPS(每秒处理查询数);
第四,操做系统的性能计数器,好比CPU,内存的使用率,磁盘IO,系统负载,对象数和线程数量;
性能调优的原动力是提高用户体验,好比在异步显示资源,等待的时候能够转菊花;
性能调优的客观方法分为7种:
从软件系统的范围由大到小分别说明。
1,多数据中心,让用户访问离他最近的数据中心,能够显著下降响应时间。
2,使用高配置的硬件,好比更高的cpu,内存,对系统进行垂直扩展。
3,操做系统的参数调优,好比调大TCP的链接数,调小TCP的默认等待时间等;
4,JVM调优,设置合适的jvm的存储参数,选择合适的垃圾回收算法等;
5,软件系统的依赖组件调优,好比web服务器的配置调优,数据库的调优等;
6,软件架构调优,好比能够引入集群,缓存,消息队列等;
7,代码层面的优化,好比使用更优的数据结构,使用线程池链接池,sql语句调优,反应式框架,异步io,设计模式写出更简洁易读的代码等;
性能调优的流程是:
1,对要调优的软件系统进行性能测试,工具备不少好比jmeter,loadrunner等,使用多线程的方式模拟用户并发访问系统;
2,观察软件系统的性能指标,分析获得产生性能的问题的瓶颈点,须要很是了解整个系统的结构,而后解决这个瓶颈点;
3,而后继续跑性能测试,对比调优先后的性能指标。若是提升了则结束,没有提升则重复1步骤;
大厂牛逼架构师:问题4:简单介绍一下数据加密的种类?以及常见的软件安全漏洞?最后讲讲实际工做中应该如何保证软件的系统安全?
小李:软件系统系统只有被攻击,数据泄漏以后才意识到安全的重要性。
数据加密的种类有3种:
1,单向加密,好比经常使用的md5,通常使用的时候还要加个salt,并增长输入的密码复杂性检查,防止彩虹表破解密码;
2,对称加密,常见的好比RSA加密,经过一个秘钥进行加密和解密,只要秘钥不泄漏就是安全的;
3,非对称加密,常见的好比公钥私钥对,数字签名是非对称加密的应用,使用私钥加密得到密文,发送出去,只有配对的公钥才能解密,以此来验证数据来源的合法性。可是性能比较差。
除了数据加密,还须要保证数据在传输过程加密,那就要说到https协议了,它是结合使用了对称加密和非对称加密,首先使用非对称加密,产生一个秘钥,客户端拿到秘钥以后,对数据进行对称加密,服务端根据生成的秘钥进行数据解密。充分保证了数据处理的性能和传输数据的安全。
常见的安全漏洞:
HTTP安全漏洞:
1, SQL注入,解决方法使用Preparestatement替代statement处理传输过来的参数;
2,xss攻击,上传攻击脚本到服务器,别的用户获取数据的时候会解析这个攻击脚本,达成攻击目的,解决方式是字符串转义;
能够经过在网关中增长web防火墙或者在代码中增长过滤器来处理。
此外还有硬件和操做系统的安全漏洞,使用软件和组件的安全漏洞等。
实际工做中,应该应该及时升级依赖的软件和组件的版本,
升级版本通常修复了对应的安全漏洞,此外咱们应该在程序中作好参数过滤,
最后,应该对最终存储的数据和传输的数据进行加密,提升黑客攻击的难度。
大厂牛逼架构师:问题5:简单说一下如何保证软件系统的高可用?
小李:高可用即要求软件系统在各类故障发生的时候作到可用或者大部分可用,软件系统的可用率通常采用N个9的方式来衡量。
各类故障均可能影响软件系统的可用性,好比:
1,天然灾害
2,人为缘由
3,高并发访问
4,硬件故障
5,软件故障
保证系统的高可用有5种方法:
1,冗余备份,即多准备几个服务器,好比多个web服务器(故障转移),数据库服务器(多主模式集群);
2,异地多活,即经过域名的方式,把请求分发到多个地域的不一样机房;
3,限流降级,限流即限制HPS,降级即关闭非核心功能让出有限资源;
4,失败隔离:消息队列削峰填谷,转移写压力,隔离失败;
5,运维方法:自动测试,自动监控,灰度,预发布等;
大厂牛逼架构师:
小李架构功夫很扎实。简单的点评一下。
1,不愧是多年的一线开发人员,软件研发流程很是熟悉,并且敏捷研发模式有必定经验;
2,高性能是很是重要的非功能需求,调优方式7中都答的很到位;
3,安全性也是很是重要的,数据加密分类清晰,http的攻击防御手段有所了解;
4,高可用的手段总结的很到位;
小李:感谢您的评价,但愿有机会合做,为企业打造数字化产品帝国。
故事讲完。
原创不易,转载请注明出处。