首页 文章 精选 留言 我的

精选列表

搜索[架构师],共6922篇文章
优秀的个人博客,低调大师

测试架构师如何解读测试平台的各种争议

2 --> 导读 先从 最近几天群里关于测试平台的话题谈起,再来谈谈接口测试的痛点是什么,然后是我的接口测试的解决方案。希望通过本篇的论述,大家对什么是好的平台能达成统一的认识,且通过创新做出好用,对测试人友好的平台。有需要的可以加群323432957。 最近 群里面,关于测试平台的讨论很激烈。我本人是支持平台的,但是现在好多平台都是 KPI 导向,拿接口测试平台来说,除了少数做得不错之外,看到好多不是 demo ,就是 jmeter ,postman 的 web 化,不否认做平台,对技术多少还是有提升 (大多数是 CRUD,仅仅是从 0 到 1),但是如果平台没人用,这平台就是失败的。证明有一定的技术实力,除了开发平台,还有很多更高效的方式,比如为开源软件提交 PR,熟读开源中件间代码,掌握测试前后移的技术 (TestOps),为团队开发实用测试小工具等。 随着微服务架构理念,云计算,容器技术的普及,DevOps 在 it 界渐成共识,并成为主流开发模式,在 DevOps 快速迭代中测试成为快速交付的一大短板。降本增效迫在眉睫。反过来,平台只要好用,就是好的平台,什么是好的平台,一定是要能做到降本增效。 先从两个主流工具的局限性谈起,postman 和 jmeter 是两个比较主流的接口测试工具,当然 jmeter 用于压测和接口自动化都可以。这两个工具都解决了接口测试的基本问题,但仍然存在不少问题,我罗列了以下五点: 1. 可管理性不强 我认为这些工具在一定程度上就是个面向个人的 “单兵武器”, 基本上无可管理性。JMX,或是 JSON 文件,不好管理,协同就更是难上加难。市面上对他们 web 化的价值,也就是可管理这一点,更深层次的痛点并没有触达。 2. 对测试人员不足够 “友好” 用过 QTP,LR 之类的对测试人员都知道,傻瓜化,不懂代码,一样用得很开心,这对大多数不会写代码的测试人员来说,确实是 “福报”,断言,参数化,数据驱动都非常简单,然而这些工具都是商业化且使用场景相对固定,并无法快速响应互联网不断变化的测试需求。反观 postman 或者 jmeter,虽然免费了但是又有不少功能需要你二次开发,所以说没有” 普适性”。对于一些代码基础薄弱的同学来说,遇到定制化的需求往往束手无策。检验” 普适性” 的标准,就是是否傻瓜化,这决定了门槛的高低;高级使用人员,可以二开及使用一些高级特性。傻瓜化不是提倡,测试人员不会代码就是好事,平台想要推广得好,普适性很重要,打个不太恰当的比方,就算会写代码,也没多少人用 VI 或是记事本写,都要用 IDE 工具,为什么?效率高呀。会写代码,可以做很多实用的测试小工具,还是非常棒的! 3. 对接口反向用例或混沌测试支持不够 虽然很多平台支持数据驱动测试,但是对接口反向用例或混沌测试支持不够。先从一下真实生产事故讲起,朋友公司因第三方接口导致了服务器宕机,最后查到的原因是,扫码,传入的数据是一个比较长的乱七八糟的字符串,没按要求传正确的值,结果服务器,死循环挂掉了。接口测试时,无法穷举所有参数值。在 postman 和 jmeter 中都有数据驱动,但是我认为采用枚举的方式来设置参数值,然后通过数据驱动的方式来执行测试,对人的依赖太大。后面我再讲接口混沌测试,瞬间可以完成笛卡尔积式的接口混沌测试,从另一个视角来实现,且和接口数据结构无关。 4. 理不清接口间的调用关系 纵使写了很多接口用例,但是对接口间的关系依然是” 抓瞎”。很多时候我们借助于调用链跟系统,但是对于平台上的接口用例,调用链这张网又太大,和接口用例也不完全匹配,就算匹配,且调用链跟踪突出的是,调用上的时间顺序,并不突出他们之间的依赖关系,以及是什么样的依赖关;也不是所有系统都用上了调用链路跟踪,大多不是微服务架构的项目,这块想用调用链跟系统 (如 SkyWalking Zipkin、Pinpoint 等) 还是不好办的。接口用例间,实际上就存在依赖关系,如 A 接口,要依赖取 token 接口,同时 A 还依赖 B 接口的响应数据中提取的参数等等,这在 postman ,jmeter 中,虽然接口依赖关系事实上存在,但只能人工去理,没有一目了然的可视化界面来展示依赖关系,当一个接口改动了,也不方便评估,对其他接口的影响;且通过直观的依赖关系,可促使挖掘更多的测试场景。 5. 低代码模式对测试能效提出更高的要求 研发都低代码了,接口测试却还没有低代码,变相抬高了接口测试门槛,当然这个对于测试来说要求也比较高,事实上这也不利于提效。肯定有人要反对了,测开就是要写代码呀,能写代码这很好呀,明确的说,这是五年前流行的观点了,我们要的不是代码的堆砌,而是高质量的有效代码;测开会写代码,做出来的产品和解决能效之间并不是等号!脱离方法论,脱离工程文化等能加快交付途径的方方面面,只是 “秀代码”,没多大价值。既然要做平台,出发点肯定是团队提效,而不是单兵作战;另外从公司团队组建的角度来说,也不可能全是测开,平台化如果不考虑业务测试的融入,不考虑对非测开人员的 “普适性”,就没法解决木桶效应的问题,我认为这个平台是失败的,不管如何分工,团队的整体能效没上去,这平台就是测开自嗨的平台。现在开发都在提低代码了,开发效率会大大提升,测试的压力更大,测试也要低代码化,才能也一起提效,否则测试这块的短板更短,下面我也会再讲讲对于测试低代码化的一些思考。 现在大家对低代码的讨论非常多,看低的也大有人在,我这里就不展开说了,但有一点我认为低代码会成为趋势,无服务对低代码更是推波助澜。目前比较火的低代码平台,比较有名的都是国外的,微软也有低代码平台。拿我们公司的低代码平台来说,刚毕业的新人,入职三天,就能实现业务开发了,效率还是杠杠的!且通过注解,单元测试不需要写一行代码了,加少量的注解就可以了,比手写 junit 测试类,省至少 2 倍的时间 。 上面是我个人认为的接口测试中最痛的点,我看到的接口测试平台,不解决这些刚需,只是通过 web 封装工具的话意义不大。从老板的角度来说,没增效,投人力做这事就不值,大家都知道提问题简单,难在解决问题,下面我来说我的解决方案是什么? 解决方案 下面就来谈谈我设计的一站式敏捷测试管理平台,针对我罗列的五个痛点是如何解决的。 1 关于管理协作,只要是平台化,天然就解决这问题。 2 对测试人员友好,主要是可用性,可维护性。 postman 和 jmeter 虽然受到普遍的欢迎,但从自动化角度来说存在一些硬伤,我举两个设计上的具体例子: (1) postman 前后置脚本及签名等和接口用例耦合在一起,不方便维护,比如我需要对请求签名,如果签名算法改了,我得来改接口 用例,如果有 100 个接口,这改起来太可怕了,要是解偶,只要改签名算法本身,其他接口中是选择引用这个算法,就不存在这种痛苦; (2) 参数维护不面向对像且不能自动转换 , 如参数得复杂 json 只能写 json ,通常大家对表单比较熟悉, 批量维护 KV 自动转 JSON ,如是复杂对像,支持 dto.user.id 这种复杂 kye 转 josn 就爽得多,完全是向面对像的式在维护参数; 直接上图我是怎么解决的? 下图就是插件化解耦,维护好相关插件,在接口用例中,只是下拉选而已。 ​ ​ 参数维护方便很多,个人非常不喜欢 json schema 的方式,KV 可方便转复杂 JSON ,又可下接写复杂 JSON,这才是照顾使用人的效率和提升便利,XXX.XXX.XXX 这种才是以面向前对像的思维维护参数,且更切近表单属性。 ​ 3 对接口反向用例或混沌测试支持不够。 一说反向测试大家第一反应是,通过数据驱动来测试,如果复杂 JSON 数据结构,数据驱动按传统的方式,对测试人员来说一点不方便,这两个我们都是这样来解决的接口反向或是混沌测试,只需要配置好混沌规则 ,然后以 “撞库” 的形式排列组合,替换掉正向接口用例中的参数值去执行撞库,瞬间完成接口健壮性测试 “撞库时” 先单个一个一个去换, 然后再排例组合。 ​ 看下混沌工程的执行结果: ​ 数据驱动,也是按面向对像的方式,方便复杂 JOSN 的结构,传统的数据驱动,只方便 KV 方式,复杂对像,表达起来费劲,我们依然采用 xxx.xx.xx 这种对像属性访问形式。依然采用 xxx.xx.xxx 这种对像属性访问形式,即支持简单 KV ,又能一行表示一个 json 对像,直观又易于理解 ​ 4 对接口间的关系理不清 前面的论述,就不重复了,接口间只要存在参数引用,就必须存在依赖关系,完全可以根据依赖关系推导出来,在接口测试场景中,只要选择了一些用例,自动加入依赖的接口用例,并排好执行顺序。同时还能自动检查循环依赖。 不但可以查看依赖拓补,还可以在维护接口用例时,自动检查循环依赖,如检测到,给出提示 ​ 自动循环依赖,如下图给出了具体的循环依赖信息 ​ 5 研发都低代码了,接口测试却还没有低代码 这其实变相抬高了接口测试门槛,同时也不利于提效。这块的争议最多,不再累述。可能测试人员,平时写代码少,低代码会使一些人觉得剥夺他们写代码的权利;也有人说低代码,容易让大家变成工具的奴隶,低代码只是为了提效,把重复工作工具化,并不禁锢使用人员的思想,从公司的角度来说,老板希望你把时间花在,重要的事情上, 重复的事情,工具化,平台化。 比如初级一点的,可以在断言以及提取参数时,通过拖拽的方式,高级玩法就是 bpm 那样的编排,就像工作流一样,拖拉的方式来编排,通过编排实现接口业务场景的测试。另外,还可以重用接口用例,把他转化为 JMX 文件,这样一个用例或是场景,接口测试可用,压测也重用接口用例,以一当二用。 ​ ​ 写到这里也几千字了,这只是我个人之言,不对之处欢迎大家讨论拍砖,看群里上关于平台的讨论,很是激烈;我在这里抛砖引玉,只要是有益的讨论,对行业也是有利,如果能让大家静下心来,一起来探讨什么是好的接口测试平台,也是好事。少卷一些,少一些 KPI,做真正好用的对测试人友好的测试平台还是很香的。 好些人做平台是为了面试时加分,或是多些谈资,这太急功近利了;我看过好多只是个 demo 的平台,在这里我就不一一列举代码地址了,多数是为了加群吸粉,这留得住人吗!!我表示嗤之以鼻!一个好的面试官用一个烂平台也忽悠不了他,有能力,不管是编码能力,还是综合能力强,有很多方方面面来体现,这里就不展开说了。 这贴子肯定少不了争议,欢迎大家加入323432957讨论群,我也在群里方便大家来讨论。写这贴子,也是有感而发,我们一直在前进的路上,3 年了一直在钻研中,上面的痛点,必须要全面解决;当前正在丰富压测模块及实现可视化接口编排 大家可以期待。 ​

