Uploaded avatar of xavdid

تأملات حول #12in23 من شخص أكملها

@xavdid
منذ أكثر من سنتين

نُشر هذا المقال في الأصل على موقع David ويُعاد نشره هنا بإذن

في يناير الماضي، أعلنت Exercism عن برنامج جديد يُدعى 12in23، دعت فيه المشاركين إلى تجربة 12 لغة برمجة جديدة خلال عام 2023. وكان لكل شهر موضوع خاص (مثل «أبريل التحليلي» أو «أكتوبر الكائني»)، ويُسلّط الضوء على لغات معيّنة لتجربتها. أنا أحب تعلّم الأشياء الجديدة، وقد صرتُ مهووسًا نوعًا ما بلغات (البرمجة)، فقرّرت أن أخوض التجربة. 12 لغة في 12 شهرًا!

والآن وقد أوشك العام على الانتهاء، أنا سعيد للغاية بما آلت إليه التجربة. نجحت في تجربة 12 لغة جديدة، وتعرّفت على أشخاص رائعين في مجتمع Exercism، وقدّمت في الطريق بعض المساهمات الممتعة في المشاريع مفتوحة المصدر! وفي هذا المقال أستعرضها جميعًا وأتحدّث عمّا استفدته من كل واحدة منها.

اختيار اللغات

وضعت لنفسي بعض الإرشادات لهذا العام لأستفيد من التجربة قدر الإمكان:

  1. أن تكون اللغات جديدة عليّ تمامًا، أو على الأقل غير مألوفة بما يكفي لأشعر أنني أتعلّم الكثير.
  2. أن تكون اللغات المختارة (محتملة) الفائدة عمليًا لأتعلّم المزيد منها مستقبلًا. كان هذا المشروع للمتعة فقط، لكنني أريد أن أقضي وقتي في تعلّم أشياء مفيدة (جزئيًا على الأقل).
  3. أن أُثبّت كل الأدوات المحلية وإضافة VSCode لكل لغة أستخدمها. أردت أن أقارن بين اللغات على أرضية متكافئة تقريبًا، مع أكبر قدر ممكن من تلميحات الأنواع والإكمال الذكي. في الجامعة، كتبت كل واجباتي البرمجية في Sublime Text دون أي فحص للكود أو إكمال تلقائي. كنت أخشى أنني إن تعلّمت البرمجة وأنا أستخدم كل هذه الأدوات، فسأعتمد عليها أكثر من اللازم ولن أصبح مبرمجًا جيدًا. لكن حدث العكس تمامًا. فكلما زاد ما أستطيع تفويضه من التفكير إلى أدواتي، زاد ما أستطيع التفكير فيه في المسألة التي بين يديّ. لا تحفظ الأشياء، بل احفظ كيف تجدها.

لنبدأ!

يناير (بلا موضوع)

عندما بدأ يناير، كان فريق Exercism لا يزال في طور اختيار موضوعات الأشهر، فكانت لغة ذلك الشهر متروكة لاختياري. وبما أنه لم يكن هناك توجيه، استهللت العام بلغة Go. كنت قد أخذت دورة مكثّفة فيها في منتصف 2022، لكنني لم أستخدمها كثيرًا منذ ذلك الحين ولم أشعر بأي إتقان لها.

Go لغة مثيرة للاهتمام. فمُصرّفها الصارم يعني أن برنامجك سيكون صحيحًا، ولن تتحرّك قيد أنملة حتى يرى أنك بأمان.1 وطريقتها المُسهبة في معالجة الأخطاء تعني أنك لا تُفاجأ أبدًا (لكن على حساب كتابة if err != nil { return err } مرات ومرات). وهي بارعة في جعل الأمور الصعبة سهلة (مثل التوازي عبر القنوات)، لكنها أيضًا تجعل بعض الأمور السهلة صعبة (التعامل مع السلاسل النصية). ولديها مكتبة قياسية قوية، ما يعني أنك تستطيع إنجاز معظم المهام دون وحدات من أطراف ثالثة. يعجبني أن جزءًا كبيرًا من منظومتها (التنسيق، والتثبيت، والبناء، وغيرها) من تطويرها هي ومدمج في أمر go. للغة منتقدوها، لكنني أعتقد أنها تنجح إلى حد كبير في تحقيق هدفَيها: الصحة وقابلية الصيانة.

