> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# أدوات جودة الكود: أيها تختار لفريقك؟
- URL: https://arabroot.io/articles/مقارنة-ادوات-جودة-الكود/
- Published: 2026-10-12T20:30:00.000Z
- Updated: 2026-10-12T11:54:11.000Z
- Description: مقارنة عملية بين مدققات كل لغة والأدوات الجامعة ومنصات الجودة، بتراخيصها وأسعارها ونتائجها على مستودع واحد.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, DevOps والتشغيل, DevOps وCI/CD, الاستضافة الذاتية

في [المقال الأول من السلسلة](https://arabroot.io/articles/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AC%D9%88%D8%AF%D8%A9-%D8%A7%D9%84%D9%83%D9%88%D8%AF-code-quality-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D9%82%D9%8A%D8%B3%D9%87%D8%A7/) رأينا أن كل نوع من أدوات الفحص يرى طبقة مختلفة من الكود، وأن المدقق وأداة التعقيد وأداة التغطية لم تجد كلها النسخة المنسوخة في مستودع المتجر. والسؤال العملي الذي يأتي بعد ذلك: ما الأداة التي يجب أن تضعها في مشروعك؟ وهل تحتاج منصة كاملة مثل SonarQube أو Qodana، أم يكفي مدقق جيد لكل لغة؟ وهل تستضيفها على سيرفرك أم تدفع اشتراكاً سحابياً؟

المواضيع في السلسلة:

- [ما هي جودة الكود Code Quality وكيف تقيسها؟](https://arabroot.io/articles/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AC%D9%88%D8%AF%D8%A9-%D8%A7%D9%84%D9%83%D9%88%D8%AF-code-quality-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D9%82%D9%8A%D8%B3%D9%87%D8%A7/): المعنى والمقاييس وبوابات الجودة، ولماذا يحتاج كود الذكاء الاصطناعي إلى انتباه خاص.
- **أدوات جودة الكود: أيها تختار لفريقك؟** (الموضوع الحالي): أدوات كل لغة والمنصات الكاملة وأسعارها وتراخيصها، وتجربة على المستودع نفسه.
- [أداة SonarQube عملياً](https://arabroot.io/articles/sonarqube-%D8%B9%D9%85%D9%84%D9%8A%D8%A7-%D8%A8%D9%88%D8%A7%D8%A8%D8%A9-%D8%AC%D9%88%D8%AF%D8%A9-%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/): التثبيت مع PostgreSQL والماسحات وملفات القواعد Quality Profiles والبوابات وCI، وأدوات Sonar للوكلاء الأذكياء AI Agents.

وسوف نناقش في هذا المقال ما يلي:

- العائلات الأربع لأدوات الجودة، ولماذا لا تتنافس كلها مع بعضها.
- أدوات كل لغة: Ruff وPylint وESLint وgolangci-lint وأدوات Java وRuboCop، وإطار pre-commit الذي يجمعها.
- الأدوات التي تشغل أدوات أخرى: MegaLinter وQlty CLI.
- المنصات الكاملة: SonarQube بنسخها وQodana وCodacy وDeepSource وQlty Cloud، مع التراخيص والاستضافة الذاتية والأسعار كما هي في 12 أكتوبر 2026.
- محرك الأنماط Semgrep، وأين يفيد في الجودة وليس الأمان فقط.
- تجربة حقيقية: ست أدوات على مستودع المتجر نفسه، وجدول بما وجده كل واحد من المشاكل الست.
- جدول قرار يساعدك على الاختيار حسب حجم فريقك وقيودك.

ولاحظ أن هذا المقال عن الجودة، أما أدوات الأمان مثل CodeQL وBandit وSpotBugs مع FindSecBugs فقد قارناها في [مقال تحليل الكود الثابت SAST](https://arabroot.io/articles/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%AB%D8%A7%D8%A8%D8%AA-sast-%D9%85%D8%B9-semgrep-%D9%88-sonarqube/)، ولن نكررها هنا. وهذه المقالات التي تكمل هذا المقال:

[![](https://arabroot.io/content/images/2026/10/code-quality-cover-cover.webp)دليلما هي جودة الكود Code Quality وكيف تقيسها؟ما الذي يجعل الكود سهل التغيير، وماذا تقيس أدوات الفحص فعلاً، ولماذا يحتاج كود الوكلاء الأذكياء إلى بوابة جودة.](https://arabroot.io/articles/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AC%D9%88%D8%AF%D8%A9-%D8%A7%D9%84%D9%83%D9%88%D8%AF-code-quality-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D9%82%D9%8A%D8%B3%D9%87%D8%A7/)[![](https://arabroot.io/content/images/2026/10/sast-cover-cover.webp)دليلSAST: كيف يجد تحليل الكود الثابت الثغرات قبل التشغيلكيف تقرأ أداة SAST الكود بحثاً عن الثغرات، وما الذي لا تراه أبداً، وكيف تمنع الإنذارات الخاطئة من أن تفقد الفريق ثقته بها.](https://arabroot.io/articles/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%AB%D8%A7%D8%A8%D8%AA-sast-%D9%85%D8%B9-semgrep-%D9%88-sonarqube/)[![](https://arabroot.io/content/images/2026/10/sonarqube-cover-cover.webp)دليلSonarQube عملياً: بوابة جودة لكود الذكاء الاصطناعيكيف تثبت SonarQube مع PostgreSQL وتضبط قواعده وبوابته، ثم تجعل الوكيل الذكي يقرأ نتيجتها ويصلح كوده حتى تنجح.](https://arabroot.io/articles/sonarqube-%D8%B9%D9%85%D9%84%D9%8A%D8%A7-%D8%A8%D9%88%D8%A7%D8%A8%D8%A9-%D8%AC%D9%88%D8%AF%D8%A9-%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/)[![](https://arabroot.io/content/images/2026/10/devsecops-cover-cover.webp)دليلDevSecOps للمبتدئين: الأمن داخل خط CI/CD ومتى يعمل كل فحصما الذي يجده كل فحص أمني في خط CI/CD وما الذي يفوته، وكيف ترتب نتائجه حتى تصل إلى قرار بدل قائمة طويلة.](https://arabroot.io/articles/devsecops-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-sast-%D9%88-dast-%D9%88-sca/)

## أربع عائلات من الأدوات، ولكل واحدة مكان

أكثر خطأ نراه عند اختيار أداة الجودة أن الفريق يقارن SonarQube بالمدقق ESLint كأنهما بديلان، مع أن الأول يستخدم الثاني أحياناً كمصدر للنتائج. والصورة التالية تبين العائلات الأربع وكيف تتصل ببعضها:

![أربع عائلات من أدوات الجودة: أدوات كل لغة مثل Ruff وESLint وgolangci-lint وPMD وRuboCop، وأدوات التشغيل الجامعة مثل pre-commit وMegaLinter وQlty CLI التي تشغل أدوات اللغات، ومحركات الأنماط مثل Semgrep للقواعد المخصصة، والمنصات الكاملة مثل SonarQube وQodana وCodacy وDeepSource وQlty Cloud التي تحفظ التاريخ وتطبق بوابة الجودة، والأسهم تبين أن المنصات تستورد نتائج أدوات اللغات](https://arabroot.io/content/images/2026/10/code-quality-tools-01-families.webp)

أدوات اللغات تجد المشاكل، والأدوات الجامعة تشغلها معاً، والمنصات تحفظ التاريخ وتقرر عبر بوابة الجودة Quality Gate

- **أدوات كل لغة:** مدقق واحد للغة واحدة، سريع ومجاني ومفتوح المصدر غالباً، ويعمل في المحرر وفي pre-commit وفي CI.
- **أدوات التشغيل الجامعة:** لا تجد شيئاً بنفسها تقريباً، وإنما تشغل عشرات أدوات اللغات بإعداد واحد، وتوحد مخرجاتها.
- **محركات الأنماط:** مثل Semgrep، وقيمتها أنك تكتب قاعدة لنمط خاص بمشروعك في دقائق.
- **المنصات الكاملة:** سيرفر أو خدمة سحابية تحفظ نتائج كل تحليل، وتحسب التكرار والتعقيد والدين التقني Technical Debt، وتطبق بوابة الجودة Quality Gate على الكود الجديد، وتعرض النتيجة في طلب الدمج.

## أدوات كل لغة

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

| اللغة                      | الأداة                                                                                                                                                                                                     | الترخيص                                                          | آخر إصدار                | ملاحظات                                                                                          |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------ |
| لغة Python                 | [أداة Ruff](https://github.com/astral-sh/ruff?ref=arabroot.io)                                                                                                                                             | رخصة MIT                                                         | الإصدار 0.17.0           | مكتوبة بلغة Rust، وتجمع قواعد Flake8 وPylint وisort وغيرها، وفيها أداة تنسيق                     |
| لغة Python                 | [أداة Pylint](https://github.com/pylint-dev/pylint?ref=arabroot.io)                                                                                                                                        | رخصة GPL-2.0                                                     | الإصدار 4.1.3            | أبطأ، ولكنها تفهم الأنواع والكلاسات أعمق، وتعطي درجة من 10                                       |
| لغة JavaScript وTypeScript | [أداة ESLint](https://github.com/eslint/eslint?ref=arabroot.io)                                                                                                                                            | رخصة MIT                                                         | الإصدار 10.12.0          | المعيار في عالم JavaScript، والإضافات Plugins كثيرة جداً، والبديل الأسرع Biome بترخيص Apache-2.0 |
| لغة Go                     | [أداة golangci-lint](https://github.com/golangci/golangci-lint?ref=arabroot.io)                                                                                                                            | رخصة GPL-3.0                                                     | متجددة                   | تشغل عشرات المدققات في عملية واحدة                                                               |
| لغة Java                   | [أداة PMD](https://github.com/pmd/pmd?ref=arabroot.io) و[أداة Checkstyle](https://github.com/checkstyle/checkstyle?ref=arabroot.io) و[أداة SpotBugs](https://github.com/spotbugs/spotbugs?ref=arabroot.io) | ترخيص BSD بأسلوب خاص لأداة PMD، ورخصة LGPL-2.1 للأداتين الأخريين | الإصدار 7.28.0 لأداة PMD | الأولى للأنماط والتكرار عبر CPD، والثانية لأسلوب الكتابة، والثالثة تقرأ الكود المترجم Bytecode   |
| لغة Ruby                   | [أداة RuboCop](https://github.com/rubocop/rubocop?ref=arabroot.io)                                                                                                                                         | رخصة MIT                                                         | متجددة                   | مدقق وأداة تنسيق في أداة واحدة                                                                   |

وأداة [pre-commit](https://pre-commit.com/?ref=arabroot.io) بترخيص MIT ليست مدققاً، وإنما إطار يشغل هذه الأدوات قبل كل Commit على الملفات المعدلة فقط، ويثبت لكل أداة بيئتها بإصدار محدد في ملف `.pre-commit-config.yaml`، فيضمن أن كل مطور في الفريق يشغل الإصدار نفسه.

**نقاط القوة:** مجانية، وسريعة جداً، وتعمل دون سيرفر، وتصلح كثيراً من المشاكل تلقائياً بالخيار `--fix`.

**نقاط الضعف:** كل أداة ترى ملفاً أو دالة، فلا تحسب التكرار بين الملفات، ولا تحفظ التاريخ، ولا تعرف ما الكود الجديد وما القديم، ولكل لغة أداة بإعداد مختلف.

## الأدوات الجامعة: MegaLinter وQlty CLI

عندما يكون المستودع بخمس لغات، ومعه ملفات YAML وDockerfile وMarkdown، يصبح إعداد خمسة عشر مدققاً عملاً مستقلاً، وهنا تفيد الأدوات الجامعة.

### أداة MegaLinter

مشروع [MegaLinter](https://github.com/oxsecurity/megalinter?ref=arabroot.io) من شركة OX Security بترخيص AGPL-3.0، وآخر إصدار له 10.1.0، وهو Docker Image واحد فيه عشرات المدققات لكل اللغات، تشغله في CI فيكتشف لغات المستودع ويشغل المدققات المناسبة، ويخرج تقريراً واحداً. والترخيص AGPL لا يؤثر عليك إذا شغلته كأداة في CI دون أن تعدله وتقدمه كخدمة للآخرين.

**نقاط القوة:** إعداد واحد لكل اللغات، ومجاني بالكامل، ويعمل في أي نظام CI.

**نقاط الضعف:** ال Image الكامل كبير جداً، لذلك لم نشغله في تجربتنا على جهاز واحد مع SonarQube، والمشروع يوفر نسخاً مخففة لكل لغة لهذا السبب، وليس فيه تاريخ ولا تكرار بين الملفات ولا بوابة على الكود الجديد.

### أداة Qlty CLI

شركة Qlty هي الشركة التي كانت تقدم خدمة Code Climate Quality، وعنوان `codeclimate.com/quality` يحول اليوم مباشرة إلى موقع [qlty.sh](https://qlty.sh/?ref=arabroot.io). وأداة سطر الأوامر [Qlty CLI](https://github.com/qltysh/qlty?ref=arabroot.io) مكتوبة بلغة Rust، وتشغل عشرات المدققات مثل Ruff وBandit وESLint، ومعها محلل Sonar للغة Python تحت اسم radarlint، وتضيف من عندها حساب التكرار والتعقيد. ولاحظ الترخيص جيداً: هو Business Source License 1.1، أي أن الكود مفتوح للقراءة ولكنه ليس ترخيصاً مفتوح المصدر، ويسمح لك باستخدامه بشرط ألا تبني به خدمة جودة كود تجارية أو خدمة برمجة بالذكاء الاصطناعي، ويتحول إلى GPL-3.0 في تاريخ التغيير المكتوب في ملف الترخيص وهو 10 ديسمبر 2028.

**نقاط القوة:** أمر واحد يشغل المدققات ويحسب التكرار والتعقيد محلياً دون حساب، وفي تجربتنا كانت الأداة الوحيدة التي وجدت النسخة المنسوخة.

**نقاط الضعف:** الترخيص ليس مفتوح المصدر، وأول تشغيل بطيء لأنه ينزل المدققات، والتاريخ ولوحة الفريق في الخدمة السحابية فقط.

## المنصات الكاملة

المنصة هي ما تحتاجه عندما تريد أن يرى المدير اتجاه الجودة عبر الأشهر، وأن تمنع بوابة الجودة Quality Gate دمج الكود الجديد السيئ في كل المشاريع بقاعدة واحدة. وكل الأسعار التالية كما هي منشورة في صفحات الأسعار في 12 أكتوبر 2026، وقد تتغير بعد ذلك.

### منصة SonarQube

تقدم شركة Sonar المنصة بثلاثة أشكال، والتفاصيل العملية لكل نسخة في [المقال الثالث من السلسلة](https://arabroot.io/articles/sonarqube-%D8%B9%D9%85%D9%84%D9%8A%D8%A7-%D8%A8%D9%88%D8%A7%D8%A8%D8%A9-%D8%AC%D9%88%D8%AF%D8%A9-%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/):

- **النسخة المجانية Community Build:** بترخيص LGPL-3.0 كما في [مستودعها](https://github.com/SonarSource/sonarqube?ref=arabroot.io)، تستضيفها على سيرفرك، وتحلل فرعاً واحداً، ولا تحلل طلبات الدمج ولا الفروع، ولا تحتوي على تحليل التلوث Taint Analysis.
- **النسخ التجارية SonarQube Server:** وهي Developer وEnterprise وData Center، وتذكر [صفحة الأسعار](https://www.sonarsource.com/plans-and-pricing/sonarqube/?ref=arabroot.io) أنها تسعر لكل سيرفر في السنة حسب عدد أسطر الكود، ولا تنشر الصفحة رقماً ثابتاً، وإنما تجربة مجانية أو تواصل مع المبيعات. ونسخة Developer تضيف تحليل الفروع وطلبات الدمج ومزايا الكود المكتوب بالذكاء الاصطناعي، ونسخة Enterprise تضيف AI CodeFix ولغات أكثر.
- **الخدمة السحابية SonarQube Cloud:** مجانية للمشاريع الخاصة حتى 50 ألف سطر، وخطة Team تبدأ من 34 دولاراً في الشهر حتى 100 ألف سطر، وEnterprise بسعر خاص، كما في [صفحة خطط SonarQube](https://www.sonarsource.com/plans-and-pricing/?ref=arabroot.io)، والمشاريع العامة مفتوحة المصدر مجانية.

**نقاط القوة:** أكثر من 30 لغة، وفكرة الكود الجديد وبوابة الجودة Quality Gate هي الأنضج، والنسخة المجانية تستضاف بالكامل على سيرفرك، واستيراد تقارير Ruff وESLint وPylint كمشاكل خارجية، وأدوات للوكلاء الأذكياء مثل سيرفر MCP.

**نقاط الضعف:** السيرفر يحتاج 4GB من الذاكرة على الأقل مع Elasticsearch مدمج وقاعدة بيانات، وأهم ميزة للفرق، أي تحليل طلبات الدمج، ليست في النسخة المجانية، وقواعد Sonar way الافتراضية متحفظة كما سوف ترى في التجربة.

### منصة Qodana من JetBrains

منصة [Qodana](https://www.jetbrains.com/qodana/?ref=arabroot.io) تشغل محركات الفحص نفسها الموجودة في IntelliJ IDEA وPyCharm وRider داخل CI، فإذا كان فريقك يعمل على محررات JetBrains فسوف يرى في CI ما يراه في المحرر. وأداة سطر الأوامر [qodana-cli](https://github.com/JetBrains/qodana-cli?ref=arabroot.io) بترخيص Apache-2.0 وآخر إصدار لها 2026.2.2، أما المحللات نفسها فلها تراخيص Qodana. وتذكر [صفحة الترخيص](https://www.jetbrains.com/help/qodana/pricing.html?ref=arabroot.io) ثلاثة مستويات: Community مجاني لمحللات JVM وAndroid وPython و.NET وC/C++، وUltimate وUltimate Plus مدفوعان لكل مساهم نشط Active Contributor، وهو كل من أرسل Commit في آخر 90 يوماً، بحد أدنى ثلاثة مساهمين. وفي [صفحة الشراء](https://www.jetbrains.com/qodana/buy/?ref=arabroot.io) سعر Ultimate هو 60 دولاراً في السنة لكل مساهم، وUltimate Plus هو 180 دولاراً في السنة.

**نقاط القوة:** النتائج نفسها التي يراها المطور في محرر JetBrains، وفحوص عميقة لـ Java وKotlin، ومستوى مجاني لعدة لغات.

**نقاط الضعف:** لوحة النتائج والتاريخ في Qodana Cloud، والقيمة الكاملة تظهر مع محررات JetBrains، والفريق الذي يعمل على VS Code يستفيد أقل.

### منصة Codacy

منصة [Codacy](https://www.codacy.com/pricing?ref=arabroot.io) سحابية فقط، وتذكر صفحة الأسعار أن خطة Developer مجانية للمطور الفرد عبر إضافة المحرر، وأن خطة Team تبدأ من 18 دولاراً لكل مطور في الشهر بالدفع السنوي أو 21 دولاراً بالدفع الشهري، حتى 30 مطوراً، وأن خطة Business بسعر خاص. وتقول الصفحة نفسها إنها لا تدعم المستودعات المستضافة على سيرفرات Git داخلية On-premise، أي أنها لا تناسبك إذا كان كودك على Gitea على سيرفرك. وأداة التحليل المحلية [codacy-analysis-cli](https://github.com/codacy/codacy-analysis-cli?ref=arabroot.io) بترخيص AGPL-3.0.

**نقاط القوة:** إعداد سريع مع GitHub وGitLab وBitbucket، وتجمع الجودة والأمان في لوحة واحدة.

**نقاط الضعف:** لا توجد استضافة ذاتية، ولا تدعم Git الداخلي، والكود يحلل على سيرفرات الشركة.

### منصة DeepSource

تعلن [صفحة DeepSource](https://deepsource.com/pricing?ref=arabroot.io) أن الشركة انضمت إلى Harness، وأن خطة Team بسعر 24 دولاراً لكل مستخدم في الشهر بالدفع السنوي، مع رصيد سنوي للمراجعة بالذكاء الاصطناعي AI Review، وأن الاستضافة الذاتية والتشغيل دون اتصال بالإنترنت Air-gapped متاحان في خطة Enterprise بسعر خاص فقط. وأداة سطر الأوامر [DeepSource CLI](https://github.com/DeepSourceCorp/cli?ref=arabroot.io) بترخيص BSD-2-Clause، ولكنها واجهة للخدمة وليست محللاً مستقلاً.

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

**نقاط الضعف:** تكلفة المراجعة بالذكاء الاصطناعي تحسب حسب الأسطر المعالجة فوق الاشتراك، والاستضافة الذاتية للشركات الكبيرة فقط.

### منصة Qlty Cloud

تذكر [صفحة أسعار Qlty](https://qlty.sh/pricing?ref=arabroot.io) خطة مجانية بعدد غير محدود من المساهمين و1000 دقيقة تحليل في الشهر، وخطة Pro بسعر 20 دولاراً لكل مساهم في الشهر، وخطة Enterprise بسعر 30 دولاراً لكل مساهم في الشهر، وتضيف الخدمة التغطية عبر الزمن وحالة النجاح والفشل في طلب الدمج.

**نقاط القوة:** الأداة المحلية نفسها تعمل في CI وعلى جهاز المطور، والخطة المجانية واسعة.

**نقاط الضعف:** لا توجد استضافة ذاتية للوحة، وترخيص الأداة ليس مفتوح المصدر.

## محرك الأنماط Semgrep للجودة

شرحنا Semgrep بالتفصيل كأداة أمان في [مقال SAST](https://arabroot.io/articles/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%AB%D8%A7%D8%A8%D8%AA-sast-%D9%85%D8%B9-semgrep-%D9%88-sonarqube/#semgrep)، بما في ذلك أن المحرك بترخيص LGPL-2.1 وأن القواعد لها ترخيص آخر. وما يهمنا هنا أن قواعد السجل Registry العامة للجودة قليلة، فقيمة Semgrep في الجودة تأتي من القواعد التي تكتبها أنت لأنماط مشروعك، مثل «لا تستدعي قاعدة البيانات من طبقة العرض» أو «لا تبتلع الاستثناءات»، وكتابة قاعدة كهذه تستغرق دقائق كما سوف ترى في التجربة.

## تجربة عملية: ست أدوات على مستودع واحد

نستخدم مستودع المتجر من [المقال الأول](https://arabroot.io/articles/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AC%D9%88%D8%AF%D8%A9-%D8%A7%D9%84%D9%83%D9%88%D8%AF-code-quality-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D9%82%D9%8A%D8%B3%D9%87%D8%A7/#lab-repo) بمشاكله الست من Q1 إلى Q6، ومعه ملف `web/cart.js` فيه متغير غير مستخدم و`var` ومقارنة `==` و`catch` فارغ. وكل أداة تعمل في Container باسم يبدأ بالبادئة `lab-cq-` وبإصدار مثبت، وأرقام الزمن أدناه توضيحية من جهاز واحد عليه Docker Desktop، وليست قياساً دقيقاً.

### المدققان Ruff وPylint

نتيجة Ruff بالإعداد الافتراضي ثم بعد تفعيل قاعدتين رأيناها في المقال الأول، 8 ثم 9 مشاكل. أما Pylint فنشغله بإعداده الافتراضي:

```bash
docker exec lab-cq-py bash -c "cd /work && time pylint shop tests --score=y"
```

والمخرج سوف يكون كما يلي، بعد حذف رسائل التوثيق المتكررة:

```text
************* Module shop.pricing
shop/pricing.py:4:0: C0116: Missing function or method docstring (missing-function-docstring)
shop/pricing.py:4:0: R0912: Too many branches (17/12) (too-many-branches)
************* Module shop.discounts
shop/discounts.py:17:4: R1730: Consider using 'discount = min(discount, 500)' instead of unnecessary if block (consider-using-min-builtin)
shop/discounts.py:36:4: R1730: Consider using 'discount = min(discount, 800)' instead of unnecessary if block (consider-using-min-builtin)
************* Module shop.storage
shop/storage.py:7:0: W0102: Dangerous default value [] as argument (dangerous-default-value)
shop/storage.py:13:11: W0718: Catching too general exception Exception (broad-exception-caught)
shop/storage.py:22:7: C0121: Comparison 'data == None' should be 'data is None' (singleton-comparison)
shop/storage.py:3:0: W0611: Unused import os (unused-import)
shop/storage.py:4:0: W0611: Unused import sys (unused-import)

-----------------------------------
Your code has been rated at 7.98/10

real	0m4.712s
```

في المخرج أعلاه لاحظ التالي:

- أخرج Pylint 20 رسالة، منها 11 رسالة عن غياب التوثيق Docstring، وهذا مثال واضح على الضجيج الذي يجعل الفريق يتجاهل الأداة إذا لم يضبط إعدادها.
- وجد الدالة المعقدة Q1 بطريقة مختلفة، أي بعدد الفروع 17 من حد 12، ووجد ابتلاع الخطأ Q4 والقيمة الافتراضية Q5 والمقارنة مع None.
- لم يجد التكرار Q3، والسبب أن قاعدة `duplicate-code` في Pylint تقارن الملفات ببعضها، والنسختان هنا في الملف نفسه.
- استغرق قرابة خمس ثوان، أي عدة أضعاف Ruff على المشروع نفسه، وهذا الفرق يكبر مع حجم المشروع.

### المدقق ESLint على ملف JavaScript

نضيف ملف إعداد بسيط يأخذ القواعد الموصى بها ويضيف ثلاث قواعد:

```javascript
import js from "@eslint/js";

export default [
  js.configs.recommended,
  {
    files: ["web/**/*.js"],
    rules: {
      eqeqeq: "error",
      "no-var": "error",
      complexity: ["warn", 10],
    },
  },
];
```

ثم نشغله داخل Container لـ Node.js:

```bash
docker run --rm --name lab-cq-eslint -v "$PWD:/src:ro" node:24.21.0-alpine3.24 sh -c \
  "mkdir /w && cp -r /src/web /src/eslint.config.js /src/package.json /w/ && cd /w && npm install --silent && npx eslint web"
```

والمخرج سوف يكون كما يلي:

```text
/w/web/cart.js
   3:7   error  'unused' is assigned a value but never used  no-unused-vars
   5:8   error  Unexpected var, use let or const instead     no-var
   6:22  error  Expected '===' and instead saw '=='          eqeqeq
  17:12  error  'e' is defined but never used                no-unused-vars
  17:15  error  Empty block statement                        no-empty

✖ 5 problems (5 errors, 0 warnings)
```

وجد ESLint كل ما وضعناه في الملف، ولاحظ أن قاعدتي `eqeqeq` و`no-var` ليستا في القواعد الموصى بها، فلولا أننا أضفناهما لما ظهرت المقارنة `==`.

### محرك Semgrep بقواعد السجل ثم بقاعدة مخصصة

نشغل Semgrep بقواعد الجودة من السجل للغتين، أي قواعد أفضل الممارسات Best Practice والصحة Correctness وقابلية الصيانة Maintainability:

```bash
docker run --rm --name lab-cq-semgrep -v "$PWD:/src" -w /src semgrep/semgrep:1.180.0 semgrep scan --metrics=off \
  --config r/python.lang.best-practice --config r/python.lang.correctness --config r/python.lang.maintainability \
  --config r/javascript.lang.best-practice --config r/javascript.lang.correctness .
```

ومن المخرج نأخذ الخلاصة:

```text
    shop/storage.py
   ❯❯❱ python.lang.correctness.common-mistakes.default-mutable-list.default-mutable-list
          Function save_order mutates default list history. ...
            9┆ history.append(order["id"])

 • Findings: 1 (1 blocking)
 • Rules run: 60
Ran 60 rules on 5 files: 1 finding.
```

نتيجة واحدة من 60 قاعدة، وهي Q5، وهذا متوقع لأن قواعد السجل العامة مكتوبة للأمان أكثر من الجودة. والآن نكتب قاعدة لنمط ابتلاع الخطأ الذي يهمنا، في ملف `semgrep-quality.yaml`:

```yaml
rules:
  - id: swallowed-exception
    languages: [python]
    severity: ERROR
    message: >-
      The exception is caught and ignored, so the caller never learns that the
      operation failed. Log it and re-raise, or catch a specific exception.
    pattern-either:
      - pattern: |
          try:
              ...
          except Exception:
              pass
      - pattern: |
          try:
              ...
          except:
              pass
```

وعند تشغيلها بالخيار `--config semgrep-quality.yaml` سوف تجد أنها أمسكت Q4:

```text
    shop/storage.py
   ❯❯❱ swallowed-exception
          The exception is caught and ignored, so the caller never learns that the operation failed. Log it
          and re-raise, or catch a specific exception.
           10┆ try:
           11┆     with open(path, "w", encoding="utf-8") as f:
           12┆         json.dump(order, f)
           13┆ except Exception:
           14┆     # Q4: the error is swallowed, the caller thinks the order was saved
           15┆     pass

Ran 1 rule on 4 files: 1 finding.
```

ولاحظ أن القاعدة لا تطابق `except Exception: logger.error(e)` ثم المتابعة، وهي حالة ابتلاع أيضاً، فإذا أردت أن تمسكها فيجب أن تضيف نمطاً ثالثاً، وهذا هو الثمن الدائم للقواعد المخصصة: أنت من يصونها.

### الأداة الجامعة Qlty CLI

نثبت Qlty CLI داخل Container مستقل من سكربت التثبيت الرسمي، ثم نشغل `qlty init` فتكتشف الأداة اللغات وتنشئ ملف إعداد فيه المدققات المناسبة، ثم نشغل الفحص والروائح Smells:

```bash
docker exec lab-cq-qlty bash -c "cd /w && qlty init --yes && qlty check --all --no-formatters && qlty smells --all --no-snippets"
```

ومن مخرج `qlty check` نأخذ ملخص المشاكل:

```text
shop/pricing.py:4:4
    4:4  high    Refactor this function to reduce its Cognitive Complexity from 38 to the 15 allowed.  radarlint-python:python:S3776
  34:34  medium  Either remove or fill this block of code.                                             radarlint-python:python:S108

shop/storage.py:3:3
    3:3  medium  `os` imported but unused                                                                       ruff:F401
    4:4  medium  `sys` imported but unused                                                                      ruff:F401
    7:7  high    Change this default value to "None" and initialize this parameter inside the function/method.  radarlint-python:python:S5717
  13:15  high    Try, Except, Pass detected.                                                                    bandit:B110
  22:22  medium  Comparison to `None` should be `cond is None`                                                  ruff:E711

✖ 12 issues
✖ 4 security issues

real	0m44.033s
```

ومخرج `qlty smells` سوف يكون كما يلي:

```text
shop/discounts.py
   6  Found 16 lines of similar code in 2 locations (mass = 88)
        also found at shop/discounts.py
  25  Found 16 lines of similar code in 2 locations (mass = 88)
        also found at shop/discounts.py

shop/pricing.py
  16  Deeply nested control flow (level = 5)
   4  Function with high complexity (count = 38): calculate_total
```

في المخرج أعلاه لاحظ التالي:

- هذه أول أداة في السلسلة تجد التكرار Q3، أي 16 سطراً متشابهة في مكانين بكتلة حجمها 88.
- كل مشكلة تحمل اسم المدقق الذي وجدها، فهناك نتائج من Ruff ومن Bandit ومن محلل Sonar، أي أن الأداة جمعت ثلاثة مدققات بأمر واحد.
- من المشاكل الاثنتي عشرة ثلاث رسائل من Bandit عن استخدام `assert` في ملف الاختبارات، وهي رسالة لا معنى لها في اختبارات pytest، وهذا ضجيج يجب أن تستبعده في الإعداد.
- لم تفحص ملف JavaScript، والسبب أن `qlty init` لم يفعل ESLint لأن المستودع ليس فيه `node_modules`، فالاكتشاف التلقائي ليس بديلاً عن مراجعة ملف الإعداد.
- استغرق التشغيل الأول 44 ثانية، وأغلبها في تنزيل المدققات.

### منصة SonarQube Community Build

شغلنا SonarQube Community Build مع PostgreSQL كما في [المقال الثالث](https://arabroot.io/articles/sonarqube-%D8%B9%D9%85%D9%84%D9%8A%D8%A7-%D8%A8%D9%88%D8%A7%D8%A8%D8%A9-%D8%AC%D9%88%D8%AF%D8%A9-%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/#install)، ثم حللنا المستودع بالماسح SonarScanner مع تقرير التغطية من pytest-cov، فكانت النتيجة ست مشاكل:

```text
shop/pricing.py 4 python:S3776 MAINTAINABILITY:HIGH | Refactor this function to reduce its Cognitive Complexity from 38 to the 15 allowed.
shop/pricing.py 34 python:S108 MAINTAINABILITY:MEDIUM | Either remove or fill this block of code.
shop/storage.py 7 python:S5717 MAINTAINABILITY:HIGH | Change this default value to "None" and initialize this parameter inside the function/method.
web/cart.js 3 javascript:S1481 MAINTAINABILITY:LOW | Remove the declaration of the unused 'unused' variable.
web/cart.js 5 javascript:S3504 MAINTAINABILITY:HIGH | Unexpected var, use let or const instead.
web/cart.js 5 javascript:S4138 MAINTAINABILITY:LOW | Expected a `for-of` loop instead of a `for` loop with this simple iteration.
```

ومن مقاييس المشروع: التغطية 31% والتكرار 0.0% والدين التقني Technical Debt 53 دقيقة بنسبة 1.7% وتقييم قابلية الصيانة A. وهذه النتيجة فيها ثلاث مفاجآت يجب أن تعرفها قبل أن تعتمد على الإعداد الافتراضي:

- التكرار 0.0% رغم النسخة المنسوخة، والسبب في [تعريف المقاييس](https://docs.sonarsource.com/sonarqube-community-build/user-guide/code-metrics/metrics-definition?ref=arabroot.io): في اللغات غير Java لا تعتبر الكتلة مكررة إلا إذا كانت 100 رمز Token متتالية على الأقل موزعة على 10 أسطر، وكتلتنا أصغر من ذلك، أما Qlty فحدها أقل فوجدتها.
- ابتلاع الخطأ Q4 والاستيراد غير المستخدم والمقارنة مع None لم تظهر، لأن القواعد المقابلة غير مفعلة في ملف القواعد Quality Profile الافتراضي Sonar way، فقاعدة الاستيراد `python:S1128` مثلاً موجودة ولكنها غير مفعلة، ولم نجد في محلل Python قاعدة للاستثناء المتجاهل أصلاً.
- في ملف JavaScript لم يظهر `==` ولا `catch` الفارغ، فقاعدة `javascript:S1440` غير مفعلة في Sonar way.

والحل الذي سوف نطبقه في المقال الثالث له جزءان: ملف قواعد خاص بالفريق يرث Sonar way ويفعل ما ينقصه، واستيراد تقرير Ruff إلى SonarQube كمشاكل خارجية External Issues، فتجتمع سرعة المدقق ولوحة المنصة في مكان واحد.

### ماذا وجدت كل أداة؟

| المشكلة                              | أداة Ruff            | أداة Pylint     | محرك Semgrep                                    | أداة Qlty CLI            | منصة SonarQube             |
| ------------------------------------ | -------------------- | --------------- | ----------------------------------------------- | ------------------------ | -------------------------- |
| Q1 الدالة المعقدة                    | نعم بعد تفعيل C901   | نعم بعدد الفروع | لا                                              | نعم بالتعقيد الإدراكي 38 | نعم بالتعقيد الإدراكي 38   |
| Q2 الأرقام السحرية                   | فقط إذا فعلت PLR2004 | لا              | لا                                              | لا                       | لا                         |
| Q3 التكرار                           | لا                   | لا              | لا                                              | نعم، 16 سطراً            | لا، تحت حد 100 رمز         |
| Q4 ابتلاع الخطأ                      | نعم                  | نعم             | بالقاعدة المخصصة فقط                            | نعم عبر Bandit           | لا بالإعداد الافتراضي      |
| Q5 القيمة الافتراضية القابلة للتغيير | نعم                  | نعم             | نعم                                             | نعم                      | نعم                        |
| Q6 اختبار بلا تحقق                   | لا                   | لا              | لا                                              | لا                       | لا                         |
| ملف JavaScript                       | لا يدعمه             | لا يدعمه        | لا شيء                                          | لم يفعل ESLint           | 3 مشاكل من 4               |
| الزمن التقريبي                       | أقل من ثانية         | 5 ثوان          | قرابة 25 ثانية في تشغيل بقواعد السجل مع تنزيلها | 44 ثانية في أول تشغيل    | دقيقة ونصف تقريباً للتحليل |

والدرس من الجدول أن كل أداة أخطأت شيئاً، وأن الاختبار الذي لا يتحقق من شيء Q6 لم تجده أي أداة، فهو مسؤولية المراجعة واختبار الطفرات Mutation Testing الذي شرحناه في [مقال الاختبارات التي يكتبها الذكاء الاصطناعي](https://arabroot.io/articles/%D8%A7%D8%AA%D9%85%D8%AA%D8%A9-%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A8%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/). ولاحظ أيضاً أن الإعداد الافتراضي في كل أداة غير كاف، فالفرق بين أداة جيدة وأداة مزعجة هو ساعة تقضيها في ملف الإعداد.

## كيف تختار؟ جدول القرار

| وضعك                                                                | ما ننصح به                                                            | والسبب                                                                          |
| ------------------------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| مطور وحده أو فريق صغير بلغة واحدة                                   | مدقق اللغة مع pre-commit وCI                                          | مجاني وسريع، ولا يحتاج سيرفراً، ويغطي أغلب المشاكل اليومية                      |
| فريق بعدة لغات دون ميزانية                                          | مدققات اللغات مع MegaLinter أو Qlty CLI في CI                         | إعداد واحد لكل اللغات، وQlty تضيف التكرار والتعقيد                              |
| كود على Gitea أو GitLab داخلي ولا يجوز أن يخرج                      | النسخة المجانية SonarQube Community Build على سيرفرك                  | استضافة كاملة بترخيص LGPL، مع تاريخ وبوابة جودة، مع قبول أنها تحلل فرعاً واحداً |
| فريق يحتاج نتيجة بوابة الجودة Quality Gate في كل طلب دمج على سيرفره | النسخة التجارية SonarQube Server Developer                            | تحليل الفروع وطلبات الدمج هو ما ينقص النسخة المجانية                            |
| الفريق كله على محررات JetBrains                                     | منصة Qodana                                                           | النتائج نفسها في المحرر وفي CI                                                  |
| كود على GitHub ولا مانع من السحابة                                  | الخدمة السحابية SonarQube Cloud أو Codacy أو DeepSource أو Qlty Cloud | إعداد في دقائق وتحليل طلبات الدمج، وقارن السعر بعدد المطورين أو الأسطر          |
| نمط خاص بمشروعك تريد منعه                                           | قاعدة مخصصة في Semgrep أو في ESLint                                   | لا توجد منصة تعرف قواعد مشروعك                                                  |

## أخطاء شائعة

- **شراء منصة قبل المدقق:** المنصة لا تغني عن مدقق في المحرر، فبدونه يصل كل خطأ بسيط إلى CI ويضيع وقت الجميع.
- **الثقة بالإعداد الافتراضي:** رأيت في الجدول أن كل أداة أخطأت شيئاً بإعدادها الافتراضي، فاقرأ ملف القواعد Quality Profile وعدله مرة واحدة بعناية.
- **تشغيل أداتين على القاعدة نفسها:** إذا وجد Ruff الاستيراد غير المستخدم ووجدته SonarQube أيضاً، فسوف يصلح المطور المشكلة نفسها مرتين في لوحتين، فاختر لكل نوع من المشاكل مصدراً واحداً.
- **تجاهل الترخيص:** أداة بترخيص BSL أو AGPL مقبولة غالباً لاستخدام داخلي، ولكن اقرأ الشرط إذا كنت تبني خدمة لعملائك.
- **مقارنة الأسعار بوحدات مختلفة:** هناك من يسعر لكل مطور ومن يسعر لكل سطر كود ومن يسعر لكل مساهم نشط في 90 يوماً، فاحسب السعر على فريقك ومشروعك الحقيقيين.

## الخلاصة

- أدوات الجودة أربع عائلات: أدوات كل لغة، والأدوات الجامعة، ومحركات الأنماط، والمنصات الكاملة، والمنصات تستورد نتائج أدوات اللغات ولا تلغيها.
- ابدأ دائماً بمدقق اللغة في المحرر وpre-commit وCI، فهو مجاني وسريع ويجد أغلب المشاكل اليومية.
- أداة Qlty CLI وجدت التكرار في تجربتنا، وترخيصها BSL وليس مفتوح المصدر، وMegaLinter مجاني بترخيص AGPL ولكنه كبير.
- النسخة المجانية من SonarQube هي الخيار الوحيد بين المنصات الذي تستضيفه بالكامل دون اشتراك، وينقصها تحليل طلبات الدمج والفروع، وقواعدها الافتراضية تحتاج تعديلاً.
- منصات Codacy وDeepSource وQlty Cloud سحابية، وDeepSource تقدم الاستضافة الذاتية في خطة Enterprise فقط، وCodacy لا تدعم Git الداخلي.
- لم تجد أي أداة الاختبار الذي لا يتحقق من شيء، فهذا عمل المراجعة واختبار الطفرات.

وفي [المقال التالي والأخير من السلسلة](https://arabroot.io/articles/sonarqube-%D8%B9%D9%85%D9%84%D9%8A%D8%A7-%D8%A8%D9%88%D8%A7%D8%A8%D8%A9-%D8%AC%D9%88%D8%AF%D8%A9-%D9%84%D9%83%D9%88%D8%AF-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/) بإذن الله سوف نثبت SonarQube مع PostgreSQL، ونعدل ملف القواعد Quality Profile والبوابة، ونستورد تقرير Ruff، ثم نترك تعديلاً بأسلوب الوكيل الذكي يفشل في بوابة الجودة Quality Gate ونصلحه عبر سيرفر MCP حتى تنجح.

## سجل التحديثات

- أكتوبر 2026: كتابة المقال اعتماداً على مستودعات الأدوات وتراخيصها وصفحات الأسعار الرسمية لـ Sonar وJetBrains Qodana وCodacy وDeepSource وQlty كما كانت في 12 أكتوبر 2026، مع تجربة حقيقية على مستودع واحد بأدوات Ruff 0.17.0 وPylint 4.1.3 وESLint 10.12.0 وSemgrep 1.180.0 وQlty CLI 0.653.0 وSonarQube Community Build 26.9.