VOL11: Serverless Architecture, Object Relational Mappers and Move Semantics
من زمان والناس نفسها انه تتيح للـ Developers الفرصة أنهم يركزوا على جزء الـ Development وانهم يكونوا قادرين على بناء Services قوية ويبدعوا فيها بدون عوائق الـ Infrastructure أو التفكير فيها ..
بحيث يركزوا على الـ Core Product أو المنتج اللي مهتمين بيه بمعنى أصح ، من غير ما يهتموا بازاي هيديروا البنية التحتية للـ Product ده
Serverless Architecture
وعشان كده ظهر الـ Serverless Architecture كطريقة أو نمط للتصميم يسمح للـ Developers بتحقيق الأمنية دي , وإن هم يبقوا قادرين على بناء الـ Software بدون الاهتمام بالبنية التحتية واداراتها
ازاي Serverless Architecture بتشتغل ؟
كلنا عارفين أن الـ Servers عشان تسمح للـ Users بإنهم يتواصلوا مع أي تطبيق والـ Business Logic بتاعه , ده هيتطلب Resources وبنية تحتية هتطلب موارد واهتمام وادارة زي :
Server Hardware
Security Updates
Backups
Resources Management
ومن خلال اتباع الـ Serverless Architecture احنا بنشيل العبء ده كله وبنخلي الـ Developers يهتموا بس بجزء الـ Business Logic / Core Product وانهم يكتبوا الـ Application Code وبنشيل عبء البنية التحتية ونخليها مسئولية Third Party Provider زي الـ Cloud Services اللي موجودة دلوقتي ومن أشهرهم AWS , Google Cloud , Microsoft Azure
Object Relational Mappers
خلونا نتفق إن شكل العناصر في عالم قاعدة البيانات مختلف عن عالم ال Backend ففي قواعد البيانات غالبًا بنتكلم في جداول وصفوف من البيانات في حالة الـ SQL أو البيانات تكون محطوطة في Blobs or Documents في حالة ال NoSQL
بينما أثناء تصميم و كتابة ال Backend غالبًا بننظم البيانات ونتعامل معها على هيئة Objects ومش شرط كل البيانات في صف ما في ال Database مثلاً تكون في Object واحد في الكود والعكس صحيح.
فلو بنحتفظ ببيانات الطالب في قاعدة البيانات هتكون على شكل صف أو عدد من الصفوف في جداول مختلفة ولكن في الكود البيانات دي علي شكل Object و بعد ما نستعيد البيانات من ال Database ب SQL Query لازم نعمل Mapping بين الاثنين بشكل يدوي!
ولو كتبنا Pseudocode للعملية دي هتكون كدا:
StudentSql = ‘select * from student where studentId=1
studentData = db.query(StudentSql)
()Student studentObject = new Student
studentObject.setID(studentData[0])
studentObject.setName(studentData[1])
طبعًا دا Pseudocode مبسط كثير من الخطوات المتواجدة في عملية ال Mapping دي واللي ممكن تبقى طويلة وصعبة ومرهقة وتخيل هتضطر تعمل دا في كل مرة تروح تجيب فيها أي بيانات من ال Database عشان تكون في هيئة صالحة للاستخدام في الكود!
وهنا تيجي ال ORM وهي طريقة Mapping بين البيانات في قاعدة البيانات والـ Code, ال ORM بتكون مكتبة Library قادرة تفهم الكود و قاعدة البيانات وتعمل هي الـ Mapping دا بدل ما نضطر نعمله بشكل يدوي.
فال Pseudocode بتاعنا هيتحول للشكل البسيط دا
Student = dbORM.queryStudent(studentID=1)
وكل دا بإني بعرف Data Model أو Schema لل ORM وهي بتبتدي تتعامل مع ال Database بنفسها لتكوين وطلب البيانات منها.
Move Semantics in C++ Explained
ال Move Semantics تمت إضافتها في C++11 عشان تحل مشكلة معينة والمشكلة كانت الاّتي لو عندنا الcode ده
كود عادي هيعمل vector و في السطر التاني هينسخ copy كل حاجة من الvector الأولاني في الvector التاني وهيعمل pointer جديد و ينسخ الsize والcapacity بتاعت الvector الأولاني زي ما موضح في الصورة
و الoutput هيطلع كالأتي:
هيبقي نسخة طبق الأصل و ده ممكن فعلاً يكون اللي أنا عايزه بس لو افترضنا أنا عايز بدل منسخ كل حاجة أنقلها عشان أنا مثلاً خلاص مش هستخدم أول vector في حاجة تاني فا بدل ما تضيع وقت في نسخ أنا أنقلها أحسن
الفكرة ورا عملية النقل بسيطة أعمل pointer جديد أخليه يشاور علي المكان اللي بيشاور عليه الpointer القديم و منساش أشيل delete طبعاً الpointer القديم عشان لو منستش ممكن يحصل مشكلة double free عشان بحاول اعمل free لنفس الpointer مرتين و ده هيحصل لما الdestructor بتاع ال 2 vectors يتعملهم call في نهاية الscope