我在字节当主管:百次面试结果,总结一个刷掉99%求职者的问题!

做测试不会 SQL?超详细的 SQL 查询语法教程来啦! 作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的sql查询语法必须要掌握。最近有部分做测试小伙伴表示sql查询不太会,问我有没有sql查询语法这一块的文档可以学习,于是小编就整理了这篇超详细的SQL查询语法教程,来给大家参考学习! 阅读详情

前言

我一个在大厂当主管的朋友,跟我说:

“现在招性能测试太难了,当然不是说没人干,一开招聘信息就能收到一大把简历,其中不乏学历亮眼、背景出色、简历里各种高并发、大流量的项目经验的人才。

问题在于,当你提出讲一个项目中遇到的性能问题,以及如何分析定位时,却发现绝大多数根本没有遇到过性能问题。

甚至面试了几个高级性能测试工程师,还是发现一旦涉及到性能分析调优,就开始左顾右盼、答非所问。”

“问题的结症在于,大部分面试者参与的性能测试项目就不多,企业又希望招有经验的测试,这本身就存在矛盾!”

我说,你说的情况谁不知道?你不如讲点实际的,讲点经验,性能调优你说怎么弄?

朋友思考了一会说道:“那不如正好聊聊我手上的这个项目,聊聊SQLSERVER数据页!”

“什么是数据页 ”

一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分的,比如说 Windows 对内存的管理就是按照 内存页 (4k) 来进行划分,言外之意就是 SQLSERVER 对 mdf 的管理也是按照 数据页 (8k) 来划分的,画个图大概就是这样的。

那如何来验证这个结论呢?刚才也说了数据都在数据页上,我们弄点数据然后在指定的数据页上提取出来就好了,这里用的是 SQLServer 2019

CREATE DATABASE MyTestDB
GO
USE MyTestDB;
GO
IF OBJECT_ID('person') IS NOT NULL
    DROP TABLE person;CREATE TABLE person
(
    id INT IDENTITY,
    name CHAR(5)
);
GOINSERT INTO dbo.person( name ) VALUES ('john');INSERT INTO dbo.person( name ) VALUES ('mary');

“寻找数据所在的数据页”

一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分刚才图中也说了 mdf 是由无数个 数据页 拼出来的,那如何找到 person 表所在的数据页呢?其实微软提供了一个 dbcc ind 命令可以帮我们洞察出来,同时记得开始3604标记,让输出显示在控制台上,而不是默认的错误日志中,这个命令具体怎么用,大家可以查看官方文档。

DBCC TRACEON(3604)
DBCC IND(MyTestDB,person, -1)

从输出看有两条记录,第一个是 PagePID=41 是 IAM 数据页,而PagePID=280 就是我们 person 表记录所在的数据页编号,也就是说 person 表的记录在 mdf 文件偏移为 0n280 * 0n8192 的位置,用 WinDbg 算一下就是 0x00230000 。