لم أستمتع باستخدامها لدرجة أن أجعلها خياري الأول، لكنها أداة رائعة لأحتفظ بها في حزام أدواتي للبرامج الحساسة للأداء، مثل عرض المسار المتشعّب في موجّه الصدفة.

فبراير الوظيفي

قفز فبراير مباشرة إلى العمق مع اللغات الوظيفية، وهي فرع ذو نزعة رياضية من لغات البرمجة الأمرية الأكثر شيوعًا. تشتهر اللغات الوظيفية بدوالها «النقية» (التي لا آثار جانبية لها). اخترت Elixir، أساسًا لأن صديقي Caleb استخدمها في Advent of Code ويُثني عليها كثيرًا.

استمتعت كثيرًا بوقتي مع Elixir. فهي مستوحاة من Ruby (وهذا منطقي، فمبتكرها José Valim كان من المساهمين الأساسيين في Rails). وجدت أنه من السهل التعبير عن المفاهيم الوظيفية مثل تسلسل الطُرق. وأحببت كل السكر النحوي الذي جعل ذلك سهلًا، مثل عامل الأنبوب (|>):

foo(bar(baz(new_function(other_function()))))
# becomes
other_function() |> new_function() |> baz() |> bar() |> foo()

كانت أيضًا أول مرة أعمل فيها مع الماكروز، أي الكود الذي يكتب الكود. ولأن برامج Elixir يمكن التعبير عنها في شجرة النحو المجرّدة (AST) هي نفسها كود Elixir صالح، فمن السهل كتابة كود يُنتج كودًا صالحًا آخر. هذا مفهوم رائع حقًا جعلته Elixir سهلًا. كما أعجبني أسلوب مطابقة الأنماط الذي تتبعه الدوال وفق شكل وسائطها، بحيث يمكن توجيه استدعاءات الدوال إلى التطبيق المناسب:

defmodule TuplePrinter do
  def print({a}) do
	IO.puts("single")
	IO.puts(a)
  end

  def print({a, b}) do
	IO.puts("double")
	IO.puts(a)
	IO.puts(b)
  end
end

TuplePrinter.print({1})
TuplePrinter.print({2, 2})

# single
# 1
# double
# 2
# 2

يبدو أنه من الميزات التي إما أن تكون رائعة وإما أن تجعل كودك فوضى متشابكة. في الحالتين، كان مفهومًا رائعًا!

تستفيد Elixir أيضًا من عملها داخل آلة BEAM الافتراضية الخاصة بـ Erlang، ما يمنحها منظومة كبيرة للتواصل معها. وهي بارعة في التزامن، وهي جوهر إطار Phoenix للويب المحبوب.

ومع أنني لا أحتاج إلى استخدام Elixir الآن، وجدت العمل بها ممتعًا حقًا، وهي بلا شك شيء أرغب في العودة إليه. إضافة إلى ذلك، كان تحديًا مثيرًا للاهتمام أن أعالج مسائل مألوفة بطرق غير مألوفة (أي تكراريًا).

مارس الميكانيكي

ركّز مارس على لغات «النظم»، التي تُصرَّف إلى كود الآلة.

من بين الخيارات، كانت Go اللغة الوحيدة التي أثارت اهتمامي.2 الآن، سيلاحظ القارئ الفطِن أنني خصّصت شهرًا كاملًا لـ Go من قبل، فإعادة استخدامها لن تُحتسب ضمن الـ 12. حسنًا، عندما اخترتها لشهر يناير لم يكونوا قد أعلنوا الموضوعات بعد، فلم أدرك أنني أحشر نفسي في زاوية.

لو كنت أعلم أن Bun قادم لكنت جرّبت Zig على الأرجح، لكنني للأسف لم أستطع (بعد) رؤية المستقبل. وهكذا، من دون خيار أكثر إغراءً، اكتفيت بشهر إضافي من Go على أساس أنني سأضطر إلى تكرار لغة في وقت لاحق من العام.

أبريل التحليلي

كان أبريل مخصّصًا للغات الشائعة في علم البيانات. كنت أعرف Python جيدًا، وقد درست R في حصة إحصاء في الجامعة (ولم أستسغها)، فاخترت Julia!

استمتعت بوقتي معها، ولعل السبب في ذلك أنها بدت شديدة الشبه بـ Python. كان الأمر مقلقًا بعض الشيء، مثل أن تكون أمريكيًا في كندا. كل شيء يبدو مألوفًا جدًا، لكنه مختلف قليلًا فقط على نحو يصعب تحديده. وفجأة يعرض عليك أحدهم عملة من فئتين (أو دالة شديدة الملاءمة لإجراء حسابات المصفوفات)، فتدرك أنك لم تعد في أرضك المألوفة.

