٣ مارس ٢٠٢٠

10 نصايح لل Problem Solving

By null

ال problem solving مهارة مطلوبة جداً في شغلنا و في حياتنا عامة, بس في ناس كتير بتعاني بسبب انهم مش عارفين ايه الصح و ايه الغلط في اللي بيعملوه, في المقالة دي هتكلم باختصار عن 10 نقط ساعدوني شخصياً. النصائح دي ممكن حد ميتقبلهاش او متنفعش ليه, ده عادي و عقولنا مختلفة. مش لازم كله يشتغل. لو انت مستواك حلو بالفعل في الموضوع هتلاحظ ان معظم المقالة دي بديهيات.

#1 متحاولش تحل المشكلة كلها مره واحدة

انت جامد و حبيت تبقى اجمد فا دخلت على موقع جامد زي HackerRank او LeetCode و فتحت problem. هوبا لقيت مخك وقف و مش عارف تبدأ منين, فاهم المطلوب, بس مش عارف تبدأ. الحل بسيط و ف ايدك, قسم المشكلة لمشاكل اصغر, يعني لو مطلوب منك algorithm بتمر بكذا مرحلة, قسم المشكلة للكذا مرحلة دول و اشتغل على واحدة واحدة, اول ما تخلص الاولى خش ف التانية و هكذا. متمسكش المشكلة حتة واحدة الا لو عايز تشوف الصورة كاملة, زي مثلاً input ايه هيطلع output ايه و هكذا.

#2 متفكرش بلغة البرمجة, فكر ب logic

متفكرش بلغة البرمجة اللي بتحبها, غالباً لما تعمل كده انت بتحط على نفسك limit من قبل ما تبدأ اصلاً. فكر في المشكلة كأنك كمبيوتر بالظبط, تحل المشكلة اللي قدامك. بعد كده ابدأ ترجم الكلام اللي ف مخك ده للكونسبتس اللي موجودة ف اللغة اللي انت هتحل بيها. لو طورت المهارة دي هتوصل لمرحلة انك بتربط بين اللغة و التفكير و ده هيخليك تعمل المرحلتين ف نفس الوقت, يعني تفكيرك هيبقى منظم اكتر و اسرع.

#3 حل بأكتر من طريقة

مترميش و تجري, احنا مش ف سباق. وده من ضمن الاسباب اللي بتخليني ابعد عن المواقع اللي فيها leaderboards او score. لإن ف اغلب الاوقات ال "rank" او ال مستوى اللي انت فيه بيعلى كل اما تحل مشاكل اكتر, و ده مش بالضرورة صح. اتحدى نفسك و حل بأكتر من طريقة. ابدأ بأبسط و أهبل طريقة و اللي هيبقى كلها bugs و حسنها لحد ما توصل ف الاخر لأمثل حل تقدر عليه. افضل فكر في الطريقة اللي انت ماشي فيها دي لحد ما توصل لنتيجة او conclusion عامة, سواء الطريقة دي هتحل المشكلة او لا, بعد كده فكر بطريقة تانية.

#4 متعملش Premature Optimisation

Premature optimisation هو انك تحاول تحسن من حلك (من حيث الأداء) قبل ما توصل foundation اصلاً, اللي هو حل ابتدائي و غالباً بيبقى ابطأ حل. يعني متكونش لسه بتعمل ف الفنكشن و تقولي هحسنها. انت كده معاكش حاجة تقارن بيها اصلاً عشان تقولي هحسن. الا لو بنتكلم على ال complexity و دي ساعتها برضه تعملها بعد ما تفكر ف الفنكشن تماماً. يعني متجيش و انت بتفكر ف الفنكشن تقولي "ده هيبقى بطئ لا سيبك", لا, اوصل للحل البطئ و قولي "في بقى حاجة احسن من ده نقدر نعملها". مع الوقت مخك هيلاحظ ويتعود امتى يفكر ف ال optimisation و امتى يفكر في الوصول لحل و ازاي يربط بينهم.

