حول linter ، جودة الكود ، الجودة بشكل عام وإدارة الجودة

تخاف من رغباتك ؛ فقد تتحقق.
الحكمة الشعبية.

تمنى أحد الزوجين الزواج وإيجاد سعادة أبدية. فجرت سيارتهم في الكنيسة بعد الزفاف مباشرة.
One Wish Grant ، فيلم الطريق 60.

الصورة

ملاحظة فلسفية أخرى حول الإدارة ، وفي هذه الحالة ، تتكون من ثلاثة أجزاء: مجردة للغاية ، مجردة إلى حد ما ، ملموسة وملموسة منفصلة. ينتقد الممارسة الحالية لاستخدام linter.

جزء مجردة جدا عن الجودة


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

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

الآن سأقدم مثالاً زائداً ، وبعد ذلك سأذهب مباشرة إلى الكود.

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

إذا نظرت بجدية ، فقد تكون المشكلة الأصلية مختلفة تمامًا:

  1. يبيع منافسينا ثمارًا عالية الجودة على قدم المساواة ، لكنهم قاموا بالتسويق العطري أمامنا وجذبوا الزائرين بالرائحة.
  2. ثمارنا جيدة ، لكن ثمار المنافس أفضل حقًا من ثمارنا (الأصناف ، التخزين ، أيًا كان)
  3. ثمارنا فاسدة. انهم فقط فسدت ورائحة كريهة.
  4. ثمار العام الماضي ، التي تقف وراء شاشة العرض ، فاسدة ، ونأمل أن نتمكن من بيعها. وأنهم نتن من هناك.
  5. المنافس لديه أكثر متنوعة
  6. وضعت المنافس بشكل أكثر جمالا ثمارها ، بشكل عام ، هو نفسه لنا.
  7. انها أرخص بغباء هناك
  8. هناك بائع جميل ، وفي مكاننا جاء بابا مينا ليحل محل ...

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

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

حتى أكثر القطعي


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

بمعنى آخر ، إذا لم تكن راضيًا عن جودة المنتج الناتج ، فهناك مشاكل في سلسلة الإنتاج وتحتاج إلى تحليل العملية وتغييرها ، وعدم رسمها في المخرجات.

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

جزء مجردة بشكل معتدل حول جودة الرمز


من بين خصائص الكود الجيد ، سنجد (بدون الفرز حسب الأهمية):

  • اتساق الاسلوب
  • سهولة القراءة
  • الأداء
  • التمدد
  • شفافية العمارة والأنماط.

يتم تحقيق ذلك في المقام الأول من خلال الانضباط الذاتي ومستوى مهارة المطورين ، وكذلك عندما يكون هناك العديد من المطورين ، من خلال اتفاقيات أسلوب الكود واتفاقيات الهندسة المعمارية (MVC ، MVVM ، ECS ، الآلاف منهم). ظهرت الشفرة عالية الجودة في وقت أبكر بكثير من اللنت ، وأي اتفاقيات وأنماط معمارية.
معظم قواعد linter تجميلية بحتة وتحل مشكلة زيادة قابلية قراءة الكود بسبب التطبيق الموحد للممارسات الصغيرة والمحلية. طول الخطوط الموجودة هناك ، أسماء المتغيرات ، const حيثما لا يوجد تعديل ، وأحيانًا يتم فرض قيود على التعقيد السيكلومي للوظائف. لا يتعلق الأمر بقواعد محددة ، ولكن عن حقيقة أن هذه القواعد تجميلية بشكل عام ، فهي تساعد الكود في الظهور بشكل أفضل. الكلمة الأساسية هنا هي أن ننظر .

عندما يبدأ استخدام أي مؤشر كهدف ، فإنه يفقد قيمته كأداة.
التفسير الحر لقانون جودهارت .

الآن لنرسم تشبيهًا بالطماطم. لدينا ليست ناضجة بما فيه الكفاية. سوف يخبرنا linter التلقائي: "انظر هنا وليس هناك اللون المناسب". ماذا سوف تفعل مبرمج؟ في كثير من الأحيان رسمت. وهذه هي الفكرة الرئيسية لانتقادي من linter. الآن سأقدم مثالًا ملموسًا ، ثم أستخلص الخاتمة.

تفاصيل


PixiJS 2 فبراير 2018 (قبل عام).

تجمع الطلب يصل . خلاصة القول هي أنه في السابق تم استخدام عدد ثابت من النقاط لرسم المنحنى ، وهو بالطبع ليس الأمثل. يقترح استخدام خوارزمية الماكرة لتقدير طول المنحنى. الخوارزمية ليست علم الصواريخ ، لكنها بالتأكيد ليست واضحة ، نُشرت في عام 2013 واستشهدت بمقال لمؤلفها (هناك مشاكل في https). السعادة التي احتفظ بها عموما على صفحته الشخصية.

يوجد كود C (16 سطر):

