<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x645;&#x642;&#x627;&#x644;&#x627;&#x62A; &#x639;&#x627;&#x645;&#x629; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/general/page/3/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x645;&#x642;&#x627;&#x644;&#x627;&#x62A; &#x639;&#x627;&#x645;&#x629; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</description><language>ar</language><item><title>&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x623;&#x645;&#x627;&#x645;&#x64A;&#x629; &#x644;&#x645;&#x648;&#x627;&#x642;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628; Frontend Web Development</title><link>https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%85%D9%8A%D8%A9-frontend-web-development/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/------Frontend.png.7c8d8bf3133ff9f0cc597188f49f3225.png" /></p>
<p>
	يتضمن مجال تطوير الويب قسمين أساسين هما تطوير الواجهة الأمامية front-end (فرونت إند) وتطوير الواجهة الخلفية back-end (باك إند) وهما من المجالات الرائدة اليوم فجميع النشاطات التجارية والأشخاص يسعون للتواجد على شبكة الإنترنت ويحتاجون لمطوري ويب لإنشاء مدونات أو مواقع أو تطبيقات أو متاجر إلكترونية خاصة بهم.
</p>

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

<h2>
	ما هو تطوير الواجهة الأمامية Front End Web Development؟
</h2>

<p>
	قبل أن نشرح تطوير الواجهة الأمامية front-end تحتاج لأن تعرف مراحل بناء أي موقع إلكتروني، فإنشاء أي موقع أو تطبيق يبدأ بتحديد فكرته وتوثيقها، بعدها ترسل هذه الفكرة إلى مصمم الواجهات الأمامية الذي يرسم واجهات الموقع وصفحاته كلها بمختلف تفاصيلها وحالتها، حيث تُراجع هذه الواجهات ثم ترسل إلى مطور الواجهات لتكويدها وبرمجتها وهنا تقسم العملية إلى برمجة واجهات أمامية وخلفية وتبرمج كل واجهة وتتفاعل الواجهتان مع بعضهما للحصول على المواقع المتكامل.
</p>

<p>
	فمطور الواجهة الأمامية front end web developer أو ما يعرف بمطور واجهات المستخدم user interface developer هو المبرمج المسؤول عن إنشاء كافة الأجزاء المرئية التي يراها المستخدم ويتفاعل معها عند زيارة مواقع وتطبيقات الويب وبرمجة كافة الواجهات ومكوناتها من أزرار وقوائم ونصوص ورسومات وصور ونماذج وغيرها وتحديد كيف سيبدو كل جزء من موقع الويب وكيف سيتفاعل المستخدم معه.
</p>

<h2>
	الفرق بين تطوير الواجهة الأمامية front-end وتطوير الواجهة الخلفية back-end والتطوير الكامل Fullstack
</h2>

<p>
	من الضروري أن تفهم أبرز الفروقات بين تطوير الواجهة الأمامية وتطوير الواجهة الخلفية والتطوير الكامل والتي تعكس في واقع الأمر <strong>تخصصات تطوير الويب</strong> أو بمعنى آخر الدور الذي يساهم به مطور الويب عند بناء المواقع والتطبيقات والتقنيات التي يستخدمها لأداء عمله، كما أنها تعبر عن مكان تشغيل الشيفرات البرمجية لهذه المواقع والتطبيقات.
</p>

<p>
	بدايةً يجب أن تعرف أن عرض موقع الويب على جهازك يتم دومًا في <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">لغة HTML</a> وهي لغة توصيفية يستخدمها مطورو الويب لإنشاء وعرض الصفحات، هناك عدة تقنيات يمكنك إنشاء المواقع من خلالها لكن مهما كانت التقنية المستخدمة فإن عرض الموقع لديك في نهاية المطاف سيكون بلغة HTML.
</p>

<p>
	الآن يمكن أن تحدث عملية عرض ملفات المواقع مباشرة على جهازك كما في حال المواقع البسيطة ذات المحتوى الثابت فهي تخزن على <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">خادم الويب</a> بالأساس بشكل ملفات HTML وترسل لك هذه الملفات مباشرة عند طلبها وتعرض لك كما هي على متصفحك.
</p>

<p>
	من ناحية أخرى قد تتطلب عملية عرض المواقع بعض المعالجة المسبقة التي تحدث على جانب خادم الويب أو يسمى الخادم البعيد مثل مواقع الويب الديناميكية التي لا تعرض نفس المحتوى لجميع المستخدمين وتتغير بناء على إدخالات المستخدم، فعندما ترسل طلبًا لعرض صفحة ما من موقع ديناميكي يقوم الخادم بمعالجة طلبك هذا وبعد الانتهاء ويجلب لك البيانات المطلوبة والعرض الأخير على جهازك يكون بشيفرة HTML.
</p>

<p>
	كل ما يتعلق بأمور عرض الموقع من جانب متصفح الويب أو يسمى طرف العميل client side يندرج تحت مجال تطوير الواجهة الأمامية للموقع، وكل ما يتعلق بأمور معالجة الموقع من طرف خادم الويب من معالجة البيانات وتخزينها وحفظها وإجراء عمليات عليها وغيرها يندرج تحت مجال تطوير الوجهة الخلفية للموقع ولكل منهما تقنياته وأدواته، على سبيل المثال عندما تسجل في موقع يطلب تاريخ ميلادك، تراه يعرضها لك أحيانًا بشكل عمر أي عدد وليس تاريخ، هذه المعالجة تُرسل عادة من طرف الخادم.
</p>

<p>
	ليس لزامًا عليك كمطور ويب تعلم تطوير الواجهة الأمامية أو الخلفية معًا بل يمكنك التخصص في إحداهما فقط، فإذا كنت تحب تنفيذ الجوانب المرئية لواجهات المستخدم وجعلها تعمل وفق التصميم المقترح سيناسبك تطوير الواجهة الأمامية أكثر، وإذا كنت تفضل حل المشاكل المنطقية والتعامل مع <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قواعد البيانات</a> وواجهات برمجة التطبيقات والخوادم والخدمات السحابية فإن تطوير الواجهة الخلفية يناسبك.
</p>

<p>
	أما إذا كنت متحمسًا للقيام بكل ما سبق وكانت لديك القدرة لتعلم كافة التقنيات والمهارات اللازمة لتطوير الواجهة الأمامية وتطوير الواجهة الخلفية والقيام بالأمرين معًا عندها سيطلق عليك اسم المطور الكامل fullstack developer وستفتح أمامك الكثير من الفرص المجزية.
</p>

<p>
	وإذا كنت مهتمًا بمعرفة مزيد من التفاصيل حول مجالات تطوير الويب أنصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع</a> ومقال دليلك الشامل إلى <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A9-backend-web-development/" rel="">تطوير الواجهة الخلفية Backend</a>.
</p>

<h2>
	أهمية تطوير الواجهة الأمامية في سوق العمل
</h2>

<p>
	إذا كنت مهتمًا بتطوير الويب فدعني أخبرك أن تبدأ به دون تردد فهو واحد من أكثر مجالات العمل نموًا مقارنة بباقي الوظائف فبحسب <a href="https://survey.stackoverflow.co/2022/#developer-type" rel="external nofollow">استبيان عام 2022</a> لموقع ستاك أوفر فلو الشهير الذي يضم آلاف خبراء البرمجة حول العالم فإن 25.96% من المشاركين في الاستبيان وعددهم 61,302 متخصصون في تطوير الواجهة الأمامية front-end، ويحتل هذا المجال المرتبة الثالثة بين أنواع المطورين بعد تطوير الواجهة الخلفية back-end والتطوير الكامل full-stack وهذا إن دلَّ على شيء فإنما يدل على مدى أهمية هذا المجال والطلب المرتفع عليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="135848" href="https://academy.hsoub.com/uploads/monthly_2023_09/1908138924_.PNG.45b79cdfa662cc119aba2b724888fb03.PNG" rel=""><img alt="تطوير الواجهة الأمامية في سوق العمل" class="ipsImage ipsImage_thumbnailed" data-fileid="135848" data-ratio="39.00" data-unique="sd7n82p4l" style="width: 800px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_09/.thumb.PNG.af84ae7c42bac646624663a79aac0112.PNG"> </a>
</p>

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

<p>
	الجدير بالذكر أن أصعب جزء في مجال تطوير الواجهة الأمامية هو أنه متجدد باستمرار لذا يحتاج المطور للاطلاع بصورة دائمة على أحدث التقنيات في تطوير الويب ليتمكن من الاحتفاظ بالصدارة في سوق العمل لكنه مجال مجزٍ ويستحق الجهد.
</p>

<h2>
	ما هي مهام مطور الواجهة الأمامية؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="135849" href="https://academy.hsoub.com/uploads/monthly_2023_09/1960900084_.png.4fe96591c9a3a1dd5a564cbf6deb0df9.png" rel=""><img alt="مهام مطور الواجهة الأمامية" class="ipsImage ipsImage_thumbnailed" data-fileid="135849" data-ratio="62.50" data-unique="uhm2ckeyr" style="width: 800px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_09/.thumb.png.3548d53afd339ebe55e09a8d9437fd66.png"> </a>
</p>

<p>
	مطور الواجهات الأمامية هو المسؤول بشكل عام عن إنشاء أجزاء المواقع والتطبيقات التي تعمل من جانب العميل (أو المتصفح)، وهذه المهمة تتضمن القيام بالعديد من المهام والتي تشمل:
</p>

<ul>
	<li>
		كتابة شيفرات <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافا سكريبت</a> لتنفيذ تصميم الموقع التي تكون عادة بشكل صور مصممة من قبل مصمم الواجهات الأمامية المسؤول عن <a href="https://academy.hsoub.com/design/user-experience/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%88%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui-ux-r831/" rel="">تصميم واجهة المستخدم وتجربة المستخدم UI / UX</a> بواسطة برامج متخصصة مثل فيجما Figma أو Sketch أو فوتوشوب.
	</li>
	<li>
		التواصل مع مطور الواجهة الخلفية المسؤول عن تحقيق وظائف الموقع والتأكد من توافق الواجهة الأمامية مع الواجهة الخلفية للموقع.
	</li>
	<li>
		تحسين <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-performance-r1540/" rel="">أداء موقع الويب</a> والتأكد من سرعة تحميله وتوفر تجربة مستخدم سهلة ومحسنة.
	</li>
	<li>
		التأكد من أن الموقع متوافق مع كافة متصفحات الويب ويعمل بالشكل الصحيح ومعالجة أي <a href="https://academy.hsoub.com/programming/html/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%81%D9%8A-html-%D9%88-css-r1955/" rel="">مشاكل توافق</a> إن وجدت.
	</li>
	<li>
		التأكد من كون الموقع <a href="https://academy.hsoub.com/design/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D9%8A%D9%81-r724/" rel="">متجاوب ومتكيف</a> مع كافة أحجام الشاشات بما في ذلك شاشات الهواتف الجوالة والأجهزة اللوحية وأجهزة الحاسوب.
	</li>
</ul>

<h2>
	أهم أدوات تطوير الواجهة الأمامية
</h2>

<p>
	إذا قررت التخصص في تطوير الواجهات الأمامية للويب ستجد الكثير من الخيارات المتاحة، فاللغات الثلاث الأساسية لأي مطور واجهة أمامية هي HTML و CSS وجافا سكريبت كما يمكنه إلى جانب ذلك استخدام العديد من اللغات وأطر العمل والمكتبات الأخرى الكثيرة التي تسهل عمله في تطوير الواجهات وفي الفقرات التالية سنسلط الضوء على أبرز هذه الأدوات.
</p>

<h3>
	أهم لغات برمجة الواجهة الأمامية
</h3>

<ul>
	<li>
		HTML
	</li>
	<li>
		CSS
	</li>
	<li>
		جافا سكريبت JavaScript
	</li>
	<li>
		تايب سكريبت TypeScript
	</li>
</ul>

<p>
	لنتناول بتفصيل أكثر كل لغة من هذه اللغات ودورها في تطوير الواجهات الأمامية للمواقع والتطبيقات.
</p>

<h4>
	لغة HTML
</h4>

<p>
	لغة HTML هي اختصار لعبارة HyperText Markup Language أي لغة ترميز النص التشعبي وهي اللغة الأساسية لتطوير الواجهة الأمامية للمواقع والتطبيقات وهي لغة وصفية أو لغة ترميز تصف البنية العامة لصفحات الويب ومحتوياتها من نصوص وأزرار وصور وقوائم باستخدام الوسوم وهي علامات موضوعة ضمن قوسي زاوية <code>&lt;&gt;</code> تحدد نوع المحتوى أو هيكليته
</p>

<p>
	على سبيل المثال لإنشاء صفحة ويب تتضمن عنوان وصورة ونص نكتب كود HTML التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3757_8" style=""><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"rtl"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">عنوان الصفحة</span><span class="tag">&lt;/title&gt;</span><span class="pln">
  </span><span class="tag">&lt;/head&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
</span><span class="tag">&lt;h1&gt;</span><span class="pln">عنوان الصفحة</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
   </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"myImage"</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"html.png"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln"> HTML هي اختصار لـHyperText Markup Language  أي لغة ترميز النص التشعبي وهي الأساسية لتطوير الواجهة الأمامية للمواقع والتطبيقات
</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	احفظ الكود أعلاه في ملف نصي باسم index.html وقم بعرضه في متصفح الويب، عندها ستظهر الصفحة بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="135853" href="https://academy.hsoub.com/uploads/monthly_2023_09/HTMLpage.PNG.9c886961c5d02ecb69c81826522addf4.PNG" rel=""><img alt="عنوان صفحة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="135853" data-ratio="48.50" data-unique="fysosnj45" style="width: 800px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_09/HTMLpage.thumb.PNG.4693d1a4d0efd279dbcd66ccf8f8128e.PNG"> </a>
</p>

<p>
	للمزيد من المعلومات أنصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">تعلم لغة HTML</a> الذي يشرح لك كافة الأساسيات التي تحتاجها للعمل مع هذه اللغة والاطلاع على <a href="https://wiki.hsoub.com/HTML" rel="external">توثيق HTML</a> الشامل على موسوعة حسوب.
</p>

<h4>
	لغة CSS
</h4>

<p>
	لغة CSS هي اختصار لـ Cascading Style Sheets وهي لغة تصميم تستخدم لتحديد تنسيق صفحة الويب واختيار الألوان والخطوط والخلفيات وما إلى ذلك كما أنها تستخدم في جعل مواقع الويب متجاوبة مع مختلف الشاشات من خلال كتابة شيفرات تغير تنسيق وتخطيط العناصر بحسب أبعاد الشاشة.
</p>

<p>
	تستخدم لغة CSS قواعد تنسيق تستهدف عناصر HTML التي نريد تصميمها على سبيل المثال سنكتب التعليمات التالية لتنسيق صفحة الويب التي أنشأناها باستخدام HTML نكتب شيفرات CSS التالية ضمن الوسم <code>&lt;head&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3757_10" style=""><span class="pun">&lt;</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
      body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Cairo'</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#f2f2f2</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

h1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">36px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

img </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">18px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#666</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">50px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="pln">style</span><span class="pun">&gt;</span></pre>

<p>
	تظهر الصفحة بعد إضافة التنسيقات كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="135854" href="https://academy.hsoub.com/uploads/monthly_2023_09/css.PNG.abc77c24d7db2532e5443249487cb34d.PNG" rel=""><img alt="صفحة HTML" class="ipsImage ipsImage_thumbnailed" data-fileid="135854" data-ratio="43.25" data-unique="9p3u9kx2p" style="width: 800px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_09/css.thumb.PNG.6745d26396aa56f90cd078f500eaca16.PNG"> </a>
</p>

<p>
	وللمزيد من المعلومات يمكنك مطالعة <a href="https://academy.hsoub.com/programming/css/" rel="">سلسلة دروس CSS</a> على أكاديمية حسوب إلى جانب <a href="https://wiki.hsoub.com/CSS" rel="external">توثيق CSS</a> الشامل على موسوعة حسوب.
</p>

<h4>
	لغة جافا سكريبت JavaScript
</h4>

<p>
	بعد أن تقوم بتخطيط عناصر الواجهة الأمامية باستخدام HTML وتنسقها باستخدام CSS قد تحتاج إلى إضافة بعض التفاعلات إلى صفحاتك وهنا يأتي دور <a href="https://academy.hsoub.com/javascript/" rel="">لغة جافا سكريبت JavaScript</a> التي تعد واحدة من أشهر لغات البرمجة وأكثرها استخدامًا فهي تمكنك من تطوير كل من الواجهة الأمامية والخلفية.
</p>

<p>
	قد يكون تعلم جافا سكريبت هو الخطوة الأصعب لك كمطور واجهة أمامية لا سيما إن لم تكن تملك خبرة سابقة في البرمجة لكن بمجرد تعلمها ستتمكن من نقل الموقع إلى مستوى جديد وإضافة التأثيرات الديناميكية لصفحاته والاستجابة لتفاعل المستخدمين مع عناصره بدلًا من جعله يعرض معلومات ثابتة فقط.
</p>

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

<p>
	لنفرض أنك تحتاج لتكبير حجم صور الموقع قليلًا عند مرور مؤشر الفأرة فوقها، لن تتمكن من هذا إذا لم تكن تعرف جافا سكريبت وتدمجها مع HTML و CSS
</p>

<p>
	بدايةً عليك إضافة أكواد CSS التالية بعد الأكواد التي كتبتها في الخطوة السابقة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3757_12" style=""><span class="pun">.</span><span class="pln">zoom </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">transition</span><span class="pun">:</span><span class="pln"> transform </span><span class="lit">.2s</span><span class="pun">;</span><span class="pln">
  </span><span class="com">/* Add any other styles you want */</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="kwd">zoom</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">transform</span><span class="pun">:</span><span class="pln"> scale</span><span class="pun">(</span><span class="lit">1.5</span><span class="pun">);</span><span class="pln">
  </span><span class="com">/* Change the scale value to adjust the level of zoom */</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبعدها عليك أن تضيف أكواد جافا سكريبت التالية قبل الوسم <code>&lt;/body&gt;</code> ضمن كود HTML:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3757_14" style=""><span class="kwd">const</span><span class="pln"> image </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"myImage"</span><span class="pun">);</span><span class="pln">
image</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">"mouseover"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  image</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"zoom"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

image</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">"mouseout"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  image</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="str">"zoom"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	تستمع شفرة جافا سكريبت هذه إلى حدث مرور مؤشر الفأرة فوق الصورة وتضيف تنسيق التكبير zoom إليه عند وقوع هذا الحدث. كما أنها تستمع إلى حدث خروج مؤشر الفأرة من عنصر الصورة وتزيل تنسيق التكبير منه عند وقوع هذا الحدث، وعند عرض الصفحة في المتصفح نحصل على التأثير التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="135850" href="https://academy.hsoub.com/uploads/monthly_2023_09/60705096_.gif.3d15177eb5dfaeafc3ec8c285ac22035.gif" rel=""><img alt="كود جافا سكريبت لتكبير الصورة.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="135850" data-ratio="56.25" data-unique="hqoc1mpx8" style="width: 800px; height: 450px;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_09/.thumb.gif.0010777db2899ef5329034b3473a63ca.gif"> </a>
</p>

<p>
	للمزيد من التفاصيل أنصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D8%B5%D9%81%D8%B1-%D8%AD%D8%AA%D9%89-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81-r2046/" rel="">تعلم جافا سكريبت من الصفر حتى الاحتراف</a>، كما توفر موسوعة حسوب <a href="https://wiki.hsoub.com/JavaScript" rel="external">توثيق لغة جافا سكريبت</a> باللغة العربية يمكنك من خلالها تعلم كافة ما يتعلق بهذه اللغة.
</p>

<h3>
	لغة TypeScript
</h3>

<p>
	تعد لغة TypeScript لغة برمجة مفتوحة المصدر طورتها مايكروسوفت عام 2012 لتوفر ميزات إضافية تساعد على تطوير تطبيقات جافا سكريبت فهي تجعل تعليمات جافا سكريبت مفهومة بشكل أكبر وتوفر إمكانية تحديد أنواع المتغيرات كي تقلل من أخطاء الكود، وقد تزايدت شعبيتها بشكل كبير في الآونة الأخيرة لما توفره من ميزات لتحسين جودة التطبيقات وتسريع عملية التطوير .
</p>

<p>
	يمكنك مطالعة المزيد من المعلومات حول هذه اللغة وإمكانياتها من خلال مجموعة <a href="https://academy.hsoub.com/programming/javascript/typescript/" rel="">دروس TypeScript</a> المتوفرة على أكاديمية حسوب
</p>

<h3>
	أهم أطر عمل تطوير الواجهة الأمامية
</h3>

<p>
	ظهرت <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">أطر العمل frameworks</a> والمكتبات البرمجية لتسهيل عمل المطور وتسريع عمله، لذا ستحتاج لاستخدامها في سوق العمل بدلًا من كتابة كل شيء بيدك من الصفر، وأطر عمل الواجهات الأمامية كثيرة ومن أبرزها:
</p>

<ul>
	<li>
		بوتستراب Bootstrap
	</li>
	<li>
		رياكت React
	</li>
	<li>
		أنغولار Angular
	</li>
	<li>
		فيو Vue
	</li>
	<li>
		جي كويري jQuery
	</li>
</ul>

<p>
	دعنا نلقي نظرة على كل تقنية منها ونشرح بمزيد من التفصيل دورها وأهميتها في تطوير الواجهة الأمامية.
</p>

<h4>
	بوتستراب Bootstrap
</h4>

<p>
	بوتستراب هو إطار ويب مجاني مفتوح المصدر مخصص للواجهة الأمامية فهو يستخدم لتصميم مواقع وتطبيقات ويب متجاوبة مع كافة أحجام الشاشات وذات مظهر احترافي بسرعة وسهولة فهو يحتوي على قوالب تصميم ومكونات جاهزة مكتوبة بلغة HTML ولغة CSS كما يوفر بالإضافة لذلك ملحقات تصميم مكتوبة بلغة جافا سكريبت.
</p>

<p>
	للاطلاع على المزيد من المعلومات يمكنك متابعة <a href="https://academy.hsoub.com/programming/css/bootstrap/" rel="">المقالات الدروس حول إطار عمل بوتستراب</a> على أكاديمية حسوب إضافة <a href="https://wiki.hsoub.com/Bootstrap" rel="external">لتوثيق بوتستراب</a> الشامل على موسوعة حسوب.
</p>

<h4>
	رياكت React
</h4>

<p>
	رياكت React هي مكتبة جافا سكريبت مفتوحة المصدر طورتها شركة فيسبوك عام 2013 وهي تعد اليوم واحدة من أشهر مكتبات تطوير الواجهة الأمامية التي يمكنك من خلالها إنشاء مكونات قابلة لإعادة الاستخدام وتطوير واجهات مستخدم متجاوبة بسرعة وسهولة.
</p>

<p>
	يمكنك مطالعة المزيد حول هذه المكتبة وتعلم طريقة بناء واجهات المواقع والتطبيقات باستخدامها من خلال <a href="https://academy.hsoub.com/programming/javascript/react/" rel="">الدروس والمقالات الاحترافية حول React</a> على أكاديمية حسوب وأيضًا <a href="https://wiki.hsoub.com/React" rel="external">توثيق React</a> على موسوعة حسوب.
</p>

<h4>
	أنغولار Angular
</h4>

<p>
	أنغولار Angular هو إطار عمل مفتوح المصدر يعتمد على لغة TypeScript أطلقته شركة جوجل وهو يتميز بقدرته على تطوير تطبيقات ويب متطورة وضخمة وإدارتها بسهولة كبيرة فهو يوفر الكثير من الميزات التي تساعد مطوري الواجهة الأمامية مثل إدارة حالة التطبيق والتحقق من الصحة.
</p>

<p>
	كما يمكنك مطالعة المزيد من <a href="https://academy.hsoub.com/programming/javascript/angular/" rel="">الدروس والمقالات الاحترافية حول Angular</a> على أكاديمية حسوب لتتعرف على طريقة استخدامها في تطوير مواقع ويب احترافية.
</p>

<h4>
	فيو Vue
</h4>

<p>
	فيو Vue هو إطار عمل جافا سكريبت مفتوح المصدر طوره Evan You المبرمج في جوجل عام 2014 لتطوير واجهات المستخدم وتطبيقات الصفحة الواحدة وهو اليوم واحد من أكثر أطر عمل الواجهة الأمامية شيوعًا واستخدامًا.
</p>

<p>
	ما يميز إطار فيو Vue أنه مرن وخفيف الوزن وسهل الاستخدام فقد أزال كل المكونات الإضافية والمفاهيم غير الضرورية التي تأتي مع أطر عمل الواجهة الأمامية الأخرى مثل أنغولار Angular ورياكت React.
</p>

<p>
	وللمزيد من التفاصيل أنصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D8%B7%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%85%D9%8A%D8%A9-angular-%D9%88-react-%D9%88-vue-r1596/" rel="">مقارنة بين أطر الواجهات الأمامية: Angular و React و Vue</a> لمعرفة الإطار الأنسب لمتطلباتك، كما أنصح بمتابعة <a href="https://academy.hsoub.com/programming/javascript/vuejs/" rel="">الدروس والمقالات حول Vue</a> التي توفرها أكاديمية حسوب بشكل دوري لتعلم المزيد حول استخدامات هذا الإطار.
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="3889" data-embedcontent="" src="https://academy.hsoub.com/files/22-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-vuejs/?do=embed" style="margin: auto;"></iframe>

<h4>
	جي كويري jQuery
</h4>

<p>
	جي كويري jQuery هي مكتبة مبنية بالاعتماد على لغة جافا سكريبت وهي توفر لمطوري الواجهة الأمامية الكثير من القوة والمرونة وتتضمن الكثير من الميزات التي تجعل كتابة شيفرات جافا سكريبت أبسط وأكثر اختصارًا.
</p>

<p>
	لمعرفة المزيد حول طريقة استخدام مكتبة jQuery عند تطوير مواقع الويب أنصح بمطالعات مجموعة <a href="https://academy.hsoub.com/programming/javascript/jquery/" rel="">المقالات والدروس حول jQuery</a> المتوفرة على أكاديمية حسوب، كما أنصح بمطالعة <a href="https://wiki.hsoub.com/jQuery" rel="external">توثيق jQuery</a> على موسوعة حسوب.
</p>

<h2>
	تقنيات وأدوات مهمة لتطوير الواجهة الأمامية
</h2>

<p>
	إضافة لما سبق، يحتاج أي مطور واجهة أمامية لقائمة طويلة من المعارف والمهارات والأدوات الإضافية التي تعزز أداءه وتساعده في تطوير واجهات المستخدم وتكويدها بسرعة واحترافية، وإليك قائمة بأبرز هذه الأدوات نذكر:
</p>

<ul>
	<li>
		شجرة DOM والتعامل معها.
	</li>
	<li>
		معرفة أساسية بالشبكات وشبكة الإنترنت وأشهر برتوكولات التواصل مثل HTTP.
	</li>
	<li>
		لمحة عن قواعد التصميم وأساسيات تصميم <a href="https://academy.hsoub.com/design/user-experience/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%88%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui-ux-r831/" rel="">واجهات المستخدم وتجربة المستخدم UX/UI</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D9%8A%D9%81-r724/" rel="">التصميم المتجاوب responsive design</a> مع كافة أحجام الشاشات.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">التوافق مع المتصفحات Cross-browser</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">واجهة برمجة التطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>.
	</li>
	<li>
		لمحة عن Node.js وأنظمة إدارة الحزم تحديدًا npm.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%87%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-git-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-%D9%81%D9%8A-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r2034/" rel="">نظام التحكم في الإصدارات git</a>.
	</li>
</ul>

<h3>
	شجرة DOM
</h3>

<p>
	من الضروري أن يعرف أي مطور واجهة أمامية مهارات التعامل مع نموذج كائن المستند Document Object Model أو اختصارًا DOM أو <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%AC%D8%B1%D9%8A%D8%A9-%D9%84%D9%80-dom-r646/" rel="">شجرة DOM</a> ومعالجته عبر لغة جافا سكريبت، و DOM هو مجموعة من المواصفات التي تمثل مستند الويب بشكل كائن وتعد أحد الطرق الأساسية في بناء مواقع تفاعلية حيث أنها تنشئ <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> تسمح للغات البرمجة مثل جافا سكريبت بالوصول لكافة عناصر صفحات الويب ومعالجتها والتحكم بها.
</p>

<p>
	ستساعدك معالجة DOM في تحديث بيانات الصفحة أو تغيير تخطيطها دون إعادة الحاجة لإعادة تحميلها على سبيل المثال يمكنك من خلال DOM إضافة عناصر HTML للصفحة أو إزالتها أو تعديل تنسيقات CSS لها عند وقوع حدث ما أو عند إعادة تحميل صفحة الويب.
</p>

<h3>
	معرفة أساسية بالشبكات
</h3>

<p>
	يحتاج مطور الواجهة الأمامية لامتلاك معلومات أساسية حول طريقة عمل الويب والشبكات الحاسوبية وشبكة الإنترنت ومفهوم العميل والخادم وكيفية التفاعل بينهما وبروتوكولات الاتصال عبر الويب مثل HTTP و HTTPS و <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></abbr> ومفهوم خدمة اسم المجال DNS فهذه المعرفة تمكنه من عرض واستدعاء المحتوى من الشبكة والاتصال مع الخادم بشكل آمن وتوفير تجربة مستخدم أفضل.
</p>

<p>
	للاطلاع على مزيد من المعلومات يمكنك مطالعة <a href="https://academy.hsoub.com/devops/networking/" rel="">سلسلة المقالات والدروس حول الشبكات</a> على أكاديمية حسوب.
</p>

<h3>
	قواعد التصميم وأساسيات UX/UI
</h3>

<p>
	ذكرنا سابقًا أن مطور الواجهة الأمامية قد يكون مسؤولًا عن تصميم موقع ويب من الصفر أو قد يكون مسؤولًا عن تحويل التصاميم الجاهزة إلى شيفرات برمجية، لكن في كلتا الحالتين أجد أنه من الضروري لأي مطور واجهة أمامية أن يعرف <a href="https://academy.hsoub.com/design/user-interface/%D8%A3%D9%81%D8%B6%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r818/" rel="">أفضل النصائح والقواعد لتصميم واجهة المستخدم</a> والمبادئ والقواعد الأساسية في <a href="https://academy.hsoub.com/design/user-experience/" rel="">تصميم تجربة المستخدم UX</a> و<a href="https://academy.hsoub.com/design/user-interface/" rel="">تصميم واجهة المستخدم UI</a> فهذا من شأنه أن يساعده على فهم الواجهات وكيفية تفاعل المستخدمين معها بشكل أفضل وكيفية إنشاء واجهات أكثر جاذبية وسهولة في الاستخدام وبالتالي سيتمكن من كتابة شيفرات الواجهة الأمامية بشكل أفضل ويضمن أنها مطابق للقواعد التصميمة الصحيحة.
</p>

<h3>
	التصميم المتجاوب مع كافة أحجام الشاشات
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="135852" href="https://academy.hsoub.com/uploads/monthly_2023_09/446810127_.png.55d341bbd7791f97fee8f8266786fc76.png" rel=""><img alt="التصميم المتجاوب.png" class="ipsImage ipsImage_thumbnailed" data-fileid="135852" data-ratio="62.50" data-unique="39c2yas0m" style="width: 800px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_09/.thumb.png.d3b20205e9d0a125827dbdcb11826895.png"> </a>
</p>

<p>
	التصميم المتجاوب Responsive Design هو تصميم يقوم بتغيير حجم عناصر صفحات الموقع أو إخفائها أو تصغيرها أو تكبيرها ليضمن ظهورها بطريقة واضحة وسهلة الاستخدام مهما كان نوع الجهاز المستخدم لعرضها.
</p>

<p>
	يحتاج مطور الواجهة الأمامية لمعرفة <a href="htps://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-r1499/" rel="">أساسيات تصميم الويب المتجاوب Responsive Web Design</a> وطرق كتابة <a href="https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-media-queries-%D9%81%D9%8A-css-r1059" rel="">استعلامات الوسائط Media Queries في CSS</a> بشكل صحيح كي يضمن ظهور المواقع بكفاءة على جميع أنواع وأحجام الأجهزة التي يستعملهما المستخدمون سواء الحواسيب ذات الشاشات الكبيرة أو الهواتف المحمولة ذات الشاشات الصغيرة.
</p>

<h3>
	التوافق مع المتصفحات Cross-browser
</h3>

<p>
	أحد المهارات الضرورية التي يجب على مطور الواجهة الأمامية تعلمها هو التأكد من أن الواجهات التي يبرمجها متوافقة مع مختلف المتصفحات وتظهر بشكل سليم ومتسق على المتصفحات الشهيرة مثل كروم وفايرفوكس وسفاري وEdge وOpera ويتعلم كيف يجري <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">اختبارات التوافق مع المتصفحات cross-browser testing</a> ويعالج أي مشكلات تواجهه في التوافق.
</p>

<p>
	يمكنك الاستعانة ببعض الأدوات والتقنيات المساعدة في اختبار توافق المتصفح Cross-browser مثل <a href="https://validator.w3.org/" rel="external nofollow">Markup Validation Service</a> و <a href="https://www.browserstack.com/" rel="external nofollow">CrossBrowserTesting</a> و <a href="https://www.lambdatest.com/lp/automation-testing" rel="external nofollow">LambdaTest</a> …إلخ. لكن تجدر الإشارة بأن أطر عمل الواجهات الأمامية مثل رياكت React وأنجولار Angular يمكنها أن تقوم بهذه المهمة عنك ولن تجعلك تكترث لها، يكفي أن تحدد لها أي نوع متصفح تريد أن نستهدف وهي تتولى الأمر لأنها تعالج دومًا الشيفرة التي تكتبها.
</p>

<h3>
	استدعاء واجهة برمجة التطبيقات
</h3>

<p>
	<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">واجهات برمجة التطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> هي صلة الوصل بين تطبيقات الواجهة الأمامية وبين النظم والوجهات الخلفية وبالرغم من أنك لا تحتاج كمطور واجهة أمامية لمعرفة كيفية كتابة واجهات برمجة التطبيقات لكونها مهمة مطور الواجهة الخلفية لكنك تحتاج لمعرفة طريقة الاتصال بهذه الواجهات وجلب البيانات منها وعرضها بشكل مناسب ومعرفة التقنيات المرتبطة بها مثل <a href="https://academy.hsoub.com/programming/general/%D8%B4%D8%B1%D8%AD-%D9%81%D9%84%D8%B3%D9%81%D8%A9-restful-%D8%AA%D8%B9%D9%84%D9%85-%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-rest-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r635/" rel="">RESTful</a> ومفهوم <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-json-r604/" rel="">JSON</a>.
</p>

<p>
	باختصار، يجري التواصل بين الواجهة الأمامية والواجهة الخلفية عبر واجهة برمجة التطبيقات وعادة ما ترسل البيانات من الواجهة الخلفية إلى الواجهة الأمامية بصيغة JSON لذا من الضروري معرفة هذه الصيغة، ويمكنك الرجوع إلى مقال <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-json-r604/" rel="">تعلم JSON</a>.
</p>

<h3>
	تعلم Node.js وأنظمة إدارة الحزم
</h3>

<p>
	يحتاج مطور الواجهة الأمامية إلى تعلم أحد أدوات إدارة الحزم Package Manager التي تجعل عملية تطوير الواجهة الأمامية أسرع وأسهل، فأدوات إدارة الحزم هي برمجيات تسمح لك بتثبيت الحزم المطلوبة للتطوير وإعدادها وتحديثها وإدارة تبعياتها وضمان عدم تعارضها بشكل تلقائي بدلًا من القيام بذلك بشكل يدوي ومن أشهرها npm و Yarn.
</p>

<p>
	وعادة يستعمل مطور الواجهات الأمامية مكتبة Node.js التي تأتي مع نظام إدارة الحزم الشهير npm والذي سيستعمله في تنزيل حزم المشروع وإدارتها ومكتبة Node.js هي أول أداة سيثبتها المطور على جهازه فبدونها لن يعمل مع لغة جافاسكريبت على الإطلاق، لذا يجب أن يتعرف عليها وعلى مدير الحزم npm.
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="3889" data-embedcontent="" src="https://academy.hsoub.com/files/32-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-nodejs?do=embed" style="margin: auto;"></iframe>

<p>
	وقد شرحنا في مقال <a href="https://academy.hsoub.com/programming/workflow/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D9%86-%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-r1472/" rel="">أساسيات إدارة الحزم في تطوير الويب من طرف العميل</a> كل ما يتعلق باستخدام مدير الحزم وكيفية استخدامه في إدارة مشاريع الواجهة الأمامية.
</p>

<h3>
	نظام التحكم في الإصدارات git
</h3>

<p>
	يساعد نظام التحكم في الإصدار وأشهرها <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">Git</a> مطور الواجهة الأمامية على تتبع التغييرات التي يجريها على المواقع ويمكنه من العودة إلى إصدار كود سابق بكل سهولة إذا حدث خطأ ما في الكود كما يفيده في حال العمل على نفس المشروع مع فريق تطوير.
</p>

<p>
	تتوفر في أكاديمية حسوب مجموعة غنية ومنوعة من <a href="https://academy.hsoub.com/programming/workflow/git/" rel="">المقالات والدروس حول Git</a> التي تساعدك في تعلم كافة المهارات اللازمة للتعامل مع نظام التحكم بالإصدارات Git.
</p>

<p>
	كانت هذه التقنيات جزءًا يسيرًا من التقنيات والأدوات التي على مطور الواجهة الأمامية معرفتها، وفي الفقرة التالية سنوضح المزيد من هذه التقنيات ونضع لك خارطة طريق منظمة تساعدك في تعلم تعلم تطوير الواجهة الأمامية.
</p>

<h2>
	خارطة طريق تعلم تطوير الواجهة الأمامية
</h2>

<p>
	إليك خارطة طريق لتعلم مجال تطوير الواجهات الأمامية والذي يعرض بوضوح طريق مطور الواجهات الأمامية بالكامل بدءًا من المرحلة المبتدئة وحتى المتقدمة وأغلب تلك المواضيع تجد عنها في أكاديمية حسوب وموسوعة حسوب:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="135851" href="https://academy.hsoub.com/uploads/monthly_2023_09/1901938601_.png.a1aa6c02d27bf2cae11a974f10d85923.png" rel=""><img alt="خارطة طريق لتعلم مجال تطوير الواجهات الأمامية.png" class="ipsImage ipsImage_thumbnailed" data-fileid="135851" data-unique="y90tmu43q" src="https://academy.hsoub.com/uploads/monthly_2023_09/1901938601_.png.a1aa6c02d27bf2cae11a974f10d85923.png"> </a>
</p>

<h2>
	أهم مصادر تعلم تطوير الواجهة الأمامية
</h2>

<p>
	إذا كنت مبتدئًا ولا تملك أي خبرة مسبقة وتبحث عن أقصر طريقة لتعلم تطوير الواجهة الأمامية أنصحك بالاطلاع على <a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">دروة تطوير واجهات المستخدم</a> التي توفرها أكاديمية حسوب فهي دورة شاملة ومنظمة تزيد على 60 ساعة فيديو تدريبية ومن مسارات متعددة تبدأ معك من أساسيات تطوير واجهات المستخدم التي تشرح لك كل المفاهيم واللغات الأساسية وأطر ومكتبات العمل وتنتهي بك ببناء مشاريع عملية متقدمة ترسخ كل هذه الأساسيات وتساعدك في بناء معرض أعمالك.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" id="ips_uid_9677_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="560" data-embed-src="https://www.youtube.com/embed/habGCxz4LXs?si=5ZGSdpZH-fx9hldr"></iframe>
</p>

<p>
	لن تكون وحدك خلال هذه الدورة بل سيكون معك فريق من المدربين لمساعدتك وإجابتك على أي تساؤل أو مشكلة تواجهك في رحلة التعلم، وفي نهاية الدورة ستحصل على شهادة معتمدة من أكاديمية حسوب تعزز سيرتك الذاتية.
</p>

<p>
	إضافة إلى ذلك توفر أكاديمية حسوب الكثير من مصادر التعلم المجانية باللغة العربية من دروس ومقالات وسلاسل تعلمية حول تطوير الويب تتعلم من خلالها كافة تقنيات ولغات برمجة الواجهات الأمامية وأطر العمل الشهيرة التي أوردناها في سياق المقال.
</p>

<p>
	وإن كنت تفضل الدراسة من الكتب بسبب شموليتها وتسلسلها في الشرح فإن الأكاديمية توفر لك مجموعة من الكتب القيمة التي تهم أي مطور واجهة أمامية من بينها:
</p>

<ul>
	<li>
		كتاب <a href="https://academy.hsoub.com/files/13-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D8%A7%D9%94%D8%B9%D9%85%D9%82-%D9%84%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-html5/" rel="">فهم أعمق لتقنيات HTML5</a>
	</li>
	<li>
		كتاب <a href="https://academy.hsoub.com/files/31-%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA-%D9%84%D9%84%D8%B9%D8%A7%D9%85%D9%84%D9%8A%D9%86-%D8%A8%D9%84%D8%BA%D8%A9-css/" rel="">ملاحظات للعاملين في CSS</a>
	</li>
	<li>
		كتاب <a href="https://academy.hsoub.com/files/27-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA/" rel="">البرمجة بلغة جافا سكريبت</a>
	</li>
	<li>
		كتاب <a href="https://academy.hsoub.com/files/11-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-user-experience-ux/" rel="">تصميم تجربة المستخدم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/tags/%D8%AA%D8%B9%D9%84%D9%85%20%D8%AA%D8%B7%D9%88%D9%8A%D8%B1%20%D8%A7%D9%84%D9%88%D9%8A%D8%A8" rel="">سلسلة تطوير الويب</a>
	</li>
</ul>

<p>
	وأخيرًا إذا كنت ترغب بمعرفة المزيد من المعلومات حول الواجهات الأمامية وأهم تقنيات برمجتها ومسار تعلمها أنصحك بمشاهدة هذا الفيديو.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="350" id="ips_uid_9677_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/zrkE_dFffEU"></iframe>
</p>

<h2>
	الخلاصة
</h2>

<p>
	بهذا تكون وصلت إلى نهاية هذه المقالة الشاملة التي تناولنا فيها كل ما يتعلق بأساسيات تطوير الواجهة الأمامية front-end أو ما يعرف بتطوير واجهة المستخدم وتعرفنا على أهم اللغات وأطر العمل والأدوات التي تحتاجها كمطور واجهة أمامية لتنجز الجزء المرئي من الموقع الذي يتفاعل المستخدمون من خلاله مع التطبيقات والمواقع، كما شرحنا في ختامة أهم خطوات تعلم تطوير الواجهة الأمامية ومصادر تعلمها باللغة العربية.
</p>

<p>
	وفي حال كان لديك أي سؤال يتعلق بتطوير الويب وتحديدًا تطوير الواجهات الأمامية للويب فلا تتردد في كتابته في قسم التعليقات أسفل المقال، أو طرحه في <a href="https://academy.hsoub.com/questions/" rel="">قسم الأسئلة والأجوبة</a> في أكاديمية حسوب ليجيبك عليه مبرمجون خبراء.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">برمجة مواقع الويب: دليلك المختصر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/user-interface/%D9%85%D8%A7-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9%D8%9F-r828/" rel="">ما الفرق بين تصميم المواقع الإلكترونية وتطوير المواقع الإلكترونية؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%B9%D8%A7%D9%8A%D9%8A%D8%B1%D9%87-r1670/" rel="">عالم الويب ومعاييره</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8%D8%9F-r2094/" rel="">ما هي صفحات الويب؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2134</guid><pubDate>Sun, 17 Sep 2023 13:00:00 +0000</pubDate></item><item><title>&#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x627;&#x644;&#x625;&#x62C;&#x631;&#x627;&#x626;&#x64A;&#x629; Procedural Programming</title><link>https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A5%D8%AC%D8%B1%D8%A7%D8%A6%D9%8A%D8%A9/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/----.png.4f0f6caf14c0157f53ce548ce91a4185.png" /></p>
<p>
	يحتاج أي مطور محترف للتعرف على <span ipsnoautolink="true">أنواع لغات البرمجة</span> المختلفة ومعرفة ميزاتها ومحدوديتها كي يتمكن من استخدام النوع الأنسب عند في كتابة برامجه وتطبيقاته، وفي مقال اليوم سنتعرف على مفهوم لغة البرمجة الإجرائية التي هي أحد أقدم وأبسط نماذج البرمجة ونكتشف استخداماتها وآلية عملها وطريقة كتابة البرامج باستخدامها ونستعرض أهم خصائصها وعيوبها ومميزاتها.
</p>

<h2>
	أنواع لغات البرمجة
</h2>

<p>
	تختلف لغات البرمجة وتتفاوت في عدة أوجه ما يجعل علماء البرمجة والمطورين يصنفونها وفق تصنيفات مختلفة وفق السمات أو الخصائص المشتركة فيما بينها. ومن بين المعايير التي يتم اعتمادها لتصنيف أنواع لغات البرمجة هو أسلوب هيكلة الشيفرة وطريقة تنظيم عناصر البرنامج حيث تقسم لغات البرمجة بناء على هذا المعيار إلى ثلاثة أصناف أو نماذج رئيسية هي:
</p>

<ul>
	<li>
		لغات البرمجة الإجرائية Procedural Programming
	</li>
	<li>
		لغات البرمجة الوظيفية Functional Programming
	</li>
	<li>
		لغات البرمجة الكائنية Object-Oriented Programming
	</li>
</ul>

<p>
	من الضروري لك كمبرمج أن تفهم الفروقات بين هذه النماذج البرمجية واختيار النموذج المناسب لمشروعك، وسنخصص فقراتنا التالية لشرح لغات البرمجة الإجرائية والتي تعد أحد أقدم نماذج البرمجة ونكتشف معًا طريقة عملها وأشهر لغات البرمجة التي تعتمدها وأبرز مزاياها وعيوبها.
</p>

<p>
	إذا كنت مهتمًا بمعرفة المزيد من المعايير التي تصنف وفقها لغات البرمجة وأهم مميزات كل نوع يمكنك مطالعة مقال <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أنواع لغات البرمجة</a>.
</p>

<h2>
	ما هي البرمجة الإجرائية Procedural Programming؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="134449" href="https://academy.hsoub.com/uploads/monthly_2023_09/1650906281_.png.1ea38be25df643e01d5ef5dd66291dfd.png" rel=""><img alt="لغة البرمجة الإجرائية" class="ipsImage ipsImage_thumbnailed" data-fileid="134449" data-ratio="56.27" data-unique="uprcme29e" style="width: 600px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_09/.thumb.png.4a593bb136fc6743baf7deade57ac150.png"> </a>
</p>

<p>
	البرمجة الإجرائية Procedural Programming هي أحد نماذج البرمجة التي تعتمد بشكل أساسي على إخبار الحاسوب بالمهام التي تريد منه القيام به بدقة وخطوة بخطوة من خلال كتابة إجراءات procedures أو دوال برمجية functions تؤدي كل منها مهمة محددة.
</p>

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

<p>
	فالإجراءات procedures أو الدوال functions أو ما يعرف أيضًا البرامج الفرعية subroutines أو الوظائف هي عبارة عن كتل من التعليمات البرمجية لها اسم محدد تحصل على المدخلات من المستخدم وتعالجها بطريقة معينة لأداء المهمة المطلوبة ثم تعيد مجموعة من النتائج كمخرجات.
</p>

<p>
	وتجدر الإشارة بأنه لا يتم تنفيذ تعليمات الإجراءات مباشرة عند كتابته بل يجب <strong>استدعاء الإجراء</strong> من خلال كتابة اسمه وتمرير قيم المتغيرات المناسبة له ليتم تنفيذ كتلة تعليماته البرمجية، بعبارة أخرى الإجراء البرمجي هو كتلة من التعليمات المجمعة بشكل وحدة واحدة والتي تؤدي مهمة محددة ويتم استخدامها في البرامج عند الحاجة لتنفيذ هذه المهمة المعينة.
</p>

<p>
	تصنف البرمجة الإجرائية كذلك بأنها أحد أنواع البرمجة الأمرية imperative وهي برمجة نعطي فيها الحاسوب مجموعة من الأوامر أو التعليمات أو الخطوات المرتبة لنخبره بشكل مفصل بما يجب عليه القيام به من أجل تحقيق مهمة ما.
</p>

<h2>
	أمثلة على لغات برمجة إجرائية
</h2>

<p>
	قد تدعم بعض لغات البرمجة نموذج البرمجة الإجرائية فقط، لكن في الغالب ستجد أن معظم لغات البرمجة تدعم أكثر من نموذج برمجة بذات الوقت للاستفادة من ميزات كل نموذج ومنح المبرمج مزيدًا من المرونة في كتابة برامجه على سبيل المثال تدعم لغة بايثون Python ولغة C++‎ كلًا من نموذج البرمجة الإجرائية والبرمجة كائنية التوجه بذات الوقت.
</p>

<p>
	من الأمثلة الشائعة على لغات البرمجة الإجرائية نذكر:
</p>

<ul>
	<li>
		<strong>سي C</strong>: لغة برمجة إجرائية شهيرة تم تطويرها عام 1972 وتستخدم في العديد من المجالات أهمها تطوير نظم التشغيل والتطبيقات المضمنة وألعاب الفيديو.
	</li>
	<li>
		<strong>بيسك BASIC</strong>: لغة برمجة عالية المستوى تم تطويرها في عام 1964 بهدف جعل البرمجة سهلة التعلم والفهم للمبتدئين وكانت تستخدم لتطوير التطبيقات الإدارية البسيطة والبرامج التعليمية والألعاب.
	</li>
	<li>
		<strong>فورتران FORTRAN</strong>: من لغات البرمجة الإجرائية الشهيرة وهي أقدم لغة برمجة عالية المستوى طورت في خمسينيات القرن الماضي لتسهيل كتابة البرامج الرياضية والعلمية ولا تزال لليوم في المجالات العلمية والهندسية مثل التنبؤ بالطقس والفيزياء الحاسوبية والتحليل العددي.
	</li>
	<li>
		<strong>كوبول COBOL</strong>: لغة برمجة إجرائية قديمة عالية المستوى طورت بهدف تقديم لغة برمجة سهلة ومفهومة من قبل المبرمجين وهي لا تزال لليوم تستخدم في عالم الأعمال والمصارف (البنوك).
	</li>
	<li>
		<strong>الغول ALGOL</strong>: هي لغة برمجة إجرائية تستخدم لتطوير التطبيقات العلمية والهندسية وهي أول لغة برمجة أدخلت مفهوم الكتل البرمجية وسمحت بتداخل الإجراءات والدوال داخل بعضها البعض وتعد لغة مرجعية لتطوير معايير لغات البرمجة الأخرى.
	</li>
	<li>
		<strong>آدا Ada</strong>: لغة برمجة إجرائية صممت لتكون لغة آمنة وموثوقة للاستخدام في الأنظمة البرمجية المعقدة المستخدمة من قبل المنظمات الحكومية والمؤسسات الأكاديمية فهي تتضمن ميزات مثل الكتابة الصارمة ومعالجة الاستثناءات.
	</li>
	<li>
		<strong>باسكال Pascal</strong>: لغة برمجة عالية المستوى صممها <a href="https://ar.wikipedia.org/wiki/%D9%86%D9%8A%D9%83%D9%84%D8%A7%D9%88%D8%B3_%D9%88%D9%8A%D8%B1%D8%AB" rel="external nofollow">عالم الحاسوب نيكلاوس ويرث</a> بداية السبعينيات لتوفير لغة برمجة صارمة ومنظمة للمبتدئين في تعلم البرمجة، واستخدمت في البدايات لتطوير برامج معالجة البيانات وتطوير الألعاب وأثرت في تطوير العديد من لغات البرمجة الأخرى مثل دلفي وآدا.
	</li>
</ul>

<h2>
	مثال عملي لبرنامج مكتوب بأسلوب البرمجة الإجرائية
</h2>

<p>
	لتفهم البرمجة الإجرائية بشكل أفضل دعني أوضح لك الأمر بمثال عملي، إذا فكرنا بكتابة برنامج بلغة C لحساب المتوسط الحسابي لعلامات طالب ما، يمكن أن نفكر بكتابته مباشرة دون استخدام الإجراءات من خلال تخزين العلامات في مصفوفة ثم نستخدم حلقة for للتكرار خلال عناصر المصفوفة لحساب المتوسط وعرض قيمته ضمن البرنامج الرئيسي كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5680_8" style=""><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> marks</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">70</span><span class="pun">,</span><span class="pln"> </span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">95</span><span class="pun">,</span><span class="pln"> </span><span class="lit">59</span><span class="pun">};</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> size </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">marks</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">marks</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> size</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    sum </span><span class="pun">+=</span><span class="pln"> marks</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="typ">float</span><span class="pln"> avg </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">sum </span><span class="pun">/</span><span class="pln"> size</span><span class="pun">;</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Average: %f"</span><span class="pun">,</span><span class="pln"> avg</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الآن لو احتجنا لحساب المتوسط الحسابي لدرجات طالب آخر سنحتاج لتعريف مصفوفة أخرى تتضمن علامات هذا الطالب ونكرر نفس الكود على المصفوفة الثانية ويصبح الكود كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5680_10" style=""><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> marks1</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">70</span><span class="pun">,</span><span class="pln"> </span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">95</span><span class="pun">,</span><span class="pln"> </span><span class="lit">59</span><span class="pun">};</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> size1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">marks1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">marks1</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> sum1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> size1</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    sum1 </span><span class="pun">+=</span><span class="pln"> marks1</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="typ">float</span><span class="pln"> avg </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">sum1 </span><span class="pun">/</span><span class="pln"> size1</span><span class="pun">;</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Average1: %f"</span><span class="pun">,</span><span class="pln"> avg</span><span class="pun">);</span><span class="pln">

  </span><span class="typ">int</span><span class="pln"> marks2</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">76</span><span class="pun">,</span><span class="pln"> </span><span class="lit">93</span><span class="pun">,</span><span class="pln"> </span><span class="lit">78</span><span class="pun">,</span><span class="pln"> </span><span class="lit">93</span><span class="pun">,</span><span class="pln"> </span><span class="lit">86</span><span class="pun">};</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> size2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">marks2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">marks2</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> sum2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> size2</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    sum2 </span><span class="pun">+=</span><span class="pln"> marks2</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">

  </span><span class="pun">}</span><span class="pln">
  </span><span class="typ">float</span><span class="pln"> avg2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">sum2 </span><span class="pun">/</span><span class="pln"> size2</span><span class="pun">;</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Average2: %f"</span><span class="pun">,</span><span class="pln"> avg2</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">  
</span><span class="pun">}</span></pre>

<p>
	والآن ماذا لو أردنا حساب متوسط درجات 100 طالب تخيل حجم تكرار الكود الذي سيحصل في البرنامج! لذا سيكون من الأفضل التفكير في تعريف إجراء أو دالة تغلف تعليمات حساب المتوسط ونعيد استخدامها في البرنامج الرئيسي عند الحاجة كما يلي.
</p>

<p>
	لكتابة هذا البرنامج سنعرف إجراءً يسمى <code>average()‎</code> يأخذ مصفوفة الدرجات كوسيط ويحسب هذا الإجراء حجم المصفوفة ومجموع كل العناصر في المصفوفة ويعيد المتوسط بقسمة المجموع على حجم المصفوفة.
</p>

<p>
	وفي الدالة <code>main()‎</code> التي تمثل البرنامج الرئيسي نكتفي بتعريف مصفوفات الدرجات ونمررها كوسطاء للدالة <code>average()‎</code> لنحصل مباشرة على النتيجة المطلوبة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5680_12" style=""><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

</span><span class="typ">float</span><span class="pln"> average</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> arr</span><span class="pun">[]);</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> marks1</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">60</span><span class="pun">,</span><span class="pln"> </span><span class="lit">70</span><span class="pun">,</span><span class="pln"> </span><span class="lit">88</span><span class="pun">,</span><span class="pln"> </span><span class="lit">95</span><span class="pun">,</span><span class="pln"> </span><span class="lit">59</span><span class="pun">};</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> marks2</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">76</span><span class="pun">,</span><span class="pln"> </span><span class="lit">93</span><span class="pun">,</span><span class="pln"> </span><span class="lit">78</span><span class="pun">,</span><span class="pln"> </span><span class="lit">93</span><span class="pun">,</span><span class="pln"> </span><span class="lit">86</span><span class="pun">};</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Average1: %f"</span><span class="pun">,</span><span class="pln"> average</span><span class="pun">(</span><span class="pln">marks1</span><span class="pun">));</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Average2: %f"</span><span class="pun">,</span><span class="pln"> average</span><span class="pun">(</span><span class="pln">marks2</span><span class="pun">));</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">float</span><span class="pln"> average</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> arr</span><span class="pun">[])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> size </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">arr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">arr</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> size</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    sum </span><span class="pun">+=</span><span class="pln"> arr</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">sum </span><span class="pun">/</span><span class="pln"> size</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما تلاحظ عندما استخدمنا الدوال أو الإجراءات لتحقيق المطلوب تمكنا من تنظيم البرنامج بشكل أفضل واختصرنا حجم الشيفرات البرمجية المكررة وأصبح بإمكاننا إعادة استخدام الإجراءات عدة مرات.
</p>

<h2>
	خصائص البرمجة الإجرائية
</h2>

<p>
	يتضمن نموذج البرمجة الإجرائية مجموعة من الخصائص أو الميزات الرئيسية وأبرزها:
</p>

<ol>
	<li>
		النمطية
	</li>
	<li>
		الدوال المعرفة مسبقًا
	</li>
	<li>
		تصميم البرنامج من أعلى لأسفل
	</li>
	<li>
		تمرير المعاملات parameters
	</li>
	<li>
		المتغيرات العامة
	</li>
	<li>
		المتغيرات المحلية
	</li>
</ol>

<p>
	لنتعرف على المزيد من التفاصيل حول كل خاصية من هذه الخاصيات!
</p>

<h3>
	1. النمطية
</h3>

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

<h3>
	2. الدوال المعرفة مسبقًا
</h3>

<p>
	تتضمن كافة لغات البرمجة الإجرائية دوال مضمنة أو معرفة مسبقًا predefined functions لا تضطر المبرمج إلى ترميز كل شيء من البداية حيث تؤدي هذه الدوال المدمجة في اللغة وظائف محددة مثل العمليات الحسابية أو عمليات إدخال أو إخراج البيانات وتُضمَّن في مكتبات قياسية جاهزة يمكن للمبرمج استدعاؤها مباشرة والاستفادة منها.
</p>

<h3>
	3. هيكلة البرنامج من أعلى لأسفل
</h3>

<p>
	عندما تفكر في تطوير برنامج باستخدام إحدى لغات البرمجة الإجرائية تفكر من الأعلى للأسفل أي أنك تقسم البرنامج إلى أجزاء أصغر يتم تنفيذها بطريقة متسلسلة. حيث تفكر بداية في الهدف الأساسي العام للبرنامج ثم تقوم بتقسيمه إلى أجزاء أصغر لتنفيذ هذا الهدف وتكتب كافة الإجراءات أو الدوال المطلوب لتشغيله وتتحكم في تدفق الكود من خلال استدعاء هذه الدوال بالترتيب المناسب.
</p>

<h3>
	4. تمرير المعاملات
</h3>

<p>
	تعتمد البرمجة الإجرائية على ميزة تمرير المعاملات parameter passing إلى الإجراءات أو الدوال والتي تمثل دخل الإجرائية وهي البيانات اللازمة لتنفيذ عمليات الإجرائية ثم إرجاع خرج، أي لكل إجرائية عادةً دخل تعطي بمقابله خرج ما.
</p>

<h3>
	5. المتغير المحلي Local Variable
</h3>

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

<h3>
	6. المتغير العام Global Variable
</h3>

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

<h2>
	استخدامات اللغات الإجرائية
</h2>

<p>
	تعد لغات البرمجة الإجرائية مناسبة للاستخدام في مجال <a href="https://academy.hsoub.com/files/35-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/" rel="">تعليم البرمجة للمبتدئين</a> لكونها تتميز بالوضوح وسهولة الفهم، كما أنها تستخدم لتطوير الأنظمة البرمجية البسيطة غير المعقدة التي لا تحتاج للكثير من المعالجات الفرعية وكتابة إجراءات متداخلة مع بعضها البعض.
</p>

<p>
	تناسب لغات البرمجة الإجرائية كذلك تطوير برامج الحسابات وحل كافة أنواع المشكلات العلمية والتقنية الواضحة.
</p>

<h2>
	مميزات وسلبيات البرمجة الإجرائية
</h2>

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

<h3>
	مميزات البرمجة الإجرائية
</h3>

<ul>
	<li>
		تتسم لغة البرمجة الإجرائية بالبساطة وسهولة الفهم ولهذا السبب يبدأ معظم من المبرمجين بتعلم إحدى لغات البرمجة الإجرائية وفهم أساسياتها قبل الانتقال لأساليب برمجة أخرى.
	</li>
	<li>
		تعتمد لغة البرمجة الإجرائية على تقسيم الكود إلى أجزاء أصغر مما يسهل على المبرمجين تنظيم العمل ومتابعة سير عمل البرنامج واختبار وتصحيح الأخطاء البرمجية بشكل أسرع.
	</li>
	<li>
		توفر البرمجة الإجرائية ميزة تعريف الإجراء مرة واحدة واستدعائه كلما دعت الحاجة مما يقلل الكثير من تكرار الشيفرات البرمجية ضمن البرنامج.
	</li>
	<li>
		تسهل البرمجة الإجرائية إعادة استخدام الكود في برامج خارجية من خلال حفظ هذه الإجراءات ضمن مكتبات واستيرادها إلى البرامج عند الحاجة.
	</li>
	<li>
		تسهل البرمجة الإجرائية ميزة توزيع المهام على فريق من المبرمجين عند العمل على البرامج الكبيرة حيث يمكن لكل مبرمج تطوير قسم من الإجراءات المطلوبة لإكمال البرامج بشكل أسرع.
	</li>
</ul>

<h3>
	سلبيات لغة البرمجة الإجرائية
</h3>

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

<h2>
	ما الفرق بين لغة البرمجة الإجرائية ولغة البرمجة كائنية التوجه؟
</h2>

<p>
	يقسم البرنامج في البرمجة الإجرائية إلى مجموعة من المتغيرات وهياكل البيانات والإجراءات وتكون هذه الإجراءات هي العناصر الأساسية للبرنامج فهي التي تتعامل مع المتغيرات و<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%8A%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-structures/" rel="">هياكل البيانات</a>، بينما في البرمجة بالكائنات أو البرمجة كائنية التوجه <abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr> فيقسم البرنامج إلى مجموعة من الكائنات تمثل عناصره الرئيسية ويكون لكل كائن منها بياناته الخاصة والإجراءات التي تعالج هذه البيانات.
</p>

<p>
	ففي البرمجة الإجرائية تكون الإجراءات أو الدوال مكونات مستقلة قائمة بذاتها في البرنامج، بينما في البرمجة كائنية التوجه تكون الإجراءات جزءًا من بينة الكائنات نفسها وكما ذكرنا سابقًا لا تكون البرمجة الإجرائية هي أفضل لغة للمشاريع الحساسة للبيانات لذا توفر البرمجة بالكائنات نموذجًا أفضل لحماية البيانات ومنع التعديل عليها خارج الكائن.
</p>

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

<p>
	وفيما يلي جدول مختصر للمقارنة بين البرمجة الإجرائية ولغة البرمجة كائنية التوجه:
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:right">
				البرمجة الإجرائية
			</th>
			<th style="text-align:right">
				البرمجة كائنية التوجه
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:right">
				تركز لغة البرمجة الإجرائية على تنفيذ مجموعة من الخطوات المتسلسلة لحل المشكلة المطلوبة
			</td>
			<td style="text-align:right">
				تركز البرمجة كائنية التوجه على البيانات التي يجب استخدامها لحل المشكلة المطلوبة
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				الدوال هي العناصر الأساسية للبرنامج
			</td>
			<td style="text-align:right">
				الأصناف والكائنات هي العناصر الأساسية للبرنامج
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				لا تضمن حماية البيانات وأمانها
			</td>
			<td style="text-align:right">
				تضمن حماية البيانات بشكل كبير عن طريق إخفاء البيانات الحساسة عن المستخدمين
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				مناسبة للتطبيقات البسيطة عامة الأغراض وأنظمة التشغيل والبرامج المضنمة
			</td>
			<td style="text-align:right">
				مناسبة للتطبيقات الكبيرة والمعقدة
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				لا تمكنك من نمذجة مشكلات العالم الحقيقي بفعالية.
			</td>
			<td style="text-align:right">
				تمكنك من نمذجة مشكلات العالم الحقيقي بفعالية ومرونة.
			</td>
		</tr>
	</tbody>
</table>

<p>
	وللمزيد من المعلومات حول البرمجة كائنية التوجه وأهم مفاهيمها واستخداماتها أنصحك بمطالعة مقال <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-r1375/" rel="">البرمجة كائنية التوجه</a>.
</p>

<h2>
	الخلاصة
</h2>

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

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

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">دليلك الشامل إلى لغات البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">تعلم أساسيات البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A8%D8%B3%D8%A7%D8%B7%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r1870/" rel="">قواعد البرمجة ببساطة للمبتدئين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2103</guid><pubDate>Sun, 10 Sep 2023 13:03:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x64A; &#x641;&#x648;&#x627;&#x626;&#x62F; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%81%D9%88%D8%A7%D8%A6%D8%AF-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/--.png.5b7fc88f75ea4b083e52822f98f623bc.png" /></p>
<p>
	نسلط الضوء في مقال اليوم على فوائد تعلم البرمجة التي تشكل حجر الأساس لكافة التطبيقات والبرمجيات التي نستخدمها يوميًا سواء على أجهزة الحواسيب أو الجوالات أو غيرها من الأجهزة الذكية القابلة للبرمجة، فبدون البرمجة لن تكون كل هذه الأجهزة قادرة على تلبية متطلباتنا.
</p>

<p>
	إذا كنت مهتمًا بالتعرف أكثر على ماهية البرمجة والمميزات التي ستحصل عليها عند تعلم البرمجة واكتساب القدرة على كتابة الشيفرات البرمجية وفهمها على الصعيد الشخصي والعمل فتابع قراءة المقال للنهاية.
</p>

<h2>
	ما هي البرمجة؟
</h2>

<p>
	قبل أن نشرح أهمية <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662" rel="">تعلم البرمجة</a> دعنا نوضح بداية ما هي البرمجة بالتحديد وما هي استخدامات البرمجة ولماذا ينبغي عليك تعلمها؟
</p>

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

<p>
	تتعدد <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أنواع لغات البرمجة</a> مثل بايثون وجافا سكريبت وجافا و C#‎ وروبي …إلخ. لكن يمكن القول بأن كل هذه اللغات تتشارك نفس المفاهيم فالبرامج الحاسوبية ما هي إلا شيفرات برمجية مكونة من سلسلة مرتبة من الأوامر والتعليمات اللازمة لتأدية مهمة أو حل مشكلة ما، ثم يقرأ الحاسوب هذه التعليمات وينفذها واحدة تلو الأخرى ليعطينا النتائج المطلوبة.
</p>

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

<p>
	بناء على ذلك، يعتبر تعلم الخوارزميات أحد الخطوات الأساسية في تعلم البرمجة فإذا لم يكن لديك خوارزمية صحيحة تحقق الهدف المطلوب فلن يكون لديك برنامج صحيح، وتُعرَّف الخوارزمية بأنها تسلسل منطقي يوضح كافة الخطوات اللازمة لحل مشكلة أو مسألة ما وهو مفهوم لا يقتصر استخدامه على البرمجة أو تطوير البرامج بل يمكنك تطبيقه لحل أي مشكلة حياتية تواجهك، ويمكنك مطالعة المزيد حول الخوارزميات وطرق كتابتها في مقال <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">المرجع الشامل إلى تعلم الخوارزميات للمبتدئين</a>.
</p>

<h2>
	مستقبل البرمجة
</h2>

<p>
	ازدادت أهمية تعلم البرمجة اليوم أكثر من أي وقت مضى نظرًا للتطور التقني الحاصل في مجال التقنية والبرمجيات والذكاء الاصطناعي فلا يكاد يوجد عمل اليوم لا يتطلب استخدام البرامج الحاسوبية ما جعل البرمجة أحد المهارات الأساسية المطلوبة بكثرة في سوق العمل.
</p>

<p>
	أضف إلى ذلك فإن تعلم البرمجة سيحولك من مستهلك للتقنية إلى منتج لها ويكسبك القدرة على التعامل مع الأجهزة والبرمجيات باحترافية ومرونة كما يكسبك القدرة على إنتاج حلول تقنية وبرامج مفيدة لحل المشكلات التي تواجهها ويطور مهاراتك في التفكير.
</p>

<p>
	لذلك السبب، نجد أن معظم البلدان اليوم ومن بينها دول عربية قد أدركت فوائد تعلم لغات البرمجة و أدرجتها في المناهج الدراسية بدءًا من المراحل الابتدائية المبكرة لتهيئة الجيل الجديد للمستقبل وتوسيع أفق تفكيرهم ومساعدتهم على مواكبة التطور التقني بسهولة فمن يتعلم البرمجة في سن مبكرة سيفهم التقنية ويتعامل معها بشكل أفضل من أولئك الذين لا يتعلمونها.
</p>

<h2>
	فوائد تعلم لغات البرمجة
</h2>

<p>
	إن فوائد تعلم البرمجة كثيرة منها مساعدتك على تأدية الأعمال بكفاءة أكبر وتضمن لك مستقبلًا واعدًا كما تقدم لك العديد من الفوائد الأخرى على صعيد العمل والحياة الشخصية.
</p>

<h3>
	من أهم فوائد تعلم البرمجة:
</h3>

<ul>
	<li>
		ضمان الحصول على عمل
	</li>
	<li>
		الحصول على رواتب مجزية
	</li>
	<li>
		إمكانية العمل عن بعد
	</li>
	<li>
		محو الأمية الرقمية
	</li>
	<li>
		مواكبة التطور التقني
	</li>
	<li>
		تحسين التفكير والقدرة على حل المشكلات
	</li>
	<li>
		أتمتة الأعمال اليومية وزيادة الإنتاجية
	</li>
	<li>
		تحسين مهارات التواصل
	</li>
	<li>
		اكتساب الصبر والتركيز
	</li>
</ul>

<p>
	لنناقش بمزيد من التفصيل كل فائدة من الفوائد الواردة أعلاه!
</p>

<h4>
	ضمان الحصول على عمل
</h4>

<p>
	نظرًا للطلب الكبير على المبرمجين بمختلف تخصصاتهم فإن أحد أهم فوائد تعلم البرمجة تحقيق الأمان الوظيفي وضمان العثور على فرصة مناسبة في سوق العمل لذا ابدأ من الآن بتعلم البرمجة كي تضمن العثور على الكثير من الفرص في حياتك المهنية.
</p>

<p>
	وحتى لو لم تكن ترغب بالعمل في مجال التقنية وتطوير البرمجيات إلا أن تعلم البرمجة هو مهارة أساسية تفيدك في كل مجال فكل الصناعات اليوم تعتمد على الحواسيب للقيام بالأعمال وترغب بالتأكيد في توظيف شخص يعرف كيفية عمل هذه الحواسيب ويستخدمها باحترافية.
</p>

<h4>
	الحصول على رواتب مجزية
</h4>

<p>
	تعد البرمجة من أكثر المهن المربحة التي تضمن لك أجرًا مرتفعًا لا سيما إذا كنت تملك الخبرة والمهارة الكافية ولديك معرض أعمال قوي فالطلب على المطورين والمبرمجين من مختلف التخصصات في تزايد مستمر.
</p>

<p>
	وبالرغم من أن رواتب المبرمجين تختلف حسب الموقع الجغرافي وعدد سنوات الخبرة والتخصص البرمجي إلا أن متوسط رواتب المبرمجين بشكل عام يبقى أعلى من متوسط الرواتب لبقية المهن.
</p>

<h4>
	إمكانية العمل عن بعد
</h4>

<p>
	أحد فوائد تعلم البرمجة الجلية التي ستجنيها من تعلمها والعمل بها هي <a href="https://academy.hsoub.com/freelance/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AB%D9%82%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%AD%D8%B1-r363/" rel="">حرية اختيار العمل عن بعد</a> من داخل منزلك أو أي مكان هادئ تفضله والتعاقد مع أي عميل حول العالم أو العمل الحر بشكل مستقل خلال أوقات عمل مرنة لا تلزمك بساعات محددة يفرضها عليك صاحب العمل.
</p>

<p>
	فإذا كنت ممن يفضل العمل عن بعد على بيئات العمل التقليدية وتجد أن هذا يساهم في زيادة تركيزك وإنتاجيتك ومردودك فقرار تعلم البرمجة لبدء مهنة جديدة هو فرصتك لتحقيق هذا الأمر.
</p>

<h4>
	محو الأمية الرقمية
</h4>

<p>
	يمكن القول أن عدم القدرة على كتابة وفهم التعليمات البرمجية في عصرنا الحالي يكافئ عدم القدرة على القراءة والكتابة من سنوات قليلة مضت، فمعظم الوظائف اليوم تتطلب معرفة أساسية بالتعامل مع الحاسوب واستخدام التطبيقات والبرامج المختلفة.
</p>

<p>
	فإذا كنت لا تريد أن توصف بالجهل الرقمي أنصحك بأن تبدأ بتعلم البرمجة وتفهم كيفية عمل التطبيقات والبرامج التي تستخدمها في حياتك اليومية وتكون مرنًا ومتكيفًا مع المتطلبات المتغيرة في عالم التقنية سريع التطور.
</p>

<h4>
	مواكبة التطور التقني
</h4>

<p>
	من منا اليوم لا يستخدم التقنيات والتطبيقات والأجهزة الذكية! بدءًا من التسوق عبر الإنترنت ودفع الفواتير ووصولًا للسيارات المبرمجة ذاتية القيادة والروبوتات الذكية التي أصبحت تنوب عنا في أداء الأعمال اليومية.
</p>

<p>
	فقد أصبح كل شيء حولنا اليوم مزودًا بالتقنيات الحديثة وتعلم البرمجة يكسبنا القدرة على فهم طريقة عمل هذه التقنيات والتآلف معها بسرعة أكبر.
</p>

<h4>
	تحسين التفكير والقدرة على حل المشكلات
</h4>

<p>
	فتعلم إحدى <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> شبيه بتعلم لغة ثانية ومن شأنه أن يزيد قدرات عقلك ويوسع مداركك، كما أن تعلم البرمجة يجعل تفكيرك أكثر تنظيمًا وإبداعًا ويكسبك مرونة أكبر في التعامل مع أي مشكلة تواجهك وحلها بذكاء، وهذا لا ينطبق على المشكلات التقنية فقط بل ينعكس على كافة مجالات الحياة والعمل.
</p>

<p>
	فالبرمجة مهارة تفيد الجميع وليست حكرًا على المبرمجين، وهنا تحضرني مقولة شهيرة لمؤسس شركة آبل ستيف جوبز:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		"أعتقد أن كل شخص في هذه البلاد يجب أن يتعلم البرمجة لأنها تعلمه كيف يفكر"
	</p>
</blockquote>

<h4>
	أتمتة الأعمال وزيادة الإنتاجية
</h4>

<p>
	من فوائد تعلم البرمجة إكسابك القدرة على أتمتة الأعمال والمهام اليدوية المتكررة من خلال كتابة أكواد برمجية تنجز لك هذه المهام بسرعة ودون أخطاء وبهذا يمكنك استثمار وقتك وزيادة إنتاجيتك.
</p>

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

<h4>
	تحسين مهارات التواصل
</h4>

<p>
	تحتاج في مجال العمل البرمجي للتواصل مع أعضاء فريق التطوير أو مع زملاء في العمل من أقسام مختلفة أو ربما مع عملاء مختلفين متواجدين في أي مكان حول العالم إذا كنت تعمل بشكل مستقل وتعلم البرمجة يساعدك على تحسين مهارات التواصل وتوصيل الأفكار المعقدة للآخرين.
</p>

<p>
	حتى لو لم تكن تنوي احتراف البرمجة فإن أحد فوائد تعلم البرمجة هو مساعدتك على التواصل مع الموظفين التقنيين في بيئة عملك وفهمهم والنقاش معهم بشكل أفضل.
</p>

<h4>
	تعلم الصبر والتركيز
</h4>

<p>
	مهنة البرمجة من أكثر المهن التي تتطلب الهدوء والصبر والتركيز فعند العمل على حل مشكلة برمجية قد تحتاج لقضاء ساعات في كتابة الشيفرات البرمجية وحل الأخطاء وتحسين النتائج حتى تحصل على النتيجة المرجوة.
</p>

<p>
	ستجد بعد مدة من ممارسة البرمجة أنك تميل للصبر والهدوء عندما تواجه أي عقبات أو صعوبات في عملك أو حياتك اليومية وهذه مهارة مهمة نحتاجها جميعًا.
</p>

<h2>
	نصائح لتعلم البرمجة بكفاءة
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="134396" href="https://academy.hsoub.com/uploads/monthly_2023_09/--.png.4d0b25e0a958beb5669ce3008dda5d37.png" rel=""><img alt="فوائد تعلم البرمجة" class="ipsImage ipsImage_thumbnailed" data-fileid="134396" data-ratio="62.50" data-unique="i9uuloppq" style="width: 800px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_09/--.thumb.png.5e4363a5a696c92dcd503853e1363bbf.png"></a>
</p>

<p>
	بعد أن تعرفت على فوائد تعلم البرمجة لا بد أنك متحمس الآن لبدء رحلة تعلم البرمجة واحترافها لذا سأختم المقال بجملة من النصائح السريعة التي تساعدك على تعلم البرمجة بسرعة وتجنبك الفشل.
</p>

<p>
	البرمجة ليست مجرد كتابة شيفرات برمجية بل هي تعلم طريقة التفكير بطرق مبتكرة وحل المشكلات المعقدة لذا حسّن مبادئ التفكير المنطقي والخوارزمي لديك وجرب حل التحديات والألغاز البرمجية قبل أن تبدأ تعلم إحدى لغات البرمجة.
</p>

<p>
	إليك جملة نصائح لتعلم البرمجة بكفاءة:
</p>

<ul>
	<li>
		<p>
			ابدأ بتعلم لغة برمجة سهلة وتناسب المبتدئين مثل بايثون <a href="https://wiki.hsoub.com/Python" rel="external">Python</a> أو جافا سكريبت <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> أو روبي <a href="https://wiki.hsoub.com/Ruby" rel="external">Ruby</a> كما يمكنك البدء بإحدى لغات البرمجة المرئية المعتمدة على الكتل مثل <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-scratch-r1407/" rel="">لغة سكراتش</a> التي تعلمك البرمجة بطريقة ممتعة ومسلية.
		</p>
	</li>
	<li>
		<p>
			تعلم <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أساسيات البرمجة</a> مثل الشروط والحلقات والمتغيرات والدوال و<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%8A%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-structures/" rel="">هياكل البيانات data structures</a> وتأكد من إتقانها قبل الانتقال لمواضيع أكثر تقدمًا.
		</p>
	</li>
	<li>
		<p>
			ستجد الكثير من مصادر التعلم المتنوعة عبر الإنترنت، وهذا أمر رائع لكنه قد يشتتك لذا احرص على اتباع مصدر محدد وموثوق والتزم بالتعلم منه وفي حال واجهت صعوبة في فهم أمر ما يمكنك البحث عن مصادر إضافية.
		</p>
	</li>
	<li>
		<p>
			احرص على التطبيق العملي وممارسة كل ما تتعلمه فالاكتفاء بالمعلومات النظرية ومشاهدة الدروس ومقاطع الفيديو لن يساعدك على تعلم البرمجة بطريقة احترافية.
		</p>
	</li>
	<li>
		<p>
			لا تتوقف عن التعلم وتطوير مهاراتك والاطلاع على أحدث الأدوات والتقنيات واستخدامها في مشاريعك البرمجية.
		</p>
	</li>
</ul>

<h2>
	الخلاصة
</h2>

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

<p>
	ابدأ من الآن خطوتك الأولى لتعلم البرمجة فقد تكون أنت من سيطور برامج رائعة تخدم البشرية!
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">مدخل إلى الخوارزميات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D9%87%D9%84-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أسهل لغات البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A3%D9%87%D9%85-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أهمية البرمجة وأهم لغات البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2101</guid><pubDate>Mon, 04 Sep 2023 13:00:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x64A; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8%D8%9F-r2094/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/-.png.b62b0f5dd6f574c515cff012af20fbb8.png" /></p>
<p>
	سنتعرف في مقال اليوم على مفهوم صفحات الويب وكيف تعمل ونتعرف على أهم مكوناتها ونميز بين أنواع صفحات الويب الثابتة والديناميكية، وأخيرًا نوضح أهم الخطوات والتقنيات التي عليك تعلمها لتصمم وتبرمج هذه الصفحات.
</p>

<h2>
	تعريف صفحة الويب Web Page
</h2>

<p>
	قد تتساءل، ما هي صفحة الويب؟ سأجيبك، هي مستند مكون من سلسلة من التعليمات البرمجية المكتوبة بإحدى لغات الويب ويتم عرضها داخل تطبيق مخصص يسمى متصفح الويب Web Browser.
</p>

<p>
	تستخدم صفحات الويب بشكل أساسي لعرض المعلومات بأشكال مختلفة من نصوص ورسومات وصور ومقاطع الفيديو وروابط لصفحات ويب أخرى وإتاحتها عبر شبكة الإنترنت وتشكل مجموعة صفحات الويب المتعددة المرتبطة مع بعضها البعض موقع ويب
</p>

<p>
	يمكن لصفحات الويب أن تكتب بأنواع مختلفة من لغات البرمجة مثل <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافا سكريبت</a> و <a href="https://wiki.hsoub.com/PHP" rel="external">PHP </a>وغيرها من اللغات والتقنيات وفق ما تقتضي الحاجة، لكن تعد لغة HTML التقنية الأساسية لبناء صفحة الويب، فصفحات الويب بتنسيق HTML هي المعيار للمحتوى الذي يعرضه متصفح الإنترنت.
</p>

<p>
	وتجدر الإشارة إلى أن <span ipsnoautolink="true">HTML</span> ليست لغة برمجة بالمعنى المتعارف، بل لغة توصيفية markup language تعتمد على رموز خاصة تسمى الوسوم Tags، هذه الوسوم مسؤولة عن وصف بنية صفحات الويب وطريقة عرض محتوياتها وإظهارها بالبنية التي نريدها، كعرضها بشكل فقرات أو جداول أو تعدادات نقطية …إلخ.
</p>

<p>
	تتميز لغة التوصيف HTML بكونها مفهومة ومعبرة فكل ما تقوم به هو وصف أسلوب عرض المحتوى للمتصفح و<a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1639/" rel="">طريقة تخطيط صفحة الويب</a>، على سبيل المثال لإدراج عنوان رئيسي وفقرة في صفحة الويب نكتب اكتب العنوان بين علامتي <code>&lt;h1&gt;</code> و <code>&lt;h1/&gt;</code> ولكتابة فقرة نصية اكتبها بين علامتي <code>&lt;p&gt;</code> و <code>&lt;p/&gt;</code> بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5904_6" style=""><span class="tag">&lt;h1&gt;</span><span class="pln"> هذا هو عنوان الفقرة</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln"> هذا هو محتوى الفقرة</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	قم بكتابة الكود السابق في أي محرر نصوص مثل المفكرة واحفظه بالامتداد ‎.html أو ‍‎.htm وسمه بأي اسم تختاره ليكن example.html، ستلاحظ أن أيقونة الملف قد تحولت إلى صفحة ويب وعند فتحها تعرض في المتصفح الافتراضي لديك وتظهر بشكل مشابه للصورة التالية:
</p>

<p style="text-align: center;">
	<img alt="وسوم html ضمن صفحات الويب.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="133102" data-ratio="40.67" data-unique="hld9v4gws" style="width: 600px; height: auto;" width="600" src="https://academy.hsoub.com/uploads/monthly_2023_08/html.PNG.883ffa93780ada2015e17597d583923a.PNG">
</p>

<p>
	لاحظ أن النص (هذا هو عنوان الفقرة) ظهر كعنوان غامق لأننا غلفناه بعلامات خاصة بالعنوان، بينما ظهر النص (هذا هو محتوى الفقرة) كنص عادي لأننا وضعناه بين علامتين تدلان على كونه فقرة نصية.
</p>

<p>
	تحتاج هذه الصفحة للكثير بالطبع من أكواد HTML الإضافية كي تبدو صفحة ويب متكاملة الأركان، كما تحتاج لإضافة تنسيقات مختلفة من خطوط وألوان وتخطيطات لجعل مظهرها أكثر احترافية وهو ما تقوم به لغة <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> التي تتكامل مع لغة HTML حيث تضاف شيفرات CSS بعدة طرق إلى صفحة الويب، فهي إما أن تكتب في ملف ‎.html نفسه، أو تضاف في ملف نصي مستقل بالامتداد css. بأي اسم تختاره وليكن styles.css ثم تربط مع ملف ‎.html من خلال كتابة الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5904_11" style=""><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/css"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"styles.css"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;h1&gt;</span><span class="pln"> هذا هو عنوان الفقرة</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln"> هذا هو محتوى الفقرة</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	لسنا بصدد شرح أكواد CSS في هذا المقال لكننا سنكتب بعض التنسيقات البسيطة لصفحتنا لتفهم الفكرة التي تعمل من خلالها صفحات الويب، على سبيل المثال لجعل العنوان الذي أضفناه بالصفحة باللون الأحمر والفقرة باللون الأزرق تكتب في ملف التنسيقات الأكواد التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5904_13" style=""><span class="pln">h1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعدها عند عرض الصفحة ستظهر لنا بالشكل المنسق التالي:
</p>

<p style="text-align: center;">
	<img alt="صفحة Html منسقة.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="133099" data-unique="czygq7rju" src="https://academy.hsoub.com/uploads/monthly_2023_08/Html.PNG.1f07d1bbfc6ce9d69da72e9c209365e8.PNG">
</p>

<p>
	للمزيد حول تصميم صفحات الويب وكتابة أكواد CSS يمكنك مطالعة <a href="https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/" rel="">مقال HTML و CSS للمبتدئين: كيف تصمم أول صفحة ويب لك </a>ومقال  <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css-r1688/" rel="">أساسيات CSS</a>، كما يمكنك تعلم المزيد حول ربط أكواد مع ملف ‎.html من خلال مقالة <a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D9%88%D9%82%D8%B9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r1879/" rel="">كيفية بناء موقع باستخدام CSS</a>.
</p>

<h2>
	ما هو متصفح الويب؟
</h2>

<p>
	ذكرنا في الفقرات السابقة كلمة متصفح عدة مرات وذكرنا أنه برنامج يستخدم لفتح صفحات الويب وعرضها، ولعلك تتساءل ما هو دور المتصفح في صفحات الويب التي هي بالأساس مستندات نصية تكتب ضمن محررات نصوص أو محررات أكواد برمجية؟ وإليك الجواب:
</p>

<p>
	كي تتمكن من فتح صفحات الويب على جهازك تحتاج لوجود برنامج <strong>متصفح الويب</strong> وهو عبارة عن تطبيق يمكنك من الوصول إلى المعلومات المضمنة في صفحات الويب وعرضها بالشكل الصحيح، فهو بمثابة حاوية تعرض كافة محتويات الصفحة.
</p>

<p>
	هناك الكثير من متصفحات الويب وأشهر خمس متصفحات هي:
</p>

<ol>
	<li>
		جوجل كروم Chrome
	</li>
	<li>
		فايرفوكس Firefox
	</li>
	<li>
		مايكروسوفت إيدج Microsoft Edge
	</li>
	<li>
		أوبرا Opera
	</li>
	<li>
		سفاري Safari
	</li>
</ol>

<p>
	كي تتمكن متصفحات الويب من عرض صفحات الويب فهي تستخدم محرك عرض <strong>Rendering Engine</strong> أو ما يسمى بمحرك التخطيط <strong>Layout Engine</strong> مهمته أخذ كافة معلومات المحتوى والتصميم الواردة في التعليمات البرمجية التي كتبت بها هذه الصفحة وتفسيرها وعرضها بالشكل النهائي لك.
</p>

<p>
	يستخدم كل متصفح محرك عرض مختلف عن الآخر، على سبيل المثال يستخدم فايرفوكس محركًا يسمى Gecko ويستخدم كل من كروم وأوبرا محرك باسم Blink كما أن بعض المتصفحات قد تستخدم تقنيات خاصة بها غير متوفرة في متصفحات أخرى، ما يهمك في هذا الأمر أن تفهم سبب وجود الاختلافات عند طريقة عرض صفحات الويب من متصفح لآخر، أو سبب عدم عمل بعض الميزات في متصفح بينما تعمل بشكل مثالي في متصفح آخر، ولهذا السبب يحرص مصممو المواقع على <a href="https://academy.hsoub.com/programming/html/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%81%D9%8A-html-%D9%88-css-r1955/" rel="">معالجة المشاكل الشائعة للتوافق مع المتصفحات في HTML و CSS</a>.
</p>

<h2>
	كيف أفتح صفحات الويب؟
</h2>

<p style="text-align: center;">
	<img alt="كيف أفتح صفحة الويب.png" class="ipsImage ipsImage_thumbnailed" data-fileid="133100" data-ratio="62.60" data-unique="bzqgob8hy" style="width: 600px; height: auto;" width="600" src="https://academy.hsoub.com/uploads/monthly_2023_08/.thumb.png.d9e20a06180c5ba1a9ac767db8c0b389.png">
</p>

<p>
	يملك كل موقع ويب اسم نطاق <a href="https://academy.hsoub.com/devops/networking/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r573/" rel="">Domain name</a> مميز خاص به لا يستخدمه أي موقع آخر ويجب حجزه من خلال دفع رسوم شهرية أو سنوية لشركات تسجيل أسماء المجالات على سبيل المثال اسم المجال الرئيسي لشركة حسوب هو hsoub.com وهذا المجال هو جزء من عنوان الموقع الكامل URL وهو <a href="https://www.hsoub.com/" rel="external">https://www.hsoub.com/</a>‎.
</p>

<p>
	حيث تمتلك كل صفحة ويب <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> فريد يميزها ويحدد موقعها الدقيق على شبكة الإنترنت فمن أجل فتح صفحة الويب وعرض محتواها كل ما عليك هو فتح المتصفح المثبت على جهازك وكتابة عنوان URL الخاص بها في شريط عنوان المتصفح عندها سيطلب المتصفح أو ما يعرف بالعميل Client جلب محتويات هذه الصفحة من خادم الويب البعيد Server ويعرضها لك.
</p>

<p>
	على سبيل المثال للوصول للصفحة الرئيسية لأكاديمية حسوب كل ما عليك هو إدخال العنوان <a href="https://academy.hsoub.com/%E2%80%8E%E2%80%8F%E2%80%8F%E2%80%8F" ipsnoembed="true" rel="">https://academy.hsoub.com/‎‏‏‏</a> في شريط عنوان المتصفح، وللوصول إلى الصفحة الخاصة بدروس البرمجة في الأكاديمية يمكنك كتابة العنوان <a href="https://academy.hsoub.com/programming/%E2%80%8E" ipsnoembed="true" rel="">https://academy.hsoub.com/programming/‎</a> أما إذا كنت لا تعرف العنوان الخاص بصفحة أو موقع ما يمكنك البحث عن اسمه بأحد محركات البحث والوصول له من خلال نتائج البحث وهذه الطريقة هي الأمر الشائع لدى المستخدمين بدلًا من حفظ العناوين الخاصة بكل صفحة.
</p>

<p>
	محرك البحث Search Engine هو نوع خاص من مواقع الويب يتم الوصول لها من خلال متصفح الويب ليساعدك في العثور على مواقع وصفحات الويب وأشهرها على الإطلاق محرك بحث جوجل الذي يتميز بدقة نتائجه، ومؤخرًا برز اسم محرك بحث Bing من شركة مايكروسوفت الذي يعمل بتقنيات <a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي</a>.
</p>

<h2>
	ما الفرق بين موقع الويب وصفحة الويب؟
</h2>

<p>
	يتكون موقع الويب عادة من عدة صفحات ويب مرتبطة ببعضها البعض بطرق مختلفة والتي تشترك في اسم مجال أو عنوان فريد خاص بها. يمكن تشبيه صفحة الويب بصفحة من كتاب والموقع بالكتاب نفسه الذي يجمع في طياته كل هذه الصفحات تحت عنوان واحد مشترك ويكون لكل صفحة منها عنوانها الخاص الذي يميزها.
</p>

<p>
	ينظم موقع الويب على شكل صفحات مرتبطة مع بعضها البعض <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1434/" rel="">بروابط تشعبية</a> وأهم هذه الصفحات هي الصفحة الرئيسية وهي الصفحة الأولى التي يراها المستخدم عند دخوله إلى موقع الويب وهي تعطيك نظرةً شاملةً عن محتوى الموقع ومنها تنتقل عبر صفحات الموقع الفرعية الأخرى، ويجب أن يحرص مصمم الموقع على جعل <a href="https://academy.hsoub.com/programming/general/%D8%AB%D9%85%D8%A7%D9%86%D9%8A-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%84%D8%AC%D8%B9%D9%84-%D9%82%D8%A7%D8%A6%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9-%D8%A3%D9%83%D8%AB%D8%B1-%D9%82%D8%A7%D8%A8%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-r680/" rel="">التنقل في صفحات الموقع</a> واضحًا وسهل الاستخدام كي لا يشتت زوار الموقع.
</p>

<h2>
	ما هي عناصر صفحة الويب؟
</h2>

<p>
	تختلف العناصر أو الأقسام التي تحتويها صفحات الويب وطريقة توزيع المحتوى ضمن هذه الأقسام بحسب الهدف من هذه الصفحة وطبيعة المحتوى الذي تتضمنه لكن يمكن القول أن معظم صفحات الويب تتضمن العناصر التالية:
</p>

<ul>
	<li>
		<p>
			<strong>ترويسة الصفحة</strong>: وهي تتضمن عادة اسم الموقع أو شعار الموقع وشريط التنقل بين صفحات الموقع وصندوق للبحث في محتوى الموقع، وقد تتضمن بعض الإشعارات أو العروض المميزة أو الصور المميزة التي تريد لفت نظر المستخدمين لها.
		</p>
	</li>
	<li>
		<p>
			<strong>الشريط الجانبي للصفحة</strong>: وهو قسم اختياري في الصفحة يعرض المعلومات التي لا تكون جزءًا من المحتوى الرئيسي للصفحة. وقد يتضمن إعلانات أو <a href="https://academy.hsoub.com/marketing/performance-marketing/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A9-%D9%88%D8%B5%D8%A7%D9%8A%D8%A7-%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%AF%D8%B9%D9%88%D8%A9-%D9%84%D8%A7%D8%AA%D8%AE%D8%A7%D8%B0-%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-cta-r506/" rel="">عبارات دعوة لاتخاذ إجراء CTA</a> أو روابط لأجزاء أخرى من موقع الويب وقد يتضمن رابط الرجوع إلى أعلى الصفحة لا سيما في الصفحات ذات المحتوى المكثف.
		</p>
	</li>
	<li>
		<p>
			<strong>المحتوى الأساسي للصفحة</strong>: وهو يتضمن عادة عنوان صفحة الويب ومحتوى منوع من فقرات وصور وروابط لصفحات أخرى حسب الحاجة.
		</p>
	</li>
	<li>
		<p>
			<strong>تذييل الصفحة</strong>: هو القسم الذي يعرف المستخدم أنه وصل إلى نهاية صفحة الويب ويجب أن يتضمن التذييل أي معلومات مهمة عن الموقع وعبارة حقوق النشر وقد يتضمن بعض الروابط لصفحات هامة مثل صفحة <a href="https://wiki.hsoub.com/%D9%85%D9%88%D8%B3%D9%88%D8%B9%D8%A9_%D8%AD%D8%B3%D9%88%D8%A8:%D8%B3%D9%8A%D8%A7%D8%B3%D8%A9_%D8%A7%D9%84%D8%AE%D8%B5%D9%88%D8%B5%D9%8A%D8%A9" rel="external">سياسة الخصوصية</a> ومعلومات الاتصال وروابط للشبكات الاجتماعية.
		</p>
	</li>
</ul>

<h2>
	أنواع صفحات الويب
</h2>

<p>
	ستجد في شبكة الانترنت نوعين من صفحات الويب منها ما هو بمحتوى ثابت لا يتغير مثل صفحات السيرة الذاتية أو معارض الأعمال وأخرى بمحتوى ديناميكي متجدد مثل الصفحات الإخبارية وصفحات المدونات وصفحات وسائل التواصل الاجتماعي، وإليك الفرق بين هذين النوعين.
</p>

<h3>
	صفحات الويب الثابتة Static Web Pages
</h3>

<p>
	هي صفحات تمتلك محتوى ثابت مخصص للقراءة فقط ويظهر لكافة المستخدمين بنفس الشكل، وهذه الصفحات تكتب عادة بلغة HTML حيث يتوجب عليك إنشاء ملف بالامتداد ‎.html لكل صفحة جديدة تضيفها للموقع.
</p>

<p>
	ويمكن أن تتضمن الصفحات الثابتة موارد أخرى مثل تنسيقات CSS للتحكم في مظهرها وأكواد بلغة جافا سكريبت <a href="https://wiki.hsoub.com/JavaScript" rel="external">JavaScript</a> لإضافة تأثيرات تفاعلية إليها إلى جانب ملفات الوسائط مثل الصور والأصوات ومقاطع الفيديو وغيرها من الوسائط التي تعرض على صفحات الويب.
</p>

<p>
	كي تغير محتوى صفحات الويب الثابتة تحتاج لأن تصل إلى ملفات الشيفرات البرمجية لهذه الصفحة وتقوم بتعديل ما تريد بنفسك وتجدر الإشارة لأن جميع مواقع وصفحات الويب كانت ثابتة في بدايات ظهور الويب.
</p>

<p>
	واليوم لا تزال الصفحات الثابتة مستخدمة لعرض أي محتوى يكتب لمرة واحدة ولا يحتاج لتخصيص أو تحديث بشكل متكرر مثل مواقع السيرة الذاتية ومعارض الأعمال وصفحات الهبوط والصفحات التعريفية للشركات.
</p>

<p>
	لكن ماذا لو كانت المواقع ذات محتوى متغير بشكل متكرر أو يحتاج لأن يخصص حسب المستخدم أو يتفاعل معه؟ عندها تحتاج لأن تصمم صفحات ويب ديناميكية.
</p>

<h3>
	صفحات الويب الديناميكية Dynamic Web Page
</h3>

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

<p>
	تصمم صفحات الويب الديناميكية باستخدام لغات برمجة تعمل على الخادم مثل <a href="https://wiki.hsoub.com/PHP" rel="external">PHP</a> أو <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> أو <a href="https://wiki.hsoub.com/Ruby" rel="external">روبي</a> ..إلخ، إضافة للغات HTML و CSS وجافا سكريبت وغالبًا ما تحتوي على عناصر ديناميكية تتفاعل مع مدخلات المستخدم وتستخرج المعلومات المطلوبة المخزنة في الخادم لإنشاء صفحة الويب النهائية التي يشاهدها المستخدم في متصفحه. ولمطالعة مزيد من المعلومات حول الطريقة التي تعمل بها صفحات الويب الدينامكية أنصح بمطالعة مقال <a href="https://academy.hsoub.com/devops/servers/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D9%85%D8%B9-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-%D9%81%D9%8A-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-r782/" rel="">نظرة على تفاعلات الخادم مع العميل في موقع ويب ديناميكي</a>.
</p>

<h2>
	تعلم برمجة وتصميم صفحات الويب
</h2>

<p style="text-align: center;">
	<img alt="تعلم تصميم صفحات الويب.png" class="ipsImage ipsImage_thumbnailed" data-fileid="133097" data-ratio="62.60" data-unique="52iu4bcr6" style="width: 500px; height: auto;" width="600" src="https://academy.hsoub.com/uploads/monthly_2023_08/.thumb.png.2c0d8808b93b98e7991f1381e5b6a86a.png">
</p>

<p>
	قد تكون مهتمًا بمعرفة الطريقة التي تبرمج بها صفحات الويب وتتساءل كيف يمكنني تعلم برمجة وتصميم صفحات الويب وإدارتها بسرعة واحترافية وما هي اللغات والأدوات الواجب تعلمها.
</p>

<p>
	إليك أهم الخطوات التي يمكنك اتباعها لتعلم برمجة صفحات الويب:
</p>

<ul>
	<li>
		تعلم كيف يعمل الويب
	</li>
	<li>
		تعلم الأدوات والتقنيات اللازمة لتطوير صفحات الويب
	</li>
	<li>
		تعلم تصميم المواقع الإلكترونية
	</li>
	<li>
		اختر مصادر تعلم موثوقة ومنظمة
	</li>
	<li>
		لا تتوقف عن التعلم
	</li>
</ul>

<p>
	لنتعرف كل خطوة من هذه الخطوات بمزيد من التفصيل:
</p>

<h3>
	1. تعلم كيف يعمل الويب
</h3>

<p>
	في هذه المرحلة عليك تعلم مجموعة من المفاهيم الأساسية مثل:
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web%D8%9F-r1690/" rel="">كيف يعمل الويب Web</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%B9%D9%85%D9%84-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1642/" rel="">كيف تعمل مواقع الويب</a>.
	</li>
	<li>
		ما هي <a href="https://academy.hsoub.com/programming/html/%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-html-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%88%D9%82%D9%88%D8%A7%D9%84%D8%A8%D9%87%D8%A7-r1352/" rel="">مكونات الويب الرئيسية</a>.
	</li>
	<li>
		ما هو مفهوم بروتوكولات الويب مثل <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D8%AA%D8%AE%D8%A7%D8%B7%D8%A8-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-%D9%88%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r74/" rel="">HTTP</a> و <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-tcpip-%D9%88%D8%A8%D8%B9%D8%B6-%D9%85%D9%86-%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D9%87-r169/" rel="">TCP/IP</a> و وكيفية تخزين وتنظيم الصفحات والملفات المختلفة لمواقع الويب على الخادم المتصل بالإنترنت وعرضها على المتصفح أو العميل.
	</li>
	<li>
		أنواع الخوادم وكيفية إدارتها و<a href="https://academy.hsoub.com/devops/servers/web/%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D8%B3%D8%AA%D8%B6%D8%A7%D9%81%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82-%D8%A7%D9%84%D8%B3%D8%B9%D9%8A%D8%AF-r534/" rel="">مفهوم استضافات الويب وأنواعها</a>.
	</li>
</ul>

<h3>
	2. تعلم الأدوات والتقنيات اللازمة لتطوير صفحات الويب
</h3>

<p>
	في المرحلة التالية من المهم أن تتعرف على أهم <a href="https://academy.hsoub.com/programming/workflow/%D8%A7%D9%84%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-r1436/" rel="">الأدوات المستخدمة في بناء مواقع ويب</a>، وتحدد التقنيات التي تريد استخدامها وكي لا تشعر بالتشتت فقد وفرنا في مقال <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع</a> معلومات شاملة تعرفك على كافة الجوانب المتعلقة بتطوير صفحات الويب والتقنيات ولغات البرمجة التي يمكنك تعلمها لتصبح مطور مواقع محترف، بعد أن تتضح لك الصورة الكاملة حدد بدقة ما هي اللغات والأدوات التي تريد استخدامها لبناء مواقع الويب وضع خطة زمنية لتعلمها.
</p>

<h3>
	3. تعلم تصميم المواقع الإلكترونية
</h3>

<p>
	إذا كنت ترغب في التخصص في تصميم واجهات مواقع وتطبيقات الويب فعليك في هذه الحالة تعلم أساسيات تصميم المواقع الإلكترونية والتعرف على <a href="https://academy.hsoub.com/design/user-interface/%D8%A3%D9%81%D8%B6%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r818/" rel="">أفضل النصائح لتصميم واجهة المستخدم</a> لتصمم مواقع وصفحات ويب احترافية، وتنظم بنية موقعك بأفضل طريقة ممكنة، وتختار أفضل أنواع الخطوط والألوان التي عليك استخدامها بما يتناسب وهوية الموقع والفئة المستهدفة وتحسين تجربة المستخدم.
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="3889" data-embedcontent="" src="https://academy.hsoub.com/files/36-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui/?do=embed" style="overflow: hidden;height: 472px;max-width: 502px;margin: auto;"></iframe>

<h3>
	4. اعتمد مصادر تعلم موثوقة
</h3>

<p>
	اختر مصادر التعلم التي تفضلها سواء دروس عبر الإنترنت أو كتب أو معسكرات أو قنوات يويتوب أو دورات تدريبية، لكن تشتت نفسك بكثرتها واحرص على اختيار مصادر منظمة ومتكاملة، ولا تكتفِ بمجرد القراءة أو المشاهدة بل طبق كل ما تتعلمه وصمم مواقع تجريبية وقم <a href="https://academy.hsoub.com/apps/web/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A3%D9%88-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-%D9%82%D9%85%D8%AA-%D8%A8%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r52/" rel="">بنشرها على الإنترنت</a> لأن التطبيق العملي أفضل وأسرع طريقة للتعلم وهو يساعدك على بناء معرض أعمالك والعثور على وظيفة بشكل أسرع.
</p>

<p>
	ستجد في أكاديمية حسوب الكثير من الدورات التدريبية المتخصصة في تطوير مواقع الويب مثل:
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">دورة تطوير واجهات المستخدم</a> التي تعرفك على كل ما يخص تطوير الواجهات الأمامية لمواقع الويب وبناء عدة مواقع ويب ثابتة تعزز معرض أعمالك وتساعدك في العثور على وظيفة ملائمة.
	</li>
	<li>
		<a href="https://academy.hsoub.com/store/9-%D8%AF%D9%88%D8%B1%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-python" rel="">دورة تطوير التطبيقات باستخدام لغة Python</a> التي ستتعلم فيها أساسيات لغة البرمجة بايثون وتبني من خلالها مواقع مختلفة مطلوبة في سوق العمل.
	</li>
	<li>
		<a href="https://academy.hsoub.com/store/5-%D8%AF%D9%88%D8%B1%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-javascript/" rel="">دورة تطوير التطبيقات باستخدام لغة JavaScript</a> التي ستتقن من خلالها لغة البرمجة الأكثر شهرة وانتشارًا جافا سكريبت وتتعلم تطوير العديد من أنواع التطبيقات المختلفة من خلالها.
	</li>
	<li>
		<a href="https://academy.hsoub.com/store/2-%D8%AF%D9%88%D8%B1%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-php/" rel="">دورة تطوير تطبيقات الويب باستخدام لغة PHP</a> التي ستتعلم من خلالها تطوير مواقع انترنت احترافية باستخدام العديد من الأدوات والتقنيات.
	</li>
</ul>

<p>
	تتكون كل دورة من هذه الدورات من مسارات غنية بالمعلومات لا تطلب منك أي معرفة مسبقة وتنتهي بتطوير العديد من مواقع الويب الاحترافية في عدة مجالات وتوفر تحديثات مستمرة ومدربين محترفين يوفرون لك إرشادات وإجابات على كافة تساؤلاتك طيلة فترة التعلم.
</p>

<p>
	كما ستجد الكثير من الدورس والمقالات المجانية حول تصميم صفحات الويب و<a href="https://academy.hsoub.com/tags/%D8%AA%D8%B9%D9%84%D9%85%20%D8%AA%D8%B7%D9%88%D9%8A%D8%B1%20%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">تعلمك تطوير الويب</a> من الصفر للاحترف، ليس هذا فحسب فإن كنت ممن يفضل الدراسة من الكتب لما توفره من معلومات شاملة ومنظمة ومتدرجة، ستجد في <a href="https://academy.hsoub.com/files/" rel="">قسم الكتب</a> في أكاديمية حسوب الكثير من الكتب الشاملة عن لغات برمجة صفحات الويب وتصميم واجهات المواقع الإلكترونية المتاحة للتحميل بالمجان.
</p>

<h3>
	5. لا تتوقف عن التعلم
</h3>

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

<h2>
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على مفهوم صفحات الويب ومكوناتها وأنواعها المختلفة وطريقة عملها، وأهم الخطوات التي يمكنك اتباعها لتتعلم برمجة وتصميم صفحات الويب ووفرنا مجموعة من المصادر العربية الموثوقة التي تساعدك في رحلة التعلم.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web%D8%9F-r1690/" rel="">تعلم تطوير الويب كيف يعمل الويب Web؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%B9%D8%A7%D9%8A%D9%8A%D8%B1%D9%87-r1670/" rel="">عالم الويب ومعاييره</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1522/" rel="">كيفية التعامل مع الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D8%B5%D9%81%D8%B1-r2053/" rel="">مراحل بناء مواقع الإنترنت من الصفر</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2094</guid><pubDate>Mon, 28 Aug 2023 14:00:00 +0000</pubDate></item><item><title>&#x623;&#x647;&#x645;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x641;&#x643;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x646;&#x637;&#x642;&#x64A; &#x641;&#x64A; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/general/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2095/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/------.png.18686d73bb522cfc6c0b7b22ee1919e0.png" /></p>
<p>
	كثيرًا ما تتردد على مسامعنا عبارة التفكير المنطقي ونسمع نصائح حول أهميته وضرورة تحسينه واستخدامه في حل مشكلات حياتنا اليومية واتخاذ القرارات الصعبة، ولعلك تتساءل ما هو التفكير المنطقي؟ وما أهميته للمبرمج وهل فعلاً كلما كان لديك منطق أفضل ستتمكن من احتراف البرمجة بشكل أسرع؟ وهل التفكير المنطقي هو مَلَكة فطرية تولد مع الشخص أم أنه مهارة مكتسبة وقابلة للتعلم والتحسين؟ إذا كنت مهتمًا بمعرفة الإجابة على كل هذه التساؤلات تابع قراءة المقال إلى النهاية.
</p>

<p>
	سنتعرف في مقال اليوم على ماهية التفكير المنطقي وأهميته في مجال البرمجة وأهم الطرق والأدوات التي تساعدك على اكتساب مهارات التفكير المنطقي وتحسين طريقة تفكيرك وحل الخوارزميات المعقدة.
</p>

<h2>
	ما هو التفكير المنطقي؟
</h2>

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

<p>
	وبما أن <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">البرمجة</a> ما هي إلا عملية التخاطب مع الحاسوب وتوجيهه لإيجاد حل لمشكلة ما والمبرمج هو حلال المشاكل كما يقال، فإن التفكير المنطقي للمبرمج يعزز قدرته على تحليل المشكلات واستنباط الحلول واتخاذ القرارات المناسبة وتطبيق المنطق على الكود الذي يكتبه لإنتاج برامج قادرة على معالجة وتحليل البيانات وإجراء العمليات الحسابية والمنطقية عليها بشكل صحيح.
</p>

<h2>
	خصائص التفكير المنطقي
</h2>

<p>
	قد تتساءل ما هي الخصائص التي يجب أن أتمتع بها كي أعتبر نفسي منطقيًا وهل لدي القدرة على التفكير بشكل منطقي من أجل حل أي مشكلة أو اتخاذ أي قرار؟ لأساعدك على الإجابة دعني أعدد لك خصائص التفكير المنطقي:
</p>

<ol>
	<li>
		العقلانية وعدم التحيز العاطفي والتأثر بالمشاعر عند اتخاذ قرار ما في أي موقف. على سبيل المثال يفكر الشخص العقلاني قبل شراء منتج ما بكل إيجابياته وسلبياته وهل سيلبي هذا المنتج متطلباته أم لا ثم يتخذ قرار الشراء من عدمه.
	</li>
	<li>
		التنظيم والتخطيط المسبق لكل شيء على سبيل المثال إذا كنت تنوي الذهاب في رحلة هل تفكر مليًا قبل ذلك في كل شيء يتعلق بتفاصيل رحلتك مثل زمان ومكان الرحلة وكيف ستقضي وقتك ومتى ستعود؟ إذا كان الجواب نعم فأنت في الغالب شخص منطقي.
	</li>
	<li>
		الانتباه ودقة الملاحظة لكل ما يحيط بك وأخذه بالاعتبار عند التفكير في حل مشكلة ما فمعظم الأخطاء تنجم عن عدم الوعي والانتباه للتفاصيل الدقيقة.
	</li>
	<li>
		الديناميكية وإيجاد حلول بديلة عند الضرورة.
	</li>
	<li>
		الفضول وحب الاستكشاف وتعلم أشياء جديدة وطرح العديد من الأسئلة لتوسيع أفق التفكير.
	</li>
	<li>
		الاعتراف بالخطأ وتصحيحه فهذا ينم عن نضج فكري لدى الشخص.
	</li>
	<li>
		الاعتماد على الحقائق والمعرفة وليس على الحدس والمعتقدات عند اتخاذ القرارات.
	</li>
</ol>

<p>
	بعد قراءة الخصائص الواردة أعلاه، هل تعتقد أنك تملك مهارة التفكير المنطقي أم لا؟
</p>

<h2>
	مراحل التفكير المنطقي
</h2>

<p>
	كي تتمكن من التفكير منطقيًا وحل أي مشكلة تواجهك بطريقة منهجية يمكنك اتباع الخطوات التالية:
</p>

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

<h2>
	أهمية التفكير المنطقي للمبرمج
</h2>

<p style="text-align: center;">
	<img alt="أهمية التفكير المنطقي للمبرمج.png" class="ipsImage ipsImage_thumbnailed" data-fileid="133107" data-ratio="78.20" data-unique="i0ltfk48l" style="width: 500px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2023_08/.thumb.png.307dcb9f96edd3722a968ac303e1db77.png">
</p>

<p>
	لا شك أن أهمية التفكير المنطقي تبرز في كافة مجالات الحياة الشخصية والعملية، لكننا سنركز في هذه الفقرة على أهمية التفكير المنطقي في مجال البرمجة على وجه الخصوص فهو يعد أحد المهارات التي لا غنى عنها للمبرمجين والمطورين بصفة خاصة. فالبرمجة تحتاج منك للتخاطب مع الآلة، والآلة لا تفهم ولا تنفذ أوامر عامة بل تحتاج إلى تبسيط الأوامر إلى أبسط شكل، وتعد أي مهمة أو مخاطبة مع الآلة مشكلة يجب إيجاد أفضل حل وكتابة الحل الناتج بشكل برنامج، ومن هنا تأتي أهمية التفكير المنطقي في عملية البرمجة.
</p>

<p>
	لذا في حال رغبت بأن تصبح مبرمجًا ستكون أول نصيحة توجه لك هو تعلم مهارات التفكير المنطقي والخوارزميات لكونها خطوة أساسية تسبق مرحلة البرمجة وكتابة الأكواد، وبدون امتلاك مهارات التفكير المنطقي ستجد صعوبة كبيرة في حل المشكلات البرمجية المعقدة.
</p>

<p>
	وإليك جملة من فوائد التفكير المنطقي للمبرمج:
</p>

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

<p>
	والجدير بالملاحظة أن المهارات التقنية ليست وحدها ما يبحث عنه أرباب العمل في المبرمجين والمطورين المرشحين للتوظيف بل تجدهم يحرصون على توافر مجموعة من المهارات والسمات الشخصية مثل التفكير المنطقي ومهارات حل المشكلات ومهارات التواصل الفعال وتنظيم الوقت وغيرها من السمات الأخرى التي يمكنك الاطلاع عليها في هذا الفيديو:
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="350" id="ips_uid_275_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/VnLOR7HVc8Y"></iframe>
</p>

<h2>
	التفكير المنطقي لحل المشكلات البرمجية
</h2>

<p>
	يحتاج أي مبرمج لمهارة التفكير المنطقي لحل المشكلات البرمجية لأن حلها يتطلب طريقة معينة في التفكير ووضع خطوات الحل بطريقة مفضلة ومتسلسلة منطقيًا وقابلة للحل حاسوبيًا.
</p>

<p>
	على سبيل المثال إذا طلب منك حل مشكلة صنع شطيرة توست من الزبدة والمربى سيكون عليك أن تفكر بداية بالمواد المطلوبة لصنعها وهل هي متوفرة أم لا وهي الزبدة والمربى والخبز والسكين. بعد التأكد من توافر كل المعطيات اللازمة سيكون عليك التفكير بالخطوات التي تحتاجها لصنع الشطيرة.
</p>

<p>
	قد تخبرني أن الأمر بديهي ولا يحتاج لأي تفكير منطقي ضع الزبدة والمربى على الخبز وتناولها لكن انتبه هنا لأن هذا لن يساعدك في حل المشكلة وبناءً على ذلك قد تكون الخطوات المنطقية للعمل كالتالي:
</p>

<ul>
	<li>
		افتح كيس الخبز.
	</li>
	<li>
		خذ شريحة الخبز الموجودة في أعلى الكيس وضعها في طبق.
	</li>
	<li>
		افتح علبة الزبدة.
	</li>
	<li>
		اغمس السكين في علبة الزبدة.
	</li>
	<li>
		وزع الزيدة على شريحة الخبز.
	</li>
	<li>
		ضع السكين جانباً.
	</li>
	<li>
		خذ شريحة خبز ثانية من أعلى الكيس وضعها فوق الشريحة الأولى.
	</li>
	<li>
		افتح علبة المربى.
	</li>
	<li>
		اغمس السكين في علبة المربى
	</li>
	<li>
		وزع الزيدة على شريحة الخبز الثانية.
	</li>
	<li>
		ضع السكين جانباً.
	</li>
	<li>
		ضع شريحة الخبز الأولى فوق الثانية.
	</li>
	<li>
		الشطيرة جاهزة.
	</li>
</ul>

<p>
	قد يكون هناك أكثر من طريقة لحل المشكلة على سبيل المثال يمكن أن نختصر بعض الخطوات ونفكر في حل المشكلة كالتالي:
</p>

<ul>
	<li>
		افتح كيس الخبز وخذ شريحتين من خبز التوست.
	</li>
	<li>
		افتح علبة الزيدة.
	</li>
	<li>
		اغمس السكين في الزبدة.
	</li>
	<li>
		وزع الزبدة فوق شريحة الخبز الأولى.
	</li>
	<li>
		افتح علبة المربى.
	</li>
	<li>
		اغمس السكين في المربى.
	</li>
	<li>
		وزع المربى فوق شريحة الخبز الأولى.
	</li>
	<li>
		ضع الشريحة الأولى فوق الثانية.
	</li>
	<li>
		الشطيرة جاهزة.
	</li>
</ul>

<p>
	قد تفكر أيضًا أن الخطوات (افتح العلبة، اغمس السكين، وزع) تتكرر مرة من أجل الزبدة ومرة من أجل المربى فلم لا نحاول دمجها بوظيفة وليكن اسمها مثلًا وضع المادة المطلوبة. تسألك عن المادة التي تريدها وتطبق هذه الخطوات الثلاث دفعة واحدة في كل مرة تريد فيها تنفيذ هذه الخطوة.
</p>

<p>
	وقد تفكر في مناقشة بعض الافتراضات والحالات الخاصة التي قد تحدث خلال العمل وتجد حلولًا مناسبة لها كأن تناقش حالة عدم وجود المربى واستبداله بالعسل أو الشوكولا، فالخطوات المتبعة في الحل وطريقة التفكير والتنفيذ والمعالجة قد تختلف من شخص لآخر وهنا تبرز أهمية التفكير المنطقي فالجميع قد يحصل في النهاية على حل لكن بعض الحلول قد تكون أفضل من غيرها وأكثر كفاءة واختصارًا. قس على هذا أي مشكلة معقدة تحاول حلها من خلال الحاسوب.
</p>

<p>
	في ختام هذه الفقرة أدعوك لمشاهدة <a href="https://youtu.be/Ct-lOOUqmyY" rel="external nofollow">هذا الفيديو</a> اللطيف والشيق لأب يعلم أطفاله كيف يكتبون بدقة التعليمات اللازمة لطريقة صنع شطيرة زبدة الفول السوداني مع المربى، عندما تتعامل مع الحاسوب تعامل معه كأنه ذلك الأب وأخبره بالتعليمات المطلوبة لحل مشكلتك بدقة متناهية.
</p>

<h2>
	اكتساب التفكير المنطقي في البرمجة
</h2>

<p style="text-align: center;">
	<img alt="تحسين التفكير المنطقي في البرمجة.png" class="ipsImage ipsImage_thumbnailed" data-fileid="133108" data-ratio="78.20" data-unique="ar37y76oa" style="width: 500px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2023_08/.thumb.png.2a1bd1783daf8d33afc5bef4847735fc.png">
</p>

<p>
	بعد أن تعرفت على أهمية التفكير المنطقي في تحسين البرمجة أعتقد أنك تتساءل الآن هل التفكير المنطقي هو موهبة فطرية تولد مع المبرمج وتمكنه من التوصل إلى حلول منطقية مناسبة لحل مشكلات الكود بسهولة وسلاسة، أم أنه مهارة مكتسبة يمكن تنميتها من خلال أدوات وممارسات معينة؟
</p>

<p>
	لحسن الحظ رغم أن التفكير المنطقي هو ملَكَة فطرية يتميز بها البعض ويساعدهم وجودها على تعلم لغات البرمجة أسرع من غيرهم لكنه في نفس الوقت مهارة قابلة للاكتساب والتحسين والتطوير من خلال العديد من الطرق والتقنيات.
</p>

<p>
	إليك أهم الطرق والأدوات التي تساعدك على تحسين التفكير المنطقي في البرمجة:
</p>

<ul>
	<li>
		حلّ الألغاز والألعاب المنطقية.
	</li>
	<li>
		استخدم الورقة والقلم لوصف أي مشكلة تواجهك.
	</li>
	<li>
		تعلّم الخوارزميات.
	</li>
	<li>
		قسّم المشكلات المعقدة لأجزاء أصغر.
	</li>
	<li>
		تمكّن من أساسيات البرمجة.
	</li>
	<li>
		شارك في المسابقات والتحديات البرمجية.
	</li>
	<li>
		ادرس الشيفرات البرمجية للآخرين.
	</li>
	<li>
		تعلّم نماذج البرمجة وأنماط التصميم.
	</li>
</ul>

<p>
	دعنا نناقش كل طريقة من هذه الطرق ونتعرف على أهميتها في تنمية منطقك البرمجي
</p>

<h3>
	حلّ الألغاز والألعاب المنطقية
</h3>

<p>
	فحل الألغاز المنطقية وألعاب الذكاء مثل الشطرنج وألغاز الكلمات المتقاطعة وسودودكو و tic-tac-toe أو غيرها من الألغاز الرياضية والألعاب المنطقية وألغاز الذكاء IQ أمر ممتع ومفيد جدًا في تشيط عقلك وتحسين تفكيرك المنطقي وبالتالي تحسين قدراتك البرمجية.
</p>

<p>
	فمهارة حل الأحاجي أمر يبحث عنه معظم أرباب العمل لمعرفة مدى قوة تفكيرك وسرعة بديهتك فلا تستغرب حين تطرح عليك في مقابلات العمل مع شركات البرمجيات ألغاز من قبيل الأحجية التالية: كم عدد العملات التي تمتلكها إذا كانت جملة واحدة فقط من الجمل الثلاث التالية صحيحة:
</p>

<ol>
	<li>
		لديك عملة واحدة على الأقل.
	</li>
	<li>
		لديك خمس عملات على الأقل.
	</li>
	<li>
		عدد العملات الموجود معك أقل من خمسة.
	</li>
</ol>

<p>
	خذ وقتك في التفكير بحل هذه المسألة ويمكن أن تشاركني في التعليقات الجواب الذي توصلت إليه وكيف توصلت إليه.
</p>

<p>
	كما يمكن أن تتدرب على الكثير من المسائل والأحاجي المنطقية، ابحث عن ألغاز مثل لغز المئة سجين <a href="https://en.wikipedia.org/wiki/100_prisoners_problem" rel="external nofollow">100‎ prisoners problem</a> أو لغز الجمل والموز <a href="https://www.geeksforgeeks.org/puzzle-15-camel-and-banana-puzzle/" rel="external nofollow">camel and banana puzzle</a> أو غيرها من الألغاز المشهورة التي تخص مجال البرمجة و<a href="htps://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسب</a> فهي متوفرة بكثرة على مواقع الإنترنت ومتاجر التطبيقات.
</p>

<h3>
	استخدم الورقة والقلم لوصف أي مشكلة تواجهك
</h3>

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

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

<h3>
	تعلّم الخوارزميات
</h3>

<p>
	فتعلم <a href="https://wiki.hsoub.com/Algorithms" rel="external">الخوارزميات</a> و<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%8A%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-structures/" rel="">هياكل البيانات</a> من شأنه أن يعزز التفكير المنطقي التحليلي والتفكير الخوارزمي الذي يغير طريقة تفكيرك في حل المشكلات ويعلمك منهجية التفكير بطريقة تشبه الطريقة التي يعمل بها الحاسوب كما أنه يساعدك لاحقًا في تعلم لغات البرمجة.
</p>

<p>
	يمكن أن تبدأ بالخوارزميات الأساسية مثل خوارزميات الفرز والترتيب <a href="https://wiki.hsoub.com/Algorithms/Sorting_Algorithms" rel="external">sorting algorithms</a> وخوازميات البحث <a href="https://wiki.hsoub.com/Algorithms/Searching_Algorithms" rel="external">search algorithms</a> وخوارزميات <a href="https://wiki.hsoub.com/Algorithms/Divide_And_Conquer" rel="external">فرق تسد</a> divide and conquer وتفهم آلية عملها ثم تتدرج في تعلم خوارزميات أكثر تعقيدًا، كما أن فهم هياكل البيانات مثل القائمة المترابطة linked lists والمكدس stack والشجرة الثنائية binary trees واستخدامها أثناء تنفيذ الخوارزميات يسرع كثيرًا من قدرتك على حل المشكلات المعقدة.
</p>

<h3>
	قسّم المشكلات المعقدة لأجزاء أصغر
</h3>

<p>
	عندما تعجز عن حل مشكلة ما لماذا لا تجرب أن تحللها وتقسّمها إلى مشكلات أصغر يسهل التعامل معها، ابدأ بحل كل مشكلة منها وكافئ نفسك على تحقيق كل هدف صغير ثم اجمع كل الأجزاء لتتكامل مع بعضها البعض وتحل المشكلة الأساسية.
</p>

<p>
	على سبيل المثال إذا طلب منك إبجاد طريقة أو <span ipsnoautolink="true">خوارزمية للبحث</span> عن رقم ما في سلسلة من الأرقام يمكنك تقسيم المشكلة إلى مشاكل أصغر تحلها كالتالي:
</p>

<ul>
	<li>
		معرفة من أين أبدأ البحث (من بداية السلسلة أم نهايتها أم من الوسط).
	</li>
	<li>
		معرفة متى وكيف يتم إيقاف عملية البحث.
	</li>
	<li>
		تحديد كيفية مقارنة عنصرين من عناصر السلسلة لتحديد أيهما يأتي قبل العنصر الآخر.
	</li>
	<li>
		تحديد كيفية متابعة البحث عند عدم العثور على الرقم المطلوب.
	</li>
</ul>

<h3>
	تمكّن من أساسيات البرمجة
</h3>

<p>
	تأكد من الفهم الجيد <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لأساسيات البرمجة</a> مثل المتغيرات وأنواع البيانات والتعليمات الشرطية والحلقات التكرارية والدوال وهياكل البيانات بالتوازي مع تطوير تفكيرك المنطقي فالبرمجة والمنطق يعززان بعضهما البعض فمن جهة يساعدك التفكير المنطقي على فهم تعليمات البرمجة ومن جهة أخرى تساعدك كتابة الأكواد البرمجية على تحسين منطقك والتفكير بالطريقة التي يفهمها الحاسوب.
</p>

<p>
	وتذكر أنك بدون إتقان المفاهيم الأساسية والتطبيق العملي لها من خلال حل العديد من أسئلة البرمجة وحل مشكلات رياضية بسيطة من البداية إلى النهاية بشكل منتظم فإنك لن تتمكن من تطوير تفكيرك وتعلم المفاهيم المتقدمة لاحقًا وعندما تكون عالقًا في مشكلة معينة لا مشكلة في البحث عن حلول لها على الإنترنت وفهم منطق عملها فهذا يحسن مهاراتك أيضًا.
</p>

<h3>
	شارك في المسابقات والتحديات البرمجية
</h3>

<p>
	شارك في المسابقات والتحديات البرمجية فهي تركز على تحديات منهجية ومتسلسلة في الصعوبة وغالبًا ما تكون مقيدة بوقت محدد لذا يساعدك حلها على تحسين وتسريع تفكيرك المنطقي.<br>
	حتى لو لم تحقق نتائج عالية في هذه المسابقات ستكون التجربة مفيدة لك كما أن مناقشة حلول المشاركين الآخرين تفيدك في توسيع أفق تفكيرك.
</p>

<h3>
	ادرس الشيفرات البرمجية للآخرين
</h3>

<p>
	فكما ذكرنا سابقًا قد توجد أكثر من طريقة لحل مشكلة معينة لهذا قد يتبع كل مبرمج طريقة خاصة به لحل المشكلة والتعرف على وجهات نظر مختلفة يفيدك بكل تأكيد ويطور منطقك البرمجي، ستجد الكثير من الأكواد لمبرمجين خبراء في المجتمعات البرمجية و<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%A5%D8%B4%D8%B1%D8%A7%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D8%A8%D8%B1-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1585/" rel="">مستودعات المشاريع مفتوحة المصدر مثل GitHub</a>.
</p>

<h3>
	تعلم نماذج البرمجة وأنماط التصميم
</h3>

<p>
	إن تعلم نماذج البرمجة مثل البرمجة كائنية التوجه <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-r1375/" rel=""><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr></a> والبرمجة الوظيفية <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%88%D8%B8%D9%8A%D9%81%D9%8A%D8%A9-functional-programming-r1391/" rel="">functional programming</a> و<a href="https://wiki.hsoub.com/Design_Patterns" rel="external">أنماط التصميم البرمجي design patterns</a> التي توفر حلول ونماذج للمشكلات البرمجية الشائعة فهي تساعدك في بناء حلول منطقية أكثر وضوحًا وتنظيمًا وأقل أخطاءً وتحسن مهاراتك البرمجية.
</p>

<p>
	عادة ما تدرس مادة الخوارزميات وحل المشكلات بما يتعلق بالتفكير المنطقي في بداية أي مسار يُعلم البرمجة تعليمًا صحيحًا، سواءً في الجامعات أو مسارات البرمجة الخاصة، فمثلًا في <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a> في أكاديمية حسوب ستتعرف على أهم الخوارزميات وطريقة كتابتها وتحليلها، وتتعرف على أهم بنى المعطيات وتتعلم أساسيات البرمجة وأنماط التصميم وتكتب الكثير من البرامج العملية التي تعزز تفكيرك المنطقي وتحسّن مستواك البرمجي بشكل كبير.
</p>

<h2>
	نصائح إضافية لتحسين التفكير المنطقي
</h2>

<p>
	إضافةً للطرق التي ذكرناها سابقًا، إليك قائمة من النصائح السريعة التي من شأنها كذلك أن تحسن مهاراتك وتفكيرك المنطقي وتعزز فهمك للبرمجة:
</p>

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

<h2>
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على مفهوم التفكير المنطقي الذي يعد أحد المهارات الضرورية لأي مبرمج أو <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">مطور برمجيات</a>، والتي تمكنه من التعامل بكفاءة مع حل المشكلات البرمجية وجمع كل المعطيات الممكنة حولها وتحليلها وفهمها ووضع الحلول المناسبة لها أيًا كانت لغة البرمجة التي يستخدمها، وتعرفنا على مجموعة من الطرق والنصائح التي تساعد المبرمجين على تحسين تفكيرهم المنطقي و<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">برمجة التطبيقات</a> بكفاءة ومرونة.
</p>

<p>
	وتذكر في الختام أن تركيزك على تعلم لغات البرمجة والأمور التقنية على أهميته لا يكفي لجعلك مبرمجًا جيدًا، لذا لا تهمل مهاراتك الناعمة ومن أهمها مهارات التفكير المنطقي والتواصل الفعال فهي سبيلك للتميز والحصول على فرصة العمل التي تطمح لها.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">مدخل إلى الخوارزميات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">المرجع الشامل إلى تعلم الخوارزميات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%88%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%84%D8%B1%D8%AD%D9%84%D8%AA%D9%83-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r206/" rel="">كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">برمجة الحاسوب للمبتدئين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%84-%D8%A3%D9%86%D8%A7-%D8%AD%D9%82%D8%A7-%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D8%9F-%D9%85%D8%AA%D9%89-%D8%A3%D8%B3%D9%85%D9%8A-%D9%86%D9%81%D8%B3%D9%8A-%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D8%A7-r2051/" rel="">هل أنا حقا مبرمج؟ متى أسمي نفسي مبرمجًا</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%A3%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%B7%D9%81%D9%84%D9%83-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9%D8%9F-r2052/" rel="">لماذا يجب أن تعلم طفلك البرمجة؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2095</guid><pubDate>Tue, 22 Aug 2023 14:04:00 +0000</pubDate></item><item><title>&#x645;&#x631;&#x627;&#x62D;&#x644; &#x628;&#x646;&#x627;&#x621; &#x645;&#x648;&#x627;&#x642;&#x639; &#x627;&#x644;&#x625;&#x646;&#x62A;&#x631;&#x646;&#x62A; &#x639;&#x628;&#x631; &#x623;&#x646;&#x638;&#x645;&#x629; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x645;&#x62D;&#x62A;&#x648;&#x649; CMS</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-cms-r2056/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/----(--CMS)(1).png.d7de0c0803c513886f1fa7f790b2c78c.png" /></p>
<p>
	لا شك أن مواقع الانترنت قد باتت شيئًا أساسيًا في حياتنا، سواء الغرض كان تجاريًا بحيث يعبّر عن عمل تجاري خاص بك، أو حتى موقع شخصي مخصص لإنشاء portfolio أو CV مدونة. في كل الحالات سواء التي ذكرناها أو أكتر، فوجود مواقع الانترنت صار مهمًا جدًا. وعلى هذا، سنتعرف أكثر في في الفيديو على الخطوات التي يفترض انتهاجها لبناء موقع إلكتروني متكامل من الصفر وذلك انطلاقًا من أنظمة إدارة المحتوى CMS.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_4496_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="مراحل بناء مواقع الإنترنت عبر أنظمة إدارة المحتوى CMS" width="1072" data-embed-src="https://www.youtube.com/embed/Y3VE2kNPfXc"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على كيفية بناء مواقع إنترنت من الصفر بواجهتيها، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">دورة تطوير واجهات المستخدم</a> و<a href="https://academy.hsoub.com/learn/php-web-application-development/?utm_source=youtube.com&amp;utm_medium=referral&amp;utm_campaign=academy-23jul28" rel="">دورة تطوير تطبيقات الويب باستخدام لغة PHP</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2056</guid><pubDate>Fri, 28 Jul 2023 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; &#x627;&#x644;&#x643;&#x627;&#x634; Cache&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D9%83%D8%A7%D8%B4-cache%D8%9F-r2050/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/-Cache(1).png.25b1bbb4377353e52b2862d752ddbb44.png" /></p>
<p>
	كثيرًا ما تصادف أغلبنا مشاكل معينة في موقع الويب، وعندما نسأل عن حل لها تكون الإجابة هي "أفرغ الكاش!"، لكن السؤال الفعلي هنا ما هو الكاش؟ وكيف يستخدم في مواقع الويب هذا ما سوف نقوم بالإجابة عنه في هذا الدرس.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ما هو الكاش Cache" width="1072" data-embed-src="https://www.youtube.com/embed/g8ZU0eimpWA"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على الويب وكيفية التعامل معه، ننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2050</guid><pubDate>Wed, 12 Jul 2023 15:00:00 +0000</pubDate></item><item><title>&#x647;&#x644; &#x623;&#x646;&#x627; &#x62D;&#x642;&#x627; &#x645;&#x628;&#x631;&#x645;&#x62C;&#x61F; &#x645;&#x62A;&#x649; &#x623;&#x633;&#x645;&#x64A; &#x646;&#x641;&#x633;&#x64A; &#x645;&#x628;&#x631;&#x645;&#x62C;&#x627;</title><link>https://academy.hsoub.com/programming/general/%D9%87%D9%84-%D8%A3%D9%86%D8%A7-%D8%AD%D9%82%D8%A7-%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D8%9F-%D9%85%D8%AA%D9%89-%D8%A3%D8%B3%D9%85%D9%8A-%D9%86%D9%81%D8%B3%D9%8A-%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D8%A7-r2051/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/---(1).png.79646df7ab0b0cc09e337f1f31866f58.png" /></p>
<p>
	يتساءل الكثير من المهتمين بدخول مجال البرمجة باستمرار حول متى يصلون إلى مرحلة يطلقون فيها على أنفسهم تسمية "مبرمجين"، أو متى يصبحون قاردين على العمل كمبرمجين، وما هو الفيصل بين وضعهم الحالي وخلال التعلم وبين المرحلة التي سيكونون فيها مبرمجين.
</p>

<p>
	يجيب الفيديو الآتي عن كل التساؤلات السابقة، ويوضح لك متى يكون بمقدورك نعت نفسك بالمبرمج:
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_3070_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="هل أنا حقًا مبرمج؟ متى أسمي نفسي مبرمجًا" width="1072" data-embed-src="https://www.youtube.com/embed/x1BfZ5rAiVE"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على مجال البرمجة، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2051</guid><pubDate>Thu, 06 Jul 2023 15:00:00 +0000</pubDate></item><item><title>&#x62F;&#x648;&#x631;&#x629; &#x62D;&#x64A;&#x627;&#x629; &#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x627;&#x62A;: &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x62A;&#x62D;&#x644;&#x64A;&#x644; &#x648;&#x62A;&#x635;&#x645;&#x64A;&#x645; &#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x645;&#x639;&#x644;&#x648;&#x645;&#x627;&#x62A;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/general/%D8%AF%D9%88%D8%B1%D8%A9-%D8%AD%D9%8A%D8%A7%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_06/-----.png.ef43bf043183b42d688b0a013b0a9d0a.png" /></p>
<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		"هؤلاء الذين يبنون البرمجيات هم في الواقع من يغيّرون العالم بطريقة أو بأخرى". لويس سيرن، مدير تنفيذي لشركة نيو ريلك.
	</p>
</blockquote>

<p>
	يتوجه العالم بخطى حثيثة نحو حقبة ما بعد الثورة الرقمية، فقد غيرت هذه الثورة طريقة رؤيتنا للواقع والمستقبل ودفعتنا إلى حدود جديدة في شتى المجالات العلمية والاقتصادية والاجتماعية. لهذا تسعى الفعاليات البشرية بكافة أشكالها إلى التماشي مع هذه الثورة والاستفادة مما تتيحه من تقنيات لتطوير قدراتها الذاتية ومكاسبها في نفس الوقت. لقد أضحت عملية التحول الرقمي والتطوير المستمر لوسائل العمل والاتصال ميزة هذه الحقبة وأساسها، وغدت صناعة البرمجيات وتطوير الأنظمة المعلوماتية المحرك الأساسي لهذه المرحلة جنبًا إلى جنب مع تطور البنية التحتية لتقديم الخدمات الرقمية بالشكل الأكفأ والأسرع. ولهذا السبب أخذت هذه الصناعة بالنضوج اعتمادًا على مفاهيم ومسارات واستراتيجيات مدروسة وواضحة في التخطيط لها وتحليل متطلباتها ثم تصميمها وتنفيذها ضمن حلقة متكاملة من المراحل المتلاحقة لتلبي الغرض من بنائها وإنشائها. ونظرًا لاعتماد الأعمال بكل أشكالها على <a href="https://academy.hsoub.com/programming/general/%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">صناعة البرمجيات</a> وتطوير الأنظمة الرقمية فلن يكون أمام هذه الصناعة هامش للخطأ مهما صَغُر لأن التكلفة على الصعيدين المادي والزمني ستكون باهظة جدًا.
</p>

<p>
	تحدثنا في مقال "<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">مدخل إلى تطوير البرمجيات</a>" عن المجال وعملية تطوير البرمجيات عمومًا، وأما الهدف من هذا المقال هو الوقوف على دورة الحياة التي يجب أن تسلكها عملية تطوير البرمجيات حتى يكون المنتج النهائي فعالًا ومحققًا للغاية التي صُمم لأجلها بأدنى هامش للخطأ انطلاقًا من الفكرة وحتى التنفيذ والصيانة. كما سيبحث في أهم الاستراتيجيات المتبعة في إدارة دورة حياة تطوير البرمجيات Software Development Life Cycle واختصارًا SDLC. كما يساعدك هذا المقال في تنمية معارفك ومهاراتك في تحليل الأنظمة إن كنت تفكر فيها كمهنة مستقبلية.
</p>

<h2>
	من أين تأتي الأفكار؟
</h2>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		"الحاجة أم الاختراع"
	</p>
</blockquote>

<p>
	فما يخلق البرمجيات هو الحاجة لها، وتظهر الحاجة إلى بناء نظام معلوماتي جديد لإدارة نشاط معين عندما يبدأ هذا النشاط أو العمل بالمعاناة جراء أسباب متنوعة منها:
</p>

<ul>
	<li>
		انخفاض الحصة السوقية لمنتجاته.
	</li>
	<li>
		ضعف في الخدمات التي يقدمها لعملائه.
	</li>
	<li>
		ظهور منافسين جدد يستغلون تقنيات أحدث في إدارة أعمالهم.
	</li>
	<li>
		مشاكل في المنظومة القائمة وانخفاض كفاءتها.
	</li>
</ul>

<p>
	وقد تكون الحاجة إلى المنظومة الجديدة رؤية مستقبلية لواقع العمل والرغبة في تحسين واقعه:
</p>

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

<p>
	لا يمكن لأي كان أن يتخذ قرار تطوير برمجيات المنظومة المعلوماتية القائمة as-is system أو استبدالها بمنظومة جديدة to-be system في الجهة التي تحتاج إلى ذلك، بل يأتي هذا القرار عادة عن أشخاص تقنيين أو غير تقنيين على تماس مباشر مع المنظومة ومع أصحاب القرار. يُدعى هؤلاء بالمعنيين أو أصحاب المصلحة stakeholders في بناء أو تطوير المنظومة وقد يكون هؤلاء:
</p>

<ul>
	<li>
		مالكو أنظمة
	</li>
	<li>
		مشرفون على تشغيل أنظمة
	</li>
	<li>
		مبرمجون
	</li>
	<li>
		مصممو ومحللو أنظمة
	</li>
	<li>
		مستشارون أو مزودون للخدمات المعلوماتية
	</li>
</ul>

<p>
	يمتلك هؤلاء الخبرة والدراية التي تؤهلهم لمعرفة الإيجابيات والسلبيات في المنظومات القائمة واستشعار الفرص الجديدة التي قد يأتي بها التغيير.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة إدارة تطوير المنتجات
		</p>

		<p class="banner-subtitle">
			احترف إدارة تطوير المنتجات الرقمية بدءًا من التخطيط وتحليل السوق وحتى إطلاق منتج مميز وناجح
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/product-development-management/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة إدارة تطوير المنتجات" src="https://academy.hsoub.com/learn/assets/images/courses/product-development-management.png">
	</div>
</div>

<h2>
	هل نبدأ بكتابة الشيفرة مباشرة؟!
</h2>

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

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

<p>
	لم تأتي هذه القاعدة من فراغ، بل من الإخفاقات التي عانتها الكثير من الشركات العالمية، وإليك بعض الأمثلة من الواقع:
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:right">
				الشركة
			</th>
			<th>
				العام
			</th>
			<th style="text-align:right">
				المنظومة البرمجية
			</th>
			<th style="text-align:center">
				الخسارة بالدولار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:right">
				فورد موتورز الأمريكية
			</td>
			<td>
				2004
			</td>
			<td style="text-align:right">
				شراء منظومة جرى التخلي عنها بعد نشرها مباشرة
			</td>
			<td style="text-align:center">
				400 m$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				هيوليت باكارد الأمريكية
			</td>
			<td>
				2004
			</td>
			<td style="text-align:right">
				منظومة برمجية لتخطيط الموارد كثُرت فيها الأخطاء
			</td>
			<td style="text-align:center">
				m160‏$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				HRM Inland البريطانية
			</td>
			<td>
				2004
			</td>
			<td style="text-align:right">
				أخطاء برمجية في المنظومة قادت إلى تحميل ضرائب إضافية
			</td>
			<td style="text-align:center">
				3.45 m$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				Sainsburys البريطانية
			</td>
			<td>
				2004
			</td>
			<td style="text-align:right">
				منظومة لإدارة سلسلة المزودين فشلت بعد النشر مباشرة
			</td>
			<td style="text-align:center">
				527 m$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				وزارة الصحة البريطانية
			</td>
			<td>
				2006
			</td>
			<td style="text-align:right">
				منظومة متكاملة لإدارة الصحة الوطنية وتسجيل المرضى لم تنجح بعد 4 سنوات من التأخير ولم ينجز أكثر من 80% منها.
			</td>
			<td style="text-align:center">
				20 b$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				وزارة العدل البريطانية
			</td>
			<td>
				2007
			</td>
			<td style="text-align:right">
				التخلي عن منظومة لتسجيل ومراقبة المدانين
			</td>
			<td style="text-align:center">
				245 m$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				وكالة الحدود البريطانية
			</td>
			<td>
				2009
			</td>
			<td style="text-align:right">
				تأخير في تسليم منظومة إدارة الحدود الإلكترونية حتى 2015
			</td>
			<td style="text-align:center">
				1.7 b$
			</td>
		</tr>
		<tr>
			<td style="text-align:right">
				BBC البريطانية
			</td>
			<td>
				2014
			</td>
			<td style="text-align:right">
				فشل مشروع رقمنة أرشيف الإذاعة نظرًا للتخبط وضعف التخطيط.
			</td>
			<td style="text-align:center">
				153 m$
			</td>
		</tr>
	</tbody>
</table>

<p>
	فالبدء إذًا في <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D9%84%D9%88%D8%A8-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%88%D8%AA%D8%AD%D9%82%D9%8A%D9%82-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r1307/" rel="">كتابة الشيفرة</a> بمجرد أن تستشف فكرة المشروع سيقودك إلى الفشل لا محالة. لهذا لا بدّ من أن يمر مشروعك ضمن سلسلة من المراحل التي ينضج فيها وتتخذ القرارات التحليلية والتصميمة الصحيحة.
</p>

<h2>
	دورة حياة البرمجيات
</h2>

<p>
	تمر البرمجيات والأنظمة المعلوماتية عمومًا أثناء تطويرها بأربعة مراحل رئيسة وفي كل مرحلة مجموعة من الخطوات. ينتج عن كل مرحلة مجموعة من المخرجات deliveries تُبنى عليها مراحل لاحقة. هذه المراحل الأربعة هي:
</p>

<ol>
	<li>
		التخطيط planning
	</li>
	<li>
		التحليل analysis
	</li>
	<li>
		التصميم design
	</li>
	<li>
		التنفيذ implementation
	</li>
</ol>

<p>
	سنتحدث باختصار عن كل مرحلة وسنتكلم بإسهاب عن كل مرحلة في مقالات لاحقة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="128998" href="https://academy.hsoub.com/uploads/monthly_2023_06/401683305_.png.402fe20d131dd2709da3adab875e7432.png" rel=""><img alt="دورة حياة البرمجيات" class="ipsImage ipsImage_thumbnailed" data-fileid="128998" data-ratio="79.59" data-unique="y7eula8tc" style="width: 740px; height: auto;" width="740" src="https://academy.hsoub.com/uploads/monthly_2023_06/401683305_.png.402fe20d131dd2709da3adab875e7432.png"> </a>
</p>

<h3>
	مرحلة التخطيط لبناء منظومة برمجية
</h3>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إن فشلت في التخطيط، فقد خططت لفشلك.
	</p>
</blockquote>

<p>
	لا بد في هذه المرحلة من الإجابة على الأسئلة التالية:
</p>

<ul>
	<li>
		لم علينا بناء هذه المنظومة أو هذا البرنامج؟
	</li>
	<li>
		ما الذي ستقدمه هذه المنظومة إلى الفعالية التي طلبتها أو للجهة التي تنتجها؟
	</li>
	<li>
		هل يمكننا بناء هذه المنظومة؟
	</li>
	<li>
		كم يستغرق بناؤها؟
	</li>
</ul>

<p>
	وكما أشرنا سابقًا أن لكل مرحلة مجموعة من الخطوات التي تمر بها حتى تكتمل، وعادة ما تضم مرحلة التخطيط خطوتين أساسيتين هما:
</p>

<ul>
	<li>
		<strong>تهيئة المشروع Project initiation</strong>: يٌقصد بتهيئة المشروع هو التخطيط المبدئي له، وتضم هذه الخطوة مجموعة خطوات فرعية هي:
	</li>
	<li>
		<strong>تحديد أهمية المشروع</strong> وضرورة بنائه بالنسبة للعميل أو صاحب المصلحة المعني مباشرة بتطويره.
	</li>
	<li>
		<a href="https://academy.hsoub.com/entrepreneurship/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%84%D8%AC%D8%AF%D9%88%D9%89-%D8%A7%D9%84%D9%85%D8%B4%D8%B1%D9%88%D8%B9-r804/" rel="">دراسة جدوى المشروع</a> Project feasibility بالتشاور المباشر بين محلل الأنظمة والعميل وتكون الدراسة على ثلاثة أصعدة تقنية تحدد إمكانية بناء المنظومة، واقتصادية تحدد ما إن كان ضروريًا بناء المنظومة الجديدة أو تحسين القديمة، وتنظيمية تحدد ما إن كان سيلقى المنتج الجديد ترحيبًا من مستخدميه وهل يتماشى مع أسلوب العمل في الجهة التي طلبت بناءه.
	</li>
	<li>
		<strong><a href="https://academy.hsoub.com/entrepreneurship/planning/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AE%D8%A7%D8%B7%D8%B1-%D9%88%D8%AA%D8%AE%D9%81%D9%8A%D9%81%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D9%84%D8%B4%D8%B1%D9%83%D8%A7%D8%AA-r877/" rel="">دراسة المخاطر</a></strong>، وتختلف طريقة دراسة المخاطر من شركة إلى أخرى إلا أنها تسعى عمومًا إلى تحديد مصدر الخطر واحتمالية وقوعه وأثره المتوقع على المنظومة وطريقة تفادي الخطر أو التخفيف من أثره.
	</li>
	<li>
		<strong><a href="https://academy.hsoub.com/entrepreneurship/planning/%25D9%2583%25D9%258A%25D9%2581%25D9%258A%25D8%25A9-%25D8%25A5%25D8%25AF%25D8%25A7%25D8%25B1%25D8%25A9-%25D8%25A7%25D9%2584%25D9%2585%25D8%25B4%25D8%25B1%25D9%2588%25D8%25B9-%25D8%25A7%25D9%2584%25D8%25AA%25D8%25AC%25D8%25A7%25D8%25B1%25D9%258A-%25D8%25A7%25D9%2584%25D8%25B5%25D8%25BA%25D9%258A%25D8%25B1-%25D9%2588%25D8%25A7%25D9%2584%25D8%25A2%25D8%25AB%25D8%25A7%25D8%25B1-%25D8%25A7%25D9%2584%25D9%2585%25D8%25AA%25D8%25B1%25D8%25AA%25D8%25A8%25D8%25A9-%25D8%25B9%25D9%2584%25D9%2589-%25D8%25A7%25D9%2584%25D8%25B9%25D9%2585%25D9%2584%25D9%258A%25D8%25A9-%25D8%25A7%25D9%2584%25D8%25A5%25D8%25AF%25D8%25A7%25D8%25B1%25D9%258A%25D8%25A9-r724/" rel="">إدارة المشروع Project management</a></strong>: وهي عملية التحكم بتطوير المشروع خلال مدة محددة بأقل تكلفة للحصول على المنظومة المطلوبة صحيحة وفعالة. يراقب مديرو المشروع عادة العمل ككل ويتحكمون بكل المهمات ويحددون الأدوار الوظيفية وينسقون بينها وتضم هذه الخطوة الخطوات الفرعية التالية:
	</li>
	<li>
		تحديد عدد الموظفين سواء محللي نظم أو مصممين أو مبرمجين.
	</li>
	<li>
		البحث عن المهارات اللازمة لإنجاز كل مهمة من مهام المنظومة.
	</li>
	<li>
		تحفيز فريق العمل لتحقيق الأهداف.
	</li>
	<li>
		الحد بين النزاعات والخلافات وتقريب وجهات النظر في فريق العمل.
	</li>
	<li>
		اقتراح التقنيات اللازمة لإنجاز العمل.
	</li>
	<li>
		وضع خطة عمل تعتمد على الاستراتيجية المتبعة في إدارة دورة حياة المنظومة.
	</li>
</ul>

<p>
	أما مخرجات هذه المرحلة فتأتي في مستندين الأول يضم خطة العمل والثاني مستند دراسة الجدوى والمخاطر ويعرض على الشخص المسؤول أو على لجنة القبول acceptance committee فإما أن يُقبل أو يُرفض أو يؤجل وفقًا للفائدة المضافة موازنة بالمخاطر.
</p>

<h3>
	مرحلة تحليل المنظومة
</h3>

<p>
	لا بد أن تتمكن هذه المرحلة من الإجابة عن الأسئلة التالية:
</p>

<ul>
	<li>
		ماذا نتوقع من المنظومة؟ ما هو المطلوب منها؟
	</li>
	<li>
		من سيستخدم المنظومة الجديدة أو المطوّرة؟
	</li>
	<li>
		أين ومتى ستُستخدم المنظومة الجديدة؟
	</li>
</ul>

<p>
	تضم هذه المرحلة خطوتين رئيسيتين:
</p>

<ul>
	<li>
		تحديد متطلبات المنظومة
	</li>
	<li>
		بناء نماذج تحليلية للمنظومة
	</li>
</ul>

<h4>
	تحديد متطلبات المنظومة define requirements
</h4>

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

<p>
	ما هو المتطلب؟ المتطلب هو تصريح عما يُراد من المنظومة فعله أو تصريح عن الخصائص التي تتمتع بها المنظومة التي نريد بناءها. هنالك نوعان من المتطلبات: متطلبات وظيفية functional ومتطلبات غير وظيفية nonfunctional.
</p>

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

<p>
	وأما <strong>المتطلبات غير الوظيفية nonfunctional</strong>، فتضم تصريحات عن ميزات هذه المنظومة التي لا تتعلق بطريقة عملها. وكمثال عليها أن تعمل المنظومة مثلًا على الحواسب وأن تعمل أيضًا على الهواتف الذكية.
</p>

<p>
	كما تجد أحيانًا متطلبات إضافية مثل:
</p>

<ul>
	<li>
		<strong>متطلبات عمل</strong>: وهو تصريح عما يحتاجه العميل.
	</li>
	<li>
		<strong>متطلبات مستخدمين</strong>: وتضم تصريحات عن طريق استخدام المنظومة.
	</li>
	<li>
		<strong>متطلبات منظومة</strong>: وتضم تصريحات عن أسلوب وطريقة بناء المنظومة.
	</li>
</ul>

<p>
	ينتج عن مرحلة تحديد المتطلبات مستند يُدعى "تصريح تحديد المتطلبات requirements definition statement"ويضم المتطلبات الوظيفية وغير الوظيفية على شكل قائمة مفصّلة قد تُعطى فيها الأولوية لمتطلبات على أخرى إضافة إلى بعض المعلومات الضرورية للخطوات القادمة، كما يحدد هذا المستند ما يُدعى بنطاق عمل أو إطار عمل المنظومة system domain الذي ينبغي العمل في حدوده دون رفع أو تخفيض المتطلبات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="128999" href="https://academy.hsoub.com/uploads/monthly_2023_06/309810123_.png.5f5bd33306ad3b20422f94f2210a6d50.png" rel=""><img alt="دورة حياة تطوير البرمجيات" class="ipsImage ipsImage_thumbnailed" data-fileid="128999" data-ratio="74.91" data-unique="gjboy6u3s" style="width: 801px; height: auto;" width="801" src="https://academy.hsoub.com/uploads/monthly_2023_06/.thumb.png.beff2ae958a9888a958a6f43fbfa1310.png"> </a>
</p>

<h4>
	بناء نماذج تحليلية للمنظومة
</h4>

<p>
	يحاول فريق العمل خلال هذه المرحلة بناء نماذج models عن المتطلبات الوظيفية. وتوصِّف هذه المتطلبات مداخل ومخارج كل متطلب وطريقة تنفيذه. وغالبًا ما تُستخدم نماذج حالات الاستخدام use-case model التي توصّف كل وظيفة من وظائف المنظومة ومن سيشارك في إنجاز هذه الوظيفة سواء وظائف أخرى أو مستخدم خارجي، كما تُستخدم نماذج النشاط Activity models لتوصيف تسلسل تنفيذ العمليات التي تحقق وظيفة محددة وطريقة التفاعل المتبادل بين الوظائف المختلفة في المنظومة.
</p>

<p>
	فلو كان لدينا مثلًا منظومة برمجية لإدارة صراف آلي ATM ستكون إحدى حالات الاستخدام هو "سحب نقود" وسترتبط حالة الاستخدام هذه بحالة استخدام أخرى "التحقق من هوية المستخدم" ولا بد من وجود مشارك خارجي وهو "مستخدم الصراف". إن ما يمثّل هذه الترابطات هو مخطط حالات الاستخدام أما بالنسبة لمخطط النشاط فسيوُصف على الشكل التالي مثلًا:
</p>

<ul>
	<li>
		الصراف: يعرض رسالة ترحيب.
	</li>
	<li>
		المستخدم: يدخل البطاقة.
	</li>
	<li>
		الصراف: يحلل البطاقة ويعرض للمستخدم قائمة الخيارات.
	</li>
	<li>
		المستخدم: يضغط زر "سحب النقود".
	</li>
	<li>
		الصراف: يعرض قائمة بالمبالغ التي يمكن سحبها.
	</li>
	<li>
		المستخدم: يختار المبلغ المطلوب.
	</li>
	<li>
		الصراف: يعدّ النقود ويخرجها.
	</li>
</ul>

<p>
	تمثل هذه النماذج على شكل ملف يُدعى توصيف حالات الاستخدام use-case description أو عن طريق <a href="https://academy.hsoub.com/questions/12323-%D9%85%D8%A7%D9%87%D9%8A-uml-%D8%9F/" rel="">مخططات UML</a> -لغة النمذجة الموحدة unified mark language- تُعرف بمخططات حالات الاستخدام ومخططات النشاط.
</p>

<p>
	تُبنى بعد تكوين النماذج الوظيفية أيضًا النماذج البنوية التي تستفيد من نماذج حالات الاستخدام وملفات توصيفها في توصيف المتطلبات على شكل أصناف لها خصائص (سمات attributes) وطرق methods وذلك إن كانت استراتيجية التحليل هي استراتيجية كائنية التوجّه object oriented strategy وهي الاستراتيجية الأكثر شيوعًا. تمثّل هذه الأصناف ضمن مخططات تُدعى مخططات الأصناف ويُستفاد منها لاحقًا في عملية برمجة المتطلب الوظيفي.
</p>

<p>
	وأخيرًا تُبنى النماذج السلوكية behavioral models وهي نماذج تعبّر عما يجري داخليًا خلف الستار حتى تؤدي المنظومة الوظائف المطلوبة منها ظاهريًا أي كما يراها المستخدم الخارجي. تتشكل هذه النماذج انطلاقًا من النماذج البنيوية والوظيفية لأنها تعبير عن التفاعل بين النماذج البنيوية (الكائنات التي تشكل المنظومة). وتُمثّل النماذج السلوكية باستخدام مخططات UML منها مخطط التتابع sequence diagram التي تمثل تتابع الرسائل بين الكائنات، ومخططات الاتصال communication diagram التي تمثل الطرق التي تسلكها تلك الرسائل ومخططات التوقيت timing diagrams.
</p>

<p>
	ينتج عن هذه المرحلة ورقة تُدعى "اقتراح المنظومة system proposal" وتضم تفاصيل عن وظائف المنظومة الجديدة وطريقة إنجازها مُدعّمًا بالنماذج والمخططات التي بنيت في هذه المرحلة وتُرفع إلى لجنة القبول لاتخاذ القرار بالمضي أو إعادة تحليل المتطلبات.
</p>

<h3>
	مرحلة تصميم المنظومة البرمجية
</h3>

<p>
	وتجيب هذه المرحلة عن سؤال مهم وهو كيف سنبني المنظومة؟ إذ تُقرر في هذه المرحلة نوعية العتاد الصلب التي ستُستخدم والبرمجيات اللازمة والبنية التحتية لشبكات الاتصالات وواجهات المستخدم وقواعد البيانات ونماذج إرسال البيانات والتقارير.
</p>

<p>
	تضم هذه المرحلة الخطوات التالية:
</p>

<ul>
	<li>
		<strong>وضع استراتيجية التصميم</strong>: وفيها يجيب فريق العمل بالتعاون مع الجهة المعنية عن الأسئلة التالية:
	</li>
	<li>
		هل ستُطوّر المنظومة محليًا في الجهة التي تحتاج المنظومة اعتمادًا على كوادرها الخاصة؟
	</li>
	<li>
		هل ستطور المشروع شركة مختصة أخرى؟
	</li>
	<li>
		هل ستشتري الشركة حزم برمجية جاهزة تحقق متطلبات مرحلة التحليل؟
	</li>
	<li>
		<strong>تطوير المعمارية الأساسية للمنظومة</strong>: بما في ذلك العتاد الصلب والبرمجي وواجهة المستخدم والبنية التحتية لشبكة الاتصال وهل سيتم البناء على البنية التحتية السابقة أم تحتاج المنظومة الجديدة إلى بنية تحتية جديدة كليًا.
	</li>
	<li>
		<strong>تطوير مواصفات لقواعد البيانات والملفات</strong>: أي تحديد طبيعة البيانات التي تُخزن وحجمها وأين وكيف ستُخزن.
	</li>
	<li>
		<strong>تصميم البرمجيات التي ستُبنى</strong>: أي ما هي البرامج التي ينبغي للمبرمجين العمل عليها وما وظيفة كل برنامج وما هي علاقته بغيره.
	</li>
</ul>

<p>
	ينتج عن هذه المرحلة مجموعة المخرجات التالية:
</p>

<ul>
	<li>
		مستندات تصميم المعمارية.
	</li>
	<li>
		مستندات تصميم واجهة المستخدم.
	</li>
	<li>
		مستندات مواصفات قواعد وملفات البيانات.
	</li>
	<li>
		مستند تصميم البرامج.
	</li>
</ul>

<p>
	تستخدم هذه المستندات لاحقًا في توجيه مرحلة إنجاز المنظومة.
</p>

<h3>
	مرحلة إنجاز المنظومة
</h3>

<p>
	وهي المرحلة الأخيرة من دورة تطوير البرمجيات، وتحظى هذه المرحلة بكامل الانتباه لأنها تعد المرحلة الأطول والأكثر تكلفة. تضم هذه المرحلة الخطوات التالية:
</p>

<ul>
	<li>
		بناء المنظومة
	</li>
	<li>
		اختبار المنظومة
	</li>
	<li>
		توثيق المنظومة
	</li>
	<li>
		تركيب المنظومة
	</li>
	<li>
		إدارة التغيير
	</li>
	<li>
		التدريب على استخدام المنظومة
	</li>
	<li>
		الصيانة ودعم المنظومة
	</li>
	<li>
		التقييم الراجع للمشروع
	</li>
</ul>

<h4>
	بناء المنظومة
</h4>

<p>
	ويقصد فيها برمجة كل وظيفة من وظائف المنظومة والربط بين هذه البرمجيات وتعتمد بشكل كامل على مخرجات مرحلتي التحليل والتصميم. تُعد هذه المرحلة بأنها الأقل خطرًا على فشل المنظومة ولا يأتي فشل المنظومة نتيجة لضعف البرمجة بل لضعف مخرجات عمليتي التحليل والتصميم. تجري في هذه المرحلة أيضًا عملية توثيق الإجرائيات بدقة للاستفادة منها في خطوات الاختبار والصيانة.
</p>

<h4>
	اختبار المنظومة
</h4>

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

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/cpp/%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D9%88%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%AA%D9%86%D9%82%D9%8A%D8%AD-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D8%AD%D9%8A%D8%AD-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-cpp-r1190/" rel="">اختبارات الوحدات unit tests</a>: ويجري على دالة أو صنف أو جزء محدد من وحدة برمجية للتأكد من أن الدخل الصحيح يعطي الخرج المطلوب.
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/%D8%A3%D9%81%D8%B6%D9%84-%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%85%D9%86%D9%87%D8%AC-%D8%A7%D9%84%D8%AA%D9%83%D8%A7%D9%85%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%85%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%85%D8%B1-cicd-r687/" rel="">اختبارات التكامل integration tests</a>: يختبر التفاعل المتبادل بين مجموعة محددة من الأصناف لإنجاز وظيفة محددة.
	</li>
	<li>
		اختبارت المنظومة system tests: يختبر تفاعل جميع الأصناف مع بعضها لإعطاء وظيفة متكاملة للمنظومة دون أخطاء، وهو مشابه لاختبار التكامل لكن على صعيد أوسع.
	</li>
	<li>
		اختبارات القبول acceptance tests: وينفذها المستخدمون النهائيون للمنظومة تحت إشراف عضو أو أكثر من فريق العمل وذلك لتقييم قبول المستخدم لهذه المنظومة الجديدة.
	</li>
</ul>

<h4>
	توثيق المنظومة
</h4>

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

<h4>
	تركيب المنظومة
</h4>

<p>
	وتتضمن هذه الخطوة تثبيت العتاد الصلب والبرمجيات اللازمة وفقًا لمعايير المعيارية المقترحة.
</p>

<h4>
	إدارة التغيير
</h4>

<p>
	لا يجري الانتقال إلى استخدام المنظومة الجديدة مباشرة بل على مراحل لمساعدة المستخدمين النهائيين على التأقلم معها بأقل توتر ممكن. ولأن لكل تغيير مقاومة لا بد أن يتشارك محللو المنظومة وأصحاب القرار ومديرو المشروع في إدارة مرحلة التحوّل وتوجيه المستخدمين وتحفيزهم على تبني المنظومة الجديدة.
</p>

<h4>
	التدريب على استخدام المنظومة
</h4>

<p>
	لا بد في هذه المرحلة من تقديم المهارات اللازمة لاستثمار النظام دون الافتراض المسبق بأن المنظومة سهلة التعلّم. كما ينبغي التركيز في هذه المرحلة على مساعدة المتدرب على تنفيذ المهام الموكلة إليه فقط دون الغوص في تفاصيل وميزات المنظومة الجديدة، فهنا تأتي أهمية وجود توثيق شامل.
</p>

<h4>
	الصيانة ودعم المنظومة
</h4>

<p>
	وهي عملية تحسين المنتج البرمجي كي يلبي دائمًا متطلبات العمل، وقد تكون خطوة الصيانة ذات تكلفة عالية. يُكلف بعملية الصيانة عادة محللو الأنظمة والمبرمجون المبتدئون. ويأتي دعم المنظومة عبر خيارات عدة منها:
</p>

<ul>
	<li>
		التدريب عند الطلب أو الحاجة.
	</li>
	<li>
		<a href="https://academy.hsoub.com/entrepreneurship/customer-care/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%88%D8%B3%D9%8A%D8%B9-%D9%86%D8%B7%D8%A7%D9%82-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D8%AF%D9%88%D9%86-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B3-%D8%A8%D8%A7%D9%84%D8%AC%D9%88%D8%AF%D8%A9-r1040/" rel="">الدعم المباشر عبر الإنترنت</a>: من خلال التوثيق والأسئلة أكثر شيوعًا وحتى المحادثة المباشرة.
	</li>
	<li>
		مكاتب الدعم: وذلك لاستشارة الخبراء مباشرة حول مشاكل محددة بناء على مواعيد مسبقة.
	</li>
</ul>

<h4>
	التقييم الراجع للمشروع
</h4>

<p>
	أي تقييم نجاح المشروع أو فشله والطرق الكفيلة بتحسينه وتطويره وأخذ العبر منه. وتنفذ هذه الخطوة عادة وفق مسارين:
</p>

<ul>
	<li>
		مراجعة منظومة: والهدف هو موازنة التكلفة والفائدة الحقيقية موازنة مع التكلفة والفوائد المقدرة في مرحلتي التخطيط والتحليل.
	</li>
	<li>
		مراجعة فريق العمل: إذ يقيِّم كل فرد من أفراد فريق العمل أخطاءه ونجاحاته في إنجاز المهام الموكلة إليه.
	</li>
</ul>

<p>
	يمكن بعد ذلك لمدير المشروع أن يجمع التقييمات ويضيف إليها بعض التوضيحات والشروحات ليخرج بملف يُدعى "دروس تعلمناها lesson learned" والتي تلعب دورًا مهمًا في تدريب وتعليم الأعضاء الجدد وفي تفادي أية أخطاء مماثلة في مشاريع مستقبلية.
</p>

<h2>
	خاتمة
</h2>

<p>
	تعرفنا في هذا المقال على الأساسيات المتبعة في التخطيط لتطوير البرمجيات أو المنظومات المعلوماتية عمومًا ورأينا أهمية التخطيط التدقيق والتحليل لمتطلبات البرمجيات للوصول إلى منتج قادر على الصمود والمنافسة. كما تعرفنا على المراحل الأساسية الأربعة لعملية تطوير المنتجات البرمجية وهي مراحل التخطيط والتحليل والتصميم والتنفيذ، وتعرفنا على مجموعة الأعمال التي ينبغي القيام بها في كل مرحلة والمخرجات التي تنتج عن كل منها وصولًا إلى المنتج النهائي وصيانته ودعمه.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%AC%D9%86%D8%A8-%D9%83%D8%A7%D8%B1%D8%AB%D8%A9-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D9%86%D8%A9-%D8%A8%D9%81%D8%B1%D9%8A%D9%82-%D8%AE%D8%A7%D8%B1%D8%AC%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-r749/" rel="">كيف تتجنب كارثة الاستعانة بفريق خارجي في تطوير البرمجيات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/entrepreneurship/business/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%85%D9%86%D9%87%D8%AC%D9%8A%D8%A9-%D8%A3%D8%AC%D8%A7%D9%8A%D9%84-agile-r1047/" rel="">دليل المبتدئين لمنهجية أجايل Agile</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%B3%D8%A8%D8%B9-%D8%A7%D9%84%D9%82%D8%A7%D8%AA%D9%84%D8%A9-%D9%84%D8%A3%D9%8A%D9%91-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-r742/" rel="">الأخطاء السبع القاتلة لأيّ مشروع برمجيات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2007</guid><pubDate>Sat, 24 Jun 2023 13:07:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x62A;&#x637;&#x648;&#x64A;&#x631; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x627;&#x62A; Software Development</title><link>https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_06/----.png.1b913ded733253ef3e0ca21cd9bc90f5.png" /></p>
<p>
	نحتاج الآن أكثر من أي وقت مضى إلى مطوري البرمجيات الذين يكتبون برامج تقوم بأغلب المهام التي يحتاجها كل من الشركات والأفراد على السواء، لتقليل الجهد البشري المبذول في تلك المهام من ناحية، ولتقليل نسب الخطأ والمخاطر كذلك، وهو اﻷمر الذي تتفوق فيه البرمجيات على الإنسان فيه بما أنها تعمل في بيئات لا تتأثر بالمخاطر التي يتأثر بها الإنسان، ولا تتعرض إلى السهو والنسيان الذي يعرض للإنسان أثناء تنفيذ المهام.
</p>

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

<h2>
	ما هو تطوير البرمجيات؟
</h2>

<p>
	عملية تطوير البرمجيات software development تشمل الخطوات والمناهج المتبعة في بناء وتصميم البرمجيات وكتابتها واختبارها وتجميعها، وتنطوي هذه العمليات على تفاصيل وأقسام كثيرة بداخلها سيأتي بيانها أدناه.
</p>

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

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

<p>
	يشار أحيانًا إلى تطوير البرمجيات بأسماء متبادلة مثل <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-r1827/" rel="">تطوير التطبيقات</a> أو يتعدى أحيانًا مفهوم التطبيقات إلى برمجة أنظمة تحكم لعتاد مخصص مثل <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1514/" rel="">أنظمة إنترنت الأشياء</a> ويمتد حتى أنظمة التشغيل.
</p>

<h2>
	أنواع البرمجيات وبيئات عملها
</h2>

<h2 style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="128993" href="https://academy.hsoub.com/uploads/monthly_2023_06/---.png.169fa183cc66622b4e84727d1f8f127a.png" rel=""><img alt="ما هو تطوير البرمجيات" class="ipsImage ipsImage_thumbnailed" data-fileid="128993" data-ratio="62.50" data-unique="5ysoroik3" style="width: 800px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_06/---.thumb.png.f52170967c3b38b9d3d24c5d8d4a3c1b.png"></a><a class="ipsAttachLink ipsAttachLink_image" href="" rel=""> </a>
</h2>

<p>
	البرمجيات كثيرة الأنواع ولكنها كلها في النهاية تعمل على عتاد حوسبي، ويكون هو البيئة التي تُنفذ فيها التعليمات البرمجية التي تحل المشكلة التي لدى العميل، وتتعدد تلك البيئات تعددًا لا يكاد يُحصر، لكنه يقع تحت فئات عامة يمكن حصرها وفقًا لنظام التشغيل كما يلي:
</p>

<ul>
	<li>
		الحواسيب المكتبية: وتشمل كل البرمجيات التي تعمل على الحاسوب سواء حاسوب مكتبي أو محمول
	</li>
	<li>
		الهواتف الذكية والأجهزة اللوحية: وتشمل البرمجيات التي تعمل على الأجهزة المحمولة من تطبيقات عامة وحتى تطبيقات مخصصة تدير العتاد مثل برمجيات الكاميرا وتسجيل الصوت وقياس الحرارة والضغط وغيرها.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%88-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1783/" rel="">أجهزة إنترنت الأشياء</a>: مثل برمجيات الأجهزة المنزلية التي يمكن ربطها بالإنترنت.
	</li>
	<li>
		الماكينات والآلات: والتي تكون الحواسيب فيها مدمجة وغير مرئية للمستخدم، أو يتفاعل معها من خلال أوامر محددة وقليلة.
	</li>
</ul>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>

<h2>
	أنواع تطوير البرمجيات
</h2>

<p>
	يندرج تحت مظلة تطوير البرمجيات أقسام كثيرة تمثل مجالات ووظائف يمكن للمرء أن يعمل فيها، وتتنوع بتنوع مجال العمل وطبيعة المشاكل التي يجب حلها، والأدوات المتاحة للعمل.
</p>

<h3>
	تطوير الويب Web Development
</h3>

<p>
	مصطلح تطوير الويب فيه إيجاز قليلًا من حيث أنه يشير إلى <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">تطوير تطبيقات الويب</a>، وهي أي تطبيق يمكن استخدامه داخل متصفح ويب مثل جوجل كروم أو فاير فوكس، وهو يختلف عن التطبيقات المصممة للهواتف أو سطح المكتب، كما سيلي بيانه أدناه. وهذا المجال بدوره مظلة جديدة تدخل تحتها العديد من الوظائف الأخرى المتعلقة به.
</p>

<h4>
	تطوير الواجهات الأمامية
</h4>

<p>
	يعمل مطور الواجهات الأمامية Front End Developer في الغالب على تطوير الأجزاء التي سيراها المستخدم ويتفاعل معها من البرامج والتطبيقات، وإن كان هذا المجال يدخل في أي نوع من أنواع التطوير البرمجي التي تنتج برامج رسومية يتفاعل المستخدم معها باللمس أو المؤشر أو غيرها، إلا أنه يُستخدم في الغالب للإشارة إلى <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D8%B7%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%85%D9%8A%D8%A9-angular-%D9%88-react-%D9%88-vue-r1596/" rel="">تطوير الواجهات الأمامية لتطبيقات الويب</a>، ما لم يُذكر خلاف ذلك لتخصيصه لمجال آخر.
</p>

<h4>
	تطوير الواجهات الخلفية
</h4>

<p>
	يعمل مطور الواجهات الخلفية Back End Developer مثل زميله السابق في بيئة الويب في الغالب، ما لم يُذكر تخصيص يشير إلى غير ذلك، وهو يختص بتطوير التطبيقات التي تعمل على الخوادم التي تُخزن فيها تطبيقات الويب والمواقع، والتي تمثل البنى التحتية لتلك المواقع، ولا يركز على واجهات مرئية، وإنما يهتم <a href="https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r665/" rel="">بقواعد البيانات</a> ومنطق التطبيق وكفاءة عمله واستهلاكه للموارد وسرعة تنفيذه، ومستوى أمانه.
</p>

<h3>
	تطوير التطبيقات المكتبية
</h3>

<p>
	يُقصد بها التطبيقات التي تعمل على الحواسيب المكتبية والحواسيب المحمولة Laptops، والتي تكون في الغالب على أنظمة تشغيل مثل ويندوز ولينكس وماك، وهي البرامج المعتادة للأعمال المكتبية للأفراد والشركات، مثل أطقم المكتب وبرامج البريد والتقويم ومتصفحات الويب وبرامج الحسابات وغيرها.
</p>

<p>
	وكذلك البرامج المتخصصة الموجهة للعاملين في تطوير البرمجيات أنفسهم، مثل <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9-ide-r1513/" rel="">بيئات التطوير المتكاملة</a> IDEs والمحررات النصية والمصرِّفات، وبرامج التصميم المرئي للعاملين في تطوير الواجهات الأمامية والمصممين، وكذلك برامج التصميم الهندسي للمهندسين، وبرامج تحرير الصوتيات والفيديو، فمثل تلك البرمجيات تحتاج إلى الموارد القوية للحواسيب المكتبية، ولا تصلح في الغالب أن تعمل بنفس الكفاءة على الهواتف مثلًا ذات الإمكانيات المحدودة.
</p>

<h3>
	تطوير تطبيقات الهواتف
</h3>

<p>
	لعل هذا المجال هو أكثر ما يتعرض إليه أغلب طوائف المستخدمين على اختلاف مجالاتهم وأعمارهم بسبب الاستخدام اليومي للهواتف المحمولة الذكية في حياتنا، ويُقصد به تطوير التطبيقات والبرامج للهواتف المحمولة والأجهزة اللوحية.
</p>

<p>
	هذا المجال كبير واسع فكما أشرنا نظرًا لازدياد الأجهزة المحمولة حولنا والتي أصبحت تتعدى الهاتف المحمول إلى أجهزة ملبوسة وأجهزة مساعدة ذكية وغيرها وكلها تحتاج إلى برمجة وتحتاج إلى تطبيقات لتؤدي الغرض المطلوب منها، ويطول المقال إن أردنا التفصيل فيه، ويمكنك الرجوع إلى مقال <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D9%88%D8%A7%D9%84-r1801/" rel="">برمجة تطبيقات الجوال</a> ففيه تفصيل أكبر.
</p>

<h3>
	تطوير التطبيقات السحابية
</h3>

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

<p>
	<a href="https://academy.hsoub.com/devops/cloud-computing/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D8%A9-cloud-r624/" rel="">التطبيقات السحابية</a> هي تطبيقات وخدمات تعمل على خوادم وحواسيب بعيدة -السحابة- تتبع الشركات المالكة لتلك البرمجيات والتطبيقات، أو تتبع شركات استضافة تحجز تلك الحواسيب لمن يرغب في استضافة تطبيقه عليها سواء كان فردًا أو شركة.
</p>

<p>
	ويستطيع المستخدم أو فريق العمل الوصول إلى تلك التطبيقات من أي جهاز متصل بالإنترنت، وتنفيذ المهام المطلوبة دون الحاجة إلى امتلاك المستخدم لحاسوب بنفس القوة المطلوبة لتنفيذ المهمة، فما هو إلا منصة وواجهة أو طرفية يصل منها إلى الحاسوب البعيد القوي، وتُنفذ العمليات بالكامل على الحاسوب البعيد.
</p>

<h2>
	أدوات تطوير البرمجيات
</h2>

<p>
	بعد أن عرفنا أشهر الأنواع الموجودة في مجالات تطوير البرمجيات، نأتي الآن إلى الأدوات التي يستخدمها أولئك المبرمجون في تنفيذ أعمالهم وتطوير برمجياتهم.
</p>

<h3>
	حاسوب
</h3>

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

<p>
	قد تتساءل عن مواصفات الحاسوب المناسب، وهذا يعتمد على مجال تطوير البرمجيات الذي تريد التخصص فيه، وعمومًا إن كانت عملية التطوير لا تحتاج إلى تعامل مع رسوميات، فمعظم الحواسيب الجديدة حاليًا تفي بالغرض، وارجع إلى سؤال <a href="https://academy.hsoub.com/questions/24470-%D9%85%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5-%D8%A8%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">مواصفات الحاسوب الخاص بالبرمجة</a> وسؤال <a href="https://academy.hsoub.com/questions/24298-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">الحاسوب المناسب لتعلم البرمجة</a> ففيهما تفصيل في هذا الموضوع.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_6051_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/uo5Ki6w3Zmk"></iframe>
</p>

<h3>
	لغة برمجة
</h3>

<p>
	على عكس الاعتقاد الشائع أن المبرمج حين تأتيه فكرة برمجية فإنه يجلس ليكتب شيفرات برمجية وطلاسم على شاشة سوداء، فإن الواقع هو أن البرمجة في جوهرها حل لمشكلة تواجه المبرمج أو يطلب منه عميله أو شركته أن يحلها مستخدمًا أدوات التطوير البرمجي، وأشهر تلك الأدوات لا شك هو <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a>.
</p>

<p>
	وعلى كثرة اللغات البرمجية الموجودة إلا أن أكثرها يبنى على منهج معين أو منطق للغة بعينها وتشترك كلها بمفاهيم وقواعد واحدة وقد شرحنا معظمها في مقال <a href="https://academy.hsoub.com/programming/general/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A8%D8%B3%D8%A7%D8%B7%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r1870/" rel="">قواعد البرمجة ببساطة للمبتدئين</a>، لذا على المتعلم الجديد تعلم الأساسيات والمفاهيم والقواعد قبل البدء مباشرة بتعلم لغة برمجة.
</p>

<p>
	وكما في حالة أنواع مجالات التطوير البرمجي والبرمجيات التي تختلف أنواعها باختلاف بيئة التشغيل التي ستعمل عليها، فإن لغات البرمجة كذلك تختلف وفقًا لنفس بيئات التشغيل ومتطلبات العمل والمشكلة التي تحلها، وفيما يلي موجز يقسم لغات البرمجة وفقًا للمنصة التي تعمل عليها.
</p>

<h3>
	عدة تطوير البرمجيات Development Kit
</h3>

<p>
	يحتاج النجار إلى عدة نجارة فيها مفك ومطرقة ومسامير وغيرها، وكذلك مطور البرمجيات، فهو يحتاج إلى عدة لتطوير البرمجيات وقد تكون هذه العدة ملموسة مثل لوحة إلكترونية ومعالجات (<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">راسبيري باي</a> أو <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino%D8%9F-r1800/" rel="">أردوينو</a> مثلًا) لبناء برمجيات لأنظمة تحكم وقد تكون عدة برمجية أيضًا وهي مجموعة برمجيات يحتاج إليها المطور مثل محرر الشيفرات البرمجية أو بيئة التطوير البرمجية وأدوات تشغيل الشيفرة واختبارها.
</p>

<p>
	تختلف العدة باختلاف تخصص تطوير البرمجيات الذي تحدده لذا لا تشغل بالك حاليًا بها، وستتعرف عليها بمجرد اختيار التخصص المناسب لك.
</p>

<h2>
	خطوات تطوير البرمجيات
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="128992" href="https://academy.hsoub.com/uploads/monthly_2023_06/--.png.26b3558e9bae50358598ba739a97bd98.png" rel=""><img alt="خطوات تطوير البرمجيات" class="ipsImage ipsImage_thumbnailed" data-fileid="128992" data-ratio="62.50" data-unique="7puktvy00" style="width: 800px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_06/--.thumb.png.10629997921ef1fdc589cbcc367d1fa7.png"> </a>
</p>

<p>
	يبدأ العمل على تطوير التطبيقات بتحليل المشكلة أولًا التي تكون لدى العميل ويحتاج إلى تطبيق برمجي لحلها، ثم تمر بعدة خطوات ومراحل إلى أن تصل إلى المنتج النهائي.
</p>

<h3>
	تحليل المشكلة
</h3>

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

<h3>
	اختيار منهجية العمل
</h3>

<p>
	لعل هذه لا تتغير من مشروع إلى آخر أو من تطبيق إلى آخر، وإنما تظل ثابتة لنفس فريق العمل أو نفس الشركة، وذلك لأنها تتعلق بنمط عمل الفريق نفسه وليس طريقة عمل التطبيق، وأشهر منهجيات العمل ما يلي:
</p>

<ul>
	<li>
		<p>
			منهج الشلال Waterfall: تُكتب البرامج وفقًا لهذا المنهج على مراحل متتالية، بحيث لا يبدأ العمل في مرحلة إلا بعد تمام التي قبلها.
		</p>
	</li>
	<li>
		<p>
			المنهج المرن Agile: وهذا المنهج يقسم فريق التطوير إلى مجموعات يوكل إلى كل منها جزء من العمل، ويعملون في نفس الوقت لتقليل الوقت اللازم لإتمام المشروع، ويغلب على هذا المنهج أن يتبع العاملون فيه أسلوب Scrum، الذي يضع بعض القواعد لإدارة فريق العمل لضمان إتمام المشروع على أكمل وجه في أقصر مدة ممكنة.
		</p>
	</li>
</ul>

<p>
	الجدير بالذكر هنا أن أسلوب العمل المرن وكذلك أسلوب Scrum لا يقتصران على تطوير التطبيقات البرمجية فقط، وإنما يتعديانها إلى كثير من المجالات الصناعية بما أنهما أسلوبين لإدارة المشاريع أصلًا وليسا مقتصرين على تطوير برمجيات، وارجع إلى مقال <a href="https://academy.hsoub.com/entrepreneurship/business/%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D8%B3%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%A8%D8%B9%D8%A9-%D9%84%D9%85%D9%86%D9%87%D8%AC%D9%8A%D8%A9-%D8%A3%D8%AC%D8%A7%D9%8A%D9%84-agile-ceremonies-r1053/" rel="">المراسم الأربعة لمنهجية أجايل Agile ceremonies</a> لمزيد من التفصيل.
</p>

<h3>
	النموذج الأولي Prototype
</h3>

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

<p>
	ثم يلتقي الفريق -أو المستقل مع العميل- في كل صباح أو كل فترة محددة لمناقشة ما تم إنجازه، وحل المشاكل التي طرأت، وتعديل سير العمل وفق المعطيات الجديدة.
</p>

<h3>
	مرحلة الاختبار
</h3>

<p>
	قد يبدأ العمل على اختبار البرمجية في بيئة التشغيل التي ستعمل عليها النسخة النهائية منه إما بعد الانتهاء من كتابة الشيفرات البرمجية والتصميم، أو أثناء العمل عليها إن احتاج الاختبار إلى العتاد الحقيقي وبيئة تشغيل حقيقية -الآلة أو الجهاز الذي سيعمل عليه التطبيق-، أو إلى بيئة تشغيل وهمية مثل المحاكيات، كما في حالة محاكيات نظم التشغيل والأجهزة المختلفة.
</p>

<p>
	يعود التطبيق أو البرمجية إلى مراحل سابقة من مراحل العمل وفقًا للمشاكل التي قد تظهر أثناء الاختبارات، وتُكرر دورة العمل مرة أخرى إلى أن ينجح التطبيق في تجاوز جميع مراحل التطوير.
</p>

<p>
	وقد يتطلب الاختبار أحيانًا عرضه على المستخدمين المحتملين لاختبار قابلية الاستخدام الشخصي للتطبيق، فقد يكون مكتوبًا بأفضل التقنيات البرمجية لكن المستخدم لا يستطيع استخدامه بسهولة، فحينئذ يكون الخلل في مرحلة تصميم تجربة الاستخدام، فيعود إليها من أجل تصميم تجربة استخدام سهلة للمستخدم النهائي.
</p>

<h3>
	الإطلاق الأولي Soft Launch
</h3>

<p>
	قد لا تظهر بعض المشاكل في بيئات الاختبار والمحاكاة مهما طالت، وقد يتعذر الوصول إلى مستخدمين محتملين، فيلجأ المطور إلى الإطلاق المرن التجريبي للتطبيق في بيئة التشغيل، مع مراقبة الأداء عن كثب، و<a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%85%D9%87%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%AE%D8%B5%D9%8A%D8%A9-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%AC%D8%A7%D8%AD-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ux-r810/" rel="">متابعة سلوك المستخدمين للتطبيق</a> وسؤالهم ومراسلتهم إن تطلب الأمر لجمع البيانات اللازمة لتطوير بقية المزايا والخدمات في التطبيق، ولتصحيح الأخطاء التي قد تظهر مع الإطلاق الأولي.
</p>

<h3>
	الإطلاق النهائي Hard launch
</h3>

<p>
	في هذه المرحلة يكون التطبيق قد نضج، وتختلف المدة اللازمة لنضج التطبيق ووصوله إلى مرحلة الإطلاق النهائي وفقًا للتطبيق نفسه وحجم المزايا التي فيه، وبيئة العمل التي سيعمل فيها، فبعض البيئات لا تحتمل نسب الخطأ أو تكراره، كما في حالة الآلات التي سيحمَّل عليها التطبيق ولا سبيل للوصول إليه بعدها إلا بصعوبة بالغة، مثل السيارات والأجهزة المنزلية، أو لا يمكن السماح بنسبة خطأ كبيرة غير محسوبة، كما في حالة آلات المصانع والسيارات، وهكذا.
</p>

<p>
	لكن قد لا يكون هذا ضروريًا أو يمثل مشكلة في حالات تطبيقات الهواتف وأسطح المكتب وتطبيقات الويب المخصصة للمهام العادية، وهي ولله الحمد أغلب الحالات التي يطلبها العملاء في السوق، وتتراوح مدة العمل على التطبيقات فيها من أسبوعين إلى بضعة أشهر في الغالب.
</p>

<h2>
	كيف تصبح مطور برمجيات؟
</h2>

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

<p>
	وتحتاج إلى بعض <a href="https://academy.hsoub.com/entrepreneurship/business/%D8%AA%D8%B9%D9%84%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%A7%D9%84-%D9%88%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%AE%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-r998/" rel="">المهارات الشخصية</a> أولًا لتتميز في مجال تطوير التطبيقات، ثم إلى معرفة بالتقنيات والأدوات المطلوبة للعمل نفسه.
</p>

<h3>
	المهارات الشخصية لمطور البرمجيات
</h3>

<p>
	سنركز هنا على المهارات التي يحتاج إليها المطور خاصة والتي تفيده مباشرة في <a href="https://academy.hsoub.com/entrepreneurship/tips/%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D9%85%D8%B3%D9%8A%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D9%86%D9%8A%D8%A9-%D9%86%D8%AD%D9%88-%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82-%D8%A7%D9%84%D8%B5%D8%AD%D9%8A%D8%AD-r1000/" rel="">مسيرته المهنية</a> كمطور، وليس المهارات العامة لأي عامل مستقل أو موظف.
</p>

<h4>
	الطلب المستمر للعلم
</h4>

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

<p>
	وليهتم بدراسة <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسوب اﻷساسية</a> التي تُبنى عليها التقنيات والأدوات الجديدة، ليسهل عليه استيعاب تلك التقنيات في بضعة أيام ثم بدء العمل بها مباشرة، فكم رأيت من مبرمج درس القواعد والأساسات الخاصة بعلم الحاسوب، فلما احتاج إلى تطوير تطبيق للهواتف مثلًا عكف على تعلم لغة البرمجة Swift فدرس أساسياتها ثم عمل مباشرة على التطبيق بعد أسبوع من دراستها، لأنه يعلم منطقها والأساسات التي بنيت عليها كما بينا من قبل في هذا المقال.
</p>

<p>
	وكذلك قد يتعرض المطور لمشروع يحتاج إلى تعلم تقنية جديدة عليه أو خارجة عن مجاله بالكلية، كأن يتعلم تقنيات تهيئة المحتوى مثلًا وهو يعمل مطورًا في الواجهات الأمامية أو الخلفية لتطبيقات الويب، وذلك لتصميم الموقع أو التطبيق وفق أحدث إرشادات محركات البحث وقواعدها التي تصنف المواقع وفقًا لها.
</p>

<h4>
	التفكير المنطقي
</h4>

<p>
	ذكرنا من قبل أن البرمجة في جوهرها هي حل للمشاكل، وما لغات البرمجة إلا أدوات تخرج تلك الحلول إلى النور، فإذا كنا نحتاج إلى معالجة معطيات تدخل إلينا بسرعة عالية، وبكميات كبيرة، واختيار المعطيات التي تحمل أسماء معينة أو خصائص س وص، فكيف نحل هذه المشكلة؟
</p>

<p>
	الأمر الجميل في البرمجة أن أغلب المشاكل التي ستواجه المطور قد واجهت غيره من قبل، ووُضعت لها الحلول وصُنفت فيها الكتب والتوثيقات، لهذا كانت مهارة حب العلم لازمة للمطور، فسيجد أغلب وقته يقرأ مبحرًا في التوثيقات البرمجية ومناهج حل المشاكل المنطقية للبرمجيات.
</p>

<p>
	فمثلًا، ينبغي أن يكون مطلعًا على <a href="https://wiki.hsoub.com/Design_Patterns" rel="external">أنماط التصميم البرمجية</a> التي تحل أغلب المشاكل في البرمجيات بمناهج تمثل قواعد يمكن تطبيقها على نفس نوعية المشاكل بغض النظر عن بيئة تطبيقها، وعلى أفضل الخوارزميات المستخدمة في تصنيف المعطيات واتخاذ القرار بشأنها، وهكذا.
</p>

<p>
	وقد فصلنا كثيرًا حول هذه النقطة في مقال <a href="https://academy.hsoub.com/programming/general/%D8%AD%D9%84-%D8%A7%D9%84%D9%85%D8%B4%D9%83%D9%84%D8%A7%D8%AA-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r760/" rel="">حل المشكلات وأهميتها في احتراف البرمجة</a> فارجع إليه لمزيد من الفائدة.
</p>

<h3>
	المهارات التقنية
</h3>

<p>
	ذكرنا أن المطور عليه أن يكون ملمًا بأساسيات علوم الحاسوب، ثم ينتقل بعدها إلى الأدوات التي سيستخدمها في بيئة عمله التي يختارها سواء كانت تطويرًا لتطبيقات الويب أو الهواتف أو تطبيقات أسطح المكتب أو غيرها، ليتعلم اللغات البرمجية وأطر العمل التي يحتاج إليها.
</p>

<p>
	يمكن كسب المهارات التقنية وتعلمها من عدة مصادر منها الدراسة الجامعية والدورات التعليمية، وعادة تكون الدراسة الجامعية طويلة أربع سنوات على الأقل ومليئة بالمواد النظرية البعيدة عن سوق العمل، أما الدورات التعليمية المتخصصة فقد أصبحت الأسلوب الشائع لدخول مجال هندسة وتطوير البرمجيات لأنها تعطي المتعلم ما ينفعه لبناء البرمجيات ودخول سوق العمل وأجمل ما في الأمر أن الشهادات التي تُعطى فيها معترفة وتغني عن الشهادة الجامعية.
</p>

<p>
	وقدمت أكاديمية حسوب الكثير من تلك الدورات التعليمية المتخصصة الاحترافية لتعلم تطوير البرمجيات ودخول سوق العمل مباشرةً، مثل دورة <a href="https://academy.hsoub.com/store/7-%D8%AF%D9%88%D8%B1%D8%A9-%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسوب</a> لتعليم أساسيات ومفاهيم مجال علوم الحاسوب بالكامل ودورة <a href="https://academy.hsoub.com/learn/python-application-development/" rel="">تطوير التطبيقات باستخدام لغة Python</a> لتعلم تطوير تطبيقات للويب أو لسطح المكتب أو دورة <a href="https://academy.hsoub.com/learn/javascript-application-development/" rel="">تطوير التطبيقات باستخدام لغة JavaScript</a> وغيرها وارجع إلى صفحة <a href="https://academy.hsoub.com/store/c1-%d8%af%d9%88%d8%b1%d8%a7%d8%aa-%d8%aa%d8%b9%d9%84%d9%8a%d9%85%d9%8a%d8%a9/" rel="">الدورات التعليمية</a> للاطلاع على كافة الدورات الموجودة.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_6051_7" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/EkvUFDevMlM"></iframe>
</p>

<h2>
	سوق العمل كمطور برمجيات
</h2>

<p>
	بعد أن يتعلم المطور التقنيات التي يحتاج إليها والمهارات اللازمة لشق طريقه في سوق العمل، يستطيع أن ينطلق مباشرة إلى السوق إما في صورة عمل حر من خلال تقديمه لخدمات تقنية وبرمجية على منصة <a href="khamsat.com" rel="">خمسات</a>، أو تقديمه لعروض على المشاريع التقنية في منصة <a href="https://www.mostaql.com/" rel="external">مستقل</a>، ومزية العمل الحر هنا أنه يوفر للمطور فرصة لإنشاء معرض أعمال متميز من سوابق الأعمال، وكذلك الاحتكاك المباشر بالعملاء لاكتساب الخبرات والمهارات اللازمة للتفاوض وإدارة المشاريع، وهي المهارة التي يستطيع تعلمها من <a href="https://academy.hsoub.com/learn/product-development-management/" rel="">دورة إدارة تطوير المنتجات</a> أيضًا ليتعرف على كيفية دراسة السوق وتحليل المنافسين ومتطلبات العملاء، ومراحل الإدارة المختلفة للمشاريع التقنية.
</p>

<p>
	أو إذا أراد، يمكنه التقديم على الوظائف البعيدة التقنية لمطوري التطبيقات عبر <a href="https://baaeed.com/?utm_source=academy.hsoub.com&amp;utm_medium=Links&amp;utm_campaign=Article" rel="external nofollow">منصة بعيد</a>، لتكون عملًا نظاميًا بدوام جزئي أو كلي، على عكس العمل الحر كما في منصتي مستقل وخمسات.
</p>

<h2>
	خاتمة
</h2>

<p>
	رأينا في هذا المقال مرورًا سريعًا على مجال تطوير التطبيقات البرمجية، وحاجة السوق إليه، وأنواع تطوير التطبيقات ومنصاتها، والمهارات التي يحتاج إليه المطور في عمله.
</p>

<p>
	وربما لا توجد عبارات تصف مدى حاجة السوق العالمي عمومًا والعربي خاصة إلى مطوري التطبيقات المهرة هذه الأيام، والأفضلية التي تكون لهؤلاء في السوق إذ لا تحدّهم حدود جغرافية، ولا أزمات محلية، بل تُفتح لهم فرص العمل بأجور تنافسية عالية موازنة ببقية الوظائف، مع عملاء من مختلف الدول.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/learn-programming/" rel="">تعلم البرمجة</a> 
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">تعرف على تخصص هندسة البرمجيات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">دليلك الشامل إلى برمجة التطبيقات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">مقال دليلك الشامل إلى تعلم البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/entrepreneurship/business/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%85%D9%86%D9%87%D8%AC%D9%8A%D8%A9-%D8%A3%D8%AC%D8%A7%D9%8A%D9%84-agile-r1047/" rel="">دليل المبتدئين لمنهجية أجايل Agile</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2006</guid><pubDate>Mon, 19 Jun 2023 13:00:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; OpenAPI&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%88-openapi%D8%9F-r2058/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/OpenAPI.png.693714c043d0b58c8a2e4d73f7e377ed.png" /></p>
<p>
	نستعرض في هذا الفيديو ما هو OpenAPI ومميزاته، وكيف يفيد المبرمجين أثناء العمل على تطوير الواجهات الأمامية والخلفية، كوسيلة موحدة يستطيع فيها مطور الواجهات الخلفية أن يعطي معلومات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> endpoints إلى مطور الواجهات الأمامية، كما سنتحدث عن بنية OpenAPI Specification.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_1979_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ما هو OpenAPI" width="1072" data-embed-src="https://www.youtube.com/embed/xT2q6ODadgk"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر عن تطوير الواجهات البرمجية، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/php-web-application-development/?utm_source=youtube.com&amp;utm_medium=referral&amp;utm_campaign=academy-23jun08" rel="">دورة تطوير تطبيقات الويب باستخدام لغة PHP</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>]]></description><guid isPermaLink="false">2058</guid><pubDate>Thu, 08 Jun 2023 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; PWA&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r2057/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/-----PWA(1).png.99e6a239076892e6ef9fb247b380877b.png" /></p>
<p>
	يشرح الفيديو مفهوم تطبيقات الويب التقدمية PWA ويوضح الفرق بينها وبين تطبيقات الويب العادية.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_20_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ما هي تطبيقات الويب التقدمية PWA؟" width="1072" data-embed-src="https://www.youtube.com/embed/fePrvlFBGAw"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على تطبيقات الويب، فننصحك <a href="https://academy.hsoub.com/learn/javascript-application-development/?utm_source=youtube.com&amp;utm_medium=referral&amp;utm_campaign=academy-23jun03" rel="">بتعلم تطوير التطبيقات باستخدام لغة JavaScript في أكاديمية حسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2057</guid><pubDate>Mon, 05 Jun 2023 15:00:00 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x626;&#x629; &#x644;&#x644;&#x627;&#x62E;&#x62A;&#x628;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x622;&#x644;&#x64A;&#x629; &#x641;&#x64A; &#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x644;&#x644;&#x62A;&#x648;&#x627;&#x641;&#x642; &#x645;&#x639; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A2%D9%84%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1990/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/----------.png.156271f872919a389f89b30756523bd5.png" /></p>
<p>
	سنتعلم في هذا المقال كيفية تثبيت بيئة الاختبارات الآلية وإجراء اختباراتك باستخدام نظام Selenium/WebDriver ومكتبة اختبار مثل selenium-webdriver في Node، وسنتعرّف على كيفية دمج بيئة اختبارك المحلية مع الأدوات التجارية مثل الأدوات التي ناقشناها في المقال السابق.
</p>

<ul>
	<li>
		<strong>المتطلبات الأساسية</strong>: يجب أن تتعلم أساسيات لغات <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت JavaScript</a>، وأن يكون لديك فكرة عن <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">المبادئ عالية المستوى لاختبار التوافق مع المتصفحات المختلفة</a> و<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%A2%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1989/" rel="">الاختبارات الآلية</a>.
	</li>
	<li>
		<strong>الهدف</strong>: معرفة كيفية إعداد بيئة اختبار Selenium محليًا وتشغيل الاختبارات باستخدامه، وكيفية دمجه مع أدوات مثل LambdaTest و Sauce Labs و BrowserStack.
	</li>
</ul>

<h2>
	نظام الاختبار Selenium
</h2>

<p>
	يُعَدّ نظام Selenium أشهر أداة لاختبار المتصفحات آليًا، وهناك طرق متعددة لاستخدام Selenium، ولكن أفضل طريقة لاستخدامه هي عبر WebDriver التي تُعَد واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> مبنية على نظام Selenium وتجري استدعاءات للمتصفح لجعله آليًا من خلال تنفيذ إجراءات مثل "افتح صفحة الويب" و"انقل هذا العنصر في الصفحة" و"انقر على هذا الرابط" و"تأكد مما إذا كان هذا الرابط يفتح <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a>" وغير ذلك، كما يُعَدّ ذلك مثاليًا لإجراء الاختبارات الآلية.
</p>

<p>
	تعتمد كيفية تثبيت واجهة WebDriver واستخدامها على البيئة البرمجية التي تريد استخدامها لكتابة الاختبارات وتشغيلها، كما تحتوي معظم البيئات الشائعة على حزمة أو إطار عمل يثبّت واجهة WebDriver والارتباطات المطلوبة للتواصل معها باستخدام هذه اللغة مثل لغات <a href="https://academy.hsoub.com/programming/java/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-java-%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9%D8%9F-r371/" rel="">Java</a> و <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-c-r597/" rel="">C#</a>‎ و <a href="https://academy.hsoub.com/programming/ruby/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%B1%D9%88%D8%A8%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r244/" rel="">Ruby</a> و <a href="https://academy.hsoub.com/programming/python/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r211/" rel="">Python</a> و <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">JavaScript</a> (<a href="https://academy.hsoub.com/programming/javascript/nodejs/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-nodejs-r1463/" rel="">Node</a>)‎ وغيرها.
</p>

<p>
	تتطلب المتصفحات المختلفة مشغّلات Drivers مختلفة للسماح لواجهة WebDriver بالاتصال والتحكم بها، وراجع <a href="https://www.selenium.dev/downloads/" rel="external nofollow">المنصات التي يدعمها Selenium للحصول على مزيد من المعلومات حول مكان الحصول على مشغّلات المتصفحات</a>.
</p>

<p>
	سنغطّي كتابة وتشغيل اختبارات Selenium باستخدام Node.js التي تُعَدّ سريعةً وسهلة الاستخدام وبيئةً مألوفةً أكثر لمطورِي الواجهة الأمامية.
</p>

<h3>
	إعداد Selenium في Node
</h3>

<ol>
	<li>
		أعِدّ أولًا مشروع npm جديد كما ناقشنا في قسم إعداد Node و npm في المقال السابق، وسمِّ هذا المشروع باسم مختلف مثل selenium-test.
	</li>
	<li>
		يجب بعد ذلك تثبيت إطار عمل للسماح بالتعامل مع Selenium ضمن Node، كما سنختار مكتبة selenium-webdriver الرسمية الخاصة بنظام Selenium، فتوثيقها محدثٌ إلى حد ما وتُطبَّق صيانتها جيدًا، وتوجد خيارات أخرى جيدة مثل webdriver.io و nightwatch.js، كما يمكنك تثبيت selenium-webdriver من خلال تشغيل الأمر التالي مع التأكد من أنك ضمن مجلد مشروعك:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_17" style=""><span class="pln">npm install selenium</span><span class="pun">-</span><span class="pln">webdriver</span></pre>

<p>
	<strong>ملاحظة</strong>: لا يزال اتباع الخطوات السابقة أمرًا جيدًا حتى إذا ثَبَّتَّ selenium-webdriver ونزّلتَ مشغّلات المتصفح مسبقًا، إذ يجب عليك التأكد من تحديث كل شيء.
</p>

<p>
	يجب بعد ذلك تنزيل المشغّلات ذات الصلة لتتمكّن WebDriver من التحكم في المتصفحات التي تريد اختبارها. تُعَد بعض المتصفحات خاصة بنظام التشغيل، لذلك سنلتزم باستخدام فايرفوكس Firefox وكروم Chrome المتوفرَين على جميع <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل</a> الرئيسية.
</p>

<ol>
	<li>
		نزّل الإصدار الأحدث من المشغّلات <a href="https://github.com/mozilla/geckodriver/releases/" rel="external nofollow">GeckoDriver</a> (لمتصفح Firefox) و ChromeDriver.
	</li>
	<li>
		فك ضغطها في مكان يسهل الانتقال إليه مثل جذر مجلد مستخدمك الرئيسي.
	</li>
	<li>
		أضِف موقع مشغّل <code>chromedriver</code> و <code>geckodriver</code> إلى المتغير <code>PATH</code> في نظامك، ويجب أن يكون هذا الموقع مسارًا مطلقًا من جذر قرصك الصلب إلى المجلد الذي يحتوي على المشغّلات، فإذا استخدمت جهاز macOS وكان اسم مستخدِمك هو sami ووضعت المشغّلات في جذر المجلد الرئيسي مثلًا، فسيكون المسار <code>‎/Users/sami</code>.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong>: يجب أن يكون المسار الذي تضيفه إلى المتغير <code>PATH</code> هو المسار إلى المجلد الذي يحتوي على المشغّلات، وليس المسارات المؤدية إلى المشغّلات نفسها، فهذا خطأ شائع.
</p>

<p>
	يمكنك ضبط المتغير <code>PATH</code> على نظام macOS ومعظم <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">أنظمة لينكس</a> كما يلي:
</p>

<ol>
	<li>
		إذا لم تستخدِم صدفة <code>bash</code> مثل أنظمة macOS التي يكون فيها الإعداد الافتراضي هو صدفة <code>zsh</code> وليس <code>bash</code>، فبدّل إلى <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">صدفة bash</a> كما يلي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_21" style=""><span class="pln">exec bash</span></pre>

<ol start="2">
	<li>
		افتح ملف <code>‎.bash_profile</code> أو <code>‎.bashrc</code>، فإذا لم تتمكن من رؤية الملفات المخفية، فستحتاج لعرضها.
	</li>
	<li>
		الصق ما يلي في أسفل الملف (عدّل المسار كما هو على جهازك):
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_25" style=""><span class="pun">#</span><span class="typ">Add</span><span class="pln"> </span><span class="typ">WebDriver</span><span class="pln"> browser drivers to PATH

</span><span class="kwd">export</span><span class="pln"> PATH</span><span class="pun">=</span><span class="pln">$PATH</span><span class="pun">:</span><span class="str">/Users/</span><span class="pln">sami</span></pre>

<ol start="4">
	<li>
		احفظ هذا الملف وأغلقه، ثم أعِد تشغيل موجّه الأوامر أو الطرفية لإعادة تطبيق إعداد Bash.
	</li>
	<li>
		تحقق من وجود مساراتك الجديدة في المتغير <code>PATH</code> من خلال إدخال ما يلي في طرفيتك:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_27" style=""><span class="pln">echo $PATH</span></pre>

<ol start="6">
	<li>
		يجب أن تراه مطبوعًا في الطرفية.
	</li>
</ol>

<p>
	لنجرب اختبارًا سريعًا للتأكد من أن كل شيء يعمل.
</p>

<p>
	أولًا، أنشئ ملفًا جديدًا ضمن مجلد مشروعك بالاسم google_test.js.
</p>

<p>
	ثانيًا، ضع فيه المحتويات التالية ثم احفظه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_29" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">),</span><span class="pln">
    </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">,</span><span class="pln">
    until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'firefox'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'http://www.google.com'</span><span class="pun">);</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'webdriver'</span><span class="pun">);</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="pln">webdriver</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">.</span><span class="pln">TAB</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'btnK'</span><span class="pun">)).</span><span class="pln">click</span><span class="pun">();</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    driver</span><span class="pun">.</span><span class="pln">quit</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	ثالثًا، تأكد من أنك ضمن مجلد مشروعك في الطرفية ثم أدخِل الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_31" style=""><span class="pln">node google_test</span></pre>

<p>
	يجب أن ترى متصفح Firefox يفتح تلقائيًا، ويجب تحميل جوجل تلقائيًا في تبويب المتصفح، وإدخال النص "webdriver" في مربع البحث، وسيُنقَر على زر البحث، ثم ستنتظر بعدها WebDriver لمدة ثانيتين، ثم يجب الوصول إلى عنوان المستند، وإذا كان النص "webdriver - Google Search"، فستُعاد رسالة تعبِّر عن اجتياز الاختبار، ثم ستغلِق WebDriver المتصفحَ Firefox وتتوقف.
</p>

<h2>
	اختبار متصفحات متعددة في وقت واحد
</h2>

<p>
	لا يوجد شيء يمنعك من تشغيل الاختبار على متصفحات متعددة في وقت واحد، إذًا لنجرّب ذلك.
</p>

<p>
	أولًا، أنشئ ملفًا جديدًا آخر ضمن مجلد مشروعك بالاسم googletestmultiple.js، ولا تتردد في تغيير المراجع إلى بعض المتصفحات الأخرى التي أضفناها أو إزالتها وغير ذلك اعتمادًا على المتصفحات المتاحة للاختبار على نظام تشغيلك، ولكن يجب التأكد من إعداد مشغّلات المتصفحات الصحيحة على نظامك، فإذا أردت معرفة السلسلة النصية المراد استخدامها ضمن التابع <code>‎.forBrowser()‎</code> للمتصفحات الأخرى، فراجع صفحة <a href="https://www.selenium.dev/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_Browser.html" rel="external nofollow">قائمة المتصفحات</a>.
</p>

<p>
	ثانيًا، ضع المحتويات التالية في هذا الملف ثم احفظه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_33" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">),</span><span class="pln">
    </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">,</span><span class="pln">
    until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">let</span><span class="pln"> driver_fx </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'firefox'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">let</span><span class="pln"> driver_chr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'chrome'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

searchTest</span><span class="pun">(</span><span class="pln">driver_fx</span><span class="pun">);</span><span class="pln">
searchTest</span><span class="pun">(</span><span class="pln">driver_chr</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> searchTest</span><span class="pun">(</span><span class="pln">driver</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'http://www.google.com'</span><span class="pun">);</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'webdriver'</span><span class="pun">);</span><span class="pln">

 driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="pln">webdriver</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">.</span><span class="pln">TAB</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">

  driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'btnK'</span><span class="pun">)).</span><span class="pln">click</span><span class="pun">();</span><span class="pln">

 driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      driver</span><span class="pun">.</span><span class="pln">quit</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	تأكد من أنك ضمن مجلد مشروعك في الطرفية ثم أدخِل الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_35" style=""><span class="pln">node google_test_multiple</span></pre>

<p>
	إذا استخدمت جهاز ماك Mac وقررت اختبار المتصفح سفاري Safari، فيمكن أن تتلقى رسالة خطأ مثل "Could not create a session: You must enable the 'Allow Remote Automation' option in Safari's Develop menu to control Safari via WebDriver"، فإذا حصلت على هذا الخطأ، فاتبع التعليمات المُعطاة وحاول مرةً أخرى.
</p>

<p>
	أجرينا هنا الاختبار مثل الاختبار السابق باستثناء أننا غلّفناه هذه المرة ضمن الدالة <code>searchTest()‎</code>، وأنشأنا نسخًا من متصفحات جديدة ثم مررنا كلًا منها إلى الدالة لإجراء الاختبار على المتصفحات الثلاثة.
</p>

<p>
	لنلقِ نظرةً الآن على أساسيات صياغة واجهة WebDriver بمزيد من التفاصيل.
</p>

<h2>
	أساسيات صياغة WebDriver
</h2>

<p>
	لنلقِ نظرةً على بعض الميزات الرئيسية لصياغة Webdriver، ويمكنك الحصول على مزيد من التفاصيل من خلال الرجوع إلى <a href="https://www.selenium.dev/selenium/docs/api/javascript/module/selenium-webdriver/" rel="external nofollow">مرجع واجهة برمجة تطبيقات جافاسكربت selenium-webdriver</a> و<a href="https://www.selenium.dev/documentation/webdriver/" rel="external nofollow">توثيق Selenium الرئيسي</a> الذي يحتوي على أمثلة متعددة مكتوبة بلغات مختلفة للتعلم منها.
</p>

<h3>
	بدء اختبار جديد
</h3>

<p>
	يجب تضمين الوحدة <code>selenium-webdriver</code> كما يلي لبدء اختبار جديد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_37" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span></pre>

<p>
	يجب بعد ذلك إنشاء نسخة جديدة من المشغّل باستخدام الباني <code>new webdriver.Builder()‎</code>، ولكن يجب ربط التابع <code>forBrowser()‎</code> بها لتحديد المتصفح الذي تريد اختباره باستخدام هذا الباني، والتابع <code>build()‎</code> لبنائه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_39" style=""><span class="kwd">let</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'firefox'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>

<p>
	لاحظ أنه يمكن ضبط خيارات إعدادات محددة للمتصفحات المراد اختبارها، إذ يمكنك مثلًا ضبط إصدار معيّن من المتصفح ونظام التشغيل للاختبار ضمن التابع <code>forBrowser()‎</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_41" style=""><span class="kwd">let</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'firefox'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'46'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'MAC'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>

<p>
	كما يمكنك ضبط هذه الخيارات باستخدام متغير البيئة كما يلي على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_43" style=""><span class="pln">SELENIUM_BROWSER</span><span class="pun">=</span><span class="pln">firefox</span><span class="pun">:</span><span class="lit">46</span><span class="pun">:</span><span class="pln">MAC</span></pre>

<p>
	لننشئ اختبارًا جديدًا من خلال إنشاء ملف جديد بالاسم quick_test.js ضمن مجلد مشروعك لاختبار Selenium وأضِف الشيفرة البرمجية التالية إليه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_45" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'firefox'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>

<h3>
	الحصول على الصفحة الذي تريد اختبارها
</h3>

<p>
	يمكنك تحميل الصفحة التي تريد اختبارها من خلال استخدام التابع <code>get()‎</code> مع نسخة المشغّل التي أنشأتها مسبقًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_47" style=""><span class="pln">driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'http://www.google.com'</span><span class="pun">);</span></pre>

<p>
	يمكنك استخدام أيّ عنوان URL للإشارة إلى موردك، بما في ذلك العنوان <code>file://‎</code> لاختبار مستند محلي كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_49" style=""><span class="pln">driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'file:///Users/chrismills/git/learning-area/tools-testing/cross-browser-testing/accessibility/fake-div-buttons.html'</span><span class="pun">);</span></pre>

<p>
	أو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_51" style=""><span class="pln">driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'http://localhost:8888/fake-div-buttons.html'</span><span class="pun">);</span></pre>

<p>
	لكن يُفضَّل استخدام موقع خادم بعيد بحيث تكون الشيفرة البرمجية أمرن، فإذا استخدَمت خادمًا بعيدًا لإجراء اختباراتك، فستُعطَّل شيفرتك إذا حاولت استخدام المسارات المحلية.
</p>

<p>
	أضِف السطر التالي في نهاية الملف quick_test.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_53" style=""><span class="pln">driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'https://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html'</span><span class="pun">);</span></pre>

<h3>
	التفاعل مع الصفحة
</h3>

<p>
	لدينا مستند للاختبار، لذا يجب التفاعل معه بطريقة ما تتضمن تحديد عنصر معيّن أولًا لاختباره، ويمكنك تحديد عناصر واجهة المستخدِم بعدة طرق في WebDriver بما في ذلك استخدام المعرّف ID والصنف Class واسم العنصر وغير ذلك، كما يمكن تحقيق تحديد العنصر الفعلي باستخدام التابع <code>findElement()‎</code> الذي يقبل تابعَ تحديد بوصفه معاملًا له، إذ يمكن مثلًا تحديد عنصر باستخدام المعرّف كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2482_55" style=""><span class="kwd">const</span><span class="pln"> element </span><span class="pun">=</span><span class="pln"> driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">id</span><span class="pun">(</span><span class="str">'myElementId'</span><span class="pun">));</span></pre>

<p>
	إحدى أكثر الطرق المفيدة للعثور على عنصر باستخدام لغة CSS هي استخدام التابع <code>By.css</code> الذي يسمح بتحديد عنصر باستخدام محدَّد CSS.
</p>

<p>
	أدخِل ما يلي في الجزء السفلي من شيفرة الملف quick_test.js:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1318_7" style=""><span class="pln">const button </span><span class="pun">=</span><span class="pln"> driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="pln">By</span><span class="pun">.</span><span class="pln">css</span><span class="pun">(</span><span class="str">'button:nth-of-type(1)'</span><span class="pun">));</span></pre>

<h3>
	اختبار العنصر
</h3>

<p>
	إذا أردت إدخال نص ضمن الزر، فيمكننا استخدام ما يلي ضمن الملف quick_test.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_9" style=""><span class="pln">button</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">text</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`</span><span class="typ">Button</span><span class="pln"> text is </span><span class="str">'${text}'</span><span class="pun">`);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	تأكد من أنك ضمن مجلد المشروع وشغّل الاختبار كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_11" style=""><span class="pln">node quick_test</span><span class="pun">.</span><span class="pln">js</span></pre>

<p>
	يجب أن ترى تسمية نص الزر في الطرفية.
</p>

<p>
	احذف إدخال الشيفرة السابقة ثم أضِف السطر التالي عوضًا عنه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_13" style=""><span class="pln">button</span><span class="pun">.</span><span class="pln">click</span><span class="pun">();</span></pre>

<p>
	شغّل اختبارك مرةً أخرى، إذ سيُنقَر على الزر وستظهر نافذة التنبيه <code>alert()‎</code> المنبثقة، وسنعلَم بذلك أنّ الزر يعمل على الأقل.
</p>

<p>
	كما يمكنك التفاعل مع النافذة المنبثقة من خلال إضافة ما يلي إلى أسفل الشيفرة البرمجية واختبارها مرةً أخرى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_15" style=""><span class="kwd">const</span><span class="pln"> alert </span><span class="pun">=</span><span class="pln"> driver</span><span class="pun">.</span><span class="pln">switchTo</span><span class="pun">().</span><span class="pln">alert</span><span class="pun">();</span><span class="pln">

alert</span><span class="pun">.</span><span class="pln">getText</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">text</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`</span><span class="typ">Alert</span><span class="pln"> text is </span><span class="str">'${text}'</span><span class="pun">`);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

alert</span><span class="pun">.</span><span class="pln">accept</span><span class="pun">();</span></pre>

<p>
	لنحاول بعد ذلك إدخال نص في أحد عناصر النموذج، لذا أضِف الشيفرة التالية وشغّل اختبارك مرةً أخرى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_17" style=""><span class="kwd">const</span><span class="pln"> input </span><span class="pun">=</span><span class="pln"> driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">id</span><span class="pun">(</span><span class="str">'name'</span><span class="pun">));</span><span class="pln">
input</span><span class="pun">.</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'Filling in my form'</span><span class="pun">);</span></pre>

<p>
	يمكنك إرسال ضغطات على المفاتيح التي لا يمكن تمثيلها بمحارف عادية باستخدام خاصيات الكائن <code>webdriver.Key</code>، وقد استخدمنا سابقًا البناء التالي مثلًا للخروج من حقل إدخال النموذج قبل الإرسال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_19" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="pln">webdriver</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">.</span><span class="pln">TAB</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<h3>
	انتظار اكتمال شيء ما
</h3>

<p>
	تريد في بعض الأحيان جعل واجهة WebDriver تنتظر حتى يكتمل شيء ما قبل المتابعة، فإذا حمّلت صفحةً جديدةً مثلًا، فيجب عليك الانتظار حتى ينتهي تحميل نموذج DOM الخاص بالصفحة قبل محاولة التفاعل مع أيّ من عناصره، وإلّا فيُحتمَل أن يفشل الاختبار.
</p>

<p>
	ضمّن الكتلة التالية في اختبار الملف google_test.js مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_21" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	يقبل التابع <code>sleep()‎</code> قيمةً تحدد وقت الانتظار بالميلي ثانية ويعيد وعدًا يُؤكَّد في نهاية ذلك الوقت وتُنفَّذ الشيفرة البرمجية الموجودة ضمن التابع <code>then()‎</code>، إذ نحصل في هذه الحالة على عنوان الصفحة الحالية باستخدام التابع <code>getTitle()‎</code> ثم نعيد رسالة نجاح أو فشل اعتمادًا على قيمة هذا العنوان.
</p>

<p>
	كما يمكننا إضافة التابع <code>sleep()‎</code> إلى اختبار الملف quick_test.js، لذا غلّف آخر سطر من الشيفرة البرمجية ضمن كتلة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_23" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  input</span><span class="pun">.</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'Filling in my form'</span><span class="pun">);</span><span class="pln">
  input</span><span class="pun">.</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">"value"</span><span class="pun">).</span><span class="pln">then</span><span class="pun">((</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">value </span><span class="pun">!==</span><span class="pln"> </span><span class="str">''</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Form input editable'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	ستنتظر واجهة WebDriver الآن لمدة ثانيتين قبل ملء حقل النموذج ثم نختبر مما فيما إذا كانت قيمته مملوءةً -أي ليست فارغةً- باستخدام التابع <code>getAttribute()‎</code> لاسترداد قيمة السمة <code>value</code> وطباعة رسالة في الطرفية إذا لم تكن فارغةً.
</p>

<p>
	<strong>ملاحظة</strong>: هناك تابع بالاسم <code>wait()‎</code> يختبر بطريقة تكرارية شرطًا لفترة زمنية معينة ثم ينفّذ الشيفرة البرمجية، إذ يستخدِم هذا التابع المكتبة <code>until</code> التي تحدِّد الشروط الشائعة للاستخدام مع التابع <code>wait()‎</code>.
</p>

<h3>
	إغلاق المشغلات بعد الانتهاء من استخدامها
</h3>

<p>
	يجب عليك إغلاق أيّ نسخ من المشغّلات التي فتحتها بعد الانتهاء من إجراء الاختبار للتأكد من عدم وجود الكثير من نسخ المتصفحات المفتوحة على جهازك من خلال استخدام التابع <code>quit()‎</code>.
</p>

<p>
	استدعِ هذا التابع على نسخة مشغّلك عند الانتهاء منه من خلال إضافة السطر التالي إلى الجزء السفلي من اختبار الملف quick_test.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_25" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">quit</span><span class="pun">();</span></pre>

<p>
	يجب أن ترى الآن عند تشغيله تنفيذَ الاختبار وإغلاق نسخة المتصفح مرةً أخرى بعد اكتمال الاختبار، ويُعَدّ ذلك مفيدًا لتقليل الفوضى في حاسوبك بسبب وجود الكثير من نسخ المتصفح خاصةً إذا كان لديك الكثير منها مما يتسبب في إبطاء الحاسوب.
</p>

<h2>
	أفضل ممارسات في عملية الاختبار
</h2>

<p>
	يجب أن تتأكد من أن اختباراتك تطبّق ما يلي:
</p>

<p>
	أولًا، تستخدِم استراتيجيات جيدة لتحديد المواقع: تأكّد عند التفاعل مع المستند من استخدام محدّدات المواقع وكائنات الصفحة التي لا يُحتمَل أن تتغير، فإذا كان لديك عنصر قابل للاختبار تريد إجراء اختبار عليه، فتأكد من أنه يملك معرّفًا مستقرًا أو موضعًا على الصفحة يمكن تحديده باستخدام محدّد CSS الذي لن يتغير مع تكرار الموقع التالي، إذ يجب أن تجعل اختباراتك مستقرةً قدر الإمكان، أي أنها لن تنهار عندما يتغير شيء ما.
</p>

<p>
	ثانيًا، تكتب اختبارات ذرية: يجب أن يختبر كل اختبار شيئًا واحدًا فقط، مما يسهل تعقّب ملف الاختبار الذي يختبر معيارًا معينًا، ويُعَدّ اختبار الملف google_test.js الذي ناقشناه سابقًا مثالًا جيدًا لأنه يختبر شيئًا واحدًا فقط، إذ يختبر ما إذا كان عنوان صفحة نتائج البحث مضبوطًا بصورة صحيحة، كما يمكننا إعطاء هذا الملف اسمًا أفضل حتى يسهل معرفة ما يفعله إذا أضفنا اختبارات جوجل أخرى مثل الاسم results_page_title_set_correctly.js.
</p>

<p>
	ثالثًا، تكتب اختبارات مستقلة: يجب أن يعمل كل اختبار بمفرده دون الاعتماد على اختبارات أخرى للعمل.
</p>

<p>
	كما يجب أن نذكر نتائج أو تقرير الاختبار، إذ أصدرنا تقريرًا بالنتائج في الأمثلة السابقة باستخدام تعليمات <code>console.log()‎</code> البسيطة، ولكن يحدث كل ذلك في شيفرة جافاسكربت، لذا يمكنك استخدام أيّ نظام اختبار تريده لتشغيل الاختبار وإعداد التقارير سواءً كان <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A7%D9%84%D8%A2%D9%84%D9%8A-%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-mocha-r794/" rel="">Mocha</a> أو Chai أو أيّ أداة أخرى.
</p>

<p>
	أولًا، أنشئ مثلًا نسخةً محليةً من المثال <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/selenium/mocha_test.js" rel="external nofollow"><code>mocha_test.js</code></a> ضمن مجلد مشروعك، ثم ضع هذا الملف ضمن مجلد فرعي بالاسم <code>test</code>، إذ يستخدِم هذا المثال سلسلةً طويلةً من الوعود لتنفيذ جميع الخطوات المطلوبة في اختبارنا، حيث يجب تأكيد التوابع المستندة إلى الوعود التي تستخدمها WebDriver حتى تعمل بطريقة صحيحة.
</p>

<p>
	ثانيًا، ثبّت أداة الاختبار Mocha عبر تشغيل الأمر التالي ضمن مجلد مشروعك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_27" style=""><span class="pln">npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev mocha</span></pre>

<p>
	يمكنك الآن تشغيل الاختبار وأيّ اختبارات أخرى تضعها ضمن مجلد test باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_29" style=""><span class="pln">npx mocha </span><span class="pun">--</span><span class="pln">no</span><span class="pun">-</span><span class="pln">timeouts</span></pre>

<p>
	يجب عليك تضمين الراية <code>‎--no-timeouts</code> للتأكد من عدم فشل اختباراتك بسبب مهلة Mocha التي هي 3 ثوان.
</p>

<h2>
	إجراء الاختبارات عن بعد
</h2>

<p>
	اتضح أنّ إجراء الاختبارات على الخوادم البعيدة ليس أصعب من تشغيلها محليًا، إذ يجب فقط إنشاء نسخة من مشغّلك مع تحديد عدد من الميزات الإضافية بما في ذلك إمكانات المتصفح الذي تريد تطبيق الاختبار عليه وعنوان الخادم وبيانات ثبوتيات المستخدِم التي تحتاجها -إذا وجِدت- للوصول إليه.
</p>

<h3>
	LambdaTest
</h3>

<p>
	يُعَدّ إجراء اختبارات Selenium عن بُعد على نظام LambdaTest أمرًا بسيطًا، ويجب أن تتّبع الشيفرة البرمجية التي تحتاجها النمطَ الآتي.
</p>

<p>
	إذًا لنكتب مثالًا يوضّح إجراء اختبارات Selenium عن بُعد على نظام LambdaTest:
</p>

<p>
	أولًا، أنشئ ملفًا جديدًا بالاسم lambdatest-google_test.js ضمن مجلد المشروع.
</p>

<p>
	ثانيًا، ضع فيه المحتويات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_31" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span><span class="pln">

</span><span class="com">// username: يمكن العثور على اسم المستخدِم في لوحة تحكم الأتمتة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> USERNAME </span><span class="pun">=</span><span class="pln"> </span><span class="str">'{username}'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// AccessKey: يمكن توليد مفتاح الوصول من لوحة تحكم الأتمتة أو قسم الملف الشخصي</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> KEY </span><span class="pun">=</span><span class="pln"> </span><span class="str">'{accessKey}'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// gridUrl: يمكن العثور عليه في لوحة تحكم الأتمتة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> GRID_HOST </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hub.lambdatest.com/wd/hub'</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> searchTextOnGoogle</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// إعداد إمكانات الإدخال</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> capabilities </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       platform</span><span class="pun">:</span><span class="pln"> </span><span class="str">'windows 10'</span><span class="pun">,</span><span class="pln">
       browserName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'chrome'</span><span class="pun">,</span><span class="pln">
       version</span><span class="pun">:</span><span class="pln"> </span><span class="str">'67.0'</span><span class="pun">,</span><span class="pln">
       resolution</span><span class="pun">:</span><span class="pln"> </span><span class="str">'1280x800'</span><span class="pun">,</span><span class="pln">
       network</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
       visual</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
       console</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
       video</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
       name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Test 1'</span><span class="pun">,</span><span class="pln"> </span><span class="com">// اسم الاختبار</span><span class="pln">
       build</span><span class="pun">:</span><span class="pln"> </span><span class="str">'NodeJS build'</span><span class="pln"> </span><span class="com">// اسم البناء</span><span class="pln">
     </span><span class="pun">};</span><span class="pln">

</span><span class="com">// URL: https://{username}:{accessToken}@hub.lambdatest.com/wd/hub</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> gridUrl </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">https</span><span class="pun">:</span><span class="com">//${USERNAME}:${KEY}@${GRID_HOST}`;</span><span class="pln">

</span><span class="com">// إعداد وبناء كائن مشغّل‫ selenium</span><span class="pln">
 </span><span class="kwd">const</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">usingServer</span><span class="pun">(</span><span class="pln">gridUrl</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">withCapabilities</span><span class="pun">(</span><span class="pln">capabilities</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

</span><span class="com">// ‫انتقل إلى عنوان url، وابحث عن نص واحصل على عنوان الصفحة</span><span class="pln">
driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'https://www.google.com/ncr'</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="pln">webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'LambdaTest\n'</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
         driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
               setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                 console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">title</span><span class="pun">);</span><span class="pln">
                 driver</span><span class="pun">.</span><span class="pln">quit</span><span class="pun">();</span><span class="pln">
                 </span><span class="pun">},</span><span class="pln"> </span><span class="lit">5000</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">});</span><span class="pln">
         </span><span class="pun">});</span><span class="pln">
      </span><span class="pun">});</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

searchTextOnGoogle</span><span class="pun">();</span></pre>

<p>
	ثالثًا، انتقل إلى لوحة تحكم أتمتة LambdaTest لجلب اسم مستخدِم LambdaTest ومفتاح الوصول من خلال النقر على رمز المفتاح في أعلى اليمين، حيث سترى اسم المستخدِم Username ومفاتيح الوصول Access Keys، واستبدل العناصر البديلة <code>{username}</code> و <code>{accessKey}</code> في شيفرتك باسم المستخدِم وقيم مفتاح الوصول الفعلية وتأكّد من الحفاظ عليها آمنةً.
</p>

<p>
	رابعًا، شغّل الأمر التالي في طرفيتك لتنفيذ اختبارك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_33" style=""><span class="pln">node lambdatest_google_test</span></pre>

<p>
	سيُرسَل الاختبار إلى LambdaTest وسيظهر خرج الاختبار على طرفية LambdaTest، فإذا أردتَ استخراج هذه النتائج لإصدار التقارير من منصة LambdaTest، فيمكنك ذلك باستخدام واجهة برمجة تطبيقات LambdaTest.
</p>

<p>
	إذا ذهبتَ الآن إلى لوحة تحكم أتمتة LambdaTest، فسترى اختبارك موجودًا هناك حيث ستتمكن من مشاهدة مقاطع الفيديو ولقطات الشاشة وغيرها من البيانات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="126964" href="https://academy.hsoub.com/uploads/monthly_2023_05/01_automation-logs-1.jpg.532b300a1b3222fc032c4b7eb7d188ca.jpg" rel=""><img alt="01_automation-logs-1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="126964" data-unique="zg7c9q8iu" src="https://academy.hsoub.com/uploads/monthly_2023_05/01_automation-logs-1.thumb.jpg.d9e751d92d7661f7a371cf0840a5c3be.jpg"> </a>
</p>

<p>
	يمكنك استرداد سجلات الشبكة والأوامر والاستثناءات و Selenium لكل اختبار في عملية بناء اختبارك، وستجد تسجيل فيديو لتنفيذ سكربت Selenium.
</p>

<p>
	<strong>ملاحظة</strong>: سيوفر زر "المساعدة HELP" الموجود في لوحة تحكم أتمتة LambdaTest كميةً وافرةً من المعلومات لمساعدتك في بدء تشغيل اختبار LambdaTest الآلي.
</p>

<p>
	<strong>ملاحظة</strong>: إذا لم ترغب في كتابة كائنات الإمكانات لاختباراتك يدويًا، فيمكنك إنشاؤها باستخدام <a href="https://www.lambdatest.com/capabilities-generator/" rel="external nofollow">منشئ إمكانات Selenium</a>.
</p>

<h4>
	ملء تفاصيل الاختبار على LambdaTest برمجيا
</h4>

<p>
	يسهّل تمييز حالة الاختبارات الآلية المتعددة على أنها نجحت أو فشلت الأمورَ كثيرًا عند تنفيذها.
</p>

<p>
	أولًا، استخدِم الأمر التالي لتمييز الحالة على أنها ناجحة في LambdaTest:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_35" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">executeScript</span><span class="pun">(</span><span class="str">"lambda-status=passed"</span><span class="pun">);</span></pre>

<p>
	ثانيًا، استخدِم الأمر التالي لتمييز الحالة على أنها فاشلة في LambdaTest:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_37" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">executeScript</span><span class="pun">(</span><span class="str">"lambda-status=failed"</span><span class="pun">);</span></pre>

<h3>
	BrowserStack
</h3>

<p>
	يُعَدّ إجراء اختبارات Selenium للتشغيل عن بُعد على BrowserStack أمرًا سهلًا، إذ يجب أن تتبع الشيفرة البرمجية التي تحتاجها النمطَ الآتي.
</p>

<p>
	لنكتب إذًا مثالًا يوضّح إجراء اختبارات Selenium للتشغيل عن بُعد على BrowserStack:
</p>

<p>
	أولًا، أنشئ ملفًا جديدًا بالاسم bstack_google_test.js ضمن مجلد المشروع.
</p>

<p>
	ثانيًا، ضع فيه المحتويات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_39" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span><span class="pln">

</span><span class="com">// إمكانات الإدخال</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> capabilities </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   </span><span class="str">'browserName'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'Firefox'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'browser_version'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'56.0 beta'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'os'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'OS X'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'os_version'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'Sierra'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'resolution'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'1280x1024'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'browserstack.user'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'YOUR-USER-NAME'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'browserstack.key'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'YOUR-ACCESS-KEY'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'browserstack.debug'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'true'</span><span class="pun">,</span><span class="pln">
   </span><span class="str">'build'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'First build'</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">usingServer</span><span class="pun">(</span><span class="str">'http://hub-cloud.browserstack.com/wd/hub'</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">withCapabilities</span><span class="pun">(</span><span class="pln">capabilities</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'http://www.google.com'</span><span class="pun">);</span><span class="pln">
driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'webdriver'</span><span class="pun">);</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="pln">webdriver</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">.</span><span class="pln">TAB</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'btnK'</span><span class="pun">)).</span><span class="pln">click</span><span class="pun">();</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">quit</span><span class="pun">();</span></pre>

<p>
	ثالثًا، انتقل إلى لوحة تحكم أتمتة BrowserStack للحصول اسم مستخدِم ومفتاح الوصول، واستبدل العناصر البديلة <code>YOUR-USER-NAME</code> و <code>YOUR-ACCESS-KEY</code> في شيفرتك باسم المستخدِم وقيم مفتاح الوصول الفعلية وتأكّد من الحفاظ عليها آمنة.
</p>

<p>
	رابعًا، شغّل اختبارك باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_41" style=""><span class="pln">node bstack_google_test</span></pre>

<p>
	سيُرسَل الاختبار إلى BrowserStack وستُعاد نتيجة الاختبار إلى طرفيتك، ويدل ذلك على أهمية تضمين آلية لإعطاء تقارير بالنتائج.
</p>

<p>
	أخيرًا، إذا عدت الآن إلى صفحة لوحة تحكم أتمتة BrowserStack، فسترى اختبارك موجودًا هناك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126962" href="https://academy.hsoub.com/uploads/monthly_2023_05/02_bstack_automated_results.png.f49e943b36ff3e6e7a1cffeb9009ca6c.png" rel=""><img alt="02_bstack_automated_results.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126962" data-unique="vkgbez0yi" src="https://academy.hsoub.com/uploads/monthly_2023_05/02_bstack_automated_results.png.f49e943b36ff3e6e7a1cffeb9009ca6c.png"> </a>
</p>

<p>
	إذا نقرتَ على رابط اختبارك، فستنتقل إلى شاشة جديدة حيث ستتمكن من مشاهدة تسجيل فيديو للاختبار وسجلات تفصيلية متعددة للمعلومات المتعلقة به.
</p>

<p>
	<strong>ملاحظة</strong>: يحتوي خيار قائمة الموارد Resources في لوحة تحكم أتمتة Browserstack على مجموعة كبيرة من المعلومات المفيدة حول استخدامه لإجراء الاختبارات الآلية.
</p>

<p>
	<strong>ملاحظة</strong>: إذا لم ترغب في كتابة كائنات الإمكانات لاختباراتك يدويًا، فيمكنك إنشاؤها باستخدام <a href="https://www.lambdatest.com/capabilities-generator/" rel="external nofollow">منشئ إمكانات Selenium</a>.
</p>

<h4>
	ملء تفاصيل اختبار BrowserStack برمجيا
</h4>

<p>
	يمكنك استخدام واجهة BrowserStack REST <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> وبعض الإمكانات الأخرى للتعليق على اختبارك بمزيد من التفاصيل مثل إذا نجح الاختبار وسبب نجاحه وما هو المشروع الذي يكون الاختبار جزءًا منه وغير ذلك، إذ لا يعرف BrowserStack هذه التفاصيل افتراضيًا.
</p>

<p>
	لنعدّل <code>bstack_google_test.js</code> لإظهار كيفية عمل هذه الميزات:
</p>

<p>
	يجب أولًا استيراد وحدة طلب Node لنتمكّن من استخدامها لإرسال الطلبات إلى واجهة REST <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>، لذا أضِف السطر التالي في بداية شيفرتك البرمجية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_43" style=""><span class="kwd">const</span><span class="pln"> request </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">"request"</span><span class="pun">);</span></pre>

<p>
	سنعدّل الآن الكائن <code>capabilities</code> لتضمين اسم المشروع من خلال إضافة السطر التالي قبل قوس الإغلاق المعقوص، ولاتنسى إضافة فاصلة في نهاية السطر السابق، كما يمكنك تغيير أسماء البناء والمشروع لتنظيم الاختبارات في نوافذ مختلفة من لوحة تحكم أتمتة BrowserStack كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_45" style=""><span class="str">'project'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'Google test 2'</span></pre>

<p>
	يجب بعد ذلك الوصول إلى المعرّف <code>sessionId</code> للجلسة الحالية لنعرف مكان إرسال الطلب، حيث يُضمَّن المعرّف في عنوان URL الخاص بالطلب كما سنرى لاحقًا. ضمّن الأسطر التالية بعد الكتلة التي تنشئ الكائن <code>driver</code> (أي <code>let driver ...‎</code><span class="ipsEmoji">?</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_47" style=""><span class="kwd">let</span><span class="pln"> sessionId</span><span class="pun">;</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">session_</span><span class="pun">.</span><span class="pln">then</span><span class="pun">((</span><span class="pln">sessionData</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;{</span><span class="pln">
  sessionId </span><span class="pun">=</span><span class="pln"> sessionData</span><span class="pun">.</span><span class="pln">id_</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	أخيرًا، عدّل الكتلة <code>driver.sleep(2000) ...‎</code> بالقرب من أسفل شيفرتك لإضافة استدعاءات واجهة <a href="https://academy.hsoub.com/questions/17723-%D8%B4%D8%B1%D8%AD-rest-api/" rel="">REST <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>، ولا تنسى استبدال العناصر البديلة <code>YOUR-USER-NAME</code> و <code>YOUR-ACCESS-KEY</code> في شيفرتك البرمجية باسم المستخدِم وقيم مفتاح الوصول الفعلية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_49" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
      request</span><span class="pun">({</span><span class="pln">
         uri</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="pln">https</span><span class="pun">:</span><span class="com">//YOUR-USER-NAME:YOUR-ACCESS-KEY@www.browserstack.com/automate/sessions/${sessionId}.json`, </span><span class="pln">
         method</span><span class="pun">:</span><span class="str">"PUT"</span><span class="pun">,</span><span class="pln"> 
         form</span><span class="pun">:{</span><span class="str">"status"</span><span class="pun">:</span><span class="str">"passed"</span><span class="pun">,</span><span class="str">"reason"</span><span class="pun">:</span><span class="str">"Google results showed correct title"</span><span class="pun">}}</span><span class="pln">
      </span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
      request</span><span class="pun">({</span><span class="pln">
         uri</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="pln">https</span><span class="pun">:</span><span class="com">//YOUR-USER-NAME:YOUR-ACCESS-KEY@www.browserstack.com/automate/sessions/${sessionId}.json`, </span><span class="pln">
         method</span><span class="pun">:</span><span class="str">"PUT"</span><span class="pun">,</span><span class="pln"> 
         form</span><span class="pun">:{</span><span class="str">"status"</span><span class="pun">:</span><span class="str">"failed"</span><span class="pun">,</span><span class="str">"reason"</span><span class="pun">:</span><span class="str">"Google results showed wrong title"</span><span class="pun">}}</span><span class="pln">
      </span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	سنرسل استدعاء واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> إلى BrowserStack بعد اكتمال الاختبار لتحديثه بحالة النجاح أو الفشل وبسبب النتيجة.
</p>

<p>
	إذا عُدتَ الآن إلى صفحة لوحة تحكم أتمتة BrowserStack، فيجب أن ترى جلسة اختبارك متاحةً كما كانت سابقًا ولكن مع البيانات المحدَّثة المرفقة بها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126965" href="https://academy.hsoub.com/uploads/monthly_2023_05/03_bstack_custom_results.png.4dcb7fee793887e542aff34cef5c7c47.png" rel=""><img alt="03_bstack_custom_results.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126965" data-unique="evonritqm" src="https://academy.hsoub.com/uploads/monthly_2023_05/03_bstack_custom_results.png.4dcb7fee793887e542aff34cef5c7c47.png"> </a>
</p>

<h3>
	Sauce Labs
</h3>

<p>
	يُعَدّ إجراء اختبارات Selenium للتشغيل عن بُعد في Sauce Labs أمرًا بسيطًا، ويشبه إلى حد كبير اختبار BrowserStack مع بعض الاختلافات الصياغية، كما يجب أن تتّبع الشيفرة البرمجية التي تحتاجها النمط الآتي.
</p>

<p>
	لنكتب إذًا مثالًا يوضّح إجراء اختبارات Selenium للتشغيل عن بُعد على Sauce Labs:
</p>

<p>
	أولًا، أنشئ ملفًا جديدًا بالاسم sauce_google_test.js ضمن مجلد مشروعك.
</p>

<p>
	ثانيًا، ضع فيه المحتويات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_51" style=""><span class="kwd">const</span><span class="pln"> webdriver </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'selenium-webdriver'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">By</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">By</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> until </span><span class="pun">=</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="pln">until</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> username </span><span class="pun">=</span><span class="pln"> </span><span class="str">"YOUR-USER-NAME"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> accessKey </span><span class="pun">=</span><span class="pln"> </span><span class="str">"YOUR-ACCESS-KEY"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">withCapabilities</span><span class="pun">({</span><span class="pln">
      </span><span class="str">'browserName'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'chrome'</span><span class="pun">,</span><span class="pln">
      </span><span class="str">'platform'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Windows XP'</span><span class="pun">,</span><span class="pln">
      </span><span class="str">'version'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'43.0'</span><span class="pun">,</span><span class="pln">
      </span><span class="str">'username'</span><span class="pun">:</span><span class="pln"> username</span><span class="pun">,</span><span class="pln">
      </span><span class="str">'accessKey'</span><span class="pun">:</span><span class="pln"> accessKey
    </span><span class="pun">})</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">usingServer</span><span class="pun">(`</span><span class="pln">https</span><span class="pun">:</span><span class="com">//${username}:${accessKey}@ondemand.saucelabs.com:443/wd/hub`)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span><span class="pln">

driver</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'http://www.google.com'</span><span class="pun">);</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="str">'webdriver'</span><span class="pun">);</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'q'</span><span class="pun">)).</span><span class="pln">sendKeys</span><span class="pun">(</span><span class="pln">webdriver</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">.</span><span class="pln">TAB</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">findElement</span><span class="pun">(</span><span class="typ">By</span><span class="pun">.</span><span class="pln">name</span><span class="pun">(</span><span class="str">'btnK'</span><span class="pun">)).</span><span class="pln">click</span><span class="pun">();</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

driver</span><span class="pun">.</span><span class="pln">quit</span><span class="pun">();</span></pre>

<p>
	ثالثًا، انتقل إلى إعدادات مستخدِم Sauce Labs للحصول اسم المستخدِم ومفتاح الوصول، واستبدل العناصر البديلة <code>YOUR-USER-NAME</code> و <code>YOUR-ACCESS-KEY</code> في شيفرتك باسم المستخدِم وقيم مفتاح الوصول الفعلية وتأكّد من الحفاظ عليها آمنة.
</p>

<p>
	رابعًا، شغّل اختبارك باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_53" style=""><span class="pln">node sauce_google_test</span></pre>

<p>
	سيُرسَل الاختبار إلى Sauce Labs وستُعاد نتيجة الاختبار إلى طرفيتك، إذ يدل ذلك على أهمية تضمين آلية لإعطاء تقارير بالنتائج.
</p>

<p>
	أخيرًا، إذا انتقلت الآن إلى صفحة لوحة تحكم أتمتة Sauce Labs، فسترى اختبارك موجودًا هناك حيث ستتمكّن من مشاهدة مقاطع الفيديو ولقطات الشاشة وغيرها من البيانات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126961" href="https://academy.hsoub.com/uploads/monthly_2023_05/04_sauce_labs_automated_test.png.449a4a70bc4f91fa78d516565a3bb519.png" rel=""><img alt="04_sauce_labs_automated_test.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126961" data-unique="jtl5kzogs" src="https://academy.hsoub.com/uploads/monthly_2023_05/04_sauce_labs_automated_test.thumb.png.d155718666b441b58e3a1ec7a647f212.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: تُعَدّ أداة إعداد منصة Sauce Labs أداةً مفيدةً لإنشاء كائنات الإمكانات لتقديمها إلى نسخ المشغّلات بناءً على المتصفح/نظام التشغيل الذي تريد الاختبار عليه.
</p>

<h4>
	ملء تفاصيل اختبار Sauce Labs برمجيا
</h4>

<p>
	يمكنك استخدام Sauce Labs <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> للتعليق على اختبارك بمزيد من التفاصيل مثل نجاح الاختبار واسم الاختبار وغير ذلك، إذ لا يعرف Sauce Labs هذه التفاصيل افتراضيًا.
</p>

<p>
	يمكن تطبيق ذلك كما يلي:
</p>

<p>
	أولًا، ثبّت المغلّف Node Sauce Labs باستخدام الأمر التالي (إذا لم تفعل ذلك مسبقًا في هذا المشروع):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_55" style=""><span class="pln">npm install saucelabs </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev</span></pre>

<p>
	ثانيًا، اطلب <code>saucelabs</code> في أعلى الملف sauce_google_test.js بعد التصريح عن المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_57" style=""><span class="kwd">const</span><span class="pln"> </span><span class="typ">SauceLabs</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'saucelabs'</span><span class="pun">);</span></pre>

<p>
	ثالثًا، أنشئ نسخةً جديدةً من SauceLabs من خلال إضافة ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_59" style=""><span class="kwd">let</span><span class="pln"> saucelabs </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SauceLabs</span><span class="pun">({</span><span class="pln">
    username </span><span class="pun">:</span><span class="pln"> </span><span class="str">"YOUR-USER-NAME"</span><span class="pun">,</span><span class="pln">
    password </span><span class="pun">:</span><span class="pln"> </span><span class="str">"YOUR-ACCESS-KEY"</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	لا تنسى استبدال العناصر البديلة <code>YOUR-USER-NAME</code> و <code>YOUR-ACCESS-KEY</code> في شيفرتك باسم المستخدِم وقيم مفتاح الوصول الفعلية، ولاحظ أنّ حزمة saucelabs npm تستخدِم كلمة المرور <code>password</code> وليس مفتاح الوصول <code>accessKey</code>، وبما أنك تستخدِم هاتين القيمتين، فيمكن أن ترغب في إنشاء متغيرين مساعدَين لتخزينهما فيهما.
</p>

<p>
	رابعًا، أضِف الكتلة التالية بعد كتلة تعريف المتغير <code>driver</code> بعد سطر <code>build()‎</code> مباشرةً، حيث تحصل هذه الكتلة على معرّف جلسة <code>sessionID</code> المشغّل الصحيح الذي نحتاجه لكتابة البيانات في الوظيفة، حيث يمكنك رؤية هذا المعرّف قيد التشغيل في كتلة الشيفرة البرمجية التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_61" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">getSession</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">sessionid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      driver</span><span class="pun">.</span><span class="pln">sessionID </span><span class="pun">=</span><span class="pln"> sessionid</span><span class="pun">.</span><span class="pln">id_</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	أخيرًا، استبدل الكتلة <code>driver.sleep(2000) ...‎</code> الموجودة في أسفل الشيفرة البرمجية بما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_63" style=""><span class="pln">driver</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{.</span><span class="pln">then</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  driver</span><span class="pun">.</span><span class="pln">getTitle</span><span class="pun">().</span><span class="pln">then</span><span class="pun">((</span><span class="pln">title</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">let</span><span class="pln"> testPassed </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">title </span><span class="pun">===</span><span class="pln"> </span><span class="str">'webdriver - Google Search'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test passed'</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">let</span><span class="pln"> testPassed </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Test failed'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    saucelabs</span><span class="pun">.</span><span class="pln">updateJob</span><span class="pun">(</span><span class="pln">driver</span><span class="pun">.</span><span class="pln">sessionID</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Google search results page title test'</span><span class="pun">,</span><span class="pln">
      passed</span><span class="pun">:</span><span class="pln"> testPassed
    </span><span class="pun">});</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	ضبطنا هنا المتغير <code>testPassed</code> على القيمة <code>true</code> أو <code>false</code> اعتمادًا على نجاح الاختبار أو فشله، ثم استخدمنا التابع <code>saucelabs.updateJob()‎</code> لتحديث التفاصيل.
</p>

<p>
	إذا عُدتَ الآن إلى صفحة لوحة تحكم أتمتة Sauce Labs، فسترى أن وظيفتك الجديدة تحتوي الآن على البيانات المُحدَّثة المرفقة بها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126963" href="https://academy.hsoub.com/uploads/monthly_2023_05/05_sauce_labs_updated_job_info.png.2c18fa10558211f1f033d0715b7a89ff.png" rel=""><img alt="05_sauce_labs_updated_job_info.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126963" data-unique="0l2h348ek" src="https://academy.hsoub.com/uploads/monthly_2023_05/05_sauce_labs_updated_job_info.thumb.png.48042ed9b8730f933b7a4924c50696d9.png"> </a>
</p>

<h3>
	خادمك البعيد
</h3>

<p>
	إذا لم ترغب في استخدام خدمة مثل Sauce Labs أو BrowserStack، فيمكنك دائمًا إعداد خادمك للاختبار عن بُعد كما يلي:
</p>

<p>
	أولًا، يتطلب خادم Selenium البعيد تشغيل شيفرة جافا، لذا يجب عليك تنزيل أحدث إصدار من JDK لمنصتك من صفحة تنزيلات Java SE، ثم ثبّته بعد تنزيله.
</p>

<p>
	ثانيًا، نزّل خادم Selenium المستقل الأحدث الذي يعمل بوصفه وكيلًا proxy بين السكربت ومشغّلات المتصفح، ثم اختر أحدث رقم إصدار مستقر -أي ليس إصدارًا تجريبيًا beta- واختر من القائمة ملفًا يبدأ بعبارة "selenium-server-standalone"، ثم ضعه في مكان يمكنك الوصول إليه بسهولة بعد تنزيله مثل مجلدك الرئيسي، كما يجب إضافة الموقع إلى المتغير <code>PATH</code> إذا لم تفعل ذلك بعد.
</p>

<p>
	ثالثًا، شغّل الخادم المستقل من خلال إدخال ما يلي في طرفية حاسوب خادمك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_65" style=""><span class="pln">java </span><span class="pun">-</span><span class="pln">jar selenium</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">standalone</span><span class="pun">-</span><span class="lit">3.0</span><span class="pun">.</span><span class="lit">0.jar</span></pre>

<p>
	عدّل اسم الملف <code>‎.jar</code> بحيث يتطابق تمامًا مع ملفك.
</p>

<p>
	رابعًا، سيعمل الخادم على <code><a href="http://localhost:4444/wd/hub" ipsnoembed="false" rel="external nofollow">http://localhost:4444/wd/hub</a></code>، لذا انتقل إلى هناك الآن لترى ما ستحصل عليه.
</p>

<p>
	لدينا الآن الخادم قيد التشغيل، فلننشئ اختبارًا تجريبيًا يعمل على خادم Selenium البعيد:
</p>

<ol>
	<li>
		أنشئ نسخةً من الملف google_test.js بالاسم google_test_remote.js وضعه في مجلد مشروعك.
	</li>
	<li>
		عدّل كتلة الشيفرة البرمجية الثانية التي تبدأ بالسطر <code>let driver = ...‎</code> كما يلي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_67" style=""><span class="kwd">let</span><span class="pln"> driver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> webdriver</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">forBrowser</span><span class="pun">(</span><span class="str">'firefox'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">usingServer</span><span class="pun">(</span><span class="str">'http://localhost:4444/wd/hub'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>

<ol start="3">
	<li>
		شغّل اختبارك وسترى أنه يعمل بالشكل المتوقع، ولكنه سيعمل هذه المرة على الخادم المستقل:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1318_69" style=""><span class="pln">node google_test_remote</span><span class="pun">.</span><span class="pln">js</span></pre>

<p>
	أجرينا الاختبار محليًا، ولكن يمكنك إعداده على أيّ خادم تقريبًا مع مشغّلات المتصفح ذات الصلة، ثم اربطه مع سكربتاتك باستخدام عنوان URL الذي تختاره للوصول إليه.
</p>

<h2>
	دمج Selenium مع أدوات CI
</h2>

<p>
	يمكن دمج Selenium والأدوات المتعلقة به مثل LambdaTest و Sauce Labs مع أدوات <a href="https://academy.hsoub.com/devops/deployment/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AA%D9%83%D8%A7%D9%85%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%85%D8%B1-%D9%88%D8%A7%D9%84%D9%86%D8%B4%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%85%D8%B1-cicd-r644/" rel="">التكامل المستمر Continuous Integration</a> أو CI اختصارًا، إذ يُعَدّ ذلك مفيدًا لأنه يعني أنه يمكنك إجراء اختباراتك عبر أداة CI وإجراء تغييرات جديدة في مستودع شيفرتك البرمجية فقط إذا نجحت الاختبارات.
</p>

<p>
	نقترح عليك البدء باستخدام أداة Travis CI التي تُعَدّ أسهل أداة CI للبدء بها ولديها تكامل جيد مع أدوات الويب مثل GitHub و Node.
</p>

<p>
	<strong>ملاحظة</strong>: إذا أردتَ إجراء اختبار مستمر باستخدام اختبار آلي بدون شيفرة برمجية، فيمكنك استخدام أداة Endtest أو TestingBot.
</p>

<p>
	يجب أن يمنحك هذا المقال نظرةً كافيةً لكتابة وتشغيل الاختبارات الآلية لتبدأ في كتابة اختباراتك الآلية الخاصة.
</p>

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Your_own_automation_environment" rel="external nofollow">Setting up your own test automation environment</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%A2%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1989/" rel="">مدخل إلى اختبارات مشاريع الويب الآلية للتوافق مع المتصفحات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">مدخل إلى اختبار مشاريع الويب للتوافق مع المتصفحات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1954/" rel="">استراتيجيات اختبارات مشاريع الويب للتوافق مع المتصفحات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1972/" rel="">معالجة المشاكل الشائعة للتوافق مع المتصفحات في شيفرة جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1990</guid><pubDate>Tue, 30 May 2023 16:09:01 +0000</pubDate></item><item><title>&#x643;&#x644; &#x645;&#x627; &#x62A;&#x648;&#x62F; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647; &#x639;&#x646; &#x628;&#x631;&#x645;&#x62C;&#x629; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x633;&#x637;&#x62D; &#x627;&#x644;&#x645;&#x643;&#x62A;&#x628;</title><link>https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/---.png.07c49981c28fa9f420f061cb7afd8d19.png" /></p>
<p>
	سنتعرف في مقال اليوم على تخصص برمجة تطبيقات سطح المكتب بالتفصيل وهو أحد تخصصات البرمجة المطلوبة في سوق العمل والذي يمكنك من تطوير تطبيقات للحاسوب سريعة وعالية الأداء بعد أن تعرفنا في المقال السابق <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">دليلك الشامل إلى برمجة التطبيقات</a> على التطبيقات وأنواعها المختلفة وطرق برمجتها.
</p>

<p>
	وسنستكشف أيضًا كافة أنواع تطبيقات سطح المكتب والفرق بين تطبيقات سطح المكتب وتطبيقات الويب ونستعرض في الختام أهم الخطوات التي ينبغي اتباعها لتعلم برمجة هذا النوع من التطبيقات وأهم لغات البرمجة وأطر العمل المستخدمة في تطويرها.
</p>

<h2>
	ما هي تطبيقات سطح المكتب؟
</h2>

<p>
	تطبيقات سطح المكتب هي تطبيقات مستقلة بذاتها مصممة للعمل على أجهزة الحاسوب المكتبية والحواسيب المحمولة التي تعمل عادة بأنظمة تشغيل ويندوز أو لينكس أو ماك.
</p>

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

<p>
	يمكن لتطبيقات سطح المكتب أداء مهام متنوعة مثل تحرير الصور أو معالجة النصوص أو تشغيل الوسائط أو اللعب ومن أشهر الأمثلة على تطبيقات سطح المكتب <a href="https://academy.hsoub.com/apps/operating-systems/windows/%D9%85%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-explorer-%D9%81%D9%8A-11-windows-r722/" rel="">مستكشف ملفات ويندوز</a> وتطبيقات مايكروسوفت أوفيس وتطبيقات تصفح الإنترنت مثل متصفح كروم ومتصفح فايرفوكس وتطبيقات تحرير الصور مثل أدوبي فوتوشوب وتطبيقات تشغيل الوسائط مثل Windows Media Player ومشغل الفيديو والوسائط VLC …إلخ.
</p>

<h2>
	أهمية تطبيقات سطح المكتب
</h2>

<p>
	بعد <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">ظهور الإنترنت</a> وشيوع استخدام الهواتف الذكية واللوحية تراجع استخدام أجهزة الحواسيب المكتبية وزادت شعبية برمجة تطبيقات الويب وتطبيقات الهاتف المحمول مقارنة ببرمجة تطبيقات سطح المكتب، لكن هذا لا ينفي أن الحواسيب المكتبية لازالت تستخدم بكثرة على الصعيد التجاري والشخصي وبالتالي لا يزال الطلب على تطبيقات سطح المكتب في سوق العمل قائمًا لاسيما أن هذه التطبيقات تنفرد بجملة من الفوائد قد لا تتوافر في أنواع التطبيقات الأخرى.
</p>

<p>
	وهناك العديد من المجالات التي يفضل المستخدمون فيها تطبيقات سطح المكتب المحلية على أنواع التطبيقات الأخرى ومن أهمها:
</p>

<ul>
	<li>
		المجالات التي تتطلب عرض رسومات عالية الدقة مثل تصميم الجرافيك وتحرير الفيديو وتطبيقات الهندسة المعمارية فهي تتطلب موارد عالية لتعمل بكفاءة وسرعة، لذا يفضل تطويرها كتطبيقات سطح المكتب لأنها ستكون أسرع بكثير من تطبيقات الويب مثلًا القائمة على المتصفح.
	</li>
	<li>
		الصناعات التي تتطلب وجود اتصال مباشر بين جهاز الحاسوب والأجهزة الإلكترونية لإجراء مراقبة أو ضبط إعدادات معينة لهذه الأجهزة.
	</li>
	<li>
		المجالات التي تتطلب التحكم الكامل في التطبيقات ففي هذه الحالة من الأفضل اللجوء لتطوير تطبيقات سطح المكتب بشكل محلي بدلًا من تشغيلها على <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">خادم بعيد</a> كي تتمكن من التحكم الكامل بالتطبيق وتقوم بتخصيصه وإدارته بالكامل.
	</li>
	<li>
		الأعمال التي تتطلب قدرًا من السرية والخصوصية وحماية المعلومات الشخصية من محاولات الاختراق، فبقاء التطبيق غير متصل بالإنترنت وتخزين كافة البيانات على جهازك يرفع من درجة أمان التطبيق ويحميه من المخترقين والمتطفلين.
	</li>
</ul>

<p>
	تعد تطبيقات سطح المكتب أكثر أمانًا وسرية كما أنها تتواصل مع الحاسوب وعتاده مباشرةً دون وسيط أي أنها تتخاطب بالطبع مع نظام التشغيل الذي يُشغِّل عتاد الحاسوب وهذا يمنع أي تأخير في التواصل على عكس تطبيقات الويب مثلًا التي تعمل ضمن المتصفح وهو في الأساس تطبيق سطح مكتب يتواصل بدوره مع نظام التشغيل ثم مع العتاد.
</p>

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

<h2>
	أنواع تطبيقات سطح المكتب
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126991" href="https://academy.hsoub.com/uploads/monthly_2023_05/---.png.7fab840d410b75c48d18ab71ff44e526.png" rel=""><img alt="برمجة تطبيقات سطح المكتب" class="ipsImage ipsImage_thumbnailed" data-fileid="126991" data-ratio="62.50" data-unique="i9wlgn0zk" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_05/---.thumb.png.9845da7376b07525401d70b0678dbdba.png"></a>
</p>

<p>
	كما شرحنا سابقًا فإن تطبيقات سطح المكتب بالأساس هي تطبيقات مستقلة بذاتها ويمكنها العمل على على أجهزة حاسوب محلية تعلم بأنظمة تشغيل معينة، وفي هذه الفقرة سنوضح الفرق بين نوعين من تطبيقات سطح المكتب.
</p>

<ol>
	<li>
		تطبيقات سطح المكتب الأصيلة Native Desktop Application
	</li>
	<li>
		تطبيقات سطح المكتب متعددة المنصات Cross-platform Desktop Application
	</li>
</ol>

<p>
	وإليك الفرق بين هذين النوعين ومميزاتهما وطريقة برمجة تطبيقات سطح المكتب لكل منهما.
</p>

<h3>
	1. تطبيقات سطح المكتب الأصيلة Native Desktop Application
</h3>

<p>
	تطبيقات سطح المكتب الأصيلة أو ما يعرف بتطبيقات سطح المكتب التقليدية أو الكلاسيكية هي تطبيقات تستخدم على نظام تشغيل أساسي أو جهاز معين مثل ويندوز أو ماك او إس أو لينكس وتتميز هذه التطبيقات بسرعة أدائها وإمكانية تضمينها لطيف واسع من الوظائف والميزات من خلال الاستفادة من قدرات الجهاز الأساسي الذي تعمل عليه.
</p>

<p>
	تحدد <a href="https://academy.hsoub.com/apps/operating-systems/" rel="">أنظمة التشغيل</a> كيفية تشغيل هذا النوع من التطبيقات حيث تحتاج بعض البرامج فقط إلى الأذونات الأساسية التي يسمح بها نظام التشغيل ويحتاج بعضها الآخر للحصول على المزيد من التحكم من خلال الامتيازات الإدارية للنظام، فقد لا تعمل التطبيقات التي تحتاج إلى إجراء تغييرات على الملفات الخاصة بنظام التشغيل أو تتطلب الوصول إلى المجلدات الآمنة بالشكل صحيح إذا لم يتم منحها الصلاحيات المطلوبة ولا تعطى بعض تلك الصلاحيات إلا من مدير النظام وليس من أي مستخدم عادي.
</p>

<p>
	يمكن أن تتطلب تطبيقات سطح المكتب الأصيلة كذلك توافر خصائص معينة في الجهاز أو وجود إصدارات معينة لأنظمة التشغيل يحددها المطورون عند برمجة تطبيقات سطح المكتب كي تعمل بشكل صحيح. على سبيل المثال تتطلب أحدث نسخة من تطبيق تحرير الفيديو الاحترافي أدوبي بريمر برو احتواء جهاز الحاسوب على ذاكرة وصول عشوائي RAM بسعة 8 جيجابايت على الأقل ووحدة معالجة رسومات GPU بسعة 2 جيجابايت ومعالج جيل سادس والإصدار ويندوز 10 بمعمارية 64 بت.
</p>

<p>
	تعتمد برمجة تطبيقات سطح المكتب المحلية بشكل أساسي على <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات برمجة عالية المستوى</a> مثل جافا وبايثون وروبي و C‎++‎ و C#‎ لكن أبرز عيوب تطوير التطبيقات المحلية هو أنك ستحتاج لكتابة شيفرات برمجية منفصلة لتطوير تطبيقات سطح المكتب مخصصة لكل نظام تشغيل.
</p>

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

<h3>
	2. تطبيقات سطح المكتب متعددة المنصات Cross-platform Desktop Application
</h3>

<p>
	تطبيقات سطح المكتب متعددة المنصات أو التطبيقات العابرة للأنظمة هي تطبيقات تُبرمَج مرة واحدة وتعمل على كافة أنظمة التشغيل خلافًا تطبيقات سطح المكتب الأصيلة المبرمجة للعمل على نظام أساسي واحد فقط، ويعمل هذا النوع من التطبيقات بكفاءة على الحواسيب الشخصية والمحمولة والأجهزة اللوحية على حد سواء حيث يُكتب الكود البرمجي لتطبيق سطح المكتب متعدد الأنظمة مرة واحدة فقط ويكون قادرًا على العمل على أنظمة التشغيل المختلفة.
</p>

<p>
	وميزة الشيفرة الواحدة التي تعمل على مختلف أنظمة التشغيل تأتي مع قيود تكثر أو تقل بحسب كيفية برمجتها والأدوات المستخدمة في برمجتها وتتصف أحيانًا بأداء أقل من التطبيقات الأصيلة ووصول أقل أو محدود إلى موارد الحاسوب مثل الكاميرا أو ماسح البصمة وقد تكون أقل أمانًا أيضًا لذا لن تجد مثلًا أي لعبة -وهي نوع من أنواع تطبيقات سطح المكتب- تستهلك موارد الحاسوب استهلاكًا كاملًا تُبرمَج بهذه الطريقة ولا التطبيقات ذات الأمان المرتفع مثل تطبيقات البنوك أو التطبيقات الحكومية وهكذا.
</p>

<p>
	تستفيد هذه التطبيقات من <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">تقنيات الويب</a> وهي لغة HTML و CSS وجافا سكريبت لتطوير هذا النوع التطبيقات مع أداة تعمل على تحويل الشيفرة لكي تعمل على نظام التشغيل مباشرة أو عبر وسيط مثل متصفح الويب.
</p>

<p>
	وتلجأ معظم الشركات اليوم للاستفادة من مميزات هذا النوع من التطبيقات لأنها أقل كلفة في التطوير والصيانة ولا تحتاج أغلبها إلى أداء مرتفع ووصول إلى كامل عتاد الحاسوب ومن أبرز الأمثلة على تطبيقات تم إنشاؤها باستخدام هذه التقنية نذكر تطبيق ووردبريس لسطح المكتب WordPress Desktop app الذي يمكنك من إدارة موقع ووردبريس الخاص بك مثل إضافة المنشورات وتحديث الإضافات والرد على التعليقات من حاسوبك المحلي دون فتح متصفحك، وتطبيق سلاك Slack لسطح المكتب وتطبيق واتساب الشهير لسطح المكتب …إلخ.
</p>

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

<h2>
	الفرق بين تطبيقات الويب وتطبيقات سطح المكتب
</h2>

<p>
	كما شرحنا سابقًا فإن تطبيق سطح المكتب هو برنامج يتم تثبيته باستخدام حزمة التثبيت ثم تشغيله على جهاز الحاسوب المحلي الخاص بك ويجب أن تتوافق مواصفات العتاد مثل حجم الذاكرة وسرعة المعالج ونظام التشغيل وإصداره مع المتطلبات الخاصة بالتطبيق كي يُثبت ويعمل بنجاح.
</p>

<p>
	بينما <a href="https://academy.hsoub.com/apps/web/" rel="">تطبيق الويب</a> هو برنامج يتم توفيره على متصفح الويب وهو في الأساس تطبيق سطح مكتب -أو تطبيق جوال- عن طريق الاتصال بالإنترنت وطلب ملفاته من خادم بعيد، ولا يتطلب تشغيل هذا التطبيق توفر أي موارد أو متطلبات في جهازك أو نظام التشغيل الذي تستخدمه فكل ما تحتاجه لتشغيل تطبيق الويب هو مستعرض واتصال بالإنترنت وبكتابة <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> الخاص بالتطبيق ضمن نافذة المتصفح ستتمكن من الولوج له وبدء استخدامه والاستفادة من مميزاته.
</p>

<p>
	تعتمد برمجة تطبيقات الويب على تقنيات الويب التي ذكرناها آنفًا في تطوير تطبيقات سطح المكتب متعددة الأنظمة بالإضافة إلى لغات وتقنيات برمجة الويب المختلفة مثل <a href="https://academy.hsoub.com/programming/php/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r2040/" rel="">لغة PHP</a> ولغة Ruby وحتى لغة <a href="https://academy.hsoub.com/python/" rel="">بايثون Python</a> وسنتحدث بمزيد من التفصيل عن تقنيات ولغات برمجة تطبيقات سطح المكتب في الفقرة التالية.
</p>

<p>
	تجدر الإشارة لأن لكل من تطبيقات الويب وتطبيقات سطح المكتب ميزاته وعيوبه واختيار نوع التطبيق المناسب يعتمد على احتياجات العمل والجمهور المستهدف والموارد المطلوبة للتطبيق ومستوى الأمان وغيرها من العوامل، لكن يمكننا القول بصفة عامة بأن تطبيقات سطح المكتب هي الأنسب للاستخدام الداخلي في المؤسسات والدوائر الحكومية وفي <a href="https://academy.hsoub.com/programming/game-development/" rel="">برمجة الألعاب</a> في حين تعد التطبيقات المستندة إلى الويب في هي الخيار المفضل عندنا تحتاج إلى توسيع نطاق وصول التطبيق وتوفير إمكانية استخدامه من مواقع وأجهزة مختلفة فلا يكاد يخلو أي جهاز أو جوال اليوم من متصفح ويب.
</p>

<h2>
	تقنيات ولغات برمجة تطبيقات سطح المكتب
</h2>

<p>
	قد تتساءل ما هي أفضل لغات البرمجة لبرمجة تطبيقات سطح المكتب؟ في هذه الفقرة نوفر لك قائمة بأهم هذه التقنيات ومميزات كل منها.
</p>

<p>
	هناك العديد من <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> المناسبة لتطوير تطبيقات سطح المكتب المختلفة وهذا بحسب نوع التطبيق ونظام التشغيل المستهدف.
</p>

<h3>
	لغات برمجة تطبيقات ويندوز
</h3>

<p>
	فإذا أردت برمجة تطبيقات أصيلة مخصصة للعمل على نظام التشغيل ويندوز فعليك استخدام لغات برمجة مثل C#‎ و C++‎.
</p>

<h3>
	لغات برمجة تطبيقات ماك macOS
</h3>

<p>
	وأما لبرمجة تطبيقات خاصة بنظام التشغيل ماك أو إس فعليك استخدام لغة Objective C.
</p>

<h3>
	لغات برمجة تطبيقات لينكس
</h3>

<p>
	وأما لتطوير تطبيقات سطح مكتب موجهة لنظام التشغيل لينكس فيمكنك استخدام لغة C أو لغة C++‎ أو لغة Bash.
</p>

<p>
	كما أنك تحتاج للاستعانة بأدوات خاصة ومكتبات رسم الواجهات وحزم أدوات تطوير البرمجيات SDKs متوفرة لكل نظام تشغيل على حدة.
</p>

<p>
	وأما إن أردت برمجة تطبيقات عابرة للمنصات وتعمل على أنظمة التشغيل الثلاثة السابقة وغيرها فهنا توجه إلى تقنيات الويب ولغاتها التي أشرنا إليها في الأعلى.
</p>

<p>
	وعمومًا، يمكنك تطوير تطبيقات سطح المكتب بالاعتماد على إحدى لغات البرمجة سواءً أصيلة أو عابرة للمنصات فقط لكن هذا قد يتطلب منك الكثير من الوقت والجهد لذا يفضل الاعتماد على <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">إطار عمل framework</a> مساعد تقلل التعليمات البرمجية وتوفر عليك الوقت وتساعد في زيادة إنتاجيتك.
</p>

<h3>
	أدوات وأطر عمل لبرمجة تطبيقات سطح المكتب
</h3>

<p>
	فيما يلي قائمة بأشهر أدوات وأطر عمل تطوير تطبيقات سطح المكتب:
</p>

<h4>
	إلكترون Electron js
</h4>

<p>
	هو إطار عمل برمجي يستخدم في برمجة تطبيقات سطح مكتب عابرة للمنصات تبدو وكأنها تطبيقات أصيلة native-feeling لكنها تعتمد بالأصل على تقنيات الويب الأساسية HTML و CSS وجافا سكريبت وتستخدم متصفح الويب مفتوح المصدر كروميوم Chromium لعرض محتوى التطبيق كما أنها تستخدم بيئة التشغيل Node.js للوصول إلى نظام الملفات المحلي ونظام التشغيل وبهذا يمكن للتطبيقات العمل على أي نظام تشغيل بكل سلاسة.
</p>

<p>
	ومن أشهر تطبيقات سطح المكتب المطورة باستخدام إطار عمل إلكترون نذكر تطبيق سلاك Slack وتطبيق واتساب WhatsApp ومحرر الأكواد الشهير فيجوال ستوديو كود Visual Studio Code.
</p>

<p>
	إذا كنت مهتمًا بتطوير تطبيقات سطح المكتب باستخدام إطار عمل إلكترون فقد وفرت لك أكاديمية حسوب مسارًا متكاملًا ضمن <a href="https://academy.hsoub.com/courses/javascript-application-development/" rel="">دورة تطوير التطبيقات باستخدام JavaScript </a> ستتعلم من خلاله إنشاء تطبيق Electron JS لسطح المكتب.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_5932_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/T6CnMmvF4e0"></iframe>
</p>

<h4>
	كاكاو Cocoa
</h4>

<p>
	هو إطار عمل مخصص لتطوير تطبيقات سطح المكتب التي تعمل على نظام تشغيل macOS ويمكن استخدامه كذلك لإنشاء تطبيقات مخصصة للأجهزة المحمولة، يوفر هذا الإطار العديد من عناصر واجهة المستخدم التي تتيح لك إنشاء <a href="https://academy.hsoub.com/design/user-interface/%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%EF%BB%B7%D9%83%D8%AB%D8%B1-%D8%B4%D9%8A%D9%88%D8%B9%D8%A7-r737/" rel="">واجهات مستخدم</a> احترافية كالحقول النصية وأشرطة التنقل وأزرار الاختيار كما يساعدك على تحسين أداء تطبيقاتك من خلال توفير ميزات إدارة الذاكرة والتحميل الكسول Lazy loading.
</p>

<h4>
	إطار العمل WPF
</h4>

<p>
	هي اختصار لعبارة Windows Presentation Foundation وهو إطار عمل يتيح لك إنشاء واجهة مستخدم لتطبيقات ويندوز باستخدام لغة XAML متوافق مع إطار عمل ‎.NET ويحتوي مكتبات وأدوات لبرمجة الألعاب والويب وتطبيقات الهاتف المحمول ويساعدك في تضمين العديد من الميزات في تطبيقاتك مثل التخطيطات المتجاوبة مع كافة أحجام الشاشات وعناصر التحكم والنماذج وغيرها من الأدوات التي تجعل تجربة برمجة التطبيقات احترافية وسريعة.
</p>

<h4>
	منصة UWP
</h4>

<p>
	هي اختصار لعبارة Universal Windows Platform وهي منصة متخصصة في برمجة تطبيقات سطح المكتب متوافقة مع نظام التشغيل ويندوز 10 وويندوز 11 وتتميز التطبيقات المطورة بهذه المنصة بكونها متوافقة مع كافة أحجام الشاشات وقادرة على التحكم بالموارد المختلفة للجهاز كالفأرة ولوحة المفاتيح وكاميرا الويب وأجهزة التحكم في الألعاب وشاشات اللمس.
</p>

<h4>
	إطار العمل WinForms
</h4>

<p>
	هو إطار عمل مخصص لبناء واجهات المستخدم لتطبيقات سطح المكتب التي تعمل على نظام التشغيل ويندوز بسهولة من خلال تقنية السحب والإفلات التي تساعد مطوري البرامج على برمجة التطبيقات بسرعة وكفاءة، كما يسمح WinForms للمطورين باسترداد البيانات من واجهة برمجة التطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> أو ملفات JSON أو XML أو غيرها من مصادر البيانات وعرضها ضمن التطبيقات.
</p>

<h2>
	خطوات تعلم برمجة تطبيقات سطح المكتب
</h2>

<p>
	إن كنت مهتمًا ببرمجة تطبيقات سطح المكتب ومتحمسًا جدًا لتعلمها لكنك لا تعلم من أين تبدأ، حسنًا دعنا نستعرض مجموعة من الخطوات التي تساعدك في تعلم تطوير تطبيقات سطح المكتب من الصفر للاحتراف.
</p>

<h3>
	1. حدد هدفك
</h3>

<p>
	حدد طبيعة ونوع تطبيقات سطح المكتب التي ترغب بتطويرها، واختر منصة التطوير التي تستهدفها في تطبيقاتك فهناك كما ذكرنا العديد من الخيارات المتاحة مثل ويندوز ولينكس وماك وكل منصة لها مميزاتها وتقنياتها وكي لا تضيع بين هذه الخيارات من الأفضل أن تحدد وجهتك من البداية.
</p>

<h3>
	2. حدد لغة البرمجة
</h3>

<p>
	حدد لغة البرمجة الأنسب التي تمكنك من برمجة تطبيقات سطح المكتب المخصصة للمنصة التي اخترتها وضع خطة لتعلمها والتزم بها قدر المستطاع.
</p>

<h3>
	3. حدد الأدوات وأطر العمل
</h3>

<p>
	تعلم استعمال إطار العمل المناسب للغة البرمجة أو المنصة التي اخترتها فهي تسرع عملك وتمكنك من تطوير تطبيق سطح مكتب عالي الجودة على سبيل المثال يمكنك استخدام إطار عمل إلكترون مع لغة جافاسكربت لبرمجة تطبيقات سطح مكتب عابرة للمنصات، واستخدام إطار عمل Cocoa لإنشاء تطبيقات خاصة بنظام التشغيل macOS.
</p>

<h3>
	4. طبق ما تعلمته
</h3>

<p>
	لن تستفيد مما تعلمته من تقنيات إذا لم تطبق ما تعلمته على مشاريع فعلية، وأول خطوة في التطبيق العملي هي تحديد فكرة وهدف التطبيق والمميزات التي تريد تنفيذها في هذا التطبيق ومحاولة تنفيذها.
</p>

<h3>
	5. حضر التصميمات الأولية لواجهة التطبيق
</h3>

<p>
	قبل البدء بالتنفيذ من المهم تصميم نماذج أولية لواجهات التطبيق فهي تساعدك على توسيع أفكارك وتحديد طريقة عمل التطبيق بشكل أفضل، ويمكنك في هذه المرحلة أن ترسم نماذج تطبيقك بشكل بدائي على الورق أو تعتمد أدوات احترافية مثل Adobe XD أو أو Mockplus أو Moqups وأيًا كانت الطريقة المتبعة في التصميم احرص على أن تراعي تجربة المستخدم وسهولة الاستخدام، وإن كنت تعمل مع فريق، فهذه العملية سيستلمها فريق التصميم عادةً.
</p>

<p>
	وللمزيد من التفاصيل، اطلع على مقال <a href="https://academy.hsoub.com/design/general/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%84%D9%84%D8%AA%D8%B5%D8%A7%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%87%D8%A9-%D9%84%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%85%D9%88%D9%84%D8%A9-r96/" rel="">تصميم النماذج الأولية للواجهات الرسومية</a> ومقال <a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%85%D8%B1%D8%AD%D9%84%D8%A9-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B9%D8%A9-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%8A-%D9%85%D8%B1%D8%AD%D9%84%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-r698/" rel="">المرحلة الرابعة في عملية التفكير التصميمي: مرحلة بناء النماذج الأولية</a>.
</p>

<h3>
	6. ابدأ عملية البرمجة
</h3>

<p>
	بعدها ابدأ في برمجة تطبيق سطح المكتب مستعينًا بالأدوات التي تعلمتها، وفي هذه المرحلة ليس عليك تحقيق جميع الميزات في وقت واحد بل نفذها واحدة تلو الأخرى.
</p>

<h3>
	7. احترف حل المشكلات
</h3>

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

<p>
	للاستزادة، ارجع إلى مقال <a href="https://academy.hsoub.com/programming/general/%D8%AD%D9%84-%D8%A7%D9%84%D9%85%D8%B4%D9%83%D9%84%D8%A7%D8%AA-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r760/" rel="">حل المشكلات وأهميتها في احتراف البرمجة</a>.
</p>

<h3>
	8. اختبر التطبيق
</h3>

<p>
	بعد الانتهاء من برمجة التطبيق قم بإطلاق التطبيق للاستخدام بشكل تجريبي واختبر أدائه وخلوه من أي أخطاء بمساعدة أدوات الاختبار الآلي وأدوات تحليل التعليمات البرمجية وأدوات تصحيح الأخطاء كما ينبغي عليك اختبار التطبيق على مختلف الأنظمة والأجهزة للتأكد من أنه يعمل كما هو متوقع.
</p>

<h3>
	9. انشر التطبيق
</h3>

<p>
	بعد التأكد من أن تطبيقك يعمل على ما يرام يمكنك البدء في إصدار ونشر تطبيق سطح المكتب الخاص بك على المستخدمين، وبمجرد أن يصبح جاهزًا للعمل يمكنك إنشاء حساب مطور ورفعه على أحد المتاجر المتخصصة مثل متجر مايكروسوفت لتطبيقات ويندوز Windows ومتجر Apple لمستخدمي ماك أو يمكنك تحميله في GitHub أو في موقع الويب الخاص بك لبناء معرض أعمال خاص بك يساعدك في دخول سوق العمل بسرعة أكبر.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/kQ6FT7YpFUA?si=C8NUJXNZaAOUPd1c"></iframe>
</p>

<p>
	لا تنتهي العملية عند نشر التطبيق بل يتوجب عليك كمبرمج العمل بصورة مستمرة على متابعة أداء التطبيق والاهتمام بأي ملاحظات أو مشكلات يواجهها مستخدموا التطبيق بعد نشره والحرص على صيانة التطبيق وحل مشكلاته وتحسينه بشكل دوري لتلبية المتطلبات الجديدة وإصلاح أي أخطاء تظهر لاحقًا لضمان المحافظة على جودته وقابليته للاستخدام.
</p>

<h3>
	10. استمر في التعلم
</h3>

<p>
	أنت كمبرمج لن تتوقف على التعلم لأن هذا مجال تطوير تطبيقات سطح المكتب سريع التطور وشديد التقلب، لذا عليك أن تبقى على اطلاع مستمر على أحدث الاتجاهات والتقنيات وأطر العمل في هذا المجال وتحرص على اتباع قواعد البرمجة وأفضل ممارسات كتابة الكود لتضمن التميز والنجاح في سوق شديد التنافسية.
</p>

<p>
	وأنصحك بقراءة مقال <a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%88%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%84%D8%B1%D8%AD%D9%84%D8%AA%D9%83-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r206/" rel="">كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة</a> لبعض النصائح في هذه الرحلة، رحلة <a href="https://academy.hsoub.com/learn-programming/" rel="">تعلم البرمجة</a> وبرمجة تطبيقات سطح المكتب.
</p>

<h2>
	الخلاصة
</h2>

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

<p>
	إذا كان لديك أي تساؤل أو مشكلة تتعلق بموضوع برمجة تطبيقات سطح المكتب لا تتردد في كتابتها في قسم التعليقات أسفل المقال أو يمكنك إضافة استفسارك في قسم <a href="https://academy.hsoub.com/questions/c3-programming/" rel="">الأسئلة البرمجية</a> لتحصل على إجابة بأسرع وقت ممكن وإذا كنت بدأت بالفعل في تطوير تطبيقات سطح المكتب الخاصة بك ولديك نصائح أو توجيهات مساعدة يسرنا أن تشاركها معنا للمزيد من الفائدة.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D9%88%D8%A7%D9%84-r1801/" rel="">برمجة تطبيقات الجوال</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-r1827/" rel="">تطوير التطبيقات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1992</guid><pubDate>Mon, 29 May 2023 13:00:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x645;&#x641;&#x647;&#x648;&#x645; &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Framework &#x648;&#x623;&#x647;&#x645;&#x64A;&#x62A;&#x647; &#x641;&#x64A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/--Framework.png.90b9509c7d4c7d2a78bc0276655cc297.png" /></p>
<p>
	مصطلح إطار العمل أو الفريم وورك <strong>Framework</strong> يعد أحد المصطلحات الفنية والبرمجية التي تربك المبتدئين على وجه الخصوص في بداية مشوار <span ipsnoautolink="true">تعلم البرمجة</span> والتي لا يستطيع فهم دلالتها ولا إدراك مدى أهميتها بشكل جيد.
</p>

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

<h2>
	ما هو إطار العمل Framework؟
</h2>

<p>
	إطار العمل Framework في البرمجة هو ببساطة آلية يتم من خلالها إعداد وتجهيز كافة الوظائف الضرورية والشائعة التي تستخدم بكثرة عند <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-r1827/" rel="">تطوير التطبيقات</a> والأنظمة وإتاحتها للمبرمج ليستخدمها ويستفيد منها في عمله دون أن يحتاج لإعادة كتابة هذه الوظائف بنفسه من الصفر وبهذا نستنتج أن استخدام إطار العمل يختصر الكثير من الوقت ويجعل العمل البرمجي أكثر كفاءة.
</p>

<p>
	لتفهم الأمر بصورة أفضل تخيل أنك تحتاج لكتابة <a href="https://academy.hsoub.com/marketing/core-concepts-of-marketing/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%8A%D8%B1%D8%A9-%D8%A7%D9%84%D8%B0%D8%A7%D8%AA%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%B1%D8%B3%D8%A7%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%81%D9%8A%D8%B2%D9%8A%D8%A9-r596/" rel="">سيرتك الذاتية</a>، سيكون أمامك خياران إما أن تفتح مستندًا فارغًا وتبدأ بكتابة كل شيء وتنسيقه بنفسك من الصفر، أو تعتمد على <a href="https://baaeed.com/job-seekers/resume" rel="external nofollow">قالب جاهز للسيرة الذاتية</a> يكون مقسمًا ومنسقًا وكل ما عليك هو ملء البيانات الضرورية الخاصة بك فقط دون أن تشغل بالك بالكثير من التفاصيل الأخرى سيكون الخيار الثاني أفضل وأسرع بالتأكيد.
</p>

<p>
	يساعدك إطار العمل في مشروعك البرمجي بطريقة مشابهة فهو يعمل كقالب أو هيكل أساسي عليك الالتزام به لإنشاء التطبيقات الخاصة بك، ويوفر لك مجموعة من الأدوات أو المكونات أو الحلول البرمجية الجاهزة لبناء تطبيقات مخصصة بطريقة آمنة وسريعة ومنظمة.
</p>

<p>
	ستجد الكثير من أطر عمل لكل لغات البرمجة الشائعة مثل جافاسكريبت وبايثون و PHP وجافا، ومن أجل استخدام أي إطار منها عليك بداية تعلم كيفية تطوير المشاريع في كل إطار منها والاستفادة من التسهيلات الكثيرة التي توفرها لك هذه الأطر.
</p>


<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			أنشئ موقع إلكتروني لأعمالك بدون خبرة برمجية
		</p>

		<p class="banner-subtitle">
			صمم موقع احترافي لأعمالك بالسحب والإفلات مع أكثر من 70 قالب جاهز وقابل للتخصيص ليناسب هويتك التجارية
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://sndian.com/?utm_source=academy.hsoub.com&amp;utm_medium=referral&amp;utm_campaign=cademy.hsoub.com-CTA-Block" rel="external">جرب سنديان الآن</a>
		</div>
	</div>
</div>




<h2>
	ما الفرق بين إطار العمل والمكتبة؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126974" href="https://academy.hsoub.com/uploads/monthly_2023_05/884169712_.png.c890c9f1b7cb5a53e8a8b9f1f0f8e62c.png" rel=""><img alt="الفرق بين المكتبة Library وإطار العمل framework" class="ipsImage ipsImage_thumbnailed" data-fileid="126974" data-ratio="62.63" data-unique="bdxjo1gli" style="width: 800px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2023_05/.thumb.png.5c84ccf4fd7eb2c6a27c752e83dac4f9.png"> </a>
</p>

<p>
	كثيرًا ما يتم الخلط بين مفهوم إطار العمل Framework ومفهوم مشابه له في البرمجة وهو المكتبة Library ورغم التشابه بينهما في طريقة العمل واستخدامهما بالتبادل في بعض الأحيان، إلا أن مفهوم المكتبة أبسط وأكثر محدودية فالمكتبة تركز على توفير وظيفة محددة في حين يوفر إطار العمل مجموعة متكاملة من الميزات التي تمكنك من <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">برمجة تطبيقات</a> في مجال محدد.
</p>

<p>
	تُعرَّف المكتبة بأنها عبارة عن مجموعة من التعليمات البرمجية المختبرة القابلة لإعادة الاستخدام والتي تنفذ وظيفة معينة وتحل مشكلة محددة، في حين ينفذ إطار العمل حزمة وظائف متكاملة أو يوفر مخططًا عامًا لبناء التطبيقات في حين لا توفر المكتبات هذه الميزة كما تحدد أطر العمل قواعد وإرشادات كتابة التعليمات البرمجية الخاصة بك وتنظم الملفات والمجلدات الخاصة بمشاريعك، ويمكن أن تتضمن مجموعة من المكتبات وتستخدمها لتنفذ مهام معينة.
</p>

<p>
	على سبيل المثال من بين المكتبات الشائعة نذكر <a href="https://academy.hsoub.com/programming/javascript/react/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-react-r1569/" rel="">مكتبة ريآكت React</a> وهي مكتبة برمجية مبنية بلغة <a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت</a> ومتخصصة في بناء واجهات المستخدم ومكتبة <a href="https://wiki.hsoub.com/jQuery" rel="external">jQuery</a> التي تختصر العديد من الأكواد والتعليمات البرمجية المكررة في جافا سكريبت لتسهيل عملية البرمجة، ومن بين أطر العمل الشائعة نذكر <a href="https://academy.hsoub.com/programming/javascript/angular/%D9%85%D8%A7-%D9%87%D9%8A-angular%D8%9F-r1379/" rel="">أنجولار Angular</a> و<a href="https://academy.hsoub.com/programming/javascript/vuejs/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-vuejs-r989/" rel="">فيو Vue.js</a> وهما إطارا عمل بلغة جافا سكريبت مختصان في تصميم واجهات مواقع الويب.
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="3889" data-embedcontent="" src="https://academy.hsoub.com/files/22-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-vuejs/?do=embed" style="margin: auto;"></iframe>

<h2>
	ما الفرق بين إطار العمل ولغة البرمجة؟
</h2>

<p>
	يمكن للمطور أن يستخدم لغة البرمجة ويكتب كافة التعليمات البرمجية اللازمة لبناء التطبيقات من الصفر كما يمكنه إن شاء الاستعانة بإطار عمل Framework مخصص لتطوير برامجه وتطبيقاته.
</p>

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

<p>
	باختصار لغة البرمجة هي الأساس ومن خلال تعلمها يمكنك بناء ما تشاء من تطبيقات، أما إطار العمل فهو مصمم لنوع محدد من التطبيقات مثل تطبيقات الويب أو تطبيقات الجوال أو تطبيقات علم البيانات أو الذكاء الاصطناعي وإنترنت الأشياء …إلخ ويفضل أن تتعلم استخدامه بعد أن <a href="https://academy.hsoub.com/learn-programming/" rel="">تتعلم البرمجة</a> وتتمكن من أساسياتها.
</p>

<h2>
	أهمية إطار العمل في البرمجة
</h2>

<p>
	تبرز أهمية إطار العمل framework بشكل أساسي في كونه يتيح لك إعادة استخدام التعليمات البرمجية بدلًا من إعادة كتابتها من جديد، وفيما يلي جملة من الفوائد التي يمكن أن يوفرها استخدام إطار العمل:
</p>

<ul>
	<li>
		يساعد على توفير كود أكثر أمانًا لكونه يتضمن شيفرات تتحقق من المصادقات والصلاحيات و<a href="https://academy.hsoub.com/programming/general/%D8%A7%D8%AD%D9%85-%D9%85%D9%88%D9%82%D8%B9%D9%83-%D9%85%D9%86-%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D9%82-r864/" rel="">تحمي تطبيقك من الاختراق</a> وتعالج الكثير من الثغرات الأمنية الشائعة مثل CSRF و XSS و SQL Injection.
	</li>
	<li>
		تركيز الجهود على كتابة التعليمات البرمجية الخاصة بالمشروع فقط بدلًا من برمجة وظائف متكررة وشائعة الاستخدام.
	</li>
	<li>
		توحد أنماط وقواعد كتابة التعليمات البرمجية وتوفر مخططًا عامًّا يمكن لكافة الفرق البرمجية فهمه بسهولة.
	</li>
	<li>
		يساعد في تطوير مشروعك وإضافة ميزات جديدة له بسهولة دون الحاجة للتعديل على الكود الأساسي لإطار العمل.
	</li>
	<li>
		يغني عن إعادة اختراع العجلة ويوفر لك الوقت والتكلفة اللازمين لتطوير المشاريع والتطبيقات.
	</li>
	<li>
		يساعد في كتابة كود نظيف وغير مكرر.
	</li>
	<li>
		يسهل عملية اختبار الكود وتصحيح الأخطاء البرمجية.
	</li>
	<li>
		يقلل بالعموم من كمية الأخطاء البرمجية لأنك ستكتب كود أقل وبالتالي ستنتج لديك أخطاء برمجية أقل.
	</li>
</ul>

<h2>
	محدوديات إطار العمل
</h2>

<p>
	لا شكَّ أن استخدام إطار العمل يفيدك كمطور ويساعدك على تسريع وتحسين العمل البرمجي، إلا أن الاعتماد على أطر العمل وحدها يفرض عليك بعض القيود وإليك أبرزها:
</p>

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

<h2>
	صفات إطار العمل الجيد
</h2>

<p>
	تتوافر عشرات أطر العمل في المجالات البرمجية المختلفة الأمر الذي يشعرك بالحيرة في تحديد الإطار الأفضل لمشروعك ويجعلك تتساءل كيف أختار إطار العمل المناسب؟
</p>

<p>
	بالعموم يتصف إطار العمل الجيد بثلاث صفات أساسية وهي:
</p>

<ol>
	<li>
		التوثيق الجيد
	</li>
	<li>
		توفير الوظائف المطلوبة لعملك
	</li>
	<li>
		الشهرة والدعم المجتمعي
	</li>
</ol>

<p>
	لنوضح بمزيد من التفصيل كل صفة من هذه الصفات وأهميتها في اختيار إطار العمل الأفضل.
</p>

<h3>
	التوثيق الجيد
</h3>

<p>
	اختر إطار عمل موثقًا بشكل جيدًا كي تتمكن من العودة إليه عندما تحتاج لمعرفة المزيد من المعلومات حول استخدام ميزة معينة أو حل مشكلة تواجهك في استخدامه، فالتوثيق الجيد يوفر عليك الكثير من الوقت والجهد.
</p>

<h3>
	توفير الوظائف المطلوبة لعملك
</h3>

<p>
	ضع في اعتبارك أن لكل إطار عمل حدود معينة لذا من الضروري أن تبحث بشكل جيد في ميزات الإطار الذي تريد اعتماده وتتأكد من أنه يلبي متطلبات مشروعك ويحقق لك كافة الوظائف والميزات التي تحتاج لتحقيقها بالشكل الأنسب، وبنفس الوقت لا تختر إطار عمل شديد التعقيد أو مكتظًا بالميزات التي قد لا تحتاجها على الإطلاق!
</p>

<h3>
	الشهرة والدعم المجتمعي
</h3>

<p>
	لاشك أن شهرة إطار العمل ووجود مجتمع داعم له يدل على قوته والطلب الكبير عليه في سوق العمل، لذا احرص على استخدام إطار عمل معروف وله قاعدة مستخدمين نشطة ويفضل بعض المبرمجين الاعتماد على أطر عمل <a href="https://academy.hsoub.com/devops/general/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B1%D8%A9-%D9%88%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r590/" rel="">حرة ومفتوحة المصدر</a> وغير مقيدة أو مدعومة من شركات معينة لتخوفهم من انعكاس أي طارئ يحصل لها أو تغير في سياستها على إطار العمل.
</p>

<p>
	ولذلك السبب ترى البعض يميل إلى استخدام إطار العمل Vue.js الذي انبثق من أروقة المجتمع الحر بدلًا من إطار العمل Angular الذي ولد بين أروقة شركة غوغل مثلًا، ولكن هنالك طرف مقابل يشير إلى تنظيم وقوة وسرعة تطوير أطر العمل التي تقف خلفهم الشركات نظرًا لدعمهم السخي طويل الآجل عادةً خصوصًا إن وقفت شركات تقنية كبيرة خلفهم والحديث يطول في هذه النقطة وهي خارج موضوع المقال فقط أحببت الإشارة إليها نظرًا لأهميتها في أي نقاش يدور حول المفاضلة بينها.
</p>

<h2>
	أنواع أطر العمل frameworks في البرمجة
</h2>

<p>
	هناك عدة أنواع من أطر العمل حيث يختص كل إطار بمجال استخدام معين، وفيما بعض أهم أنواع أطر العمل حسب التطبيقات أو الوظائف التي يؤديها:
</p>

<h3>
	1. أطر عمل تطوير الويب Web development frameworks
</h3>

<p>
	تستخدم هذه الأطر في تطوير تطبيقات الويب ومن أشهرها إطار عمل <a href="https://academy.hsoub.com/programming/javascript/angular/" rel="">أنجولار Angular</a> و<a href="https://academy.hsoub.com/programming/javascript/vuejs/" rel="">فيو جي إس Vue.js</a> وهي أطر عمل جافا سكريبت شائعة تستخدم لتطوير الواجهات الأمامية للويب، وإطاري عمل <a href="https://academy.hsoub.com/programming/javascript/nodejs/express/" rel="">إكسبرس Express</a>  و NestJS وهي أطر عمل <a href="https://wiki.hsoub.com/Node.js" rel="external">Node.js</a> لتطوير الواجهات الخلفية للويب، وإطاري عمل <a href="https://academy.hsoub.com/programming/python/django/" rel="">جانغو Django</a>  و<a href="https://academy.hsoub.com/programming/python/flask/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%81%D9%84%D8%A7%D8%B3%D9%83-flask-r2201/" rel="">فلاسك Flask</a> وهي أطر عمل مفتوحة المصدر مكتوب بلغة بايثون مخصصة لتطوير الواجهات الخلفية للويب، وإطار عمل <a href="https://academy.hsoub.com/programming/ruby/rails/" rel="">Ruby on Rails</a> الذي يوفر لك كل ما تحتاجه لإنشاء تطبيق ويب بسهولة وسرعة وأمان وإطار عمل <a href="https://academy.hsoub.com/programming/php/laravel/" rel="">لارافيل Laravel</a> المبني بالاعتماد على لغة <a href="https://wiki.hsoub.com/PHP" rel="external">PHP</a>.
</p>

<h3>
	2. أطر عمل تطوير الجوال Mobile development frameworks
</h3>

<p>
	من أشهرها في تطوير تطبيقات الجوال نذكر إطار عمل <a href="https://academy.hsoub.com/programming/javascript/react/" rel="">React Native</a> مفتوح المصدر مكتوب بلغة جافا سكريبت طورته فيسبوك لتطوير تطبيقات جوال متوافقة مع كافة الأنظمة الأساسية، وإطار أيونيك Ionic الذي يستخدم تقنيات الويب HTML و CSS وجافا سكريبت من أجل تطوير تطبيقات الجوال وهو يتكامل مع أطر تطوير الواجهات الأمامية مثل Angular و Vue، وإطار عمل فلاتر Flutter وهو إطار عمل مفتوح المصدر للغة دارت Dart من جوجل لتطوير تطبيقات الجوال وهو يدعم أنظمة iOS و Android ويحتوي على عناصر واجهة مستخدم قابلة للتخصيص بالكامل، وإطار عمل <a href="ttps://academy.hsoub.com/programming/javascript/cordova/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D8%A3%D8%A8%D8%A7%D8%AA%D8%B4%D9%8A-%D9%83%D9%88%D8%B1%D8%AF%D9%88%D9%81%D8%A7-apache-cordova-r1262/" rel="">أباتشي كوردوفا Apache Cordova</a> الذي يمكنك من تطوير تطبيقات هجينة للهاتف الجوال.
</p>

<h3>
	3. أطر عمل علم البيانات Data science frameworks
</h3>

<p>
	تعرف هذه الأطر كذلك بأطر التعلم الآلي Machine Learning Frameworks وهي تساعد علماء البيانات على إنشاء نماذج تعلم آلي وتصميمها بشكل أسرع وأسهل واستخراج المعلومات المفيدة من مجموعات البيانات بالاستفادة من تقنيات البرمجة والذكاء الاصطناعي والتعلم الآلي. وهناك العديد من أطر عمل <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علم البيانات</a> ومن ضمنها scikit-Learn و XGBoost و TensorFlow و PyTorch.
</p>

<h3>
	4. أطر إدارة المحتوى Content management frameworks
</h3>

<p>
	تعرف أيضًا باسم <a href="https://academy.hsoub.com/apps/web/10-%D9%85%D8%B9%D8%A7%D9%8A%D9%8A%D8%B1-%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-cms-r170/" rel="">نظم إدارة المحتوى Content Management Systems</a> أو اختصارًا CMS هي برمجيات توفر مكونات قابلة لإعادة الاستخدام لإنشاء وإدارة محتوى الويب وعرضه ضمن مدونات أو مواقع إلكترونية أو تطبيقات جوال وهي توفر ميزات أخرى مثل سهولة الاستخدام وتحسين محركات البحث والأمان.
</p>

<p>
	ومن أشهر هذه النظم نذكر نظام <a href="https://academy.hsoub.com/apps/web/wordpress/" rel="">ووردبريس WordPress </a> الشهير المستخدم في إنشاء ما يقارب من نصف المواقع الإلكتروني و<a href="https://academy.hsoub.com/apps/web/drupal/" rel="">دروبال Drupal</a> الذي يعد نظام مثالي لتطوير المواقع التي تحتوي على الكثير من المحتوى وهو يتطلب معرفة تقنية أكثر من بقية نظم إدارة المحتوى.
</p>

<h3>
	5. أطر عمل أتمتة الاختبار Test Automation frameworks
</h3>

<p>
	يستخدم مطورو البرمجيات أطر عمل الأتمتة من أجل إنشاء حالات اختبار التطبيقات والتأكد من سير عملها بكفاءة وتوفر لهم أدوات وتوصيات للتحقق من جودة البرمجيات واتباع معايير الترميز المناسبة.
</p>

<p>
	من أشهر أطر الاختبار نذكر <a href="https://www.selenium.dev/" rel="external nofollow">سيلينيوم Selenium</a> وهو إطار مفتوح المصدر لأتمتة اختبار تطبيقات الويب، و<a href="https://www.cypress.io/" rel="external nofollow">Cypress</a> المبني بجافا سكريبت والمخصص لاختبار الواجهة الأمامية لتطبيقات الويب، و <a href="https://playwright.dev/" rel="external nofollow">Playwright </a> للاختبار الشامل لتطبيقات الويب.
</p>

<h2>
	هل يمكن البدء باستخدام إطار العمل دون تعلم لغة البرمجة؟
</h2>

<p>
	لاشك أن إطار العمل يوفر لك كمطور أداة قيمة لتطوير البرامج التطبيقات المختلفة، لكن السؤال الذي يطرح نفسه هل يغني تعلم أطر العمل واستخدامها في بناء التطبيقات العملية عن تعلم لغات البرمجة وفهمها بشكل متعمق؟
</p>

<p>
	في الواقع حتى لو لم تكن ترغب في تطوير التطبيقات بإحدى <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> وتميل للاستفادة من ميزات أحد أطر العمل فلا غنى لك عن تعلم لغة البرمجة وفهم أساسياتها إلى جانب إطار العمل فكلما فهمت لغة البرمجة بشكل أفضل سيسهل عليك فهم أطر العمل.
</p>

<p>
	كما أن تعلّم البرمجة يوسع أفق عملك ويمكنك من بناء العديد من التطبيقات في مختلف المجالات، أما إطار العمل فهو مصمم كما ذكرنا سابقًا لغرض واحد فقط وبالتالي سيقيدك بنوع محدد من التطبيقات.
</p>

<p>
	ويمكن باختصار أن نلخص الإجابة على هذا السؤال بجملة واحدة: يمكنك استخدام أطر العمل، لكن قبل ذلك تعلم أساسيات لغة البرمجة واتقنها ثم استفد من ميزات إطار العمل الخاص بتلك اللغة كما يحلو لك.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرفنا اليوم على مفهوم إطار العمل Framework ودوره المهم في توفير الوظائف القياسية وتحديد الخطوط العريضة التي تنظم المشاريع البرمجية وتوفر وقت وجهد المطورين والمبرمجين، واكشتفنا أهم الفروقات بين أطر العمل وبين أدوات تطوير البرامج الأخرى مثل المكتبات ولغات البرمجة، وتعلمنا طريقة اختيار أفضل إطار عمل يناسب متطلباتنا وعددنا أهم صفات إطار العمل الجيد، وأخيرًا استعرضنا قائمة بأهم أطر العمل المستخدمة في مجالات مختلفة كتطبيقات الويب وتطبيقات الجوال وغيرها من المجالات.
</p>

<p>
	هل تستخدم في عملك أحد أطر العمل التي وردت في سياق المقال أو أطر عمل أخرى؟ ما هو هذا الإطار وفي أي مجال تستخدمه؟ هل هناك أي مشاكل تواجهها في التعامل مع هذا الإطار أم أنك راضٍ عن أدائه. شاركنا تجربتك في التعليقات أسفل المقال.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">تعلم أساسيات البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A8%D8%B3%D8%A7%D8%B7%D8%A9-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r1870/" rel="">قواعد البرمجة ببساطة للمبتدئين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D9%87%D9%84-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أسهل لغات البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%86-%D9%87%D9%88-%D9%88%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%87%D8%A7%D9%85%D9%87-r2264/" rel="">مهندس البرمجيات من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">تعرف على تخصص هندسة البرمجيات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1991</guid><pubDate>Sun, 28 May 2023 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x627;&#x62E;&#x62A;&#x628;&#x627;&#x631;&#x627;&#x62A; &#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x622;&#x644;&#x64A;&#x629; &#x644;&#x644;&#x62A;&#x648;&#x627;&#x641;&#x642; &#x645;&#x639; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%A2%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1989/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/---------.png.e2d3aacb167e43a3023e4c06c872a203.png" /></p>
<p>
	يمكن أن يصبح إجراء الاختبارات يدويًا على العديد من المتصفحات والأجهزة عدة مرات في اليوم أمرًا مملًا ويمكن أن يستغرق وقتًا طويلًا، لذا يجب أن تكون على دراية بأدوات الاختبار الآلية Automation، وسنلقي في هذا المقال نظرةً على الأدوات المتاحة وكيفية استخدام مشغّلات المهام وكيفية استخدام أساسيات تطبيقات اختبار المتصفح التجارية الآلية مثل LambdaTest و Sauce Labs و BrowserStack و TestingBot.
</p>

<ul>
	<li>
		<strong>المتطلبات الأساسية</strong>: يجب أن تتعلم أساسيات لغات <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت JavaScript</a>، وأن يكون لديك فكرة عن <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">المبادئ عالية المستوى لاختبار التوافق مع المتصفحات</a>.
	</li>
	<li>
		<strong>الهدف</strong>: فهم ما يتطلبه الاختبار الآلي، وكيفية الاستفادة من بعض المنتجات التجارية لتسهيل الأمور.
	</li>
</ul>

<h2>
	تسهيل الأمور باستخدام الاختبارات الآلية
</h2>

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

<p>
	يمكن أن يكون اختبار جميع الأشياء التي اطلعنا عليها في المقالات السابقة يدويًا أمرًا صعبًا للغاية، ولكن لحسن الحظ هناك أدوات تساعدنا على التخلص من ذلك تلقائيًا، فهناك طريقتان رئيسيتان يمكننا من خلالهما أتمتة هذه الاختبارات وهما:
</p>

<ol>
	<li>
		استخدِم مشغّلات المهام Task Runner مثل <a href="https://gruntjs.com/" rel="external nofollow">Grunt</a> أو <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D8%A7%D8%A1-gulp-r663/" rel="">Gulp</a> أو <a href="https://docs.npmjs.com/cli/v8/using-npm/scripts" rel="external nofollow">سكربتات npm</a> لتشغيل الاختبارات وتنظيف الشيفرة البرمجية أثناء عملية البناء، فهذه طريقة رائعة لإجراء مهام مثل تنقيح صياغة Linting الشيفرة البرمجية وتصغيرها وإضافة بادئات CSS أو تحويل Transpiling ميزات <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">جافاسكربت</a> المُنشَاة للوصول إلى أقصى حد من التوافق مع المتصفحات وما إلى ذلك.
	</li>
	<li>
		استخدِم نظام أتمتة للمتصفح مثل <a href="https://www.selenium.dev/" rel="external nofollow">Selenium</a> لإجراء اختبارات محددة على المتصفحات المُثبَّتة وإعادة النتائج لإعطائك تنبيهات بأخطاء المتصفحات عند ظهورها. تعتمد تطبيقات الاختبار التجارية للتوافق مع المتصفحات مثل LambdaTest و Sauce Labs و BrowserStack و TestingBot على نظام Selenium، ولكنها تتيح لك الوصول إلى إعدادها عن بُعد باستخدام واجهة بسيطة، مما يوفر لك متاعب إعداد نظام الاختبار.
	</li>
</ol>

<p>
	سنتطّرق إلى كيفية إعداد نظام الاختبار القائم على نظام Selenium في المقال التالي، ولكن سنوضح في هذا المقال كيفية إعداد مشغّل المهام واستخدام الوظائف الأساسية للأنظمة التجارية المذكورة سابقًا.
</p>

<p>
	<strong>ملاحظة</strong>: ليست الفئتان السابقتان متعارضتَين، إذ يمكن إعداد مشغل المهام للوصول إلى خدمة مثل Sauce Labs أو LambdaTest عبر واجهة برمجة التطبيقات وإجراء اختبارات التوافق مع المتصفحات وإعادة النتائج.
</p>

<h2>
	استخدام مشغل المهام لجعل أدوات الاختبار آلية
</h2>

<p>
	يمكنك تسريع المهام الشائعة بصورة كبيرة مثل تنقيح صياغة الشيفرة البرمجية وتصغيرها باستخدام مشغّل المهام لتشغيل كل ما تحتاجه تشغيلًا تلقائيًا في مرحلة معينة من عملية البناء، إذ يمكن أن يحدث ذلك مثلًا في كل مرة تحفظ فيها ملفًا أو في أيّ وقت آخر، كما سننظر في كيفية جعل تشغيل المهام آلية باستخدام Node و Gulp، وهو خيار سهل الاستخدام للمبتدئين.
</p>

<h3>
	إعداد Node و npm
</h3>

<p>
	تعتمد معظم الأدوات هذه الأيام على <a href="https://academy.hsoub.com/programming/javascript/nodejs/" rel="">Node.js</a>، لذا يجب تثبيته من <a href="https://nodejs.org/en/" rel="external nofollow">موقع Node.js</a> كما يلي:
</p>

<ol>
	<li>
		نزّل برنامج التثبيت على نظامك، فإذا كان لديك Node و npm مثبتين مسبقًا، فانتقل إلى الخطوة رقم 4.
	</li>
	<li>
		ثبّته مثل أيّ برنامج آخر، ولاحظ أنّ Node يأتي مع مدير الحزم npm، مما يسمح لك بسهولة بتثبيت الحزم ومشاركة حزمك مع الآخرين وتشغيل السكربتات المفيدة في مشاريعك.
	</li>
	<li>
		اختبر تثبيت Node بعد اكتمال التثبيت من خلال كتابة الأوامر التالية في الطرفية التي تعيد الإصدارات المُثبَّتة من Node و npm:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_9" style=""><span class="pln">node </span><span class="pun">-</span><span class="pln">v
npm </span><span class="pun">-</span><span class="pln">v</span></pre>

<ol start="4">
	<li>
		إذا ثبّتَ Node و npm مسبقًا، فيجب تحديثهما إلى الإصدارات الأحدث، إذ يمكن تحديث Node من خلال تنزيل حزمة برنامج تثبيت محدَّثة وتثبيتها من الموقع الرسمي، ويمكن تحديث npm من خلال استخدام الأمر التالي في طرفيتك:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_11" style=""><span class="pln">npm install npm@latest </span><span class="pun">-</span><span class="pln">g</span></pre>

<p>
	يمكنك بدء استخدام الحزم المستندة إلى Node/npm في مشروعاتك من خلال إعداد مجلدات مشروعك بوصفها مشاريع npm، ويُعَدّ ذلك أمرًا سهلًا، فلننشئ أولًا مجلد اختبار مثلًا ولنعدّل ما نريده دون خوف.
</p>

<p>
	أنشئ أولًا مجلدًا جديدًا في مكان مناسب باستخدام واجهة مستخدِم مدير الملفات أو على سطر الأوامر من خلال الانتقال إلى الموقع الذي تريده وتشغيل الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_13" style=""><span class="pln">mkdir node</span><span class="pun">-</span><span class="pln">test</span></pre>

<p>
	يمكنك جعل هذا المجلد مشروع npm من خلال الانتقال إلى مجلد الاختبار وتهيئته كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_15" style=""><span class="pln">cd node</span><span class="pun">-</span><span class="pln">test
npm init</span></pre>

<p>
	سيطرح عليك الأمر الثاني العديد من الأسئلة لمعرفة المعلومات المطلوبة لإعداد المشروع، ويمكنك تحديد الإعدادات الافتراضية فقط حاليًا، كما ستُسأَل بعد طرح جميع الأسئلة عمّا إذا كانت المعلومات التي أدخلتها صحيحةً، لذا اكتب <code>yes</code> واضغط على مفتاح Enter أو Return وسينشئ npm الملف package.json في مجلدك.
</p>

<p>
	يُعَدّ هذا الملف ملف إعداد للمشروع ويمكنك تخصيصه لاحقًا، ولكن سيبدو كما يلي حاليًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_17" style=""><span class="pun">{</span><span class="pln">
  </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"node-test"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"version"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"1.0.0"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Test for npm projects"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"main"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"index.js"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"scripts"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"test"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"test"</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="str">"author"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Chris Mills"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"license"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"MIT"</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	إعداد أداة Gulp للاختبارات الآلية
</h3>

<p>
	لنلقِ نظرةً على إعداد أداة Gulp واستخدامها لجعل بعض أدوات الاختبار آليةً.
</p>

<p>
	أنشئ أولًا مشروع اختبار npm كما تحدّثنا سابقًا، إذ ستحتاج بعد ذلك لبعض النماذج لمحتوى <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-html-r1702/" rel="">HTML</a> و <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">CSS</a> وجافاسكربت لاختبار نظامك، لذلك أنشئ نسخةً من الملفات <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/automation/index.html" rel="external nofollow">index.html</a> و <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/automation/main.js" rel="external nofollow">main.js</a> و <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/automation/style.css" rel="external nofollow">style.css</a> في مجلد فرعي باسم src ضمن مجلد مشروعك، كما يمكنك تجربة محتوى الاختبار الذي تريده، ولكن ضع في الحسبان أنّ هذه الأدوات لن تعمل على ملفات JS و CSS الداخلية، فأنت بحاجة إلى ملفات خارجية.
</p>

<p>
	ثبّت <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D8%A7%D8%A1-gulp-r663/" rel="">الأداة Gulp</a> تثبيتًا عامًا بحيث تكون متاحةً في جميع المشاريع باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_19" style=""><span class="pln">npm install </span><span class="pun">--</span><span class="pln">global gulp</span><span class="pun">-</span><span class="pln">cli</span></pre>

<p>
	شغّل بعد ذلك الأمر التالي ضمن جذر مجلد مشروع npm لإعداد أداة Gulp بوصفها اعتماديةً Dependency لمشروعك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_28" style=""><span class="pln">npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev gulp</span></pre>

<p>
	أنشئ الآن ملفًا جديدًا ضمن مجلد مشروعك بالاسم gulpfile.js، وهو الملف الذي سيشغّل جميع مهامنا، وضَع ما يلي ضمن هذا الملف:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_24" style=""><span class="kwd">const</span><span class="pln"> gulp </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp'</span><span class="pun">);</span><span class="pln">

exports</span><span class="pun">.</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">cb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Gulp running'</span><span class="pun">);</span><span class="pln">
  cb</span><span class="pun">();</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	يتطلب ذلك وحدة <code>gulp</code> التي ثبّتناها مسبقًا، ثم يصدّر مهمةً افتراضيةً لا تفعل شيئًا سوى طباعة رسالة إلى الطرفية، وهذا مفيد لإعلامنا بأنّ أداة Gulp تعمل.
</p>

<p>
	تُصدَّر كل مهمة من مهام gulp بالتنسيق الأساسي نفسه <code>exports.taskName = taskFunction</code>، وتأخذ كل دالة معامِلًا واحدًا هو دالة رد نداء callback لتشغيلها عند اكتمال المهمة.
</p>

<p>
	يمكنك تشغيل مهمة gulp الافتراضية باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_31" style=""><span class="pln">gulp</span></pre>

<h3>
	إضافة بعض المهام الحقيقية إلى أداة Gulp
</h3>

<p>
	يمكنك إضافة بعض المهام الحقيقية إلى أداة Gulp من خلال التفكير فيما نريد تطبيقه، إذ سنوضّح فيما يلي مجموعةً من الدوال الأساسية لتشغيلها في مشروعنا:
</p>

<ul>
	<li>
		html-tidy وcss-lint و js-hint للإبلاغ عن أو إصلاح أخطاء شيفرة HTML أو CSS أو JS الشائعة (اطّلع على <a href="https://www.npmjs.com/package/gulp-htmltidy" rel="external nofollow">gulp-htmltidy</a> و <a href="https://www.npmjs.com/package/gulp-csslint" rel="external nofollow">gulp-csslint</a> و <a href="https://www.npmjs.com/package/gulp-jshint" rel="external nofollow">gulp-jshint</a>).
	</li>
	<li>
		Autoprefixer لفحص شيفرة CSS وإضافة بادئات البائع عند الحاجة فقط (اطلع على <a href="https://www.npmjs.com/package/gulp-autoprefixer" rel="external nofollow">gulp-autoprefixer</a>).
	</li>
	<li>
		babel لتحويل أيّ ميزات صيغة جافاسكربت جديدة إلى صيغة تقليدية تعمل في المتصفحات القديمة (اطلع على <a href="https://www.npmjs.com/package/gulp-babel" rel="external nofollow">gulp-babel</a>).
	</li>
</ul>

<p>
	راجع الروابط السابقة للحصول على إرشادات كاملة حول حزم gulp المختلفة التي نستخدمها.
</p>

<p>
	يجب أولًا تثبيت الإضافة عبر <a href="https://academy.hsoub.com/programming/javascript/nodejs/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%AF%D9%8A%D8%B1-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-npm-%D9%81%D9%8A-nodejs-r1465/" rel="">مدير حزم npm</a> لاستخدامها، ثم طلب أيّ اعتماديات في الجزء العلوي من الملف gulpfile.js ثم إضافة الاختبار -أو الاختبارات- إلى الجزء السفلي منه وتصدير اسم مهمتك لتكون متاحةً باستخدام أوامر gulp.
</p>

<h4>
	html-tidy
</h4>

<p>
	ثبّتها باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_33" style=""><span class="pln">npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev gulp</span><span class="pun">-</span><span class="pln">htmltidy</span></pre>

<p>
	<strong>ملاحظة</strong>: تضيف <code>‎--save-dev</code> الحزمة بوصفها اعتماديةً لمشروعك، فإذا نظرت في الملف package.json الخاص بمشروعك، فسترى مدخلةً لها في الخاصية <code>devDependencies</code>.
</p>

<p>
	أضِف بعد ذلك الاعتمادية التالية إلى الملف gulpfile.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_35" style=""><span class="kwd">const</span><span class="pln"> htmltidy </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp-htmltidy'</span><span class="pun">);</span></pre>

<p>
	أضِف الاختبار التالي إلى الجزء السفلي من الملف gulpfile.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_39" style=""><span class="kwd">function</span><span class="pln"> html</span><span class="pun">(</span><span class="pln">cb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> gulp</span><span class="pun">.</span><span class="pln">src</span><span class="pun">(</span><span class="str">'src/index.html'</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">htmltidy</span><span class="pun">())</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">gulp</span><span class="pun">.</span><span class="pln">dest</span><span class="pun">(</span><span class="str">'build'</span><span class="pun">));</span><span class="pln">
    cb</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	صدّر مهمة html باستخدام ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_41" style=""><span class="pln">exports</span><span class="pun">.</span><span class="pln">html </span><span class="pun">=</span><span class="pln"> html</span><span class="pun">;</span></pre>

<p>
	عدّل بعد ذلك تعليمة التصدير الافتراضية إلى ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_43" style=""><span class="pln">exports</span><span class="pun">.</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> html</span><span class="pun">;</span></pre>

<p>
	حصلنا هنا على ملف التطوير index.html باستخدام التابع <code>gulp.src()‎</code> الذي يتيح الحصول على ملف مصدر لتطبيق شيء ما عليه، ثم استخدمنا بعد ذلك الدالة <code>pipe()‎</code> لتمرير هذا الملف المصدر إلى أمر آخر لتطبيق شيء آخر عليه، حيث يمكننا ربط سلسلة من دوال <code>pipe()‎</code> عليه بالقدر الذي نريده.
</p>

<p>
	شغّلنا أولًا الدالة <code>htmltidy()‎</code> على الملف المصدر التي تمر على الملف وتصلح الأخطاء فيه، وتكتب الدالة <code>pipe()‎</code> الثانية ملف HTML الناتج في المجلد build.
</p>

<p>
	لا بدّ أنك لاحظت أننا وضعنا عنصر <code>&lt;p&gt;</code> فارغ في نسخة الدخل من الملف، حيث أزالته الدالة htmltidy عند إنشاء ملف الخرج.
</p>

<h4>
	Autoprefixer و css-lint
</h4>

<p>
	ثبّتهما أولًا باستخدام الأمرين التاليين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_45" style=""><span class="pln">npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev gulp</span><span class="pun">-</span><span class="pln">autoprefixer
npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev gulp</span><span class="pun">-</span><span class="pln">csslint</span></pre>

<p>
	ثانيًا، أضف الاعتماديات التالية إلى الملف gulpfile.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_47" style=""><span class="kwd">const</span><span class="pln"> autoprefixer </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp-autoprefixer'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> csslint </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp-csslint'</span><span class="pun">);</span></pre>

<p>
	ثالثًا، أضِف الاختبار التالي إلى الجزء السفلي من الملف gulpfile.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_50" style=""><span class="kwd">function</span><span class="pln"> css</span><span class="pun">(</span><span class="pln">cb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> gulp</span><span class="pun">.</span><span class="pln">src</span><span class="pun">(</span><span class="str">'src/style.css'</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">csslint</span><span class="pun">())</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">csslint</span><span class="pun">.</span><span class="pln">formatter</span><span class="pun">(</span><span class="str">'compact'</span><span class="pun">))</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">autoprefixer</span><span class="pun">({</span><span class="pln">
            cascade</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pln">
        </span><span class="pun">}))</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">gulp</span><span class="pun">.</span><span class="pln">dest</span><span class="pun">(</span><span class="str">'build'</span><span class="pun">));</span><span class="pln">
    cb</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	رابعًا، أضِف الخاصية التالية إلى الملف <code>package.json</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_52" style=""><span class="str">"browserslist"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="str">"last 5 versions"</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	خامسًا، أضِف السطر التالي بعد التعريفات الثابتة <code>const</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_54" style=""><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> series </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp'</span><span class="pun">);</span></pre>

<p>
	سادسًا، صدِّر مهمة css باستخدام ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_59" style=""><span class="pln">exports</span><span class="pun">.</span><span class="pln">css </span><span class="pun">=</span><span class="pln"> css</span><span class="pun">;</span></pre>

<p>
	أخيرًا، عدّل المهمة الافتراضية إلى ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_62" style=""><span class="pln">exports</span><span class="pun">.</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> series</span><span class="pun">(</span><span class="pln">html</span><span class="pun">,</span><span class="pln"> css</span><span class="pun">);</span></pre>

<p>
	حصلنا هنا على الملف style.css وشغّلنا الدالة <code>csslint</code> عليه والتي تعطي قائمةً بأخطاء شيفرة CSS في الطرفية، ثم شغلنا الدالة <code>autoprefixer</code> عليه لإضافة أيّ بادئات مطلوبة لجعل ميزات CSS الحديثة تعمل في المتصفحات القديمة، ويكون الخرج في نهاية سلسلة دوال <code>pipe()‎</code> ملفَ CSS المعدَّل مع البادئات ضمن المجلد build.
</p>

<p>
	لاحظ أنّ ذلك لن يعمل إذا لم تعثر الدالة <code>csslint</code> على أخطاء، لذا جرّب إزالة قوس معقوص من ملف CSS وأعِد تشغيل gulp لمعرفة الخرج الذي تحصل عليه.
</p>

<h4>
	js-hint و babel
</h4>

<p>
	أولًا، ثبّتهما باستخدام الأوامر التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_64" style=""><span class="pln">npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev gulp</span><span class="pun">-</span><span class="pln">babel </span><span class="lit">@babel</span><span class="pun">/</span><span class="pln">preset</span><span class="pun">-</span><span class="pln">env
npm install </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev </span><span class="lit">@babel</span><span class="pun">/</span><span class="pln">core
npm install jshint gulp</span><span class="pun">-</span><span class="pln">jshint </span><span class="pun">--</span><span class="pln">save</span><span class="pun">-</span><span class="pln">dev</span></pre>

<p>
	ثانيًا، أضِف الاعتماديات التالية إلى الملف gulpfile.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_66" style=""><span class="kwd">const</span><span class="pln"> babel </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp-babel'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> jshint </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'gulp-jshint'</span><span class="pun">);</span></pre>

<p>
	ثالثًا، أضِف الاختبار التالي إلى الجزء السفلي من الملف gulpfile.js:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_68" style=""><span class="kwd">function</span><span class="pln"> js</span><span class="pun">(</span><span class="pln">cb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> gulp</span><span class="pun">.</span><span class="pln">src</span><span class="pun">(</span><span class="str">'src/main.js'</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">jshint</span><span class="pun">())</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">jshint</span><span class="pun">.</span><span class="pln">reporter</span><span class="pun">(</span><span class="str">'default'</span><span class="pun">))</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">babel</span><span class="pun">({</span><span class="pln">
            presets</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'@babel/env'</span><span class="pun">]</span><span class="pln">
        </span><span class="pun">}))</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">gulp</span><span class="pun">.</span><span class="pln">dest</span><span class="pun">(</span><span class="str">'build'</span><span class="pun">));</span><span class="pln">
        cb</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	رابعًا، صدّر مهمة js باستخدام ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_70" style=""><span class="pln">exports</span><span class="pun">.</span><span class="pln">js </span><span class="pun">=</span><span class="pln"> js</span><span class="pun">;</span></pre>

<p>
	أخيرًا، عدّل المهمة الافتراضية إلى ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_72" style=""><span class="pln">exports</span><span class="pun">.</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> series</span><span class="pun">(</span><span class="pln">html</span><span class="pun">,</span><span class="pln"> css</span><span class="pun">,</span><span class="pln"> js</span><span class="pun">);</span></pre>

<p>
	حصلنا هنا على الملف main.js وشغّلنا الدالة <code>jshint</code> عليه وأخرجنا النتائج في الطرفية باستخدام <code>jshint.reporter</code>، ثم مرّرنا الملف إلى الدالة <code>babel</code> التي تحوله إلى صيغة التنسيق القديم وتخرج النتيجة إلى المجلد build، وقد تضمّنت شيفرتنا الأصلية على دالة سهمية Arrow Function عدّلتها دالة <code>babel</code> إلى دالة ذات تنسيق قديم.
</p>

<h4>
	مزيد من الأفكار
</h4>

<p>
	يمكنك تشغيل الأمر <code>gulp</code> ضمن مجلد مشروعك بمجرد إعداد كل ما سبق، ويجب أن تحصل على الخرج التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126241" href="https://academy.hsoub.com/uploads/monthly_2023_05/01_gulp-output.png.0e2c16cd206a663bf0b3a1076768b209.png" rel=""><img alt="01_gulp-output.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126241" data-unique="ahy724j0m" src="https://academy.hsoub.com/uploads/monthly_2023_05/01_gulp-output.png.0e2c16cd206a663bf0b3a1076768b209.png"> </a>
</p>

<p>
	يمكنك بعد ذلك تجربة خرج الملفات من خلال مهامك الآلية بالنظر إليها ضمن المجلد build وتحميل الملف build/index.html في متصفح الويب، فإذا حصلت على أخطاء، فتحقق من أنك قد أضفت جميع الاعتماديات والاختبارات المذكورة سابقًا، وحاول تعليق أقسام شيفرة HTML/CSS/JavaScript ثم أعِد تشغيل gulp لمعرفة ما إذا كان بإمكانك معرفة المشكلة.
</p>

<p>
	تأتي Gulp مع الدالة <code>watch()‎</code> والتي يمكنك استخدامها لمراقبة ملفاتك وإجراء الاختبارات كلما حفظتَ ملفًا، لذا أضِف ما يلي إلى الجزء السفلي من الملف gulpfile.js مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_74" style=""><span class="kwd">function</span><span class="pln"> watch</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  gulp</span><span class="pun">.</span><span class="pln">watch</span><span class="pun">(</span><span class="str">'src/*.html'</span><span class="pun">,</span><span class="pln"> html</span><span class="pun">)</span><span class="pln">
  gulp</span><span class="pun">.</span><span class="pln">watch</span><span class="pun">(</span><span class="str">'src/*.css'</span><span class="pun">,</span><span class="pln"> css</span><span class="pun">)</span><span class="pln">
  gulp</span><span class="pun">.</span><span class="pln">watch</span><span class="pun">(</span><span class="str">'src/*.js'</span><span class="pun">,</span><span class="pln"> js</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

exports</span><span class="pun">.</span><span class="pln">watch </span><span class="pun">=</span><span class="pln"> watch</span><span class="pun">;</span></pre>

<p>
	أدخِل الآن الأمر <code>gulp watch</code> في طرفيتك، وستراقب أداة Gulp مجلدك، وتشغّل المهام المناسبة كلما حفظتَ تعديلًا في ملف HTML أو CSS أو جافاسكربت.
</p>

<p>
	<strong>ملاحظة</strong>: المحرف <code>*</code> هو محرف بدل Wildcard، فالقصد هنا هو تشغيل هذه المهام عند حفظ أيّ ملفات من هذه الأنواع، كما يمكنك استخدام محارف البدل في مهامك الرئيسية مثل <code>gulp.src('src/*.css')‎</code> التي تحصل على جميع ملفات CSS ثم تشغّل مهام <code>pipe</code> عليها.
</p>

<p>
	اطّلع على مقال <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D8%A7%D8%A1-gulp-r663/" rel="">دليلك الشامل إلى أداة البناء Gulp</a> في أكاديمية حسوب لمزيد من التفاصيل.
</p>

<h3>
	مشغلات المهام الأخرى
</h3>

<p>
	هناك العديد من مشغّلات المهام الأخرى المتاحة، فإننا لا نحاول القول أنّ الأداة Gulp هي أفضل حل موجود، ولكنها جيدة إلى حد ما للمبتدئين، كما يمكنك تجربة استخدام حلول أخرى مثل:
</p>

<ul>
	<li>
		تعمل الأداة Grunt بطريقة مشابهة جدًا للأداة Gulp باستثناء أنها تعتمد على المهام المحددة في ملف الإعداد بدلًا من استخدام شيفرة مكتوبة بلغة جافاسكربت.
	</li>
	<li>
		يمكنك تشغيل المهام مباشرةً باستخدام سكربتات npm الموجودة ضمن <a href="https://academy.hsoub.com/programming/javascript/nodejs/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-nodejs-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-npm-%D9%88%D9%85%D9%84%D9%81-packagejson-r1728/" rel="">الملف package.json</a> دون الحاجة إلى تثبيت أيّ نظام إضافي لتشغيل المهام، إذ تعمل سكربتات npm على أساس أنّ أشياء مثل إضافات Gulp تغلّف أدوات سطر الأوامر، لذلك إذا كان بإمكانك معرفة كيفية تشغيل الأدوات باستخدام سطر الأوامر، فيمكنك تشغيلها باستخدام سكربتات npm، إذ يكون التعامل معها أصعب قليلًا، ولكنها جيدة للأشخاص ذوي المهارات العالية في استخدام <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a>.
	</li>
</ul>

<h2>
	استخدام خدمات الاختبارات التجارية لتسريع اختبار المتصفحات
</h2>

<p>
	لنلقِ نظرةً الآن على الخدمات الخارجية التجارية لاختبار المتصفحات وما فائدتها.
</p>

<p>
	الفكرة الأساسية لمثل هذه التطبيقات هي أنّ الشركة التي تدير كلًا منها لديها مجموعة خوادم ضخمة يمكنها إجراء العديد من الاختبارات المختلفة، إذ ستقدّم عند استخدام هذه الخدمة <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> للصفحة التي تريد اختبارها مع بعض المعلومات مثل المتصفحات التي تريد اختبارها فيها، ثم يضبط التطبيق آلة افتراضية VM جديدة مع نظام التشغيل والمتصفح الذي حددته، ويعيد الاختبار النتائج على شكل لقطات شاشة ومقاطع فيديو وملفات تسجيل ونصوص وما إلى ذلك.
</p>

<p>
	يمكنك بعد ذلك رفع مستوى العتاد باستخدام واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> للوصول إلى الوظائف برمجيًا، مما يعني أنه يمكن دمج هذه التطبيقات مع مشغّلات المهام مثل بيئات Selenium المحلية وغيرها لإنشاء اختبارات آلية.
</p>

<p>
	<strong>ملاحظة</strong>: هناك أنظمة تجارية أخرى متاحة لاختبار المتصفحات ولكن سنركّز في هذا المقال على LambdaTest و Sauce Labs و BrowserStack، كما ليست هذه الأنظمة بالضرورة أفضل الأدوات المتاحة، لكنها أدوات جيدة ومناسبة للمبتدئين.
</p>

<h3>
	LambdaTest
</h3>

<ol>
	<li>
		ابدأ <a href="https://accounts.lambdatest.com/register" rel="external nofollow">بالتسجيل في نظام LambdaTest</a> مجانًا.
	</li>
	<li>
		سجّل الدخول، إذ يجب أن يحدث ذلك تلقائيًا بعد التحقق من عنوان بريدك الإلكتروني.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong>: يقدّم نظام LambdaTest حسابًا مجانيًا يمكنك من خلاله الوصول إلى منصته مدى الحياة على عكس مزودي خدمة اختبار التوافق مع المتصفحات عبر السحابة الأخرى، والفرق الوحيد بين خطته المدفوعة والمجانية هو مقدار الاستهلاك.، إذ يوفر نظام LambdaTest ستِّين دقيقة شهريًا للاختبار المجاني الآلي عبر شبكة Selenium Grid.
</p>

<h4>
	الأساسيات: الاختبارات اليدوية
</h4>

<p>
	سيوجّهك نظام LambdaTest بعد تسجيل الدخول إلى لوحة التحكم التي ستزودك بالتفاصيل المتعلقة بعدد الدقائق التي استهلكتها وعدد الجلسات المتزامنة الجارية والعدد الإجمالي للاختبارات حتى الآن والمزيد.
</p>

<p>
	أولًا، يجب اختيار التبويب "اختبار الوقت الحقيقي Real Time Testing" من قائمة التنقل اليسرى لبدء الاختبار اليدوي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126245" href="https://academy.hsoub.com/uploads/monthly_2023_05/02_lambdatest-dashboard.png.55e572e27e33cb47372afa6900bc4a36.png" rel=""><img alt="02_lambdatest-dashboard.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126245" data-unique="hu9zaple4" src="https://academy.hsoub.com/uploads/monthly_2023_05/02_lambdatest-dashboard.thumb.png.ca82a778773fc3f456e118c528bc9eed.png"> </a>
</p>

<p>
	ستُوجَّه عند النقر على التبويب "اختبار الوقت الحقيقي Real Time Testing" إلى شاشة حيث يمكنك اختيار إعداد المتصفح وإصداره ونظام التشغيل ودقة الشاشة التي تريد اختبار موقع الويب بها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126238" href="https://academy.hsoub.com/uploads/monthly_2023_05/03_mark-as-bug-1.png.9e82c8348915f94d738eed338b16b632.png" rel=""><img alt="03_mark-as-bug-1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126238" data-unique="kzb1syiph" src="https://academy.hsoub.com/uploads/monthly_2023_05/03_mark-as-bug-1.thumb.png.d84aa5257088334c86978611152f7366.png"> </a>
</p>

<p>
	إذا نقرتَ على زر "البدء Start"، فستظهر شاشة تحميل توفر لك آلة افتراضية VM بناءً على إعداداتك، ثم يمكنك إجراء اختبار حي وتفاعلي للتوافق مع المتصفحات على موقع ويب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126242" href="https://academy.hsoub.com/uploads/monthly_2023_05/04_mark-as-bug-2.png.ea15ab3255dc8800ecf75ecfbf0c407c.png" rel=""><img alt="04_mark-as-bug-2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126242" data-unique="le7gztevm" src="https://academy.hsoub.com/uploads/monthly_2023_05/04_mark-as-bug-2.thumb.png.dfc2b2a0f8daf70bd33af4e396ff9287.png"> </a>
</p>

<p>
	إذا لاحظت وجود مشكلة في واجهة المستخدِم، فيمكنك مشاركتها مع زملائك من خلال التقاط لقطة شاشة لآلتك الافتراضية باستخدام زر لقطة الشاشة Screenshot، ويمكنك تسجيل مقطع فيديو لجلسة الاختبار من خلال الضغط على زر التسجيل في جلسة الاختبار.
</p>

<p>
	حدّد لقطة الشاشة قبل رفعها إلى زملائك باستخدام محرّر الصور المبني مسبقًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126240" href="https://academy.hsoub.com/uploads/monthly_2023_05/05_mark-as-bug-3.png.fcce47045c015bd486be3276d465da87.png" rel=""><img alt="05_mark-as-bug-3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126240" data-unique="d27igqlh6" src="https://academy.hsoub.com/uploads/monthly_2023_05/05_mark-as-bug-3.thumb.png.2586463cdbee4a669ec0631f0794259a.png"> </a>
</p>

<p>
	استخدِم زر "تحديده على أساس خطأ Mark as Bug" لرفع الأخطاء إلى العديد من الأدوات الخارجية مثل Jira و <a href="https://academy.hsoub.com/tags/asana%20101/" rel="">Asana</a> و <a href="https://academy.hsoub.com/apps/productivity/trello/" rel="">Trello</a> وغيرها، وبذلك يمكنك تسجيل خطأ مباشرةً من جلسة الاختبار على نظام LambdaTest إلى برنامج إدارة مشروعك.
</p>

<p>
	<strong>ملاحظة</strong>: تُوضَع جميع مقاطع الفيديو والصور المُلتقَطة ضمن جلسة الاختبار في المعرض وسجلات الاختبار ومتعقّب المشاكل ضمن LambdaTest.
</p>

<h3>
	Sauce Labs
</h3>

<p>
	لنبدأ بتجربة نظام Sauce Labs.
</p>

<ol>
	<li>
		أنشئ حسابًا تجريبيًا على Sauce Labs.
	</li>
	<li>
		سجّل الدخول، إذ يجب أن يحدث ذلك تلقائيًا بعد التحقق من عنوان بريدك الإلكتروني.
	</li>
</ol>

<h4>
	الأساسيات: الاختبارات اليدوية
</h4>

<p>
	تحتوي لوحة تحكم Sauce Labs على الكثير من الخيارات المتاحة، وتأكّد حاليًا من أنك ضمن تبويب "الاختبارات اليدوية Manual Tests".
</p>

<ol>
	<li>
		انقر على "بدء جلسة يدوية جديدة Start a new manual session".
	</li>
	<li>
		اكتب في الشاشة التالية عنوان URL للصفحة التي تريد اختبارها (استخدم العنوان <a href="https://mdn.github.io/learning-area/javascript/building-blocks/events/show-video-box-fixed.html" ipsnoembed="false" rel="external nofollow">https://mdn.github.io/learning-area/javascript/building-blocks/events/show-video-box-fixed.html</a> مثلًا)، ثم اختر متصفحًا ونظام تشغيل تريد اختبارهما معًا باستخدام الأزرار والقوائم المختلفة، فهناك الكثير من الخيارات.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126239" href="https://academy.hsoub.com/uploads/monthly_2023_05/06_sauce-manual-session.png.e4faa44ee692b1d95f969b1394f0c3d2.png" rel=""><img alt="06_sauce-manual-session.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126239" data-unique="7gpw2f0oa" src="https://academy.hsoub.com/uploads/monthly_2023_05/06_sauce-manual-session.thumb.png.65435129ee4e1f278f2d62426b02e95e.png"> </a>
</p>

<ol start="3">
	<li>
		إذا نقرت على "بدء الجلسة Start Session"، فستظهر شاشة التحميل التي تشغّل آلةً افتراضيةً تعمل عليها مجموعة المتصفح ونظام تشغيل التي اخترتها.
	</li>
	<li>
		يمكنك بعد انتهاء التحميل البدء في اختبار موقع الويب الذي يعمل في المتصفح المختار عن بُعد.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126246" href="https://academy.hsoub.com/uploads/monthly_2023_05/07_sauce-test-running.png.cf9d11937ea43d370871c1da38680372.png" rel=""><img alt="07_sauce-test-running.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126246" data-unique="m359tm6zj" src="https://academy.hsoub.com/uploads/monthly_2023_05/07_sauce-test-running.png.cf9d11937ea43d370871c1da38680372.png"> </a>
</p>

<ol start="5">
	<li>
		يمكنك رؤية تخطيط الموقع كما سيبدو في المتصفح الذي تختبره، وتحريك الفأرة والنقر فوق الأزرار وما إلى ذلك، إذ تتيح لك القائمة العلوية ما يلي:
	</li>
</ol>

<ul>
	<li>
		إيقاف الجلسة.
	</li>
	<li>
		إعطاء شخص آخر عنوان URL ليتمكن من مراقبة الاختبار عن بُعد.
	</li>
	<li>
		نسخ نص أو ملاحظات إلى حافظة بعيدة.
	</li>
	<li>
		أخذ لقطة شاشة.
	</li>
	<li>
		الاختبار في وضع ملء الشاشة.
	</li>
</ul>

<p>
	ستعود بعد إيقاف الجلسة إلى تبويب الاختبارات اليدوية، حيث سترى مدخلةً entry لكل جلسة من الجلسات اليدوية السابقة التي بدأتها، وسيؤدي النقر على إحدى هذه المدخلات إلى إظهار المزيد من بيانات الجلسة، حيث يمكنك تنزيل لقطات الشاشة التي التقطتها سابقًا ومشاهدة مقطع فيديو للجلسة وعرض سجلات البيانات وغير ذلك.
</p>

<p>
	<strong>ملاحظة</strong>: يُعَدّ ذلك مفيدًا جدًا، وهو أكثر ملاءمةً من الاضطرار إلى إعداد كل هذه المحاكيات والآلات الافتراضية بنفسك.
</p>

<h4>
	الخيارات المتقدمة: واجهة Sauce Labs <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>
</h4>

<p>
	يحتوي نظام Sauce Labs على واجهة برمجة تطبيقات مريحة تتيح لك استرداد تفاصيل حسابك والاختبارات الحالية برمجيًا وإضافة تعليقات توضيحية إلى الاختبارات بمزيد من التفاصيل مثل حالة النجاح أو الفشل التي لا يمكن تسجيلها باستخدام الاختبار اليدوي وحده، فيمكن أن ترغب مثلًا في تشغيل أحد اختبارات Selenium عن بُعد باستخدام نظام Sauce Labs لاختبار مجموعة معينة من المتصفحات وأنظمة التشغيل، ثم تمرير نتائج الاختبار مرةً أخرى إلى نظام Sauce Labs.
</p>

<p>
	كما يحتوي على العديد من العملاء المتاحين للسماح لك بإجراء استدعاءات <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">لواجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> باستخدام بيئتك المفضلة سواءً كانت PHP أو Java أو Node.js أو غيرها.
</p>

<p>
	لنلقِ نظرةً سريعة على كيفية وصولنا إلى واجهة برمجة التطبيقات باستخدام Node.js و <a href="https://github.com/saucelabs/node-saucelabs" rel="external nofollow">node-saucelabs</a>.
</p>

<p>
	أعِدّ أولًا مشروع npm جديد لاختبار ذلك كما ذكرنا سابقًا، واستخدم اسم مجلد مختلف مثل sauce-test.
</p>

<p>
	ثانيًا، ثبّت مغلّف Node Sauce Labs باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_79" style=""><span class="pln">npm install saucelabs</span></pre>

<p>
	ثالثًا، أنشئ ملفًا جديدًا ضمن جذر مشروعك بالاسم call_sauce.js وضع فيه المحتويات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_81" style=""><span class="kwd">const</span><span class="pln"> </span><span class="typ">SauceLabs</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'saucelabs'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">let</span><span class="pln"> myAccount </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SauceLabs</span><span class="pun">({</span><span class="pln">
  username</span><span class="pun">:</span><span class="pln"> </span><span class="str">"your-sauce-username"</span><span class="pun">,</span><span class="pln">
  password</span><span class="pun">:</span><span class="pln"> </span><span class="str">"your-sauce-api-key"</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

myAccount</span><span class="pun">.</span><span class="pln">getAccountDetails</span><span class="pun">((</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">res</span><span class="pun">);</span><span class="pln">
  myAccount</span><span class="pun">.</span><span class="pln">getServiceStatus</span><span class="pun">((</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ‫حالة خدمات Sauce Labs</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">res</span><span class="pun">);</span><span class="pln">
    myAccount</span><span class="pun">.</span><span class="pln">getJobs</span><span class="pun">((</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> jobs</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// احصل على قائمة بجميع وظائفك</span><span class="pln">
      </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> job </span><span class="kwd">of</span><span class="pln"> jobs</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        myAccount</span><span class="pun">.</span><span class="pln">showJob</span><span class="pun">(</span><span class="pln">job</span><span class="pun">.</span><span class="pln">id</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">let</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">res</span><span class="pun">.</span><span class="pln">id</span><span class="pun">}:</span><span class="pln"> </span><span class="typ">Status</span><span class="pun">:</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">res</span><span class="pun">.</span><span class="pln">status</span><span class="pun">}`;</span><span class="pln">
          </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">res</span><span class="pun">.</span><span class="pln">error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            str </span><span class="pun">+=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">\x</span><span class="lit">1b</span><span class="pun">[</span><span class="lit">31m</span><span class="pln"> </span><span class="typ">Error</span><span class="pun">:</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">res</span><span class="pun">.</span><span class="pln">error</span><span class="pun">}</span><span class="pln">\x</span><span class="lit">1b</span><span class="pun">[</span><span class="lit">0m</span><span class="pun">`;</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">
          console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">str</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">});</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	رابعًأ، املأ اسم مستخدِم Sauce Labs ومفتاح <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> في الأماكن المشار إليها، كما يمكن استرجاعها من صفحة إعدادات المستخدِم الخاصة بك.
</p>

<p>
	أخيرًا، تأكد من حفظ كل شيء وشغّل ملفك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_85" style=""><span class="pln">node call_sauce</span></pre>

<h4>
	الخيارات المتقدمة: الاختبارات الآلية
</h4>

<p>
	سنغطّي تشغيل اختبارات Sauce Lab الآلية في المقال التالي.
</p>

<h3>
	BrowserStack
</h3>

<p>
	لنبدأ بالإصدار التجريبي من نظام BrowserStack.
</p>

<ol>
	<li>
		أنشئ <a href="https://www.browserstack.com/users/sign_up" rel="external nofollow">حسابًا تجريبيًا من BrowserStack</a>.
	</li>
	<li>
		سجّل الدخول، إذ يجب أن يحدث ذلك تلقائيًا بعد التحقق من عنوان بريدك الإلكتروني.
	</li>
	<li>
		يجب أن تكون في صفحة الاختبار المباشرة عند تسجيل الدخول لأول مرة، فإذا لم يكن الأمر كذلك، فانقر على الرابط Live في قائمة التنقل العلوية.
	</li>
	<li>
		إذا أردت استخدام Firefox أو Chrome، فيجب تثبيت إضافة متصفح في مربع حوار بعنوان "تفعيل الاختبار المحلي Enable Local Testing"، ثم انقر على زر "تثبيت Install" للمتابعة. ستظل قادرًا على استخدام بعض الميزات في المتصفحات الأخرى باستخدام Flash عمومًا، ولكن يمكن ألّا تحصل على التجربة الكاملة.
	</li>
</ol>

<h4>
	الأساسيات: الاختبارات اليدوية
</h4>

<p>
	تتيح لك لوحة تحكم BrowserStack Live اختيار الجهاز والمتصفح الذي ترغب في اختباره، حيث تكون المنصات في العمود الأيسر والأجهزة على اليمين، فإذا حرّكت الفأرة على كل جهاز أو نقرت عليه، فستحصل على مجموعة مختارة من المتصفحات المتوفرة على هذا الجهاز.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126243" href="https://academy.hsoub.com/uploads/monthly_2023_05/08_browserstack-test-choices-sized.png.d5771df00c339b7454c5fd6f93cb24c2.png" rel=""><img alt="08_browserstack-test-choices-sized.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126243" data-unique="aw7wwthiu" src="https://academy.hsoub.com/uploads/monthly_2023_05/08_browserstack-test-choices-sized.png.d5771df00c339b7454c5fd6f93cb24c2.png"> </a>
</p>

<p>
	سيؤدي النقر على إحدى أيقونات المتصفح إلى تحميل اختيارك للمنصة/الجهاز/المتصفح، لذا اختر أحد الخيارات الآن وجرّبه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126237" href="https://academy.hsoub.com/uploads/monthly_2023_05/09_browserstack-test-device-sized.png.d30a66438f15f98444fbc9b734df1d02.png" rel=""><img alt="09_browserstack-test-device-sized.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126237" data-unique="y6bma56rx" src="https://academy.hsoub.com/uploads/monthly_2023_05/09_browserstack-test-device-sized.thumb.png.103d087d5bf9a188a4792e8a6898f294.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: تشير أيقونة الجهاز الزرقاء بجوار بعض خيارات الجهاز المحمول إلى أنك ستختبر على جهاز حقيقي، وستُشغَّل الخيارات بدون هذه الأيقونة على المحاكي.
</p>

<p>
	ستجد أنه يمكنك إدخال عناوين URL في شريط العناوين واستخدام عناصر التحكم الأخرى كما تتوقع على جهاز حقيقي، كما يمكنك تنفيذ أشياء مثل النسخ واللصق من الجهاز إلى حافظتك أو التمرير لأعلى ولأسفل عن طريق السحب بالفأرة أو استخدام الحركات المناسبة على لوحات اللمس الخاصة بالأجهزة الداعمة مثل MacBook مثل التصغير/التكبير والضغط بإصبعين للتمرير، ولاحظ أنه ليست كل الميزات متوفرة على جميع الأجهزة.
</p>

<p>
	كما سترى قائمةً تسمح لك بالتحكم في الجلسة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126244" href="https://academy.hsoub.com/uploads/monthly_2023_05/10_browserstack-test-menu-sized.png.33cb8913d3310ddd3dd2a5ddf8febc29.png" rel=""><img alt="10_browserstack-test-menu-sized.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126244" data-unique="ruj8nj3li" src="https://academy.hsoub.com/uploads/monthly_2023_05/10_browserstack-test-menu-sized.thumb.png.fd5a992a1a6f19650b2f8b5f23127463.png"> </a>
</p>

<p>
	الميزات هنا هي كما يلي:
</p>

<ul>
	<li>
		"التبديل Switch": التغيير إلى مجموعة منصة/جهاز/متصفح أخرى.
	</li>
	<li>
		الاتجاه (تشبه أيقونة إعادة التحميل): تبديل الاتجاه بين الوضع الرأسي والأفقي.
	</li>
	<li>
		ملاءمة الشاشة (تبدو مثل أيقونة ملء الشاشة): ملء مناطق الاختبار بمقدار حجم الجهاز.
	</li>
	<li>
		التقاط خطأ (تبدو مثل الكاميرا): تأخذ لقطة شاشة ثم تسمح لك بالتعليق عليها وحفظها.
	</li>
	<li>
		متعقّب المشاكل (يبدو مثل مجموعة بطاقات): عرض الأخطاء/لقطات الشاشة التي جرى التقاطها مسبقًا.
	</li>
	<li>
		الإعدادات (أيقونة الترس): تسمح لك بتعديل إعدادات الجلسة العامة.
	</li>
	<li>
		المساعدة (علامة الاستفهام): للوصول إلى وظائف المساعدة أو الدعم.
	</li>
	<li>
		أدوات التطوير Devtools: تسمح لك باستخدام أدوات التطوير الخاصة بمتصفحك لتصحيح أو معالجة الصفحة المعروضة في متصفح الاختبار مباشرةً، ويعمل ذلك حاليًا فقط عند اختبار متصفح Safari على أجهزة iOS.
	</li>
	<li>
		معلومات الجهاز Device info: تعرض معلومات حول جهاز الاختبار.
	</li>
	<li>
		الميزات Features: تعرض الميزات التي يدعمها الإعداد الحالي مثل النسخ إلى الحافظة ودعم الإيماءات وما إلى ذلك.
	</li>
	<li>
		التوقف Stop: ينهي الجلسة.
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: يُعَدّ ذلك مفيدًا جدًا، وهو أكثر ملاءمةً من الاضطرار إلى إعداد كل هذه المحاكيات والآلات الافتراضية بنفسك.
</p>

<h4>
	الميزات الأساسية الأخرى
</h4>

<p>
	إذا عُدتَ إلى صفحة BrowserStack الرئيسية، فستجد بعض الميزات الأساسية المفيدة الأخرى ضمن خيار قائمة "المزيد More" مثل:
</p>

<ul>
	<li>
		التجاوب مع الشاشات Responsive: أدخِل عنوان URL واضغط على إنشاء Generate، وسيحمّل BrowserStack عنوان URL على أجهزة متعددة ذات أحجام إطار عرض مختلفة، كما يمكنك في كل جهاز ضبط الإعدادات أكثر مثل حجم الشاشة للحصول على فكرة جيدة عن كيفية عمل تخطيط موقعك باستخدام عوامل الأشكال المختلفة.
	</li>
	<li>
		لقطات الشاشة Screenshots: أدخِل عنوان URL واختر المتصفحات/الأجهزة/المنصات التي تريدها، ثم اضغط على إنشاء لقطات شاشة Generate Screenshots، ثم سيأخذ BrowserStack لقطات شاشة لموقعك في جميع تلك المتصفحات ويجعلها متاحةً لك لعرضها وتنزيلها.
	</li>
</ul>

<h4>
	الخيارات المتقدمة: واجهة BrowserStack <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>
</h4>

<p>
	يحتوي نظام BrowserStack على واجهة برمجة تطبيقات مريحة تتيح لك استرداد تفاصيل خطة حسابك وجلساتك وعمليات البناء برمجيًا، كما يحتوي على العديد من العملاء المتاحين للسماح لك بإجراء استدعاءات لواجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> باستخدام بيئتك المفضلة سواءً كانت PHP أو Java أو Node.js أو غيرها.
</p>

<p>
	لنلقِ نظرةً سريعةً على كيفية وصولنا إلى واجهة برمجة التطبيقات باستخدام Node.js.
</p>

<p>
	أعِدّ أولًا مشروع npm جديدًا للاختبار كما ذكرنا سابقًا، واستخدم اسم مجلد مختلف مثل bstack-test.
</p>

<p>
	ثانيًا، أنشئ ملفًا جديدًا ضمن جذر مشروعك بالاسم call_bstack.js وضَع فيه المحتويات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_87" style=""><span class="kwd">const</span><span class="pln"> request </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">"request"</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">let</span><span class="pln"> bsUser </span><span class="pun">=</span><span class="pln"> </span><span class="str">"BROWSERSTACK_USERNAME"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> bsKey </span><span class="pun">=</span><span class="pln"> </span><span class="str">"BROWSERSTACK_ACCESS_KEY"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> baseUrl </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">https</span><span class="pun">:</span><span class="com">//${bsUser}:${bsKey}@www.browserstack.com/automate/`;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> getPlanDetails</span><span class="pun">(){</span><span class="pln">
    request</span><span class="pun">({</span><span class="pln"> uri</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">baseUrl</span><span class="pun">}</span><span class="pln">plan</span><span class="pun">.</span><span class="pln">json</span><span class="pun">`</span><span class="pln"> </span><span class="pun">},</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">,</span><span class="pln"> body</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">JSON</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">body</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
    </span><span class="com">/* Response:
    {
        automate_plan: &lt;string&gt;,
        parallel_sessions_running: &lt;int&gt;,
        team_parallel_sessions_max_allowed: &lt;int&gt;,
        parallel_sessions_max_allowed: &lt;int&gt;,
        queued_sessions: &lt;int&gt;,
        queued_sessions_max_allowed: &lt;int&gt;
    }
    */</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

getPlanDetails</span><span class="pun">();</span></pre>

<p>
	ثالثًا، املأ اسم مستخدِم BrowserStack ومفتاح <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> في الأماكن المشار إليها، ويمكن استرجاعها من [لوحة تحكم BrowserStack](https://www.browserstack.com/automate الآلية).
</p>

<p>
	رابعًا، تأكد من حفظ كل شيء وشغّل ملفك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_89" style=""><span class="pln">node call_bstack</span></pre>

<p>
	سنقدِّم فيما يلي بعض الدوال الأخرى الجاهزة المفيدة عند العمل مع واجهة برمجة تطبيقات BrowserStack:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_95" style=""><span class="kwd">function</span><span class="pln"> getBuilds</span><span class="pun">(){</span><span class="pln">
  request</span><span class="pun">({</span><span class="pln"> uri</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">baseUrl</span><span class="pun">}</span><span class="pln">builds</span><span class="pun">.</span><span class="pln">json</span><span class="pun">`</span><span class="pln"> </span><span class="pun">},</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">,</span><span class="pln"> body</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* Response:
  [
    {
      automation_build: {
        name: &lt;string&gt;,
        duration: &lt;int&gt;,
        status: &lt;string&gt;,
        hashed_id: &lt;string&gt;
      }
    },
    {
      automation_build: {
        name: &lt;string&gt;,
        duration: &lt;int&gt;,
        status: &lt;string&gt;,
        hashed_id: &lt;string&gt;
      }
    },
    ...
  ]
  */</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> getSessionsInBuild</span><span class="pun">(</span><span class="pln">build</span><span class="pun">){</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> buildId </span><span class="pun">=</span><span class="pln"> build</span><span class="pun">.</span><span class="pln">automation_build</span><span class="pun">.</span><span class="pln">hashed_id</span><span class="pun">;</span><span class="pln">
  request</span><span class="pun">({</span><span class="pln"> uri</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">baseUrl</span><span class="pun">}</span><span class="pln">builds</span><span class="pun">/</span><span class="pln">$</span><span class="pun">{</span><span class="pln">buildId</span><span class="pun">}/</span><span class="pln">sessions</span><span class="pun">.</span><span class="pln">json</span><span class="pun">`</span><span class="pln"> </span><span class="pun">},</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">,</span><span class="pln"> body</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">JSON</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">body</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
  </span><span class="com">/* Response:
  [
    {
      automation_session: {
        name: &lt;string&gt;,
        duration: &lt;int&gt;,
        os: &lt;string&gt;,
        os_version: &lt;string&gt;,
        browser_version: &lt;string&gt;,
        browser: &lt;string&gt;,
        device: &lt;string&gt;,
        status: &lt;string&gt;,
        hashed_id: &lt;string&gt;,
        reason: &lt;string&gt;,
        build_name: &lt;string&gt;,
        project_name: &lt;string&gt;,
        logs: &lt;string&gt;,
        browser_url: &lt;string&gt;,
        public_url: &lt;string&gt;,
        video_url: &lt;string&gt;,
        browser_console_logs_url: &lt;string&gt;,
        har_logs_url: &lt;string&gt;
      }
    },
    {
      automation_session: {
        name: &lt;string&gt;,
        duration: &lt;int&gt;,
        os: &lt;string&gt;,
        os_version: &lt;string&gt;,
        browser_version: &lt;string&gt;,
        browser: &lt;string&gt;,
        device: &lt;string&gt;,
        status: &lt;string&gt;,
        hashed_id: &lt;string&gt;,
        reason: &lt;string&gt;,
        build_name: &lt;string&gt;,
        project_name: &lt;string&gt;,
        logs: &lt;string&gt;,
        browser_url: &lt;string&gt;,
        public_url: &lt;string&gt;,
        video_url: &lt;string&gt;,
        browser_console_logs_url: &lt;string&gt;,
        har_logs_url: &lt;string&gt;
      }
    },
    ...
  ]
  */</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> getSessionDetails</span><span class="pun">(</span><span class="pln">session</span><span class="pun">){</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> sessionId </span><span class="pun">=</span><span class="pln"> session</span><span class="pun">.</span><span class="pln">automation_session</span><span class="pun">.</span><span class="pln">hashed_id</span><span class="pun">;</span><span class="pln">
  request</span><span class="pun">({</span><span class="pln">uri</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">baseUrl</span><span class="pun">}</span><span class="pln">sessions</span><span class="pun">/</span><span class="pln">$</span><span class="pun">{</span><span class="pln">sessionId</span><span class="pun">}.</span><span class="pln">json</span><span class="pun">`},</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">,</span><span class="pln"> body</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">JSON</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">body</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
  </span><span class="com">/* Response:
  {
    automation_session: {
      name: &lt;string&gt;,
      duration: &lt;int&gt;,
      os: &lt;string&gt;,
      os_version: &lt;string&gt;,
      browser_version: &lt;string&gt;,
      browser: &lt;string&gt;,
      device: &lt;string&gt;,
      status: &lt;string&gt;,
      hashed_id: &lt;string&gt;,
      reason: &lt;string&gt;,
      build_name: &lt;string&gt;,
      project_name: &lt;string&gt;,
      logs: &lt;string&gt;,
      browser_url: &lt;string&gt;,
      public_url: &lt;string&gt;,
      video_url: &lt;string&gt;,
      browser_console_logs_url: &lt;string&gt;,
      har_logs_url: &lt;string&gt;
    }
  }
  */</span><span class="pln">
</span><span class="pun">}</span></pre>

<h4>
	الخيارات المتقدمة: الاختبارات الآلية
</h4>

<p>
	سنغطّي تشغيل اختبارات BrowserStack الآلية في المقال التالي.
</p>

<h3>
	TestingBot
</h3>

<p>
	لنبدأ باختبار نظام TestingBot.
</p>

<ol>
	<li>
		أنشئ <a href="https://testingbot.com/users/sign_up" rel="external nofollow">حسابًا تجريبيًا في TestingBot</a>.
	</li>
	<li>
		سجّل الدخول، إذ يجب أن يحدث ذلك تلقائيًا بعد التحقق من عنوان بريدك الإلكتروني.
	</li>
</ol>

<h4>
	الأساسيات: الاختبارات اليدوية
</h4>

<p>
	تسرد لوحة تحكم TestingBot الخيارات المختلفة التي يمكنك الاختيار من بينها، وتأكَّد من أنك حاليًا في التبويب Live Web Testing.
</p>

<ol>
	<li>
		أدخِل عنوان URL للصفحة التي تريد اختبارها.
	</li>
	<li>
		اختر مجموعة المتصفح/نظام التشغيل التي تريد اختبارها من خلال تحديدها من الشبكة.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="126236" href="https://academy.hsoub.com/uploads/monthly_2023_05/11_screen_shot_2019-04-19_at_14_55_33.png.5e4d8833d38b5c0bf42a82696ad1991e.png" rel=""><img alt="11_screen_shot_2019-04-19_at_14.55.33.png" class="ipsImage ipsImage_thumbnailed" data-fileid="126236" data-ratio="50.67" data-unique="eqryjxwcd" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_05/11_screen_shot_2019-04-19_at_14_55_33.thumb.png.175c2e02b78b9e77ea6586ddefb59170.png"></a>
</p>

<ol start="3">
	<li>
		<p>
			إذا نقرت على "بدء المتصفح Start Browser"، فستظهر شاشة تحميل تشغّل آلة افتراضية تعمل عليها المجموعة التي اخترتها.
		</p>
	</li>
	<li>
		<p>
			يمكنك بعد انتهاء التحميل البدء في اختبار موقع الويب الذي يعمل في المتصفح المختار عن بُعد.
		</p>
	</li>
	<li>
		<p>
			يمكنك رؤية تخطيط الموقع كما سيبدو في المتصفح الذي تختبره، وتحريك الفأرة والنقر على الأزرار وما إلى ذلك، كما تتيح لك القائمة الجانبية ما يلي:
		</p>

		<ul>
			<li>
				إيقاف الجلسة.
			</li>
			<li>
				تغيير دقة الشاشة.
			</li>
			<li>
				نسخ نصوص أو ملاحظات إلى حافظة بعيدة.
			</li>
			<li>
				أخذ لقطات شاشة وتحريرها وتنزيلها.
			</li>
			<li>
				الاختبار في وضع ملء الشاشة.
			</li>
		</ul>
	</li>
</ol>

<p>
	ستعود إلى الصفحة Live Web Testing بعد إيقاف الجلسة، حيث سترى مدخلةً لكل جلسة من الجلسات اليدوية السابقة التي بدأتها، كما سيؤدي النقر على إحدى هذه المدخلات إلى إظهار المزيد من بيانات الجلسة، إذ يمكنك تنزيل لقطات الشاشة التي التقطتها ومشاهدة مقطع فيديو للاختبار وعرض سجلات الجلسة.
</p>

<h4>
	الخيارات المتقدمة: واجهة TestingBot <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>
</h4>

<p>
	يحتوي نظام TestingBot على واجهة برمجة تطبيقات مريحة تتيح لك استرداد تفاصيل حسابك والاختبارات الحالية برمجيًا، وإضافة تعليقات توضيحية إلى الاختبارات مع مزيد من التفاصيل مثل حالة النجاح أو الفشل التي لا يمكن تسجيلها باستخدام الاختبار اليدوي وحده، كما يحتوي TestingBot على العديد من عملاء واجهة برمجة التطبيقات الذين يمكنك استخدامهم للتفاعل معها بما في ذلك عملاء NodeJS و Python و Ruby و Java و PHP.
</p>

<p>
	سنوضّح فيما يلي مثالًا عن كيفية التفاعل مع واجهة TestingBot <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> مع اختبار عميل NodeJS وهو testingbot-api:
</p>

<p>
	أعِدّ أولًا مشروع npm جديدًا للاختبار كما تحدثنا سابقًا، واستخدِم اسم مجلد مختلف مثل tb-test.
</p>

<p>
	ثانيًا، ثبّت مغلّف Node TestingBot باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_97" style=""><span class="pln">npm install testingbot</span><span class="pun">-</span><span class="pln">api</span></pre>

<p>
	ثالثًا، أنشئ ملفًا جديدًا ضمن جذر مشروعك بالاسم tb.js وضَع فيه المحتويات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_99" style=""><span class="kwd">const</span><span class="pln"> </span><span class="typ">TestingBot</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'testingbot-api'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">let</span><span class="pln"> tb </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">TestingBot</span><span class="pun">({</span><span class="pln">
  api_key</span><span class="pun">:</span><span class="pln"> </span><span class="str">"your-tb-key"</span><span class="pun">,</span><span class="pln">
  api_secret</span><span class="pun">:</span><span class="pln"> </span><span class="str">"your-tb-secret"</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

tb</span><span class="pun">.</span><span class="pln">getTests</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> tests</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">tests</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	رابعًا، املأ مفتاح TestingBot Key و Secret في الأماكن المشار إليها، حيث يمكنك العثور عليها في لوحة تحكم TestingBot.
</p>

<p>
	أخيرًا، تأكد من حفظ كل شيء وشغّل الملف كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2850_101" style=""><span class="pln">node tb</span><span class="pun">.</span><span class="pln">js</span></pre>

<h4>
	الخيارات المتقدمة: الاختبارات الآلية
</h4>

<p>
	سنغطّي تشغيل اختبارات TestingBot الآلية في المقال التالي.
</p>

<h2>
	الخلاصة
</h2>

<p>
	يمكنك الآن البدء في رؤية فوائد استخدام أدوات الاختبار الآلية لمساعدتك في عملية اختبار مواقع الويب، وسنتطرق في المقال التالي إلى إعداد نظام الاختبارات الآلية المحلي باستخدام Selenium وكيفية دمجه مع خدمات مثل Sauce Labs و BrowserStack و TestingBot.
</p>

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Automated_testing" rel="external nofollow">Introduction to automated testing</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/design/user-experience/%D8%A8%D8%B9%D8%B6-%D8%A7%D9%84%D9%85%D8%B4%D9%83%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%82%D8%A7%D8%A8%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AC%D9%86%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AD%D8%B5%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D9%85%D8%B1%D8%A7%D8%AC%D8%B9%D8%A7%D8%AA-%D8%B5%D8%A7%D8%AF%D9%82%D8%A9-r808/" rel="">بعض المشكلات الشائعة في اختبار قابلية الاستخدام وكيفية تجنبها للحصول على مراجعات صادقة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/user-experience/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%82%D8%A7%D8%A8%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D9%82%D8%A8-unmoderated-usability-testing-r789/" rel="">قابلية الاستخدام وأهميتها في تجربة المستخدم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A3%D8%AB%D9%86%D8%A7%D8%A1-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1988/" rel="">كيفية اكتشاف دعم المتصفحات للميزات أثناء اختبار مشاريع الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">مدخل إلى اختبار مشاريع الويب للتوافق مع المتصفحات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1989</guid><pubDate>Fri, 26 May 2023 16:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x643;&#x62A;&#x634;&#x627;&#x641; &#x62F;&#x639;&#x645; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x644;&#x644;&#x645;&#x64A;&#x632;&#x627;&#x62A; &#x623;&#x62B;&#x646;&#x627;&#x621; &#x627;&#x62E;&#x62A;&#x628;&#x627;&#x631; &#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A3%D8%AB%D9%86%D8%A7%D8%A1-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1988/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/---------.png.766a2417452bd0d523ca9b75c75f0621.png" /></p>
<p>
	يتضمن اكتشاف الميزات Feature Detection معرفة ما إذا كان المتصفح يدعم كتلةً معينةً من الشيفرة البرمجية ويشغّل شيفرةً مختلفةً اعتمادًا على ذلك، بحيث يمكن للمتصفح دائمًا توفير تجربة عمل ناجحة بدلًا من التعطل أو ظهور الأخطاء في بعض المتصفحات، ويوضح هذا المقال بالتفصيل كيفية كتابة شيفرة اكتشاف المتصفحات للميزات البسيطة وكيفية استخدام مكتبة لتسريع التطبيق والميزات الأصيلة Native لاكتشاف الميزات مثل الميزة <code>‎@supports</code>.
</p>

<ul>
	<li>
		<strong>المتطلبات الأساسية</strong>: يجب أن تتعلم أساسيات لغات <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت JavaScript</a>، وأن تكون لديك فكرة عن <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">المبادئ عالية المستوى لاختبار التوافق مع المتصفحات</a>.
	</li>
	<li>
		<strong>الهدف</strong>: فهم مفهوم اكتشاف الميزات والقدرة على تطبيق الحلول المناسبة في شيفرة CSS وجافاسكربت.
	</li>
</ul>

<h2>
	مفهوم اكتشاف الميزات
</h2>

<p>
	تكمن الفكرة وراء اكتشاف الميزات Feature Detection في أنه يمكنك إجراء اختبار لتحديد ما إذا كانت الميزة مدعومةً في المتصفح الحالي ثم تشغيل الشيفرة البرمجية شرطيًا لتوفير تجربة مقبولة في كل من المتصفحات التي تدعم الميزة والمتصفحات التي لا تدعمها، فإذا لم تطبّق ذلك، فلن تعرض المتصفحات التي لا تدعم الميزات التي تستخدمها في شيفرتك البرمجية الخاصة مواقعَك بصورة صحيحة وستفشل، مما يخلق <a href="https://academy.hsoub.com/design/user-experience/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-user-experience-r149/" rel="">تجربة مستخدِم</a> سيئة.
</p>

<p>
	لنطّلع على المثال الذي تطرقنا إليه في مقال <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1972/" rel="">معالجة المشاكل الشائعة للتوافق مع المتصفحات المختلفة في شيفرة جافاسكربت</a>، إذ كان لدينا واجهة Geolocation <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> التي تعرض بيانات الموقع المتاحة للجهاز الذي يعمل عليه متصفح الويب، ولهذه الواجهة نقطة دخول رئيسية لاستخدامها وهي الخاصية <code>geolocation</code> التي يوفرها الكائن العام <code>Navigator</code>، لذا يمكنك اكتشاف ما إذا كان المتصفح يدعم تحديد الموقع الجغرافي أم لا باستخدام الشيفرة البرمجية التالية مثلًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5681_10" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">"geolocation"</span><span class="pln"> in navigator</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="pln">function</span><span class="pun">(</span><span class="pln">position</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// اعرض الموقع على الخريطة باستخدام‫ واجهة Google Maps API مثلًا</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// اجعل المستخدِم يختار من بين الخرائط الساكنة بدلًا من ذلك</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاكتشاف ميزة واحدة، تكفي تعليمة <code>if</code> ولكن يُفضَّل استخدام مكتبة اكتشاف ميزات مُنشَأة مسبقًا من أجل التطبيقات المعقّدة بدلًا من كتابة مكتبتك طوال الوقت، إذ تُعَدّ <a href="https://academy.hsoub.com/programming/html/html5/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-modernizr-r3/" rel="">مكتبة مودرنيزر Modernizr</a> المعيار القياسي لاختبارات اكتشاف الميزات وسنتطرق إليها لاحقًا.
</p>

<p>
	لا تخلط بين اكتشاف الميزات والتعرف على المتصفح Browser Sniffing -أي اكتشاف المتصفح المُحدَّد الذي يصل إلى الموقع- الذي يُعَدّ ممارسةً سيئةً يجب عدم استخدامها، وراجع فقرة استخدام شيفرة التعرف على المتصفح السيئة من مقال <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1972/" rel="">معالجة المشاكل الشائعة للتوافق مع المتصفحات المختلفة في شيفرة جافاسكربت</a> للتعرف على مزيد من التفاصيل.
</p>

<h2>
	كتابة اختباراتك الخاصة لاكتشاف الميزات
</h2>

<p>
	سنتعرّف في هذا القسم على تطبيق اختباراتك الخاصة لاكتشاف الميزات في كل من شيفرة <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">CSS</a> و<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">جافاسكربت</a>.
</p>

<h3>
	شيفرة CSS
</h3>

<p>
	يمكنك كتابة اختبارات لميزات CSS من خلال اختبار وجود خاصيات <code>element.style.property</code> -مثل الخاصية <code>paragraph.style.transform</code>- في شيفرة جافاسكربت.
</p>

<p>
	يمكن أن يكون المثال التقليدي لذلك هو اختبار دعم قيمة <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Subgrid" rel="external nofollow">subgrid</a> ضمن <a href="https://academy.hsoub.com/programming/css/%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-layout-r527/" rel="">التخطيط الشبكي Grid</a> في المتصفح، إذ يمكننا استعمال القيمة <code>subgrid</code> التخطيط الشبكي الفرعي مع <code>grid-template-columns</code> و <code>grid-template-rows</code> في المتصفحات التي تدعم ضمن التخطيط الشبكي أما في المتصفحات التي لا تدعهما فنستخدم التخطيط الشبكي العادي ولكن لن تكون كما نريد مع <code>subgrid</code>.
</p>

<p>
	بناء على المثال السابق، يمكن أن نضيف ملف تنسيق stylesheet ضمن الترويسة <code>head</code> في ملف HTML الأول فيه تنفيذ كل <code>subgrid</code> وذلك إن كانت مدعومة في المتصفح والآخر يستعمل التخطيط الشبكي العادي إن لم تكن مدعومة وذلك لتعويض نقص الدعم الحاصل وتجنب اختلال التنسيق، بالشكل التالي مثلًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5681_15" style=""><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"basic-styling.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"conditional"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"grid-layout.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	يضيف هنا الملف basic-styling.css كل تنسيقات الصفحة المشتركة والمتوافقة لكل المتصفحات، وبالإضافة له يوجد ملفين CSS آخرين الذين أشرنا إليهما قبل قليل، الأول grid-layout.css والثاني subgrid-layout.css وسنضمن ملفًا منهما بناءً على دعم <code>subgrid</code> في المتصفح وسنستعمل لغة جافاسكربت JavaScript لاختبار دعمها ثم نُحدِّث قيمة <code>href</code> الذي يشير إليه العنصر <a href="https://wiki.hsoub.com/HTML/link" rel="external"><code>&lt;link&gt;</code></a> الثاني في الشيفرة السابقة أي ذي الصنف <code>class="conditional"‎</code> بناء على دعم المتصفح.
</p>

<p>
	نضيف وسم <code>&lt;script&gt;&lt;/script&gt;</code> إلى ملف HTML في الجزء السفلي من العنصر <code>body</code> قبل وسم الإغلاق <code>&lt;‎/body&gt;</code> مباشرة يحوي الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_17" style=""><span class="kwd">const</span><span class="pln"> conditional </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">".conditional"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">CSS</span><span class="pun">.</span><span class="pln">supports</span><span class="pun">(</span><span class="str">"grid-template-columns"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"subgrid"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  conditional</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"href"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"subgrid-layout.css.css"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	اختبرنا في الشيفرة السابقة إن كانت الخاصية <code>grid-template-columns</code> تدعم القيمة <code>subgrid</code> باستعمال التابع <a href="https://developer.mozilla.org/en-US/docs/Web/API/CSS/supports_static" rel="external nofollow"><code>CSS.support()‎</code></a>.
</p>

<h4>
	‎@supports
</h4>

<p>
	استخدَمتْ لغة CSS في الآونة الأخيرة آليةً لاكتشاف ميزاتها الأصيلة وهي <a href="https://wiki.hsoub.com/CSS/@supports" rel="external"><code>‎@supports</code></a> باستخدام القاعدة @ التي تعمل بطريقة مشابهة لاستعلامات الوسائط Media Queries باستثناء أنها تطبّق شيفرة CSS بطريقة انتقائية بناءً على ما إذا كانت ميزة CSS مدعومة، بدلًا من تطبيق شيفرة CSS بطريقة انتقائية اعتمادًا على ميزة وسائط مثل الدقة أو عرض الشاشة أو نسبة العرض إلى الارتفاع aspect ratio.
</p>

<p>
	يمكننا إعادة كتابة مثالنا السابق باستخدام <code>‎@supports</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5681_19" style=""><span class="pun">@</span><span class="pln">supports </span><span class="pun">(</span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> subgrid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  main </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> minmax</span><span class="pun">(</span><span class="lit">100px</span><span class="pun">,</span><span class="pln"> auto</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> subgrid</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80px</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">.</span><span class="pln">subitem </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تطبّق كتلة قاعدة @ تنسيق CSS فيها فقط إذا دعم المتصفح الحالي التصريح <code>grid-template-columns: subgrid;‎</code>. ويجب تضمين تصريح كامل (وليس مجرد اسم خاصية فقط) وعدم تضمين فاصلة منقوطة في النهاية لكي يعمل كل شرط.
</p>

<p>
	يتوفر لدى <code>‎@supports</code> العبارات المنطقية <code>OR</code> و <code>NOT</code> و <code>AND</code>، فمثلًا ستطبق الكتلة التالية تنسيق التخطيط الشبكي grid العادي إن لم يكن المتصفح يدعم <code>subgrid</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5681_21" style=""><span class="pun">@</span><span class="pln">supports not </span><span class="pun">(</span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> subgrid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* ضع القواعد هنا */</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن يبدو ذلك ملائمًا أكثر من المثال السابق، إذ يمكننا تطبيق اكتشاف الميزات في CSS دون الحاجة إلى شيفرة جافاسكربت، ويمكننا التعامل مع جميع العبارات المنطقية في ملف CSS واحد مع تقليل <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-r73/" rel="">طلبات HTTP</a>، لذا هذه هي الطريقة المفضلة في اكتشاف الميزات دون اللجوء إلى جافاسكربت.
</p>

<h3>
	شيفرة جافاسكربت
</h3>

<p>
	رأينا مثالًا لاختبار اكتشاف <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">ميزات جافاسكربت</a> في وقت سابق، كما يمكن إجراء هذه الاختبارات عبر أحد الأنماط الشائعة القليلة.
</p>

<p>
	ضع في بالك أن بعض الميزات معروفة بعدم قابليتها للاكتشاف، ارجع إلى صفحة <a href="https://github.com/Modernizr/Modernizr/wiki/Undetectables" rel="external nofollow">Undetectables</a> بدءًا من عام 2016.
</p>

<p>
	إليك بعضًا من الأنماط الشائعة للميزات القابلة للاكتشاف:
</p>

<h4>
	عضو في كائن
</h4>

<p>
	تحقق مما إذا كان هناك تابع أو خاصية معينة (تكون عادةً نقطة دخولٍ إلى استخدام <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> أو ميزة أخرى تريد اكتشافها) موجودةً في الكائن الأب <code>Object</code>.
</p>

<p>
	رأينا في مثال سابق استخدامًا لهذا النمط عند اكتشاف دعم واجهة <a href="https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API" rel="external nofollow">Geolocation</a> وذلك بفحص وجود العضو <code>geolocation</code> في الكائن <code>navigator</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_27" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">"geolocation"</span><span class="pln"> in navigator</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// navigator.geolocation الوصول إلى الواجهة</span><span class="pln">
</span><span class="pun">}</span></pre>

<h4>
	خاصية في عنصر
</h4>

<p>
	أنشئ عنصرًا في الذاكرة باستخدام التابع <code>Document.createElement()‎</code> ثم تحقق من وجود خاصية فيه، ويوضح هذا المثال طريقةً لاكتشاف دعم الواجهة <a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" rel="external nofollow">Canvas <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_29" style=""><span class="kwd">function</span><span class="pln"> supports_canvas</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"canvas"</span><span class="pun">).</span><span class="pln">getContext</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">supports_canvas</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ‫ إنشاء عناصر canvas واستخدامها</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: استخدمنا <code>!!</code> في المثال السابق وذلك لتحويل أي نوع بيانات إلى قيمة منطقية <code>true</code> أو <code>false</code>.
</p>

<h4>
	تابع في عنصر يعيد قيمة
</h4>

<p>
	أنشئ عنصرًا في الذاكرة باستخدام <code>Document.createElement()‎</code> ثم تحقق من وجود تابع فيه، فإذا كان موجودًا، فتحقق من القيمة التي يعيدها.
</p>

<p>
	اطلع على <a href="https://diveinto.html5doctor.com/detect.html#video-formats" rel="external nofollow">اختبار اكتشاف تنسيقات الفيديو في HTML5</a>
</p>

<h4>
	خاصية في عنصر تحتفظ بقيمة
</h4>

<p>
	أنشئ عنصرًا في الذاكرة باستخدام التابع <code>Document.createElement()‎</code> ثم اضبط خاصيةً على قيمة معينة، ثم تحقق من الاحتفاظ بالقيمة.
</p>

<p>
	<strong>ملاحظة</strong>: تُعَدّ قيمة <code>NOT</code> المُضاعفَة في المثال السابق (<code>!!</code>) طريقةً لإجبار القيمة المُعادة لتصبح قيمة منطقية مناسبة بدلًا من القيمة <code>true</code> أو <code>false</code> التي يمكن أن تؤدي إلى تحريف النتائج.
</p>

<p>
	اطّلع على <a href="https://academy.hsoub.com/programming/html/html5/%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-html5-r340/" rel="">مقال اكتشاف دعم المتصفحات لميزات HTML5</a> للعثور على مزيد من المعلومات، وضَع في الحسبان أنه توجد بعض الميزات التي لا يمكن اكتشافها بالرغم من كل ذلك.
</p>

<h4>
	الميزة matchMedia
</h4>

<p>
	تتيح ميزة جافاسكربت <code>Window.matchMedia</code> تشغيل اختبارات استعلام الوسائط ضمن شيفرة جافاسكربت، وتبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_31" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">window</span><span class="pun">.</span><span class="pln">matchMedia</span><span class="pun">(</span><span class="str">"(max-width: 480px)"</span><span class="pun">).</span><span class="pln">matches</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// شغّل شيفرة جافاسكربت هنا</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يستخدِم تطبيق <a href="https://github.com/chrisdavidmills/snapshot" rel="external nofollow">Snapshot</a> مثلًا هذه الميزة لتطبيق مكتبة جافاسكربت Brick بطريقة انتقائية ويستخدِمها للتعامل مع تخطيط واجهة المستخدم لتخطيط الشاشات الصغيرة فقط (480 بكسل أو أقل)، كما نستخدِم أولًا السمة <code>media</code> لتطبيق مكتبة Brick CSS على الصفحة إذا كان عرض الصفحة 480 بكسل أو أقل فقط:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5681_34" style=""><span class="tag">&lt;link</span><span class="pln">
  </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"dist/brick.css"</span><span class="pln">
  </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln">
  </span><span class="atn">media</span><span class="pun">=</span><span class="atv">"all and (max-width: 480px)"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	نستخدِم بعد ذلك <code>matchMedia()‎</code> في جافاسكربت عدة مرات لتشغيل دوال التنقل في مكتبة Brick مع تخطيط الشاشة الصغيرة فقط، ويمكن رؤية كل شيء دفعةً واحدةً في تخطيطات الشاشة الأوسع، لذلك لا نحتاج للتنقل بين العروض المختلفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_36" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">window</span><span class="pun">.</span><span class="pln">matchMedia</span><span class="pun">(</span><span class="str">"(max-width: 480px)"</span><span class="pun">).</span><span class="pln">matches</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  deck</span><span class="pun">.</span><span class="pln">shuffleTo</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	استخدام مكتبة Modernizr لتطبيق اكتشاف الميزات
</h2>

<p>
	يمكن تنفيذ اختبارات اكتشاف الميزات باستخدام تقنيات مثل التقنيات التي أوضحناها سابقًا، ويمكنك استخدام مكتبة مخصَّصة لاكتشاف الميزات لأنها تسهّل الأمور كثيرًا. تُعَد مكتبة Modernizr أساس جميع مكتبات اكتشاف الميزات، ويمكنها اكتشاف كل ما تحتاجه في أي وقت، ولنلقِ نظرةً على كيفية استخدامها.
</p>

<p>
	يمكنك استخدام بناء التطوير الذي يتضمن كل اختبار ممكن لاكتشاف الميزات عندما تجرّب مكتبة Modernizr، لذا نزّل بناء التطوير كما يلي:
</p>

<ol>
	<li>
		انقر على رابط <a href="https://modernizr.com/download?do_not_use_in_production" rel="external nofollow">بناء التطوير</a>.
	</li>
	<li>
		انقر على زر "البناء Build" الوردي الكبير على الصفحة التي تظهر.
	</li>
	<li>
		انقر على رابط "التنزيل Download" الأعلى في مربع الحوار الذي يظهر.
	</li>
</ol>

<p>
	احفظه في مكان ما مثل المجلد الذي تنشئ أمثلتك الأخرى فيه.
</p>

<p>
	إذا أردت استخدام مكتبة Modernizr في عملية الإنتاج، فيمكنك الانتقال إلى صفحة التنزيل التي زرتها سابقًا ثم النقر على أزرار علامة الزائد للاطلاع على الميزات التي تريد اكتشافها فقط، وستنزّل بعد ذلك عند النقر على زر "البناء Build" بناءً مخصَّصًا يحتوي فقط على تلك الميزات التي جرى اكتشافها، مما يجعل حجم الملف أصغر بكثير.
</p>

<h3>
	شيفرة CSS
</h3>

<p>
	لنلقِ نظرةً على كيفية عمل مكتبة Modernizr من حيث التطبيق الانتقائي لشيفرة CSS.
</p>

<p>
	أنشئ أولًا نسخةً من الملفين <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/supports-feature-detect.html" rel="external nofollow">supports-feature-detect.html</a> و <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/supports-styling.css" rel="external nofollow">supports-styling.css</a> ثم احفظهما بالاسم <code>modernizr-css.html</code> و <code>modernizr-css.css</code>.
</p>

<p>
	ثانيًا، عدّل العنصر <code>&lt;link&gt;</code> في شيفرة HTML بحيث يشير إلى ملف CSS الصحيح، ويجب تعديل <a href="https://wiki.hsoub.com/HTML/title" rel="external">العنصر &lt;title&gt;</a> إلى شيء أكثر ملاءمةً:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5681_39" style=""><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"modernizr-css.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="tag">&gt;</span></pre>

<p>
	ثالثًا، أضِف العنصر <code>&lt;script&gt;</code> قبل عنصر <code>&lt;link&gt;</code> لتطبيق مكتبة Modernizr على الصفحة، إذ يجب تطبيق ذلك على الصفحة قبل أيّ شيفرة CSS (أو جافاسكربت) تستخدِمها.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5681_41" style=""><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"modernizr-custom.js"</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

<p>
	رابعًا، عدّل وسم الفتح <code>&lt;html&gt;</code> بحيث يبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5681_43" style=""><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en-us"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"no-js"</span><span class="tag">&gt;</span><span class="pln">
  …
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	جرّب تحميل صفحتك، وستحصل على فكرة عن كيفية عمل مكتبة Modernizr مع ميزات CSS، فإذا ألقيت نظرةً على فاحص <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">DOM</a> الخاص بأدوات المطور في متصفحك، فسترى أنّ مكتبة Modernizr قد حدّثت قيمة صنف <code>class</code> <a href="https://wiki.hsoub.com/HTML/html" rel="external">العنصر &lt;html&gt;</a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5681_46" style=""><span class="tag">&lt;html</span><span class="pln">
  </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"js no-htmlimports no-proximity sizes no-flash transferables applicationcache blobconstructor blob-constructor no-contextmenu (and loads of more values)"</span><span class="tag">&gt;</span><span class="pln">
  …
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	يحتوي هذا العنصر الآن على عدد كبير من الأصناف التي تشير إلى حالة دعم ميزات التقنيات المختلفة، فإذا لم يدعم المتصفح الميزة التخطيط الشبكي grid مثلًا على الإطلاق، فسيُعطَى العنصر <code>&lt;html&gt;</code> اسم الصنف <code>no-cssgrid</code>، كما هنالك عدة أصناف أخرى متعلقة مثلًا بالتخطيط grid مثل <code>cssgridlegacy</code> أو <code>no-cssgridlegacy</code> بناء على دعم المتصفح للإصدار القديم legacy من التخطيط الشبكي.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك الاطلاع على قائمة الأصناف الكاملة وما تعنيه أسماؤها وما تقوم به بالرجوع إلى صفحة <a href="https://modernizr.com/docs/#features" rel="external nofollow">Features detected</a> من Modernizr.
</p>

<p>
	لسوء الحظ لا تفحص مكتبة Modernizr دعم بعض ميزات CSS الجديدة مثل <code>subgrid</code> التي رأيتها للتو وغيرها ولو كانت تفعل ذلك، لكنا عدلنا مثال <code>‎@support</code> السابق بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5681_49" style=""><span class="pln">main </span><span class="pun">{</span><span class="pln">
  display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  grid</span><span class="pun">-</span><span class="kwd">template</span><span class="pun">-</span><span class="pln">columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
  grid</span><span class="pun">-</span><span class="kwd">template</span><span class="pun">-</span><span class="pln">rows</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> minmax</span><span class="pun">(</span><span class="lit">100px</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
  display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  grid</span><span class="pun">-</span><span class="pln">column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">
  grid</span><span class="pun">-</span><span class="pln">row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
  grid</span><span class="pun">-</span><span class="kwd">template</span><span class="pun">-</span><span class="pln">rows</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80px</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">‫</span><span class="com">/* ‫خاصيات المتصفحات مع خاصية subgrid الحديثة */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">csssubgrid </span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
  grid</span><span class="pun">-</span><span class="kwd">template</span><span class="pun">-</span><span class="pln">columns</span><span class="pun">:</span><span class="pln"> subgrid</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">csssubgrid </span><span class="pun">.</span><span class="pln">subitem </span><span class="pun">{</span><span class="pln">
  grid</span><span class="pun">-</span><span class="pln">column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
  grid</span><span class="pun">-</span><span class="pln">row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">‫</span><span class="com">/* ‫الإجراءات الاحتياطية للمتصفحات التي لا تدعم خاصية subgrid الحديثة */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">no</span><span class="pun">-</span><span class="pln">csssubgrid </span><span class="pun">.</span><span class="pln">subitem </span><span class="pun">{</span><span class="pln">
  display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
  flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">33</span><span class="pun">%;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك استهداف المتصفحات التي تدعم أو التي لا تدعم ميزة معينة باستخدام محددات أحفاد معينة بسبب وضع جميع أسماء الأصناف في العنصر <code>&lt;html&gt;</code>. لذلك طبّقنا هنا المجموعة العليا من القواعد فقط على المتصفحات التي تدعم subgrid ومجموعة القواعد السفلية فقط على المتصفحات التي لا تدعمها.
</p>

<p>
	<strong>ملاحظة</strong>: ضع في الحسبان أنّ جميع اختبارات ميزات HTML وجافاسكربت الخاصة بمكتبة Modernizr تُذكَر في أسماء الأصناف، لذلك يمكنك تطبيق شيفرة CSS بطريقة انتقائية بناءً على دعم المتصفح لميزات HTML أو جافاسكربت إذا لزم الأمر.
</p>

<h3>
	شيفرة جافاسكربت
</h3>

<p>
	مكتبة Modernizr مُهيَّأة جيدًا لتطبيق اكتشاف ميزات جافاسكربت من خلال توفير كائن <code>Modernizr</code> العام للصفحة التي تُطبَّق عليها، ويحتوي هذا الكائن على نتائج اكتشاف الميزات بوصفها خاصيات <code>true</code> أو <code>false</code>.
</p>

<p>
	حمّل المثال <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/modernizr-css.html" rel="external nofollow"><code>modernizr-css.html</code></a> في متصفحك، ثم حاول الانتقال إلى طرفية جافاسكربت واكتب <code>Modernizr.‎</code> متبوعةً ببعض أسماء هذه الأصناف كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_54" style=""><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">flexbox
</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">xhr2
</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">fetch</span></pre>

<p>
	ستعيد الطرفية قيم <code>true</code> أو <code>false</code> للإشارة إلى ما إذا كان متصفحك يدعم هذه الميزات أم لا.
</p>

<p>
	لنلقِ نظرةً على مثال لتوضيح كيفية استخدامك لتلك الخاصيات:
</p>

<p>
	أنشئ أولًا نسخةً محليةً من الملف <a href="https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/modernizr-js.html" rel="external nofollow"><code>modernizr-js.html</code></a>.
</p>

<p>
	ثانيًا، اربط مكتبة Modernizr بشيفرة HTML باستخدام العنصر <code>&lt;script&gt;</code> كما فعلنا سابقًا ثم ضع هذا العنصر قبل العنصر <code>&lt;script&gt;</code> الموجود مسبقًا الذي يربط واجهة Google Maps <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> بالصفحة.
</p>

<p>
	املأ بعد ذلك نص العنصر البديل <code>YOUR-<abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>-KEY</code> في عنصر <code>&lt;script&gt;</code> الثاني بمفتاح Google Maps <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> صالح، ويمكنك الحصول على مفتاح من خلال تسجيل الدخول إلى حساب Google، والانتقال إلى صفحة <a href="https://developers.google.com/maps/documentation/javascript/get-api-key" rel="external nofollow">الحصول على مفتاح أو المصادقة</a> ثم انقر على الزر الأزرق "الحصول على مفتاح Get a Key" واتبع التعليمات.
</p>

<p>
	أخيرًا، أضِف عنصر <code>&lt;script&gt;</code> آخر في الجزء السفلي من العنصر <code>&lt;body&gt;</code> وقبل وسم الإغلاق &lt;‎/body&gt; مباشرةً ثم ضع السكربت التالي ضمن الوسوم:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5681_56" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Modernizr</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  navigator</span><span class="pun">.</span><span class="pln">geolocation</span><span class="pun">.</span><span class="pln">getCurrentPosition</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">position</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">let</span><span class="pln"> latlng </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> google</span><span class="pun">.</span><span class="pln">maps</span><span class="pun">.</span><span class="typ">LatLng</span><span class="pun">(</span><span class="pln">position</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">latitude</span><span class="pun">,</span><span class="pln">position</span><span class="pun">.</span><span class="pln">coords</span><span class="pun">.</span><span class="pln">longitude</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">let</span><span class="pln"> myOptions </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      zoom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln">
      center</span><span class="pun">:</span><span class="pln"> latlng</span><span class="pun">,</span><span class="pln">
      mapTypeId</span><span class="pun">:</span><span class="pln"> google</span><span class="pun">.</span><span class="pln">maps</span><span class="pun">.</span><span class="typ">MapTypeId</span><span class="pun">.</span><span class="pln">TERRAIN</span><span class="pun">,</span><span class="pln">
      disableDefaultUI</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">let</span><span class="pln"> map </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> google</span><span class="pun">.</span><span class="pln">maps</span><span class="pun">.</span><span class="typ">Map</span><span class="pun">(</span><span class="pln">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"map_canvas"</span><span class="pun">),</span><span class="pln"> myOptions</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">

</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> para </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
  para</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Argh, no geolocation!'</span><span class="pun">;</span><span class="pln">
  document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">para</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	جرب مثالك واستخدِم اختبار <code>Modernizr.geolocation</code> للتحقق مما إذا كان المتصفح الحالي يدعم تحديد الموقع الجغرافي، فإذا كان الأمر كذلك، فسنشغّل الشيفرة البرمجية التي تحدد موقع جهازك الحالي وترسمه على خريطة جوجل.
</p>

<h2>
	الخلاصة
</h2>

<p>
	لقد غطينا في هذا المقال اكتشاف دعم المتصفحات للميزات وعرضنا المفاهيم الرئيسية ووضحنا كيفية تطبيق اختبارات اكتشاف ميزاتك واستخدام مكتبة Modernizr لتطبيق الاختبارات بسهولة أكبر، وسنوضح في المقال التالي الاختبارات الآلية.
</p>

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Feature_detection" rel="external nofollow">Implementing feature detection</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1953/" rel="">مدخل إلى اختبار مشاريع الويب للتوافق مع المتصفحات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D9%84%D8%AA%D9%88%D8%A7%D9%81%D9%82-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1954/" rel="">استراتيجيات اختبارات مشاريع الويب للتوافق مع المتصفحات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-html5-r340/" rel="">اكتشاف دعم المتصفحات لميزات HTML5</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1988</guid><pubDate>Tue, 23 May 2023 16:00:00 +0000</pubDate></item><item><title>&#x644;&#x645;&#x627;&#x630;&#x627; &#x64A;&#x62C;&#x628; &#x623;&#x646; &#x62A;&#x639;&#x644;&#x645; &#x637;&#x641;&#x644;&#x643; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%A3%D9%86-%D8%AA%D8%B9%D9%84%D9%85-%D8%B7%D9%81%D9%84%D9%83-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9%D8%9F-r2052/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/---.png.5314abbb47c495c03602e97fd8c2676d.png" /></p>
<p>
	البرمجة مهنة المستقبل بكل تأكيد، وأثر تعلم البرمجة على الأطفال يتجاوز التعامل مع الحاسوب بل ستحسن مهارة حل المشكلات عند طفلك، وتنمي الإبداع، وتصقل التفكير المنطقي، وتضعه على أفضل طريق لبناء مستقبله. سنتحدث في هذا الفيديو لم عليك تعليم البرمجة لطفلك.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_9647_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="لماذا يجب أن تعلم طفلك البرمجة" width="1072" data-embed-src="https://www.youtube.com/embed/JR2n5x9KmXQ"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على  مجال البرمجة ودعم تعلمك أو تعليم طفلك، فننصحك تعلم البرمجة بنفسك ومحاولة شرحها لابنك. يمكنك البدء مع دورة <a href="https://academy.hsoub.com/learn/computer-science/" rel="">أساسيات علوم الحاسوب</a> المقدمة من أكاديمية حسوب، ولا تنسَ الاستعانة خلال هذه الرحلة بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكن متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2052</guid><pubDate>Wed, 17 May 2023 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x631;&#x627;&#x62D;&#x644; &#x628;&#x646;&#x627;&#x621; &#x645;&#x648;&#x627;&#x642;&#x639; &#x627;&#x644;&#x625;&#x646;&#x62A;&#x631;&#x646;&#x62A; &#x645;&#x646; &#x627;&#x644;&#x635;&#x641;&#x631;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D8%B5%D9%81%D8%B1-r2053/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/----(---)(1).png.0c307536d38c09be8b68ab74f87b45cb.png" /></p>
<p>
	يومًا عن يوم، يتزايد الطلب على إنشاء مواقع الانترنت أكتر وأكتر، سواءً كان هذا الطلب لغرض شخصي أو لغرض تجاري، فسواء  كنت تريد إنشاء سيرة ذاتية CV أو portfolio، مدونة أو موقع شخصي، أو حتى موقع للتجارة الإلكترونية، أيا كان الاستخدام، فمع انتشار الانترنت، بات الطلب في ازدياد متواصل. وهذا جعل مهنة مطور الويب Web Developer تزداد هي الأخرى أهميةً أكتر وأكتر.
</p>

<p>
	في هذا الفيديو، سنتحدث عن تطوير الويب، وكيفية برمجة مواقع إنترنت، حيث سنشرح المكونات الرئيسية لكل موقع، واللغات المستخدمة لاستهداف كل مكون. أيضًا، سنتحدث عن المواصفات التي يفترض أن يتميز بها المطور.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_634_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="مراحل بناء مواقع الإنترنت من الصفر" width="1072" data-embed-src="https://www.youtube.com/embed/edBBbWSdfAg"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على كيفية بناء مواقع إنترنت من الصفر بواجهتيها، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">دورة تطوير واجهات المستخدم</a> و<a href="https://academy.hsoub.com/learn/python-application-development/" rel="">دورة تطوير التطبيقات باستخدام لغة Python</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2053</guid><pubDate>Fri, 12 May 2023 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x62A;&#x62E;&#x635;&#x635; &#x647;&#x646;&#x62F;&#x633;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/general/%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_04/---.png.98099a6c5602af78675841dd2967dcc0.png" /></p>
<p>
	تنمو مجالات علوم الحاسب وهندسة البرمجيات أسرع من بقية مجالات العمل الأخرى، وتوفر للراغبين بدخوله مجموعة واسعة من الفرص والوظائف، فمعظم الصناعات اليوم تحتاج إلى مهندسي البرمجيات لتسيير أعمالها الرقمية. لذا سنشرح في مقال اليوم مجال هندسة البرمجيات الذي يعد أحد أهم التخصصات المطلوبة اليوم، ونوضح فرص العمل التي يمكن لمهندس البرمجيات التخصص بها، ونوفر مجموعة من النصائح الضرورية لتعلم هندسة البرمجيات بأقصر الطرق دون الحاجة لوجود أي خبرة تقنية مسبقة أو سلوك المسار الجامعي الطويل، ونختم المقال بأهم الميزات والتحديات المرتبطة بهذا التخصص لتكتشف بنفسك هل هذا المسار الوظيفي مناسب لك أم لا؟
</p>

<h2>
	ما هي هندسة البرمجيات؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="123387" href="https://academy.hsoub.com/uploads/monthly_2023_04/1724697829_.png.0aebff385f4087d3949dad5fa93678f6.png" rel=""><img alt="هندسة البرمجيات" class="ipsImage ipsImage_thumbnailed" data-fileid="123387" data-ratio="63.83" data-unique="98lnan9ia" style="width: 600px; height: auto;" width="857" src="https://academy.hsoub.com/uploads/monthly_2023_04/.thumb.png.c7d2b157e6598de8ca39acfa477468ff.png"> </a>
</p>

<p>
	هندسة البرمجيات Software Engineering هي تخصص يهتم بتطبيق المبادئ الهندسية في تصميم البرمجيات وتطويرها وتنفيذها، وكما تلاحظ تتكون هندسة البرمجيات من كلمتين هما البرمجيات والهندسة ولتبسيط الأمور يمكنك القول أن هندسة البرمجيات هي العلم الذي يمكنك من <strong>تطبيق مفاهيم الهندسة على البرمجة</strong>.
</p>

<p>
	فإذا كانت البرمجة هي التي تمكنك من تطوير البرامج وكتابة شيفرات قابلة للتنفيذ، فالهندسة هي التي توفر لك تقنيات وآليات تساعدك في تنظيم عملك البرمجي بأفضل طريقة ممكنة وتضمن لك الجودة في كل مرحلة من مراحل إنتاج البرمجيات بدءًا من تحليل متطلبات البرنامج مرورًا بكتابة أكواده البرمجية وانتهاءً بصيانته وتحسينه.
</p>

<p>
	ومن خلال الجمع بين البرمجة وبين مبادئ الهندسة ستتمكن من إنشاء برامج وأنظمة ضخمة واحترافية قادرة على حل جميع أنواع المشكلات التي تواجه المستخدمين والشركات وتلبية متطلباتهم مهما كانت كبيرة ومعقدة.
</p>

<h2>
	ما أهمية تخصص هندسة البرمجيات؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="123546" href="https://academy.hsoub.com/uploads/monthly_2023_04/1004859742_.png.dd8782301e60ef54afa87e3abd36e020.png" rel=""><img alt="أهمية تخصص هندسة البرمجيات" class="ipsImage ipsImage_thumbnailed" data-fileid="123546" data-ratio="62.56" data-unique="jqu3lyt6g" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_04/.thumb.png.1ee75ed6411f8e229a2fbbd2b17b9e7b.png"></a>
</p>

<p>
	برزت الحاجة إلى هندسة البرمجيات نتيجة لزيادة الطلب على البرامج والتغييرات الكبيرة في متطلبات المستخدمين والبيئات البرمجية فكان لا بد من إيجاد حل يسهّل عملية بناء هذه البرامج الضخمة واعتماد مبادئ هندسية تجعل عملية <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">تطوير البرمجيات</a> أسرع وأقل تكلفة وأسهل في التطوير وإجراء التحسينات.
</p>

<p>
	ولتوضيح الأمر بشكل أبسط لنفترض أنك تريد بناء منزل صغير وبسيط وطلبت من مقاول القيام بذلك، قد يبني لك المقاول المنزل المطلوب بنفسه بناء على خبرته العملية السابقة دون اتباع أي طرق علمية، لكن بالطبع لن يكون المنزل الذي ستحصل عليه بنفس جودة المنزل في حال بناه مهندس محترف، وقد يرتكب المقاول بعض الأخطاء البسيطة التي قد لا تنتبه لها بسبب صغر مساحة البيت وقلة حجم المتطلبات.
</p>

<p>
	الآن ماذا لو طلبت من نفس المقاول تشييد مبنى من 10 طوابق! بالطبع لن يتمكن من تلبية طلبك وقد يجازف ويوافق على طلبك وهنا ستكون الكارثة وسيفشل المشروع بعد فترة وجيزة، وقد ينهار المبنى قبل اكتماله بسبب جهل المقاول بالقواعد الأساسية التي تطبق لإنجاز البناء والنظريات المتعلقة بمقاومة المواد المطلوبة للبناء وسيتأخر إنجاز العمل ككل بسبب سوء التقديرات المناسبة للوقت والمواد المطلوبة.
</p>

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

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

<p>
	ويمكن هنا أن تلاحظ ما الفرق بين <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-r1827/" rel="">مطور التطبيقات</a> ومهندس البرمجيات، فالمبرمج يمكن أن ينفذ المشروع ويكتب الكود البرمجي الخاص به وهو ما يعرف بتحقيق المشروع أو تنفيذه "Implementation" أما مهندس البرمجيات فيقوم بأكثر من ذلك بكثير فهو يخطط ويحلل متطلبات المشروع ويقدم أنسب الحلول لتحقيق المشروع بناءً على معرفته وخبرته الهندسية قبل البدء الشروع بكتابة الكود ويكون لديه تصور واضح عن العمل الذي يتم إنجازه بكافة مراحله.
</p>

<h2>
	ما الفرق بين هندسة البرمجيات وعلوم الحاسوب؟
</h2>

<p>
	إذا كنت تتساءل عن الفرق بين هندسة البرمجيات وعلوم الحاسوب وهل هما الشيء نفسه؟ فيمكننا القول باختصار أن هندسة البرمجيات هي أحد المجالات الفرعية لعلوم الحاسوب وهي تركز على الحلول العملية وتمكننا من إنتاج برمجيات تحقق أعلى جودة بأقل وقت وتكلفة.
</p>

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

<p>
	أما <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسوب</a> فهي مجال أكثر تجريدًا وشمولية من هندسة البرمجيات ويركز بشكل أكبر على المفاهيم النظرية ومعمارية الحاسوب وطريقة عمله ويهتم بالخوارزميات ومعالجة البيانات وقواعد البيانات و<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي</a> وأمن الشبكات …إلخ.
</p>

<h2>
	كيف أتعلم هندسة البرمجيات؟
</h2>

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

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

<p>
	فيمكنك من خلال التعليم الذاتي والتدريب العملي اكتساب الخبرة الكافية كي تكون مؤهلًا للعمل في هذا المنصب، وإن كان الجمع بين المهارات والحصول على شهادة اختصاصية في مجال هندسة البرمجيات أو تطوير البرمجيات أو علوم الحاسوب أو الرياضيات أو أي مجال مشابه يوفر لك بلا شك فرصًا أفضل.
</p>

<p>
	وفي هذا الصدد أود مشاركة نتائج جديرة بالانتباه من <a href="https://survey.stackoverflow.co/2022/#developer-profile-learning-to-code" rel="external nofollow">أحدث استطلاع رأي نشره موقع Stack Overflow الشهير نهاية عام 2022</a> والذي يجمع كبار المبرمجين المحترفين حول العالم حيث أظهر أن الغالبية العظمى من المطورين المشاركين لم يتعلموا البرمجة من الكليات والجامعات وإنما تعلموها بشكل ذاتي من مصادر التعلم المختلفة والدورات التدريبية عبر الإنترنت، ولا عجب في ذلك فمصادر التعلم عبر الانترنت ليست متنوعة فحسب بل تتميز بأنها تُحدَّث باستمرار لتواكب عالم البرمجيات المتغير والمتجدد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="123545" href="https://academy.hsoub.com/uploads/monthly_2023_04/976949976_.png.dc8f3168024e17419199fa81e9bbe02f.png" rel=""><img alt="مصادر تعلم هندسة البرمجيات.png" class="ipsImage ipsImage_thumbnailed" data-fileid="123545" data-ratio="49.78" data-unique="8tqet1yqg" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_04/.thumb.png.51d67eaf9f6288c0050d784f77807f92.png"></a>
</p>

<p>
	وإذا كنت تبحث عن المزيد من الطرق والخيارات <a href="https://academy.hsoub.com/learn-programming/" rel="">لتعلم البرمجة</a> بسرعة وكفاءة، يمكنك الاطلاع على مقال <a href="ttps://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%88%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%84%D8%B1%D8%AD%D9%84%D8%AA%D9%83-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r206/" rel="">كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة</a>.
</p>

<p>
	وكي تتعلم هندسة البرمجيات تحتاج بالطبع لأن تعرف <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أساسيات البرمجة</a> وتحترف استخدام إحدى لغات البرمجة الشهيرة مثل جافا أو بايثون أو C++‎ كما تحتاج لأن تكون على دراية بأسس التفكير المنطقي والخوارزميات والأنماط البرمجية المختلفة مثل <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-r1375/" rel="">البرمجة كائنية التوجه <abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr></a> التي تسهل عليك عملية تصميم البرامج وتمكنك من تنظيمه ضمن كائنات تشبه كائنات العالم الحقيقي و<a href="https://wiki.hsoub.com/Design_Patterns" rel="external">أنماط التصميم</a> التي تمكنك من اتباع حلول محددة لحل مشاكل برمجية معينة بشيفرة مكتوبة بشكل نموذجي وموثوق.
</p>

<p>
	كما تحتاج لتعلم مفهوم <a href="https://academy.hsoub.com/devops/servers/databases/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">قواعد البيانات</a> وأنواعها المختلفة ونظم إدراة قواعد البيانات وكيفية تخزين ومعالجة البيانات فيها وإجراء العمليات المختلفة عليها لإنشاء وحفظ بيانات التطبيقات والبرامج والتعامل معها بكفاءة.
</p>

<p>
	وبالطبع ستحتاج لتعلم أساسيات الهندسة وأهمها أساسيات الرياضيات حيث قد تتطرق إلى بعض المفاهيم الهندسية والرياضية، وغالبًا إن أتيت من خلفية دراسية علمية وانتهيت من مراحل الدراسة الثانوية فهذا يكفي للبداية والانطلاق، وأيضًا تحتاج إلى فهم دورة حياة البرنامج والمنهجيات المختلفة لتطوير البرمجيات وإدارة المشاريع البرمجية وتوثيق البرمجيات وضمان جودتها وطرق اختبارها.
</p>

<p>
	عند هذه النقطة يمكنك دخول سوق العمل والبحث عن فرص باسم مهندس برمجيات ويمكنك حينها أن تتخصص في مجال برمجي محدد كتطوير الويب أو أمن المعلومات أو تطوير الألعاب أو غيرها من المجالات المتنوعة، وتتعلم التقنيات والأدوات التي تؤهلك للعمل في أحد التخصصات تلك واحترافه.
</p>

<p>
	إذا كنت مهتمًا بمعرفة المزيد عن أسس هندسة البرمجيات وترغب في مصدر يمكنك من اكتساب كافة المهارات الضرورية التي تمكنك من بدء حياتك المهنية في هذا المجال ولكنك متردد لكونك لا تملك أي معرفة مسبقة حول مبادئ عمل الحاسوب أو مفاهيم البرمجة الأساسية فقد وفرت لك أكاديمية حسوب <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a> التي تأخذ بيدك خطوة بخطوة للبدء وتدمج لك المفاهيم النظرية والعملية في دورة مكثفة غنية بالمعلومات.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_2933_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/EkvUFDevMlM"></iframe>
</p>

<p>
	تمتد دورة علوم الحاسب لأكثر من 60 ساعة تدريبية يمكنك أن تتعلم من خلالها الكثير عن الحاسوب ومكوناته وطريقة عمله وعن <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل</a> وقواعد البيانات ومبادئ البرمجة وكتابة الكود وتطوير الويب وأسس هندسة البرمجيات وغيرها الكثير من المعلومات المتجددة التي تكسبك الخبرة التي تحتاجها وتمنحك في النهاية شهادة معتمدة وتوفر لك فرصة عمل مناسبة لبدء مسارك المهني.
</p>

<h2>
	مجالات عمل اختصاص هندسة البرمجيات
</h2>

<p>
	قد تتساءل بعد أن تعلمت كل المهارات الضرورية للعمل كمهندس برمجيات أو مطور برمجيات هل يمكنني الحصول على فرصة عمل مناسبة لتخصصي وما هي مجالات العمل التي يمكنني العمل بها؟
</p>

<p>
	والجواب نعم ستجد فرصة عمل تناسبك بلا شك فالطلب على مهندسي البرمجيات في سوق العمل كبير ومتنامٍ، فلا تكاد توجد مؤسسة أو صناعة أو قطاع من قطاعات العمل في عصرنا الحالي إلا وتحتاج للحلول البرمجية والتقنية لتحسين أداء عملها وتهتم بتوظيف مهندسي البرمجيات للاستفادة من خبراتهم ومهاراتهم في تطبيق هذه الحلول.
</p>

<p>
	لكن عند البحث عن مجال للعمل في مجال هندسة البرمجيات سيكون عليك التركيز على العمل أو التخصص في مجال محدد، فعندما تطلب الشركات والمؤسسات مهندسي برمجيات تحدد غالبًا مهندسين بتخصص معين، وفيما يلي قائمة بأهم تخصصات العمل التي يمكن لمهندسي البرمجيات العمل بها وما التقنيات اللازمة لها:
</p>

<h3>
	مطور ويب
</h3>

<p>
	مطور الويب هو الشخص المسؤول عن تصميم وإنشاء مواقع وتطبيقات الويب المختلفة، ويمكن أن يتخصص في تطوير الواجهة الأمامية للموقع التي تعمل من طرف العميل أو تطوير الواجهة الخلفية التي تعمل من طرف الخادم أو يقوم بكلا الأمرين معًا ويطلق عليه في هذه الحالة اسم مطور ويب كامل "Full-Stack".
</p>

<p>
	يمتلك مطورو الويب معرفة قوية باستخدام تقنيات الويب و<a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> مثل HTML و CSS وجافا سكربت وأجاكس …إلخ. ويقومون بكتابة تعليمات برمجية لإنشاء مواقع الويب ودمج قواعد البيانات مع الموقع الويب وتطوير ميزات جديدة للموقع الويب وصيانته.
</p>

<p>
	يمكنك الرجوع إلى مقال <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">تعلم تطوير الويب</a> لمزيد من التفصيل حول هذا التخصص.
</p>



<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			أنشئ موقع احترافي لأعمالك وعزّز حضورك الرقمي
		</p>

		<p class="banner-subtitle">
			صمم موقع إلكتروني فريد وجذاب لعملائك في دقائق دون خبرة برمجية باستخدام سنديان منشئ المواقع العربي
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://sndian.com/?utm_source=academy.hsoub.com&amp;utm_medium=referral&amp;utm_campaign=cademy.hsoub.com-CTA-Block" rel="external">أطلق موقعك الآن</a>
		</div>
	</div>
</div>



<h3>
	مطور تطبيقات الهاتف المحمول
</h3>

<p>
	يعد تطوير تطبيقات الهاتف المحمول من مجالات هندسة البرمجيات الأكثر طلبًا في سوق العمل ومطور التطبيقات هو المسؤول عن إنشاء واختبار وبرمجة تطبيقات الهواتف المحمولة والأجهزة اللوحية المختلفة وهو يطور تطبيقات لأهداف عامة أو تطبيقات مخصصة لتلبية احتياجات محددة للعملاء.
</p>

<p>
	كي تعمل كمطور تطبيقات هاتف يجب أن تمتلك معرفة قوية بلغات برمجة مثل جافا سكربت وكوتلن وسويفت و Objective-C وأن تمتلك معرفة جيدة بأنظمة تشغيل الهواتف المحمولة مثل iOS و Android.
</p>

<p>
	إن أردت المزيد من المعلومات، فارجع إلى مقال <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D9%88%D8%A7%D9%84-r1801/" rel="">برمجة تطبيقات الجوال</a>.
</p>

<h3>
	أخصائي دعم تقني
</h3>

<p>
	يمكن لمهندس البرمجيات العمل كذلك كاختصاصي دعم تقني، وهذا المجال يحتاج إلى فهم شامل للبرمجيات والأجهزة وأنظمة الشبكات كي يوفر الدعم الفني التقني اللازم للشركات وموظفيها، ويحل مشكلات الأجهزة والبرمجيات و<a href="https://academy.hsoub.com/devops/networking/%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D8%A8/" rel="">الشبكات الحاسوبية</a> ويقوم بتثبيت البرامج اللازمة وتحديثها وإصلاح أي خلل بها …إلخ.
</p>

<h3>
	محلل أنظمة أو محلل نظم معلومات
</h3>

<p>
	يحتاج محلل الأنظمة لامتلاك معرفة متعمقة بالأنظمة والبرامج وتحديد أفضل الطرق للاستفادة من موارد المؤسسة التي يعمل بها لأداء العمل بفعالية.
</p>

<p>
	فمهندس الأنظمة مسؤول عن تحديد احتياجات البنية التحتية التقنية وتحليل التكلفة والعوائد اللازمة لإعداد أنظمة المعلومات في المؤسسات والشركات التي يعمل بها.
</p>

<h3>
	محلل أمن معلومات
</h3>

<p>
	محلل أمن المعلومات هو المسؤول عن الحفاظ على أمان الحواسيب والشبكات ويجب أن يكون خبيرًا بتقنيات التشفير وجدران الحماية وتقييم المخاطر ويقدم التوصيات لتحسين وحماية البيانات الحساسة للشركة التي يعمل بها ويحدد الثغرات ونقاط الضعف التي تخل بأمن هذه البيانات.
</p>

<h3>
	مسؤول قواعد البيانات
</h3>

<p>
	يهتم مسؤول قواعد البيانات بإنشاء وتصميم قواعد البيانات ويعنى بإدارة وصيانة قواعد بيانات الشركة والحفاظ على استقرارها وإجراء النسخ الاحتياطية لقاعدة البيانات وتعديلها عند الحاجة، ويجب أن يمتلك معرفة قوية بلغات قواعد البيانات التقليدية أو العلائقية مثل Oracle و Microsoft SQL Server و DB2 أو قواعد البيانات غير العلائقية المصممة للتعامل مع البيانات الضخمة.
</p>

<p>
	للمزيد حول مجال قواعد البيانات، ارجع إلى مقال <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">دليلك الشامل إلى قواعد البيانات</a>.
</p>

<h3>
	مهندس ضمان الجودة
</h3>

<p>
	يهتم مهندس ضمان الجودة بوضع الخطط التي تضمن جودة تطوير البرمجيات ويحدد المشكلات التي قد تظهر أثناء عملية التطوير ويمتلك فهمًا جيدًا بدورة حياة تطوير البرمجيات ويعمل مع المطورين الآخرين في الفريق لتحديد وسائل التحسين الممكنة.
</p>

<p>
	كما يمكن لمهندس البرمجيات العمل في العديد من المجالات المهمة الأخرى مثل:
</p>

<ul>
	<li>
		مهندس DevOps
	</li>
	<li>
		محلل معلومات الأعمال
	</li>
	<li>
		مسؤول عن اختبار جودة البرمجيات QA Tester
	</li>
	<li>
		مبرمج ألعاب
	</li>
	<li>
		مهندس ذكاء صنعي
	</li>
	<li>
		مشرف على مختبرات الحاسوب
	</li>
	<li>
		مدرس برمجة وحاسوب
	</li>
</ul>

<p>
	ويمكنك الاطلاع على المزيد من المعلومات حول أكثر مجالات العمل انتشارًا في مقال <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">مجالات البرمجة</a>.
</p>

<h2>
	كيف أبدأ بالعمل في أحد مجالات هندسة البرمجيات؟
</h2>

<p>
	لتعمل في أحد تخصصات أو مجالات هندسة البرمجيات التي ذكرناها في فقرتنا السابقة من الضروري أن تركز على تعلم اللغات والتقنيات التي ترتبط بشكل وثيق بالمجال أو التخصص الذي تفضل العمل فيه.
</p>

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

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

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_2933_7" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/JI_w_ZvWbAA"></iframe>
</p>

<p>
	إذا قمت بكل ما سبق ستجد أمامك بالتأكيد الكثير من فرص العمل المتنوعة، وإذا كنت مهندس برمجيات مبتدئ أنصحك أن تبحث فورًا عن أول فرصة عمل مناسبة في شركة ملائمة حتى لو كانت شركة محلية وصغيرة لأجل اكتساب الخبرة لأن الخبرة في هذا المجال أمر مهم للتقدم الوظيفي، بعدها يمكنك الانتقال لشركات أكبر وذات رواتب مجزية.
</p>

<p>
	أخيرًا إذا كنت ترغب في العمل والتخصص في مجال هندسة البرمجيات، لكنك متردد حول إيجابيات وسلبيات هذا المجال وتراودك تساؤلات وشكوك فيما إذا كانت هذه المهنة مناسبة لك فعلًا، دعنا نختم مقالنا بمناقشة أبرز المزايا والعيوب المحتملة للعمل كمهندس برمجيات لعل ذلك يساعدك على اتخاذ القرار الأنسب لمستقبلك المهني.
</p>

<h2>
	إيجابيات وسلبيات تخصص هندسة البرمجيات
</h2>

<p>
	سنناقش أخيرًا إيجابيات وسلبيات هذا المجال الواسع الكبير، فلكل شيء في النهاية مزايا ومحاسن ويجب على الداخل الجديد إلى أي مجال معرفتها.
</p>

<h3>
	إيجابيات تخصص هندسة البرمجيات
</h3>

<p>
	يوفر تخصص هندسة البرمجيات العديد من الفوائد والإيجابيات وأهمها:
</p>

<ol>
	<li>
		تعد هندسة البرمجيات من الوظائف الأعلى أجرًا.
	</li>
	<li>
		الطلب على هندسة البرمجيات مرتفع ومعدل نموها أعلى من المهن الأخرى.
	</li>
	<li>
		حرية العمل عن بعد من داخل المنزل إما بمفردك أو مع فريق عمل وضمن ساعات عمل مرنة.
	</li>
	<li>
		إمكانية بدء مشروعك الخاص بأقل التكاليف، كل ما تحتاجه للبدء هو جهاز حاسوب واتصال بالإنترنت.
	</li>
	<li>
		القدرة على تطوير برامج ضخمة ومعقدة عالية الجودة لم تكن لتتمكن من إنجازها بنجاح دون تطبيق مبادئ هندسة البرمجيات.
	</li>
	<li>
		تطوير مهاراتك الحياتية وقدرتك على فهم المنطق وتحسين كفاءتك في حل المشكلات والتعامل مع التوتر والضغوطات.
	</li>
	<li>
		مهارة عالية في التكيف بسرعة مع أي تطورات تقنية جديدة، فالتقنية تتطور باستمرار ومهندسو البرمجيات أشخاص منفتحون على تعلم أشياء جديدة كل يوم.
	</li>
</ol>

<h3>
	سلبيات تخصص هندسة البرمجيات
</h3>

<p>
	لاشك أن أي مجال لا يخلو من بعض الجوانب السلبية، وفيما يلي نذكر لك أبرز التحديات التي قد تواجهك عند العمل في مجال هندسة البرمجيات:
</p>

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

<p>
	ورغم ما سبق من سلبيات تذكّر أنك تستطيع تجاوزها إذا كنت تمتلك الشغف في مجال التقنية والبرمجة وكنت منفتحًا على تعلم كل جديد.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على تخصص هندسة البرمجيات الذي يساعدنا على تطوير منتجات برمجية متطورة فعالة وموثوقة تعمل بأعلى جودة وأقل تكلفة وزمن، ووضحنا أهم المجالات التي يمكن لمهندس البرمجيات العمل فيها وأبرزها تطوير مواقع الإنترنت وتطبيقات الجوال أو الحفاظ على الأمن الإلكتروني للمؤسسات وغيرها من المجالات العديدة، وتناولنا في الختام أبرز إيجابيات وسلبيات العمل كمهندس برمجيات.
</p>

<p>
	وفي الختام تذكّر أن تعلّم هندسة البرمجيات طريق طويل يتطلب وقتًا وجهدًا، لكنه في ذات الوقت متاح للتعلم الذاتي بشكل مختصر بفضل توفر موارد تعلم رائعة عبر الإنترنت من دروس ومقالات ومقاطع فيديو وبودكاست وغيرها من المصادر المتنوعة التي تتيح لك التركيز على الموضوعات التي تهمك.
</p>

<p>
	هل أنت مهتم بأحد مجالات هندسة البرمجيات وترغب في تعلمه أو بدأت به فعلًا؟ شاركنا رأيك في المجال المفضل لديك وكيف تعلمته وما هي أبرز التحديات التي واجهتك في هذا المجال وكيف تخطيتها؟
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AF%D8%B1%D8%A7%D8%B3%D8%A9-%D8%AA%D8%AE%D8%B5%D8%B5-%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">الطريقة الأمثل لدراسة تخصص هندسة البرمجيات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA/" rel="">دليلك الشامل إلى برمجة التطبيقات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">دليلك الشامل لتعلم البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تعرف على مجال تحليل البيانات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علم البيانات Data science: الدليل الشامل</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1958</guid><pubDate>Sun, 16 Apr 2023 15:00:00 +0000</pubDate></item></channel></rss>