أكثر ما لفت انتباهي كان نظام الأنواع في Julia. فكان يُوسَم (اختياريًا) مثل نظام الأنواع في Python، لكنه يتضمّن فحوصًا وقت التشغيل تضمن مطابقة الوسائط لأنواعها المُعلنة. أرى أن نظام Python يحقّق التوازن الصحيح بين التكامل مع الأدوات وعدم إعاقتك، لكنني أعترف أن أخطاء وقت التشغيل في Julia عند تمرير أنواع خاطئة للدوال كانت مفيدة هي أيضًا.

في النهاية كانت Julia لطيفة، لكنني لا أتوقع أن أحتاجها مستقبلًا.

مايو المغيّر للتفكير

شدّد مايو على فكرة «جرّب شيئًا جديدًا» بتسليط الضوء على لغات تفعل أشياء غير معتادة تمامًا. فانتهزت الفرصة لتجربة Rust الشديدة الشعبية. ويجب أن أقول إنني أتفهّم هذا الضجيج.

ومع أن مدقّق الاستعارة سيئ السمعة يحتاج بلا شك إلى تعوّد، أعجبني كونه يجعلني أفكّر في برامجي بعناية أكبر. كان المصرّف صارمًا بلا شك، لكن رسائل الأخطاء كانت تتجاوز المطلوب في مساعدتي على إصلاح المشكلات. لن أقول إنني كنت منتجًا بشكل خاص في أسبوعي الأول، لكنني أشعر أنني أستطيع على الأقل رؤية قمة منحنى التعلّم.

ويستحق cargo، مدير حزم Rust، ذكرًا خاصًا. ومع أنني لم أثبّت أي حزم من أطراف ثالثة، كانت وظائف البناء والاختبار والتنسيق فيه ممتازة. وينطبق الشيء نفسه على إضافة VSCode، التي وفّرت كل المزايا التي أتوقعها من لغة ذات أنواع ثابتة مثل Rust. فتجربة المطوّر الجيدة تُحدث فرقًا حقيقيًا بالفعل.

ومع أنهما مختلفتان تمامًا على مستوى التنفيذ، أحسست أن Rust تشبه Go في الغرض الذي سأستخدمهما من أجله: جعل البرامج تعمل بسرعة كبيرة. بدأت العديد من الأدوات المكتوبة بلغات أستخدمها بانتظام تتّجه إلى Rust من أجل خصائص أدائها، لذا أتوقّع رؤيتها أكثر في المستقبل (حتى لو لم أكن أكتب Rust بنفسي).

صيف تعبيرات S (يونيو)

كان يونيو شهر تعبيرات S، وهي صيغة نحوية شائعة في لغات ليسب. اخترت Clojure، وهي لغة وظيفية تعمل على آلة Java الافتراضية (JVM).

كنت قد كتبت قليلًا من Clojure قبل سنوات عديدة. كنت حديث التخرّج، وأصبحت المشرف الوحيد على سكربت يومي بالغ الأهمية في أول وظيفة لي. وغني عن القول إن ذلك كان وقتًا عصيبًا. كنت فضوليًا لأرى إن كانت أكثر سهولة الآن بعد أن كبرت وصرت أحكم.

ويسعدني أن أقول إنها كانت كذلك! فقد ساعدتني التجربة الوظيفية في فبراير على التفكير بشكل تكراري، ولم تكن الصياغة النحوية بذلك السوء حين تتعمّق فيها. كما سيكون توافقها مع الآلة الافتراضية JVM مفيدًا لو كنت أستخدمها في مشروع أكبر.

لا أرى نفسي أستخدم Clojure لأي غرض ما دامت هناك بدائل متاحة، لكنها لم تكن تجربة سيئة تمامًا.

مهمة جانبية: أداة Universal Test Runner!

لسنوات، استخدمت دالة bash صغيرة لتشغيل اختبارات الوحدة في المجلد الحالي. وبينما كنت أعمل بهذه اللغات الجديدة كلها، وجدت نفسي أضيف إليه أسطرًا للراحة؛ فتذكّر تشغيل t كان أسهل بكثير من إعادة تعلّم أمر الاختبار الخاص بكل لغة مرارًا وتكرارًا.

ولأن المنطق المطلوب تجاوز مستوى راحتي مع bash، خصّصت بعض الوقت في يونيو وفصلت المشروع في كيان مستقل: أداة Universal Test Runner.

