
مرحبًا اسمي سيرجي ، لقد عملت في ياندكس منذ خمس سنوات. خلال هذا الوقت شارك في تطوير أحد عشر مشروعًا. كتب التعليمات البرمجية في JavaScript و Python و C ++. قام ببعض المشاريع بمفرده ، والبعض الآخر طورها في مجموعة من ثمانية أشخاص. ولكن في كل فريق ، في جميع المشاريع ، بغض النظر عن لغة البرمجة ، استخدمت مراجعة التعليمات البرمجية.
بمساعدة مراجعة الكود ، أتعلم شيئًا جديدًا باستمرار. في بعض الأحيان ، بالنظر إلى رمز شخص آخر ، أريد أن أصرخ: "ولكن ما الذي يمكن فعله أيضًا؟". في رمز شخص آخر ، أجد حيلًا مثيرة للاهتمام وأخذها في الخدمة. أرسم الكثير من المعرفة الجديدة من التعليقات على الكود الخاص بي. لقد كان اكتشافًا لي أن الناس يحبون مشاركة تجاربهم. حتى عندما أقوم بتطوير المشروع بمفردي ، أطلب من اللاعبين من الفريق الآخر رؤية أسئلة السحب. إنه يحفز على كتابة رمز جميل وواضح.
ولكن لم يكن هذا هو الحال دائمًا. مرة واحدة كانت المراجعة عقاب لي. يمكنني كتابة الرمز بإلهام لمدة أسبوع ، مع وضع كل قوتي فيه. لقد أرسلت طلب سحب ، تعرضت لضغوط من المراجع ثلاث مرات ، وفي المقابل تلقيت رسالة جافة "مثل موافق" ، أو الأسوأ من ذلك ، عشرات التعليقات التي لا تتعلق بالأسس الموضوعية.
جاءت تجمعات من خمسة آلاف سطر لمراجعي. قضيت ساعات أحاول معرفة الرمز ، وأنا أتحرك مائة مرة من الوظيفة إلى الاختبار والعكس صحيح. كتب العشرات من التعليقات غير المفيدة حول الفاصلة المنقوطة المفقودة. كل هذا أزعجني بشكل رهيب. غالبًا ما أؤجل المراجعة لوقت لاحق ، وقمت بتجميع العشرات من حمامات السباحة التي لم تتم مراجعتها.
إذا شعرت بهذا على نفسك ، فإن المقالة لك. اليوم سأتحدث عن التقنيات والأدوات التي أستخدمها كل يوم لمدة خمس سنوات من مراجعة الشفرة اليومية.
"قبل المراجعة". نصائح للمؤلف
تخيل أن حل المشكلة هو الطهي. أنت تعمل كفريق ، لذلك لا تحتاج فقط إلى الطهي ، ولكن أيضًا تعليم الطهاة الآخرين. لا يكفي أن تظهر لهم النتيجة ، تحتاج إلى كتابة الوصفة.
تلتزم
كل خطوة من الوصفة هي التزام: كسروا بيضتين - صنعوها ، أضافوا كوبًا من الحليب - صنعوها ، سكبوا مائتي جرام من الدقيق - صنعوها مرة أخرى.
في كل التزام ، أعبر عن فكرة واحدة بسيطة. يمكن أن يكون هذا تنفيذًا لطريقة نموذج أو مكونات في التخطيط. لذلك سيكون من الأسهل على المراجع أن يفهمني. أنا لا ألومها على المهمة بأكملها ، والتي لا يمكن ابتلاعها في وقت واحد ، ولكن أخبر عن الحل في أجزاء.
أخرج أي إعادة بيع ديون في التزام منفصل. في كثير من الأحيان ، تكون إعادة الهيكلة ذات طبيعة تقنية بحتة ، على سبيل المثال ، إعادة تسمية طريقة. لا يحتاج المراجع إلى قراءة كل سطر من هذا التغيير. سيدير عينيه "قطريًا" وسيكون قادرًا على تخصيص مزيد من الوقت للرمز الأكثر أهمية.
تفتت ، حطم ، قطّع التعليمات البرمجية الخاصة بك إلى عمليات صغيرة. سيسمح ذلك للمراجع بفهم شفرتك بشكل أفضل. لا بأس إذا ذهبت إلى البحر مع التحلل. يمكن الجمع بين لجنتين في واحد. من الأصعب بكثير تقسيم التزام كبير إلى عدة التزامات صغيرة. يمكن الحصول على "الخضار المقطعة" بسهولة عن طريق خلط "الطماطم المقطعة" و "البصل المفروم". ولكن للحصول على جميع المكونات في أجزاء من طبق سلطة ، تحتاج إلى قضاء الكثير من الوقت.
بعد التنفيذ ، أدفع التغييرات على الفور إلى جيثب. لقد ساعدني ذلك عدة مرات عندما كانت هناك "مشاكل قهوة" مع جهاز كمبيوتر محمول.
وصف التعهدات
عندما أكتب رسالة بريد إلكتروني ، أقوم بتعبئة رأس الرسالة ومحتوياتها. العنوان هو اسم قصير وواسع ، ونص الرسالة عبارة عن وصف مفصل ومفصل بالصور والروابط. أطبق نفس النهج لوصف الالتزامات.
git commit -m 'fix1'
. git commit
, . ( ). ( ).
, " " " ". , . . ASCII- . , , .

( ASCII-)

( . vim)

( GitHub. )
, , . :
git status
git diff comments.js
git add comments.js
, . git add .
, . , .
. , . JavaScript ESlint. R2-D2 " ", . , , .
WebStorm " ". , , . husky.
. . .

( )
– , – . , . git log --pretty='%h: %B' --first-parent --no-merges --reverse
.

( `git log --pretty='%h: %B' --first-parent --no-merges --reverse`)

( , )
, . , . .
! , .
« ».
– , .
, . , , . , . , " ".
. . .
–
. ! . , . , , . , .
. , . .
. :
function sum(arr) {
return arr.reduce(function (res, i) {
return res + i;
}, 0);
}
sum([1, 2, 3]); // 6
, :
const sum = arr => arr.reduce((res, i) => res + i);
, . , , . , . – .
Offline
, . , . .
offline-. (, : , ), .
. -, . -, : ( ). -, , — .
, . offline- .
« ».
, . . .
, . , , , . , : ? ? ? , .
. , .

( : )
. , . ? ' , .
-. . , . , , .
git rebase --interactive master
. , FEATURE-1
, master
— . , , pick
squash
. .

( , )
--force
. , . git push origin FEATURE-1 --force
, . , .
GitHub. "Squash and merge".

( GitHub)
, . FEATURE-1
. :
git checkout master
git pull origin master
git branch -D FEATURE-1

( .)
, , :
#
git checkout -b FEATURE-1
#
git status
git diff src/controllers/v1/comments.js
git add src/controllers/v1/comments.js
#
git commit
git push origin FEATURE-1
#
git log --pretty='%h: %B' --first-parent --no-merges --reverse
#
git rebase --interactive master
git push origin FEATURE-1 --force
#
git checkout master
git pull origin master
git branch -D FEATURE-1
, , ?:
# ,
git add comment.js
#
git commit --amend
, . — . — git rebase --interactive master
, pick
squash
.

, git rebase --interactive master
pick
edit
, .
, , , , .
?, . , . . git add --patch test/comment-test.js

, . , . ?git rebase --interactive master
. . . , pick
, pick
squash
.
?. , .
