-
المساهمات
14490 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
384
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
للتوضيح ميثود train_test_split في مكتبة scikit-learn ليست مقتصرة على استقبال أربعة متغيرات فقط، فتلك الميثود مرنة جداً وتسمح لك بتقسيم البيانات بعدة طرق. ونستخدمها لتقسيم مجموعة البيانات إلى مجموعتين رئيسيتين، مجموعة التدريب Training set لتدريب نموذج الذكاء الاصطناعي، ومجموعة الاختبار Testing set لتقييم أداء النموذج بعد التدريب. المعاملات الأساسية هي تمرير عدد من المصفوفات مثل المميزات Features والأهداف Targets، حيث الصيغة الأساسية هي كالتالي: from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, ...) X مصفوفة المميزات وy مصفوفة الهدف. المعاملات الإضافية أولها test_size لتحديد نسبة بيانات الاختبار، وتقبل أن تكون قيمة عشرية (مثل 0.2 للنسبة 20%) أو عدد صحيح يمثل عدد العينات. train_test_split(X, y, test_size=0.25) و train_size لتحديد نسبة بيانات التدريب بنفس طريقة test_size. ويوجد random_state لتحديد رقم ثابت لضمان إمكانية إعادة التقسيم بنفس الطريقة في كل مرة تُشغّل فيها الكود. train_test_split(X, y, random_state=42) shuffle لتحديد هل البيانات سيتم خلطها قبل التقسيم، والقيمة الافتراضية هي True. train_test_split(X, y, shuffle=False) أيضًا stratify للحفاظ على توزيع الفئات في كل من مجموعتي التدريب والاختبار، وذلك مفيد خاصة في مشاكل التصنيف حيث تكون الفئات غير متوازنة. train_test_split(X, y, stratify=y) وتستطيع تمرير أكثر من مصفوفة واحدة للتقسيم في نفس الوقت، حيث تقوم الدالة بتقسيم كل مصفوفة بنفس الطريقة واسترجاعها بشكل منفصل. X_train, X_test, y_train, y_test, z_train, z_test = train_test_split(X, y, z, test_size=0.2)
- 5 اجابة
-
- 1
-
-
التنبوء عملية توقع قيمة مستمرة حسب بيانات الإدخال المتاحة، والفائدة منه مثلاً التنبؤ بكميات مثل أسعار الأسهم، درجات الحرارة، حجم المبيعات، أو وقت الوصول. وتشمل نماذج التنبوء الانحدار الخطي، الانحدار اللوجيستي (في بعض الحالات)، أشجار القرار، والشبكات العصبية. أما التصنيف يهدف إلى تصنيف البيانات إلى فئات أو مجموعات محددة مسبقًا، بمعنى في المهام التي تتطلب تحديد فئة معينة، مثل تصنيف الرسائل الإلكترونية إلى سبام أو غير سبام، التعرف على أنواع الحيوانات في الصور، أو تصنيف الأوراق المالية إلى شراء أو بيع. والنماذج تشمل الانحدار اللوجستية، آلات الدعم الناقل (SVM)، أشجار القرار، والغابات العشوائية، والشبكات العصبية. أما الاحتمالات تتعلق بتحديد مدى احتمالية انتماء بيانات معينة إلى فئة معينة، وذلك لتوفير تقديرات احتمالية بدلاً من تعيين فئة محددة، مما يسمح بفهم درجة اليقين في التصنيفات والتنبؤات، أي توفير معلومات إضافية حول درجة اليقين في التصنيفات، للمساعدة في اتخاذ قرارات أكثر دقة وتشمل النماذج البايزية، الشبكات العصبية مع طبقات إخراج احتمالية (مثل دالة Softmax في التصنيف متعدد الفئات)، وأشجار القرار التي توفر احتمالات نسبية لكل فئة. بالتالي نوع المخرجات هو التنبوء: قيمة عددية مستمرة. التصنيف: فئة أو تصنيف محدد. الاحتمالات: تقديرات احتمالية لكل فئة ممكنة.
- 2 اجابة
-
- 1
-
-
هل يعمل الموقع على الهاتف؟ وهل نفس الشبكة تتصل من خلالها على الهاتف والحاسوب؟ وهل هناك VPN يعمل على الحاسوب، وهل قمت بتجربة متصفح آخر؟ حاول حذف الملفات المؤقتة أولاً من خلال الضغط على الأيقونة التالية بجانب عنوان الموقع ثم اختيار cookies and site data: ثم اختر manage وسيظهر لك البيانات وبجانبها أيقونة سلة مهملات قم بالضغط عليهم جميعًا ثم أعد تحديث الموقع. إن استمرت المشكلة حاول استخدام البرنامج التالي بتثبيته وتشغيله ثم تصفح الموقع. https://1111-releases.cloudflareclient.com/win/latest
-
لا مشكلة في ذلك، عند إغلاق نظام الويندوز يقوم بعمليات ممنهجة لحفظ البيانات قبل الإغلاق ويحذرك من وجود برنامج يعمل، في حال غير مهم بالنسبة لكِ تختارين shutdown أو المتابعة في عملية الإغلاق. في حال وجود برامج هامة قيد التشغيل، تأكدي من حفظ ما كنتي تعملين عليه ثم الإغلاق، حيث تستطيعي التراجع من خلال إختيار إلغاء الأمر، ولكن ذلك لا يحدث دائمًا فأحيانًأ يتم غلق النظام.
- 2 اجابة
-
- 1
-
-
يدعم كلاهما لا مشكلة، فهو يعتمد على jupyter. لكن يجب تفعيل الإنترنت لـ kaggle-notebook من خلال زر internet on: ولتفعيله يجب تسجيل الدخول ثم تفعيل حسابك عن طريق الهاتف Phone verification ستجد ذلك في إعدادات الحساب. في حال لم يتم تفعيله قم بإنشاء notebook جديد.
- 3 اجابة
-
- 1
-
-
وعليكم السلام ورحمة الله مرهف، نعتذر لك على التأخير، سيتم الرد عليك إن شاء الله لا تقلق بخصوص ذلك، أحيانًأ يوجد ضغط على مركز المساعدة بسبب كثرة الرسائل. تستطيع إرسال رسالة كتذكير مع تفصيل رسالتك لتحصل على رد مناسب، ثم الإنتظار قليلاً لحين الحصول على رد. أيضًا تستطيع استبدال الدورة بدورة أخرى لو أردت، وفي حال تواجه مشكلة في الدورة الحالية تستطيع أسفل الدروس وسيتم مساعدتك بالتفصيل.
-
تلك حقوق قانونية تحمي الأعمال الإبداعية من النسخ أو التعديل أو التوزيع دون إذن من صاحب الحقوق، تشمل النصوص، الصور، الموسيقى، الأفلام، البرامج، وغيرها، وتُنشأ تلك الحقوق تلقائيًا بمجرد إنشاء العمل، دون الحاجة إلى تسجيل رسمي في معظم الدول. ثانياً، حقوق النشر تنطبق تلقائياً عند إنشاء العمل، لكن التسجيل الرسمي يساعد في حماية أقوى، وبالنسبة للمواقع، يجب على العميل تأمين حقوق المحتوى الخاص به، مع استخدام إشعار حقوق النشر لإعلام الآخرين بالملكية. وللعلم يوجد فرق بين حقوق النشر والتسجيل التجاري، فحقوق النشر تخص الملكية الفكرية للمحتوى مثل النصوص والصور، بينما التسجيل التجاري إجراء قانوني لتأسيس نشاط تجاري. ولن تحتاج إلى فعل شيء من قبلك أنت، سوى تضمين إشعار حقوق النشر في تذييل مواقع الويب التي تقوم بتطويرها لعملائك، ويجب أن يتضمن الإشعار اسم مالك حقوق النشر وسنة الإنشاء وعبارة "جميع الحقوق محفوظة"، ولا يُشترط قانونًا، لكن وضع إشعار مثل "© اسم الشركة 2024" يُعد تحذيرًا للآخرين بعدم الاستخدام غير المصرح به، ودليلًا على المطالبة بالحقوق في حال النزاع. أيضًا عليك الإلتزام بالتراخيص، فلو استخدمت صورًا من مواقع مثل Unsplash، يجب الالتزام بترخيص الصورة (بعضها مجاني مع ذكر المصدر). فمثلاً المحتوى الذي يتم نشره على جوجل، يحق لصاحب المحتوى الأصلي الإبلاغ عمن يسرق محتواه وسيتم معاقبته من قبل جوجل، وفي بعض الدول مثل الولايات المتحدة، متاح تسجيل حقوق النشر في هيئة مختصة لتعزيز الحماية القانونية. أما لو الموقع يهدف إلى تقديم خدمات تجارية أو بيع منتجات، فسيحتاج مالكها إلى التسجيل في السجل التجاري، وللتوضيح السجل التجاري إجراء منفصل عن حقوق النشر، ويتعلق بشرعية ممارسة النشاط التجاري وفق قوانين الدولة.
- 3 اجابة
-
- 1
-
-
لا عليك، المعاملات المالية يتم مناقشتها من خلال مركز المساعدة، أرجو مراسلتهم بما تريده وسيتم الرد عليك وتوضيح الأمر لك.
-
ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
-
IterativeImputer يعتمد على نماذج إحصائية كالانحدار الخطي أو أشجار القرار لتقدير القيم المفقودة، وتلك النماذج تُنتج توقعات مستمرة (أرقام عشرية)، حتى لو كانت البيانات الأصلية منفصلة أي أعداد صحيحة. بمعنى لو النموذج يتنبأ بقيمة بين 1 و2 (مثل 1.8)، فسيُدخلها كقيمة عشرية بدلًا من تقريبها إلى 2. والسلوك متوقع لأن IterativeImputer مصمم للتعامل مع البيانات العددية المستمرة بشكل افتراضي، لكن لو متغيرك يمثل فئات أو أعدادًا صحيحة (مثل عدد التطابقات الجينية)، فإن القيم العشرية لا معنى لها وذلك يعني مشكلة في النموذج أو طريقة التعامل مع البيانات. بالتالي لو المتغير يجب أن يكون عددًا صحيحًا، فالقيم العشرية غير منطقية وتشوّه تفسير البيانات. ولو المتغير يمثل درجة مستمرة، فتكون القيم مقبولة، لكن يُفضَّل التحقق من سياق البيانات فهي الأساس. أي تفقد هل المتغير يجب أن يكون، فئويًا/منفصلًا، كـ 0 = لا يوجد تطابق، 1 = تطابق جزئي، 2 = تطابق كامل. أو عدديًا مستمرًا مثل نسبة التطابق الدقيقة. في الحالة الأولى استخدم SimpleImputer مع إستراتيجية most_frequent (إدخال المنوال) بدلًا من IterativeImputer. في الثانية استخدم IterativeImputer ثم قَرِّب النتائج إلى أقرب عدد صحيح: from sklearn.impute import IterativeImputer import numpy as np imputer = IterativeImputer() data_imputed = imputer.fit_transform(data) data_imputed = np.round(data_imputed).astype(int)
- 3 اجابة
-
- 1
-
-
لو ستقوم بالأمر بمفردك ستحتاج إلى أن تصبح مطور Full-stack بمعنى قادر على تطوير الواجهة الأمامية والخلفية، وكبداية ستتعلملغات الويب وهم HTML, CSS, JS. بمعنى الواجهة الخلفية أو Back-End تعني الجزء من موقع الويب أو التطبيق الذي لا يراه المستخدم، ويشمل ذلك الخوادم والبيانات والبرامج التي تعالج الطلبات وترسل ردودًا للمستخدمين. والواجهة الأمامية Front-End هو الجزء من موقع الويب أو التطبيق الذي يراه المستخدم، ويتضمن HTML وCSS وJavaScript، والتي يتم استخدامها لإنشاء الواجهة الرسومية للموقع أو التطبيق. بعد ذلك تعلم إطار عمل Full-stack يوفر لك تطوير الواجهة الأمامية والخلفية معًا، وبما أنك في دورة بايثون فلديك إطار جانغو وهو إطار قوي يوفر لك إنشاء الواجهة الأمامية من خلال القوالب الواجهة الخلفية (الخادم) أي إنشاء API's من خلال الأدوات التي يوفرها ومنها النماذج models ودعم قواعد البيانات المختلفة، والمصادقة Authentication. ستحتاج إلى قراءة ما يلي:
-
أثناء تعلم الأساسيات يجب التطبيق على تمارين بسيطة لتوظيف ما تعلمته وتثبيته وليس الإنتظار حتى النهاية. بعد ذلك ستحتاج إلى توظيف ما تعلمته في الأساسيات من خلال مشاريع عملية، ابحث على اليوتيوب عن "مشاريع بايثون للمبتدئين" أو python projects for beginners أثناء التطبيق العملي عليك العمل على تطوير مهارة التفكير المنطقي لديك بحل المسائل البرمجية من خلال مواقع مثلHackerrank أو codewars. أي عليك الجمع بين حل المسائل والتطبيق على المشاريع، وقبل حل المسائل البرمجية، عليك تعلم أساسيات هياكل البيانات والخوارزميات أي مفاهيم بسيطة من الـ DSA مثل: Arrays وطرق التعامل معها. Strings والخوارزميات الأساسية عليها مثل عكس النصوص، البحث عن عنصر. Time Complexity بشكل بسيط مثل فهم الفرق بين O(n) و O(n^2). وتجنب التطبيق على المشاريع الصغيرة دائمًا مثل تطبيق Todo list، ذلك جيد في البداية للتدرج في الاستيعاب، لكن عليك الإنتقال من تلك المرحلة والتطبيق على مشاريع كاملة، ولا تكتفي بالنسخ واللصق أو النقل من الشرح في الفيديو، عليك استيعاب ما تقوم بكتابته ولماذا تقوم به، وأيضًا حاول التغيير قليلاً في المشروع فذلك يجبرك على التركيز في الكود والتطبيق.
-
قبل التعويض، حدد الأعمدة التي من نوع int وfloat: import pandas as pd int_cols = df.select_dtypes(include=['int']).columns.tolist() float_cols = df.select_dtypes(include=['float']).columns.tolist() numerical_cols = int_cols + float_cols ثم استخدم IterativeImputer على الأعمدة الرقمية وسيحول جميعها إلى float مؤقتًا: from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer = IterativeImputer(random_state=42) df_imputed = pd.DataFrame( imputer.fit_transform(df[numerical_cols]), columns=numerical_cols ) ثم إعادة تحويل الأعمدة إلى أنواعها الأصلية، بتقريب القيم العشرية إلى أقرب عدد صحيح لو كان ذلك مناسب للبيانات. df_imputed[int_cols] = df_imputed[int_cols].round().astype(int) ولو لديك أعمدة غير رقمية (فئوية)، أعد دمجها، وهنا افترض أن df يحتوي أيضًا على أعمدة فئوية مثل 'category_col'. df_final = pd.concat([ df_imputed, df[['category_col']] ], axis=1)
- 6 اجابة
-
- 1
-
-
عليك إنشاء قائمتين لكل عمود، فلو لديك 3 أعمدة رقمية: العمود 1 (مثل العمر): min=0, max=100 العمود 2 (مثل الراتب): min=1000, max=10000 العمود 3 (مثل درجة الحرارة): min=-20, max=50 فستكون القوائم: min_values = [0, 1000, -20] max_values = [100, 10000, 50] ثم تحديد القيم ديناميكيًا، ففي حال الأعمدة كثيرة مثل 60 عمودًا، فتستطيع حساب الحدود لكل عمود تلقائيًا باستخدام الرباعيات أو القيم الدنيا/القصوى: import pandas as pd min_values = df[numerical_cols].quantile(0.05).tolist() max_values = df[numerical_cols].quantile(0.95).tolist() لاحظ حساب الحد الأدنى كـ 5% لكل عمود ثم حساب الحد الأقصى كـ 95% لكل عمود. ثم تمرير القوائم إلى IterativeImputer from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer = IterativeImputer( min_value=min_values, max_value=max_values, estimator=RandomForestRegressor(), max_iter=50, random_state=42 ) df_imputed = imputer.fit_transform(df[numerical_cols]) ولو الأعمدة غير مرتبة بنفس ترتيب القوائم min_values و max_values، ستُطبَّق القيم الخاطئة، لذا علينا التأكد من أن ترتيب الأعمدة في df[numerical_cols] مطابق تمامًا لترتيب القيم في min_values و max_values. numerical_cols = df.select_dtypes(include=['number']).columns.tolist() min_values = df[numerical_cols].quantile(0.05).values max_values = df[numerical_cols].quantile(0.95).values وفي حال بعض الأعمدة لا تحتاج إلى حدود (مثل الأعمدة التي يمكن أن تأخذ أي قيمة)، عليك استخدم None أو np.inf: import numpy as np min_values = [0, None, -np.inf] max_values = [100, np.inf, 50] حيث العمود الثاني والثالث بلا حدود دنيا، والعمود الثاني بلا حدود قصوى.
- 6 اجابة
-
- 1
-
-
ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
-
أثناء التثبيت أرجو إختيار default locale إن استمرت المشكلة، قم بتجربة تغيير ذلك إلى English, United States بدلاً من default locale.
-
الأهم هو الأساسيات، فالمكتبات قائمة على اللغة البرمجية وهي بايثون، بالتالي إتقان أساسيات اللغة مثل الهياكل البيانية (القوائم، القواميس، المجموعات)، التحكم بالتدفق (الشروط، الحلقات)، الدوال، والكائنات البرمجية Classes بمعنى OOP. بعد تخطي تلك المرحلة وتنفيذ مشاريع متوسطة المستوى، تستطيع البحث عن أفضل الممارسات عند كتابة كود بايثون Python best practices وكيفية عمل refactoring للكود. ثم ابدء في حل المسائل البرمجية من خلال منصات مثل LeetCode أو HackerRank. بعد ذلك تقوم بالتعمق في تعلم المكتبات مثل pandas وفهم الميثودز التي توفرها المكتبة بشكل عميق لتتمكن من استخدامها كما ينبغي. وبالطبع تنفيذ مشاريع صغيرة باستخدام Pandas لتحليل مجموعات بيانات مختلفة، للتطبيق على المفاهيم وتثبيت المعلومات، ثم زيادة صعوبة المشاريع شيئًا فشيئًا. ثم اطلع على مشاريع مفتوحة المصدر على منصات مثل GitHub، ودراسة كيفية تنظيم الكود وطريقة كتابته وربطه ببعضه البعض، كتابة التوثيق، واستخدام الـ Design patterns. بمعنى قم بتحليل كود من مكتبات شهيرة، ففهم كيفية كتابة مكتبات ووحدات برمجية مستخدمة على نطاق واسع يوفر رؤى قيمة حول أفضل الممارسات.
- 5 اجابة
-
- 1
-
-
المشكلة في السطر التالي: data_train[original_dtypes.select_dtypes(include=['int64']).columns] = original_dtypes.select_dtypes(include=['int64']).astype(int) فما تريده هو تحويل الأعمدة التي كانت في الأصل من نوع صحيح int64 مرة أخرى إلى أعداد صحيحة بعد الإكمال، ولكن ما يتم في الكود هو تعيين أنواع البيانات الأصلية المحولة إلى أعداد صحيحة بدلاً من تحويل بيانات الأعمدة نفسها. بمعنى original_dtypes.select_dtypes(include=['int64']).columns يجلب أسماء الأعمدة التي كانت في الأصل من نوع int64. original_dtypes.select_dtypes(include=['int64']).astype(int) يعمل على تحويل أنواع البيانات التي تكون كائنات dtype إلى أعداد صحيحة، وذلك غير منطقي لأنك تريد تحويل القيم في الأعمدة إلى أعداد صحيحة وليس أنواع البيانات. عليك تطبيق دالة astype(int) مباشرة على بيانات تلك الأعمدة وليس على معلومات أنواع البيانات. data_train = ordinalencoder_data(data_train) original_dtypes = data_train.dtypes.copy() imputer = IterativeImputer(max_iter=5, random_state=42, initial_strategy='mean') imputer_data = imputer.fit_transform(data_train) data_train = pd.DataFrame(imputer_data, columns=data_train.columns) int_columns = original_dtypes[original_dtypes == 'int64'].index data_train[int_columns] = data_train[int_columns].astype(int) print(data_train.info())
- 6 اجابة
-
- 1
-
-
المشكلة تعني الاستيراد من نفس الملف admin.py حيث أنك كتبت بداخله التالي: from .admin import CustomUserAdmin أرجو حذف ذلك السطر، فلا نستطيع الاستيراد من نفس الملف ونقل CustomUserAdmin إلى ما بعد الاستيرادات مباشرًة، لكي تتمكن من استخدام admin.site.register(User, CustomUserAdmin)
- 6 اجابة
-
- 1
-
-
ستحتاج إلى مكتبة لفعل ذلك والأسهل هو استخدام pyttsx3 من خلال بايثون وهي تعمل بدون إنترنت، حيث تستخدم محركات TTS المثبتة مسبقًا على النظام مثل SAPI5 على Windows أو espeak على Linux. تثبيت المكتبة: pip install pyttsx3 وإليك مثال للاستخدام: import pyttsx3 text = "مرحبا كيف حالك" engine = pyttsx3.init() engine.setProperty('rate', 150) engine.setProperty('volume', 1.0) engine.say(text) engine.save_to_file(text, 'output.mp3') engine.runAndWait() rate هي سرعة الكلام والقيمة الإفتراضية هي 200، و volume هو مستوى الصوت ما بين 0 و 1. save_to_file تقوم بحفظ الصوت في ملف لو أردت، أي ذلك إختياري. في حال واجهت مشكلة يوجد مكتبة gTTS ولكنها تتطلب اتصالًا بالإنترنت. pip install gtts playsound الاستخدام: from gtts import gTTS import playsound text = "مرحبا بك" language = 'ar' tts = gTTS(text=text, lang=language, slow=False) tts.save("output.mp3") playsound.playsound("output.mp3")
-
في pandas، توجد دوال مُخصصة لتسهيل معالجة البيانات بشكل فعال، ومنها select_dtypes وapply(). حيث select_dtypes تسمح لك بفلترة (تصفية) أعمدة الـ DataFrame حسب نوع البيانات dtypes، بالشكل التالي: df.select_dtypes(include=[int, float], exclude=[object]) include اختيار الأعمدة ذات الأنواع المحددة (مثل int، float، datetime) و exclude استبعاد الأعمدة ذات الأنواع المحددة. import pandas as pd data = {'A': [1, 2], 'B': ['x', 'y'], 'C': [3.0, 4.0]} df = pd.DataFrame(data) numeric_df = df.select_dtypes(include='number') أما apply() تطبق دالة مُخصصة على جميع الصفوف أو الأعمدة (حسب المحور axis). df.apply(func, axis=0) df.apply(func, axis=1) كالتالي: df['sum'] = df.apply(lambda row: row.sum(), axis=1) ودوال pandas مثل select_dtypes وapply() تكون أسرع بشكل عام لأنها مبنية على تحسينات مُستوى منخفض مثل C أو NumPy. أما الحلقات التقليدية (for/if) في Python تكون أبطأ، خاصة مع البيانات الكبيرة، لأنها تُنفذ بشكل تسلسلي ولا تستفيد من تحسينات المتجهات vectorization.
- 4 اجابة
-
- 1
-
-
أرجو الإنتظار قليلاً ومن المفترض أن تجدها في حسابك من خلال تبويب دوراتي، وعند الضغط عليه ستجد الدورات المشترك بها كالتالي: في حال لم تجدها أرجو التواصل مع مركز المساعدة وسيتم حل المشكلة لك.
-
لغات الويب هي HTML, CSS, JS حيث HTML توفر لك تطوير هيكل الصفحة من خلال العناصر الخاصة بها، ثم تنسيق الهيكل من خلال لغة CSS من حيث المظهر وتموضع العناصر في الصفحة كما تريد حسب التصميم الذي تنوي تنفيذه. ثم تأتي جافاسكريبت لإضافة تفاعلية للصفحة بمعنى برمجة ما الذي سيحدث عن النقر على زر معين في الصفحة مثلاً، وأيضًا تمكننا من إنشاء مواقع ديناميكية غير ثابتة بمعنى التواصل مع الخادم والحصول على بيانات وتغيير محتوى الصفحة فلا يظل ثابت، فمثلاً عند نشر سؤالك هنا أنت قمت بالإضافة إلى الموقع أي أضفت محتوى وذلك معنى موقع ديناميكي محتواه غير ثابت. بعد تعلم ما سبق ستحتاج إلى تعلم إطار أو مكتبة للواجهة الأمامية مثل React. ولو أردت إنشاء واجهة خلفية للموقع ستحتاج إلى تعلم Node.js وهي تعتمد على جافاسكريبت أيضًا. مع العلم أنه يوجد لغة PHP أيضًا لتطوير مواقع الويب وإطار لارافل الخاص بها، لكن ستحتاج إلى تعلم HTML, CSS, JS أيضًا قبل تعلمها، فهي لغة واجهة خلفية بالأساس.