القاعدة دي مع الوقت هتختفي ف مخك, و هتلاقي نفسك بتعمل Optimisation لأفكارك نفسها, او حتى هتلاقي نفسك من الاول خالص بتفكر في اسرع حل ممكن, ده طبيعي و ده مخنا البشري, لما تلاحظ ده وحد تاني شغال معاك حاول انك تطبق القاعدة.

#5 ارسم

امسك ورقة و قلم رصاص, او جاف (بس انا بفضل الرصاص و ده اكتر حاجة نفعت معايا), و ابدأ حل على الورق. ارسم شكل الـ array و شوف العناصر في المشكلة دي هتمشي ازاي, شوف هتوصل للنتيجة ازاي, اقلب compiler ورق في نفسك كده. الموضوع ممتع والواحد بيشخبط على ورق كده, و بيحسسك انك بتعمل حاجة فعلاً بدل ما تبقى قاعد بتفكر قدام الشاشة و خلاص. ده غير ان ده هيسمحلك تطبق القواعد اللي فاتت اكتر, لإن ساعتها انت مش بتكتب كود, انت بتكتب logic على ورق.

الرسم و الكتابة على الورق هيسمحلك تفكر بشكل visual, و ده هيخلي مخك يتعامل بشكل احسن مع المشكلة لأسباب كتير.

بعد ما توصل حل انت مبسوط بيه تبدأ تنقل الحل ده للكود, و ده هيساعدك تنظم تفكيرك و حتى هتقدر تشوف انت بتفكر ازاي. انا عن نفسي لما حد بيشوف ورقي مش بيفهم منه حاجة لإن مخي ماشي بمنطق سميته Order from Chaos, و هي اني بفكر في حلول كتير جداً, وكل حل بيبقى متقسم لمراحل كل مرحلة بحد ذاتها ليها بدائل كتيره, و ده بيسمحلي اني اشوف احتمالات كتير جداً, حتى لو هاخد وقت اكتر من غيري.

#6 سجل تفكيرك

انا قولت اكتب و ارسم, بس سجل؟ ده هبل ده بقى! ثواني بس, كام مره وانت بتحل حاجة جيت بعد ما حليتها قولت انا ليه فكرت ف ده كده؟ او ليه معملتش بالطريقة كذا, وهكذا. كام مره؟ انا عن نفسي, كتير. تسجيل طريقة تفكيرك مش شرط يبقى فيديو ولا صوت ولا صورة ولا اي حاجة, المهم انك تحتفظ باللي بترسمه و تكتبه, و تعمل ده بنظام. انا عن نفسي عامل كشكول خاص بال problem solving, لما بحل حاجة بفتح صفحة جديدة و ابدأ انظم الصفحة بطريقة تتناسق مع تفيكيري. دي بقى مفيهاش one size fits all خالص.

#7 متحطش حدود لنفسك

يعني ايه؟ يعني متحطش حدود لنفسك. متقولش لازم ال algorithm تخلص في 5ms, ولا لازم تاخد رام قد ايه. مجرد ما تحط ليميت زي دول على تفكيرك انت هتبطأ نفسك, و هتخلي مخك يعاني انه مزنوق في صندوق مش عارف يخرج منه. اوصل للحلول كلها الاول اللي تقدر تفكر فيها, بعد كده شوف انهي احسن واحد فيهم مقارنة بال limit دي. و لو مفيش, شوف ايه اقرب حل انت طلعت بيه و اعمله optimisation.

#8 متيأسش

ايوة في حاجات مش هتعرف تحلها, ايوة في حاجات هتحسها مستحيلة و تلاقي غيرك حاللها بكل سهولة, ايوة هتلاقي ناس بتكسب مسابقات و بتاخد جوايز وانت لسه بتقول يا هادي. كل ده طبيعي, و موجود في كل حته و في كل مكان. في الرياضة هتلاقي لعيب حلو و لعيب مبتدئ, في الالعاب هتلاقي كاراكتر حلو و عنده شوية skills يفجر بيها نجوم و كاراكترز مبتعرفش تهش دبان حتى.