优秀的个人博客,低调大师

大学毕业后,用了7年做到架构师岗位!

作者:小傅哥 博客:https://bugstack.cn > 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言 20万行代码写完,毕业了找一份工作不是问题! 刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这个毕业的时间点参加,就会显得特别匆忙。因为你的压力既来自于培训还需要花家里一笔不小的费用,也有同班同学已经找到一份不错的工作开始赚钱的比对。 大学四年其实有足够的时间让你学会编程,也能从一个较长时间的学习中,知道自己适合不适合做程序员。就像我的同学里虽然都是计算机或者软件工程专业,但毕业后并没有都从事软件开发工作,或者从事了一段时间发现并不适合这个行业而选择到其他领域发展。 所以如果你是真的喜欢编程,那么在这个行业里工作你会很开心,如果不是那么往后路还长,你所要面对的晋升、加薪、跳槽都可能成为一道道障碍。目前可能你还是新人不了解自己是否喜欢编程开发,那么可以在以后的学习中体会,自己是否愿意为一个运行结果调来调去,辗转不寐的研究分析,只为最后那一个运行通过而激动! 当你可以在激动和开心中写完20万行代码,对于毕业后的求职找工作来说几乎可以叫你一声面霸,也可能你在实习时就被公司直接留下,这是个人才组织需要你! 20万行代码看上去很多,但放在4年的大学学习中并不会有多难。平均每天200行,一个月是6000行,一年算10个月是6万行,三年就有18万行。这20万行代码会把你从一个编程小白,带入到熟练使用Java相关API,也能给你带入到初级工程师的水平。 初学编程你可能想把一句代码完整敲下来都不容易,就更不用说运行出结果了。因此此时你的大脑和手还并不能迅速理解你眼睛里看到的这一行行代码都是啥,要干啥。这就像新买回来的钢琴手指头上去摸肯定是生硬的,敲出的声音也不连贯。这个阶段只能是照着例子大量的写,度过一个熟练期才能更好的学习。 为了可以让更多的小伙伴理解这件事,我会从我的在校、培训、外包、跳槽、阶段成长以及找什么样的工作分享给大家作为参考,最后再把我整理出资料一并分享给大家。 二、经历 12年10月25日,在CSDN发的一个帖子 拿到两个offer,一个7k,一个转正税后4.5k。求意见! 距离现在它已经过去好久了,当时也是因为拿到了两份offer的选择纠结,所以发了个帖子求问。好气的是当时竟然不知道去面试面试互联网公司,信息太闭塞了,而且培训的地方并没有说过互联网一些公司的信息。 讲一讲我这7k的经历; 12年07月,校企合作来北京昌平一个小县城的地方参加中软培训 12年10月,培训接近尾声,开始找工作,月薪7k的中软就是最后的选择的地方,放弃了在北航院内的国家科技 12年12月,虽然拿到中软Offer但迟迟不让入职,电话联系了很多次我说可以先去实习,但都说等通知。没办法,在北京也不可能就硬待着,回家的话也麻烦行李、住宿都得折腾,所以又面了一家中科软进去实习了三个月,赚点钱养活自己 13年03月,中软的通知终于来了,但竟然是参加岗前培训,又被培训了一次,当时特别讨厌培训,每次都是讲Java基础,差点生气怼老师 13年09月,在中软正式转正,也就是说培训完又是实习,7月份毕业后9月份才入职为正式员工,心里有点不爽,埋下了一个后续跳槽的种子。哪有实习这么久的! 15年04月,第一次有跳槽准备,毕竟写了两年的C#写够了,面试了第一家互联网公司,乐视致新,不过后来没去,被公司留了下来 15年08月,之前谈的留下来涨薪,但最后少涨了1千块钱。所以继续面试,还算顺利面了两家,最后在8月25日跳槽进互联网完成。 以上整个过程就是我从学校到实习到找工作以及最后跳槽的一个阶段性经历,也有过在这条路上跌跌撞撞。就像; 虽然我面到了中软管培生,但错失没选择要北京户口,而是要了400块房补 在中软9月份从实习转正式员工,错过了第二年的入职满一年才涨薪的条件(但我觉得这个有点故意坑了) 明明是学了那么多Java,但却写了两年C#,大家还是要选择自己喜欢的语言进行工作,否则会很麻烦 提了离职,基本就不要想着再留下来,无论什么条件。哪怕钱和职位满足了,心里也有隔阂以及个人对没经历过事情的一个期许 从传统外包跳槽的互联网,并不那么容易,技术使用的不同、开发场景的不同、组织关系的不同,一切都可能是从一个较低的位置重新开始。你需要自身技术不错,也需要一个好人带 但当时在的传统也有不错的点,比如可以5:30下班,带我的经理人很不错,公司也不那么累,有时候还可以出差溜达溜达。 三、学习 一个大学生会经历在校、实习、就业几个阶段,其中在校学习属于蓄力阶段,要学习很多知识才能支撑起来将来的实习和平稳就业。 蓄力阶段的学习,主要是对编程技术的基础的夯实,以及多学习与数学相关的内容,比如;数据结构、算法逻辑,这些知识对将来在技术上的提升和造诣都是非常好的基石。下面就是整个大学过程中在编程学习过程中需要经历的阶段,如图; 熟悉工具:初学编程后你大概会接触到一系列的研发工具,包括IDEA、Eclipse、Navicat、Maven、Git、Tortoise、SourceTree、Visio、Xmind等等,工具的熟练会让编程更流畅。 编写代码:此时你需要大量写代码,写很多的代码,因为你几乎就是需要靠写代码把整个所学的编程语言熟练使用起来。总不能手生到写完 public,写不出来 class,这跟我不会弹钢琴一样,敲完了1,后面不知道要在哪找下一个音符♪了。 功能开发:小的功能开发是综合锻炼技术使用的阶段,比如做一个计算器、求一个水仙数、从一篇html中摘取你要的信息等等。此段经历会解决你之前感觉学完技术没出用的痛苦,现在你可以想象出各种场景问题,之后用代码去处理。还可以帮助英语系的小师妹,把她需要背的单词从网站中爬取下来,汇总出各类热词、语句、摘要等 项目开发:小功能练手后,接下来你就可以做做项目了。比如你常听到的图书管理系统、教师教学管理系统等等。如果觉得没有意思,你可以从哪里获取项目呢?从你用到的各类APP中,把这里用的功能简化,之后做一些项目开发。比如一个简单的商城、抽奖、全物流单号查询。另外你还可以在github中查找一些项目,去参考学习并自己动手实践。 数据结构:可能初学编程并不会对数据结构有多少思考,也想象不到这类内容是用在哪的。但其实这类技术内容早已被你天天使用,例如:LinkedList、ArrayList、HashMap,这里就包括了数组、链表、栈、队列、散列表、树、堆等各项数据结构,当你将来要开发一些较大型的互联网应用程序时,你所有的逻辑设计都会考虑到数据要如何存放,数据结构如何设计才能更合理的被程序使用。 算法逻辑:学完数据结构接下来要做的就是对算法逻辑的学习,这里不仅仅是简单的刷题,而是在数据结构的上使用算法将数据更合理的存放和读取以及做相应的操作。就像你能逐步了解的;排序、二分、旋转、洗牌等等,以及将来还会在阅读JDK源码中会看到,扰动函数、负载因子、拉链寻址、开放寻址、哈希散列、除法散列法、平方散列法、斐波那契(Fibonacci)散列法等等。 设计模式:当你开发了很多很多程序代码以后,你会逐步的思考怎么才能让这些代码有可复用性呢,怎么写才能让更多人读懂呢、怎么实现才能让再接需求时能更快的承接呢。这些都会随着你开始实习真正接触到公司级的代码开始逐步的感受到的,写代码不是一锤子买卖,也不是炫耀技术,当你有更宽的视野范围时,就会思考的更多。这里推荐阅读《重学Java设计模式》 这是一本基于互联网真实案例编写的Java设计模式实践图书。全书以解决方案为核心,从实际开发业务中抽离出交易、营销、规则引擎、中间件、框架源码等22个真实场景,对设计模式进行全面、彻底的分析。帮助读者灵活地使用各种设计模式,从容应对复杂变化的业务需求,编写出易维护、可扩展的代码结构。 以我个人经历和经验来看,想搞定这些学习范围和内容,最大的动力是来自于对编程的热爱和折腾。就像我这样做过很多土项目,如下; 串口通信、在线考试、考试抽题、彩礼管理、成绩管理、即时聊天、计算器还有后来折腾过的仿微信聊天,这些项目都可以不断的夯实个人的技术能力,每一次做新的一个项目都会把之前所遇到的问题,又考虑新的实现方式再折腾一遍。 编程的学习中重要的并不是结果,而是在这个过程中经历了什么。哪怕是犯了很多的错也没关系,因为每一次犯错都是学习的机会,都可以找到更多的资料,每一个资料里又可能教会你其他的知识。 四、就业 不只是我,可能很多在上学阶段并不知道都是做Java开发,就业的企业也分为传统行业、国企、半国企、外包、外企、互联网等这么多类型,尤其是我这样在13年毕业的时候,既没有所谓的就业指导,也没有有经验的朋友了解,就只能跟着大家走。好在现在大家可以在互联网中获取到这些信息,也就能早早的帮助毕业同学进行择业。 1. 传统行业 难度:⭐⭐ 公司:金蝶、用友 发展:在传统行业方面有较强的技术积累和产品沉淀,一般其他公司也都有传统行业研发的产品。另外现在的传统行业逐步包括了互联网的领域开发以及技术使用,只不过会比纯互联网少一些高并发场景,因为大部分这类软件面对的并不是C端人群。所以个人进入此类公司会相对比较稳定,但如果后期想再跳槽比较麻烦,会出现技术断层。 2. 国企&半国企 难度:⭐⭐⭐ 公司:联想、京东方、中软国际、国家电网 发展:早前应届生入职国企或者半国企一般会有解决北京户口,但现在可能名额不断的减少了。像中软有一部分自己做的东西,也有一部分是承接外包的内容。此类公司做的工作内容可能比较单一,有时候一个项目会用很多年,但同时可能不会太忙,有一些自己的时间,并且像联想、国家电网福利待遇也都不错。 3. 外包 难度:⭐⭐⭐ 公司:对日外包、企业外包 发展:像是在大连会有一些专门的对日外包企业,还可能需要长期在日本出差。我的两个同学上学时候日语都学的不错,现在一直在日本工作,就他们来说挺习惯在外面的生活了。还有一部分外包是企业外包,比如你入职一个外包公司,可能会把你这个人外派给华为、腾讯、阿里等公司,开发他们外包出来的工作,此类工作一般相对来说短期、非核心。但干的好的也有转正机会,直接入职大厂,不过比较难。而且外包到企业里的人员,没有正式员工的待遇 4. 外企 难度:⭐⭐⭐⭐ 公司:亚马逊、谷歌、微软 发展:外企工作还是挺香的,相对来说没有那么强的加班,福利待遇也比较不错。例如像这类的公司会明确写上不加班,以及各种假期和旅游。但可能是近几年被国内互联网挤压的,也有一些在国内的外企有裁员的动作。 5. 互联网 难度:⭐⭐⭐⭐⭐ 公司:百度、阿里、腾讯、字节、京东、美团、滴滴等等 发展:这类公司在北上广就多了去了,虽然多但面试难度仍然不低,尤其是现在内卷的情况下,需要你会很多知识以及数据结构或者刷算法,才可能找到一份不错的工作。此类的公司的薪资待遇不错,每年都水涨船高,可能一个刚毕业的重点大学,大学生,入职的薪资就要倒挂各类老员工了。除了有少许的内卷,其他的还是挺不错的。 6. 出国 难度:⭐⭐⭐⭐⭐ 公司:加拿大的 shopee、美国的脸书、谷歌、苹果等等 发展:如果喜欢国外的生活,又有出去的本事,那也是一个非常好的选择。像小傅哥熟悉的一个北大的伙伴,入职到了加拿大的 shopee,收入以及整个生活节奏对他来说还是非常满意的。 以上就是各类公司的一个简单介绍,每一个人就业时都会有自己的选择,比如想安稳些、想要户口、想要高工资、想不那么加班等等,只要你能对自己的选择负责,合理规划好自己的职业发展,那么就可以了。 五、资料 1. 技术内容 其实现在互联网的文档、资料、书籍、视频都已经很多了,但也可能正因为太多了,让初学编程的人找不到所处阶段,大一、大二、大三、大四以及毕业了工作了几年后,都应该找什么样的资料学习。 所以我这里把各类资料进行整合,按照不同阶段的学习范围把资料分到不同的文件夹去,方便所处不同阶段的读者可以有一个相对准确的学习范围。 资料明细:大学四年到毕业工作5年的学习路线资源汇总 网盘链接:https://pan.baidu.com/s/4mmX7sDy 2. 实战内容 如果你已经跨过了初级阶段,需要做一些实践型的项目,可以关注下我的Github,如下: 内容:本代码库是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。这部分资料也是我所写博客中实践项目的源码,在这里你可以学到Netty、字节码编程、设计模式、领域驱动设计、规则引擎、面试、架构以及职场经历的分享。 地址:https://github.com/fuzhengwei/CodeGuide/wiki 六、总结 如果一个大学生不怎么关注技术博客,也不知道有哪些技术博客,那么大概率你基本不会了解到你要学什么技术,也没有渠道可以让你拓展自己的知识面。并且尤其是在现在的软件基于人群喜好推荐下,你知道的越少的东西,就越少知道这个东西。所以主动有意识的学习,几乎是你个人成长最快的方式。 做一件事,就把一件事做好!认认真真的长期坚持下来,你会在所走的路上收获很多,千万不要急于求成,否则你能获得的只是微乎其微。当你有一天真的要拿手里的这几张牌,出去闯荡的时候,会被人家炸哭。 另外在大学里进来不要去做一些不会给自身带来长久价值的兼职工作,如果你真的缺那份钱另说,否则尽可能把这些时间用在你将来要找的工作所需的知识学习上。时间不多,做有价值的事更有益个人成长。 酒香不怕巷子深,放在现在是几乎就是不可能的。因为酒不在是你一家酒了,谁能曝光的更多,宣传的更足,展示的更好,谁就更有机会可能成为佼佼者。否则站在台上那个不一定比你强的人,却可能比你过的更好。 七、系列推荐 讲道理,只要你是一个爱折腾的程序员,毕业找工作真的不需要再花钱培训! 大学四年到毕业工作5年的学习路线资源汇总 13年毕业,用两年时间从外包走进互联网大厂 刚毕业不久,接私活赚了2万块! 北漂码农的我,把在大城市过成了屯子一样舒服,哈哈哈哈哈!

