VOL67: Unlocking Notion's Power - The Data Model Explained
أهلًا وسهلا بكم في العدد السابع والستين من النشرة الأسبوعية لاقرأ-تِك 🚀
لا تنسوا أهلنا من صالح الدعاء,اللهم إنّا استودعناك اياهم، اللهم كُن عوناً لهم، اللهم انصرهم واحفظهم. 🇵🇸
أهلًا وسهلا بكم في العدد السابع والستين من النشرة الأسبوعية لاقرأ-تِك 🚀
سواء كنت مهندس برمجيات مبتدئ أو محترف، فنشرتنا هدفها انها تثري المحتوى التقني العربي سعيا للتطوير من جودة المحتوى باللغة العربية، من خلال تقديم أحدث المستجدات والتطورات في عالم البرمجيات، بالإضافة إلى أفضل الممارسات والنصائح القيمة، ونشر أحدث المقالات وترشيحات الكتب ومحتوى ورقة وقلم اللي بينزلوا بشكل مستمر في موقع اقرأ-تِك.
في الإصدار ده الفهرس هيكون كالآتي:
Unlocking Notion's Power - The Data Model Explained
Pessimistic Locking
Dependency Injection - Flutter in Depth
Open Auth - OAuth 2
الإصدار الأول من مدونات فطين في تصميم النظم
Unlocking Notion's Power - The Data Model Explained
فريق المهندسين لم جم يبنوا Notion، كانوا حريصين على بناءه على إطار عمل يسمح للمعلومات إنها تقف لوحدها، حرة من أي قيود أو حاويات، وبدل ما تكون محبوسة في أي حاجة، بنخلي القوة في إيد المستخدم انه يقرر ده ، والإطار ده مبني على مفهوم غاية في الابداع ألا وهو الكتل (blocks).
كل حاجة بنشوفها في Notion هي block. النصوص، الصور، القوائم، صفوف قاعدة البيانات، وحتى الصفحات نفسها – كلها عبارة عن blocks، فهي وحدات ديناميكية من المعلومات اللي ممكن تتحول لأنواع تانية من blocks أو تتحرك بحرية داخل Notion.
الكتل دي هي زي قطع LEGO اللي بنستخدمها في بناء ونمذجة المعلومات. ولما بتتجمع الكتل مع بعضها، بتخلق حاجة أكبر بكتير من مجرد تجميع أجزائها.
والمرونة اللي بنشوفها من خلال Notion والـ Blocks هي جوهر مهمة Notion. فعلى الرغم من أن الكتل بتطلب من فريق Notion الهندسي إنه يكون بيطبق دقة شديدة خلال تنظيم المعلومات، الا إنهم كانوا عاوزين نموذج بيانات شبيه بالرسم البياني (graph-like) بحيث يقدر يوفر للمستخدمين القدرة على تخصيص حركة وتنظيم ومشاركة المعلومات بتاعتهم بحرية كاملة.
نموذج الكتل (Blocks) هو اللي بيخلي Notion فريد، وده الأساس لطريقة تفكير Notion في انهم يغيروا من طريقة التعامل مع البيانات.
Fundamentals of Blocks in Notion
زي قطع الـ LEGO في مجموعة LEGO، كتل Notion هي القطع الفردية اللي بتمثل كل وحدات المعلومات جوه محرر Notion. وخصائص الكتلة هي اللي بتحدد إزاي المعلومات دي هتتنسق وتتنظم بالشكل اللي عاوزينه.
مصدر الصورة : Notion Engineering Blog
كل كتلة عندها الخصائص دي :
الـ ID: كل كتلة ليها معرف فريد. ونقدر نشوف الـ ID الخاص بكتلة الصفحة (Page Block) في نهاية عنوان الـ URL في المتصفح. وبيتم استعمال الـ UUIDs (UUID v4) كمولد عشوائي للـ IDs في Notion.
الـ Properties: وهي عبارة عن هيكل بيانات بيحتوي على بعض خصائص المخصصة لكتلة معينة. فالخاصية الأكثر شيوعًا هي الـ title، ودي اللي بتخزن محتوى النص لأنواع الكتل زي الفقرات والقوائم وطبعًا عنوان الصفحة. والأنواع الأكثر تعقيدًا من الكتل بتحتاج خصائص إضافية أو مختلفة.
الـ Type: كل كتلة ليها نوع، وده اللي بيحدد إزاي الكتلة هتظهر ويتعملها Render بشكل مختلف، وإزاي هنفسر خصائص الكتلة. Notion بيدعم أنواع كتير من الكتل، واللي ممكن تشوف أغلبها في قائمة "new block" لما تدوس على زر + أو في قائمة /.
مصدر الصورة : Notion Engineering Blog
إلى جانب الخصائص اللي بتوصف الكتلة نفسها، كل كتلة بيكون عندها مجموعة من الخصائص اللي بتحدد علاقتها مع باقي الكتل وهنا ممكن نشوف الموضوع أشبه بـ Graph:
الـ Content: ودي عبارة عن Array من معرفات الكتل (Block IDs) اللي بتمثل المحتوى جوه الكتلة دي، زي العناصر المتداخلة في قائمة نقطية أو النصوص جوه toggle فأشبه بالـ Children للـ Parent.
الـ Parent: وده عبارة عن معرف الكتلة اللي هي الأصل للكتلة الحالية. أو بمعنى أدق الـ Parent of Current Block ، وكتلة الأصل بتستخدم فقط في صلاحيات الوصول (permissions).
How Blocks Fit Altogether
زي كتل الـ LEGO، كتل Notion ممكن تتجمع مع كتل تانية عشان تعمل حاجة أقوى بكتير – زي الـ Roadmap اللي بتكون مخصصة تمامًا للـ Progress بتاع فريقك، وبترصد التقدم وبتحتفظ بكل معلومات المشروع في مكان واحد. فـ Notion هم بينظموا كل جوانب الكتل عشان يتأكدوا إنها بتعمل الحاجات الصح وبتعيش في الأماكن الصح، وده بيسهل للمستخدمين استعمالها وربطها وتخصيصها زي ماهم عاوزين عشان يحلوا مشاكلهم ويديروا مشاريعهم بكفاءة.
Block Types and Properties
نوع الكتلة في Notion هو اللي بيحدد إزاي الكتلة هتتعرض ويتعملها Render في واجهة مستخدم Notion، وطبقًا لنوعها، بيتم ترجمة خصائص ومحتويات الكتلة بشكل مختلف.
Content and Tree Render
نظام الكتل في Notion بيسمحلنا إننا نضيف كتل جوا كتل تانية، زي النصوص جوا قائمة قابلة للطي (toggle) أو الصفحات الفرعية اللي ممكن تكون جوه صفحات تانية بشكل لا نهائي. الخاصية دي بتخلّي الكتل عندها مرونة كبيرة جدًا في التكوين، وده عن طريق استخدام خاصية المحتوى (content attribute) في الكتلة اللي بتحتوي على IDs (معرّفات) للكُتل الفرعية اللي بتكون مرتبطة بيها.
مصدر الصورة : Notion Engineering Blog
في مثال قائمة المهام (To-do list)، لو عندنا كتلة قائمة مهام مكتوب فيها “Write a blog post about blocks”، الكتلة دي هتكون عندها 3 معرفات (block IDs) في الـ Content Array المحتوى بتاعتها. الكتل دي بنسميها render children، يعني الكتل اللي بيتم عرضها بناءً على العلاقة الهيكلية اللي بينهم وبين الكتلة الأم.
Pessimistic Locking
يعتبر الـ Locking من أهم الآليات اللي بنعتمد عليها في الـ Databases بشكل أساسي عشان نتحكم في الـ Concurrent Access للبيانات من خلال أكثر من Transactions، فلو كان هناك عدد من الـ Transactions بيحاول يوصل للبيانات دي في نفس الوقت فأكيد هيحصل نتيجة لده تضارب بنسميه Conflicts.
💡 نقدر نتخيل الـ Locking كأنه زي القفل اللي بنقفل بيه على أي حاجة عشان نمنع أي حد من الوصول ليها. فالـ Databases أحيانًا بتحط قفل على الـ Row أو الـ Record لما يكون فيه Transaction شغال عليه عشان تمنع أي حد من الوصول للـ Row ده, اكنه دخل (الحمام وقفل وراه الباب) ..
طب هو ليه اصلا بنحتاج للـ Locking ؟
احنا بنحتاج للـ Locking لإنه بيقدملنا فوايد مهمة زي الـ Data Integrity & Data Consistency ودول من أهم الفوايد اللي بنحصل عليها من الـ Locking .. لإنه من غير Locking ممكن Two Concurrent Transactions يغيروا في قيمة الـ Column الواحد في نفس الوقت وده يسبب مشاكل كتير.
وعلى الرغم من فوايد الـ Locking الا انه بيجي مع تحديات كبيرة وتعقيدات في التعامل معاه، فلازم نكون فاهمينه عشان نقدر نتعامل معاه بشكل فعال.
فيه نوعين من الـ Locking وهم الـ Optimistic Locking والـ Pessimistic Locking بس احنا هنتكلم النهاردة عن الـ Pessimistic. وده لاننا اتكلمنا قبل كده عن الـ Optimistic Locking
ايه هو الـ Pessimistic Locking ؟
الـ Pessimistic Locking جاي من اسمه انه شخص متشائم، بيعمل حسابه دايما على أسوء الظروف وبناء عليه بيفكر لقدام وبياخد احتياطه مسبقا.
الـ Pessimistic Locking في قواعد البيانات بيمنع الـ Conflicts الناتجة من الـ Concurrent Updates واللي بتحصل بشكل Frequent أو متكرر. فلما بنيجي نعمل عملية تحديث لـ Row أو Record معين، فالـPessimistic Locking بتحط قفل على الـRow أو الـRecord ده عشان تمنع عمليات الـ Updates التانية من انها توصل لنفس الـ Row أو الـ Record في نفس الوقت.
ممكن نتخيل أن القفل ده عبارة عن اشارة حصرية فقط لعملية الـ Update الحالية , وبالتالي مش ممكن لأي عملية تانية انها توصل لنفس البيانات اللي شغالين عليها وده لانها بتكون مقفول عليها بالقفل لحد ما العملية الحالية تنتهي.
Dependency Injection - Flutter in Depth
ما هي ال Dependency؟
Dependency معناها "اعتماد". في البرمجة، أي class بيحتاج كائن من class تاني علشان يشتغل بطريقة صحيحة بنقول إنه يعتمد عليه. مثال:
وبكدا UserRepository ما يعرفش حاجة عن تفاصيل ApiService، بس بيعتمد عليه عشان يشتغل.
لو حبيت تغير ApiService بكلاس تاني مثلاً MockApiService، تقدر تعمل ده من غير ما تغير UserRepository.
لماذا ال Dependency مهمة؟
بتحقق مبدأ المسؤولية الواحدة (Single Responsibility Principle) لأن كل Class بيركز على شغله بس.
بتساعد على الاختبار لأنك تقدر ت inject fake أو mock dependencies بسهولة.
بتخلي الكود قابل لإعادة الاستخدام وسهل تغير فيه براحتك.
ما هو الـ Injection؟
ال Injection هو: "تمرير" أو "حقن" الـ Dependency إلى ال Class بدل ما هو ينشئها بنفسه.
لو الClass نفسه بينشئ الاعتماد:
مشكلة ده:
مقدرتش أبدل ApiService بـ MockApiService للاختبار.
كل ما الكلاس يعتمد على dependency جديدة، بيزيد الـ coupling.
Open Auth - OAuth 2
بما أن الإنسان كائن ملول ومش كل شوية هنعمل حسابات جديدة بكلمات مرور جديدة علي كل موقع بندخله بنلاقي أمامنا خيار أنك تدخل ب Gmail account or Facebook or … بتختاره ومبروك وفرت ربع ساعة Sign up وإدخال معلومات لموقع جديد 🥳, لكن عمرك فكرت كمبرمج الموقع دا ازاي قدر يعملك اكونت من غير ما يعرف كلمة مرور الـ Gmail بتاعك؟
فورقة وقلم وتعالوا نعرف ما هو ال O-Auth (open authorization) Protocol السر وراء سحر ال Third Party authorization
ايه الـمشكلة اللي بيقوم الـ OAuth بحلها؟
بافتراض انك بتشترك في خدمة أو تطبيق جديد ولنقل Notion وبدل ما تعمل أكونت من الصفر بتستخدم أكونت ال Gmail بتاعك للدخول وهنا Notion كموقع مش محتاج من أكونت ال Gmail بتاعك غير بعض المعلومات زي البريد الإلكتروني وتأكيد هويتك وصورتك الشخصية عشان يحطها كصورة شخصية للاكونت بتاعك بس هيعمل دا ازاي؟
💡في السنين الأولى للانترنت والمواقع عشان Notion يعمل كدا كان هيطلب منك كلمة المرور الخاصة بالـ Gmail بتاعك عشان يعمل بيها Login علي ال Gmail services ويقدر يسحب البيانات دي من الاكونت وياخدها الموقع , طبعًا واضحة المشكلة!!
هو كدا عنده Access على "كل" بياناتك حرفيًا وممكن يتصرف فيها كأنه أنت!! بعد تنوع وانتشار التطبيقات اكتشفنا ان الطريقة دي مفيهاش Security بجنيه فتم الغاء التعامل بيها وظهر بدالها ال Open authorization
ال Open authorization هو Standard أو authorization framework أو طريقة متفق عليها بنستخدمها في ال Delegated third party access وليه اصدارين الاول والثاني, الفرق بينهم كبير و هنا هنتكلم عن طريقة عمل Oauth 2 بما أنه الأسهل والأكثر انتشارًا حاليًا.
خصم 50% على جميع خطط الاشتراك السنوية لفترة محدودة، تقدروا دلوقتي تشتركوا في اقرأ-تِك وتستمتعوا بكافة المقالات في كل ما يخص هندسة البرمجيات باللغة العربية والمحتوى المميز من ورقة وقلم ومدونات فطين اللي بيتميزوا بتصاميم ذات جودة عالية وكل ده بحرية كاملة وكمان مفاجآت اقرأ-تِك الجاية 🚀
وبرضو متاح الاشتراك من خلال InstaPay و VodafoneCash 🎁
مدونات فطين في تصميم النظم - الإصدار الأول 🚀
كتابة هذا الكتاب لم تكن قرارًا مخططًا... بل كانت نتيجة لتراكمات من الحيرة، الإحباط، والدهشة اللي بيواجهوا أغلب الشباب حاليًا خصوصًا في رحلة البحث عن تعلم مهارات تصميم النظم واللي أصبحت من المهارات الأساسية في الانترفيوهات بالإضافة لكونها مهمة فعلًا على جميع المستويات.
على مدار سنوات من العمل داخل شركات تكنولوجية متعددة، وجدت نفسي مرارًا أواجه بعض الأسئلة زي:
لماذا صُمّم هذا النظام بهذه الطريقة؟
لماذا لم نرَ المشكلة إلا بعد فوات الأوان؟
هل كان يمكن أن نصمم الأمر بشكل أبسط؟
الإجابات كانت دائمًا معقدة، وتعود لأبعاد تقنية وتنظيمية ونفسية أيضًا.
هذا الكتاب ليس دليلًا أكاديميًا، بل هو مجموعة من التجارب والخبرات العملية كتبتها بعين المهندس الذي يراقب، يسأل، ويُخطئ ثم يتعلّم. المجموعة دي لم يتم ترجمتها للعربية من مدونات الشركات العالمية .. بل تم اعادة شرحها وتبسيطها باللغة العربية بأسلوب مختلف حتى تتسم بالبساطة بالإضافة لتميزها بالرسوم التوضيحية الجذابة.
اخترت اسم "فَطين" لأنه الشخصية التي تمنيت لو كانت موجودة معي منذ البداية— يسأل الأسئلة الصحيحة، ويفكّر بصوت عالٍ، ويحكي لك الدروس المستفادة.
إن كنت مهندسًا في بداية الطريق، أو تعمل منذ سنين ولديك خبرة متوسطة أو متقدمة في تصميم وبناء النظم فهذا الكتاب كتبته لك ليكون مرجعًا عمليًا لك يساعدك في تطوير مهاراتك التحليلية والفكرية في بناء وتطوير النظم الضخمة.
يتناول الكتاب ما يعادل من 15 تجربة عملية مميزة من داخل الشركات العالمية في تصميم النظم الضخمة بأكتر من 160 صفحة ويضم الآتي :
Introduction Into System Design
How Uber Serves Over 40 Million Reads Per Second
How Discord Stores Trillions of Messages
Dropbox's Chrono: Scalable, Consistent and Metadata Caching Solution
Unlocking Notion's Power - The Data Model Explained
How Shopify Mitigates Deadlocks in High Concurrency Environments
How LinkedIn Improves Microservices Performance With Protobuf
How Figma Secures Internal Web Applications
How GitHub Improves Reliability of Code Push Processing
How Meta Leverages AI For Efficient Incident Response
How Stripe Architected Massive Scale Observability Solution on AWS
Change Data Capture at Pinterest
How Canva Built Scalable and Reliable Content Usage Counting Service
How Netflix Migrates Critical Traffic at Scale With No Downtime
How Slack Handles Billions of Tasks in Milliseconds
How YouTube Supports Billions of Users With MySQL
System Design Comprehensive Guide
تقدروا تشوفوا النسخة كاملة من هنا كـ E-Book ، وحاولنا نخليها بسعر رمزي يناسب الجميع 👇
وكمان وفرناه على Kindle عشان الناس اللي بتحب تجربة القراءة على الـ Kindle منحرمهاش من التجربة الممتعة دي 🎉
بفضل الله أصبح متاح حاليا دعمنا من خلال الرعاة والشراكات وفعلنا الـ Sponsorship واحنا بنرحب بجميع الشراكات مع المؤسسات والشركات وأصحاب الأعمال لبناء مجتمع عربي يشجع على القراءة والتعلم ومشاركة التجارب والخبرات العملية في هندسة البرمجيات.
دورك كشريك أو راعي هيكون محوري في دعم المحتوى وتوسيع نطاق تأثيره. فانضم لرحلتنا وكن جزءًا من صناعة مستقبل التكنولوجيا في المنطقة 🚀
تقدروا تشوفوا التفاصيل كاملة من هنا والـ Analytics بتاعتنا من خلال اقرأ-تِك والنشرة الأسبوعية 👇
رؤيتنا هي إثراء المحتوى التقني العربي وجعل التعلم من خلال القراءة أمتع، وذلك من خلال إثراء المحتوى التقني باللغة العربية وتشجيع المبرمجين على القراءة بلغتهم الأم والتفكير أيضًا بها.
لذلك اتحنا الفرصة أمام الجميع للمساهمة ومساعدتنا في نشر واثراء المحتوى التقني باللغة العربية, من خلال كتابة المقالات التقنية في مختلف مجالات هندسة البرمجيات.
وجب التنويه أنه لن يتم نشر كافة الأعمال التي تصل إلينا، وإنما سيتم الانتقاء منها ما يحقق هدفنا بإثراء المحتوى التقني العربي، ولذلك قد تُطلب بعض التعديلات من الكاتب قبل النشر.
لمعرفة المزيد بخصوص :
💬 المعايير العامة لكتابة ونشر المقالات
⚡️ كيفية الإرسال
🔥 التزامات اقرأ-تِك تجاه الكتاب
يمكنكم قراءة كافة التفاصيل من هنا 👇
You can used as free if you have account of student in university