شاركته في منتدى Exercism ولقي استقبالًا جيدًا. أعجبهم إلى حد أننا قرّرنا بناء وظائف مشابهة داخل واجهة Exercism لسطر الأوامر نفسها (المكتوبة بـ Go، وهو موضوع كنت قد حدّثت معرفتي به لحسن الحظ). وهكذا، في النصف الثاني من العام، أصبحت أستطيع تشغيل exercism test لتشغيل مجموعة الاختبارات الخاصة بلغة ذلك الشهر (وهو أمر مدعوم أصلًا في أداة Universal Test Runner).

وإذا أردت معرفة المزيد عن هذه العملية، فقد كتبت عنها بتفصيل أكبر بكثير عند إطلاقها.

على أي حال، لننتقل إلى ما بعده!

يوليو الجوراسي

استعرض يوليو لغات قديمة. وكانت الخيارات العملية هذا الشهر شحيحة نوعًا ما. بدأت بـ COBOL العريقة لأنني سمعت أنها لا تزال تدير قدرًا كبيرًا من البنية التحتية الحيوية. لكن، مع اقتراب حفل زفاف في مطلع أغسطس، لم يكن لديّ الوقت الكافي للجلوس وتعلّم لغة بهذا القدر من الاختلاف عن لغاتي. فبدلًا من ذلك، انتقلت إلى Visual Basic بوصفها أقل الخيارات سوءًا.

لا يوجد الكثير لأقوله هنا. بدت اللغة مُسهبة قليلًا لكن استخدامها سهل بما يكفي. وفهمي أنها صُمّمت أساسًا لتطوير واجهات المستخدم على Windows، لذا فإن حل التمارين الصغيرة يجعل من الصعب تكوين صورة جيدة عنها.

أغسطس التطبيقات

كان أغسطس غاصًّا باللغات التي تُبنى بها التطبيقات. ولم يكن مفاجئًا أن تكون الخيارات كثيرة هذا الشهر. اخترت Swift. وبصفتي شخصًا يستخدم الكثير من منتجات Apple، فإن لغتهم المصمّمة خصيصًا وثيقة الصلة بي. لم أكن جديدًا عليها تمامًا؛ فقد نشرت تطبيق iOS واحدًا في 2016 مكتوبًا بـ Swift بالكامل. لكنني لم ألمس اللغة منذ ذلك الحين، وقد تطوّرت كثيرًا، فرأيت أنها ما زالت تُحتسب.

فوجئت بسرور بمدى سهولة العمل بها. وعلى النقيض من كثير من اللغات الأخرى هنا، فإن Swift جديدة نسبيًا. صدرت أول مرة في 2014، ومن الواضح أنها استفادت من دروس التصميم اللغوي الحديث. فلديها مدير حزم من تطويرها، وتشغيل اختياري للتسلسل، ودوال من الدرجة الأولى، وتضمين نصي معقول للسلاسل النصية. أحسست أنها مريحة في القراءة والكتابة، حتى دون استخدام Xcode.

ومع كل ذلك، فإن Swift مفيدة في الغالب في سياق تطبيقات منصات Apple، وهي تطبيقات لا أكتبها حاليًا. ومع أنها نجحت جيدًا في التمارين، لا أتوقع العودة إليها قريبًا. لكنني أحب حقًا أنني أستطيع كتابتها على iPad!

سبتمبر المُقتضب

استكشف سبتمبر اللغات شديدة الإيجاز أو الصغيرة. اخترت jq، وهي أداة استخدمتها وأحببتها لسنوات.

غير أنني كنت أراها دائمًا مجرد أداة للتعامل مع JSON، لا لغة برمجة عامة الأغراض. فوجئت بسرور عندما رأيت أنها تمتلك كل المقوّمات المعتادة (الدوال، والمتغيرات، والحلقات، وغيرها)، حتى إنني استطعت كتابة برامج معقّدة إلى حد ما:

# input: { "series": "1", "sliceLength": 1 }
. as {series: $series, sliceLength: $sliceLength} |
if
  $series == "" then
	"series cannot be empty" | halt_error
  elif $sliceLength > ($series | length) then
	"slice length cannot be greater than series length" | halt_error
  elif $sliceLength == 0 then
	"slice length cannot be zero" | halt_error
  elif $sliceLength < 0 then
	"slice length cannot be negative" | halt_error
  else
	.
