为什么(以及如何)我用铅笔和纸 PlatoBlockchain 数据智能编写代码。 垂直搜索。 哎。

为什么(以及如何)我用铅笔和纸写代码

如果手写代码的想法看起来很愚蠢,那么您可能会惊讶地发现这是不可避免的。 如果你不确定,想想你上次的工作面试,并记住面试室里没有电脑——只有你的面试官、一张白纸和一支蓝色圆珠笔。

对于你们当中的学生来说,这甚至更重要,因为您的成绩取决于您战略性地挤入答卷中可用空间的代码行。

不仅如此,有经验的程序员还可以将您指向他们从办公室复印机中取出的一捆 A4 纸,以草草写下他们一直在研究的特别复杂的算法。

因此,无论您是一名应试生、潜在的求职者,还是想要解决他们的编程死胡同的人,我希望这篇文章在您将笔放在纸上进行编码时对您有所帮助。

虽然我将专注于编写代码的模拟方面,但您可以将这些步骤应用于任何形式或语言的编码。 所以认为这也像一个通用的编码指南,专门为我工作,但在你的工作中也对你非常有用。

为什么要写下来?

在我们开始之前,必须了解没有人希望您在笔记本中记下生产就绪的代码。 这不像您可以将其放入代码编辑器并在没有错误的情况下编译它。 如果生成完美的代码是目标,那么您将坐在面试室和考场的电脑前。

手写代码的目的是提前完成逻辑。 在设计中,人们希望尽快“进入浏览器”,但在手绘设计草图方面存在传统智慧。 低保真媒体鼓励快速实验和廉价错误。

试图弄清楚如何一键影响周围项目的辛劳(来自我的 上篇文章)

代码也是如此,主要是在处理语法和语义时。 也就是说,获得正确的语法和语义是 时刻 一个加分点,虽然不是整个手写练习的唯一重点。

让我们看看在手写代码方面我们可以从哪里开始。

知道你的问题

在大学的最后一年,由于健康原因,我无法实习,甚至无法参加校园面试。 结果,我的第一次工作面试是非常直接的,风险很高。

现在回想起来,面试很轻松。 但是以前从未参加过,我感到非常焦虑。 面试官问的关于编程的第一件事是我是否可以输出一个由星号组成的倒三角形。 正如我所说,这很容易——没什么 for 循环无法处理,对吗? 但就像我说的,我的焦虑也来自屋顶。

我深吸了一口气,将手掌按在他们为我准备的空白纸上,尽可能缓慢地将它滑到桌子上(当然是在争取时间),点了点笔,然后我做了点什么正确的。

我首先画了一个由星号组成的倒三角形。 这就是我如何脚踏实地开始回答他们的问题。

我见过一些其他出色的开发人员仅仅因为他们从未完全理解他们正在解决的问题而出错。

我们处理的问题与物理学家或数学家解决的问题不同。 他们得到一组参数并找到丢失的参数; 我们的问题也是我们的结果。 我们已经被告知我们的结果是什么——我们必须弄清楚如何达到它们。 这就是为什么必须很好地了解这个问题,因为你会看到结果。

写下或画出您想要输出的内容是开始编码的最佳方式之一。 我知道在我们快节奏的行业中,期望我们必须通过运行“hello world”演示直接进入编程。 熟悉不熟悉的语法并摆脱对尝试新事物的焦虑非常好。

但是当有人问你一个问题并给你一个要努力的结果时,先把它放下不是更好吗? 该问题/结果不仅是您的起点,也是您的参考点。 在编码的任何步骤中,您都可以查看它以确保您正在朝着它努力并且您走在正确的轨道上。

因此,无论是在你的答题纸上,还是在你将要写的那张空白 A4 纸上,先花点时间写下你想要输出的内容。 如果您不希望它成为答案的一部分,您可以将其放在页边距或角落。 只要确保它位于可以继续引用它的地方。

概述您的代码

这一步就像一把双刃剑。 它可以为您提供计划的路线图或浪费您的时间。 我的工作是确保它是前者。

所以,首先,我想说: 如果您的问题或问题的范围很小,则无需概述代码。 同样,这种做法对所有项目或情况既不是规定性的,也不是通用的。 想象一下,我是你的面试官,我要求你编写如何使用 CSS 以尽可能多的方式在网页中居中元素。 您将不需要为此提供大纲。 每种方法的代码片段都相对较小。

