الأحد، 21 يناير 2018

٥ كتب أي مبرمج لازم يقراها

مساء الخير
ازيكم

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

الكتاب الأول معانا هو كتاب يعتبر علامة في الكتب اللي بتتكلم في ال Software Engineering من واحد من أفضل الكتاب و الخبراء في المجال, الكتاب هو Code Complete 2nd Edition للكاتب Steve McConnell
الكتاب بيتعرض لمجموعة من المبادئ المهمة لأي مبرمج, زي التعامل مع ال Complexity و ازاي تهزمها, بوسائل كثير زي ال Modularization و ال Abstraction و ال Discipline
بيتعرض بالتفصيل لعملية بناء السوفتوير و المراحل المختلفة فيها, مع التركيز على مراحل ال Construction اللي هي ال Requirements, Design, Coding
الكتاب حيعلمك يعني ايه Software Engineering بالمعنى الحقيقي, و ازاي انت تبقى Software Engineer, واحد من أفضل الفصول في الكتاب هو الفصل 33 و اللي بيتكلم عن Personal Character و ازاي تبني شخصيتك و مبادءك كمهندس برمجيات.
https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670

الكتاب التاني معانا هو كتاب بيتكلم في يعني ايه كود نظيف, زي ما اسم الكتاب بيقول Clean Code, بيناقش مواضيع كثيرة تصب كلها في جودة الكود كمنتج لعملية السوفتوير من أول المبادئ الأولية زي البساطة و البعد عن الكلاكيع و اتباع الأساليب القياسية, مروراً بازاي تصمم بشكل يقلل ال Complexity و يعزلها اذا لزم الأمر,  و ازاي تبقى Consistent أو متسق مع نفسك طول الوقت, يعني لو عملت حاجة باسلوب معين مرة, و جيت تعمل حاجة شبها بعدين, اعملها بنفس الطريقة, مش بطريقة مختلفة تماماً, علشان تسهل على غيرك انه يستغل الخبرات اللي اكتسبها من تعامله مع الكود, ازاي تسمي الحاجات, و ده شئ يبان عبيط لكنه في الحقيقة من اول ابواب التعقيد, هو ازاي تسمي حاجة اسم معبر و في نفس الوقت تبقى متوقعة و مفهومة, و فيه مثل مشهور في ال Computer Science هو The two hardest things in computer science are Cache invalidation and Naming Things, طبعاً الكتاب فيه تفاصيل كثير عن كل حاحة في الكود زي ازاي تكتب functions, comments, tests ازاي تقسم الكود و قدم مفهوم Code Smell  و هي الحاجات اللي لو شفتها في أي كود بتبقى علامة انه كود مش Clean
الكتاب جزء من سلسلة كتب, منها Clean Coder و مؤخراً صدر Clean Architecture و اللي ان شاء الله حعمل عنه فيديو لما أقراه بالكامل.
https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882


الكتاب الثالث معانا هو كتاب بيتكلم في مشكلة بتقابل اي مبرمج في الدنيا و هي التعامل مع ال Legacy Code و اسم الكتاب واضح Working Effectively with legacy Code, و الكتاب طبعاً بيبتدي بتعريف يعني ايه Legacy Code و ليه بيحصل, و ليه الناس كلها بتعاني منه, و ايه الاخطاء اللي اغلب المبرمجين بيعملوها لما بيقعوا في الموقف ده, زي انهم اول فكرة تيجي في بالهم هو Rewrite, و طبعاً ده بيبقى 90% من الوقت اقتصادياً مستحيل, و لو بشكل ما اقنعت الناس انها تعمله, بنسبه كبيرة الموضوع بينتج عنه حاجة أسوأ من اللي كان موجود بالفعل قبل كده زائد طبعاً وقت ضايع من غير اضافة أي شئ جديد. فالكتاب مبدئياً بيعرف ال Legacy Code  بانه ال Code  اللي مالوش Unit Tests و مش مبني من الأول انه يبقى Testable و ده طبعاً موضوع كبير, ممكن نبقى نفردله فيديو بحاله, لكن عموماً المشكلة في ان الكود علشان مش Testable فده بيخليه عرضة للمشاكل بمجرد انك تعمل اي تغيير, اللي هو نظام جيت اضبط البنطلون الجاكتة ضربت, و الكتاب تقريباً كله بيتكلم في نصائح و وسائل في ازاي تبتدي تبني Unit Tests لكود من النوع ده, بطريقة آمنة من غير ما تحتاج تعمل أي تغييرات جذرية في الأول, علشان تكسر ال Catch 22 اللي هو You need uni tests to refactor, and you need to refactor to unit tests.
https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052