end
| [range(0; $series | length)]
| map($series[. : . + $sliceLength])
| map(select(. | length == $sliceLength))

كان من الممتع تجربة كل ميزات jq التي لم أحتجها يومًا في عمليات تحويل البيانات البسيطة. ومع أن الأدوات هنا كانت ناقصة بعض الشيء (لا تكامل مع المحرّر، وغير ذلك)، فإن الفهم الأعمق لاتساع وظائف jq كان ذا قيمة.

تحديث: لفت DJ Adams على Mastodon انتباهي إلى مشروع jq-lsp وإضافة VSCode المقابلة له. فوّتت الفرصة هذه المرة، لكنني سأطّلع عليه في المستقبل.

أكتوبر الكائني

تعمّق أكتوبر في اللغات الكائنية التوجّه. ولديّ ضعف خاص تجاه التصاميم الكائنية، فهي تحاكي عن قرب الطريقة التي أتصوّر بها البرامج في ذهني. اخترت Ruby، وقد يبدو ذلك خيارًا غريبًا.

أعمل في Stripe، موطن أكبر قاعدة كود Ruby في العالم. فمن المؤكد أنها لن تُحتسب لغة «غير مألوفة»؟ ومع أن كل ذلك صحيح، فإن نظام Ruby المترابط الضخم لدينا يبدو بعيدًا جدًا عن Ruby «القياسية»: فكل شيء يُفحص أنواعه بـ Sorbet، وهناك قدر هائل من توليد الكود، ونقوم بالكثير من السحر لجعل كل شيء يعمل معًا ويتوسّع. ومع أن Ruby داخل Stripe وخارجها هي اللغة نفسها في النهاية، فإن العمل على هذا التباين الهائل في الحجم يوفّر تجارب مختلفة اختلافًا واسعًا؛ فأردت أن أعرف كيف تكون الحياة في الخارج (خلال السنوات التي تلت استخدامي المكثّف لـ Ruby).

وكانت التجربة جيدة في معظمها! فـ Ruby نفسها رائعة، وتذكر «سعادة المبرمج» هدفًا رئيسيًا لها، وهو ما لامسني. يعجبني أنني كثيرًا ما أستطيع تخمين اسم دوال المكتبة القياسية التي لم أستخدمها من قبل. ويعجبني كيف أن بناء الكود الوظيفي سهل، وكيف أن الصياغة مريحة ومعبّرة.

ومع ذلك، فوجئت بمدى تأخّر أدوات المطوّرين فيها عن Python. ربما دُلّلت كثيرًا، لكن وجود تلميحات الأنواع داخل المحرّر، والحصول على فحص وتنسيق سريعين للغاية، أهم بالنسبة إليّ مما كنت أدرك. وبالنسبة إلى لغة بلغت شعبية Ruby في ذروتها، فوجئت بمدى تأخّرها في هذا الجانب.3 كما لم أعتد تمامًا على الأقواس الهلالية الاختيارية في استدعاءات الدوال، وهو ما جعل تمرير الدوال كوسائط أقل سهولة.

لا تزال Ruby لغة رائعة وسأستمر في استخدامها في العمل، لكنها لا تفعل لي شيئًا لا تفعله Python، على الأقل في الوقت الحالي.

نوفمبر النِبِل

كان نوفمبر أصعب شهر حتى الآن: لغات التجميع. ومع أنه لم يعد شائعًا كتابتها يدويًا، فهو موضوع مفيد ومثير للاهتمام أن تكون على دراية به. اخترت WebAssembly لأهميتها للويب الحديث والمستقبلي. ومع أنها تُستخدم عادة كهدف للتصريف (وليست شيئًا تكتبه يدويًا)، فإن هناك أدوات من أجل المهووسين بيننا.

أحسست أنني مستعدّ لهذا الشهر أكثر مما توقّعت. فبدت الصياغة النحوية وكأنها من Clojure، وبدا هيكل اللغة وكأنه من لعبة TIS-100 من إنتاج Zachtronics. واستمتعتُ بشكل غريب باضطرار بدء كل عملية من الصفر؛ كان ذلك طريفًا. سأكره ذلك لو اضطررت إلى إنجاز شيء فعلي بهذه الطريقة، لكنه كان تحفة مسلّية في الوقت الحالي. وبتعليقات سخية، استطعت كتابة شيء شبه مقروء:

