اذهب إلى المحتوى

البحث في الموقع

المحتوى عن 'تطوير'.

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المحتوى


التصنيفات

  • الإدارة والقيادة
  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • السلوك التنظيمي في المؤسسات
  • عالم الأعمال
  • التجارة والتجارة الإلكترونية
  • نصائح وإرشادات
  • مقالات ريادة أعمال عامة

التصنيفات

  • مقالات برمجة عامة
  • مقالات برمجة متقدمة
  • PHP
    • Laravel
    • ووردبريس
  • جافاسكربت
    • لغة TypeScript
    • Node.js
    • React
    • Vue.js
    • Angular
    • jQuery
    • Cordova
  • HTML
  • CSS
    • Sass
    • إطار عمل Bootstrap
  • SQL
  • لغة C#‎
    • ‎.NET
    • منصة Xamarin
  • لغة C++‎
  • لغة C
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • لغة Rust
  • برمجة أندرويد
  • لغة R
  • الذكاء الاصطناعي
  • صناعة الألعاب
  • سير العمل
    • Git
  • الأنظمة والأنظمة المدمجة

التصنيفات

  • تصميم تجربة المستخدم UX
  • تصميم واجهة المستخدم UI
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب GIMP
    • كريتا Krita
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • مقالات DevOps عامة
  • خوادم
    • الويب HTTP
    • البريد الإلكتروني
    • قواعد البيانات
    • DNS
    • Samba
  • الحوسبة السحابية
    • Docker
  • إدارة الإعدادات والنشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
    • ريدهات (Red Hat)
  • خواديم ويندوز
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • شبكات
    • سيسكو (Cisco)

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح
  • مبادئ علم التسويق

التصنيفات

  • مقالات عمل حر عامة
  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • العمل الحر المهني
    • العمل بالترجمة
    • العمل كمساعد افتراضي
    • العمل بكتابة المحتوى

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
    • بريستاشوب
    • أوبن كارت
    • دروبال
  • الترجمة بمساعدة الحاسوب
    • omegaT
    • memoQ
    • Trados
    • Memsource
  • برامج تخطيط موارد المؤسسات ERP
    • تطبيقات أودو odoo
  • أنظمة تشغيل الحواسيب والهواتف
    • ويندوز
    • لينكس
  • مقالات عامة

التصنيفات

  • آخر التحديثات

أسئلة وأجوبة

  • الأقسام
    • أسئلة البرمجة
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات

التصنيفات

  • كتب ريادة الأعمال
  • كتب العمل الحر
  • كتب تسويق ومبيعات
  • كتب برمجة
  • كتب تصميم
  • كتب DevOps

ابحث في

ابحث عن


تاريخ الإنشاء

  • بداية

    نهاية


آخر تحديث

  • بداية

    نهاية


رشح النتائج حسب

تاريخ الانضمام

  • بداية

    نهاية


المجموعة


النبذة الشخصية

