Go في الشركات الناشئة: كيف ساعدت لغة Google في بناء شركات بمليارات الدولارات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا تتحول الشركات الناشئة بشكل جماعي إلى لغة Go؟

\n\n

عندما قدمت Google لغة Go (أو Golang) في عام 2009، لم يتوقع الكثيرون أن تصبح هذه اللغة "السلاح السري" لآلاف الشركات الناشئة حول العالم. اليوم، Go ليست مجرد موضة عابرة. بل تقف وراءها قصص نجاح حقيقية: من Dropbox، الذي أعاد كتابة الواجهة الخلفية من Python إلى Go وقلص تكاليف الخوادم بنسبة 50%، إلى Uber، حيث تعالج Go ملايين الاستعلامات الجغرافية في الثانية.

\n\n

في هذه المقالة، لن نقوم فقط بسرد الشركات التي تستخدم Go. بل سنحلل لماذا فعلت ذلك، وما هي القرارات المعمارية التي اتخذتها، وبالطبع سنلقي نظرة على الكود الحقيقي. إذا كنت تفكر في اختيار لغة لشركتك الناشئة، فهذه المقالة لك.

\n\n

Go: لغة مصممة للتوسع

\n\n

تم تصميم Go في Google عندما واجه المهندسون مشاكل في توسيع نطاق C++ وJava. كانوا بحاجة إلى لغة تجمع بين:

\n\n
    \n
  • أداء اللغة المترجمة (مثل C أو C++)
  • \n
  • سهولة الكتابة (مثل Python أو JavaScript)
  • \n
  • دعم مدمج للتوازي (الغوروتينات والقنوات)
  • \n
\n\n

هذا المزيج بالتحديد جعل Go الخيار الأمثل للشركات الناشئة، حيث يكون وقت الوصول إلى السوق والأداء أمرين حاسمين. تحصل على سرعة C دون الصداع الناتج عن إدارة الذاكرة.

\n\n

قصة النجاح #1: Dropbox — الهجرة من Python إلى Go

\n\n

واحدة من أبرز الأمثلة هي Dropbox. في عام 2014، كانت الواجهة الخلفية الرئيسية لمزامنة الملفات مكتوبة بلغة Python. كان كل شيء يعمل، ولكن عندما نما حجم البيانات إلى البيتابايت، بدأت Python في "التباطؤ".

\n\n

اتخذ فريق Dropbox قرارًا جريئًا: إعادة كتابة المكون الحرج — magic pocket (نظام تخزين الكتل) — بلغة Go. تجاوزت النتائج التوقعات:

\n\n
    \n
  • انخفض استخدام وحدة المعالجة المركزية بنسبة 50%
  • \n
  • زادت سعة النقل بمقدار الضعف
  • \n
  • انخفضت تكاليف البنية التحتية بنسبة 30-40%
  • \n
\n\n

إليك كيف تبدو نسخة مبسطة مما فعلوه — معالجة متوازية لكتل الملفات باستخدام الغوروتينات:

\n\n
package main\n\nimport (\n    "fmt"\n    "sync"\n    "time"\n)\n\n// Block يمثل جزءًا من الملف\ntype Block struct {\n    ID   int\n    Data []byte\n}\n\n// processBlock يحاكي معالجة الكتلة (مثل التشفير أو إزالة التكرار)\nfunc processBlock(block Block, wg *sync.WaitGroup) {\n    defer wg.Done()\n    // محاكاة العمل: 100 مللي ثانية لكل كتلة\n    time.Sleep(100 * time.Millisecond)\n    fmt.Printf("تمت معالجة الكتلة %d. الحجم: %d بايت\\n", block.ID, len(block.Data))\n}\n\nfunc main() {\n    start := time.Now()\n    blocks := []Block{\n        {ID: 1, Data: []byte("كتلة بيانات 1")},\n        {ID: 2, Data: []byte("كتلة بيانات 2")},\n        {ID: 3, Data: []byte("كتلة بيانات 3")},\n        {ID: 4, Data: []byte("كتلة بيانات 4")},\n        {ID: 5, Data: []byte("كتلة بيانات 5")},\n    }\n\n    var wg sync.WaitGroup\n    for _, block := range blocks {\n        wg.Add(1)\n        go processBlock(block, &wg) // ← تشغيل غوروتين لكل كتلة\n    }\n    wg.Wait()\n\n    fmt.Printf("تمت معالجة جميع الكتل في %v\\n", time.Since(start))\n    // الإخراج: تمت معالجة جميع الكتل في ~100ms (بدلاً من 500ms في المعالجة التسلسلية)\n}
\n\n

لاحظ: قمنا بتشغيل 5 غوروتينات تعمل بالتوازي. في Python، كان علينا استخدام asyncio أو multiprocessing، وهو أكثر تعقيدًا. في Go، هذه إمكانية مدمجة.

\n\n

قصة النجاح #2: Uber — الحسابات الجغرافية المكانية في الوقت الفعلي

\n\n

كتبت Uber في البداية الواجهة الخلفية بلغة Python وNode.js. ولكن عندما تجاوز عدد الرحلات في الساعة المليون، بدأ النظام في التعطل. عانى بشكل خاص خدمة Geofence — المسؤولة عن رؤية السائق لأقرب الطلبات.

\n\n

أعادت Uber كتابة هذه الخدمة بلغة Go. وإليك ما حدث

المدونات

توصيات الكتب