لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 06/13/16 في كل الموقع
-
هل أنت من محاربي PHP القدامى وتريد معرفة ما الذي استجد منذ عدِّة سنوات؟ أم أنت منتقلٌ حديثًا إلى PHP من لغةٍ أخرى وتود معرفة الأمور المثيرة في PHP، ها قد وصلت إلى المكان الصحيح. لننفض الغبار عن معلوماتك، وتهيّأ أن تتعلم ميزاتٍ أضيفت حديثًا إلى PHP. معايير PHP-FIG أعداد مشاريع ومكتبات وأطر عمل PHP الموجودة حاليًا مهولة، إذ هنالك العديد من أطر عمل PHP المتوفرة للاستعمال، لكن من الصعب استعمالها معًا، فماذا لو استطاع أحد أطر العمل الاستفادة من مكتبة ما خارجية، بدلًا من كتابتها يدويًا، أو الاستفادة من مكتبة من إطار Laravel مثلًا؟ لهذا الغرض أُنشِئت PHP-FIG (اختصار للعبارة Framework Interoperability Group) في مؤتمر php|tek في 2009ـ التي وضعت عدِّة معايير يُرمَز لها بالاختصار PSR (أي PHP Standards Recommendations) سنورد ذكرها هنا باختصار. PSR-1: معيار كتابة الشيفرات يوضح هذا المعيار الأمور الأساسية التي يجب أخذها بعين الاعتبار عند كتابة الشيفرات لتحقيق أكبر قدر من المحمولية وإمكانية التشغيل مع بقية المكتبات والبرمجيات. يجب استعمال وسوم <?php ?> الاعتيادية، ووسم echo المختصر <?= ?> فقط. يجب أن يكون ترميز ملفات الشيفرات UTF-8 دون BOM. يجب على الملف أن يُنشِئ بنى برمجية جديدة مثل الأصناف (classes) والدوال …إلخ. دون أن يُحدِث أي "تأثير جانبي"، أو يجب أن ينفِّذ الخطوات المنطقية التي تؤدي إلى "تأثيرات جانبية" ولكن لا يُسمَح أن يقوم بكلا الأمرين. نستطيع تعريف "التأثيرات الجانبية" بالأمور غير المتعلقة بتعريف الأصناف أو الدوال، وهي تشمل: توليد المخرجات، أو تضمين الملفات (عبر include أو require)، أو الاتصال إلى الخدمات الخارجية، أو تعديل ضبط ini، أو تعديل المتغيرات العامة أو الكتابة إلى ملفات، وهلم جرًا. يجب أن تكون مجالات الأسماء (namespaces) وأسماء الأصناف متوافقة مع معيار PSR-4 (سنأتي على ذكره بعد قليل)، وهذا يعني أن كل ملف سيحتوي على صنف وحيد باسمه، وفي مجال أسماء من مرحلة (level) واحدة على الأقل. يجب أن تكون أسماء الأصناف على الشكل StudlyCaps (أي الحرف الأول من كل كلمة كبير). يجب أن تكون الثوابت المُعرَّفة في الأصناف بأحرف كبيرة وتفصل الشرطة السفلية بين الكلمات. يجب أن تكون أسماء الدوال على الشكل camelCase (أي الحرف الأول من كل كلمة كبير، عدا أول كلمة). PSR-2: معيار تنسيق الشيفرات يساعد هذا المعيار في تسهيل التعامل مع الملفات التي كتبها مبرمجون آخرون عبر تحديد قواعد مشتركة لكيفية تنسيق شيفرات PHP. يعتمد هذا المعيار على المعيار PSR-1، أي على المبرمج تطبيق قواعد PSR-1 أولًا. يجب أن تُستعمل أربعة فراغات (مسافات) لمحاذاة الشيفرات، وليست مسافات الجدولة (tabs)، ولا يجوز أن تدمج بين الطريقتين، وذلك لتفادي حدوث مشاكل في ملفات الفروقات (diff) وغيرها. ليس هنالك حدٌ أقصى لعدد المحارف في السطر، لكن يستحسن أن يكون بطول 80 محرف أو أقل، ويمكن إضافة أسطر فارغة لتحسين مقروئية النص. ولا يجوز وضع أكثر من تعبير برمجي في السطر الواحد. يجب أن تكون الكلمات المفتاحية (keywords) في PHP بأحرفٍ صغيرة، وكذلك الأمر للثوابت true و false و null. يجب وجود سطر فارغ وحيد بعد تعريف مجال الأسماء (namespace)، وكذلك الأمر بعد use. يجب أن يكون قوس البداية لصنف أو دالة في سطرٍ منفصل، وكذلك قوس النهاية؛ ولا يجوز وضع فراغ بين اسم الدالة وقوس المعاملات، ويجب وضع فراغ وحيد بعد الفاصلة "," في حال وجود أكثر من معامل. يجب تعيين مُحدِّد وصول مثل public أو private أو protected، وعدم استخدام var. يجب وضع فراغ وحيد بعد الكلمة المحجوزة لبنى التحكم (مثل if و for وغيرهما). PSR-3: معيار السجلات يُعرِّف هذا المعيار واجهةً (interface) للتسجيل (logging). PSR-4: معيار التحميل التلقائي شرحنا التحميل التلقائي في درس توزيع شيفرات PHP على عدة ملفات، يمكنك العودة إليه لمزيدٍ من المعلومات. الحزم البرمجية تخيل معي الوضع التالي: أنت مُطور PHP، لديك مشروع تود تطويره، قد تختار إطار عمل مُعين لهذه المهمة، لكنك ستحتاج إلى بضعة مكتبات إضافية للقيام بذلك، تخيل بأنك تود أن يقوم تطبيقك بنشر تحديثات مُعينة على حساب المُستخدم على تويتر، وجدت المكتبة التي ترغب في استخدامها لكنها مكتبة تعتمد على مكتبة أخرى. مُطور PHP من العصر الحجري سيقوم بالتالي: سيقوم بتحميل نُسخة من إطار العمل، ومن ثم يقوم بإنشاء مُجلد يضع فيه المكتبات الإضافية التي يحتاجها ومن ثم يُحاول فهم آلية عملها ليربطها ببعضها البعض. قد تؤتي هذه الطريقة أكلها، وقد تسمح لك بتطوير مشروعك "من دون أية مشاكل"، لكن ماذا يحدث مثلا لو تم إطلاق تحديث لأي من المكتبات التي تعتمد عليها؟ هل ستقوم بإعادة تحميلها من جديد واستبدال الإصدار القديم بالجديد؟ هل يُمكن أن تفعل ذلك لو كنت تستخدم أكثر من مكتبة يعتمد بعضها على بعض؟ لست متأكدا من ذلك. لكن ما هو البديل؟ هل عرفت فائدة أدوات إدارة الحزم؟ ما رأيك أن تكمل قراءة مقال ما هو Composer ولماذا يجب على كل مطور PHP استخدامه وتتعرف على composer وتتعلم طريقة استخدامه. كلمات المرور توجد قابلية تسجيل مستخدمين جدد في أغلبية المواقع، وهذا يعني أنَّ على المستخدم توفير كلمة مرور لكي يدخل على حسابه، لكن هل تساءلت من قبل عن أكثر الطرق أمانًا في تخزين كلمات مرور المستخدمين؟ سأنصحك بعض النصائح في هذا الصدد. لا يجدر بك معرفة كلمات مرور مستخدميك هذا يعني أنَّك ستخزِّن كلمة المرور على شكل نص بسيط في مكانٍ ما في قاعدة بياناتك، افترض مثلًا أنَّ موقعك قد تعرض للاختراق، واستطاع المُخترَق الوصول إلى قاعدة بيانات موقعك واستطاع رؤية جميع كلمات مرور مستخدميك! أنت تعرض سلامة حسابات مستخدميك الأخرى (وسمعة موقعك) للخطر. لا ترسل كلمات المرور الجديدة عبر البريد الإلكتروني هذا خطأٌ كبيرٌ لأنه يعني أنَّ الموقع يعلم كلمة مرور المستخدم، ولقد أرسلها عبر خدمة البريد (قد لا يكون الاتصال مشفرًا!)؛ وإنما عليك إرسال رابط سيسمح للمستخدم بكتابة كلمة مرور جديدة. لا تشفر (encrypt) كلمات المرور قد تظن أنَّ التشفير فكرةٌ جيدةٌ لكن تذكر أنَّ العملية قابلة للعكس، فأي شخص يملك وصولًا إلى شيفرات موقعك البرمجية سيقدر على تحويل كلمات المرور المُشفَّرة إلى أصلها. لا تستخدم MD5 من الجيد أن تستعمل طريقة تحويل غير قابلة للعكس، فهذه الطرق -مثل MD5- غير قابلة للعكس، مما يُصعِّب مهمة معرفة كلمة المرور الأصلية؛ وإذا أردت التأكد أنَّ كلمة المرور التي أدخلها المستخدم مطابقة لكلمة المرور المخزنة في قاعدة البيانات، فعليك أولًا تحويل كلمة المرور التي أدخلها بإحدى الطرق ثم مقارنتها مع الكلمة المخزنة في قاعدة البيانات. لكن يَسهُل كثيرًا توليد جداول بالقيم الأصلية والقيم المحوَّلة تسمى "جداول rainbow"، وسيتم البحث عن القيم المحولة إلى أن يُعثَر على تطابق (ينطبق المثل على SHA-1). أتت PHP 5.5 بدوال بسيطة لتحويل كلمات المرور بأمان وهي password_hash() و password_verify(). تُستعمل الدالة الأولى لتحويل كلمة المرور إلى عبارة غير قابلة للعكس التي تستطيع تخزينها بأمان في قاعدة بياناتك. $hash = password_hash($password, PASSWORD_DEFAULT); هذا كل ما في الأمر: أول وسيط هو كلمة المرور التي تريد تحويلها، والوسيط الثاني هو الخوارزمية التي تريد استخدامها للتحويل. الخوارزمية الافتراضية هي bcrypt، ويجب أن تُخزِّن القيم الناتجة في حقل أكبر من 60 محرف في قاعدة البيانات (ربما تستعمل 255). يمكنك أيضًا تمرير PASSWORD_BCRYPT كوسيط في حال أردت أن يكون الناتج بطول 60 محرف دومًا. أما دالة password_verify() فهي تقارن كلمة المرور التي أدخلها المستخدم (الوسيط الأول) بكلمة المرور المحوَّلة والمخزنة في قاعدة البيانات (الوسيط الثاني). <?php if (password_verify($password, $hash)) { // كلمة المرور صحيحة } else { // كلمة المرور غير مطابقة } الأخطاء في PHP أكثر ما يواجهه المبرمج في حياته هو الأخطاء! نحاول -نحن معشر المبرمجين- أن نتلافى حدوث الأخطاء، لكن ذلك ليس ممكنًا في الحياة العملية. علينا أن نعي أنَّ هنالك تصنيفين: الأول هو الأخطاء (errors) التي رأيتها سابقًا خلال هذه السلسلة، التي تُظهِرها الدوال المُضمَّنة في اللغة؛ والثاني هو الاستثناءات (exceptions) التي تظهر في البرامج التي تعتمد على البرمجة غرضية التوجه. تُصنَّف PHP على أنها لا تعتمد كثيرًا على الاستثناءات، وإنما تعتمد على الأخطاء. فلو حاولت مثلًا أن تطبع قيمة متغير غير معرف، فستظهر تنبيهًا لكن PHP ستكمل تفسير السكربت: $ php -a php > echo $foo; Notice: Undefined variable: foo in php shell code on line 1 أما في اللغات الأخرى التي تعتمد اعتمادًا كاملًا على الاستثناء -مثل بايثون- فستختلف النتيجة: $ python print foo Traceback (most recent call last): File “”, line 1, in NameError: name ‘foo’ is not defined التبليغ عن الأخطاء في PHP هنالك مستويات مختلفة من التبليغ عن الأخطاء في PHP، أشهر ثلاثة مستويات هي الأخطاء (errors) والتنبيهات (notices) والتحذيرات (warning). الأخطاء (errors) هي المشاكل التي تظهر في وقت التشغيل (run-time) التي يكون سببها مشاكل في الشيفرة وستسبب توقف التنفيذ. أما التنبيهات فهي رسائل إرشادية التي قد تسبب مشاكل أثناء تنفيذ السكربت، لكن التنفيذ لن يتوقف. أما التحذيرات فهي شبيهة بالأخطاء لكنها لن توقف عمل السكربت. تستطيع تغيير السلوك الافتراضي للتبليغ عن الأخطاء عبر الدالة error_reporting() التي تستطيع تستطيع ضبط مستوى التبليغ عن الأخطاء أثناء التنفيذ بتمرير ثابت من الثوابت المُعرَّفة مسبقًا لمستويات الأخطاء (E_ERRORللأخطاء، E_NOTICE للتنبيهات، E_WARNING للتحذيرات). فلو كنت تريد مشاهدة الأخطاء والتحذيرات لكنك لا تريد التنبيهات، فيمكنك ضبط ذلك كالآتي: <?php error_reporting(E_ERROR | E_WARNING); تستطيع أن تخبر PHP أن تتجاهل الأخطاء في عبارة برمجية معيّنة باستخدام معامل التحكم بالأخطاء @. يمكنك وضع هذا المعامل قبل تعبير برمجي، وسيتم تجاهل أيّة أخطاء يُسبِّبها هذا التعبير. <?php echo @$foo['bar']; المثال السابق سيطبع قيمة $foo['bar'] إن كانت موجودةً، لكنه لن يطبع شيئًا إن لم يكن المتغير $foo أو المفتاح 'bar' موجودًا؛ فدون وجود معامل التحكم بالأخطاء، كان سيظهر أحد التنبيهين: PHP Notice: Undefined variable: foo أو PHP Notice: Undefined index: bar. بالطبع يمكنك استخدام العبارة الآتية لتنجب وضع معامل تجاهل الأخطاء: <?php echo isset($foo['bar']) ? $foo['bar'] : ''; الاستثناءات تمثِّل الاستثناءات جزءًا مهمًا من العديد من لغات البرمجة مثل ruby أو java، فأي شيء يحدث بشكل خاطئ في تلك اللغات -مثل فشل طلبية HTTP أو فشل الاتصال بقاعدة البيانات- فسيُرمَى (throw) استثناء يعني أنَّ هنالك خطأٌ ما. لكن PHP نفسها متساهلة جدًا بهذا الأمر، فلو فشل استدعاء الدالة file_get_contents() فستحصل على FALSE وربما رسالة تحذيرية (أي من المستوى E_WARNING)؛ أما أطر العمل الحديثة، فتستعمل الاستثناءات. تبنى آلية معالجة الأخطاء في PHP على وضع التعبيرات البرمجية في كتلة try التي تريد مراقبتها من أجل الأخطاء، فلو حدث استثناءٌ ما داخل كتلة try (تحدث الاستثناءات عند "رميها" [throw]) فسيُلتَقَط باستخدام catch التي تلي كتلة try التي رمت الاستثناء. أنا متأكدٌ أنَّك تتساءل عن معنى ما سبق. ما رأيك أن نأخذ مثالًا توضيحيًا يساعد على الفهم: <?php try { $num = 10; if ($num < 20) { throw new Exception("Exception here!"); } $foo = "bar"; } catch(Exception $exception) { print "Exception!\n"; } ?> دخل مُفسِّر PHP إلى كتلة try وبدأ تنفيذ الشيفرة، وعند وصوله إلى السطر throw new Exception توقف عن تنفيذ كتلة try وانتقل إلى كتلة catch؛ لاحظ أنَّه عندما "يغادر" مُفسِّر PHP كتلة try فلن يعود إليها مطلقًا، أي أنَّ السطر $foo = "bar" لن يُنفَّذ. قد ترى أنَّ كتلة catch معقدة في بادئ الأمر، لكنني سأريك مثلًا يعتمد على أنَّ مفسر PHP سينتقل إلى كتلة catch المناسبة، لكن علي أولًا شرح التعبير (catch(Exception $exception. نُحدِّد في كتلة catch أنَّ الصنف هو Exception لأنَّ على PHP أن تُحدِّد أي كتلة من كتل catch يجب تنفيذها بالبحث عن الصنف الموافق للصنف الذي رُميَ. أو بالأحرى، تُجري PHP عملية instanceof (هل تذكرها من درس البرمجة كائنية التوجه؟) وهذا يعني أنَّ على الاستثناء الذي رُميَ أن يكون من الصنف المُحدَّد أو من صنف مشتق منه (أعلم تمامًا العلم أنَّ ما سبق يبدو معقدًا، لكنه أبسط بكثير مما تظن). لاحظ أنَّ جميع الاستثناءات مشتقة من الصنف Exception الذي يوفِّر وظائف أساسية، وأغلبية الدوال الموجودة في الصنف Exception هي final أي لا يمكن إعادة كتابتها في الأصناف المشتقة. يمكنك مثلًا استدعاء الدالة $exception->getMessage() لمعرفة رسالة الخطأ ("Exception here!" في المثال السابق)، أو يمكنك استدعاء getFile() لمعرفة الملف الذي رمى الاستثناء. هذا المثال يوضِّح الشرح السابق: <?php class ExceptFoo extends Exception { } class ExceptBar extends ExceptFoo { } try { $foo = "bar"; throw new ExceptFoo("Baaaaad PHP!"); $bar = "baz"; } catch (ExceptFoo $exception) { echo "Caught ExceptFoo\n"; echo "Message: {$exception->getMessage()}\n"; } catch (ExceptBar $exception) { echo "Caught ExceptBar\n"; echo "Message: {$exception->getMessage()}\n"; } catch (Exception $exception) { echo "Caught Exception\n"; echo "Message: {$exception->getMessage()}\n"; } ?> ناتج السكربت السابق: Caught ExceptFoo Message: Baaaaad PHP! هذا منطقي لأننا رمينا استثناء من الصنف ExceptionFoo، ولهذا ستنتقل PHP إلى كتلة catch. جرب الآن هذه الشيفرة: <?php class ExceptFoo extends Exception { } class ExceptBar extends ExceptFoo { } try { $foo = "bar"; throw new ExceptBar("Baaaaad PHP!"); $bar = "baz"; } catch (ExceptFoo $exception) { echo "Caught ExceptFoo\n"; echo "Message: {$exception->getMessage()}\n"; } catch (ExceptBar $exception) { echo "Caught ExceptBar\n"; echo "Message: {$exception->getMessage()}\n"; } catch (Exception $exception) { echo "Caught Exception\n"; echo "Message: {$exception->getMessage()}\n"; } ?> لماذا ناتج الشيفرة السابقة مماثلة لما قبلها؟ لأنَّ PHP تنتقل إلى أول كتلة catch مُطابِقة لصنف الاستثناء أو أيّة أصناف أب له؛ ولما كان ExceptionBar مشتقٌ من ExceptionFoo، وكانت كتلة catch التابع للصنف ExceptionFoo تأتي قبل ExceptionBar، فستنفَّذ كتلة ExceptionFoo. يمكنك إعادة كتابة الشيفرة كالآتي لتفادي هذه الإشكالية: <?php class ExceptFoo extends Exception { } class ExceptBar extends ExceptFoo { } try { $foo = "bar"; throw new ExceptBar("Baaaaad PHP!"); $bar = "baz"; } catch (ExceptBar $exception) { echo "Caught ExceptBar\n"; echo "Message: {$exception->getMessage()}\n"; } catch (ExceptFoo $exception) { echo "Caught ExceptFoo\n"; echo "Message: {$exception->getMessage()}\n"; } catch (Exception $exception) { echo "Caught Exception\n"; echo "Message: {$exception->getMessage()}\n"; } ?> بقي أمرٌ بسيطٌ تجدر الإشارة إليه ألا وهو كتلة finally الموجودة في إصدار PHP 5.5 وما بعده، التي تضمن لك تنفيذ الشيفرات البرمجية الموجودة فيها دائمًا حتى لو حدث استثناءٌ ما. <?php try { complicatedCode(); } catch (NastyException $e) { handleError($e); } finally { importantCleanup(); } ?> المولدات Generators هذه ميزةٌ جديدةٌ في PHP منذ الإصدار 5.5، وهي تسمح لك باستعمال حلقة foreach للمرور على مجموعة من البيانات دون الحاجة إلى إنشاء مصفوفة في الذاكرة، الأمر الذي قد يؤدي إلى تجاوز حد استهلاك الذاكرة المسموح، أو إلى وقت معالجة كبير… إذ تستطيع كتابة دالة مولدة (generator function) التي تشبه الدوال العادية، إلا أنها بدلًا من إعادة قيمة ما، فهي "تُنتِج" (yield) قيمًا لكي يتم المرور عليها باستعمال الحلقات. مثالٌ بسيطٌ عنها هو دالة range(0, 1000000) التي تولد مصفوفة فيها قيم عددية من الصفر إلى المليون، وستستهلك 100 ميغابايت من الذاكرة العشوائية. ونستطيع بدلًا من ذلك أن نكتب مولدة اسمها xrange() -على سبيل المثال- وستستهلك أقل من 1 كيلوبايت! <?php function xrange($start, $limit) { for ($i = $start; $i <= $limit; $i++) { // استعملنا yield بدلًا من return yield $i; } } // استعملنا المصفوفة المُعادة من استدعاء الدالة range في foreach كالمعتاد foreach (range(1, 9) as $number) { echo "$number "; } echo "\n"; // وكذلك استعملنا نواتج المولدة xrange foreach (xrange(1, 9) as $number) { echo "$number "; } ?> الفرق بين الطريقتين في استهلاك الذاكرة فقط، ولا تأثير لها على سرعة التنفيذ. المصادر راجع صفحة Basic Coding Standard و Coding Style Guide و Logger Interface و Autoloading Standard، وتابع الجديد عبر موقع PHP-FIG. راجع مقالة ما هو Composer ولماذا يجب على كل مطور PHP استخدامه لصاحبها يوغرطة بن علي. لمزيد من المعلومات حول تحويل كلمات المرور، راجع صفحة password_hash و password_verify في دليل PHP، وهذا السؤال على stack overflow. انظر إلى قسم الاستثناءات في PHP: The Right Way، ومقالة Exception handling، وصفحة Exceptions في دليل PHP. تعلم المزيد عن المولدات عبر دليل PHP بصفحتيه Generators overview و Generator syntax.2 نقاط
-
في العام الأول من عمر الطفل، يأخذه والداه إلى طبيب الأطفال لإجراء الفحوصات الشهرية، حيث يقوم الأخير بقياس وزنه وطوله كما يجري عددًا من الفحوصات، وإن كان الطفل ينمو بشكل مستمر، فهذا مؤشّر على أنّه يتمتع بصحة جيّدة. ولكن كيف يقاس نمو الشركات الناشئة؟ يقاس نمو الشركات الناشئة عن طريق تعريف مقاييس ومؤشرات الأداء الأساسية KPI، بمعنى أنّه يتم اختيار أحد المؤشرات، أو مجموعة صغيرة منها، ثم محاولة تحقيق قدر من النمو فيها بشكل أسبوعيٍّ أو شهريٍّ. سنتطرق في هذا المقال وبشيء من التفصيل إلى البنية الرئيسية لمقاييس ومؤشرات الأداء الأساسية. لماذا تعد المقاييس مهمة إلى هذه الدرجة؟ تحديد الأهداف وتحقيقها يستخدم المدراء التنفيذيون هذه المقاييس لتحديد أهداف معينة، وبدلًا من أن يخبر المدير التنفيذي فريق العمل أنّ الشركة بحاجة إلى النمو، أو أنّ هناك حاجة لتحقيق المزيد من التقدّم، يمكن له أن يقول: نحتاج إلى زيادة عدد الأشخاص المسجّلين في الموقع بنسبة X أو نحن بحاجة إلى زيادة الإيرادات الشهرية المتكررة monthly recurring revenue بنسبة Y. وفي كل أسبوع يتم التحقق من مقدار النمو الذي حققته الشركة، وبالتالي يعرف الفريق ما إذا كانت الأهداف المحدّدة قد تحقّقت أم لا. الوضوح والتركيز ما هي أولوياتنا القصوى؟ هل المهمة A أم المهمة B هي الأكثر أهمية؟ في غياب المقاييس، تكون الشركة الناشئة محكومة بالضبابية والفوضى. ولكن عند تأسيس مقاييس واضحة ومحددة، يمكن للمدراء التنفيذيين أن يساعدوا فرقهم في التركيز على الأمور المهمّة فقط، وسيمتلك الفريق بدوره رؤية واضحة بشأن الأمور التي تنال القسط الأكبر من الأهمية، وما يجب التركيز عليه، وما يمكن تنفيذه حسب ذلك. تنظيم عمل الفريق تساعد المقاييس في إنهاء النقاشات والجدالات الدائرة بين أعضاء الفريق واتفاق الجميع على نفس الهدف. على سبيل المثال، عندما يتناقش أعضاء الفريق حول إضافة ميزة معيّنة إلى المنتج، يمكن إعادة صياغة السؤال بالشكل التالي: ما هي المزايا التي تؤدي إضافتها للمنتج إلى تعزيز نمو الشركة؟ وتمتاز هذه الطريقة بأنّها أكثر إنتاجية ونفعًا في تقييم المزايا والخصائص المراد إضافتها إلى المنتجات. الحصول على الاستثمار تعدّ المقاييس من الأمور الجوهرية بالنسبة إلى كل جولة من جولات البحث عن الاستثمار، حتى المبكّرة منها. وكمستثمر فإني أعلم جيّدًا أنه في حال عدم تركيز الشركة الناشئة على المقاييس، فإني لن أكون قادرًا على جني الأموال، والسبب في ذلك هو أن الحصول على الأموال من الاستثمار المخاطر هو نوع من أنواع المضاربة، فأنا أستثمر في فكرة أولية يمكن لها أن تنمو في وقت لاحق، وسأكون قادرًا على بيعها مقابل مبلغ أكبر. ولكن إن لم يتحرك مؤسسو الشركات الناشئة تبعًا للمقاييس، فكيف سيكون بمقدورهم تحقيق النمو في مشاريعهم التجارية؟ وكيف يمكن للمستثمرين أن يروا استثماراتهم تنمو وتكبر؟ دون التركيز على المقاييس لا يمكن لأي شركة أن تحقق النمو ولا يمكن لمؤسسيها أن يحققوا الأرباح سواء لأنفسهم أو للمستثمرين. أساسيات المقاييس لنلق نظرة على بعض المبادئ الأساسية لمقاييس الشركات الناشئة. ربط المقاييس بالإنجازات الأرقام ليست موجودة في الفراغ، ولا يجب قياس هذه الأرقام لمجرد القياس فقط. لنفترض جدلًا أنّك تحاول الحصول على الاستثمار في جولة التمويل البذري seed round، أو أنّك ترغب في أن تصبح قادرًا على تحقيق الأرباح، وهما إنجازان أساسيان في الشركة، ويمكنك الاستفادة من المقاييس في تحقيقهما. فلو كنت ترغب في الحصول على الاستثمار في جولة التمويل البذري ستقرر من خلال الرجوع إلى المقاييس أن عليك الحصول على عدد (س) من المستخدمين أو (ص) من العملاء أو (ع) من المال كإيرادات شهرية متكررة. كذلك الأمر عندما ترغب في الوصول إلى مرحلة التّربّح حيث تعرف بالتحديد مقدار العائد الشهري الذي تحتاج إليه، آخذًا بنظر الاعتبار ما تحتاجه من نفقات ومصاريف، وبهذا تكون قد حدّدت الهدف الذي يُعدّ تحقيقه من الإنجازات المهمّة بالنسبة إليك. حدد مسارك، وقم بقياس أدائك بشكل متكرر توجّه المقاييس الشركات الناشئة نحو تحقيق الإنجازات المهمّة، كما تستخدم الشركات هذه المقاييس لمتابعة الأهداف الأسبوعية والشهرية، وذلك من خلال تحديد الأرقام التي تريد الوصول إليها - بعد سنة من الآن مثلًا - وبعد ذلك تبدأ بحساب المسار الكلي ولكن بشكل رجوعي Backwards، وتبدأ بتحديد الأهداف الشهرية تبعًا لذلك. الآن، يمكنك التحقق من نفسك في كل شهر لترى ما إذا كنت قد وصلت إلى الهدف المطلوب أم لا. إن حققت الهدف فهذا أمر رائع، وإن لم تتمكن من تحقيقه فعليك التحدث مع أعضاء فريقك بهذا الشأن. حدّد الأمور التي تحتاج إلى التعديل، هل هناك شيء ناقص فيما قمت بتنفيذه خلال هذا الشهر؟ هل كان الهدف الذي وضعته لنفسك بعيدًا عن الواقع؟ مهما كانت العلة، فإنّ النقطة الأساسية هنا هي استخدام المقاييس في اكتشاف المشكلة بشكل سريع، ومعالجتها بشكل سريع أيضًا. ركز على مقياس رئيسي واحد وبعض المقاييس الداعمة له في بعض الأحيان يبذل مؤسسو الشركات الناشئة جهدًا كبيرًا في قياس كل شيء، ولكن المقاييس الكثيرة والمتعددة قد تؤدي بهم إلى فقدان التركيز على الشركة الناشئة وخروجها عن المسار الصحيح. في الأيام الأولى من عمر شركتك الناشئة، يستحسن أن تختار مقياسًا أساسيًا واحدًا فقط. اختر المقياس الذين تعتقد أنّه مهم بالنسبة إلى شركتك في هذا الوقت. على أنّ اختيار المقياس المناسب سيولّد الكثير من النقاشات بين أعضاء الفريق، وهذا أمر جيد وصحّي بالنسبة للشركة. يمكن أن يكون المقياس الذي ستختاره مثلًا عدد العملاء المبكرين beta customers الجدد أو الإيرادات الشهرية المتكررة الجديدة أو عدد المستخدمين الجدد النشطين أو غير ذلك من المقاييس. وعندما تحدد طبيعة المقياس الذي ترغب في اعتماده، اجعله المقياس الذي تستند إليه في معرفة نسبة الإنجاز والنمو الذي تحققه شركتك بمرور الزمن. إضافة إلى ذلك، اختر عددًا من المقاييس الدّاعمة - ثلاثة على الأكثر - التي ترغب في متابعتها. قد تتساءل عن سبب تحديد العدد بثلاثة فقط، في الواقع اختيار هذا العدد يعود إلى أن وجود هدف رئيسي واحد وثلاثة أهداف داعمة سيكون ملائمًا تمامًا للشريحة الأسبوعية الخاصة بك. ولكن ما هي الشريحة الأسبوعية؟ إنّها فكرة نستخدمها في برنامج Techstars حيث تحصل كل شركة على شريحة واحدة ويتوجب على الشركة أن تجعل مقاييسها متلائمة مع هذه الشريحة. يبدو الأمر بسيطًا، ويمكن للشركة بكل تأكيد أن تختار أكثر من أربعة أهداف، ولكن النقطة المهمّة هنا هي أن لا تقيس الكثير من الأمور لأنّ ذلك سيجعلك تفقد تركيزك. استخدم لوحة تحكم بسيطة رتب مقاييسك في لوحة تحكم بسيطة وواضحة، واحرص على أن تكون المقاييس سهلة القراءة والفهم. تستخدم العديد من الشركات في Techstars لوحة تحكم إلكترونية تعرض المقاييس والتغييرات الحاصلة فيها بشكل مباشر، ويمكن أن تشكل هذه اللوحات مصدر تحفيز كبير لأعضاء الفريق. ناقش المقاييس وغيرها إن تطلب الأمر لا بأس في الواقع من تغيير الأمور التي تقوم بقياسها، فالشركات الناشئة تعيد التمحور، وتغير توجّهاتها والأمور التي تركّز عليها. وكلما تعرّفت أكثر على السوق المستهدف الخاص بشركتك الناشئة، ستلاحظ أن الأمور قد بدأت بالتغيّر. ولا بأس في تغيير المقاييس الأساسية والمقاييس الدّاعمة كذلك. ولأكون صادقًا معك أكثر، من الجيّد أن يحدث هذا التغيير. على سبيل المثال، في الأيام الأولى من عمر شركتك الناشئة تكون مهووسًا ببناء قاعدة قوية من المستخدمين، وتبذل جهودًا مضاعفة لأجل الحصول على العميل الأول، لذا ستكون المقاييس الأساسية التي ستركّز عليها هي رضا العملاء ومدة استبقائهم Retention. يمكنك التركيز على الاستخدام المتكرر لأنّك ترغب في التأكد من أن منتجك ملائم للسوق، وفي مثل هذه الحالة ستحرص على أن يسجّل المستخدمون في الموقع وأن يبقوا فيه، لذا ستركّز على استبقاء العملاء وعدم فقدانهم. بعد مرور فترة من الزمن والاطمئنان بأنّ المنتج قد بدأ العمل بالفعل، ستتغيّر أولوياتك، وقد تحتاج إلى التركيز على توجيه المزيد من العملاء باتجاه المنتج، وسيتغير المقياس الأساسي لديك ليصبح عدد العملاء الجدد. شخص واحد مسؤول عن المقاييس، لكن يمكن للجميع التناقش بشأنها يجب أن يكون هناك شخص واحد تقع على عاتقه مسؤولية متابعة المقاييس، وافتح باب النقاش بشأنها للجميع. توكل هذه المهمّة في الأيام الأولى من عمر الشركة إلى المدير التنفيذي. بما أن المدير التنفيذي يستفيد من المقاييس لتعيين الأهداف وإدارة الفريق والحصول على الاستثمار، سيكون هو الشخص المناسب لمتابعة المقاييس في الأيام الأولى من عمر الشركة. استعن بالمقاييس، ولكن اتخذ قرارات نابعة من إحساسك الداخلي استعن بالمقاييس لاتخاذ القرارات، ولكن احذر من أن تخدعك الأرقام. يجب أن يستند القرار النهائي الذي يتّخذه المدير التنفيذي بخصوص توجّهات الشركة إلى المنطق السليم والإحساس الداخلي. المقاييس مهمّة للغاية، ولكن الأهمّ من ذلك هو الوثوق بقدرة العقل البشري والأحاسيس الداخلية في اتخاذ القرارات المصيرية وغير التقليدية بغضّ النظر عمّا تخبرنا به الأرقام. ما هي الأمور التي ستقيسها؟ أعتقد بأنّك قد أصبحت مقتنعًا الآن بأهمية المقاييس، وقد أصبحت مستعدًا لتبدأ القياس، ولكن ما هي الأمور التي ستقيسها؟ قس التغييرات بدلا من الأمور الإجمالية لتنطلق الشركة الناشئة بنجاح، عليها تحقيق النمو بنحو متسارع، وقياس الأمور الإجمالية يعطي شعورًا كاذبًا بالنمو. من المؤكّد أن الأعداد الإجمالية للعملاء أو المستخدمين في نمو مستمر (إن لم يكن الأمر كذلك، فمشروعك التجاري لا يعمل بكل تأكيد) ولكن الأرقام الإجمالية لا تخبرك بكل شيء عن النمو؛ ولهذا السبب يطلق على هذه الأرقام تسمية المقاييس الزائفة vanity metrics ، فهي تمنحك الشعور بأنّك تبلي بلاءً حسنًا، ولكن الحقيقة ليست كذلك دائمًا. ابدأ بقياس العائدات الشهرية أو الأسبوعية الجديدة والناتجة من المستخدمين والعملاء، فقياس التغييرات يعني التركيز على النمو. إن كان الرسم البياني للعائدات الشهرية الجديدة يُنتِج خطًّا مسطّحًا، فهذا يعني أنّ شركتك لا زالت في طور النمو، ولكن لو أعطى الرسم البياني للعائدات الإجمالية خطًّا مسطّحًا فهذا يعني أن شركتك تعاني من الركود. إن أعطى الرسم البياني للعائدات الشهرية خطًّا مستقيمًا بزاوية 45 درجة فهذا يعني أنّ شركتك تنمو بشكل متسارع، ولكن أعطى الرسم البياني للعائدات الإجمالية خطًّا مستقيمًا بزاوية 45 درجة فقد تكون شركتك في حالة نمو خطّي وقد لا تكون كذلك. قس الاستخدام الفعلي ونسبة فقدان العملاء بالإضافة إلى قياس النمو، يستحسن أن يتم قياس الاستخدام الفعلي ونسبة فقدان العملاء، والسبب وراء ذلك هو أنّ الشركات الناشئة وفي أغلب الأحيان تتمكن من الحصول على العملاء، ولكنها تفشل في المحافظة عليهم، وتسمى هذه الحالة بالدلو المخرومLeaky bucket situation . من الجيد أنك تستطيع الحصول على المزيد من العملاء، ولكنّهم يتركونك بسرعة وهذا أمر سيّء، وكما تعلم فإنّ جلب العملاء على نطاق واسع يتطلب إنفاق المال، والمشروع التجاري الجيد هو الذي يحافظ على العملاء ليتمكن من تعويض الأموال التي أنفقت في جلب هؤلاء العملاء والمحافظة عليهم للحصول على الأرباح. إضافة إلى ذلك، إن أتحت للعملاء فرصة تجربة المنتج أو الخدمة التي تقدمها، ثم لم يستمرّوا في ذلك، فهذا يعني وجود مشكلة ما، ومنتجك هذا لا يقدّم القيمة الكافية لعملائك، أي أنّه يعاني من مشكلة ما؛ لذا، من الضروري أن تعير مسألة الاستخدام الفعال، والاستمرار في استخدام المنتج وعدم فقدان العملاء عناية بالغة. قس أقماع التحويل يبدو أن الأقماع من الأمور التي يجب على مؤسّسي الشركات الناشئة إتقانها. سواء أكنت ترغب في تحويل زوّار موقعك الإلكتروني إلى مستخدمين مبكرين beta users أم كنت تحاول استخدام قمع المبيعات لتحويل العملاء المحتملين إلى عملاء يدفعون الأموال، ففي جميع الأحوال تتضمن العملية أقماعًا متعددة المستويات. ولكل قمع فوهتان، علوية وسفلية. تكون الفوهة العلوية عريضة وتكون الأهداف فيها غير محدّدة، أما الفوهة السفلية فتمثل الهدف المنشود. وتمثّل المساحة التي تفصل بين الفوهتين المراحل التي يمرّ بها العملاء، ويتلخّص عملك هنا في الاعتناء بالتفاصيل الصغيرة التي تساعد على انتقال العملاء من مرحلة إلى أخرى، وهذا يعني أنّ عليك تحسين مرحلة معينة من القمع في كل مرّة ثم قياس نسبة التحويل الحاصلة نتيجة لهذا التحسين. 4- لنبدأ ببناء لوحة التحكم الخاصة بك حان الوقت لتحويل الكلام السابق إلى واقع عملي. إن كنت تمتلك لوحة تحكم خاصة بشركتك الناشئة، فقم بمراجعتها وفق ما سبق، وإن كنت لا تمتلك واحدة، فلنبدأ ببنائها من الصفر. اكتب ما يلي: الإنجاز الكبير القادم الذي يجب عليك تحقيقه، والمقاييس التي تعتقد أنّك بحاجة إليها للوصول إلى هذا الهدف. المقاييس التي تعتقد أنّها ستكون مهمّة بالنسبة إلى المستثمرين في شركتك الناشئة (قد يكون هذا محيّرًا، ولكن يجب أن تتلاءم هذه المقاييس مع ما اخترته في النقطة الأولى). مقياس أساسي واحد يكون هو الموجّه لمشروعك التجاري. ثلاثة مقاييس داعمة تساعدك على توجيه مشروعك التجاري. ناقش هذه النقاط مع فريق العمل في الشركة، هل هم موافقون عليها؟ والآن شاركنا مقاييسك الأساسية، والمقاييس الساندة لها، وإن كنت لا تمانع في ذلك شاركنا لوحة التحكم الخاصّة بك. أخبرنا عن السبب الذي دفعك إلى اختيار المقاييس فيها وكيف تساعدك على توجيه مشروعك التجاري. ترجمة -وبتصرّف- للمقال Intro to startup metrics لصاحبه Alex Iskold.1 نقطة
-
بما أنك لم تذكر الإصدار سأشرح لك على النسخ الانجليزية لسنوات 2013 و2016 من اكسل. اتبع هذه الخطوات لوضع شرط على مجموعة خلايا: حدد الخلايا التي تريد وضع شرط معين لها. انقر على Home > Conditional Formatting > New Rule ثم اضغط على Use a formula to determine which cells to format تحت Format values where this formula is true ادخل الصياغة المطلوبة ثم انقر على Format. استخدم Number وFont وBorder وFill لتعديل بياناتك أو الخلايا ووضع تنسيق لها. أمثلة على الصيغ الشرطية: لإيجاد الخلايات الفارغة (تذكر أن تستبدل B2 بأول خلية تريد أن تستخدمها): =B2="" لإيجاد الخلايا المتشابهة في مجموعة خلايا (سيتم تطبيق التنسيق على العناصر المتشابهة): =COUNTIF($A$1:$D$11,D2)>1 لتجربة شرطين على خلية واحدة (سيتم إرجاع TRUE أو FALSE حسب الإجابة): =AND(A2>A3,A2<A4) لتجربة شرطين على خلية واحدة لكن سيتم إرجاع TRUE إذا كان أحدهما صحيح: =OR(A2>A3,A2<A4) للمزيد من المعلومات: التوثيق الرسمي.1 نقطة
-
بشكل بسيط جداً، لديك شركة أو منتج أو تجارة، وتريدين أن تربحي مالاً بالطبع!. يمكن وصف النموذج الربحي لك حينها كالآتي: من لديه أموالك في جيبه؟ "المستخدم لخدمتك أو المشتري لتجارتك" كيف ستنقلين تلك الأموال إلى جيبك؟ "خطتك لتسويق تجارتك أو منتجك"1 نقطة