تم العثور على 19 نتائج

  1. مقدّمة بعد أن ألقينا نظرة على كيفيّة استخدام إطار العمل Flask لإنشاء تطبيقات ويب بسيطة بالاستعانة بقاعدة بيانات SQLite، سنبدأ هذه السّلسلة بالدّخول إلى عالم إضافات Flask التّي ستسهّل علينا الكثير من المهام كإعداد نظام لتسجيل الدّخول والخروج، والتّعامل مع نظام قاعدة بيانات، وكذلك التّحكم في تطوير التّطبيق عن طريق سطر الأوامر؛ وكذلك استعمال أدوات لتطوير تطبيق أكثر أمانا. سنتطرّق أيضا إلى بعض المفاهيم المتقدّمة كتشفير كلمات المرور وتهجير قواعد البيانات وغير ذلك. صحيح بأنّ هذه السّلسلة مطولة نوعا ما إلا أنّها ستكون شاملة لمُساعدتك على تطوير أي تطبيق يمر على خاطرك أو يطلبه منك أحد عملائك. وإن كنت جديدا إلى عالم تطوير الويب فستتعلّم من هذه السّلسلة ما يكفي لتبدأ مشوار العمل كمطوّر تطبيقات ويب سواء عن طريق إنجاز مشاريع لعملاء على منصّات العمل الحر كمنصّة مُستقل أو بناء مشاريعك الخاصّة. سنقوم في هذا الدّرس بالتّعرف على فكرة وبنية التّطبيق الذي سنبنيه في رحلتنا هذه. المُتطلّبات بالإضافة إلى أساسيّات إطار العمل Flask، ستحتاج كذلك إلى معرفة كيفيّة التّعامل مع نماذج HTML عبر مكتبة WTForms وإضافة Flask-WTF ويُمكنك الاطّلاع على سلسلة دروس خاصّة بهذا الموضوع على الأكاديميّة. سلاسل الدّروس التّي يجب عليك أن تطّلع عليها لفهم أفضل لهذه السّلسلة من الدّروس المُتقدّمة نوعا ما، عليك أن تطّلع وتطبّق سلاسل الدّروس التّاليّة: سلسلة مدخل إلى إطار العمل Flask درس إنشاء تطبيق لاختصار الرّوابط باستخدام إطار العمل Flask بجزئيه الأول و الثاني. سلسلة التّحقق من مُدخلات المُستخدم باستخدام مكتبة WTForms وإضافة Flask-WTF ستكون لغة جافاسكربت مُفيدة كذلك، ولا مفرّ من إتقانها إن كنت ترغب بأن تُصبح مُطور ويب أفضل، كما أنّني لن أشرح كل كبيرة وصغيرة عند التّعامل معها في التّطبيق، وهذا لأنّ الهدف من السّلسلة هو تعليمك كيفيّة إتقان التّعامل مع إطار العمل فلاسك وهذا بالطّبع لا يشمل شيفرة جافاسكربت. ستحتاج كذلك إلى تعلّم أداة Git لإدارة نُسَخ التّطبيق والتّعامل مع التّطبيق بعد نشره على منصّة Heroku. ما الذي ستتعلّمه من هذه السّلسلة؟ ستتعلم في هذه السّلسلة تقنيات متقدّمة لإدارة مشاريع تطبيقات الويب، وكيفيّة التّعامل مع قاعدة بيانات PostgreSQL وأداة SQLAlchemy لإدارة الجداول (إضافة، قراءة، تعديل وحذف البيانات)، وكذلك الطرق البسيطة لتهجير قواعد البيانات Database Migration وستتعرّف كذلك على طرق توزيع ملفّات التّطبيق على شكل وحدات وحزم لتنظيم أكثر. سنستخدم كذلك مكتبة WTForms لإدارة نماذج HTML وجعلها أكثر أمانًا للحماية من هجمات مُحتملة من المُخرّبين والمُخترقين. وسنعد كذلك نظامًا أكثر أمانًا لتسجيل الدّخول واستيثاق المُستخدمين، وسنتطرّق كذلك إلى كيفيّة نشر التّطبيق إلى منصّة Heroku لتربطه بعد ذلك باسم نطاق خاصّ إن أردت ذلك. ستتعلّم كذلك طريقة حماية كلمات المرور عن طريق تشفيرها في قاعدة البيانات باستعمال خوارزميّة Bcrypt للتّشفير، وذلك لتجنّب حفظها كنصّ مجرّد يسهل استخدامه من طرف المُخترق إذا وصل إلى قاعدة البيانات. وقد تعرّفنا سابقًا على كيفيّة استعمال الجلسات Sessions لإنشاء نظام تسجيل دخول وخروج بسيط، صحيح بأنّ ذلك النّظام يعمل بشكل جيّد، إلّا أنّه لا يعد آمنًا، ويُمكن أن يتعرّض تطبيقنا لهجمات كثيرة من قبل المُخترقين، ولحماية العضويات والبيانات في الموقع، سيتوجّب علينا أن نُدير الجلسات بطريقة أكثر تعقيدًا، لكنّ هناك إضافة لإطار العمل فلاسك لتبسيط هذا الأمر ولن نحتاج إلى العمل على ذلك بأنفسنا، وبالتّالي فسيُصبح تطبيقنا أكثر أمانًا دون عناء كبير، وكلّ هذا وأكثر سنتعلّمه بتفصيل أكبر في الدّروس القادمة. بنية التّطبيق التّطبيق الذي سنعمل عليه في هذه السّلسلة من الدّروس عبارة عن نظام إدارة محتوى ومنصّة للتّدوين الجماعي، ستكون هناك بعض الميّزات الفريدة وستكون هناك ميّزات أخرى مفقودة، إذا سبق لك وأن تعاملت مع أحد أنظمة التّدوين الأخرى كمنصّة ووردبريس WordPress، Blogger أو Tumblr أو حتى منصّة medium فستتمكّن بنهاية هذه السّلسلة من التّخلي عن هذه المنصّات وإنشاء منصّة بسيطة خاصّة بك لتكتب عليها، أو تستطيع تعديل المشروع بعد الانتهاء منه لتُضيف ميّزات أخرى أو تُطبّق فكرة فريدة لتطرح مشروعًا على أرض الواقع لتتمكّن من الاستفادة منه ماديّا إن أردت ذلك. سيتمكّن مُستخدمو المنصّة من إنشاء حساب خاصّ بهم لينشروا مقالاتهم التّي يكتبونها، إضافة المقالات ستتمّ عن طريق كتابتها بتنسيق الماركداون Markdown ومن ثمّ نشرها، سيتمكّن كلّ مُستخدم من الحصول على رابط خاصّ بمقالاته لنشرها للآخرين، سيتمكّن الكاتب من إضافة وسوم لمقالاته، وكذلك إدراجها ضمن قسم معيّن، لكل مقالة قسم للتّعليقات ليتمكّن المُستخدمون الآخرون من التّعليق على مقال معيّن. سيكون للتّطبيق نكهة اجتماعيّة، بحيث سيتمكن المُستخدمون من مُتابعة بعضهم البعض، وكذلك إضافة مقالات إلى المُفضّلة والإعجاب بها لنتمكّن من فرزها وترتيبها حسب الأكثر إعجابًا، الأكثر نشاطًا (أكبر عدد من التعليقات) وبعدها ستتمكّن من إضافة خاصيّات أخرى بنفسك باتّباع نفس الطّريقة، مثلًا بعد الانتهاء من التّطبيق ستتمكّن من تطبيق فكرة ترتيب المقالات حسب الأكثر إعجابًا لإضافة خاصيّات أخرى (الأكثر شعبيّة حسب عدد التّعليقات، الأكثر زيارة...). صحيح بأنّنا سنبني تطبيقًا مُعقّدا وكبيرًا، إلّا أنّني لن أشرح كلّ شيء بتفصيل ممل، سأشرح بالتّفصيل فقط الأفكار الجديدة وما تراه لأوّل مرّة حتى لا تكون هذه السّلسلة أطول من اللازم، خاصّة وأنّ بعض الأساليب ستكون مُشابهة جدّا لبعضها البعض، فمثلاً طريقة السّماح للمُستخدم بإضافة مقال خاص به مُشابهة جدّا لطريقة فرز المقالات حسب قسم مُعيّن (لكل مُستخدم مقالاته ولكلّ قسم مقالاته كذلك). سنضع للتّطبيق بعض الميّزات المُفيدة كنظام أرشفة لتأريخ كلّ مقال حسب تاريخ إضافته، كما سيكون لتعليقات المقال نظام مُشابه، وسنستغل نفس الطّريقة لتخصيص تاريخ انضمام للمُستخدم. في النّهاية، تذكّر بأنّ هذه السّلسلة من الدّروس ستكون تطبيقيّة بالدّرجة الأولى، وستتعلّم فيها كيفيّة بدء مشاريعك التّطويريّة الخاصّة بك بلغة بايثون وإطار فلاسك، أمّا كيفيّة الاستفادة القصوى منها فمعروفة، عليك تطبيق ما تعلّمته وتختبر مع إضافة ميّزات ولو لم أذكرها، وإن أردت معرفة معمّقة عن أي شيء تحدّثت عنه دون أن أفصّل، يُمكنك دائما العودة إلى التّوثيق الرّسمي للأدوات والمكتبات والإضافات المعنيّة بالأمر، وإن كان لك سؤال معيّن فلا تتردّد في طرحه على قسم الأسئلة والأجوبة على الأكاديميّة. هناك المزيد الدّروس التّي ستندرج تحت هذه السّلسلة لن تُغطي فقط ما قرَأتَهُ للتّو، بل أكثر من ذلك، فهدفي من كتابة سلسلة الدّروس هذه هو تغطيّة الفراغ الموجود في الويب العربي، إذ أنّ التّوثيقات الرّسميّة للمكتبات وأطر العمل المُستعملة حاليّا عادة ما تكون مكتوبة باللغة الانجليزيّة فقط، لذا بتوفير سلسلة دروس كهذه ستمتلك أكبر قدر مُمكن من المُساعدة لتتمكّن من العمل على تطبيقاتك الخاصّة دون أن تضطر إلى اتّباع سلسلة دروس أخرى أو الاطّلاع على التّوثيقات الرّسميّة التّي عادة ما تكون مُفيدة أكثر إذا ما أردت أن تُنجز شيئًا بسيطًا، وعلى العكس من ذلك، فكتابة تطبيق كامل (كما في هذه السّلسلة) طريقة أفضل للتّعلم. ختاما هذا المقال عبارة عن مُقدّمة بسيطة لما سنخوضه في قادم الدّروس، في الدّرس القادم، ستبدأ المُتعة مع استكشاف كيفيّة التّعامل مع ملفّات ومُجلّدات التّطبيقات الكبيرة والمُعقّدة بطريقة بسيطة.
  2. في مواقع الإنترنت عوامل أساسية لا يمكن التغاضي عنها، تؤثر على ترتيب الموقع وأرشفته في محركات البحث. سنتطرق لها اليوم من زاوية تهمك كمطور، فالعديد من المطورين يقعون في هذه الأخطاء التي تؤدي إلى غرقِ الموقع في بحر الانترنت، فحياة الموقع تكمن في جلب الزوار له -و هذا لا يحدث صدفة-، فلا شك بأن المحتوى الجيد مهم، لكن ما الفائدة من قصرٍ لا باب و لا منافذ له! القصر هو برمجيتك، فإن لم تُحسن بناءَها مواكبًا للتطورات لإثراءِ معارفِكَ بالأساليب التقنية الحديثة التي تؤثر على عَملك، الذي ستسدّ بها احتياجات عملائك، وتلبيتها لهم على أكمل وجه. اليوم سنتطرّق لأهم العوامل المؤثرة في تهيئة المواقع لمحركات البحث (SEO) ببساطة وإيجاز، التي يراها المستخدم دون الحاجه لعرض الشيفرة المصدرية للصفحة، وهي كالتالي: الروابط أو ما يعرف بـ URL، والتي نتعامل معها بشكل يومي. رابط الموقع هو وسيلة الدخول إليه، وهو عبارة عن نصٍ مقروء مُصمم ليظهرعوضاً عن الأرقام في عنوان IP الذي يستخدمه الحاسوب للإتصال بالخواديم، بالإضافة إلى توضح تركيب الملفات في الموقع المطلوب. عند البدء في بناء البرمجية يجب أن نراعي (كمطوّر) التالي في عملية إنشاء الروابط: استخدام (-) لفصل الكلمات عند الضرورة، حتى تَسهُلَ قراءتها، ولا ينبغي استخدام الرمز( _ ) ، المسافة أو أي رمز آخر لفصل الكلمات. الاستخدام المفرط للفواصل في عناوين الروابط مزعج ويمكن أن تعتبرها محركات البحث (spam) – أي مُزعجة -، لذلك يجب الحذر قدر الإمكان عند استخدامها. أن لا يحتوي على أكثر من 2,048 حرف ورمز، و إلا فإن مستعرض الإنترنت لن يكون قادرًا على تحميل الصفحة. تجنب استخدام المعلمات (parameters) قدر الإمكان، وفي حال اضطررت لاستخدامها فيجب ان تقتصر على اثنين أو أقل. باختصار: الرابط الصحيح هو الذي يصف الموقع أو الصفحة للمستخدمين و محركات البحث. للحصول على ترتيب أفضل في محركات البحث، يفضل أن يحتوي عنوان الرابط على الكلمات المفتاحية ذات الصلة بمحتوى الصفحة، وإذا كان الموقع يحتوي على أقسامٍ عدة وأنواعٍ مختلفة من المحتوى، يفضل تجزئته إلى مجلدات ومجلدات فرعية، بأسماءٍ تعبر عن طبيعة المحتوى الموجود في كل مجلد. لو افترضنا أنك تعمل على إنشاء متجرٍ إلكتروني يحوي عدة أقسامٍ رئيسية وبداخله أقسامًا فرعية، يُفضل أن يتم تسمية المجلدات بناءً على محتواها. في الرابط السابق يمكننا بوضوح الإستنتاج بأنّ محتوى الصفحة متعلّق بالساعات في قسم accessories، وهو الرابطُ المثاليّ المقصود. أما الرابط السيء، يكونُ طويلاً ولا يَدل على محتوى الصفحة كما في المثالِ التالي: وهذا يشرح الفرق بين الروابط المقروءة عن غيرها، كمطور عليك مراعاة هذا. خلاصة القول، هناك خصائص و ميزات أساسية يجب توافرها في كلّ رابط، نؤكّد عليها: الدلالة: بناء الرابط بشكلٍ جيد كما في المثال السابق، يُعطي الزائر خلفية مُسبقة عن ماهية محتوى الصفحة قبلَ تحميلها، و يُسهّل تعرّفَ عناكبِ محركات البحثِ على محتواه، ومقارنته مع عملية البحث التي يُجريها المستخدم، والمساهمة مباشرةً في ظهوره في الصفحات الأولى لنتائج البحث . الكلمات الدلالية: الرابط الصحيح يجب أن يحتوي على الكلمة المفتاحية الدّالة على محتواه ، ويُستحسن أن تكونَ هي نفس الكلمة المفتاحية في عنوان الموضوع ، وفي الوصفِ الخاصّ به ، لأرشفة سريعة في محركات البحث. النشر عبر مواقع التواصل الاجتماعي: مواقع التواصل الاجتماعي من أهم المصادر لجلبِ زوارٍ لموقعك ، وأهمية الروابط تكمن بنشرها من خلال هذه المواقع ، فالرابط الطويل غير المفهوم مزعج ومنفر لمستخدمي تلكَ المواقع، ويجعلهم مترددين في زيارته لكونِهِ يعثُ الريبة في نفوسهم. بناءً على ذلك ، يجب أن يكونَ الرابطُ واضحًا ومنظمًا ، إضافةً إلى أن نشر الروابط بجانبِ الوسوم التي المعبّرة عن الكلمة المفتاحية المُضمّنة في الرابط، تزيدُ من إمكانية ظهورها في محركات البحث . اعلم بأنّ محركات البحث تعطي الوسوم الخاصة بمواقع التواصل الإجتماعي مثل: Twitter/Facebook/Google+، أهميةً كبيرة في أرشفة المنشورات، خصوصاً إذا كان التفاعُل مع منشورٍ ما كبيراً ، أنّ شبكة Google Plus ، تؤرشَف منشوراتُها فوراً في محرك البحث Google إذا ما تمّ استخدام الوسوم المناسبة ، والمشهورة باسم Hashtag#. وسم العنوان (Title tag) هو الوسم الذي يتم كتابة عنوان صفحة معينة داخله، و يعتبر من أهم عوامل نجاح تهيئة المواقع لمحركات البحث (SEO) وذلك لأي موقع، لأن هذا العنصر يحوي وصفاً دقيقاً ومختصراً لمحتوى الصفحة، والخطأ الذي يقع فيه العديد من المطورين هو وضع عناوين صفحاتٍ ثابته للموقع، وعدم ترك هذا الخيارِ قابلاً للتغير من لوحة التحكم، فعنوان الصفحة يؤثر على تجربة المستخدم كما له تأثيرعلى تهيئة الموقع لمحركات البحث. يفضل وضع العنوان على الشكل التالي: الكلمة الرئيسية - الكلمة الثانوية | العلامة التجارية. الطول الأمثل لعنوان الصفحة: Google في العادة تظهر أول 50-60 حرف من عنوان الصفحة أو حسب عدد الأحرف التي تظهر ضمن عرض 512 بيكسل، فإذا جعلت عنوان الصفحة أقل من 55 حرف ستضمن ظهور 59% من نَص العنوان، مع العلم أنه ربما يظهر نص آخر من ضمن محتوى الصفحة بناءً على عملية البحث التي قام بها المستخدم. مثال على عنوان مثالي: مثال على عنوان طويل: وسم العنوان هو النص الرئيسي الذي يصف محتوى صفحة الويب، ويعتبر واحدًا من أهمّ عناصر On Page SEO ويظهر في ثلاث أماكن رئيسية: المتصفح: صفحة نتائج البحث: مواقع التواصل الاجتماعي: الوصف التعريفي (Meta Description) سمة من سمات HTML تتيح إضافة وصف موجز عن محتوى الصفحة يظهر ضمن صفحة نتائج البحث. هذه الفقرة القصيرة هي فرصة ثمينة لكل مدير موقع لجذبِ الباحثين، وكتابةِ وصفٍ دقيق عن محتوى الصفحة، لتؤكدَ لهم ما إذا كانت هذه الصفحة هي المقصودة أم لا. لذلك يجب اختيار الكلمات الرئيسية ضمن الوصف بذكاء وعدم حشو الوصف بكلمات لا تمت للمحتوى بصلة، ومن الأفضل أن لا يتجاوز طول الوصف 160 حرفًا، لأنه وبعد هذا العدد من الحروف ستظهر على شكر نقاط هكذا ( ........... )، أي سيُخفي مُحرّكُ البحث باقي النص، للدلالة على تجاوز الحد المسموح به. مثال (عن عدم ظهور كامل الوصف، بسبب زيادة عدد الأحرف عن الحد المسموح به وهو 160 حرف ): وبالتالي في شفرة HTML الخاصة بالصفحة، تأكد من وضع الوصف التعريفي ضمن وسم <head> على النحو التالي: <head> <meta name="description" content="ضع هنا وصفا لا يتجاوز 160 حرفا"> </head> أوسمة العناوين (Heading Tags) العديد من المطورين يقعون في خطأ فادح، وهو استخدام H1 tag في غير محلّه. مثلاً: وضع شعار الموقع ضمنه، أو استخدامه في الأسماء الخاصة بالأقسام الثابتة. هناك من يظن بأن هذه الوسوم ليست ذات قيمة لدى محركات البحث، ولا يعرف مدى عِظمِ أهميتها في إشهارِ الموقع، فالباحث يبحث باستخدام كلمة مفتاحية بمحرك البحث، وأنت عليك أن تضعها له بطريقةٍ مدروسة وفق معايير محركاتِ البحث. كل ما يهم أن المنافسة بين مواقع الويب اشتدت وليست كسابق عهدها، فتلك التعديلات والإجراءات والإضافات التي تراها بسيطة، من الممُكنِ تجعلَ موقعك في الصدارة، أو أن يضيعَ بين ملايين الصفحات المنشورة على شبكة الإنترنت، فالكلمات التي تقعُ ضمن هذه الوسوم تعتبر مهمة كثيراً، وأهم من النص العادي، لذلك يفضل دائمًا وضع الكلمات الدلالية داخلها، أو العناوين المهمة للمحتوى وترتيبها حسب الأولوية. خاصية ALT للصور عناكب محركات البحث لا تستطيع التعرف على الصور، هذه الخاصية تتيح لك تسمية الصورة الخاصة بالمحتوى، وتمكنك من وضع كلماتك الرئيسية بذكاء ضمن هذه الخاصية، فتساعد في أرشفة موقعك، وظهورها عند البحث عن الكلمة المضمنة في هذه الخاصية في نتائج البحث بشكلٍ منفصل عن النتائج النصيّة، فاحرص على أن تكون الصور المستخدمة مميزة لتجذب الباحث إليها. الخلاصة بعد تعرّفكَ على أهم أساسيات تهيئة المواقع لمحركاتِ البحث، بإمكانك بناء برمجية مرنة تتوافق مع احتياجات العميل، من خلال إنشاء لوحةِ تحكمٍ أكثر مرونة وتوافقية مع SEO. من خلالِ ما سبق، استعرضنا مع التوضيح أهم عناصر SEO التي يراها المستخدم ويتفاعل معها، والإرشادات الصحيحة في كيفية تطبيقها في موقعك، وتسهيل المهمة على العُملاء ، لتحظى بثقتهم ورضاهم.
  3. هل أنت مهتم بتعلم PHP وبناء قوالب وملحقات خاصة بك على ووردبريس؟ أو ربما أنت مُهتمّ بتعلّم القليل الذي يُمكنك من إدخال التّعديلات التي تحتاجها على مواقعك ومدوّناتك التي تعتمد على ووردبريس. أيّا كان وضعك، هناك أمور يجب عليك أن تعرفها قبل أن تغوص في مجال تطوير ووردبريس. سنحاول في هذا المقال إعطاءك فكرة واضحة عليها. كيف يعمل ووردبريس؟ لنفهم ماذا وكيف يمكننا التطوير في ووردبريس، سنلقي أولا نظرة سريعة على آلية عمل ووردبريس. يتكون ووردبريس من ثلاثة عناصر رئيسية: النواة الأساسية والقوالب والمُلحقات. تحتوي النواة على جميع الوظائف الأساسية التي تشكل نظام إدارة المحتوى لووردبريس، وهذه الشيفرات البرمجية تتضمن كل شيء من البنية التحتية (backend) للإدارة إلى دوال جدولة المشاركات والتأكد من قوة كلمة المرور والسماح بإنشاء مستخدمين وغيرها. في حين أن النواة الأساسية (core) مسؤولة عن البنية التحتية للموقع وكيفية التعامل معها، فإن القوالب مسؤولة عن الواجهة الأمامية للموقع وكيفية ظهوره. نستخدم إدارة ووردبريس (WordPress admin) لإنشاء المشاركات والصفحات وبقية محتوى الموقع، وأما بالنسبة لكيفية ظهور هذه الأشياء للزائر فهو أمر متروك للقالب theme، لذلك فإن هذا سيعطيك قوة كبيرة للتحكم في موقعك، فقد ترغب بتثبيت وتفعيل القوالب الموجودة أو حتى تطوير قوالبك المخصصة. أبسط طريقة لوصف المُلحقات plugins هي أنها توفر وظائف إضافية للووردبريس، ولفعل ذلك، قد تعدّل المُلحق الشيفرة البرمجية للواجهة الأمامية أو البنية التحتية للموقع، وأبسط مثال لذلك هي المُلحق الذي يضيف زر لتغريدة تويتر، وقد تُنشئ أيضا صفحة إعدادات جديدة في البنية التحتية لقائمة الإدارة والتي ستمكنك من إعداد بعض الخيارات الافتراضية لتغريدة المستخدم ويمكنها إضافة نفسها إلى الواجهة الأمامية للموقع، والتي سيكون موقعها في الغالب تحت التدوينة (post). مجالات التطوير بقدر تقدمك في تطوير ووردبريس، ستتمكن من تطوير أي واحدة من المكونات الرئيسية المذكورة أعلاه بالإضافة إلى تطبيقات مستقلة بمساعدة REST API الجديدة وسنذكر المزيد عن هذا الموضوع بعد قليل. مهما كان ما تريد فعله مع ووردبريس، أنصحك باتباع منهج في دراستك، هذه القائمة ستساعدك على التعرف على الأنظمة التي تحتاج إلى معرفتها قبل بدء تعلمك المزيد حول المجال الذي اخترته: القوالب المُلحقات REST API النواة القوالب إن تعلم كيفية عمل القوالب وتطويرها سيسمح لك باحتراف إنشاء المواقع بدءا من المواقع الصفحة الواحدة إلى مواقع المحتوي الحيوي الثقيل، وستسمح لك أيضا بالحصول على المزيد من العملاء (إذا كان هذا ما يهمك) أو حتى بيع القوالب تجاريا. يوجد العديد من مطوري القوالب الناجحين في أسواق مثل Themeforest و Mojo Marketplace وغيرها. ففي وقت كتابة هذا المقال، أشهر قالب على موقع Themeforest تم بيع 1377 نسخة منه في أسبوع أي أكثر من $81,000 في أسبوع واحد فقط! يمكنك الحصول على الكثير من الأموال إذا كنت تستطيع تطوير قالب مميزة. على الرغم من أن هذا المبلغ لا يحققه جميع مطوري القوالب، وربما لن تصبح مليونيرًا بين عشيّة وضحاها من إنشاء القوالب، لكن يمكنك الحصول على مبلغ مالي جيد من القوالب إذا كنت تقوم بالأمر بالشكل الصحيح. إذا أردت رؤية بعض الأمثلة عن القوالب الشهيرة، فألق نظرة على الأسواق التي ذكرناها أعلاه، أو على قسم قوالب ووردبربس حيث جميع القوالب مجانية، فالكثير من مطوري القوالب يصدرون أعمالهم الأولى في هذا القسم. يمكنك تعلم كيفية إنشاء قوالب ووردبريس في أكاديمية حسوب من خلال سلسلة الدروس مدخل إلى تطوير قوالب ووردبريس. الملحقات plugins بطريقة ما، تعتبر المُلحقات شريان حياة ووردبريس، فهي تحوله إلى كل شيء من منتدى إلى شبكة اجتماعية أو منصة للتجارة الإلكترونية وغيرها باستخدام ضغطة زر واحدة، فالمُلحقات تعطيك تحكمًا كاملًا بجميع جوانب نظام ووردبريس، وتسمح لك بتعديل ما تشاء، وسيساعدك هذا كثيرا عند إنشاء مواقع ووردبريس للعملاء. كما هي الحال مع القوالب، فالمُلحقات تملك أيضا أسواقا وفي العادة يتم إدارتها من نفس الشركات التي تدير أسواق القوالب. يعتبر سوق CodeCanyon على سبيل المثال أكبر سوق للملحقات حيث يملك أكثر من 4000 ملحق متاحة للشراء. على الرغم من أن المبيعات ستكون أقل من القوالب إلا أنه يمكنك ربح الكثير إذا أنشأت ملحقًا جيدًا. يملك موقع ووردبريس قسمًا للملحقات المجانية ويحتوي على أكثر من 40000 ملحق، وهو بذلك مصدر كبير للأدوات والإلهام والأمثلة على الشيفرات البرمجية المميزة (والشيفرات البرمجية السيئة للأسف). يمكنك تعلم كيفية إنشاء ملحقات وإضافات ووردبريس في أكاديمية حسوب من خلال سلسلة الدروس مدخل إلى برمجة إضافات ووردبريس. ما بين WordPress.org و WordPress.com لقد أُطلق نظام ووردبريس بطريقتين مختلفتين، حيث كانت الأولى عن طريق WordPress.com؛ أمّا الثّانية، فعبر استخدام WordPress.org، وهذا نظرًا لإمكانيّة احتساب ووردبريس موقعًا للإنترنت، ومنصّة أعمال في آنٍ واحد، حيث يمكنك إنشاء حساب مجّاني في WordPress.com، والحصول على نسخة مُستضافة من نظام ووردبريس لخدمة موقعك، بحيث ستتحمل شركة الاستضافة مسؤوليّة صيانة الخادم وتثبيت ووردبريس عليه، ممّا يوفر عليك بعض العبء، ويتيح لك التّركيز على إنشاء المحتوى. تجني WordPress.com أرباحها عبر تقاضيها لأموال مقابل ترقيتها للمزايا، فعلى سبيل المثال إذا رغبت في استخدام اسم النّطاق الخاصّ بك في WordPress.com، فستحتاج إلى دفع القليل من الرسوم، وهناك الكثير من الشّركات التي تدفع لمنصّة WordPress.com لأجل استضافة مواقع ووردبريس ضخمة، مثل: بي بي سي أمريكا (BBC America)، ومجلة نيويوركر (The New Yorker Magazine)، ومدونة ستار وورز (Star Wars) الرّسمية. بسبب حاجة ووردبريس لدعم مختلف أنواع وأحجام المواقع، تمتلك منصّتها العديد من القيود المتعلّقة بتخصيص المواقع على نحو شخصيّ، فهناك عدد محدود من القوالب التي تتحكم بتنسيق ومظهر المواقع، كما يوجد عدد قليل من الإضافات التي تُعزّز من أداء وظائفه؛ أمّا WordPress.org فهو الموقع الرّسمي لنظام إدارة المحتوى ووردبريس الذي تستضيفه بنفسك. نقصد باستضافة ووردبريس عمليّة تنزيل نسخة من برنامج ووردبريس، وتثبيته على خادم إنترنت، والذي هو بالمقابل عبارة عن حاسب يستخدم برمجيّات خاصّة تسمح له بتوفير الوصول إلى مواقع الإنترنت المُخزّنة به لجميع المستخدمين على الإنترنت، حيث يمكن لهذا الخادم أن يكون مجرّد حاسب عتيق مُلقى في مكان ما بمنزلك، أو قد يكون مركز بيانات متطوّر، ولك حريّة اختيار الخادم المناسب لموقعك حسب تفضيلك، إذ تتيح استضافتك لنظام ووردبريس بنفسك إنشاء موقع إنترنت تمتلك فيه كامل الحريّة في التّحكم؛ بالمقابل، ستقع عليك مسؤوليّة إعداد وتثبيت نظام ووردبريس، وصيانته بنفسك. REST API ستستخدم REST API لاحقا عندما تحترف تطوير القوالب والمُلحقات، ونظريا ستكون قادرا على استخدامها إذا كانت لديك خبرة في البرمجة بلغة أخرى مثل جافا أو روبي. تعتبر REST API جديدة نسبيا وتسمح لك بإنشاء تطبيقات حقيقية بالاعتماد على ووردبريس، وهذا يتضمن تطبيقات أندرويد وأيفون وغيرها. أفضل طريقة لشرح هذه الميزة هي عن طريق مقارنتها بمواقع مثل تويتر أو انستغرام، لا شك أنك قد رأيت تغذية تويتر معروضة على موقع أحدهم، ولإضافة هذه الميزة إلى موقعك لن تحتاج إلى معرفة كيفية عمل نواة شيفرة البرمجية الخاصة بتويتر، كل ما تحتاجه هو القليل من الشيفرات البرمجية التي تقول: "من فضلك استرجع آخر خمسة من تغريداتي." وسيتعامل تويتر مع الباقي وسيرجع لك بيانات آخر خمسة تغريدات التي طلبتها، وبعد ذلك يمكنك استخدام HTML و CSS لعرضها. وهذا بالضبط ما يفعله REST API لووردبريس، يمكنك الاتصال بأي موقع وطلب منه آخر خمسة مشاركات فيها، ويمكنك أيضا القيام بأكثر من ذلك: يمكنك إنشاء/حذف المستخدمين وتعديل الفئات وغيرها (بالطبع، تحتاج إلى الاستيثاق قبل استخدامها)، هذا يعني أنه يمكنك استخدام ووردبريس كمستودع للمعلومات وبناء واجهة أمامية وبنية خلفية باستخدام نظام مختلف تماما. النواة ساهم في تطوير ووردبريس مجتمع من الآلاف المتطوعين حول العالم، حيث أنه يعمل 471 شخص على الإصدار 4.4 من ووردبريس، والعديد من الأشخاص الآخرين يعملون على جوانب مختلفة من ووردبريس، من الترجمة وتطبيقات الويب إلى الإتاحة (accessibility) والدعم. في الحقيقة، يمكنك الاشتراك معهم الآن، فبينما تحتاج إلى بعض الخبرة للمشاركة في برمجة نواة ووردبريس إلا أنه يمكنك المساهمة في تحديد المشاكل والأخطاء والتأكد منها وتقديم الأفكار في أي وقت باستخدام WordPress Trac، وهو المكان الذي يمكنك من متابعة تطوير شيفرة نواة ووردبريس. إذا وجدت علة (خطأ - bug) يمكنك إرفاقها بالشيفرة المناسبة للتخلص منها، وبعد عدة مراجعات وتدقيقات سيتم استخدام شيفرتك البرمجية إذا كانت مناسبة، وهذه هي أفضل طريقة للمشاركة في تطوير النواة. تطوير ووردبريس: ماذا تحتاج أن تتعلمه يجب أن تعتاد على العمل على مجموعة محددة من الأدوات حتى تتمكن من تطوير ووردبريس. إن عملية التعلم لا تنتهي بالنسبة إلى أي مطور جيد، سوف أعرض عليك هنا حزمة للبداية كما سأريك بعض الأدوات المتقدمة التي قد تحتاج إليها لاحقا عندما تريد أن تتعلم المزيد. الحد الأدنى من المتطلبات لتطوير الووردبريس هي HTML و CSS و PHP، بالإضافة إلى هذه اللغات ستحتاج إلى جافا سكربت و MySQL في مرحلة ما، عندما تتقن هذه اللغات يمكنك الانتقال إلى أشياء أخرى مثل LESS/SASS و Coffeescript و XML و JSON وغيرها، لكن هذه الأشياء لا تعتبر ضرورية لتطوير ووردبريس، لكن إذا عرفتها سيجعل حياتك أسهل كمطور وستوسع آفاقك. HTML و CSS أول لغتين يجب عليك تعلمهما هما HTML و CSS، مهما كانت الشيفرة البرمجية التي تكتبها ومهما كانت اللغة التي تستخدمها فستحتاج حتما إلى HTML عند إرسال صفحات الويب إلى المستخدم وإلى بعض CSS لتصميم وتزيين الصفحة. إن HTML مسؤولة عن إعطاء هيكل المواقع. على المستوى الأساسي، هذا يعني أنك ستقرر ما النص الذي يجب أن يكون عنوانًا وما يجب أن يكون قائمة وما الذي يجب أن يكون في رأس أو أسفل الصفحة. أما في المستوى الأعمق، ستقرر قرارات مهمة حول SEO والتحسين (optimization). يُستخدم CSS لتطبيق أنماط لهيكل HTML، أي أنك ستُعرّف لون النص والروابط والمسافة بين الفقرات ومحاذاة الصورة وألوان الحدود وسمكها وغيرها من العناصر عن طريق استخدام شيفرة CSS. إن CSS تتميز بسهولة تعلمها وبصعوبة إتقانها. PHP تحظى PHP بشعبية كبيرة كأشهر لغة سكربتات من جانب الخادوم server-side-، ووفقا للاستطلاع الذي قام به W3Techs، تستخدم PHP في 81.6% من المواقع وهي اللغة التي كُتب بها ووردبريس (وتقريبا أغلب أنظمة إدارة المحتوى الأخرى أيضا) ولذلك فإن معرفة PHP هو أمر ضروري لتطوير ووردبريس. إن معرفتك بـ PHP وحدها، سيجعلك تحصل على أكثر من معرفة بتطوير ووردبريس فقط. إن أهم فرق بين لغات جانب الخادوم عن لغات جانب العميل - مثل HTML - هو أنه يتم معالجتها في الخادوم أولا، ففي HTML، يمكنك كتابة شيفرة برمجية لـ Good Morning وسيرسلها HTML كما هي وسيعرضها على الزوار. أما في لغات جانب الخادوم، فستكتب شيء مشابه لهذا [good [time_of_day، وقبل أن يتم إرسال ذلك الأمر إلى المستخدم، سيعالج الخادوم هذه الأمر حتى يعرف ما يضعه في مكان [time_of_day] حسب الوقت الذي دخلت فيه إلى الموقع، فيمكنك أن ترى "Good day" أو "Good evening". لاحظ أن البيانات التي يستقبلها متصفحك تبقى HTML لكن تمت معالجتها في الخادوم مسبقا، ولاحظ أيضا أن الشيفرة السابقة لم تكن شيفرة PHP بل هي مثال فقط لأعطيك فكرة عن آلية عمل هذه اللغة. كما هو الحال مع جميع لغات البرمجة، فالممارسة والتمرين هي التي تجعلك تبرمج بشكل أفضل، فيمكنك تعلم PHP في غضون بضعة أيام لكنك ستجد نفسك أنك لا تملك أية فكرة عن ما الذي تقوم به، لذلك تحتاج إلى تجربة الأشياء وتخريبها وليس الوقوف دون معرفة ما يجري، وكما يقولون الممارسة تولد الإتقان. جافا سكربت ازداد دور جافا سكربت أهمية على الإنترنت، خاصة مع ظهور أدوات مبنية على جافا سكربت مثل Node و Angular. جافاسكربت تستخدم عادة لإضافة وظائف حيوية للمواقع وللتحميل غير المتزامن. سأعطيك مثال على كل واحد منها. فمثلا لو أردت أن يتم إخفاء نموذج بشكل كامل وأن يظهر ببطء داخل lightbox عندما يضغط المستخدم على زر معين، فيمكنك فعل ذلك باستخدام جافا سكربت بما أنه يمكنه التعامل مع تحريك الرسوم (animation) وربما الوظائف الأخرى، مثل التأكد من أنه تم ملئ النموذج بشكل صحيح قبل إرساله. أما التحميل غير المتزامن فيتم عمله عبر آلية تسمى بـ AJAX، فيمكنك استخدام AJAX للحصول على معلومات من الخادوم وعرضها دون إعادة تحميل الصفحة، وأبسط مثال لذلك هو التمرير اللانهائي (endless scrolling) فعندما يتم تحميل 10 مشاركات وتصل إلى نهاية الصفحة فسيتم عرض 10 مشاركات أخرى وتستمر هكذا. الكثير من المطورين تعلموا جافا سكربت من خلال إطار jQuery، فهو يُستخدم على نطاق واسع في ووردبريس وفي ملايين المشاريع على الإنترنت، وعلى الرغم من أن هذا الأمر جيد لكن ضع في اعتبارك أن جافا سكربت هو أكثر من مجرد jQuery وإن تعلم جافا سكربت كما هو هي فكرة جيدة. MySQL إن Mysql هي لغة تُستخدم للوصول والعمل مع البيانات المخزنة في قاعدة البيانات، يستخدم ووردبريس هذه اللغة كثيرا للتعامل مع البيانات، لكن كمطور، لا تحتاج إلى معرفة الكثير لأن ووردبريس يملك مجموعة من الدوال المساعدة. لكن في بعض الحالات الخاصة، قد تحتاج إلى كتابة استعلام قاعدة البيانات بنفسك أو ربما قد ترغب بتحسين شيء في موقعك، لذلك سيفيدك تعلم أساسيات MySQL. إن العمل مع قواعد البيانات واضح للغاية، فالجدول في قاعدة البيانات يشبه كثيرا جداول بيانات Microsoft Excel، فكل عمود يملك عنوانًا وبيانات مخزنة في الأسطر، ونستخدم MySQL لإضافة وحذف وتعديل واسترجاع البيانات، ربما ترغب بكتابة استعلام MySQL يرجع لك جميع المشاركات التي تحتوي على كلمة "awesome" ولديها أكثر من 8 تعليقات، أو قد ترغب أيضا بإيجاد جميع المستخدمين الذين يملكون اسم "Daniel". مرة أخرى، إن كتابة شيفرة MySQL خام في ووردبريس هو أمر نادر، لكنه يحدث في بعض الأحيان، لذلك فإن فهم كيفية عمل اللغة سيساعدك على كتابة شيفرات أفضل بشكل عام أدوات متقدمة بمجرد أن تتعود على الأقل على استخدام ثلاثة اللغات الأساسية - HTML و CSS و PHP - يمكنك البدء باكتشاف العديد من الأدوات المساعدة، واحدة من الأشياء الأولى التي يميل الناس إلى تعلمها هي LESS و/أو SASS، كلاهما "مجموعات موسّعة" (Superset) لـ CSS، أي أن أي شيفرة CSS صحيح تعتبر صحيحة في شيفرة LESS و SASS، وتكمن أهمية إضافة هاتين اللغتين هو إمكانية استخدام متغيرات ودوال و غيرها في CSS، والذي هو غير ممكن بشكل افتراضي. إن أدوات البناء (Build tools) هو شيء سترغب في اكتشافه عند مرحلة معينة، أفضلها Gulp و Grunt فهذان يمكنهما مراقبة تعديلات الملفات وتنفيذ مختلف المهام عند استيفاء المتطلبات، فعلى سبيل المثال، في أي وقت تعدل فيه ملف SASS يمكنك ترجمته تلقائيا إلى CSS وحفظه إلى ملف معين، أو يمكنك تحسين الصور أو دمج الملفات أو تحميل الحزم الخارجية فجميع المهام الأخرى يمكنك أن تفعلها باستخدام هذه الأدوات. سطر الأوامر أو الطرفية (terminal) هو شيء يجب أن تلقي نظرة عليه. نعم إن استخدام سطر الأوامر قد يبدو مخيفا لكنه ليس كذلك، فبمجرد كتابة بضعة أوامر يمكنك حفظ الكثير من الوقت، فسكربت/أداة مثل WP-CLI يمكنه تثبيت ووردبريس في بضعة ثواني، بما في ذلك تثبيت القوالب والمُلحقات والمحتويات للتجربة والتي لو قمت بها بشكل يدوي ستتطلب الكثير من الوقت والجهد. إن أنظمة االتّحكّم في الإصدارات (Version control) هي من الأدوات المفيدة للغاية فلن تعرف حاجتك إليها إلا لو استخدمتها، فعلى الرغم من أنها وُضعت أصلا للعمل على نفس الشيفرة البرمجية في مجموعات إلا أنه يمكنك استخدامها كحل لإدارة المشاريع والمشاكل والنسخ الاحتياطي في نفس الوقت. ويعتبر كل من SVN و Git الأشهر على الإطلاق، لكن بالنسبة لي، أعتبر أن Git أفضل نظرا لأنه يعمل بشكل أفضل وبسبب Github الذي يوفر خدمة استضافة مستودعات Git على الإنترنت. ووردبريس: بوابتك إلى عالم البرمجة إن أفضل شيء بالنسبة إلى ووردبريس أنه يمكن أن يكون مدخلا لتعلم مهارات تطوير ويب ولغات أخرى. ولقد خضت هذه التجربة شخصيا، فلقد تعلمت أولا البرمجة الموجهة في PHP ثم تعلمت إطار عمل Laravel وأدوات البناء ثم LESS/SASS وأدوات سطر الأوامر وغيرها الكثير. ولقد خضت أيضا في غمار native app باستخدام #C وغيرها من اللغات. بمجرد معرفتك بكيفية عمل كل شيء، ستتعلم المزيد عند إنشاء مشاريع جديدة وكبيرة وكل شيء سيصبح أسهل، فبعد البرمجة كائنية التّوجّه في PHP لن تبذل الكثير من الجهد في تعلم #C لأن دماغك سيتعود على منطقه بطريقة مشابه لتعلم قيادة الشاحنات بعد تعلمك قيادة السيارات، فعلى الرغم من وجود الكثير من الاختلافات لكن بمجرد أن يكون لديك بعض الأساسيات سيسهل عليك التّحكمّ فيه. خاتمة ها قد عرفت الآن ما الذي تحتاجه للبدء في تطوير موقع ووردبريس، وقد تشعر بالإرباك، لكن لا تقلق، فالجميع سيشعر بذلك في هذه المرحلة. تذكّر أمرًا: من المهم أن لا تثبط عزيمتك، فجميع المبرمجين بدؤوا من مكان ما، فالكثير منهم كان سيئا للغاية عندما بدأ، يصارع لفهم المفاهيم الجديدة وشعر بالإحباط، لكنهم لم يستسلموا وكانوا دائما يدفعون أنفسهم للتّعلّم وهذا ما يُميّز المبرمج الجيد من السيئ. ترجمة -وبتصرف- للمقال: WordPress Development for Beginners: Getting Started لصاحبه Daniel Pataki والمقال WordPress.org and WordPress.com من موقع wordpress.org. حقوق الصورة البارزة: Designed by Freepik.
  4. أداة البناء Grunt أو Gulp، مكتبة require.js، ‏browserify، الإصدار السادس من ES، المفسرات، أطر عمل React و Angular و Amber، التعابير المغلقة (closures)، سلسلة prototype. ارتفاع في ضغط الدم يؤدي إلى سكتة دماغية. حسنًا، تطوير الويب أمرٌ ممتع جدًا، لكن JavaScript مروعة! تجد نفسك منسجمًا تمامًا مع جميع جوانب تطوير الويب، لكن عندما يأتي الأمر إلى JavaScript فستشعر أنَّ جزءًا كبيرًا من المعلومات الأساسية ينقصك بينما يعرفه الآخرون، والذي سيؤدي إلى جعلهم يفهمون سكربتات JavaScript. نعم، الحقيقة هي أنَّك تفتقد بالفعل إلى بعض القطع؛ لكن هذا لا يعني أنَّ التوجه الحالي لتطوير الواجهات الأمامية ليس مجنونًا! اطمئن، فأنت لستَ بمفردك، لذا اسحب كرسيًا واجلس، وجهِّز نفسك لكتابة تطبيق JavaScript. أوّل خطوة هي ضبط بيئة التطوير المحلية، لذا اتخذ قرارك: هل ستستخدم Gulp، أم Grunt، لا! سأستعمل سكربتات NPM. هل أستعمل Webpack أم Browserify أم Require.js؟ هل أتخذ قرارًا مصيريًا بالانتقال إلى الإصدار السادس من ES؟ أليس ضروريًا أن أضع مرجعًا عن أمراض القلب بجواري؟ كيف سأنظِّم اختبار الشيفرات؟ هل من إطارِ عملٍ تنصحني به؟ أليس من الأفضل تشغيل الاختبارات من سطر الأوامر، لنستعمل إذًا PhantomJS؟ مع أي إطارٍ أذهب: Angular أم React؟ ربما Ember؟ ماذا عن Backbone؟ ربما قرأتَ بعض صفحات توثيق React ووجدتَ فيها أنَّ «Redux هو حاويةٌ ذاتُ حالةٍ قابلةٍ للتوقع لتطبيقات JavaScript» وبدت على وجهك أمارات الرضى، فمن المؤكد أنَّك ستحتاج إلى هذه الميزة العظيمة، بغض النظر عن أنَّك لم تفهم حرفًا من شرحها. السؤال الآن هو: لماذا أصبح تطوير تطبيقات JavaScript أمرًا يدفع إلى الجنون؟! دعني أساعدك لفهم سبب ذلك. لنبدأ بمثالٍ بسيطٍ ثم سنستعرض صورًا جميلةً توضِّح وجهة نظري. هذا تطبيق «Hello, World!‎» مكتوبٌ باستخدام React: // main.js var React = require('react'); var ReactDOM = require('react-dom'); ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') ); لم ننتهِ منه بعد: $ npm install --save react react-dom babelify babel-preset-react $ browserify -t [ babelify --presets [ react ] ] main.js -o bundle.js هنالك عدِّة خطوات ناقصة هنا، مثل تثبيت مكتبة browserify أو ما الذي عليك فعله لتشغيل الصفحة في المتصفح، إذ لا يبدو أنَّ ما سبق سيُنشِئ صفحة ويب قادرة على فعل أيّ شيء! بعد أن تنتهي من إنجاز ما سبق، فستجد ملفًا يدعى bundle.js يحتوي على تطبيق «Hello, World!‎» السابق المكتوب بمكتبة React والذي يضم حوالي 19374 سطرًا برمجيًا، وكل ما فعلتَه هو تثبيت browserify و babelify و react-dom، التي «تزن» آلاف الأسطر البرمجية. هذه صورة تعبيرية عن برنامج «Hello, World!‎» في React: حسنًا، هذا تطبيق «Hello, World!‎» باستخدام JavaScript دون مكتبات: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>Hello World</title> </head> <body> <div id="container"></div> <script> document.body.onload = function(){ var container = document.getElementById("container"); container.innerHTML = '<h1>"Hello, world!"</h1>'; } </script> </body> </html> هذا كل ما في الأمر! 18 سطر برمجي (يمكن اختصارها إلى أقل من ذلك)، التي تستطيع نسخها ولصقها في ملفٍ باسم index.html وتنقر نقرتين عليه مما يفتحه في متصفحك. يا للبساطة! إذا كنتَ تفكِّر في هذه اللحظة «أليس إطار React يفعل أكثر من ذاك المثال البسيط الذي كتبته، والذي لا يرقى أن يكون تطبيق JavaScript» فأنت مصيبٌ (تقريبًا)، وعلى بعد خطوة واحدة من فهمك لماذا كل هذا التعقيد. انظر إلى هذه الصورة: أغلبية تطبيقات JavaScript التي ستعمل عليها ستقع في مكانٍ ما في منتصف المنحني الجرسي (bell curve) السابق. وإذا كنتَ في منتصف المنحني السابق وبدأت تطبيقًا بالاعتماد على React فسوف ينتهي بك المطاف بهندسة تطبيقك زيادةً عن اللزوم من بدايته. وهذا هو سبب تعقيد تطوير تطبيقات JavaScript، لأنَّ غرض أغلبية الأدوات التي تظن أنَّك بحاجةٍ إليها هو حلّ المشاكل التي لن تتعرض إليها بتاتًا. أصبحت حالة تطوير تطبيقات JavaScript في الآونة الأخيرة معقدةً ومربكةً لأنَّ الجميع يبالغون في هندسة تطبيقاتهم دون أن يدركوا ذلك. إذًا، كيف يجب أن نبدأ بتطوير تطبيق JavaScript؟ هل علينا استخدام مكتبة شبيهة بمكتبة React أو Angular؟ هل يجب أن نستخدم مدير للحزم؟ ماذا يفترض علينا أن نفعل إذا لم نستخدمهما؟ هل كتابة الاختبارات ضرورية؟ هل علينا أصلًا توليد شيفرات HTML عبر JavaScript؟ هذه هي الأسئلة التي يجب أن تسألها لنفسك قبل أن تبدأ بمجموعة ضخمة من أدوات التطوير. عندما تبدأ بتطوير تطبيق JavaScript فمن المهم أن تختار نقطةً في المنحني الجرسي في المكان الذي تظن أنَّ من المرجح أن يصله تطبيقك في المستقبل من ناحية التعقيد. لن أكذب عليك، فعل ذلك ليس سهلًا ويحتاج خبرةً، لكن هنالك منطقةٌ كبيرة يمكنك أن تبدأ منها أغلبية تطبيقات JavaScript: استعمل مكتبة jQuery مع قوالب لصفحات الواجهة الأمامية مع أداة بناء بسيطة لجمع الملفات وتصغيرها (بفرض أنَّ إطار العمل الذي تستعمله لتطوير السند الخلفي [backend] لا يفعل ذلك تلقائيًا). إذا أردتَ أن تتعلم كيفية هيكلة تطبيق JavaScript بطريقةٍ صحيحة، فعليك أن تبدأ بفهم كيف ومتى ولماذا تستخدم إطار عمل أو حزمة npm أو إصدار ES6 أو متى تكتب اختبارات أو هل عليك جعل الاختبارات تعمل محليًا أو في متصفح، ثم سيأتي دور بقية الأسئلة وحلّ بقية المشاكل. إن أردتَ أن تملأ الفجوات الموجودة في معلوماتك حول تطوير JavaScript وأن تتجنّب الشعور بأنّك تبالغ في تصميم تطبيق JavaScript فحاول أن تتابع ما نطرحه هنا في قسم البرمجة في أكاديمية حسوب. ترجمة -وبتصرّف- للمقال Why JavaScript Development is Crazy لصاحبه Sean Fioritto
  5. أُعَد حاليًا مصمم تجربة المستخدم الأساسي في شركة DNV GL Energy. وهي شركة عالمية تقدم نصائح متخصصة وخدمات الشهادات لقسم الطاقة المتجددة حول العالم. نقوم كجزء من عملنا بتقديم منتجات وخدمات برمجية ومصنوعة بأيدي فريق التطوير الخاص بنا. مجال الطاقة المتجددة، وبمشاريعه ذات التركيز التقني والمخاطر العالية، لا يرتبط عادةً بعمل تجربة المستخدم ولكن البحث والتصميم على الصعيد الآخر يعتبران مهمين جدًا في عملية البرمجيات الخاصة بنا. يتوقع مستخدمونا الذين يعملون في هذا المجال بأن تتمكن أدواتهم البرمجية من مواكبة آخر التطورات في التكنولوجيا وبأفضل استخدام وأن يكون عملهم قادرًا على التعامل مع الهندسة والفيزياء المعقدة بعض الشيء. لذلك من المهم جدًا أن يفهم فريق التطوير الخاص بنا ما يحتاجه المستخدمون، فيعتبر بحث المستخدم واحدًا من أكثر الأنشطة المهمة لدينا في الشركة. يعتبر دور الباحث دورًا محوريًا كشخص يستطيع التعامل بشكل مباشر مع الأشخاص والكشف عن حاجاتهم، وحتى تلك الحاجيات التي لا يعرفون بأنهم يحتاجونها، ومن ثم يقوم الباحث بترجمة كل هذا على شكل تغذية راجعة لفريق التطوير حتى يستطيعوا العمل عليه فورًا. بعض أفضل تقدماتنا في العام الماضي كانت بشكل مباشر ناتجة عن المعلومات المتجمعة من خلال أنشطة البحث. على الرغم من أن عدد الشركات التي تدرك مدى الأهمية الموجودة في هذا النوع من العمل آخذ بالازدياد، يعتبر هذا من الصعب عمله على أية حال، خصوصًا إن كنت أنت وشركتك حديثي عهد لهذا التدريب. تأتي المهارة الحقيقية بالممارسة، ولكنني أؤمن بأن معرفتك لكيفية التصرف خلال مقابلة او موقف اختبار لتحصل على أكبر فائدة ممكنة، هي خطوة أولى ومهمة لكي تصبح باحث مستخدم. 1. سهِّل على الناس لن يعطيك المشاركون في البحث نتائجًا صادقة أو صريحة إن فقدوا الشعور بالراحة. قضاء الدقائق الأولى من الجلسة بالتحدث مع المشاركين وجعلهم يرتاحون بإمكانه أن يُحدث فرقًا شاسعًا بالنتائج. 2. قم بتهيئة الأجواء ابدأ الجلسة بتوضيح أهدافك، كن مباشرًا وصريحًا، لا تفترض بأن هنالك أي أحد يفهم المصطلحات البرمجية أو يعرف أي شيء عن مشروعك. لاحقًا، سوف تحتاج للرجوع للأهداف التي ذكرتها مسبقًا، لذلك قم بتدوينها. 3. اتّبع خطة معينة وليس سيناريو قبل بدء الجلسة، قم بتدوين ما تريد أن تعرفه والأسئلة التي تود سؤالها. كن جاهزًا للسير حسب الجلسة فسوف تحصل على مفاجآت كثيرة. على سبيل المثال: ليس من الغريب في عالم الطاقة المتجددة أن تجد مستخدمين يزيدون في المنتجات باستخدام أدوات الجداول (Spreadsheet tools) في حال لم يعجبهم البرنامج. تعلمك للمرونة وتغيير الأشياء سوف يأتي مع الخبرة. 4. عامل المستخدمين وكأنهم خبراء أنت موجود للاستماع وتقدير مستخدميك ووجهة نظرهم. عامل المشاركين في بحث تجربة المستخدم كخبراء واطلب نصيحتهم، سيكون المشتركون أكثر قابلية لإعطاء تغذية راجعة حقيقية إن جعلتهم يشعرون بأهميتهم أو اعطائهم الفرصة للتعبير عن خيباتهم واقتراحاتهم. 5. كن نزيهًا ليس من السهل على المصممين أن يبقوا غير متحيزين، ولكن يجب عليك ان تكون نزيهًا عند اختبارك لمنتجك. عادةً ما أقوم بالبداية بذكر أنني لم أحصل على المشاركة الكافية في التصميم، لذلك بإمكان المستخدمين أن يكونوا صريحين معي. يحتاج الناس لأن يشعروا بأنه من المقبول أن لا يعجبهم شيء ما أحيانًا وأنه لن تتم إهانة أي منهم إن تحدث عن ما يجول في عقله. 6. ادعُ إلى الانتقاد لا تقم بالدفاع عن منتجك. كن متقبلًا للانتقاد، سوف يساعدك هذا على المدى البعيد. إن كان شيءٌ ما ليس على ما يرام، فمن الأفضل أن يتم معرفته بينما لا يزال هنالك وقت لتعديله. 7. اسأل أسئلة صريحة وليست غامضة قم دائمًا باختيار أسئلتك بعناية تامة وتجنب الدفع بأفكارك المسبقة على الآخرين. بدلًا من ذلك، قم بدعوة مستخدميك لتشكيل اجاباتهم الخاصة، حيث أن الأسئلة الصريحة والمفتوحة لديها فرصة أكبر لجعلك تكتشف أشياء جديدة. وبدلًا من سؤالك: "هل ذهبت لتلك الشاشة لإكمال مشروعك؟"، اسأل: "لماذا ذهبت لتلك الشاشة؟". وبدلًا من سؤالك: "هل أعجبتك هذه الميزة الجديدة؟"، اسأل: "هل بإمكانك إخباري عن رأيك بالميزة التي جربتها للتو؟". 8. قم بالسؤال باستخدام "لماذا؟" و"كيف؟" عندما يحدث أمر مثير للاهتمام وتريد أن تعرف المزيد عنه، قم بالسؤال. هذه فائدة وجود خطة بحث تمكنك من أن تكون مرنًا في حال قام مستخدمك بعمل شيء غير متوقع ومثير للاهتمام. أسئلة بسيطة مثل: "لماذا فعلت ذلك؟" أو "هل يمكنك أن تخبرني المزيد عن ذلك؟" تكفي لكشف المزيد من المعلومات المفصلة. 9. أبقِ سَير الجلسة حسب المخطط أحيانًا، تحتاج المحادثة لدَفعات خفيفة لتبقى على المسار، خاصًة بوجود وقت محدود والعديد من الأشياء المهمة لتحرّيها. إن كنت قد هيأت الأجواء مسبقًا في البداية، بإمكانك دائمًا أن تعرّج على الأهداف التي قمت بذكرها حتى تتمكن من معرفة أي الأشياء ذات صلة بالأهداف. وتذكر مجددًا أن تبقى منفتحًا للأشياء الجديدة في حال أراد مستخدمك أن يعبّر عن شيء مهم بالنسبة له، وحاول أن تخلق وقتًا إضافيًا لذلك. 10. اسأل السؤال ليتم توضيحه وليس ليتم قوله فقط تقريبًا، من المفضل دائمًا أن تشاهد الناس يستخدمون منتجك بالفعل، فسوف ترى أشياءً لم يكونوا يعتقدون بأنها مهمة أو أشياء قد نسوا ذكرها. سوف تجد أيضًا أشياءً بارزة وأكثر سهولة للفهم بفضل هذا السياق. 11. ابحث عن الأشياء الغير متحَدّث عنها الباحث الجيد يلاحظ ردود الفعل الغير مفصح عنها، حيث أن ما يقول أو يفعل الناس قد يكون مختلفًا جدًا، لا يمكنك أن تعتمد فقط على كلمات المشاركين. 12. قم بالانتقال والتوثيق بشكل خفيف كن كذبابة على الحائط وحاول قدر المستطاع أن لا تشوش على أجواء الناس. محاولة التسهيل على الناس وأخذ الملاحظات في نفس الوقت صعب جدًا، لذلك أوجد طريقةً لأخذ ملاحظات قصيرة وفعّالة بنفس الوقت أو قم بطلب المساعدة من زميلٍ لك. ابتعد عن شاشة الحاسوب إن أمكن وقم بالنظر إلى الناس وجهًا لوجه، حيث أنك تريد أن تختلط معهم وتسهّل الأمور عليهم. 13. اكتب تلخيصًا بالنتائج في أسرع وقت ممكن لأنك سوف تنسى بسرعة، قم بكتابة ملخص عن نتائجك بينما لاتزال المعلومات جديدة في عقلك. 14. اكتب استنتاجات مختصرة وقابلة للمشاركة يعتبر بحثك عقيمًا، ما لم يستطع الأخرون من فهم توصياتك والتصرف بها، لذلك خذ بعين الاعتبار كل من جمهورك، أصحاب المصلحة، مدراء المنتج، المطورون ...إلخ، وقم بإعطائهم ردود فعل مختصرة بلغة يسهل عليهم فهمها. ترجمة -بتصرف- للمقال How to conduct yourself in a UX research session‎ لصاحبه Matt Corrall
  6. الحصول على موظفين يملكون ولاءً للشركة أمرٌ في غاية الصعوبة، ومحاولة دفعهم لذلك هي مسألة حساسة لأن الموظفين يمكن أن يكونوا حسّاسين. كمدير، عليك بذل قصارى جهدك لتكون على يقين من أن موظفيك سعداء ومخلصين دومًا. فغالبًا ما تكمن المشكلة في رب العمل، لا في أمور أخرى كالشركة أو بيان العمل أو الزملاء. إن كنت ترى أن أكبر مشاكلك هي مديرك، فإليك قائمة بعشرة تصرفات يقضي بها أصحاب العمل على الحماس، وإن كنت صاحب عمل، وكنت تقرأ هذا، فكُن حريصًا على تجنب هذه الأخطاء لضمان حماسة موظفيك أثناء العمل. سرّ القيادة الجيدة هو أن تكون جديرًا بالثقة وصادقًا مع موظفيك. 1- تتدخل في كل تفصيل بنفسك هذا أمر لا يتوقف عن إدهاشي. تقوم بتوظيف شخص خارق الموهبة للقيام بمهام لا تمتلك الوقت أو الخبرة الكافيين لأدائها. ومع ذلك تقوم بالتدخل في عمله للحدّ الذي يعيقه بشكل كامل عن أدائه. عليك -في المقام الأول- أن تُبقي في ذهنك لِم قمت بتوظيف هذا الشخص، وتعلّم كيف تخفف من سيطرتك، فما تقوم به لا يتعدى دفع الموظف للشعور باللاجدوى، وهي طريقة مضمونة لقتل حماسة موظفيك. 2 – تركز على الأخطاء لا أحد يحب أن يكون محاطًا بالسلبية. ابذل قصارى جهدك لتتصرف بإيجابية، وتصنع محيطًا مشجعًا في مكان العمل. الجميع يخطئ، و هذا طبيعي، يجب أن تتعلم كيف تكون أكثر تسامحًا. بدلًا من التركيز على الأخطاء، حاول التركيز على إنجازات فريقك (مهما كانت صغيرة)، هذا ما سيضمن بقاءه متحمسًا دومًا. 3- ترفض الأفكار كل الأفكار جيدة، ولا يُشترط أن يتم تنفيذ كل فكرة يملكها الموظف، لكن من المهم أن تستمع. عندما تسمح لموظفيك بأن يشعروا بأن صوتهم مسموع ولهم دور في عملية صنع القرار. ستشعرهم بأنهم ينتمون للشركة. 4- تُخلف وعودك هذا أمرٌ سيء ويمكنه أن يقضي بسهولة على حماسة موظفك. إن وعدت بأنك ستقوم أو لا تقوم بأمرٍ ما، فيجب عليك أن تحافظ على وعدك. بناء الثقة بين الشركة وموظفيها هو واحد من أكبر مفاتيح ولاء الموظفين. وكأي علاقة، إن لم يكن هناك ثقة، لا يمكن أن تستمر. الدرس بسيط هنا – حافظ على كلمتك. 5- تقدّم وعود كاذبة هو أمرٌ مشابه جدًا للنقطة السابقة، لكنه يزعجني أكثر. ليس هناك ما هو أسوأ من رفع سقف آمالك، ثم تدميرها. الوعد مُقدّس. إذا وعدت موظفك بأمر، فمن الأفضل أن تكون قادرًا على تنفيذه. ومرة أخرى، هذا سيضمن وجود الثقة ووجود علاقة متينة. يمكن للموظفين أن يغفروا وعدًا كاذبًا أو اثنين، لأن الأمر لا يستحق المخاطرة بوظائفهم، ولكن لا تجعل من الأمر عادةً لديك. 6- تُلقي نكاتًا بذيئة أنا مع فكرة أن يكون المدير مرحًا، يُلقي النكات و يأخذ الأمور بسلاسة، لكن من المهم أيضًا الحفاظ على العلاقة بين المدير و موظفيه. على قدر ما يرغب الموظفون بمساحة من الحرية، و أن يكونوا على طبيعتهم. فهي تبقى "علاقة رسمية". الدرس المستفاد هنا هو أن تفكر قبل أن تتكلم، إذا كانت دعابتك متحيزة جنسيًا أو عنصرية أو مسيئة بأي شكل من الأشكال، فمن الأفضل ألّا تُلقيها، واحتفظ بها لأصدقائك لا لموظفيك. 7- تعقد اجتماعات بلا طائل لا يوجد ما هو أكثر إزعاجًا من أن تكون مستغرقًا في العمل، مع موعد نهائي لتسليمه، ثم يأتي مدير ليدعوك إلى اجتماع غير مخطط له. معظم الوقت تضيع الاجتماعات بسبب مدراء يمضونها بالكلام. إذا كنت بحاجة إلى سماع نفسك وأنت تتكلم، فقط من أجل التحدث، فلا تضيع أوقات الآخرين. قم بتسجيل فيديو لنفسك على هاتفك المحمول، ستحظى بالمرح لوقتٍ لاحق، و لن تزعج موظفيك. 8 – تقيس نجاح الموظف بشكل خاطئ سأعطي مثالًا شخصيًا لشرح وجهة نظري. كنت أعمل لدى مدير يقيس إنتاجية مطوري البرمجيات بعدد المراجعات التي يتم تقديمها لموقع Github. بالنسبة لأولئك الذين يقرأون المقال و ليس لديهم فكرة عمّا أتحدث، فهي عملية أشبه بقياس نوعية مقال عن طريق عدد الكلمات، و هو أمرٌ مُخجل. هذا ما يحطم حماسة الموظفين، لأنهم يعرفون أن ما يتم الحكم عليه هو أمرٌ ليس بمقياس. من المهم فهم كيفية قياس النجاح، والمقاييس التي تستخدمها لذلك. ابحث دائمًا عن طريقة لتحسين قياس النجاح. 9 - تحدد مواعيد تسليم غير واقعية لتحفيز الموظفين بشكل صحيح، فإنهم بحاجة للشعور بأنهم أنجزوا شيئًا ما، أو على الأقل أنّ هدفهم قابل للتحقيق. إذا قمت بتحديد مواعيد تسليم غير واقعية، فإنك على الأرجح ستقوم بخفض عدد موظفيك، لأنهم سيشعرون وكأنهم لن يصلوا لخط النهاية. من المهم وضع ذلك في الاعتبار. يمكنك تقسيم الهدف إلى أهداف أصغر، وأكثر قابلية للتحقيق بحيث يكون هناك طيف إنجاز على الأقل. 10 – تفاضل بين موظفيك وهذا من شأنه تحفيز الموظف الذي قمت بتفضيله، ولكن من الواضح أنه سيُحبط من يتم تجاهله. و جليّ أنك إن فضّلت أحدهم، فسيعلم بقية الموظفين بذلك فورًا، لذلك احترس. وتذكر أن موظفيك يشكلون فريقًا وكلهم في ذات الفريق، ويعملون لتحقيق نفس الهدف. إذًا، ينبغي ألّا يكون هناك تفضيل، على الجميع أن يكون مفضّل لديك. وهناك الكثير من هذه الأخطاء التي يمكن لأصحاب العمل تجنبها.فقط عامل موظفيك باحترام. فكر في الطريقة التي تود أن تُعامل بها إذا ما تم عكس الأدوار. سترغب بأن تكون شخصًا موثوقًا، وأن تُطلب منك آراءك وأفكارك، وأن تترك لك الحرية الكاملة للقيام بعملك بشكل صحيح. كنت لترغب ببيئة تشجع التجريب والاختبار والفشل (في حدود المسموح). التغلب على الأسوأ، يمكنك دومًا اكتشاف المزيد عن موظفيك باستخدام الحلول الفريدة. ما هي الطرق التي صادفتها في إحباط الموظفين؟ أخبرنا بذلك في التعليقات. ترجمة -وبتصرّف- للمقال 10 Ways Your Boss Kills Employee Motivation لصاحبه Jacob Shriar
  7. إنَّ لغة البرمجة Ruby هي إحدى لغات البرمجة الديناميكيِّة التي تُستخدم في أغلب مجالات البرمجة بدءًا من كتابة أكواد البرامج البسيطة وحتى الألعاب وتطبيقات الويب. كان أول إصدار لهذه اللغة عام 1993 في اليابان ولكنها لم تكتسب شهرتها حتى عام 2005 إذ استُخدمت على نطاقٍ واسعٍ في برمجة وتطوير الويب. بالرغم من أنَّها سهلة الاستخدام ومناسبة جدًا لحديثي العهد في مجال البرمجة إلا أنَّها قوية بما يكفي لإنشاء البرامج والأنظمة المعقَّدة. بعبارة أخرى، هذه اللغة هي أفضل خيار للمبتدئين والمحترفين في الوقت ذاته. توجد طرائق عدَّة لتثبيت Ruby على نظام التشغيل ويندوز 10 إلَّا أنَّ مايكروسوفت تنصح باستخدام “نظام لينكس الفرعي في ويندوز” (Windows Subsystem for Linux)، ويدعى اختصارًا WSL، وهي إحدى مزايا ويندوز 10 التي تسمح للمطورين والمبرمجين بالعمل ضمن بيئة لينكس وتشغيل سطر الأوامر (bash) والاستفادة من أدواته وتطبيقاته المختلفة بينما هم في ويندوز ودون الحاجة للجوء إلى البيئة الافتراضيَّة (virtual machine). بما أنَّ معظم المكتبات المتعلقة بهذه اللغة صُمِّمت للعمل ضمن بيئة لينكس فإنَّ تشغيلها على ويندوز يؤدي إلى حدوث الكثير من الأخطاء، لذا اشتركت مايكروسوفت مع Canonical وتوزيعات أخرى من لينكس في مشروع لتفعيل الصدفة (Shell) ودعم أدوات سطر أوامر لينكس على ويندوز الأمر الذي ساعد في حل المشكلات السابقة، ويمكن حينها تشغيل Ruby وجميع الأدوات والمكتبات المرتبطة بها على ويندوز دون أخطاء. إن كان نظام التشغيل على حاسوبك هو ويندوز 10 مع إمكانيَّة استخدام صلاحيات المستخدم المسؤول كما ثبتَّ عليه مؤخرًا آخر التحديثات، وكنت تبحث عن طريقةٍ لتثبيت أحدث إصدار من Ruby وكل ما يتعلق بها فقد اخترت المقال المناسب ليرشدك لذلك. الخطوة الأولى: تثبيت الصدفة على ويندوز تحتاج لتثبيت Ruby والعمل على هذه اللغة إلى استخدام سطر الأوامر؛ إن لم تسمع بهذا المصطلح من قبل فهذا يعني أنك حديث عهد بمجال البرمجة. سطر الأوامر هو بيئة غير رسوميَّة أي لا دور للفأرة والأيقونات فيها وبدلًا من ذلك تستطيع التحكم بالحاسوب وأداء المهام الروتينيَّة بكتابة مجموعة من الأوامر (نصوص) ضمن سطر الأوامر يفهمها الحاسوب لأداء مهمَّة ما ثمَّ تظهر لك النتيجة على شكل نص أيضًا؛ لا يستطيع مطورو البرامج الاستغناء عن سطر الأوامر فهو من الأدوات الأساسيَّة لديهم. يحوي نظام التشغيل ويندوز على نوعين من سطر الأوامر وهما: موجه الأوامر (command prompt) والصدفة (powerShell)؛ قد يشبهان بعضهما ظاهريًا ولكنها يختلفان كثيرًا عمليًا إلى درجة انعدام التشابه؛ موجه الأوامر قديم جدًا فهو من مخلفات نظام التشغيل MS-DOS إذ لم يعد يلبي كافة الاحتياجات فأصبح محدودًا بينما ظهرت الصدفة (powerShell) مع ويندوز 7 لتوفر بيئة جديدة ومتطورة في ويندوز، وهي معقَّدة بعض الشيء ولكنَّها ذات كفاءة عالية جدًا. سنثبِّت على ويندوز الصدفة ذات النوع (bash) وهي الأكثر شهرة والمتواجدة في نظامي التشغيل لينكس و macOS؛ للبدء بذلك يجب تفعيل “وضع المطور” (developer mode) -تأكد قبل ذلك أنَّ نظام التشغيل هو 64 بت- عبر الذهاب إلى خيار “التحديث والأمان” (Update & Security) الموجود في الإعدادات (settings) ثمَّ اختيار “للمطورين” (For developers) الموجود ضمن القائمة الجانبيَّة وتفعيل خيار “وضع المطور” ثمَّ حفظ الإعدادات. الخطوة التالية هي الذهاب إلى “لوحة التحكم” (control panel) ثم اختيار “البرامج” (programs) وبعدها اختيار “تشغيل ميزات ويندوز أو إيقاف تشغيلها” (Turn Windows features on or off) وتفعيل الخيار “Windows Subsystem For Linux (Beta)” من القائمة ثمَّ الضغط على “موافق” والانتظار حتى الانتهاء من تثبيت العناصر الإضافية؛ سيظهر بعد ذلك خيار يطالبك بإعادة تشغيل الحاسوب؛ بعد إعادة التشغيل، افتح موجه الأوامر واكتب ما يلي: C:\Users\Sammy> bash ستظهر لك رسالة تخبرك بالحاجة لتثبيت bash من متجر ويندوز لذا اضغط “y” لإتمام هذه العملية. This will install Ubuntu on Windows, distributed by Canonical and licensed under its terms available here: https://aka.ms/uowterms Press "y" to continue: y Downloading from the Windows Store... 100% Extracting filesystem, this will take a few minutes.… سيُطلب منك بعد إنهاء عملية التثبيت إنشاء مستخدم جديد. Please create a default UNIX user account. The username does not need to match your Windows username. For more information visit: https://aka.ms.wslusers Enter new UNIX username: Sammy Enter new UNIX password: أدخل اسم المستخدم وكلمة المرور؛ لا تقلق إذا لم يظهر أي شيء ضمن خيار إدخال كلمة المرور بينما أنت تضغط على المفاتيح إذ ذلك من دواعي الأمان وستعتاد عليه لاحقًا. ستعمل بعد ذلك الصدفة (bash) وسيظهر اسم المستخدم الذي أدخلته للتو ضمن المحث كما هو موضح. sammy@yourmachine:/mnt/c/Users/Sammy$ ملاحظة: تكون الملفات المتعلقة بنظام لينكس الفرعي في ويندوز WSL مخفية ولا يدعم ويندوز إمكانية الوصول إليها مطلقًا وقد تتلف هذه الملفات إن حاولت الوصول إليها باستخدام برنامج أو مدير ملفات أو غيرهما؛ خلافًا لذلك، من الممكن الوصول إلى الملفات الموجودة على النظام بوساطة الصدفة (bash) فمثلًا يمكن الوصول إلى محتويات القرص C بكتابة المسار ‎/mnt/c في سطر الأوامر. الخطوة الثانية: تثبيت مدير إصدارات Ruby‏ (RVM) يعتبر مدير إصدارات Ruby‏ (Ruby Version Manager)، ويدعى اختصارًا RVM، بأنَّه المسؤول عن تثبيت لغة البرمجة Ruby وإعدادها، وإدارتها، وضبط البيئة البرمجية المرتبطة بها؛ ويعمل على نظام التشغيل لينكس و macOS. نستخدم أولًا الأمر gpg لطلب الحصول على المفتاح العام المخصَّص لمشروع RVM من خادوم المفتاح العام (public key server) الذي يُستعمل لتوقيع جميع إصدارات RVM وذلك للتحقق من إصدار RVM الذي ننوي تنزيله. $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB الخطوة التالية هي تثبيت الحزمة gnupg2 التي ستستخدمها أثناء تثبيت RVM للتحقق من الإصدار وذلك بكتابة الأمر التالي: $ sudo apt-get install gnupg2 سيظهر لك محث يطالبك بإدخال كلمة المرور؛ أدخل كلمة المرور المخصصة للمستخدم الذي أنشأته منذ قليل أثناء تثبيت الصدفة (bash). استخدم بعدها الأمر curl لتنزيل سكربت تثبيت RVM من موقعه. $ \curl -sSL https://get.rvm.io -o rvm.sh يساعدنا الخط المائل العكسي الذي استخدمناه في بداية الأمر على التأكد من استخدام الإصدار المستقر من curl بدلًا من الإصدارات المعدَّلة؛ الخيارات التي استخدمناها مع الأمر السابق هي: ‎-s أو ‎–silent: يخفي نسبة اكتمال عملية التنزيل. -S أو ‎–show-error: يظهر رسالة بالخطأ إن فشلت عملية التنزيل. -L أو ‎–location: في حال تغيير موقع الصفحة المطلوبة إلى موقع آخر فإنَّ هذا الأمر يساعد في إعادة تنفيذ الأمر من جديد للموقع الجديد الذي يرسله الخادم. يمكن التحقق من محتوى السكربت الذي نزلته من الموقع بفتحه عبر less وذلك بكتابة الأمر التالي: $ less rvm.sh بعد أن تطمئن من محتواه، اضغط “q” للخروج من المحرر والعودة إلى المحث ثمَّ شغل هذا السكربت لتنزيل أحدث إصدار من RVM عبر الأمر: $ cat rvm.sh | bash -s stable سينشئ السكربت مجلدًا جديدًا باسم ‎.rvm في مجلد المنزل للمستخدم الذي أنشأته لوضع جميع ملفات Ruby و RVM وما يتعلق بهما؛ سيعدِّل أيضًا ملف البدء ‎.bashrc لإضافة المجلد ‎.rvm/bin إلى قائمة المجلدات التي ستبحث فيها الصدفة عند تنفيذ أحد الأوامر مما يعرِّف الصدفة على مكان الملفات التنفيذيَّة عند استخدام الأمر rvm بسهولة. على أي حال، إنَّ الملف ‎.bashrc لا يُقرأ إلَّا في بداية الجلسة لذا لن تُفعَّل التغييرات التي أجريت عليه إلا بعد بدء جلسة طرفية جديدة، أي لن تتمكن من الوصول إلى الأمر rvm في الجلسة الحالية لذا نفذ الأمر التالي لتخطي هذه المشكلة: $ source ~/.rvm/scripts/rvm الخطوة الثالثة: تثبيت Ruby يمكن الآن استخدام الأمر rvm لتثبيت أحدث إصدار من Ruby وكل ما يتعلق بها وتعيينه الإصدار الافتراضي الذي سيستخدمه نظام التشغيل وبذلك لن يحدث أي تضارب إن كان هنالك إصدار آخر مثبت على النظام؛ نفذ الأمر التالي: $ rvm install ruby –default ستبدأ العملية أولًا بتنزيل أحدث إصدار من Ruby. Searching for binary rubies, this might take some time. Found remote file https://rvm_io.global.ssl.fastly.net/binaries/ubuntu/16.04/x86_64/ruby-2.4.0.tar.bz2 هنالك بعض الحزم اللازمة لعمل Ruby فإن كانت غير موجودة على النظام فستثبَّت تلقائيًّا. Checking requirements for ubuntu. Installing requirements for ubuntu. Updating system.... Installing required packages: gawk, libssl-dev, zlib1g-dev, libyaml-dev, libsqlite3-dev, sqlite3, autoconf, libgmp-dev, libgdbm-dev, libncurses5-dev, automake, libtool, bison, libffi-dev, libgmp-dev, libreadline6-dev.................. Requirements installation successful. سيُطلب منك إدخال كلمة المرور لبدء عملة التنزيل والتثبيت؛ بعد الانتهاء من تثبيت الحزم السابقة ستبدأ عملية تنزيل وتثبيت Ruby. ruby-2.4.0 - #configure ruby-2.4.0 - #download % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 16.4M 100 16.4M 0 0 4828k 0 0:00:03 0:00:03 --:--:-- 4829k ruby-2.4.0 - #validate archive ruby-2.4.0 - #extract ruby-2.4.0 - #validate binary ruby-2.4.0 - #setup ruby-2.4.0 - #gemset created /home/brian/.rvm/gems/ruby-2.4.0@global ruby-2.4.0 - #importing gemset /home/brian/.rvm/gemsets/global.gems.............................. ruby-2.4.0 - #generating global wrappers........ ruby-2.4.0 - #gemset created /home/brian/.rvm/gems/ruby-2.4.0 ruby-2.4.0 - #importing gemsetfile /home/brian/.rvm/gemsets/default.gems evaluated to empty gem list ruby-2.4.0 - #generating default wrappers.....… بعد الانتهاء من العملية السابقة، ستكون لغة البرمجة Ruby بأحدث إصدار لها قد ثُبِّتت على حاسوبك بالإضافة إلى بعض الأدوات المرتبطة بها مثل الأداء irb وهي الطرفية التفاعلية في Ruby، والأداة rake التي تستطيع بوساطتها تشغيل السكربتات تلقائيًّا، والأداة gem لتثبيت وتحديث المكتبات. استخدم الأمر التالي لمعرفة رقم الإصدار الذي ثُبِّت للتو: $ ruby -v وستظهر لك نتيجة شبيه بالنتيجة التالية: ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux] انتهينا من تثبيت لغة البرمجة Ruby؛ في كل مرة تريد استخدامها افتح موجه الأوامر ثمَّ سجل الدخول إلى الصدفة بكتابة الأمر (bash -l)؛ إن لم يعمل مدير إصدارات Ruby ‏(RVM) عند بدء جلسة جديدة تلقائيًّا فتأكد من تعديل ملف البدء ‏‎.bashrc الذي تحدثنا عنه سابقًا أو ستضطر لتنفيذ الأمر التالي كل مرة تسجل فيها الدخول إلى الصدفة. $ source ~/.rvm/scripts/rvm الخطوة الرابعة: إنشاء برنامج بسيط سننشئ في هذه الخطوة برنامجًا بسيطًا جدًا يظهر الرسالة “Hello, world” للتأكد من بيئة العمل وأنَّ كلَّ شيء يعمل بشكل صحيح. سننشئ أولًا ملف باسم hello.rb باستخدام المحرر النصي nano. $ nano hello.rb اكتب النص التالي داخل الملف: puts "Hello, World!" اضغط Ctrl+X للخروج من المحرر، وسيسألك إن كنت تريد حفظ التغييرات فاضغط Y للموافقة والخروج. شغل البرنامج بكل بساطة باستخدام الأمر التالي: $ ruby hello.rb سيُنفذ البرنامج الذي كتبته للتو وستظهر على الشاشة الرسالة: Hello, world! نتأكد بذلك أنَّ كل شيء على ما يرام. الخلاصة أصبحت الآن لغة البرمجة Ruby جاهزة للعمل على حاسوبك ذي النظام ويندوز 10؛ انطلق الآن لبدء استخدام لغة البرمجة Ruby واستكشافها لإنشاء البرامج وكتابة الأكواد وتطوير التطبيقات أو الويب. ترجمة -وبتصرّف- للمقال How To Install Ruby and Set Up a Local Programming Environment on Windows 10 لصاحبه Brian Hogan
  8. قد يكون القيام بدور إداري لأول مرة صعبًا. في حين يمكنك أن تجد جميع أنواع المقالات، والاستقصاءات، والمصادر الأخرى حول كيف تصبح مديرًا لأول مرة، لن تجد من يعطيك سر المهنة. ومع ذلك، سوف تتعلم الكثير من الدروس عن طريق الثقة بحدسك، وارتكاب الأخطاء، والأهم من ذلك، الاستماع إلى فريقك. عندما عيّنتُ فريقًا من الكُتّاب لأول مرة، تحولت من كوني فريقًا من شخص واحد إلى إدارة فريق مكون من أربعة أشخاص. وشدّدت على أهمية جعل الفريق من النوع الذي طالما أردت العمل معه، ولقد أحببت حقيقة أننا سوف نُكوّن هذا الفريق معًا. إليك ثلاثة أشياء تعلمتها عندما منحت فريقي القوة - وأنا نفسي كمديرة جديدة - عن طريق الاستماع إليهم. 1. كافئ الإبداع من لديه الوقت ليكون مبدعًا عندما تكون هناك قرارات يجب اتخاذها ومشاكل يجب حلها؟ لكننا نتعثر من دون إبداع ، ونقضي وقتنا في التركيز على الحلول الأكثر وضوحًا. والحقيقة هي أن الإبداع لم يعد اختياريًا. فالآن أكثر من أي وقت مضى، من المتوقع أن يكون المديرون قادة مبدعين يساعدون فرقهم على الكشف عن أفكار غير المتوقعة (أو مزيج من الأفكار) التي تؤدي إلى عمليات ومنتجات وخدمة أفضل للعملاء.فما هو الجزء الأفضل؟ على الرغم من ما قد تخشاه في البداية، فلن يقضي الإبداع على إنتاجية فريقك. بعد أن أمضى فريقي الجديد بضعة أشهر في الكتابة والتحرير وإتقان أدوارهم والالتزام بالمواعيد النهائية، أرادوا معرفة كيفية تطوير مسؤولياتهم إلى مستوى أعلى من ذلك. وأرادوا قضاء بعض الوقت في تعلم مجالات أخرى من الأعمال وزيادة مهاراتهم. في البداية كنت قلقة من عملهم على مشاريع غير مرتبطة بطبيعة عملهم لأنني لم أكن أعرف كيف سيكون لذلك تأثير على عبء العمل الثقيل بالفعل، ولكنني اُضطررت إلى التخلي عن مخاوفي والثقة بهم. بعد قضاء الوقت في الاستماع والتعلم والعصف الذهني، وجدنا أنشطة ومشاريع يمكن أن تساعدنا على العمل والتفكير واللعب بطرق مبتكرة: المساهمة في مشاريع الاتصال الداخلية، مثل النشرة الإخبارية للشركة والويكي الخاص بها. تنظيم لقاء شهري للفريق بعنوان "أعرض وتكلم" حيث نتحدث عن المقالات وأشرطة الفيديو والمدونات الصوتية المتعلقة باللغة والكتابة، ثم نبحث عن طرق لتطبيقها على عملنا. لعب جولات متباعدة من لعبة المحظورات أو الحزورات. يواصل فريقي التركيز على مسؤولياتهم الأساسية، ولكننا الآن نجني فوائد مسؤولياتهم الجديدة. تساعدنا لحظات النقاش الجاد، وكذلك أوقات المرح، على توثيق علاقتنا كفريق واحد. قد تبدو للآخرين وكأنها لعبة الحزورات ببساطة، ولكننا في الحقيقة نبني لأنفسنا مساحة استرخاء وراحة ومرح. وهذا المستوى من الثقة يعني أننا نستطيع تبادل ملاحظات صادقة وأفكار قيمة دون خوف أو إحراج. 2. قم بتقدير قوة الكلمة المكتوبة نحن نبحث دائما عن الإجابات والمعلومات - ويستغرق البحث وقتًا طويلًا. ووفقًا لتقرير ماكينزي، فنحن ننفق حوالي 20 في المئة من ساعات عملنا في البحث للحصول على المصادر الداخلية أو إجابات على أسئلة تخص عملنا. ولكن الخبر الجيد هو أنه عندما يكون لدى أعضاء الفريق قاعدة معارف قابلة للبحث، يمكن تخفيض وقت البحث بنسبة تصل إلى 35 في المائة. عندما يقوم الفريق بتسجيل وتبادل المعرفة: يصبح من الأسهل والأسرع نقل المعرفة من شخص إلى آخر. لا يتم فقدان أو نسيان العمليات والقواعد الإرشادية والأهداف، والتفاصيل الهامة. يمكنهم تقديم عمل متناسق. يمكن استخدام هذه الموارد كمواد تدريبية. نعلم أن التوثيق له فوائده، ولكن قد يكون من الصعب القيام به أو يسهل علينا تجاهله، حتى بالنسبة لفريق من الكُتّاب! أدركت أنني كنت أطلب من فريقي إنشاء مقالات المساعدة مع مراعاة وضوح الكتابة والتنسيق المتسق ولكنني لم أعتني كفايةً بتوثيق القواعد الإرشادية والعمليات الهامة التي كانت موجودة بالفعل. لقد حان الوقت لممارسة ما كنت أنصح به. استثمرنا الوقت لبضعة أشهر وركزنا على إنشاء أدلة إرشادية لفريقنا. في النهاية، وفرنا الوقت والجهد بإنشاء هذه الموارد. أصبح لدينا الآن قواعد إرشادية واضحة، يمكن الوصول إليها للمرجعية اليومية أو لأغراض التدريب، بدلًا من الاعتماد على الذاكرة. إذا أمكن لفريقك الاستفادة من توثيق أفضل لعملية ما، إليك بعض الأفكار التي تساعدك على البدء: أدرج قائمة بأفكارك ورتبها. ما هي أهم المشكلات؟ ما هي قوائم التحقق أو التذكيرات أو الخطوات المعقدة التي يجب توثيقها؟ ما هي الأسئلة الأكثر شيوعًا في فريقك؟ متى وضعت قائمتك، رتب بنودها تبعًا لأهميتها. ابدأ صغيرًا وتقدم ببطء. ركز على العناصر التي لها أكبر تأثير على عملك اليومي. بعد تحقيق بعض التقدم، يمكنك البدء في العمل على أدلة إرشادية وموارد أخرى من قائمتك. ابحث عن الإلهام. استخدم أفكارًا ونصائح من قاعدة معارف داخلية أخرى كمخطط. توفر قاعدة معارف أفضل الممارسات لأنظمة المعلومات والتكنولوجيا لمعهد ماساتشوستس للتكنولوجيا قواعد إرشادية واضحة التنسيق. ويعطي دليل قاعدة معارف تكنولوجيا المعلومات في جامعة نورث وسترن أمثلة على إظهار ما هو "فعال" مقابل ما هو "أقل فعالية". حين يكون لديك عدة أدلة إرشادية للفريق جاهزة، تأكد من العناية الدورية بها للحفاظ على المعلومات مُحدّثة ودقيقة. مكّن فريقك من العثور على إجابات عندما يحتاجون إليها من قاعدة معرفة تعمل بسلاسة مع مكتب الدعم الخاص بك. 3. اسأل عن التقييم، حتى عندما يكون ذلك صعبًا تمنحك ردود الفعل فرصة للتطور كقائد، وتظهر لفريقك أن مشاعرهم تهمك عندما تأخذها على محمل الجد. إن طلب الاستماع إلى الآراء هو أمر مخيف حقًا، ولكن الأمور التي قد تمنعنا من أن نكون قادة فعّالين تظل موجودة سواء كنا سنواجهها أو نتجاهلها. فعندما نتجاهلها، نبقى عالقين ونقوم بنفس الأخطاء. لقد قيل لي ذات مرة أنني أبدو قليلًا وكأنني "رئيسة متعسفة" - أوزع المسؤوليات دون أن أسأل أي نوع من العمل قد يحفز حقًا كل عضو من أعضاء الفريق. آلمني هذا. كان هذا التعليق محبطًا ولكنه كان صحيحًا تمامًا. كنت قلقة جدًا بشأن المواعيد النهائية والمشاريع القادمة، ونسيت أن أتحقق من الروح المعنوية للفريق ورغباته. عندما سألت الفريق المشورة، أعطوني قائمة بالمشاريع والأنشطة التي كانوا مهتمين بها. لقد وجدنا طرقًا لإدراج تلك الأشياء في جدولنا الزمني الاعتيادي. وتخلصت من بعض قلقي كمديرة جديدة بمنحهم الثقة. أنا أتشرف بثقة فريقي فيّ والتي تظهر في كلماتهم وآرائهم الصادقة. نعم، يمكن أن تُشعرك الكلمات بالقسوة في بعض الأوقات من أول وهلة، ولكن تلك الكلمات نفسها تقدم نظرة ثاقبة لا تقدر بثمن تتجاوز ما تعرفه وتراه وتتصوره. عندما تسأل فريقك عن آرائهم ثم تتعامل معها، فهم يعرفون أنك تقدر آراءهم وتتفهمها. ماذا يقول فريقك لك؟ أعضاء فريقك ليسوا آليين بلا مشاعر. لديهم احتياجات وآمال ورغبات. إذا كنت محظوظًا، سيكون لديهم الرغبة في العمل الجاد وتحقيق الذات في عملهم. استمع لهم. وراقبهم. سواء كان ذلك في أفعالهم أو كلماتهم، ففريقك يقول لك شيئًا. وعليك أن تسأل وتستمع وتتفاعل. أعر انتباهك وستجد طرقًا عديدة للتطوير من فريقك ومن عمله، ومن نفسك. ترجمة –وبتصرّف- للمقال Listen While You Lead: 3 Unexpected Lessons for New Managers لصاحبته Jenelle Blanchard حقوق الصورة البارزة محفوظة لـ Freepik
  9. نصف الموظفين الذين يستقيلون من عملهم، تكون استقالتهم بسبب مدرائهم. يُعتبر المدير الكريه سببًا أكثر من كافٍ ليفقد الموظف ولاءه و ينخفض أداءه في المنظمة. لهذا من المهم التأكد من أن لديك مدراء بارزين ممن يقودون المجموعة و يطورون من أداء الجميع للمهام اليومية. و فيما يلي 13 سمة شخصية مميزة للمدير البارز. اكتشف ما يصنع المدير البارز 1- التفكير بإيجابية تعلّم عن قوة علم النفس الإيجابي، و انظر إلى كل موقف كفرصة للتعلم. بغض النظر عن الوضع أو المياه الآسنة التي تخوضها مع مؤسستك، تذكّر، إذا كان لديك قائد جيد فهذا يدعو للتفاؤل، فهو يجعل العمل أسهل بكثير. صدقني، آخر شيء تحتاجه هو أن يكون هناك من يتسلط على واقعك ويمنحك الكثير من الطاقة السلبية. 2- الصدق هو أفضل سياسة من المهم أن تكون صريحًا و صادقًا مع الموظفين. يمتلك المدراء البارزين المهارات القيادية اللازمة لإخبار الناس بالحقيقة -سواء كانت جيدة أم سيئة- على النحو الصحيح. يصعب أن تجد الصراحة في أماكن العمل التقليدية ذات الأسلوب القديم ، لكنه تطور مطّرد داخل الشركات الريادية التي تؤمن بالتسلسل الوظيفي الأفقي. المعرفة قوة. لماذا لا تعزز موظفيك بأكبر قدر ممكن من المعرفة؟ 3- التفويض مما يُسيء لأي مدير، أن يقوم بتفويض الناس بمهام دون توجيهات أو دون تنظيم. يُلاحظ لدى المدراء العظماء تفويضهم للعمل بشكلٍ مناسب، كما أنهم يعرفون نقاط القوة و الضعف لدى موظفيهم. وهم أيضاً يقاومون الرغبة في السيطرة المطلقة، فيمنحون موظفيهم استقلالهم ليتمكنوا من القيام بمهامهم بسهولة. 4- التواصل هو أهم مهارات القيادة الكثير من المشاكل في المنظمة تنتج عن عدم التواصل. المدير البارز يعرف متى يتحدث، ولكن الأهم من ذلك، متى يمتنع عن الكلام. وهو يعرف أيضًا كيف يتحدث إلى موظفيه وكيف يتعامل مع أي نوع من المشاكل التي قد تطرأ داخل الشركة. 5- تعلّم كيف تُلهم : الحقيقة المهمة هي أن القادة البارزين يعرفون كيف يُلهمون. أحياناً، لا يعرفون حتى كيف يفعلونها. ومع ذلك، و ما يجعلهم مدراء رائعين هو حقيقة أنه عندما يكون هناك لحظة مفصلية، فهم يعرفون كيف يتعاملون معها، وكيف يجعلون الناس من حولهم تتفاعل معها. عندما يكون الوضع مثيرًا للأعصاب، فإن آخر ما تريد أن تتعامل معه هو الشخص الذي ينظر للأمر باستخفاف و يكون عاجزًا عن تحفيز الآخرين. 6- توحيد الفريق المحافظة على تركيز كامل الفريق، وتنظيمه للسعي نحو هدف واحد على المدى الطويل. من المهم التأكد من أن كل شخص يعرف لماذا يقوم بمهام معينة وما هي الحصيلة التي ستأتي من وراءها. تأكد من أن موظفيك موالون للشركة وأنهم على دراية برؤية وأهداف المنظمة. 7- تحقيق التوازن بين العمل والحياة هذه ليست واحدة فقط من سمات المدير البارز، بل سمة للشركة العظيمة أيضًا. السماح للموظفين بتحقيق التوازن بين عملهم وحياتهم الشخصية يمنحهم الطمأنينة، ويتيح لهم معرفة كونهم أكثر من مجرد موظفين،بل أشخاصًا مهمين داخل الشركة. 8- امنح التقدير حين يُستحق نحن نعلم أمراً أو اثنين حول تقدير الموظف. كمدير، من المهم حقاً التأكد من أن موظفيك يحصلون على الاحترام الذي يستحقونه. لذلك تأكد من منح التقدير عندما يكون مستحقًا وتأكد من معرفة موظفيك. و تذكر، يمكن لتربيتة بسيطة على ظهره أن يبقى أثرها لأمدٍ طويل. 9- تشجيع الارتقاء يمتلك الارتقاء نواح عدّة. وكثيرًا ما نتحدث عن (الفشل سريعًا) داخل تدويناتنا و التدوينات المستضافة. والسبب هو أنها تشجع على الارتقاء الشخصي و تطمئن الموظفين أن لديهم القدرة على التعلم من الأخطاء، بدلًا من الخوف من ارتكابها. 10- قدّر موظفيك اظهر تقديرك، حتى بالنسبة للأمور الصغيرة التي يقوم بها موظفوك. القليل من الثناء يمكن أن تقطع شوطًا طويلًا.، لا تتردد في منحهم التشجيع وجعلهم يدركون أنهم فعلوا الشيء الصحيح. القدرة على الثناء بشكل فعال هي مهارة قيادية غير محدودة وستساعد موظفيك على الارتقاء بشكل أفضل وأكثر ثقة. 11- الإرشاد إذا كنت ترغب في أن يكون مدير بارزًا، فجزء كبير من مهارتك هي أن تكون مُرشدًا. أن تكون شخصًا ليس لديه مشكلة مع التقدم بالسن، والخبرة، أو حتى المناصب. إذا كنت قادرًا على مساعدتهم في التفوق في جانبٍ ما، فيجب عليك أن تقودهم في الاتجاه الصحيح، والتأكد من أنهم جيدون مثلك، بل - إن كان ذاك ممكنًا- أفضل منك! 12- كنّ منصفًا بالكُليّة بالتأكيد، في بعض الأحيان سيكون المدير / صاحب العمل مقربًا أكثر لمجموعة من الناس. ومع ذلك، فإن المدير العظيم يحترم مكان العمل ويعرف أن الجميع يحتاج لأن يعامل بإنصاف و على قدم المساواة. لا تجعل من مكان العمل تمركزًا للأقلية وتأكد من أن يُسمح لأي شخص بترك بصمة كبيرة داخل الشركة. 13- بناء عادات أفضل العادات التي تصنعها تحدد كيف تعيش حياتك. إذا كنت تريد أن يكون فريقك منتجًا ونشيطًا وسعيدًا فسيحتاج للقيام بأنشطة يومية تمنحه شعورًا مستمرًا بما سبق. يمكنك مساعدتهم على بناء العادات من خلال دعمهم وتمكينهم من القيام بالأشياء التي سيكون لها تأثير إيجابي على حياتهم. ما هو رأيك في السمات الـ 13 للمدير العظيم؟ هل هناك أي سمات أخرى أو مهارات قيادية ربما نكون قد نسيناها أو تراها تستحق الإضافة؟ أخبرنا برأيك في التعليقات! ترجمة -وبتصرّف- للمقال 13 Personality Traits Of A Great Boss لصاحبه Jacob Shriar
  10. Vagrant هو برنامج يُمكّنك من إنشاء وإعداد بيئات عمل خفيفة للتطوير عليها عن طريق تشغيل آلة وهمية. لماذا أستعمل Vagrant إذا كنت مطور ويب فسيساعدك البرنامج على محاكاة بيئة الخادوم عن طريق تنصيب إحدى نسخ لينكس للخواديم على جهازك. كما يساعدك أيضًا على تجربة تطبيقات الويب خاصتك بدون خوف من الخطأ أو الخوف على جهازك. وإذا كنت تعمل ضمن فريق عمل فإنه سيجعل من العمل أسهل بجعل بيئات التطوير واحدة بنفس البرمجيات والأنظمة. البدء في استعمال Vagrant قبل البدء يجب أن يكون لديك برنامج للآلات الوهمية مثبت ويفضل أن يكون Virtualbox. سيأتي ذكر كيفية ربطه مع برامج أخرى في آخر المقالة. بعد تثبيت Virtualbox يمكنك تثبيت النسخة المناسبة من Vagrant من هنا. أنشأ مجلدًا جديدًا لبيئة العمل خاصتك. وادخل إليه من الطرفية عن طريق الأمر: $ cd myfirst_project_dir ثم اكتب الأمر التالي: $ vagrant init ubuntu/trusty32 ستلاحظ أنه وفي أول مرة فقط بدأ بتحميل الملفات الخاصة بهذه الآلة وستلحظ أيضًا إنشاء ملف في هذا المجلد باسم Vagrantfile. بعد الانتهاء من التحميل قم بتشغيل الآلة الوهمية عن طريق الأمر التالي مع التأكد أنك ما زلت في نفس المجلد : $ vagrant up انتظر قليلًا، بعد الانتهاء، مبارك لك تم تشغيل نظام أوبنتو 14.04 للخادم. بدأ العمل يمكنك الآن للتحكم في النظام كتابة الأمر التالي : $ vargant ssh وسيتم الدخول إلى جلسة الطرفية عن طريق بروتوكول SSH . يمكنك الآن كتابة أوامر لنظام أوبنتو كما تشاء. يمكنك لتثبيت حزمة LAMP $ sudo apt-get install lamp-server^ يمكنك تثبيت أي برامج أو تطبيقات عن طريق سطر الأوامر يمكنك إذا أردت تثبيت Ngnix الاطلاع على هذا الدرس اتبع الإرشادات الخاصة بأوبنتو لأن الصندوق الذي استعملناه هو الخاص بأوبنتو (كما سيأتي لاحقًا في شرح الصناديق). يمكنك أيضًا تثبيت phpmyadmin كما يشرح الدرس لتالي. المجلدات المشتركة انتهيت من إعداد بيئة العمل تريد الآن البدأ في البرمجة ولكن هل ستضطر للدخول إلى جلسة الطرفية هذه كل مرة والعمل عن طريق محررات نصية كـ vim كي تستطيع العمل؟؟ الإجابة هي لا ففي الحقيقة المجلد الذي مساره داخل البيئة الوهمية /vagrant هو نفسه المجلد الذي أنشأت فيه الآلة في البداية أي المجلد الذي يتواجد بداخله ملفVagrantfile. ولتتأكد من كلامي هذا أنشأ في المجلد الحالي ملفًا نصيًا اسمه foo.txt ثم ادخل الآن إلى جلسة الطرفية الخاصة بالآلة الوهمية واكتب : $ cd /vagrant $ ls ستفاجئ بوجود الملف الذي أنشأته سابقًا وبهذا يمكننا Vagrant من العمل على المحررات التي نفضلها من واجهتنا الرسومية ومشاركة كل ما نعمله مع الآلة الضيف. يمكنك أيضًالمشاركة مجلدات أخرى غير هذا المجلد كتابة الآتي داخلVagrantfile : config.vm.synced_folder "src/", "/srv/website" حيث أن المسار الأول هو مسار المجلد الذي تريد مشاركته على آلتك المضيفة والمسار الثاني هو مسار المجلد الموجود في الآلة الوهمية. تهيئة الشبكة الآن بعد تثبيت apache مع حزمة LAMP تريد تصفح الموقع المتواجد على الخادوم على الآلة الضيف من على متصفحك من جهازك فكيف تفعل هذا. يمكنك فعل هذا بتعديل ملف Vagrantfile بحيث سيشبه الآتي : Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty32" config.vm.network :forwarded_port, guest: 80, host: 4567 end اكتب الأمر التالي في حاسوبك (ليس بداخل الآلة الوهمية) داخل مجلد الآلة الوهمية: $ vagrant reload الآن يمكنك تصفح موقعك من على الرابط التالي http://127.0.0.1:4567 داخل متصفحك. جعل المجلد الافتراضي لـapache في/vagrant أنت الآن تريد إضافة ملفات البرمجة الخاصة بك وبدأت العمل عليها في المُجلّد/vagrant ولكن لا تزال هناك مشكلة فـapache يحدد المُجلّد /var/www/htmlكمُجلّد افتراضي توجد عليه الملفات التي سوف تمثل واجهة الموقع لذا علينا أن نجعل المُجلّد الافتراضي هو /vagrant/my_awesome_project والذي ستضع عليه ملفات الـPHP الخاصة بمشروعك. في البداية أنشئ في المُجلّد الذي تتواجد فيه الآلة الافتراضية مُجلّدًا فرعيًا وسمه my_awesome_project ثم اكتب الأمر التالي في جلسة الطرفية للآلة الضيف: $ sudo nano /etc/apache2/sites-available/000-default.conf أضف الآتي: DocumentRoot /vagrant/my_awesome_project احفظ التغييرات عن طريق الضغط على Ctrl + X ثم اكتب الأمر التالي: $ sudo nano /etc/apache2/apache2.conf أضف الآتي: <Directory /vagrant> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> احفظه عن طريق الضغط على Ctrl + X ثم اكتب الأمر التالي لإعادة تشغيل الخادوم والعمل بالتغييرات : sudo service apache2 restart مبارك لك الآن يمكنك الدخول إلى المُجلّد الذي يحتوي الآلة الوهمية والدخول إلى المُجلّد المسمى my_awesome_project بداخله وبدأ العمل ومشاهدة التغييرات مباشرة على: http://127.0.0.1:4567 إغلاق الآلة بعد الإنتهاء من العمل سيتوجب عليك إغلاق الآلة الوهمية ويمكن هذا بواحد من ثلاث أوامر داخل دليل الآلة: $ vagrant suspend $ vagrant halt $ vagrant destroy الأمر الأول يقوم بحفظ حالة الآلة كما هي وعند الإقلاع مرة أخرى بالأمرvargant up يكون الإقلاع سريعًا لأنه فقط يقوم بإيقاظ الآلة. الأمر الثاني يعمل على إغلاق الآلة بالكامل وإغلاق كافة البرامج التي كانت تعمل على الآلة وأيضًا يتم الإقلاع مرة أخرى بالأمر vagrant up . الأمر الثالث يمحو الآلة مع كل شيء داخل المجلد الذي يحتويها. الصناديق (Boxes) يستعمل Vagrant الصناديق بدلًا من ترجمة ملفات الآلة الوهمية من الصفر مما يؤدي إلى ضياع الكثير. تعتبر الصناديق كالأنظمة والإعدادات معها المجهزة مسبقًا كي يتم استعمالها مباشرة. يعد الأمر الآتي الذي استعملناه في أول الدرس مثالًا على استخدام أحد الصناديق : $ vagrant init ubuntu/trusty32 والذي من المفترض أن ينشئ آلة وهمية في المجلد الحالي اتخدامًا للصناديق فقد استعمل الصندوق المسمى بـubuntu/trusty32 حالما يتم تنزيل الصندوق يمكنك استعماله في أي مكان وفي أي آلة تنشؤها ويمكنك إضافة أي صندوق جديد عن طريق الأمر التالي: $ vagrant box add box_name وفائدة هذه الصناديق هي استعمال إعدادات وأنظمة جاهزة ومختلفة فمثلًا إذا أردت استعمال CentOS بدلًا من أوبونتو يمكنك استبدال اسم الصندوق بـdanmikita/centos . يمكنك البحث عن الصناديق المتوفرة وأسمائها من خلال الرابط التالي: https://atlas.hashicorp.com/boxes/search التّجهيز (Provisioning) يمكنك التّجهز (Provisioning) من تنفيذ أوامر معينة على الآلة الوهمية بدون الدخول إليها ويمكن ذلك عن طريق التعديل في ملف Vagrantfile وذلك يمكنك من استعمال نفس البرامج والإعدادات على جميع الآلات. لتتمكن من استعمال التزويد عليك إضافة الأمر التالي إلى ملف Vagrantfile لـ: config.vm.provision :shell, path: "bootstrap.sh" هذا الأمر يجعل من ملف bootstrap.sh ملفًا يعمل عند تشغيل الآلة. هناك مجموعة كبيرة أخرى من الأوامر يمكنك الاطلاع عليها من التوثيق الرسمي للبرنامج. يمكنك تفعيل التزويد في الآلة التي تعمل الآن عن طريق الأمر التالي: vagrant reload --provision تغيير Virtualbox يمكنك بكل بساطة استعمال أي برنامج محاكاة مدعوم كـبرنامج VMware على سبيل المثال عن طريق الأمر التالي مع أمر vagrant up: $ vagrant up --provider=vmware_fusion مشاركة الآلة يمكنك مشاركة الآلة خاصتك مع فريق العمل وجعلهم يتمكنون من مراقبتها أو التحكم بها من أي مكان. هناك ثلاثة طرق للمشاركة: مشاركة HTTP ويشارك هذا الآلة عبر منفذ HTTP ويمكن عمل هذا عبر تنفيذ الأمر vagrant share وبعد ذلك وبعد انتهاء الأمر سيظهر في آخره رابطًا يمكنك مشاركته مع فريق عملك. مشاركة SSH يمكن هذا عن طريق كتابة الأمر: vagrant share --ssh سيطلب منك هذا الأمر كتابة كلمة السر التي سيتم التأكد بها من المتصل. بعد الانتهاء من الأمر يمكنك التوصل إلى الآلة من حاسوب آخر عن طريق الأمر: vagrant connect --ssh NAME حيث NAME اسم الآلة الذي ظهر عند نهاية أمر vagrant share --ssh مشاركة عامة وهي تشارك جميع المنافذ الممكنة ويكون ذلك عن طريق الأمرvagrant share ثم كتابة الأمر vagrant connect NAME على الجهاز المتحكم حيث NAME هو اسم الآلة الذي يظهر في نهاية تنفيذ الأمر vagrant share . الخاتمة يمكنك إنشاء أي عدد من الآلات في مُجلّدات مختلفة والعمل عليها جميعًا أو على واحدة منها واستعمال أي صناديق تريد معها وإضافة إعدادات معينة للتزويد ونشرها مع فريق العمل ليتسنى لهم ضبط آلتهم كما هو عندك ومشاركة آلتك عن بعد كي يتحكم جميع فريق العمل في آلة واحدة . المراجع https://docs.vagrantup.com/v2/ http://stackoverflow.com/questions/5891802/how-do-i-change-the-root-directory-of-an-apache-server https://help.ubuntu.com/community/ApacheMySQLPHP
  11. مقدّمة بعد أن تعرّفنا على بنية التّطبيق الذي سنبنيه سويا، سنبدأ بتهيئة وتنصيب بعض الحزم التّي سنعتمد عليها، وسنرى كيف يُمكننا تنظيم الملفّات لمرونة أكثر في التّعامل مع المشاريع الكبيرة، فعوضا عن وضع الشيفرة كاملة في ملفّ أو ملفّين، سنقوم باستعمال مبدأ المُخطّطات Blueprints الذي يوفّره لنا إطار العمل فلاسك لتنظيم التّطبيقات الأكثر تعقيدا. بنية التّطبيق المُعتادة سابقا، كنّا نستعمل ملفّا رئيسيّا واحدا ونقوم بتشغيله ليعمل الخادوم ونتمكّن من الوصول إلى التّطبيق عبر المُتصفّح من العنوان المُعتاد، وهكذا تكون جميع الموجّهات في ملفّ واحد، والملفّات السّاكنة في مجلّد واحد، وملفّات القوالب (ملفّات HTML) تكون جميعها في نفس المُجلّد. ملفّات التّطبيق المعتادة تكون على الشّكل التّالي: ├── app.py # ملفّ التّطبيق الرّئيسي ├── config.py # ملفّ الإعدادات ├── static # مجلّد الملفّات السّاكنة │ ├── css │ │ └── style.css │ ├── img │ │ └── logo.png │ └── js │ └── main.js ├── templates # مجلّد القوالب │ ├── index.html │ ├── posts.html مادام التّطبيق بسيطا فكلّ شيء سيكون على ما يرام، لكن ماذا لو كان التّطبيق يمتلك قسما لتسجيل المُستخدمين، عرض صفحاتهم الشّخصيّة، عرض المقالات، صفحات الأخطاء (مثل عدم تواجد صفحة أو خطأ بالخادوم …)، لوحة تحكّم للمُدير، لوحات التّحكم بأجزاء التّطبيق، واجهة برمجيّة للمُطوّرين API وغير ذلك من الخصائص التّي يتمتّع بها كل تطبيق كبير ذو وظائف مُتعدّدة. إن استعملت البنية المُشار إليها سابقا، ستواجه العديد من المشاكل، أولا سيكون الملفّ الرّئيسي مليئا بالموجّهات والدّوال، وقد يصل إلى آلاف الأسطر البرمجيّة ما سيجعل مهمّة الصّيانة وإضافة خصائص جديدة أمرا صعبا، كما أنّ ملفّات القوالب ستكون مجتمعة في مجلّد واحد، وإن كنت تعمل على تطوير التّطبيق مع فريق من المُطوّرين فسيجد كل شخص نفسك أمام ملفّات وشيفرات لا علاقة له بها، مثلا لو قُسّمت المهام بحيث يعمل كلّ مطوّر على قسم معيّن من التّطبيق، زيد هنا يعمل على نظام تسجيل للمُستخدمين، وعامر يعمل على إضافة قسم لعرض آخر التّعليقات المُضافة، وسعيد، مُصمّم الويب يعمل على تصميم صفحات أخطاء جميلة، وعبد القادر يعمل على لوحة تحكّم الإدارة، فكيف يُمكن لزيد أن يُعدّل الشيفرة التّي تقوم بتسجيل المُستخدمين دون المساس بالشّيفرة التّي تقوم بإعداد المقالات لعرضها على صفحة المقالات؟ المُخطّطات Blueprints المُخطّطات في فلاسك نظام لتجميع الموجّهات المُخصّصة لوظيفة مُعيّنة بعيدا عن المُوجّهات الأخرى، يُمكن كذلك تقسيم ملفّات القوالب والملفّات السّاكنة كذلك مع إتاحة خيار مُشاركة ملفّات مُحدّدة إن أردت ذلك. في هذا المشروع سنضع مجلّد قوالب لكلّ وظيفة، أمّا مُجلّد الملفّات السّاكنة فسيكون مُشتركا بين جميع القوالب، وهذا لأنّنا لن نحتاج إلى الكثير من ملفّات جافاسكريبت وملفّات css، وستكون الصّور مُشتركة كذلك. هناك نوعان معروفان من المُخطّطات، النّوع الأول يُقسّم ملفّات القوالب مع كلّ وظيفة ليكون كالتّالي: . ├── run.py ├── config.py ├── project │ ├── __init__.py │ ├── posts │ │ ├── __init__.py │ │ ├── templates │ │ │ ├── index.html │ │ │ ├── post.html │ │ │ ├── posts_by_category.html │ │ ├── views.py │ ├── static │ │ └── css │ │ └── style.css │ ├── templates │ │ ├── base.html │ └── users │ ├── __init__.py │ ├── templates │ │ ├── login.html │ │ └── register.html │ ├── views.py أمّا النّوع الثّاني فتجتمع فيه جميع ملفّات HTML في مُجلّد واحد كما يلي: . ├── run.py ├── config.py ├── project │ ├── __init__.py │ ├── posts │ │ ├── __init__.py │ │ ├── views.py │ └── users │ ├── __init__.py │ ├── views.py │ ├── templates │ │ ├── base.html │ │ ├── posts/ │ │ ├── users/ │ ├── static │ │ └── css │ │ └── style.css في المثالين السّابقين، لدينا مُخطّطان، مُخطّط خاصّ بالمقالات تحت مجلّد posts، وآخر خاصّ بالمُستخدمين في مجلّد users، ملفّ run.py مسؤول عن تشغيل التّطبيق وأمّا ملفّات __ini__.py فهي لجعل بايثون يفهم بأنّ كلّا من مجلّد المشروع project ومجلّدي المقالات والمُستخدمين عبارة عن حزم. أمّا ملفّا views.py فسيحتويان على الموجّهات المعنيّة بكلّ وظيفة، فمثلا مُوجّه عرض المقالات “/posts” سيكون في ملفّ posts/views.py أمّا موجّه تسجيل دخول المُستخدمين /login فسيكون في ملفّ users/views.py. لإخبار فلاسك بأنّ مجلّدي posts و users عبارة عن مُخطّطات، سنعرّف أولا كائنًا من صنف Blueprint في كل من ملفّات __init__.py في المُجلّدين، وبعدها سنقوم بتسجيلهما مع تطبيقنا الذي نُعرّفه في ملفّ __init__.py الأساسي -وهو المُتواجد في مجلّد project-. لك حريّة استخدام أي نمط تُريده، ففي النّهاية إطار فلاسك مُصمّم ليُوفّر لك كامل الحريّة في طريقة تنظيمك لملفّات التّطبيق، لكن اتّباع نمط مُتعارف عليه أفضل في مُعظم الحالات. سنستخدم في مشروعنا النّمط الأول، أي أنّ ملفّات HTML ستكون منفصلة حسب الوظيفة. بايثون 3 سنستعمل في إنشائنا لهذا التّطبيق النّسخة 3 من لغة بايثون، لن يتغيّر الكثير، فالاختلاف بين Python 2 و Python 3 بسيط جدا، وسأقوم بذكر أهم الاختلافات أثناء بناء التّطبيق في الدّروس القادمة. إذا كنت لا تزال تعتمد على بايثون 2 فأنصحك بأن تنتقل إلى بايثون 3 لأنّ الدّعم لهذه الأخيرة قد أصبح كبيرا ومُعظم مُطوري بايثون يستعملونها الآن، كما أنّها أحدث نُسخة. إذا أردت أن تتعلم كيفيّة تجهيز بايثون 3 على نظامك، يُمكنك اتّباع هذا الدّرس. تطبيق كلمة بما أنّ مشروعنا عبارة عن نظام لإدارة المُحتوى، قرّرت تسميّته “كلمة”، جميع الملفّات والمجلّدات الخاصّة بالتّطبيق ستكون بداخل مجلّد باسمkalima، لذا عليك إنشاؤه الآن في المكان المُفضّل لديك، المهم أن تعرف كيفيّة الوصول إليه عن طريق سطر الأوامر. في البداية، سننشئ الملفّات التّاليّة: . ├── run.py ├── project │ ├── __init__.py │ ├── posts │ │ ├── __init__.py │ │ ├── templates │ │ │ ├── posts.html │ │ ├── views.py │ ├── static │ │ └── css │ │ └── style.css │ ├── templates │ │ ├── base.html │ └── users │ ├── __init__.py │ ├── templates │ │ ├── users.html │ │ ├── login.html │ ├── views.py يُمكنك إمّا إنشاء المُجلّدات والملفّات يدويّا أو عبر نسخ الشيفرة التّالية وحفظها في ملفّ باسم create_app.py لإنشاء الملفّات والمُجلّدات باستعمال لغة بايثون تلقائيّا. import os import sys def mkapp(app_name, blueprints): dirs = ['{}', '{}/static', '{}/static/css', '{}/templates'] static_files = ['{s}/css/style.css'] templates_files = ['{t}/index.html', '{t}/base.html'] for d in dirs: os.mkdir(d.format(app_name)) open(app_name + '/' + "__init__.py", "w").close() # project/__init__.py for b in blueprints: os.mkdir(app_name + '/' + b) # project/posts os.mkdir(app_name + '/' + b + '/templates') # project/posts/templates open(app_name + '/' + b + '/' + "views.py", "w").close() # project/posts/views.py open(app_name + '/' + b + '/' + "__init__.py", "w").close() #project/posts/__init__.py open(app_name + '/' + b + '/templates/' + b + ".html", "w").close() # project/posts/templates/index.html for sf in static_files: static_file = app_name + '/' + sf.format(s='static') # project/static open(static_file, 'w').close() for tf in templates_files: templates_file = app_name + '/' + tf.format(t='templates') # project/templates open(templates_file, 'w').close() if __name__ == '__main__': app = sys.argv[1] blueprints = sys.argv[2:] mkapp(app, blueprints) يُمكنك تنفيذ السكربت بالأمر التّالي: $ python3 create_app.py project posts users بعدها أنشئ ملفّ login.html في مجلّد project/users/templates لأنّ السكربت لن يقوم بإنشائه. عليك كذلك إنشاء ملفّي run.py وconfig.py داخل مُجلّد kalima، الملفّ الأول مسؤول عن تشغيل الخادوم/ أمّا الملفّ الثّاني فمسؤول عن إعدادات التّطبيق. خاتمة تعرّفنا في هذا الدّرس على بنية التّطبيق الذي سنبنيه وكيفيّة توزيع ملفّاته إذ أنشأنا المُجلّدات والملفّات التّي ستكون مسؤولة عن الجانب العملي للتّطبيق، في الدّرس القادم، سنبدأ بتجهيز البيئة البرمجيّة وتنصيب أهم الحزم التّي سنحتاج إليها للبدء بتطوير التّطبيق.
  12. مُقدّمة بعد أن تعرّفنا على بنية التّطبيق الذي سنبنيه سويًّا باستخدام إطار العمل Flask ولغة Python، سننتقل الآن إلى العمل على تجهيز بيئة وهميّة لبايثون 3 لنقوم بتنصيب إطار Flask عليها ونبدأ بتطوير التّطبيق بمعزل عن النّظام المتواجد في الحاسوب، بعد تهيئة البيئة البرمجيّة، سنتعرّف على كيفيّة استغلال مبدأ المُخطّطات Blueprints التّي يُوفرّها لنا إطار العمل Flask لتوزيع أفضل لملفّات ومُوجّهات التّطبيق لعزل كل جزء وظيفيّ عن الأجزاء الأخرى وبالتّالي تسهيل تطوير خصائص وميّزات وكذلك تقسيم المُهمّات على أفراد الفريق البرمجي في حالة كنت تعمل على تطبيق مع أكثر من مُطوّر. إنشاء بيئة وهميّة بأداة Pyvenv أولا، سنحتاج إلى إنشاء بيئة وهميّة لعزل اعتماديات التّطبيق عن اعتماديات النّظام، وبما أنّ لديك خبرة في لغة بايثون، فلا بد بأنّك تُفكّر في استخدام أداة virtualenv، يُمكنك استخدامها إن أردت، لكنّنا سنستعمل بايثون 3 في تطويرنا لهذا التّطبيق، وإذا اتّبعت الدّرس الذي أشرت إليه في الدّرس السّابق، فستعلم بأنّه من المُفضّل استعمال أداة pyvenv للتأكّد من أنّ البيئة الوهميّة ستكون خاصّة بلغة بايثون 3 وليس بايثون 2. اتّبع الطّريقة التّقليديّة لإنشاء بيئة وهميّة باستعمال أداة pyvenv عبر السّطر التّالي: pyvenv venv إذا كنت تستخدم نظام Windows فقد لا يعمل السّطر أعلاه، لكن يُمكنك استخدام الأمر التّالي عوضا عنه: python -m venv فقط تأكّد من أنّ الأمر python يوصلك إلى مُفسّر بايثون 3 وليس مُفسّر بايثون 2. بعد انتهاء الأمر من التّنفيذ، قم بتفعيل البيئة الوهميّة بالسّطر التّالي: source venv/bin/activate بعد تفعيل البيئة الوهميّة، قم بتنصيب إطار العمل Flask باستخدام أداة pip بالسّطر التّالي: pip install Flask إذا كان السّطر ما قبل الأخير من المُخرجات كما يلي، فهذا يعني بأنّ كل شيء بخير: Successfully installed Flask itsdangerous Jinja2 Werkzeug click MarkupSafe طريقة العمل بما أنّنا أصبحنا نتعامل مع الكثير من الملفّات، عليك أن تعرف أي شيفرة ستكون في أي ملف، ولهذا سأقوم بوضع مسار الملف في أعلى الشّيفرة على شكل تعليق. وفي معظم الأحيان، لن أضع محتويات الملف كاملًا، بل سأضع الشيفرة الجديدة مُحاطة بسطرين قديمين من الأعلى والأسفل لتُدرك أي مكان يجب عليك أن تضع به الشّيفرة. مثال على الشّيفرة سيكون كالآتي: # project/users/views.py @users.route('/login') def login(): . . . login_user(user) return redirect(url_for('users.posts_by_author')) لا تقلق إن لم تفهم الأجزاء الجديدة عليك من الشّيفرة، فهي مُجرّد مثال بسيط على كيفيّة استخدام مُوجّه لمُخطّط وكيفيّة الرّبط بين الموجّهات. إنشاء المُخطّطات لدينا الآن مُخطّطان في تطبيقنا، واحد في مجلد المُستخدمين والآخر في مُجلّد المقالات. سنقوم أولا بإنشاء المُخطّط الخاصّ بالمُستخدمين في ملفّ views.py المتواجد داخل المُجلّد users كما يلي: # project/users/views.py from flask import Blueprint users = Blueprint('users', __name__, template_folder='templates', url_prefix='/users') في السّطر الأول، نستدعي Blueprint من حزمة flask، ونقوم بإنشاء كائن منها كما كنّا نقوم بإنشاء كائن app من الصّنف Flask في الماضي. المعامل الأول عبارة عن اسم المُخطّط، والمعامل الثّالث هدفه إخبار فلاسك بأنّ مُجلّد القوالب سيكون في نفس مُجلّد المُخطّط، وسيكون باسم templates ويُمكنك تغيير هذا الاسم إلى ما تشاء، لكنّنا لن نقوم بذلك، ومن المُفضّل اتّباع المُمارسات الشّائعة في مثل هذه الأمور. أمّا مُعامل url_prefix فالهدف منه وضع موجّه رئيسي قبل الموجّه المعرّف. مثلًا لتعريف الموجّه الرّئيسي / سيكون كالآتي: @users.route('/') # /users ولتعريف موجّه التّسجيل: @users.route('/register') # /users/register وكما تُلاحظ، لا أحتاج إلى تعريف /users في بداية كل مُوجّه. لو لم نُخصّص مُجلّدًا للقوالب، لكان علينا جمع جميع ملفّات HTML في مجلّد project/templates. هناك كذلك خيار لتفريق مجلّد الملفّات السّاكنة بنفس الطّريقة: users = Blueprint('users', __name__, template_folder='templates', static_folder='static', url_prefix='/users') ولأنّنا سنجمع جميع الملفّات السّاكنة في مُجلّد project/static فهذا الخيار لن يكون مُفيدًا لنا. يُمكنك الآن إنشاء المُخطّط الخاصّ بالمقالات بنفس الطّريقة. # project/posts/views.py from flask import Blueprint posts = Blueprint('posts', __name__, template_folder='templates', url_prefix='/posts') تسجيل المُخطّطات مع التّطبيق الرّئيسي بعد أن قُمنا بإنشاء مُخطّطات، حان الوقت لإخبار إطار فلاسك بأنّ هذه المُخّططات تابعة للتّطبيق، وطريقة القيام بذلك بسيطة. افتح الملف project/__init__.py وضع به ما يلي: # project/__init__.py from flask import Flask app = Flask(__name__) from project.posts.views import posts from project.users.views import users app.register_blueprint(posts) app.register_blueprint(users) @app.route('/') def index(): return 'Project Index' السّطران الأولان معروف بأنّهما لإنشاء التّطبيق، أمّا الاستدعاءات فهي لاستدعاء المُتغيّرين اللذين يحملان المُخطّطان، أمّا الأسطر الأخيرة فهي لتسجيل المُخطّطات التّي استدعيناها. أمّا الموجّه الذي عرّفته في الأسفل فهو ليتمكّن المُستخدم من الوصول إلى الصّفحة الرّئيسية دون الحصول على خطأ من نوع 404. ذلك لأنّ الموجّهات التّي سنعرّفها في المُخطّطات ستكون كما يلي: /posts /posts/new /users /users/register . . . لذا إن دخل المُستخدم إلى العنوان 127.0.0.1:5000 فلن يجد شيئا لأنّنا لم نُحدّد الموجّه الرّئيسي /، وهذا هو السّبب الذي جعلنا نُضيف المُوجّه بملفّ __init__.py في مجلّد المشروع project. إنشاء مُوجّهين رئيسيّين قلنا سابقًا بأنّ المُوجّهات ستكون داخل ملفّات views.py فإن أردنا أن نعرّف مثلًا موجّهًا للمقالات الرّئيسية، فسنقوم بذلك في ملّف posts/views.py أمّا الخاص بالمُستخدمين فسيكون في ملفّ users/views.py وهكذا. سنقوم الآن بإنشاء مُوجّه رئيسي لكل مُخطّط. أولا موجّه /posts/ سيكون كما يلي (ضعه مُباشرة بعد سطر تعريف المُتغيّر posts): # project/posts/views.py @posts.route('/') # 127.0.0.1:5000/posts def index(): return 'Posts Index' أمّا المُوجّه الخاصّ بالمُستخدمين فسيكون كما يلي: # project/users/views.py @users.route('/') # 127.0.0.1:5000/users def index(): return 'Users Index' وبهذه التّغييرات سيُصبح الملفّ views.py الخاصّ بالمُستخدمين كما يلي: from flask import Blueprint users = Blueprint('users', __name__, template_folder='templates', url_prefix='/users') @users.route('/') # 127.0.0.1:5000/users def index(): return 'Users Index' وملفّ views.py الخاص بالمقالات سيكون كالآتي: from flask import Blueprint posts = Blueprint('posts', __name__, template_folder='templates', url_prefix='/posts') @posts.route('/') # 127.0.0.1:5000/posts def index(): return 'Posts Index' تشغيل الخادوم بعد أن قمنا بتسجيل المُخطّطات وأنهينا أساسيّات التّطبيق، علينا أن نقوم بتشغيل الخادوم لنتمكّن من مُعاينة ما قُمنا به، ولتشغيل التّطبيق، سنضع السّطر المسؤول عن الأمر في ملفّ باسم run.py في مجلّد kalima. محتويات الملفّ ستكون كالتّالي: # run.py from project import app app.run(debug=True) كما تُلاحظ، استدعينا الكائن app الذي سبق وأن عرّفناه في ملفّ project/__init__.py بعدها نقوم بتشغيل الخادوم بالطّريقة المُعتادة مع خيار تصحيح الأخطاء. بعد حفظ ملفّ run.py يُمكنك تشغيله عبر سطر الأوامر: $ python run.py ستُلاحظ بأنّ الخادوم قد بدأ بالاشتغال كما العادة، لكنّ طريقة تشغيل الخادوم بهذه الطّريقة غير منصوح بها لأنّ النّسخة رقم 0.11 من Flask التّي أطلقت في أواخر عام 2016 جاءت بطريقة جديدة لتشغيل الخادوم عبر تنفيذ الأمر flask run. لكن الأمر flask run لن يعمل إلّا بعد تحديد اسم الحزمة أو الوحدة التّي يتواجد بها تطبيق Flask، وذلك عبر تعريف مُتغيّر بيئة باسم FLASK_APP وإعطائه القيمة حسب مكان تواجد تطبيق Flask الخاص بك. لتعريف مُتغيّر البيئة يُمكنك تنفيذ الأمر التّالي من الطّرفيّة بعد التّأكد من أنّ البيئة الوهميّة لديك مُفعّلة: $ export FLASK_APP=app.py في نظام Windows يجب عليك استخدام الكلمة المفتاحيّة set عوضا عن export: > set FLASK_APP=app.py في المثال أعلاه، نفترض بأنّ شيفرة تطبيق Flask مُتواجدة في الملفّ app.py. بعد تعريف مُتغيّر البيئة يُمكنك تشغيل الخادوم عبر تنفيذ الأمر التّالي: flask run عوضًا عن الأمر: python app.py في مشروعنا، تطبيق Flask مُتواجد داخل ملفّ __init__.py في مُجلّد project لذا فطريقة تعيين مُتغيّر البيئة سيكون كالتّالي: $ export FLASK_APP=project/__init__.py بعد تحديد مُتغيّر البيئة، يُمكنك تجربة تشغيل الخادوم: flask run بعد تنفيذك للأمر أعلاه، يجب أن تحصل على مُخرج كما يلي: * Serving Flask app "project" * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) لتفعيل مُصحّح الأخطاء، كل ما عليك فعله هو تعريف مُتغيّر البيئة FLASK_DEBUG وتعيين القيمة 1 له: export FLASK_DEBUG=1 مُلاحظة: أذكّر بأنّ تفعيل مُصحّح الأخطاء في بيئة الإنتاج أمر خطير، ولا يجب عليك أبدًا أن تقوم بذلك حتى ولو كنت مُتأكّدًا من أنّ تطبيقك خال من الأخطاء، وعليك أن تُدرك بأنّ مُصحّح الأخطاء مصمّم لمُساعدتك على تطوير واختبار التّطبيق وليس لتفعيله بعد نشر التّطبيق على الأنترنت. ومُجدّدًا، استبدل export بالكلمة set إذا كنت تستخدم نظام Windows. بعد تشغيل الخادوم مع وضع تصحيح الأخطاء، فسيكون المُخرج مُشابها لما يلي: * Serving Flask app "project" * Forcing debug mode on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: 573-756-626 وإن أردت أن يصل الآخرون في شبكتك إلى موقعك، تستطيع إضافة --host=0.0.0.0 إلى أمر تشغيل الخادوم كما يلي: flask run --host=0.0.0.0 بعد تشغيل الخادوم ستتمكّن من الوصول إلى الموجّهات الثلاثة التّي سبق وأن عرّفناها. 127.0.0.1:5000/ 127.0.0.1:5000/posts 127.0.0.1:5000/users وستُلاحظ النّتائج: Project Index Posts Index Users Index خاتمة تعرّفنا في الدّرس على كيفيّة إنشاء مُخطّطات وتسجيلها لمرونة أكثر في التّطوير ولإدارة أفضل للتّطبيقات الكبيرة، وتعرّفنا كذلك على كيفيّة تشغيله وكيفيّة إضافة مُوجّه لكل مُخطّط، في الدّرس القادم سنتعرّف على كيفيّة التّعامل مع قوالب HTML وكيفيّة الرّبط بين مُختلف موجّهات التّطبيق.
  13. مُقدّمة: بعد أن قمنا بتنظيم ملفّات التّطبيق على حسب الوظيفة باستعمال خاصيّة المُخطّطات، أصبح لدينا اختلاف بسيط في كيفيّة التّعامل مع ملفّات العرض التّي تحتوي على شيفرات HTML وشيفرات مُحرّك القوالب Jinja، وسيكون هناك اختلاف بسيط أيضا في طريقة استخدام الدّالة url_for للرّبط بين المُوجّهات. إنشاء صفحات HTML بما أنّنا أنشأنا ثلاثة مجلّدات باسم templates لتعدّد أغراضها، فسيتوجّب علينا أن نفهم أولا كل مجلّد ووظيفته. مسارات المُجلّدات التّي أنشأناها سابقا هي كالآتي: project/templates/ project/posts/templates/ project/users/templates/ المسار الأول عبارة عن مجلّد رئيسي للقوالب، يُمكنك أن تعتبره مُشتركا مع القوالب الأخرى، فمثلا يُمكن لكل من ملفّات المقالات والمُستخدمين أن يرثوا من ملفّ base.html كما سنوضّح بعد قليل، كما أنّ أي موجّه يُعرّف داخل الملفّ الرّئيسي project/__init__.py له الحق في تقديم الملفّات المُتواجدة في مجلّد القوالب الرّئيسي مُباشرة. أي أنّك تستطيع تعديل الموجّه الرّئيسي ليُقدّم القالب index.html المتواجد داخل مجلّد project/templates كالآتي: # project/__init__.py from flask import Flask, render_template #... #... @app.route('/') # 127.0.0.1:5000/ def index(): return render_template('index.html') # render project/templates/index.html لا تنس بأنّنا استردنا أولا الدّالة render_template ثمّ استدعيناها في المُوجّه لتقديم الملفّ index.html. بنفس الطّريقة سنقوم بتقديم كلّ من ملفّي posts.html الخاصّ بالمقالات و users.html الخاص بالمُستخدمين. حدّث المُوجّه في مُخطّط المقالات ليُصبح كما يلي: # project/posts/views.py from flask import Blueprint, render_template @posts.route('/') # 127.0.0.1:5000/posts def index(): return render_template('posts.html') # render project/posts/templates/posts.html وهكذا سيكون الموجّه الجديد في المُخطّطات الخاصّة بالمُستخدمين: # project/users/views.py from flask import Blueprint, render_template @users.route('/') # 127.0.0.1:5000/users def index(): return render_template('users.html') # render project/users/templates/users.html هكذا إن طلب الزّائر أي صفحة من الصّفحات الثّلاث فسيُقدّمُ ملفّ HTML المُناسب. استخدام إطار Bootsrap لتنسيق الصّفحات الهدف من هذه السّلسلة هو التّعريف بكيفيّة إنشاء تطبيقات ويب ديناميكيّة بلغة بايثون وإطار فلاسك ولن أتطرّق إلى لغات أساسيّة مثل HTML و css وJavascript، ولأنّ تطبيقات الويب في يومنا هذا أصبحت تعتمد كثيرا على المظهر الجميل والاستخدام المرن باستعمال كل من لغتي css وjavascript، فمن الضّروري أن نستعمل إطار عمل لسد هذا الفراغ وإتاحة تصميم أنيق لتطبيقنا. سنستخدم في هذا المشروع إطار bootsrap 3 الذي يُمكنك تحميله من الموقع الرّسمي وفك الضّغط عن ملفّ zip داخل مجلّد project/static، سأعتمد كذلك على مشروع Bootsrap-rtl لتعريب وتوجيه التّنسيق من اليمين إلى اليسار وسأضعه في مجلّد project/static/css كما سأضع مكتبة jquery داخل مجلّد project/static/css/bootstrap لذا تأكّد من أنّك قد جهّزت كلّ شيء قبل أن تبدأ في استدعاء الملفّات السّاكنة. بعد تجهيز مُجلّد static ستكون المُجلّدات والملفّات بداخله كما يلي: project/static/ ├── bootstrap │ ├── css │ │ └── bootstrap.min.css │ └── js │ ├── bootstrap.min.js │ └── jquery.js └── css ├── bootstrap-rtl.min.css └── style.css قد تكون هناك ملفّات إضافيّة حسب ما قُمت بتنزيله عندما نزّلت إطار العمل Bootstrap، لكنّ الملفّات أعلاه هي الأهم وهي التّي سنحتاج إليها حاليّا. إذا أردت إضافة ملفّات Javascript أخرى، فيُمكنك إمّا أن تضعها داخل مُجلّد js المُتواجد داخل المُجلّد bootstrap أو أن تُنشئ مُجلّدا جديدا باسم js داخل مُجلّد الملفّات السّاكنة static. الوراثة في قوالب Jinja2 لنقل بأنّنا نُريد عرض جملة واحدة في كل ملف من ملفات HTML الثلاثة. يُمكن أن أقوم بما يلي في كل ملفّ: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> Hello </body> </html> مع تعويض Hello بالجملة التّي ارغب في عرضها عند طلب كل موجّه. هذه الطّريقة تعمل بشكل جيّد، لكن ألا تُلاحظ بأنّنا سنُكرّر نفس الأسطر في كلّ ملف؟ عوضا عن تكرار الأسطر في كلّ ملف يُمكننا استعمال مبدأ الوراثة في مجرّك القوالب Jinja. وللاستفادة من هذا المبدأ في المثال السّابق، يُمكن أن نكتب الأسطر التّي تتكرّر في كل ملف في ملفّ رئيسي واحد يُعتبر القاعدة لجميع الملفّات الأخرى، وهذا هو دور ملفّ project/templates/base.html الذي أنشأناه سابقا، ففيه يُمكننا وضع الأسطر السّابقة مع تخصيص المكان الذي سنستطيع كتابة الجملة الخاصّة بكل ملف فيه. افتح ملفّ base.html وضع فيه ما يلي: {# project/templates/base.html #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %} {% endblock %}</title> <script src="{{ url_for("static", filename="bootstrap/js/jquery.js") }}"></script> <script src="{{ url_for("static", filename="bootstrap/js/bootstrap.min.js") }}"></script> <link rel="stylesheet" href="{{ url_for("static", filename="bootstrap/css/bootstrap.min.css") }}"> <link rel="stylesheet" href="{{ url_for("static", filename="css/style.css") }}"> <link rel="stylesheet" href="{{ url_for("static", filename="css/bootstrap-rtl.min.css") }}"> </head> <body> {% block content %} {% endblock %} </body> </html> احفظ الملف وأغلقه. لاحظ بأنّنا قمنا باستدعاء جميع الملفّات التّي سنحتاج إليها للتّنسيق وإضافة ميّزات أخرى بلغة Javascript، وقُمنا كذلك بوضع كتلة Block باسم title لتعويضها بالعنوان في كل ملفّ، أمّا كتلة content فهي التّي ستُعوّضُ بالمحتوى (كلمة Hello في مثالنا السّابق). يُمكنك إضافة ملفّات أخرى إلى مُجلّد static، لكن لا تنس أن تقوم باستيرادها في ملفّ base.html لكي تعمل في جميع الصّفحات. بعد تجهيز الملفّ base.html الذي سيُشكّل قاعدة للملفّات الأخرى، سنُنشئ الآن ثلاثة ملفّات HTML رئيسيّة، وهي كما يلي: ملفّ HTML للصّفحة الرّئيسية (مساره project/templates/index.html ). ملفّ HTML للصّفحة الرّئيسية للمُستخدمين (مساره project/users/templates/users.html). ملفّ المقالات الرّئيسي (مساره project/posts/templates/posts.html). لملء الملفّات، ضع الشّيفرة التّاليّة في كلّ ملفّ يُمكنك الاستعانة بالمسار المُشار إليه في التّعليق أعلى الشّيفرة للوصول إلى الملفّ بشكل أسرع. ملفّ الصّفحة الرّئيسية: {# project/templates/index.html #} {% extends 'base.html' %} {% block title %} كلمة – الصّفحة الرّئيسية {% endblock %} {% block content %} <h1> مرحبا بك في تطبيق كلمة </h1> {% endblock %} ملفّ الصّفحة الرّئيسية للمُستخدمين: {# project/users/templates/users.html #} {% extends 'base.html' %} {% block title %} كلمة – المُستخدمون {% endblock %} {% block content %} <h1> الصّفحة الرّئيسية للمُستخدمين </h1> {% endblock %} ملفّ الصّفحة الرّئيسية للمقالات: {# project/posts/templates/posts.html #} {% extends 'base.html' %} {% block title %} كلمة – المقالات {% endblock %} {% block content %} <h1> الصّفحة الرّئيسية للمقالات </h1> {% endblock %} كما ترى عوضا عن تكرار الكثير من شيفرات HTML قمنا ببساطة بإنشاء ملفّ واحد والوراثة منه باستخدام الجملة extends 'base.html' وفي كلّ مكان نضع المحتوى المناسب، وبهذه الطّريقة سنمتلك طريقة ديناميكية لتحديد عنوان ومحتوى كلّ موجّه مرتبط بقالب معيّن، بالإضافة إلى أنّ الملفّات السّاكنة مثل ملفّاتcss و js ستكون مُتاحة في جميع الملفّات التّي ترث من الملّف الرّئيسي base.html. مُلاحظة: في بعض المشاريع المكتوبة بلغة بايثون وإطار العمل فلاسك، يُمكن أن يُسمّى الملفّ المُشترك باسم layout.html عوضا عن base.html، لكنّ المبدأ هو نفسه. الآن إن عدت إلى الموجّهات السّابقة، فستُلاحظ بأنّ التّنسيق ومكوّنات كلّ صفحة قد تغيّرت. الرّبط بين المُوجّهات باستخدام الدّالة url_for بعد أن تعرّفنا على كيفيّة تقديم قوالب HTML، أصبح بإمكاننا عرض صفحات للمُستخدم حسب المُوجّه المطلوب، وبقي لنا التّعرف على كيفيّة الرّبط بين هذه الموجّهات. للرّبط بين موجّهات المُخطّطات باستخدام الدّالة url_for، نقوم أولا بوضع اسم المُخطّط ثمّ اسم الدّالة التّي يتم استدعاؤها عند الوصول إلى المُوجّه، وبما أنّنا سمينا هذه الدّوال باسم index فللرّبط بينها يُمكنك أن تقوم بشيء مُشابه لما يلي: url_for('index') # / url_for('posts.index') # /posts url_for('users.index') # /users لو كانت الدّالة تقبل مُعاملا لتوجّب علينا تمرير قيمته كالآتي: url_for('posts.post_by_id', post_id = 1) للرّبط بين الموجّهات الثّلاثة التّي سبق وأن أنشأناها سنُضيف ما يلي مُباشرة بعد وسم h1 في كل ملفّ من ملفّات HTML حسب المسار في بداية الشّيفرة. الرّوابط في الصّفحة الرّئيسية: {# project/templates/index.html #} <a href="{{ url_for("posts.index") }}"> اضغط هنا للوصول إلى صفحة المقالات </a> <br> <a href="{{ url_for("users.index") }}">اضغط هنا للوصول إلى صفحة المُستخدمين</a> رابط العودة إلى الصّفحة الرّئيسية في صفحة المقالات: {# project/posts/templates/posts.html #} <a href="{{ url_for("index") }}">اضغط هنا للعودة إلى الصّفحة الرّئيسيّة</a> رابط العودة إلى الصّفحة الرّئيسية في صفحة المُستخدمين: {# project/users/templates/users.html #} <a href="{{ url_for("index") }}">اضغط هنا للعودة إلى الصّفحة الرّئيسيّة</a> بعد حفظ الملفّات، ستجد بأنّ الصّفحة الرّئيسية أصبحت تحتوي على رابط لكلّ من صفحتي المقالات والمُستخدمين مع رابط للعودة إلى الصّفحة الرّئيسية في كل صفحة من الصّفحتين. الرّبط بين المُوجّهات مع تمرير مُعاملات للدالّة التّابعة لكل موجّه. لفهم مبدأ المعاملات أكثر، سنقوم بإضافة موجّه للوصول إلى مقال برقم مُعرّفه في ملفّ project/posts/views.py كما يلي: # project/posts/views.py #.. #.. @posts.route('/<int:id>') def post_by_id(id): return render_template('post.html', id = id) لاحظ بأنّنا خصّصنا المعامل id من نوع int أي عدد صحيح، فإن لم تكن قيمة المُعامل عند الوصول إلى الرّابط عددا صحيحا فإنّ ذلك سيُسبّب خطأ من نوع 404. بمعنى أدق، الرّابط /posts/1 صحيح، أمّا /posts/abc فسيرجع الخطأ ذو الرّقم 404. سنتعرّف على كيفيّة التّعامل مع هذه الأخطاء في درس قادم. سنضع ما يلي في ملفّ post.html الذي قدّمناه: {% extends 'base.html' %} {% block title %} كلمة – المقال ذو المُعرّف {{ id }} {% endblock %} {% block content %} <h1> صفحة المقال الواحد ذو رقم المُعرّف {{id}} </h1> <a href="{{ url_for("index") }}">اضغط هنا للعودة إلى الصّفحة الرّئيسيّة</a> {% endblock %} لنستخدم الآن الدّالة url_for داخل ملفّ posts.html لضرب مثال على كيفيّة تمرير مُعاملات إلى الدّالة. أضف ما يلي إلى ملفّ posts.html مُباشرة بعد الوسم <h1>: <a href="{{url_for("posts.post_by_id", id=1)}}"> <h2> رابط المقال الأول </h2> </a> <a href="{{url_for("posts.post_by_id", id=2)}}"> <h2> رابط المقال الثّاني </h2> </a> الآن، إن دخلت إلى صفحة المقالات فستلاحظ رابطين لمقالين وهميّين، الأول رقم معرّفه 1 والآخر رقم مُعرّفه 2، ورابط المقالين كالتّالي: http://127.0.0.1:5000/posts/1 http://127.0.0.1:5000/posts/2 يُمكنك كذلك زيارة صفحات أخرى عبر تغيير قيمة رقم المُعرّف إلى أي عدد صحيح، والتّالي بعض الأمثلة: http://127.0.0.1:5000/posts/99 http://127.0.0.1:5000/posts/232 في المقالات القادمة سوف نعوّض جملة “صفحة المقال ذي المُعرّف رقم * ” بعنوان المقال وسنعرض محتواه وقسمه أسفل العنوان مع الوسوم الخاصّة بالمقال، وذلك بجلب كل مقال حسب رقم مُعرّفه في قاعدة البيانات. خاتمة تعرّفنا في هذا الدّرس على جزء آخر من أساسيّات تطوير تطبيقات ويب أكثر تعقيدا وذات مهام مُتعدّدة، هذا الدّرس يُمثّل قسما صغيرا فقط ممّا يجب عليك معرفته حول كيفيّة التّعامل مع قوالب HTML ومحرّكها Jinja الذي يُرافق إطار العمل Flask افتراضيّا، لكنّك ستجده في مشاريع بايثون أخرى تتعلّق بتطوير الويب وبعض المجالات الأخرى ولو لم يكن إطار Flask حاضرا، لذا فتعلّم أساسيّات Jinja سيُخوّلك لتعلّم أساسيّات أطر عمل أخرى ومُختلف الأدوات التّي تعتمد عليه بشكل أسرع.
  14. مُقدّمة تعلّمنا في الدّروس السّابقة كيفيّة إدارة مشروع مكتوب بإطار العمل فلاسك، وقد تعرّفنا في الدّرس السّابق على كيفيّة التّعامل مع قوالب HTML، في هذا الدّرس سنُكمل هذا الجزء من تطوير الويب بتعلّم أساسيّات مُحرّك القوالب Jinja الذي يأتي مُرفقا مع إطار العمل فلاسك افتراضيّا، والذّي تُعتبر أساسيّاته أمرا مُهمّا لكونه يُستعمل في العديد من مشاريع بايثون أخرى بالإضافة إلى إطار العمل فلاسك. الدّوال في Jinja يُمكننا تعريف دوال لتحمل شيفرة معيّنة مع معاملات على Jinja لإعادة استعمالها وتحقيق مبدأ DRY أو Don’t Repeat Yourself وترجمته إلى اللغة العربيّة هي “لا تكرّر نفسك” ويعني بأنّه لا يجب عليك تكرار كتابة نفس الشّيفرة، وكلّما وجدت نفسك تُكرّرها توقّف وفكّر في إيجاد حل لتجنّب هذا التّكرار، إما بوضعها في دالّة أو شيء من هذا القبيل لتسهل عليك إعادة استعمالها. في Jinja مبدأ الدّوال موجود في ما يُسمى بالماكرو macro ويُمكن تعريف واحدة كما يلي: {% macro name(param1, param2) %} . . . {% endmacro %} كما تُلاحظ، الأمر شبيه بكيفيّة إنشاء الدّوال في لغة بايثون، لاحظ فقط كيف نُنهي الجزء الخاص بالدّالة بكلمة endmacro. يُمكننا استدعاء الماكرو في مكان آخر من القالب كما نعرض قيمة مُتغيّر معيّن: {{ name('pram1_value', 'pram2_value' }} يُمكننا كذلك تعريف الماكرو دون أية مُعاملات. ومن الشّائع أن توضع في ملف باسم _helpers.html في مجلّد templates الرّئيسي، وبعدها لاستخدامه يجب استيراده في أعلى الملف كما يلي: {% from "_helpers.html" import macro_name %} مع استبدال macro_name باسم الماكرو، تأكّد فقط بأنّك تستدعيه في أعلى الملفّ عوضا عن أي مكان آخر. بعد الاستدعاء ستتمكّن من استخدامه كالمُعتاد. مثال على ماكرو هناك العديد من الاستخدامات لهذه الخاصيّة، وسنتعرّف على بعض منها أثناء تطويرنا للتّطبيق، وهذا ما جعلني أشرح الفكرة هنا لتُفهم أكثر. في هذا المثال سنقوم بإنشاء ماكرو لتحويل قائمة بايثون إلى قائمة HTML. فمثلا لو كانت لدينا القائمة التّالية: list = ['Abdelhadi', 'Ayman', 'Ibrahim'] فسنستطيع تحويلها إلى التّالي بسطر واحد: <ul> <li>Abdelhadi</li> <li>Ayman</li> <li>Ibrahim</li> </ul> أولا سنُنشئ الماكرو كما يلي: {% macro py_to_html(list) %} <ul> {% for item in list %} <li>{{ item }}</li> {% endfor %} </ul> {% endmacro %} ثمّ نستدعيه كما يلي (على فرض أنّ list عبارة عن قائمة بايثون عاديّة): {{ py_to_html(list) }} ما ستُلاحظه هو أنّ النّتيجة ستكون عبارة عن قائمة HTML تحتوي على عناصر القائمة list، وهذا طبيعي لأنّ ما يفعله الماكرو ببساطة هو الدّوران حول المُعامل list الذي يستقبله ويعرض كل عنصر من القائمة داخل وسمي <li></li>. وهذه هي ببساطة طريقة عمل الماكرو، ويُمكنك إعادة استعماله أكثر من مرّة مع تمرير مُعاملات أخرى دون الحاجة إلى إعادة الشّيفرة مرارا وتكرارا. يُمكنك كذلك إنشاء ماكرو بدون أيّة مُعاملات، فمثلا الماكرو التّالي سيقوم بعرض الجملة “مرحبا بالعالم” في كل مرّة يتمّ استدعاؤه فيه: {% macro hello_world() %} مرحبا بالعالم {% endmacro %} وطريقة استدعائه في قالب HTML ستكون كالتّالي: {{ hello_world() }} سنتعرّف أثناء تطويرنا لتطبيق “كلمة” على المزيد من الأمثلة لكيفيّة استعمال ميّزة الماكرو في مُحرّك القوالب Jinja، وإن تابعت سلسلة استعمال مكتبة WTForms مع إطار العمل Flask فلا شك بأنّك ستأخذ فكرة واضحة عن كيفيّة عمل الماكرو كما ستحصل على مثال واقعي لاستخدامه. المُرشّحات (filters) في Jinja2 المُرشّحات مبدأ جديد يتوجّب عليك فهمه لكتابة تطبيقات ويب أفضل. يُطبّق المُرشّح في مُحرّك القوالب Jinja على مُتغيّر لتغيير قيمته من حالة إلى أخرى. التّالي مثال على كيفيّة عرض قيمة المُتغيّر name في مُحرّك القوالب Jinja: {{ name }} إذا ما طبّقنا على هذا المتغيّر مُرشّحا فسيتوجّب علينا أن نقسم بين المُتغيّر والمُرشّح بعلامة |. المثال التّالي يُوضّح كيفيّة تطبيق مُرشّح وهمي سنُسمّيه filter على المُتغيّر name: {{ name | filter }} نستعمل المُرشّحات كما نستعمل في لغة Python دوال تأخذ قيمة وتقوم بعمليّة أو عدّة عمليّات على هذه القيمة وتُرجع القيمة النّهائيّة التّي تُمثّل النّتيجة. إذا ما طبقت مُرشّحا على مُتغيّر ما، فقيمة المُتغيّر يجب أن تتغيّر، وسنرى بعض أهم المُرشّحات التّي يُوفرّها مُحرّك القوالب Jinja فيما بعد. يُمكنك كذلك أن تُمرّر مُعاملات إلى مُرشّح عبر تحديد القيم داخل قوسين كما يلي: {{ name | filter(argument1, argument2, argument3) }} المُعاملات التّي تُمرّر تُحدّد نوعيّة العمليّات التّي ستخضع لها القيمة قبل أن تُرجع النّتيجة. يُمكن كذلك استخدام أكثر من مُرشّح عبر تقسيمها بالرمز | كما في المثال التّالي: {{ name | filter1() | filter2() | filter3() }} كل مُرشّح يجري عمليّة على القيمة التّي تسبقه، لذا فطريقة عمل المثال أعلاه هو كالتّالي: يأخذ المُرشّح filter1 قيمة المُتغيّر name ويُرجع نتيجة تُعتبر مُجرّد قيمة أخرى. تمرّ النّتيجة السّابقة على المُرشّح filter2 لنحصل على قيمة جديدة تُعتبر نتيجة لعمل المُرشّح filter2 على ما أرجعه المرشّح filter1. يأخذ المُرشّح filter3 القيمة التّي نحصل عليها في النّتيجة السّابقة ويُجري عليها عمليّة ثمّ يُرجع قيمة جديدة. وبما أنّ آخر قيمة حصلنا عليها هي ما أنتجه المُرشّح filter3 على ما سبقه من قيمة، فما سيظهر للمُستخدم الذي يزور صفحة HTML التّي حدث بها ما حدث هو القيمة الأخيرة. ما فائدة المُرشّحات؟ رغم أنّ المُرشّحات في Jinja يُمكن أن تُستبدل بعمليّات على المُتغيّرات قبل تقديم قالب HTML عند العمل مع إطار العمل Flask، إلّا أنّ استعمال المُرشّحات حل أفضل وأكثر مرونة، وفي بعض الحالات يُمكن أن تحفظ نفسك من تكرار الكثير من الشّيفرة إن استعملت مُرشّحا يُوفّره مُحرّك القوالب Jinja عوضا عن كتابة الشّيفرة باستعمال لغة Python في كل مرّة تحتاج فيها إلى تغيير قيمة إلى قيمة أخرى. بالإضافة إلى أنّك تستطيع إنشاء مُرشّحات خاصّة بك لتستعملها مع إطار العمل Flask وقوالب Jinja إن أردت ذلك، فمثلا يُمكنك أن تكتب مُرشّحا لتحويل تاريخ مُعيّن من الصّيغة العاديّة (1-1-2017) إلى صيغة (قبل كذا يوم/ قبل كذا شهر/ منذ X أشهر …). سنرى كذلك بعض الاستعمالات للمُرشّحات فيما بعد، فمثلا، سنرى كيفيّة استعمال مُرشّح تُوفّره لنا إضافة Flask-Gravatar (سنرى المزيد عن إضافات Flask فيما بعد) لتحويل بريد إلكتروني إلى الصّورة المُرتبطة به على خدمة Gravatar. مثال على استخدام مُرشّح لتحويل نصّ إلى أحرف كبيرة كمثال على كيفيّة استخدام مُرشّح مُتوفّر مُسبقا بحيث يُمكنك استخدامه في أي قالب HTML في مشروع Flask الخاصّ بك، سننظرُ إلى كيفيّة استخدام المُرشّح upper الذي يعمل بنفس طريقة عمل التّابع upper() في لغة بايثون، والذي يُمكنك استخدامه لتحويل نصّ عادي إلى أحرف كبيرة Uppercase. أولا، سنُضيف مُوجّها جديدا إلى ملفّ __init__.py داخل مُجلّد المشروع project، يُمكنك اعتبار هذا المُوجّه حقل تجارب لتختبر به مُختلف المُرشّحات التّي سأسردها فيما بعد ومن المُفضّل حذفه إذا انتهيت منه. سيكون المُوجّه كالتّالي: @app.route('/filters') def filters(): return render_template('filters.html') المُوجّه بسيط جدّا، والعمل الحقيقي سيكون داخل الملفّ filters.html الذي قدّمناه كجواب في الموجّه. أنشئ الملفّ filters.html داخل المُجلّد templates المُتواجد في مُجلّد المشروع project. داخل الملفّ filters.html، أضف ما يلي: {% extends 'base.html' %} {% block title %} كلمة – المُرشّحات {% endblock %} {% block content %} <h1> {{ "Hello World!" | upper() }} </h1> {% endblock %} لاحظ الجزء {{ "Hello World!" | upper() }}، إن تابعت ما سبق جيّدا، فستفهم بأنّنا قُمنا في هذا الجزء بتطبيق المُرشّح upper على السّلسلة النّصيّة Hello World ، وبالطّبع، فإنّك تستطيع أن تُعوّض السّلسلة النّصيّة بمُتغيّر يحمل نفس القيمة أو قيمة أخرى. إن زرت العنوان http://127.0.0.1:5000/filters فستُلاحظ النّص HELLO WORLD!، ما يعني بأنّ المُرشّح upper قد أدّى مهمّته. استعمال المُرشّحات مع نصّ مُتعدّد الأسطر في الأمثلة السّابقة، تعرّفنا على كيفيّة استعمال مُرشّح في سطر واحد كما يلي: {{ "Hello World!" | upper() }} لكن ماذا لو أردنا استعمال المُرشّح في جزء أكبر من الشّيفرة؟ كاستعمال المُرشّح upper مع فقرة كاملة أو نص متعدّد الفقرات. يُمكننا استخدام المُرشّح كما نستعمل الجملة الشّرطية if أو حلقة for في Jinja، وذلك عبر إحاطة ما نُريد تطبيق المُرشّح عليه بكل من {% filter upper %} و {% endfilter %}، مع تغيير upper بالمُرشّح الذي تُريد استعماله. المثال التّالي يُمثّل كيفيّة استعمال المُرشّح upper مع نصّ مُتعدّد الأسطر: {% filter upper() %} Hello World! {% endfilter %} خاتمة تعرّفنا في هذا الدّرس كيفيّة استعمال خاصيّة الماكرو في مُحرّك القوالب Jinja لتفادي تكرار شيفرة عدّة مرّات، كما تعرّفنا على ماهيّة مُرشّحات Jinja وكيفيّة استعمالها والهدف منها، في الدّرس التّالي، سنلقي نظرة على بعض من أهمّ المُرشّحات التّي تأتي مبنيّة مُسبقا في مُحرّك القوالب Jinja والتّي يُمكنك استعمالها مُباشرة مع تطبيقات فلاسك الخاصّة بك.
  15. لا يجب أن تبدأ دائمًا بالتطوير باستعمال إطار عمل JavaScript، لكن هنالك حالات يكون فيها استعمال إطار العمل أمرًا منطقيًا. منذ فترةٍ كتبتُ مقالةً بعنوان «لماذا يدفعنا التطوير بلغة JavaScript إلى حافة الجنون!» والتي زارها الكثيرون، وظهر التساؤلان الآتيان ردًا عليها: - متى يجب أن نستخدم إطار عمل؟ - إذا لم نستعمل إطار عمل، فكيف نبدأ؟ سأحاول في هذه المقالة الإجابة على التساؤل الأول، أما سؤال كيفية البدء إذا لم نستعمل إطار عمل فهو سؤالٌ أكبر، ويحتاج تفصيلًا أكثر. بدأتُ العمل منذ عدِّة سنوات في شركة (لن أسميها هنا)، والتي تستطيع أن تطلب منها إنشاء أي شيء غريب يمكن تخيله، وستصنعه لك خلال فترةٍ وجيزة. كان للشركة هامش ربحٍ كبير، وتجني أموالًا طائلة، وتعلمتُ الكثير عن إدارة الأعمال منها، لكنني تعلمتُ أيضًا بعض الأمور عن الأنظمة. كانت واجهة موقع الشركة الإلكتروني معقدةً! ولهذا السبب بدأ موقع الشركة في بدايات 2000 بالتحول إلى تطبيقٍ ذي صفحةٍ واحدة، حتى قبل انتشار فكرة التطبيقات ذات الصفحة الواحدة (single page application). كانت شيفرات JavaScript التي تشغل موقعهم معقدةً جدًا، وكانوا نادرًا ما يوظفون مبرمجين، واختاروا إطار عمل YUI بدلًا من jQuery لأنه كان شائعًا في تلك الفترة، ثم اشتقوا (fork) شيفرة YUI مما جعل التعامل معها وصيانتها أمرًا صعبًا جدًا. ولسببٍ أجهله، كانوا يكتبون شيفرات JavaScript بشكلٍ شبيهٍ بشيفرات Visual Basic. كانوا أيضًا يستعملون نظامًا لإدارة الإصدارات (version control system) من الثمانينات الذي كانت آلية حماية الملفات من التعديل فيه هي قفلها (file locks) والتي تستطيع بسهولة تجاوزها. سكربت البناء الذي كانوا يستعملونه هو شخصٌ اسمه Ed، فلتحويل الشيفرة إلى الخادوم الإنتاجي سيكون عليك أن تطبع قائمةً بالملفات التي عدَّلتَها وتسلمها لذاك الشخص، ثم سيبحث عن تلك الملفات وينسخها يدويًا إلى كل خادوم على حدة. كان السند الخلفي (backend) للموقع هو حاسوبٌ قديمٌ يُشغِّل برمجيات مكتوبة في سبعينيات القرن الماضي، وكانت تُحدَّث بيئة التطوير المشتركة يدويًا من قِبل المطورين، متى أرادوا ذلك. إذا كنتَ تضحك الآن على حالهم وتظن أن هؤلاء الأشخاص أغبياء، فأظن أنَّ الوقتَ مناسبٌ لأشير إلى أنهم لم يعانوا من انقطاعاتٍ في الخدمة، وكانوا يُصدرون ميزاتٍ جديدة دوريًّا، ويجنون أموالًا طائلة تزداد عامًا بعد عامًا. لذا أظن أنهم يضحكون الآن خلال طريقهم إلى البنك ليستلموا أرباحهم. هل تتلقى أجرًا لقاء كتابتك للشيفرات؟ إذًا أنت تعمل لدى شركة. وعندما تقرر الشركة كيف تُنفِق ميزانية المطورين، فلن يكون منطقيًا أن تنفق مالًا لكتابة البرمجيات «بالطريقة الصحيحة». الفكرة التي أحاول إيصالها هنا هي أنَّ حال الشركة السابقة قد يبدو بائسًا بالنسبة إلى مطوري البرمجيات، لكنه منطقيٌ جدًا وجيد بالنسبة إلى أصحاب تلك الشركة الذين يهتمون بالربح. استخدام إطار عمل JavaScript قد لا يكون خيارًا استراتيجيًا للشركات حتى لو كان حالها سيئًا كالشركة التي نتحدث عنها. إذًا، كيف يجب أن تتابع الشركة السابقة بتطوير برمجياتها؟ كيف ستقرر الشركة أنها بحاجة إلى استخدام إطار عمل؟ شرحتُ سابقًا في مقالة «لماذا يدفعنا التطوير بلغة JavaScript إلى حافة الجنون!» أنَّ من غير المنطقي البدء بتطوير البرمجيات انطلاقًا من إطار عمل. لنفترض وجود شيءٍ شبيهٍ بإطار Angular عند نشأة الشركة السابقة؛ فهل كان عليهم استخدام إطار عمل؟ هل يجب عليهم استخدام إطار عمل في هذه الفترة؟ عندما تختار الشركة إطار عمل لتستعمله لتطوير برمجياتها، فهنالك كلف ومخاطر: - ماذا لو اختفى دعم إطار العمل خلال خمس سنوات؟ هل يمكن أن تتحمل الشركة عبء صيانة إطار العمل بنفسها؟ هل يتوافر في فريق العمل أشخاصٌ لهم خبرات في هذا المجال؟ الجواب هو النفي لأغلبية الشركات، ولا نُغفِل أنَّ الكثير من أطر العمل Frameworks تختفي فجأةً. عليك أن تجري مع التيار وتخمِّن إن كانت الزيادة في الإنتاجية الآتية من اختيار إطار عمل تستحق الوقت والكلفة اللازمة للتحويل إلى إطارٍ آخر لاحقًا، أو أنَّها تستحق كلفة التعامل مع برمجيات غير مدعومة لسنوات في نفس الوقت الذي تحاول فيه توفير ميزانية كافية للتحويل إلى إطارٍ جديد. إذا كانت شيفرات برمجيتك قليلة نسبيًا وكنت تعمل في شركة وتحذف كميةً لا بأس بها من الشيفرات وتُعيد كتابتها (كثير منا يفعل ذلك لكنهم لا يعترفون)، فأرى أنَّ من المناسب استعمال إطار عمل. أما لو كانت شيفرات برمجيتك كثيرة جدًا، وكنت تنظر إلى خطتك التي وضعتها للسنوات الخمسة القادمة ورأيتها مليئةً بالميزات الجديدة التي ستكوِّن جزءًا أساسيًا من شركتك، فإن اختيار إطار عمل الذي سينتهي دعمه خلال خمسة سنوات هو رهانٌ خاسر، والطريقة الوحيدة التي ستجعلك تختار واحدًا هي التفكير بأجوبةٍ للأسئلة المتبقية … - كم ستخسر من إنتاجية مطوريك حتى يتعلموا إطار العمل الجديد؟ إذا كنت تنتقل إلى إطارٍ وليكن Angular (وما لم توظِّف مطورين يعرفون Angular من قبل ويلمّون بأحدث المعلومات) فستنفق مالًا لتدريب فريق التطوير وسيضيّع المطورون الأشهر القادمة يسألون «كيف أفعل ذلك في Angular؟» حتى لو كانوا يفعلون نفس الأمر تمامًا باستخدام jQuery وشيفرات JavaScript البسيطة دون أدنى تفكير. - هل يمكننا بناء هذه الميزة التي تجعلنا نجني مالًا أكثر بنفس مقدار الوقت اللازم لتعلم إطار العمل؟ الجواب لأغلبية الشركات الربحية هو «نعم». - هل سيسمح لنا إطار العمل بجني المزيد من المال بجعلنا نُنشِئ الميزات الجديدة بوتيرة أسرع في المستقبل؟ نظريًا: هذه هي الفائدة المرجوة من إطار العمل. إذ ستحصل على فائدة أكبر من إطار العمل عندما يكون فريقك كبيرًا، وشيفرات مشروعك كثيرة، وتريد تسريع وتيرة تطوير الميزات الجديدة. لكن لاحظ أنَّك تستطيع تطوير بعض البرمجيات بسهولة ولن تستفيد فيها من التحول إلى إطار عمل. حسنًا، ربما تظن أنَّ هذا قرارٌ صعبٌ، إلا أنه في الواقع عكس ذلك لأغلبية الشركات. - الشركات الصغيرة وسريعة التغيرات تقع في الزاوية العليا اليسرى من المخطط السابق، فإذا كانت شيفرات برنامجك تتغير بسرعة فلن يكون من الخطر التغيير إلى إطار عمل آخر. فلو كنت تضيف الميزات يمنةً ويسرةً لأنك لم تعلم أيها يجني مالًا بعد، فلن تهتم إن «مات» إطار العمل الذي تستخدمه، لأنك ستحذف تلك الميزات والأجزاء من الشيفرات على أيّة حال. إذا كانت إنتاجيتك أكبر عندما تستعمل إطار عمل، وكنت تعمل لدى شركةٍ ناشئةٍ فسأقول أنَّ من الصواب استعمال إطار عمل، مع الأخذ بالحسبان أنَّ أغلبية الأشخاص تقل إنتاجيتهم عندما يستعملون إطار عمل لكنهم لا يعترفون بذلك. - تتواجد الشركات الصغيرة وذات معدل التغيير البطيء في الطرف السفلي اليساري من المخطط، وتكون إما شركات صغيرة تقليدية التي لا تُمثِّل البرمجيات مكوِّنًا أساسيًا من طريقة عملها، أو شركات البرمجيات الصغيرة. إذا كنت مبرمجًا تعمل لدى شركة صغيرة، فلا تستعمل إطار Angular أو React أو غيرهما. وإنما استخدم المكتبات المستقرة والثابتة والتي تعمل على جميع المتصفحات. فلو كنت تعمل في شركةٍ صغيرةٍ، فأرى أنَّ مخاطر استعمال إطار عمل تفوق ميزاته. - الشركات الكبيرة وذات معدل التغيير السريع تتواجد في القسم العلوي الأيمن من المخطط، وهي الشركات التي تكون البرمجيات مكوِّنًا أساسيًا فيها، أي أنهم يضيفون الميزات كثيرًا ويحذفون أجزاءً كبيرةً من الشيفرات ويعيدون كتابتها (حتى لو لم يعترفوا بذلك)، ولديهم فرق برمجية كبيرة، والميزات الجديدة التي يُضيفونها ستدر عليهم مالًا. لذا من المنطقي أن يدرِّبوا فِرَق البرمجة عندهم لاستعمال إطار عمل، لكي يبدأ الجميع من نفس المكان ولتُكتَب الميزات بوتيرة أسرع. إذا كانت شركتك ذات دخلٍ كبير، فستقل مخاطر فقدان دعم إطار العمل مع مرور الزمن، لأنك عندما كنت تختار ما هو إطار العمل الذي ستعمل عليه فستأخذ بالحسبان الدعم الطويل له. أما لو كنت تعمل في شركةٍ كبيرةٍ وتجني أموالًا طائلة وكانت البرمجيات من أساس عملك، فمن المنطقي أن تكتب إطار عمل خاص بك مثل Facebook و Google … - الشركات الكبيرة وذات معدل التغيير البطيء تقع في الركن السفلي اليميني من المخطط. وتنتمي الشركة التي تحدثنا عنها في بداية المقالة إلى هذا النوع، ولن يكون الخيار الصائب واضحًا هنا. فليس مجال عمل الشركة هو البرمجيات، لكن البرمجيات هي جزءٌ أساسيٌ نظام عمل الشركة. لن تتغير الشركة بسرعة، لكن الميزات الجديدة ستساعد الزبائن بشراء المزيد من المنتجات. مثاليًا، يمكنك أن تبني على إطار عمل الذي سيبقى حوالي 50 سنة، وهذا أمرٌ معقولٌ بالنسبة إلى شركةٍ تستعمل برمجيات وشيفرات عمرها 40 سنة. لكن هذا ليس موجودًا، لذا قد تفكر ببناء إطار عمل خاص بك، لأنك ستتأكد أنك لن تقع في فخ أطر العمل الميتة بعد 10 سنوات. لذا يجب أن تنشئ كل شيء من الصفر، وسترى أنَّ نفقات إنشاء ذلك قليلةٌ مقارنةً بالربح خلال 50 سنة … إذًا، هل يجب أن تنتقل الشركة إلى إطار عمل؟ لا يوجد جواب سهل! فعندما كنتُ مطورًا أعمل عندهم وكنت أفكر عن البرمجيات فقط، فكان الجواب الجلي بالنسبة لي هو: بالطبع يجب أن ينتقلوا لاستخدام Angular! لكن عندما بدأتُ شركتي الخاصة، فأصبحتُ أرى البرمجيات من زاويةٍ أخرى، لذا لن يكون الخيار سهلًا. توقف برهةً وفكِّر بعمق قبل الالتزام بإطار عمل، وإذا كنتَ صاحب قرار التحول إلى إطار عمل في حال استعملتك الشركة كمستشار، فأسدِ خدمةٍ إلى الشركة، وانزع عنك نظارات المبرمج، وضع نظارات مدير الأعمال. ترجمة -وبتصرّف- للمقال Should You Ever Use a JS Framework?‎ لصاحبه Sean Fioritto
  16. وردتني الكثير من الرسائل اﻹلكترونية خلال اﻷشهر القليلة الماضية من قبل مبرمجين تعلّموا البرمجة بأنفسهم، وهم يرغبون في الانطلاق في مسيرتهم المهنية كمبرمجين مستقلين، وقد تضمنت هذه الرسائل الكثير من الأسئلة مثل كيف أبدأ العمل كمستقل... وغيرها من اﻷسئلة التي تعكس ما مررت به عندما بدأت العمل كمبرمجة مستقلّة. كنت أسأل نفسي دائمًا فيما إذا كنت مستعدة للعمل كمستقلة، وهل سيطلب منّي أحد ما أن أبرمج له مقابل أجر ماديّ. لم أكن أعرف كيف أتحول من مبرمجة مبتدئة إلى مطوّرة حقيقية، وكيف أدخل ميدان العمل الحرّ بشكل صحيح. كنت مصدومة بمقدار الخوف والقلق الذي كان يقف في طريقي: الخوف من المجهول. الخوف من تضييع شهور أو حتى سنوات في تعلّم شيء قد لا يجدي نفعًا. الخوف من أن أصبح معروفة بكوني شخصًا فاقدًا للتركيز. الخوف من العودة إلى نقطة البداية. وباﻹضافة إلى هذه المخاوف، كانت تراودني العديد من اﻷسئلة، مثل: أشعر بأنّي لا أستطيع تعلّم البرمجة، وأنّي لا أتطور فيها بسرعة كافية. هل أمتلك الخبرة الكافية لكي أحصل على عمل مقابل أجر مادي. أرغب في أن أعمل كمستقلّة، ولكني لا أعرف كيفية الحصول على عميلي اﻷول. وقد دفعني كل ما سبق إلى وضع هذا الدليل الشامل للإجابة عن هذه التساؤلات والتغلب على تلك المخاوف، لتتمكّن من تحديد الوقت والطريقة التي تبدأ فيها بالتحول إلى مبرمج مستقلّ والدخول في مضمار العمل الحرّ، لتشعر بالحرية والمرونة في العمل في كل يوم. ستجد في هذا المقال أفضل الخطط التي يمكن اتباعها لمعرفة: كيف تجد الوقت للبرمجة، وكيف تستثمر هذا الوقت بفعّالية. ما هي اللغات التي يجب التركيز عليها وما هي المصادر التي يجب اﻻستعانة بها. متى وكيف تبدأ عملية التحول إلى العمل الحر. كذلك ستجد خططًا واضحة ومحددة تساعدك في اتخاذ الخطوات المناسبة منذ البداية لتتجنّب المفاجئات في المستقبل. كما يمكنك الاستفادة من هذا المقال حتى لو كنت موظّفًا يعمل بدوام كامل. لقد استعنت بخبرتي الشخصية في كتابة هذا المقال، إضافة إلى أنّني أجريت بحثًا موسّعًا جدًّا، واعتمدت على مصادر مُختلفة، ما يعني أنّك لست بحاجة إلى تضييع وقتك في البحث عن اﻹجابات؛ ﻷنّك ستجدها مجتمعة في هذا المقال. حسنًا، أعتقد بأننّي قد تحدّثت كثيرًا، وقد حان الوقت للدخول إلى صلب الموضوع. لنتفق على أمر واحد: نعم، أنت مبرمج "حقيقي" هل تبدو هذه العبارة مألوفة لك: أسمع هذه العبارة بشكل دائم، سواء من قبل أشخاص مبتدئين أو من قبل الذين يبرمجون منذ عام أو يزيد. يسمّي Anthony Gold حالة الخوف هذه بـمتلازمة المحتال Imposter Syndrome، وتشيع هذه المتلازمة بين اﻷشخاص الذين يحقّقون النجاحات الكبيرة، وقد عانى من هذه المتلازمة كل من Denzel Washington و Tina Fey و Sheryl Sandberg و Meryl Streep وذلك في بداية حياتهم المهنية. وليزيد الطين بلّة، فإن المبرمجين الشباب يقابلون بكثير من الكراهية، إذ يكره الناس مقابلة اﻷشخاص الذين يلقّبون أنفسهم بألقاب مثل مطور برامج، أو مطور ويب، أو مطور "أي شيء". فلا عجب إذًا في أن ينتابك شعور بانعدام الثقة عندما تسمّي نفسك مطوّرًا، وأعني بـ "المطور" هنا ذلك الشخص الذي يكتب الشيفرات البرمجية ويحلّ المشاكل ويبني البرامج"، وسأستخدم مصطلح "المطوّر" هنا بشكل فضفاض، حيث سيشمل المصطلح المبرمجين (Programmers) والمُبرمجين الخارقين (Hackers) ومختبري البرمجيات (Coders) وعلماء الحاسوب (Computer Scientists). ولا أقصد بهذا الاستخدام الموسّع أن أشير إلى تشابه هذه التخصصات مع بعضها البعض، فهي ليست كذلك، بل الغرض من ذلك هو تسهيل النقاش إضافة إلى تداخل هذه التخصّصات مع بعضها البعض. ولا أقصد من هذه النقطة التركيز على المعنى اللغوي لهذه المصطلحات، أو الدخول في مناظرة لتحديد الفرق بين تخصّص وآخر، بل ما أقصده هنا هو وجود سبب يدفعك إلى تعلم البرمجة، سواء أكان الهدف إصلاح اﻷشياء أو بنائها أو تحسينها. ولكي نحسم اﻷمر بشكل نهائي نقول: إن كنت قادرًا على كتابة الشيفرات البرمجية وبناء أو تحسين اﻷشياء باستخدام الشيفرة، فأنت إذًا مُبرمج حقيقي. وفي المرة القادمة، عندما تسأل نفسك هذا السؤال تذكّر Anne Cahalan والتي لم تبدأ البرمجة منذ نعومة أظفارها، ودخلت إلى عالم البرمجة عن طريق الصدفة وتعلّمت البرمجة من خلال ورش التدريب. تتساءل Anne عن مدى أهمية أن يكون المطوّر مطوّرًا "حقيقيًا"؟ وما هو تعريف كلمة "حقيقي" وكيف يتم تحديد هذه الصفة، ولماذا لا نستطيع تحديدها بأنفسنا؟ بدلًا من التفكير في كونك مطوّرًا "حقيقيًّا" أم لا، يستحسن بك الخوض في التحديات، واكتشاف أشياء جديدة، وتعلم المزيد. فأنت وحدك من يقرر إذا ما كنت مطوّرًا "حقيقيًّا" أم لا، وبدلًا من التركيز على اتّصافك بهذه الصفة من عدمه، اجعل تركيزك منصبًّا على أن تكون مطوّرًا كبيرًا. يقدّم لنا Scott Hanselman و هو متحدّث ومدوّن ويدير بودكاست ومطوّر في Microsoft عددًا من النصائح التي تساعد في شحذ الهمّة وتطوير المهارات، وذلك في مقالته التي كتبها تحت عنوان "هل أنا مطوّر أم مجرّد شخص يُتقن البحث على Google ؟"، ومن جملة هذا النصائح: تذكّر أنك لست وحيدًا، ومن الجيد أن تشعر بمثل هذا الشعور، فهذا يعني أنّك قد خرجت من منطقة الراحة. تمرّن، ثم تمرّن، ثم تمرّن. حاول البرمجة دون اللجوء إلى محرك البحث Google لمدة يوم واحد، ثم بعد جرب ذلك لمدة يومين، ثم بعدها لمدة أسبوع. انسخ اﻷنماط بدلًا من نسخ الشيفرة. انخرط في المجموعات التي تضمّ أشخاصًا يقاسمونك نفس الشعور تجاه البرمجة والتكنولوجيا وتنمية الذات. الدرس اﻷول: لا تقلق بشأن كونك مطوّرًا "حقيقيًّا" أم لا، وركزّ بدلًا من ذلك على التمرين، وانسخ نمط كتابة الشيفرة بدلًا من نسخ الشيفرة ذاتها، والخروج من أفكارك ومن منزلك أيضًا، للمشاركة في الملتقيات، والبحث عن اﻷشخاص الذين يقاسمون نفس الشعور تجاه التكنولوجيا وشؤونها. كيف تجد الوقت الكافي للبرمجة حين تمتلك وظيفة بدوام كامل وحياة مليئة بالمشاغل إيجاد الوقت الكافي للبرمجة من المشاكل التي تواجه الكثيرين ممن يعملون بوظائف ذات دوام كامل ويعيشون حياة مليئة بالمشاغل. إليك هذه المعلومة عن الوقت: لا تستطيع الحصول على الوقت، بل عليك صنعه. إن أفضل ما قرأته بخصوص صناعة الوقت اللازم لتعلم البرمجة هو ما كتبه J Wynia في Stack Exchange: وأرى أنّ تسجيل نشاطاتي اليومية بشكل دقيق ولمدة أسبوع أو أكثر تساعدني في تحديد الفترة التي يمكن من خلالها اقتطاع الوقت المطلوب. وهذا ينطبق تمامًا على جميع اﻷشخاص الذين شاركوني هذه التجربة. قد تستهلك مشاهدة التلفاز، ومتابعة الأخبار الرياضية، واﻷفلام، والنوم الزائد في نهاية اﻷسبوع، أو النوم الزائد خلال أيام اﻷسبوع، أو تنظيف منزلك أو جزّ العشب في حديقتك بدلًا من أن توكل هذه المهمة إلى أحد اﻷشخاص نيابة عنك مقابل أجر مادّي، قد يستهلك كل ذلك الكثير من الوقت والذي قد تعتبر أنه أكثر أهمية من المشاريع الشخصية. وقد توجّهت بهذا السؤال إلى عدد من اﻷشخاص الذين يتمتعون بنشاط كبير، وأصدقك القول بأنّي أشعر بتواضع كبير أمام التضحيات التي يقدّمها هؤلاء اﻷشخاص للحصول على ساعة أو أقل في اليوم. وفي بعض الأحيان قد تؤدي هذه التضحيات إلى إصابتهم بالضرر، فقد يحرمون أنفسهم من ممارسة التمارين الرياضية، أو يكون لديهم أصدقاء قلائل وعلاقات اجتماعية ضعيفة، أو … الخ. بالنسبة إلي، فإنّ السبب وراء إنتاجيتي المرتفعة سواء في تعلّم أشياء جديدة، أو العمل على مشاريعي الخاصة، يكمن في أنّي لا أشاهد التلفاز أو اﻷفلام دون أن أعمل على حاسوبي المحمول، وغالبًا ما أكتفي بالاستماع إلى التلفاز وقضاء الوقت في القراءة أو في كتابة الشيفرة." لقد أصاب J Wynia في كلامه هذا كبد الحقيقة لسببين: إن التعرف بشكل دقيق على النشاطات التي تستهلك وقتك (وذلك عن طريق تسجيل نشاطاتك اليومية لبضعة أيام) سيسهّل عليك إجراء التغييرات اللازمة للحصول على المزيد من الوقت الذي يمكن قضاؤه في تعلم البرمجة. قد تكون الاستعانة بالآخرين في إنجاز النشاطات، أو التوقف عن إنجازها، أمرًا ضروريًا إن كنت جادًّا في مسألة تعلم البرمجة. هنالك طرق أخرى يمكنك الاستعانة بها في صنع الوقت المطلوب: استيقظ قبل ساعتين من موعد استيقاظك اليومي، وستحصل بذلك على شهر كامل من الوقت المثمر خلال سنة كاملة. ﻻ تشاهد التلفاز بعد اﻵن. أقرّ بأنّني من مدمني خدمة Netflix، ولكن هل تعلم بأنّه يمكنك توفير يوم كامل و 22 ساعة ونصف بمجرد التخلص من اﻹعلانات. اكتب اسم الفيلم أو المسلسل المفضل لديك في هذا الموقع، لتكتشف مدّة العرض الحقيقية. توقف عن العمل بشكل مكثّف، واترك لنفسك متّسعًا من الوقت للقيام بأشياء أخرى في حياتك، مثل تعلم البرمجة. تشير Pam Selle أحد المنظمين لملتقى مطوّري Javascript في فيلادلفي إلى أن اﻷشخاص الذي يعملون كثيرًا لا يؤدّون عملهم بشكل أفضل، بل هم يؤدّونه بجودة أقل، أو سيشعرون باﻹرهاق؛ لذا، أدّ عملك، واذهب إلى المنزل، واصنع الوقت الذي تحتاجه للقيام بما ترغب به خارج العمل. الدرس الثاني: يجب أن تصنع الوقت اللازم لتعلم البرمجة، سواء أكان ذلك عن طريق التوقف عن مشاهدة التلفاز أو الاستيقاظ قبل ساعتين من موعد الاستيقاظ اليومي. كيف تستفيد من الوقت الذي صنعته بفعالية لا تكون المشكلة في بعض اﻷحيان مرتبطة بصناعة الوقت، بل باستخدامه بشكل فعّال. هل سمعت من قبل بمبدأ باريتو Pareto principle أو ما يعرف كذلك بمبدأ 80/20؟ يلخّص John Schnettgoecke هذا المبدأ بشكل رائع وكما يلي: فكرة هذا المبدأ هي كيفية الحصول على إنجازات كبيرة جدًّا في أقل فترة زمنية ممكنة، وذلك من خلال التركيز على النشاطات ذات الأثر الكبير، بدلًا من إجراء التعديلات البسيطة أو إعادة العمل مرارًا وتكرارًا توخّيًا للكمال. يقدم Joel Runyon شرحًا مفصّلًا ورائعًا عن هذا المفهوم في موقع Impossible HQ، حيث يعطي Joel أمثلة عملية عن طريقة عمل مبدأ 80/20 في أنظمة الحمية، واللياقة البدنية، والمشاريع التجارية، والدخل، والثروة. ويشدّد Joel على أهمية الخروج من دائرة البحث عن الكمال، وذلك بالتركيز على الوصول إلى فهم جيد، ثم الانتقال إلى الخطوة التالية، ولا يتم ذلك إلا بتجاوز التفاصيل الصغيرة. قد يكون هذا صعبًا عند تعلّم البرمجة، حيث يمكن لمشكلة تافهة أن تأخذ 45 دقيقة من وقتك لحلها وأنت لا تملك سوى 60 دقيقة لتعلم البرمجة في اليوم الواحد، ومع ذلك، حاول تذكّر هذا المبدأ ما أمكن ذلك. قد تشعر بأنّك لم تنجز شيئًا في هذه الدقائق الخمسة واﻷربعين، ولكن الواقع يقول عكس ذلك، ﻷنّك قد حصلت على خبرة لا تقدّر بثمن، لقد تعلّمت الصبر على حل المشاكل، وصقلت موهبتك عندما تمكّنت من تجاوز العقبات التي تقف في طريقك. إليك بعض النصائح التي يمكنك الاستفادة منها في استغلال وقتك بفعّالية أكبر: ابحث عن الساعات التي تكون فيها أكثر إنتاجًا، ولا تساوم عليها مهما حصل. على سبيل المثال، أنا أعلم أن إنتاجيتي تبلغ ذروتها في ساعات الصباح الباكر؛ لذا فإني أمتنع عن القيام بأي شيء سوى العمل على مشاريعي من الساعة السادسة وحتى الساعة الثامنة صباحًا من كل يوم. جرب استخدام تقنيات زيادة اﻹنتاجية لمعرفة ما يناسبك منها. يتحدّث Chris Winfield في إحدى مقالاته عن كيفية إنجازه لعمل يحتاج إلى40 ساعة في 16.7 ساعة فقط بالاستعانة بتقنية البومودورو. الدرس الثالث: اكتف بما هو جيّد ولا تبحث عن الكمال. ابحث عن الأوقات التي تبلغ فيها إنتاجيتك أوجها، وﻻ تساوم عليها مهما كلّف اﻷمر. جرّب استخدام تقنيات زيادة اﻹنتاجية واستفد من التقنيات التي تناسبك لبناء نظام عمل فعّال. كيف تتجاوز عقبة التحول من مرحلة تلقي المفاهيم ﻷول مرة إلى مرحلة فهم اﻷمور بسرعة وفعالية يرافق تعلم مهارة جديدة ـ خصوصًا إن كانت مهارة معقدة كتعلم البرمجة ـ صعوبة التحول من متعلّم مبتدئ للمفاهيم الجديدة والتي يتعرف عليها ﻷول مرة إلى مرحلة فهم اﻷمور بشكل سريع وفعّال. أعتقد أن أفضل من تكلّم في هذا الموضوع هو Erik Trautman وذلك في مقالته التي كتبها تحت عنوان "لماذا يكون تعلم البرمجة أمرًا صعبًا للغاية". يغطي المقال جميع المراحل التي يمرّ بها متعلّم البرمجة في رحلته هذه، بدءًا بـ "شهر العسل" حيث يكون اللقاء اﻷول، مرورًا بـ "تل الحيرة والالتباس" والذي تتلوه "صحراء القنوط واليأس" وما وراءها. يقدّم Erick في هذا المقال صورة دقيقة لما ستؤول إليه اﻷمور عندما تقرر تعلم البرمجة ذاتيًا. يمكن ﻷي شخص يتعلم البرمجة وفي أي مرحلة من المراحل أن يستفيد من قراءة هذا المقال، فمعرفة ما عليك توقعه سيساعدك في تجاوز العقبات بشكل أسرع. ما الذي يمكن أن يساعدك أيضًا في تجاوز هذه العقبة؟ حافظ على تركيزك تجاه تعلّم البرمجة وتطوير مهاراتك فيها، وﻻ تتوقف عن طرح اﻷسئلة. حفّز نفسك وكن إيجابيًا على الدوام، وذلك بالبحث والتقصّي عن الحلول، بدلًا من الركود والشعور بالإحباط وخيبة اﻷمل، حاول اكتشاف سبب حدوث المشكلة، وما الذي يمكنك القيام به لحلّها، وما هي الحلول الناجعة وغير الناجعة؟ يدعو Carol Dweck هذه المبادئ بمبادئ النمو، وقد بيّنت الدراسات أن اﻷشخاص الذي يمتلكون عقلية النمو (growth mindset)، يكونون أكثر تحفيزًا ويمتلكون ذاكرة أقوى ويحصلون على نتائج أفضل. وعلى الجانب اﻵخر تمامًا يقف أصحاب "العقليات الجامدة"، حيث يصبح الفشل هويتهم (أنا فاشل) بدلًا من أن يكون الفشل مجرّد فعل (أنا فشلت). إن تحول الفشل إلى هوية يجعل من تغيير حال اﻹنسان أمرًا صعبًا للغاية؛ ذلك ﻷنّه يصبح مقتنعًا بأنّه غير قادر على تغيير حاله على اﻹطلاق. لهذا؛ بدلًا من أن تؤطّر ذاتك وسعادتك في إطار هذه الهوية، ابذل ما في وسعك لتطوير فهمك للأمور وابذل كل ما في وُسعك لتحقيق ذلك، وحينها ستشعر بتحسّن كبير، وستتعلم بسرعة أكبر، وستحافظ على ما تعلّمته بشكل أفضل. الدرس الرابع: معرفة ما عليك توقعه سيساعدك في تجاوز العقبات بشكل أسرع. كن فضوليًّا ومحبًّا للاستطلاع، واطرح اﻷسئلة، وركّز على تحسين قدراتك وتطويرها. كيف تشعر بالرضا حول عملية تعلمك حتى ولو كانت بطيئة من هي الشخصية المفضّلة لديك والتي تمتلك قصّة نجاح سريع؟ بالنسبة إلي، إنّها Selena Soo. Selena خبيرة في بناء العلاقات والتواصل مع الأشخاص المؤثرين، وهذا أمر يجب على كل مستقلّ أو صاحب مشروع تجاري إتقانه، وسنتكلم عن هذا الموضوع ﻻحقًا. ولكن لماذا تعدّ Selena صاحبة قصّة النجاح السريع المفضّلة لدي؟ حقّقت Selena في عملها كمدربة لأصحاب المشاريع التجارية في عامها اﻷول مبلغًا يصل إلى 157 ألف دولار أمريكي بعد أن بدأت من الصفر. وقد تضمّن موقعها اﻹلكتروني منذ اليوم اﻷول لإطلاقه على شهادات تزكية من محررين في مجلات مثل O، و Oprah Magazine، و Forbes. وقد تلقت Selena العديد من اﻷسئلة، ومن ضمنها: "كيف فعلتِ ذلك؟ يبدو اﻷمر وكأنّكِ قد ظهرتِ من العدم، ليتحدّث عنكِ الجميع وبشكل مفاجئ". قد يكون التركيز على نجاح Selena السريع أمرًا سهلًا، ولكنّي أرغب بدلًا من ذلك في التفكير في جميع العوامل التي ساهمت في تحقيقها لهذا النجاح. أعني، جميع الخطط واﻷساليب التي تعلمتها وتمرّنت عليها ونفّذتها. جميع النشاطات المملة التي قامت بها، مثل الكتابة في اﻷيام التي لا تشعر فيها بأنّ لديها رغبة في الكتابة. التفكير في أنّها لم تحصل على 157 ألف دولار أمريكي في حسابها المصرفي بين ليلة وضحاها، بل أنّ ذلك كان ثمرة الجهود التي بذلتها خلال أسابيع، أو أشهر بل وربما سنوات خلت. أرى أنّه يجب علي التفكير بنجاح Selena بهذه الطريقة، ذلك ﻷنّي إن فكّرت فقط في أنّها حققت هذا النجاح بين ليلة وضحاها، فلن أبرح مكاني ولن أتقدّم إلى اﻹمام قيد أنملة. إن خرافة النّجاح ما بين عشية وضحاها تؤدي إلى تحوّل قصة النجاح المفاجئ إلى عامل تثبيط كبير جدًّا، وتنشّط كذلك اﻷفكار غير المنتجة مثل "لن أتمكن من تحقيق ذلك" و "لا أمتلك مقومات النجاح"، ويشعر المرء بأنّ هناك قوة تشدّه إلى اﻷسفل عندما يرى أن مسار التعلم قد أصبح بطيئًا. من وجهة نظري الشخصية، أرى أنّ عدم تعلّم البرمجة ليوم واحد لا يخرجك عن مسار التعلّم، إذ أنّه مجرد يوم واحد، ومن المؤكّد أنّك تحتاج إلى الراحة بين فترة وأخرى. لا بدّ أن Selena قد مرّت في بدايات مشروعها التجاري بأيّام لم تكن تعمل فيها على مشروعها مطلقًا، ولكنّها مع ذلك حقّقت نجاحًا كبيرًا. ولكن لا تسمح لهذه الاستراحة بأن تستمرّ لعدّة أيام متتالية. ﻻ تفقد الزخم الذي تتمتّع به، ففقدان الزخم يجعل العودة إلى العمل أمرًا صعبًا، ولكن لا ضير في أن تأخذ يومًا أو يومين كعطلة، فهذا لن يؤثّر بكل تأكيد على نجاحك المستقبلي في العمل الحرّ. وبخصوص ما إذا كنت تستوعب ما تتعلّمه في البرمجة بالسرعة الكافية أم لا، فيكفيك أن تستوعب والسرعة هنا ليست بذات أهمية. الدرس الخامس: لا تسمح لخرافة النّجاح السّريع بأن تسيطر عليك، واصل الحركة، واستمر في تطوير نفسك، واكسب المزيد من الزخم ولا تفقده على اﻹطلاق. كيف تعرف ما يجب التركيز عليه مع وجود كم هائل من المصادر التعليمية تتوفّر في أيامنا هذه الكثير والكثير من لغات البرمجة ومصادر تعلّمها بشكل ذاتي، وهذه الكثرة تؤدي في بعض اﻷحيان إلى الشعور بالارتباك، وتصبح عملية الاختيار صعبة للغاية. يلخّص Martin S. هذه الفكرة بشكل جميل فيقول: درس عالم النفس الأمريكي Barry Schwartz العلاقة بين الاختيارات والسعادة، وبشكل أدقّ، إلى أي مدى يمكن للاختيارات أن تؤثّر على سعادة اﻹنسان. وقد وجد بأنّ كثرة الاختيارات يدفع الناس إلى التشكيك في قراراتهم حتى قبل اتّخاذها، وقد يصابون نتيجة لذلك بالعجز عن اتخاذ القرارات إضافة إلى التوتر والإجهاد. ما هي اللغة التي ستختارها عندما تبدأ في تعلم البرمجة؟ هل ستختار روبي؟ بايثون؟ جافا سكربت؟ أم جافا؟ يلخّص Sean McCabe اﻹجابة بشكل جميل: اختر لغة ما واستمر في تعلمها، هكذا تختار ما تريد. وعندما تتّخذ قرارك بشأن نقطة البداية، تبقى أمامك مسألة اختيار المصادر التعليمية التي ستستفيد منها في تعلم اللغة؛ لذا أنصحك بزيارة قسم البرمجة على أكاديمية حسوب واختر أي لغة واشرع في تعلّمها. الدرس السادس: إن شعرت بالارتباك لكثرة الخيارات، اختر واحدًا والتزم به، وﻻ يكن اختيارك عشوائيًا بل بعد الاطلاع والبحث البعيدين عن المبالغة. اختر نقطة البداية وانطلق ولا تبق ثابتًا في مكانك. واصل قراءة الجزء الثاني من هنا: دليلك الشامل للتحضير للعمل كمستقل عندما تكون مبرمجًا تعلّم البرمجة بنفسه – الجزء الثاني ترجمة -وبتصرّف- للمقال The Ultimate Guide For Getting Freelance-Ready When You’re A Self-Taught Coder لصاحبته Joyce Akiko. حقوق الصورة البارزة: Designed by Freepik.
  17. على الرّغم من تواصلي المستمر لسنوات عديدة مع الكثير من العُملاء المستقلّين، إلا أنّني عندما غادرت Buffer مبكراً في بدايات سنة 2014، فإنّ تلك كانت المرّة الأولى لي في الاعتماد على هذا النوع من الدّخل غير الثابت لتحصيل المعيشة. لقد كان تحولا غير مسبوق بالنّسبة لي. بالرّغم من ذلك، وفي غضون السنوات القليلة الماضية، تعلّمت الكثير حول آليّة تطوير العلاقات مع العُملاء وأصحاب المشاريع وكيفيّة المحافظة عليها. إنَّ اختياري للعمل الحر كمصدر للدّخل، كان يعني قضائي لفترات طويلة ـأكثر من المتوقّع- بحثاً عن عمل. وفي اللّحظة التي كنت أشاهد فيها الصفقة مع أحد العملاء المُحتملين تبوء بالفشل، كنت أتساءل عن الطّريقة التي سأتمكّن فيها من تأمين الإيجار للشهر المقبل. وبما أنّي قضيت وقتًا طويلًا في التّعامل عن قرب مع الكثير من العملاء المُحتملين، فقد طوّرت نهجًا عمليًا ساعدني في بناء علاقات مميزة مع الكثير من الشركات التي أكنُّ لها كل الاحترام مثل شركتي Crew و Zapier. وعندما لا أتقيّد بهذا النّهج (كما سيظهر لكم من خلال المقال) عندها فقط أستطيع أن أُثبت لنفسي لماذا صمّمته منذ البداية. إنَّ إنشاء قواعد واضحة لعملي، ساعدني على وضع الخطوط الحمراء مبكرًا، والخروج من أيّ موقف غير مريح بالنّسبة لي. ولذلك أنصح بتطبيق هذا النّهج بشدة. سأقوم هنا بسرد خطوات الآلية Process –بشكلها الحالي– والتي وضَعتُ أسسها بعد سنوات من التجّربة، وسأشرح كذلك فعاليّة وفائدة كل خطوة من هذه الخطوات. كن واضحا حول طريقة العمل والتوقعات قبل البدء بأي مهمةإذا توجّب عليَّ اختزال هذه المقالة بأكملها في نصيحة واحدة أوجهها لكلِّ المستقلّين، فإنّها ستكوّن "أن لا يفترضوا شيئاً أبداً". لقد وقعت في الكثير من المتاعب من خلال الافتراض أنّني على توافق تامّ مع العملاء وأنّنا نفّهم بعضنا البعض، أو أنَّهم يدركون آليّة عملي مسبقاً دون أن أشرح لهم ذلك. من الصحيح أن سوء الفهم للتوقعات كان عادة ما يتم إصلاحه وإعادة توجيهه، إلا أنه بين الحين والآخر كان الافتراض الخاطئ هو ما يكشف لي -متأخراً- أن العلاقة مع أحد العملاء الجدد لن تستمر. وفيما يلي بعض التوقعات الرئيسية التي يجب توضيحها لكل عميل قبل البدء بتنفيذ أي عمل: إجراءات الدفع والرسومكن واضحًا حول السّعر المطلوب للمهمّة، وأرفق عرضك ببيانات تتضمّن الخدمات التي ستقدّمها وطريقة احتسابك لقيّمتها، وحدّد العملة التي تتعامل بها (أنا أعيش في أستراليا، ولكنّني عملت مع الكثير من العملاء المقيمين في أمريكا، والذين كانوا عادة ما يفترضون أننّي أتقاضى أتعابي بالدّولار الأمّريكي في حين أن الدّولار الذي أقصده هو الدولار الأسترالي). ومن الواجب عليك أيضا أن تسأل العملاء عن طريقة الدّفع الّتي يفضّلونها، سواءً كانت الدفع بمجرّد تسليم أو نشر العمل، أو الدّفع بشكل دوري حين يدفعون لباقي المُستقلّين الذين يتعاملون معهم. عملية الاستلام والتسليمبمجرّد البدء بمناقشة صلب العمل، قم بتحديد صيغة واضحة لشكل العمل المراد تسليمه (بالنّسبة لي فإن هذا يعني الاتّفاق على ما إذا كان العميل يفضل أن يستلم العمل على شكل ملفّ Markdown، أو أنّه سيقوّم بعمل حساب خاصّ بي على مدوّنته كي أقوم بإضافة المحتوى إليها بشكل مباشر). خطوات سير العملبالرّغم من أنَّ هذا قد يبدو مبالغاً فيه بعض الشّيء، إلّا أنّني أفضّل أن أشرح للعملاء الجدد الأسلوب الذي أتّبعه في العمل خطّوة بخطّوة تجنّبًا لحدوث أيّة مفاجئات أثناء القيام به، ويتضمّن ذلك متوسّط الوقت الذي يتطلّبه إنشاء محتوى جديد، وعمليّات البحث التي أقوّم بها، وكيفيّة العمل فيما بعد على إدّراج الصّور و تحسين ظهور المحتوى في محرّكات البحث (SEO)، ومن ثم القيام بعمليّة عدّ الكلمات. ما الذي يحدث عند عدم الالتزام بتحديد توقعات واضحةإنّ الافتراض بأنّك والعميل على توافق تام في الرؤية سيؤدي مستقبلًا إلى حدوث عدّة مشاكل، على سبيل المثال، ارتكبت خطأ خلال عملي مع عميل عندما ظننت أنّ المحتوى الذي كتبته سينشر باسمي ككاتب للمقال (لطالما رفضت بحزم أيّة عروض للقيام بالكتابة الخفيّة، وهذا ما جعلني أفترض خطأ بأنّ حدوث خلل أمر مستبعد) ، إنّ افتراضاتي المسبقة وضعتني في موقف محرج عندما أجّرى العميل تعديلاته المتعدّدة على العمل ونشره باسمه الشخصي. لقد كان هذا الموقف بمثابة إشارة تحذير كبيرة لي، فأنا أؤمن بأن سمعتي أو "علامتي التجارية الشخصيّة" هي ما يدفع العملاء لاختياري لأداء المهام في المقام الأوّل. لقد عملت لسنوات في بناء سمعتي وخبراتي الشخصيّة في مجال تسويق المحتوى حتى أتمكّن لاحقاً من الاعتماد على اسمي الشخصي كعامل مهمّ يدفع العملاء لتوظيفي. ومنذ ذلك الحين قمت بإضافة هذه النّقطة إلى "قائمة الأشياء التي يجب توضيحها للعملاء قبل البدء بالعمل"، وتطوّل هذه القائمة في كل مرة أواجه فيها حالة من الخلل أو سوء الفهم. ابدأ علاقتك مع العميل الجديد بفترة تجريبيةكما يحدث عند بداية أية علاقة، فإنّك تحتاج لأخذ الوقت الكافِ في التّعرّف على العميل الجديد، وقد تعلّمت من التّجربة بأنّ البدء بفترة تجريبيّة شيء أساسي. وبالرّغم من مرونتي في العمل، إلا أنّي عادة ما أقترح على العميل الجديد كتابة مقالين كتجربة. إنّ الفترة التجّريبيّة هي فرصة مناسبة لوضع الملاحظات مثل: ما هي المدّة التي يأخذها العميل للإجابة على استفساراتك؟هل توقعات العميل واضحة؟هل تستوعب استراتيجيات وأولويات العميل وتوافق عليها؟ما هي المدة التي يأخذها العمل ليتحول من فكرة إلى منتج نهائي جاهز للتسليم.كما أنّ الفترة التجّريبيّة تمنح العملاء الجدد فرصة للتعرف عن قرب إلى الطريقة الّتي أعمل بها. وما هو المحتوى الذي أعتبره ملائمًا، وما هي أولويّاتي عندما أقوّم بصنع المحتوى الجديد لجمهورهم. وفي حال حدث أيّ خلل أثناء العمل على المحتوى الأوّل فإنّه سيكوّن بالإمكان معالجته في المحتوى الثّاني، أمّا في حالات ظهور خطوط حمراء، أو عدم جاهزيّة أيّ من الفريقين لتقديم التّنازلات، فإنّه بالإمكان عندها إنهاء العلاقة بسهولة عند تلك النّقطة. أمّا في حال لم أكن متأكدة من إمكانيّة استمرار العلاقة بعد إتمام الفترة التجّريبيّة بينما كان العميل راض عنها، فإنه لا مشكلة بالنّسبة لي في تمديد الفترة إلى أن أقوم بإكمال تقييّمي للعلاقة وإمكانيّة استمرارها على المدى الطّويل. إن لكلّ عميل استراتيجياته وأهدافه وجمهوره الّذي يجب على المستقل التواؤم معه، وفي بعض الأحيان يكون هذا النّمط من التّوائم غير مريح بالمرّة بالنّسبة لي، ولذلك فإنّ الفترة التجّريبيّة تمنحني الفرصة لتقييم مدى توافق النّمط الّذي أعمل به مع متطلّبات العميل وتوقّعاته. كن واضحا وصريحا حول أية مشاكل تواجهكأحيانًا يمّكن للخلافات أن تحل. ولطالما شعرت بالراحة عندما كنّت أبدي قلقي حول أمّر ما وأجد العميل مستعدّا لمناقشتي بكل رحابة صدر حول إجراء التّغييرات على النّهج الخاص به أو على الطّريقة التي يسير بها العمل المتّفق عليه. إن الاضطرابات والإخفاقات عادة ما تكون نتيجة لسوء تفاهم بسيط، والتّعامل بصراحة ووضوح إزاء أية مخاوف تواجهني، أو لماذا أرى أنّ خيارًا بديلا سوف يعمل بشكل أفضل، بإمكانه أن يؤدّي في نهاية المطاف إلى نقاش مثمر لي وللعميل على حدّ سواء، وربما يفضي في النّهاية إلى إصلاح سوء الفهم الحاصل وبالتّالي إكمال العمل سويًّا. على سبيل المثال، عندما أصرّ أحد العملاء على إضافة كلمات مفتاحيّة لتحسين نتائج محرّكات البحث (SEO) إلى مقالتي، ولم تكن لتلك الكلمات أيّ علاقة بما كنّت قد كتبت عنه، أبديت له عدم ارتياحي التّام لما جرى، ومن خلال النّقاش مع العميل تم التّوصّل إلى حل وسط يرضي الطّرفين. ربّما كان باستطاعتي تجنّب حدوث هذا الموقف مجددا (غالباً بأن لا أعمل مع ذلك العميل مرة أخرى بما أن لنا توجّهات مختلفة)، ولكن بدلا عن الهروب من المشكلة، كنّت سعيدة بأنّنا توصّلنا إلى اتّفاق كان مرضيا لكلا الطّرفين. إظهار الاهتمام بالنجاحات المتبادلةالعلاقات هي عبارة عن طريق ذي اتّجاهين، وإنّ من أفضل العلاقات التي حظيت بها مع العملاء كانت تلك التي كان كلانا يود فيها رؤية الآخر يحقّق النّجاح. إنّ هذا هو أقل جانب ملموس في الآلية الخاصة بي، ولكنّني حين أحاول التّركيز على ذلك عند بدء التّعامل مع أحد العملاء الجدد، فإنّني عادة ما أجد هذا الاهتمام بالنّجاح المتبادل يظهر على شكلين رئيسيين : مشاركة المواردعندما أقوّم بكتابة محتوى أفخر به لأحد العملاء، فإنّني أضمنه في نشرتي الأسبوعيّة وأقوم بمشاركته لجمهور المتابعين لي على تويتر، لقد عملت لسنوات وحتّى هذه اللّحظة على بناء جمهوري الخاص بي، وعند العمل مع العملاء، فإن جمهوري هو من إحدى أهم الامتيازات التي يحصلون عليها طوال فترة عملي معهم. أقوم كذلك بإرسال دعوات التّرويج، أو تعريف العملاء على عدد من المحرِّرين العاملين في منشورات أخرى والّتي من الممكن أن تقوّم مستقبلاً بترويج المحتوى الخاص بهم (في حال كونه ملائماً). وعندما أقُوم بكتابة محتوى مثير للاهتمام لأحد العملاء الّذين يملكون استراتيجيات عظيمة واهتمام خاص بجمهورهم، فإنني أرغب في مساعدتهم على بناء ذلك الجمهور وجلب متابعين أكثر للاستفادة من ذلك المحتوى. وعلى الجانب الآخر، فقد تعاملت مع محرّرين قاموا بتزكيتي لعملاء آخرين، وقاموا كذلك بتقديمي إلى معارفهم عندما كنّت أحتاج مساعدتهم، وقد كان ذلك أحيانًا مقدّمة للتّعرّف على عميل جديد، أو على صديق لعميلي باستطاعته أن يساعدني بطريقة ما في العمل الخاص بي. إن معرفتي بأنّ عميلي يرغب في رؤيتي أتقدّم يشجعني أكثر على طلب المساعدة منه عندما أحتاجها. تبادل الخبراتعوضًا عن العمل كآلة للإيجار، أقوّم عادة بعرض خبراتي المتراكمة في تسويق المحتوى على العميل، والطّرق المختلفة التي قمت بتجربتها، وكيفيّة قيامي ببناء الجمهور الخاص بي وما إلى ذلك من خبرات وتجارب. وفي المقابل فإن أفضل العملاء الذين تعاملت معهم كانوا أولئك الّذين يشاركون تحليلاتهم لكي أستطيع الحصول على أفكار أفضل حول مدى فاعليّة المحتوى الذي أقدمه وتلاؤمه مع الجمهور المتابع لهم، وطرق صناعة محتوى جديد يساعدهم في التقدّم بشكل أفضل نحو تحقيق أهدافهم وتطلّعاتهم. إنّ هذه الخطوة تعتمد على "الحسّ الغريزي" بشكل أكبر من باقي الخطوات، فأنا لم أعمل قط مع عميل يعلن بشكل واضح عدم رغبته برؤيتي أتقدّم، ولكني بكل تأكيد أستطيع تمييز العميل الذي يود مشاهدتي أنجح. إن تلقّي الملاحظات البنّاءة الّتي تصب في صالح تحسين المحتوى العام الذي أقدّمه لطالما كان إشارة جيّدة في العلاقة بيني وبين العميل. فالمراجعات والملاحظات الإيجابيّة التي تصلني حول نتائج العمل الذي قدّمته للعملاء، يتم استثمارها لاحقًا، سواءً في الأعمال الّتي أقدّمها للعملاء، أو في الأعمال الخاصة بي. خاتمةخلال هذه الفترة أنا محظوظة بامتلاكي الفرصة لاختيار الأشخاص الذين أرغب بالعمل معهم، لذلك أفضل اختيار العملاء الذين يقومون بإنتاج محتوى أؤمن به، ويستهدف جمهورًا أستطيع التّوافق معه وتقديم قيمة حقيقة له. إنّ هذه العملية لا تقوم على أساس المقارنة بين العملاء وتصنيفهم إلى (جيد) أو (سيّء)، ولكنّها في الواقع اختيار للعميل الذي يوافق قيمي والنّهج الذي أسير عليه. إنّ هذه الآليّة ما تزال قيد الإنجاز وهي متغيّرة باستمرار، فإذا كنت مستقلًّا، أو تفكّر في أن تصبح كذلك، فأنا أشجعك على إنشاء آلية خاصة بك في أسرع وقت ممكن، ستتغير الآلية وتتبدّل مع مرور الوقت، ولكن ما أن تبدأ ببناء مرجعيّة صلبة لنفسك، فإنّه سيكون بإمكانك الاعتماد عليها لبناء قرارات حاسمة حول الأشخاص الذين تودّ العمل معهم. ترجمة ـوبتصرفـ للمقال: How to establish and maintain awesome client relationships لصاحبته : Belle Beth Cooper. حقوق الصورة البارزة: Designed by Freepik.
  18. عندما كنت عديم الخبرة اعتقدت أنّه لا فائدة ولا قيمة للخبرة، فقد قمت مع شريكي بتعليم أنفسنا كيفيّة تطوير تطبيقات الويب في غضون أشهر قليلة في الجامعة وطوّرنا النّسخة الأولى من Kiko بسرعة كبيرة. صمّمت الواجهة الأماميّة بنفسي وذلك بتجميع دروس جافاسكربت إلى أن تحصّلنا على شيء يشبه ما كنا نرغب فيه.. كنا نظن بأنّنا في منتهى الرّوعة والإبداع، فتمكّننا من بناء تطبيق يحظى باهتمام جمهور واسع دفعنا للاعتقاد أنّه يجدر بالجميع أن يباشروا مشاريعهم الخاصّة بمجرد تخرّجهم من الجامعة وأنّ كل شخص لا يشعر بالخوف من التّجربة لن تواجهه أيّة عقبات للانطلاق فما الذّي يمنعنا من البدء ونحن شباب. أكاد أشعر بالغثيان عندما أتذكّر أوّل برنامج طوّرته كما أشعر بالرّضا لعدم قدرتي على الوصول إلى شيفرته المصدرية حاليّا فأنا أرغب في إنكار أنّي كتبت ذاك التّطبيق من قبل. كانت الشيفرات البرمجيّة فوضويّة ورغم اعتقادنا أنّنا طوّرناه بسرعة إلا أنّنا في حقيقة الأمر استهلكنا أضعاف ما يحتاج مثل ذاك التّطبيق من الوقت. من المفارقات أنّه بعد بنائي لخبرة في هذا المجال صرت أعتقد أنّ امتلاك الخبرة والمرور بتجربة سابقة أمر لا يُقدّر بثمن فما الذّي جعلني أغيّر رأيي؟ تزيد الخبرة من سرعتك، لقد اتّضح أنّني لست مبرمجا رائعا ومع ذلك فأنّا مطوّر لا بأس به ويرجع هذا للخبرة. تحتاج إلى تطبيق Rails CRUD مع API؟ يُمكنني أن أبني بشكل سريع، فهذا ما أقوم به منذ سبع سنوات فلقد طوّرت كامل الـ Back-end والواجهة البرمجية لأحدث مشاريعي بنفسي في غضون ثلاث أسابيع فقط..تساعدك التّجربة على التّركيز على الأشياء المهمّة، عندما لا تعرف ما هو المهمّ فمن السّهل أن تعتقد أن كلّ قرارٍ مهم لكنّ معظمها ليس كذلك. امتلاكك الخبرة يؤهلّك لمعرفة ما هي القرارات الممكن تأجيلها، تجاهلها أو جعل أحدهم ينوب عنك لتنفيذها (كلّها تقريبا) ممّا يتيح لك الاهتمام بالأمور الضّروريّة.تمنحك الخبرة الثّقةَ، لقد حصلنا على استثمار من قبل لشركاتنا لذا أنا على يقين بقدرتنا على الحصول على استثمار آخر لمشروع آخر من جديد وبما أنّني بنيت تطبيقات الويب من قبل فأنا أعلم أنّني لست بحاجة لتوظيف مبرمج ليحلّ محلّي إلّا إذا وجدنا شخصا ممتازا حقا . في غضون ذلك، يمكنني الانتظار . عندما تنجز مهمّة من قبل فلن تقلق حيال قدرتك على إنجازها مرة أخرى.بالّرغم من كل هذا إلّا أنّني ما زلت أعتقد بوجود بعض الجوانب السّلبية المحتملة للخبرة والتي تستحقّ ذكرها: تميل الخبرة إلى عرقلة الابتكار، وربما سبق لك أن قرأت أو سمعت عن هذا الأمر، فعندما يكون لديك الكثير من الخبرة في مجال معيّن فإنّك تعتمد عموما على الحلول والأساليب التّي نجحت معك في الماضي. يمنعك هذا أحيانا من اتّخاذ نهج جديد سيحقّق في نهاية المطاف نجاحا على نحو أفضل من أساليبك المعتادة.يستغرق بناء الخبرة الكثير من الوقت وقد يتّخذ البعض انتظار حدوث ذلك ذريعة للتّسويق وعدم القيام بأي شيء، مما يفوّت عليهم فرصًا كثيرة.تقتنع بأنّ بعض الأشياء مستحيلة لكنّ أغلب الأشياء التّي ظننّاها مستحيلة أو غير عمليّة في السّابق صارت ممكنة الآن أو أنّها ستصبح كذلك لاحقا. تجربتك وخبرتك قد تدفعك للاعتقاد بعدم إمكانيّة وقابلية إنجاز أمر ما لكنّ آخرين سيأتون وينجزونه.في الأخير، كنت أتساءل إن كان من الممكن "تزوير" التّجربة عن طريق الحصول على المشورة خصوصا في مجالات متخصّصة للغاية مثل كيفيّة جعلك موقعك يتحمّل زيارات ملايين المُستخدمين. ومع ذلك أعتقد بأن هناك أمورًا كثيرًا يجب علينا أن نتعلّمها بصعوبة وبمشقّة، وعليه لا تقلق حيال إيجاد طرق مُختصرة للوصول إلى الخبرة المنشودة. ترجمة -وبتصرّف- للمقال: What good is experience? لصاحبه Justin Kan. حقوق الصورة البارزة: Designed by Freepik.
  19. تُتيح لنا مناقشة وجهات النّظر القدرة على رؤية العالم من خلال أعين الآخرين ومعرفة آرائهم تجاه الأشياء، وهي المهارة الأساسية التي يجب أن نتحلى بها، كما أنّها تساعدنا على إنشاء علاقة ناجحة مع الزّبون وهذا يمكّننا من معرفة احتياجاته، رأيه تجاه خدماتنا ومنتجاتنا، وأيضاً معرفة ماذا نستطيع أن نقدّم للزّبون لكي نجعله سعيدًا، وهذا كلُّه يحدث من خلال فهم وجهة نظر الآخرين. نشر Jason Fried (وهو المؤسس والرئيس التنفيذي لشركة Basecamp) تغريدة، يقول فيها: هذه كانت تجربة Jason في مناقشة ومعرفة وجهات نظر العملاء، كان جاسون يظن أنّ استخدام المُنتج الذي يقدّمها سهل للغاية، بينما من وجهة نظر العميل فإنّها بعيدة كلّ البعد عن السّهولة والبساطة. عندما يرى الناس أنّ زبونا ما يجد صعوبة باستخدام السّلعة أو الخدمة المقدّمة إليه فإنهم عادةً ما يقولون: "يا له من زبون، إنه لا يَقدِر على أبسط الأمور" أو يقولون: "هنالك خلل ما في هذا الزّبون"، ردّة الفعل هذه تجاه الزّبائن تنتابنا جميعًا وتبقينا بعيدين عن فهْم وجهات نظرهم، وهذا من شأنه أن يؤثّر سلبًا على إيصالنا للسّلعة أو الخدمة كما يرغب بها الزّبون . نحن نتصرف كالأطفال تماما عند تجاهل آراء الآخرينتتشكل لدينا القدرة على تقبّل وجهات نظر الآخرين في مراحل مبكرة من مراحل الطّفولة، إذا تتبّعنا كيفيّة تطوّر مهارة مناقشة وجهات النّظر المختلفة عند الأطفال، يمكننا ملاحظة احتمالين موجودين عند البالغين، هما الانغلاق والتّنكر للآراء الأخرى، أو تقبّل اختلاف الرّأي. أجريت عالمتا النّفس Betty Repacholi وAlison Gopnik من جامعة Berkeley دراسة على الأطفال البالغين من العمر 14 شهرا و18 شهراً، تمّ وضع الأطفال أمام وعائي طعام، الأوّل يحوي مقرمشات على شكل أسماك ذهبيّة، والآخر يحتوي على خضار البروكلي، قام الأطفال بتناول الطّعام من الوعائيْن وجميعهم أعجبتهم المقرمشات أكثر من البروكلي، شاهد الأطفال فيما بعد الباحثة وهي تتناول كلا الطعامين وقد أظهرت اشمئزازًا عند تناولها للمقرمشات، بينما أظهرت الاستمتاع بطعم البروكلي، ثم قامت الباحثة بإزالة يديها عن الوعائين وطلبت من الأطفال إعطائها بعض الطعام، وقد أتاحت للأطفال فرصة الاختيار بين البروكلي والمقرمشات، فماذا اختار الأطفال؟. معظم الأطفال الذين تقارب أعمارهم من 14 شهراً وبنسبة 87%، قدّموا للباحثة ما أحبّوه من طعام، المقرمشات الذهبية، لم يستطيعوا استيعاب أنّ الباحثة لها اختياراتها التي تختلف عن اختيارهم ، بينما قام معظم الأطفال الذين تقارب أعمارهم من 16 شهراً وبنسبة 69% بتقديم البروكلي للباحثة، هؤلاء استطاعوا إدراك أنّ الباحثة أحبّت البروكلي ولم تحبب ما اختاروه هم. قد يستمرّ سلوك الأطفال ذوو ال 14 شهراً ويبقى إلى ما بعد البلوغ، ويتمثّل ذلك بتركيزك فقط على وجهة نظرك أنت وتجاهلك لردّة فعل الآخرين تجاه الأفكار، السّلع، والخدمات التي تقدّمها، ستبقى بعيدًا عن آراء الآخرين، وهذا سيجعلك تعطي المقرمشات الذهبية للأشخاص الذين يحبون البروكلي. ببساطة، لن ترى ولن تعلم ما يريده الآخرون منك، وعلى نقيض ذلك تمامًا، يستمر سلوك الأطفال ذوي الـ18 شهرًا ويبقى إذا استمعتَ إلى آراء الآخرين وخرجت من دائرة الانطواء، إذا انتبهتَ لردودهم وسلوكيّاتهم تجاه عملك أو أيّ شيءٍ آخر تقدّمه لهم، إذا أبقيْتَ رغباتكَ الخاصّة في نفسك وحافظتَ على رغباتهم التي يريدونها. مركز دعم العملاء هو المكان الذي تتعرف فيه على آرائهمعندما أتجاهل وجهة نظر الآخر، أتصرّف وكأنّني أقول "أنا معزول في فقاعة"، الفقاعة تجعلني في معزل عن العالم الخارجيّ، وأعلم أنّني عندما أريد معرفة رأي شخص آخر سأحتاج إلى الخروج من الفقاعة، بإمكانيَ الخروج من هذه الفقاعة عن طريق خَلْق إمكانيّات الحصول على التغذية الرّاجعة من العملاء الذين أقدّم لهم الخدمة، ويكون ذلك بمراقبة انطباعاتهم تجاه الخدمات التي قدمتها لهم وسؤالهم عنها كلّ منهم على حدى. بإمكان الشّركات تنفيذ ذلك بوسائل عديدة منها مراقبة العميل أثناء تجربة السّلعة أو الخدمة، طلَب التّغذية الراجعة من خلال المسوحات والاستبيانات المقدّمة للعملاء والتّحدث مع العميل بشكلٍ مباشر، يُعتبر الحوار المباشر مع العميل وسيلة ممتازة جدًّا لمعرفة وجهات النّظر المختلفة، وتستخدم الشّركات مثل Basecamp وKayak مركزَ دعم العملاء لهذا الغرض. يعمل جميع موظفو شركة Basecamp في مركز دعم العملاء بشكل دوريّ، ويطلقون على ذلك اسم "الجميع يقدّم الدّعم" (EOS Everyone on support)، وهذا يساعد فريق العمل بأكمله على معرفة نظرة الزّبون للمنتَج بشكل أفضل، نشر أحد الموظفين في شركة Basecamp واسمه نايثن، وهو عضو ضمن الفريق التّنفيذيّ للشّركة، نشرَ نظرته لنظام EOS على إحدى مدونات الشركة الإلكترونية وتحدث عن فائدة نظام EOS له وللفريق الإداري: كذلك المصممون والمبرمجون الذين يستمعون إلى آراء العملاء ضمن نظام EOS يتعاملون بشكل أسرع مع المسائل التّقنية لأنّ معرفة الآراء تُسرّع وتحفزّ على العمل. هذا ما نشرته الموظفة إيميلي في شركة Basecamp على نفس المدونة الإلكترونية: قام المدير التنفيذي في شركة Kayak واسمه Paul English بدعم تواصل العملاء مع مهندسي الشّركة عن طريق أخذ آراء واقتراحات العملاء في الشركة، هذا يتيح للموظّفين التّقنيّين الحصول على آراء المستخدمين بشكل مباشر ويحفّز العاملين على إصلاح جميع المشاكل المتعلّقة في التّطبيق،وَضّح أهمية ذلك للشركة ولعملائها في إحدى المقابلات معه، حيث قال: بغضّ النّظر عن طبيعة عملك أو أي قسم تعمل فيه، إن القيام بدعم العملاء يجعلك قادرًا على جلْب المزيد من الآراء لعملك، وقد تتفاجأ بالاقتراحات والرؤى المثيرة التي ستحصل عليها من الزّبائن عندما تجعل الاستماع إليهم بشكل مباشرٍ عادةً من عادات العمل لديك. لا تتجاهل وجهات نظر غيركجميعنا نملك مهارة الاستماع لغيرنا ومعرفة آرائهم، لكننا ننسى أحيانًا استخدام هذه المهارة فحسب، من السهل أن نبقى داخل إطار تفكيرنا الشّخصي، منعزلين عن أفكار الآخرين لأننا لا نرى سوى آرائنا في معظم الأوقات، لكن إذا قمنا بتنحية أفكارنا الخاصّة قليلا، ونظرنا إلى آراء الزبائن، قد نكتشف أن هنالك من يحبّ البروكلي أكثر من المقرمشات الذهبية، عندها ندرك أن لكلٍّ ذوقه وحينها فقط نستطيع أن نقدّم لهم ما يحبون فعلاً. ترجمة -وبتصرّف- للمقال Do you take your customers’ perspective لصاحبته Anna Tomalik. حقوق الصورة البارزة: Designed by Freepik.
×
×
  • أضف...