اكتب منشور مدونة عن الهندسة الفيروسية لـ Hacker News يلخص الملاحظات الموجودة أسفل --- والتي تتعلق بترحيل فريق Turborepo لقاعدة بيانات Turborepo من Go to Rust ولماذا. ناقش سبب قيام الفريق بإجراء الترحيل بشكل تدريجي وسبب ارتباط ذلك بالفرق الهندسية الأخرى عالية الأداء التي تقوم بأعمال نظام الملفات في مناقشة Rust أو Go. استخدم صوتًا بارعًا ولكن هادئًا.
---

ناثان:

- التنظيمية
 - فريقنا يريد أن يكتب الصدأ. نعتقد أنه أنيق ويجعلنا سعداء. وهذا وحده يعد \*سببًا كافيًا\* للقيام بذلك طالما أنه يتوافق مع الأهداف الأخرى في مؤسستنا.
 - يعد توظيف المهندسين المهتمين بالويب المهتمين بـ Rust أسهل من توظيف المهندسين المهتمين بالويب.
 - نريد العمل مع أفراد Turbopack والبدائيين. إن إنشاء "مكتبة" التعليمات البرمجية الداخلية الخاصة بنا يمنحنا القدرة على تجديف القارب معًا. لدينا احتياجات ومشاكل مماثلة لم تتم معالجتها \*في أي مكان آخر\* ومن المهم أن نعمل معًا كفريق واحد. (اذهبوا سريعًا؟ اذهبوا بمفردكم. اذهبوا بعيدًا؟ اذهبوا معًا.)
- مجتمع
 - هناك اهتمام \*قوي\* بـ Rust من مجتمع JavaScript. وهذا يجعل الوصول إليها أكثر سهولة بالنسبة للأشخاص القادمين من أرض JS-tooling-in-JS، ويتيح مساهمات المجتمع.
 - لقد حظينا بمشاركة قليلة من مجتمع Go في مشاريعنا، ومناسبات قليلة للتفاعل معهم في التعليمات البرمجية الخارجية. ليس الأمر غير متوقع، ولكننا نرغب في بناء مجتمع ونعتقد أنه يمكننا تحقيق النجاح في ذلك في Rust.
- النظام البيئي
 - النظام البيئي Node.js ضخم للغاية. تمت كتابة أي شيء تحتاجه تقريبًا بلغة JS، أو يمكن تشعبه. لقد جئنا من هذا العالم، وهذا هو توقعنا للعمق والاتساع والصيانة.
 - يحتوي نظام Rust البيئي على عدد قليل من القطع الأساسية عالية الجودة الموجودة في \*كل شيء\*. "serde" هو عمل فني. "رايون" رائع. تعمل هذه الأدوات كأدوات أساسية \*تحل\* مساحات المشكلات بأكملها بطريقة متسقة للمجتمع بأكمله.
 - أبحاث الخوارزميات تحدث في Rust، وليس Go. تظهر ألعاب جديدة، وتطبق سمة ما، وهي موجودة في قاعدة التعليمات البرمجية الخاصة بك.
 - لا يمكن اكتشاف نظام Go البيئي بسهولة، ويبدو أنه ميت للغاية. يكتب الناس بانتظام حلولًا لمرة واحدة للمشاكل العامة. معظم أفضل الأشياء هي من تأليف جوجل وتتناسب مع رؤية جوجل للعالم، ولكن ليس بالضرورة وجهة نظر أي شخص آخر.
 - يحتوي نظام Go البيئي على مكتبات مستخدمة بشكل متكرر ولكن تتم صيانتها بشكل سيئ، وهي جزء أساسي من التجربة (على سبيل المثال afero). spf13 "Holowaychuk'd" نظام Go البيئي ثم اختفى (وابتعد مؤخرًا عن Google وGo بالكامل).
 - يقع حاصل "صحة" المكتبات في Go في مكان ما بين JS وRust. ليست جيدة بما يكفي لتكون موثوقة بنسبة 100%، وليست مرنة مثل JS عندما تحتاج إلى حل مشكلة ما.
- C التشغيل المتداخل
 - كلما تعمقت أكثر فأكثر في لغة Go، بدأت تكتشف أن أفضل طريقة للقيام بمهام معينة هي الارتباط بمكتبة لغة C. zstd، libgit2، والتعبيرات العادية، وأكثر من ذلك. وهذا يعني أنه \*حتى بدون اعتماد Rust\*، كنا سنفقد بعضًا من تجربة التطوير التي اكتسبناها في Go.
 - يعمل هذا "بشكل جيد" ولكن النقطة الحقيقية هنا هي أنه بمجرد حصولك على إعداد سلسلة أدوات مترجم لكل هدف من أهدافك لـ CGO، فلن يكون هناك الكثير مما يمنعك من القيام أيضًا بقفزة صغيرة إلى Rust. (بمجرد أن نتمكن من الترجمة باستخدام CGO، يمكننا \*أيضًا\* التحويل إلى `c-archive` وجعل Rust يستدعي كود Go الخاص بنا.)
