首页
学习
活动
专区
圈层
工具
发布

为什么写了多年代码,还是没形成自己的工程思维?

读读自己的代码,问问自己ーー这是否可以通过任何方式改进?让代码比你能够找到的更好。 因为六个月后,当回到自己的代码时,要么会感谢自己编写了干净、可维护的逻辑,要么会讨厌自己留下这么一团糟的代码。...解决这个问题,需要编写清晰的文档,在小组讨论中分享知识。 “我们怎样才能让整个团队都适应这种情况呢?” 因为归根结底,衡量一个工程师不仅要看他能做什么,还要看如何为他人授权。 5....能否看到更大的图景? 这个功能如何帮助用户? 是否提高了收入、保留率或效率? 这是解决实际问题的最好方法吗? 代码不仅仅是代码,它还驱动着业务价值,要理解这一点。了解软件的业务方面,能见度要高。...自动化工具 如果工程师经常手工重复同样的任务,那是不明白时间的价值。我们可以消除不必要的工作,节省时间,减少错误。记录解决方案,让其他人不必重新发明轮子,使团队能够更快地行动。...编写清晰的文档,以便下一个人能更快上岗。维护 README 文件、 API 规范和故障排除指南。建立自助服务工具,例如构建内部仪表板、脚本或机器人,以便团队能够自我服务。

6.2K76

在JavaScript中的数据结构(链表)

通过这种方式,链表中的节点可以按顺序链接在一起,形成一个链式结构。 与数组不同,链表的节点在内存中可以不连续存储,每个节点都可以独立分配内存,并通过指针连接到下一个节点,从而实现灵活的插入、删除操作。...然而,在大多数语言中这种数据结构有一个缺点:数组的大小是固定的,从数组的起点或中间插入或移除项的成本很高,因为需要移动元素。...链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。...检查链表是否为空 如果列表中没有元素,isEmpty方法就返回true,否则返回false。...'n' : '');//用current来检查元素是否存在 //如果列表为空,或是到达列表中最后一个元素的下一位(null),while循环中的代码就不会执行 //得到了元素的内容,将其拼接到字符串中

