درست با ساخت و ساز: اولین بار درست ساختمان نرم افزار

در ساعت 2 صبح یک اشکال را برطرف کنید و فکر کنید ، “در آنجا باید راهی بهتر برای انجام این کار باشید! “؟ اگر چنین است ، شما تنها نیستید. وارد شوید “درست با ساخت” – یک فلسفه طراحی نرم افزاری که به نظر می رسد بسیار جالب اما به یک ایده ساده می رسد: نرم افزار خود را به روشی بسازید نمی توان نداشت اشتباه باشید (یا حداقل اشتباه بودن آن را سخت می کند). تصور کنید اگر یک بار کد شما کامپایل می شود ، اساساً انجام شده – فقط کار می کند. به نظر می رسد مانند آرمانشهر یک توسعه دهنده؟ این رویای طراحی درست توسط ساخت و ساز است. در این مقاله ، ما به معنای “صحیح ساخت و ساز” خواهیم بود ، چرا اهمیت دارد (با برخی از قیاس های دنیای واقعی و داستان های جنگ) ، و اینکه چگونه می توانید کمی از این جادو را در پروژه های خود بپاشید. همه به سبک گاه به گاه و فنی-با یک طنز طنز-بنابراین خود را یک قهوه بریزید (یا چای ، اگر به طور رسمی مصرف کافئین خود را تأیید کرده اید) و بیایید شیرجه بزنیم.
به هر حال “با ساخت و ساز” به چه معنی است؟
“درست با ساخت و ساز” (CBC) دقیقاً همان چیزی است که به نظر می رسد: اطمینان از سیستم شما همانطور که می سازید درست است، به جای اینکه ابتدا آن را بسازید و بعداً خطاهای آزمایش یا اشکال زدایی را انجام دهید. این مانند مونتاژ یک پازل اره منبت کاری است که به گونه ای طراحی شده است قطعات اشتباه فقط مناسب نخواهد بود – شما فقط می توانید یک قطعه صحیح را به طور همزمان تکمیل کنید. از نظر نرم افزاری ، CBC به معنای ساختار طراحی و کد شما است تا اشتباهات یا غیرممکن است یا بلافاصله آشکار استبشر هدف این است که خطاها را قبل از آزمایش از بین ببرید برخلاف چرخه معمول “اکنون بنویسید ، بعداً اشکال زدایی”. این رویکرد چندین دهه توسط دانشمندان رایانه مورد مطالعه قرار گرفته است. در حقیقت ، تحقیقات از اواخر دهه 1960 و به بعد بررسی کرده است که چگونه نوشتن مشخصات بسیار غنی (به عنوان مثال ، با استفاده از سیستم های بیانگر یا منطق رسمی) می تواند پیاده سازی هایی را که با تعریف صحیح هستند راهنمایی کند (رابرت پاسبان در برنامه نویسی درست به ساخت-تحقیقات اطلاعاتی دستگاه موسسه).
به این روش فکر کنید: برنامه نویسی سنتی اغلب مانند آن احساس می شود ابتدا بسازید ، سپس دعا کنیدبشر شما یک دسته کد می نویسید ، سپس از انگشتان خود عبور می کنید و آن را اجرا می کنید تا ببینید که آیا این کار می کند. اگر اینطور نیست ، شما به دنبال اشکالات هستید ، چیزها را پچ کنید و تکرار کنید – مانند تلاش برای آتش سوزی که به طور تصادفی در کد خود تنظیم کرده اید. با ساخت و سازهای آن روی سر خود درست کنید. بیشتر شبیه است آن را با مواد ضد آتش بسازید بنابراین هرگز در وهله اول آتش نمی گیرد. تا زمانی که نوشتن یک ماژول یا ویژگی را تمام کردید ، این است پیش از این مطابق با الزامات (تا حد امکان) و مکان های کمتری دارد که اشکالات می توانند مخفی شوند.
برای بیان یک قیاس قابل اعتماد تر: تصور کنید که در حال نوشتن یک ایمیل هستید اما یک طلسم فوق العاده دقیق دارید که به معنای واقعی کلمه به شما اجازه می دهد یک کلمه را نادرست تایپ کنیدبشر به همان اندازه که ممکن است ناامید کننده باشد (“نه ، همبستگی ، من واقعاً منظور من بود bugfixery
! “) ، این تضمین می کند که شما در نهایت ارسال پیام تایپی به شما نمی پردازید. در برنامه نویسی ، صحیح بودن با ساخت و ساز مانند داشتن کامپایلر یا ابزاری است که از شما امتناع می ورزد. (“آیا شما هستید مطمئن آن متغیر نمی تواند تهی باشد؟ من تا زمانی که شما این کار را انجام دهید کامپایل نمی کنم! “) ، اما این دوست شما است. این اطمینان حاصل می کند که پس از کامپایل و اجرای کد ، در چهره شما منفجر نمی شود (حداقل برای خطاهایی که برای آن بررسی شده است).
چرا باید مراقبت کنید؟ (اشکالات ، شب های اواخر و درام اشکال زدایی)
خوب ، بنابراین CBC از نظر تئوری خوب به نظر می رسد ، اما چرا باید یک توسعه دهنده شلوغ مراقبت کند؟ در یک کلمه: اشکالاتبشر اشکالات Gremlins کوچکی هستند که موهای ما را خاکستری می کنند و شبهای انتشار ما بی خوابی هستند. هرچه یک اشکال بعدی در روند توسعه یافت می شود ، هزینه آن برای ما بیشتر است – به موقع ، پول و عقل. طبق یک مطالعه IBM ، یک اشکال گرفتار در مرحله طراحی ممکن است باشد 100 برابر ارزانتر برای رفع آن پس از انتشار (هزینه یافتن اشکالات بعداً در SDLC). دوباره بخوانید: 100 باربشر (تصور کنید که پیدا کنید پس از حمل و نقل که عملکرد ورود به سیستم شما گاهی اوقات به همه افراد به عنوان مدیر اجازه می دهد – اوه. اکنون شما در حال تلاش برای پچ در ساعت 3 صبح هستید ، از کاربران عذرخواهی می کنید و از انتخاب زندگی خود سؤال می کنید.) در سیستم های ایمنی مهم ، سهام حتی بیشتر است: یک اشکال نرم افزاری غیر آموخته می تواند یک موشک را منفجر کند یا به معنای واقعی کلمه میلیارد ها در آن هزینه کند خسارت بدون شوخی – شکست موشک بدنام Ariane 5 به دلیل یک اشکال نرم افزاری بود و در مورد دیگر ، تونی Hoare (مخترع مرجع تهی) به نام مفهوم null
اوت “اشتباه میلیارد دلاری” به دلیل چند خطا و تصادفات در برنامه های طی سالها (منابع تهی: اشتباه میلیارد دلاری – InfoQ).
طراحی درست توسط ساخت و ساز همه چیز در مورد جلوگیری از این سناریوهای کابوس با جلب مشکلات است از جلوبشر این داروی پیشگیری نهایی برای اشکالات نرم افزاری است. به جای تکیه بر یک چرخه بی پایان آزمایش و اشکال زدایی ، شما تلاش می کنید کد آن را بنویسید با ساختار بسیار نمی توان انواع خاصی از خطاها را تولید کرد. اگر این به نظر می رسد کمی شبیه به Overkill است ، در نظر بگیرید که توسعه دهندگان چقدر زمان را برای نوشتن تست ، اضافه کردن چک های زمان اجرا و انجام بررسی کد برای گرفتن مشکلات در نظر بگیرید. اینها همه تلاش برای اطمینان از صحت پس از واقعیت است. CBC می گوید: آن تلاش را کمی زودتر سرمایه گذاری کنید ، از ابتدا صحت را بپزید ، و آتش سوزی کمتری برای جنگیدن خواهید داشت.
همچنین ، بیایید صادق باشیم: اشکال زدایی همیشه سرگرم کننده نیست. می تواند رضایت بخش باشد گاه، مانند حل یک رمز و راز ، اما با توجه به انتخاب ، بیشتر ما ترجیح می دهیم ویژگی های جالب را نسبت به ردیابی اضافه کنیم چرا تعداد کاربر روی زمین توسط یکی خاموش است برای صدمین بار درست با ساخت و ساز به به حداقل رساندن شگفتی های “خاموش توسط یک” کمک می کند. در یک سناریوی ایده آل ، استفاده از اصول CBC به این معنی است که کلاسهای خاصی از اشکالات اصلاً هرگز رخ نمی دهدبشر کامپایلر یا روش توسعه به سادگی اجازه نمی دهد که این اشکالات اتفاق بیفتد ، دقیقاً مانند خودرویی که شروع نمی شود مگر اینکه کمربند ایمنی شما کمرنگ شود (آزار دهنده ، بله ، اما می تواند جان شما را نجات دهد یا در مورد ما برنامه خود را ذخیره کنید از تصادف).
و در اینجا یک مثال بسیار قابل اعتماد روزمره وجود دارد: آیا تاکنون یک پروژه بزرگ JavaScript را به TypeScript تبدیل کرده اید؟ اگر چنین است ، احتمالاً هر دو درد را احساس کردید وت تسکین درد زیرا ناگهان ویرایشگر کد شما با ده ها خطا روشن شد (“استدلال! من فکر کردم user.name
همیشه آنجا بود! “) اما تسکین زیرا شما بسیاری از مسائل را گرفتید پیش از در حال اجرا کد در اصل ، این یک تجربه کوچک “درست توسط ساخت و ساز” است – کامپایلر TypeScript مانند یک نگهبان سخت عمل می کرد و شما را مجبور می کند مواردی را که ممکن است از آن غافل شوید ، کنترل کنید (مانند آن user
که گاهی اوقات می تواند باشد null
یا undefined
). مطمئناً ، این یک کار اضافی مقرون به صرفه است ، اما شما را از حمل و نقل آن ناخوشایند نجات می دهد Cannot read property 'name' of undefined
اشکالات برای تولید. این همان ایده است: زود آن را بگیرید ، یک بار آن را برطرف کنید ، بهتر بخوابیدبشر
قیاس های دنیای واقعی: پل های ساختمانی (و مبلمان IKEA)
بیایید برخی از قصه گویی را بیاوریم تا واقعاً ناخن بزنند که چرا این اصل اهمیت دارد. تصور کنید که دو شرکت ساختمانی در حال ساخت پل ها هستند:
-
شرکت A: آنها یک طرح مبهم را ترسیم می کنند ، ساخت و ساز را شروع می کنند و می توانند این پل را برای نقاط ضعف بازرسی کنند پس از ساخته شده است آنها ساختمان را در زمان ضبط به پایان می رسانند. سپس آنها یک کامیون تست را به سراسر … و ترک، این پل فرو می ریزد. اوه وقت آن است که یک خدمه تعمیر را برای تقویت تیرها وارد کنید ، شاید برخی از بتن های دیگر را در اینجا و آنجا بریزید ، امیدوارم که دفعه دیگر نگه داشته شود. آنها سرانجام این کار را انجام می دهند ، اما این پروژه دیر و بیش از بودجه است ، و هیچ کس هیجان زده نمی شود که روی آن پل حرکت کند و دانستن اینکه یک آزمایش را شکست داد.
-
شرکت ب: این افراد رویکرد متفاوتی دارند. آنها در مورد طرح وسواس می کنند ، شبیه سازی ها را اجرا می کنند ، از موادی استفاده می کنند که قدرت خاصی را تضمین می کنند و در هر مرحله بازرسان در سایت دارند. اگر یک پرتو به مشخصی نباشد ، ساخت و ساز متوقف می شود بلافاصله و پرتو جایگزین می شود پیش از قسمت بعدی ساخته شده است. برای پایان دادن به آنها کمی بیشتر طول می کشد ، اما وقتی این کار را انجام می دهند ، این پل در اولین حرکت جامد است. کامیون تست بدون دست و پا زدن از آن عبور می کند. آنها آن را درست از زمین به بالا ساختند.
شرکت B در حال انجام “درست با ساخت و ساز” است (اگرچه آنها فقط آن را مهندسی خوبی می نامند). شرکت A … خوب ، آنها رویکرد “حرکت سریع و شکستن چیزها” را مثال می زنند (به معنای واقعی کلمه در حال شکستن ، در این مورد).
اکنون ، نرم افزار مهندسی عمران نیست ، اما قیاس وجود دارد. آیا ترجیح می دهید در حالی که هنوز آن را می نویسید ، منطق احراز هویت شما ناقص است ، یا بعد از اینکه یک هکر سوراخ تولید را پیدا می کند؟ دقیقاً
برای یک قیاس کمتر فاجعه بار: فکر کنید مبلمان IKEAبشر بسیاری از قطعات ikea به گونه ای طراحی شده اند که شما نمی توان نداشت آنها را نادرست جمع کنید (خوب ، بیشتر – همه ما درد یک صفحه عقب را می دانیم ، اما با من همراه باشید). پیچ ها و سوراخ ها به گونه ای مرتب شده اند که قطعات اشتباه به سادگی تراز نمی شوند. اگر اشتباه کنید ، فوراً متوجه می شوید زیرا قطعات در کنار هم قرار نمی گیرند. این درست در ساخت و ساز در عمل است! طرح از اشتباهات خاص جلوگیری می کند. در تضاد با کیت های مبلمان مدرسه قدیمی که در آن هر تخته یکسان به نظر می رسد و ساخت همه چیز و تحقق در پایان کاملاً ممکن است که پایه وارونه داشته باشید (و اکنون قفسه کتاب شما با زاویه ای خنده دار تکیه می دهد … آه). CBC مانند رویکرد IKEA است: سازنده (توسعه دهنده) را راهنمایی کنید تا اشتباهات سخت باشد.
در نرم افزار ، یک مانترا کلاسیک که این ایده را ضبط می کند “دولتهای نامعتبر را غیرقابل توصیف کنید.” به عبارت دیگر ، ساختار کد خود را طوری طراحی کنید که حتی توصیف یک سناریوی اشتباه غیرممکن باشد. به عنوان مثال ، اگر یک تابع انتظار یک عدد صحیح مثبت دارد ، از یک نوع یا اعتبار سنجی استفاده کنید تنها به اعداد صحیح مثبت اجازه می دهد. سپس شما هرگز نباید نگران “اگر کسی عبور کند -1؟” – به معنای واقعی کلمه نمی تواند اتفاق بیفتد. یک کامپایلر دوستانه یا چک زمان اجرا قبل از آنکه در آن اشکال داشته باشد ، در آن اشکال را لرزاند. یک نویسنده آن را به طور خلاصه بیان کرد: “ما می خواهیم ایالات نامعتبر را غیرقابل توصیف کنیم.” به عنوان مثال ، سن هرگز نباید منفی یا رشته ای مزخرف مانند “جف” باشد ، بنابراین کد ما هرگز نباید به این مقادیر اجازه ندهد Age
متغیر (حالت های نامعتبر را غیرقابل توصیف می کند | بهبود). ما با ساختن انواع داده ها و منطق خود با دقت ، ما کل دسته های خطاها را با طراحی از بین ببریدبشر این مانند کودک است که کد شما را ضد آب می کند: گوشه های تیز و سوکت های باز (ورودی های بد ، تهی ، مقادیر خارج از محدوده) به طور کامل محافظت می شوند یا حذف می شوند.
نمونه هایی از “درست با ساخت و ساز” در طبیعت
بنابراین چگونه می توانیم به این نیروانا از کد بدون اشکال دست یابیم؟ آیا ما به تکشاخ های جادویی یا رایانه های کوانتومی احتیاج داریم؟ نه ما امروز ابزارها ، زبان ها و روش هایی داریم که اصول “درست توسط ساخت و ساز” را تجسم می کند. در اینجا چند نمونه وجود دارد که ممکن است تشخیص دهید (و چند مورد ممکن است):
-
سیستم های نوع استاتیک قوی – یک سیستم نوع قدرتمند به عنوان اولین خط دفاع شما عمل می کند. زبانها مانند هاکل ، زنگ زد ، اسکالا ، یا حتی خوب جاوا و ج# تا حدی کمتر ، از انواع برای گرفتن اشتباه در زمان کامپایل استفاده کنید. اگر سعی می کنید با
Integer
به عنوانString
یا فراموش کردن یک پرونده ، کامپایلر به شما فریاد می زند قبل از اینکه کد را اجرا کنیدبشر به همین دلیل است که یک برنامه Haskell که اغلب کامپایل می شود فقط کار می کند در اولین اجرا (یک تجربه اسطوره ای برای کسانی که برای خطاهای نوع اجرا استفاده می شوند). هرچه سیستم نوع بیانگر تر باشد ، بیشتر می تواند به شما در تعیین هدف و محدودیت های برنامه کمک کند. در حقیقت ، محققان خاطرنشان می کنند که وقتی انواع هستند به اندازه کافی ثروتمند برای بیان مشخصات کامل یک کار، برنامه نویسی به یک تمرین در پر کردن جزئیات تبدیل می شود به گونه ای که کامپایلر راضی باشد-در این مرحله راه حل شما با توجه به آن مشخصات صحیح است (رابرت Constable در برنامه نویسی صحیح ساخت-موسسه تحقیقات اطلاعاتی دستگاه). مثال: سیستم نوع هاکل (و دیگران مانند اودریس یا دعوت شده با انواع وابسته) به شما اجازه می دهد خواصی مانند “این لیست هرگز خالی نباشد” یا “این عملکرد هرگز تهی نمی کند” درست به تعریف. شما به معنای واقعی کلمه نمی تواند کامپایل شود تا زمانی که آن شرایط را کنترل کنید. Rust در یک دامنه خاص بیشتر می رود: چک کننده وام آن اطمینان می دهد که نشانگرهای آویزان یا مسابقه داده را در کد همزمان ندارید. این دیوارهایی را تنظیم می کند که شما فقط نمی توانید آن را بشکنید ، و بنابراین از کل کلاس های حافظه جلوگیری می کنید (هیچ خطای تقسیم بندی بیشتر در زمان اجرا وجود ندارد ، زیرا شما از نظر جسمی نمی توانید کدی را که می تواند segfault کند ، تهیه کنید!). -
برنامه نویسی عملکردی و تغییر ناپذیری – زبانهای عملکردی (یا سبک ها) نوشتن عملکردهای خالص و استفاده از داده های تغییر ناپذیر را تشویق می کنند. چرا این مهم است؟ زیرا عملکردهای خالص (عوارض جانبی ندارند) هستند استدلال در موردبشر اگر
f(2)
همیشه 4 را برمی گردانید و هیچ چیز دیگری انجام نمی دهید ، لازم نیست نگران تعامل عجیب و غریب باشید یا بیان کنید که پیرامون کد شما است. این مانند یک معادله ریاضی است – جامد و قابل پیش بینی. تغییر ناپذیری به این معنی است که پس از تنظیم یک متغیر ، تغییر نمی کند ، و یک دسته کامل از اشکالات را از بین می برد که در آن چیزی که به طور غیر منتظره داده ها را از زیر شما تغییر می دهد. حتی در محیط های چند رشته ای ، این به این کمک می کند-دیگر “موضوع A مقدار تغییر مقدار بعد از بررسی موضوع B” را تغییر داد “اگر این مقدار هرگز به هیچ وجه تغییر کند! بسیاری از اشکالات از عوارض جانبی غیر منتظره ناشی می شوند. آنها را برش دهید ، و کد خود را به گونه ای ساخته اید که با تعریف از اشکال جلوگیری می کند. زبانهایی مانند هاکل (کاملاً کاربردی) یا سیستم عامل هایی مانند واکنش نشان دادن (که در دنیای UI ، به روزرسانی های حالت تغییر ناپذیر را محبوب کرد) از این ایده استفاده می کند. این یک گلوله نقره ای نیست ، اما قطعاً استدلال را آسان تر می کند “اگر هیچ چیز تغییر نمی کند ، مگر اینکه من به صراحت نسخه جدیدی تهیه کنم ، می توانم اعتماد کنم که داده های من معتبر است و ناگهان به چیز دیگری تبدیل نمی شود.” -
طراحی با قرارداد – این یک متدولوژی است (که توسط زبان برنامه نویسی ایفل پیشگام شده است) که در آن توابع و کلاس ها با آنها همراه هستند قرارداد: پیش شرط ها ، شرایط پس از شرایط و متغیر که باید صادق باشند. به آن فکر کنید مانند نوشتن یک مینی مشخص برای هر عملکرد: “قول می دهم ، اگر لیستی غیر خالی به من بدهید ، من یک لیست مرتب شده از همان طول را برمی گردانم” و یک چکمه اتوماتیک اطمینان می دهد که اگر کسی قول را نقض کند (یا اگر شما قول خود را در کد نقض کنید) ، بلافاصله گرفتار می شود. در صورت شکسته شدن قرارداد ، ایفل در واقع از ادامه کار خودداری می کند ، “سلام توسعه دهنده ، کسی قرارداد را پیچید!” به این ترتیب ، بسیاری از اشکالات در مرزهای رابط ، درست هنگام وقوع ، گرفتار شده اند ، نه اینکه سکوت داده ها را خراب کرده و بعداً منفجر می شوند. برخی از زبانها و چارچوب های دیگر ایده های مشابهی را اتخاذ کرده اند (به عنوان مثال ، جاوا دارای کتابخانه هایی برای برنامه نویسی قرارداد است و زبانهایی مانند D و ADA پشتیبانی داخلی برای متغیرها و ادعاها دارند). این به اندازه یک اثبات رسمی قوی نیست ، اما یک راه عالی برای در زمان اجرا اطمینان حاصل کنید این شرایط خاص همیشه برآورده می شود ، از این طریق نرم افزار شما تا زمانی که قراردادها نگه داشته شود درست می شود. مثل گفتن “ما می توانیم به مرحله بعدی ساخت خانه برویم فقط در صورتی که بنیاد بتواند از 100 تن پشتیبانی کند – در غیر این صورت ، در همان جا متوقف شود.” (در حقیقت ، یک مقاله متوسط به درستی ساخت و ساز با یک پروژه ساختمان که در آن هر مرحله قبل از حرکت به “قرارداد” نیاز دارد (صحیح توسط ساخت و ساز-متوسط).)
-
روشهای رسمی و تأیید -اکنون به چیزهای سنگین می رسیم. روشهای رسمی شامل نوشتن مشخصات ریاضی از آنچه نرم افزار باید انجام دهد ، و سپس اثبات (با دست یا با ابزارهایی) که کد با مشخصات آن مطابقت دارد ، یا حتی به طور خودکار تولید کد از مشخصات است. این مانند نوشتن یک طرح هوایی است و به دنبال آن به نامهبشر ابزارها و زبانهای موجود در این فضا شامل COQ ، ISABELLE ، WILL +، DAFNY ، Z3 ، آلیاژ ، و روش شناسی مانند دو روش یا Event-B (در اروپا برای راه آهن و سیستم های مترو استفاده می شود). اینها مظهر “صحیح توسط ساخت و ساز” است – اگر درست انجام شود ، شما به نرم افزاری که هست پایان می دهید از نظر ریاضی اثبات شده است برای برآورده کردن نیازهای آن به عنوان مثال ، از روش B برای ساخت نرم افزار برای Paris Métro Line 14 (خط قطار بدون درایور) و بخش هایی از موشک Ariane 5 استفاده شد ، با موفقیت بسیار خوبی (B-Method-Wikipedia). آن سیستم ها داشت صفر اشکالات موجود در برخی از مؤلفه های مهم به دلیل اثبات صحیح قبل از اجرای آن. نمونه مشهور دیگر این است کامپایلر C، که یک کامپایلر C است که به طور رسمی تأیید شده است تا اطمینان حاصل شود که هرگز یک برنامه را اشتباه نمی کند. در آزمایش ، یک نسخه از CompCert با یک میلیون برنامه تصادفی اجرا شد و هیچ خطایی از کد اشتباه ایجاد نکرد ، در حالی که یک کامپایلر پیشرو (GCC) چند مورد سوء استفاده را تحت همان آزمون ها نشان داد (اعتماد ، اما تأیید کنید-در دانشگاه تعبیه شده). این یک کار بزرگ است – این بدان معنی است که می توانید به کد کامپایل شده Compcert اعتماد کنید به گونه ای که معمولاً به یک ابزار تأیید نشده اعتماد نمی کنید. البته ، این روش ها به تخصص و تلاش زیادی نیاز دارند – نوشتن اثبات یا مشخصات رسمی مانند انجام ریاضیات انتزاعی است – اما وقتی هزینه شکست زیاد است (فکر کنید هواپیما ، دستگاه های پزشکی یا سیستم های مالی) ، آنها فوق العاده ارزشمند هستند. آنها درست پخت در در بالاترین سطح ممکن
-
زبانهای خاص دامنه و چارچوبهای محدود – یکی دیگر از رویکردهای CBC ایجاد یک زبان یا چارچوب محدود است که در آن خطاهای مشترک غیرممکن است. به عنوان مثال ، SQL را برای نمایش داده های پایگاه داده در نظر بگیرید: این به گونه ای طراحی شده است که شما اعلام می کنید چه شما می خواهید (به عنوان مثال ، “به من همه کاربران قدیمی تر از 18” را بدهید) و سیستم مشخص می شود چگونه برای انجام آن شما به طور تصادفی یک حلقه نامحدود در SQL نمی نویسید – این زبان به این ترتیب ساخته نشده است ، بنابراین این یک اشکال است که نمی توانید داشته باشید. یا به HTML/CSS برای چیدمان فکر کنید – شما نمی توانید یک استثناء اشاره گر تهی در CSS خالص دریافت کنید. بدترین کاری که انجام می دهید این است که سبک را خراب کنید ، اما مرورگر را خراب نمی کنید. اینها نمونه های ساده ای هستند ، اما آنها این نکته را نشان می دهند: با محدود کردن کارهایی که می توانید انجام دهید ، زبان حالت های شکست خاصی را حذف می کند. یک مثال پیچیده تر است جرقه/آنجا (نباید با Apache Spark اشتباه گرفته شود). Spark زیر مجموعه ای از زبان ADA است که برای سیستم های بحرانی طراحی شده است. این با طراحی ویژگی هایی را به وجود می آورد که می تواند منجر به اشکالات (مانند نشانگرهای نامحدود) شود و اثبات رسمی خواص را فراهم می کند. ایده این است که با طراحی زبان یا چارچوب با محدودیت های قوی ، شما راه هایی را که یک توسعه دهنده می تواند خود را با پای خود شلیک کند محدود کنیدبشر این مانند ارائه یک زمین بازی محافظت شده برای برنامه نویسی است – می توانید از آن لذت ببرید ، اما اندام خود را از دست نخواهید داد زیرا چیزهای واقعاً خطرناک از بین رفته است.
اینها فقط چند نمونه هستند. حتی چیزهایی مانند ابزارهای لینت یا آنالایزرهای استاتیک در اینجا نقش ایفا کنید: آنها صحت کامل نیستند ، اما آنها زود هنگام اشتباهات متداول را به خود جلب می کنند (مانند “سلام ، شما ممکن است یک اشاره گر تهی در اینجا داشته باشید” یا “این تماس API ممکن است شکست بخورد ، شما باید نتیجه را بررسی کنید”). هر یک از این تکنیک ها ، از سیستم های نوع گرفته تا اثبات رسمی ، به همان فلسفه کمک می کند: مشکلات را در اسرع وقت یا بهتر یا بهتر ، آن را درست کنید تا اصلاً اتفاق نیفتدبشر همانطور که این گفته در پزشکی می رود ، “پیشگیری بهتر از درمان است.” همین مورد در مورد اشکالات نرم افزاری نیز صدق می کند (هزینه یافتن اشکالات بعداً در SDLC).
معاملات ، چالش ها و تصورات غلط
حالا ، قبل از اینکه همه ما به دست بیاییم و کامبیا را بخوانیم که هرگز دوباره اشکالات ننوشتیم ، بیایید واقعیت صحبت کنیم. درست با ساخت و ساز بسیار جذاب است ، اما رایگان نیست. تجارت و چالش ها وجود دارد ، و شناختن آنها مهم است (البته با چشمک و گره زدن):
-
تلاش مقدماتی در مقابل تلاش بعدی: CBC اغلب به این معنی است که شما زمان و فکر بیشتری را سرمایه گذاری می کنید در صدربشر شما ممکن است ساعت های اضافی را برای نوشتن یک مشخصات رسمی ، اثبات یک قضیه در مورد کد خود یا کشتی گیری با یک چک کننده نوع خاردار که از چیزی که شما شکایت می کند ، صرف کنید احتمالاً هرگز اشتباه نکنید … تا زمانی که این کار را نکنید. این می تواند کندتر باشد ، به خصوص در ابتدای یک پروژه وقتی فقط می خواهید چیزی را ببینید. این یک سناریوی کلاسیک لاک پشت در مقابل خرگوش است-لاک پشت CBC در ابتدا کند است ، اما پایدار است ، در حالی که خرگوش سریع و با کثیف پیش رو است اما ممکن است بعداً به دیواره ای از اشکالات برخورد کند. در یک استارتاپ یا هکاتون ، ممکن است سرعت را نسبت به صحت مطلق اولویت بندی کنید (و این اشکالی ندارد-احتمالاً برای برنامه لیست لیست های آخر هفته خود به اثبات رسمی احتیاج ندارید). اما اگر می توانید زمان پیش فرض را تحمل کنید ، CBC با صرفه جویی در وقت اشکال زدایی و زمان نگهداری در جاده ، پرداخت می کند. این یک تجارت است: زمان صرف شده برای جلوگیری از اشکالات اکنون در مقابل زمان صرف شده برای رفع اشکالات بعداًبشر
-
منحنی یادگیری (مغز صدمه می زند ، کمک می کند): برخی از این تکنیک ها و ابزارها شهرت لازم را برای یادگیری سخت دارند. اگر تا به حال خطاهای نوع هاکل را مشاهده کرده اید (به طرز نامعلوم طولانی و به ظاهر غیرقابل توصیف) یا سعی در خواندن اثبات در COQ دارید ، می دانید که می تواند احساس کند که به دکترا در مزخرفات انتزاعی نیاز دارید. انواع وابسته ، مونادها ، ادعاهای ثابت … این مفاهیم ژارگون و ناآشنا برای یک توسعه دهنده متوسط است. این منحنی یادگیری می تواند یک مانع باشد. بسیاری از مهندسان فکر می کنند که روشهای رسمی فقط برای دانشگاهیان است که کت های توئیت دارند ، یا اینکه زبانهایی مانند هاکل برای مردمی برج عاج هستند و نه برنامه نویسی “دنیای واقعی”. خبر خوب این است که این تا حدودی یک تصور غلط است – این چیزها قابل یادگیری هستند و یک جامعه در حال رشد و ابزار بهتر وجود دارد – اما این نیاز به تمایل به یادگیری دارد و شاید برخی از عادت ها را از بین ببردبشر این مانند جابجایی از یک گیربکس دستی به یک ماشین اتوماتیک است: در ابتدا به کلاچی می روید که در آنجا نیست ، اما در نهایت شما تعجب می کنید که چگونه بدون آن زندگی کرده اید.
-
بیش از حد برای برخی از مشکلات: هر اشکال ارزش اثبات ریاضی ندارد. گاهی اوقات ، اضافه کردن چند تست واحد است راه مقرون به صرفه تر از تأیید رسمی ماژول. اگر در حال نوشتن یک اسکریپت پرتاب یا یک برنامه ساده Crud هستید ، CBC کامل با مشخصات رسمی ممکن است از Bazooka برای کشتن یک پشه استفاده کند. یک تصور غلط رایج این است که “با ساخت و ساز” درست است هرگز آزمایش نکنید و هرگز اشکالات نداشته باشیدبشر این یک ایده آل است ، اما در عمل ما اغلب رویکردهایی را با هم مخلوط می کنیم – از انواع قوی و برخی از تجزیه و تحلیل استاتیک (CBC سبک وزن) استفاده می کنیم و سپس برای بقیه تست می نویسیم. CBC به این معنی نیست که شما آزمایش را از بین می برید. این بدان معناست که شما برای موارد خاص به بررسی های زمان ساخت و ساز تکیه می کنید تا آزمایشات شما بتواند بر رفتار و ادغام سطح بالاتر متمرکز شود. شما هنوز هم باید اطمینان حاصل کنید که نرم افزار شما در واقع آنچه را انجام می دهد کاربر می خواهد ، که هیچ قضیه نمی تواند تضمین کند اگر مشخصات شما در وهله اول اشتباه داشته باشد. . مشتری ناراضی.)
-
مشکل مشخص (با نام مستعار “صحیح” در مقابل ** درست است): ** این بسیار مهم است: “صحیح بودن” بودن به معنای “صحیح با توجه به مشخصات” است. اگر مشخصات شما ناقص یا اشتباه است ، برنامه شما می تواند باشد به طور رسمی درست است و هنوز هم کاملاً اشتباه است. همانطور که یک روش رسمی با طنزآمیز آن را بیان کرد ، “درست” یک کلمه کثیف است – ما فقط مطابقت با یک مشخصات را تضمین می کنیم ، و اگر مشخصات اشتباه باشد ، انطباق به معنای زیادی نیست. “ (10 تصور غلط در مورد روشهای رسمی • Buttondown). به عبارت دیگر ، CBC یک گره جادویی نیست که نرم افزار شما را تضمین می کند همان چیزی است که کاربر می خواست. من تضمین می کند که مشخصاتی را که در آن نوشتید ملاقات می کندبشر اگر فراموش نکنید که چیزی را مشخص کنید (مثلاً عملکرد یا یک قانون تجاری خاص) ، می توانید یک اشکال در آن داشته باشید ایده حتی اگر در اجرای آن نباشد. این یک چالش است: نوشتن مشخصات خوب سخت است! در حقیقت ، یک مزیت پنهان از تلاش CBC یا رویکردهای رسمی است شما را وادار می کند که واقعاً سخت فکر کنید که “صحیح” به چه معنی است برای نرم افزار شما این به تنهایی می تواند شکاف های تفکر شما را کشف کند. اما بله ، شما باید مراقب باشید – اجازه ندهید که اگر نیازهای شما نقص داشته باشد ، شما را به یک احساس امنیت کاذب تبدیل کنید. این نرم افزار ممکن است به روش اشتباه “درست” باشد.
-
دامنه ها و ابزارهای محدود: برخی از ابزارها یا زبانهای صحیح ساختاری محدودیت هایی دارند. به عنوان مثال ، یک زبان وابسته به نوع ممکن است انواع خاصی از برنامه ها را محدود کند یا برای کامپایل کندتر باشد. یک کتابخانه به طور رسمی تأیید شده ممکن است زیر مجموعه ای از آنچه را که شما نیاز دارید را پوشش دهد (به عنوان مثال ، CompCert بیشتر C را پشتیبانی می کند ، اما هر ترفند GCC یا ترفند مونتاژ درون خطی که ممکن است بخواهید از آنها استفاده کنید (اعتماد ، اما تأیید کنید – در آکادمی تعبیه شده است) (اعتماد ، اما اعتماد ، اما اما تأیید کنید. تأیید – تعبیه شده در آکادمی)). شما اغلب باید در خطوط کار کنید. این معمولاً یک معامله بزرگ نیست – این زیر مجموعه به طور معمول به عنوان عملی انتخاب می شود – اما این بدان معناست که گاهی اوقات نمی توانید از آن یک ترفند بد بو که آموخته اید استفاده کنید ، زیرا سیستم اثبات یا نظم و انضباط می گوید “nope”. کمی شبیه این است که چگونه چارچوبی مانند Ruby on Rail بسیار صورت گرفته است: این کار آسان (و ایمن) را آسان می کند اما ممکن است چیزهای عجیب و غریب را سخت کند. با CBC ، شما برخی از انعطاف پذیری را برای ضمانت ها تجارت می کنید. بیشتر اوقات ارزش آن را دارد ، اما اگر مرزها را تحت فشار قرار می دهید یا با نیازهای بسیار غیر متعارف برخورد می کنید ، می تواند احساس محدودیت کند.
-
مربوط به عملکرد و کارآیی: گاهی اوقات ، اجرای صحت می تواند سربار را اضافه کند. به عنوان مثال ، بررسی های قرارداد زمان اجرا (مانند مواردی که توسط قرارداد طراحی شده اند) هزینه عملکرد (هرچند معمولاً کوچک) را متحمل می شوند. یا استفاده از زبانهای ایمن تر (مانند جاوا یا C# با آرایه های بررسی شده با مرزها) ممکن است آهسته تر از C با حساب نشانگر چک نشده باشد-اما شما به طور تصادفی حافظه تصادفی را در جاوا نمی خوانید ، در حالی که در C شما ممکن است با سرعت صاعقه ، مستقیم به یک تصادف اغلب بین حداکثر عملکرد و ایمنی تجارت وجود دارد. به گفته این ، بسیاری از ابزارهای مدرن سعی در بهینه سازی این امر دارند تا هزینه حداقل و صریح برنامه ای باشد کار اما آیا چند میلی ثانیه کندتر بهتر از آن است که سریع خراب می شود! با این وجود ، اگر در شرایطی هستید که هر اونس عملکرد را شمارش می کند (می گویند تجارت با فرکانس بالا) ، باید ایمنی و سرعت را متعادل کنید. بعضی اوقات توسعه دهندگان تصمیم می گیرند که چک های خاصی را در تولید برای سرعت خاموش کنند – اما پس از آن ضمانت را از دست می دهید. این یک تعادل دقیق است.
-
چالش های فرهنگی و تیمی: معرفی اصول CBC می تواند مقاومت را برآورده کند. اعضای تیم ممکن است بگویند “ما همیشه این کار را انجام داده ایم ، چرا تغییر می کنیم؟” یا “ما وقت نوشتن مشخصات را نداریم ، هفته آینده مهلت داریم.” یک عامل انسانی وجود دارد: متقاعد کردن افراد به اتخاذ شیوه های سختگیرانه تر یا یادگیری ابزارهای جدید نیاز به نشان دادن ارزش دارد. این اغلب به معرفی این ایده ها به تدریج کمک می کند (شاید با اضافه کردن ادعاهای بیشتر و استفاده از سیستم نوع با دقت بیشتری شروع کنید ، سپس به چیزی مانند تست های مبتنی بر خاصیت بروید ، سپس شاید کمی مشخصات رسمی برای یک قطعه مهم). تصورات غلط زیاد است ، مانند “روشهای رسمی ** همه را بدست می آورد* اشکالات “* (نه ، فقط مواردی که مشخص می کنید) یا “استفاده از یک سیستم از نوع قوی به این معنی است که من به QA احتیاج ندارم” (نه ، این اشکالات خاص را کاهش می دهد اما جایگزین قضاوت انسان و آزمایش کامل نمی شود). آموزش و ارتباطات روشن در اینجا مهم است. خبر خوب: هنگامی که تیمی می بیند یک رویکرد CBC از یک اشکال نامطبوع جلوگیری می کند یا یک کلاس کامل از موضوعات (مانند استثنائات اشاره گر تهی) را برای خوب از بین می برد ، آنها اغلب تبدیل می شوند.
به طور خلاصه ، درست با ساخت و ساز یک گلوله نقره ای نیست – این بیشتر شبیه یک سپر واقعاً محکم است. این می تواند بسیاری از اشکالات ورودی را از بین ببرد ، اما شما باید بدانید که چگونه آن را به کار بگیرید ، و همه چیز را مسدود نمی کند (به خصوص اگر یک کماندار در خارج از منطقه سپر شما باشد!). تعادل CBC با نیازهای عملی نام بازی است. بسیاری از پروژه های موفق رویکردهایی را می آمیزند: آنها از تایپ قوی و شاید برخی مشخصات رسمی برای هسته استفاده می کنند ، و هنوز هم تست می نویسند و برای بقیه بررسی های منظم انجام می دهند.
یک چیز دیگر را بخاطر بسپار: حتی با بهترین ساخت و ساز ، اتفاقات غیر منتظره می تواند رخ دهد. محیط می تواند منحنی های منحنی را پرتاب کند. به عنوان مثال ، شما ممکن است ثابت کنید که کد شما می تواند 1000 درخواست/ثانیه را کنترل کند ، اما پس از آن شخصی آن را بر روی سرور سیب زمینی مستقر می کند که نمی تواند بار را تحمل کند – رونق ، خرابی سیستم (نه تقصیر کد شما ، اما هنوز یک شکست). CBC بر روی صحت در محدوده کنترل (کد و منطق آن) تمرکز دارد. این جایگزین تفکر در مورد مقیاس پذیری ، قابلیت استفاده یا تعامل سیستم خارجی نیست. بنابراین هنوز نظارت و آزمایش خود را دور نکنید!
آوردن “صحیح توسط ساخت و ساز” به کار خود: غذای اصلی
در حال حاضر ، شما ممکن است فکر کنید ، “این به نظر می رسد جالب است ، اما چگونه می توانم از آن استفاده کنم بدون اینکه زندگی خود را وارونه کنم؟” خبر عالی شما هستید لازم نیست همه چیز را به زبان جدید بازنویسی کنید یا یک شب به یک روش رسمی تبدیل شوید برای بهره مندی از اصول CBC. در اینجا برخی از موارد آماده سازی عملی و عملی برای چگونگی شروع کار در ترکیب این ایده ها آورده شده است:
-
1. از نقاط قوت زبان خود استفاده کنید: هر زبان برنامه نویسی که از آن استفاده می کنید ، ویژگی های آن را برای ابتلا به خطاها زود هنگام یاد بگیرید. اگر در یک زبان تایپ شده به زبان آماری هستید ، به آن تکیه دهید – از سیستم نوع استفاده کنید تا حالت های غیرقانونی را غیرقابل توصیف کنید. به عنوان مثال ، به جای بول ها یا رشته ها برای دسته های ثابت ، از انواع داده های enums یا جبری استفاده کنید (بنابراین نمی توانید عبور کنید
"Wednesday"
وقتی فقط"Monday|Tuesday"
مجاز هستند) برای مقادیری که ممکن است غایب باشند از انواع غیر قابل تهی یا گزینه/شاید انواع استفاده کنید ، بنابراین مجبور هستید پرونده “هیچ چیز در آنجا” را کنترل کنید. هشدارهای کامپایلر را روشن کنید (یا حتی هشدارها را به عنوان خطاها رفتار می کنند) – آنها اغلب موارد مشکوک را پرچم می کنند که می تواند اشکالات باشد. اگر از یک زبان پویا استفاده می کنید ، استفاده از تجزیه و تحلیل استاتیک اختیاری یا اشاره را در نظر بگیرید (به عنوان مثال ، پایتونmypy
یا TypeScript برای Js) برای قطعات بحرانی. اساساً ، اجازه دهید ابزارها هنگام نوشتن کد در مورد اشکالات احتمالی به شما بگویند، نه بعد از تولید. -
2. طراحی با قراردادها (حتی به طور غیررسمی): شما به یک زبان فانتزی برای استفاده از طراحی با تفکر قرارداد احتیاج ندارید. حتی در JavaScript ساده ، می توانید نظرات یا ساده بنویسید
if
چک برای فرضیات:
function buy(item, user) {
if (!user) throw new Error("User must be logged in to buy an item");
// pre-condition
// ... function logic ...
// (maybe check post-condition at end, e.g., inventory count reduced)
}
به زبانهایی مانند پایتون یا جاوا ، از آنها استفاده کنید assert
بیانیه هایی برای مستند سازی و اجرای فرضیات (assert x >= 0, "x should be non-negative"
). در تنظیم تیمی ، بررسی کد باید این فرضیات را بررسی کند: “اگر این لیست خالی باشد چه اتفاقی می افتد؟ آیا باید این کار را انجام دهیم؟ ” با فکر کردن از نظر شرایط قبل/پست ، به طور طبیعی شروع به نوشتن کد می کنید که قوی تر است. برخی از زبانها از قراردادهای صریح پشتیبانی می کنند – اگر این کار را دارید ، آنها را امتحان کنید. اما حتی بدون وجود ، طرز فکر کمک می کند: همیشه بپرسید “چه چیزی باید این عملکرد کار کند ، و بعد از اجرای آن چه صادق خواهد بود؟” سپس مطمئن شوید که کد شما این حقایق را بررسی می کند.
-
3. با روش های رسمی و رسمی کوچک را شروع کنید: اگر روشهای رسمی شما را فریب می دهند اما شما آماده نیستید تا به COQ اثبات شوید ، می توانید سبک تر را شروع کنید. ابزارهایی مانند بیا به شما اجازه می دهد تا طرح های سطح بالا را بنویسید (مانند نحوه تعامل اجزای مختلف یک سیستم) و آنها را برای اشکالات منطقی بررسی کنید پیش از برنامه نویسی این می تواند نقص های طراحی مانند شرایط مسابقه یا حالت های متناقض را بدست آورد. این بسیار نزدیک است-شما کد واقعی را نمی نویسید ، مشخصات را در یک کد شبه می نویسید و به ابزار اجازه می دهید تناقضات پیدا کند. رویکرد دیگر این است تست مبتنی بر خاصیت (در کتابخانه هایی مانند QuickCheck برای هاکل/ارلانگ یا فرضیه پایتون یافت می شود). این اثبات رسمی نیست ، اما شما خواص می نویسید – قوانین عمومی – و چارچوب تست های تصادفی را برای تلاش برای شکستن آنها ایجاد می کند. این راهی برای گفتن “برای همه ورودی هایی است که X را برآورده می کنند ، کد من باید Y را برآورده کند” و اعتماد به نفس بالایی را دریافت می کند که این درست است زیرا این آزمایش یک مورد را امتحان کرده است. این شما را به سمت “تفکر مشخص” سوق می دهد بدون نیاز به تأیید رسمی کامل. و اگر احساس جسورانه می کنید ، یک ماژول کوچک از پروژه خود را انتخاب کنید و سعی کنید یک مشخصات رسمی بنویسید یا از یک دستیار اثبات روی آن استفاده کنید. حتی اگر این فقط یک آزمایش یادگیری باشد ، تفکر شما را سطح می کند. به عنوان مثال ، سعی کنید یک عملکرد مرتب سازی ساده را به زبانی مانند IDRIS یا COQ بنویسید که در آن “لیست خروجی طبقه بندی شده است و عناصر مشابه ورودی” دارد-چشم نواز است که کامپیوتر اثبات شما را بررسی کند. آموزش های زیادی برای اینها وجود دارد. حتی ممکن است با آن سرگرم کننده باشید (اگر معماها چیز شما هستند).
-
4. از کتابخانه ها/چارچوب هایی که CBC را در آغوش می گیرند استفاده کنید: لازم نیست چرخ را اختراع کنید. بسیاری از چارچوب های مدرن این ایده ها را در بر می گیرند. به عنوان مثال ، چارچوب های وب ممکن است اعتبار داخلی برای ورودی ها داشته باشند (بنابراین شما به معنای واقعی کلمه نمی توانید از کنترلر عبور کنید) ، یا ORM های پایگاه داده ای که از تزریق SQL در ساخت و ساز جلوگیری می کنند (آنها به شما اجازه نمی دهند که نمایش داده های خام را نادرست بنویسید). کتابخانه های رمزنگاری اغلب API های سطح بالا را ارائه می دهند بنابراین شما نمی توان نداشت سوء استفاده از آنها (شما به طور تصادفی یک ژنراتور شماره تصادفی ضعیف را انتخاب نمی کنید زیرا کتابخانه یک مورد امن را مجبور می کند). اینها را به عنوان اشکال CBC بشناسید و از آنها طرفداری کنید. این مانند ترجیح دادن یک ماشین با ABS و کیسه های هوا است – آنها در آنجا هستند تا شما را از تصادفات نجات دهند. انتخاب ابزارهای خوب طراحی شده گامی به سوی ایجاد سیستم های صحیح است.
-
5. یک ذهنیت صحت را پرورش دهید: این یکی بیشتر مبهم است ، اما مهم است. “چه چیزی را می توان در اینجا اشتباه کرد ، و چگونه می توانم با طراحی از آن جلوگیری کنم؟” یکی از سؤالات مانترا شما در حال توسعه است. قبل از نوشتن کد ، در مورد موارد متغیر و موارد لبه فکر کنید. در طول بررسی کد ، از شخصی که به پرونده ای که از دست داده اید اشاره می کند (آنها به طور موثری کمک می کنند تا کد شما را با ساخت و ساز صحیح تر کند!). فرهنگ تیم را ترغیب کنید تا از صحت ارزش گذاری کند و نه فقط سرعت. این در واقع بسیار توانمند است که به عنوان یک دیو بسیار توانمند است که بدانید که شما به سناریوهای پیچیده قبل از زمان فکر کرده اید و به گونه ای کدگذاری شده اید که آنها نمی توانند به شما آسیب برساند. وقتی گزارش اشکال وارد می شود ، آن لحظات وحشت را نجات می دهد و فکر می کنید “اوه نه … چه چیزی را از دست دادم؟” در عوض ، شما اغلب می گویند ، “ها! این سناریو در سیستم ما غیرممکن است. ” (نکته حرفه ای: در واقع “غیرممکن” به qa نگویید ؛ این سرنوشت را وسوسه می کند … اما شما این ایده را می گیرید!).
در پایان ، ترکیب صحیح توسط اصول ساخت و ساز در مورد است فعال بودن در مورد کیفیت این یک تغییر از ذهنیت “نوشتن کد است ، سپس سعی کنید ثابت کنید که این کار می کند” برای “اثبات (یا اطمینان از آن) که هنگام نوشتن آن کار می کند.” این بدان معنا نیست که شما هرگز یک اشکال را دوباره نمی نویسید (فکر می کنید!) ، اما این بدان معنی است که شما از وقوع بسیاری از اشکالات جلوگیری می کنید و دیگران را خیلی زودتر در این روند گرفتار می کنید.
نتیجه گیری: درست آن را بسازید ، و دیگر نیازی به رفع آن نخواهید داشت
“درست با ساخت و ساز” ممکن است مانند یک ایده آل بلند به نظر برسد ، اما واقعاً مربوط به مهندسی عقل سلیم است: دو بار اندازه گیری کنید ، یک بار برش دهید، یا شاید درست بنویسید ، یک بار اشکال زدایی کنید (یا هرگز)بشر این در مورد ابتلا به اشتباهات در اولین نقطه ، یا ساختار پروژه شما است تا برخی از اشتباهات به سادگی اتفاق بیفتد. ما دیدیم که چگونه این ایده به اشکال مختلفی ظاهر می شود – از سیستم های نوع که کد اشتباه را نمی پذیرند ، تا اثبات رسمی که یک الگوریتم را تضمین می کند ، مشخصات خود را برآورده می کند ، به چیزی به اندازه API که به شما اجازه سوء استفاده نمی کند. این مزایا کمتر دریل های آتش سوزی در اواخر شب ، اعتماد به نفس بیشتر در نسخه های شما و در نهایت توسعه دهندگان و کاربران شادتر است.
مطمئناً ، چالش هایی وجود دارد و این چیزی نیست که شما 100 ٪ برای هر خط کد اعمال کنید. اما اتخاذ حتی کمی از فلسفه CBC می تواند قابلیت اطمینان نرم افزار شما را به طرز چشمگیری بهبود بخشد. دفعه بعد که یک اشکال دلهره آور پیدا کردید ، لحظه ای بپرسید: “آیا می توانم چیزهای ساختاری را برای جلوگیری از این کار کاملاً ساختم؟” اغلب ، جواب مثبت است – شاید با یک رویکرد برنامه نویسی متفاوت یا ادعای اضافی یا استفاده از کتابخانه ای که قطعات پیچیده را بر عهده دارد. با گذشت زمان ، این گزینه های کوچک به یک پایگاه کد اضافه می کنند قوی با طراحیبشر
بنابراین ، چه در حال ساختن نرم افزار بعدی مریخ مریخ یا فقط یک برنامه لیست کارها باشید ، درس اصلی را به خاطر بسپارید: همانطور که می روید ، آن را درست بسازید ، و نیازی نیست که آن را در پست وصله کنید. خود آینده (و تیم شما و کاربران شما) از شما تشکر می کنند. و ممکن است به جای اینکه به طرز وحشیانه ای تعقیب یک Heisenbug را تعقیب کنید ، ممکن است در طول استقرار بعدی خود یک خواب کامل داشته باشید. در حال حاضر این که ویژگی ای است که ارزش اجرای آن را دارد!
مواظب باشید ، و ساختمان شاد (درست)! 🚀
منابع: (برای کنجکاو و شک و تردید ، در اینجا برخی از منابع که از مفاهیمی که در مورد آنها بحث کردیم حمایت می کنند)
-
Constable ، R. (2014). رابرت پاسبان در برنامه نویسی درست توسط ساخت -بحث می کند که چگونه سیستم های نوع غنی می توانند وظایف را به طور کامل مشخص کنند ، و برنامه ها را با ساخت و ساز (Robert Constable در برنامه نویسی درست توسط ساخت-موسسه تحقیقات اطلاعاتی دستگاه) درست می کند.
-
موسسه علوم سیستم IBM. هزینه نسبی رفع نقص – دریافت که اشکالات گرفتار شده در اوایل (مرحله طراحی) می تواند تا 100 برابر ارزان تر از مواردی که در نگهدارنده (هزینه پیدا کردن اشکالات بعداً در SDLC) قرار گرفته اند ، برطرف شوند.
-
Hoare ، Car (حدود 2009). منابع تهی: اشتباه میلیارد دلاری – نقل قول معروف تونی هار با ابراز پشیمانی از اختراع ارجاع تهی (منابع تهی: اشتباه میلیارد دلاری – infoq).
-
واتسون ، ا. (2024). ایالات نامعتبر را غیرقابل توصیف کنید – مقاله نشان می دهد که چگونه استفاده از طراحی نوع می تواند از حالت های غیرممکن (مانند سنین منفی) در COD جلوگیری کند (حالت های نامعتبر را غیرقابل توصیف کنید | بهبود).
-
ویکی پدیا: دو روش -یادداشت می کند که از روش B رسمی در سیستم های ایمنی مانند پاریس Métro Line 14 و Ariane 5 Rocket استفاده شده است ، که نمونه ای از ساخت و ساز در Actio (B-Method-Wikipedia) را نشان می دهد.
-
Regehr ، J. (2013). اعتماد ، اما تأیید کنید – پست وبلاگ در مورد آزمایش کامپایلر Compcert C به طور رسمی تأیید شده در مقابل GCC ؛ یک میلیون آزمون برنامه تصادفی هیچ گونه سوء استفاده در CompCert ، در مقابل اشکال در GC (Trust ، اما تأیید – تعبیه شده در آکادمی) را پیدا نکرد.
-
وین ، H. (2021). 10 تصور غلط در مورد روشهای رسمی – توضیح می دهد که روشهای رسمی (و با پسوند CBC) از مطابقت با مشخصات اطمینان حاصل می کنند ، و اگر مشخصات اشتباه باشد ، برنامه هنوز ممکن است آنچه را که شما انجام نمی دهد واقعاً WAN (10 تصور غلط در مورد روشهای رسمی • Buttondown).