كيف جوجل مبرمج يحل المشاكل المشتركة

الصورة

من أحد المترجمين : ننشر لك ترجمة لمقال لستيف ميريت ، موظف في Google يتحدث عن كيفية حل مشاكل البرمجة المعتادة. سيكون المنشور مفيدًا بشكل أساسي للمبرمجين المبتدئين.

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

بالمناسبة ، غالباً ما تعمل نفس الاستراتيجية خلال المقابلات في الشركات التكنولوجية الكبيرة. قبل ثلاث سنوات حصلت على وظيفة في Google بفضلها.

نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز "Habr" الترويجي.

توصي Skillbox بما يلي: الدورة التعليمية عبر الإنترنت "Profession Java-developer" .

خطوة بخطوة


سأعرض أمثلة في شكل مشاكل نموذجية للكشف عن الموضوع.

المشكلة: "بالنظر إلى سطرين ، sourceString و searchString ، تحتاج إلى إرجاع الفهرس الأول عندما يظهر sourceString في searchString. إذا لم يكن searchString في sourceString ، فقم بإرجاع -1. "

1. ارسمها


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

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

لذلك لا تبدأ كتابة التعليمات البرمجية ، حتى لا تفكر في ذلك. سيكون لديك الكثير من الوقت للعمل. أنت كمبيوتر بشري ، وأنت تحل المشكلة.

ضع خوارزمية الحل على الورق. إذا كان هناك شيء ما يساعدك على تصور خطتك ، فافعل ذلك. تتمثل المهمة في حل المشكلة باستخدام قلم وورقة ، بدون لوحة مفاتيح.

الخروج مع إدخال بسيط. إذا كانت الدالة "تتجاوز السلسلة" ، فإن "abc" هو أول مثال ممتاز. حاول أن تفهم ماهية النتيجة الصحيحة. ثم فكر في كيفية فهمك للمشكلة ، وما هي الخطوات التي اتخذت.

تخيل أن السلاسل لها القيم التالية:

sourceString: "abcdyesefgh"
searchString: "yes"


لذلك يمكننا أن نرى أن searchString داخل sourceString. ولكن كيف وصلنا إلى هذا؟ بدأنا من بداية sourceString ونقرأها حتى النهاية ، وننظر إلى كل جزء من ثلاثة أحرف لمعرفة ما إذا كان يطابق كلمة "yes". على سبيل المثال ، "abc" ، "bcd" ، "cde" ، إلخ. عندما وصلنا إلى الفهرس 4 ، وجدنا "نعم" وبالتالي قررنا وجود تطابق ، ويبدأ في الفهرس 4.

كان لدي مدرس في المعهد قام بتعيين المهمة للتوصل إلى تعليمات لإنشاء ساندويتش زبدة الفول السوداني. للحصول على تعليمات مفصلة ومفهومة ، وعدونا بأعلى تصنيف.

كتبت ما يلي:

"افتح زبدة الفول السوداني ، وانشرها على الخبز. ضع قطعة خبز أخرى في الأعلى وستنتهي ".

اعتقدت أنني تمكنت من ذلك حتى أخذ المعلم الزبدة وانتشر على الخبز ، الذي كان لا يزال في كيس من البلاستيك.

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

دعونا نحاول مرة أخرى مع زوج آخر من الخطوط:

sourceString: "abcdyefg"
searchString: "yes"


هنا ، بدأنا من بداية sourceString ونقرأها حتى النهاية ، وننظر إلى كل جزء من ثلاثة أحرف لمعرفة ما إذا كان يطابق كلمة "yes". عندما وصلنا إلى الفهرس 4 ، وجدنا yef ، والتي كانت تقريبًا صدفة ، ولكنها غير مكتملة ، حيث كانت الشخصية الثالثة مختلفة. وهكذا ، واصلنا القراءة حتى وصلنا إلى نهاية السطر ، ثم قررنا عدم وجود تطابق ، لذلك عدنا -1.

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

2. نكتب الخوارزمية بالكلمات


هذا يجعل الخطوات حقيقية ، مما يعني أنه يمكننا الرجوع إليها لاحقًا عند كتابة الكود.

  • ابدأ في بداية السطر.
  • نحن نبحث في جميع المجموعات المكونة من ثلاثة أحرف (أو عدد الأحرف المشار إليها في searchString).
  • إذا كان أي منهم متساويًا مع searchString ، فسنعيد الفهرس الحالي.
  • إذا وصلنا إلى نهاية السطر دون العثور على تطابق ، فارجع -1.

3. نكتب الكود الكاذب


الكود الكاذب ليس رمزًا ، لكنه يتظاهر بأنه رمز. مثال على ما أتحدث عنه ، بالنظر إلى الخوارزمية:

for each index in sourceString,
there are N characters in searchString
let N chars from index onward be called POSSIBLE_MATCH
if POSSIBLE_MATCH is equal to searchString, return index
at the end, if we haven't found a match yet, return -1.


يمكنني جعله أشبه رمز حقيقي مثل هذا:

for each index in sourceString,
N = searchString.length
POSSIBLE_MATCH = sourceString[index to index+N]
if POSSIBLE_MATCH === searchString:
return index
return -1


4. نحن نترجم كل ما نستطيع إلى الكود


الآن علينا أن نحرص على بناء الجملة ، معلمات الوظيفة وقواعد اللغة. ربما لا يمكنك كتابة كل شيء ، وهذا طبيعي. اكتب في الكود ما تعرفه بالتأكيد!

 function findFirstMatch (searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = <the LENGTH chars starting at index i> if (possibleMatch === searchString) { return index; } } return -1; } 

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

5. لا تعتمد على الحظ


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

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

تعليق: يمكن حساب احتمال حدوث خطأ باستخدام تسلسل مرسين: a (n) = (2 ^ n) - 1

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

في الخطوة السابقة ، قلت إنني لا أعرف كيفية تحديد جزء معين من السلسلة باستخدام JavaScript. دعنا جوجل.

https://www.google.com/search؟q=how+to+select+part+of+a+string+in+javascript

النتيجة الأولى هي من w3schools. عفا عليها الزمن بعض الشيء ، ولكن ستعمل:

http://www.w3schools.com/jsref/jsref_substr.asp

أفترض أنني يجب أن أستخدم substr (الفهرس ، searchString.length) لتسليط الضوء على جزء sourceString في كل مرة. لكن حتى الآن هذا افتراض وليس أكثر. لذلك سوف تحقق ذلك أولا.

let testStr = "abcdefghi"
let subStr = testStr.substr(3, 4); // simple, easy usage
console.log(subStr);
"defg"
subStr = testStr.substr(8, 5); // ask for more chars than exist
"i"


الآن أعرف بالضبط كيف تعمل هذه الوظيفة. لذلك ، عندما أقوم بإضافة هذه القطعة إلى برنامجي ، سأعلم بالفعل أنه إذا لم ينجح ذلك ، فلن تكون المشكلة في القسم المُضاف.

وأخيرًا ، أضف الجزء الأخير من الشفرة.

 function findFirstMatch(searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = ( sourceString.substr(index, searchString.length)); if (possibleMatch === searchString) { return index; } } return -1; } 

الخاتمة


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

حظا سعيدا والترميز سعيدة!

توصي Skillbox بما يلي:

Source: https://habr.com/ru/post/ar442048/


All Articles