87810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    在JavaScript中的数据结构(链表)

    通过这种方式,链表中的节点可以按顺序链接在一起,形成一个链式结构。与数组不同,链表的节点在内存中可以不连续存储,每个节点都可以独立分配内存,并通过指针连接到下一个节点,从而实现灵活的插入、删除操作。...然而,在大多数语言中这种数据结构有一个缺点:数组的大小是固定的,从数组的起点或中间插入或移除项的成本很高,因为需要移动元素。链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。...检查链表是否为空如果列表中没有元素,isEmpty方法就返回true,否则返回false。...'n' : '');//用current来检查元素是否存在 //如果列表为空,或是到达列表中最后一个元素的下一位(null),while循环中的代码就不会执行 //得到了元素的内容,将其拼接到字符串中...与数组的length属性类似。toString():由于列表项使用了Node类,就需要重写继承自JavaScript对象默认的toString方法,让其只输出元素的值。

    99020

    在Python中实现线性查找

    2.检查是否在当前索引中找到该项。如果是,则返回索引并转至步骤5。 3.检查当前索引是否是数组的最后一个索引。如果是,则返回null并转至步骤5。 4.移动到数组中的下一个索引并转至步骤2。...步骤2:检查当前索引(索引0)中是否存在15。由于当前索引包含项4,因此不会返回true,所以进入第3步。 步骤3:检查当前索引是否是nums数组的最后一个索引。...由于这也返回false,所以进入下一步。 第4步:移动到nums数组的索引1并转到下一次迭代,该迭代从第二步开始。 迭代2 步骤2:检查当前索引(索引1)中是否存在15。...由于当前索引包含项9,因此不会返回true,所以进入第3步。 步骤3:检查当前索引是否是nums数组的最后一个索引。由于返回false,所以进入下一步。...第4步:移动到nums数组的索引2并转到下一次迭代,该迭代从第二步开始。 迭代3 步骤2:检查当前索引(索引2)中是否存在15。这将返回true,因为当前索引包含项15。

    4.3K40

    A*算法详解

    H = 从指定的方格移动到终点 B 的估算成本。这个通常被称为试探法,有点让人混淆。为什么这么叫呢,因为这是个猜测。...它左边的方格是起点,在 close list 中,我们也忽略。其他 4 个相邻的方格均在 open list 中,我们需要检查经由这个方格到达那里的路径是否更好,使用 G 值来判定。...有趣的是,这次有两个方格的 F 值都 54 ,选哪个呢?没什么关系。从速度上考虑,选择最后加入 open list 的方格更快。这导致了在寻路过程中,当靠近目标时,优先使用新找到的方格的偏好。...最后一个方格,也就是当前方格左边的方格,我们检查经由当前方格到达那里是否具有更小的 G 值。没有。因此我们准备从 open list 中选择下一个待处理的方格。...这可以通过预先设定不可到达的区域来解决。在某种数组中记录这些信息,在寻路前检查它。在我的 Blitz 版程序中,我写了个地图预处理程序来完成这个。

    2.3K91

    A星算法详解(个人认为最详细,最通俗易懂的一个版本)「建议收藏」

    H = 从指定的方格移动到终点 B 的估算成本。这个通常被称为试探法,有点让人混淆。为什么这么叫呢,因为这是个猜测。...它左边的方格是起点,在 close list 中,我们也忽略。其他 4 个相邻的方格均在 open list 中,我们需要检查经由这个方格到达那里的路径是否更好,使用 G 值来判定。...有趣的是,这次有两个方格的 F 值都 54 ,选哪个呢?没什么关系。从速度上考虑,选择最后加入 open list 的方格更快。这导致了在寻路过程中,当靠近目标时,优先使用新找到的方格的偏好。...最后一个方格,也就是当前方格左边的方格,我们检查经由当前方格到达那里是否具有更小的 G 值。没有。因此我们准备从 open list 中选择下一个待处理的方格。...这可以通过预先设定不可到达的区域来解决。在某种数组中记录这些信息,在寻路前检查它。在我的 Blitz 版程序中,我写了个地图预处理程序来完成这个。

    5.5K31

    JavaScript数据结构之链表 | 技术点评

    )-合并两个有序链表,删除排序数组中的重复项,JavaScript笔记|刷题打卡-3月2日 力扣 (LeetCode)-最大子序和,JavaScript数据结构与算法(数组)|刷题打卡-3月3日 针对CSS...length属性 let head = null; // 需要存储第一个节点的引用,这个引用存储在一个为head的变量中 // append(element),向列表尾部添加一个新的项 this.append...previous, // index = 0; // // 移除第一项 if(position === 0) { // 从列表中移除第一个元素 让head指向列表的第二个元素...(element === current.element) { return index; //检查当前元素是否是我们要找的。...//检查要移除的元素是否是第一个元素,如果是,只需要把tail也设为null tail = null; } else { head.prev = null; //把head.prev的引用改为

    78820

    用 JavaScript 实现链表

    1.png 什么是链表 单链表是表示一系列节点的数据结构,其中每个节点指向链表中的下一个节点。 相反,双向链表具有指向其前后元素的节点。 与数组不同,链表不提供对链表表中特定索引访问。...:从给定索引中删除项 isEmpty(): 返回一个布尔值,指示链表是否为空 printList():不是链表的原生方法,它将打印出我们的链表,主要用于调试 构造函数 构造函数中需要三个信息: head...如何知道链表是否为空? 两种方式: isEmpty()方法返回true(链表的长度为零) head 指针为空 对于这个例子,我们使用 head是否为null来判断链表是否为空。...,我们的pop方法需要检查以下两项内容: 检查链表是否为空 检查链表中是否只有一项 可以使用isEmpty方法检查链表是否包含节点。...第6-10行:如果链表中的下一个节点是最后一个项,那么这个当前项目就是新tail,因此我们需要保存它的引用。

    1K20

    面试官:如何解决React useEffect钩子带来的无限循环问题

    这是我们今天要学习的内容: 是什么导致无限循环以及如何解决它们: 在依赖项数组中不传递依赖项 使用函数作为依赖项 使用数组作为依赖项 使用对象作为依赖项 传递不正确的依赖项 什么导致的无限循环以及如何解决它们...在依赖项数组中不传递依赖项 如果您的useEffect函数不包含任何依赖项,则会出现一个无限循环。...}, [myArray]); // 将数组变量传递给依赖项 在这个块中,我们将myArray变量传入依赖参数。...是什么导致了这个问题? 既然myArray的值在整个程序中都没有改变,为什么我们的代码会多次触发useEffect ? 在这里,回想一下React使用浅比较来检查依赖项的引用是否发生了变化。...这意味着我们现在有了一个无限循环 如何解决这个问题 那么我们如何解决这个问题呢? 这就是usemmo的用武之地。当依赖关系发生变化时,这个钩子会计算一个记忆的值。

    6K20

    ConcurrentDictionary 对决 Dictionary+Locking

    如果我们有多个键值需要添加,并且所有的键不会产生碰撞并会被分配在不同的 Bucket 中,情况会如何? 起初,这个问题还是让我很好奇的,但我做了个不太合适的测试。...而 Dictionary + Locks 却表现的更快。这是为什么呢?...如果我们并不关心是否在并行的创建对象,或者其中的一些已经被丢弃,我们可以加锁,用来检测该数据项是否已经存在,然后释放锁,创建数据项,按后再获取锁,再次检查数据项是否存在,如果不存在,则添加该数据项。...当对字典进行添加和删除操作时,Dictionary 类不能简单的创建一个新的 Node,它必须检查是否有一个索引在标示一个已经被删除的 Node,进而进行复用。...真相是:将所有的 Node 都放到一个数组中,无论分配和读取都是最快的方法,即使我们需要另外一个数组来记录在哪里能找到那些数据项。

    1.7K70

    看板,Scrum,六西格玛、瀑布?项目管理方法指南

    【成本居高不下】明明项目收入高于大部分同行,但就是公司不挣钱。收入增长快,人员增长更快。 【项目需求多变】项目需求总是把控不了,客户虐我千百遍,我待客户如初恋。.../Lean Six Sigma】 「 Six Sigma,六西格玛 」 Six Sigma,是一套产品或过程改进方法,包含两种方法,这些方法中的每一项包括五个步骤,可以称为DMAIC方法和DMADV方法...、评估设计技能,选择最佳的设计方案 D:设计细节、优化设计,对设计审核进行评估,这个过程可能需要模拟操作 V:检查设计,建立规范模型,实施生产流程,并且提交给流程所有者 不仅如此,Six Sigma还有一套等级制的管理体系...丰田将浪费归结于以下几个方面: 运输 (把原本没有必要的物资运送到生产流程中) 库存 (所有零件、半成品和成品在储存中的浪费) 运动 (人员和设备搬来搬去,超过生产必要的人员走动) 等待 (等待下一个生产环节...,让团队在有限的时间内完成跟你更多工作。

    1.1K20

    看板,Scrum,六西格玛、瀑布?项目管理方法指南

    /Lean Six Sigma】 「 Six Sigma,六西格玛 」 Six Sigma,是一套产品或过程改进方法,包含两种方法,这些方法中的每一项包括五个步骤,可以称为DMAIC方法和DMADV方法...、评估设计技能,选择最佳的设计方案 D:设计细节、优化设计,对设计审核进行评估,这个过程可能需要模拟操作 V:检查设计,建立规范模型,实施生产流程,并且提交给流程所有者 不仅如此,Six Sigma还有一套等级制的管理体系...丰田将浪费归结于以下几个方面: 运输 (把原本没有必要的物资运送到生产流程中) 库存 (所有零件、半成品和成品在储存中的浪费) 运动 (人员和设备搬来搬去,超过生产必要的人员走动) 等待 (等待下一个生产环节...Tenowork小抄 精益管理旨在精确控制生产过程中的各个环节,这个理念不仅可应用于物质生产领域,也依然可以用在知识生产行业。 任务派发到了不合适的人手中。 非必要的会议导致人力的浪费。...,让团队在有限的时间内完成跟你更多工作。

    1.8K50

    浏览器新面试考点:核心网页交互新指标“INP”

    时间线: 曾经,First Input Delay (FID) 是核心 Web 指标中的一项响应性指标,但 FID 已知存在一些限制。...经过一年的测试并收集社区反馈后,Chrome 团队决定提升 INP 作为核心 Web 指标中的一项新的响应性指标,并从 2024 年 3 月起取代 FID。...在谷歌浏览器中,当导航到查看 » 开发人员 » 开发人员工具 » 性能时,可以检查阻止下一个绘制的 JavaScript 函数和事件处理程序。 通过这样的办法减少用户 INP 时间。 3....发生这种情况时,应该检查是否可以减少代码中的 relayout 函数。 4. 首先显示首屏内容 如果呈现页面内容很慢,那么 INP 分数很可能会受到影响。...所以,考虑先只显示重要的“首屏”内容,以便更快地体现帧的渲染结果。

    44110

    TypeScript 5.5:更快、更智能、更强大

    TypeScript 5.5 旨在提供更快的构建流程和更强大的工具辅助。...“在我们的代码中编写类型使我们能够解释意图并让其他工具检查我们的代码以捕获错误,例如拼写错误、null 和 undefined 的问题等等,”Microsoft TypeScript 首席产品经理 Daniel...主要新功能摘要 TypeScript 5.5 中主要新功能和改进的总结亮点包括: 推断类型谓词:在某些情况下改进类型推断,尤其是在数组和过滤方面。...独立声明:新的编译器选项,有助于更快地生成声明文件。 ${configDir} 模板变量:有助于编写更便携的配置文件。 咨询 package.json 依赖项:通过考虑包依赖项来改进声明文件生成。...此版本在各个方面都提供了新功能,没有哪一项特别突出,使其成为 TypeScript 开发人员的“无聊”但有效的版本。” 此版本还包括一些行为更改,例如禁用 TypeScript 5.0 中弃用的功能。

    19510

    语法分析器(Parser)的实现

    按照通常的数学定义,我们期望解析成后者,因为“*”(乘法)的优先级要高于“+”(加法)。 这个问题的解法很多,其中属运算符优先级解析最为优雅和高效。...在本例中,当前运算符是“+”,下一个运算符也是“+”,二者的优先级相同。...现在,主表达式右侧的binop是“*”,由于“*”的优先级高于“+”,负责检查运算符优先级的if判断通过,执行流程得以进入if语句的内部。...现在关键问题来了:if语句内的代码怎样才能完整解析出表达式的右半部分呢?尤其是,为了构造出正确的AST,变量RHS必须完整表达“(c+d)*e*f”。...该调用会完整解析出上述示例中的“(c+d)*e*f”,并返回构造出的AST节点,这个节点就是“+”表达式右侧的RHS。 最后,while循环的下一轮迭代将会解析出剩下的“+g”并将之纳入AST。

    2.1K30

    一道Google面试题:如何分解棘手问题(下)

    循环 函数的下半部分也遍历每个节点一次。 我们在递归函数周围有reducer。这个检查我们的代码是否被扫描过。如果是,继续循环,直到找到一个没有循环的节点,或者直到我们退出循环为止。...但是现在我们必须检查我们的ID是否在节点列表中:ousidslist。 如果它不在任何相邻的ID列表中,我们将添加它及其相邻的ID。这样,在循环的时候,其他东西会链接到它。...我们正在检查队列。如果有的话,我们会对排队的项目进行另一个循环,看看它们是否在我们的剩余节点中。 在第三部分中,这取决于第二部分的结果。...如果最大值大于其他两个,则不需要检查它们。 最大可能尺寸 我们可以检查每个迭代,而不是在特定的时间间隔检查是否有最大的列表。...我们要做的就是检查剩余节点的数量。如果它在堆栈限制下,我们可以切换到更快的递归版本。虽然风险很大,但随着循环的深入,它肯定会提高执行时间。

    1K30

    探索链表:通俗易懂的解析与实践

    假设你在参加一个宝藏寻找的游戏,每找到一个宝箱(链表中的节点),宝箱里会有一个提示告诉你下一个宝箱的位置(指向下一个节点的指针)。这样一直找下去,直到找到标记为“结束”的宝箱(链表的尾节点)。...这就是链表的基本概念。 在计算机科学中,链表被用来储存多个数据项,每个数据项存储在一个叫做"节点"的容器中,每个节点包含了数据和一个指向下一个节点的指针。...三、链表和数组的比较 链表和数组是两种常见的数据结构,它们各有优缺点: 存储方式:数组需要连续的内存空间来存储,而链表则可以利用零散的内存,因为链表的每个节点只需要存储自身数据和一个指向下一个节点的指针...插入和删除:在数组中插入和删除元素需要移动大量元素,而在链表中插入和删除只需要修改相应节点的指针,所以操作更快更方便。...我们首先创建一个新的节点,然后检查链表是否为空。

    29910

    二分查找会更快吗?Python中的二分查找与线性查找性能测试

    当您要检查某个元素是否在列表中时,有很多方法可以解决相同的问题。可以通过线性查找和二分查找来完成,但是要猜测哪个更快。 ? 为什么? 如果你最近参加过面试,你就会知道二分查找是面试官的最爱。...您想确保自己的程序不会比所需的速度慢。 学习Python时,您将学习进行线性查找以检查元素是否在列表中。当您学习编码时很好,但是如果列表中有60.000.000个元素会发生什么呢?...检查列表中是否有一个值是一项正常的任务,您之前已经看到过: my_list = [1,2,3,3,5,11,12] if 11 in my_list: return Truereturn...如果不是,我们检查它是更高还是更低。在这个例子中,9比15小,所以我们需要设置一个新的最小值点。我们知道我们不再需要担心列表的下半部分。新的最小点将被设置为列表上部的第一个可能的项。 ?...代码 通俗的流程解释如下: 用列表和目标作为参数创建函数。确保列表是有序的。 获取列表长度- 1为最大,0为开始。循环将: 获得新的中间值 检查中间值是否高于或低于目标值。

    1.4K20

    软件依赖的一知半解

    使用清晰的、设计良好的 API 编写代码也更容易、更快,并且更少出错。作者是否记录了他们对客户端代码的期望,以使升级兼容呢?(例如 C++ 23的兼容性文档。) 2.2 代码质量 代码写得好吗?...间接依赖关系中的缺陷与直接依赖关系中的缺陷一样对程序不利。依赖管理器可以列出给定包的所有依赖项,理想情况下应该按照这里描述的方式检查每个依赖项。...如果库通过了检查,并且决定依赖于它,那么下一步应该是编写新的测试,重点是我们应用程序所需的功能。...依赖的升级 升级带来了引入新 bug 的机会,如果没有相应的回报,为什么要冒这个风险呢?这种分析忽略了两个成本。首先是最终升级的成本。...首先,确保使用我们所认为的特定库版本。现在,大多数依赖管理器可以轻松记录给定库版本预期源码的加密哈希值,然后在另一台计算机或测试环境中重新下载这个库时检查这个哈希。

    1.1K20
    领券