新手程序员的25个错误

学习识别它们。 养成避免习惯的习惯。


本文的目的不是要诱使新来者注意典型的错误,而是要教他们识别和避免它们。 列出的顺序是随机的。

来自翻译


有时可能很难用简单的词来解释看似平凡的事情:为什么使用git,封装技巧是什么,为什么编写测试,如何计划代码,重构别人的代码等等。 在我看来,本文紧凑地汇编了编程的重要“人道主义”方面。 诸如道德守则,指南和制定与编写代码相关的决策的动机之类的东西。

无论听起来多么有趣,我从3月中旬开始就一直在研究此文本,试图找到合适的语言并使其更易于理解。 他与Habr编辑战斗了几天。 因此,如果您发现任何不足之处,请不要责怪我疏忽大意,但请通知我,我会立即纠正。 我本来想用图片来装饰文章,但决定这样做只会使它膨胀到完全不雅的尺寸。 阅读愉快。

1)没有计划的编程
2)过度计划
3)低估了代码质量的重要性
4)掌握第一个决定
5)不要退缩
6)不要谷歌
7)不要使用封装
8)计划未知
9)使用不合适的数据结构
10)破坏代码
11)评论明显的事情
12)不要写测试
13)想一想,如果有什么用的话,那说明正确
14)不要质疑现有代码
15)对最佳实践的痴迷
16)表现痴迷
17)不要专注于最终用户
18)不要选择正确的工具
19)误解代码问题导致数据问题
20)发明轮子
21)对代码检查的态度不正确
22)不使用版本控制系统
23)滥用共享状态
24)错误态度
25)不要休息

1)没有计划的编程


高质量的内容不是“一the而就”的,而是需要周密的工作。 程序代码也不例外。

好的代码应通过以下步骤:

这个主意。 研究。 规划。 拼写 验证码 改变

这些点中的每一个都需要给予足够的努力。

初学者倾向于不先思考就编码。 这可能适用于小型独立应用程序。 但是总的来说会变成悲剧。

在您说些什么之前,请仔细考虑这些字词,以免日后感到羞耻。 同样,请避免使用代码构思不当的代码,这一天会令人尴尬。 文字和代码反映出您的想法。

“如果您生气了,请在讲话前数到十。 如果您非常生气,则最高为100英寸。 (托马斯·杰斐逊)

对于我们的情况,可以这样表述:
“在检查代码时,在重写1行之前计数到10。 如果此代码没有测试,则最多100英寸。

编程是对现有代码及其修改的90%的研究,这些代码通过适合整个系统的小而容易测试的部分进行修改。 编写代码本身仅是程序员工作的10%。

编程不仅是编写代码,还需要基于自身需要开发的逻辑的创造力。

2)过度计划


在开始编码之前进行计划是一件好事。 但是,如果您与它们走得太远,即使是好事也会伤害您。 如果您喝过多的水,甚至会中毒。

不要寻找完美的计划。 这在编程世界中不存在。 寻找一个足够好的计划开始。 任何计划都会改变,但是它将迫使您遵循代码中的结构,这将有助于您的未来工作。

整个程序“从A到Z”的线性规划(通过瀑布法)不适用于大多数软件产品。 开发涉及反馈,您将不断删除和添加功能,而这些功能在“瀑布规划”中无法考虑。 应该计划以下几项。 并且只有在适应现实情况(敏捷)之后,才应将每个新项目都包括在计划中。

必须非常负责任地进行计划,因为计划的缺乏和过多都会损害代码的质量。 而且在任何情况下都不应冒代码质量的风险。

3)低估了代码质量的重要性


如果在编写代码时只专注于一件事,那应该是可读性。 难以理解的不可读代码不仅是垃圾,而且是无法回收的垃圾。

将程序视为通过代码进行通信的组件。 错误的代码就是不好的沟通。
“编写您的代码,就像它会伴随着一个知道您的住所的侵略性精神病患者一样。” (约翰·伍兹)

即使是“小事”也很重要。 如果您不系统地使用大写字母和缩进,那么您需要拿走程序员的许可证。

tHIS is
  WAY MORE important
than
         you think

. 80 . (ESLint, Prettier js).

. , . 10 – .

. . .

, , . , , , .
“ : ”. ( )

. - 12, :

const monthsInYear = 12; 

. , .

. . , . . – , .
“ , , ”. ( )

. , , . , . .

4)


, , , . , , , . , , .

, , . , , .
“ : 1) , , , ; 2) , ”. ( )

5)


– . , . “ ” , . . – . , . Git , .
, . .

