VOL:16 How to Avoid Double Charge in Payment Systems?
أهلًا وسهلا بكم في العدد السادس عشر من النشرة الأسبوعية لاقرأ-تِك 🎉
لا تنسوا أهلنا من صالح الدعاء,اللهم إنّا استودعناك اياهم، اللهم كُن عوناً لهم، اللهم انصرهم واحفظهم. 🇵🇸
أهلًا وسهلا بكم في العدد السادس عشر من النشرة الأسبوعية لاقرأ-تِك 🚀
سواء كنت مهندس برمجيات مبتدئ أو محترف، فنشرتنا هدفها انها تثري المحتوى التقني العربي سعيا للتطوير من جودة المحتوى باللغة العربية, من خلال تقديم أحدث المستجدات والتطورات في عالم البرمجيات، بالإضافة إلى أفضل الممارسات والنصائح القيمة, ونشر أحدث المقالات وترشيحات الكتب ومحتوى ورقة وقلم اللي بينزلوا بشكل مستمر في موقع اقرأ-تِك.
في الإصدار ده الفهرس هيكون كالآتي:
ازاي نحل مشكلة الـ Double Payment (ندفع الـ Customer أكتر من مرة) في الـ Payment Systems
ادارة العمليات (الـ Process Management) ومكوناتها
نظرة على الـ Map والـ HashMap وبعض الـ Tips & Tricks ليهم في الـ Java
عرض خاص لفترة محدودة وخصم 50% للاشتراك في اقرأ-تِك
مشروع SonarQube وازاي تقدر تحقق الـ Code Quality & Security من خلاله
ازاي ترتب حلك في الـ Technical Interview
ليه Pinterest عملت Migration من HBase لـ TiDB
كتاب Grokking Algorithms
اكتب معنا
اقتباسات
دقيقة لقلبك
How to Avoid Double Charge in Payment Systems
أحد أكبر المشاكل اللي ممكن نواجهها في تصميم الأنظمة الخاصة بالدفع , والمعاملات المالية هي أنك تدفع العميل أكتر من مرة, وعشان كده واحنا بنصمم Payment System محتاجين ناخد في الاعتبار ان عملية الدفع لازم نضمن انها هتتم مرة واحدة فقط لا غير.
وطبعًا عشان نحقق الضمان ده واللي بنسميه Exactly-Once Delivery بيقابلنا تحديات مش سهلة خصوصًا لو بنتعامل كمان مع Distributed Systems.
المعادلة الرياضية
لو جينا نبص للمشكلة اللي بنواجهها دي رياضيًا فالمفترض عشان نقول أن فيه حاجة تتم مرة واحدة بس فده معناه انها بتطبق الشروط دي:
اتنفذت على الأقل مرة
اتنفذت كحد أقصى مرة
يعني ايه الكلام الغريب ده باه ؟
بكل بساطة عشان نعالج مشكلة الـ Double Payment واننا منخليش الـ Customer يتحاسب مرتين أو أكتر, احنا عاوزين طريقة نضمن بيها , ان عملية الدفع على الأقل حصلت مرة .. وفي نفس الوقت نضمن أنها متحصلش أكتر من مرة عشان ميتحاسبش مرتين أو أكتر.
وعشان نحقق ده هنستعمل:
الـ Retryer عشان نضمن أول شرط ان عملية الدفع على الأقل حصلت مرة.
الـ Idempotency Key عشان نضمن تاني شرط وهو أن عملية الدفع ما تحصلش أكتر من مرة.
Retryer
من خلال استعمالنا للـ Retryer كده احنا هنضمن أن لو حصل أي مشكلة في عملية الدفع , سواء كانت مشكلة Network أو Timeout مثلًا أو Server Failure أو أيا كان السبب ايه .. فاحنا ضامنين أن عملية الدفع هيتعاد تنفيذها تاني لحد ما تنجح وبالتالي هنا احنا بنحقق أول شرط الا وهو الـ At Least Once Delivery.
فكده احنا حققنا أول شرط وضمنا ان لو حصل أي مشكلة في الدفع , هنحاول أكتر من مرة لحد مالعملية تنجح , فعلى الأقل مرة واحدة هتنجح.
فاحنا لو بنحاول نشتري حاجة بـ 100 جنيه , والعملية دي فشلت , ممكن نفضل نحاول لحد ما تنجح ..
طب ماذا لو نجحت , وحاولنا مرة تانية بالخطأ ؟ أو حصل هنا ان اتبعت Retrying تاني بعد ما العملية نجحت ؟ هنا هنروح لتاني حل وهو الـ Idempotency Key عشان نضمن أننا منقعش في المشكلة دي وندفع الـ Customer أكتر من مرة.
ادارة العمليات Process Management
في عالم أنظمة التشغيل، إدارة العمليات هي واحدة من الأساسيات اللي بتضمن تشغيل البرامج بشكل سليم واستخدام موارد النظام بكفاءة. العملية هي ببساطة برنامج بيشتغل، وإدارة العمليات دي مهمة جدًا عشان تضمن استقرار وأداء النظام.
إيه هي الـ Process؟
هي نسخة من البرنامج وهو بيشتغل. يعني لما تشغل برنامج، النظام بيحول البرنامج ده لـ Process وبيبدأ يتابع تشغيلها. والـ Process بتاخد مساحة في الذاكرة وبتستخدم موارد زي الـ CPU والـ Memory.
نظام التشغيل بيتولى إدارة الـ Processes عشان يضمن إن كل Process بتاخد حقها في الموارد وما يحصلش تضارب بينها وبين بعضها. وده بيشمل حاجات متعددة زي:
جدولة العمليات (Process Scheduling):
النظام بيحدد أي Process تشتغل في أي وقت، وده بيتم عن طريق جدولة الـ Processes دي. وطبعا فيه خوارزميات مختلفة للجدولة زي الـ "Round Robin" و الـ "First Come First Serve".
إنشاء وحذف العمليات (Process Creation and Termination):
لما تشغل برنامج، النظام بيعمل Process جديدة. ولما البرنامج يخلص، النظام بيحذف الـ Process دي عشان يفضي الموارد لأي Processes تانية. فنظام التشغيل بيوفر لينا بعض الطرق والآليات لإننا ننشئ ونقفل Processes, فعندنا مثلا الـ fork() System Call بيتم استعمالها عشان نـ Create Process واللي بتكون نسخة طبق الأصل من الـ Parent Process , وعندنا الـ exit() System Call اللي بيتم استعماله عشان نـ Terminate Process.
Full Guide Into Map and HashMap in Java
الـ Map تعتبر Interface في الـ Java بيحددلنا ان عندنا Object بيـ Map الـ Keys بتاعته لـ Values معينة. وهو في لغات تانية كتير ممكن يكون اسمه Dictionary أو HashMap بمعنى انه Key Value Data Structure.
والـ Map مبيسمحش بوجود Duplicate Keys فكل Key بيـ Map لـ Value معينة بالكتير واحد فهو هيـ Map لـ Null يا اما Value واحدة , ومش شرط ان Value واحدة معناها قيمة واحدة ولكن هو ممكن يكون شايل جواه عادي جدًا أي نوع Data Structure ولكن الغرض انه شايل حاجة واحدة.
وفي الـ Java الـ HashMap Class هي من أشهر وأكتر الـ Implementation للـ Map Interface اللي بيتم استعمالها وهي Efficient جدًا بالمناسبة.
ازاي نـ Initialize HashMap in Java
فيه أكتر من طريقة نقدر من خلالهم اننا نعمل Initialization للـ HashMap.
أول طريقة هي من خلال استعمال الـ new
بحيث اننا نـ Create الـ Object وبعدين نزود فيه البيانات اللي عاوزينها
تاني طريقة هي باستعمال الـ ofEntries
:
والطريقة دي بتخلينا اننا نـ Create Unmodifiable Map يعني بمعنى أصح هنـ Create Map بشكل ما ينفعش نغير فيه خالص ولا نعمل أي عمليات من الـ Update / Insert / Remove
وفيه برضو طريقة تانية تخلينا نـ Create Unmodifiable Map وهي من خلال الـ of
:
والطريقة دي بتسمح لينا باننا نخزن لحد 10 Keys كحد أقصى ومحتاجة على الأقل تكون شغال أقل حاجة بـ Java 9.
ولو عاوزين نرجع Map فاضي ممكن نعمل كده :
خصم خاص ولفترة محدودة على الاشتراك السنوي في اقرأ-تِك بنسبة 50% يعني بـ 30 جنيه بس 🚀
وخصم على خطط الاشتراك الشهري بنسبة 30% 🎉
تقدروا دلوقتي تشتركوا في اقرأ-تِك وتستمتعوا بكافة المقالات في مواضيع مختلفة زي:
Data Structure & Algorithms , System Design , Distributed Systems , Micro-Services, Clean Code, Refactoring, Databases , Web Development, DevOps وغيرهم كتير باللغة العربية!
بالاضافة لمحتوى ورقة وقلم اللي بنشرح فيه مفاهيم برمجية بطريقة سهلة وباستعمال صور توضيحية بجودة عالية 🚀
ولو فيه مشاكل في الدفع الأونلاين فمتاح دلوقتي الاشتراك من خلال InstaPay و VodafoneCash 💪
تقدروا تتواصلوا معانا من خلال الـ WhatsApp Business أو من خلال الرسايل على مواقع التواصل الاجتماعي أو من خلال البريد الالكتروني contact@eqraatech.com 😍
SonarQube
SonarQube ده أداة مفتوحة المصدر بتفحص الكود بتاعك بشكل تلقائي عشان تكتشف الأخطاء وتحسن جودة وأمان الكود. الفكرة إنه بيديك فيدباك مستمر عن الكود اللي بتكتبه عشان تتأكد إنه نظيف وآمن وخالي من المشاكل.
طب بيشتغل إزاي؟
تحليل الكود: أول حاجة بيعملها SonarQube هي إنه بيحلل الكود بتاعك باستخدام تقنيات تحليل ثابتة (static analysis). يعني بيشوف الكود من غير ما يشغله، وبيطلع لك الأخطاء والمشاكل اللي فيه.
التقارير: بعد ما يحلل الكود، بيطلع لك تقارير بتوضح الأخطاء اللي اكتشفها، زي الـbugs (الأخطاء البرمجية)، والـcode smells (الكود اللي مكتوب بطريقة ممكن تكون غلط أو مش واضحة)، والـsecurity vulnerabilities (الثغرات الأمنية).
التكامل مع الأدوات التانية: SonarQube بيتكامل بسهولة مع أدوات تطوير وبرمجة تانية زي Jenkins وGitLab، عشان تقدر تعمل فحص تلقائي للكود بتاعك كل ما تعمل عملية Build أو تحديث للكود.
ليه ممكن نحتاج نستخدم SonarQube؟
تحسين جودة الكود: SonarQube بيساعدك تكتب كود أفضل وأوضح وأكتر كفاءة.
زيادة الأمان: بيساعدك تكتشف وتصلح الثغرات الأمنية في الكود بتاعك.
توفير الوقت: بدلاً من فحص الكود يدوياً، SonarQube بيعمل ده بشكل تلقائي، وبيوفر لك وقت وجهد.
استخدامات شائعة
الشركات الكبيرة والصغيرة: سواء كنت شغال في شركة كبيرة أو لسه بادئ مشروع صغير، SonarQube بيساعدك تحافظ على جودة الكود بتاعك.
فرق التطوير: لو عندك فريق تطوير، SonarQube بيساعدكم تتابعوا جودة الكود بشكل جماعي وتصلحوا المشاكل بسرعة.
وكل ده طبعا احيانا كتير بيكون ضمن الـ CI/CD Pipelines عشان يحصل بشكل Automated ويضمن جودة الـ Code المكتوب قبل ما يحصله Merge في الـ Codebase الأساسي.
وجب التنويه ان فيه Open-Source Edition وفيه Enterprise Editions كذلك
ازاي ترتب حلك في الـ Technical Interview
محطة ال Technical interview تعتبر الأهم في عملية الانترفيوهات, وفي ال Problem solving interview كتير مننا بيكون مركز علي حل المسألة وبينسي إن الانترفيور همه الأول والأخير مش إنه يعرف إنك عارف الحل ولكن يقيم “ازاي وصلت للحل”.
طريقتك في حل المسألة بتعكس تصرفك في حل مشكلة حقيقة في الشغل واللي ممكن متكونش قادر تحلها من أول لحظة لكن بالتفكير النقدي والتواصل الفعال مع الفريق بتقدر توصله وهو دا المطلوب. فهنا بعض الخطوات اللي مهم إنك وأنت بتتدرب علي حل المسائل تنتهجها وكذلك أثناء الانترفيوهات واللي هتتضمنلك تتقبل في الانترفيو حتي لو موصلتش للحل الصحيح للمسألة!
١- اقرأ المسألة بشكل جيد
خطوة القراءة بتأني مهمة جدًا لأن عليها بيتبني فهمك للمسألة وبالتالي حلك لها.
٢- اسأل أسئلة توضيحية
بعد قراءة المسألة حاول توصل اللي فهمت إنه مطلوب كحل للمسألة بوضوح للانترفيور واتأكد أنه دا المطلوب وكمان اسأل أسئلة عن أي شي٫ مش واضح زي حجم أو شكل ال input أو أي constraints مطلوبة. الجزء دا مهم جدًا و الانترفيورز بيقيموا عليه لأن في الحياة الواقعية لازم تسأل أسئلة توضيحية كتير عن مشاريعك ومتعتمدش علي افتراضاتك.
٣- استخدم الأمثلة و اطلع بحل بسيط
حاول تمشي علي الأمثلة و توقع المشكلة والحل عليها و”تضيف أمثلة ال edge cases“ لو مش متاحة عشان تأكد فهمك . ومن هنا قدم حل بسيط جدًا للمشكلة ويكون بيعدي الأمثلة. المهم في الخطوة دي إنك تفكربصوت عالي وتتناقش مع الانترفيورز في ال trivial solution اللي قدمته وبعدين تقدر تقيم سوء الحل دا وتتناقش مع الانترفيور في ايه هي التحسينات عليه أو الطرق البديلة. ولما توصل للحل المناسب من حيث ال time and space constraints أو توصل لل most efficient solution بتسأل الانترفيور لو تقدر تبتدي في مرحلة كتابة الكود.
٤- كتابة الكود
في مرحلة كتابة الكود مش محتاج تتكلم مع الانترفيور وتركيزك هنا هيكون علي كتابة كود نظيف ومرتب.
كود نظيف = استخدم أسماء متغيرات مناسبة وقسم الكود في functions مناسبة.
كود مرتب = أهتم ب ال indentations وشكل الكود في العموم.
طيب قابلت جزء من الحل مش قادر أكتبه في شكل كود ؟ حط بداله placeholder أو function call و اعمله implementation في الاخر عشان متعطلش وتستغل الوقت بشكل صحيح.
٥- امشي علي الكود اللي كاتبه بمثال
بعد ما تخلص كتابة كود, استخدم واحد من الأمثلة بانك يدويًا تمشي بالقيم وتعوض في الكود بتاعك. الخطوة دي بتبين إنك فاهم الكود اللي انت كاتبه بيشتغل ازاي بالظبط ودي مهارة مهمة في تقييم عملك كمبرمج. كمان لو في Edge case ومشيت عليها بعد كدا هيكون مناسب جدًا.
٦- تقدر تعمل Test cases Run
حاول تعمل ال Run و أنت شبه متأكد من حلك, لأنه لو failed run في مثال دا معناه إنك مكنتش عامل حسابه ودي نقطة سلبية ولكن بما إن دا لابد أن يحدث تقدر تحول الموقف دا لنقطة إيجابية بإنك تستخدم ال use case دي وتمشي عليها بشكل يدوي علي الكود وتتناقش في سبب المشكلة مع الانترفيور وتحله.
Pinterest Migration from HBase to TiDB
فريق المهندسين في Pinterest مؤخرًا كتبوا Blog بيوضحوا فيها الـ Depreciation اللي هيحصل للـ HBase Clusters بتاعتهم وده لأكتر من سبب من ضمنهم:
التكلفة العالية للبنية التحتية لادارة الـ Cluster الضخم ده
التكلفة العالية للصيانة
عدم وجود خبرات كافية للتعامل مع HBase
بعض القيود على الوظايف الي المنتج محتاج يقدمها
وهنا بدأ الناس يتسائلوا هل دي علامة أو مؤشر لتجاهل وتجنب الـ NoSQL Databases اللي بتشتغل على Hadoop و HDFS و؟
Pinterest بتضم عدد كبير من الـ Deployments الضخمة من HBase في العالم , واللي تقريبًا بتوصل لـ 50 Cluster و 9000 AWS EC2 Instance وأكتر من 6 PBs من البيانات.
ومع ذلك ما ينفعش ننكر فضل HBase وانه أظهر قد ايه هو Durable , Scalable وكمان بيتميز بكفاءة عالية جدًا, ولكن بعد مناقشات كتير في نهاية 2021 اتخذوا قرارهم بانهم يعملوا Depreciation!
وHBase هو يعد Key-Value Store مبني فوق HDFS وبيتم استعماله من خلال Apache Hadoop وبناء على كلام Senior Staff Engineers في Pinterest فهو أول NoSQL Datastore في Pinterest وأكترهم شيوعًا واستخدام للـ Image-Sharing في الـ Backend Systems لشركات الـ Social Media!
Figure 1. The HBase ecosystem at Pinterest. HBase serves as the storage backend of many services and powers a broad range of applications across the entire company.
Source Image: Medium
Grokking Algorithms
الكاتب: Aditya Bhargava
المستوي: مبتدئ
إذا كنت مهتم بالخوارزميات فلابد وسمعت عن كتاب grokking algorithms في كونه مٌبسط وهنا إحنا بنشجعك إنك تقراءه سواء كنت عالم بالمحتوي أم لا, لأنه جزء من اتقان العلم هو توصيله بطريقة سهلة ومبسطة. ففي الكتاب هتلاقيه بدأ بمقدمة عامة وتناول بعض هياكل البيانات والخوارزميات أو ما تعرف بالـ Data Structure and Algorithms الشائعة. ومن ثم انتقل للخوارزميات الأساسية زي ال sorting algorithms.
وكذلك نرشح قراءة الجزء الخاص بال hash tables ودا لأنها مفتاح لحل مشاكل الكثير من المشاكل البرمجية وتعتبر واحدة من أكفأ هياكل البيانات اللي هتقدر تستخدمها في شغلك بشكل يومي
واحدة من أجمل اللي اتشرح في هذا الكتاب بشكل هما ال recursion و ال graph algorithms و هما يعتبروا من المفاهيم اللي بتلتبس علي الكثير مننا. هنا بيقدر الكاتب يشرحها بشكل مبسط وسلس وباستخدام رسوم توضيحية.
اكتب معنا
رؤيتنا هي إثراء المحتوى التقني العربي وجعل التعلم من خلال القراءة أمتع، وذلك من خلال إثراء المحتوى التقني باللغة العربية وتشجيع المبرمجين على القراءة بلغتهم الأم والتفكير أيضًا بها.
لذلك اتحنا الفرصة أمام الجميع للمساهمة ومساعدتنا في نشر واثراء المحتوى التقني باللغة العربية, من خلال كتابة المقالات التقنية في مختلف مجالات هندسة البرمجيات.
وجب التنويه أنه لن يتم نشر كافة الأعمال التي تصل إلينا، وإنما سيتم الانتقاء منها ما يحقق هدفنا بإثراء المحتوى التقني العربي، ولذلك قد تُطلب بعض التعديلات من الكاتب قبل النشر.
لمعرفة المزيد بخصوص :
💬 المعايير العامة لكتابة ونشر المقالات
⚡️ كيفية الإرسال
🔥 التزامات اقرأ-تِك تجاه الكتاب
يمكنكم قراءة كافة التفاصيل من هنا 👇
Simplicity is the soul of efficiency." — Austin Freeman”
Why did the programmer quit his job
😂 Because he didn't get arrays(a raise)