25 خطأ مبرمج مبتدئ

تعلم كيفية التعرف عليهم. تطوير العادات لتجنبها.


الغرض من هذه المقالة ليس تحريض الوافدين الجدد على الأخطاء النموذجية ، ولكن تعليمهم تحديدها وتجنبها. ترتيب الإدراج عشوائي.

من المترجم


في بعض الأحيان ، قد يكون من الصعب شرح أشياء بسيطة بكلمات بسيطة: لماذا تستخدم بوابة ، وما هي خدعة التغليف ، ولماذا تكتب الاختبارات ، وكيفية تخطيط الشفرة الخاصة بك ، وإعادة بناء شفرات شخص آخر ، وما إلى ذلك. يبدو لي أن هذه المقالة جمعت بشكل مضغوط الجوانب "الإنسانية" المهمة للبرمجة. شيء مثل مدونة الأخلاق ، والمبادئ التوجيهية والمحفز في اتخاذ القرارات المتعلقة بكتابة التعليمات البرمجية.

مهما كان الأمر يبدو مضحكًا ، فإنني أعمل على هذا النص منذ منتصف مارس ، محاولًا العثور على اللغة الصحيحة وتسهيل فهمها. حارب يومين مع محرر هبر. لذلك ، إذا وجدت أي أوجه قصور ، يرجى عدم إلقاء اللوم علي الإهمال ، ولكن أبلغني ، فسأقوم بتصحيحها على الفور. فكرت في تزيين المقالة بالصور ، لكنني قررت أن هذا لن يؤدي إلا إلى تضخيمها إلى أبعاد غير لائقة تمامًا. قراءة جيدة.

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) البرمجة بدون تخطيط


لا يتم إنشاء محتوى عالي الجودة "على الركبة" ، ولكنه يتطلب عملاً شاملاً. كود البرنامج ليس استثناء.

يجب أن يمر الرمز الجيد من خلال الخطوات التالية:

الفكرة. البحث. التخطيط. تهجئة التحقق التغيير.

تحتاج كل نقطة من هذه النقاط إلى بذل جهد كافٍ.

يميل المبتدئون إلى البرمجة دون التفكير أولاً. قد يعمل هذا على التطبيقات المستقلة الصغيرة. ولكن بشكل عام يمكن أن تتحول إلى مأساة.

قبل أن تقول شيئًا ، تفكر في الكلمات حتى لا تخجل لاحقًا. وبالمثل ، تجنب التعليمات البرمجية غير الصحيحة التي ستحرج يومًا ما. والكلمات والشفرات هي انعكاس لأفكارك.

"إذا كنت غاضبًا ، فقم بالعد حتى 10 قبل أن تتحدث. إذا كنت غاضبًا جدًا ، فسيصل إلى 100 ". (توماس جيفرسون)

بالنسبة لحالتنا ، يمكن إعادة صياغة ذلك على النحو التالي:
"عند التحقق من الرمز ، عد إلى 10 قبل إعادة كتابة سطر واحد. إذا لم تكن هناك اختبارات لهذا الرمز ، فحينئذٍ تصل إلى 100 بوصة.

البرمجة عبارة عن دراسة بنسبة 90٪ للشفرة الحالية وتعديلها من خلال أجزاء صغيرة يسهل اختبارها تتناسب مع النظام العام. كتابة الكود بحد ذاته 10٪ فقط من عمل المبرمج.

لا تقتصر البرمجة على كتابة سطور التعليمات البرمجية فحسب ، بل هي إبداع يعتمد على المنطق الذي يجب تطويره في حد ذاته.

2) التخطيط المفرط


التخطيط قبل الغوص في البرمجة أمر جيد. ولكن حتى الأشياء الجيدة يمكن أن تؤذيك إذا ذهبت بعيدًا معهم. حتى الماء يمكن أن يتسمم إذا شربت الكثير منه.

لا تبحث عن الخطة المثالية. هذا غير موجود في عالم البرمجة. ابحث عن خطة جيدة بما يكفي للبدء. ستتغير أي خطة ، لكنها ستجبرك على الالتزام ببنية في الكود ستسهل عملك في المستقبل.

التخطيط الخطي للبرنامج بأكمله "من الألف إلى الياء" (بطريقة الشلال) غير مناسب لمعظم منتجات البرامج. يتضمن التطوير التغذية المرتدة وستقوم بإزالة الوظائف وإضافتها باستمرار ، والتي لا يمكن أخذها في الاعتبار في "تخطيط الشلال". يجب التخطيط للعناصر القليلة التالية. ولا ينبغي إدراج كل جديد في الخطة إلا بعد التكيف المرن مع الواقع (Agile).

يجب أن يتم التخطيط بشكل مسؤول للغاية ، لأن افتقاره وفائضه يمكن أن يضر بجودة الكود. ولا يجوز بأي حال من الأحوال المخاطرة بجودة الشفرة.

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/ar413129/


All Articles