6)


, , - . , .

. , , . , , .

– . , .

, :
“, , – ”.

7)


, . .

, . , . , . , .

. , , , .

. – . , – .

, , . , “ ”. .

, (High Cohesion and Low Coupling). , , – .

8)


, : “ …” , . .

, . , - .

, . , , .
“ — ”. ( )

9)


. – . .

, , .

: “ !”. .

?


– .

:
[{id: 1, title: "entry1"}, {id: 2, title:"entry2"}, .... ]

:
{ 1: {id: 1, title: "entry1"}, 2: {id: 2, title:"entry2"}, ....}

, , . , . , push, pop, shift, unshift, , .

, , . , , .

?


, . , 2 .

. , .

10)




, . - . . . . — , -. , , , , . , .

, :


, , . , , . , .


, :


, , : “ ?” “”.


if , , . – : ?

if:

function isOdd(number) {
 if (number % 2 === 1) {
   return true;
 } else {
   return false;
 }
}

if:

function isOdd(number) {
 return (number % 2 === 1);
};

11)


. , .

, :

// This function sums only odd numbers in an array
const sum = (val) => {
  return val.reduce((a, b) => {
    if (b % 2 === 1) { // If the current number is odd
      a+=b;            // Add current number to accumulator
    }
    return a;          // The accumulator
  }, 0);
};

:
const sumOddValues = (array) => {
  return array.reduce((accumulator, currentNumber) => {
    if (isOdd(currentNumber)) { 
      return accumulator + currentNumber;
    }
    return accumulator;
  }, 0);
};

. : “ ”, “ ”. , :

// create a variable and initialize it to 0
let sum = 0;
// Loop over array
array.forEach(
  // For each number in the array
  (number) => {
    // Add the current number to the sum variable
    sum += number;
  }
);

, . — .

12)


, , – .

, . -, - . , . , , . , - , , .

, , - . .

, . (test-driven development, TDD) . , , .

TDD , , , .

13) , - ,


, . ?

const sumOddValues = (array) => {
  return array.reduce((accumulator, currentNumber) => {
    if (currentNumber % 2 === 1) { 
      return accumulator + currentNumber;
    }
    return accumulator;
  });
};
 
 
console.assert(
  sumOddValues([1, 2, 3, 4, 5]) === 9
);

. . ?
, . .

1


. , ? .

TypeError: Cannot read property 'reduce' of undefined.

:
.
.

, . , :

TypeError: Cannot execute function for empty list.

, 0? , - , .

2


. , ? :

sumOddValues(42);
TypeError: array.reduce is not a function

, array.reduce — . array (), ( 42), . , 42.reduce — . :

: 42 -   , . 

1 2 , . , . , , ?

sumOddValues([1, 2, 3, 4, 5, -13]) // => still 9

-13 ? ? ? “ ”? . , , , , , , .

“ . ” — , .

3


. . .

sumOddValues([2, 1, 3, 4, 5]) // => 11

2 , . , reduce initialValue, . . , .

14)


- , , . , , .

, , , .

, . .

: , — , . . . git blame, .

, , . , . .

15)


“ ” , , « ».

“ ” . .

, “ ” . , . “ ”, , .

-, - , - , - “ ”. , , , .

16)


“ – ( )”. , 1974

, .

“ ”, . , , .

, , . , Node.js .

.

17)


, ? , . ? . ?

. , , . , . , .

18)


. - , . . , , 5.0.

, – .

, “” . .

, . .

. , . , .

19) ,


— . – , .

. , . , . , .

, , , .

? : , , (). , .

.

NOT NULL , . , .

UNIQUE . .

CHECK , , 0 100.

PRIMARY KEY . .

FOREIGN KEY , .

. , , , , .

20)


. . .

, , , , . , , , . .

- . . . “ ” . (open source), , , .

, , . - . shuffle lodash, , lodash.

21) (code review)


, . , .

. . . . .

, – , – .

-. , , , . , .

22) (Git)


/, Git.

, . — . . , , .

, . . , , .

, . , . .

– . , . , , , , .

, , , . bisect, , .

, , :
  • (staging changes)
  • (patching selectively)
  • (resetting)
  • (stashing)
  • (amending)
  • (applying)
  • (diffing)
  • (reversing)

, , . Git , .

23) (shared state)


.

. . , , . , , . , . .

, ( ). (Race conditions). , . . . .

24)


– . , . , – .

– . , , , .

– . .

25)


. . -, . , , , . .

Source: https://habr.com/ru/post/zh-CN413129/


All Articles