يعرضني كل يوم لأنواع مختلفة من هياكل البيانات والخوارزميات. تعلمت التعامل مع
تضمنت بعض المشكلات هياكل أكثر تعقيدًا مثل القوائم المرتبطة والأشجار الثنائية، بينما قام البعض الآخر بإدراج مصفوفات / مصفوفات n-D في المزيج، مما سمح لي بالتعامل في مساحات متعددة الأبعاد.
تنوع المشاكل جعلني متيقظاً. لقد عرّفتني المشكلات الموجودة في مسار 30 يومًا من JavaScript الخاص بـ LeetCode على أساسيات مثل
أخذ مسار Top Interview 150 من LeetCode الأمور خطوة إلى الأمام، حيث ألقى بي بين مشاكل متفاوتة الصعوبة والنهج. كان حل واحد على الأقل من هذه المشكلات كل يوم أمرًا لا يقدر بثمن. لقد تحدتني هذه المشكلات أيضًا للتفكير كثيرًا في التحسين وكيف يمكن أن تؤثر الأساليب المختلفة بشكل كبير على وقت التشغيل وكفاءة الذاكرة.
لقد تلقيت أيضًا دروسًا في Structy جنبًا إلى جنب مع هذه التحديات لتعزيز فهمي للمفاهيم الأساسية. لقد تعلمت طرقًا أكثر فعالية للتعامل مع بعض هياكل البيانات، مثل الأقسام الموجودة في القوائم المرتبطة والأشجار الثنائية. لقد أقدر بشكل خاص النهج الديناميكي الذي تتبعه المنصة في التدريس وحل المشكلات بطريقة تجعلها سهلة الهضم. إنها منصة رائعة لتعلم DSA على مستوى أساسي جدًا ثم ترجمة هذا الفهم إلى مشكلات البرمجة الأخرى التي أواجهها.
مع مرور الأيام، واجهت العديد من أنواع أساليب الحلول، وتقنيات حل المشكلات مثل
لقد وجدت أسلوب المؤشرين طريقة مباشرة وفعالة لحل المشكلات التي تتضمن تسلسلات (المصفوفات والسلاسل في المقام الأول)، عن طريق تقليل مساحة البحث للحصول على حلول أكثر كفاءة. لقد استخدمت أيضًا الخوارزميات الجشعة حيث كنت بحاجة إلى اتخاذ الخيارات المثلى محليًا في كل خطوة.
كانت تقنيات النافذة المنزلقة بمثابة لفتة نظر أخرى - كانت صعبة في البداية، ولكنها ذات قيمة للمشكلات التي تتضمن المصفوفات الفرعية أو السلاسل الفرعية؛ المشاكل التي تتطلب تتبع نطاق متحرك من العناصر ضمن تسلسل. تعد خرائط التجزئة وجداول التجزئة رائعة بالنسبة لأزواج القيمة الرئيسية في المشكلات التي تتضمن عمليات بحث متكررة.
كانت البرمجة الديناميكية من أكثر التقنيات تعقيدًا التي عملت بها. في وقت مبكر، وجدت أن DP أمر مخيف جدًا نظرًا لصعوبة التعرف على المشكلات الفرعية المتداخلة، ولكن مع تكرار التعرض للحفظ أصبح أفضل صديق لي في تحسين المكالمات المتكررة.
بالإضافة إلى مشكلات DSA الأساسية، أتيحت لي أيضًا الفرصة لتجربة مفاهيم JavaScript أكثر تقدمًا. لقد كتبت وظائف مجمعة، وتعلمت كيفية التحكم في تدفق التعليمات البرمجية الخاصة بي وتوسيع الوظائف لمتطلبات محددة. حتى أنني تعلمت ضبط مؤقتات على الوظائف مما يسمح لي بالتعامل مع العمليات الحساسة للوقت أو تحديد عدد المرات التي يمكن فيها تنفيذ وظائف معينة.
أظهر لي العمل مع النماذج الأولية أنه يمكن التعامل مع أنواع البيانات بما يتجاوز قدراتها المضمنة عن طريق إنشاء طرق مخصصة. لقد سمح لي هذا بتوسيع الوظائف المضمنة في أنواع البيانات مثل الكائنات والمصفوفات بطرق جديدة. لقد أدركت أهمية كتابة تعليمات برمجية نظيفة وموحدة.
لقد تعلمت أيضًا الحفظ، وهي تقنية يمكنك من خلالها تعديل دالة بحيث تقوم بتخزين الوسائط التي تم استدعاؤها مسبقًا مع نتائجها! هذا نوع من التخزين المؤقت الذي يساعد على تحسين الأداء في المشكلات التي توجد فيها استدعاءات متعددة لنفس الوظيفة. لقد كتبت عن حل Memoize الذي تفوق على 99% (الذاكرة) هنا: Memoize Intutitive Solution يتفوق على 99% من الذاكرة.
الشيء الآخر الذي بدأت في إيلاء المزيد من الاهتمام له خلال هذه الرحلة هو تحسين الكود الخاص بي. بعد مقدمة مناسبة لتدوين Big-O على Structy، فهمت أهمية تعقيد الزمان والمكان وتعلمت التقنية المثالية لمعظم المشكلات الشائعة. في نهاية مسار تحدي HackerRank، تعلمت أيضًا اختبار التعليمات البرمجية باستخدام الفئات وكتابة الأدوية العامة.
بحلول الوقت الذي أكملت فيه تحدي 30 يومًا من البرمجة، شعرت بإحساس عميق بالنمو. لقد أدى ذلك إلى تحسين قدرتي على التعامل مع مجموعة واسعة من المشكلات وتعميق فهمي لجافا سكريبت وDSA. أكثر من مجرد حل المشكلات، كانت هذه الرحلة التي استغرقت شهرًا بمثابة تذكير لنفسي بأنني أستطيع حقًا بذل هذا الجهد. بعد رؤية فوائد الاتساق والانضباط، تم تجديد عقليتي للتعامل مع أي تحدٍ بثقة وبمجموعة أدوات قوية من التقنيات.
تمثل هذه التجربة علامة فارقة في رحلتي البرمجية. لا شك أن المهارات التي اكتسبتها خلال هذه الأيام الثلاثين ستستمر في مسيرتي المهنية كمهندس برمجيات.
أنا فخور بي لأنني بذلت هذا الجهد، وممتن لأصدقائي الذين شجعوني وقدموا دعمهم وحكمتهم طوال التحدي.
في شهر سبتمبر من هذا العام، شرعت في تحدي 30 يومًا من البرمجة الذي فرضته على نفسي، وهو الالتزام بحل مشكلتين على الأقل في هياكل البيانات والخوارزميات (DSA) كل يوم. كان هدفي هو إخراج نفسي من منطقة راحتي، وبناء الاتساق، وتحسين مهاراتي في حل المشكلات ومنطق البرمجة.
لم ألتزم بمنصة واحدة فقط - لقد أكملت تحدي HackerRank's 30 Days of Code، وخطة LeetCode's 30 Days of JavaScript، كما تعاملت مع مسار LeetCode's Top Interview 150، وهو عبارة عن مجموعة من 150 مشكلة نموذجية في المقابلة لأي شخص يستعد لـ مقابلة الترميز. بالإضافة إلى ذلك، أخذت بعض الدروس حول Structy لتعزيز فهمي لمفاهيم DSA.
لقد قمت بحل معظم المشكلات باستخدام JavaScript (باستثناء بعض مشكلات HackerRank حيث لم يكن JavaScript مدعومًا، لذلك استخدمت Python بدلاً من ذلك). وللمساعدة في الحفاظ على مسؤوليتي، وكذلك مشاركة التقدم الذي أحرزته، قمت بنشر التحديات التي أحلها كل يوم على تويتر. يمكنك العثور عليها في مسار الاقتباس هذا:
يعرضني كل يوم لأنواع مختلفة من هياكل البيانات والخوارزميات. تعلمت التعامل مع
تضمنت بعض المشكلات هياكل أكثر تعقيدًا مثل القوائم المرتبطة والأشجار الثنائية، بينما قام البعض الآخر بإدراج مصفوفات / مصفوفات n-D في المزيج، مما سمح لي بالتعامل في مساحات متعددة الأبعاد.
تنوع المشاكل جعلني متيقظاً. لقد عرّفتني المشكلات الموجودة في مسار 30 يومًا من JavaScript الخاص بـ LeetCode على أساسيات مثل
أخذ مسار Top Interview 150 من LeetCode الأمور خطوة إلى الأمام، حيث ألقى بي بين مشاكل متفاوتة الصعوبة والنهج. كان حل واحد على الأقل من هذه المشكلات كل يوم أمرًا لا يقدر بثمن. لقد تحدتني هذه المشكلات أيضًا للتفكير كثيرًا في التحسين وكيف يمكن أن تؤثر الأساليب المختلفة بشكل كبير على وقت التشغيل وكفاءة الذاكرة.
لقد تلقيت أيضًا دروسًا في Structy جنبًا إلى جنب مع هذه التحديات لتعزيز فهمي للمفاهيم الأساسية. لقد تعلمت طرقًا أكثر فعالية للتعامل مع بعض هياكل البيانات، مثل الأقسام الموجودة في القوائم المرتبطة والأشجار الثنائية. لقد أقدر بشكل خاص النهج الديناميكي الذي تتبعه المنصة في التدريس وحل المشكلات بطريقة تجعلها سهلة الهضم. إنها منصة رائعة لتعلم DSA على مستوى أساسي جدًا ثم ترجمة هذا الفهم إلى مشكلات البرمجة الأخرى التي أواجهها.
مع مرور الأيام، واجهت العديد من أنواع أساليب الحلول، وتقنيات حل المشكلات مثل
لقد وجدت أسلوب المؤشرين طريقة مباشرة وفعالة لحل المشكلات التي تتضمن تسلسلات (المصفوفات والسلاسل في المقام الأول)، عن طريق تقليل مساحة البحث للحصول على حلول أكثر كفاءة. لقد استخدمت أيضًا الخوارزميات الجشعة حيث كنت بحاجة إلى اتخاذ الخيارات المثلى محليًا في كل خطوة.
كانت تقنيات النافذة المنزلقة بمثابة لفتة نظر أخرى - كانت صعبة في البداية، ولكنها ذات قيمة للمشكلات التي تتضمن المصفوفات الفرعية أو السلاسل الفرعية؛ المشاكل التي تتطلب تتبع نطاق متحرك من العناصر ضمن تسلسل. تعد خرائط التجزئة وجداول التجزئة رائعة بالنسبة لأزواج القيمة الرئيسية في المشكلات التي تتضمن عمليات بحث متكررة.
كانت البرمجة الديناميكية من أكثر التقنيات تعقيدًا التي عملت بها. في وقت مبكر، وجدت أن DP أمر مخيف جدًا نظرًا لصعوبة التعرف على المشكلات الفرعية المتداخلة، ولكن مع تكرار التعرض للحفظ أصبح أفضل صديق لي في تحسين المكالمات المتكررة.
بالإضافة إلى مشكلات DSA الأساسية، أتيحت لي أيضًا الفرصة لتجربة مفاهيم JavaScript أكثر تقدمًا. لقد كتبت وظائف مجمعة، وتعلمت كيفية التحكم في تدفق التعليمات البرمجية الخاصة بي وتوسيع الوظائف لمتطلبات محددة. حتى أنني تعلمت ضبط مؤقتات على الوظائف مما يسمح لي بالتعامل مع العمليات الحساسة للوقت أو تحديد عدد المرات التي يمكن فيها تنفيذ وظائف معينة.
أظهر لي العمل مع النماذج الأولية أنه يمكن التعامل مع أنواع البيانات بما يتجاوز قدراتها المضمنة عن طريق إنشاء طرق مخصصة. لقد سمح لي هذا بتوسيع الوظائف المضمنة في أنواع البيانات مثل الكائنات والمصفوفات بطرق جديدة. لقد أدركت أهمية كتابة تعليمات برمجية نظيفة وموحدة.
لقد تعلمت أيضًا الحفظ، وهي تقنية يمكنك من خلالها تعديل دالة بحيث تقوم بتخزين الوسائط التي تم استدعاؤها مسبقًا مع نتائجها! هذا نوع من التخزين المؤقت الذي يساعد على تحسين الأداء في المشكلات التي توجد فيها استدعاءات متعددة لنفس الوظيفة. لقد كتبت عن حل Memoize الذي تفوق على 99% (الذاكرة) هنا: Memoize Intutitive Solution يتفوق على 99% من الذاكرة.
الشيء الآخر الذي بدأت في إيلاء المزيد من الاهتمام له خلال هذه الرحلة هو تحسين الكود الخاص بي. بعد مقدمة مناسبة لتدوين Big-O على Structy، فهمت أهمية تعقيد الزمان والمكان وتعلمت التقنية المثالية لمعظم المشكلات الشائعة. في نهاية مسار تحدي HackerRank، تعلمت أيضًا اختبار التعليمات البرمجية باستخدام الفئات وكتابة الأدوية العامة.
بحلول الوقت الذي أكملت فيه تحدي 30 يومًا من البرمجة، شعرت بإحساس عميق بالنمو. لقد أدى ذلك إلى تحسين قدرتي على التعامل مع مجموعة واسعة من المشكلات وتعميق فهمي لجافا سكريبت وDSA. أكثر من مجرد حل المشكلات، كانت هذه الرحلة التي استغرقت شهرًا بمثابة تذكير لنفسي بأنني أستطيع حقًا بذل هذا الجهد. بعد رؤية فوائد الاتساق والانضباط، تم تجديد عقليتي للتعامل مع أي تحدٍ بثقة وبمجموعة أدوات قوية من التقنيات.
تمثل هذه التجربة علامة فارقة في رحلتي البرمجية. لا شك أن المهارات التي اكتسبتها خلال هذه الأيام الثلاثين ستستمر في مسيرتي المهنية كمهندس برمجيات.
أنا فخور بي لأنني بذلت هذا الجهد، وممتن لأصدقائي الذين شجعوني وقدموا دعمهم وحكمتهم طوال التحدي.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3