- الذهاب إلى تصميم اللغة والأولويات
 - تم تصميم Go لتشغيل حوسبة الشبكة في مراكز البيانات. وهو \*يتفوق\* في ذلك. يتمتع النظام البيئي للمكتبات المتوفرة في تلك المساحة بجودة فائقة. "السياق" هو ​​عمل فني.
 - وبالمقارنة، قامت شركة Go بشحن تجريد نظام ملفات للقراءة فقط منذ عامين. لا يزال للقراءة فقط. لماذا؟ أنت لا تكتب إلى أنظمة الملفات في بيئة مركز بيانات (Google).
 - حالة الاستخدام لدينا لا تتوافق مع احتياجات مشرفي Go وحالات الاستخدام. وهذا يؤدي إلى الحاجة إلى طرح (الكثير من الأشياء) الخاصة بنا لأنها ليست من الأولويات التي يجب معالجتها على مستوى اللغة.
 - لا يوجد دعم MSVC.
- تصميم لغة الصدأ وأولوياتها
 - أعطى الصدأ الأولوية للصحة على الراحة. مسارات؟ ليس سهل الاستخدام، لأن البدائي الأساسي ليس سهل الاستخدام. إنها تعيد التعقيد إلى المبرمج للتعامل معه بشكل صحيح. لكننا نهتم بذلك على وجه التحديد في عالم حيث 90% مما نقوم به هو التعامل مع المسار.
 - بشكل عام، نعتقد أنه من الأفضل شحن Rust إلى بيئة معادية مثل صندوق المستخدم بدلًا من Go. يقوم stdlib الخاص بـ Go بـ "محاذاة" الكثير من السلوكيات التي لا يمكن \*في الواقع\* محاذاتها بين الأنظمة الأساسية - وعلى وجه التحديد حول واجهات برمجة تطبيقات نظام الملفات... مرة أخرى، هذا هو المكان الذي نهتم به.
 - قادر على البناء على سلسلة أدوات MSVC.
- رؤية
 - نريد، بالتدفئة الموضعية، غلي محيط JS. (بدءًا من الأماكن التي يتواجد فيها الناس، والانتقال ببطء لغلي المحيط بأكمله.) نريد إجراء حساب تزايدي كامل على طول الطريق من وقت التطوير إلى الإنتاج. نحن نعمل بشكل عكسي من الإنتاج باستخدام Turbopack، ونتقدم من أداة الإنشاء باستخدام Turborepo. التكرار التالي لهذا هو "DAG ذو الحبيبات اللانهائية والذي يتضمن النظام البيئي بأكمله." يبدو أن لا أحد يحاول هذه التفاصيل.
 - النجاح هنا عبارة عن خندق \*ضخم\*، وربما لا يمكن التغلب عليه. بالنسبة للسياق، كنت سأقول نفس الشيء عن مترجمي لغة C، لكن Clang وLLVM فعلوا ذلك على مدار العشرين عامًا الماضية. لكن 20 عامًا هي بمثابة خندق جحيمي، ويمكننا الاستجابة بشكل أسرع بكثير من 20 عامًا للحفاظ على هذا الانفصال.
 - كوننا مشرفين على المجتمع البدائي (في هذه الحالة `turbo`... وهو ما يحدث بعد دمج الريبو/الحزمة) يمنحنا القدرة على دفع النظام البيئي \*بأكمله\* للأمام، وزيادة ما هو ممكن حتى للمحاولة ببطء.
- مستقبل
 - نعتقد أن الصدأ هو المكان الذي تتجه إليه الكرة. نريد أن نساعدها على الوصول إلى هناك، وأن نكون جاهزين عندما يأتي ذلك المستقبل.

نيكولاس:

- أسباب الصدأ
 - أداء
 - غير صالح \*حقًا\* لأن مشكلات الأداء أقل تقييدًا باللغة ومشكلات معمارية متأصلة أكثر.
 - ولكن ربما صحيح؟ من المبكر جدًا معرفة ذلك.
 - النظام البيئي
 - تعد عناصر IMO مثل serde وswc وclap وما إلى ذلك من الأسباب الوجيهة لاستخدام Rust.
 - يحتوي Go على واجهات منفصلة لكل تنسيق نصي (toml، json، yaml، إلخ)
 - القدرة على استخدام البضائع لمشاركة الكود مع أفراد Turbopack
 - التوحيد مع Turbopack
 - يفتح المستقبل لمجموعة كاملة من الأدوات في Rust
 - نسختنا من روما (من الواضح أننا لا نقول ذلك بشكل مباشر) (هل نريد التحدث عن الخطط المستقبلية؟)
 - في النهاية استخدم البنية التحتية للرسم البياني لـ Turbopack (ربما)
 - اذهب المشاكل
 - اذهب ويندوز.