(module
  (func (export "eggCount") (param $number i32) (result i32)
	(local $res i32) ;; result
	(local $remainder i32) ;; loop counter

	(loop $loop

  	;; $res =
  	(local.set $res
    	;; $res +
    	(i32.add
      	(local.get $res)
      	;; $number % 2
      	(i32.rem_u
        	(local.get $number)
        	(i32.const 2)
      	)
    	)
  	)

  	;; $number //= 2
  	;; (keep on stack)
  	(local.tee $number
    	(i32.div_u
      	(local.get $number)
      	(i32.const 2)
    	)
  	)

  	;; this will keep looping until remainder is 0
  	br_if $loop
	)

	local.get $res
  )
)

كانت أكبر عقبة هي نقص التوثيق والموارد. حتى معرفة الدوال العامة المتاحة كان صعبًا. لكن بما أنني لن أستخدم هذا فعليًا، فلم يزعجني الأمر كثيرًا بعد أن انطلقت.

اختتم ديسمبر العام بلغات لم تندرج في الفئات الأخرى. ولأنني كرّرت لغة في مارس، احتجت إلى إتمام لغتين هذا الشهر.

بدأت بـ Wren. ابتكرها Bob Nystrom، المشهور من بين أمور أخرى بكتاب Crafting Interpreters. أسرني اهتمامها بالتفاصيل، وصغر حجمها، وتصميمها من الأعلى إلى الأسفل؛ فكل شيء يبدو مدروسًا بعناية. ويتجلّى هذا المستوى من العناية في تفاصيل نطاق المتغيرات وقواعد الخصوصية. فمصرّفها صغير ومشروح بكثافة، لذا فهو مصدر تعليمي رائع إن كنت مهتمًا بتنفيذ اللغات.

Wren خشنة قليلًا عند الأطراف وتبدو مهجورة في معظمها، لكنني أرى أن ذلك مقبول في لغة للتجارب. لا أحد يقبل عليها متوقعًا جاهزية للإنتاج. ومن المؤكد أن هناك مكانًا في هذا العالم للغات غير المخصّصة للإنتاج.

وأيضًا: Lua

كان اختياري الثاني هذا الشهر Lua. وعلى النقيض من Wren، فهي عملية للغاية. وسهولة تضمينها تعني أنها تظهر في أماكن كثيرة، مثل برمجة Redis النصية وإضافات Factorio. احتاج نموذجها الكائني بعض التعوّد، لكنني أرى كيف سأصبح منتجًا بسرعة. وتعلّقت سريعًا بالجداول بوصفها بنية تفعل كل شيء. كانت الأدوات جيدة: فقد عمل مدير الحزم من دون أي إعداد، ودعمت إضافة VSCode تلميحات الأنواع المعتمدة على التعليقات من دون عناء.

ومع أنه ليس لديّ شيء أحتاج Lua إليه فورًا، فهي أداة رائعة أخرى لأحتفظ بها في صندوق أدواتي بسبب استخدامها الواسع.

خلاصة التجربة

استمتعت بهذه الجولة بين اللغات أكثر مما توقّعت. ولم أتعلّم بعض المهارات العملية الجديدة فحسب، بل أشعر أن آفاقي اتّسعت تمامًا.

أما عن الخطوة التالية، فأظنها تعلّم المزيد من Rust. فأهميتها في مشهد أدوات المطوّرين واضحة في هذه المرحلة، وأريد أن أتأكد من قدرتي على قراءة الأشياء التي أعتمد عليها والمساهمة فيها.

ليس في ذهني ناتج محدّد، لكن لديّ كتاب Rust كامل لأقرأه، ودورة Rust لمطوّري JS سدّدت نفقاتها في أحد الأعوام، ومسار كامل على Exercism لإتمامه. أودّ المساهمة في مشروع مفتوح المصدر واحد على الأقل (على الأرجح Just، وهو برنامج جديد من المفضّلات لديّ)، لكن لنرَ إلى أين يأخذني العام.

إلى ذلك الحين، عطلة سعيدة، وأتمنى لك بقية عام 2023 طيبة!

  1. المتغيرات غير المستخدمة خطأ من المصرّف؟! أعني، بحقّك! ↩

  2. في الواقع جرّبت C++ أولًا (ولم أكن قد كتبتها منذ الجامعة). لكنها لم تكن ممتعة، فتركتها. ↩

  3. هذا جانب آخر يختلف فيه Ruby «الحقيقية» عن تجربتي داخل Stripe، فأنا سعيد بأنني جرّبتها بالطريقتين. ↩

5 يناير، 2024 · هل وجدته مفيدًا؟