لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 10/01/22 في كل الموقع
-
نعيش حرفيًا في عالم من البيانات، فما نقرؤه وما نكتبه وما نفكر به أنواع من البيانات، وما تستند عليه أفعالنا اليومية وسلوكنا هي أنواع من البيانات. قد تقرر الذهاب إلى التسوق لأنك تحتاج إلى بعض الحاجيات التي سجلتها على قائمتك، إن ما سجّلته على قائمتك هي بيانات، ثم تمضي في طريقك لتقف عند إشارة مرور حمراء، إن وقوفك عند الإشارة الحمراء عائد إلى بيانات أيضًا، فالأحمر للوقوف والأخضر للمتابعة، ثم تصل بعد ذلك إلى المتجر لتتفقد ما تحتاج إليه، فقد تنظر إلى العلامة التجارية للمنتج وهذه بيانات قد تعطيك فكرة عن جودة المنتج، وقد تنظر إلى سعر المنتج وهذه أيضًا بيانات تستخدمها لاتخاذ قرار الشراء وفقًا لميزانيتك، وإن كان المنتج غذائيًا مثلًا ستهتم بتاريخ الإنتاج وتاريخ انتهاء الصلاحية والمكوّنات، فهي بيانات ستؤثر على صحتك، وأخيرًا عندما تنتهي من التسوق وتتوجه إلى كوة المحاسبة سيقرأ الماسح الضوئي رمز المنتج وهو نمط من البيانات التي تعرّف هذا المنتج وتحدد هويته وقد خُزّنت ضمن هذا الرمز وفق سلسلة من الأرقام أو الأحرف أو كليهما كما خزّنت على حاسوب كوة المحاسبة أيضًا بطريقة ما. ما هي البيانات إذًا وما هي أنواع البيانات؟ من أين تأتي البيانات؟ كيف نستقبلها وكيف نفهمها؟ كيف نصنّف أنواع البيانات المختلفة وأين نخزّنها وكيف نسترجعها ونحللها؟ وكيف نستفيد منها في المحصلة؟ سنحاول في هذا المقال الإجابة عن الأسئلة السابقة بشيء من التفصيل لتكون عونًا لك في تعاملك مع أنواع البيانات سواء كنت راغبًا في أن تكون مصممًا لقواعد البيانات أو محللًا لأنواع البيانات أو مبرمجًا لها. إليك فهرس بعناوين المقال لتسهيل الوصول إلى مختلف أجزاء المقال: تعريف البيانات الفرق بين البيانات والمعلومات من أين تأتي البيانات؟ أنواع تخزين البيانات تصنيف أنواع البيانات Data Types البيانات الكمية البيانات النوعية البيانات المنطقية أنواع البيانات في الحاسب تصنيفات البيانات الرقمية أنواع البيانات في لغات البرمجة أنواع البيانات المستخدمة في قواعد البيانات خاتمة تعريف البيانات البيانات Data تُعرَّف بأنها مقادير منفصلة على شكل رموز أو إشارات قابلة للتحليل والمعالجة، ويمكن للبيانات أن تكون واضحةً ومفهومة لنا دون سياق محدد -أي دون أي تسلسل أو ترابط- مثل مجموعة أرقام تمثل أحجية، فالأرقام مقاديرٌ مفهومةٌ بالنسبة لنا، لكن الربط بينها لحل الأحجية قد يكون عصيًا. وقد لا تكون البيانات مفهومةً كخطوط رمز الماسح الضوئي (بار كود). تُدعى النتيجة المستخلصة من تحليل مجموعة من البيانات والربط بينها بالمعلومة أو المعلومات عمومًا information، كما تُدعى أصغر وحدة من مجموعة بيانات يمكن أن تُستخدم أو تفهم باستقلالية بعنصر البيانات datum. عندما نجمع المعلومات المتعلقة بموضوع معين وننظمها ثم نفهمها من خلال التطبيق والممارسة، سيكون توثيق هذه المعلومات المصنّعة انطلاقًا من البيانات معرفةً knowledge، أما الأسلوب الأمثل في تطبيق هذه المعرفة فقد ندعوه حكمة wisdom. إذًا فالبيانات عمومًا هي وسيلة للحصول على معلومات أو وسيلة لتمثيلها بطريقة أفضل كي تُعالح وتُستخدم. وقد تكون هذه البيانات مجرّدة كأسماء علامات تجارية وقد تكون مقاسة كدرجات الحرارة أو نسبة الفائدة أو عدد الولادات خلال عام. تُنظم البيانات ضمن بنىً خاصة تسمى بنى البيانات أو هياكل البيانات data structure لتسهيل الوصول إليها واستخلاص المعلومات منها مثل الجداول، وقد جُمعت أنواع البيانات ما قبل الثورة الرقمية في مراجع وكتب ووثائق، لكن مع بزوغ فجر الحوسبة كان الانتقال إلى البيانات الرقمية أمرًا حتميًا لتقود بالفعل العالم الرقمي منتجات ومختصين نحو تقنيات أكثر قدرة وترابطًا ابتداءً بقواعد البيانات النمطية databases إلى تقنيات التعامل مع البيانات الضخمة Big data وصولًا إلى تطوير الذكاء الصنعي AI. الفرق بين البيانات والمعلومات يجري الخلط في مواضع عدة بين البيانات والمعلومات على أنها الشيء ذاته وهذا أمر خطأ، فهناك فرق بيّن بين المصطلحين تعريفًا وغاية، ولقد أشرنا سابقًا أن البيانات تعرّف حقائق مفردة، بينما تمثل المعلومات تنظيمًا لهذه الحقائق أو تفسيرًا لها. تأتي البيانات بأشكال مختلفة، نصوصًا وأرقام وأشكال وصور وتواريخ لكنها لا تحمل دلالات على أهميتها أو الحاجة لوجودها، فقد يشير جهاز قياس تردد الصوت إلى القيمة 12 كيلو هرتز عندما يعجز المريض عن سماع أي صوت في عيادة تخطيط السمع، إذ القراءة بحد ذاتها لا دلالة لها ولن يتمكن سوى المختص من تأويلها إلى المعلومة التالية "المريض يعاني نقصًا في السمع". وقد تجد أيضًا أن مقدار المبيعات من منتج ما هو 20 جهازًا في العام، لن يقدم كذلك عنصر البيانات هذا أي دلالة ما لم يحلل ويوازن ويتحول إلى معلومة مثل "حققت الشركة هذا العام نسبة مبيعات عالية!". وهكذا يمكن أن نلخص الفرق بين البيانات والمعلومات كالتالي: البيانات مجموعة من الحقائق غير المنظمة، أما المعلومات فهي من يضع تلك البيانات في سياقها الصحيح. البيانات مصدر خام للحقائق دون أية دلالات وقد لا تتمكن من قراءتها أحيانًا، أما المعلومات فهي التي توضّح أنواع البيانات وتستخلص منها ما يُفهم ويُطبق ويُختبر. البيانات حقائق مستقلة بذاتها وقد لا تربط بينها أية علاقات، بينما تجد المعلومات العلاقات التي تربط بين أنواع البيانات لعرض صورة أوسع عن الظاهرة المدروسة. لا تعتمد البيانات على المعلومات لكن العكس صحيح. لا يمكن الاعتماد على البيانات لاتخاذ القرارات، فلا بد من وجود معلومات حتى يُتّخذ القرار الصحيح. من أين تأتي البيانات؟ تأتي البيانات -والتي تتنوع إلى أنواع البيانات- من تطور الفهم البشري للبيئة المحيطة به، وبالتالي من تطور معارفه والحاجة إلى توثيق هذه المعارف ووضعها حيز التنفيذ بالأسلوب الأمثل والأكثر كفاءة من جميع النواحي تحليلًا ومعالجة وسرعة، لكن يمكننا القول أن الأساليب الأساسية التي نحوز بها على بيانات أو نحدّث الموجودة منها قد تنحصر بما يلي: الافتراض assumption المراقبة observations القياس measurement التحليل analysis الافتراض assumption عادة ما يكون الافتراض منهجيًا، أي يستند إلى أفكار مسبقة عن موضوع ما أو إلى معلومات غير دقيقة أو بياناتها غير كافية. عادة ما تكون أنواع البيانات المفترضة خطوة مرحلية تُلغى لاحقًا عند حيازة البيانات المطلوبة، إلا أن توثيقها ضروري جدًا. فلو أردنا مثلًا أن نقدّر عدد المشترين المتوقعين لمنتج جديد في مدينة ما لدراسة جدوى توزيعه فيها سيكون هذا الرقم مفترضًا والنتائج التي تتأتى عنه افتراضيةً أيضًا ستصحح مع الوقت لكن بالطبع سيكون عدد المشترين متوقعًا بناء على أفكار أو دراسات مشابهة. المراقبة observations وهي إحدى الطرق الإحصائية Statistics المتبعة في حيازة البيانات، إذ تجري مراقبة ظاهرة اجتماعية أو اقتصادية أو غيرها ضمن جماعة population محددة للحصول على أنواع بيانات محددة تتعلق بالحالة المدروسة، كأن نسجل بيانات عن عدد المتزوجين تحت سن الثلاثين في منطقة معينة مثل سن الزواج وتاريخه وعدد الأطفال. تقدم هذه البيانات قاعدة قوية للحصول على الكثير من المعلومات التي يحتاجها الإحصائي للإجابة عن الأسئلة التي صمم هذه الدراسة لأجلها. القياس measurement تُعنى هذه الطريقة بالحصول على بيانات كمية (سنتحدث عنها لاحقًا) ثابتة توصّف الحالة المدروسة، ويقصد بالحصول على قيمة: إجراء ما يلزم من الاختبارات لتحديد القيمة المقاسة بأقل خطأ ممكن. من الأمثلة على البيانات المحازة عن طريق القياسات درجات الحرارة في مدينة محددة أو منسوب المياه في نهر خلال العام أو كمية المشتريات من منتج محدد وغيرها. التحليل analysis تهدف هذه العملية إلى تفكيك ظاهرة مجهولة أو مجموعة معلومات مجهولة التكوين إلى بياناتها الأولية لفهمها والاستفادة منها كالبيانات الناتجة عن تحليل الطيف الضوئي لنجم بعيد أو تحليل إشارة لاسلكية مركبة إلى مكوناتها الأساسية للحصول على بيانات تتعلق بالتردد والشدة. إذًا فعمليات الحصول على أنواع البيانات أو حيازتها تتعلق بالظاهرة المدروسة والهدف النهائي من هذه الدراسة والمعلومات التي يجب الحصول عليها أو فهمها تمهيدًا لتخزينها أو وضعها حيز التطبيق. أنواع تخزين البيانات تخزن البيانات في وسائط تخزين والتي إما أن تكون فيزيائية باستعمال الأوراق والدفاتر وكل ما يصلح للكتابة عليه أو باستعمال وسائط تخزين رقمية عبر الحواسيب التي هي الأشيع حاليًا بما أنها تسهل عمليات البحث والفهرسة ومعالجة البيانات. فبالنسبة لتخزين البيانات في الحواسيب، فإنها تعتمد على وسائط تخزين رقمية مثل الأقراص المدمجة والأقراص الصلبة HDD وذواكر الحالة الصلبة SSD والتي تتطور تدريجيًا مع الزمن وفيها إما أن تخزن البيانات مباشرةً باستعمال نظام ملفات يوفره نظام التشغيل أو تخزن بطريقة مهيكلة عبر جداول مثلًا لتسهيل معالجتها والوصول إليها وهنا يمكن استعمال برامج بسيطة مثل برنامج إكسل من مايكروسوفت أوفيس وقواعد بيانات أكسس وحتى استعمال قواعد بيانات مخصصة تكون عادة الأساس الذي ترتكز عليه تطبيقات الحاسوب كلها. تصنيف أنواع البيانات Data Types أنواع البيانات Data Types تُصنّف ضمن ثلاثة فئات رئيسية هي: البيانات الكمية quantitative data البيانات النوعية qualitative data البيانات المنطقية logical data وسنشرح كل تصنيف منها. البيانات الكمية البيانات الكمية هي البيانات التي تأخذ قيمًا عددية أو ناتجة عن الموازنة مع مقاييس عددية ومن الأمثلة عليها ارتفاع بناء، فلا بد من أن يكون قيمة عددية محددة 30 متر مثلًا، أو أن تحدد مستوى مهارتك في لغة برمجة معينة على مقياس من 1 إلى 10. تنتج هذه البيانات عن طريق قياس المقادير عبر الأجهزة المختلفة كمقاييس الضغط والحرارة والارتفاع، وقد نحصل عليها من الاستبيانات questionnaire التي تُنشر وتتطلب الإجابة عنها عن طريقة التقييم العددي لأسئلتها. قد نجد أيضًا تصنيفات فرعية لهذا النوع من البيانات: بيانات منفصلة discrete data: وهي بيانات كمية تأخذ قيمها من مجموعة قيم محددة سلفًا كعدد الوجبات التي يمكن للمطاعم أن تقدمها أو عدد الأولاد في عائلة محددة. بيانات مستمرة continuous data: وتمثل عادة القيم التي تقيسها التجهيزات والتي يمكن أن تأخذ أي قيمة عددية ضمن مجال محدد مثل درجات الحرارة، ويمكن تصنيف هذه الأخيرة إلى: بيانات مجالية interval data: وهي بيانات تمثل قيم عددية مرتبة تزيد كل قيمة عن التي تسبقها بمقدار محدد تمامًا كأن نعرض تسلسل طلبات الشراء، أو أن نسجل ارتفاع بالون في الجو كلما ارتفع 10 أمتار عن سطح البحر. بيانات نسبية Ratio data: وهي بيانات مستمرة تمثل نسبة تكرار حالة إلى جميع الحالات الممكنة كأن تحدد احتمال إصابة هدف أو إمكانية ولادة طفل مصاب بمرض وراثي. بيانات إحصائية: وهي البيانات التي تنتج عن تطبيق العلاقات الرياضية الخاصة بالإحصاء ومن أنواع البيانات الإحصائية: المتوسط الحسابي mean: ويقيس مجموع عدة قراءات إلى عددها كأن نحسب المتوسط الحسابي لأطوال الذكور في بيئة معينة بجمع أطوال جميع الذكور المشاركين في الدراسة ثم تقسيم الناتج على عددهم. المتوسط الهندسي geometric mean: وهو الجذر من المرتبة n لجداء القراءات المتعلقة بظاهرة معينة. الوسيط median: ويحدد القيمة التي تأتي في وسط مجموعة قيم مرتبة أي بمعنى آخر القيمة التي تقسم مجموعة قيمة مرتبة إلى مجموعتين متساويتين. الانحراف المعياري standard deviation: ويمثل مقدار ابتعاد عينة عن المتوسط الحسابي. المدى range: الفرق بين أعلى وأدنى قراءة من مجموعة قراءات. المنوال mode: ويحدد القيمة أو القيم الأكثر ورودًا. البيانات النوعية البيانات النوعية هي البيانات التي تصف نوعية أو خصائص الظاهرة المدروسة وبالتالي هي غير قابلة للعد وصعبة القياس والتحليل الدقيق، كأن تكون ملاحظات مأخوذة عن نوعية الوجبات المقدمة في مطعم أو أسماء الناجحين في اختبار. قد تكون هذه البيانات على شكل كلمات تصف الظاهرة ولا تحتاج إلى تحليل أبعد أو يمكن أن تكون لهذه البيانات أنماط محددة أو معانٍ محددة لا بدّ من تحليلها للحصول على المعلومات المطلوبة مثل سمات السلوك العدواني لعينة من المرضى النفسيين أو الميزات الأنسب لأحد المرشحين للحصول على وظيفة معينة. كما قد تكتب البيانات النوعية على شكل بيانات رقمية لكنها لا تحتمل معنى الأعداد الرياضي ولا توازن بأعداد لا تماثلها كأن نجعل الرقم 1 يدل على جنس المولود إن كان أنثى و 0 إذا كان ذكرًا. وقد نجد أيضًا تصنيفات فرعية لهذا النوع من أنواع البيانات مثل: بيانات فئوية categorical data: وهي بيانات تمثل ميزة محددة للعينة المدروسة مثل العمر، والجنس، واللغة. بيانات مسماة nominal data: وهي بيانات نوعية تأخذ قيمها ضمن مجموعة محددة من الخيارات كأن تختار لغة من بين خمس لغات محددة سلفًا أو أن تختار تقييمًا لخدمة زبائن من بين عدة تقييمات متاحة. بيانات مرتبة ordinal data: وهي ببساطة بيانات مسماة لكنها مرتبة على أساس محدد كأن تحدد البيانات قائمة العقوبات التدريجية التي تطبق على مخالفي النظام الداخلي لمؤسسة او شركة أو تسلسل خطوات إصلاح خلل في برنامج. ما الفرق بين البيانات الكمية والنوعية؟ شرحنا ما هي البيانات الكمية والنوعية ويجدر الذكر أنه يمكن لعينة بيانات نفسها أن تنقسم إلى بيانات كمية ونوعية في الوقت نفسه مثل عينة بيانات من مجموعة مدارس، فقد تنقسم إلى بيانات كمية من عدد الطلاب وقد تنقسم إلى بيانات نوعية بناءً على جنس الطلاب بين ذكر وأنثى وهكذا لذا وجب التفريق جيدًا بين البيانات الكمية والنوعية. أمر آخر وهو أن العمليات المطبقة على البيانات الكمية قد تختلف أغلب الأحيان عن تلك المطبقة على البيانات النوعية فقد يصلح تطبيق عمليات إحصائية وعمليات رياضية على بيانات كمية في وقت لا يصلح تطبيقها على بيانات نوعية بما أن قيمة البيانات الكمية تمثَّل مباشرةً بعدد، وهذا خلاف البيانات النوعية فحتى لو مثلناها بعدد مثل تمثيل الطلاب الذكور بعدد 1 والطلاب الإناث بعدد 2 فهو طريقة لعرض البيانات بشكل آخر. البيانات المنطقية وهي أبسط أنواع البيانات، وتجيب عن سؤال ما بصحيح أو خاطئ، نعم أو لا وقد تأخذ إحدى القيمتين الرقميتين 0 أو 1، وتدعى أيضًا البيانات البوليانية نسبة إلى الجبر البولياني. قد تصنف هذه البيانات على أنها بيانات نوعيّة إذا جاءت على شكل "صحيح/خاطئ" أو "نعم/لا"، وقد تصنّف أنها بيانات كمية إن جاءت على شكل "0/1". أنواع البيانات في الحاسب عزز ظهور الحواسب قدرة البشر على حيازة وتخزين كميات هائلة من البيانات وأمنت الوسائل اللازمة لتحليلها واستخلاص المعلومات عنها والاستفادة من تلك المعلومات في عمليات اتخاذ القرار، ولا تختلف أنواع البيانات في الحاسب وفي العالم الرقمي من حيث التعريف والغاية لكنها تخزّن وتعالج بطريقة أفضل وأسرع، لهذا السبب وضعت بعض التصنيفات الفرعية وحددت أنواع للبيانات تلائم طريقة عمل الحواسيب. تمثّل البيانات في الحواسيب على شكل سلاسل من الواحدات والأصفار وهي ما يفهمه الحاسوب أولًا وآخرًا ويُدعى أصغر حجم لتخزين عنصر البيانات "بت Bit" ويخزن القيمة 0 أو 1 ومن البت يتكون البايت Byte الذي هو 8 بت والكيلو بايت والميغا بايت …إلخ. تصنيفات البيانات الرقمية تُدعى أنواع البيانات التي تُخزّن على شكل سلاسل من الأصفار والواحدات وتعالج وفق هذه الطريقة بالبيانات الرقمية digital data، وقد نجد أن البيانات الرقمية قد تأخذ أصنافًا جديدة منها: بيانات مهيكلة structured: تُرتب البيانات المهيكلة وفق نموذج بيانات محدد لتسهل معالجتها وتخزينها والوصول إليها مثل الجداول المكوّنة من أسطر وأعمدة والتي تُعد أساس قواعد البيانات العلاقيّة relational databases أو على شكل بنية هرمية متداخلة hierarchical data structure أو أنها قادرة على تخزين كائنات objects لها هيكليات محددة سلفًا. بيانات غير مهيكلة not structured: البيانات غير المهيكلة هي تلك التي تُنظّم فيها البيانات بطريقة محددة كأن توضع في ملفات نصية أو تُستخدم بعض اللغات التوصيفية في تنظيمها. بيانات وصفية metadata: وهي بيانات نصية تصف بيانات أخرى كأن تحدد إصدار برنامج وتاريخ الإصدار ومعلومات عن ترخيص الاستخدام وهكذا. بيانات خام raw Data: وهي تسلسل غير منسّق من الواحدات والأصفار يُخزّن للمعالجة اللاحقة. القواميس dictionary: وهي نوع من أنواع البيانات التي يمكن الوصول إليها بطريقة "مفتاح-قيمة" أي تُفهرس فيها بيانات "القيمة" وفقًا لبيانات "المفتاح" وللوصول إلى القيمة قراءةً أو تخزينًا لا بد من معرفة المفتاح المرتبط بها. البيانات الضخمة big data: ظهر هذا المصطلح في فترة قريبة نسبيًا ليدل على أنواع البيانات التي تتجاوز أحجامها البيتا بايت (1000 تيرا بايت)، وبالتالي سيصعب معالجة هذا الكم الهائل من البيانات من قبل حاسوب واحد أو تنظيمها باستخدام قواعد البيانات النمطية، لهذا توزّع المهام على عدة حواسب رئيسية تتمتع بقدرات كبيرة في المعالجة من خلال استخدام خوارزميات واختبارات متقدمة بغية استخلاص المعلومات والرؤى التي تقدمها تلك البيانات خلال فترة زمنية مقبولة. أنواع البيانات في لغات البرمجة تختلف أنواع البيانات التي تستخدمها لغات البرمجة للتعبير عن القيم التي تتعامل معها وفقًا للغة البرمجة نفسها فكل لغة برمجة لها مجموعة أنواع بيانات محددة تتعامل معها توضحها في توثيقها الرسمي فانظر مثلًا مقال أنواع البيانات في لغة بايثون في أكاديمية حسوب وقسم أنواع البيانات في لغة بايثون في توثيق موسوعة حسوب وكذلك صفحة أنواع البيانات في لغة PHP وصفحة أنواع البيانات الأساسية في لغة TypeScript وصفحة أنواع البيانات الأساسية في لغة كوتلن وغيرها، فكل لغة كما أشرنا تملك أنواع بيانات تحددها صراحة لما يترتب عليها لاحقًا من ضبط العمليات التي يمكن تنفيذها على كل نوع بيانات، فمثلًا الأعداد تطبق عليها عمليات رياضية من جمع وطرح وضرب والنصوص تطبق عليها عمليات القص والجمع مع نصوص أخرى والتنسيق وغيرها. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن وتنقسم لغات البرمجة في طريقة تحديد أنواع البيانات إلى قسمين إما بتحديدها صراحةً أثناء كتابة الشيفرة وتدعى آنذاك لغات برمجة صارمة في تحديد الأنواع Strongly typed language أو بترك الأمر للغة البرمجة لتحديدها أثناء تنفيذ الشيفرة وتدعى آنذاك لغات برمجة متهاونة في تحديد الأنواع Loosely typed language. أما في لغات البرمجة التي تعد صارمة في تحديد الأنواع مثل لغة سي C وجافا Java، فهي تفرض على المبرمج تحديد نوع المتغير عند تعريفه أول مرة ويبقى هذا النوع ملازمًا له طيلة عمل البرنامج ولا يمكن تغييره مطلقًا ولا يمكن استعماله إلا في العمليات المرتبطة بنوعه المحدد وغيرها من القواعد الأخرى التي تختلف باختلاف اللغة، فالمثال التالي من لغة سي يعرِّف ثلاثة متغيرات الأول عدد صحيح والثاني عدد عشري والثالث محرف واحد: int intNumber = 2; float floatNumber = 2.3; char character = 'e'; وإن لم يتبع المبرمج هذه القواعد فسيحصل على خطأ قبل تنفيذ الشيفرة وقت تصريفها (إن كانت اللغة مصرَّفة compiled مثلًا)، فستحصل على خطأ إن جربت جمع العدد الصحيح intNumber السابق مع الحرف character بالشكل intNumber + character مباشرةً وكذلك إن أردنا جمعه مع العدد العشري floatNumber وهنا يجب إجراء عملية تحويل صريحة للنوع انظر مثلًا: int intNumber = 2; float floatNumber = 2.3; int sum = intNumber + (int)floatNumber; printf("Value of sum : %d\n",sum); عندما جمعنا العدد الصحيح intNumber مع العدد العشري floatNumber حولنا الأخير إلى عدد صحيح عبر تحديد النوع بين القوسين قبل المتغير ثم جمعنا العدد لنحصل على الناتج التالي: Value of sum : 4 ولاحظ أن الفاصلة العشري قد أُهملَت بما فيها من أجزاء عشرية وهذا ناتج عملية التحويل. تختلف لغات البرمجة أيضًا من ناحية التصريح والتلميح في عمليات التحويل بين الأنواع casting ففي التصريح يضطر المبرمج إلى ذكر النوع المراد التحويل إليه صراحةً وسيحصل على خطأ إن لم يفعل، وفي التلميح تكون اللغات ذكية في استنتاج النوع المراد التحويل إليه وتدعى smart casting فمثلًا إن جربت ما يلي في لغة سي: int intNumber = 2; float floatNumber = 2.3; int sum = intNumber + floatNumber; printf("Value of sum : %d\n",sum); فستحصل على الناتج 4 كعدد صحيح لأن لغة سي مباشرةً حولت العدد العشري إلى صحيح بما أن المتغير الذي سنخزن فيه النتيجة من نوع عدد صحيح وكذلك العدد الأول عدد صحيح، أما إن جربنا ما يلي: int intNumber = 2; float floatNumber = 2.3; float sum = intNumber + floatNumber; printf("Value of sum : %f\n",sum); فستحصل على ناتج 4.3 حتى لو كان العدد الأول صحيح إلا أن المتغير المراد تخزين القيمة فيه اختلف نوعه فاختلفت عملية التحويل الآلية وجرى تحويل العدد الصحيح إلى عدد عشري. وأما في لغات البرمجة التي تعد متهاونة في تحديد النوع مثل جافاسكربت وبايثون ولغة PHP فلا حاجة لتحديد أنواع البيانات للمتغيرات ويكتفي المبرمج بالتصريح عن المتغير فقط دون نوعه، فانظر إلى المثال التالي في لغة جافاسكربت الذي يعرف المتغيرات الثلاثة كما في المثال السابق: let intNumber = 2; let floatNumber = 2.3; let character = 'e'; سيُترك الأمر إلى لغة البرمجة لتحديد نوع المتغير أثناء وقت تنفيذ الشيفرة runtime لتحديد العمليات التي يمكن تنفيذها مع كل متغير وفق نوع، ولاحظ أنه يمكن لمتغير أخذ نوع عدد صحيح أن يأخذ نوع آخر مثل عدد عشري أو نص ولا يُعد ذلك خطأ: let intNumber = 2; intNumber = 'e'; وأما بخصوص عمليات التحويل بين الأنواع فهو أمر متروك كليًا إلى لغة البرمجة وذكائها، فإن جربنا الجمع بين العدد الصحيح والعشري كما فعلنا مع لغة سي الصارمة في تحديد الأنواع: let intNumber = 2; let floatNumber = 2.3; let sum = intNumber + floatNumber; console.log('Value of sum: ' + sum) فسنحصل على النتيجة التالية: Value of sum: 4.3 لاحظ أن عملية التحويل مالت إلى كفة العدد العشري ولاحظ أيضًا أننا جمعنا نصًا 'Value of sum: ' مع عدد sum أثناء طباعة النتيجة وكان الناتج نصًا ولم نحصل على خطأ بل اجتهدت لغة جافاسكربت في عملية التحويل ما يمكنها قبل أن تطلق أي خطأ للمبرمج، وقد شاعت الكثير من الدعابات بين المبرمجين حول عثرات لغة جافاسكربت تحديدًا في ضبط عملية التحويل بين أنواع البيانات بدقة. وهذا الأمر يربك المبرمجين بعض الأحيان في اللغات المتهاونة في تحديد النوع لعدم معرفة نوع البيانات النهائي للعملية بالضبط، فتخيل مثلًا في تطبيق بنكي مبني بلغة متهاونة في ضبط النوع أو أن الأمر متروك للغة البرمجة لاستنتاج نوع البيانات أثناء وقت التنفيذ فيرسل مستخدمًا مبلغ 100.54 دولار لصديقه ليستلم الأخير مبلغ 100 فقط ويُعلل الأمر بأن لغة البرمجة قد أخطأت في عملية تحويل نوع البيانات لذا اختيار طريقة التعامل مع البيانات أمر مهم جدًا يعتمد على نوع التطبيق المراد العمل عليه! في النهاية، المتغيرات في لغات البرمجة هي حاويات للبيانات التي تصنف إلى أنواع وقد تُحدد أحجام تلك الحاويات وفقًا لحجم البيانات المخزنة فيها تلقائيًا كما في اللغات المتهاونة في تحديد النوع أو وفقًا لنوع البيانات المحدد لها ويحصل خطأ إن تجاوزت البيانات الحجم المضبوط بنوع البيانات ذاك كما في اللغات الصارمة في تحديد النوع فمثلًا يأخذ متغير بنوع بيانات short حجم 2 بايت من الذاكرة لتخزين أعداد تتراوح بين القيمة -32768 والقيمة 32767 فقط بينما يأخذ متغير من النوع bool حجم 1 بت فقط في لغة سي. وأيًا كانت أنواع البيانات التي تُعرّفها لغات البرمجة المختلفة إلا أنها تشترك جميعها بأنواع بيانات عامة سنتحدث عنها بالتفصيل. الأعداد الصحيحة تعبّر الأعداد الصحيحة Integer عن البيانات بالأعداد الكاملة أي دون فواصل عشرية سواء كانت الأعداد موجبة أو سالبة مثل 5، 110-، 42345، وهكذا، وتُستخدم الأعداد الصحيحة لتمثيل مقادير مثل عدد الولادات في عام أو عدد مرات وقوع حدث معين أو الأرقام التسلسلية لمنتجات أو رقم جواز السفر وما شابه. تمثل لغات البرمجة الأعداد الصحيحة ببايت واحد أو 2 بايت أو 4 بايتات، ويعود السبب في ذلك إلى حجم البيانات التي تريد تمثيله فإن أردت أن تمثل أعدادًا صحيحة من 0 إلى 100 مثلًا لا حاجة عندها لأربعة بايتات ويُكتفى ببايت واحد، أما إن احتجت إلى تخزين أرقام ضخمة ككتلة الأرض مثلًا فستحتاج إلى عدد صحيح من أربع بتات بالتأكيد. إليك بعض الأمثلة: في اللغة C++/C: // متغير حجمه أربعة بايتات ويخزّن فيه بيانات عددية صحيحة سالبة وموجبة int a =0; // متغير حجمه بايت واحد ويخزّن فيه بيانات عددية صحيحة موجبة وسالبة int8_t a=0; // متغير حجمه بايتين ويخزّن فيه بيانات عددية صحيحة موجبة وسالبة int16_t a=0; // متغير حجمه بايت واحد ويخزّن فيه بيانات صحيحة موجبة فقط uint8_t a=0; في اللغة Java: // متغير حجمه بايت واحد ويخزّن فيه بيانات عددية صحيحة موجبة وسالبة byte x=0; // متغير حجمه بايتين ويخزّن فيه بيانات عددية صحيحة موجبة وسالبة short x=0; // متغير حجمه أربعة بايتات ويخزّن فيه بيانات عددية صحيحة موجبة وسالبة int a=0; إذًا تختلف طريقة تمثيل الأعداد الصحيحة وفقًا للحجم المحجوز من الذاكرة من لغة إلى أخرى ويمكنك العودة إلى ويكيبيديا لتتعرف على طريقة تمثيل البيانات الصحيحة في أكثر اللغات انتشارًا. الأعداد الحقيقية تمثل الأعداد الحقيقية Real numbers جميع الأعداد الصحيحة والعشرية ذات الفاصلة الموجبة منها والسالبة مثل 2.56 أو 2341.234- وهكذا، وتُستخدم هذه الأعداد عند الحاجة إلى تخزين قراءات لمقادير فيزيائية مثل درجات الحرارة أو نواتج العمليات الحسابية المتنوعة كناتج عملية قسمة أو حساب الجذور التربيعية وما شابه. تمثل لغات البرمجة الأعداد الحقيقية بكلمة ذات أربع بايتات 232 عددًا أو كلمة ذات ثمان بايتات 264 عددًا، وتختلف تسمية الأعداد الحقيقية من لغة إلى أخرى. إليك بعض الأمثلة: في اللغات #C++/Java/C: // متغير حجمه أربعة بايتات ويخزّن فيه بيانات عددية حقيقية بإشارة float a=0; // متغير حجمه ثمان بايتات ويخزّن فيه بيانات عددية حقيقية بإشارة double a=0; الاختلاف بين نوع البيانات float ونوع البيانات double هو في دقة الأجزاء العشرية أي الأرقام المخزنة بعد الفاصلة العشرية، فالثاني هو عدد عشري مضاعف الدقة عن الأول. البيانات المنطقية البوليانية تمثل هذه البيانات إحدى القيمتين 0 أو 1 وتحجز بتًا واحدًا من الذاكرة، تُستخدم هذه البيانات لتخزين البيانات الناتجة عن أسئلة تحتمل فقط جوابًا بنعم/لا أو صح/خطأ، كأن تكون غرفة في فندق ما محجوزة أو هل اشترى عميل منتج معين أم لا وهكذا. إليك بعض الأمثلة: في لغة JAVA: // متغير حجمه بت واحد ويخزّن فيه قيمة منطقية 0 أو 1 boolean a=1; في لغة ++C: // متغير حجمه بت واحد ويخزّن فيه قيمة منطقية 0 أو 1 bool a=0; المحارف والنصوص تُمثّل هذه البيانات محرفًا واحدًا character كحرفٍ "ب" مثلًا أو رمزٍ "#" مثلًا أو علامة ترقيمٍ ":" مثلًا أو بعض المحارف الخاصة (لها استخدامات خاصة ولا تطبع على الشاشة كالمحارف التي تهيئ موقع الحركات في اللغة العربية)، وتُمثّل المحارف بكلمة من بايت أو بايتين أو ثلاثة أو أربعة وذلك وفقًا لطريقة الترميز. فترميز ASCII مؤلف من 128 أو 256 محرفًا أي يستخدم بايت واحد وقد وُسِّعت إلى الترميز الموحد UTF-8 الذي يستخدم من بايتين إلى أربعة بايتات ويرمز ملايين المحارف التي تغطي معظم الرموز والحروف في جميع اللغات المعروفة كما ظهرت توسيعات أخرى لمحارف ASCII مثل ISO وOEM وwindows125x وغيرها. تتعامل مختلف لغات البرمجة مع المحارف وتعرفها بطرق مختلفة، وإليك بعض الأمثلة: في لغات ++JAVA/C#/C: // متغير يعبّر عن محرف واحد char ch="#"; هذا بخصوص المحارف ولكن ماذا لو أردنا تخزين نص في متغير؟ النص String هو في الواقع سلسلة متلاحقة من المحارف أو مصفوفة من المحارف array of characters وبالتالي تُشتق الأنواع النصية انطلاقًا من المحارف وتتعامل معها انطلاقًا من العمليات على المحارف أيضًا، وتُعرف معظم اللغات هذا النوع بالاسم string. إليك مثالًا: في لغة ++C: #include <string> //إدراج المكتبة المعيارية الخاصة بالتعامل مع النصوص using std::string // استخدام فضاء أسماء النوع النصي int main(){ string s1= "مرحبًا"; sting s2="أيها العالم"; cout<< s1+s2;// "ستكون النتيجة "مرحبًا أيها العالم return 0; } انتبه إلى أنَّ لغة البرمجة قد تعامل المحرف معاملة النص وتدخله ضمن نوع النص String مثل لغة جافاسكربت وقد تميز اللغة بين المحرف Char وبين النص أو السلسلة النصة String كما في لغة جافا وسي. أنواع البيانات مقابل هياكل البيانات تُدعى الأنواع المدمجة في أي لغة بالأنواع الأساسية basic أو البدائية primitive ويمكنك استخدامها مباشرة في تعريف المتغيرات دون أية مقدمات فلغة جافاسكربت مثلًا التي تتصف بأنها متهاونة في تحديد أنواع البيانات تملك الأنواع الأساسية التالية: String: يمثل النصوص والسلاسل النصية. Boolean: يمثل القيم المنطقية مثل صح/خطأ. Number: يمثل الأعداد. BigInt: يمثل الأعداد الكبيرة جدًا. Undefined: يمثل عدم التعريف. Null: يمثل القيمة الفارغة أو عدم وجود قيمة. Symbol: يمثل الرموز الفريدة الخاصة. Object: يمثل هيكلة لتخزين البيانات. ناقشنا بعض الأنواع السابقة في القسم السابق والتي قلنا أن أغلب لغات البرمجة تشترك فيها ولكن أريد التركيز على النوع الأخير Object فقد تطلق لغة البرمجة على طريقة وهيكلة محددة لتخزين البيانات بنوع بيانات وقد تكون من ضمن الأنواع الأساسية كما رأينا في لغة جافاسكربت التي هي عبارة عن طريقة تخزين بيانات على شكل مفتاح/قيمة key/value مثل: const colorsObj = { black: '#000000', white: '#ffffff', red: '#ff0000', cyan: '#00ffff', pink: '#ffc0cb' } لاحظ أننا ربطنا اسم كل لون بقيمته الست عشرية والتي تمثِّل سلسلة نصية string ويمكننا الوصول إلى قيمة اللون الأسود مثلًا بالشكل colorsObj.black، ويمكن وضع أي نوع بيانات من الأنواع السابقة مكان النص. ومن هذه الهيكلة تُشتق هياكل بيانات أخرى أشهرها على الإطلاق المصفوفات Arrays التي تمثل بالشكل التالي في جافاسكربت: const colorsObj = [ '#000000', '#ffffff', '#ff0000', '#00ffff', '#ffc0cb' ] ستجد الكثير من أشكال هياكل البيانات ولا يسعنا في هذا المقال حصرها كلها ولكن وجبت الإشارة إليه بأنه وسيلة مهمة جدًا لتنظيم البيانات وهيكلتها وقد يعدها البعض نوعًا من أنواع البيانات إلا أنها عبارة عن حاويات تحوي البيانات وتسهل الوصول إليها. أنواع البيانات المستخدمة في قواعد البيانات تحدد معظم قواعد البيانات -وهي برمجيات صممت لاحتواء البيانات وتنظيمها والتعامل معها- أنواع البيانات التي تخزّنها كي يسهل التعامل معها وتعديلها، وتستعمل قواعد البيانات جميع الأنواع التي تستخدمها لغات البرمجة أي: الأعداد الصحيحة integer. الأعداد العشرية (وهي أعداد حقيقية) ذات الفاصلة العائمة float. البيانات المنطقية (0 أو 1). المحارف character. القيم النصية string. ويضاف إليها: المحارف متغيرة الطول varchar: وتمثل مجموعة محددة الطول من المحارف المتتابعة فعندما نحدد نوع أحد البيانات على أنه varchar(20) أي أن العدد الكلي للمحارف في هذا المتغير هو 20 محرفًا. القيم الزمنية والتاريخ date-time: وتخزن بيانات تتعلق بالتاريخ (يوم:شهر:سنة) والوقت (ساعة:دقيقة). إن كنت ستتخصص في قواعد البيانات وستعمل مع أحد أنظمة قواعد البيانات، فيمكنك آنذاك التحقق من توثيقات قاعدة البيانات التي ستستخدمها وما ستوفره من أنواع بيانات يمكن استخدامها، وعمومًا ننصحك بالاطلاع على مقال البيانات في SQL: أنواعها والقيود عليها وانظر أيضًا توثيق أنواع البيانات في لغة SQL العربي من موسوعة حسوب. ملاحظة: تطور حاليًا ما يُدعى بقواعد البيانات الكائنية OODB التي تخزّن بياناتها على شكل كائنات بدلًا من الأنواع الأساسية التي تعرفنا عليها وستجد لنفسها قريبًا مكانًا في عالم البيانات الضخمة المتغير. خاتمة رأينا في هذا المقال أن الأساس المتين للمعرفة البشرية مبني على البيانات التي نستخلصها من بيئتنا المحيطة عند محاولة فهم أو توصيف أو تحليل ما يجري حولنا. لقد حُفظت البيانات على جدران الكهوف وعلى جلود الحيوانات وعلى الأوراق وفي الكتب وصولًا إلى الخوادم المخصصة التي تخزن كميات هائلة من أنواع البيانات وتساعد عبر إمكاناتها التقنية في معالجة هذه البيانات وإيجاد الروابط فيما بينها والحصول على معارف ورؤىً جديدة. تحدثنا أيضًا عن طرق حيازة المعلومات وكيفية تصنيفها، وتعرفنا على الطريقة الرقمية في تخزين واسترجاع البيانات، وفصلنا الشرح في أنواع البيانات في لغات البرمجة وضربنا مختلف الأمثلة عليها لما لها من أهمية كبيرة في فهم أي لغة برمجة تريد أن تتعلمها. وهكذا نكون قد أحطنا ببعض المفاهيم الأساسية التي قد تجدها عونًا لك إن أردت الخوض في مجال البيانات المزدهر وسريع التطور كتحليل البيانات وتصميم قواعدها وتحليل الأنظمة والحوسبة الحدية والتنقيب في البيانات الضخمة أو حتى العمل في البرمجة التي ستعالج البيانات أولًا وآخرًا. اقرأ أيضًا تعلم البرمجة المدخل الشامل لتعلم علوم الحاسوب علم البيانات Data science: الدليل الشامل مفهوم علم البيانات Data Science المرجع الشامل إلى تعلم لغة بايثون1 نقطة
-
قد يتأخر الرد أحياناً، هل لازلت لا تستطيع الوصول إلى دروس الدورة؟ إذا كان الأمر كذلك سأرفع المشكلة للمشرفين كي تُحل في أقرب وقت.1 نقطة
-
ولكن انا مشترك منذ حوالي 24 ساعة وتواصلت مع الدعم ولم يرد علي احد !1 نقطة
-
هل يُمكنك الوصول لدروس الدورة التي اشتركت بها ؟ يُمكنك الوصول لصفحة دوراتي من خلال الرابط التالي: دوراتي من الممكن أنه لم يتم ربط حسابك بالدورة بعد لذلك في هذه الحالة يُمكنك الإنتظار قليلاً أو مراسلة الدعم الفني للإستفسار عن الأمر: مركز المساعدة1 نقطة
-
مرحبا ، مساء الخير أعزائي يوجد عندي سؤال واريد منكم مساعدتي فيه وأكون شاكر لكم وهو عن دالة مي شيك في C++ ،، وهو أكتب برنامج بلغة ++ C لدالة تدعى MyCheck تقوم باستقبال عددين صحيحان X , Y وإعادة الرقم الأكبر منهما وفي الدالة الرئيسية main يتم ادخال العددين من المستخدم ثم استدعاء الدالة ثم طباعة الرقم الأكبر1 نقطة
-
1 نقطة
-
ما الفرق بين هذه الطريقة function sum( num1 , num2 ){ if (!num2) num2 = 0; console.log( num1 + num2); } sum(4); هذه الطريقة function sum( num1, num2 = 0 ){ console.log( num1 + num2); } sum(4);1 نقطة
-
في هذه الحالة لا يوجد فرق عملي بين الطرقتين، وكلاهما يؤدي لنفس النتيجة، ولكن الطريقة الثانية مختصرة وواضحة أكثر، أيضًا في حالة التعامل مع مدخلات تكون قيمتها الإفتراضية عبارة عن قيمة منطقية Boolean فلن تفي بالغرض الطريقة الأولى ويجب عليك حينها إستخدام الطريقة الثانية، مثال لتوضيح الفكرة: function login(isVerified = false) { if(isVerified) { console.log('You Are Logged In!'); } else { console.log('Please Verify Your Account!'); } } login(); هنا لدينا دالة تقوم بتسجيل الدخول (كمثال فقط)، وتأخذ المعامل isVerified والذي لديه قيمة إفتراضية وهي false، في هذه الحالة إن أستعملنا شرط مثل الطريقة الأولى المذكورة في سؤال، فلن يفيد في أي شيء: // الشرط التالي لن يفيد في شيء if (!isVerified) isVerified = false; أيضًا في حالة إستعمال مدخلات يمكن أن يكون لها قيمة مثل null أو undefined فمن الأفضل إستعمال المدخلات الإفتراضية بدلًا من إستعمال طريقة الشروط conditions.1 نقطة
-
عندي سؤال أستاذ هل دورة علوم الحاسوب بها اي فصل يحتوي على (لغة الكوتلن) مثل فصول البايثون وال JS ؟؟ واذا الاجابة لا -- اذاً أي دورة تشمل لغة الكوتلن بعد حذف دورة التطبيقات الهاتف ؟!1 نقطة
-
ما الذي قمت بتجريبه و لم ينجح؟ لا يجب علينا إعطاءك الحل مباشرة فعندها لن تتحسن في اللغة. في حالك حدث خطأ و لم تستطع معرفة لماذا يمكنك السؤال عنه، و لكن عليك المحاولة.1 نقطة
-
الفرق باختصار أن الـ مجال الـ let بداخل القوسين الذي عرف بداخلهم، بينما الـ var يكون مجاله ضمن الدالة التي عرف بها. function print() { var firstname = "omar"; let lastname = " km"; console.log(firstname, lastname); // omar km { var fname = "ahmed" let lname = " mohammed"; console.log(fname, lname); // ahmed mohammed } console.log(fname); // ahmed console.log(lname); // Error } print(); كما تمت الإجابة على سؤالك اكثر من مرة على الموقع، اطلع على الإجابة التالية : كما يوجد مقالة كاملة تتحدث عن المتغيرات في جافاسكريبت : اطلع على var في موسوعة حسوب اطلع على let في موسوعة حسوب1 نقطة
-
لو كان لدي نشاط ماذا احدد من معايرر لتحليل المنافس ومن أي الجوانب يمكن معرفة المنافس بشكل أكبر1 نقطة
-
هل يجب علي ان اتعلم من البداية ام لا لانني اصلن اتيت لهذه الدورة لتعلم الووردبريس وتطوير او تصميم قوالبه . وذلك لقرض بيع الاستضافه1 نقطة
-
يمكن حل المشكلة بزيادة حجم الذاكرة المسموح استخدامها أو إلغاء ذلك الحد، عبر تعيين قيمة الخاصية memory_limit إما بقيمة حجم حد معين، مثلًا 256M أي 256 ميجابايت، أو بتعيينها بالقيمة 1- والتي تعني إلغاء ذلك الحد، يمكنك تعيين تلك القيمة لتُطبق بشكل عام ضمن ملف php.ini لنسخة PHP التي تستخدمها بتعديل القيمة لقيمة مناسبة كالتالي: memory_limit = 256M أو يمكنك إلغاء الحد من الذاكرة ضمن تطبيقك فقط باستخدام التابع ini_set وتمرير قيمة مناسبة بإضافة السطر التالي لبداية الملف: ini_set('memory_limit', '-1');1 نقطة
-
يبدو أن vite مازال يستعمل localhost عند بناء ملفات المشروع، حاول إضافة الكود التالي إلى ملف .env الخاص بك: ASSET_URL=https://yoursite.com مع تغير https://yoursite.com إلى عنوان الموقع الخاص بك. أو يمكنك تنفيذ الأمر التالي: heroku config:set ASSET_URL=https://yoursite.com1 نقطة
-
برنامج Office Word هو برنامج منفصل بحد ذاته، ولا يمكن دمجه في برامج أخرى للكثير من الأسباب، منها أنه مدفوع وليس مجاني، مغلق المصدر ولا يمكن لأحد التعديل عليه سوى شركة مايكروسوفت، واللغة المستعملة في إنشائه ليست JavaScript ... إلخ. ولكن كبديل يوجد العديد من المكتبات التي تسمح لك بإنشاء محرر نصوص بإستخدام HTML و JavaScript، منها: ckeditor tiny editorjs quilljs كل المحررات السابقة مبنية بإستخدام JavaScript ويمكن إستخدامها في تطبيقات Electron بدون مشكلة. كما أن كلًا منهم يوفر توثيق Documentation كامل لكيفية تثبيته وإستخدامه والتعديل عليه.1 نقطة
-
حاول عمل ترجمة عند القيام بالعمليات الحسابية، أي مثل استبدال الرموز ضمن السلسلة النصية التي تعرضها للمستخدم، أما باقي العمل برمجياً باللغة الانكليزية الرموز، مثل أحرف و أرقام و بعض الإشارات .. كامل الأمور البرمجية تكون بالإنكليزية، أما العرض بالعربية ['٠','١','٢','٣','٤','٥','٦','٧','٨','٩'] يمكنك استبدال الرموز بالدالة replace ثم إكمال العمل على الفكرة.1 نقطة
-
عمل جيد، ومشروع ممتاز! ما شاء الله الصفحة تعمل بشكل جيد جدًا، وهنا بعض الملاحظات البسيطة التي ستساعدك على جعلها أفضل حتى: قم بإضافة سكريبت start ليتم تشغيل المشروع في وضع production بدلًا من وجود سكريبت dev فقط، لأن مواقع الإستضافة مثل Vercel و Netlify و Heroku تعتمد عليه لتشغيل المشروع. تناسق الألوان جيد للغاية في أغلب الصفحة، ولكن لون النص الأصفر على خلفية بيضاء (في قسم services) يجعل النص صعب القراءة not legible، يمكنك إستخدام أداة إختيار الألوان في أدوات المطورين Dev Tools في المتصفح لمساعدك على إختيار ألوان ذات مقروئية أكبر، أنظر الصور التالية: عند فتح القائمة الجانبية sidebar وإختيار أحد الأقسام، لا يتم إغلاق القائمة بشكل تلقائي، ولكن يجب أن يتم الضغط على علامة X لإغلاقها يدويًا، وقد يربك هذا الأمر بعض المستخدمين. حاول أن تجعل كل العناصر في الصفحة متوازية من ناحية اليسار لجعل الشكل متانسق أكثر: روابط وسائل التواصل الإجتماعي لا تعلم في زيل الصفحة Footer حاول ضغط الصور الموجودة في الموقع الخاص بك، لأن بعض الصور حجمها كبير للغاية (أكبر من 250KB) قم بإضافة عنصر meta لوصف الموقع في رأس الصفحة Head <meta name="description" content="Put your description here."> قم بإضافة نص بديل alt في الصور التي تستخدمها في الموقع، ليعمل المستخدم ماهية هذه الصورة إن فشل تحميلها أو كان يستخدم أجهزة خاصة مثل Screen Reader، مزيد من المعلومات عن هذا الموضوع تجدها في هذه المقالة:1 نقطة
-
سبب المشكلة لديك هو أن التابع method2 ليس دالة عامة global function وإنما هو تابع method ضمن الكائن Obj، وبتالي بإستدعائها، يجب أن تستخدم this، على النحو التالي: const Obj = function(){ // ... } Obj.prototype.method1 = function(){ // في هذا الجزء نُشير إلى التابع method2 // الموجود ضمن الكائن Obj // وبما أننا داخل تابع آخر ضمن نفس الكائن // فيجب أن نستخدم this للإشارة إلى الكائن الحالي this.method2(); } // هنا نضيف التابع method2 إلى الكائن Obj Obj.prototype.method2 = function(){ console.log('execute method2'); } const o = new Obj(); o.method1(); وستجد أن التابع method2 يتم إستدعائه بشكل سليم.1 نقطة
-
1 نقطة
-
لا يوجد خطأ برمجي في الكود المرفق، ولكن ربما التدريب الذي تحاول حله يطلب منك شيء آخر غير طباعة hello world، وربما سبب المشكلة في المسافة الإضافية في جملة hello world ، لاحظ: #include <iostream> #include <string> int main() { std::cout << "hello world "; // ^^ } حاول أن تجعل جملة hello world نفس الشكل المطلوب، وبنفس حالة الأحرف (Capital - Small). وقد تكون هذه مشكلة ضمن الموقع الذي تتدرب عليه كذلك.1 نقطة
-
إن كنت تقصد دورة تطوير واجهات المستخدم فهي دورة خاصة بـ Frontend فقط، وستتخرج منها وأنت مطور واجهات أمامية Frontend، ولكن يوجد دورات أخرى في أكاديمية حسوب تُعلم تطوير الواجهات الخلفية (دورة خاصة بلغة PHP ودورة خاصة بلغة Ruby ودورة خاصة بلغة Python ودورة بلغة JavaScript)، كل هذه الدورات يتم شرح أساسيات الواجهات الخلفية والعديد من الأمور المتقدمة في هذا المجال، وبالتأكيد كل هذه الدورات تحتوي على العديد من المشاريع الشاملة. تستطيع الإطلاع على هذه الإجابة لمعرفة كل تفاصيل هذه الدورات:1 نقطة
-
يمكنك كذلك إستخدام الدالة get_parent_class، حيث تمكنك الدالة get_parent_class من معرفة الصنف الأب لأي صنف آخر (بما في ذلك الصنف الحالي عبر this$)، ومع إستخدام الصنف ReflectionMethod يمكنك تنفيذ التابع الباني constructor على النحو التالي: <?php class GrandFather { public function __construct() { echo "GrandFather's constructor \n"; } } class Father extends GrandFather { public function __construct() { // call GrandFather's constructor parent::__construct(); } } class Son extends Father { public function __construct() { $grandpa = get_parent_class(get_parent_class($this)); $reflectionMethod = new ReflectionMethod($grandpa, '__construct'); // calling grandFather constructor $reflectionMethod->invoke($this); echo "calling the constructor from " . $grandpa . " Class"; } } $son = new Son(); /* Output: GrandFather's constructor calling the constructor from GrandFather Class */ توثيق الدالة get_parent_class في موسوعة حسوب.1 نقطة
-
السؤال الأكثر شيوعًا الذي أتلقاه من جميع المستقلين الطموحين على اختلاف تخصصاتهم، هو كم يجب أن أتقاضى؟ ويُطرح السؤال لأسبابٍ عديدة، سواء أكان المستقل مبتدئًا ويخطو أول خطواته في مجال العمل الحر، أو متمرسًا ويريد إعادة التفاوض بشأن سعر خدماته مع العميل، إذ يبدو أن تحديد الميزانيّة والتفاوض عليها واحدةٌ من أكثر الجزئيات تعقيدًا وإخافةً في العمل الحر، ولا يجب أن تكون كذلك، لذا سأقدم اليوم نظرةً عامةً ومتعمقةً حول كيفية تحديد الأسعار والتفاوض عليها مع العملاء الحاليين والمُحتملين، فمن خلال خبرتي كوني كاتبًا مستقلًا، فإنني توصلّت إلى نصائحَ هامةٍ؛ تنطبقُ معظمها على أي تخصصٍ يُقدم الخدمات الحرّة. أدنى تسعيرة مقبولة أول شيءٍ يجب عليك فعله كونك مستقلًا هو معرفة أدنى الأتعاب التي تقبل أن تتقاضاها مقابل العمل مدة ساعة، أو ما يسمى بالسعر الأدنى المقبول، وإذا كنت تعمل فعليًا كمستقلٍ بدوامٍ كامل أو تخطّط لأن تصبح كذلك، فيجب أن تحتسب الحد الأدنى لسعر خدماتك كما يلي: لنأخذ مثالًا عمليًا ونُطبّق عليه، ولنفترض أن نفقاتك الشخصيّة الأساسيّة مثل المسكن والمأكل تبلغ 30.000 دولارًا، وأن تكلفة أداء العمل هي 5000 دولارًا سنويًا، وأنت تخطط للعمل 6 ساعاتٍ يوميًا لمدة 48 أسبوعًا في السنة؛ الإجمالي 1440 ساعة، فمن خلال هذه المعطيات، إليك طريقة حساب سعرك الأدنى للخدمات في الساعة (لا يتضمّن قيمة الضريبة): يبلغ السعر الأدنى المقبول 24.31 دولارًا / الساعة (أو ما يعادله بالعملة المحلية)، ثم أضف 20٪ للضرائب، فيصبح أدنى سعرٍ للخدمة هو 29.17 دولارًا / الساعة. إذا بدا الحساب أعلاه تقريبيًا بعض الشيء، فهذا لأنه كذلك، لذا لا ترهق نفسك في محاولة تحديد أدنى سعرٍ بدقّة، لأن هناك الكثير من المتغيرات تحول دون إتقان التضريبات الحسابيّة. على أي حال، تؤدي المعادلة أعلاه المهمة بما يكفي، طالما أن نسبة الخطأ فيها تطال بعض الجوانب المتحفّظ عليها فقط. هناك طريقةٌ أخرى لحساب الحد الأدنى للسعر، وهي بأن تأخذ قيمة راتبك السابق أو الحالي وتقسمه على عدد الساعات التي تخطّط للعمل خلالها، حيث أن من الممكن تغطية النفقات العامة الأخرى باستخدام ما وفره لك التخفيض الضريبيّ الذي سوف تحصل عليه بالعمل حرًا، ولكن قد ترغب في التأكد من ذلك بنفسك. أنا لست من المعجبين بهذا النهج، إذ من المحتمل أن تقلّل من قيمة نفسك كثيرًا، ولذلك لا بدّ أن يكسب المستقلون أكثر بكثير من الموظفين العاديين عند الموازنة بين الفريقين. على كلٍ قد تكون هذه نقطة انطلاقٍ جيّدة لك، لكن بالنسبة لي، كانت المعادلات الحسابية السابقة عنصرًا حاسمًا في اتخاذ قراري بشأن الاستقالة من وظيفتي. إذا كنت قد بدأت للتو في العمل كمستقلٍ بدوامٍ جزئي، فإن سعرك الأدنى يعكس إلى أي مدىً تُقدِّر وقتك الخاص، ومع ذلك أنت بحاجةٍ إلى العمل مقابل مبلغٍ من المال يضعك في حالةٍ عقليةٍ سليمة لتقديم خدمةٍ مثاليّة، وإذا قدمت خدمةً بمقابلٍ أقل، فقد تكون سيئًا في التنفيذ وينتهي بك الأمر إلى الإضرار بسمعتك. عندما تتطور ككاتبٍ مستقل، سوف تزيد متوسط سعرك بناءً على المبلغ الذي تطمح لكسبه، بدلًا من تقييم سعرك بناءً على المبلغ الذي يغطي احتياجاتك. صيغة التسعير عندما يتعلق الأمر بتحديد كيفية تسعير خدماتك، ابدأ بهذا الفهم الأساسي، يُعَد التسعير مقابل الساعة أحد أسوأ الأخطاء التي يُمكن أن يرتكبها المستقل، فهناك سببان رئيسيان لذلك: 1. يحد من إمكانات الكسب إذا كنت تتقاضى أتعابًا بالساعة، فسيكون من الطبيعي أن تعمل بكفاءةٍ أقل مما لو كنت قد حددت التسعير على أساس المشروع أو الخدمة ككل، وبالنظر إلى أن لديك عددًا معينًا من الساعات المتاحة في اليوم، فأنت تضع حدًا أقصى للأرباح المحتملة أساسًا، غير أنه يمكنك بالطبع رفع أتعابك للساعة، لكن لا يزال لديك نفس العدد المحدود من الساعات للعمل خلالها بالمعنى الحرفيّ والمجازيّ. من ناحيةٍ أخرى، إذا كنت تُسَعِّر على أساس كل وظيفةٍ أو مشروعٍ تستلمه، فأنت مقيدٌ فقط بسرعة إكمال عملك، وسوف تتعلم أيضًا العمل بإنتاجيةٍ أكثر، وبالتالي ستكسب أجرًا مكافئًا أعلى مقابل كل ساعة، وتثير إعجاب العملاء بأسلوبك الفعّال وتطوّرك السريع. 2. يؤثر سلبا على قرار عملائك سعر الساعة هو عَقبةٌ نفسيةٌ كبيرة للعديد من العملاء المحتملين، حيث أن نفس الوظيفة التي تُسَعَّر بطريقتين مختلفتين سوف تُثير ردود فعلٍ مختلفةٍ تمامًا. لنفترض أنه أتيحت لك الفرصة لكتابة مقالةٍ من 1500 كلمة، حول موضوعٍ معقدٍ وتقني يُصادف أنك على درايةٍ جيدةٍ به؛ ونظرًا لطبيعة المحتوى، يُسعَد العميل بدفع 150 دولارًا مقابل المقالة الواحدة، فلنفترض أن الأمر سيستغرق منك 3 ساعات، وتفترض 50 دولارًا سعرًا معقولًا للساعة، لكنّك لا تعرف ذلك عند تقديم عرضك. ما عليك فعله هنا، هو أن تنتبه لهذين النهجين المختلفين للتسعير: تُوضّح في عرضك أن كتابة المقالة ستكلف 150 دولارًا. تُقر في عرضك أن المقال سيستغرق حوالي ساعةً لكتابته، وسيُكلفك 150 دولارًا. سيقبل العميل الخيار 1 برضى، ومن المؤكّد أنه سيرفض الخيار 2 -وذلك لأسبابٍ نفسيةٍ ببساطة- ومبدأ إدراك القيمة؛ في هذا السياق، تطرق كريس جيلبو إلى هذا في مقالته المئة دولارًا الأولى The $100 Startup، حيث دفع 50 دولارًا إلى صانع الأقفال مقابل تصليحٍ سريعٍ جدًا وطارئ، لكن الكاتب شعر بالضيق بسبب المدفوع النقدي، ولهذا علّق كريس على طريقة تفكيره غير المنطقي قائلًا: سيشعر عميلنا الافتراضي بعدم الرضى غير المنطقي أيضًا، لو كان التسعير مطروحًا في العرض باستخدام الخيار 2، وهذا بنفس الطريقة التي شعر بها كريس بخصوص تجربة تصليح قفل سيارته المعطّل بسرعة، لكن للأسف فإن معظم الناس ليس لديهم حضور كريس العقلي لفهم وتحليل تفكيرهم غير المنطقي. يمكن أن يكون لكفاءتك والسرعة التي تُؤدّي بها عملك تأثيرٌ كبيرٌ على أرباحك النهائيّة، لكن لا تعرض خدماتك مقابل سعرٍ منخفضٍ للساعة فقط لأنك جيدٌ في ما تفعله وسريعٌ في التنفيذ. قيمة الخدمة من المهم دائمًا النظر إلى عملك من خلال عيون العميل ومن منظورٍ تجاري، ضع في حسبانك: كيف سيفيد عملك العميل؟ وكيف سيؤثر إيجابًا على أرباحهم النهائية؟ تحدد الإجابة على هذا السؤال جزئيًا المبلغ الذي يمكنك طلبه من صاحب المشروع. على سبيل المثال، إن كتابة مقالةٍ لمدونة شركةٍ صغيرةٍ سيكون تأثيرها محدودًا نسبيًا، أما إذا كنت تكتب نصوصًا إعلانيةً لشركةٍ ضخمةٍ متعدّدة الجنسيات، فقد تكون فائدة خدماتك هائلةً لهم، ويجب أن ترفع السعر وفقًا لذلك. ضع هذا في الحسبان، بينما تطوّر عملك في القطاع الحر، عندما يكون ذلك ممكنًا، ضع خدماتك في خانةٍ أحب أن أسميها "منطقة العملاء الكبار"، بدلًا من كتابة منشوراتٍ في مدونةٍ لعملاءٍ صغار، ثم وجّه خدماتك إلى تحرير المدونات المتطوّرة، بدلًا من تصميم الشعارات للشركات المحليّة الصغيرة، واعمل كمستشار تصميمٍ للشركات الضخمة. قد تبدو مثل هذه الأفكار غريبةً في هذه المرحلة من مشوارك المهني، ولكن من المدهش أن ترى إلى أين سوف يأخذك الجهد الإضافي والتخطيط لهذا الأمر. المنافسة يعتمد سعر خدمتك إلى حدٍ كبير على مقدار التسعيرة التي يقدمها منافسوك في مقابل نفس الخدمة، ولكن ما العمل الذي يتقاضون أجرًا منه؟ هل تستطيع استكشاف ذلك؟ ينشر العديد من المستقلين أسعار خدماتهم على مواقعهم الإلكترونيّة بوضوح، وقد تفكر في سؤالهم مباشرةً حول هذا، ولكن أسوأ ما يمكنهم فعله هو الاعتذار لك وعدم اطلاعك. أيضًا ما مدى جودة الجهات التي يقدمون خدماتهم لها؟ كيف توازن خبرتهم مع خبرتك في المجال؟ السؤال الحاسم هنا هو: ما هو مكانك في سوق المنافسة؟ على مقياس الكفاءة، هل أنت أقرب إلى الأسفل أم أنّك على القمة؟ تُحدّد الإجابة على هذه الأسئلة قوة اندفاعك التي يجب أن تتحلى بها وأنت تُحدّد أسعارك. العرض والطلب لقد تفاوضت مؤخرًا على رفع سعر خدمةٍ مع عميلةٍ أتعامل معها؛ ومع ذلك، لم يكن السعر النهائي مرتفعًا كما أردته، لكنني لم أستطع مناقشة وجهة نظرها، حيث قالت: أنا لا أتفق مع التلميح الواضح للعميلة بأنه لا يمكنك كسب المال من الكتابة؛ ومع ذلك، لا أشك للحظة في أنها تجد وفرةً من الكُتّاب الرخيصين لنوع المحتوى الذي تنتجه مدونتها. وجهة نظري هي أن وفرة أو ندرة المستقلين أمثالك، لها تأثيٌر كبير على التسعير الذي يمكنك تعيينه، وهذا هو العامل الأساسي، فكلما انخفضت جودة العمل الذي تقدمه، كثُرت عروض المستقلين المماثلة، لذا كن على درايةٍ بكمية العرض، وفكّر في كيفية تأثيرها على تسعيرك للخدمة، ولكن الأهم من ذلك، اعمل بجدٍ لتتطوّر؛ متخطيًا الدرجات القليلة الأولى من سلم النجاح وبأسرع ما يمكن، وإلا سيتعّين عليك التعامل دائمًا مع مفاوضاتٍ مثل المذكورة أعلاه. علاوةً على ذلك، ضع في حسبانك أن الطلب عليك أنت، فهل يتواصل معك عملاءٌ جدد عن طريق الإحالة أو التوصية؟ هل يبحثون عنك على وجه التحديد لأنهم أحبوا عملك؟ من المرجّح أن يقدِّرَ مثل هؤلاء العملاء عملك بدرجةٍ أكبر بكثير من أولئك الذين تبحث أنت عنهم. الفوائد غير المباشرة عند تحديد السعر أو التفاوض عليه أو التفكير في الحد الأدنى للتسعير، من المهم ألا تفكر فقط في التعويض المالي عن خدماتك، خذ العميلة المذكورة أعلاه كمثال، إذ ما زلتُ أنفذ لها مشاريع كتابة، على الرغم من أنها تدفع أجرًا بالساعة يعادل نصف ما يدفعه أي عميلٍ آخر لدي، ولكن لماذا؟ بسبب الفوائد غير المباشرة وهي ما يلي: تمتلك العميلة مدونةً موثوقة، وهي جيدةٌ لسمعتي. يؤدّي الرابط الموجود أسفل كل مقالٍ من مقالاتي إلى زيادة حركة المرور إلى مدونتي الخاصة. العمل آمن ومستمر معًا، كما إنني أثق بالعميلة. هناك العديد من الفوائد غير المباشرة التي يمكن أن تؤثر على السعر الذي يُسعدك قبوله، مثل الفرص المتوقّعة من وراء العمل، كأن يُؤدّي إلى مشاريع أكبر مع العميل، أو الحصول على الإحالات بسببه وعملاء من مناطق جديدة، كما أن الكتابة لبعض المواقع المشهورة وإن كانت أحيانًا بمقابل مادي قليل نسبيًا، إلا أنها ستحقق الشهرة والموثوقية للكاتب المستقل، بحيث تجلب لك المزيد من العملاء، خصوصًا عندما تشير لمقالاتك في تلك المواقع ضمن معرض أعمالك. وإن كانت مقالات بالمستوى المطلوب، فإن تلك المواقع ستستمر بطلب خدماتك ما يعني وجود دخلٍ دائم بالتعامل مع تلك المواقع. التفاوض التفاوض أمرٌ طبيعيٌ بالنسبة لي، فقد عملت في إدارة وتطوير العقارات فيما مضى، ولم يكن غريبًا علي إجراء مفاوضاتٍ تتضمن مبالغ طائلةٍ بسبع أصفار، وقد يكون هذا هو السبب في أنني لا أجد صعوبةً في التفاوض مع العملاء في المجال الحر حول أتعاب هذه الصفقات المصغّرة بالموازنة مع سابقتها. لكن هذا لا ينتقص من إيماني الراسخ بأن التفاوض لا يجب أن يكون حدثًا مرعبًا، إذ أن التصوّر الشائع هو أن كل العملاء يبحثون عن صفقاتٍ رخيصة، والأمر ليس كذلك دائمًا، أو على الأقل ليس فيما يتعلق بمجال التدوين الذي أعمل فيه، فبالتالي إذا وجدت نفسك مع عملاءٍ يمتصون جهدك لآخر سنت، ففكّر في تركيز جهودك على مكان آخر. والآن دعنا نتعمّق في عالم التفاوض للمستقلين. نطاق الأعمال تأكّد دومًا من حدود الوظيفة التي تضع تسعيرًا لها؛ أنا لا أستطيع أن أشدّد على هذه النقطة بما يكفي، فأسوأ كابوسٍ للمستقل هو حدوث سوء فهمٍ بينه وبين العميل فيما يتعلق بمهام وحدود المشروع، إذ يمكن أن يؤدي هذا إلى علاقة عملٍ متعثّرة، وساعاتٍ إضافيّة لتنفيذ خدماتٍ لم تكن ميزانيتها في الحسبان. تأكّد من التوصّل إلى اتافقٍ بشأن الطبيعة الدقيقة للخدمة ومهامها، لذلك إذا كان المشروع يحتاج إلى عملٍ مستمر ويستغرق وقتًا، فتوصّل إلى اتفاقٍ مؤقتٍ مع العميل، على أساس التوصّل لاتفاق بعقدٍ ثابتٍ طويل المدى في تاريخ مستقبلي. وفي كل الحالات، تأكّد من التوصل إلى اتفاقٍ طويل الأجل لا لبس فيه فيما يتعلق بطبيعة العمل، إذ يمكن أن يوَثق الاتفاق عبر المراسلات أو بالبريد الإلكتروني أو بعقدٍ رسمي، إذًا فالنقطة المهمة هي أن تكون قادرًا على إثبات أنك قدمت بالضبط ما طلبه منك العميل. تحديد ميزانية المشروع مفتاح تسعير المشاريع هو بتقسيمها إلى الأجزاء التي تتكون منها، لذا بمجرّد تحديد مكونات العمل، خصّص إطارًا زمنيًا مناسبًا لتنفيذ كلٍ منها، ولا تنسَ احتمالية حدوث ظرفٍ طارئ، ثم أضف كل العناصر السابقة بما فيها الجهد اللازم لتجاوز الحالات الطارئة. سوف يتفاوض العميل معك على السعرغالبًا، إذ يشعر الكثيرون بالضيق أو احتمالية التعرض للاحتيال إذا لم يطلبوا تخفيضًا في السعر ولو قليلًا، وذلك بغض النظر عمّا إذا كان السعر المخفض يعكس القيمة الحقيقية للخدمة أم لا، لذا تأكّد من تسعير خدمتك وفقًا للجهد المبذول والوقت الذي تحتاجه للتنفيذ. ما نأمل أن يكون واضحًا في هذه المرحلة هو أن جميع العوامل المذكورة أعلاه يجب أن تؤخذ في الحسبان عند تسعير المشروع، إذًا اسأل نفسك الأسئلة التالية: ما هي قيمة الخدمة التي أقدمها؟ ما هي التسعيرة التي يتقاضاها المنافسون؟ ما مدى التنافسيّة في السوق الذي أعمل فيه؟ ما مدى قوة العرض/الطلب على هذا النوع من الأعمال؟ هل هناك أية مزايا غير مباشرة تتعلّق بالعمل مع هذا العميل تحديدًا؟ تذكّر أن حدّك الأدنى للسعر المقبول هو آخر سعرٍ للخدمة، حيث أن مربط الفرس الآن هو كيفية تقديم عرضٍ يُحقّق التوازن بين زيادة أرباحك المحتملة، وعدم إخافة العميل أو إبعاده، وبالتالي السيناريو الأسوأ بعد ذلك هو أن يطلّع العميل على سعرك ويبتعد، إذ إن احتمال حدوث ذلك ضئيل، إلا إذا سعرت نفسك خارج السوق فعلًا. وفي هذه الحالة، ستحتاج إلى العودة إلى الورقة والقلم وتحليل ما تراه سعرًا معقولًا بالنسبة لك. من المُرجّح جدًا أن أي عميلٍ تتواصل معه سوف يحاول التفاوض معك لتخفيض ميزانيّة المشروع، وهنا تأتي أهمية الحماية التي يكفلها لك سعرك المدروس مسبقًا، وبالتالي فإن مدى ميلك للتفاوض فوق حدك الأدنى للسعر، يرجع أساسًا إلى مقدار رغبتك في المشروع، فهل لديك الكثير من الحجوزات لتنفيذ مشاريع أخرى؟ وهل تستطيع أن تتحمل تكلفة لعب دور المستقل صعب المنال؟ هل أنت في حاجةٍ إلى أي عملٍ وجميع الأعمال التي تقع ميزانيتها في أو فوق حدك الأدنى؟ ضع في الحسبان، وضعك وظروفك وتفاوض وفقًا لذلك. تذكّر أنه طالما كان سعر الساعة أعلى من حدّك الأدنى، فإن أي أجرٍ إضافيٍ بمثابة إمكانيةٍ لزيادة الدخل، وذلك لأن الأمر ليس بخطورة الحياة والموت، فإذا كُنت حقًا في حاجةٍ إلى العمل، فلا تحاول أن تتذاكى في مفاوضاتك. الحد الأدنى للميزانية إذا حاول عميلك التفاوض تحت حدّك الأدنى للسعر، فلديك إحدى الخيارات الثلاثة التالية: قبول المشروع. التمسُك بموقفك من الميزانيّة المحدّدة. التفاوض على تقليص نطاق مهام المشروع. لا تنظر في الخيار 1 إلا إذا شعرت أن الفوائد غير المباشرة المرتبطة بالمشروع تتفوّق على الفرق في السعر. أتعامل مع عميلةٍ هي خير مثالٍ على ذلك، إذ تدفع لي تحت ميزانيتي الدُنيا بقليل، لكني احصل على رابطٍ مجاني لمدونتي في المقابل، مما يعوّض عليّ فرق السعر، حيث أنني أنفق الكثير من الجهد في الترويج لمدونتي دون أي مقابلٍ مالي، لذا فإن الحصول على أموالٍ لتنفيذ نفس العمل لا يُمكن أن يكون شيئًا سيئًا، أليس كذلك؟ يجب اتخاذ الخيار 2 إذا كنت مرتاحًا لعدم انتهاك الحد الأدنى للميزانيّة فيما يخص الوظيفة التي تقوم بها، وهو قرارٌ بديهي إذا لم تكن هناك مزايا غير مباشرة، وبالإضافة إلى ذلك، يُمثّل الخيار 3 حلًا وسطًا في تقديم الخدمة، وأنا لا أميل نحوه كثيرًا، فقد يؤدي في كثير من الأحيان إلى استياء العميل وعلاقات عملٍ غير متينة. بالنسبة لي سوف ألتزم بالخيار 1، فإذا لم يكن العميل على استعدادٍ لدفع ما يسدّ احتياجاتي الأساسيّة، فلماذا أقدم له خدمة؟ أخيرًا، إذا فاوضك أحد العملاء على السعر بحدّة وبدأت تقول لنفسك: "قد أُنفذ المشروع بميزانيةٍ أقل"، فقد حان الوقت لإعادة تقييم حدّك الأدنى لسعر الخدمة. العربون في رأيي، لا يجب عليك أبدًا طلب عربون ما لم تكن الوظيفة كبيرةً وتتطلب الكثير من الاستثمار مقدمًا قبل البدء بعملية التنفيذ، فلا شيء يصرخ: "أنا لا أثق بك" أكثر من طلب العربون من الزبون، غير أنها ليست طريقةً جيدةً لبدء ما نأمل أن تكون علاقة عملٍ مربحةٍ طويلة الأمد. بدلًا من ذلك دقّق في عملائك، فإن لم تكن مرتاحًا لشروط الدفع التي يقدمونها لك، فاقترح الدفع على فتراتٍ أقصر خلال مدّة الاختبار، تليها اتفاقيةٌ دائمةٌ طويلة الأجل، بالطبع إذا كان ذلك يُلائم مهام المشروع. في الأخير، افهم أن العميل الذي يتهرّب من دفع أتعابك أحيانًا هو أحد الأمور العرضيّة التي قد تحدث في مجال العمل الحر، وكلما تقبّلت هذه الحقيقة كان ذلك أفضل. الميزانية ليست دائمة غالبًا ما يُصاب المستقلون الناشئون بالشلل عندما يتعلق الأمر بتحديد أسعار الخدمات، لكن تذكّر أن كل عميلٍ يمثل شخصه فقط، وأن الأسعار ليست ثابتةً أبدًا، ولذلك عند التفاوض على السعر مع العميل، فإن أسوأ نتيجةٍ هي أن تفقد هذا العميل، ولكنها ليست نهاية العالم. لقد قلت ما يلي لعملاءٍ جددٍ في أكثر من مناسبة: لم يتفاعل أي عميلٍ تعاملت معه سلبًا مع هذا الأسلوب، وكان الجواب دائمًا شيئًا مثل "هذا يبدو عادلًا"، لأنه كان إقرارًا منصفًا لكلا الطرفين. إذا كنت تتصرف تجاه عميلك بطريقةٍ تُظهر الثقة، فمن المُرجّح أنه يرغب في العمل معك أكثر من أنه يحاول التحايل عليك، وإذا كنت تتحلى بالشفافيّة تمامًا في طريقة تنفيذك للمشاريع، فسوف يرغبون في العمل معك على المدى الطويل. في الختام، يمكن القول أن مفتاح تحديد الميزانيّة للمشروع والتفاوض عليها بنجاح، هو ببساطة أن تتدرّب على ذلك، فكلما زاد عدد العملاء الذين تتفاوض معهم، زادت خبرتك وقدراتك بكل بساطة. ترجمة -وبتصرُّف- للمقال Freelancing: a Complete Guide to Setting and Negotiating Rates لصاحبه TOM EWER. اقرأ أيضًا نصائح حول إعداد الميزانية للمستقلين كيف تتفاوض على صفقة العربون بوصفك كاتبًا مستقلًا لم عليك التفاوض بأسعار مختلفة في كل مشروع ككاتب مستقل؟ 5 نصائح لإنشاء الفاتورة المثالية1 نقطة
-
تطوير المواقع بشكل عام ينقسم إلى جزئين: واجهة المستخدم Frontend والواجهة الخلفية Backend وتحتوي الأكاديمية على دورات لتعلم كلا الجزئين من الصفر، وهذه الدورات كالتالي: دورة تطوير واجهات المستخدم Frontend: تحتوي هذه الدورة على كل الأساسيات اللازمة للبدء في عمل واجهات المستخدم بأحدث التقنيات، وتبدأ الدورة من شرح أساسيات اللغات المستخدم في تطوير واجهات المستخدم مثل HTML و CSS و JavaScript مع شرح لأشهر المكتبات مثل Bootstrap و jQuery ثم تنتقل لعمل أكثر من مشروع مثل بناء واجهة لموقع يشبه YouTube، وتطوير واجهة استخدام حقيقة لمتجر الكتروني كامل من الصفر، وتطوير موقع لشركة مع مدونة خاصة خطوة بخطوة، وبناء 5 صفحات هبوط مختلفة، وبناء لوحة تحكم لتطبيق ويب، كما ستتعلم كيفية التعامل مع تقنيات أخرى مثل SCSS و Gulp و Git و GitHub وكيفية نشر المشاريع على الإنترنت وغيرها من التقنيات. يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير واجهات المستخدم). أما بالنسبة لتطوير الواجهات الخلفية Backend فيوجد ثلاث دورات مختلفة بإستخدام ثلاث لغات، ويمكنك الإشتراك في واحدة منهم فقط لتعلم تطوير الواجهات الخلفية backend، وهم كالتالي: دورة تطوير تطبيقات الويب باستخدام لغة PHP: تستخدم في هذه الدورة لغة PHP وتبدأ الدورة في شرح الأساسيات البرمجية بإستخدام PHP ثم تنتقل لشرح كيفية التخاطب مع الخادم وكيف يتم إرسال الطلبات، ثم يتم عمل تطبيق ويب لإدارة المهام، وشرح أساسيات إطار العمل Laravel، بناء تطبيق إدارة المهام باستخدام إطار العمل Laravel، تطوير واجهة برمجية API بالإعتماد علي نمط RESTful، تطوير موقع إعلانات مبوبة، شبكة اجتماعية تشبه Instagram، تطوير نظام إدارة محتوى CMS كامل من الصفر، وفي النهاية يتم شرح كيفية تطوير قوالب WordPress، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير تطبيقات الويب باستخدام لغة PHP). دورة تطوير التطبيقات باستخدام لغة JavaScript: وهي دورة عامة يتم خلالها شرح الأساسيات البرمجية بإستخدام JavaScript، ثم شرح تطوير تطبيقات الخادم Backend باستخدام بيئة Node.js وإطار العمل Express.js، ثم تنتقل لأساسيات مكتبة React.js وبناء تطبيق ملاحظات باستخدامها من نوع SPA، ثم ستتعرف على أساسيات مكتبة React Native و Expo لعمل تطبيقات الهاتف الجوال، وستبدأ في تطوير تطبيق جوال للوصل بين الأطباء والمرضى، وبناء بناء تطبيق محادثة يشبه تطبيق WhatsApp، بعد ذلك ستدرس أساسيات إنشاء تطبيقات لسطح المكتب من خلال إطار العمل Electron.js وكيفية إنشاء مشاريع من خلال إطار العمل Next.js، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير التطبيقات باستخدام لغة JavaScript). دورة تطوير تطبيقات الويب باستخدام لغة Ruby: تبدأ الدورة في شرح الأساسيات البرمجية بإستخدام Ruby، ستبدأ في عمل مشاريع من خلال بناء لعبة بسيطة باستخدام لغة Ruby، ثم ستنتقل لإنشاء تطبيقات الويب من خلال التعرف على أساسيات إطار العمل Ruby on Rails، وفي النهاية سوف تقوم بالتطبيق من خلال بناء تطبيق إدارة محتوى، وتطوير شبكة إجتماعية تشبه تويتر، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير تطبيقات الويب باستخدام لغة Ruby). لكي تكون مبرمج Full-Stack يجب أن تدرس دورة تطوير الواجهات Frontend وتختار أحد دورات تطوير الواجهات الخلفية Backend.1 نقطة
-
مقالك حفزني جدا لدراسة البرمجة. بدأت بلغة بايثون و حققت في مدة عشرة أيام نتيجة طيبة لم أكن أتوقعها من قبل غير أن تعلم البرمجة تستهلك وقتا كبيرا قد تصل لسبع أو ثماني أو تسع ساعات ساعات أحيانا مع احتساب الاستراحات القصيرة طبعا والوجبات و الصلوات في وقت التعلم. فالبرمجة يلزمها التفرغ الكامل لاحترافها. ما يلزم المبتدئ هو التفكير المنطقي و التأمل في كل كود تتم كتابته أثناء التعلم و إعادة كتابته مرارا و التلاعب به و إدخال بعض الأكواد الصغيرة لترسيخها كي لا تنسى. كما يجب تكرار ما تعلمته يوم أمس و مراجعته و كتابة أكواد مشابهة له ثم البدأ في الدرس الجديد كما لا ينبغي الاستهانة بأي خطوة فيجب فهمها حتى لا تسبب مشاكل في المستقبل , فالغرض الإتقان و ليس الاطلاع فقط. فنصيحتي لك أيها مقبل على تعلم البرمجة أن تبدأ يومك بقراءة وردك من القرءان الكريم و صلاة ركعتين و دعاء الله الفهم و الصبر و العزيمة فإذا استعصى عليك أمر في التعلم حاول أن تحلها (هو أمر يسبب النرفزة )فإن لم تنجح في ذلك إياك أن تفشل و تترك الأمر . إذهب فتوضأ و ادع الله و تنفس هواء نقيا ثم ارجع فسيفتح عليك فيه فأنا أتكلم عن تجربة يا إخواني1 نقطة
-
جزاك الله خيرا على هذا الدليل الشامل المتكامل لتعلم البرمجة.. فعلا النصائح الأخيرة التي ذكرتها مهمة جدًا، ونابعة من رجل ذو خبرة في المجال.. يؤخذ على المقال أن المصادر كانت مركزة على "حسوب" ومنتجاتها فقط، والواقع أنها ليست أفضل المصادر لتعلم البرمجة، خاصة لذوي الدخل الضعيف والمعدوم.. وحتى "الموسوعة" فتصلح كمرجع عند الحاجة لا كمصدر للتعلم.. وأمر آخر أنها باللغة العربية مما يصعب فهم البرمجة برأيي.. لا لأنها بالعربية لكن بسبب ترجمة المصطلحات وطبيعة لغات البرمجة نفسها؛ إذ هي مكتوبة بالإنجليزية.. ومن هنا أنبّه على ضرورة تعلم الإنجليزية ولو بمستوى أوّل لأن المصادر المحدَّثة أغلبها بالإنجليزية.. ملحوظة أخرى وددت لو ذُكرَت في المقال هي الخطة المفصلة لتعلم البرمجة؛ مثلا: HTML5 ثم CSS3 ثم JAVASCRIPT ثم التدريب على مشاريع، ثم PHP7 مثلا وهكذا... على كل مقال موفق، ومرة أخرى جزاك الله خيرا على مجهوداتك الجبارة. حياك الله.1 نقطة