但是现在,假设我指定您编写一个 Web 应用程序,该应用程序通过触摸屏界面捕获用户签名,然后将签名保存在服务器上。 不是那么直截了当,对吧? 你要弄清楚的不止一件事。 也许,一个小大纲会有所帮助。

  1. 用于捕获签名的 UI — HTML Canvas? WebGL?
  2. 用户签名时禁用网页其余部分的指针事件
  3. 将捕获的图像转换并保存为 PNG 文件 - JS
  4. 然后将其转换为blob(可能)并将其保存到访问者的日志数据表中。

我写了一个粗略的动作序列,我认为我可能需要编写代码。 它可能更短或更长,这取决于我想要从中得到什么。

我强烈建议为客户项目概述代码。 将大纲连同您的用户要求一起写下来,或者写在您打印出来的线框图的背面。

您对项目符号的快速快照为您提供了一张地图、一个待办事项清单和一个检查清单,以在您到达项目结束时进行验证——几乎是您整个项目的摘要在一个低保真列表中。 它也可以成为开始下一个类似项目的模板。

但就像我之前说的,这一步就像一把双刃剑。 当时间有限时,你必须为考生和面试者保持简短。

如果您不知道从哪里开始,请只写下您必须在应用程序中编写代码的三个基本功能,如果您有时间,请写下五个。

但仅此而已。 尽可能少花时间在这上面,不要为细节操心。 大纲不会给你加分。 它只是为了帮助您确保您已涵盖所有内容。 它捕捉您最初的直觉反应,并在项目的整个生命周期中让您保持诚实。

速记与速记

白色横格纸,用黑色墨水书写草书手写笔记。
禁用文本选择的快速参考

是时候开始编码了。 那么,你写什么? “Bdrs”或“border-radius“; “div -> p“或”<div><p></div></p>“; “pl()“或”println()“; “q()“或”querySelector()“?

如果其他人正在为您的代码评分,那么别无选择。 省略缩写、伪代码、Emmet 快捷方式和任何其他形式的速记书写。 否则,没有理由假设任何阅读本文的人都知道您的缩写是什么意思。

这真的取决于你。

如果你已经与手写失去联系——我们中的许多人已经——最好不要过度使用手写符号,因为它们会变得乏味。 同时,你的写作也没有过于节俭的事。 如果您希望有一天能够回顾它并理解您写下的内容,则不是。

我的笔记应用程序中有一个打开的文件,我的办公桌上有一个带衬里的记事本,我在其中写下我想保存以供以后参考的代码片段。 它们是杂乱无章的,只是一长串的片段。 这就是为什么当我浏览旧笔记时,如果我没有把它们写清楚,我就不知道我要写什么。

我总是忘记语法。 例如,自从引入 JavaScript 函数以来,我一直在使用箭头表示法(因为它更短),而且我很确定是否有人突然要求我使用 function 关键字,我什至可能会放错括号或函数名,从而引发语法错误。

忘记一段时间未使用的语法对我们来说并不罕见。 这就是为什么当你知道你需要它们以备将来参考时,最好清楚地写下你的笔记。

代码的非顺序流

与不适用于你们这些受访者和应试者的最后一步不同,这一步特别适合你。

大多数编程语言都是经过解释、编译和执行的,因此有时源代码中预先编写的代码会在稍后被调用时执行。 例如,我们在 JavaScript 中使用函数调用来执行此操作——函数可以先定义,然后再执行。 考生和受访者可以利用它首先开始研究答案的关键点。

正如我从一开始就说过的,手写代码的目的是完成或测试您编写的任何程序的逻辑。 最好先专注于解决这个问题。

让我们举一个经典的教科书例子——一个找到第 n 个的程序 斐波纳契数. 如果我要为它写一个简单的大纲,它会是这样的:

  1. 获取输入。
  2. 计算斐波那契数。
  3. 总结输出。
  4. 打印输出。

该大纲中的所有步骤都是必不可少的; 但是,1、3 和 4 更具强制性。 它们是必要的,但不够重要,无法立即关注。

最好开始写下计算斐波那契数的代码,而不是获取输入。 将它包装在一个函数中,然后继续按顺序编写代码并写下一行以在适当的地方调用该函数。

花时间编写专注于问题核心的代码。

真正的专业人士可以跳过。 假设我有一个客户项目,我必须使用一些三角形几何图形——有两条边,相反的角度,并且要找到第三条边的长度。 我决定在纸上涂鸦开始,而不是打开我的 IDE.