0:090> ? 0n280 * 0n8192
Evaluate expression: 2293760 = 00000000`00230000

那是不是呢?可以用 WinHex 验证一下,为了不出现进程占用,先把 MyTestDB 下线了,最后记得再上线即可。

ALTER DATABASE MyTestDB SET OFFLINE
ALTER DATABASE MyTestDB SET ONLINE

从WinHex 上看,果然是在偏移为 0x00230000 这个数据页上。

“如何从内存中看到数据页”

刚才我们看到的数据页只是物理硬盘上的,但数据页和数据页之间的逻辑关系肯定是在内存中用一定的数据结构来承载的,接下来看下这个 数据页 映射到 SQLSERVER 进程内存的哪里呢?微软提供了 DBCC PAGE 命令可以查看指定 数据页 的详细信息。

DBCC TRACEON(3604)
DBCC PAGE(MyTestDB,1,280,2)

输出结果如下:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


PAGE: (1:280)




BUFFER:




BUF @0x000002B41104F480bpage = 0x000002B3F0632000          bPmmpage = 0x0000000000000000       bsort_r_nextbP = 0x000002B41104F3D0bsort_r_prevbP = 0x0000000000000000 bhash = 0x0000000000000000          bpageno = (1:280)
bpart = 1                           ckptGen = 0x0000000000000000        bDirtyRefCount = 0bstat = 0x9                         breferences = 0                     berrcode = 0bUse1 = 12454                       bstat2 = 0x0                        blog = 0x15ab215absampleCount = 0                    bIoCount = 0                        resPoolId = 0bcputicks = 0                       bReadMicroSec = 182                 bDirtyContext = 0x0000000000000000bDbPageBroker = 0x0000000000000000  bdbid = 10                          bpru = 0x000002B3FA708040PAGE HEADER:




Page @0x000002B3F0632000m_pageId = (1:280)                  m_headerVersion = 1                 m_type = 1m_typeFlagBits = 0x0                m_level = 0                         m_flagBits = 0x8200m_objId (AllocUnitId.idObj) = 179   m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057594049658880                                Metadata: PartitionId = 72057594043170816                                Metadata: IndexId = 0Metadata: ObjectId = 581577110      m_prevPage = (0:0)                  m_nextPage = (0:0)
pminlen = 13                        m_slotCnt = 2                       m_freeCnt = 8060m_freeData = 128                    m_reservedCnt = 0                   m_lsn = (37:584:3)
m_xactReserved = 0                  m_xdesId = (0:0)                    m_ghostRecCnt = 0m_tornBits = -116446693             DB Frag ID = 1                      Allocation Status


GAM (1:2) = ALLOCATED               SGAM (1:3) = NOT ALLOCATED          PFS (1:1) = 0x41 ALLOCATED  50_PCT_FULL
DIFF (1:6) = CHANGED                ML (1:7) = NOT MIN_LOGGED           


DATA:




Memory Dump @0x000000F840DF8000000000F840DF8000:   01010000 00820001 00000000 00000d00 00000000  ....................000000F840DF8014:   00000200 b3000000 7c1f8000 18010000 01000000  ........|...........000000F840DF8028:   25000000 48020000 03000000 00000000 00000000  %...H...............000000F840DF803C:   1b2a0ff9 00000000 00000000 00000000 00000000  .*..................000000F840DF8050:   00000000 00000000 00000000 00000000 10000d00  ....................000000F840DF8064:   01000000 6a6f686e 20020000 10000d00 02000000  ....john ...........000000F840DF8078:   6d617279 20020000 00002121 21212121 21212121  mary .....!!!!!!!!!!000000F840DF808C:   21212121 21212121 21212121 21212121 21212121  !!!!!!!!!!!!!!!!!!!!000000F840DF80A0:   21212121 21212121 21212121 21212121 21212121  !!!!!!!!!!!!!!!!!!!!
...000000F840DF9FF4:   21212121 21212121 70006000                    !!!!!!!!p.`.


OFFSET TABLE:


Row - Offset                        1 (0x1) - 112 (0x70)                0 (0x0) - 96 (0x60)                 




DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


Completion time: 2022-12-30T17:48:20.5466040+08:00

从上面的 Memory Dump 区节中可以看到,数据在进程内存的 000000F840DF8064 ~ 000000F840DF8078 范围内,这里要吐槽的是内存地址按照 大端布局 的,看起来很不习惯,可以用 windbg 用 小端布局 来显示。

0:116> dp 000000F840DF8064
000000f8`40df8064  6e686f6a`00000001 000d0010`00000220
000000f8`40df8074  7972616d`00000002 21210000`00000220
000000f8`40df8084  21212121`21212121 21212121`21212121
000000f8`40df8094  21212121`21212121 21212121`21212121
000000f8`40df80a4  21212121`21212121 21212121`21212121
000000f8`40df80b4  21212121`21212121 21212121`21212121
000000f8`40df80c4  21212121`21212121 21212121`21212121
000000f8`40df80d4  21212121`21212121 21212121`21212121

“sql 请求源码研究”

喜欢玩 windbg 的朋友肯定想对 sqlserver 进行汇编级洞察,比如研究下 sql 请求在 sqlserver 里面的执行流是什么样的?其实很简单,我们可以这样处理,使用 ba 对 john 的内存地址下一个硬件断点,即 ba r4 000000f840df8064+0x4,然后在 SSMS 上执行一条 SELECT * FROM person 语句,因为要提取 john 自然就会命中。