- أسباب ضد الصدأ
 - يبطئ سرعة الشحن
 - لقد قمنا بعمل جيد حقًا في الحد من ذلك. لقد قمنا بإبطاء عملية الشحن لدينا قليلاً ولكننا لا نزال نقوم بعمل رائع في نقل مستخدمينا الحاليين والحفاظ عليهم.
 - قيود النظام البيئي
 - المكتبات المتلألئة لا تزال في حالة من الفوضى. لن يتطابق مع سلوك JS المتلألئ
 - صعوبة تحديد الممارسات القياسية
 - سيكون لديك كود أقل من المثالي.
 - حكم اليتيم ستعضك.
 - التوظيف ليس بالأمر الصعب، ولكن أكبر مطور Rust يمكنك العثور عليه سيكون لديه ما يقرب من 5 سنوات من الخبرة في Rust، كحد أقصى.
 - من السهل جدًا إلقاء الدراجة باستخدام وحدات الماكرو والسمات والأنواع غير التقليدية وإعادة البناء وما إلى ذلك.
 - فقط لأن Rust يسمح لك بإعادة البناء بسهولة لا يعني أنه ينبغي عليك ذلك.

جريج

توحيد بعض النقاط المسروقة بلا خجل من الأعلى

- إيجابيات الصدأ
 - JS ↔ Rust interop هي قصة جيدة من الناحية الفنية والمجتمعية
 - الصدأ ↔ C قصة جيدة، ونستخدم بعض الأدوات المكتوبة بلغة C
 - ينمو الصدأ في Vercel ومع NextJS على وجه التحديد
- اذهب السلبيات
 - نظام Go البيئي هو كل شيء أو لا شيء. بمجرد أن تحتاج إلى الاستفادة من الوظائف غير المكتوبة في Go، ستفقد الكثير من فوائد تواجدك في Go. ما نخسره:
 - إنشاء ثنائي ثابت سهل عبر الأنظمة الأساسية
 - سرعة التجميع (لا تزال أفضل من الصدأ)
 - كتابة التعليمات البرمجية المحمولة أمر صعب \*و\* ليس محور اهتمام النظام البيئي.
 - دعم التجميع المشروط أساسي
 - واجهات برمجة التطبيقات ذات الصلة بالمنصة هي إما القاسم المشترك الأقل أو تم تزويرها لتبدو وكأنها مشتركة بين الأنظمة الأساسية
 - عدم التوافق مع أولويات المجتمع
 - يبدو أن مجتمع Go يركز على كونه أفضل أداة لكتابة خادم RPC.
 - يعد "السياق" وgoroutines من العناصر الأولية الرائعة للعمل على نطاق الطلب ضمن عملية طويلة الأمد.
 - يعد إعداد خادم HTTP وتشغيله أمرًا سهلاً، كما أن GRPC وprotobuf ليسا أصعب كثيرًا.
 - غالبًا ما يكون المقصود من هذه البرامج التشغيل على نظام أساسي واحد، أو لا تتفاعل بشكل كبير مع النظام الأساسي المضيف، لذا فإن سير العمل مثل التطوير على نظام macos والنشر على نظام Linux هو المسار السعيد المباشر.
 - التفاعل مع النظم البيئية الأخرى ليس أولوية.
 - `turbo` عبارة عن أداة CLI مشتركة بين الأنظمة الأساسية تتفاعل بشكل كبير مع نظام الملفات المحلي وشجرة العمليات.
 - بعض أفضل الأدوات لتفاعلات نظام الملفات مكتوبة بلغة C، لذا يعد التشغيل المتداخل أمرًا مهمًا
 - توجد اختلافات بين الأنظمة الأساسية المختلفة، ونحن كمطورين نحتاج إلى ظهور تلك الاختلافات لنا حتى نتمكن من التعامل معها بشكل مناسب.
 -

ملاحظات أنتوني من التحدث إلى جريج:

- لا يتعلق الأمر بالضرورة بميزات اللغة، فلنفتح آفاقًا جديدة
- المزيد حول ما نقوم بتنميته لا يتوافق مع المشكلة التي نحاول حلها
- يعد Go مفيدًا لـ RPCing وخوادم الويب وهذا ما يهتم به النظام البيئي
 - سوف يكذب عليك تطبيق Go بشأن الاختلافات المحددة في النظام الأساسي (النظام البيئي وعقلية المجتمع)
- نريد تفاعلًا جيدًا مع JS، وتفاعلًا مع أنظمة التشغيل، والأشياء الخاصة بالمنصة
- يقضي مجتمع JavaScript وقتًا في تعلم Rust الآن
- تعتبر عناصر التألق والأداء أمرًا رائعًا، فهي ميزات خاصة باللغة
-
{"source": "ewof/sharegpt-instruct-unfiltered-deduped", "kind": "human", "evolved_from": null}