مسیر اثرگذاری
گریس هاپر با رایانهٔ Harvard Mark I کار کرد و در توسعهٔ ابزارهای اولیهٔ ترجمهٔ برنامه، از جمله A-0، نقش داشت. فعالیت او در زبانهای کسبوکار و شکلگیری COBOL نیز مهم بود؛ COBOL حاصل کار جمعی بود، نه یک نفر.
نکته برای امروز
ابزار خوب فاصلهٔ میان مسئله و بیان راهحل را کمتر میکند. روایت هاپر فرصتی است برای فکرکردن به خوانایی زبان، ابزار توسعه و هزینهٔ نگهداری نرمافزار.
فاصلهٔ مسئله تا زبان ماشین
در برنامهنویسی اولیه، بخش بزرگی از کار به بیان جزئیات بسیار نزدیک به سختافزار اختصاص داشت. ابزار ترجمهٔ برنامه، این امکان را ایجاد میکند که بخشی از منظور انسان در سطحی خواناتر نوشته و سپس به دستورهای مناسب ماشین تبدیل شود. اهمیت این مسیر فقط کوتاهشدن کد نیست؛ امکان بررسی، آموزش و نگهداری برنامه نیز تغییر میکند.
در روایت هاپر باید میان مشارکت مهم یک فرد و شکلگیری جمعی یک زبان تمایز گذاشت. کار روی ابزارهای اولیهٔ ترجمه و نقش او در زبانهای کسبوکار، زمینهٔ فهم سهم اوست؛ نسبتدادن کل COBOL به یک نفر، سهم کمیتهها، تیمها و استانداردسازی را نادیده میگیرد. همچنین خواناترشدن زبان به معنی حذف نیاز به طراحی دقیق نیست.
مثال آموزشی: یک قاعدهٔ حقوق و دستمزد
فرض کن باید مبلغ اضافهکاری کارکنان محاسبه شود. بیان مسئله با نامهای روشن، واحد پول، مدت کار و شرطهای مشخص، بازبینی آن را برای همکار بعدی آسانتر میکند. اما اگر نرخ، شیوهٔ گردکردن یا حالت دادهٔ ناقص مبهم باشد، حتی یک زبان بسیار خوانا هم نتیجهٔ درست را تضمین نمیکند. زبان خوب ابزار بیان قرارداد است، نه جایگزین قرارداد.
یک مترجم برنامه معمولاً میتواند خطاهای ساختاری یا نوعی مشخصی را تشخیص دهد؛ اینکه فرمول دقیقاً با نیاز سازمان سازگار است، به آزمون و بازبینی دامنهٔ مسئله نیاز دارد. این تفکیک به ما یادآوری میکند چرا باید هم ابزار توسعه را بشناسیم و هم تعریف کسبوکار را مستند کنیم.
استاندارد و هزینهٔ تغییر
برنامهای که امروز نوشته میشود ممکن است سالها بعد توسط تیم دیگری تغییر کند. نامگذاری ثابت، قالب دادهٔ روشن و رفتار قابل پیشبینی در خطا، سرمایهگذاری روی آن آینده است. استانداردها زمانی ارزشمندند که ارتباط میان تیمها و ابزارها را قابل اتکا کنند، نه اینکه تنها یک سند رسمی به پروژه اضافه کنند.
برداشت آموزشی IROSG از این مسیر آن است که خوانایی را قابل بررسی کنیم: یک تابع را به همکار بده، بدون توضیح شفاهی از او بخواه ورودی و خروجی را شرح دهد و سپس برداشت او را با آزمونها مقایسه کن. جایی که برداشتها متفاوتاند، احتمالاً مستندات یا قرارداد برنامه نیاز به اصلاح دارد.
از دستور ماشین تا بیان مسئله
برای دیدن ارزش ابزارهای ترجمهٔ برنامه، یک مسئلهٔ سادهٔ محاسبهٔ حقوق را تصور کنید. توصیف مسئله با ساعت کار، نرخ و قواعد پرداخت شروع میشود؛ اما ماشین باید مجموعهای از عملیات دقیق اجرا کند. فاصلهٔ میان این دو سطح، جایی است که زبان و ابزار توسعه اهمیت پیدا میکنند. این مثال یک تمرین تألیفی است و برنامهای تاریخی از هاپر را بازنشر نمیکند. هدف، تجربهٔ مسئلهای است که زبانهای قابل فهمتر تلاش میکنند آن را ساده کنند.
یک بار محاسبه را با عبارتهای نزدیک به نیاز سازمان بنویسید و بار دیگر آن را به گامهای کوچکِ خواندن، ضرب و جمع بشکنید. سپس تعداد جاهایی را بشمارید که تغییر یک قانون پرداخت به ویرایش نیاز دارد. اگر قانون در چند محل تکرار شده باشد، خطر ناسازگاری بیشتر میشود. ابزار بهتر فقط تعداد ضربههای صفحهکلید را کم نمیکند؛ میتواند محل بیان یک تصمیم را مشخصتر و بازبینی آن را آسانتر کند.
مترجم برنامه چه چیزی را تضمین نمیکند؟
پذیرفتهشدن متن برنامه توسط یک مترجم به معنی درستبودن نیاز کسبوکار نیست. ممکن است برنامه از نظر ساختار زبان معتبر باشد، ولی نرخ مالیات، واحد پول یا قاعدهٔ گردکردن اشتباه انتخاب شده باشد. به همین دلیل باید میان خطای نوشتاری، خطای نوع و خطای منطق تفکیک قائل شد. این تمایز برای مطالعهٔ تاریخ زبانها مهم است: پیشرفت ابزار، همهٔ مسئولیت تعریف مسئله را از دوش انسان برنمیدارد.
یک آزمایش کوچک طراحی کنید که در آن ساعت کار صفر، نرخ صفر و عدد اعشاری وجود دارد. خروجی مورد انتظار را پیش از اجرا با دست حساب کنید. اگر برنامه با این مثالها سازگار نبود، ابتدا فرضها را بررسی کنید و بعد به سراغ ابزار بروید. تغییر زبان بدون روشنشدن قواعد مسئله ممکن است همان خطا را در ظاهر تازه بازتولید کند. نمونههای مرزی از این نظر ارزشمندند که ابهامهای پنهان در تعریف نیاز را آشکار میکنند.
خوانایی، قرارداد میان نسلهای یک تیم
کدی که فقط نویسندهٔ نخست آن را بفهمد، برای نگهداری بلندمدت هزینه ایجاد میکند. نام متغیر، شکل داده و ساختار بخشها باید به خوانندهٔ بعدی کمک کند مسیر تصمیم را ببیند. خوانایی به معنی طولانیکردن نامها یا افزودن توضیح برای هر خط نیست؛ توضیحِ چرایی یک قاعده اغلب از تکرار همان دستور به زبان طبیعی مفیدتر است. مثلاً دلیل استثنای یک قرارداد را بنویسید، نه اینکه صرفاً بگویید دو مقدار با هم جمع میشوند.
برای تمرین گروهی، دو نفر یک مسئله را جدا حل کنند و سپس فقط با خواندن کد یکدیگر نیاز اولیه را بازسازی کنند. تفاوت میان برداشتها را ثبت کنید. اگر هر دو برنامه اجرا میشوند ولی خوانندگان قواعد متفاوتی از آنها میفهمند، جا برای بهبود طراحی وجود دارد. این روش میتواند پیش از انتخاب چارچوب پیچیده، کیفیت قراردادهای تیم را بهتر کند و نشان دهد ابزار زبان بخشی از ارتباط انسانی در توسعهٔ نرمافزار است.
استانداردسازی و هزینهٔ سازگاری
وقتی برنامه باید در چند محیط اجرا شود، توافق بر سر معنای دستورها اهمیت پیدا میکند. با این حال یک نام مشترک روی زبان یا استاندارد، همهٔ تفاوتهای فایل، عدد، کتابخانه و محیط اجرا را حذف نمیکند. برای مطالعهٔ نقش هاپر در زبانهای کسبوکار، هم ایدهٔ نزدیکشدن به بیان مسئله را ببینید و هم کار جمعیِ شکلدادن قراردادهای مشترک را. نسبتدادن تمام یک زبان به یک نفر، این بخش مهم از تاریخ مهندسی را پنهان میکند.
یک تمرین مستقل برای سازگاری این است که ورودی و خروجی یک برنامهٔ کوچک را دقیق مشخص کنید و آن را در دو پیادهسازی بسنجید. فایل با پایان خط متفاوت، نام فارسی و عدد بزرگ را در نظر بگیرید. اختلاف را بهصورت قابل بازتولید ثبت کنید. چنین گزارشی بهجای داوری کلی دربارهٔ برتری یک ابزار، نشان میدهد کدام قرارداد هنوز روشن نیست و چه آزمونی میتواند از بازگشت خطا جلوگیری کند.
مطالعهٔ تاریخ همراه با دقت در انتساب
در منابع تاریخی، واژههایی مانند نخستین مترجم یا نخستین زبان سطح بالا ممکن است با تعریفهای متفاوت به کار بروند. هنگام نوشتن یادداشت، همان تعریف و محدودهٔ ادعا را حفظ کنید. دستاورد هاپر را میتوان جدی گرفت بدون آنکه سهم گروهها، استانداردسازان و توسعهدهندگان دیگر حذف شود. خروجی خوب مطالعه، یک شعار دربارهٔ نابغهبودن نیست؛ درک روشنترِ این است که ابزار چگونه بیان، همکاری و نگهداری برنامه را تغییر میدهد.