0:104> ba r4 000000f840df8064+0x4 0:104> g
Breakpoint 0 hit
sqlmin!BTreeMgr::GetHPageIdWithKey+0x4a:00007ff8`d4ea121a 48894c2478      mov     qword ptr [rsp+78h],rcx ss:000000f8`45278028=00000248000000250:102> k
 # Child-SP          RetAddr               Call Site00 000000f8`45277fb0 00007ff8`d4ea0b59     sqlmin!BTreeMgr::GetHPageIdWithKey+0x4a01 000000f8`45278450 00007ff8`d4ea08b7     sqlmin!IndexPageManager::GetPageWithKey+0x11902 000000f8`45278d20 00007ff8`d4eb22d1     sqlmin!GetRowForKeyValue+0x20303 000000f8`45279880 00007ff8`d4eb2a39     sqlmin!IndexDataSetSession::GetRowByKeyValue+0x14104 000000f8`45279a70 00007ff8`d4eb279b     sqlmin!IndexDataSetSession::FetchRowByKeyValueInternal+0x23005 000000f8`45279ed0 00007ff8`d4eb2883     sqlmin!RowsetNewSS::FetchRowByKeyValueInternal+0x43706 000000f8`4527a000 00007ff8`d4eaadab     sqlmin!RowsetNewSS::FetchRowByKeyValue+0x9607 000000f8`4527a050 00007ff8`d4f93d60     sqlmin!CMEDScan::StartSearch+0x4f808 000000f8`4527a170 00007ff8`d4f93f3a     sqlmin!CMEDCatYukonObject::GetTemporalCurrentTableId+0x10e09 000000f8`4527a380 00007ff8`d801f0d1     sqlmin!CMEDProxyRelation::GetTemporalCurrentTableId+0x7a0a 000000f8`4527a3c0 00007ff8`d801dfb8     sqllang!CAlgTableMetadata::FPartialBind+0xb580b 000000f8`4527a580 00007ff8`d80394b3     sqllang!CAlgTableMetadata::Bind+0x3170c 000000f8`4527a620 00007ff8`d800415d     sqllang!CRelOp_Get::BindTree+0x78f0d 000000f8`4527a890 00007ff8`d80418a1     sqllang!COptExpr::BindTree+0x850e 000000f8`4527a8c0 00007ff8`d800415d     sqllang!CRelOp_FromList::BindTree+0x310f 000000f8`4527a920 00007ff8`d802c2a3     sqllang!COptExpr::BindTree+0x8510 000000f8`4527a950 00007ff8`d800415d     sqllang!CRelOp_QuerySpec::BindTree+0x2e811 000000f8`4527aa60 00007ff8`d80042dd     sqllang!COptExpr::BindTree+0x8512 000000f8`4527aa90 00007ff8`d800415d     sqllang!CRelOp_SelectQuery::BindTree+0x48913 000000f8`4527ab80 00007ff8`d8003f23     sqllang!COptExpr::BindTree+0x8514 000000f8`4527abb0 00007ff8`d8004e47     sqllang!CRelOp_Query::FAlgebrizeQuery+0x4bd15 000000f8`4527ae30 00007ff8`d7ff5576     sqllang!CProchdr::FNormQuery+0x8f16 000000f8`4527ae70 00007ff8`d7ff4a79     sqllang!CProchdr::FNormalizeStep+0x5bd17 000000f8`4527b4b0 00007ff8`d7ff5124     sqllang!CSQLSource::FCompile+0xea518 000000f8`4527e1b0 00007ff8`d7e659c3     sqllang!CSQLSource::FCompWrapper+0xcb19 000000f8`4527e280 00007ff8`d7e6387a     sqllang!CSQLSource::Transform+0x7211a 000000f8`4527e3e0 00007ff8`d7e6e67b     sqllang!CSQLSource::Execute+0x4fa1b 000000f8`4527e8c0 00007ff8`d7e6d815     sqllang!process_request+0xca61c 000000f8`4527efc0 00007ff8`d7e6d5ef     sqllang!process_commands_internal+0x4b71d 000000f8`4527f0f0 00007ff8`d4096523     sqllang!process_messages+0x1d61e 000000f8`4527f2d0 00007ff8`d4096e6d     sqldk!SOS_Task::Param::Execute+0x2321f 000000f8`4527f8d0 00007ff8`d4096c75     sqldk!SOS_Scheduler::RunTask+0xa520 000000f8`4527f940 00007ff8`d40bb160     sqldk!SOS_Scheduler::ProcessTasks+0x39d21 000000f8`4527fa60 00007ff8`d40baa5b     sqldk!SchedulerManager::WorkerEntryPoint+0x2a122 000000f8`4527fb30 00007ff8`d40bafa4     sqldk!SystemThreadDispatcher::ProcessWorker+0x3ed23 000000f8`4527fe30 00007ff8`f6d86fd4     sqldk!SchedulerManager::ThreadEntryPoint+0x3b524 000000f8`4527ff20 00007ff8`f865cec1     KERNEL32!BaseThreadInitThunk+0x1425 000000f8`4527ff50 00000000`00000000     ntdll!RtlUserThreadStart+0x21

