软件测试工程师面试秘籍_成为一名出色的软件工程师的一个秘诀:阅读代码
软件测试工程师面试秘籍
通过建立例程和阅读代码的习惯来成为更好的程序员
这是我偶尔写的系列文章“ 给年轻软件工程师的笔记”中 的帖子 。 在 这里 注册 。
如果您有一天决心成为一名出色的作家而醒来,您会听到两个简单的反馈:写很多东西,读更多东西。
在软件中,很多人都在编写代码,但很少有人花时间阅读它们,尤其是在日常工作之外的代码。 那是一个错误。 在您职业生涯的早期,请扮演有抱负的作家,并喜欢阅读各种代码。
广泛阅读并经常阅读。 成为一名出色的软件工程师与成为一名出色的软件工程师之间可能有所不同。
为什么要阅读代码?
伟大的作家是他们读过的作家的功能。 想想琼·迪迪翁(Joan Didion),他在16岁时键入海明威的句子 ,以便她可以学习句子的工作原理。 或想想亚伯拉罕·林肯(Abraham Lincoln),他后来的抒情诗源于他心爱的《国王詹姆斯圣经》。
同样,看到各种编码实践后,您就可以在编写自己的代码时扩展调色板。 阅读他人的代码会使您接触到新的语言功能和不同的编码样式。
阅读您的依赖关系将使您成为一个更有效率的程序员。 您将了解依赖项提供的全部功能。 您将确切了解它们的工作方式以及正在做出的权衡。 出现问题时,您将知道在哪里进行调试。
习惯阅读代码还可以减少过度偏爱代码的可能性。 阅读的内容越多,您就会更轻松地增强别人的代码,而不是自己编写代码。 此更改将减少您被“此处未发明”综合症所困扰的可能性。
无论您是Web开发人员,数据工程师还是密码学家,培养日常阅读都将教给您不同于您日常工作的工具和产品。
作为Web前端工程师,阅读raytracer的代码库的一小部分将使您面临一组完全不同的约束。 作为数据库工程师,阅读高抽象度的Web代码可以向您展示用户的想法。 对于所有工程师而言,您会发现,定期阅读日常工作之外的其他语言会有价值。
正如Donald Knuth 所说 :“ [阅读代码]确实值得,因为它可以在您的大脑中建立。 您学会阅读别人的东西越多,将来就越有能力发明自己的东西……”
这是使代码阅读尽可能轻松高效的方法。
我应该如何“阅读”代码?
像您读一本典型的书一样,从头到尾地阅读代码库,都是失败的秘诀 (尽管,具有讽刺意味的是,这是计算机自己读取代码的方式)。
从头开始阅读意味着忽略重要的上下文,对即将出现的结构毫无意义。 被动阅读(您不编写测试或修正错误)不会阻止您真正地内部化代码。
与书不一样,几乎所有我的朋友都在努力阅读代码的过程中没有实现特定的目标。 在阅读新的代码库之前,请确保您有一个要实现的目标。 这将使代码库看起来更易于管理,并在旅途难免困难时提供动力。
我使用四方策略来处理任何复杂的代码库(简称RSDW):
- (R)un :编译,运行并了解代码应执行的操作。
- 检查(S)结构 :了解高级结构并审查关键的集成测试。
- (D)ive in :遵循关键流程并读取重要的数据结构。
- (W)rite测试 :编写测试并确定简单功能和错误修复的优先级。
RSDW方法是一个起点,但是随着时间的流逝,您应该根据自己的需要对其进行自定义。 有些人发誓要编写测试和修复错误,而另一些人总是喜欢从复习集成测试开始。
不过,首先要从RSDW方法开始。
1.运行
读取代码的第一步不是实际读取代码。 是要使用软件。
只有在了解该软件提供的功能之后,才能阅读代码。 在此阶段,您应该能够对代码进行总结并了解输入和输出是什么。
使用该软件会迫使您使其运行。 这意味着要跟踪依赖关系,并使用某些语言来编译代码。 对于库,这意味着调用一些流行的函数。 这是运行测试和查看输出消息的时间。
如果您在首次运行时遇到问题,现在是向其他人证明运行该软件实际需要的最佳时间。
2.结构
接下来,确定代码中最关键的部分。 这个过程是与读书最不同的部分。 不必从头开始,而必须跳来跳去找出代码中的关键联系。
首先了解代码的结构。 至少要运行一些自动化工具(例如tree和cloc)来找出代码库的语言和文件。
要确定关键文件,请查看修改最多的文件,然后使用任何其他高级工具 。 查看最重要的集成测试,列出所调用的功能。 标记这些测试以供以后使用。
也有一种简单的方法可以缩短此过程:找到以前在代码上工作过的人。 了解结构是白板会议的首要任务。
3.深潜
一旦您拥有一块土地,那就挖吧。
阅读代码时,您应该查看代码流(查看正在创建的动作),并查看数据结构/对象(存储动作结果的位置)。
从关键集成测试,重要PR或您对源文件的审查中找到三到五个关键流程。 然后再深入。 从特定操作的顶部开始并跟踪代码。 一些开发人员对调试器发誓,让您逐步完成。 其他人则喜欢构建统一建模语言 (UML)图或火焰图 。
资料来源: FlameGraph资料库
资料来源:Wikimedia
其他时候,我会在重要功能的中间停在断点smb dab上,然后逐步遍历堆栈以了解我是如何到达那里的。 如果决定手动遵循代码,请确保已设置编辑器,以使您可以使用“转到定义”和“查找所有引用”来进行快速导航。
对于数据结构,请检查数据类型以及设置关键变量的时间。 在关键时刻使用调试器查询这些数据结构。
除了集成测试之外, 查看重要的请求请求也是一种处理新代码库的有效方法。 PR封装了孤立的功能,因此通常更易于理解。 PR还提供了为何添加代码以及如何添加代码之外的叙述背景。
在这些深入研究期间,我将打开两个markdown文档。 第一个是“升级我的编码”文档,其中列出了我正在查看的新语法和对我自己的学习感兴趣的代码模式(其他人将此称为词汇表 )。 第二个文档列出了我对代码库开发人员的关键问题。 在这一阶段,当我发现差距时,我还会添加文档。
与了解密码的人一起使用时,深度潜水特别强大。 如果我在项目上与开发人员的时间有限,那么我总是让他们通过一些关键流程来跟踪我。 一旦我对一些关键流程有了基本的了解,就可以更轻松地自行挖掘。
4.编写代码
与文学不同,在文学中阅读和写作是分开的工作,“阅读”代码的关键部分实际上是编写代码。 不编写代码,几乎不可能内部化代码库。 两种简单的开始方法是编写测试和解决简单的功能/错误。
写作测试是一种活跃的阅读方式,它迫使您注意特定交互的实际输入和输出。 编写测试会以一种无法单独阅读的方式将代码印在您的内存中。
对我来说,单元测试是一个简单的开始。 一旦掌握了基础知识,我便开始进行集成测试,这迫使我理解越来越多的代码库。 有时,我什至会重写现有的集成测试,以测试我对关键呼叫如何工作的理解。
另一种简单的方法是编写简单的功能或解决简单的错误。 这两个任务都不需要完整的代码库知识,但是仍然迫使您面对代码。 提供错误修复程序和文档也是返回您的依赖关系的一种简便方法。
这些方法可以在您最需要的时候快速取胜。 通过增加一些更广泛的课程来扩展RSDW,阅读代码将不再那么困难。
阅读技巧
RSDW流程不是教条式的。 工程师不可避免地会想出自己喜欢的方式来挖掘新的代码库(该过程也会因语言,可用的工具以及您面前的代码库类型而异)。
尽管如此,当您看到新代码时,RSDW流程确实主张采用系统方法。 它还鼓励对代码进行主动自省,无论是编写测试还是主动使用调试器询问数据结构。 阅读代码的过程与被动阅读书籍的过程大不相同。
您还会发现阅读新的代码已经筋疲力尽。 您正在复杂地跟踪代码流,并试图同时保留数十个新数据结构和函数。 在接近新的代码库时,请积极休息。 当我开始使用新的代码库时,每天需要花几个小时才能感到高效。
培养良好的阅读技能至关重要,但考虑到阅读内容也同样重要。
您应该阅读什么代码?
在您职业生涯的早期,我相信您60%的时间应该花在阅读代码上。 也许其中三分之一应该是您实际构建的直接代码库之外的代码。 那是很长的时间,所以您应该阅读什么?
开始阅读且获得最高投资回报率的最简单方法是学习依赖项。 内部化依赖项的工作方式使您可以更轻松地在整个系统中进行调试和推理。
另一个高投资回报率的途径是在公司中选择一个重要的系统作为您的接口,并仔细阅读它。 这不仅对您的工作有价值,而且专业的代码库与开放源代码库不同。
除了与您互动的直接系统之外,还可以培养广泛阅读的开放性。 在职业生涯的早期,我建议您在早上或晚上留出一个小时的时间来阅读日常工作以外的代码。 经过一天的辛苦工作,这听起来很痛苦,但是选择一个令您兴奋的代码库,并尝试一个星期。
例如, Redis是C语言中流行的起点。对于可读性差,复杂的代码库,一种简单的启动方法是读取特定的子系统。
辅助项目是一种强大的阅读方式,因为它们会迫使您学习不同的世界。 您需要阅读新的依赖关系,并探索要构建的内容的不同代码库。 尽管它看起来并不像阅读,但它是一个迫使您积极阅读所用内容的项目。
在户外工作,您应该阅读与日常工作大不相同的工具。 如果您习惯了高层次的抽象,请学习一个(或三个)抽象级别。 如果您使用一种语言,请选择另一种语言以在空闲时间阅读。 如果您始终必须考虑一个约束条件(例如,图形编程中下一次屏幕刷新的时间),请找到另一个约束条件(例如,在移动编程中节省电池寿命)。
读取代码的另一个好方法是读取和重写您所尊重的编码器。 年轻的迪迪翁(Didion)写下海明威(Hemingway)的地方或亨特·汤普森(Hunter Thompson) 键入“伟大的盖茨比”(Great Gatsby)的地方 ,从一个简单的库开始写出安提尔兹(antirez)或盖earon(gaearon)或mrdoob的代码。 阅读他们的其他代码库。 保持最新的工作。
斯蒂芬·金(Stephen King)告诫作家:“如果没有时间阅读,就没有时间(或工具)写作。 就那么简单。” 同样,对于软件工程师来说,编写新鲜的代码可能是最有趣的,但是(积极地)阅读代码将使您与众不同。
这是我偶尔写的系列文章《 给年轻软件工程师的笔记》 。 在 此处 注册 或 关注RSS feed 。 本系列的所有文章均作为草稿发布,并纳入了相关的社区反馈。 感谢 Brandur Leach , Jake Craige 和 Breck Stodghill 的反射和反馈。
链接
阅读代码的文章
- 询问黑客新闻:您如何熟悉新的代码库
- 询问黑客新闻:如何理解开源项目的大型代码库?
- 在不熟悉的代码库中快速提高生产力的策略
- 熟悉大型代码库的最佳方法是什么?
- 阅读代码的提示
- 软件工程电台:Dave Thomas的软件考古学 (播客)
图书
- 阅读代码:开源角度 (书)
- 有效使用旧版规范 (本书)
阅读的代码库
- 优秀的Python代码库可供阅读
- 好的Go代码库可供阅读
翻译自: https://hackernoon.com/one-secret-to-becoming-a-great-software-engineer-read-code-467e31f243b0
软件测试工程师面试秘籍
软件测试工程师面试秘籍_成为一名出色的软件工程师的一个秘诀:阅读代码相关推荐
- 成为一名出色的软件工程师的一个秘诀:阅读代码
通过养成阅读代码的例程和习惯来成为更好的程序员 这是我偶尔写的系列文章" 给年轻软件工程师的笔记"中 的帖子 . 在 这里 注册 . Redis的代码片段 如果您有一天决心成为一名 ...
- 软件工程师职业规划_为什么公司文化对您作为软件工程师的职业很重要
软件工程师职业规划 The impact of a company's culture is reflected in a company's ability to achieve their goa ...
- 《软件测试工程师面试秘籍》—第1章1.3节过关斩将
本节书摘来自异步社区<软件测试工程师面试秘籍>一书中的第1章1.3节过关斩将,作者51Testing软件测试网 , G.li,更多章节内容可以访问云栖社区"异步社区"公 ...
- 嵌入式软件开发工程师面试指南_总结
嵌入式软件开发工程师面指南 一.C语言 1.1.局部变量能否和全局变量重名 1.2.如何用C编写死循环 1.2.new和malloc 1.3.static的用法(定义和用途)(必考) 1.4.cons ...
- 如何成为一名卓越的软件工程师
很多研发人员,在一个公司做几年,从事几年的软件开发工作,能力依然没有提升,职位.工资依如从前.任何公司都存在这样的人,包括BAT.华为等大型公司的人在内,我面试过程中也遇到过各类公司跳槽出来的员工,本 ...
- 软件工程师一年涨薪多少_一年之内不要成为软件工程师
软件工程师一年涨薪多少 My new late night habit is scrolling down through the default news and articles feed app ...
- 电子工程师自学成才pdf_作为一名自学成才的软件工程师,我在第一个月的工作中所学到的知识
电子工程师自学成才pdf In this post, I will share my experiences and give advice now that I am six months into ...
- 做一名真正的软件工程师
今天是 10.24,是程序员的节日. 前天我做了一个名为<做一名真正的软件工程师>的分享,表达了一些我的个人观点. 中国的软件研发经历了几个阶段.在 2000 年以前,最先进的软件开发团队 ...
- 如何成为一名有效的软件工程师
by Luis Santiago 路易斯·圣地亚哥(Luis Santiago) 如何成为一名有效的软件工程师 (How to become an effective software enginee ...
最新文章
- redis面试全家桶
- 如何写出一个好的单例模式
- Spring.NET 1.3.1 新特性探索系列2——WCF命名空间解析器
- cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?
- Java / JVM是如何构建的? 采用OpenJDK是您的答案!
- 遥控开关在云智能物联网领域:智能养殖高效、生态、安全!
- 轻量级java开发工具_成为 Java 程序员必备的 5 个工具
- JavaScript获取坐标
- 请君入瓮: 火眼自称遭某 APT 国家黑客组织攻击
- 做自由职业者是怎样的体验
- SQL Server 【不允许保存更改】问题解决图解
- vim 自动格式化代码快捷键
- Java 设置添加ckeditor图片上传功能
- 超链接 与众不同的鼠标滑过超链接下划线动画效果
- 【LaTeX试卷】天津大学仁爱学院高等数学试卷 LaTeX模板
- 自监督学习(一):基于 Pretext Task
- OJ每日一练——乘方计算
- JQuery - 反向选择器
- 内存调试神器- ASan详解及实例分析
- 声称代码已开源却迟迟没更新,网友等了好几个月,最终一怒之下把作者挂网上
热门文章
- usbasp下载线驱动
- kube-api log:authentication handshake failed: x509: certificate has expired or is not yet valid
- 如何用淘礼金0元购物软件实现思路
- Python语言程序设计基础_实验四_函数(三)_答案_通识教育必修课程_上海师范大学
- php获取当前时间的年月日时分秒格式
- 鸿蒙系统华为蒋玥8月9号发布,2019华为开发者大会8月9日开启 鸿蒙系统或重磅发布...
- 三星note20u计算机功能,三星note20和note20u有什么区别 三星note20和note20u区别在哪 - 云骑士一键重装系统...
- 测试场景设计(一):扫码付款场景
- Android社区物业便民服务小区APP毕业设计
- Vmware安装Arch Linux