优秀的个人博客,低调大师

云服务OpenAPI的7大挑战,架构师如何应对?

阿里妹导读:API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参考 github 和 k8s ,它们都是典型的RESTful接口。云服务对外开放的窗口就是OpenAPI,今天要讨论的话题是“云服务场景下OpenAPI设计的挑战”。 为什么要有API规范 之所以强调“云服务”的原因在于,小规模独立API的设计与大规模批量生产API面临的问题是不一样的。同样,只专注于自身产品API的可用性与从更高的层次去看云服务整体API体系的健壮性,要建设的体系也是不一样的。 例如,做一个WEB页面使用的API,只需要考虑性能、稳定性、鉴权就好,因为页面与API是一体的,可以一起发布和回滚,只要功能正常,即便API设计有缺陷,

优秀的个人博客,低调大师

阿里架构师眼里JVM可以说的那些事

前言 对于C语言开发的程序员来说,在内存管理方面,必须负责每一个对象的生命周期,从有到无。 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存溢出等问题也不太容易出现,不过也正是因为把内存管理交给了虚拟机,一旦运行中的程序出现了内存泄露问题,给排查过程造成很大困难。所以只有理解了Java虚拟机的运行机制,才能够运筹帷幄于各种代码。本文以HotSpot为例说说虚拟机的那些事。 JAVA虚拟机把管理的内存划分为几个不同的数据区。 Java堆 Java堆是被所有线程共享的一块内存区域,主要用于存放对象实例,Java虚拟机规范中有这样一段描述:所有的对象实例和数据都要在堆上进行分配。为对象分配内存就是把一块大小确定的内存从堆内存中划分出来,通常有两种方法实现: 1 、指针碰撞法 假设Java堆中内存时完整的,已分配的内存和空闲内存分别在不同的一侧,通过一个指针作为分界点,需要分配内存时,仅仅需要把指针往空闲的一端移动与对象大小相等的距离。 2、空闲列表法 事实上,Java堆的内存并不是完整的,已分配的内存和空闲内存相互交错,JVM通过维护一个列表,记录可用的内存块信息,当分配操作发生时,从列表中找到一个足够大的内存块分配给对象实例,并更新列表上的记录。 对象创建是一个非常频繁的行为,进行堆内存分配时还需要考虑多线程并发问题,可能出现正在给对象A分配内存,指针或记录还未更新,对象B又同时分配到原来的内存,解决这个问题有两种方案: 1、采用CAS保证数据更新操作的原子性; 2、把内存分配的行为按照线程进行划分,在不同的空间中进行,每个线程在Java堆中预先分配一个内存块,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB); Java栈 Java栈是线程私有的,每个线程对应一个Java栈,每个线程在执行一个方法时会创建一个对应的栈帧(Stack Frame),栈帧负责存储局部变量变量表、操作数栈、动态链接和方法返回地址等信息。每个方法的调用过程,相当于栈帧在Java栈的入栈和出栈过程。 局部变量表 用于存放方法参数和方法内部定义的局部变量,其大小在代码编译期间已经确定,在方法运行期间不会改变。局部变量表以变量槽(Slot)为最小存储单位,每个Slot能够存放一个boolean、byte、char、shot、int、float、reference和returnAddress类型的32位数据,对于64位的数据类型long和double,虚拟机会以高位对齐的方式为其分配两个连续的Slot空间。 在方法执行时,如果是实例方法,即非static方法,局部变量表中第0位Slot默认存放对象实例的引用,在方法中可以通过关键字 this 进行访问,方法参数按照参数列表顺序,从第1位Slot开始分配,方法内部变量则按照定义顺序进行分配其余的Slot。 对应的局部变量表如下: 使用 javap -c 命令查看方法calc的字节码 其中iload_1和iload_2分别从局部变量表中的第1位和第2位中加载数据。 方法区 方法区和Java堆一样,是所有线程共享的内存区域,用于存放已被虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码等数据。 运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。 指令计数器 指令计数器是线程私有的,每个线程都有独立的指令计数器,计数器记录着虚拟机正在执行的字节码指令的地址,分支、循环、跳转、异常处理和线程恢复等操作都依赖这个计数器完成。如果线程执行的是native方法,这个计数器则为空。 对象的内存布局 对象在内存中布局可以分成三块区域:对象头、实例数据和对齐填充。 1、对象头 对象头包括两部分信息:运行时数据和类型指针,如果对象是一个数组,还需要一块用于记录数组长度的数据。 1.1、运行时数据包括哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID和偏向时间戳等,这部分数据在32位和64位虚拟机中的长度分别为32bit和64bit,官方称为”Mark Word”。Mark Word被设计成非固定的数据结构,以实现在有限空间内保存尽可能多的数据。 32位的虚拟机中,对象未被锁定的状态下,Mark Word的32bit中25bit存储对象的HashCode、4bit存储对象分代年龄、2bit存储锁标志位、1bit固定为0,具体如下: 其它状态(轻量级锁定、重量级锁定、GC锁定、可偏向锁)下Mark Word的存储内容如下: 1.2、对象头的类型指针指向该对象的类元数据,虚拟机通过这个指针可以确定该对象是哪个类的实例。 2、实例数据 实例数据就是在程序代码中所定义的各种类型的字段,包括从父类继承的,这部分的存储顺序会受到虚拟机分配策略和字段在源码中定义顺序的影响。 3、对齐填充 由于HotSpot的自动内存管理要求对象的起始地址必须是8字节的整数倍,即对象的大小必须是8字节的整数倍,对象头的数据正好是8的整数倍,所以当实例数据不够8字节整数倍时,需要通过对齐填充进行补全。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册