
还记得科学方法吗? 您可能是在小学时第一次学习它的,当时您必须将其应用到创建可爱的三折篮板科学博览会项目中。 如果那不仅是您第一次使用它,而且还是最后一次使用,则它是这样的:询问问题,进行背景研究,拟定假设,检验假设,得出结论并确定下一步。 尽管这可能使人们回想起漫长而漫长的研究项目,但我发现这种精确的方法为解决我在工作中遇到的许多问题创造了一个很好的框架。
有时候,解决问题时采取正确的方法可能是不透明的。 什么时候寻求帮助合适? 什么时候可以通通并单独找到答案? 如果要寻求帮助,在保持同事的高度尊重的同时又该如何做? 科学的方法可以帮助指导这一过程:它将为如何开始解决问题提供一些指导,并可以提出明智而周到的问题。 我将介绍基本原理以及如何将它们应用于最近必须解决的实际软件工程问题。
提出问题 -从问题开始。 找出问题的组成部分。
使用我仍然不熟悉的语言Go,如何分配通用有效载荷并截断其字段以生成可行的JSON,同时分配最少的内存和时间?
背景研究 -考虑解决问题可能需要哪些知识。 使用Google,公司文档和已经存在的类似代码来构建知识基础。
我查看了看起来最相关的Go概念: 空接口 /(interface {} /), switch语句 ,有关 按引用传递和按值传递的 一些更详细的信息 , 以了解Go在传递给函数时如何处理特定类型 切片vs.数组 作为参数(答案:从技术上讲总是按值传递,但这可能会因类型而混淆) 。 我也知道我的团队过去曾尝试解决此问题,但它的内存效率或速度不如我们所需,因此我确保自己熟悉该代码。
提出假设 -这可以是问题的完整答案,也可以是仅解决一部分问题的理论。 答案似乎还很遥远,但是执行此步骤很重要; 它促使您进行透彻的了解,并且是将来解决问题的好方法。
在查看了截断器的先前版本,进行了Google研究并提出了一些想法之后,我想出了一个可能的解决方案,包括遍历界面{}并将信息封装在链表类型结构的变体中。 这保留了我想要的顺序,限制了内存的使用,并跟踪了最终输出中将包括哪些信息以及将要截断的信息。
实验 —接受假设并进行检验。 此处不需要在实际科学研究中使用受控的重复测试样式,但是找到易于检验的假设组成部分的想法很重要。 一些简单的问题,例如确定特定语言如何处理浮点数到整数的舍入,使其适合进行简单的实验。 对于更复杂的问题,请尝试找到像上面一样可以明显测试的组件。 为了为更大的图片编写“实验”,可能没有经典意义上的实验,绘制逻辑图或编写假设所需的方法签名。
我本可以坐下来完成整个项目,但这很可能导致我感到困惑,编写的代码还不够完善。 因此,作为检验我的假设的一种方式,我写了一个简单的脚手架,其中包括所有公共方法,一些私有方法,并简要说明了它们将要做什么以及我想使用的数据结构。 我用非常基本的代码填充了某些结构,以确保可以按照我认为可以的方式在Go中创建和使用修改后的链表。
结论和后续步骤 –此时,应该更清楚地解决问题。 解决方案现在可能相当明显,因此现在可以解决。 如果不是这样,那么曾经是开放性问题的问题现在变得更具针对性和具体性,可以摆给同事。 在这一点上找同事意味着有机会学习,对要解决的问题有更扎实的观念,可以提出更聪明的问题和进行更周到的对话,并表现出自力更生和自强不息的表现。尊重同事的时间。
我现在有一个完整的计划,并测试了一些基本假设。 看来我的方法行得通,但是由于这是一个相当复杂的解决方案,因此我想由同事和导师来实践我的想法。 我带领他进行了思考,并向他展示了我写的脚手架。 我们最终需要调整我的想法,但是脚手架和POC极为有用。 他们为我的导师提供了切实的东西,以供他们查看并提供反馈,而脚手架为我提供了一些可以快速迭代的代码的开始。
当我第一次遇到编写截断器的任务时,我感到不知所措,不确定如何进行。 使用科学方法使项目更易于管理。 可以肯定的是,我对要解决的高级问题有坚定的了解,这使您更容易理解更详细的细节。 我仍然去找导师,但是我能够提出解决方案,并在更深层次上与反馈互动。
以这种方式开始采用科学方法后,我发现自己可以更快地解决问题,使我从同事那里获得的帮助更加有价值,并有助于确保我继续学习。 我发现自己每天都在解决小型研究问题。
最初在 lightstep.com上 发布 。