المحتوى عن 'علاقات'.



مزيد من الخيارات

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

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

نوع المُحتوى


التصنيفات

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

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
  • HTML5
  • CSS
    • Sass
    • إطار عمل Bootstrap
  • SQL
  • سي شارب #C
    • منصة Xamarin
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
  • مقالات عامّة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • مقالات عامّة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات عامة

التصنيفات

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

التصنيفات

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

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

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

التصنيفات

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

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

  1. قد تكون أول عملية تعاقد مع العملاء مصدر رهبة لبعض المستقلين الذين يشقّون طريقهم في العمل الحر، إذ أنها تبدو معضلة تناقض نفسها، فلكي تحصل على أول عميل يجب أن يكون لديك عملاء سابقين يشهدوا لك بجودة عملك. لكن هذه الحالة لا تحدث دائمًا، وقد أتينا لك اليوم بثمانية مستقلين يشهدون على ذلك. فقد سألت مجتمع CloudPeeps أن يشاركونا بعضًا من قصص تعاقدهم مع أول عميل، ولم أجد فيما ذكروا قصة تشبه الأخرى! ليز كوتنهام، مصممة ومسوّقة - كيف حصلت على أول عميل لك في العمل الحر؟ "كنت أعمل كمديرة للتسويق في شركة كبيرة، وحدث أن نصحت زميلة لي غير سعيدة في وظيفتها أن تستقيل وتتجه إلى العمل الحر، وقد ردّت لي هذا الجميل حين قررت أنا أن أحذو حذوها بأن أوصت بي إلى أحد عملائها. وهكذا فإن هذه الوظيفة الأولى قد منحتني ثقة -ومالًا أيضًا- كي أستقيل وأنتقل إلى العمل الحر.” - هل لديك درس خرجت به من هذه التجربة تخبريننا به؟ "أحسن إلى كل من تقابله، فإن إحسانك ﻻ يضيع أبدًا، وتأكد أن تبقى على اتصال مع من حولك بين الحين والآخر كي ﻻ تخشى الاتصال بهم حين تحتاجهم من أجل عمل ما، فتلك الرسائل بين الحين والآخر تجنّبك اللوم على التواصل بعد أعوام من الهجر.” لوكلين ماكدونالد، مسوِّق رقمي وكاتب إعلانات - كيف حصلت على أول عميل لك؟ "كان أول عميل لي صديقًا لأحد أصدقائي قابلته قبل عدة أعوام وظللنا على اتصال على الفيس بوك، وقد كان في حاجة إلى محرر لنص كانت تعمل عليه شركته إذ كان يعمل في مجال إنتاج الأفلام، وتواصل معي بما أنه يعرف خلفيتي في الكتابة والتحرير.” - هل لديك درس خرجت به من هذه التجربة تخبرنا به؟ "يكاد كل العمل الحر الذي أحصل عليه يأتيني من طريق مشابهة للقصة التي ذكرتُ، وبرأيي فليس مهمًا أن تكون خبيرًا بمجالك، وإنما أن تعرف أشخاصًا يريدون توظيف شخص مثلك، وهنا تكمن أهمية العلاقات مع الناس بالنسبة للمستقلين.” أماندا جويراسيو، مصممة ومفسّرة علامات تجارية - كيف حصلت على أول عميل لك؟ "كان موقع Craigslist مصدرًا جيدًا للعملاء حين بدأت العمل الحر قبل عشر سنوات، وكنت أنشر إعلانات لخدماتي إضافة إلى الرد على إعلانات الوظائف التي أراها مناسبة لي، وكنت أمشّط كثيرًا من المدن الكبرى في الولايات المتحدة وليس فقط المدينة التي أسكن بها. لقد مررت بتلك المرحلة التي أرسل فيها إلى عشر عملاء وﻻ أتلقى ردًا إلا من واحد فقط، لكن ذلك الأسلوب أتى لي بأول بضعة عملاء ﻻ زال أحدهم عميلًا لي، رغم مرور عشر سنوات من أول عمل لنا معًا.” - هل لديك درس خرجت به من هذه التجربة؟ "أحيانًا تضطر إلى إرسال الكثير من الرسائل والعروض والاستعلامات كي تبدأ العجلة بالدوران، ربما تكون قد سمعت هذه النصيحة من قبل، لكن الأمر مجرد أرقام في حقيقته. أيضًا، فإن وجود موقع مميز لك -ليس حسابًا في فيس بوك أو بيهانس … إلخ- لهو نقطة كبيرة في صالحك من منظور العميل المحتمل.” إيرين فتزجيبن، كاتبة ومصوّرة - كيف حصلت على أول عميل لك؟ "إنني أرى الكتابة والتصوير زوجان ﻻ يفترقان، ولقد وقعت على الكتابة الحرة قدرًا إذ اشتركت في منحة صغيرة للأعمال ووظّفتني مرشدتي كي أكتب عن كرة القدم النسائية في كندا وأصور منها بعض المشاهد. وقد نصحتني أن أتواصل مع المجلات لأعرض خدمات الكتابة والتصوير معًا من أجل أن أزيد من فرصة قبول الناشرين لخدماتي، وساعدتني درجتي الجامعية في اللغة الإنجليزية على صقل مهاراتي.” - هل لديك درس خرجت به من هذه التجربة؟ "تعلّمت أن هناك الكثير من البرامج التي يمكنها أن تساعد رواد الأعمال على أن ينجحوا، وتعلّمت أن المرء يجب أن يستغل كل الفرص التي تأتي أمامه، فاقصد مركز الأعمال المحلّي في مدينتك واحرص على أن تستفيد من أولئك الناس الرائعين الذين ستقابلهم.” جولي، مسوّقة في LiuPierre - كيف حصلت على أول عميل لك؟ "بدأت في تقوية علاقاتي حين قررت أني سأترك وظيفتي، وتواصلت مع كل معارفي أخبرهم أني سأترك وظيفتي وأني سأكون متاحة للعمل بدوام جزئي. فتواصلت معي زميلة سابقة لي قائلة أن لديها عميلة في حاجة إلى من ينفّذ لها أعمالًا، وهكذا وقّعت على أول شراكة لي بعد بضع مقابلات.” - هل لديك درس خرجت به من هذه التجربة؟ "ﻻ تخشَ من طلب المساعدة” ميشيل زابوروجتز، مديرة شبكات اجتماعية - كيف حصلت على أول عميل لك؟ "لقد حصلت على أول عميل لي من خلال صفحة اﻷخبار في حسابي في فيسبوك!ن فقد نشر أحد أصدقائي من الجامعة منشورًا عن وظيفة تسويق حرة، وقد أوصى بي لمدير التوظيف، وحصلت على الوظيفة بعد اتصالين هاتفيين!” - هل لديك درس خرجت به من هذه التجربة؟ "ابحث في أي مكان عن الوظائف الحرة، لا أعرف كيف أشدّد أكثر على هذه النقطة، فإن انتشار العمل الحر يزيد يومًا بعد يوم، وإن الشركات ﻻ تهمل ذلك التوجه هذه الأيام، وقد وجدت وظائف حرة في كل مكان، من فيس بوك إلى CloudPeeps إلى لينكدإن، فكل ما عليك أن تبحث بعمق في كل موقع توظيف.” أكشاي ساكديفا، مستشار تسويق - كيف حصلت على أول عميل لك؟ "كنت جديدًا على عالم العمل الحر، فقد كنت أسافر كثيرًا وأردت أن أجد أول عميل لي بأسرع ما يمكن لتمويل أسفاري ولدفع فواتيري، فسجلت في منصات عمل حر كثيرة لكن لم أحصل على عملاء في أي منها، ووجدت الوظائف المتاحة فيها ذات أجور زهيدة. ثم سجّلت في CloudPeeps، وبدأت في وضع عروضي لكن لم أحصل على عملاء أيضًا، فجربت التواصل في مجتمع CloudPeeps على فيس بوك، وتحدثت مع ديفيد هاثاويي وأخبرته أني أبحث عن وظيفة، فأعطاني بعض النصائح لتطوير ملفي الشخصي، فطبّقتها مباشرة. وتواصل معي مرة أخرى بعدها بأيام قائلًا أن لديه عميلًا يبحث عن كاتب، وليس لديه وقت للعمل معه، وسألني ما إن كنت مهتمًا باﻷمر، فوافقت ﻻ شك.” - هل لديك درس خرجت به من هذه التجربة؟ “تواصل مع زملائك المستقلين وابحث عن فرص للمشاركة، واحرص على أن يكون معرض أعمالك مميزًا” ماريا ثومبسون، مخطِّطة تسويق بالمحتوى وكاتبة إعلانات - كيف حصلت على أول عميل لك؟ "كان أول عميل لي هي مدرِّبتي الصحية التي تعاقدت معها لبضعة أشهر، وكنا قد تحدثنا في مناقشات سريعة عن محتوى موقعها وتصميمه، ولما عرفت أني سأتجه للعمل الحر أرادت أن نعمل معًا.” - هل لديك درس خرجت به من هذه التجربة؟ "احرص على أن تطلب نقدًا من عملائك حين ينتهي المشروع، فمن السهل أن تنزع يدك من مشروع لتضعها في المشروع الذي يليه، لكن ذلك الوقت الذي تقضيه بعد كل مشروع في مثل هذا النقد يطوّر من مهاراتك في المستقبل، كما أن الأمر يقوّي أواصر العلاقة بينك وبين عميلك. واحرص كذلك على تجميع بيانات تستخدمها في كتابة دراسة حالة لذلك المشروع، فهذا سيخبر عملاءك المحتملين في المستقبل عن أعمالك بشكل أكثر وضوحًا.” وهكذا، من إعلانات Craigslist إلى فيس بوك، هناك الكثير من الطرق التي يمكن أن تحصل بها على عميلك الأول، خاصة إن كنت تفكر خارج الصندوق. وإنني أتمنى أن تكون هذه القائمة قد أعطتك بعض الأفكار العملية التي يمكنك تطبيقها للحصول على عملاء جدد. ترجمة -بتصرف- لمقال Eight freelancers reveal how they got their first client لصاحبته Amy Rigby حقوق الصورة البارزة محفوظة لـ FreeVector
  2. في 1790، أرادت باريس إبلاغ المسؤولين في قرية سيكس الصغيرة والتي تقع بالقرب من تولوز، أن طلبهم لجعل بلدتهم عاصمة بلديتهم قد رُفض. أرسلوا رسالتهم في مغلف أبيض إلى قرية سيكس. وصلت الرسالة ... لكن في الخامس من يونيو / حزيران 2009 أي بعد مائتين وعشرين عامًا من إرسالها. كيف يمكن لهذا أن يحدث؟ ذهبت الرسالة إلى قرية سيكس Saix، بدلا من سيكس Seix بسبب خطأ صغير في العنوان. انقضت الثورة الفرنسية، وغرقت تيتانيك، واختُرعت السيارات والطائرات، وغيرت الإنترنت وجه العالم، ووصلت الرسالة بعد أن تأخرت قرنين. قد يكون للأخطاء الصغيرة في البيانات عواقب وخيمة. إلى جانب الخطأ الإنساني، قد ننسى أحيانًا ربط البيانات بأصحابها. كثيرًا ما يقوم الناس بالتغيير في حياتهم، فهم يغيرون الوظائف والعناوين وأرقام الهواتف، وينجبون أطفال، ويتم اختراق حساباتهم، ويكبرون. ومع كل هذه التغييرات، تفتقد بياناتهم الدقة. ونتيجة لذلك، يصبح من الصعب تقديم خدمة جيدة. وهكذا يصبح الجزء الشائك هو كيفية التأكد من أن بياناتك آمنة من هذه المشاكل؟ البيانات الموثوقة هامة جدًا لإضفاء الطابع الشخصي المناسب المعلومات هي واحدة من أقوى الأدوات التي يمكن أن تستغلها الشركات - بفضل المعلومات التي يتم استخراجها من البيانات التي تم جمعها، يمكننا أن نفهم عملائنا ومنافسينا، وموضعنا في السوق وتطوير المنتجات والاستراتيجيات والتكتيكات كي ننمو ونتطور في عالم الأعمال. وإذا كانت هذه البيانات غير صحيحة، أو إذا لم يكن لدينا إمكانية الوصول إليها، فإننا نفقد الميزة التي تنتجها. كما نفقد إمكانية استخدام تلك المعلومات القيمة. في بيئة [KY1] البرمجيات المؤجرة ، يمكن للتفاعل الشخصي تحديد ما إذا كان العميل سيبقى معك أو يذهب إلى منافسك. فتصبح البيانات الموثوقة هي مفتاح إضفاء الطابع الشخصي المناسب. ثلاث طرق للحفاظ على سلامة بيانات عملاءك خلال المعرض الكبير للاتحاد الوطني للتجزئة في 2017، أجرت فورستر للاستشارات مقابلات مع حوالي 80 من محترفي الصناعة حول الاستثمارات التقنية الرئيسية لعام 2017. وكانت النصيحة الأكثر ترددًا واضحة: "التركيز على التكنولوجيا التي تخلق اتصالات شخصية مع العملاء، وتقلل من نقاط العناء أثناء رحلة المتسوق، وتُحسّن من الكفاءات التشغيلية". ولهذا السبب، فإنه من الأهمية بمكان أن تحتوي أدواتنا على بيانات اتصال حديثة ودقيقة للعملاء. وإليك كيفية تحقيق ذلك: 1. العناية المنتظمة وجدت إحدى الدراسات أن قواعد البيانات في العديد من الشركات في المملكة المتحدة تحتوي على حوالي 30 في المئة من السجلات المكررة. السجلات المكررة مكلفة - فعندما بدأت هذه الشركات في تركيب أنظمة إدارة علاقات العملاء، أدركوا أنهم كانوا يدفعون لإرسال أكثر من بريد إلكتروني لنفس المتلقي، وأن فريق الدعم يرتبك في كل مرة يحتاج أحد العملاء ذوي السجلات المتكررة للمساعدة. أصبح العديد من الشركات في الوقت الحاضر يهتم بالعناية المنتظمة للأنظمة المركزية لإدارة علاقات العملاء. فهي تقوم بتنظيف التكرارات والبيانات القديمة وما إلى ذلك. ولكن في كثير من الأحيان لا تحظى أدوات الدعم لدينا على نفس المعاملة. وعليه، فإن استخدام أدوات لتكرار التنظيف للأنظمة المركزية لإدارة علاقات العملاء لبيئات أخرى في رزم البرمجيات المؤجرة الخاصة بك قد يكون حلًا سهلًا وفعالًا لتحقيق ذلك. 2. ضمان توفر البيانات ستفقد الكثير من المال إذا تمكنت من الحصول على بيانات ذات جودة عالية ولكن لا يمكنك الوصول إليها في اللحظة المناسبة. عندما نتحدث عن "توفر البيانات"، فإننا نعني البيانات الصحيحة الموجودة على بُعد بضع نقرات من الأشخاص الذين من المفترض أن يصلوا إليها. إذا كنت تقدم الدعم عبر البريد الإلكتروني لعملائك ، فلعلك لاحظت على الأرجح كيف أن العميل نفسه يكتب من وقت لآخر من عنوان بريد إلكتروني مختلف. ينطوي هذا على تفسير واضح: لا يساور معظم العملاء قلق بشأن عنوان البريد الإلكتروني الذي يستخدمونه للاتصال بمزودي الخدمة. قد يستخدمون البريد الإلكتروني الشخصي، أو بريد العمل، أو بريدًا مهملًا، أو بريد وظيفي داخل شركتهم، وهكذا. ما لا يدركونه هو أن "عنوان المرسل" هو المرجع الذي تقوم من خلاله أداة الدعم بتجميع المحادثات السابقة أو الجارية. إذا لم تكن أداة الدعم لديك على دراية ببيانات الاتصال الكاملة، فستنشئ محادثات جديدة بدلًا من ربطها بالبيانات السابقة. ما له من آثار ضارة على جودة دعمك لعملائك. لتقديم خدمة كاملة لعملائنا، لا يجب أن يكون لدينا فقط رؤية للمحادثات ذات الصلة، ولكن أداة دعم تعرض معلومات العملاء الأكثر صلة في النسق، مثل معرف الحساب وحالة العميل وبيانات الاتصال الكاملة لإدراك المتناقضات. عندما تكون كل هذه البيانات على نفس الشاشة، يمكن لفريقك الحصول على الصورة الكاملة للعميل. 3. تقييد الدخول القيود التي تحد من الوصول إلى قاعدة البيانات تضمن أن الموظفين المؤهلين فقط يمكنهم إنشاء سجلات بيانات جديدة. يمكن أن يكون هذا سهلًا نسبيًا لوضع هذه اللوائح في الشركات الصغيرة حيث يوجد عدد قليل فقط من الموظفين لديهم اتصال مباشر مع العملاء. أما في الأنواع الأخرى من الشركات، حيث يتم إدخال البيانات بشكل مستمر بواسطة عدة وكلاء أو نقاط بيع، فمن غير المثمر إلى حد ما وضع الكثير من القيود. ولكن دون قيود، نحن أكثر عرضة للخطأ البشري. بعد إدخال البيانات الأولى، إذا كان هناك نوعان من التطبيقات الأخرى في رزمة البرمجيات المؤجرة الخاصة بك والتي يجب عليك أيضًا إدخال البيانات إليها، فإنه يصبح لديك خطر ثلاثي لوقوع الأخطاء. الحل الأفضل في هذه الحالات هو التأكد من أنك تستطيع الاعتماد على البرامج الجيدة التي تعطي الأولوية للتطبيقات أو المنصات التي تعتمد عليها أكثر من غيرها. يجب أن تكون هذه البرمجيات قادرة على رسم خريطة الحقول بطريقة ذكية بين قوائم جهات الاتصال المختلفة، ومزامنتها، ويفضل أن يكون ذلك آنيًا. البيانات الجيدة تستحق العناء تضمن البيانات الموثوقة معلومات موثوقة، وبالتالي القدرة على تقديم خدمة عملاء ذات طابع شخصي بدقة. من الصعب الحصول على بيانات موثوقة، ويجب استثمار الكثير من الوقت والجهد في جمعها واستخلاص معلومات وثيقة الصلة الموجودة فيها. لحسن الحظ، لدينا الآن أدوات متاحة للحصول على بيانات عالية الجودة والتي توفر لنا اللبنات الأساسية لنجاح أعمالنا. ترجمة –وبتصرّف- للمقال Why Data Integrity is Crucial in Customer Service لصاحبته Claudia Martinez حقوق الصورة البارزة محفوظة لـ Freepik
  3. يبدو للبعض أن تحقيق رضى الموظف عن حاله في وظيفته أمرًا مثاليًا بعيد عن الواقع، استنادًا إلى النتائج المخيبة للآمال التي خرجت بها الأبحاث التي تقيس تفاعل الموظفين طيلة الأعوام الماضية، والشركات التي أنفقت ملايين الدولارات لتحسين نشاط موظفيها وزيادة تفاعلهم، ومئات المقالات التي تقدم نصائح لزيادة تفاعل الموظفين ورضاهم في العمل. لكن رغم تلك الجهود كلها فإن مؤشر سعادة الموظفين لم يتحسن كثيرًا عن وضعه منذ خمس عشرة سنة. وقد يكون الحل لإسعاد الموظفين سهلًا ولا يكلف شيئًا في كثير من الأحيان إلا أن القول أسهل كثيرًا من الفعل، إذ أن نسبة الموظفين السعداء لا تتجاوز 13% فقط، وفقًا لإحصائية من Gallup. ولأننا نبتغي زيادة تلك النسبة من الموظفين السعداء في أعمالهم، فإننا نستعرض في هذا المقال اثنتي عشرة طريقة بسيطة ومجرّبة لتحقيق ذلك. كيفية زيادة رضى الموظفين يجب أن أشير في البداية أن أصل سعادة الموظف يعود قبل أي شيء إلى الثقة، فأهميتها تكمن في أن ما تفعله يجب أن يخرج من مشكاة ثقتك بأفراد فريقك، فلا يُعقل أن تعطي الموظف مرونة واستقلالًا ومسؤوليات أكثر إن لم تثق به من البداية! كما أن أحد أفضل الأمور التي يمكنك فعلها كقائد هي تطوير ذكائك العاطفي، فسيكون لديك حينها تعاطف أكثر، وشفقة عليهم وعرفان وتقدير لمجهودهم. دعنا ننظر الآن في الطرق التي تزيد من رضا الموظف وسعادته: 1. اجعل توقعاتك منطقية حين نظرنا في تقرير خرجنا به من دراسة حالة تفاعل الموظفين أجريناها قبل مدة أن 60% من الموظفين يلاحظون أن وظيفتهم تضر بحياتهم الشخصية، فنحن لا نملّ من القراءة في نصائح تخبرنا كيف ننجز أكثر في وقت أقل، لكن كان يجب أن ننظر في الطريقة التي نحيا بها حياة صحية ومتوازنة بين العمل والحياة الشخصية بدلًا من محاولة عصر أوقاتنا لاستخراج مزيد من العمل منها. وإنها مسؤوليتك كقائد ألا يشعر الموظف لديك أنه غارق إلى أذنيه في العمل، فإن الموظف نفسه يخشى أن يشتكي من كثرة العمل لئلا يتهم بالكسل والتخاذل. فحاول قدر وسعك أن تشجع الموظف على التحدث في مثل تلك المسألة إن وجدها أو اشتكى منها، فقد يكون من الصعب عليك أحيانًا أن تقلل من المهام في فريقك لتحقيق ذلك التوازن وفقًا لحالة المؤسسة التي تعمل فيها، فلا تهمل الاجتماعات الصادقة مع فريقك كل حين لتعيد النظر في التوقعات المرجوة منكم وما إن كانت أكثر من اللازم، ولتحث الفريق على البوح بالمشاكل التي تضايقهم. 2. قدِّر العمل الجيد اعلم أن تقدير المجهود الذي يقوم به العاملون معك في الفريق هو أسهل وأرخص الطرق لزيادة سعادتهم ورضاهم عن وظائفهم، ولا يتطلب ذلك منك إلا أن تكون واعيًا لمجهودهم الذي يبذلونه كي تبدي تقديرك لهم عليه لاحقًا. وهنا يأتي دور الذكاء العاطفي الذي تحدثنا عنه قبل قليل، فهو ما سيعينك على إدراك حاجتهم إلى إظهار التقدير لمجهودهم. وقد أظهرت أبحاثنا أن 63% من الموظفين لا يرون أنهم يتلقون التقدير الكافي، فهذه فرصة عظيمة للقادة أن يجعلوا موظفيهم فخورين بما ينجزوه. ولنأتي الآن إلى الطريقة التي ستظهر بها ذكاءك العاطفي الذي تحدثنا عنه، فلديك أداة مثل Bonusly التي استخدمناها بأنفسنا فيما مضى، كما يمكنك ذكر الأمر بأسلوب بسيط مثل إنشاء قناة عامة في Slack لتذكر فيها تلك الإشارة اللطيفة إلى مجهود أعضاء فريقك. 3. ركّز على المدى البعيد إن التفكير قصير المدى أو البحث عن تلك النجاحات السريعة لا يضر بشركتك فحسب، بل يسبب إحباطًا للموظفين أيضًا، فهم يحتاجون لمعرفة نفس الرؤية بعيدة المدى التي يراها طاقم إدارة الشركة، فذلك يرسخ قيم الشركة ورسالتها، ذلك أن رسالة الشركة شيء بعيد المدى، وارتباط الموظفين بهذه الرسالة يزيد من حماستهم للعمل. فسَلِ الموظفين لديك أين يرون الشركة بعد عشر سنين من الآن؟ وناقش إجاباتهم معهم كفريق، وسترى مقدار الحماسة التي ستدب في أوصالهم لشعورهم أن أفكارهم قد تقرر مصير الشركة. 4. تواصل أكثر من المعتاد تذكّر أن قلة التواصل هي أصل كثير من مشاكل الإحباط في العمل، وأنه لا يوجد سقف لمعدّل التواصل مع فريقك، وهذا يعني أنك يجب أن تتواصل أكثر من المعدل الذي تراه طبيعيًا، فالمعرفة قوة، وكلما تواصلت مع فريقك وزادت البيانات التي لديهم عن أدائهم وعن الشركة كان أفضل. فاعمل على خلق ثقافة مفتوحة وتواصل صادق بين فريقك، فهذا الشعور بالأمان والراحة لقول ما تشاء لأي فرد في فريقك هو عنصر أساسي لبناء فريق ناجح. 5. اهتم بسلامة الموظفين إن إظهار اهتمامك الصادق بسلامة الموظف أحد أنجح الطرق لزيادة رضاه عن الوظيفة، سواء كانت سلامة الموظف البدنية أو العقلية، وسيعود عليك بشركة هادئة خالية من الإجهاد والضغط والقلق. وبمكنك إظهار هذا الاهتمام بتوفير جدول عمل مرن أحيانًا، وإظهار ثقتك بالعاملين معك، وبتفقد أحوالهم كل حين لترى ما يمكنك فعله لمساعدتهم. أما الاهتمام بالسلامة الجسدية للعاملين فلن تحتاج إلى ميزانية كبيرة للاستثمار فيها مقارنة بالأموال التي ستخسرها نتيجة إصابة أحد الموظفين بمرض جراء إجهاد أو قلق أو قلة حركة، فيمكن أن توفر اشتراكات في صالة ألعاب رياضية، أو تخصص مكانًا لفاكهة طازجة في المكتب، أو تساعدهم في بدء نشاطات رياضية، فكل ذلك يظهر للموظفين أنك تهتم بهم. 6. اعرض عليهم فرصًا للتعلم لا شك أن النمو الشخصي هو أهم عنصر لتفاعل الموظف، فحين يتوقف الموظف عن التعلم فإنه يصاب بالملل ويبدأ بالبحث في أماكن أخرى عن محفّزات له، ولتمنع بحثه عن العمل في مكان غير شركتك عليك أن توفّر له برامج للتعلم المستمر، فسيحبك الموظف من أجل ذلك. وكمثال على ذلك، أعلنت شركة buffer مؤخرًا أنها ستمنح كل موظفيها ميزانية خاصة للتعلم لتظهر لهم أنها تقدّر نموّهم على الصعيد الشخصي. تخيل منح كل موظف ميزانية في حدود 50$ شهريًا من أجل إنفاقها على أي دورة يريدها، هذا يظهر له جليًّا أن شركته تهتم به. وأهم من هذا أن توفر وقتًا لهم كي يتعلموا فيه، فلا يُعقل أن تصرف لهم ميزانية للتعلم ثم تطلب منهم أن يعملوا 60 ساعة أسبوعيًا أو أكثر! 7. قدّم تغذية راجعة بصِفة دورية يتجنب أغلب المدراء نقد للعاملين معهم، لكن الموظف في حاجة إلى من ينتقده ويوجّهه، وليس كل موظف يتحسس من النقد كما تظن، وليس شرطًا أيضًا أن تكون أنت وقحًا في نقدك، بل يكفيك أن تكون مباشرًا وصادقًا، فسيحترمك الموظف لهذا. فخصص وقتًا للنقد الدوري عبر اجتماعات ثنائية مُجدولة مرة في الشهر مع كل فرد في فريقك، وحاول إيجاد فرصة غير رسمية للحديث كلما أمكن. 8. قِس مستوى التفاعل بشكل دوري لم تعد الاستبيانات السنوية كافية هذه الأيام، فإظهار اهتمامك بتفاعل موظفيك من أجل زيادة مستوى رضاهم عن العمل في شركتك يتطلب منك أكثر من هذا. وسواء كنت تستخدم استبيان النبضة (Pulse Survey) أو مؤشر ترويج الموظف(eNPS) أو أي استبيان آخر يقيس مدى تفاعل الموظفين، فإن العنصر الذي يجعل هذا الاستبيان فعّالًا هو تكراره على فترات مجدولة ومتقاربة. 9. لا تركّز على المِنَح فقط تحدّث جيم هارتر -كبير العلماء في gallup- في مقابلة معه عن أن المنح والمزايا التي تعطى للموظفين لا تُحدث الأثر المتوقع منها، قائلًا: وبذا نعرف أن المنح ليست سيئة في ذاتها، وإنما من الخطأ أن نركّز عليها كثيرًا ونعطيها أكبر من حقها، لكن هناك استثناء لهذا، فيقال أن المنحة/الميزة الوحيدة التي تحدث فرقًا في مستوى رضى الموظف هو الجدول المرن، ذلك أن الموظفين يحبون شعور أنهم أهل للثقة التي تسمح لهم ببعض المرونة في جدول العمل. 10. توثيق العلاقات في العمل لا يمكنك إجبار اثنين على تكوين صداقة في العمل، لكن تستطيع خلق بيئة لهذه العلاقة كي تحدث من تلقاء نفسها، عبر تنظيم أنشطة مثل الغداء الجماعي أو المشاريع الجماعية، أو أوقات ترفيه للفريق كله. ويجب أن يكون هدفك من هذا هو أن تعرّف العاملين معك أن لا بأس في أخذ استراحة خلال اليوم للتحدث مع زميل تخففًا من العمل، وهي مسؤوليتك كقائد للفريق أن تضمن نشأة وبقاء تلك العلاقات. 11. أخبر الموظف عن مستقبله المهني أحد أقوى الطرق لزيادة رضى الموظف في وظيفته هي تقديم شيء يتطلع إليه في المستقبل، فمساعدته للتخطيط على المدى البعيد لحياته المهنية يُظهر له أنك تلزم نفسك بضمان نجاحه في مسيرته المهنية، وأنك مستعد للاستثمار فيه على المدى البعيد. وتفعل هذا عبر جلسات تدريب وإرشاد لتطويره وتوثيق علاقاته في العمل، وكلما عملت معه على رسم خارطة لأهدافه المهنية كان أكثر رضى في وظيفته. 12. امنح القوة للعاملين معك يحتاج أن يشعر العاملون معك أن بيدهم قوة واستقلالية تخوّلانهم في التحكم بمهام عملهم إلى الحد الذي يمكّنهم من الانطلاق في تنفيذ العمل بالطريقة التي يحبونها. ولا يحدث هذا إلا إن وثقت بهم، لكن تلك الثقة غير كافية، فيجب أن تشعرهم أن بإمكانهم اتخاذ قرارات بأنفسهم، فدعهم يختارون المهام التي يريدون العمل عليها، والوقت الذي يرغبون في العمل عليها فيه إن كان ذلك مناسبًا، ويقتصر دورك بعدها على الإرشاد فقط. هل لديك نصائح جربتها مع الموظفين لديك لزيادة مستوى رضاهم في العمل؟ لم لا تخبرنا بها في التعليقات! ترجمة -بتصرف- لمقال Twelve Proven Strategies To Increase Job Satisfaction لصاحبه Jacob Shriar حقوق الصورة البارزة محفوظة لـ Freepik
  4. لعلك تعلم كمستقل أن ذلك اليوم الذي ستنتهي فيه وظيفتك مع عميلك آت ﻻ محالة، ربما ﻷنك تعمل على مشروع قصير الأجل، أو ربما ﻷن حاجة عميلك قد تغيرت، أو ﻷن وقتك لم يعد يسمح بالعمل على مشاريع جديدة، ومهما يكن السبب، فإني أريدك أن تتذكر نصيحة واحدة مهمة، وهي أﻻ تجعل نهاية التعاقد مع عميلك هي نهاية علاقتك معه. في الواقع، لقد ألهمتني محادثة مع صديقتي ليزا كروكّو لكتابة هذه المقالة، فقد أخبرتني أنها ﻻ زالت تتواصل مع عميلة سابقة لها، وأنهما قد بنيَتا علاقة وطيدة أساسها تواصل منتظم، ذلك يعني أن العميلة تواصلت مع ليزا مرة أخرى حين سنحت فرصة جديدة للعمل المشترك بينهما. وإني كلما فكرت في الأمر وجدت أن العديد من المستقلين ﻻ يرون حاجة أصلًا ﻹبقاء العلاقة بينهم وبين عملائهم السابقين، وقبل أن نغوص في بيان كيفية الحفاظ على هذه العلاقات بشكل بناء، دعنا نستعرض أولًا بعض الأسباب الأساسية التي تبرز أهمية الأمر: طلب التقييمات والتزكيات عن الوظيفة التي عملت بها (تأكد أن تنشر هذا على موقعك الشخصي وحساباتك الاجتماعية لكي تبني سمعتك الإلكترونية). مراجع للعملاء المستقبليين، كي يتواصلوا معهم إن طلبوا بياناتهم منك أو سألوا عنهم. التزكية وترشيح العملاء لك. أجل، فإن العملاء يخبرون أصدقاءهم عمن عملوا معه، ومن الأفضل أن يكون لديهم أمور رائعة يخبرون أصدقاءهم بها، أليس كذلك؟ لزيادة فرص العمل مجددًا مع نفس العميل في المستقبل. آمل أني نجحت في توضيح أهميّة بناء علاقات مع عملائك، وإنشاء فرص جديدة للعمل مجددًا في المستقبل، فقط، ودون أي تعقيدات. أما الآن، فإليك الجزء الذي يحمل بعض الصعوبة: كيف تبني هذه العلاقات بدون أن تبدو كأنك تجعجع فقط من أجل مزيد من العمل؟ إن الإجابة المختصرة هي أن تكون مميزًا على الدوام، فقيمة بناء علامتك الاحترافية وسمعتك ترتبط مباشرة بالانطباع الذي تتركه لدى العملاء الذين عملت معهم، وسيكفي هذا ليبقيك على اتصال معهم بشكل مميز وصادق. إليك الآن بعض النصائح التي تساعدك على البدء في علاقات بذلك الشكل: 1. أرسل رسالة شكر بعد انتهاء العمل أعرف أنك ربما تظن أن رسائل الشكر قد صارت موضة قديمة، لكن إرسال تلك الرسالة البريدية الصغيرة التي يعرف من يستقبلها أن كاتبها استغرق وقتًا وتكلف عناء صياغتها وإرسالها يحمل قيمة أكبر من كلمات الرسالة نفسها، إنها قيمة تظهر تقديرك واحترامك لعمل أو تجارة عملائك. ذلك، واعلم أنك لست مضطرًا إلى تكلف تزيين رسالتك بشكل مبالغ فيه، بل تكفيك رسالة بسيطة وصادقة تبلِّغ عميلك فيها أنك استمتعت بالعمل معه، وأنك تتمنى له الأفضل. تذكر أيضًا أن هذه الرسالة مناسبة تمامًا لسؤاله إن كان يرغب في كتابة تزكية لك إن كان قد استمتع بالعمل معك. ورغم أن تلك الرسالة تبدو أمرًا هينًا، فإنها تفتح الباب للحفاظ على التواصل بينكما في المستقبل، لئلا يبدو الأمر غريبًا حين تتواصل معه دون أن يكون هو من بدأ أولًا. 2. اطلب ترشيحات (توصيات) بعد إرسالك لرسالتك الصغيرة التي تشكر فيها عميلك على فرصة العمل المشترك بينكما، فإني آمل أن تحصل على رسالة تزكية بعدها، تستخدمها فيما بعد لتشاركها مع عملائك المحتملين. واعلم أن خطوتك التالية بعد ذلك هي طلب ترشيحات (توصيات) من عملائك لمعارفهم، فالتسويق الشفهي مثَلُه مثل الذهب الخالص، وفقًا لدراسة أجريت من قبل شركة Nielsen القابضة -شركة متخصصة في المعلومات والإحصاءات- ، فإن 92% من الناس يتبعون توصيات الأصدقاء والعائلة ويثقون بها عن كل وسائل التسويق الأخرى، تذكر أنك كلما بنيت سمعتك الخاصة، كلما طرقَت مزيد من الأعمال بابك. وإحدى طرق طلب التوصيات والترشيحات المستقبلية من عميلك هي أن تحرص على شكره مجددًا على إرسال رسالة التزكية إليك، واطلب منه بلطف أن يذكرك عند أصدقائه إن كانوا يبحثون عمن يقدم نوع الخدمات التي تقدمها. ومن المهم أيضًا أن تظل مميزًا بهويتك الخاصة حين تطلب مثل تلك الأمور، ولتعلم أنك تدير عملًا تنفق منه على معيشتك، ويتطلب منك هذا العمل أن تهيئ عملك ونفسك بطرق تبقي عملاءك يتدفقون على بابك. ﻻ تخجل من طلب ترشيحات جديدة من عملائك، فهذه إحدى الطرق التي سيعلم بها الناس أنك تبحث عن فرص جديدة. 3. تواصل بانتظام لعلك ﻻ تريد أن تكون ذلك المزعج الذي يحتل صندوق بريد ﻷحدهم ويغرقه برسائله (أنت تعرف ذلك الشخص، ولعل لديك مثله في حياتك)، لكن في نفس الوقت فإنك تحتاج أن تبقي على اتصال منتظم. إليك هذه النصائح من ليزا: 4. رشح مستقلين آخرين لعملائك إن وجدت أن مجال ما يطلبه عميلك يخرج عن نطاق تخصّصك أو قدراتك، فاغتنم تلك الفرصة لتعرِّفه على مستقل آخر قد يفيده. إن هذا يسمح لك باﻹبقاء على علاقتك مع عميلك في نفس الوقت الذي تأتي به بدعم جديد ﻹنجاز المهمة. بل إن هذا الأمر (أي ترشيح مستقلين آخرين) يشجع أصدقائك وزملاءك المستقلين على إرسال عملاء إليك أيضًا كما فعلت معهم، إنه التسويق الشفهي في دورته الكاملة!. 5. ابن الجسور بدلا من حرقها إن إنهاء العمل مع عميلك بشكل إيجابي يبشر بالخير لنجاحك كمستقل، فإذا بنيت سمعة كشخص يستطيع العملاء الثقة به والاعتماد عليه، فسيفكرون فيك مباشرة إذا كان لديهم مشروعات جديدة، وسيذكرون عملك الرائع في توصياتهم أو تزكياتهم. إن كان لديك تجربة في الحفاظ على علاقة بينك وبين عميل سابق، ونفعتك تلك العلاقة على المدى الطويل، فإننا نرجو منك أن تشاركنا بها هنا في التعليقات. وأود في النهاية أن أشكر ليزا على إلهامي بهذا المقال لمشاركتها نصائحها معنا عن كيفية بناء علاقات جيدة مع العملاء والحفاظ عليها. ترجمة -وبتصرف- للمقال How to maintain positive relationships with past clients لصاحبته Tessa Greenleaf.
  5. قبل أن نذهب إلى الموضوع الرئيسيّ للمقال، سأعطيك لمحة قصيرة عن مشاكل التصميم التي قد تواجهها. لقد اشتكى لي أحد زبائني بأن بعض الصفحات تفتح ببطء شديد. وعندما أقول ببطء شديد، فإنني أعني ذلك! فقررت أن أصحح تلك الصفحة (بعمل debugging)، وما رأيته قد صدمني. لقد أظهر لي قسم الاستعلامات (queries) أن تلك الصفحة كانت تنفَّذ بعد القيام بكم هائل من الاستعلامات تعدّى 16500 استعلامًا!! لقد وجدت أن جزءًا من النصّ البرمجي هو سبب تلك المشكلة. لقد كانت هناك ثلاث حلقات foreach تستعلم عن خاصيّة والخواص الفرعيّة التابعة لها. لقد كانت تعمل جيدًا إلى أن صار في قاعدة البيانات 5500 عنصرًا. وفيما يلي ما كان يحدث: $main_object = MainObject::all(); foreach($main_object as $object) { echo $object->some_property; foreach($object->related_object as $related) { echo $related->some_property; echo $related->another_property; } foreach($object->another_related as $another) { echo $another->some_property; echo $another->another_property; } }إذا كان الاستعلام ;()main_object = MainObject::all$ يعيد 5500 نتيجة، فستعيد حلقة foreach الأولى ذلك القدر أيضًا، وكذلك بالنسبة للثانية والثالثة. باستخدام ORM، كثيرًا ما يقع المبرمجون في فخّ كتابة استعلامات قواعد بيانات غير كفؤة، وتجعلها ORM أكثر صعوبة في الاكتشاف. تُسمّى هذه المشكلة بمشكلة N+1 (بالإنجليزيّة N+1 problem). وأظن المطور السابق لم يكن على علم بذلك. ولتفادي هذه المشكلة، نستخدم التحميل الحثيث (eager loading). ما هو التحميل الحثيث؟لتبسيط الأمر، التحميل الحثيث طريقة تُعنى بعمل كل شيء عند الطلب. وهذه الطريقة أيضًا على العكس تمامًا من التحميل الكسول (lazy loading) عندما ننفذ المهام عند الحاجة. يساعدنا التحميل الحثيث على تجنب مشكلات الأداء، كما رأيت في مثالي أعلاه. ستفهم الأمر أكثر من خلال مثال، لذا لنتخيل الوضع التالي: لدينا نموذج علاقة هيئة محسّنة (بالإنجليزيّة: Enhanced Entity Relationship، واختصارًا EER)، بثلاث هيئات، كلّ منها مرتبطة بالأخرى. يمكنك أن تقرأ EER كما يلي: يمكن لكل عضو أن يملك العديد من المحلات، ولكن المحل الواحد ملك لعضو واحد فقط. يمكن للمحل الواحد أن يحوي العديد من المنتجات، ولكن المنتج الواحد لا يكون إلّا في محل واحد. الخطوة التالية هي إنشاء نماذج Eloquent لهذه الهيئات: العضو: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Member extends Model { protected $fillable = ['username', 'email', 'first_name', 'last_name']; public function stores() { return $this->hasMany('App\\Store'); } }المحلّ: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Store extends Model { protected $fillable = ['name', 'slug', 'site', 'member_id']; public function member() { return $this->belongsTo('App\\Member'); } public function products() { return $this->hasMany('App\\Product'); } }المُنتَج: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $fillable = ['name', 'short_desc', 'long_desc', 'price', 'store_id', 'member_id']; public function store() { return $this->belongsTo('App\\Store'); } }تخيّل أنك تبني تطبيقًا يسمح لمستخدميك أن يُنشئوا محالّهم التجاريّة الخاصّة. يمكن للمستخدمين –كما هو الحال بالنسبة للمحال الأخرى كلها طبعًا– أن يُنشئوا منتَجات عديدة. وأيضًا، يمكننا أن ننشئ صفحة واحدة تعرض كل المحلات وأفضل المنتجات لكل محلّ. شيء من قبيل هذا: يمكن أن ينتهي بك المطاف إلى الحصول على شيء كهذا في المتحكّم لديك: <?php namespace App\Http\Controllers; use App\Repositories\StoreRepository; class StoresController extends Controller { protected $stores; function __construct(StoreRepository $stores) { $this->stores = $stores; } public function index() { $stores = $this->stores->all(); return \View::make('stores.index')->with('stores', $stores); } }وفي العرض الذي ستقدم فيه تلك البيانات: @foreach($stores as $store) <h1>{{ $store->name }}</h1> <span>Owner: {{ $store->member->first_name . ' ' . $store->member->last_name }}</span><br> <h2>Products:</h2> @foreach($store->products as $product) <h3>{{$product->name}}</h3> <span>{{$product->short_desc}}</span><br/><br/> <span>Price: {{$product->price}}</span><br/> <?php Debugbar::info('Product displayed'); ?> @endforeach <br/>========================<br/> @endforeachوالنتيجة كالتالي: ومن اجل هذا المثال، زوّدت قاعدة البيانات بخمس مستخدمين، وثلاثة محالّ، وأربعة منتَجات. يقوم الاستعلام الأول باستدعاء كل المحال من قاعدة البيانات، وهذا هو الجزء +1 من مشكلة N+1. في هذا المثال تحديدًا، حرف N يمثّل عدد المحلات التي أرجعها لنا الاستعلام الأول، حيث أنها تمثل عدد المرات التي سنقوم فيها بالاستعلام select * from على جدولي products و members. وبما أن لدينا 3 محلات، فسنستعلم 3 مرات على جدول المستخدمين، وثلاث مرات على جدول المنتجات. وفي النهاية، قمنا بتنفيذ الاستعلامات بعدد مرات قدره 3+3+1. تخيل الآن ما الذي يمكن أن يحدث لو كان لديك 5000 أو 10000 محل؟ سيكون لديك في تلك الحالة عشرة آلاف إلى عشرين ألف استعلام في كل مرة يقوم فيها أحد المستخدمين بزيارة الصفحة. وماذا لو كانت لديك عشرة آلاف أو مئة ألف زيارة كلّ أربع وعشرين ساعة؟ هذا كابوس! من الواضح الآن أن هذا التوجّه مدمّر للأداء. وبغض النظر عن نوع قاعدة البيانات التي تستخدمها، وعن مدى قوة الخادم الذي لديك، فستصل دائمًا إل تلك النقطة التي يقف فيها العتاد القوي لديك عاجزًا. يمكنك أن تحسّن الأداء بعمل cache لهذه الاستعلامات، باستخدام Redis على سبيل المثال. سيؤدي هذا الغرض، ولكن لبعض الوقت فقط. وبتلك الطريقة، أنت فقط تؤجل النهاية الحتميّة التي ستكلّفك الكثير من المال والوقت، وفي الغالب ستفقد بعض الزبائن، أو أنّ قاعدة بياناتك ستضعف كثيرًا. وهنا يأتي التحميل الحثيث لينقذك من هذه الورطة. استخدام التحميل الحثيث في Laravel بسيط للغاية. العلاقات التي ترغب أن يتم تحميلها بشكل حثيث تحددها في طريقة with كما يلي: $stores = Store::with('member','products')->get();الآن، بدل استخدام 7 استعلامات، قلّلنا باستخدام التحميل الحثيث عدد الاستعلامات إلى 3 فقط: وستكون ثلاثة استعلامات حتى ولو كانت لديك عشرة آلاف مدخلة في جدول المحلات. وكما ترى، فإن الاستخدام السليم للتحميل الحثيث يمكن أن يؤدي إلى تحسين أداء تطبيقك بقدر هائل. ولكي نحصل على تحسن للأداء بالفعل، فعلينا أن نوجد فهرسًا لحقل الهويّة id في جدولي members و products. ومع وجود كمّ هائل من السجلات، فإن تنفيذ (... ,'in( '1', '2 على حقل غير مفهرس سيأخذ وقتًا طويلًا. وبعد هذه المقدمة عن التحميل الحثيث، هيا بنا نرى كيف يمكننا أن نستخدم العلاقات مع المستودعات. تمديد فئة المستودعسأريك طريقة واحدة يمكنك فيها أن تستخدم العلاقات في فئات مستودعات concrete. وهنا مثال عن النتيجة النهائيّة: function __construct(StoreRepository $stores) { $this->stores = $stores; } public function index() { $stores = $this->stores->with('member', 'products')->all(); .... }وكما ترى هنا، لدينا طريقة with يمكنك أن تسلسل فيها نموذج العلاقات. ستكون هذه الطريقة شبيهة بطريقة with في Laravel’s Query Builder. public function with($relations) { if (is_string($relations)) $relations = func_get_args(); $this->with = $relations; return $this; }نحتاج الآن لأن نربط كلّ علاقة من العلاقات التي قمنا بتقديمها بالنموذج: protected function eagerLoadRelations() { if(!is_null($this->with)) { foreach ($this->with as $relation) { $this->model->with($relation); } } return $this; }وها هو ذا، والشيء الوحيد الذي تبقّى هو أن نحدّث طريقة مستودع ()all (وأي شيء آخر ترغب بتحديثه) لاستخدام التحميل الحثيث: public function all($columns = array('*')) { $this->applyCriteria(); $this->newQuery()->eagerLoadRelations(); return $this->model->get($columns); }وكما سبق وذكرت، فيمكنك أن تضيف عدّة علاقات ضمن طريقة ()with. وفيما يلي مثال على StoresControler: <?php namespace App\Http\Controllers; use App\Repositories\StoreRepository; class StoresController extends Controller { protected $stores; function __construct(StoreRepository $stores) { $this->stores = $stores; } public function index() { $stores = $this->stores->with('member', 'products')->all(); return \View::make('stores.index')->with('stores', $stores); } }وفي العرض يمكنك أن تعرض البيانات بالطريقة التي تريدها، ولغرض التجربة يكفي هذا: @foreach($stores as $store) <h1>{{ $store->name }}</h1> <span>Owner: {{ $store->member->first_name . ' ' . $store->member->last_name }}</span><br> <h2>Products:</h2> @foreach($store->products as $product) <h3>{{$product->name}}</h3> <span>{{$product->short_desc}}</span><br/><br/> <span>Price: {{$product->price}}</span><br/> <?php Debugbar::info('Product displayed'); ?> @endforeach <br/>========================<br/> @endforeachوكما هو متوقع، لدينا الآن هذه الاستعلامات الثلاثة فقط: الخلاصةيمكنك باستخدام التحميل الحثيث أن تحسّن أداء تطبيقك. وأحيانًا، عندما يكبر التطبيق، حتى التحميل الحثيث ليس كافيًا للحفاظ على أعلى أداء. في الدرس التالي سأريك كيف يمكنك تجميل مستودعاتك لتقوم بعمل cache للاستعلامات من أجل أداء أفضل. ترجمة -وبتصرف- للمقال: Using Repository Pattern in Laravel 5 - Eloquent Relations and Eager Loading.
  6. أُحِبّ كثيرا النّظر إلى الماضي حينَ كنتُ على وشك ولوجِ عالمِ الشركات الناشئة وأجدُ أنَّ هناك أسطورةً يعتقدها الكثيرون من القادمين لهذا العالم كما أنّها في رأيي السّبب الرئيسي وراء عدم إقدامهم حتّى على المحاولة. تقول الأسطورة أنّه عليك الإلمام بجميع الأمور وأنّه يتوجب عليك لِزامًا أنْ تقوم بها بشكلٍ مثالي. ليس من المفاجئ أنْ يُفكّرَ أحدهم بهذا الشكل لأن رؤية الشركات الناشئة الناجحة تدفع بالمرء للتّخيل بأنّ أصحابها قد قاموا بكل الأمور بشكلٍ صحيح لكنني أعتقد أن الحقيقة بعيدة عن هذا التّخَيُّل كما بدأت أعتقد أنّه من المفيد والصّحي للمشروع أن تتمتَّع بقدر كافٍ من السَّذاجة عند الشّروع فيه. مغالطة ترقّب النّمو الهائل scale anticipation fallacyأحد أبرز أمثِلة ما أعتقد أنه يقع على عاتق "السذاجة الصّحيّة" هو تجنُّبُ الوقوع في ما أسميته "ترقّب النّمو الهائل"ومَكْمَنَ الخطأ هنا هو الاعتقاد أنه لبناء ما قد يَنمو لِيَشْمَلَ مليون مُسْتَعْمِلٍ عليه أن يُبْنى من البداية ليستوعب هذا الرقم حتَّى ينجح. عندما بدأت شركتي الأخيرة كانت لي جداول غير مُعدّة بشكل أمثل في قاعدة البيانات الخاصة بي، كنت أقوم بعمليات بحث عديدة في قواعد البيانات للحصول على البيانات التي كنت أدور في حلقاتها. ليس هذا وحسب، بل كنت أقوم بعمليات بحث queries زائدة للحصول على البيانات التي أحتاجها. فلم تكن لديّ أدنى فكرة عن ما قد يعنيه مُصطلح Index في عالم قواعد البيانات وبالتالي قمت بكل ما لا يُنصح بالقيام به. ومع ذلك، في البداية لم يكن هذا الأمر بالغَ الأهميّة لأنّه لم يكن لديَّ أيُّ مُستخدِمين. مع مرور الوقت واجهتني عقبات "سعِدتُ بلقائها" كما أن الخَادوم في برنامجي كافح قليلا ولم يكن لديّ أيّةُ مشكلةٍ لتحسين الأمور بالطريقة التي تلائمني. من خلال تجربتي وصلت لنتيجة أن عدم اهتمامي للجوانب المُتعلّقة بالنّمو الهائل لمشروعي قد ساعدني للوصول إلى هذه المرحلة أين أصبح التّفكير في هذا النّمو مُهمّا. في المقابل أجِدُني أتساءَلُ إنْ أنَا اهتممت بهذا الأمر (النّمو الهائل لمشروعيscalability) سابقا هل كنت سأصل إلى المرحلة أين يصبح هذا الأخير مهمّا حقَّا؟ أنت لا تعلَمُ ما لسْتَ تَعْلَمُهْأكبر التحديّات التيّ قد تواجهك عند بداية مشروعك المصَّغر أنك تعيش في عالمٍ مُسْتَقْبَلُهُ غامضٌ وغَيْرُ مَضْمُونٍ بتاتًا فأنت في مواجهة المَجْهُول. لقد أَثَرْتُ هذه النقطة سابقًا وأعتقدُ أنَّ الحلَّ يَكْمُنُ في الكفاحِ للحصول على المعرفة، المعلومة والتَّعلم من ردود الأفعال. على كلِّ حال، أجدُ أنّ إِمْعَانِي التفكير في محاولاتي السابقة لبناءِ مشاريعٍ ناشئةٍ حتَّى يومِنَا هذا يُمَكِنُنِي من القول أنّ أحد أسباب نيْلي هذا القِسط من النَّجاح هو أنّي لم أدرك تمامًا المِقدار اللَّازِم عَلَيَّ أَنْ أتعلّمَهُ لأنجح. هذا هو نوع السّذاجةِ الذّي أعْتقِدُه شيئًا جيّدًا بل سأذهب بعيدا باعتقادي هذا لدرجةِ القول أنّني خائفٌ من أنّه في المُستقبل سأكون على اطّلاع لأيِّ مدى ستكون الأمور صعبة. لقد تكلّمَ ستيف بلانك في هذا الصدد في مقالته "يافع جدّا ليعلم أن الأمر لا يمكن إنجازه" وأعجبني تحديدا قوله: كن فخورا بسذاجتك ولْتَخَفْ مِنْ معرفتك الواسعةمغالطةُ ترقّب النّمو الهائل هي واحدٌ من الأمثلة التّي تَدُلُّ على سذاجتي التي اتضح فيما بعد أنها ميزةٌ فالأمر المهم عند إنشاء المشاريع المصّغرة ليس مدى سوء تعليماتك البرمجية أو أي شيء آخر بل كل ما يهم هو أن تخرج لِلْعَلَنِ بشيء يُريدُه النَّاس. لقد اخترتُ محاولة بدء مشروع جديد فور التخرج من الجامعة عِوَضَ هَدْرِ الوقت في أمور أخرى وقد كان مُضِيُّ عامين ارتكبتُ فيهما الكثير مِنَ الأخطاءِ صعبًا عليَّ لكنَّنِي تحصلتُ أخيرا على قليلٍ من النجاح. ومع ذلك، فإنّ الشّيء الرّئيسيَّ الذّي تعلّمتُهُ ليس "كيفية إنجاز المهمَّات بِمثاليَّة" بل أن التَّوازن المطلوب هو أن أقوم بالأمور بطريقة جيدة كفاية في الوقت الحاضر. البعض قد يطلق على هذا مبدأ 20/80 أو مبدأ باريتو. أعتقد أنّنّي لو أمضيت وقتا في مجال آخر لكنت جلبت المهارات التي تعلمتها في محاولة بدء مشروع مصغر سنوات من اليوم ولربّما حاولت القيام بكل شيء بمثالية وهذا ما سيكون غلطة كبيرة. أعتقد أن التّشبّث بعقل المبتدإ أمر هام للغاية وكما قال ستيف جوبز: ما رأيك حول تأثير السّذاجة في بناء المشاريع المصّغرة؟ ترجمة -وبتصرّف- للمقال Healthy naivety لصاحبه جويل غاسكوين (مؤسس Buffer).
  7. يكثر الحديث هذه الأيام عن أنماط تصميم البرمجيات، ومن الأسئلة الأكثر شيوعًا "كيف يمكنني استخدام النمط الفلاني مع التقنية (التكنولوجيا) الفلانيّة؟". أما في حالة Laravel ونمط المستودع (Repository pattern)، فكثيرًا أرى أسئلة من قبيل "كيف يمكنني أن أستخدم نمط المستودع في Laravel 4؟" أو في هذه الأيام "مع Laravel 5؟". من المهم أن تتذكر أنّ أنماط التصميم لا تعتمد على تقنيّة محدّدة، أو إطار برمجي محدد، أو لغة برمجة محددة. إذا كنت قد فهمت نمط المستودع بالفعل، فلا يهم الإطار البرمجي أو اللغة البرمجة التي ستستخدمها. المهم أن تفهم المبدأ الذي يقف خلف نمط المستودع، ومن ثم يمكنك استخدامه في أيّ تقنية تريد. آخذين هذا بعين الاعتبار، لنبدأ بتعريف نمط المستودع: يفصل نمط المستودع منطق الوصول إلى البيانات (data access logic) ويربطه مكانيًّا بكيانات الأعمال (business entities) في المنطق الأعمال (business logic). ويتم التواصل بين منطق الوصول إلى البيانات ومنطق الأعمال باستخدام واجهات (interfaces). ولتبسيط ذلك، فإن نمط المستودع نوع من الحاويات يخزّن فيه منطق الوصول إلى البيانات، بحيث يخفي منطق الوصول إلى البيانات عن منطق الأعمال. وبعبارة أخرى، نسمح لمنطق الأعمال أن يصل إلى كائن البيانات دون معرفة هيكلية الوصول إلى البيانات التي تتم خلف الكواليس. ولفصل الوصول إلى البيانات عن منطق الأعمال فوائد عدّة، منها: مركزية منطق الوصول إلى البيانات تجعل النصوص البرمجية أسهل في الصيانة.يمكن فحص منطق الأعمال ومنطق الوصول إلى البيانات كلًّا على حدة.تقليل تكرار الأكواد البرمجية.فرصة أقل للوقوع في أخطاء برمجية.الأمر كلّه يتعلق بالواجهاتكلّ ما في نمط المستودع ذو علاقة بالواجهات. تعمل الواجهة كاتفاقية تحدّد ما على فئة concrete تنفيذه.لنفكّر قليلًا. إذا كان لدينا كائني بيانات، الممثل والفلم، فما هي مجموعة العمليات الشائعة التي يمكن تطبيقها على هذين العنصرين؟ سنرغب في غالب الأحيان بالقيام بالعمليات التالية: الحصول على جميع السجلات.الحصول على مجموعة السجلّات مرقّمة.إنشاء سجلّ جديد.الحصول على سجل باستخدام المفتاح الرئيسيّ.الحصول على سجل باستخدام خواص (attributes) أخرى.تحديث سجلّ.حذف سجلّ.هل يمكنك الآن أن ترى كميّة النصوص البرمجيّة المكررة التي ستكون لدينا إذا قمنا بذلك مع كلّ كائن بيانات؟ حسنًا، هذه ليست مشكلة كبيرة بالنسبة للمشاريع الصغيرة، ولكنها أمر سيّء بالنسبة للمشاريع الكبيرة. الآن، وبعد أن عرّفنا العمليات الشائعة، يمكننا إنشاء واجهة: interface RepositoryInterface { public function all($columns = array('*')); public function paginate($perPage = 15, $columns = array('*')); public function create(array $data); public function update(array $data, $id); public function delete($id); public function find($id, $columns = array('*')); public function findBy($field, $value, $columns = array('*')); }هيكليّة الدليل Directory Structureقبل أن نتابع إنشاء فئة مستودع concrete التي ستنفّذ هذه الواجهة، لنفكّر قليلًا كيف نريد أن ننظّم النصوص البرمجيّة لدينا. عادة، عندما أنشئ شيئًا ما، أفضّل أن أفكر بطريقة تقسيمه إلى مكوّنات، حيث أرغب بأن أكون قادرًا على إعادة استخدام ذاك النصّ البرمجيّ لمشاريع أخرى. إن هيكليّة الدليل البسيطة التي أتبعها لمكونات المستودع تبدو كما يلي: ولكنها يمكن أن تكون مختلفة، كأن يكون للمكونات خيارات ضبط مثلًا. لدي في داخل الدليل src ثلاثة أدلّة أخرى، هي: Contracts وEloquent وexceptions. كما ترى، أسماء المجلدات مناسبة للغاية لما نريد وضعه فيها. ففي Contracts نضع الواجهات، أو الاتفاقيات – كما سميناها أعلاه - . ويحوي مجلد Eloquent مستودعي abstract و concrete تنفّذ الاتفاقات. ونضع في المجيد Exceptions فئات الاستثناءات. وحيث أننا ننشئ حزم، فعلينا أن ننشئ ملف composer.json، حيث نجد فيه ربطًا مكانيًّا لنطاق الأسماء (namespaces) لأدلّة معيّنة، واعتماديات حزم، وبيانات وصفيّة أخرى للحزم. فيما يلي محتوى composer.json لهذه الحزمة: { "name": "bosnadev/repositories", "description": "Laravel Repositories", "keywords": [ "laravel", "repository", "repositories", "eloquent", "database" ], "licence": "MIT", "authors": [ { "name": "Mirza Pasic", "email": "mirza.pasic@edu.fit.ba" } ], "require": { "php": ">=5.4.0", "illuminate/support": "5.*", "illuminate/database": "5.*" }, "autoload": { "psr-4": { "Bosnadev\\Repositories\\": "src/" } }, "autoload-dev": { "psr-4": { "Bosnadev\\Tests\\Repositories\\": "tests/" } }, "extra": { "branch-alias": { "dev-master": "0.x-dev" } }, "minimum-stability": "dev", "prefer-stable": true } كما ترى، فقد ربطنا Bosnadev\Repository إلى الدليل src. وهناك شيء آخر علينا أخذه بعين الاعتبار قبل البدء بتنفيذ RepositoryInterface، فحيث أنها موجودة في المجلد Contracts، فعلينا أن نحدّد نطاق الاسم لها: <?php namespace Bosnadev\Repositories\Contracts; interface RepositoryInterface {...}نحن الآن مستعدون لبدء تنفيذ المحتوى. تنفيذ المستودععلى كل مستودع فرعيّ في concrete أن يزيد من مستودع abstract لدينا، مما يعني تنفيذ اتفاقية RepositoryInterface. أما الآن، فكيف تنفّذ هذه الاتفاقيّة؟ ألقِ نظرة على method الأولى. ما الذي يمكنك قوله عنها بمجرد النظر إليها؟ تُسمى method الأولى في اتفاقيتنا بالاسم ()all للتوضيح. مهمتها هي جلب كلّ السجلات لهيئة concrete. تستقبل معامِلاً واحدًا، وهو columns$ الذي يجب أن يكون مصفوفة (array). يُستخدّم هذا المعامِل – كما هو واضح من اسمه – لتحديد الأعمدة التي ترغب بجلبها من مصدر البيانات، ومبدئيًّا نقوم بجلبها كلّها. لهئيات محدّدة، يمكن أن تبدو كالتالي: <?php namespace Bosnadev\Repositories\Contracts; interface RepositoryInterface {...}لكننا نريدها أن تكون عامّة أكثر لكي نتمكن من استخدامها متى أردنا: public function all($columns = array('*')) { return $this->model->get($columns); } في هذه الحالة this->model$ هي نسخة من Bosnadev\Models\Actor، ولهذا، فعلينا إنشاء نسخة جديدة للنموذج الموجود في مكان ما في المستودع. هنا أحد الحلول التي يمكنك استخدامها لتنفيذ هذا الأمر: <?php namespace Bosnadev\Repositories\Eloquent; use Bosnadev\Repositories\Contracts\RepositoryInterface; use Bosnadev\Repositories\Exceptions\RepositoryException; use Illuminate\Database\Eloquent\Model; use Illuminate\Container\Container as App; /** * Class Repository * @package Bosnadev\Repositories\Eloquent */ abstract class Repository implements RepositoryInterface { /** * @var App */ private $app; /** * @var */ protected $model; /** * @param App $app * @throws \Bosnadev\Repositories\Exceptions\RepositoryException */ public function __construct(App $app) { $this->app = $app; $this->makeModel(); } /** * Specify Model class name * * @return mixed */ abstract function model(); /** * @return Model * @throws RepositoryException */ public function makeModel() { $model = $this->app->make($this->model()); if (!$model instanceof Model) throw new RepositoryException("Class {$this->model()} must be an instance of Illuminate\\Database\\Eloquent\\Model"); return $this->model = $model; } } وحيث أننا عرفنا الفئة كـ abstract، فهذا يعني أن علينا زيادتها باستخدام فئة متفرّعة عن concrete. فعند تعريف method المسمّى ()model كـ abstract، فإننا نجبر المستخدم على تنفيذ هذه الطريقة (method) في فئة متفرعة عن concrete. فمثلًا: <?php namespace App\Repositories; use Bosnadev\Repositories\Contracts\RepositoryInterface; use Bosnadev\Repositories\Eloquent\Repository; class ActorRepository extends Repository { /** * Specify Model class name * * @return mixed */ function model(){ return 'Bosnadev\Models\Actor'; } }يمكننا الآن أن ننفذ بقية طرق (methods) الاتفاقات: <?php namespace Bosnadev\Repositories\Eloquent; use Bosnadev\Repositories\Contracts\RepositoryInterface; use Bosnadev\Repositories\Exceptions\RepositoryException; use Illuminate\Database\Eloquent\Model; use Illuminate\Container\Container as App; /** * Class Repository * @package Bosnadev\Repositories\Eloquent */ abstract class Repository implements RepositoryInterface { /** * @var App */ private $app; /** * @var */ protected $model; /** * @param App $app * @throws \Bosnadev\Repositories\Exceptions\RepositoryException */ public function __construct(App $app) { $this->app = $app; $this->makeModel(); } /** * Specify Model class name * * @return mixed */ abstract function model(); /** * @param array $columns * @return mixed */ public function all($columns = array('*')) { return $this->model->get($columns); } /** * @param int $perPage * @param array $columns * @return mixed */ public function paginate($perPage = 15, $columns = array('*')) { return $this->model->paginate($perPage, $columns); } /** * @param array $data * @return mixed */ public function create(array $data) { return $this->model->create($data); } /** * @param array $data * @param $id * @param string $attribute * @return mixed */ public function update(array $data, $id, $attribute="id") { return $this->model->where($attribute, '=', $id)->update($data); } /** * @param $id * @return mixed */ public function delete($id) { return $this->model->destroy($id); } /** * @param $id * @param array $columns * @return mixed */ public function find($id, $columns = array('*')) { return $this->model->find($id, $columns); } /** * @param $attribute * @param $value * @param array $columns * @return mixed */ public function findBy($attribute, $value, $columns = array('*')) { return $this->model->where($attribute, '=', $value)->first($columns); } /** * @return \Illuminate\Database\Eloquent\Builder * @throws RepositoryException */ public function makeModel() { $model = $this->app->make($this->model()); if (!$model instanceof Model) throw new RepositoryException("Class {$this->model()} must be an instance of Illuminate\\Database\\Eloquent\\Model"); return $this->model = $model->newQuery(); } } الأمر سهل للغاية، صح؟ الشيء الوحيد المتبقي الآن هو حقن ActorRepository في ActorsController، أو الجزء المتعلق بالأعمال (business logic) من تطبيقنا. <?php namespace App\Http\Controllers; use App\Repositories\ActorRepository as Actor; class ActorsController extends Controller { /** * @var Actor */ private $actor; public function __construct(Actor $actor) { $this->actor = $actor; } public function index() { return \Response::json($this->actor->all()); } }استعلامات المعايير Criteria Queriesكما يمكنك أن تتخيل، فهذه الأعمال البسيطة كافية فقط لاستعلامات البسيطة. أما بالنسبة للتطبيقات الكبيرة، فستحتاج بالتأكيد لعمل بعض الاستعلامات الخاصّة لاستدعاء مجموعة بيانات محدّدة أكثر باستخدام معايير محدّدة. للقيام بذلك، نبدأ بتحديد ما على معايير الفروع (child ، أو العميل client) القيام به. وبعبارة أخرى، سننشئ فئة abstract non-instantiable باستخدام method واحدة فقط : <?php namespace Bosnadev\Repositories\Criteria; use Bosnadev\Repositories\Contracts\RepositoryInterface as Repository; use Bosnadev\Repositories\Contracts\RepositoryInterface; abstract class Criteria { /** * @param $model * @param RepositoryInterface $repository * @return mixed */ public abstract function apply($model, Repository $repository); }ستحوي هذه الطريقة (method) استعلام معايير يتم تطبيقه في فئة Repository ضمن هيئة concrete. علينا أيضًا أن نزيد على فئة Repository قليلًا لتغطية استعلامات المعايير. لكن قبل ذلك، هيّا ننشئ اتفاقية أخرى لفئة Repository. <?php namespace Bosnadev\Repositories\Contracts; use Bosnadev\Repositories\Criteria\Criteria; /** * Interface CriteriaInterface * @package Bosnadev\Repositories\Contracts */ interface CriteriaInterface { /*** @param bool $status * @return $this */ public function skipCriteria($status = true); /*** @return mixed*/public function getCriteria(); /*** @param Criteria $criteria* @return $this*/public function getByCriteria(Criteria $criteria); /*** @param Criteria $criteria* @return $this*/public function pushCriteria(Criteria $criteria); /*** @return $this*/public function applyCriteria(); }يمكننا أن نزيد فاعلية فئة Repository بتنفيذ اتفاقية CriteriaInterface: <?php namespace Bosnadev\Repositories\Eloquent; use Bosnadev\Repositories\Contracts\CriteriaInterface; use Bosnadev\Repositories\Criteria\Criteria; use Bosnadev\Repositories\Contracts\RepositoryInterface; use Bosnadev\Repositories\Exceptions\RepositoryException; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Collection; use Illuminate\Container\Container as App; /** * Class Repository * @package Bosnadev\Repositories\Eloquent */ abstract class Repository implements RepositoryInterface, CriteriaInterface { /** * @var App */ private $app; /** * @var */ protected $model; /** * @var Collection */ protected $criteria; /** * @var bool */ protected $skipCriteria = false; /** * @param App $app * @param Collection $collection * @throws \Bosnadev\Repositories\Exceptions\RepositoryException */ public function __construct(App $app, Collection $collection) { $this->app = $app; $this->criteria = $collection; $this->resetScope(); $this->makeModel(); } /** * Specify Model class name * * @return mixed */ public abstract function model(); /** * @param array $columns * @return mixed */ public function all($columns = array('*')) { $this->applyCriteria(); return $this->model->get($columns); } /** * @param int $perPage * @param array $columns * @return mixed */ public function paginate($perPage = 1, $columns = array('*')) { $this->applyCriteria(); return $this->model->paginate($perPage, $columns); } /** * @param array $data * @return mixed */ public function create(array $data) { return $this->model->create($data); } /** * @param array $data * @param $id * @param string $attribute * @return mixed */ public function update(array $data, $id, $attribute="id") { return $this->model->where($attribute, '=', $id)->update($data); } /** * @param $id * @return mixed */ public function delete($id) { return $this->model->destroy($id); } /** * @param $id * @param array $columns * @return mixed */ public function find($id, $columns = array('*')) { $this->applyCriteria(); return $this->model->find($id, $columns); } /** * @param $attribute * @param $value * @param array $columns * @return mixed */ public function findBy($attribute, $value, $columns = array('*')) { $this->applyCriteria(); return $this->model->where($attribute, '=', $value)->first($columns); } /** * @return \Illuminate\Database\Eloquent\Builder * @throws RepositoryException */ public function makeModel() { $model = $this->app->make($this->model()); if (!$model instanceof Model) throw new RepositoryException("Class {$this->model()} must be an instance of Illuminate\\Database\\Eloquent\\Model"); return $this->model = $model->newQuery(); } /** * @return $this */ public function resetScope() { $this->skipCriteria(false); return $this; } /** * @param bool $status * @return $this */ public function skipCriteria($status = true){ $this->skipCriteria = $status; return $this; } /** * @return mixed */ public function getCriteria() { return $this->criteria; } /** * @param Criteria $criteria * @return $this */ public function getByCriteria(Criteria $criteria) { $this->model = $criteria->apply($this->model, $this); return $this; } /** * @param Criteria $criteria * @return $this */ public function pushCriteria(Criteria $criteria) { $this->criteria->push($criteria); return $this; } /** * @return $this */ public function applyCriteria() { if($this->skipCriteria === true) return $this; foreach($this->getCriteria() as $criteria) { if($criteria instanceof Criteria) $this->model = $criteria->apply($this->model, $this); } return $this; } } إنشاء معايير جديدة، حيث يمكنك الآن أن ترتب مستودعاتك بسهولة أكبر. لست بحاجة لأن تكون مستودعاتك مكونة من آلاف الأسطر. يمكن أن تبدو فئة المعايير لديك كالآتي: <?php namespace App\Repositories\Criteria\Films; use Bosnadev\Repositories\Contracts\CriteriaInterface; use Bosnadev\Repositories\Contracts\RepositoryInterface as Repository; use Bosnadev\Repositories\Contracts\RepositoryInterface; class LengthOverTwoHours implements CriteriaInterface { /** * @param $model * @param RepositoryInterface $repository * @return mixed */ public function apply($model, Repository $repository){ $query = $model->where('length', '>', 120); return $query; } }استخدام للمعايير (Criteria) في المتحكّمات (Controllers)الآن وقد صارت لدينا معايير بسيطة، لنرَ كيف يمكننا استخدامها. هناك طريقتان يمكنك اتباعهما لتطبيق المعايير على مستودع. الأولى باستخدام طريقة ()pushCriteria: <?php namespace App\Http\Controllers; use App\Repositories\Criteria\Films\LengthOverTwoHours; use App\Repositories\FilmRepository as Film; class FilmsController extends Controller { /*** @var Film*/private $film; public function __construct(Film $film) { $this->film = $film; } public function index() { $this->film->pushCriteria(new LengthOverTwoHours()); return \Response::json($this->film->all()); } }هذه الطريقة مفيدة إذا كنت ترغب بتطبيق أكثر من معيار في نفس الوقت، حيث يمكنك رصّها معًا كما تشاء، ولكن إذا رغب بتطبيق معيار واحد فقط، فيمكنك استخدام طريقة ()getByCriteria: <?php namespace App\Http\Controllers; use App\Repositories\Criteria\Films\LengthOverTwoHours; use App\Repositories\FilmRepository as Film; class FilmsController extends Controller { /** * @var Film */ private $film; public function __construct(Film $film) { $this->film = $film; } public function index() { $criteria = new LengthOverTwoHours(); return \Response::json($this->film->getByCriteria($criteria)->all()); } }تثبيت الحزميمكنك تثبيت هذه الحزمة بإضافة الاعتمادية التالية إلى قسم require في ملف composer لديك: "bosnadev/repositories": "0.*"وتنفيذ composer update بعد ذلك، الخلاصةلاستخدام المستودعات في تطبيقك العديد من الفوائد. من أشياء بسيطة كتقليل تكرار الأكواد ومنعك من ارتكاب أخطاء برمجيّة وجعل تطبيقك أسهل في التكبير والتوسعة، والاختبار، والصيانة. من وجهة نظر هندسيّة، فقد تمكنت من عزل الاهتمامات. المتحكّم (controller) لديك ليس بحاجة لأن يعرف كيف وأين تخزَّن البيانات. بسيط وجميل. تجريديّ (Abstract). ترجمة وبتصرف للمقال: Using Repository Pattern in Laravel 5.
  8. يعتبر التّواصل الثّابت والواضح حاسمًا لنجاح أيّ علاقة سواء كانت علاقة صداقة، زمالة،... وهو ما ينطبق بشكل كبير على علاقات العملاء، فبغضّ النّظر عن نوعية علاقتك بعملائك، ستجد نفسك أحيانًا تتواصل معهم أكثر مما تتواصل مع أشخاص آخرين في حياتك، خصوصًا كمُستقل. من المهمّ تحديد توقّعات وخطّة تواصل مُقدّمًا حتّى قبل الاتّفاق على العمل مع عملائك، وذلك من أجل تجهيز نفسك لارتباط ناجح معهم. هذه 6 خطوات يمكنك اتّخاذها قبل وأثناء الارتباط من أجل زيادة احتمال سعادة كلا الطّرفين خلال فترة العمل. 1. تحديد توقعات متبادلة حول النتائجعند الوصول لاتّفاق حول الشّكل النّهائي للارتباط الذي سيجمعك بعميلك، تأكدا من أنّ كليكما تريان نفس النّتائج المتوقّعة للعمل. إذا لم يشاركك العميل أهدافه وغاياته فسيكون عليك سؤاله أو العمل جنبًا إلى جنب على تطويرها، كما عليك تضمين هذه الأهداف ضمن الاتّفاق الذي يوقّعه كلا الطّرفين، أعد مراجعة هذه الأهداف والغايات مع العميل كلّما ورد طلب جديد، وذلك من أجل التّأكّد من أنّ هذا النّشاط يتوافق معها، حيث سيساعد هذا على ردع الطّلبات التي تتمّ بعد الاتّفاق النّهائي على المشروع، والتي يمكن أن تشكّل مشاكل كبيرة للمستقل. 2. إدارة توقعات العمل اليوميحدّد مواعيد نهائيّة منطقيّة لنفسك عند تطوير خطط أو استراتيجيّات، جدول التّدوين الزّمني على مدونة مثلًا، فإذا أراد العميل منك نشر ثلاث تدوينات أصليّة وكان ذلك غير منطقيّ بالنسبة لك، فسّر ذلك له واعرض عليه بدائل أخرى. في هذه الحالة، قد يكون الحلّ هو عرض نشر تدوينة أسبوعيّا بينما يتم بناء مكتبة محتوى مع زيادة بطيئة في معدّل النّشر، أو ربّما إنشاء استراتيجيّة مساهمة لضمّ خبراء آخرين للكتابة في المدوّنة. تأكّد من أن تضع مخطّطًا تقديريًّا للفترة التي ستستغرقها كل مهمّة أيًّا كان الطّريق الذي ستسلكه. لقد قمت بهذا في وظائف سابقة لنشر المحتوى، وقد كان مفيدًا لكل الأطراف. تذكّر، عملاؤك قد وظّفوك لأنك الخبير في المجال، أي أنّهم قد لا يعلمون متطلّبات العمل الذي تعمل عليه، لذا اجعل مسؤوليّاتك واضحة من أجل تجنّب انزعاجهم من عدم قيامك بعمل كاف. 3. استخدام أداة تتبع للوقتامتلاكك لتقرير مادّيّ للوقت الذي تستغرقه لإكمال مهمة أو مشروع، يضيف مصداقيّة لعرضك المقدّم للعمل، يمكنك استخدام أدوات مثل Harvest وTimely لتتبّع الوقت الذي تقضيه في إنجاز عمل كلّ عميل، وتكون هذه الميزة مفيدة على وجه الخصوص عندما تودّ تحديد فوترة لعملك، في حال كنت تتلقّى أجرًا بالسّاعة. 4. كن دقيقا في عملك أو كن صادقا وامتلك خطة بديلةتعدّ هذه النّقطة واضحة، حيث لا يعلم مستقلّون كُثر مدى أهميّة تسليم العمل في الوقت المحدّد بالنّسبة للعميل، فأفضل طريقة يمكنك من خلالها كسب ثقة عملائك هي تسليم العمل في الوقت المحدّد، والأهمّ هو التّواصل معهم في حال لم تكن قادرًا على تسليم العمل في وقته. مهما يكُن، فإنّ حدوث شيء خارج عن إرادتك وارد، كما أنّ عملاءك بدورهم بشر، فعلى الرّغم من أنهم قد يُحبطون من تأخّرك، إلا أنهم سيتفهّمون ذلك. قد يكون الأمر مخيفًا، لكن سيكون عليك إعلام عملائك في أقرب وقت ممكن إذا كنت ستتأخر في تسليم العمل، وإلا ستؤذي بذلك جميع الأشخاص المشاركين، لذا احرص على تنبيههم بشكل مبكّر والعمل معًا على حلّ مناسب حتّى لا يبقى أي طرفٍ دون علمٍ بما يحدث أو يصاب بخيبة أمل. وسيكون من الأفضل أن تمتلك خطّة بديلة جاهزة تقدّمها للعميل عندما تُعلمه بتأخرك، فتقديمك لحلّ مُقدّمًا يضيف طبقة مصداقيّة وثقة إلى علاقتك به، كما أنّك تبني سمعة قويّة لنفسك. 5. التحقق من سير العمل بانتظاملا يدع التّحقق من سير العمل بانتظام مجالًا للتخمين، لذا أضف بندًا للاتّصال من أجل التّحقق من سير العمل أسبوعيّا عند الاتفاق على إطار العمل، كما سيكون تحديد هذه موعدٍ لهذه المحادثات في نفس الوقت من كلّ أسبوع خيارًا ممتازًا يتحوّل لأولويّة أسبوعيّة. الوقت يمرّ بسرعة، لذا من المهمّ جدًّا التّأكد من أنّكما تتواصلان مع بعضكما البعض بانتظام، حيث يتوافق هذا النّشاط جيّدًا مع التوقّعات المحدّدة. يضع التّحقق من سير العمل الجميع ضمن نفس القارب، وإذا كانت هنالك أي شكاوى فسيكون من المناسب تقديمها في نفس الوقت من كلّ أسبوع. جهّز أي أسئلة أو اقتراحات تمتلكها من أجل المضيّ قُدمًا بمشاريعك خلال كلّ مكالمة، وشجّع عميلك على القيام بنفس الشيء. هكذا يجب أن تكون محادثة التحقّق من سير العمل: لتكن لديك مذكّرة لكل محادثة ولتكن قصيرة. ابدأ أنت وعميلك بمراجعة أهداف المحادثة، بعدها اسمحا لبعضكما البعض بالسّؤال والإجابة عن أي سؤال، وإذا صادفتما أي شيء يعتبر غير ملحّ خلال ذلك الأسبوع، اتّفِقَا على موعد آخر لإجراء محادثة لمناقشة ذلك العنصر على حِدة أو التّعامل معه عبر البريد الإلكتروني، وبالتّالي لن تحيدَا عن هدف المحادثة وستناقشان غالبًا أهداف ذلك الأسبوع. بعد الإجابة على كافّة الأسئلة المرتبطة، اختِما المحادثة بملخّص لخطوات العمل المنوطة بكل طرف، بما في ذلك الطّريقة التي سيتم التّعامل فيها مع أي موضوع غير مرتبط بعد انتهاء المحادثة، ثمّ راجعَا خطوات العمل التي نوقِشت. 6. أنشئ خطة تواصليجب أن تتّفقا أنت وعميلك حول الطّريقة التي ستتواصلان بها معًا خلال فترة الارتباط، ربّما تكون خدمة Slack مناسبة لكما، أو ربّما يفضّل كلاكما التّواصل عبر البريد الإلكتروني، المهمّ هو أن تجدا وسيلة تواصل تناسبكما معًا وتلتزما بها، وذلك تجنّبًا لأي عادات تواصل غير مريحة مثل إرسال رسالة نصيّة في منتصف الليل إلى هاتفك. خلاصةتذكّر أنّك اخترت حياة المستقلّ من أجل الاستمتاع بحريّة القيام بعمل مُجدٍ ومثير بالنّسبة إليك، وبالتّالي فأنت مسؤول عن استغلاله أفضل استغلال. تواصل بوضوح واستمرار مع عملائك لكي تبني علاقة طويلة الأمد سينتج عنها عمل أكثر وإحالات مع مرور الوقت. ترجمة -وبتصرّف- للمقال Building trust as a freelancer: How to effectively communicate with your clients لصاحبته Shannon Byrne. حقوق الصورة البارزة: Designed by Freepik.
  9. على الرّغم من تواصلي المستمر لسنوات عديدة مع الكثير من العُملاء المستقلّين، إلا أنّني عندما غادرت Buffer مبكراً في بدايات سنة 2014، فإنّ تلك كانت المرّة الأولى لي في الاعتماد على هذا النوع من الدّخل غير الثابت لتحصيل المعيشة. لقد كان تحولا غير مسبوق بالنّسبة لي. بالرّغم من ذلك، وفي غضون السنوات القليلة الماضية، تعلّمت الكثير حول آليّة تطوير العلاقات مع العُملاء وأصحاب المشاريع وكيفيّة المحافظة عليها. إنَّ اختياري للعمل الحر كمصدر للدّخل، كان يعني قضائي لفترات طويلة ـأكثر من المتوقّع- بحثاً عن عمل. وفي اللّحظة التي كنت أشاهد فيها الصفقة مع أحد العملاء المُحتملين تبوء بالفشل، كنت أتساءل عن الطّريقة التي سأتمكّن فيها من تأمين الإيجار للشهر المقبل. وبما أنّي قضيت وقتًا طويلًا في التّعامل عن قرب مع الكثير من العملاء المُحتملين، فقد طوّرت نهجًا عمليًا ساعدني في بناء علاقات مميزة مع الكثير من الشركات التي أكنُّ لها كل الاحترام مثل شركتي Crew و Zapier. وعندما لا أتقيّد بهذا النّهج (كما سيظهر لكم من خلال المقال) عندها فقط أستطيع أن أُثبت لنفسي لماذا صمّمته منذ البداية. إنَّ إنشاء قواعد واضحة لعملي، ساعدني على وضع الخطوط الحمراء مبكرًا، والخروج من أيّ موقف غير مريح بالنّسبة لي. ولذلك أنصح بتطبيق هذا النّهج بشدة. سأقوم هنا بسرد خطوات الآلية Process –بشكلها الحالي– والتي وضَعتُ أسسها بعد سنوات من التجّربة، وسأشرح كذلك فعاليّة وفائدة كل خطوة من هذه الخطوات. كن واضحا حول طريقة العمل والتوقعات قبل البدء بأي مهمةإذا توجّب عليَّ اختزال هذه المقالة بأكملها في نصيحة واحدة أوجهها لكلِّ المستقلّين، فإنّها ستكوّن "أن لا يفترضوا شيئاً أبداً". لقد وقعت في الكثير من المتاعب من خلال الافتراض أنّني على توافق تامّ مع العملاء وأنّنا نفّهم بعضنا البعض، أو أنَّهم يدركون آليّة عملي مسبقاً دون أن أشرح لهم ذلك. من الصحيح أن سوء الفهم للتوقعات كان عادة ما يتم إصلاحه وإعادة توجيهه، إلا أنه بين الحين والآخر كان الافتراض الخاطئ هو ما يكشف لي -متأخراً- أن العلاقة مع أحد العملاء الجدد لن تستمر. وفيما يلي بعض التوقعات الرئيسية التي يجب توضيحها لكل عميل قبل البدء بتنفيذ أي عمل: إجراءات الدفع والرسومكن واضحًا حول السّعر المطلوب للمهمّة، وأرفق عرضك ببيانات تتضمّن الخدمات التي ستقدّمها وطريقة احتسابك لقيّمتها، وحدّد العملة التي تتعامل بها (أنا أعيش في أستراليا، ولكنّني عملت مع الكثير من العملاء المقيمين في أمريكا، والذين كانوا عادة ما يفترضون أننّي أتقاضى أتعابي بالدّولار الأمّريكي في حين أن الدّولار الذي أقصده هو الدولار الأسترالي). ومن الواجب عليك أيضا أن تسأل العملاء عن طريقة الدّفع الّتي يفضّلونها، سواءً كانت الدفع بمجرّد تسليم أو نشر العمل، أو الدّفع بشكل دوري حين يدفعون لباقي المُستقلّين الذين يتعاملون معهم. عملية الاستلام والتسليمبمجرّد البدء بمناقشة صلب العمل، قم بتحديد صيغة واضحة لشكل العمل المراد تسليمه (بالنّسبة لي فإن هذا يعني الاتّفاق على ما إذا كان العميل يفضل أن يستلم العمل على شكل ملفّ Markdown، أو أنّه سيقوّم بعمل حساب خاصّ بي على مدوّنته كي أقوم بإضافة المحتوى إليها بشكل مباشر). خطوات سير العملبالرّغم من أنَّ هذا قد يبدو مبالغاً فيه بعض الشّيء، إلّا أنّني أفضّل أن أشرح للعملاء الجدد الأسلوب الذي أتّبعه في العمل خطّوة بخطّوة تجنّبًا لحدوث أيّة مفاجئات أثناء القيام به، ويتضمّن ذلك متوسّط الوقت الذي يتطلّبه إنشاء محتوى جديد، وعمليّات البحث التي أقوّم بها، وكيفيّة العمل فيما بعد على إدّراج الصّور و تحسين ظهور المحتوى في محرّكات البحث (SEO)، ومن ثم القيام بعمليّة عدّ الكلمات. ما الذي يحدث عند عدم الالتزام بتحديد توقعات واضحةإنّ الافتراض بأنّك والعميل على توافق تام في الرؤية سيؤدي مستقبلًا إلى حدوث عدّة مشاكل، على سبيل المثال، ارتكبت خطأ خلال عملي مع عميل عندما ظننت أنّ المحتوى الذي كتبته سينشر باسمي ككاتب للمقال (لطالما رفضت بحزم أيّة عروض للقيام بالكتابة الخفيّة، وهذا ما جعلني أفترض خطأ بأنّ حدوث خلل أمر مستبعد) ، إنّ افتراضاتي المسبقة وضعتني في موقف محرج عندما أجّرى العميل تعديلاته المتعدّدة على العمل ونشره باسمه الشخصي. لقد كان هذا الموقف بمثابة إشارة تحذير كبيرة لي، فأنا أؤمن بأن سمعتي أو "علامتي التجارية الشخصيّة" هي ما يدفع العملاء لاختياري لأداء المهام في المقام الأوّل. لقد عملت لسنوات في بناء سمعتي وخبراتي الشخصيّة في مجال تسويق المحتوى حتى أتمكّن لاحقاً من الاعتماد على اسمي الشخصي كعامل مهمّ يدفع العملاء لتوظيفي. ومنذ ذلك الحين قمت بإضافة هذه النّقطة إلى "قائمة الأشياء التي يجب توضيحها للعملاء قبل البدء بالعمل"، وتطوّل هذه القائمة في كل مرة أواجه فيها حالة من الخلل أو سوء الفهم. ابدأ علاقتك مع العميل الجديد بفترة تجريبيةكما يحدث عند بداية أية علاقة، فإنّك تحتاج لأخذ الوقت الكافِ في التّعرّف على العميل الجديد، وقد تعلّمت من التّجربة بأنّ البدء بفترة تجريبيّة شيء أساسي. وبالرّغم من مرونتي في العمل، إلا أنّي عادة ما أقترح على العميل الجديد كتابة مقالين كتجربة. إنّ الفترة التجّريبيّة هي فرصة مناسبة لوضع الملاحظات مثل: ما هي المدّة التي يأخذها العميل للإجابة على استفساراتك؟هل توقعات العميل واضحة؟هل تستوعب استراتيجيات وأولويات العميل وتوافق عليها؟ما هي المدة التي يأخذها العمل ليتحول من فكرة إلى منتج نهائي جاهز للتسليم.كما أنّ الفترة التجّريبيّة تمنح العملاء الجدد فرصة للتعرف عن قرب إلى الطريقة الّتي أعمل بها. وما هو المحتوى الذي أعتبره ملائمًا، وما هي أولويّاتي عندما أقوّم بصنع المحتوى الجديد لجمهورهم. وفي حال حدث أيّ خلل أثناء العمل على المحتوى الأوّل فإنّه سيكوّن بالإمكان معالجته في المحتوى الثّاني، أمّا في حالات ظهور خطوط حمراء، أو عدم جاهزيّة أيّ من الفريقين لتقديم التّنازلات، فإنّه بالإمكان عندها إنهاء العلاقة بسهولة عند تلك النّقطة. أمّا في حال لم أكن متأكدة من إمكانيّة استمرار العلاقة بعد إتمام الفترة التجّريبيّة بينما كان العميل راض عنها، فإنه لا مشكلة بالنّسبة لي في تمديد الفترة إلى أن أقوم بإكمال تقييّمي للعلاقة وإمكانيّة استمرارها على المدى الطّويل. إن لكلّ عميل استراتيجياته وأهدافه وجمهوره الّذي يجب على المستقل التواؤم معه، وفي بعض الأحيان يكون هذا النّمط من التّوائم غير مريح بالمرّة بالنّسبة لي، ولذلك فإنّ الفترة التجّريبيّة تمنحني الفرصة لتقييم مدى توافق النّمط الّذي أعمل به مع متطلّبات العميل وتوقّعاته. كن واضحا وصريحا حول أية مشاكل تواجهكأحيانًا يمّكن للخلافات أن تحل. ولطالما شعرت بالراحة عندما كنّت أبدي قلقي حول أمّر ما وأجد العميل مستعدّا لمناقشتي بكل رحابة صدر حول إجراء التّغييرات على النّهج الخاص به أو على الطّريقة التي يسير بها العمل المتّفق عليه. إن الاضطرابات والإخفاقات عادة ما تكون نتيجة لسوء تفاهم بسيط، والتّعامل بصراحة ووضوح إزاء أية مخاوف تواجهني، أو لماذا أرى أنّ خيارًا بديلا سوف يعمل بشكل أفضل، بإمكانه أن يؤدّي في نهاية المطاف إلى نقاش مثمر لي وللعميل على حدّ سواء، وربما يفضي في النّهاية إلى إصلاح سوء الفهم الحاصل وبالتّالي إكمال العمل سويًّا. على سبيل المثال، عندما أصرّ أحد العملاء على إضافة كلمات مفتاحيّة لتحسين نتائج محرّكات البحث (SEO) إلى مقالتي، ولم تكن لتلك الكلمات أيّ علاقة بما كنّت قد كتبت عنه، أبديت له عدم ارتياحي التّام لما جرى، ومن خلال النّقاش مع العميل تم التّوصّل إلى حل وسط يرضي الطّرفين. ربّما كان باستطاعتي تجنّب حدوث هذا الموقف مجددا (غالباً بأن لا أعمل مع ذلك العميل مرة أخرى بما أن لنا توجّهات مختلفة)، ولكن بدلا عن الهروب من المشكلة، كنّت سعيدة بأنّنا توصّلنا إلى اتّفاق كان مرضيا لكلا الطّرفين. إظهار الاهتمام بالنجاحات المتبادلةالعلاقات هي عبارة عن طريق ذي اتّجاهين، وإنّ من أفضل العلاقات التي حظيت بها مع العملاء كانت تلك التي كان كلانا يود فيها رؤية الآخر يحقّق النّجاح. إنّ هذا هو أقل جانب ملموس في الآلية الخاصة بي، ولكنّني حين أحاول التّركيز على ذلك عند بدء التّعامل مع أحد العملاء الجدد، فإنّني عادة ما أجد هذا الاهتمام بالنّجاح المتبادل يظهر على شكلين رئيسيين : مشاركة المواردعندما أقوّم بكتابة محتوى أفخر به لأحد العملاء، فإنّني أضمنه في نشرتي الأسبوعيّة وأقوم بمشاركته لجمهور المتابعين لي على تويتر، لقد عملت لسنوات وحتّى هذه اللّحظة على بناء جمهوري الخاص بي، وعند العمل مع العملاء، فإن جمهوري هو من إحدى أهم الامتيازات التي يحصلون عليها طوال فترة عملي معهم. أقوم كذلك بإرسال دعوات التّرويج، أو تعريف العملاء على عدد من المحرِّرين العاملين في منشورات أخرى والّتي من الممكن أن تقوّم مستقبلاً بترويج المحتوى الخاص بهم (في حال كونه ملائماً). وعندما أقُوم بكتابة محتوى مثير للاهتمام لأحد العملاء الّذين يملكون استراتيجيات عظيمة واهتمام خاص بجمهورهم، فإنني أرغب في مساعدتهم على بناء ذلك الجمهور وجلب متابعين أكثر للاستفادة من ذلك المحتوى. وعلى الجانب الآخر، فقد تعاملت مع محرّرين قاموا بتزكيتي لعملاء آخرين، وقاموا كذلك بتقديمي إلى معارفهم عندما كنّت أحتاج مساعدتهم، وقد كان ذلك أحيانًا مقدّمة للتّعرّف على عميل جديد، أو على صديق لعميلي باستطاعته أن يساعدني بطريقة ما في العمل الخاص بي. إن معرفتي بأنّ عميلي يرغب في رؤيتي أتقدّم يشجعني أكثر على طلب المساعدة منه عندما أحتاجها. تبادل الخبراتعوضًا عن العمل كآلة للإيجار، أقوّم عادة بعرض خبراتي المتراكمة في تسويق المحتوى على العميل، والطّرق المختلفة التي قمت بتجربتها، وكيفيّة قيامي ببناء الجمهور الخاص بي وما إلى ذلك من خبرات وتجارب. وفي المقابل فإن أفضل العملاء الذين تعاملت معهم كانوا أولئك الّذين يشاركون تحليلاتهم لكي أستطيع الحصول على أفكار أفضل حول مدى فاعليّة المحتوى الذي أقدمه وتلاؤمه مع الجمهور المتابع لهم، وطرق صناعة محتوى جديد يساعدهم في التقدّم بشكل أفضل نحو تحقيق أهدافهم وتطلّعاتهم. إنّ هذه الخطوة تعتمد على "الحسّ الغريزي" بشكل أكبر من باقي الخطوات، فأنا لم أعمل قط مع عميل يعلن بشكل واضح عدم رغبته برؤيتي أتقدّم، ولكني بكل تأكيد أستطيع تمييز العميل الذي يود مشاهدتي أنجح. إن تلقّي الملاحظات البنّاءة الّتي تصب في صالح تحسين المحتوى العام الذي أقدّمه لطالما كان إشارة جيّدة في العلاقة بيني وبين العميل. فالمراجعات والملاحظات الإيجابيّة التي تصلني حول نتائج العمل الذي قدّمته للعملاء، يتم استثمارها لاحقًا، سواءً في الأعمال الّتي أقدّمها للعملاء، أو في الأعمال الخاصة بي. خاتمةخلال هذه الفترة أنا محظوظة بامتلاكي الفرصة لاختيار الأشخاص الذين أرغب بالعمل معهم، لذلك أفضل اختيار العملاء الذين يقومون بإنتاج محتوى أؤمن به، ويستهدف جمهورًا أستطيع التّوافق معه وتقديم قيمة حقيقة له. إنّ هذه العملية لا تقوم على أساس المقارنة بين العملاء وتصنيفهم إلى (جيد) أو (سيّء)، ولكنّها في الواقع اختيار للعميل الذي يوافق قيمي والنّهج الذي أسير عليه. إنّ هذه الآليّة ما تزال قيد الإنجاز وهي متغيّرة باستمرار، فإذا كنت مستقلًّا، أو تفكّر في أن تصبح كذلك، فأنا أشجعك على إنشاء آلية خاصة بك في أسرع وقت ممكن، ستتغير الآلية وتتبدّل مع مرور الوقت، ولكن ما أن تبدأ ببناء مرجعيّة صلبة لنفسك، فإنّه سيكون بإمكانك الاعتماد عليها لبناء قرارات حاسمة حول الأشخاص الذين تودّ العمل معهم. ترجمة ـوبتصرفـ للمقال: How to establish and maintain awesome client relationships لصاحبته : Belle Beth Cooper. حقوق الصورة البارزة: Designed by Freepik.
  10. منذ 15 عاما، تخرجت من الكلية مع حلم أن أصبح مدرسة في التاريخ في المدرسة الثانوية شبيهة بأولئك الذين تعودت مشاهدتهم في الأفلام. لكنني وللأسف اصطدمت بالواقع حيث وجدت نفسي وجها لوجه مع 186 طالبا متحمسا مصحوبين بأولياء أمورهم المثيرين جدا للاهتمام. بعد أربع سنوات، قررت أن أصبح منسقة أحداث خاصة في ملجأ محلي للمتشردين إلى جانب مدير حريص يراقبك مراقبة دقيقة. ثم عملت في سمفونية مع مديرة كانت على العكس تماما: غائبة تماما. فانتهى بي الأمر أقوم بعملي مع حصة جيدة من راتبها (دون راتب خاص). وفي ذلك الوقت كنت قد بدأت بتكوين أسرتي الصغيرة، وقررت أن أنتقل للكتابة لحسابي الخاص لأهتم بصغاري وأضمن مدخولا ماديا (وهذا ما أبقاني على تحد دائم وعاقل في تسيير العمل). كنت دوما أفكر: " آه، إنه حقا منعش! فقط أنا والكمبيوتر وشغفي بالكتابة" نعم، لقد كنت حقا بهذه المثالية ولكن غير مدركة للأمر. الآن بعد خمس سنوات، عملت مع العديد من الشركات وعلمت أن كل شخص لديه نمط مختلف من العمل، وفلسفات إدارة فريدة وتوقعات فردية لكل مشروع. كعاملين مستقلين ولحسابنا الخاص، نحن لسنا موهوبين فقط في مهنتنا بل خضعنا لتدريبات لنتحول إلى خبراء في مجالنا فنحن نتحول كالحرباء بين الشركات والوسطاء المعلنين ونحاول يائسين استباق رغبات وحاجات عملائنا. لا زلنا صامدين ونرتد للوراء بسرعة من الخسائر التي تلحقنا جراء وقف مشروع فجأة للعمل على التالي بسرعة. وهذا يكون صعبا خصوصا إن كنت تتعامل مع عدة عملاء كل يوم. كيف من المفترض للعاملين المستقلين حول العالم أن يعملوا بسلاسة مع مجموعة متنوعة من العملاء الذين لديهم مجموعات مختلفة من التوقعات والأدوات المطلوبة لإنجاز العمل؟ هنا أربع طرق لإدارة تنوع شخصيات العملاء وتوقعات طلباتهم التي من شأنها أن تنفع في التعامل معهم. 1. تعلم أن تكون مرناتعتبر كل شركة لغزا مختلفا وأنت القطعة المفقودة لاستكمال الصورة. ومع ذلك، يمكن للقطعة ألا تصلح في كل لغز، لهذا تحتاج للتكيف مع متطلبات الوظيفة (بعد كل شيء، هم ليسوا مجبرين على تغيير عادات عملهم.... بل المجبر هو أنت). على سبيل المثال، أكتب عادة المحتوى وأستخدم جوجل لتحميل المستندات ولمراسلة عملائي. ومع ذلك، كان هنالك عميل يود الدردشة لمدة نصف ساعة كل ليلة لتبادل الأفكار حول كيفية إعادة تنظيم موقعه الإلكتروني. فعلنا ذلك لأربعة أسابيع! هو يتحدث وأنا أستمع. ربما كتبت حوالي 400 كلمة، لكنني وصفت له العلاج.... أعنى به التحرير. فكرة موجزة: عامل كل عميل على أنه عميلك الوحيد فبعض العملاء يفضلون التواصل الدائم وبعضهم يفضل الرسائل الأسبوعية. فلتقم بأفضل ما يمكنك من أجلهم. قم بتصنيف العملاء وقم بتدوين ملاحظات حول توقعاتهم، عادات العمل لديهم، والفروق الدقيقة. إن العمل الحر رقصة معقدة ولكل شريك في الرقصة إيقاعه الخاص به. 2. محرك البحث الخاص بك أفضل صديق لكيميل العملاء إلى إعطاءك الوظيفة لكنهم يتوقعون منك أن تمتثل لجميع بنود الاتفاق الخاص به. كان لدي عميل قال لي " فلتفتح حسابا على جوجل ولتنشر عملك على جوجل+ وسأقوم بالدفع لك على باي بال." لم تكن هنالك وسيلة لأقول "لا" أو أن أسأل: " كيف أفعل ذلك؟" ها هو ذا يوتيوب، محرك البحث الخاص بك، أو الأيقونة الصغيرة المسماة " المساعدة" موجودة. فالتكنولوجيا تتحرك كسرعة الضوء والعديد من الشركات تسير جنبا إلى جنب معها. لحسن الحظ، يمكنك أن تجد كل المعلومات والتعليمات الخاصة بالمواد التي تحتاجها على الإنترنت. بحيث يمكنك تدريب نفسك بنفسك دون أن تكون عبئا على العميل الخاص بك، مما يجعلك من أكثر المرغوب فيهم للمشاريع المستقبلية. والمكسب الكبير الآخر هم أصدقاءك، عائلتك، والعاملين المستقلين الآخرين. فقبل بضع سنوات مضت وعندما كانت " سحابة الإنترنت" الكلمة الطنانة طوال اليوم، كان مطلوبا مني أن أكتب عدة قطع حيال ذلك ولحسن الحظ، كان أخ زوجي مهووسا كبيرا بذلك فساعدني في ذلك. 3. اعلم متى يجب عليك أن تتخلى عن الأمور ومتى يجب عليك أن تهرب منهايوجد أحيانا عملاء لا يعجبهم العجب ولا يرضيهم أي شيء. لا شيء مما تقوم به يكون صحيحا في نظرهم، وهذه إهانة من قبلهم، لدرجة أنك صرت تشعر بالاستياء من سماع صوت تنبيه رسائلهم الإلكترونية خوفا. إذا قمت بكل ما في وسعك لمعرفة رؤيتهم وتطلعاتهم وعادات العمل الخاصة بهم لكنك لا زلت بائسا فلتقطع علاقة العمل معهم. يُمكن تجنّب مثل هذه المشاكل عبر التّفاهم وكتابة عقد من البداية. لا تتصرف بتهور، تقول Maria Malidaki بخصوص هذا الأمر: فرصة واحدة وأخيرة: أخيرا، فلتقاسمهم إحباطك، واسمح لهم بشرح وجهة نظرهم، ومن ثم امنحهم فرصة للإقرار بأخطائهم وتحسين الوضع. وإن كان كل هذا غير مفيد، فلتستكمل المشاريع غير المنجزة والتي تم دفع ثمنها مسبقا أو تسليم المعلومات البحثية. فلتبذل قصارى جهدك لإنهائه بشروط جيدة. إن كنت لا ترغب في الحصول على سمعة سيئة في عالم الشبكات الاجتماعية التي قد تضر بقدرتك في الحصول على عملاء جدد في المستقبل. 4. فلتعلم ما أنت مقدم عليه أولايمكنك أن تعرف الكثير عن شخص ما من مكالمة عشر دقائق. هل اتصل بك في الوقت المتفق عليه؟ هل بدا مُرتبكّا؟هل ركّز حول الأسباب التي دفعت بالكّتاب الثلاثة السّابقين إلى عدم توفير مُحتوى مُناسب؟ هل تحدث طوال الوقت وهل سألك عن خبرتك وأسلوب كتابتك؟ بالتأكيد هنالك علامات تحذير، لذا فعليك البحث عنها. يمكنك أيضا التحقق من موقع الشركة على الإنترنت، أو حسابه الشخصي على لينكدإن أو مواقع التواصل الاجتماعي لتعرف أكثر حول العميل. وكلما علمت أكثر كلّما كنت أكثر جاهزية لقبول أو رفض مشروع. وأخيرا، تذكّر بأنّه لا يجب عليك أن تقبل كل وظيفة تُرسل إليك أو أن تتعامل مع عميل صعب المزاج. مع العمل المستقل يمكنك العثور على وظيفة من خلال الوسائل المتوفرة كـمنصّة مُستقل، وانتقائها واختيار المهام المناسبة لك. فأنت عندما تعمل بسعادة تكتب بسعادة. ترجمة -وبتصرف- للمقال: Going with the flow; how to work with a plethora of client personalities لصاحبته: Christina Morales. حقوق الصورة البارزة: Designed by Freepik.
  11. ربّما لم يصبح لينكد إن بشهرة فيسبوك وتويتر، ولكن إن كانت منتجاتك/خدماتك موجهة إلى الشركات (B2B) فسيكون أداة فعّالة ومهمّة لدعم خطتك التسويقية. إنّه من السّهل تجاهل لينكد إن عند مقارنته بالشبكات العملاقة كفيسبوك وتويتر، وقد تشعر أنّه موقع كئيب وغير مسل إطلاقًا ولكن، عندما تدرك أنّ فيه أكثر من مائة وثلاثين مليون خبير ورجل أعمال، ستعلم أنّه أداة قوية وفعاالة لتسويق منتجاتك أو خدماتك للشركات الأخرى. على أيّ حال، إن كنت تريد تحقيق أعلى استفادةٍ من الموقع فعليك أن تفعل أكثر من مجردِ التسجيل فيه، يتوجب عليك أن تنشَط وتتفاعل وهذا يكون عبر حسابك الشخصي. كيف تملأ حسابك الشخصي بشكل احترافيّ؟إنّه من المغري أن تملأ بيانات حسابك على الموقع وتنسى الأمر. وهذا سيكون خطأ فادحًا منك. في البداية عليك أن تكون نشطا كما تفعل بالعادة على فيسبوك ولكن انتبه فلا يتوجب عليك مشاركة أمورك الشخصية على لينكد إن أبدًا. على مشاركاتكَ أن تكون ذات علاقة بالمشاريع التي تقوم بإنجازها، روابط لأعمالك وشهادات العملاء، احرص على استعمال الموقع لإظهار أفضل صورة لخبراتك. عليك أيضا أن تحثّ الآخرين على الإشادة بمهاراتك، والشّهادة على خبراتك في مجال معيّن. على سبيل المثال، أشاد العديد بخبرتي الواسعة في تصميم المواقع والرقميات. بإمكانك أن تطلب من زملائك وأصدقائك دعمك في هذا الأمر، أو ببساطة قم بدعم الآخرين ليدعموك بدورهم. وسع الصفحة الخاصة بشركتكإن كنت أكملت بناء حسابك الشخصيّ بالطريقة الصحيحة، يمكنك الآن التركيز على صفحة شركتك الخاصة على لينكد إن. في البداية تأكد أنّه بإمكانك إنشاء وتعديل صفحة شركتك. إن كنت قد أنشأت واحدة بالفعل فهذه ليست مشكلة أبدا؛ لأنَّ الموقع يقدم إرشادات لكيفية وضعك كمسؤول عن صفحة الشركة الخاصة بك. بمجرد حصولك على الموافقة سيكون عليك كتابة لمحةٍ بسيطةٍ عن شركتك. وعندما تنتهي من ذلك ابدأ بإضافة منتجاتكَ وخدماتك. إنّ إضافتك للمنتجات والخدمات أمر مهمٌ جدا؛ ذلك أنّ الأفراد بإمكانهم الإشادة والتوصية بما تقدم، تتكون هذه التوصيات من شهادات العملاء والتي من منظورٍ تسويقيّ لا تقدر بثمن، لأنّها ترتبط بشخص حقيقيّ له حساب فعال على الموقع. في النهاية، عليك أن تتابع نشر التحديثات والحالات باستمرار على صفحة الشركة الخاصة بك. شخصيا أستعمل أداة تسمى Buffer تمكنني من النشر على حسابي الخاص وصفحة شركتي في ذات الوقت وكذلك في أي مجموعة أنشأتها، وقد عرفني هذا الأمر على مجموعات لطيفة حقا. إنشاء مجموعة على لينكد إنيمكن للمجموعة على لينكد إن أن تكون حول أي موضوع تريده. فكّر في المجموعة كمساحة للنقاش وتبادل الخبرات حول موضوع محدد وعلى عكس صفحة الشركة، تتيح المجموعات الفرصة لأي شخص البدء في النقاش والمشاركة وهذا ما يخلق مجالًا رائعا لبناء العلاقات وتوثيق الروابط. حسب نمط عملك أنشئ مجموعة لطرح الأسئلة ومناقشة الأمور التي تريد. إن كنت تملك مجموعةً بالفعل فبادر إلى المشاركة والتفاعل فيها. على سبيل المثال، لقد أنشأتُ مجموعة باسم Boagworld لمناقشة التحديات والمشاكل التي تواجه المرء عند إنشاء موقع إلكترونيّ. إنّه من السهل التغافل عن أهمية موقع لينكد إن. حيث أنه أداة مذهلة ومفيدة إن استخدمت بشكل صحيح. بإمكان هذا الموقع مساعدتك في بناء علاقات جديدة، توسيع آفاق مبيعاتك، تسويقك كخبير مستقل وبناء قاعدة جيدة لعلامتك التجارية. كما أنه يمكن استغلاله كوسيلة للتوظيف والإبقاء على اتصالك بالآخرين. جميعه في موقع واحد، إنّه يستحق أن يصنف كأحد أهم الإستراتيجيات الرقمية للمؤسسات. ترجمة -وبتصرّف- للمقال: How to use LinkedIn as a marketing tool لصاحبه Paul Boag. حقوق الصورة البارزة: Designed by Freepik.
  12. أهتمّ كثيرًا بالتفكير والتأمّل بعلاقات الشركاء المُؤسّسين للشّركات النّاشئة co-founders، فقد كنتُ جزءًا منها وجربتُها شخصيًّا، البعض من علاقاتي مع شركائي المُؤسّسين لم تكن ناجحةً تمامًا، لكنّ عملي الحاليّ مع شريكي الحالي في السنوات الثلاث الأخيرة كان متعةً حقيقيّة. المدهش في الأمر بالنسبة لي، اكتشاف الحاجة الملحّة ليكون الشركاء مختلفين في العديد من الأمور، وليتقاسموا العديد من الصفات والقيم في الوقت نفسه، أن تجد شخصًا يمكنك العمل معه بثقةٍ وإبداع هو فنٌّ بحد ذاته. شاهدتُ مؤخّرًا تسجيلًا لمقابلة مع DHH من شركة Basecamp، وكانت أسئلة الجمهور حول الشركاء المُؤسّسين مهمّة وعلى تقاطع كبير مع تجاربي الخاصة بكيفيّة تحقيق توافق مثمر. المهارات المختلفة تخلق التكامل واحدة من أكثر الأمور قيمة وأهمية في علاقات الشّركاء المُؤسّسين في رأيي هو وجود قدرات ومهارات مختلفة لديهم، كثيرًا ما أرى مشاريع مذهلة من مهندسين مبدعين أو أشخاص منتجين لكنها غير منتشرة كفاية، أدرك حينها أنّ المنتج بحاجة للتسويق بشكل أكبر بين الناس، ومن المحتمل أن يكون هذا نتيجة لتركيز الشريكين على البناء بشكل كامل، وعدم ميلهم واهتمامهم بالتسويق. في الأيام الأولى لمشروع Buffer، عملتُ على المنتج إلى حدّ كان لديّ فيه بضع مئات من المستخدمين وبعض الزبائن المشتركين الذين يدفعون اشتراكات دورية، كنتُ أعرف ضمنيّا حاجتي للانتقال للتسويق بعد أن تحقّقت من رغبة الناس بالمنتج وكونه مفيدًا لهم بشكله الحاليّ، وكنت مقتنعًا بوضوح أن هناك العديد من الأشخاص الذين سيستفيدون منه لو علموا به، لكنّ الانتقال للتسويق كان تحديّا كبيرًا لي كمطوّر ومبرمج معتاد على إصلاح العلل البرمجية وبناء خصائص جديدة. وهنا أتى شريكي المُؤسس في الوقت المناسب -لحسن حظّي-، ليحدث تغييرًا كبيرًا بقدراته التسويقية الهائلة. علاوة على ذلك، يعتبر امتلاك طرق تفكير مختلفة أمرًا مفيدًا أيضًا: بالنسبة لي ولشريكي ليو، فكلانا نحبّ التحدّي واتّباع منهجية Lean Startup. في نفس الوقت قد يكون ليو ميّالًا لإخراج الأشياء إلى النّور مبكّرًا جدًّا، بينما أفضّل أن أكون أكثر منطقيّة وحسابًا، وأن أدرس الأمور بشكل متوازن للتأكد من عدم هدر الوقت في بناء مزايا لم نتحقّق من رغبة الناس بها، لكن اختلافنا لا زال يساعدنا على إطلاق المزايا بشكل متقن ومبكّر. واحدة من أكثر الطرق أهمية في تكاملي وليو مع بعضنا البعض هي في ثنائيّة "العمل" مقابل "التفكير". عادة ما كنت أمازحه بقولي أنه في حال كان لدى كلٍّ منا خمس عناصر في قائمة المهام اليوميّة الخاصة به، فإنّ ليو سينفذها جميعها دون شكّ، في حين أناضل جاهدًا لأتمّها، أقوم بالكثير لأكون فعّالًا لكنني أحبّ قضاء الوقت متأملًا في المسارات التي نحن بصددها والتفكّر في التغيّرات التي أمامنا. كلانا يطمح لأخذ بعضٍ من صفات الآخر: أحب أن أكون عمليّا بشكل أكبر، ويقول ليو أنه يودّ أن يتأمل أكثر أحيانًا وأن يدرك حاجته لعدم أداء بعض المهام. نتحدّث بصراحة وانتظام ونساعد بعضنا، ونصل في النهاية لتوازنٍ جميلٍ ومريح. تقاسم رؤى وقيم مشتركة الجزء الأصعب من إيجاد شريك مُؤسّس مناسب تمامًا هو أنك تريد أن تتكاملا بشكلٍ تامّ، لكن بنفس الوقت يجب أن تتفقا على القيم الأساسية و الإطار العام لعمل الشركة، فمثلًا قد يكون طموح أحدكما بالعمل في الشركة لعدّة سنوات فقط ومن ثم بيعها لكنّ الآخر يودّ أن يستمرّ بها طيلة حياته، سيكون من الصعب في حالات كهذه الاتفاق على القرارات المصيرية. منذ المراحل المبكرة لعملنا معًا، كان واضحًا مدى اتفاقي أنا وليو على العديد من القيم والتي تبلورت لاحقًا لتشكّل ثقافة Buffer، اطّلعت مع ليو على كتاب "كيف تكسب الأصدقاء وتؤثّر في الناس"، وقد أمضينا ساعات لا تحصى نتناقش حول مبادئ الكتاب وأمثلته، كثيرًا ما يعبّر ليو عن امتنانه الهائل للفرص التي حصل عليها، ولعلّه من أكثر الأشخاص الذين أعرفهم إيجابية وسرورًا، وهي إحدى الصفات التي أطمح أن أركّز عليها في شخصيتي أكثر، أستمتع دائما في كوني شفافًا ومنفتحًا فيما يتعلّق برحلة تعلّمي المُستمر، الأمر يشاركني به ليو بشكل طبيعي، والذي بات يستمتع بدفعنا كلينا في هذا الاتجاه. كيف التقيتَ بشريكك وما هي الطرق التي تتكاملان بها مع بعضكما البعض؟ شاركنا بتجربتك في التّعليقات. ترجمة -و بتصرّف- للمقال The Yin and Yang of a great co-founder relationship لصاحبه Joel Gascoign.