الفرق بقى بينك و بينهم هو الاستسلام. لو استسلمت هتفضل مكانك مش هتتحرك و يفوتك القطر. بس لو اتحديث نفسك, و جرب مره و اتنين و تلاته و ميه هتلاقي انك زيك زيهم, و يمكن احسن منهم. ساعتها هتحس بتعبك و مجهودك. اوعى تستسلم لل safe zone و اوعى تركع لليأس.

#9 حب ال bugs و ال debugger

ايه ده ايه ده, احنا هنهزر ولا ايه؟ يعني ايه احب ال bugs؟ ناقص كمان اقولكوا حبوا ال errors و بوظوا البرامج قصد بقى! :"D تعالوا نشوف قصة صغيرة. تخيلوا ديفلوبر حليوة كده قاعد بيقزقز لب و بيفكر ف مشكلة, بعد ما رسم ع الحيطان عشان الورق خلص و بعد ما قلب Van Gogh على السقف طلعله infinite loop خلت الجهاز يفرقع ف وشه, سب اليوم اللي فتح فيه المشكلة و رمى الجهاز و نط م الشباك.

جاره بقى يصدف انه تنين مجنح و قاعد يشوي جموسة مدبوحة على نار هادية. وصل لنفس النقطة بس بدل ما يرمي الجهاز و ينط م الشباك, قام فاتح ال debugger و لقى ان الايرور كان ف سطر الكوندشن فيه غلط, صلح الكوندشن, و هوبا الكود اشتغل و راح بعد كده يتفرج على جمبول.

العبرة من الكلام ده ايه؟ مش عارف بس انا كنت بحاول اقول يعني ان الايرور حبيبك و ال debugger اقرب صديق لقلبك و عمره ما هيكدب عليك. حد يكره لما حد يقوله الايرور فين ف الكود بتاعه كده؟ و يا سلام لو بتستعمل حاجة advanced تلاقيه بيصلحلك الايرور بنفسه. حد يكره ده؟ حرام والله :"D. اتعلموا ازاي تستعملوا ال debugger, و اتعاملوا مع ال errors بهدوء و اهتمام. صدقوني هتفرق كتير.

#10 اطلب مساعدة!

احنا بشر. مستحيل نعرف كل حاجة و مستحيل نقدر على كل حاجة لوحدنا. بس لو اجتمعنا, نعمل العجب. (زي اننا نخربها ف الكلية ب FIFA مثلاً) لو في مشكلة واقفة معاك, اطلب مساعدة من حد تعرفه. مش شرط يكون صاحبك, و مش لازم يكون شخص عنده 500 سنة خبرة و بيطلع نار من ودانه. لما اتنين يحلوا المشكلة سوا هيبقى عقلين مختلفين بيفكروا, و شوف بقى كمية الحلول اللي ممكن تطلع من اتنين. ما بالك بقى لو زودت كمان و خليتهم 3. بقت حفلة هي.

العبارة هي انك لو وقفت في مكان معين و مش عارف تتحرك و جربت كل حاجة تقدر عليها, اطلب مساعدة. خش جروبات البرمجة و اطلب هناك, شوف ال forums في المكان اللي انت بتحل منه و نزل سؤالك, خش مثلاً على Valarium و اسأل. لينك ال invitation اهو برضه: https://discord.gg/xrGAnTg. (Marketing 101 :"D)

#11 فكر بصوت عالي و ناقش نفسك

انا غشاش و قولت 10 بس دي 11. هدية من عندي عشان انتوا ناس عظيمة و قريتوا لآخر المقالة, او عملتوا سكيب عادي برضه :"D

حاولوا دايماً تفكروا بصوت عالي. و اشرحوا لنفسكوا اللي بيحصل في الكود و انتوا بتكتبوه, بصوت عالي برضه. لو فاكرين الموضوع هبل تقدروا تقروا عن ال Rubber duck debugging. ده هيحسن قدرتك على الشرح و تفسير الحاجة لغيرك, و هيخليك تقدر تساعد احسن. ده غير انه هيسمحلك تبقى احسن في ال coding interviews.




Written by Nabil Tharwat

Nabil Tharwat is a software engineer and mentor who's super in love with all things accessibility and performance. He's host of The Weekly Noob podcast and his content has reached thousands of people around the world.

Learn more about Nabil.