نرم افزار در یک مرحله دراماتیک ایجاد نمی شود. اندک اندک، یک قدم در یک زمان بهبود مییابد – ویرایش، اجرای تستهای واحد، رفع خطاهای ساخت، رسیدگی به بررسی کدها، ویرایش برخی دیگر، رفع خطاها، و رفع خطاهای بیشتر – تا اینکه در نهایت آنقدر خوب شود که در یک کد ادغام شود. مخزن مهندسی نرمافزار یک فرآیند مجزا نیست، بلکه گفتوگوی بین توسعهدهندگان انسانی، بازبینیکنندگان کد، گزارشگران اشکال، معماران نرمافزار و ابزارهایی مانند کامپایلرها، تستهای واحد، لینترها و تحلیلگرهای استاتیک است.
امروز DIDACT (Dynamic Integrated Developer ACTivity) را توضیح میدهیم که روشی برای آموزش مدلهای یادگیری ماشین بزرگ (ML) برای توسعه نرمافزار است. تازگی DIDACT این است که از آن استفاده می کند فرآیند توسعه نرم افزار به عنوان منبع داده های آموزشی برای مدل، نه فقط حالت پایان صیقلی از آن فرآیند، کد تمام شده. با قرار دادن مدل در معرض زمینههایی که توسعهدهندگان در حین کار میبینند، همراه با اقداماتی که در پاسخ انجام میدهند، مدل در مورد پویایی توسعه نرمافزار میآموزد و بیشتر با نحوه صرف زمان توسعهدهندگان هماهنگ میشود. ما از ابزارهای توسعه نرم افزار Google استفاده می کنیم تا کمیت و تنوع داده های فعالیت توسعه دهنده را فراتر از کارهای قبلی افزایش دهیم. نتایج در دو بعد بسیار امیدوارکننده هستند: سودمندی برای توسعه دهندگان نرم افزار حرفه ای، و به عنوان پایه ای بالقوه برای آغشته کردن مدل های ML با مهارت های عمومی توسعه نرم افزار.
DIDACT یک مدل چند وظیفه ای است که در زمینه فعالیت های توسعه که شامل ویرایش، اشکال زدایی، تعمیر و بررسی کد می شود، آموزش دیده است. |
ما سه ابزار DIDACT، Comment Resolution (که اخیراً اعلام کردیم)، Build Repair و Tip Prediction را که هر کدام در مراحل مختلف گردش کار توسعه یکپارچه شدهاند، در داخل ساخته و مستقر کردیم. هر سه این ابزار بازخورد مشتاقانه ای از هزاران توسعه دهنده داخلی دریافت کردند. ما این را به عنوان آزمون نهایی سودمندی میبینیم: آیا توسعهدهندگان حرفهای، که اغلب در زمینه کد متخصص هستند و گردشهای کاری را با دقت انجام میدهند، از ابزارها برای بهبود بهرهوری خود استفاده میکنند؟
شاید هیجان انگیزتر از همه، ما نشان دهیم که چگونه DIDACT اولین گام به سمت یک عامل کمک توسعه دهنده همه منظوره است. ما نشان میدهیم که مدل آموزشدیده را میتوان به روشهای شگفتانگیزی، از طریق درخواست با پیشوندهای فعالیتهای توسعهدهنده، و با زنجیر کردن پیشبینیهای متعدد برای ایجاد مسیرهای فعالیت طولانیتر، مورد استفاده قرار داد. ما بر این باوریم که DIDACT مسیر امیدوار کننده ای را به سمت توسعه عواملی که به طور کلی می توانند در سراسر فرآیند توسعه نرم افزار کمک کنند، هموار می کند.
گنجینه ای از داده ها در مورد فرآیند مهندسی نرم افزار
زنجیرههای ابزار مهندسی نرمافزار گوگل هر عملیات مربوط به کد را به عنوان گزارشی از تعاملات بین ابزارها و توسعهدهندگان ذخیره میکنند و این کار را برای دههها انجام دادهاند. در اصل، میتوان از این رکورد برای پخش دقیق قسمتهای کلیدی «ویدئوی مهندسی نرمافزار» از نحوه پیدایش پایگاه کد گوگل، گام به گام – یک ویرایش کد، کامپایل، نظر، تغییر نام متغیر و غیره استفاده کرد. در یک زمان.
کد گوگل در یک monorepo زندگی می کند، یک مخزن واحد از کد برای همه ابزارها و سیستم ها. یک توسعهدهنده نرمافزار معمولاً تغییرات کد را در یک فضای کاری محلی کپی روی نوشتن که توسط سیستمی به نام Clients in the Cloud (CitC) مدیریت میشود، آزمایش میکند. وقتی توسعهدهنده آماده است مجموعهای از تغییرات کد را با هم برای یک هدف خاص (مثلاً رفع اشکال) بستهبندی کند، یک لیست تغییرات (CL) در Critique، سیستم بررسی کد Google ایجاد میکند. همانند سایر انواع سیستم های بازبینی کد، توسعه دهنده با یک بازبین همتا در مورد عملکرد و سبک گفتگو می کند. توسعهدهنده CL خود را ویرایش میکند تا با پیشروی گفتگو به نظرات بازبین بپردازد. در نهایت، بازبین اعلام می کند “LGTM!” (“به نظر من خوب است”)، و CL در مخزن کد ادغام می شود.
البته، توسعهدهنده علاوه بر گفتوگو با بازبین کد، یک «گفتگو» از انواع دیگر ابزارهای مهندسی نرمافزار مانند کامپایلر، چارچوب آزمایشی، لینترها، تحلیلگرهای استاتیک، فازرها و غیره دارد.
تصویری از شبکه پیچیده فعالیتهای درگیر در توسعه نرمافزار: اقدامات کوچک توسط توسعهدهنده، تعامل با یک بازبین کد، و فراخوانی ابزارهایی مانند کامپایلر. |
یک مدل چند وظیفه ای برای مهندسی نرم افزار
DIDACT از تعاملات میان مهندسان و ابزارها برای تقویت مدلهای ML استفاده میکند که به توسعهدهندگان Google کمک میکند، با پیشنهاد یا بهبود اقداماتی که توسعهدهندگان انجام میدهند – در زمینه – در حالی که وظایف مهندسی نرمافزار خود را دنبال میکنند. برای انجام این کار، تعدادی کار در مورد فعالیتهای توسعهدهنده فردی تعریف کردهایم: تعمیر یک ساختار شکسته، پیشبینی یک نظر بازبینی کد، پرداختن به نظر مرور کد، تغییر نام یک متغیر، ویرایش یک فایل، و غیره. ما از فرمالیسم رایج استفاده میکنیم. برای هر فعالیت: مقداری طول می کشد حالت (یک فایل کد)، برخی قصد (حاشیه نویسی مخصوص فعالیت، مانند نظرات مرور کد یا خطاهای کامپایلر)، و یک عمل (عملیات انجام شده برای رسیدگی به وظیفه). این اکشن مانند یک زبان برنامه نویسی کوچک است و می تواند برای فعالیت های تازه اضافه شده گسترش یابد. مواردی مانند ویرایش، افزودن نظرات، تغییر نام متغیرها، علامتگذاری کد با خطا و غیره را پوشش میدهد. ما به این زبان میگوییم DevScript.
مدل DIDACT با یک کار، تکههای کد و حاشیهنویسی مربوط به آن کار تحریک میشود و اقدامات توسعهای را تولید میکند، به عنوان مثال، ویرایشها یا نظرات. |
این فرمالیسم دولت- قصد-عمل ما را قادر می سازد تا بسیاری از وظایف مختلف را به شیوه ای کلی به دست آوریم. علاوه بر این، DevScript روشی مختصر برای بیان اقدامات پیچیده است، بدون نیاز به خروجی کل حالت (کد اصلی) همانطور که پس از انجام عمل انجام می شود. این مدل را کارآمدتر و قابل تفسیرتر می کند. به عنوان مثال، تغییر نام ممکن است یک فایل را در ده ها مکان لمس کند، اما یک مدل می تواند یک اقدام تغییر نام را پیش بینی کند.
یک برنامه نویس همتا ML
DIDACT در وظایف کمکی فردی کار خوبی انجام می دهد. به عنوان مثال، در زیر DIDACT را نشان میدهیم که پس از انجام عملیات، پاکسازی کد را انجام میدهد. کد را همراه با برخی نظرات نهایی بازبین کد (که با “انسان” در انیمیشن مشخص شده است) نگاه می کند، و ویرایش هایی را برای رسیدگی به این نظرات پیش بینی می کند (که به صورت یک نمایش داده شده است. تفاوت).
با توجه به یک قطعه کد اولیه و نظراتی که یک بازبین کد به آن قطعه پیوست کرده است، وظیفه پاکسازی پیش از ارسال DIDACT ویرایش هایی (درج و حذف متن) را ایجاد می کند که به آن نظرات می پردازد. |
ماهیت چندوجهی DIDACT همچنین برخی از قابلیتهای شگفتانگیز را ایجاد میکند که یادآور رفتارهایی است که با مقیاس ظهور میکنند. یکی از این قابلیت ها این است افزایش تاریخ، که می تواند از طریق درخواست فعال شود. دانستن کارهایی که توسعهدهنده اخیرا انجام داده است، مدل را قادر میسازد تا حدس بهتری در مورد کارهای بعدی که توسعهدهنده باید انجام دهد انجام دهد.
تصویری از تکمیل کد افزوده شده با تاریخ در عمل. |
چنین وظیفه قدرتمندی نمونه این قابلیت است تکمیل کد افزوده شده با تاریخچه. در شکل زیر، توسعه دهنده یک پارامتر تابع جدید (1) اضافه می کند و مکان نما را به اسناد (2) منتقل می کند. مشروط به تاریخچه ویرایشهای توسعهدهنده و موقعیت مکاننما، مدل خط (3) را با پیشبینی صحیح ورودی docstring برای پارامتر جدید تکمیل میکند.
تصویری از پیشبینی ویرایش، بیش از چندین تکرار زنجیرهای. |
در یک کار تقویت شده با تاریخ قدرتمندتر، ویرایش پیش بینی، مدل می تواند انتخاب کند که کجا بعدی را به روشی که از نظر تاریخی سازگار است ویرایش کند. اگر توسعهدهنده یک پارامتر تابع (1) را حذف کند، مدل میتواند از تاریخچه برای پیشبینی صحیح بهروزرسانی رشته docstring (2) استفاده کند که پارامتر حذفشده را حذف میکند (بدون اینکه توسعهدهنده انسانی بهطور دستی مکاننما را در آنجا قرار دهد) و برای بهروزرسانی یک عبارت در تابع (3) از نظر نحوی (و – احتمالاً – از نظر معنایی) درست است. با داشتن تاریخچه، مدل میتواند بدون ابهام تصمیم بگیرد که چگونه “ویرایش ویدئو” را به درستی ادامه دهد. بدون سابقه، مدل نمیداند که آیا پارامتر تابع گمشده عمدی است (زیرا توسعهدهنده در حال ویرایش طولانیتری برای حذف آن است) یا تصادفی (در این صورت مدل باید دوباره آن را اضافه کند تا مشکل برطرف شود). .
مدل می تواند حتی فراتر از این هم پیش رود. به عنوان مثال، ما با یک فایل خالی شروع کردیم و از مدل خواستیم تا زمانی که یک فایل کد کامل را بنویسد، بهطور متوالی پیشبینی کند که چه ویرایشهایی در آینده انجام میشود. بخش شگفت انگیز این است که مدل کد را به روشی گام به گام توسعه داده است که طبیعی به نظر می رسد به یک توسعه دهنده: ابتدا با ایجاد یک اسکلت کاملاً کارآمد با واردات، پرچم ها و یک عملکرد اصلی اصلی شروع شد. سپس به صورت تدریجی عملکردهای جدیدی مانند خواندن از یک فایل و نوشتن نتایج، و عملکردی برای فیلتر کردن برخی از خطوط بر اساس یک عبارت منظم ارائه شده توسط کاربر اضافه کرد، که نیاز به تغییرات در سراسر فایل، مانند افزودن پرچمهای جدید داشت.
نتیجه
DIDACT فرآیند توسعه نرمافزار Google را به نمایشهای آموزشی برای دستیاران توسعهدهنده ML تبدیل میکند و از این نمایشها برای آموزش مدلهایی استفاده میکند که کد را به صورت گام به گام، به صورت تعاملی با ابزارها و بازبینیکنندگان کد میسازند. این نوآوری ها در حال حاضر ابزارهای قدرتمندی هستند که توسعه دهندگان Google هر روز از آنها لذت می برند. رویکرد DIDACT تکمیل کننده گامهای بزرگی است که مدلهای زبان بزرگ در Google و جاهای دیگر به سمت فناوریهایی که زحمت را آسان میکنند، بهرهوری را بهبود میبخشند و کیفیت کار مهندسان نرمافزار را افزایش میدهند.
سپاسگزاریها
این کار نتیجه یک همکاری چند ساله بین Google Research، Google Core Systems and Experiences و DeepMind است. مایلیم از همکارانمان ژاکوب آستین، پاسکال لامبلین، پیر آنتوان مانزاگول و دانیل ژنگ که به عنوان محرکهای کلیدی این پروژه به ما میپیوندند، قدردانی کنیم. این کار بدون مشارکت قابل توجه و پایدار شرکای ما در آلفابت (پیتر چوی، هنریک میکالوسکی، سابهودیپ مویترا، مالگورزاتا سالاوا، وایبهاو تولسیان، و مانوشری ویجایورگیا) و همچنین بسیاری از افرادی که دادهها را جمعآوری کردند، وظایف را شناسایی کردند، انجام نمیشد. ، محصولاتی را ساخت، استراتژی داد، بشارت داد و به ما در اجرای بسیاری از جنبه های این دستور کار کمک کرد (آنکور آگاروال، پیج بیلی، مارک بروکشمیت، رودریگو دامازیو بووندورپ، ساتیش چاندرا، ساوین دانکس، مت فرازیر، الکساندر فرومگن، نیمش گوهلوسکی، نیمش گوهلوسکی چنجی گو، وینسنت هلندورن، فرانجو ایوانچیچ، مارکو ایوانکوویچ، امیلی جانستون، لوکا کالینوچیچ، لرا خاراتیان، جسیکا کو، مارکوس کوسانو، کتی نیکس، سارا کو، مارک راسی، مارکوس رواج، بالی ساندو، مایکل اسلون، مایکل اسلون، سوریتا، ماکسیم تاباچنیک، دیوید تاترسال، سارا توث، کوین ویلا، سارا ویلتبرگر، و دونالد دوو ژائو) و رهبری بسیار حامی ما (مارتین آبادی، جوئل بارال، جف دین، مادورا دودهگاونکار، داگلاس اک، زوبین قهرمانی، هوگو دو لاروچل) تكات، و نیرانجان تولپول). متشکرم!