الكتاب الرابع معانا هو كتاب Writing Secure Code 2nd Edition و ده برضه من أهم الكتب اللي لازم أي مبرمج يقراها, لأنها بتفتح عينه على أهمية التفكير في ال Security في كل مراحل بناء النظام, و الكتاب ده تحديداً كان كتاب رائد في المجال, و قصته جت من Microsoft للناس الكبيرة اللي زينا فاكرة مشاكل الأمن اللي كانت في منتجات مايكروسوفت زمان في التسعينات و اللي تسببت في مشاكل كثير في العالم, و كان جزء من المشكلة طبعاً ان عملية بناء سوفتوير آمن ما كانتش اتطورت, و كان ده الدافع الأساسي ل Bill Gates انه يكتب ال Memo الشهيرة بتاعة Trustworthy Computing سنة 2002 و اللي على أساسها تم انشاء فريق بنفس الاسم في الشركة, بهدف البحث و التطوير في مجال أمن البرمجيات, و الكتاب ده كان واحد من نتائج ابحاثهم.
الكتاب ده بيجمع حاجات كثير مهمة لأي مبرمج علشان يفكر و يكتب كود آمن, لكن في رأيي أفضل اسهامات الكتاب ده هو تقديمه لفكرة ال Threat Modeling و صدر بعد كده كتاب منفصل عن ال Threat Modeling ممكن تلاقوه في الروابط تحت, ال Threat Modeling يمكن هو من أهم الحاجات اللي ممكن أي فريق أو شركة تستخدمها في تحليل النظام أثناء عملية التصميم و تستخدمه في ايجاد المشاكل الأمنية و متابعة ال mitigations او طرق تفاديها.
https://www.amazon.com/Writing-Secure-Second-Developer-Practices/dp/0735617228

الكتاب الخامس معانا هو كتاب Head First Design Patterns, و ده يمكن الكتاب الأخف و الأمتع في قراءته, و اللي يمكن أفضل كتاب في سلسلة Head First من وجهة نظري, الكتاب طبعاً واضح من اسمه انه بيتكلم عن ال Design Patterns و بيقسمها لأنواع و بيتكلم عن كل Pattern بالكود و الأمثلة, أنا عن نفسي بستمتع جداً بقراءة الكتاب ده, و ساعات بقلب فيه حتى من باب اني اتفرج على الصور لأنه شبه كتب الحضانة كده, بس ده لا يمنع من انه بيشرح المادة العلمية بشكل كاف جداً.
https://www.amazon.com/Head-First-Design-Patterns-Brain-Friendly/dp/0596007124


دي كانت 5 كتب حبيت اشاركها معاكم النهاردة, لو فيه كتب كنت تحب تشوفها في القائمة دي, يا ريت تكتبها في التعليقات, الكتب دي طبعاً مش أفضل كتب في الدنيا, لكن دي الكتب اللي من رأيي لازم أي مبرمج يقراها أو على الأقل يقرا عن المواضيع اللي بتتكلم فيها الكتب دي.

شكراً جزيلاً لمتابعتكم و نشوفكم المرة الجاية.

سلام


الاثنين، 8 يناير 2018

٧ نصائح للمبرمجين

مساء الخير, ازيكم

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

أولاً قبل ما ابدا, عاوز اشكر الناس اللي تفاعلت مع الفيديو اللي فات, و اكدت على ان الفورمات ده أفضل بالنسبالهم و ان شاء الله ححاول أقدم محتوى أكثر في الفورمات ده في المستقبل