首先,我当然会画出三角形(这是我非常有经验的,正如你所知道的)。 我会写下一些样本长度和角度。 然后我会编写公式(当然是对在线搜索的赞美),然后我会直接跳到函数的代码。

即使我在生产就绪代码中需要它们,我也没有必要写下强制性步骤。 但是,如果我必须在考试的答题纸上写下它,那就不一样了。 我不能跳过其他步骤; 但是,我仍然可以从公式的代码开始。

伪代码

克里斯已经写了一个 关于伪代码的便利文章 我强烈建议您认真阅读。

对于那些觉得整个手写代码看起来不像是你的一杯茶但仍然好奇它是否能帮助你的专业人士,那么 伪码 可能是您正在寻找的平衡。

正如我在前面的步骤之一中提到的那样,它类似于概述代码。 但是,它更简洁,感觉更像是速记编码。 它有时也被称为“骨架代码”。

这是 CSS 网格布局的一些快速伪代码:

Grid
5 60px rows
6 100px columns

没什么可写的! 因此,即使将铅笔放在纸上对于这类事情来说非常好,但将一些伪代码记入您正在使用的任何程序中同样有效、快速且成本低廉。

空间和评论

我相信代码是 90% 的关键字和 10% 的标签。 没有空格,单词的可读性会降低。 手写代码也需要缩进。 但是,请不要在每个级别都使用它,因为纸张的宽度会限制您。 明智地使用空格,但要使用它们。

黄色无衬里纸,代码用黑色墨水草书手写。
珍贵的 OG 片段,用额外的 TLC 编写

如果您正在编写供您使用的代码,我也相信如果您已经遵循了我到目前为止提到的所有内容并且已经在页面上写下了您的输出和大纲,您甚至可能不需要包含评论。 注释可以快速告诉你下面的代码集是做什么的。 如果您已经编写并阅读了代码大纲,那么注释就是多余的注释。

但是,如果您的判断是放下一个,那就去做吧。 将其添加到代码的右侧(因为您将无法像在 VS Code 中那样将其插入已编写的行之间)。 使用正斜杠、方括号或箭头表示它们是注释。

对于对某种语法不自信的考生,请写下评论。 这样,至少,你让给你的论文评分的人知道你使用格式不正确的代码的意图。 并且只使用正确的分隔符来表示注释——例如,这将是 JavaScript 的正斜杠。

模拟与数字

正如我之前提到的,我在这里提供的所有内容都可以是通用的编码建议。 如果您不想在纸上尝试此操作,任何笔记应用程序也可以使用。

但是,如果您要尝试数字路线,我的建议是尝试使用除直接记笔记应用程序之外的其他东西。 使用更多可视化的数字工具——流程图、思维导图、线框图等。它们可以帮助你可视化你的结果、大纲和代码本身。

我不是一个数字公民(除了在网络上工作并最近转换为阅读电子书),所以我坚持使用实体笔记本。

我最喜欢的手写代码工具

任何铅笔和纸都可以! 但是有很多选择,这些是我使用的一些选择工具:

没有“写”的编码方式

我希望,如果没有别的,我用铅笔和纸写代码的小方法能让你评估你已经计划和编写代码的方式。 我喜欢了解其他开发人员如何处理他们的工作,这是我让您了解我做事方式的方式。

同样,这里没有什么是科学的或精确的艺术。 但是,如果您想尝试手写代码规划,以下是我们在一个不错的有序列表中介绍的所有内容:

  1. 首先写下(如果需要,使用示例数据)代码的输出。
  2. 为代码写一个大纲。 对于小型项目或不太复杂的项目,请保持三个步骤。
  3. 使用速记符号。 为自己编写的开发人员可以使用速记符号,只要编写清晰易读,并且在您以后参考它时对您有意义。
  4. 在时间有限的情况下,请考虑首先编写解决问题核心的代码。 稍后,在顺序代码中的正确位置写下对该代码的调用。
  5. 如果您有信心,请尝试编写伪代码来解决主要思想。
  6. 使用适当的缩进和空格——并注意纸张的宽度。

而已! 当您准备好尝试手动编写代码时,我希望这篇文章能让您轻松上手。 如果您正在参加考试或面试,我希望这可以帮助您专注于正确回答问题。

时间戳记:

更多来自 CSS技巧