追求最佳实践是一种不好的做法(当你是新手时)
我需要把这件事做好,即使我不知道什么是“正确”。如果我犯的错误变成了习惯怎么办?如果我做得不对,是不是意味着我没有做好这件事的条件?
在我的学习过程中,我几乎在写每一行代码时都会对自己说这句话。我需要在脑子里想出完整的、正确的解决方案,然后才能开始打字。我可能不知道什么是“正确”,但我告诉自己,如果它突然出现在我的脑海里,我就会知道。然后我就坐在那里,思考、打字、删除、阅读、重读。然而,即便如此,我仍然无法在脑子里想出正确的代码。
我希望我能用言语抹去这些想法。但我做不到。我不相信你能彻底治愈这种感觉。这些想法会来来去去。虽然我没有解决办法,但我可以提供一些想法,比如为什么会发生这种情况,它对我们的学习有什么影响,以及我们如何以不同的方式思考问题。
我小时候数学很吃力。小学的时候,我们轮流上黑板做乘法题。5 * 3,3 * 7,8 * 2。唉。我记得有一天我上黑板的时候做错了。我知道大家都在看。我写了一个数字,擦掉,又试了一次。结果还是没算出来。我能听到同学们的窃笑声。老师让我回座位。后来,我不得不向父母展示我作业上错的题目,但这并没有起到什么作用。这一切都让我很困惑。我学到了一些数学知识。但我觉得更重要的教训是:
除非你知道答案,否则不要尝试。
我不能说每个人都是这样的。但以我的经验来看,除非我确定自己是对的,否则我不会主动做任何事。犯错是有后果的。同学们会嘲笑我,老师会失望,家长会愤怒。我当时是在试图保护自己。
这种害怕犯错的情绪并不局限于数学课——它成为了塑造我学习方式的一种模式。
所以,多年以后,在学习编程的过程中,我经常会面对一个空白的文本编辑器,旁边是闪烁的光标,希望灵感能够迸发。但因为渴望正确的代码能从指尖流淌而出,我几乎写不出多少代码。而当我开始输入某些内容时,我又会删除它,因为我觉得它不对。
这段代码正确吗?是不是代码太多了?我使用这个 HTML 元素的方式正确吗?最佳实践是什么?
这些根本没用。谁会想雇一个连最基本的东西都做不出来的人?我怎么就不知道怎么做呢?我肯定很笨。
这种对完美的执念蒙蔽了我们的思维。学习编程本身就够难的了。对刚开始学习的东西抱有完美期望,会让人觉得不可能。而这正是驱使我们寻求最佳实践的动力。我们想要编写有用的代码。我们想要以正确的方式使用 HTML 元素。我们想要向人们证明我们并不笨。我们想要坚持正确。
假设一个数学新手想要真正学好数学。他们的第一步是学习数字。之后,他们开始苦苦思索加法。想象一下,当他们最近才发现数字时,他们会因为加法困难而感到沮丧。这不合理,也非常不公平。技能是长期规律练习的结果。没有人天生就能理解他们从未见过的一切。或者如果我们想要准确一点:唯一“无所不知”的人是电影里虚构的天才或不诚实的人。我们应该对自己有高标准。但是,努力追求那些你刚发现的想法中的“最佳实践”是不切实际的。
尽管我们可能怀有良好的意愿,但在学习基础知识时,即使是最佳实践也未必能帮上大忙。我曾与无数寻求首个项目反馈的初学者进行过交谈。他们往往在学习基础知识的同时,就对所编写的代码抱有专业级的期望。当我问他们是否是 JavaScript 新手,以及这是否是他们的第一个项目时,他们会确认这两点——但仍然期望自己的作品能够达到专业水准。
如果你刚刚了解函数和逻辑运算符,还不知道如何实际使用它们,那么设计模式在那个时候会有多大用处呢?如果你刚刚了解数组,那么最佳实践在那个时候会有多大用处呢?当然,像设计模式和代码效率这样的花哨概念通常很有用。但在学习基础概念的时候,这些花哨的想法用处不大。你学习的是事物的运作方式。这与学习如何很好地使用这些东西是不同的。
有时,有人会分享一个行数过多的练习,并希望学习最佳实践,以减少代码行数,提高代码性能,或使其代码“正确”。然而,他们的代码却完全没问题。他们只使用了所需的代码,并且每一行都描述了一个必要的操作。想象一下我们反转字符串的场景:
function reverseString(str) {
// Step 1: Create an array to store each character
const charactersArray = [];
// Step 2: Loop through each character in the string and add it to the array
for (let i = 0; i < str.length; i++) {
const currentChar = str[i];
charactersArray.push(currentChar);
}
// Step 3: Create a new array to hold the reversed characters
const reversedArray = [];
// Step 4: Loop backward through the charactersArray
for (let j = charactersArray.length - 1; j >= 0; j--) {
const currentChar = charactersArray[j];
reversedArray.push(currentChar);
}
// Step 5: Initialize an empty string to build the final result
let reversedString = '';
// Step 6: Loop through the reversedArray and concatenate each character
for (let k = 0; k < reversedArray.length; k++) {
reversedString += reversedArray[k];
}
// Step 7: Return the final reversed string
return reversedString;
}
我见过一些编程新手、JavaScript 新手、数据处理新手,他们一上来就觉得代码很失败,因为自己想不出什么点子const reverseString = str => str.split('').reverse().join('');
。注意:我并不是说代码行数越少越好——写代码时,可读性比简洁更重要。只是想说明一下。
想象一下,你刚刚学习了字符串、变量、逻辑运算符、数组和循环。如果一开始只有一行代码,那么理解起来会非常困难。当我们学习基础知识时,理解中间步骤是很有价值。
我记得有一次,一个学习者听说了DRY(不要重复自己)这个原则,就因为代码中存在一些重复而停止了学习。他们的代码甚至都不能正常运行,但他们更关心的是让它符合专业标准,而不是让它完全正常工作。他们完全可以绕道去学习泛化逻辑。但是,如果逻辑运算符和函数感觉很棘手,那这真的是最重要的投入点吗?如果没有丰富的实践经验,我们真的很难认识到最佳实践的价值。
讽刺的是,要真正理解像 DRY Matter 这样的最佳实践,需要亲身体验它们所解决的问题——而这种经验只有通过编写“不完美”的代码才能获得。这给那些早期就追求最佳实践的学习者带来了一个悖论。
过早追求最佳实践会剥夺我们练习、实验、犯错和观察的机会。这很不舒服,尤其是如果你有过像我这样的学习经历。
但有一点需要注意:大多数情况下,学习过程中犯的错误不会导致你的电脑崩溃。最糟糕的情况是你收到一条错误消息,或者你的代码无法运行,或者你看到一些未定义的值。而这一切恰恰提供了一个调查和学习代码的机会。
在学习过程中,实验和错误比最佳实践更有价值。如果你因为追求正确而停滞不前,不去编写代码,你就没有机会去尝试并进行观察。错误的代码可以教会我们一些东西。例如:
function addNumbers(a, b) {
a + b;
}
const result = addNumbers(5, 3);
console.log(result);
如果我们预期看到 8
的输出,undefined
结果却看到了 ,那真是一个学习的机会!这让我们有机会反思我们的预期,并探究实际发生了什么——在本例中,我们发现函数需要显式的返回语句来提供值。但是,如果我们从未编写代码,从未进行实验,从未观察,而只是试图想象……那么理解函数的工作原理将会非常棘手。
错误揭示了我们理解上的差距,也提供了实验、观察和发现的机会。如果我们拒绝尝试,我们将一无所获。
此外,我们因为不知道而给自己施加的压力,也让学习变得更加困难。这里我就不多说了,不过大家可以谷歌搜索“学习,压力”,看看这些压力是如何让我们的学习体验变得格外艰难的。
那么我们能做些什么呢?以下是一些关于你下次编程练习的提醒:
犯错,或者说不知道,都是尝试、观察和学习的机会。
犯错或不知道并不意味着你很笨。你是新手。它表明你遇到了一些值得学习的东西。在我们努力进步的过程中,我们应该尽可能多地体验这些学习的时刻。
没有人天生就知道怎么做。
每个人都需要投入时间和精力去学习。那些声称这对他们来说一直很容易的人,其实并没有告诉你一切。
在你感觉准备好之前就去尝试。
准备好和感觉准备好之间是有区别的。人们会误以为自己有能力,却把感觉当成能力。当你知道该尝试什么的时候,你就已经准备好了。
每个人都有起点。
即使是专业人士,也会为了先让代码运行起来而编写一些可能感觉很乱的代码。你无法改进不存在的代码。先让它运行起来。
重新定义任务。
当你开始一个项目时,提醒自己目标。目标不是编写遵循所有最佳实践的专业级代码。目标是理解新引入的概念。项目是我们发现、观察和构建思维模型的实验——它们不是我们证明自身价值的考试。
我们不会因为幼儿走路姿势不正确而责骂他们,也不会告诉他们“高效行走的最佳方法”。他们摇摇晃晃的步伐不会赢得任何正确姿势或运动成绩的奖励。我们赞扬他们的尝试,因为我们明白,这些不完美的步伐对他们的成长至关重要。当他们因失误而摔倒时,我们不会告诉他们先优化步态再尝试。
同样,你第一次玩石头剪刀布游戏,也不必成为最佳实践的大师级范例。你那七个步骤的字符串反转函数并非失败,因为它只需一行代码就能完成。这些“混乱”的初次尝试,正是我们构建基础的方式,为之后的最佳实践奠定了意义。没有这个基础,最佳实践就只是空洞的规则,没有具体的上下文。
最佳实践并非先被创造出来,然后才被用来编写优秀的代码。它们源于人们多年来编写不完美代码、犯错以及通过经验发现更好方法的积累。当你做好准备时,最佳实践就会出现。
给自己一个学习的机会。
鏂囩珷鏉ユ簮锛�https://dev.to/theodinproject/pursuing-best-practices-is-a-bad-practice-when-youre-new-37pb