نرجع لموضوعنا

 1. Don't fall in love with your Code
 يعني ايه؟ يعني الكود بتاعك مش جزء منك, ممكن جداً حد ينتقد الكود بتاعك, مش معناه انه بينتقدك انت كشخص, أو قصده انك مش فاهم أو أي حاجة شخصية, الكود في النهاية قابل للنقد و مش حيتحسن غير بالنقد الموضوعي.و أنا شخصياً من رأيي انك لو بصيت على كود كتبته من سنة مثلاً و مالقيتش مشاكل فيه, يبقى غالباً انت مستواك ما تطورش.
 2. استثمر في نفسك
 سواء حتستثمر وقت أو فلوس, خليك دايماً فاكر ان انت رأس مالك الأول, يعني لو أهملته حتتعب و تواجه مشاكل كثير في حياتك, علشان كده استثمر في نفسك سواء بانك تدي نفسك وقت في اليوم سواء علشان تقرا, أو تتعلم حاجة جديدة, أو تلعب رياضة, أو حتى ترتاح و تعمل أي حاجة تانية لنفسك, و برضه ممكن تستثمر جزء من فلوسك في انك تحسن مهارات مثلأً بالكورسات أو الكتب أو الأدوات اللي ممكن تساعدك.
 3. اسمع المشكلة من العميل, مش الحل المقترح
 قبل ما تبدأ تكتب أي سطر كود في أي مشكلة, حاول تفكر في المشكلة من أبعاد كثير, و غالباً أول نظرة بتبقى قاصرة و مش حتحل المشكلة ١٠٠٪, حاول تسأل أكثر بحيث تفهم أبعاد المشكلة كويس قوي, أغلب الناس لما بتيجي تشرح مشكلة بتشرحها عن طريق اقتراح حل مش عن طريق شرح المشكلة, زي لما حد يروح لدكتور يقوله عاوز مضاد حيوي, لو الدكتور سمع كلامه غالباً حيضره أكثر ما ينفعه, لكن خذ وقتك في انك تفهم المشكلة و تفرقها عن الأعراض و تجاهل أي حلول مقترحة في البداية, لما تتأكد من ايه المشكلة بجد, ممكن تشوف ساعتها الحل المناسب اللي حيحل أصل المشكلة مش شوية من أعراضها.
 4. Test Your Code, and Automate it
 أي كود بتكتبه مفيش حاجة تضمن انه يفضل شغال زي ما انت عاوز غير لو فيه Test بيتأكد من الموضوع ده, و ال Test  ده حيبقى زي قلته لو مش بيشتغل بشكل مستمر, استثمر الوقت اللازم في انك تخلي الموضوع ده جزء من روتين شغلك, حيوفر عليك و على فريقك فلوس و وقت رهيب, لو مش عارف ازأي اقرا في Continuous Integration و شوف ايه المناسب للتقنيات اللي بتستخدمها, المبدأ ده مش بس حيحسن جودة الشغل بتاعك, لكن قبل ده كله حيحطك على طريق انك تتعلم ازأي تصمم كود ممكن تعمله Testing  او Testable Design, و ده شي لو تعلمون عظيم.
 5. حاول تحل المشاكل اللي تقابلك قبل ما تدور على مساعدة, و اتعلم ازأي تسأل
 أغلب وقتك في أي يوم بتقابل فيه مشاكل كثير, حاول تفهم المشكلة اللي بتقابلك و تحلها بنفسك قدر المستطاع, طبعاً حتقابلك مشاكل ممكن ما تعرفش تبتدي فيها منين, برضه استمر في المحاولة و البحث, أضعف الايمان حتقدر تسأل سؤال صح, أسوأ شيء بشوفه لما ألاقي حد واخذ Screen Shot للخطأ اللي طلعله و حطه زي ما هو كده على جروب أو فورم أو Stackoverflow و منتظر حد يعمله شغله, و بيبقى الموضوع مؤسف لما تلاقي رسالة الخطأ بتشرح الخطا و الحل, و بتيدك انطباع عن المبرمج اللي حتى ما قراش الخطأ, للأسف ده طريق الفشل, ومع الوقت مش حتتعلم أي حاجة بالعكس حتتعود على أسلوب غلط في الشغل.
 6. خليك مفيد لغيرك, و ما تفتيش, و خليك لطيف
 خليك جزء من مجتمع المبرمجين, و ساعد غيرك اللي محتاج مساعدة, بس تفادى انك تفتي, يعني لو مش عارف بلاش تتوه صاحب السؤال بإجابة انت مش متأكد منها أو غلط, أو لو عارف و حاسس الموضوع تافه بالنسبالك ما تتفهش من صاحب السؤال, لو مش قادر أو مش عاوز تجاهل السؤال.
 7. كل التقنيات حيجيلها يوم و تنتهي, اتعود على كده
 ما تتوقعش ان لغة البرمجة س أو التقنية ص اللي انت بتتعلمها حتعيش للأبد, كل التقنيات ليها دورة حياة, بتبتدي بفكرة كويسة و ناس تتحمس ليها و تنشرها و تطورها بمعدل سريع, و بعدين بتوصل لحالة من الاستقرار النسبي و بعدين بتطلع تقنيات تانية تتلافي عيوبها و تقدم أفكار جديدة بشكل جذري صعب على التقنية دي انها تتغير ليها, فبتبتدي تنحسر, و أغلب الوقت مش بتموت تماماً, و لكن بتأخذ ركن فترة طويلة و استخدأمها بيقل بشكل ملحوظ, و بتفضل مجرد مشاريع قديمة بيتعملها دعم محدود و خلاص, فاتعلم انك ما ترتبطش ارتباط عاطفي زيادة عن اللزوم بأي تقنية, و خليك خفيف.