float blen(v* p0, v* p1, v* p2) { va,b; ax = p0->x - 2*p1->x + p2->x; ay = p0->y - 2*p1->y + p2->y; bx = 2*p1->x - 2*p0->x; by = 2*p1->y - 2*p0->y; float A = 4*(ax*ax + ay*ay); float B = 4*(ax*bx + ay*by); float C = bx*bx + by*by; float Sabc = 2*sqrt(A+B+C); float A_2 = sqrt(A); float A_32 = 2*A*A_2; float C_2 = 2*sqrt(C); float BA = B/A_2; return ( A_32*Sabc + A_2*B*(Sabc-C_2) + (4*C*AB*B)*log( (2*A_2+BA+Sabc)/(BA+C_2) ) )/(4*A_32); }; 

وتم إرسال الكود التالي (JS) إلى تجمع الطلبات:

 /** * Calculate length of quadratic curve * @see {@link http://www.malczak.linuxpl.com/blog/quadratic-bezier-curve-length/} * for the detailed explanation of math behind this. * * @private * @param {number} fromX - x-coordinate of curve start point * @param {number} fromY - y-coordinate of curve start point * @param {number} cpX - x-coordinate of curve control point * @param {number} cpY - y-coordinate of curve control point * @param {number} toX - x-coordinate of curve end point * @param {number} toY - y-coordinate of curve end point * @return {number} Length of quadratic curve */ _quadraticCurveLength(fromX, fromY, cpX, cpY, toX, toY) { const ax = fromX - ((2.0 * cpX) + toX); const ay = fromY - ((2.0 * cpY) + toY); const bx = 2.0 * ((cpX - 2.0) * fromX); const by = 2.0 * ((cpY - 2.0) * fromY); const a = 4.0 * ((ax * ax) + (ay * ay)); const b = 4.0 * ((ax * bx) + (ay * by)); const c = (bx * bx) + (by * by); const s = 2.0 * Math.sqrt(a + b + c); const a2 = Math.sqrt(a); const a32 = 2.0 * a * a2; const c2 = 2.0 * Math.sqrt(c); const ba = b / a2; return ( (a32 * s) + (a2 * b * (s - c2)) + ( ((4.0 * c * a) - (b * b)) * Math.log(((2.0 * a2) + ba + s) / (ba + c2)) ) ) / (4.0 * a32); } 

تم تصميم الكود بما يتوافق تماما مع إعدادات linter. يشار إلى أوصاف جميع المعلمات ، وصلة إلى الخوارزمية الأصلية ، مجموعة من الثوابت ، وفقا لمتطلبات linter غير المختلط: يتم ترتيب أقواس 1. حتى بالنسبة للأداء ، لا يتم تنفيذ api بشكل موضوعي ، ولكن مع معلمات منفصلة ، لذلك عادة ما يكون أفضل في JS.
هناك مشكلة واحدة. هذا الرمز يجعل القمامة كاملة. (محاولة لتمييز التعبير الذي مارس الجنس بالروسية ، والذي يستخدم تمامًا في المنشورات الغربية للتعبير عن درجة المشكلة ويبدو أنها مناسبة).

هذا ما قاله linter عند النظر إلى هذا الكود بدون أقواس
c:\rep\pixi\pixi.js\src\core\graphics\Graphics.js
258:26 warning Unexpected mix of '-' and '*' no-mixed-operators
258:32 warning Unexpected mix of '-' and '*' no-mixed-operators
259:26 warning Unexpected mix of '-' and '*' no-mixed-operators
259:32 warning Unexpected mix of '-' and '*' no-mixed-operators
260:24 warning Unexpected mix of '*' and '-' no-mixed-operators
260:30 warning Unexpected mix of '*' and '-' no-mixed-operators
260:30 warning Unexpected mix of '-' and '*' no-mixed-operators
260:36 warning Unexpected mix of '-' and '*' no-mixed-operators
261:24 warning Unexpected mix of '*' and '-' no-mixed-operators
261:30 warning Unexpected mix of '*' and '-' no-mixed-operators
261:30 warning Unexpected mix of '-' and '*' no-mixed-operators
261:36 warning Unexpected mix of '-' and '*' no-mixed-operators


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

 2*2+2*2 

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

الخاتمة


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

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

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

تجدر الإشارة إلى أن موقفي تجاه linter تم تشكيله منذ زمن بعيد ، منذ أكثر من ثلاث سنوات ، لكنني لم أجد مثالًا مناسبًا في الممارسة عندما لعب linter مزحة قاسية. ووجدته. تقول حقيقة أنني كنت أبحث عنها لفترة طويلة أن المشكلة ليست كبيرة الحجم ، أو مدى صعوبة ملاحظة التأثير السلبي ، لكنني أعتقد أن هذه المقالة ستكون مفيدة. تذكر ، أن أداة linter هي أداة ، ومثل أي أداة يمكن استخدامها على حساب الخير وللصالح ، وكيف يمكنك في بعض الأحيان قطع نفسك بأي أداة.

Source: https://habr.com/ru/post/ar440414/


All Articles