محمد طاهر الموسوي

المساهمون
  • المساهمات

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

  • تاريخ آخر زيارة

السُّمعة بالموقع

77 Excellent

المعلومات الشخصية

  • النبذة الشخصية كيميائي ومصمم ومترجم عراقيّ، أهوى الخطّ العربي، وأعشق كذلك البرمجة وأحاول دائمًا تطوير مهاراتي فيها.

8 متابعين

آخر الزُوّار

2,053 زيارة للملف الشّخصي
  1. كمؤسس لشركة ناشئة من الطبيعي أن تبدأ بالبحث عن الوسائل التي تساعدك في نشر علامتك التجارية على أوسع نطاق ممكن، وأن تتوخى الأساليب التي تجلب لشركتك المزيد من الأرباح. إلا أنّ جذب اهتمام العملاء المحتملين يزداد صعوبة يومًا بعد آخر، نظرًا لتزايد مصادر الإلهاء والتشتيت، ومع ذلك فقد برزت في الآونة الأخيرة ظاهرة حملات التسويق عبر الفيديو والتي يتفاعل أصحاب الشركات الناشئة من خلالها مع جمهورهم بأسلوب فريد، يجذب الانتباه، ويحقق الهدف الرئيسي من استخدامها، ألا وهو الوصول إلى المستوى المطلوب من المبيعات. وهذا يعني أنّ عليك القيام بالأمر ذاته إن كنت ترغب في أن تحتل شركتك الناشئة موقع الصدارة بين المنافسين، إلى جانب أنّ استخدام مقاطع الفيديو في عملية التسويق يعدّ وسيلة ممتازة لتثقيف جمهورك وإسعاده ولإثبات خبرتك في السوق الذي تروّج فيه لمنتجاتك وخدماتك، ولكنّ عليك في البداية أن تتعلم كيفية إنشاء مقاطع الفيديو ونشرها بصورة صحيحة إن كنت ترغب في الحصول على أفضل نتيجة ممكنة، وعليك أن تختبر طرقًا ووسائل مختلفة لتتعرّف على الطريقة المثلى والتي تناسب طبيعة مشروعك التجاري، وستساعد النصائح التالية في هذا الشأن. قدّم شيئًا مفيدًا عندما تطلق حملتك التسويقية عبر الفيديو، يجب أن يكون هدفك الأول والأهم تقديم شيءٍ مفيدٍ لجمهورك، ويمكن أن تتمثّل الفائدة في تقديم المتعة أو المعرفة أو بعض النصائح والحيل التي تساعد الناس في حلّ مشاكلهم اليومية. ولكن إن كان هدفك الرئيسي من استخدام الفيديو هو حثّ الناس على شراء منتجاتك فحسب، فإنّك بعملك هذا ستتسبّب في نفور نسبة كبيرة من العملاء المحتملين، لذا عليك بتقديم شيء مفيد لتنال ثقة الناس واحترامهم. استخدم خلفية طبيعية لا يدرك الكثير من المسوقين الأهمّية الكبيرة لخلفية مقطع الفيديو على المشاهدين. فللحصول على أفضل النتائج حاول استخدام خلفيات طبيعية قدر الإمكان، كذلك تجنب استخدام خلفيات تتضمن الكثير من الحركة، لأنّ ذلك سيكون سببًا في تشتيت انتباه المشاهد عن الرسالة التي تودّ إيصالها إليه. استخدم التسميات التوضيحية Captions بداية يجب توضيح أمر: المقصود بـ "التسميات التوضيحية" هو توفير ما يُقال في الفيديو على هيئة نصّ (مثلما توفّر التّرجمات للفيديوهات، لكن المقصود هنا هو توفير النّصوص بنفس اللغة المُستخدمة في الفيديو). قد لا يتابع المشاهدون مقاطع الفيديو التي تقوم بنشرها مع وجود الصوت، لذا فمن الضروري إضافة التسميات التوضيحية إلى مقطع الفيديو الذي تنشره، كذلك استخدم تسميات توضيحية بلغات مختلفة لتتمكن من إيصال رسالتك إلى مختلف أنحاء العالم. إن واجهت صعوبة في بداية الأمر يمكنك الاستعانة بخدمات الترجمات المصاحبة المختلفة. يمكنك أيضًا الاستفادة من التسميات التوضيحية في تسليط الضوء على النقاط الرئيسية في مقاطع الفيديو وذلك لتسهّل على جمهورك أخذ الملاحظات المهمة، ولكن عليك الانتباه إلى ضبط توقيت ظهور التسميات التوضيحية مع المحتوى المعروض في الفيديو لكي لا تصيب المشاهدين بالحيرة. تهيئة محركات البحث للفيديو صحيح أنّ نتائج عملية تهيئة محركات البحث SEO الاعتيادية قد لا تظهر إلا بعد أسابيع أو أشهر، إلا أن عملية التهيئة هذه تكون أسرع عندما يتعلّق الأمر بمقاطع الفيديو. ولكن عليك في البداية تحديد الكلمات المفتاحية التي ترتبط بشكل وثيق بالمنتج الذي تقدّمه، وذلك للحصول على أفضل نتيجة بحث ممكنة. بعدها، ركّز على المحتوى الذي يرتبط بهذه الكلمات وضعها في عنوان المقطع، وبعد الانتهاء من تحضير مقطع الفيديو، ارفعه إلى مواقع التواصل الاجتماعية المتنوعة. قد تجد نفسك مضطرًّا بادئ الأمر إلى الترويج عن المقاطع التي تنشرها بنفسك، ولكن ستبدأ الأمور بالتحسن شيئًا فشيئًا وسيرتفع عداد المشاهدات بمجرد أن يبدأ المشاهدون بالتفاعل بشكل أكبر مع المحتوى الذي تقدّمه. الدعوة إلى الإجراء يجب أن يتضمن أي مقطع فيديو تعمل على إنتاجه هدفًا أساسيًا، وهو التأثير في الناس لاتخاذ الإجراء، فعلى سبيل المثال، إن كنت تقدّم مقطع فيديو يخصّ المبيعات، فحاول دائمًا تشجيع الجمهور على شراء منتجك أو الخدمة التي تقدّمها شركتك. وإن كان مقطع الفيديو تثقيفيًا، فيجب عليك حينها أن تحث المشاهدين على الاشتراك في صفحاتك على مواقع التواصل الاجتماعي أو الاشتراك في قائمتك البريدية. ويمكنك التواصل بشكل مستمر مع العملاء المحتملين وبناء علاقات وطيدة معهم عندما تتمكن من دفعهم إلى التسجيل في موقعك الإلكتروني، الأمر الذي سيزيد من احتمالية شرائهم للمنتج. ختامًا يمكن لحملة تسويقية عبر الفيديو أن ترفع من مستوى مشروعك التجاري وتطوّره، كما يمكنك جذب انتباه جمهورك نحو علامتك التجارية كما لم تفعل من قبل، وعلى الرغم من أن تقديم المواضيع النافعة والمفيدة يلعب دورًا أساسيًا في نجاح الحملة، ولكن هذا لا يعني على الإطلاق أن تمتنع عن حثّ المشاهدين على شراء منتجاتك أو الاشتراك في قائمتك البريدية. وعندما ترفع مقاطع الفيديو الخاصة بك إلى مواقع التواصل الاجتماعي، تذكّر دائمًا الكلمات المفتاحية الخاصة بعملية تحسين محركات البحث، وستستفيد حينها من منافع هذه العملية. صحيح أنّك لن تحصل على نتائج باهرة بين ليلة وضحاها، ولكن المثابرة والمداومة في نشر مقاطع الفيديو المفيدة سيعود عليك بنتائج مذهلة. ترجمة - وبتصرّف - للمقال Video Campaigns for Start-Ups: 5 Secrets to Get Your Brand Noticed and Your Revenue Up لصاحبته Jennifer Livingston
  2. العروض والقوالب في Django - الجزء الثاني

    تعرّفنا في الدرس السابق على القسمين الثاني والثالث من بنية المشاريع في إطار العمل Django وهما العروض Views والقوالب Templates، وقد تحدّثنا عن العروض وآلية عملها بشكل مفصّل، وسنتطرّق في هذا الدرس بشيء من التفصيل إلى القوالب وآلية عملها وسنتعرّف كذلك على محرّك القوالب الخاص بـ Django. ما هي القوالب؟ نظرًا لكون Django إطار عمل للويب فإنّه بحاجة إلى وسيلة لتوليد شيفرات HTML بصورة ديناميكية، ويستخدم Django القوالب لهذا الغرض، إذ يحتوي القالب على أجزاء ثابتة تضم شيفرة HTML وCSS إضافة إلى صيغة برمجية خاصة تتحكم في طريقة إضافة المحتوى الديناميكي إلى القالب تسمى لغة قوالب Django (DTL). قالب Django عبارة عن ملف نصي يستخدم لغة قوالب Django، ويتضمن هذا الملف بعض الأمور التي يتم تفسيرها من قبل محرك القوالب، وأهمّها المتغيرات واﻷوسمة. ﻻ بدّ أنّك قد لاحظت أنّه في كلّ مرة أجرينا فيها عملية ربط القالب، فقد قمنا بتعريف سياق المتغيرات Variable Context معه. يقوم Django بتصيير Rendering القالب مع السياق المرتبط به، حيث يتم استبدال أسماء المتغيرات بالقيم المرتبطة بها وذلك بعد مطابقتها مع سياق المتغيرات المرفق مع القالب، ويتم كذلك تنفيذ الوسوم الموجودة في ملف القالب، أما ما تبقى في هذا الملف فيظهر كما هو. المتغيرات يعرض المتغير القيمة المرتبطة به عن طريق السياق، وهو قاموس يضم مجموعة من المفاتيح والقيم المرتبطة بها. لاستخدام المتغيرات في قوالب Django يكفي إحاطتها بقوسين معقوفين بالشكل التالي: My first name is {{ first_name }}. My last name is {{ last_name }}. فلو كان سياق المتغيرات بالشكل التالي: {'first_name: 'Mohammed', 'last_name': 'Taher'} تكون النتيجة: My first name is Mohammed. My last name is Taher. الوسوم تؤدي الوسوم مهام متعدّدة ومتنوعة، فيمكن للوسم أن يعرض محتوى معين، أو يؤدي وظيفة بنى التحكم كجمل If الشرطية وحلقات for التكرارية، أو جلب محتوى من قاعدة البيانات، وغير ذلك الكثير. تحاط الوسوم في القوالب بقوس معقوف وعلامة النسبة المئوية، كما في المثال التالي: {% csrf_token %} ومعظمها يتقبل المعاملات: {% cycle 'odd' 'even' %} وتتطلب بعض الوسوم تحديد وسم البداية والنهاية: {% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %} لنلقِ نظرة اﻵن على أشيع الوسوم المستخدمة في لغة قوالب Django: الجمل الشرطية يتحقّق الوسم {% if %} من قيمة المتغير، فإذا كانت القيمة صحيحة (بمعنى أنّ المتغير موجود، وليس فارغًا، ولا يحمل قيمة false) يتم عرض محتوى المتغير: {% if article_list %} Number of articles: {{article_list|length}} {% elif article_in_archive %} The Articels are in Archive. {% else %} No articles. {% endif %} ﻻحظ أنّه يمكن استخدام وسمي {% elif %} و {% else %} لمرة واحدة أو لعدة مرات ضمن الوسم If، وﻻحظ أيضًا أن هذا الوسم يتطلب وجود وسم إغلاق. يمكن استعمال المعاملات المنطقية (and, or, not) في الوسم If، كما يمكن استخدام المعاملات الرياضية (==, !=, <, >, <=, >=, in)، إضافة إلى إمكانية دمج هذه المعاملات مع بعضها البعض، إليك بعض اﻷمثلة: {% if athlete_list and coach_list %} Both athletes and coaches are available. {% endif %} {% if athlete_list and not coach_list %} There are some athletes and absolutely no coaches. {% endif %} {% if athlete_list and coach_list or cheerleader_list %} There are some athelets and maybe some coaches or cheerleaders. {% endif %} {% if somevar == "x" %} This appears if variable somevar equals the string "x" {% endif %} {% if "bc" in "abcdef" %} This appears since "bc" is a substring of "abcdef" {% endif %} {% if user in users %} If users is a QuerySet, this will appear if user is an instance that belongs to the QuerySet. {% endif %} حلقة for التكرارية يؤدي هذا الوسم نفس الوظيفة التي تؤديها أي حلقة for في أي لغة برمجية، إليك هذا المثال: <ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul> يمكن المرور على عناصر مصفوفة معينة وبصورة عكسية بإضافة كلمة reversed: {% for obj in list reversed %} ويمكن إظهار عناصر قائمة معينة بالشكل التالي: {% for x, y in points %} There is a point at {{ x }},{{ y }} {% endfor %} ويمكن استخدام هذا الوسم للعرض المفاتيح والقيم المرتبطة بها في قاموس معين: {% for key, value in data.items %} {{ key }}: {{ value }} {% endfor %} يمكن الوصول إلى عداد الحلقة التكرارية بأساليب مختلفة، وذلك عن طريق مجموعة من المتغيرات يقدّمها محرّك القوالب في Django. فمثلًا forloop.counter يظهر العدد الحالي للحلقة ويبدأ عدّ الحلقات من الرقم 1، و forloop.counter0 الذي يؤدي نفس الوظيفة ولكن يبدأ العدّ من الرقم 0، و forloop.first والذي يعطي قيمة True إن كانت الدورة الحالية هي الدورة اﻷولى ضمن الحلقة، وforloop.last والذي يؤدي نفس الوظيفة ولكن عند الوصول إلى الدورة اﻷخيرة ضمن الحلقة. إليك هذا المثال لتوضيح الموضوع: {% for photo in gallery %} {% if forloop.counter == 1 %} Do something with {{ photo }}. {% endif %} {% endfor %} تبدأ حلقة for بالمرور على عناصر مجموعة معرض الصور gallery ويتحقق وسم if أثناء ذلك من العدد الحالي للحلقة، فإن كانت الحلقة هي اﻷولى يتم تنفيذ الشرط، وإلا فلا. الشيفرة السابقة مطابقة للشيفرة التالية: {% for photo in gallery %} {% if forloop.first %} Do something with {{ photo }}. {% endif %} {% endfor %} تقدّم لغة قوالب Django عددًا كبيرًا من الأوسمة التي تؤدي وظائف متعددة ومتنوعة، ويمكنك الاطلاع على جميع الوسوم المتوفرة ووظائفها من هنا. المرشحات Filters تعمل المرشّحات على إجراء تحويل معيّن على قيم المتغيرات والأوسمة، وتستخدم بالشكل التالي: {{ hsoub|title }} {% if messages|length >= 100 %} You hove lots of messages. {% endif %} يعمل المرشح title على تحويل الحرف اﻷول من كل كلمة في قيمة المتغير إلى حرف كبير، فلو كان السياق معرفًا بالشكل التالي: {'hsoub': 'on a mission to develop the arab world'} فإن الحرف اﻷول من كل كلمة في العبارة السابقة سيتحول إلى حرف كبير: On A Mission To Develop The Arab World يمكن لبعض المرشحات أن تتقبل المعاملات: {{ my_date|date:"Y-m-d" }} يقدم محرّك قوالب Django عددًا كبيرًا من المرشحات التي تؤدي وظائف مختلفة، كتنسيق الوقت والتاريخ، وعرض الجمل المناسبة لصيغتي المفرد والجمع، وتكبير اﻷحرف اﻹنكليزية وتصغيرها، وحساب عدد الكلمات وغيرها الكثير. يمكنك الاطلاع جميع المرشحات المتوفرة ووظائفها من هنا. استخدام محرّك القوالب في تطبيق الاقتراعات لنعد اﻵن إلى تطبيق الاقتراعات الذي نعمل على إنشائه ضمن هذه السلسلة، ولنتوجه إلى ملف templates/polls/index.html الذي يحتوي الشيفرة التالية: {% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>الاقتراعات غير متوفرة حالياً.</p> {% endif %} ﻻحظ أنّنا نستخدم في هذا الملف عددًا من المتغيرات واﻷوسمة، إذ يبدأ الملف بوسم If يتحقق من قيمة المتغير latest_question_list الموجود في سياق المتغيرات المرفق مع القالب، فإن كانت نتيجة التحقق صحيحة، يضاف وسم <ul> إلى الملف ثم تبدأ حلقة for بالعمل، حيث تمرّ على جميع عناصر القائمة latest_question_list وإسناد كل قيمة إلى المتغير question. ﻻحظ أن هذا المتغير يضمّ متغيرات فرعية (إن صح التعبير) تحمل قيمًا مختلفة، مثل question.id و question.question_text. تقوم بالحلقة بسرد عناصر القائمة مع إضافة وسمي <li> و <a> إلى كل عنصر، وبعد الانتهاء يضاف الوسم </ul>. استخدمنا الوسم else لعرض رسالة تخبر المستخدم بعدم وجود أي اقتراعات في الوقت الحاضر في حال كانت نتيجة التحقق خاطئة. توجّه اﻵن إلى الملف detail.html وعدّله ليصبح بالشكل التالي: <h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li> {% endfor %} </ul> ستعمل الشيفرة السابقة على عرض اﻷجوبة المرتبطة بالسؤال الذي اختاره المستخدم على هيئة قائمة نقطية. توليد الروابط بصورة ديناميكية هناك مشكلة صغيرة في قالب index.html وهي أننا قمنا بكتابة مسار الرابط بأنفسنا، ولم يتم توليد هذا المسار ديناميكيًا، اﻷمر الذي يجعل من تبديل المسار في وقت لاحق أمرًا صعبًا خصوصًا إن تضمن القالب مسارات عديدة. يمكن لـ Django أن يتكفل بعملية توليد مسارات الروابط بشكل كامل، وذلك باستخدام الوسم {% url %} ليصبح الملف index.html بالشكل التالي: {% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>الاقتراعات غير متوفرة حالياً.</p> {% endif %} ولكن كيف يتعرّف Django على المسار المطلوب؟ يستخدم Django قيمة المعامل name الذي قمنا بتعريفه في الدرس الرابع من هذه السلسلة (المسارات في Django). توجّه إلى ملف polls/urls.py والق نظرة على المسار الخاص بعرض detail: url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail') ﻻحظ أن هذا المسار يحمل اسمًا خاصًّا به، وقد عرّفناه من خلاله المعامل name. بهذه الطريقة يتعرّف Django على المسار المطلوب استخدامه في القوالب. واﻵن إن كنت ترغب في تغيير المسار المرتبط بهذا العرض إلى مسار آخر، وليكن polls/specifics/12/ على سبيل المثال، فيمكن تعديله ضمن ملف polls/urls.py بدلًا من تعديل المسار في القالب أو القوالب التي تم استخدامه فيها: url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'), استخدام نطاقات اﻷسماء للتمييز بين المسارات يتضمن مشروعنا هذا تطبيقًا واحدًا فقط وهو تطبيق الاقتراعات، ولكن المشاريع الحقيقية تتضمن عددًا كبيرًا من التطبيقات، فكيف يمكن لـ Django إذًا أن يميز بين أسماء المسارات في هذه الحالة؟ على سبيل المثال، يحتوي تطبيق الاقتراعات على عرض باسم detail، وقد يحتوي المشروع على تطبيق مدونة يتضمن عرضًا باسم detail أيضًا، فكيف يمكن لـ Django أن يتعرف على المسار المطلوب عند استخدام الوسم url في ملف القالب؟ اﻹجابة هي نطاقات اﻷسماء Namespaces. توجه إلى الملف polls/urls.py وأضف اسم التطبيق في بداية قائمة أنماط المسارات، ليصبح الملف بالصورة التالية: from django.conf.urls import url from . import views app_name = 'polls' urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ] واﻵن عدّل العبارة التالية في القالب polls/index.html: <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li> لتصبح بالشكل التالي: <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li> ختامًا لا زالت هناك بعض اﻷمور اﻷساسية التي تنقص تطبيق الاقتراعات، فصفحات التطبيق غير منسّقة، كما أنّه لا يوفّر للمستخدم طريقة واضحة للتصويت على الاقتراعات. في الدرس القادم سنتعرّف على كيفية التعامل مع النماذج Forms بصورة مبسطة لتهيئة آلية التصويت على الاقتراعات، وسنتعرف كذلك على العروض العامة Generic views وسنرى كيف يمكن لهذه العروض أن تختصر الوقت والجهد. بعد ذلك سنقوم بإضافة التنسيقات الخاصة بتطبيق الاقتراعات بواسطة CSS وسنتعرف على مفهوم الملفات الساكنة Static Files في Django. المصدر: توثيقات Django
  3. تشكّل فكرة الاحتفاظ بفريق العمل والتمسّك به هاجسًا كبيرًا بالنسبة لرواد الأعمال والمؤسسين والمدراء التنفيذين على حدّ سواء، ويظهر هذا الهاجس جليًّا عندما أقترح على مدير تنفيذي فكرة تكتنفها بعض الصعوبات، إذ غالبًا ما أتلقّى إجابة سريعة مثل: "ستتسبّب هذه الفكرة في حدوث مشكلة، وقد أخسر بعض أعضاء الفريق". على أنّي أتفهّم سبب هذا الشعور، إذ يقضي المدير التنفيذي الكثير من الوقت في توظيف وتدريب وإدارة الفريق وتهيئته للوصول إلى مستوى جيد، ولا يمكن له أن يتخيل في تلك اللحظة - ولا أنا لأكون صادقًا معك - إمكانية أن يترك عدد من أعضاء الفريق وظائفهم دون رجعة. ولكن كما يقول المثل: أصابع يدك ليست متشابهة، فهناك فرق تتمتع بولاء عالٍ للشركة يجعلها تتحمّل كلّ المصاعب، وتبقى خلف قائدها بثبات وإخلاص. وفي المقابل هناك فرق همّها الوحيد هو المال، ولا تجد أي حرج في ترك العمل، وقد شاهدت ذلك بنفسي، فقد ترك فريق كامل العمل في إحدى الشركات، ولكنّ العجيب في الأمر أنّ تلك الشركة استطاعت الخروج من هذا المأزق بسلام. هناك بعض العوامل التي تحدّد مقدار ميل فرق العمل إلى أن تكون فرقًا مخلصة أو - على العكس من ذلك - باحثةً عن المال وحسب، وإليك أهمّ هذه العوامل: 1. القيادة: لا خلاف على أن الناس يميلون إلى القائد الذي يثقون به، وقيادة الفريق لا تعني إدارته، على الرغم من أنه لا يمكن قيادة الفريق في حال عدم وجود الإدارة. والقيادة من الصفات المميزة للشخص، إذ أنها تتطلب القدرة على التأثير في الناس، والقدرة العالية على التحمّل، والتواصل مع الآخرين، إلى جانب امتلاك البصيرة والقدرة على الاستماع إلى الآخرين، وحل المشاكل، والتمتع بالهدوء والثقة والأمانة والصدق. ويمكن أن يكون المؤسس قائدًا عظيمًا، ولكنّه قد يكون في المقابل مديرًا سيّئًا، وهذا يعني أنه بحاجة إلى الاعتماد على شخص آخر لإدارة الشركة، ولكنه يبقى مع ذلك قائدًا عظيمًا. القيادة هي إحدى الصفات التي نبحث عنها في الأشخاص الذين يرغبون في تأسيس الشركات، وإن شعرنا بوجود هذه الصفة لدى أحد المؤسسين الذين نتعامل معهم، فمن المؤكّد أن الآخرين سيشعرون بذلك أيضًا. 2. الرسالة الهادفة: يميل الناس بشكل كبير إلى الشّركات التي تحمل رسالة هادفة، وقد رأيت بعض الأشخاص من ذوي الخبرة والموهبة العاليتين وهم يتخلون عن عروض عمل تصل قيمتها إلى ضعفي أو ثلاثة أضعاف ما يحصلون عليه في عملهم الحالي، وذلك لأنهم يؤمنون بالعمل الذي يؤدّونه ويعتقدون بأنّ سيؤثر بشكل كبير في حياتهم وحياة الآخرين. ولهذا السبب، فإن الاستثمار في الشركات التي تحمل رسالة هادفة يمكن أن يعود بأرباح ومكاسب كبيرة، إذ تمتلك هذه الشركات أمرًا لا تمتلكه معظم الشركات، وهو تلك الرسالة الهادفة التي تدفع أعضاء الفريق إلى التماسك في الأوقات الصعبة، أو عندما يتلقّون عروضًا كبيرة ومغرية. 3. القيم والثقافة: في أحد الأيام، كتب صديقي Matt مقالة عن القيم والثقافة، فقرأت المقالة وأجبته قائلًا: "يمكن تشبيه القيم بالمنزل والثقافة بالأثاث الموجود فيه"، وقد أيّدني Matt في ذلك. يرغب الناس بالعمل في الأماكن التي تناسبهم، والشعور بالراحة في مكان العمل من الأمور المهمّة والأساسية. وكما أن المنزل الجميل الذي يحتوي على أثاث مريح يدخل السرور إلى القلب، فإن الشركة التي تتبنى قيمًا ومبادئ جيدة تدخل السرور إلى قلب من يعمل فيها. 4. الموقع: قضيت الأسبوع الفائت متجولًا في أوروبا، فزرت برلين وباريس وإسطنبول وفيينا وليوبليانا (عاصمة سلوفينيا). وما لاحظته في هذه الأماكن أن سوق المواهب فيها يختلف عن سان فرانسيسكو أو نيويورك، ففي سان فرانسيسكو ونيويورك يتعرض موظفو الشركات إلى ضغوط مستمرة للتخلي عن عملهم مقابل الحصول على مرتّبات أعلى، أو البحث عن المساواة، أو لكي يشعروا بالمزيد من الراحة أو المسؤولية، وهذا يؤدي بهم إلى أن يتحولوا في نهاية المطاف إلى موظفين يُمكن أن نصفهم بالمُرتزقة؛ ولهذا تجد أن التمسك بالفريق والاحتفاظ به من الأمور الصعبة في سان فرانسيسكو ونيويورك. ولكن إن كنت ترغب في تأسيس شركة في ليوبليانا أو وترلو أو ديموين (عاصمة ولاية آيوا) أو بطرسبرغ أو ديترويت أو إنديانا بولس فستكون أمامك فرصة أكبر بكثير لبناء فريق من الموظفين المخلصين للشركة. إن حدوث أي خلل في العوامل آنفة الذكر سيزيد من احتمالية تحوّل فريقك من مجموعة من الموظفين المخلصين إلى مجموعة من المُرتزقة الباحثين عن الأموال فقط. وتغيير أسلوب القيادة هو الأكثر شيوعًا بين هذه العوامل، فقد رأيت أنه في كل مرة يغادر فيها المؤسّس الشركة ويأتي مكانه مدير تنفيذيّ جديد، تحدث هجرة جماعية للموظفين الموهوبين في تلك الشركة؛ لذا يستحسن أن يكون المدير التنفيذيّ الجديد من داخل الشركة وليس من خارجها، ومع ذلك فإن هذا لا يحول دون أن يترك الموظفون الشركة في حال تغيّر المدير التنفيذي. عمومًا، تسوء الأمور أكثر في حال كان المدير التنفيذي الجديد قادمًا من خارج الشركة. بالنسبة إلى عامل الموقع، فإن انتقال مقرّ الشركة على سبيل المثال من فيلادلفيا إلى نيويورك أو من دي موين إلى سان فرانسيسكو، قد يعني ازدياد حالات ترك الموظفين لوظائفهم، ومن المتوقع كذلك أن يتحول الموظفون المخلصون في تلك الشركة إلى موظفين مرتزقة. في الواقع هذا ديدن الأماكن المتعطشة للمواهب. ماذا ستفعل إذًا لبناء شركة تضمّ فريقًا من موظفين مخلصين لا مرتزقة؟ أولاً: عليك أن تتقن فنّ القيادة، وإن كنت ترى في نفسك قائدًا جيدًا، فعليك أن تصبح أفضل، وإن كنت ترى أنك قائد ممتاز، فيمكنك كذلك أن تكون أفضل. احصل على التدريب الكافي في هذا المجال، واحرص - قدر استطاعتك - على أن تنمي خبراتك ومهاراتك القيادية على الدوام. ثانياً: أسّس شركة تحمل رسالة هادفة، أو احرص على أن تؤدي شركتك عملًا ذا قيمة رفيعة. إن كان همّك الوحيد هو تحصيل الأرباح وجمع الأموال فقط، فلا تتوقع أن يكون الموظّفون في شركتك مختلفين عنك على الإطلاق. ثالثاً: استثمر في القيم والثقافة. يمكنك الحصول على بعض النصائح الجيدة في هذا الشأن في مقالة صديقي Matt. يمكن تشبيه الأمر ببناء منزل جميل ووضع أثاث مريح فيه. رابعاً: حاول أن تنشئ شركتك بعيدًا عن المدن المكتظّة بالشركات. صحيح أن هذه المدن هي من أفضل الأماكن لإنشاء الشركات والبحث عن المواهب والحصول على الاستثمار، ولكن في الوقت نفسه هناك الكثير من الأشخاص الذين ينافسونك في هذا المجال، والمنافسة هنا شديدة جدًّا؛ لذا إن كنت قادرًا على تجنّب ذلك فلا تردّد على الإطلاق. هناك الكثير من الأسباب التي تدفعني إلى الشعور بأن قطاع الشركات الناشئة يواجه الكثير من العقبات، وأهم هذه الأسباب من وجهة نظري هو الزيادة المطّردة في تحول الموظفين المخلصين إلى موظفين مرتزقة في أيامنا هذه. آمل أن تساعدك هذه المقالة في تجنب هذه المشكلة قدر الإمكان. ترجمة - وبتصرّف - للمقال Loyalists vs Mercenaries لصاحبه Fred Wilson.
  4. العروض والقوالب في Django - الجزء الأول

    تحدّثنا في بداية هذه السلسلة عن أن مشاريع إطار العمل Django تتبع بنية Model-View-Template (النموذج - العرض - القالب) وبعد أن تطرقنا في الجزء الثالث من هذه السلسلة إلى النماذج Models وآلية عملها، سنشرع في هذا الجزء بالحديث عن القسم الثاني من بنية المشاريع ألا وهو العروض Views. والعروض في Django هي صفحة ويب في تطبيق Django تؤدي وظيفة معينة وترتبط بقالب Template معين. فعلى سبيل المثال إن كان التطبيق الذي نعمل عليه عبارة عن مدونة، فإنه سيتضمن العروض التالية: الصفحة الرئيسية للمدونة، تعرض المقالات التي أضيفت مؤخرًا. صفحة المقالة، تعرض نص المقالة وتوفّر الرابط الدائم لها. أرشيف المدونة حسب السنوات، تعرض المقالات المنشورة في سنة معينة. أرشيف المدونة حسب الأشهر، تعرض المقالات المنشورة في شهر معين. أرشيف المدونة حسب الأيام، تعرض جميع المقالات المنشورة في يوم معين. حدث التعليق على المقالة، ويتحكم في عملية إضافة التعليقات على مقالة معينة. نرى مما سبق أن العروض تقوم بوظائف متعددة، فهناك عروض مسؤولة عن عرض المقالات إما باختيار المقالة المطلوبة من قبل المستخدم أو البحث عنها من خلال الأرشيف، وهناك عرض يتولى مسؤولية التحكم بعملية إضافة التعليقات في المدونة. سيتضمن تطبيق الاقتراعات الذي نعمل عليه ضمن هذه السلسلة العروض الأربعة التالية: صفحة الأسئلة الرئيسية index، والتي نعرض فيها آخر الأسئلة المضافة. صفحة تفاصيل السؤال detail، نعرض فيها نص السؤال، إلى جانب نموذج للتصويت. صفحة نتائج السؤال results، نعرض فيها نتائج التصويت على سؤال معين. حدث التصويت، نتحكم من خلاله بعملية التصويت على سؤال معين. ذكرنا في الدرس السابق أن اختيار العرض المناسب وتنفيذه في Django يتم بالاعتماد على المسار الذي يدخله المستخدم في شريط العناوين في المتصفح، إذ يرتبط كل عرض بمسار محدد ويتم تنفيذ العرض عندما يتطابق المسار الذي أدخله المستخدم مع أحد المسارات الموجودة في ملف urls.py، وقد قمنا بذلك بالفعل في الدرس السابق من هذه السلسلة. آلية عمل العروض تقتصر وظيفة العروض على القيام بأمرين اثنين: إرجاع كائن HttpResponse يتضمن محتوى الصفحة المطلوبة. رمي استثناء مثل Http404. والباقي عائد إليك، إذ يمكنك أن تجلب عددًا من السجلات من قاعدة البيانات باستخدام العروض، أو يمكنك استخدام نظام القوالب الخاص بـ Django أو أي نظام قوالب آخر، كما يمكنك إنشاء ملفات PDF أو XML أو إنشاء ملفات مضغوطة ZIP… الخ. عمليًا، يمكنك القيام بما تشاء وباستخدام أي مكتبة من مكتبات بايثون، وكل ما يحتاجه Django هو الكائن HttpResponse أو الاستثناء. لنقم الآن بكتابة عرض بسيط يعمل على جلب آخر خمسة أسئلة في قاعدة البيانات ويعرضها في المتصفح مفصولة عن بعضها البعض بفاصلة (,) ومرتبة حسب تاريخ النشر. توجه إلى polls/views.py ثم أضف الشيفرة التالية: from django.http import HttpResponse from .models import Questions def index(request): latest_question_list = Question.objects.order_by(‘-pub_date’)[:5] output = ‘, ‘.join([q.question_text for q in latest_question_list]) return HttpResponse(output) لنتحدث عن هذه الشيفرة بشيء من التفصيل: في السطر الأول قمنا باستيراد الكائن HttpResponse من وحدة django.http والصنف Question من ملف النماذج models.py الموجود في نفس المجلد الذي يحتوي الملف views.py، وذلك لنتمكن من الاستعلام عن الأسئلة الموجودة في قاعدة البيانات. بعد ذلك بدأنا بتعريف العرض وذلك من خلال إنشاء الدالة index. في كل دالة عرض يتم تمرير كائن HttpRequest والذي يأخذ عادة الاسم request. من الجدير بالذكر أنك لست مقيدًا بتسمية الدالة باسم معين لكي تؤدي العمل المطلوب، إذ يمكنك أن تسمي الدالة السابقة بأي اسم تشاء، ولكن ينصح بتسمية الدوال بأسماء واضحة يمكن من خلالها معرفة العمل الذي ستؤديه عند العودة إليها في وقت لاحق. يرجع العرض كائن HttpResponse يحتوي الردّ الذي قمنا بإنشائه والذي يتضمن نتيجة الاستعلام عن آخر خمسة أسئلة تم نشرها في الموقع، وذلك بواسطة الواجهة البرمجية الخاصة باستدعاء البيانات الخاصة بـ Django، والتي تحدثنا عنها في موضوع النماذج في Django. قمنا في الدرس السابق بربط العرض index بالمسار r’^$’، وهذا يعني أننا لسنا بحاجة إلى إدخال أي شيء في شريط العناوين سوى عنوان النطاق، وهو الخادوم المحلي الخاص بـ Django. ولمشاهدة مخرجات الدالة التي قمنا بكتابتها، توجّه إلى سطر الأوامر وقم بتشغيل خادوم Django من خلال الأمر التالي: python manage.py runserver افتح المتصفح ثم توجه إلى العنوان التالي: http://127.0.0.1:8000/ ربط العروض بالقوالب أعتقد أنّك لاحظت وجود مشكلة بسيطة في هذه الشيفرة، وهي أن تنسيق المخرجات من خلال إضافة وسوم HTML وتنسيقات CSS وغيرها من الأمور المرتبطة بواجهة الموقع العامة من خلال العروض ليس أمرًا عمليًّا على الإطلاق. هذا يعني أننا بحاجة إلى طريقة لفصل تصميم صفحة الويب عن الشيفرات المكتوبة بلغة بايثون، وهنا يأتي دور القوالب Templates، العنصر الثالث من بنية المشاريع في Django. والقوالب عبارة عن ملفات HTML عادية تتضمن وسوم HTML و تنسيقات CSS وشيفرات Javascript (سواء أكانت شيفرات عادية أم مكتبات مثل Jquery، Angular، React وغيرها)، ولكن الفارق الوحيد هو إمكانية استخدام محرك القوالب Template Engine الخاص بـ Django داخل هذه القوالب. لاستخدام القوالب في مشروعنا هذا، أنشئ مجلدًا باسم templates في مجلد polls، واعتمادًا على الإعدادات الافتراضية فإن Django سيبحث عن ملفات القوالب ضمن هذا المجلد. والآن في مجلد templates أنشئ مجلدًا آخر باسم polls وبداخل هذا المجلد أنشئ الملف index.html، وهكذا يكون مسار ملفنا هذا هو: polls/templates/polls/index.html. والآن يمكن الإشارة إلى هذا القالب باستخدام المسار: polls/index.html فقط. ولكن ما الداعي لإنشاء كل هذه المجلدات؟ في الواقع كان بالإمكان أن نضع الملف index.html في مجلد templates وحسب دون الحاجة إلى إنشاء مجلد polls آخر ضمنه، ولكن من غير المستحسن على الإطلاق القيام بذلك. السبب وراء هذا هو أن Django سيعتمد أول قالب يطابق اسمه الاسم المطلوب، وهذا يعني أنه لو وجد اسم القالب نفسه (index.html في مثالنا هذا) في تطبيق آخر فإنه لن يكون قادرًا على التمييز بينهما؛ لذا يستحسن دائمًا استخدام هذه الطريقة لضمان عدم تداخل القوالب بين التطبيقات المتعددة في المشروع الواحد. والآن أضف الشيفرة التالية إلى ملف index.html الذي أنشأته: {% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>الاقتراعات غير متوفرة حالياً.</p> {% endif %} سنتكلم عن محرك القوالب الخاص بـ Django وكل ما يتعلق به في الدرس القادم. بقي علينا ربط العرض index بالقالب index.html؛ لذا توجه إلى الملف polls/views.py وعدله بالشكل التالي: from django.http import HttpResponse from django.template import loader from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = { latest_question_list': latest_question_list, } return HttpResponse(template.render(context, request)) في السطر الثاني من الدالة index قمنا بتحميل القالب الذي سيرتبط بهذه الدالة، وذلك من خلال الدالة get_template التابعة للوحدة loader التي قمنا باستيرادها في بداية الملف من الوحدة template. تأخذ الدالة get_template معاملًا وهو عبارة عن سلسلة نصية نحدّد من خلالها مسار القالب الذي نرغب في ربطه بالعرض. بعد ذلك قمنا بتعريف ما يسمى في Django بالسياق context وهو عبارة عن قاموس Dictionary يعمل على ربط المتغيرات التي سنستخدمها في محرك القوالب الخاص بـ Django - متمثلة بالمفتاح الخاص بالقاموس -، مع المتغيرات الموجودة في العرض - متمثلة بالقيمة المرتبطة بذلك المفتاح -. في الشيفرة السابقة، قمنا بربط المتغير latest_question_list في العرض بالمتغير latest_question_list في القالب index.html. وفي نهاية الشيفرة ترجع الدالة index كائن HttpResponse ولكن هذه المرة قمنا بتمرير الدالة render كمعامل لهذا الكائن، وقمنا بتمرير المتغير template والقاموس context كمعاملين لدالة render، والتي تعمل على دمج قالب معين مع السياق المحدد وتعيد كائن HttpRespons يتضمن ما سيعرض في القالب. توجه الآن من خلال المتصفح إلى العنوان التالي، بعد تشغيل الخادوم الخاص بـ Django: http://127.0.0.1:8000/polls/ سترى الآن قائمة نقطية تتضمن الأسئلة التي أضفناها في الدروس السابقة إلى قاعدة البيانات. اختصار عرض القوالب باستخدام الدالة render: إن الخطوات السابقة (تحميل القالب ثم تحديد سياق المتغيرات ثم إرجاع الكائن HttpResponse الذي يتضمن النتيجة التي سيعرضها القالب) شائعة جدًّا وتتكرر باستمرار، لذا يقدّم Django اختصارًا لهذه الخطوات باستخدام الدالة render() التابعة لحزمة django.shortcuts والتي تتضمن عددًا من الدوال التي تختصر بعض الخطوات التي تتكرر باستمرار في Django. قم بتعديل الملف polls/views.py ليصبح بالشكل التالي: from django.shortcuts import render from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context) المعامل الأول في دالة render هو كائن request الذي مررناه كمعامل للدالة index، أما المعامل الثاني فهو اسم القالب ومساره على هيئة سلسلة نصية، أما المعامل الثالث فهو قاموس سياق المتغيرات التي نرغب في تمريرها من العرض إلى القالب، وهو معامل اختياري. تعيد هذه الدالة كائن HttpResponse يتضمن ما سيتم عرضه في القالب المحدّد وباستخدام السياق المحدّد. لاحظ أننا لم نعد بحاجة إلى استيراد دالة loader وكائن HttpResponse في بداية الملف. رمي الاستثناء Http404 لننتقل الآن إلى دالة العرض المسؤولة عن سرد تفاصيل السؤال الذي يختاره المستخدم؛ لذا توجه إلى الملف polls/views.py ثم أضف السطر التالي في بداية الملف: from django.http import Http404 ثم عدّل الدالة detail لتصبح بالشكل التالي: def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("السؤال المطلوب غير موجود.") return render(request, 'polls/detail.html', {'question': question}) قمنا بتمرير معامل جديد في الدالة detail وهو question_id، وهذا المعامل هو المتغير الذي قمنا بتعريفه في ملف المسارات urls.py في الدرس السابق، ضمن المسار المرتبط بهذه الدالة. يحمل هذا المتغير الرقم الذي سيدخله المستخدم في شريط العناوين والذي سيلتقطه Django بواسطة التعابير النظامية Regular expressions ويسنده إلى المتغير question_id. تبدأ الدالة بالاستعلام عن السؤال الذي يحمل المفتاح الأساسي primary key - يختصر Django اسم هذا المفتاح بالحرفين pk - الذي يطابق قيمة المتغير question_id وإسناد النتيجة إن وجدت إلى المتغير question. وفي حالة عدم وجود هذا السؤال يُرمى الاستثناء Http404 ليُعلم المستخدم بعدم وجود السؤال الذي قام بطلبه. والآن نحن بحاجة إلى القالب detail.html لنتمكن من مشاهدة السؤال المطلوب؛ لذا قم بإنشاء هذا الملف في مجلد templates/polls. سنكتفي هنا بإضافة السطر التالي في هذا الملف، للتأكد من عمل الشيفرة: {{ question }} اختصار خطوات الاستعلام ورمي الاستثناء مرة أخرى، فإن الخطوات السابقة (الاستعلام باستخدام الدالة get ورمي الاستثناء Http404) تتكرر باستمرار، لذا يقدّم Django دالة بديلة تختصر هذه العملية، وكما هو متوقع فهذه الدالة موجودة في حزمة django.shortcuts، لذا سنقوم باستيرادها بالشكل التالي مع الدالة render: from django.shortcuts import get_object_or_404, render يمكن الآن استخدام الدالة get_object_or_404() بالشكل التالي: def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question}) المعامل الأول في الدالة get_object_or_404() هو اسم النموذج الذي نرغب في الاستعلام داخله، أما المعامل الثاني فهو مجموعة من معاملات الكلمة المفتاحية والتي تقوم الدالة بتمريرها إلى دالة get() الخاصة بواجهة Django البرمجية للاستعلام في قواعد البيانات. في حالة عدم وجود الكائن المطلوب، ترمي الدالة الاستثناء Http404. يقدّم Django كذلك دالة get_list_or_404() والتي تعمل بنفس الطريقة باستثناء أنّها تستخدم الدالة filter() بدلًا من get()، وترمي الدالة الاستثناء Http404 في حال عدم وجود القائمة المطلوبة. والآن توجّه إلى العنوان التالي في المتصفح بعد تشغيل خادوم Django، ولاحظ النتيجة: (http://127.0.0.1:8000/polls/1) حاول تغيير رقم السؤال لرمي الاستثناء Http404. خاتمة تعرفنا في هذا الدرس على العنصر الثاني من بنية المشاريع في Django ألا وهي العروض، وتعرفنا كذلك على طريقة ربطها بالقوالب والتي تمثّل العنصر الثالث من بنية المشاريع في إطار العمل هذا. وسنتطرق في الفصل القادم بمزيد من التفصيل إلى القوالب وآلية عملها وسنتعرف على محرك القوالب الخاص بـ Django وما يتضمنه من متغيرات ووسوم وغيرها، وسنتعرّف كذلك على العروض المستندة إلى الأصناف والعروض العامة Generic Views. المصادر: توثيقات Django
  5. دائمًا ما أشجّع الشركات بمختلف أنواعها على تشكيل مجلس إدارة رسمي بعد أن تحصل الشركة على التمويل البذري، فأنا أعرف تمام المعرفة مدى فائدة وجود مجلس الإدارة، فقد شاهدت الكثير من الحالات التي يواجه فيها مؤسس الشركة حالة من الضياع وكمًّا كبيرًا من المشاكل والمعوّقات بسبب عدم وجود مجلس إدارة في شركته. ولما كان تحقيق الربحية بالنسبة لـ 99% من الشركات الناشئة في مراحلها الأولى ضربًا من المستحيل، فإن الشركة تكون بحاجة إلى جولة أخرى من التمويل، وللحصول على رأس المال الإضافي هذا يجب على الشركة أن تحقق عددًا من الأهداف وعليها كذلك أن تثبت للمستثمرين مدى ملائمة المنتج الذي تقدّمه للسوق، إضافة إلى تصورات مؤسس الشركة حول العائدات، والعملاء، والمستخدمين، والنمو. يساعد مجلس الإدارة الجيد المدير التنفيذي في التركيز على تحقيق هذه الأهداف، ولكن لكي يكون وجود مجلس الإدارة مفيدًا يجب أن يمتلك المدير التنفيذي القدرة على إدارة اجتماع مجلس الإدارة بكفاءة وفعالية. ما الذي يجب عليك تجنبه في اجتماع مجلس الإدارة قبل أن ندخل في التفاصيل المتعلقة بإدارة اجتماع مجلس الإدارة سأتحدث بإيجاز عن الأمور التي يجب عليك تجنّبها في مثل هذه الاجتماعات. ليس من الجيد أن تصرف وقت الاجتماع كلّه في الحديث عن المستجدّات والتركيز بشكل كبير على مضمون شرائح العرض التقديمي الذي تعرضه في الاجتماع، ولكن لماذا؟ لأن ذلك سيؤدي إلى التركيز على التفاصيل، وتصيد الأخطاء، وتشتيت النظر عن الهدف العام من هذا الاجتماع. إن كنت تنتقل عبر شرائح العرض التقديمي الواحدة بعد الأخرى، لن يتسنى لأعضاء مجلس الإدارة مراجعة ما يتمّ عرضه في الشرائح التقديمية بشكل مسبق، ولن يكونوا قادرين كذلك على التفكير في الأسئلة التي يودّون طرحها في النقاش. وهكذا لن يكون هناك وقت كافٍ لإجراء النقاشات المهمّة والفعّالة، ولن يكون بالإمكان الاستفادة من الخبرة التي يمتلكها كل عضو من أعضاء المجلس. عادة ما يسود هذا النوع من الاجتماعات أجواء سلبية وذلك لأن الأسئلة تُطرح باستمرار من قبل مجلس الإدارة ويكون المدير التنفيذي في موضع الدفاع بشكل مستمر. وباختصار هذا الأسلوب في إدارة اجتماعات مجلس الإدارة غير فعال على الإطلاق. كيف تدير اجتماع مجلس الإدارة الأسلوب الجيد في إدارة اجتماع مجلس الإدارة هو الأسلوب الذي يتجاوز التركيز على مضمون الشرائح التقديمية إلى إجراء نقاش هادف حول مجموعة من النقاط الأساسية فقط. إلى جانب ذلك، فإن الاجتماعات الفعالة لمجلس الإدارة تمتلك هيكلية واضحة وتتبع جدول أعمال محدد، الأمر الذي يسمح للأعضاء بمتابعة المواضيع المطروحة في الاجتماع بشكل جيد، ليخرجوا في نهاية المطاف بنتائج ملموسة. فيما يلي نموذج لجدول أعمال اجتماع نموذجي لمجلس الإدارة يستمر لمدة ساعتين: توزيع المواد وجدول الأعمال قبل ثلاثة أيام. مراجعة المواد: 15 دقيقة. أسئلة وأجوبة حول العرض التقديمي: 15 دقيقة. موضوع رئيسي 1: 30 دقيقة. موضوع رئيسي 2: 30 دقيقة. مراجعة مشاكل الميزانية: 10 دقائق. الموارد البشرية، التوظيف: 10 دقائق. وقت خاص لأعضاء مجلس الإدارة، الخلاصة والخطوات القادمة: 10 دقائق. عليك إرسال المواضيع التي ستناقشها في الاجتماع إلى أعضاء مجلس الإدارة قبل انعقاده بفترة من الزمن، وعند البدء اطلب منهم مراجعة هذه المواضيع لـ 15 دقيقة، وبهذه الطريقة يدخل وقت مراجعة المواد ضمن وقت الاجتماع، ويكون جميع الأعضاء في مجلس الإدارة على اطلاع كامل بما سيتم الحديث عنه ضمن الاجتماع. اطلب من الحضور طرح الأسئلة التوضيحية حول المواد، واجعل إجاباتك ومناقشاتك قصيرة قدر الإمكان. من المحتمل أن تركّز الأسئلة على مؤشرات الأداء الرئيسية KPIs أو الشؤون المالية، وسيكون لديك المزيد من الوقت لتؤجل النقاش في الشؤون المالية إلى نهاية اللقاء، ويمكن كذلك تأجيل الأسئلة الطويلة إلى وقت لاحق. النقطتان الرابعة والخامسة ضمن جدول الأعمال أعلاه هما الأكثر أهمية ضمن الاجتماع، وتتضمن هاتان النقطتان مناقشة المواضيع الاستراتيجية المهمّة التي يحتاج فيها المدير التنفيذي إلى مساعدة أعضاء مجلس الإدارة. ضمن هذه الفقرة يكون باب النقاش والتفاعل مفتوحًا أمام المدير التنفيذي وأعضاء مجلس الإدارة، ليتسنى له الاستفادة من معلوماتهم وخبراتهم. يمكن للأسئلة أن تتنوع في مواضيعها، كأن تكون حول خطط التوجه إلى السوق، أو المبيعات، أو المنافسين، أو خطة التمويل القادمة، أو ثقافة الشركة وسياسة التوظيف. مهما كانت طبيعة الأسئلة، يجب أن يكون الموضوع ضمن جدول الأعمال الخاص بالمدير التنفيذي ليتناقش فيه بعمق مع أعضاء مجلس الإدارة. هذا النوع من النقاشات المركّزة فعّال للغاية، ويساعد المدير التنفيذي على اتخاذ القرارات الصائبة، وفي الوقت ذاته يُشعر أعضاء مجلس الإدارة بالرضا. بعد ذلك، راجع الأمور المالية الخاصّة بالشركة بشكل مختصر، وحاول أن تقتصر في مراجعتك على الأمور التي انحرفت عن المسار الصحيح، ولا تطلق العنان لمراجعتك، وإلا أخذت وقتًا أكثر من اللازم. ذكّر أعضاء مجلس الإدارة بالأهداف المرسومة وبيّن لهم أدائك مُقارنة بهذه الأهداف. وضّح لهم سبب تقدّمك أو تأخّرك عن الخطة المرسومة، وركّز على معدلات الإنفاق Burn rate، واطلب التغذية الراجعة من مجلس الإدارة. بعدها، تحدّث عن فتح مجال التوظيف ، فكل شركة مهما كانت حديثة النشأة، ستركّز دائمًا على مسألة التوظيف، وسواء أكان المطلوب مهندسين أو أخصائيي تسويق أو أي وظيفة أخرى، فمن الضروري أن تتحدث بشأن هذا الموضوع مع أعضاء مجلس الإدارة، وخصوصًا في حالة الوظائف الكبيرة؛ وذلك لأن المدراء يمتلكون خبرة أكبر وشبكة علاقات أوسع من المدراء التنفيذيين. وأخيرًا، اختم الاجتماع بملخص سريع وتحدّث عن النتائج والخطوات القادمة، ووضّح لكل شخص ما يترتب عليه من قرارات أو واجبات. من المفترض أن يكون جدول الأعمال هذا مناسبًا لجميع الشركات، ولكن لا بأس بتعديله حسب ما يلائم شركتك الخاصة. على سبيل المثال إن كنت ترى بأنّك لا تحصل على الوقت الكافي للحديث عن الأمور المالية أو الموارد البشرية، فيمكن أن يحلّ هذان الموضوعان محل الموضوعين الأساسيين في جدول الأعمال. وعلى أي حال، لا تناقش الكثير من المواضيع في الاجتماع الواحد إذ سيفقد أعضاء مجلس الإدارة تركيزهم، ولن يكونوا قادرين على تقديم يد العون في هذه الحالة. إنّ من صفات المدير التنفيذي الجيّد قدرته على التركيز على الأمور الصحيحة في كل اجتماع يعقده مع مجلس الإدارة. جرّب استخدام جدول أعمال مماثل لهذا الجدول في لقاءاتك مع مجلس الإدارة، واحصل على تغذيتهم الراجعة حول ما يرونه نافعًا أو غير نافع، واستمر في إجراء التعديلات والتصحيحات المطلوبة إلى أن تصل إلى الصيغة التي ترى بأنها الأكثر فعالية وفائدة بالنسبة إليك. ترجمة - وبتصرّف - للمقال How a seed-stage company can run a simple and effective board meeting لصاحبه Alex Iskold.
  6. في الماضي القريب، كانت النظرة السائدة حول خدمة دعم العملاء هي أنّها لا تتجاوز كونها مشاحنة بين طرفين، وأنّ هذه الخدمة هي ضريبة من ضرائب الوصول إلى النجاح لا أكثر، ولولا وجود هؤلاء العملاء المزعجين من الذين يواجهون مشاكل في التعامل مع المنتج، لقفزت أرباح الشركة إلى مستويات خيالية. في الواقع لا يختلف اثنان على أن خدمة دعم العملاء تكلّف الكثير من المال، ولكن لو نظرنا إلى النماذج المالية الأوسع في خدمة العملاء، لرأينا بأن هذه الخدمة ليست مركز التكلفة فحسب، وإنما هي استثمار استراتيجي قادر على رفع نسبة استبقاء العملاء والتقليل من معدل انحسار عدد المستخدمين churn. كلفة البضائع المباعة والكلفة الحقيقية للدعم العملاء تعرّف النفقات المرتبطة بتقديم خدمة الدعم إلى عملائك بكلفة البضائع المباعة Cost of Goods Sold أو COGS اختصارًا. تتكوّن كلفة البضائع المباعة في حالة الشركات التقليدية - الصناعية مثلًا - من التكلفة المادية التي تتحملها الشركة في بيع منتجاتها، أمّا في حالة مشاريع البرمجيات الخدمية SaaS، فإن كلفة البضائع المباعة تمثّل كلفة توفير خدمات معيّنة إلى العملاء، مثل: الاستضافة. نفقات من الطرف الثالث، مثل: شبكات توفير المحتوى CDN، البرمجيات، وغيرها. نفقات تهيئة العملاء الجدد. نفقات فريق الدعم - ومن ضمنها نفقات الموظفين -. وعادة ما تكون تكاليف الاستضافة وغيرها من تكاليف البنى التحتية ثابتة نسبيًا - لن يؤثر إضافة عميل جديد بشكل كبير على التكاليف - لذا فإن تكاليف دعم العملاء هي أسهل وسيلة لرفع أو تخفيض تكاليف البضائع المباعة. ولتوضيح فكرة تكاليف البضائع المباعة في عالم مشاريع البرمجيات الخدمية، تخيّل بأنّك قد قمت بإيقاف التسجيل في موقعك الإلكتروني منذ صباح هذا اليوم، وتوقّفت عن شحن منتجك الجديد، ولكنّ خدمة عملائك الحاليين لا زالت مستمرّة، فما هي إذًا تكلفة إبقاء المشروع التجاري في حالة العمل؟ إنّها كلفة البضائع المباعة، وهي أحد الأمور الأساسية التي تخبرك بمدى سلامة الأصول التي يستند إليها مشروعك التجاري. في أيامنا هذه، تعدّ تكلفة البضائع المباعة (ومنها خدمة الدعم الفني) بالنسبة لشركات البرمجيات الخدمية أحد مفاتيح الربح الأساسية. وأنت هنا أمام خيارين: إن كنت ترغب في أن تكون حالتك المادية جيدة فيجب على فريق دعم العملاء في شركتك أن يعمل بشكل متواصل، ومع ذلك لن تكون قادرًا على الإنفاق من دون حدود على خدمة العملاء مهما كانت درجة اهتمامك بهم كبيرة. قد يبدو تجاهل خدمة دعم العملاء لزيادة الأرباح أمرًا مغريًا على المدى القصير، ولكن تقديم خدمة دعم سيئة لن تؤدي إلا إلى زيادة معدلات انحسار أعداد العملاء churn، وسينتهي الأمر بانخفاض كبير في الأرباح. إن أول سبب يدفع العملاء للابتعاد عن الشركة وتركها هو شعورهم بأنّها لا توفّر لهم الدعم الكافي ولا توليهم العناية اللازمة. وانطلاقًا ممّا سبق، كيف تستطيع تحديد مدى قدرتك على إنفاق الأموال على خدمة دعم العملاء؟ يمكن لطريقة التسعير واعتماد نظام اقتصادي قابل للتوسع Economies of scale وموقعك في السوق أن تؤثر في طريقة تفكيرك حيال إنفاق الأموال على خدمة دعم العملاء، وفيما يلي بعض الأمثلة التوضيحية. طريقة التسعير لماذا تستطيع شركة Apple تحمّل أعباء تقديم خدمة عملاء أفضل بكثير من شركة Dell؟ إنه سعر المنتج، فلو أخذنا حاسوبين بنفس المواصفات من كلتا الشركتين، فإن سعر حاسوب Apple سيكون بلا شك أغلى بكثير من سعر الحاسوب الآخر. باختصار: كلما طلبت سعرًا أعلى لمنتجك، كنت قادرًا على تحمل أعباء تقديم خدمة أكبر للعملاء. ولكن المشكلة هي أن تحديد الطريقة التي ستطلب من خلالها السعر الأعلى ليست بالأمر الهيّن، ففي شركات البرمجيات الخدمية على وجه الخصوص، كلما كنت قادرًا على فرض أسعار أعلى دون التأثير على عملية استبقاء العملاء، ازدادت قدرتك على الإنفاق على خدمة دعم العملاء. نظام اقتصادي قابل للتوسع لنفترض أنك تبيع منتجًا بنظام ترخيص يعتمد على عدد المستخدمين الذين يتاح لهم الوصول إلى المنتج (per seat license)، وكل رخصة جديدة تبيعها لن تكلّفك شيئًا يُذكر من ناحية البنى التحتية. وعلى افتراض أنّك تستفيد من خدمات تقدّمها إليك شركات أخرى (شركات الطرف الثالث) كخدمات الويب من أمازون حيث تحجز الخواديم الافتراضية بشكل مستمر، فإنّ ازدياد عدد التراخيص المباعة سيؤدي بالضرورة إلى تخفيض تكاليف استضافة التراخيص الإضافية، وبطبيعة الحال، إذا انخفضت تكلفة استضافة الترخيص الواحد، ستكون قادرًا حينها على زيادة ما تنفقه على دعم العملاء مقابل المحافظة على هامش الأرباح ذاته. موقعك في السوق من الحقائق المعروفة في مجال التعامل مع العملاء أنّه كلما زادت قيمة عملاء شركة كلما انخفض معدل انحسار عدد العملاء فيها، وغالبًا ما تكون تكلفة الحصول على هؤلاء العملاء عالية جدًّا (غالبًا ما يتم ذلك بالمشاركة مع فريق التسويق، أو فريق هندسة المنتجات من خلال الإجابة على طلب معين أو تطوير خاصية معيّنة، أو بمشاركة المدير التنفيذي... الخ)، ولكن ما إن تحصل على هؤلاء العملاء تصبح احتمالية مغادرتهم منخفضة جدًّا. إنّ السبب الذي يكمن وراء هذه الكلفة العالية هو أن تحوّل أمثال هؤلاء العملاء إلى منتجك يكلّفك الكثير؛ ذلك لأنهم منحوا جزءًا كبيرًا من وقتهم وأموالهم ومواردهم وسمعتهم في تبنّي منتجك والدفاع عنه. في المقابل تكون كلفة العملاء العاديين منخفضة أكثر ويكون تبنّيهم للمنتج أسرع بكثير، ولكن عليك أن تنتبه إلى أن احتمالية ترك المنتج ستكون كبيرة جدًّا، بمعنى أن كلفة تحوّل هذا النوع من العملاء ستكون منخفضة بكثير، ولكن من الناحية الإحصائية يكون احتمال خروجهم من المشروع التجاري أكبر. هذا التباين الطبيعي في عملية الاستبقاء بين الأسواق سيعمل على تغيير معادلة حساب قيمة العميل مدى الحياة (LTV) وتحديد المقدار الذي تستطيع إنفاقه على خدمة العملاء. وبعبارة أخرى، فإن قضاء ساعة واحدة مع عميل ذي قيمة كبيرة ونسبة استبقاء عالية تمثّل نسبة ضئيلة من قيمة ذلك المستخدم مدى الحياة مقارنة بما لو كان الأمر مرتبطًا بأحد العملاء العاديين. إن كنت ترغب في أن تساوي بين جميع العملاء فالأمر عائد إليك، ولكن عليك أن تدرك جيّدًا تبعات هذا القرار وعواقبه. كيف تتحول خدمة دعم العملاء إلى مصدر للأرباح؟ لماذا لا تفكّر في طريقة لتحويل خدمة دعم العملاء إلى وسيلة لدعم العائدات، بدلًا من أن تكون أحد أسباب استهلاك الموارد؟ إليك فيما يلي ثلاث طرق يمكنك من خلالها استغلال دعم العملاء في تنمية مشروعك التجاري وتطويره. قدم الدعم لتحوّل العملاء إن كنت تقدّم الدعم للعملاء خلال الفترة التجريبية المجانية لمنتجك، فعليك التمييز بين أمرين هما كلفة المبيعات sales cost ودعم العملاء الحقيقي، فإن كنت تقدم الدعم للمستخدمين المشتركين في الخطّة المجانية لتدفعهم بذلك إلى الاشتراك في الخطة المدفوعة، فما تنفقه في هذه الحالة يعدّ كلفة مبيعات. إن كان أحد الأشخاص مشتركًا في الفترة تجريبية لخطة شهرية تقدّر بقيمة 25,000 دولار، ثم طرح سؤالًا بعد ثلاثة أيام من الاشتراك، هل يعدّ ذلك كلفة بضاعة مباعة أم أنها كلفة مبيعات؟ في الواقع إنها كلفة مبيعات، وذلك لأنّه إن لم يحصل العميل المحتمل على ما يريده فإنه لن يقدم على شراء المنتج، وبما أنّك لم تقم ببيع شيء في الواقع فلا يمكن أن نعدّ هذه الكلفة كلفة بضاعة مباعة. قدّم الدعم لتحافظ على العملاء إن السبب الرئيسي الذي يدفع العملاء إلى مغادرة المشروع التجاري هو شعورهم بأنّه لا يقدّم إليهم الدعم الكافي ولا يوفّر حلولًا للمشاكل التي يعانون منها. ومن هنا عليك التفكير في خدمة دعم العملاء على أنّها خدمة يمكن لها أن تحوّل علاقة استمرت لـ 18 شهرًا إلى علاقة يمكن لها أن تستمر لثلاث سنوات أخرى، ويمكن لها كذلك أن تضاعف العائدات بشكل كبير. على سبيل المثال، لا زالت Basecamp تتعامل مع عدد من العملاء الذين ارتبطوا بها منذ إطلاق منتجها لأول مرة أي قبل ما يزيد على عقد من الزمان، ويعود ذلك إلى أن الشركة قد قامت ببناء منتج رائع جدًّا، إضافة إلى أنّها تقدّم الدعم لعملائها وبشكل متواصل. هذا يعني أن دعم العملاء يمكن أن يرفع قيمة العميل مدى الحياة LTV إن كان ذلك الدعم قادرًا على المحافظة على العلاقة التي تنشأ بين العميل والشركة. قدّم الدعم لتكون قادرًا على التميّز يمكن أن يشكل الدعم الفني الممتاز علامة فارقة تميّز شركتك في مبيعاتها وحملاتها التسويقية، وشركات صناعة السيارات خير مثال على ذلك، إذ تعتبر معظمها أنّ المصداقية من أهمّ الصفات التي تمتاز بها الشركة، فـ Toyota مثلًا تعتبرها إحدى أفضل الصفات التي تتمتع بها الشركة، وكذلك الأمر بالنسبة لشركة الخدمات المالية Discover والتي أطلقت حملة إعلانية على شاشات التلفاز ركّزت فيها على حقيقة أنّ من يجيب العميل عند الاتصال بخدمة العملاء في الشركة هو موظّف حقيقي وليس المجيب الآلي. عادة ما يُنظر إلى خدمة دعم العملاء على أنّها السبب الرئيسي لهدر الأموال والموارد، على أن هذه النظرة آخذة بالانحسار تدريجيًا، وقد بدأت الشركات تركّز على العميل بشكل أكبر فأكبر. كما رأينا فإن الدعم الجيد للعملاء ليس بالأمر الهيّن، إذ أنّه يكلّف المال والوقت، ولكن الاهتمام بالعميل سيعود بمنافع كثيرة على المدى الطويل، إذ سيساعد تقديم الدعم للعملاء على زيادة نسبة الاستبقاء، وتحويل العملاء إلى مؤيدين ومدافعين عن المشروع التجاري، إضافة إلى حصول الأخير على ميزة تنافسية. ترجمة - وبتصرّف - للمقال How customer support fits your business لصاحبه Bobby Pinero.
  7. هل تبحث عن وسيلة لتجنّب عمليات الاحتيال التي تتم بواسطة البريد الإلكتروني؟ هل ترغب في تحسين قابلية تسليم رسائلك الإلكترونية Email deliverability، وأن تضمن وصولها بشكل مستمر إلى صناديق بريد المستلمين؟ ما تبحث عنه إذًا هو استيثاق البريد الإلكتروني Email authentication. للوهلة الأولى، تبدو عملية استيثاق البريد الإلكتروني وكأنها مرتبطة بموضوع الحماية والأمان وحسب، ولكنّها في الواقع ترتبط بقابلية تسليم الرسائل الإلكترونية أيضاً، فمن خلال استخدام سجلات DKIM وSPF ثم توثيق رسائلك الإلكترونية، تستطيع حماية علامتك التجارية وستضمن حينها وصول رسائلك الإلكترونية إلى صندوق البريد الوارد بنجاح. سنتعرف معًا في هذا المقال على الأسباب التي جعلت من توثيق الرسائل الإلكترونية جزءًا لا يتجزّأ من عملية تسليم الرسائل، وسننظر بتمعّن إلى ما سيحدث لرسالتك الإلكترونية بعد أن تضغط زرّ الإرسال. ما هي الرسالة الإلكترونية الموثقة؟ تحاول خواديم استقبال الرسائل الإلكترونية، كجزء من عملية تسليم هذه الرسائل، تحديد مدى موثوقية الرسالة المُستقبلة، وذلك من خلال طرح الأسئلة التالية من قبل الخادوم: "هل هذه الرسالة آتية من مرسلها الحقيقي؟ كيف يمكن لي أن أتحقّق من ذلك؟ وماذا أفعل إن لم أفلح في توثيق هذه الرسالة؟". ويبحث خادوم استقبال الرسائل كذلك عن سمعة الإرسال sending reputation المرتبطة بنطاق domain المرسل وعنوان IP الخاص به. وهناك عوامل أخرى تلعب دورًا مهمّاً في نجاح عملية تسليم الرسائل التي ترسلها، ومنها: المحتوى، تفاعل المستلمين مع الرسائل السابقة، الخ. لقد تحدّثنا سابقًا عن كيفية تحسين الحملات التسويقية، وعن تأثير جودة القائمة البريدية أو المحتوى على قابلية تسليم الرسائل الإلكترونية. إذًا، ما المقصود بنجاح عملية توثيق الرسالة الإلكترونية؟ باختصار، نجاح هذه العملية يعني أن الخادوم الذي يستقبل الرسائل الإلكترونية قد قام بالتحقق من سجلّات SPF المتعلقة بتلك الرسالة، ومفتاح DKIM المرتبط بالرسالة وبالنطاق المرسل، وأن الرسالة المرسلة قد تجاوزت هذه الاختبارات بنجاح. عند استخدام Campaign Monitor في إرسال الرسائل التسويقية، يتم تهيئة سجلات SPF بشكل تلقائي لجميع العملاء في سجلات DNS الخاصة بـ Campaign Monitor، ويُجري خادوم استقبال الرسائل عملية التحقق آنفة الذكر في هذه السجلات. يمتلك كلّ مستخدم في Campaign Monitor مفتاح DKIM خاصًّا به، تتم استضافته في سجلات DNS الموجودة في النطاق الخاص بالمستخدم، ويتطلّب استعمال هذا المفتاح ضبط بعض الإعدادات من قبل مالك النطاق. لنتحدث الآن عن الطريقة التي يختار بها خادوم البريد بين أن يقبل أو يرفض حملتك البريدية بالاستناد إلى كيفية تحديده لمدى موثوقية الحملة وصحّتها. قد تلتزم في رسالتك الإلكترونية بجميع قواعد مكافحة الرسائل المزعجة، ويكون مضمون الرسالة جيّدًا، وتكون مرسلة من النطاق المسجل باسم مشروعك التجاري، ولكن هذا كلّه ليس كافياً لتتمكن هذه الرسالة من المرور عبر خادوم استقبال الرسائل الإلكترونية. ما تحتاجه في هذه الحالة، هو توثيق رسالتك الإلكترونية لكي يكون لدى خادوم استقبال الرسائل السجلات المطلوبة للتحقق من أن عنوان البريد الإلكتروني الذي تم من خلاله إرسال هذه الرسالة تابع لـ Campaign Monitor بالفعل، وليس عائدًا لأحد المتصيدين أو القراصنة الذين ينتحلون شخصية هذه الشركة. عمّ يبحث خادوم استقبال الرسائل الإلكترونية؟ يبحث خادوم استقبال الرسائل الإلكترونية عن معلومات معينة في الرسالة الإلكترونية وفي سجلات DNS الخاصة بنطاقك، وذلك لتحديد ما إذا كانت الرسالة الإلكترونية موثوقة وآمنة بالنسبة للمستلم، ومن ثَمَّ التأكُّد من أن الرسالة قد أُرسلت من مصدر موثوق. يشير الاختصار DNS إلى مصطلح نظام أسماء النطاقات Domain Name System، ويمكن تشبيه هذا النظام بدليل الهاتف الخاص بالويب الذي يعمل على تنظيم النطاقات وتمييزها عن بعضها البعض. فكما يتضمن دليل الهاتف أسماء (مثل: زيد عمرو) ورقم الهاتف الخاص بهذا الاسم، فإن نظام أسماء النطاقات يتضمن عناوين ويب (مثل: academy.hsoub.com) إلى عنوان IP الفيزيائي (مثل: 74.125.19.147) الخاص بالحاسوب الذي يستضيف هذا الموقع. SPF هي عبارة عن ميكانيكية يتحقق النطاق المستقبل من خلالها مما إذا كانت الرسالة الإلكترونية قد أرسلت من عنوان IP مخوّل لإرسال الرسائل الإلكترونية باسم مدراء نطاق معيّن. عندما تنشئ سجلّ SPF، فإنّك تضع قائمة بعناوين IP أو الاستضافات المرسلة للرسائل والتي تخوّلها إرسال رسائل تحمل اسم نطاقك الخاصّ. قد يبدو الأمر معقدًا، ولكن إليك المثال التالي لتوضيح الصورة: لنفترض أن أحد الأشخاص حاول اختراق Campaign Monitor عن طريق إرسال رسالة إلكترونية بعنوان مرسل مزيّف. بالنسبة إلى مستلم الرسالة، ستبدو وكأنّها رسالة موثّقة، ولكنّها تحتوي على محتوى ضارّ ومن مصدر غير موثوق. في حالة وجود سجلّات SPF، يمكن لصندوق بريد المستلم أن يحدّد ما إذا كانت الرسالة التي تبدو وكأنّها أرسلت من Campaign Monitor قد أرسلت من عنوان IP مخوّل لإرسال الرسائل بهذا الاسم. إن تطابق عنوان IP المرسل وعنوان استضافته مع سجلّات SPF الخاصّ بنطاق المرسل، فإن الرسالة تكون موثّقة بالاعتماد على سجلّات SPF. أما في حال كانت الرسالة مرسلة من استضافة أو عنوان IP لا يطابق ما هو موجود في سجلات SPF الخاصة بـ Campaign Monitor، فسيعرف الخادوم المستقبل للرسائل أن الرسالة الإلكترونية ليست قادمة من عنوان IP موثّق من قبل Campaign Monitor وأن هذه الرسالة قد تكون مزوّرة. تضاف سجلات SPF بشكل تلقائي لجميع عملاء Campaign Monitor في سجلاتها الخاصّة، أما في حال كنت تملك سجلات SPF خاصّة بك، فتأكد من إضافة تفاصيل حسابك في Campaign Monitor إليها. "يعدّ مفتاح الـ DKIM طريقة للاستيثاق تعتمد على إضافة توقيع مشفّر Encrypted signature للرسالة الإلكترونية، وهو أحد أكثر الوسائل فعّالية لمكافحة إساءة استعمال الرسائل الإلكترونية ويمكن أن يُسهم بشكل كبير في تحسين قابلية استلامها." لتحصل على استيثاق DKIM، فإنك بحاجة للوصول إلى سجلات DNS الخاصّة بالنطاق المرسِل وذلك لإضافة مفتاح DKIM إليها، وهذا من شأنه أن يضمن موثوقية البريد الإلكتروني؛ ذلك لأنّ مالك النطاق هو الشخص الوحيد القادر على إجراء التعديلات على هذه السجلات، وهذا هو أهمّ جزء من طريقة عمل مفاتيح DKIM. وعلى الرغم من أن الآلية الكامنة وراء عمل هذه المفاتيح معقدة نوعًا ما، فإن استخدامها ليس بالأمر الصعب، فبمجرد أن تستخدم DKIM ضمن سجلات DNS الخاصّة بنطاقك، فإن قابلية وصول رسائلك الإلكترونية ستكون أكبر، إلى جانب أنك ستحمي نفسك والمستخدمين من الرسائل المزعجة وعمليات الاحتيال. إليك طريقة عمل هذه المفاتيح بشكل موجز: ما إن يتم استخدام سجلات DKIM وإثبات صحّتها، يصبح لبريدك الإلكتروني توقيع DKIM يضاف إلى ترويسة الرسالة الإلكترونية خلال عملية الإرسال. يتم توليد التوقيع المشفّر هذا بالاعتماد على مفتاح DKIM الذي قمت بإضافته إلى سجلات DNS الخاصة بنطاقك، إلى جانب سلسلة التجزئة hash string المبنية على عناصر معيّنة في الرسالة الإلكترونية المرسلة، وهذا يعني أن كل رسالة إلكترونية تقوم بإرسالها تحمل توقيع DKIM فريدًا. عندما يستلم خادوم استقبال الرسائل رسالتك الإلكترونية، فإنه يفكّ تشفير توقيع DKIM باستخدام المفتاح العام المستضاف في سجلات DNS الخاصّة بك، وسيقوم في الوقت نفسه بتوليد سلسلة تجزئة جديدة بالاعتماد على نفس العناصر التي تم استخدامها في الرسالة الإلكترونية. إن حصل تطابق بين التوقيع الذي تمّ فكّ تشفيره وسلسلة التجزئة الجديدة، فإن الرسالة الإلكترونية قد اجتازت بنجاح عملية استيثاق DKIM. وهذا يعني أن خادوم استقبال الرسائل قادر على القيام بأمرين، هما: أن يحدّد وبأمان أنّ مرسِل الرسالة الإلكترونية هو نفسه مالك النطاق الذي يتواجد فيه مفتاح DKIM. أن يحدّد أن محتويات الرسالة الإلكترونية لم تتعرض للتعديل أو التبديل أثناء انتقالها من المرسل إلى المستلم. ولهذا السبب، تعدّ مفاتيح DKIM إحدى أقوى أدوات الاستيثاق التي يمكنك الاستفادة منها، والتي يمكن أن تضمن من خلالها نجاحًا طويل الأمد لحملتك التسويقية. لماذا يجدر بك الاهتمام باستيثاق البريد الإلكتروني إن ازدياد أهمّية استيثاق البريد الإلكتروني ما هو إلا نتيجة مباشرة لاستغلال هذه المنصّة وبشكل مستمر كوسيلة للاحتيال والتصيّد، الأمر الذي يدفع مزودي خدمات الإنترنت وخدمات البريد الإلكتروني إلى اعتماد معايير أكثر قوة لحماية المستخدمين من الرسائل المزعجة ورسائل الاحتيال الإلكتروني. وكلّما اعتمد مزوّدو خدمات الإنترنت سياسات أكثر صرامة في هذا المجال، فإن مرسلي الرسائل الذين لم يوثّقوا حساباتهم سيواجهون صعوبات أكبر في إرسال رسائلهم الأمر الذي يهدّد بشكل جدّي نجاح حملاتهم التسويقية عبر هذه المنصّة. إن استيثاق البريد الإلكتروني يعدّ من الأمور المهمّة لتحقيق نجاح طويل الأمد في حملتك التسويقية، شأنه في ذلك شأن العناصر الأخرى المطلوبة لتحقيق هذا النجاح كجودة القائمة البريدية أو قوة تصميم الرسالة الإلكترونية ومضمونها. ختامًا إن توثيق البريد الإلكتروني يسهم في تقليل احتمالية تعرّض علامتك التجارية لعمليات احتيال أو سرقة، إلى جانب أنه يساعد رسائلك الإلكترونية للوصول إلى المشتركين بصورة أفضل. إن لم تقم بعد بتوثيق حملتك التسويقية عبر البريد الإلكترونيّ، فقد حان الآن الوقت المناسب للقيام بذلك. ترجمة - وبتصرّف - للمقال Solving the mystery that is email authentication لصاحبه James Smart.
  8. قدّمنا في Intercom يد العون إلى المئات من عملائنا وذلك لمساعدتهم في توجيه الرسائل الخاصّة بهم إلى عملائهم بالصورة الصحيحة، ولتحسين عملية جدولة الرسائل التي سيرسلونها إلى عملائهم. إن لم تكن قد وضعت جدولًا زمنيًا ينظم عملية إرسال الرسائل الخاصة بمنتجك أو تطبيقك، فإليك خمسة أنواع من الرسائل التي يمكن أن تكون مفيدة للجميع وفي متناول اليد. 1. رسائل تهيئة العملاء الجدد Onboarding message: إن الأهداف الرئيسية من رسائل تهيئة العملاء الجدد هي: الترحيب بالعملاء وتعريفهم بالمنتج. إتاحة فرصة للتواصل مع صاحب المنتج في حال وجود أي سؤال أو استفسار. توضيح الخطوة التالية التي سينتقل إليها العميل. مع الأسف الشديد، يكتفي الكثير من أصحاب التطبيقات بإرسال رسالة إلكترونية ترحيبية معتقدين بأن عملهم قد انتهى عند هذه النقطة، ولكن هذه طريقة خاطئة للتواصل مع العملاء، إذ أن أفضل وقت للترحيب بهم هو عندما يبدؤون حقًّا باستخدام التطبيق، وليس بعد ساعة أو أكثر. وتشير جميع المعلومات والإحصاءات التي بين أيدينا إلى أن هناك احتمالًا أكبر لقراءة رسائل الترحيب التي ترسل داخل التطبيق والنقر عليها والاستجابة لها؛ لذا فإننا ننصح عملائنا ونحثّهم على إرسال هذا النوع من الرسائل إلى عملائهم. 2. التسويق التفاعلي والتسويق في دورة حياة العميل بعد أن يتعمّق العميل في استخدام منتجك أكثر فأكثر، تظهر الحاجة إلى تقديم المزيد من الفائدة وتسليط الضوء على المزيد من المزايا والخصائص التي يتضمنها، لكن وفي نفس الوقت يجب التأكد من أن هذه الرسائل تصل إلى العميل في الوقت المناسب. في Intercom على سبيل المثال، لا تقدّم مزايا مثل الأوسمة أو اختصارات لوحة المفاتيح فائدة تذكر للمستخدمين الجدد؛ لهذا نبدأ بالترويج لها عندما تكون الظروف ملائمة بالنسبة للمستخدم، كأن يدخل المستخدم إلى التّطبيق لـ 20 أو 40 أو 60 مرة، وعندما يكون هناك أكثر من 20 محادثة مع عملائه. في مثل هذه الحالة تظهر حاجة المستخدم إلى مزايا وخصائص مثل اختصارات لوحة المفاتيح أو الأوسمة أو غيرها. ويمكن استخدام رسائل تفاعلية مرتبطة بزمن معين أو حدث معين وذلك لكي: تروّج لمزايا أقوى في منتجك. مساعدة العملاء في عملية التأهيل. حثّ المستخدمين على الترقية، المتابعة، الإعجاب، الاشتراك، أو الإشارة. من الضرورة بمكان الاعتماد على عدد مرات الاستخدام (10 جلسات، 20 تقرير… الخ) لإرسال الرسائل إلى المستخدمين بدلًا من الاعتماد على الوقت (يوم واحد، يومان، 7 أيام… الخ). إذ أنّ الطريقة الأولى تقدّم لك صورة أكثر وضوحًا وجلاءً للوقت الذي يجب أن ترسل فيه رسائلك إلى العملاء. وعندما تطلب من المستخدمين القيام بشيء يعود عليك بالفائدة (كأن تطلب إعادة التغريد، أو الإعجاب، أو مراسلة صديق) حاول دائمًا أن تقرن هذا الطلب بحدث ذي قيمة بالنسبة للمستخدم مثل “لقد وصلت ساعات استخدامك للتطبيق إلى 10 آلاف ساعة، وإنه من دواعي سرورنا لو قمت بـ…” أو “لقد كانت هذه رسالتك ذا الرقم 10,000، لم لا…”. 3. تنمية العميل لا شكّ أنّك ستحصل بعد إطلاق منتجك على عدد من المستخدمين المميزين الذين ستعاملهم معاملة خاصة، وقد يكون هؤلاء العملاء هم الذين يدفعون مبالغ أكبر من بقية العملاء، وقد يكونون المستخدمين الأوائل earlyvangelist (يقصد بهم أولئك العملاء الذين يقدمون على شراء المنتج قبل إصدار نسخة كاملة منه وينشرون أخبار المنتج بين أصدقائهم وعائلاتهم وزملائهم في العمل)، أو قد تكون شركة ذات سمعة كبيرة وقد يكون وجود علامتها التجارية على الموقع الإلكتروني التسويقي الخاص بمنتجك أمرًا رائعًا. وعلى أي حال، عليك أن تولي مثل هؤلاء العملاء اهتمامًا كبيرًا، وهذا يعني أن عليك التواصل معهم بصورة شخصية. لكن القيام بهذا الأمر يدويًّا يعني التوجه إلى الحسابات الجديدة مرة أو مرتين في الأسبوع، وتفحص معلومات الحساب ثم كتابة الرسائل لكل حساب على حدة، وهذا عمل مضنٍ. في الواقع، هناك حل آخر، إذ يمكنك استخدم الأوسمة مع العملاء الذين ترغب في التواصل معهم، ثم توجيه الرسائل الخاصّة بهم بالاستناد إلى هذه الأوسمة. إليك مثالًا عن الطريقة التي استخدمناها في أيامنا الأولى في Intercom. في بدايات Intercom كانت مفكرتي مكتظة بمثل هذه الرسائل، وقد كانت سببًا في تكوين علاقات طويلة الأمد مع الكثير من عملائنا المتميزين. 4. التغذية الراجعة Feedback ذكرنا فيما سبق أنّه لا يمكن بأي شكل من الأشكال أن تتجاهل الوقت الذي يرسل فيه العميل تغذيته الراجعة والمكان الذي يقوم فيه بذلك، فالعملاء النشطون يمتلكون أفكارًا ومشاكل تختلف بين اليوم الثاني واليوم العشرين من استخدام المنتج. بمعنى أنه عندما تزداد خبرة العملاء في استخدام المنتج، تتحول التغذية الراجعة من مجرّد ردّة فعل إلى تصوّر دقيق حول الوظيفة التي كان العميل يأمل في الحصول عليها عند شراء المنتج. ومن الطرق السهلة للحصول على هذا النوع من التغذية الراجعة هي تهيئة عدد من الاستبيانات التي يتم إرسالها في الوقت المناسب، وتساعد هذه الاستبيانات في التمييز بين ردود الفعل “من المؤكد أن على IPhone أن يدعم Flash؟” وبين التغذية الراجعة المدروسة “أودّ لو تكون هناك طريقة أسرع في التبديل بين التطبيقات”. إلى جانب ذلك، تساعد هذه الاستبيانات على تحديد المشاكل التي يعاني منها عملاؤك المخلصون بشكل استباقي، وهذا يعني أنّك ستكون قادرًا على حلها قبل أن تتفاقم المشكلة وتكون سببًا في ترك العميل للمنتج. 5. رسائل الاستبقاء (Retention messaging) إن أغبى رسالة استبقاء رأيتها على الإطلاق هي “نحن نفتقدك … نرجوك، سجّل دخولك مرة أخرى”، والمثير للدهشة أنه حتّى هذه الرسالة وأشباهها تبلي بلاءً حسنًا في استبقاء العملاء. من وجهة نظري، فإن أفضل رسالة استبقاء شاهدتها كانت عبارة عن رسالة إلكترونية تتضمن جميع الخصائص والمزايا التي تمت إضافتها في الأيام الثلاثين الماضية، وتُرسل هذه الرسالة إلى المستخدمين غير النشطين خلال تلك الفترة. بهذه الطريقة ستضمن أنّ المستخدمين سيطّلعون على المزايا الجديدة التي لم يسمعوا بها من قبل، إضافة إلى أنّ هذا النوع من الرسائل يتبع قاعدة مهمة في مجال التواصل مع العملاء وهي: “لا تخبر الناس بأن يقوموا بعمل معين، بل حثّهم على القيام به”. ابدأ الآن لا أعتقد أنني قادر على تحمل البقاء في شركة ناشئة لا تستطيع وضع جدول جيّد للرسائل سترسلها إلى عملائها، مع أنّي قضيت 10 سنوات في تقديم الاستشارات والعمل مع الشركات الناشئة وتأسيسها كذلك. بصرف النظر عن الأداة التي تستخدمها، جرب اتباع ما ورد في هذا المقال. أنا أعلم أنّه من المغري أن تحتفظ بهذه المقالة لتعود إليها في وقت آخر، ولكنّ جدولة الرسائل من الأمور التي تحتاج إلى القليل من الجهد والتي تعود عليك بمردود كبير جدًّا؛ لذا ابدأ الآن. ترجمة - وبتصرّف - للمقال 5 simple messages to engage your customers لصاحبه Des Traynor.
  9. المسارات في Django

    تعرفنا في الأجزاء الثلاثة السابقة من هذه السلسلة على إطار العمل Django وكيفية تنصيبه وبدأنا بالفعل بإنشاء تطبيق الاقتراعات من خلال هذا الإطار، وتعرفنا بشكل مبسط على المسارات والعروض وطريقة ربطها ببعض، كما تعرفنا كذلك على طريقة التعامل مع قواعد البيانات باستخدام النماذج وكيفية تهجير قواعد البيانات وطرق الاستعلام المختلفة المتوفرة في Django. وفي الجزء الرابع من هذه السلسلة سنتكلم عن المسارات URLs وآلية عملها بصورة أوسع، وسنتطرق في حديثنا إلى كيفية الاستفادة من التعابير النظامية Regular expressions لجعل مسارات تطبيقنا (تطبيق الاقتراعات) أكثر ترتيبًا ووضوحًا. من المؤكّد أنّك وأثناء تجوالك في مواقع الإنترنت قد شاهدت روابط كهذه: “ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B” هذا الشكل من الروابط غير مرغوب فيه على الإطلاق في Django، إذ يستخدم هذا الإطار مفهوم أنماط المسارات URL patterns لإظهارها بصورة مرتبة وواضحة وذات دلالة في نفس الوقت. والمقصود بأنماط المسارات بكل بساطة هو أن تمتلك المسارات نسقًا معينًا، مثل: /newsarchive/<year>/<month>/ هذا يعني أنه للوصول إلى أرشيف الأخبار في هذا الموقع، ينبغي كتابة كلمة newsarchive ثم كتابة السنة المطلوبة يليها الشهر المطلوب، وما سيفعله Django هنا هو البحث ضمن مسارات التطبيق عن أي مسار يطابق ما أدخله المستخدم، لتفعيل العرض المرتبط بذلك المسار، ويعتمد Django على التعابير النظامية Regular Expression لإجراء عملية البحث، وسنتكلم عن هذا بشيء من التفصيل بعد قليل. مسارات تطبيق الاقتراعات سيؤدي تطبيق الاقتراعات الذي نعمل على إنشائه المهام التالية: صفحة رئيسية index تعرض عددًا من الأسئلة المطروحة في الموقع. صفحة تفاصيل السؤال detail تعرض سؤالًا معيّنًا إلى جانب الأجوبة المتاحة لهذا السؤال للتصويت. صفحة نتائج results تعرض النتائج المتعلقة بسؤال معين. عملية التصويت، والتي يتم من خلالها التصويت على جواب معين مرتبط بسؤال معين. وكما ذكرنا في الدروس السابقة فإنّ عملية إرسال الطلبات وتلقي الإجابة عليها هي مهمة العروض؛ لذا سننشئ أربعة عروض يختص كل منها بمهمة محددة من المهام الأربعة الخاصة بالتطبيق. افتح ملف polls/views.py في محرر النصوص المفضل لديك، ثم أضف الشيفرة التالية بعد دالة index التي أضفناها إلى هذا الملف في الدرس الثاني. def detail(request, question_id): return HttpResponse("هذا هو السؤال %s." % question_id) def results(request, question_id): response = "هذه نتائج السؤال %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("أنت تصوت على السؤال %s." % question_id) الدالة الأولى هي دالة detail وهي المسؤولة عن عرض تفاصيل السؤال الذي يرغب المستخدم التصويت عليه، أما الدالة الثانية results فمسؤولة عن عرض نتائج التصويت على سؤال معين يختاره المستخدم، أما الدالة الثالثة vote فتتحكم في عملية التصويت التي يقوم بها المستخدم. ستؤدي هذه الدوال في الوقت الحاضر مهمّة واحدة بسيطة وهي عرض عبارة خاصّة بكل دالّة على المتصفح مع إضافة معرّف السؤال الذي سيختاره المستخدم، وذلك للتعرف على آلية عمل المسارات في Django، وسنعود إلى هذه العروض في الدروس القادمة وبشكل تفصيلي لإضافة الشيفرة التي ستعطي النتيجة الفعلية المطلوبة من كل دالة من هذه الدوال. لعرض نتائج هذه الدوال على المتصفح، سنحتاج إلى ربطها بمسارات خاصة، تمامًا كما فعلنا في الدروس السابقة، ولكننا سنستخدم التعابير النظامية هذه المرة لتعيين نمط المسار الذي نرغب بربطه مع كل دالة في ملف العروض. عزل مسارات التطبيق عن مسارات المشروع قبل أن نبدأ عملية ربط المسارات بالعروض، سنتطرق إلى إحدى الممارسات التي يُنصح اتباعها بشدة عند تطوير التطبيقات باستخدام إطار العمل Django، ألا وهي عزل مسارات التطبيق عن مسارات المشروع. تتمتع تطبيقات Django بعدم ارتباطها بالمشروع الذي يحتويها، بمعنى أنّه يمكنك استخدام تطبيق الاقتراعات هذا في أي مشروع ترغب به، دون الحاجة إلى إجراء أي تعديل في بنية وهيكلية التطبيق. وتحقيق هذا الأمر لا يتطلب سوى عزل المسارات الخاصة بالتطبيق في ملف منفصل، ثم الإشارة إلى هذا الملف في ملف المسارات الرئيسي الخاص بالمشروع لتصبح مسارات التطبيق الخاصة جزءًا من مسارات ذلك المشروع. ولعزل مسارات تطبيق الاقتراعات عن المسارات الرئيسية للمشروع، توجّه إلى ملف mysite/urls.py وعدّله ليصبح بالشكل التالي: from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls), ] قمنا في السطر الأول باستيراد الدالة include والتي ستعمل على تضمين المسارات الموجودة في ملف polls/urls.py وربطها بالمسار polls/، كما هو موضح في العنصر الأول من قائمة urlpatterns. فعلى سبيل المثال، لو طلب المستخدم العنوان mypolls/ في المتصفح يبدأ إطار العمل في البحث عن هذه الكلمة في ملف urls.py الخاص بالمشروع، وفي حالة عدم العثور عليها تظهر صفحة خطأ للمستخدم تفيد بعدم وجود هذا العنوان. وفي حالة استخدام الدالة include يضيف Django إلى مجال بحثه الملف الذي تشير إليه هذه الدالة، بمعنى أنه لو طلب المستخدم العنوان polls/3/ مثلًا فسيتم البحث أولًا عن عبارة polls في ملف mysite/urls.py الخاص بالمشروع الرئيسي، وما أن يتم العثور على العبارة المطلوبة تبدأ الدالة include بالعمل وتبدأ عملية البحث عن العبارة التالية لـ polls (الرقم 3 في مثالنا هذا) في ملف polls/urls.py الخاص بالتطبيق والذي تشير إليه الدالة. ولعزل مسارات التطبيق في ملف منفصل، توجّه إلى مجلد polls وأنشأ فيه ملفًّا جديدًا باسم urls.py، ثم أضف فيه الشيفرة التالية: from django.conf.urls import url from . import views urlpatterns = [ # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ] لاحظ أن بنية هذا الملف مشابهة بشكل كبير للملف mysite/urls.py، حيث يتم استيراد الدالة url في بداية الملف، كما أن قائمة المسارات urlpatterns مماثلة للقائمة الموجودة في ملف mysite/urls.py. يعمل السطر الثاني في الشيفرة السابقة على استيراد ملف العروض views.py والموجود في مجلد polls والذي يضم في الوقت نفسه ملف المسارات هذا، لذا يمكن اختصار اسم المجلد باستخدام النقطة .. كيف تعمل المسارات في Django يستخدم Django المسارات كوسيلة للربط بين العنوان الذي يدخله المستخدم في شريط العناوين الخاص بالمتصفح وبين العروض التي تؤدي وظائف مختلفة ومتنوعة، فعندما يدخل المستخدم عنوانًا معينًا في شريط العناوين يبدأ Django بالبحث ضمن المسارات المتوفرة لديه في ملفات urls.py - كما ذكرنا قبل قليل - عن أي نمط يطابق المسار المدخل، فإن حصل تطابق بين العنوان الذي أدخله المستخدم وبين أحد المسارات ينفّذ Django العرض المرتبط بذلك المسار مباشرة. أما وسيلة البحث التي يستخدمها Django فهي التعابير النظامية، وهي عبارة عن سلسلة من الرموز التي تكوّن نمطًا معيّنًا يستعمل للبحث في النصوص (المسارات في حالتنا هذه) عن أجزاء تطابق هذا النمط، وتتألف سلسلة الرموز هذه من مجموعة من الحروف أو الأرقام التي تساعد في البحث عن كلمة معينة أو عبارة أو رقم معين، وإلى جانب ذلك يمكن استخدام عدد من الرموز الخاصة التي تحمل دلالات معينة في التعبيرات النظامية مثل ^، $، ؟ وغيرها. المعامل regex والتعابير النظامية تمتلك دالة url أربعة معاملات، اثنان منها معاملات إلزامية وهما regex وview واثنان اختياريان هما kwargs و name. والمعامل regex في دالة url عبارة عن سلسلة نصية خام تتضمن تعبيرًا نظاميًا، يستخدمه Django في مطابقة العناوين المدخلة من قبل المستخدم مع المسارات المتوفرة في ملفات urls.py. لتوضيح كيفية استخدام التعابير النظامية في Django سنبدأ أولًا بدالة url في ملف mysite/urls.py: url(r'^polls/', include('polls.urls')), لاحظ أن المعامل الأول يبدأ بالرمز ^، وهو أحد الرموز الخاصة في التعابير النظامية، ويشير إلى وجوب ورود الكلمة التي تلي هذا الرمز في بداية الجملة، وفي حالتنا هذه يتم البحث عن العبارات التي تبدأ بـ polls/، وهذا يعني أن العبارات polls/30 و polls/q=44 و polls/polls/polls/ و polls/sport/football/worldcup/2014 تكون كلها مطابقة لهذا النمط، إذ أنّ العبارات كلها تبدأ بـ polls/. عند استخدام الدالة include في هذا المسار، يبدأ Django بالبحث عن العبارات التي تبدأ بـ polls/ في ملف mysite/urls.py مضافًا إليها كل العبارات الموجودة في ملف polls/urls.py. يستخدم الرمز الخاص $ للإشارة إلى وجوب ورود الكلمة التي تسبق هذا الرمز في نهاية الجملة. لاحظ المثال التالي: url(r'^polls/$', views.index, name='index'), سيبحث Django في هذه الحالة عن العبارات التي تكون فيها كلمة polls/ في بداية ونهاية الجملة في الوقت ذاته، بمعنى أن العبارات polls/30 و polls/q=44 و polls/polls/polls/ و polls/sport/football/worldcup/2014 لن تكون مطابقة لهذا النمط، إذ أن كلمة polls/ تقع في بداية هذه الجمل، ولكنها ليست في نهايتها، أما العبارة polls/polls/polls فليست مطابقة لأن الكلمة المطلوبة ليست في بداية ونهاية الجملة في الوقت ذاته، فكلمة polls/ الأولى تقع في بداية الجملة وليست في نهايتها، وكلمة polls/ الأخيرة موجودة في نهاية الجملة وليست في بدايتها، وبهذا لا يحصل التطابق. لنرفع الآن من مستوى تعقيد السلاسل المستخدمة كتعابير نظامية، ونأخذ دالة url التي تربط المسار بالعرض detail في ملف polls/urls.py: url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), يستخدم Django الأقواس لالتقاط النص الذي يطابق النمط المستخدم في التعابير النظامية، ويمكن إسناد هذه القيمة إلى متغير بالشكل التالي: ?P<variable_name>، وفي مثالنا هذا سيتم إسناد القيمة المطابقة للتعبير النظامي إلى المتغير question_id. يتألف التعبير [0-9]+ من جزأين، الأول هو [0-9] ويطابق الأعداد التي تضم الأرقام من 0 إلى 9 حصرًا ولن يحدث التطابق في حال وجود أي حرف حتى مع وجود الأرقام، أما علامة + فهي إحدى الرموز الخاصة بالتعابير النظامية والتي تعني تكرار الأرقام مرة واحدة أو أكثر. هذا يعني أن Django سيبحث عن أي عبارة تبدأ بأي عدد (مثلًا: 3، 20، 4003 تطابق النمط، لكن abc، 3b2، ac3 لن تطابق النمط)، وفي حال مطابقة النمط لعبارة معينة سيتم إسنادها إلى المتغير question_id المستخدم في دالة detail الموجودة في ملف polls/views.py. للتأكد من ذلك، قم بتشغيل الخادوم الخاص بـ Django، من خلال سطر الأوامر، ثم أدخل العنوان التالي في المتصفح، ولاحظ النتيجة: http://127.0.0.1:8000/polls/33/ ما حدث هنا، هو أنك بعد أن أدخلت العنوان السابق في المتصفح، بدأ Django في البحث في ملف mysite/urls.py عن أي نمط يطابق العنوان المدخل، وبعد أن وجد أن النمط ^polls/ مطابق لهذا العنوان، بدأ المعامل الثاني للدالة url بالعمل والذي يتضمن الدالة include التي توجّه Django للبحث مرة أخرى عن العبارات التي تلي الكلمة polls/ ضمن العنوان المدخل، وتتم عملية البحث في الملف الذي تشير إليه الدالة وهو polls/urls.py، وبعد أن وجد Django أن النمط [0-9]+ مطابق لـ 33 بدأ المعامل الثاني للدالة url enter code hereبالعمل وهو تنفيذ العرض المرتبط بهذا المسار (detail) والموجود في ملف views.py. جرب تغيير الرقم (33) إلى أرقام أخرى، كذلك جرب كتابة حروف بدلًا من الأرقام ولاحظ النتائج. جرّب الآن تعديل العنوان إلى الشكل التالي، ولاحظ النتيجة: http://127.0.0.1:8000/polls/33/results/ يوضح الجدول التالي بعض التعابير النظامية والأنماط الناشئة من هذه التعابير: التعبير النظامي النمط [A-Z]+ الحروف الإنكليزية الكبيرة مع تكرارها لمرة واحدة على الأقل [A-Za-z]+ الحروف الإنكليزية الكبيرة والصغيرة مع تكرارها لمرة واحدة على الأقل [0-9]+ جميع الأرقام مع تكرار الرقم لمرة واحدة على الأقل \w يطابق هذا النمط أي كلمة \d يطابق هذا النمط أي رقم [A-Za-z0-9]+ يطابق هذا النمط جميع الحروف الإنكليزية إضافة إلى الأرقام للاطلاع بشكل أكبر على التعابير النظامية والرموز المستخدمة فيها، يمكن زيارة المواقع التالية: * Regular-Expressions.info * Regexr، يتيح هذا الموقع تجربة التعابير النظامية بصورة مباشرة في المتصفح. المعامل name المعامل name عبارة عن سلسلة نصية يمكن من خلالها تحديد اسم خاص بالمسار، وسنستفيد من هذا الاسم لاحقًا في الإشارة إلى المسار عند التعامل مع القوالب في الدروس القادمة. خاتمة تعرفنا في هذا الدرس على المسارات في إطار العمل Django وآلية عملها وكيفية الاستفادة من التعابير النظامية في إنشاء المسارات وتمرير المتغيرات إلى العروض. درسنا القادم سيكون حول العروض وأنواعها وآلية عملها، وسنبدأ بكتابة العروض المفصلة الخاصة بتطبيق الاقتراعات، وربطها بالمسارات. المصدر: توثيقات Django
  10. يمتاز مجال تصميم المنتجات بالكثير من المقارنات الشكلية وغير الحقيقية. فهل يجدر مثلًا بالمصممين أن يتعلّموا البرمجة، أم أنّ عليهم أن يركّزوا على التصميم وحسب؟ وهل عليهم الإلمام بجميع مناحي التصميم أم عليهم التخصّص في منحى معين؟ في الواقع هذه الأسئلة وأمثالها تجعلنا نبتعد عن لب الموضوع وهو أنه لا أهميّة للأسلوب المتّبع في إنجاز العمل، ما دامت النتيجة النهائية تعطي تصوّرًا واضحًا عن الرؤية التصميميّة، إذ لا تمثّل مجموعة معينة من المهارات سوى وسيلة للوصول إلى الهدف. فلو أخذت النجار على سبيل المثال، لرأيت بأنّه يستخدم تارة المنشار الياباني ذي الأسنان الحادة، وتارة يستخدم المنشار الكبير ذي السلسلة المسننة الكبيرة. وهذا يعني أن نجاح النجّار في عمله يعتمد بشكل جزئي على اختيار الأداة المناسبة للعمل. وهذا ينطبق تمام الانطباق على تصميم المنتجات، إذ تتغير المهارات المطلوبة بتغيير الظروف، وستحتاج إلى مزيج من التخصص وتعدد المواهب في مواقع مختلفة من مسيرتك المهنية. ونظرًا لكوني أحد مؤسسي فريق التصميم في Intercom فقد اكتشفت بأنّ وجود شخص متخصّص إلى جانب آخَرَ متعدّد المواهب هو من متطلبات فريق تصميم المنتجات المعاصر، ولكن الحاجة إلى كل منهما تظهر جلية في فترات مختلفة من عمر الشركة. الشركات الناشئة في مراحلها الأولى إنّ وجود عدد قليل من المصممين في الشركة يحتّم عليهم العمل على كلّ شيء، بدءًا من التفكير على مستوى المنتج، ومرورًا بالتصميم التفاعلي، والتصميم المرئي ذي الجودة العالية، وغير ذلك من الأمور المتعلقة بتصميم المنتجات. إذًا، ما هي المهارات المطلوبة من متعدد المواهب والتي يجب أن يكون مطّلعًا عليها؟ تكون المهارات الدقيقة المطلوبة هنا (كالتقنية التي يستخدمها، أو اللغة التي يُمكن الحديث بها) غير ذات أهمية إذا ما قورنت بالقدرة على متابع المنتج خلال جميع المراحل التي يمرّ بها ضمن عملية التصميم. تصف الكثير من الشركات الناشئة على هذا النوع من المُصمّمين بوصف “الحصان وحيد القرن unicorn designer” إشارة إلى الحصان الطائر ذي القرن وهو حيوان خرافي لا وجود له، لذا فأنا أعتبر أن هذه التسمية مغلوطة، فالمصمم ذو المواهب المتعددة ليس من الأمور الخيالية أو الخرافية، بل من المنطقي أن ترى مصمّمًا حاذقًا وموهوبًا يسعى إلى تزويد نفسه بالمهارات اللازمة للإلمام بجميع الأمور المتعلقة بتصميم المنتج في جميع مراحله. إن وجود مصمّم محبٍّ للاطلاع وقادر على التأقلم مع جميع متطلبات العمل أمرٌ من الضرورة بمكان. في الواقع، يعدّ الفضول وحب الاطلاع أحد أهمّ السمات التي يجب أن يتمتع بها فريق التصميم في المراحل الأولية من عمر الشركة، فبدون هذه السمة يبقى الفريق مقيّدًا بالمعلومات والمهارات التي يحملها كلّ مصمّم ضمن الفريق. أمّا المصمّمون المتعطّشون لتوسيع مداركهم فإنّهم قادرون على تعلّم مهارات جديدة والتأقلم مع الظروف المحيطة، وتطوير مهاراتهم الخاصة وتحريك الفريق ودعمه بطرق وأساليب قد تكون بعيدة عن كل التوقعات. فعندما تطلب من المصمّمين أمرًا جديدًا بالنسبة إليهم، فإن ردّة فعلهم المباشرة هي البحث والتنقيب عن الموضوع بشكل واسع، والدافع هاهنا ليس العمل، بل الدافع هو الاهتمام الشديد بكل ما يتعلّق بالتصميم من قريب أو بعيد. يمكن أن تعتبر أن هؤلاء المصممين متعددي المواهب بمثابة الغراء الذي يربط أجزاء شركتك الناشئة ببعضها البعض، إذ أن لديهم اطّلاعًا جيدًا على عدد كبير من المجالات، وبإمكانهم الحصول على الأفكار من مصادر متنوعة ومختلفة، إضافة إلى تمتعهم بالقدرة على التعاون مع جميع أفراد الفريق. الشركات الناشئة في المراحل المتوسطة إذًا، إن كان بإمكان الجميع إعداد الطعام وتحضيره، فما الحاجة إلى الطباخ المحترف؟ تصل معظم الشركات إلى مرحلة يكون فيها وجود شخص يمتلك ما يكفي من الخبرة أمرًا غير كافٍ على الإطلاق، فبعد أن يكبر الفريق ويتوسع، تظهر الحاجة إلى وجود أشخاص محترفين في مجال عملهم، أشخاص سخّروا كل طاقتهم وإمكاناتهم في مجال محدّد، كمصمّم الحركة motion designers الذي درس أصول التحريك ومبادئه، أو مصمم النماذج الأوليّة الذي يصمّم عن طريق صناعة الأشياء، أو المصمم البصري visual designer المهووس بالشبكات ونظرية الألوان ومبادئ غشطالت في التصميم. يتلخّص دور المتخصّصين في زيادة المنفعة التي تحصل عليها الشركة، إذ يكون بمقدور هؤلاء البحث بشكل عميق ضمن عدد كبير من الحلول، ويمتلكون خبرة ومعرفة واسعة في مجال عملهم وبدرجة لا يمكن لمتعددي المواهب الوصول إليها، إلى جانب تمتعهم بمستوى عالٍ من الاحترافية والإتقان في مجال عملهم بصورة لا يمكن لأقرانهم من متعددي المواهب تحقيقها على الإطلاق، كما يمكن لهؤلاء المتخصّصين أن يدربوا ويقدّموا المشورة والعون في مجال خبرتهم لبقية المصممين من أعضاء الفريق. الأمر أشبه بتزويد فريق عملك بوقود الصواريخ، الأمر الذي يؤدي إلى تحسين جميع المخرجات في مجال محدد بشكل لا نظير له على الإطلاق. النسبة الذهبية والآن، ما الذي يجب عليك فعله، هل توظّف المتخصّصين أم متعددي المواهب؟ تعتمد طبيعة المصمّمين الذين ستوظّفهم على المرحلة التي تمرّ بها شركتك الناشئة، فإن كانت في مراحلها الأولى فيجدر بك أن توظّف مجموعة من المصمّمين متعددي المواهب، وبعد أن ينضج فريقك ويتوسع، وبعد أن تبدأ المشاكل العويصة بالظهور، يمكن حينها البدء بتوظيف عددٍ من المتخصّصين. ولكن ما هو العدد الكافي من متعددي المواهب؟ وماذا عن المتخصّصين؟ في الواقع، ليس هناك نسبة معيّنة يمكن أن تكون ملائمة لجميع الشركات، ففي Intercom نحاول دائمًا الحفاظ على نسبة 5 من متعدّدي المواهب مقابل متخصّص واحد، وهذا يعني أنّنا نمتلك أوسع مقدارٍ من المهارات المطلوبة لتقديم منتجٍ ذي كفاءة عالية، وفي الوقت نفسه نمتلك أقل مقدارٍ من المهارات المطلوبة لرفع مستوى المنافسة في المواضع التي تتطلب ذلك. على كل حال، إن واجهتك مشكلة في تحديد نسبة المتخصّصين مقابل متعددي المواهب، تذكّر أن الدور الفردي أمر ثانوي، فما يهمّ هنا هو تكامل مجموعة المهارات التي تساعد على تحقيق رؤيتك الخاصة بالمنتج. وعليه، وظّف أي شخص بمقدوره تقديم يد العون لتحقيق هذا الهدف، وذلك لأنّ جميع المهارات مطلوبة في سبيل الوصول إلى الهدف المنشود. ترجمة - وبتصرّف - للمقالUnicorns don’t exist. Generalists do لصاحبه Emmet Connolly.
  11. تقدّم اختبارات A/B معلومات إحصائية عن مدى فاعلية بعض الإجراءات التي تتخذها الشركات الناشئة، ولكن يفترض أن لا يقتصر الأمر على ذلك، إذ يجب أن يكون لهذه الاختبارات تأثير على الآلية التي يتبعها فريق العمل في تحديد الأولويات الخاصة بكل مشروع. وتستخدم فرق العمل في أغلب الأحيان هذه الاختبارات للتأكد من مدى جودة الفكرة التي يقدمون على تنفيذها، فيقومون ببعض التعديلات الطفيفة على أمل أن يقود ذلك إلى تحقيق مكاسب كبيرة. ولكن قد تكون هذه الاختبارات سببًا في تقليل الإنتاجية، فالنتائج التي يتم الحصول عليها من تغييرات عشوائية (ليست ذات دلالة إحصائية على سبيل المثال) قد تؤدي إلى استنتاجات خاطئة، وحتى النتائج الجيدة غير مضمونة في هذا الجانب وذلك عندما يكون متغير الأرباح موجهًاً إلى جمهور الشركة برمّته. إن طرح الأسئلة الصحيحة والمناسبة قبل البدء بإجراء الاختبار سيساعد في التعرف على طبيعة التغييرات التي تستحق بذل الوقت والجهد والتي يمكن أن يتبلور عنها استنتاجات تعود بالنفع على المشروع / الشّركة النّاشئة. تأثير الإحصائيات هناك الكثير من المقالات التي تبيّن جملة من الأخطاء الشائعة في إجراء اختبارات A/B، وأكثر هذه الأخطاء شيوعًا هو المطالبة بالنتائج في وقت مبكر جدًّا وبالاستناد إلى الدلالة الإحصائية، ففي بعض الأحيان تكون هذه الدلالة نتيجة لوجود تأثير حقيقي، ولكن في أحيان أخرى تكون هذه الدلالة مُجرّد “فوضى” لا تحمل أيّة دلالة إحصائية، وبطبيعة الحال فإن العينة العشوائية لا تمثّل المجموع بأي شكل من الأشكال. لن تكون الدلالة الإحصائية statistical significance كافية في هذه الحالة للتمييز بين التأثير الحقيقي وبين التشويش، وهنا تظهر الحاجة إلى ما يسمى بالقوة الإحصائية Statistical power، وكلما كان مقدار القوة الإحصائية أكبر زادت نسبة اليقين في أن النشاط الذي تراه حقيقي وواقعي. وللحصول على القوة الإحصائية الكافية ولإجراء الاختبار بشكل صحيح عليك أن تطرح على نفسك الأسئلة التالية: ما هو مقدار الارتفاع الذي سيتحقق في مؤشر الأداء القياسي حسب رأيك؟ لو أخذت التأثير المطلوب بعين الاعتبار، فما هي الفترة الزمنية اللازمة لإجراء الاختبار لتحصل على نتائج دقيقة؟ هل يستحق الأمر الانتظار؟ 1- ما هو مقدار الارتفاع الذي سيتحقق في مؤشر الأداء القياسي حسب رأيك؟ لنفترض بأنّك ترغب في زيادة نسبة التسجيل في موقعك الإلكتروني، ولديك قائمة من الأفكار التي تعتقد بأنّها ستساعدك في تحقيق هذا الهدف، وتحاول معرفة الفكرة التي ترى بأنها مناسبة في هذا الصدد. إلى جانب ذلك، فإن واجهة موقعك الإلكتروني غير مقنعة من وجهة نظرك، ولكن تستغرق عملية إعادة التصميم والتطوير شهرًا كاملًا. من جهة أخرى، يمكنك أن تجرب مجموعة مختلفة من الألوان، ولن يستغرق ذلك وقتًا طويلًا. هنا سيفترض فريقك بأنه يمكن لعملية إعادة التصميم الكاملة أن ترفع نسب التحويل بمقدار 10% إلى 15%، في حين أن تغيير الألوان سيرفع نسبة التحويل بمقدار 10% إلى 11%. 2- لو أخذت التأثير المطلوب بعين الاعتبار، فما هي الفترة الزمنية اللازمة لإجراء الاختبار لكي تحصل على نتائج دقيقة؟ استخدم هذه الحاسبة لحساب حجم العينة وذلك بإدخال إجابتك على هذا السؤال. تجري هذه الحاسبة عددًا من العمليات الرياضية الإحصائية خلف الكواليس؛ ولكن من الناحية المنطقية فإنّ ملاحظة التأثيرات الطفيفة يستغرق وقتًا طويلًا، في حين أن التأثيرات الكبيرة تكون واضحة في وقت مبكر، وهذا يعني أمرًا مهمًّا للغاية: الكشف عن التغييرات الطفيفة أمر مكلف. في مثالنا السابق، يتطلب تغيير الألوان يومين فقط، ولكننا سنحتاج إلى 24 ضعف من البيانات لتجربة نسبة 1% مقابل 5% من النشاط الكامل. 3- هل يستحق الأمر الانتظار؟ عندما يكون حجم العينة معروفًا، يجب عليك التفكير في المدة الزمنية التي يحتاجها الاختبار لتحقيق نتائج يمكن الاعتماد عليها. لنفترض مثلًا بأن تدفق عملية التسجيل في الموقع هو 600 زيارة في اليوم. ستستغرق عملية إعادة التصميم الكاملة يومين لجمع المعلومات الكافية، في حين تتطلب عملية تغيير الألوان البسيطة وقتًا أطول بكثير. وهذا يعني أن المشروع الكبير (إعادة تصميم واجهة الموقع) سيستغرق 32 يومًا للتطوير والاختبار، في حين أن المشروع الأصغر (تغيير ألوان واجهة الموقع) سيستغرق 49 يومًا. ومع أن كلا المشروعين يأخذان وقتًا طويلًا غير أن المشروع الأول ينطوي على احتمالات أكبر. ركز على المشاريع التي تكون فيها فرص النجاح أكبر فكّرنا في Intercom بإمكانية أن يكون تدفق التسجيل في موقعنا أفضل مما هو عليه الآن، ولم تكن صفحة التسجيل السابقة (في الصورة أدناه) مرتبة ومنظمة بشكل جيد، إضافة إلى أن طرق الدمج integration لم تكن مرتبة بالشكل الذي يلائم المستخدمين الجدد. وبما أن تدفّق التسجيل لدينا لا يصل إلى مئات الآلاف من الزائرين، فقد أدركنا أن علينا اختبار شيء كنا نعتقد بأنّه سيحقق نتيجة أفضل. كنا نرغب في رفع نسبة التحويل لعملية التسجيل إلى 10%، وبعد أن حصلنا على البيانات الكافية، بدأنا بمقارنة النتائج ما بين التصميم القديم والحديث، ولكن النتيجة كانت مخيبة للآمال، فقد كان الفارق ضئيلًا جدًّا ولم يكن يحمل أي دلالة إحصائية. لقد كان الاختبار عديم الفائدة، ومع ذلك قررنا اعتماد التصميم الجديد، لأن تجربة المستخدم في التسجيل كانت أكثر بساطة، كما أنّها قابلة للتطوير والتحسين مستقبلًا. كيف ينطبق هذا الأسلوب على الشركات الناشئة لا تقدّم مشاريع التحسين والتطوير الصغيرة فائدة تذكر للشركات الناشئة، إذ تأخذ الاختبارات وقتًا طويلًا وتكون سببًا في صرف الانتباه عن المشاريع المجدية بالنسبة للشركة. ومن الممكن أن تشهد الشركة ارتفاعًا طفيفًا، ولكن هذا الارتفاع يتجّه نحو قمة محلية Local Maximum، أما الوصول إلى القمة الإجمالية Global Maximum فعلى الشركات الناشئة أن تقوم بتغييرات كبيرة. أما الشركات الكبيرة فقد عملت ولفترات طويلة على تحسين مستويات التدفق لديها والتعرف على عملائها بشكل أفضل؛ لذا فإن التحسينات الصغيرة والطفيفة تكون ملائمة بشكل أكبر لهذه الشركات، إذ أنّها تمتلك تدفّقًا كبيرًا من الزوّار يتيح لها الحصول على نتائج الاختبارات التي تجريها في وقت قصير، إلى جانب أن تحسينًا بنسبة 1% سيكون ذا تأثير أكبر عندما يصل عدد الزوّار إلى مئات الآلاف في اليوم الواحد. خلاصة القول: إن أجريت عددًا من الاختبارات الكبيرة، وإن استطعت أن تتفهم طبيعة عملائك بصورة جيدة، وإن تمكّنت من الحصول على تدفّق كبير من الزوّار، فسيكون بمقدورك حينها العمل على تحسينات بسيطة في شركتك الناشئة. ومن الضروري أن تدرك بأنّك لن تحصل دائمًا على النتائج التي تريدها من أي اختبار A/B تقوم بإجراء، والمهمّ هنا هو تحديد الهدف من التحسين الذي تعمل عليه ومعرفة الفترة اللازمة لإجراء الاختبار وللحصول على النتائج الصحيحة، وإلا فإنك ستخاطر باستهلاك الكثير من الموارد لتصل في نهاية المطاف إلى عائد استثمار ROI سلبي. ترجمة - وبتصرّف - للمقال A/B tests that do more than validate لصاحبه Scott Kamino.
  12. النماذج Models والاستعلام عن البيانات في Django

    تحدثنا في الدرسين السابقين عن كيفية تنصيب وإعداد إطار العمل Django على أنظمة التشغيل المختلفة، وتعرفنا كذلك على مفهومي المشروع والتطبيق، وقمنا بكتابة العرض الأول وتعرفنا بشكل مختصر على المساراتUrls. وفي الجزء الثالث من هذه السلسلة، سنتطرق إلى النماذج Models وكيفية التعامل مع قواعد البيانات من خلال Django، وسنتعرف خلال الدرس على طريقة ربط قواعد البيانات المختلفة مع Django، وكيفية إنشاء النماذج والتعامل معها وسنتطرق كذلك إلى مفهوم تهجير قواعد البيانات Migration، وسننشئ النموذج الخاص بتطبيق الاقتراعات والذي سيحتضن الأسئلة الخاصة بالاقتراع إضافة إلى الإجابات المرتبطة بالسؤال. النماذج Models أشرنا في الدروس السابقة إلى أن إطار العمل Django يتبع مبدأ العمل MVT، ويشير الحرف M هنا إلى النماذج Models، ويمكن تعريف النماذج بشكل مبسط على أنها وصف للبيانات الموجودة في قاعدة البيانات باستخدام لغة Python، وبمعنى آخر تمثّل النماذج في Django بنية قاعدة البيانات، أي ما ستحصل عليه من إجراء الأمر CREATE TABLE ولكن بلغة Python بدلًا من SQL. يستخدم Django النماذج في التواصل مع قواعد البيانات من خلال تنفيذ أوامر SQL خلف الكواليس وتقديم النتائج التي ترد من هذه الأوامر على هيئة بنية من البيانات تمثل الصفوف في جداول قاعدة البيانات. ولهذا الأسلوب في التعامل مع قواعد البيانات بعض الفوائد، فكتابة النماذج بلغة Python يزيد في الانتاجية، إذ لن يكون المبرمج مضطرًا إلى اتباع قواعد لغة أخرى أثناء العمل على التطبيق ويكون العمل مقتصرًا على لغة python، كما يسهل هذا الأسلوب متابعة النماذج وتتبع التغييرات الحاصلة عليها من خلال أنظمة تتبع الإصدارات كـ Git وغيرها، إضافة إلى ذلك تقدم نماذج Python بعض أنواع البيانات غير المتوفرة في SQL كالبريد الإلكتروني وعناوين URL وغيرها. ربط Django مع قواعد البيانات يستطيع Django التعامل مع أنواع مختلفة من أنظمة قواعد البيانات، ومن أشهرها SQLite، MySQL، PostgreSQL و Oracle. وفي مشروعنا هذا سنستخدم قواعد بيانات SQLite والتي تعتبر الخيار الأبسط والأسهل في حالة المشاريع البسيطة والصغيرة ويتم تثبيتها عند تثبيت Python وهذا يعني عدم الحاجة إلى تثبيت أي حزم إضافية، كما أنها ليست بحاجة إلى خادوم خاص تعمل من خلاله. يمكن اختيار نوع قاعدة البيانات التي سيعمل عليها المشروع من خلال ملف الإعدادات settings.py، وذلك ضمن القاموس DATABASES. يستخدم Django قواعد بيانات SQLite بشكل افتراضي، وستجد قاموس DATABASES بالشكل التالي: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } يتطلب ربط Django بقواعد البيانات الأخرى كـ MySQL و PostgreSQL تثبيت حزم الربط الخاصة بكل نوع منها، وإضافة العناصر ‘USER’، ‘PASSWORD’، و’HOST’ إلى القاموس، ويمكن التعرف إلى الحزم المطلوبة لكل نوع من أنواع قواعد البيانات في توثيقات Django. إنشاء النموذج الأول سيعتمد تطبيق الاقتراعات على نموذجين فقط هما نموذج الأسئلة ونموذج الإجابات، وسيتضمن النموذج الأول السؤال وتاريخ نشره، أما النموذج الثاني فسيتضمن الإجابات ومجموع الأصوات على كل إجابة، وسترتبط كل إجابة بسؤال معين. افتح ملف models.py في محرر النصوص المفضل لديك، ثم أضف الأسطر التالية: class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) يمكن أن نلاحظ أن كل نموذج في هذا الملف قد تم تمثيله بصنف والذي يمثل بدوره جدولًا في قاعدة البيانات، ويتضمن كل صنف عددًا من المتغيرات التي يمكن استخدامها في شيفرة Python حسب الحاجة إليها، كما تمثل اسم العمود في قاعدة البيانات. تمثل أسماء المتغيرات التي استخدمناها في الشيفرة السابقة أسماء الأعمدة في قواعد البيانات، وسنستخدم هذه الأسماء في شيفرة Python وستظهر كذلك في لوحة التحكم التي سنتحدث عنها مفصّلًا في الدروس القادمة، ويمكن التحكم في طريقة عرض هذه الأسماء في لوحة التحكم وذلك باستخدام معامل يجب تعيين قيمته قبل أي معامل آخر، كما فعلنا مع المتغير pub_date أعلاه، وبهذه الطريقة سيظهر هذا الحقل في لوحة التحكم بالاسم date published وليس pub_date. نلاحظ في الشيفرة السابقة أيضًا أننا عرّفنا علاقة تربط بين الإجابات وبين السؤال الخاص بها، وذلك باستخدام ForeignKey والتي تخبر Django بأن كل إجابة ترتبط بسؤال واحد فقط. تمتلك بعض أنواع الصنف Field عددًا من المعاملات الإلزامية، كما هو الحال مع CharField والذي يتطلب تحديد العدد الأقصى للحروف من خلال max_length. وبطبيعة الحالة تمتلك هذه الأصناف بعض المعاملات الاختيارية، كما هو الحال مع IntegerField الذي أضفنا إليه قيمة افتراضية مساوية للصفر من خلال default=0. يتم تمثيل كل حقل من حقول قاعدة البيانات بـ instance للصنف Field، مثل CharField لحقول الحروف، و DateTimeField لحقول التاريخ والوقت. يقدّم Django عددًا كبيرًا ومتنوعًا من أنواع الحقول، نورد فيما يلي بعضًا منها: الحقل الوظيفة BooleanField يتضمن قيمتي True و False، وعادة ما يكون مرتبطًا بمربع الاختيار Checkbox. CharField يستخدم هذا الحقل لإضافة السلاسل النصية Strings القصيرة والمتوسطة الحجم. DateField يستخدم للتعبير عن التاريخ. DateTimeField يستخدم للتعبير عن التاريخ الوقت. DecimalField يتيح استخدام الأرقام العشرية التي تحتوي على فواصل. EmailField عبارة عن حقل حرفي `CharField` ولكنه قادر على التحقق من أن القيمة المدخلة تمتلك صيغة بريد إلكتروني سليمة. FileField يستخدم هذا الحقل لاحتواء الملفات المرفوعة. IntegerField يتيح استخدام الأرقام الصحيحة، ويمكن استخدام الأرقام من -2147483648 إلى 2147483647 بشكل آمن مع أنظمة قواعد البيانات المختلفة. GenericIPAddressField عبارة عن عنوان IPv4 أو IPv6 على هيئة سلسلة نصية. SlugField حقل Slug. TextField يستخدم في لإضافة السلاسل النصية الطويلة. TimeField يستخدم للتعبير عن الوقت. URLField عبارة عن حقل حرفي يتضمن عنوان URL. تفعيل النموذج تستطيع الشيفرة السابقة القيام بأمور كثيرة، حيث يمكن لـ Django أن: ينشئ جدولًا جديدًا خاصًّا بتطبيقنا هذا وذلك بتنفيذ العبارة CREATE TABLE. إنشاء واجهة برمجية API خاصة يمكن من خلالها التعامل مع قاعدة البيانات التي تم إنشاؤها. ولكن قبل أن يشرع Django بأداء هذه المهام، يجب علينا تثبيت تطبيق polls في مشروعنا وذلك من خلال الإشارة إلى صنف الإعدادات الخاص به ضمن قائمة INSTALLED_APPS في ملف الإعدادات settings.py، وصنف الإعدادات الخاص بالتطبيق موجود في الملف apps.py. افتح ملف الإعدادات settings.py وابحث عن INSTALLED_APPS، ثم عدل عناصر القائمة لتصبح بالشكل التالي: INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] توجّه الآن إلى مجلد المشروع عن طريق سطر الأوامر ونفّذ الأمر التالي: python manage.py makemigrations polls يفترض أن ترى النتيجة التالية في سطر الأوامر: Migrations for 'polls': polls/migrations/0001_initial.py: - Create model Choice - Create model Question - Add field question to choice وظيفة الأمر makemigrations هي إخبار Django بأنّك قد أجريت بعض التعديلات على النماذج وأنّك ترغب في حفظ هذه التعديلات على هيئة ملف تهجير يُحفظ على القرص الصلب كملف بايثون في مجلد migrations، تحت اسم: 0001_initial.py. والآن نفّذ الأمر التالي في سطر الأوامر وذلك لتنفيذ التهجيرات وإنشاء الجداول ضمن قاعدة البيانات: python manage.py migrate يفترض أن تظهر النتيجة التالية في سطر الأوامر: Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Rendering model states... DONE Applying polls.0001_initial... OK تتلخص وظيفة الأمر migrate في البحث عن التهجيرات غير المنفّذة (يتابع Django التهجيرات غير المنفّذة من خلال جدول خاص في قاعدة البيانات يحمل الاسم django_migrations) وإجرائها على قاعدة البيانات، سواء أكانت هذه التهجيرات تتضمن إنشاء جداول جديدة أو تعديل وتحديث جداول موجودة بالفعل. إذًا يمكن تلخيص عملية إجراء التعديلات على النماذج بالخطوات الثلاثة التالية: إجراء التعديلات على النموذج في ملف models.py. تنفيذ الأمر python manage.py makemigrations لإنشاء التهجيرات المرتبطة بالتعديلات التي تم إجراؤها على النموذج. تنفيذ الأمر python manage.py migrate لتطبيق هذه التعديلات على قاعدة البيانات. الواجهة البرمجية الخاصة بالتعامل مع قاعدة البيانات ذكرنا سابقًا بأن لدى Django واجهة برمجية للتعامل مع قاعدة البيانات، وأفضل طريقة للتعرف على هذه الواجهة هي التعامل المباشر معها من خلال سطر الأوامر وعن طريق صدفة Python. للولوج إلى الصدفة نفّذ الأمر التالي في سطر الأوامر: python manage.py shell أولًا يجب استيراد صنفي النموذج Question و Choice، كما سنحتاج إلى حزمة timezone من مكتبة django.utils للتعامل مع الوقت والتاريخ: from polls.models import Question, Choice from django.utils import timezone يمكن الاستعلام عن جميع الأسئلة الموجودة في جدول Question من خلال الشيفرة: Question.objects.all() وباعتبار أن قاعدة البيانات الخاصة بتطبيقنا هذا خالية تمامًا من الأسئلة، فسنحصل على النتيجة: <QuerySet []> لإنشاء السؤال الأول سنقوم بإنشاء كائن من الصنف Question مع تعريف قيم المعاملات المستخدمة في هذا الصنف وإسناد هذا الكائن إلى متغير، وكما يلي: q = Question(question_text="What's new?", pub_date=timezone.now()) يمكن الآن حفظ السؤال الجديد في قاعدة البيانات من خلال الشيفرة التالية: q.save() والآن، يمكن الوصول إلى جميع المعلومات الخاصة بهذا السؤال وبالشكل التالي: #الحصول على نص السؤال q.question_text #الحصول على تاريخ نشر السؤال q.pub_date # تغيير نص السؤال q.question_text = “What’s up?” q.save() بعد أن أضفنا سؤالًا إلى قاعدة البيانات، سنجري استعلامًا عن جميع الأسئلة في النموذج Question: Question.objects.all() #ستحصل على النتيجة التالية <QuerySet [<Question: Question object>]> نلاحظ أن النتيجة التي حصلنا عليها غريبة بعض الشيء، فالسؤال الذي أضفناه قبل قليل لم يظهر ضمن قائمة الأسئلة، ولحل هذه المشكلة سنحتاج إلى إضافة تابع __str()__ إلى كلا الصنفين، وبالشكل التالي: from django.db import models from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible # إن كنت بحاجة إلى استخدام الإصدار الثاني من بايثون class Question(models.Model): # ... def __str__(self): return self.question_text @python_2_unicode_compatible # إن كنت بحاجة إلى استخدام الإصدار الثاني من بايثون class Choice(models.Model): # ... def __str__(self): return self.choice_text من الضروري استخدام التابع __str__() عند التعامل مع النماذج، لأن نتيجة هذا التابع ستظهر في لوحة التحكم التي يتم إنشائها آليًا من خلال هذه النماذج. وكما قمنا باستخدام أحد التوابع المعرفة مسبقًا في Django فبمقدورنا أن نستخدم توابع مخصّصة تؤدي وظائف ومهام مختلفة، ولتوضيح ذلك، قم باستيراد مكتبة datetime الخاصة بـ Python، ثم أضف الشيفرة التالية في نهاية الصنف Question: import datetime # ... class Question(models.Model): # ... def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) سيقوم هذا التابع بالتحقق من أن السؤال قد تم نشره مؤخّرًا (منذ يوم) أو منذ فترة بعيدة (أكثر من يوم). والآن يمكن استدعاء تابعنا المخصص الجديد بنفس الطريقة التي استدعينا من خلالها تابع الحفظ: q.was_published_recently() افتح الآن صدفة بايثون جديدة، واستورد الأصناف Question و Choice بنفس الطريقة السابقة، ثم نفذ شيفرة الاستعلام عن جميع الأسئلة، ولاحظ الفرق. طرق الاستعلام عن البيانات في Django لا شك أن التطبيقات على أرض الواقع تتضمن قواعد بيانات تحتوي على عدد هائل من البيانات والمعلومات، وهذا يتطلب وسيلة للاستعلام عنها حسب شرط معين، ويقدم Django طرقًا متعددة لإجراء استعلامات مخصصة وبأساليب مختلفة. يقدّم Django ثلاثة توابع خاصة بالصنف QuerySet هي: filter(), exclude(), get()، وجملة الاستعلام عبارة عن معاملات مفتاحية Keyword arguments لهذه التوابع، وتأخذ الصيغة التالية: الحقل__نوع الاستعلام = القيمة. يقوم كل تابع من هذه التوابع الثلاثة بإنشاء كائن جديد للصنف QuerySet يتضمن النتائج التي تم الحصول عليها بعد إجراء الاستعلام. يقوم التابع filter() بإرجاع جميع العناصر المتوافقة مع الاستعلام، أما التابع exclude() فيرجع جميع العناصر غير المتوافقة مع الاستعلام، أما التابع get() فيرجع العنصر الذي يطابق جملة الاستعلام، وفي حالة العثور على أكثر من عنصر واحد يقوم هذا التابع بإطلاق الاستثناء MultipleObjectsReturned وإن لم يعثر على أي عنصر فسيطلق الاستثناء DoesNotExist. إليك بعض الأمثلة التي توضح طريقة عمل هذه التوابع: يمكن البحث عن السؤال الذي يبدأ بعبارة معينة بالشكل التالي: Question.objects.filter(question_text__startswith=’What’) ستترجم هذه الشيفرة إلى عبارة SQL التالية: SELECT … WHERE question_text LIKE ‘What%’; ويمكن البحث عن سؤال معين من خلال المعرّف الخاص به، فللبحث عن السؤال ذي المعرف رقم 1، يمكن كتابة الشيفرة: Question.objects.filter(id=1) والتي تعادل عبارة SQL التالية: SELECT … WHERE id = 1; مثال على التابع exclude(): Question.objects.exclude(pub_date__gt=datetime.date(2016, 1, 3), question_text = “What’s up?”) تترجم هذه الشيفرة إلى عبارة SQL التالية: SELECT … WHERE NOT (pub_date > ‘2016-1-3’ AND question_text = “What’s up?”) يوضح الجدول التالي بعض أنواع الاستعلامات التي يقدّمها Django: نوع الاستعلام الوظيفة exact تطابق تام. iexact تطابق تام مع تجاهل حالة الأحرف. contains البحث عن كلمة مع أخذ حالة الأحرف بنظر الاعتبار. icontains البحث عن كلمة مع تجاهل حالة الأحرف. in البحث ضمن قائمة معينة. gt أكبر من gte أكبر من أو يساوي lt أصغر من lte أصغر من أو يساوي startswith يبدأ بـ istartswith يبدأ بـ مع أخذ حالة الأحرف بنظر الاعتبار. endswith ينتهي بـ iendswith ينتهي بـ مع أخذ حالة الأحرف بنظر الاعتبار. range البحث ضمن مدى معين date البحث عن تاريخ معين year البحث عن سنة معينة month البحث عن شهر معين day البحث عن يوم معين week_day البحث عن أسماء أيام الأسبوع hour البحث عن ساعة minute البحث عن دقيقة second البحث عن ثانية لنستعلم الآن عن السؤال الذي يحمل المفتاح الرئيسي primary key رقم 1 في قاعدة البيانات الخاصة بنا، وإسناد النتيجة إلى متغير: q = Question.objects.get(pk=1) يمكننا الآن الوصول إلى مجموعة الأجوبة choice_set والتي ينشئها Django تلقائيًا عند ربط الأسئلة بالأجوبة من خلال ForeignKey. q.choice_set.all() بطبيعة الحال، فإن مجموعة الأجوبة الخاصة بسؤالنا هذا فارغة، لذا سنقوم بإنشاء بعض الأجوبة وإضافتها إلى هذه المجموعة: q.choice_set.create(choice_text = ‘Not much’, votes = 0) q.choice_set.create(choice_text = ‘The sky’, votes = 0) c = q.choice_set.create(choice_text = ‘Just hacking again’, votes = 0) والآن يمكن التعرف على السؤال المرتبط بالجواب: c.question ويمكن معرفة عدد الأجوبة المتاحة لسؤال معين عن طريق التابع count(): q.choice_set.count() ويمكن حذف إجابة معينة عن طريق التابع delete(): c.delete() خاتمة تعرفنا في هذا الدرس على العنصر الأول من عناصر إطار العمل Django ألا وهو النماذج Models، وتعرفنا كذلك على طريقة التعامل مع قواعد البيانات من خلال هذه النماذج وكيفية تهجيرها والاستعلام عن البيانات برمجيًا. أما الدرس القادم فسيكون عن المسارات URLS وآلية عملها، وكيفية استخدام التعابير النظامية Regular Expressions في إنشائها. المصدر: توثيقات Django.
  13. أتمنى ألا تكون قد حدّدت بعد قيمة الاستثمار الذي ترغب في الحصول عليه وأنت تقرأ هذا المقال. سأحاول الإشارة بصورة مقتضبة إلى المراحل الأولى من التمويل seed funding التي يمكن من خلالها بناء منتجك الفعّال القاعديّ MVP، الذي لن يكلّفك في بعض اﻷحيان إلا الشيء اليسير أو ربما لن يكلّفك شيئًا، بل سيدفعك إلى التفكير بشكل أكبر في الحصول على الاستثمار بعد اكتمال بناء المنتج الخاصّ بك و/أو اكتمال التحقّق الأوليّ Initial validation. ومع ذلك فمن الممكن تطبيق المبادئ الأساسية التي سأبيّنها فيما يلي على المراحل اللاحقة من عملية التمويل. لن أقدّم إليك في هذا المقال أفضل الوسائل التي يمكنك الاستفادة منها في الحصول على التمويل كما أنّني لن أتطرّق إلى المصطلحات التي ترتبط بهذا الموضوع والتي تستخدم في المراحل اﻷولى من التمويل. إن كنت قد حدّدت المقدار المطلوب من الاستثمار وتواصلت بشأنه مع المستثمرين فسيراودك حتمًا السؤال التالي: "لماذا يعتبر هذا المقدار هو المقدار اﻷنسب؟" وهو سؤال بسيط بالنسبة للمستثمر وله ما يبرّره كذلك، ولكن غالبًا ما يلقى هذا السؤال نظرات حيرى أو مجموعة من الإجابات غير المقبولة، ولكن لا تقلق، فلدي بعض الاقتراحات التي قد تساعدك. يلخّص الشكل التالي الخطوات الرئيسية الأولى في عملية اتخاذ القرار بشأن قيمة الاستثمار المطلوب. وكما تلاحظ، فإنه يكشف عن علاقة ثلاثية الأطراف بين حجم الاستثمار، والوقت المكتسب، والمردود المتوقّع من كلٍّ من الوقت والمال. هناك الكثير من الاستثناءات لهذا المبدأ الأساسي، مثل المشاريع التجارية التي يحتاج استمرارها بالعمل إلى متطلبات كبيرة في رأس المال، أو فرص العمل التي تتسم بالمنافسة الشديدة، ولكنّي أعتقد أنّه يجدر بأغلبية الشركات التقنية الناشئة اتّباع هذه المبادئ اﻷساسية الثلاثة. وبما أننا نعالج اﻵن موضوع المقدار المطلوب من الاستثمار، فسنحلّل المتغيّرين اﻵخرين بشكل أكثر تفصيلًا. النتائج من أهم اﻷمور التي يجب عليك إدراكها أن المستثمرين لا يأبهون بالطريقة التي ستنفق فيها أموالهم (النشاطات) بقدر ما يأبهون بما ستحقّقه أو تنجزه بواسطة هذه اﻷموال (النتائج، الإنجازات). ولكن ما المقصود بـ"النتائج"؟ قد يكون المقصود هو جلب عدد كافٍ من العملاء لتحصل على حصة سوقية جيّدة أو لتحصل على سيولة نقدية إيجابية. أو يقصد بها الحصول على شريك استراتيجي يوفّر لك نفوذًا. أو المصادقة على براءة الاختراع الخاصّة بك. هذه هي النتائج التي من شأنها تقليل المخاطر التي قد يواجهها المستثمر و/أو تزيد من قيمة استثمارهم. لذا إن سألك المستثمر عن سبب اعتقادك بأنّ القيمة أو المبلغ الذي تطلبه من الاستثمار هو المقدار الأنسب، فلا تبدأ حينها بسرد الطرق التي ستنفق فيها هذه اﻷموال، ووضّح له عوضًا عن ذلك ما تتوقع أن تحقّقه من نتائج مستعينًا بالاستثمار الذي حصلت عليه. المدرج Runway إنّ من أهم الاعتبارات التي يجب الانتباه إليها عند اتخاذ قرار بشأن مقدار الاستثمار الذي ستحصل عليه هو الوقت الذي سيمنحك إياه هذا المقدار لتتمكن من إطلاق منتجك (يعرف كذلك بالمدرج Runway) آخذًا بعين الاعتبار مجموعة من الافتراضات التي تتضمنها خطتك المالية (مثل المبيعات الجديدة، العدد المطلوب من الموظّفين، وعناصر اﻹنفاق اﻷخرى). بعبارة أخرى هو المدّة الزمنية التي لا تجني فيها الشركة الناشئة أيّ أرباح وتعتمد بشكل كامل على الأموال التي يقدّمها المستثمرون. ولكن ما هي المدّة الزمنية التي يجب أن تكسبها مقابل الاستثمار الذي حصلت عليه؟ إن كنت ترى أنّ هناك فرصة حقيقية للوصول إلى حالة إيجابية من السيولة المالية positive cash flow في المستقبل القريب فقد تكون هذه المدّة هي المدّة الزمنية المثالية التي يمكنك الحصول عليها. وحتى لو قررت في وقت ﻻحق أن تتحول إلى وسيلة أخرى لتسريع النموّ بدلًا من تحقيق الأرباح، فإن معرفة مقدار الوقت اللازم أمر مهمّ أيضًا. أرى شخصيًا أن المشكلة تكمن في أنّ أغلب الشركات الناشئة تحدّد هذه المدّة الزمنية بشكل عشوائي، ثم تحدّد مقدار المال الذي سيسمح لها بالصمود خلال تلك المدّة. في الواقع غالبًا ما تتراوح المدّة الزمنية اللازمة بين سنة واحدة وسنتين. المشكلة هنا - وهي مشكلة منطقية وقد ذكرتها سابقًا - أنّ المستثمرين لا يأبهون كثيرًا بالمدّة التي ستنفق فيها هذه اﻷموال بقدر ما يأبهون لما ستحقّقه خلال تلك المدة من نتائج. لذا سننظر إلى مفهوم (المدرج) من زاوية مختلفة. إنّ طريقة التفكير بالمدّة الزمنية اللازمة مرتبطة بحقيقة مفادها أنّ القيمة المقدّرة لشركتك (التقييم) لا تزداد بشكل خطّي، حتى لو تطوّرت نتائجك المالية بشكل مطّرد. سأتكلم بعد قليل عن كيفية تأثير التقييم على مقدار الاستثمار الذي ستحصل عليه، ولكن ما ستحتاج إلى معرفته اﻵن هو أنّ هنالك مجموعة من اﻷحداث التي تؤدّي إلى حدوث طفرات في تقييمك المقدّر بمرور الوقت. ولكن ما هو نوع هذه اﻷحداث؟ اﻷمر عائد إلى موضوع "النتائج" الذي تكلمنا عنه قبل قليل. إنّها اﻷحداث المهمة واﻹنجازات الكبيرة التي تؤدّي إلى حدوث طفرة في التقييم، حتى لو لم تتأثّر النتائج المالية بشكل مباشر. بما أنّ تحديد التوقيت الذي ستحصل فيه هذه الطفرات أمر شبه مستحيل، حاول الحصول على التمويل الكافي لتتمكن من تحقيق اﻹنجازات المتوقّعة بأمان، ولتكون مستعدًا لمواجهة المفاجئات التي قد تطرأ خلال هذه المدّة (ستواجه المفاجئات بالتأكيد). أمّا تحديد مقدار الوقت الذي ستستغرقه خلال الطفرة المنتظرة فهو قرار شخصي يستند إلى مدى اطمئنانك بقدرتك على تحقيق اﻹنجازات المهمّة. إن عملية البحث عن والحصول على استثمار هي بحدّ ذاتها من العوامل التي يجب عليك مراعاتها عند اتخاذ القرار بشأن المدة الزمنية اللازمة، وبما أنّ هذه العملية برمّتها قد تستغرق 3 أشهر أو أكثر، وبما أنها عملية متعبة ومشتتة للفعالية (مقارنة بإدارة المشروع التجاري) فلن تكفيك مدة 5 أشهر ﻷنّك ما إن تنتهي من جولة الحصول على الاستثمار حتى تعود إلى جولة أخرى من جديد. يستثنى من هذه القاعدة ما يسمى بـ(الجولة الجسرية Bridge round) والتي تموَّل جزئيًا أو كلّيًّا بواسطة المستثمرين الحاليين. عادة ما تكون هذه الجولات أقل إرهاقًا وأقل تشتيتًا، ويستفاد منها في تحقيق منافع كثيرة وبنتائج في متناول اليد. بقي أمر واحد يجب عليك إدراكه وهو أنّه لا يمكنك الانتظار إلى حين بقاء 60 يومًا على نفاد اﻷموال من بين يديك (والذي يدعى بتاريخ Cash Fume) لتبدأ بمرحلة البحث على استثمار جديد، ﻷنّ المستثمر سيمتلك على اﻷرجح جميع مقومات النفوذ في عملية التفاوض. لهذا يجب أن تضع في حساباتك أن تبدأ بجولة الاستثمار القادمة قبل أربعة أشهر أو أكثر من الوقت الذي تتوقع فيه نفاد اﻷموال من بين يديك، آخذًا بعين الاعتبار جميع اﻹلهاءات المرافقة لهذه العملية. وبعبارة أخرى، إن كنت تتوقع أنه يتوجّب على الشّريك المُؤسّس الذي سيتولّى مهام الجولة الاستثمارية أن يعمل بشكل كبير على أحد الخطوات القادمة التي تحضّرون لها، فإنّك بحاجة إلى أن تجعل ذلك ضمن حساباتك. ولو أردنا تقسيم المدّة الزمنية استنادًا إلى مراحل التمويل، فإن التقسيم التالي هو الذي أرى أنّه اﻷكثر شيوعًا: ما قبل المرحلة اﻷولى (Pre-Seed) : 6-9 أشهر. المرحلة اﻷولى (Seed): 9-15 شهرًا. المرحلة أ (Series A) : 14-24 شهرًا. المرحلة ب (Series B) : 24 شهرًا أو أكثر التقييم لنتكلّم اﻵن عن اﻷمر الذي تخطئ الشركات الناشئة بالتركيز عليه منذ البداية عندما تقرّر تحديد قيمة للاستثمار اللازم ، ألا وهو تخفيض قيمة اﻷسهم Dilution. تخفيض قيمة اﻷسهم عبارة عن اشتقاق رياضيّ يتضمّن بصورة رئيسية كلًّا من التقييم والأموال الجديدة التي تم الحصول عليها. تتحكّم كلّ من النتائج السابقة والنتائج اللاحقة المتوقّعة بشكل كبير في عملية التقييم، ومع أن هناك عوامل أخرى تؤثّر على هذه العملية مثل طبيعة الفريق وحجم السوق وديناميكيته، ونموذج العمل التجاري، والكثير من العوامل اﻷخرى، إلا أنّ معظم هذه اﻷمور لا ترتبط بمقدار الاستثمار الذي ترغب في الحصول عليه. ولكن ما هي طبيعة النتائج التي يجب أن تركّز عليها؟ جرّب هذه اﻷمور: أثبت صحّة شيئًا ما. أنجز شيئًا ما. More money if you do, more money if you don’tقلل من خطورة شيء ما. تؤثّر هذه اﻷمور بشكل مباشر على طريقة تقييم المستثمرين لمقدار المقايضة بين الخسائر واﻷرباح في حال قاموا بالاستثمار في شركتك النّاشئة، وهذا هو محور عملية التقييم. بالعودة إلى متغيّر "التسلسل الزمني" ﻻحظ أنّ الحصول على استثمار كبير لتحصل على مدة زمنية طويلة (ربما تحقّق خلالها 3 أو 4 طفرات في التقييم) قد يؤدي إلى نتائج عكسية ﻷنّ تخفيض قيمة الأسهم سيكون سابقًا لأوانه. آمل أنّك قد فهمت اﻵن قيمة النظر إلى المستقبل والتفكير بالطفرات المحتملة في تقييمك المقدّر والتي ترتبط بدورها وبشكل مباشر بالنتائج التي يبحث عنها المستثمرون. كلمة أخيرة حول تخفيض قيمة اﻷسهم يبالغ الكثير من المؤسسين الذين يعملون على الحصول على استثمار في التركيز على تخفيض قيمة اﻷسهم بحيث يصبح شُغلهم الشّاغل. تكمن المشكلة في وجود طريقتين فقط للتحسين بالاعتماد على هذا اﻷسلوب. فإمّا أن تدفع بنفسك للحصول على تقييم أعلى لشركتك النّاشئة حتّى وإن لم يكن ذلك التقييم مستحقًّا أو أن تقرّر مخالفة الخطة اﻷصلية لتحصل على مبلغ أقل من الاستثمار. إنّ محاولة الوصول إلى تقييم عالٍ جدًّا سيتسبّب في زيادة المدّة التي ستستغرقها عملية الحصول على استثمار، اﻷمر الذي سيتسبب في ابتعاد بعض المستثمرين المحتملين الذين يمكن أن يقدّموا إليك الأفضل (القيمة اﻷكبر)؛ وقد يتسبّب أيضًا في مشاكل تتمثّل في ظهور عقبات في تقييم ما بعد التمويل post-money valuation وفي مرحلة الخروج (سأتكلم عن هذا بعد قليل). وإنّ قررت الحصول على مقدار أقلّ من الاستثمار فسيكون قرارك هذا سببًا في الحصول على مدرج أقصر وقد يؤدي كذلك إلى التقليل من النتائج التي يمكن تحقيقها، وسيؤثّر هذا عليك سلبًا في المستقبل. بناء على ما سبق فإني أقدّم إليك النصيحة التالية: اعمل على التّحسينات المُتعلّقة بالنموّ وليس بتلك المُتعلقّة بتخفيض قيمة اﻷسهم. تمتلك الشركة الجيّدة والتي تحتفظ بسجلّ حافل بالنموّ، خيارات غير محدودة، وهذا ما ترغب به أنت والمستثمرون معًا أهم المبادئ التي تكلّمنا عنها حتى اﻵن يسمح لك التّمويل بالحصول على مدرج (وقت) جيّد ونتائج جيّدة تتحكم النتائج بالتقييم. احصل على قدرٍ كافٍ من الاستثمار لتحقيق إنجازات تساعد على زيادة مستقبلية جيّدة في نسبة التقييم. حسّن ﻷجل النموّ، ﻻ ﻷجل تخفيض قيمة اﻷسهم. تقييم ما بعد التمويل إن كنت تحاول الحصول على الاستثمار عن طريق بيع اﻷسهم، فإن مقدار الاستثمار الذي ستحصل عليه سيؤثّر بشكل مباشر على تقييم ما بعد التمويل (تقييم ما بعد التمويل = تقييم ما قبل التمويل pre-money valuation + المقدار الذي حصلت عليه). يغفل الكثيرون عن تقييم ما بعد التمويل ولكنّه يصبح مهمًّا جدًّا عندما تكون مستعدًّا للحصول على الاستثمار مستقبلًا. إن لم تتمكن من الحصول على قيمة جديدة تفوق تقييم ما بعد التمويل عندما تحتاج إلى الحصول على الاستثمار مرة أخرى، فإنّك ستدخل فيما يسمى بـ "جولة الهبوط Down Round" وهي كلمة غير محبّبة على اﻹطلاق في مجال التمويل ﻷنّها تؤدي إلى تخفيض كبير في قيمة اﻷسهم. من المحتمل أن يضع المستثمرون بعض الشروط الاحترازية في حال دخولك في هذه الجولة، ما يعني أن الشركة ستعاني من تخفيض أكبر في قيمة اﻷسهم؛ لذا يجب أن يوفّر الاستثمار الذي ستحصل عليه الوقت الكافي لتجاوز تقييم ما بعد التمويل بشكل مريح عندما تحاول الحصول على الاستثمار مستقبلًا. إليك المثال التالي: لنفترض أنّك حصلت على مبلغ 750 ألف دولار في المرحلة اﻷولى من التمويل وبتقييم ما قبل التمويل مقداره 3 ملايين دولار، وتتوقع أن يمنحك هذا المبلغ مدة 14 شهر لتحقيق بعض اﻹنجازات المهمّة، فسيكون مقدار تقييم ما بعد التمويل هو 3.75 مليون دوﻻر بعد اكتمال ذلك التمويل. بعد مرور عامٍ تقريبًا وعندما تبدأ مهمة الحصول على استثمار بقيمة 5 ملايين دولار في السلسلة A (على سبيل المثال)، ستحتاج إلى الحصول على تقييم ما قبل التمويل بمقدار يفوق3.75 مليون دولار بفارق ملحوظ. في الواقع يجدر بك التفكير في الوصول إلى 8 ملايين دولار كحد أدنى ومن اﻷفضل أن تصل إلى 10 ملايين دولار أو أكثر. يمكنك البحث عن “Cap table calculator” (حاسبة لائحة رأس المال) إن كنت ترغب في الحصول على نموذج للفروقات الناتجة عن اختلاف سيناريوهات تخفيض قيمة اﻷسهم. كن مستعدًّا للمفاجئات يجب أن تعلم أن جميع المفاهيم التي سبق ذكرها لا تخضع لقوانين تجعلها واضحة ومحدّدة، لذا يجب عليك الاستعداد للمفاجئات واﻷمور الطارئة، فكما يقول المثل تجري الرياح بما لا تشتهي السفن. يستحيل أن تتوقع أداءك بعد مرور 9 إلى 12 شهر من اﻵن مقارنة بالتصورات التي وضعتها في خطة مشروعك التجاري، وعدم سير اﻷمور حسب ما هو مخطّط لها هو أمر مضمون تقريبًا، ولكن يصعب توقع ما إذا كانت فرص انخفاض اﻷداء هي اﻷعلى أم العكس في المراحل اﻷولية من النموّ. يقترح زميلي Jason Cohen في مقال رائع بعنوان More money if you do, more money if you don’t أنّه وفي كلتا الحالتين فإنّك بحاجة إلى المزيد من المال. يقدّم Jason في هذا المقال العديد من الأفكار إضافة إلى شرح جيّد لكل ما يرتبط بعملية اتخاذ القرار بشأن مقدار الاستثمار المطلوب. أعتقد أن الحالات المفاجِئَة التالية هي اﻷكثر شيوعًا: ملائمة المنتج للسوق ما إن تحقق بعض النجاح مع العملاء اﻷوائل، حتى تتفاجأ بحجم المعاناة التي تتكبّدها في جذب المزيد من العملاء لتصل إلى العدد المثاليّ للجمهور، لتقرر حينها أنّك بحاجة إلى إجراء بعض التغييرات على المنتج أو السوق المستهدف. النموذج الربحيّ قد تحصل الطريقة التي تجني بها اﻷموال من المنتج الذي تقدّمه على الجذب الأولي المطلوب، ولكن ذلك لا يساعد على توسيع نطاق شركتك الناشئة بالشكل المتوقع. ستحتاج حينها إلى إجراء بعض التغييرات. نموذج التوجه إلى السوق Go-to-market model بدأت البيع بطريقة معيّنة (مبيعات داخلية فقط) ولكنّك قرّرت في وقت لاحق أنّك بحاجة إلى فريق مبيعات ميدانية أو قنوات للتوزيع (على سبيل المثال)، وذلك لتنجح في التعاقد مع الشركات الكبرى من خلال عرضك اﻷعلى ثمنًا. خلاصة إن الحصول على استثمار فنّ بقدر ما هو علم (وقد يكون فنًّا أكثر منه علمًا)، ويمكنك ملاحظة أن العديد من المفاهيم التي تم شرحها في هذا المقال هي جزء من "علم" الحصول على استثمار. على الرغم من اختلاف الحالات وتباينها، إلا أنّه يمكن استنادًا إلى المفاهيم الرئيسية التي سبق ذكرها في بداية الموضوع إضافة إلى المعلومات الأخرى التي تم تفصيلها في هذا المقال، تلخيص الموضوع بالنقاط التالية: حدّد النتائج المهمّة التي يمكنك تحقيقها في وقت لاحق. حدّد ما يتطلّبه تحقيق هذه النتائج من وقت ومال (على سبيل المثال قد تكون قادرًا على تحقيق النتائج في وقت قريب ولكنّك ستحتاج إلى المزيد من المال). حدّد مقدارًا من المال ترغب في الحصول عليه بناءً على النّقطة السّابقة. حاول الحصول على قدر إضافي من المال لتكون مستعدًا لمواجهة المفاجئات. تأكد من دقّة المبلغ المقدّم بالاستناد إلى مدى معقول من التقييم وما ينتج من تخفيض للأسهم، وﻻ تنسَ أنّ تحسّن ﻷجل تحقيق النمو وبناء شركة عظيمة. اختبر افتراضات التقييم وأهمية النتائج التي تنوي تحقيقها مع مستثمرين حقيقيين. أجر التحسينات بصورة مستمرّة. إن كنت ترغب في الحصول على الاستثمار عن طريق السندات القابلة للتحويل، وتحاول اتخاذ القرار بشأن الطريقة التي يمكنك من خلالها إعلان المقدار المتوقع، فيمكنك مراجعة المقال ما الذي تحتاج معرفته حول السندات القابلة للتحويل Convertible Notes ترجمة - وبتصرّف - للمقال How Much Should You Raise? لصاحبه Gordon Daugherty. حقوق الصورة البارزة محفوظة لـ freepik
  14. شكرًا لك أخي الكريم، بقية الدروس ستُنشر قريبًا إن شاء الله
  15. هذا هو الجزء الخامس واﻷخير من الدليل الشامل للرسائل المرتبطة باﻷحداث وسنتطرق فيه إلى النوع اﻷخير من هذه الرسائل، ألا وهو رسائل الطلبات Request Emails. يمكنك الاطلاع على الأجزاء السابقة لهذا الدليل من خلال الروابط التالية: الدليل الشامل للرسائل المرتبطة باﻷحداث - الرسائل الترحيبية الدليل الشامل للرسائل المرتبطة بالأحداث - رسائل التنبيه الدليل الشامل للرسائل المرتبطة باﻷحداث - رسائل التأكيد الدليل الشامل للرسائل المرتبطة باﻷحداث - رسائل التذكير 5- رسائل الطلبات Request Emails هناك الكثير من اﻷسباب التي تدعو أصحاب المشاريع التجارية إلى طلب أمر معين من العملاء أو المستخدمين، فقد يتم إرسال الطلب بعد ثلاثين يوم من شراء المستخدم لمنتج أو خدمة معينة وذلك من خلال رسالة إلكترونية يُطلب فيها من المستخدم إبداء رأيه بالمنتج. وبالنسبة إلى شركات البرمجيات الخدمية Software as a Service فقد يكون الطلب عبارة عن رسالة إلكترونية مأتمتة يُطلب فيها من المستخدم إبداء رأيه في تجربة استخدامه للبرنامج الذي تقدّمه هذه الشركة. ولكي تكون رسائل الطلبات فعالة يجب صياغتها بعناية شديدة، وذلك ﻷن قيمة اﻹجراء الذي سيتخذه العميل أهم بكثير من العميل نفسه. ومع اﻷسف الشديد فإن هناك الكثير من المشاريع التجارية التي تعاني من هذا الموضوع. لنلق نظرة على بعض اﻷمثلة عن الشركات التي فشلت أو تمكنت من تحقيق المعايير المطلوبة في هذا النوع من الرسائل. Expedia سنبدأ هذا المقال بمثال نتعرّف من خلاله على نموذج سيء لرسائل الطلبات تقدّمه لنا Expedia في إحدى الرسائل التي ترسلها إلى عملائها. ما الذي يجعل الرسالة تحتاج إلى المزيد من العمل؟ إن أسوأ شيء في هذه الرسالة هو أنّها ليست من Expedia أصلًا، وإنما هي تغذية راجعة من شركة أخرى تدعى Feefo، وهذه فكرة سيئة تمامًا للأسباب التالية: يظهر شعار Feefo فوق شعار Expedia، ولكن ماذا لو لم أكن قد سمعت من قبل بشركة Feefo؟ قد يسبب هذا اﻹرباك أو فقدان الاهتمام بالرسالة أو الأسوأ من ذلك كله فقدان الثقة بالشركة. عنوان الرسالة "طلب تغذية راجعة لـ Expedia" لا يثير اهتمامي ولا يعزز ثقتي بالشركة، وباعتباري أحد مستخدمي المنتج الذي تقدّمه الشركة فإني أتسائل عمّا إذا كانت شركة Expedia على علم بهذه الرسالة أم ﻻ. السطر اﻷول في الرسالة هو: "لن يصل الردّ على هذه الرسالة إلى Expedia، يرجى اتباع الرابط أدناه لتتمكن من إضافة تغذيتك الراجعة". أين خدمة العملاء إذًا؟! قد يضغط بعض المستخدمين على الزر ويضيفون تغذيتهم الراجعة، ولكن البعض اﻵخر قد يستمر في قراءة الرسالة ليكتشف أن مراجعاته ستعرض بشكل علني. كيف سيدفع هذا اﻷمر هؤلاء العملاء إلى كتابة مراجعاتهم؟ إن إخفاء هذه النقطة أسفل الدعوة إلى اﻹجراء يعدّ تضليلًا صريحًا. تكاد الروابط في هذه الرسالة أن تكون معدومة، ففي البداية، تخبرني الرسالة بأنّه في حال وجود أي مشكلة مع الفندق الذي أسكن فيه أو الرحلة التي أحجز على متنها، فعلي اتباع مجموعة من التعليمات: أليس من اﻷفضل استخدام الروابط العميقة؟ واﻵن بما أنني علمت بأنّ مراجعاتي ستكون معروضة بشكل علني، فقد أرغب في قراءة سياسة الخصوصية لدى Expedia. تخبرني الرسالة بإمكانية التواصل مع Expedia ولكن لا وجود لأي رابط للقيام بذلك. يبدو أن كل ما سبق لم يكن مزعجًا بما فيه الكفاية. تخبرني الرسالة بإمكانية التواصل مع خدمة العملاء في Expedia عبر البريد الاعتيادي. American Funds سنلاحظ في هذا المثال كيف يمكن للشركات الكبيرة أن تسلك المسار الصحيح في مجال التواصل مع المستخدمين. تقدم الشركة كذلك مكافآت للأشخاص الراغبين بالمشاركة بشكل طوعي، وهذا بحد ذاته يعدّ مكسبًا لكلا الطرفين. ما الذي يجعل هذه الرسالة مميزة؟ تدعو هذه الرسالة إلى اﻹجراء ذاته الذي تدعو إليه رسالة Expedia ولكن بصورة مختلفة تمامًا، حيث تبدأ هذه الرسالة بعنوان يلمح إلى أن Amercian Funds تهتم بعملائها بشكل كبير، ومع أن صياغة متن الرسالة لم يكن جيدًا بما فيه الكفاية لتحسين عملية التحويل، إلا أنّ الشركة أفلحت في تجنب ما شاهدناه في رسالة Expedia من التخبط في العلامة التجارية واستخدام أسلوب مضلل. تعدّ القائمة النقطية وسيلة توضيح جيدة - وهذا هو السبب في استخدامها في هذا الدليل -. في هذه الرسالة توضح القائمة النقطية ما سأحصل عليه في حالة اﻹجابة عن الاستبيان، وما هي اﻷمور المطلوبة للإجابة، وكيف ستستخدم الشركة المعلومات التي ستحصل عليها من هذا الاستبيان، وكل ذلك بشكل موجز ومقتضب. يمكنني القول بأنّ هذه الرسالة رسالة قوية ولكنها ليست مثالية. كنت أتمنى أن تبدأ الرسالة بمعلومات عن بطاقات الهدايا، فكل من يفتح هذه الرسالة يكون متحمسًا للتعرف على الجوائز التي تقدمها الشركة، إلا أنّ المقدّمة الحالية مربكة بعض الشيء. وأظن كذلك أنّه كان بمقدور American Funds أن تدفع المزيد من اﻷشخاص إلى النقر على الرسالة لو أنها استخدمت اﻷزرار بدلًا من الروابط البسيطة، فهذه الرسالة بصيغة HTML، واستخدام اﻷزرار فيها مناسب تمامًا، وسيعمل على جذب انتباه الزوار بشكل أكبر. Squarespace Squarespace هي من الشركات المبتكرة والمتمحورة حول العميل customer-centric، فعندما ضرب إعصار ساندي البلاد، توجّه المدير التنفيذي في الشركة Anthony Casalena إلى مقر البيانات الخاص بالشركة حاملًا معه حاويات من الوقود لتشغيل مولدات الطاقة. تلتزم Squarespace بخدمة العملاء بشكل كبير وهذا واضح في هذه الرسالة. ما الذي يجعل هذه الرسالة مميزة؟ الرسالة بسيطة جدًّا، وهذا هو سبب فعّاليتها. نلاحظ أن الرسالة تطرح السؤال: "كيف كان أداؤنا؟" ثم تقدّم طريقة سهلة جدًّا للإجابة عن هذا السؤال. زر الدعوة إلى اﻹجراء كبير وهناك تباين شديد في اﻷلوان بينه وبين خلفية الرسالة، كما أن العبارة المستخدمة في الزر واضحة ويمكن لك أن تتوقع من خلالها ما ستشاهده عند النقر على الزرّ. أحد اﻷسباب التي تدفع الناس إلى الامتناع عن النقر على اﻷزرار هو القلق الذي يساورهم حول ما سيجدونه في الجانب اﻵخر، ولكن في هذه الرسالة لا مكان للقلق على اﻹطلاق. يشعرني اﻷسلوب المستخدم في هذه الرسالة بأنَ Squarespace تهتمّ بتجربة الاستخدام بشكل كبير: "نأمل أننا كان قادرين حل المشكلة - We hope we were able to resolve your issue" "نحن نبذل قصارى جهدنا لتقديم خدمة ممتازة - We’re constantly striving to provide excellent service". "نشكرك على الوقت الذي منحته إيانا - Thank you for your time." "سيتواصل فريق رعاية العملاء معك فورًا - Our Customer Care team will be in touch with you right away". في حالة وصول هذه الرسالة إلى شخص لم يتم حل مشكلته التي طرحها من خلال تذاكر الدعم، فيمكن له وبكل بساطة الردّ على هذه الرسالة ليحصل على حل للمشكلة التي تواجهه، وهذه طريقة سهلة وفعّالة في نفس الوقت. Mint.com ليس من الضروري أن تتضمن رسائل الطلبات دعوات إلى اﻹجابة عن استبيان أو كتابة مراجعة للمنتج، فقد تطلب بعض الرسائل - كهذه الرسالة - الحصول على المساعدة لزيادة فعّالية التطبيق الذي تقدّمه الشركة، فالخدمة التي تقدّمها Mint.com ليست مفيدة دون وجود معلومات محدّثة من قبل العميل. ما الذي يجعل هذه الرسالة مميزة؟ كلما ازدادت كمية المعلومات التي تعرفها Mint عنك، كان التطبيق مفيدًا أكثر، وهذا يحتم على هذه الشركة أن تدفع المستخدمين إلى اتخاذ اﻹجراء لتحديث معلوماتهم من خلال هذه الرسالة. وتتبع الشركة أسلوب المشاركة في هذه الرسالة "نحن معًا في هذا اﻷمر We're in this together" وهذا ملائم جدًّا لما تطلبه الشركة من المستخدمين، إذ ترغب الشركة في مساعدتي ولكنها ستكون عاجزة عن ذلك إن لم أتخذ أنا الخطوة الأولى. أعتقد بأنّك تعرف ذلك الشعور الذي ينتابك عندما توشك على العطاس ولكنّك لا تتمكن من ذلك؟ ينتابني الشعور ذاته عند مشاهدة هذه الرسالة. "Mint على وشك أن يعمل ولكنّه ليس قادرًا على ذلك... فلنعالج هذه المشكلة - Mint is almost working but not quite … come fix it". لن أتمكن من مواصلة يومي إن لم أعالج هذه المشكلة. أحد مفاتيح النجاح لخدمة كالتي تقدّمها Mint هو حث المستخدمين على تحميل تطبيق الهواتف النقّالة، ومتابعة حسابات الشركة في وسائل التواصل الاجتماعي. كلّما أدركتُ أهمية الثقافة المالية بصورة أكبر ازدادت قيمة الخدمة التي تقدّمها Mint في نظري، إضافة إلى أن التطبيق يسهّل التفاعل مع الخدمة بشكل كبير؛ لذا فإن اﻹشارة إليه في هذه الرسالة خطوة ممتازة. Amazon لم تصبح Amazon الشركة اﻷولى في مجال مراجعات العملاء عن طريق الصدفة، إذ تطلب الشركة من كل شخص يشتري من الموقع تقييم المنتج من خلال النجوم وكتابة مراجعة حوله، وقد أثبتت هذه الاستراتيجية قوّتها وفعّاليتها بشكل كبير، وإليك الأسباب. ما الذي يجعل هذه الرسالة مميزة؟ ترتبط كل نجمة من نجمات التقييم بصفحة المراجعات، ولكن يتم تعبئة الحقول في تلك الصفحة بالاعتماد على النجمة التي أختارها. تؤدي هذه العملية إلى التخلص من خطوة واحدة في عملية التقييم، ولكن إن كان ذلك سببًا في زيادة نسبة التحويل بمقدار ضئيل، فسيكون لذلك تأثير كبير على شركة كبيرة مثل Amazon.\ يمكنني النقر على أي مكان في هذه الرسالة للوصول إلى صفحة المراجعة، فصورة الكتاب، وعبارة "ابدأ بتقييم الكتاب - Start by rating it" وحتى اسمي، كل ذلك يقودني إلى صفحة المراجعة. يساعد هذا اﻷسلوب في التقليل من التشتّت لدى المستخدم. تعدّ المراجعات من اﻷمور المهمّة للغاية بالنسبة إلى Amazon، لذا فهي تدعوني إلى إضافة مراجعتي على بعض المنتجات التي قمت بشرائها مسبقًا. تعلم Amazon جيّدًا أن المراجعات تقود إلى المزيد من المبيعات؛ لذا لا تتردّد الشركة عن تذكير عملائها بهذا اﻷمر كلما سنحت الفرصة لذلك. ترجمة -وبتصرّف- للمقال The Complete Guide to Transactional Email لصاحبه Chris Hexton.