لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 04/22/16 في كل الموقع
-
بعد أن تعرّفنا في الدّرس السابق على أساسيات البرمجة كائنية التوجّه، سنُكمل في هذا الجزء ما بدأناه وسنتعلّم بعض المبادئ المتقدّمة حول البرمجة كائنيّة التّوجه. تغيير قيمة متغير الصنف في الدّرس السّابق تعلّمنا كيفيّة تعريف مُتغيّر داخل صنف وكيفيّة الوصول إليه، في هذا الجزء من هذا الدّرس سنتعرّف على كيفيّة استخدام هذه المُتغيّرات بشكل أكثر واقعيّة، لنقل مثلا بأنّنا نمتلك صنفًا باسم Car (سيارة)، ونريد أن ننشئ كائنات من هذا الصّنف، بحيثُ يكون لكل كائن قيم مُختلفة لمُتغيّرات الصّنف، انظر ما يلي: class Car: name = None speed = 0 brand = None def specs(self): print '{} speed is {}Km/h and it\'s brand is {}'.format(self.name, self.speed, self.brand) أنشأنا أعلاه صنفا بسيطا باسم Car مع ثلاثة مُتغيّرات name لاسم السّيارة، speed لسرعة السّيارة و brand لاسم العلامة التّجاريّة، كلمة None تُشير إلى أنّ المُتغيّر مُعرّف لكنّه لا يحمل أية قيمة. بعدها عرّفنا تابعا specs (اختصار لـ specifications) لطباعة مواصفات السّيارة. لننشئ كائنات مُتعدّدة من الصّنف الذّي كتبناه للتو. # Toyota Corolla corolla = Car() corolla.name = 'Toyota Corolla' corolla.speed = 200 corolla.brand = 'Toyota' # Ford Focus focus = Car() focus.name = 'Ford Focus' focus.speed = 220 focus.brand = 'Ford' # Honda Civic civic = Car() civic.name = 'Honda Civic' civic.speed = 210 civic.brand = 'Honda' بعد أن أنشأنا الصّنف والكائنات المندرجة تحت هذا الصّنف، وقمنا بتعيين قيم المُتغيّرات التي تُعتبر مواصفات كلّ سيارة، يُمكننا أخيرا طباعة مواصفات كل سيارة (كائن) وذلك باستدعاء التابع specs. corolla.specs() focus.specs() civic.specs() وكما تتوقّع، المُخرج سيكون كالتّالي: Toyota Corolla speed is 200Km/h and it's brand is Toyota Ford Focus speed is 220Km/h and it's brand is Ford Honda Civic speed is 210Km/h and it's brand is Honda إرجاع الصنف داخل تابع يُمكنك أن تقوم بكتابة تابع داخل صنف، بحيث يقوم التابع بتنفيذ شيفرة ما ثمّ إعادة الصّنف نفسه (ما نُشير إليه بالكلمة self) وبهذا ستتمكّن من استدعاء التابع أكثر من مرّة في سطر واحد، تأمل ما يلي: class Car: def start(self): print 'Starting engine…' return self ما فعلناه في الشّيفرة أعلاه ليس بالشيء الكثير، أولا نقوم بتعريف الصّنف ثمّ بعد ذلك نُعرّف التّابع start المسؤول عن تشغيل السّيارة، وبعدها نطبع جملة تُفيد بأنّ مُحرّك السّيارة قيد التّشغيل، بعد تنفيذ الشيفرة سيُرجع التّابع الصّنف نفسه. ما سيُمكّننا من استدعاء التّابع أكثر من مرّة في سطر واحد كما يلي: corolla = Car() corolla.start().start().start() المُخرج سيكون كالتّالي: Starting engine… Starting engine… Starting engine… كما تُلاحظ لقد نُفّذت الشّيفرة الموجودة داخل التّابع start ثلاث مرّات. قد تتساءل عن أهميّة الأمر، وأتّفق معك في أنّ الأمر يُمكن أن لا يكون مُفيدا. لكنّه يكون مُفيدا إذا أردت أن تقوم بتنفيذ تابعين بشكل تسلسلي، لنقل بأنّ لدينا تابعا آخر باسم move ولنفرض بأنّه سيكون مسؤولا عن تحريك السّيارة، سيكون من الأفضل لو استطعنا أن نستدعي تابع الحركة مُباشرة بعد استدعاء تابع التّشغيل. بحيث يبدو الاستعمال كالتّالي: corolla.start().move() يُمكننا أن نقوم بالأمر ببساطة، وفي الحقيقة لن نحتاج إلا لإضافة التابع move لما كتبناه سابقا. class Car: def start(self): print 'Starting engine…' return self def move(self): print 'The car is moving…' بهذه الطّريقة سنتمكن من تنفيذ الشيفرة دون مشاكل: Car().start().move() المُخرج: Starting engine… Starting engine… The car is moving… لكن لاحظ هذه المرّة بأنّنا لم نُرجع كلمة self في التّابع move ما يعني بأنّنا لن نتمكن من القيام باستدعاء التابع أكثر من مرّة: Car().start().move().move() إذا حاولت أن تُنفّذ الأمر السّابق ستحصل على خطأ كالتّالي: AttributeError: 'NoneType' object has no attribute 'move' وهذا راجع لكوننا لم نُرجع الصنف في آخر التّابع move. الوراثة مفهوم الوراثة في البرمجة كائنيّة التوجه لا يختلف كثيرا عن مفهوم الوراثة في العالم الواقعي، الصّنف الابن يرث جميع المتغيرات والتوابع من الصّنف الأب، يُمكن التّفكير في الأمر على أنّه نسخ. أي أنّ الصّنف الابن مُجرّد نُسخة طبق الأصل من الصّنف الأصلي، الفرق هنا هو أنّك تستطيع أن تُضيف المزيد من الخصائص والتوابع للصّنف الابن. وطريقة إنشاء صنف يرث من صنف آخر هي بوضع الصّنف الأب بين قوسين عند إنشاء الصّنف الابن. انظُر المثال التّالي: class Parent: a = 1 b = 2 class Child(Parent): c = 3 في المثال أعلاه، قُمنا بإنشاء صنف باسم Parent مع مُتغيّرين a و b، وبعدها أنشأنا صنفا Child الذي يرث خصائص الصّنف السابق، وبالتّالي فسنتمكّن من الوصول إلى مُتغيّرات الصّنف Parent من خلال الصّنف Child، ما يعني بأنّ الشيفرة التّالية ستعمل دون مشاكل: child = Child() print child.a print child.b print child.c المُخرج: 1 2 3 كما تُلاحظ فإنّنا قد استطعنا الوصول إلى المتغيّرين a و b رغم أنّهما لم يُعرّفا مُباشرة داخل الصّنف Child. يُمكن أن نجعل صنفا يرث توابع من صنف آخر بنفس الطّريقة: class Person: name = 'Person' def say_hello(self): name = self.name print 'Hello my name is {}'.format(name) class Abdelhadi(Person): name = 'Abdelhadi' استدعاء التّابع say_hello من كائن من الصّنف Abdelhadi. me = Abdelhadi() me.say_hello() المُخرج: Hello my name is Abdelhadi في الشيفرة أعلاه، قُمنا أولا بتعريف صنف "شخص" باسم Person ثمّ عرّفنا المُتغيّر name داخل الصّنف، وأعطيناه قيمة افتراضيّة، بعدها عرّفنا التّابع say_hello ليطبع جُملة التّرحيب. متغيرات الصنف المبنية مسبقا توجد مُتغيّرات مبنية مُسبقا في لغة بايثون، وتُسمى هذه المُتغيّرات بمُتغيّرات الصّنف، وما نعنيه بأنّها مبنية مُسبقا هو أنّك لا تحتاج إلى تعريفها، وتمتاز هذه المُتغيّرات بأنّها مُحاطة بتسطيرين سُفليّين Underscores وإليك بعضا من هذه المُتغيّرات: __doc__ سلسلة توثيق الصنف (Documentation string) وهو ما يُكتب مُباشرة بعد تعريف الصنف، ويحتوي في الغالب معلومات حول وظيفة الصّنف. القيمة الافتراضية لهذا المتغير هي None ألق نظرة على الصّنف التالي: class Person: ''' This class does nothing ''' pass لاحظ بأنّ سلسلة التوثيق مُحاطة بثلاث علامات تنصيص إذا أردنا الوصول إلى هذا التوثيق فكلّ ما علينا فعله هو استخدام الصّفة __doc__: print Person.__doc__ المُخرج: This class does nothing __module__ الوحدة التي عُرّفَ فيها الصّنف، وقيمتها الافتراضية هي'__main__'. print Person.__module__ المخرج: __main__ __dict__ هذا المُتغيّر عبارة عن قاموس يحمل ما سبق كقيم بدئية، كما يحمل أسماء المتغيّرات التي تُنشؤها أنت وقيمها وكذلك أسماء التوابع، لاحظ المثال التالي (نفّذه مُباشرة على مُفسّر بايثون لتُلاحظ النّتيجة): >>> class Math: ... x = 1 ... y = 2 ... def x_plus_y(self): ... return self.x + self.y ... >>> Math.__dict__ {'y': 2, 'x': 1, '__module__': '__main__', '__doc__': None, 'x_plus_y': <function x_plus_y at 0x7f186e76a6e0>} كما تُلاحظ مُخرجات القاموس تحتوي على كل من قيم المُتغيرات الخاصّة بالصّنف سواء التي عرّفناها أو المبنية مُسبقا، لاحظ كذلك العنصر الأخير من القاموس: 'x_plus_y': <function x_plus_y at 0x7f186e76a6e0>} هذا العنصر يحمل مفتاحا باسم التابع x_plus_y الذي عرّفناه، وقيمة هذه المفتاح تُشير إلى أنّه دالة. __name__ اسم الصّنف، يُمكنك تطبيقه على أي صنف للحصول على اسمه، انظر المثال التالي: >>> a = Math >>> a.__name__ 'Math' كما تُلاحظ فقد حصلنا على اسم الصنف Math. الوصول إلى الصنف الخاص بكائن ما المُتغيّرات التي ذكرناها سابقا خاصّة بالصّنف فقط ولا يُمكن الوصول إليها من كائن من هذا الصّنف. تأمّل الصّنف التالي: class Person: name = 'Abdelhadi' لننشئ الآن كائنا من هذا الصّنف: me = Person() يُمكننا الآن الوصول إلى قيمة المُتغيّر name كالتالي: >>> me.name 'Abdelhadi' لكننّا لن نستطيع الوصول إلى مُتغيّرات الصّنف من الكائن، بل من الصّنف فقط: person_class = Person person_class.__name__ # الشيفرة صحيحة person_object = Person() person_object.__name__ # الشيفرة خاطئة لأنّنا نحاول الوصول إلى مُتغيّر غير مُعرّف داخل الكائن ستحصل على خطأ من نوع AttributeError عند تنفيذ السّطر الأخير: AttributeError: Person instance has no attribute '__name__' الحل الأمثل هو أن نصل إلى الصّنف انطلاقا من الكائن، وبعدها سنتمكّن من الوصول إلى مُتغيّرات/صفات الصّنف دون مشاكل، وطريقة الوصول إلى صنف كائن هي بإلحاقه بكلمة __class__، انظر المثال التّالي (سنعتمد على الصنف الذي أنشأناه أعلاه): person_object = Person() person_object_class = person_object.__class__ # إسناد صنف الكائن لمتغيّر print person_object_class.__name__ # اسم الصّنف print person_object_class.__dict__ # قاموس يحتوي على بيانات الصّنف بدأنا بإنشاء كائن person_object ثمّ استخدام جُملة __class__ للوصول إلى الصّنف. المُخرج: Person {'__module__': '__main__', 'name': 'Abdelhadi', '__doc__': None} يُمكنك كذلك القيام بالأمر داخل تابع في الصّنف: class Person: def say_hello(self): print 'Hi I am a {}'.format(self.__class__.__name__) person_obj = Person() person_obj.say_hello() لاحظ استخدام self.__class__.__name__ للوصول إلى اسم الصّنف في التّابع say_hello. المُخرج: Hi I am a Person التوابع الخاصة يُمكن استخدام بعض التّوابع الخاصّة لتنفيذ شيفرة عند القيام بإجراء معيّن، وإليك قائمة بأهم هذه التّوابع (لاحظ بأنّها مُحاطة بتسطيرين سُفليّين Underscores). التابع init: تُنفَّذُ الشيفرة التي بداخله عند إنشاء كائن من الصّنف، ويُسمّى أيضا بتابع البناء Contractor . التابع del: تُنفّذ شيفرته عند حذف كائن أو عند استدعاء دالة الخروج exit. التابع repr: تُنفّذ الشيفرة عند استدعاء الكائن، ويُستخدم هذا التابع لإرجاع معلومات حول الكائن في الوضع التّفاعلي (من مُفسّر لغة بايثون مُباشرة) مثال: # استدعاء __init__ person_obj = Person() # استدعاء __repr__ person_obj repr(person_obj) # حذف الكائن واستدعاء __del__ del(person_obj) التابع init هذا مثال بسيط على إنشاء واستدعاء هذا التّابع: class Person: def __init__(self): print 'A new object was created' me = Person() مُخرج البرنامج سيكون جُملة تُفيد بأنّ كائنا قد أنشئ، لاحظ أنّ الجملة A new object was created قد طُبعت رغم عدم استدعاء التّابع init بشكل صريح، ويُمكن الحصول على نفس المُخرج باستدعاء التّابع كالتّالي: me.__init__() حسنا تعلّمنا الآن بأنّنا نستطيع تنفيذ الشيفرة الموجودة بداخل التّابع __init__ بمُجرّد إنشاء كائن من الصّنف، ولكن ماذا عن المُعاملات؟ يُمكن تمرير المُعاملات للتّابع __init__ عند إنشاء صنف كالتّالي: me = Person('Abdelhadi') وفي التّابع سيكون الأمر كالتّالي: def __init__(self, name): name = self.name print 'Hello My name is {}'.format(name) الشيفرة الكاملة: class Person: def __init__(self, name): self.name = name print 'Hello My name is {}'.format(name) me = Person('Abdelhadi') المُخرج: Hello My name is Abdelhadi التابع repr يُستعمل هذا التّابع لإرجاع معلومات قابلة للطّباعة، ويُستخدم كثيرا في الوضع التّفاعلي (مُفسّر بايثون)، ويجب أن تكون القيمة المُرجعَةُ عبارة عن سلسلة نصيّة. وإليك مثالا لكيفيّة استخدامه: class Math: x = 1 y = 2 def __repr__(self): x = self.x y = self.y return 'x: {}, y: {}'.format(x, y) x_y = Math() print x_y المُخرج: x: 1, y: 2 يُمكننا الاستفادة من هذا التّابع للوصول إلى اسم الصنف عند الوراثة: # تعريف الصّنف الرّئيسي class Person: def __repr__(self): return 'Hi I am a {}'.format(self.__class__.__name__) # الوراثة class Writer(Person): pass class Student(Person): pass # إنشاء الكائنات omar = Student() abdelhadi = Writer() # طباعة قيّم التّابع repr print omar print abdelhadi المُخرج: Hi I am a Student Hi I am a Writer لاحظ بأنّ الصّنفين Writer و Student لا يحتويان على أية شيفرة، ومع ذلك فقد نُفّذ التّابع repr واستجاب بطريقة مُختلفة مع كلّ كائن. التابع del تُنَفّذُ الشّيفرة الموجودة بداخل هذا التّابع عند حذف كائن باستعمال الدّالة del وهي دالة تُستعمل لإنجاز ما يُسمى بعمليّة جمع القُمامة Garbage Collecting والهدف الرئيسي من هذه العمليّة هو تحرير الذاكرة، ولحذف كائن يكفي أن تقوم باستدعاء الدّالة del مع تمرير الكائن كمُعامل: class Math: x = 1 y = 2 numbers = Math() numbers.x # ==> 1 numbers.y # ==> 2 # حذف الكائن del(numbers) # خطأ numbers.x # ==> NameError: name 'numbers' is not defined بعد أن حذفنا الكائن numbers لم يعد بإمكاننا الوصول إلى قيمة المُتغيّر x، وأسفر الأمر عن خطأ من نوع NameError. يُستدعى التابع del مُباشرة بعد حذف الكائن، ما يعني بأنّنا نستطيع أن نطبع جملة تُفيد بأنّ الكائن قد حُذف: class Math: x = 1 y = 2 def __del__(self): print 'Object deleted!' numbers = Math() numbers.x # ==> 1 del(numbers) المُخرج: Object deleted! تُنفَّذ شيفرة __del__ كذلك عند استدعاء الدالة exit للخروج من البرنامج: class Math: x = 1 y = 2 def exit_program(self): exit() def __del__(self): print 'Object deleted!' numbers = Math() numbers.exit_program() مُخرَج البرنامج أعلاه سيكون نفس الشيء رغم عدم حذف الكائن. والسبب راجع لاستخدام الدّالة exit داخل التّابع exit_program. تمارين تمرين 1 عد إلى الدّروس السّابقة وحاول تحويل برنامج تسجيل الدّخول إلى برنامج سهل القراءة والاستخدام باستعمال البرمجة كائنية التوجه، فمثلا يُمكن أن يستعمل من قبل مُبرمجين آخرين بالطّريقة التّالية: user = User() user.signup('username', 'password', 'password_confirmation') user.login('username', 'password') user.say_hello() user.logout() تمرين 2 أنشئ برنامجا يطبع جميع التوابع والمُتغيّرات الموجودة داخل الصّنف الذي أنشأته كحل للتّمرين الأول.1 نقطة
-
سمعت مرارًا وتكرارًا من الأشخاص المتسائلين عن العمل الحر أن العمل المستقل يبدو أقرب للتنزه في حديقة منه للعمل الفعلي. دعني أبدد هذا الوهم؛ وأعود بأحلام الثراء لديك خلفًا إلى الواقع، ولنتكلم عن أشهر تسع خرافات يكثر الحديث عنها مُتعلّقة بالعمل الحر: الخرافة الأولى: يمكنك العمل من المنزل بملابس نومك الحقيقة: السبب الوحيد الذي يمكن أن يدفعك للعمل من المنزل بملابس نومك هو كونك مشغولًا لدرجة عدم توافر الوقت لارتداء ملابسك لأربعة أيام متواصلة. تخيّل -إضافة إلى ذلك- زيارة مفاجئة من أمك، لتدرك حينها أنّك لم تنظّف الأطباق -أو حتى لم تستحم- خلال أربعة أيام. الخرافة الثانية: يجني المستقلون أموالا طائلة من العمل الحر الحقيقة: دع عنك أحلام شراء ذاك اليخت لدقائق! بالتأكيد يمكن للمستقلين جني مبالغ محترمة من المال عبر العمل الحر، لكن ذلك يتطلب نفقات يجدر بهم تغطيتها أيضًا؛ مثل شراء أجهزة إلكترونية من قبيل MacBooks ،iMacs ،iPhones، ساعاتApple (إن كان المُستقل مثلًا مُختصّا في برمجة تطبيقات لأجهزة Apple)، وحتى المنتجات التي لا علاقة لها بشركة Apple كالبرمجيات، المكتب والكرسي، خط الاتصال بالإنترنت، استضافة الموقع الإلكتروني، القوائم البريدية.. إلخ. عليك أيضًا أن تفكر بنفقات التأمين، الادخار، والاستثمار، بالإضافة للضرائب بالتأكيد. الخرافة الثالثة: لا رؤساء عمل يعني لا وجود للضغط الحقيقة: ماذا عن العملاء الذين يرسلون لك المال مقابل إنجاز المهام؟ حسنًا؛ هؤلاء هم رؤساء العمل لدى المستقلين؛ وعوضًا عن وجود رئيس عمل واحد أنت هنا أمام عدد كبير من الرؤساء؛ كل منهم يريد وقتك؛ اهتمامك؛ وأن تردّ على رسائلهم الـ14 دفعة واحدة في الوقت عينه، وعلى الرغم من كونك رئيس نفسك في العمل الحر؛ فأنت مضطر للإجابة على رسائل العديد من الأشخاص. الخرافة الرابعة: لديك الآن وقت فراغ كبير جدا الحقيقة: بالتأكيد؛ يمكنك عمليًا التفرغ من العمل يوم الثلاثاء مثلًا لتقضيه مع الأصدقاء أو في مشاهدة التلفاز، لكن الواقع يقول أن الوقت الذي تمضيه كمستقل دون عمل يعني عدم حصولك على المال، وهو السبب الذي يدفع معظم المستقلين للعمل ما يزيد عن 40 ساعة أسبوعيا لتفادي العمل المكتبي لمدة 40 ساعة في مكان آخر. الخرافة الخامسة: العمل الحر ممتع جدا لدرجة لا يعتبر فيها عملا الحقيقة: لا يزال العمل الحر يعني الكثير والكثير من بذل الجهد؛ وبشكل خاص في البدايات، إذ عليك أن تعمل بأقصى طاقتك لأنك لست مسؤولًا عن إنجاز العمل فحسب؛ أنت مسؤول أيضًا عن إيجاده، وهو الأمر الذي يستلزم الكثير -وأحيانًا الكثير جدًا- من الوقت. الخرافة السادسة: لا مزيد من بيروقراطية الشركات الحقيقة: كل الأعمال الإدارية التي توزّع على الموظفين في الشركات منوطة بك وحدك في العمل الحر؛ عليك أن تقوم بها كلها: كشوف الأجور، المحاسبة، الأمور القانونية، المبيعات، التسويق، إدارة المشاريع، كل شيء بالإضافة إلى العمل الذي تعاقدت مع الزبون لإنجازه. الخرافة السابعة: يمكنك الآن أن تعمل وحيدا كما تمنيت دوما الحقيقة: قد يميل المنعزلون والانطوائيون للعمل المستقل؛ مع أحلام العمل بانفراد من المنزل والاستماع لموسيقاهم المفضلة؛ دون الحاجة للحديث مع أحد، لكن لسوء الحظ فإن العملاء يفضلون التواصل مع المستقل، بالإضافة إلى حاجتك للتواصل المستمر والمتكرر معهم لبناء وعي حول العلامة التجارية التي تعمل لأجلها، لا يمكنك أن تنعزل وحيدًا في برجك وترى الأعمال تأتي إليك؛ هذه خرافة! الخرافة الثامنة: العمل الحر ممتاز للأشخاص الذين لا يمكنهم الحفاظ على نفس الوظيفة لفترة طويلة الحقيقة: قد ينجذب العديد من الناس للعمل الحر لأنهم لا يرغبون بالعمل مع أشخاص متسلطين، لكن عليك أن تعلم أنه إن كنت تعاني من مشاكل عديدة لدرجة عدم تمكنك من الاستمرار في وظيفة؛ فقد تواجهك نفس المشاكل أيضًا بموضوع العمل من المنزل لحسابك الخاص، حيث لن يكون ثمة رقيب يتأكد من إتمامك لمهامك، عوضًا عن ذلك سيكون هناك عملاء غاضبون يرفضون الدفع لك لتأخرك عن موعد التسليم النهائي. الخرافة التاسعة: كل ما تحتاجه هو موقع إلكتروني الحقيقة: يفكر العديد من المستقلين الجدد أن معارض أعمالهم المنشورة على مواقعهم هي آلات لطباعة المال، كل ما عليك فعله هو إنشاء موقع ورفع أعمالك عليه، وشاهد كيف ستنهمر الأموال عليك كالمطر، هذا التفكير بعيد كل البعد عن الحقيقة -ما دام موقعك لا يظهر على مُحركات البحث لمن يبحث عنه من أشخاص يؤمنون بعملك الذي تعرضه ويتفهمون القيمة المضافة من قبلك- وما دام الأمر ليس كذلك فسيبقى موقعك دون زوار؛ ولن يكون صديقًا لمحركات البحث. خلاصة لا أحاول التّقليل من أهميّة العمل الحر ولا أحاول أن أنفّرك منك، حيث يمكن أن يؤدي عملك المستقل إلى نتائج رائعة، بل وأن يكون أفضل خيار اتخذته في حياتك، لكن يجب عليك أن تقوم بالأمر بطريقة صحيحة (وأعني بذلك بذل جهد هائل للنجاح فيه). يمكنك البحث على الشبكة عن مستقلين أبدعوا في العمل الحر لتتعلم المزيد حول النجاح في هذا المضمار. والآن دعوني أتابع كتابة المزيد من المقالات بملابس نومي؛ متناولًا مشروبي المُفضّل على يختي الخاص ترجم بتصرّف عن مقال Nine 9 Freelancing Myths, EXPOSED لكاتبه: PAUL JARVIS.1 نقطة
-
والآن وأنا في السّنة العاشرة من عملي الحر كمصمّمة مع رُوّاد الأعمال والمسوّقين، أجد مراجعة سنواتي المهنيّة ممتعة ومخيفة في آن واحد فقد عشت خلالها النّجاح العظيم والفشل الذريع. والنصائح التي أقولها هنا هي خلاصة تجارب شخص لم يفشل مرة أو مرتين بل العديد من المرات، وللمفارقة فإن هذا الفشل هو ما أكسبني خبراتٍ عظيمة . وأملي أن أُجّنبك القليل من الأخطاء التي ارتكبتها بدوري، وأن تَتحقّق بدورك من صحة القرارات التي اتخذتها خلال عملك الحر. حاول أن تتعامل مع الأسئلة التالية كاختبار لك، هل أنت مستقل مبتدئ كثير الأخطاء؟ اكتشف ذلك بنفسك. هل تثق بانطباعاتك ؟ إذا انتابك إحساس غير طبيعي عند لقائك لعميل ما، اتركه. لا أجد مفردات أكثر للتعبير عن الفكرة إنه فقط الشعور الذي يستولي عليك عندما تقابل شخصًا ما لأول مرة، تسمع قصّته وماذا يريد أن يقوم به. جميعنا ينتابنا شعور ما في حالات مشابهة؛ وهذه حقيقة لابد من مواجهتها: الحدس أداة مهمّة لاتخاذ القرارات في مجال الأعمال. ربما نجَم نفورك من العمل نفسه من كونه غير مناسب لمهاراتك أو ربما بسبب شخصية العميل. وبواقع التّجربة، في كل مرة انتابني شعور سيء تجاه مشروع أو عميل ما ولم أصدق حدسي كان نصيبي الفشل فيه (رغم ما أتعلّمه بسبب ذلك) هل أنت صادق مع نفسك ومع مواهبك؟ لقد كنت الأسوأ على الإطلاق في هذا الموضوع لطالما أردت أن أكون كل شيء للعملاء مصمّمة ومديرة أعمال ،الحقيقة أنني لست رسّامة ولست خريجة جامعات عريقة. وبالنسبة لي فأنا أحتاج إلى مستوى معين من غير الرسمية في علاقتي مع العملاء والشفافية التامة فيما يتعلق بموهبتي كمصمّمة.أظهر كل ما تحتاجه لتكون الشّخص الذي أنت عليه، لا تخف، دع شخصيتك تظهر بشكلها الطبيعي عندما تتعامل مع العملاء، إنها لمستك الشخصية "علامتك التجارية" التي ستجعلهم يصفونك دومًا بأنّك "غير تقليدي”. هل تحتفظ بنسخة احتياطية من بياناتك؟ رعب فقدان البيانات وملفات العمل الثّمينة يشبه الرعب الناجم عن مشاهدة ثلاثة أفلام رعب في آن واحد أشعر بالإحراج عندما أعترف بأني خضت هذه التجربة مرتين. وهو مُحرج حقًا لأنه من السهل جدًّا حفظ نسخة احتياطية من البيانات، ولكن مشكلتي أني لا أفكر بالأمور التّقنية والشبكات..الخ كجزء من عملي مثل العديد من المصمّمين إلى أن ينفجر شيء ما في وجهي وأجد نفسي بعدها مستلقية على الأرض أبكي في مشهد مريع للغاية. حقيقةً عندما تعمل لصالحك الشخصي فإن حفظ نسخة عن بياناتك هو مسؤوليتك أنت وواجبك تجاه نفسك وعملائك، وهي عملية بسيطة وسهلة عليك أن تجعلها أولوية أثناء عملك. إليك بعض الخدمات التي استخدمتها أو بحثت عنها والتي تساعدك في ذلك: Dropbox: هو خطّتي القادمة لحفظ البيانات الخاصة بعملي، فقد دعوت بعض الأصدقاء لتجربة هذا التطبيق وحصلت نتيجةً لذلك على مساحة تخزين مجانية تقارب 20 غيغا بايت وهو تطبيق موثوق وفعّال. Google Drive: هو خيار غير مكلف تقريباً 4.99$من أجل 100غيغا بايت من السعة التخزينية.لقد استخدمت هذه الخدمة وكنت مسرورة بها ولكني وجدت عملية المزامنة فيها أبطأ مُقارنة بـDropbox. CrashPlan أو Carbonite: قمت مؤخرًا بالبحث عن خيارات التخزين لكميات كبيرة من البيانات مايقارب 4TB. Dropbox هو تطبيق ممتاز للمشاريع الحالية والبيانات التي أريد الوصول إليها من قواعد اعتيادية، ولكن مازال لدّي تيرابايتات من بيانات العملاء السابقين والتي لا أثق بقدرتي على الوصول إليها عبر أقراص التخزين الصلبة القديمة والعديدة التي أملكها هنا وهناك. وسعر 4$ من أجل كمية غير محدودة من البيانات هو حقًّا سعر لا يُضاهى، توفر Crashplan أيضًا خدمة النسخ الاحتياطي المنظّم، حيث عليك فقط أن ترسل لهم أقراص التخزين الصلبة التي تحتوي البيانات وسيقومون بنسخها وبذلك لن تحتاج لقضاء أسابيع في رفعها على الشبكة، وهو بلا شك خيار جيّد إذا كنت تبحث عن مكان لحجوم كبيرة من البيانات. هل تعمل مع عميلك المثالي؟ عندما بدأت عملي كمصمّمة مسّتقلة كنت متحمّسة للعمل مع أي شخص، عندما تكون جديدا في الموقع من السّهل أن تفكر بهذه الطريقة فأنت بحاجة إلى عمل وإلى مدخول مالي و تُبرّر ذلك بحاجتك إلى الخبرة وأنك لا تستطيع أن تكون انتقائيًا من البداية، بالطبع أنا أفهم هذا التفكير ولكن كلما أسرعت في تحديد نمط العملاء والعمل الذي يحفّزك ويجعلك متحمّسا للاستيقاظ في الصّباح للعمل كلما كان ذلك أفضل. بالطبع علينا جميعاً أن نتعلم العمل مع جميع أنماط الناس، لكن إذا لم تُكوّن نوعًا من الصّداقة مع العميل قبل توقيع العقد أو استلام المشروع فلربما هذا العميل ليس من نوعية العملاء المثالية بالنّسبة لك. ولكن بطبيعة الحال عقود العمل الحر تطبق غالباً على مشاريع لمرة واحدة فقط فإنّ هناك احتمال كبير أن لا يتوفّر لك الكثير من الوقت لبناء وتطوير هذه العلاقة / الصّداقة مع العميل. ونادرًا ما ستمتلك وقتًا كافيًا لتعرف المزيد حول العميل وبناء علاقة صداقة معه إلّا في حال وَقّعت عقدًا طويل الأمد، أمّا في المشاريع القصيرة المدى سيكون عظيما جدًّا إذا استطعت اختيار عملاء بإمكانك العمل معهم بدون خلاف ناجم عن صراع العلاقات الذي يظهر في البداية. لقد اكتشفت هذا بعد أن خسرت بعض العملاء وبعدها عرفت مالذي أبحث عنه في العميل، ربما ستحتاج أن تمر بهذه العملية لتتمكن من تحديد عميلك الأمثل. هل لديك ميزانية محددة لنشاطك كعامل مستقل؟ عندما تنطلق في عملك كمبتدئ في مجال العمل الحر تكون لديك رغبة ملّحة لتأمين كل ما تحتاجه من أجل العمل كمستقل بكفاءة – على الأقل هذا ما حدث معي– حيث اشتريت الكثير من العتاد (حاسوب، شاشة خارجية، فأرة مُتطّورة، لوحة مفاتيح مُتقّدمة جدًا...) حيث أنني مهووسة بالتّقنية وأحب مثل هذه الأشياء. لكن بعد أن تختفي مشاعر الفرحة بكل هذا العتاد الجديد، ستجد بأنّك قد اشتريت أمورًا كثيرة ربما لست بحاجة لها الآن أو أنه بإمكانك تنفيذ عملك على أكمل وجه من دونها. الأدهى والأمر هو لما تقترض لشرائها. لذلك قرّر ماهو الحد الأدنى الذي تحتاجه لسير نشاطك بسهولة واكتب قائمة بالأشياء التي تتمنى شرائها في المستقبل وستكون محفّزًا رائعًا لك خلال عملك. هل تسوق لنفسك كمجموعة وليس كفرد؟ إذا كنت تعمل لوحدك تأكد أن عملاءك يعلمون ذلك، من الجيّد أن تدير عملك الحر تحت اسم مجموعة ولكن قد يسبب هذا إرباكًا للعملاء، ويعتقدوا أنه لديك موظّفين يعملون بأدوار مختلفة في المشاريع، برأيي يجب أن تكون واضحًا وشفّافًا حول من تكون، ماذا تفعل وما لا يُمكنك القيام به. ماذا يحصل عندما لا تكون صريحاً حول استخدام متعاقد خارجي لأداء جزء من العمل ؟ المشكلة الأصغر مع عمل هؤلاء المتعاقدين هي على صعيد المسؤولية، إذا كان المتعاقد الخارجي يؤدي عمله بشكل مثالي دائمًا فهذا جيّد، أما إذا لم يكن؛ فتوجيهاتي لك إذا كنت لا تستطيع القيام لوحدك بالمشروع كاملًا، هو أن تُعطي العميل الخيار بتوظيف مستقل آخر لأداء هذا الجزء من العمل. وهذا يعود بنا إلى فكرة اختيار العميل المثالي، إذا كان العميل يبحث عن مستقل واحد لأداء كامل المشروع فربما لا يكون العميل الأمثل لك. هل وقعت عقدا قبل البدء بالعمل؟ لا يهم مهما كان حجم المشروع كبيرًا أم صغيرًا فالعقد بيان العمل وقائمة التسليم هي أمور ضروريّة جدًا قبل البدء بأي مشروع وإلا كيف ستتفق مع عميلك عن التّوقعات و شروط الدفع؟ أتذكر أنني كنت متوترة دومًا حول الطلب من العميل أن يُوقّع عقد عمل قبل البدء به والآن أدرك تماماً أن توتري ذلك كان ناجما عن خوفي من خسارة العمل في حال طلبت ذلك والآن أعلم أن العميل الذي يرفض توقيع العقد في البداية هو ليس العميل الأفضل لي. هل أضفت قيمة حقيقية لعميلك؟ ربما فعلت ولكنك لست متأكدًا ماهي القيمة التي أضفتها، اسأل عملاءك الحاليين والسّابقين غالبًا سوف يُوضّحون لك السبب الذي من أجله يعملون معك مرة تلو الأخرى أفضل مما ستعرف أنت. هل تريد طريقة واحدة تتغلب فيها على منافسيك؟ طريقة تنجح فيها كل مرة لأن لا أحد يفعلها ؟وفّر خدمة عملاء لا نظير لها. فكّر فيها قليلاً؛ نحن نعيش في عالم لا تُقَدّم فيه خدمات للزّبون الذي يتوق بدوره لاهتمام من بائعيه، لذلك إذا أردت أن تتميّز وتصنع قيمة مضافة لعملك حدّد ماهي خدمة العملاء الأفضل التي يحتاجها زبونك وقم بذلك. هل تتقاضى الكثير أو أقل من القدر الكافي؟ إذا كنت تتقاضى القليل جدًا مقارنة بعملك فهذا مأزق بلا شك أما إذا كنت تتقاضى أكثر مما يحدّده السوق لموهبتك فهذه مشكلة أيضًا، كنت أبحث عن مُصمم مستقل لتنفيذ بعض المهام منذ أشهر، وتواصلت مع مُصمّم تخرّج من مدرسة التصميم منذ أقل من سنة ومعرض أعماله شبه فارغ، وحدّد تسعيرًا ساعيًا سيكون مناسبًا لو كان معرض أعماله تحتوي أعمالًا بجودة ذلك السعر ولكن الأعمال التي شاهدتها لم تكن بجودة نصف هذا السّعر. الحل أن تنظر إلى ما يتقاضاه أقرانك وأقصد بالأقران الأشخاص الذين لديهم أعمال بجودة مقاربة لجودة عملك. هل لديهم مشاريع يعملون عليها بشكل متواصل وتضمن لهم دخلاً ثابتًا؟ إن كان الأمر كذلك فهذا يعني بأن الأسعار التي يطلبونها متوافقة مع جودة الأعمال التي يُقدّمونها. بالتالي بإمكانك أن تبدأ من هذا السعر. هل تنظم وقتك بشكل جيد؟ بعد أن تحدّد أفضل أوقات العمل بالنسبة لك اصنع جدولًا والتزم فيه، لا يهم إن كانت إنتاجيتك أعلى في المساء أو الصباح الباكر فصنع روتين خاص بيوم عملك هو طريقة تساعدك في قياس إنتاجيتك وإدارة تواصلك مع العملاء. بالنسبة لي فإن وقت العمل الأفضل يكون في الصباح، أما بعد العشاء فأعمل على تلك المهام التي لا تحتاج إلى ذكاء إبداعي وهذا يتغير أحياناً خلال السنة وأعدل برنامجي تبعًا له. لا تدري كيف تنظّم وقتك؟ شاهد هذه الفيديو والتي يشرح فيها صاحبها كيف يستخدم الورقة والقلم لتحديد قائمة مهامه: ماهي أخطاؤك كمستقل مبتدئ؟ لست أنا الوحيدة التي أملك قصصاً رهيبة عن العمل الحر أليس كذلك؟ شاركنا بتجاربك، ما الأخطاء التي ترتكبها وما النّصائح التي ترغب في تقديمها لغيرك من المُتسقلّين؟ ترجمة -وبتصرّف- للمقال:Top 10 Mistakes Made by New Freelancers لصاحبته: Jen Gordon.1 نقطة