从线程栈上看,有 SQLSERVER 核心的 Scheduler ,Task 以及 命令分析器,查询优化器,查询执行器 等各种核心元素,后续再慢慢研究吧。

“总结”

深入的理解数据,索引在数据页上的布局,可以从根本上帮助我们理解如何减少请求在数据页上的流转,减少逻辑读,从而提升 sql 的查询性能。

深入解析 YAML 配置文件:从语法到最佳实践 YAML(YAML Ain't Markup Language)支持多种数据类型,包括字符串、数字、布尔值、列表、字典和空值。 阅读详情

相关推荐

一文搞定 Postman 接口自动化测试(全网最全版)

本文适合已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。工作环境与版本:P.S. 不同版本页面 UI 和部分功能位置会有点不同,不过影响不大。首先我们来思考一下,如果要达到自动化接口测试效果,在基本的模拟请求上还需要做哪些呢?我粗略概括为 3 个问题(欢迎在评论区留言更多补充建议):1. 如何判断接口是否请求成功? 2. 如何进行接口批量、定期测试? 3. 如何处理依赖接口问题(比如商品下单的接口必须要求先登录)?所以,接下来就主要分

Androidyuexia的博客 1399

字节跳动项目管理面经

字节跳动项目管理面经

weixin_48242246的博客 2746

蚂蚁金服软件测试工程师一面面试题(附答案)建议收藏

答:软件测试就是发现软件当中存在的缺陷,提高软件的质量。它贯穿于软件工程整个生命周期中,跟开发一样,是一个不可或缺的技术方向。2.

Androidyuexia的博客 1350

字节跳动面试必问:面试题解析已整理成文档,系列篇

一、引言 现在已经是十月份的月末了,金九银十,这个找工作和面试的热潮已经渐渐退隐。 潮涨潮退,有的人从里面收获了心仪的offer;有的人走了一趟,一无所获,或者收获寥寥,无甚满意;还有的人在观望,等待下一个良机。 这里分析一波现在的面试行情,带大家了解一下自己所处的位置,另外,分享一下有用的资料,帮助大家提升自己的战斗力。 便于开发的插件、工具和第三方开源库 1.GsonFormat 使用方法:快捷键Alt+S也可以使用Alt+Insert选择GsonFormat,作用:速将json字符串转换成一个Ja

chayel123的博客 1498

基于CH32X035的USB双K型热电偶温度计:硬件设计、冷端补偿与信号放大详解

本文详细介绍了基于CH32X035单片机设计USB双K型热电偶温度计的完整方案。重点解析了硬件设计中的核心挑战:如何利用精密运放GS8552-SR进行信号放大,以及采用NTC热敏电阻和查表法实现精确的冷端补偿。项目通过USB供电通信,实现了双路高精度温度测量与显示,为电子爱好者和工程师提供了实用的参考设计。

weixin_42153793的博客 160

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1579

我在字节当主管:百次面试结果,总结一个刷掉99%求职者的问题!_面试没有说结果

一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分的,比如说 Windows 对内存的管理就是按照 内存页 (4k) 来进行划分,言外之意就是 SQLSERVER 对 mdf 的管理也是按照 数据页 (8k) 来划分的,画个图大概就是这样的。刚才我们看到的数据页只是物理硬盘上的,但数据页和数据页之间的逻辑关系肯定是在内存中用一定的数据结构来承载的,接下来看下这个 数据页 映射到 SQLSERVER 进程内存的哪里呢?从WinHex 上看,果然是在偏移为 0x00230000 这个数据页上。

2401_84731999的博客 326

XC95144XL-10TQG144I Xilinx XC9500XL 高性能 CPLD

XC95144XL-10TQG144I 属于 Xilinx 的 XC9500XL 高性能 CPLD 家族,是一颗面向 3.3V 低电压系统的可编程逻辑器件。该器件以小封装、高速响应和良好的系统兼容性为设计目标,常用作系统控制/ glue-logic、I/O 缓冲、状态机、总线桥接与接口协议前端等场景中的可重编程逻辑单元。产品支持现场(in-system)编程与 IEEE-1149.1 JTAG 边界扫描,能在系统板上直接更新逻辑。

2403_90082736的博客 1059

我在字节当主管:百次面试结果,总结一个刷掉99%求职者的问题!_面试没有说结果(2)

一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分刚才图中也说了 mdf 是由无数个 数据页 拼出来的,那如何找到 person 表所在的数据页呢?一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分的,比如说 Windows 对内存的管理就是按照 内存页 (4k) 来进行划分,言外之意就是 SQLSERVER 对 mdf 的管理也是按照 数据页 (8k) 来划分的,画个图大概就是这样的。那如何来验证这个结论呢?你不如讲点实际的,讲点经验,性能调优你说怎么弄?“寻找数据所在的数据页”

2401_84731999的博客 506

Arduino粉尘传感器DIY:打造智能PM2.5监测仪

本文详细介绍了如何利用Arduino和粉尘传感器DIY一个智能PM2.5监测仪。从硬件选购、接线步骤到代码编写,提供了完整的制作指南,帮助读者以低成本打造透明可靠的空气质量监测设备,并探讨了数据解读与智能升级方案。

i3j4k5的博客 390

STM32入门教程:智能汽车控制

智能汽车是近年来快速发展的领域之一,它结合了嵌入式系统、传感器和通信技术,通过智能化的控制算法和决策系统实现自主导航、避障、环境感知等功能。在这篇教程中,我们将以 STM32 微控制器为核心,通过编写代码案例来介绍智能汽车的控制原理和实现方法。步骤三:决策与执行 最后,我们根据传感器数据做出相应的决策,并执行相应的动作。案例:智能汽车的避障功能 在这个案例中,我们将实现智能汽车的避障功能。感知系统负责感知汽车周围的环境,包括障碍物的距离、车辆的角度等信息。下面我们通过一个具体的案例来演示代码的编写。

2401_85258012的博客 927

我在字节当主管:百次面试结果,总结一个刷掉99%求职者的问题!_面试没有说结果(1)

一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分的,比如说 Windows 对内存的管理就是按照 内存页 (4k) 来进行划分,言外之意就是 SQLSERVER 对 mdf 的管理也是按照 数据页 (8k) 来划分的,画个图大概就是这样的。刚才我们看到的数据页只是物理硬盘上的,但数据页和数据页之间的逻辑关系肯定是在内存中用一定的数据结构来承载的,接下来看下这个 数据页 映射到 SQLSERVER 进程内存的哪里呢?你不如讲点实际的,讲点经验,性能调优你说怎么弄?“寻找数据所在的数据页”

2401_84731999的博客 368

一套适合 ABAP 初级和中级开发人员,从入门到提高的 ABAP 学习教程

曾几何时,ABAP 就是 SAP 的代名词。ABAP 这门编程语言造就了 SAP 名噪一时的 R/3 产品,同时也是如今 SAP 旗舰级产品,SAP S/4HANA 底层的实现语言。 ABAP 不仅代表着 SAP 这家公司在企业级管理软件市场辉煌的过去,ABAP 自身也在不断地进化着。SAP 不仅在本地部署(On-Premise)领域继续保持着自己绝对的统治地位,而且在云应用领域(Software-as-a-Service, 简称 SaaS), 也推出了自己的解决方案,比如 SAP S/4HANA Clo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5919

我在字节当主管:百次面试结果,总结一个刷掉99%求职者的问题

一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分的,比如说 Windows 对内存的管理就是按照 内存页 (4k) 来进行划分,言外之意就是 SQLSERVER 对 mdf 的管理也是按照 数据页 (8k) 来划分的,画个图大概就是这样的。那如何来验证这个结论呢?刚才也说了数据都在数据页上,我们弄点数据然后在指定的数据页上提取出来就好了,这里用的是 SQLServer 2019GOGO。

测试萌萌 268

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3870

02 HCM CPI SF集成-组织集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 129

史上最全:python自动化测试栈,确定好你从功能测试后的进阶方向

为什么做自动化测试? 根据《中国软件测试从业人员调查报告》,手工测试占到的89%,相对开发来说,测试的门槛底,薪资普遍较低,所要求的知识面虽然有一定广度,但缺乏深度。 上面的报告,直击痛点! 国内的测试多为手工点击,多人参与。测试门槛低,参与人员多,薪资涨幅弱。到头来,多数人面临着谢谢参与奖。而自动化技术是新天地,将测试与开发的相结合,打出了最强硬的口号“不是所有测试人员的都叫测试开发人员”。测试人员想提高自身竞争力,就要向着测试开发人员努力。 自动化测试分类 ·UI自动化测试

Androidyuexia的博客 2658

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

selenium2023最全攻略(元素操作,浏览器操作等)附完整代码!

1、driver.title 和 drivet.current_url是属性没有括号。应用场景:一般判断上不操作是否执行成功。 2、driver.maximize_window() 一般为前置代码放到获取driver地址后,进行浏览器窗口的最大化 3、driver.refresh() 向浏览器重新发出请求,刷新页面,在cookie 会用到 4、driver.close() 和 driver.quit() 的区别:

Androidyuexia的博客 1751

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

外包干了2个月,技术退步明显...

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!没办法,我找到了我在腾讯的老哥,作为他的小老表,在他了解了我的情况后(几乎就是软件测试基础开始),直接甩给我一个网盘,说到:“去吧,这里有你需要的所有东西,不要来找我了,我都嫌丢人”。刚开始准备时,自己都蒙了,四年的功能测试让我的技术没有一丝的进步,提升的只有我的年龄…1,2,3,4 这4个数字,能组成多少个互不相同的且无重复的三位数,都是多少?

Androidyuexia的博客 1420

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

公司测试部门来了个00后卷王之王,老油条感叹真干不过,唉!

最近聊到软件测试的行业内卷,越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会,不断提升自己的技能栈成了测试老人迫在眉睫的问题。不论是面试哪个级别的测试工程师,面试官都会问一句“会编程吗?有没有自动化测试的相关经验?所以还停留在手工功能测试层面,如果不去提升技术,不仅要面临长江后浪推前浪的压力,还要顶住当下行业的内卷之势。不然就只能接受窘境,最后甚至是面临淘汰。更别说升职涨薪了那么作为行业中一个非常重要的分支,测试圈的情况怎么样呢?

Androidyuexia的博客 1253

都2024年了,转行软件测试还有前途吗?

30岁转行软件测试还来得及吗?大专学历学软件测试有发展前景吗?2024年转行软件测试行吗?最近不少小伙伴私信咨询以上等问题,其实我非常理解大家内心的顾虑,毕竟转行无小事,这可能关乎自己长远的发展今天就为大家介绍一位30转行软件测试的小姐姐。小姐姐是成人大专学历,毕业后从事了很多份工作,2023年底来参加软件测试学习,现在成功就业了,入职薪资9K!以下是小哥哥的分享。

Androidyuexia的博客 1154
上一篇: 我干了8年测试,告诉你现在软件测试还能不能找到工作!
下一篇: 我干了8年测试,告诉你现在软件测试还能不能找到工作!
程序媛月下
博客等级 码龄7年 5262粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值