نسخه‌بندی نرم‌افزار

اگر به سیر نرم‌افزارهایی که تا به حال استفاده کرده‌اید نگاهی بیندازید متوجه یک توالی مشخص میان نسخه‌های قدیمی و نسخه‌های جدید می‌شوید. برای مثال در سیر تکامل نرم‌افزار مایکروسافت آفیس چنین توالی را مشاهده خواهید کرد:
Microsoft Office 3.0, Microsoft Office 4.0, Microsoft Office 4.3, Microsoft Office 95, Microsoft Office 97, Microsoft Office 2000, Microsoft Office XP (a.k.a 2002), Microsoft Office 2003, Microsoft Office 2007, Microsoft Office 2010, Microsoft Office 2013
برای ویرایشگر متن‌باز ویم چنین سیری را داشته‌ایم؛
نسخه‌ها (Vesrions):
1.0→1.14→1.22→3.0→4.0→5.0→5.1→5.2→5.3→5.4→5.5→5.6→5.7→5.8→6.0→6.1→6.2→6.3→6.4→7.0→7.1→7.2
و همچنین برای سیستم‌عامل اوبونتو:
Ubuntu 4.10 (Warty Warthog), Ubuntu 5.04 (Hoary Hedgehog), Ubuntu 5.10 (Breezy Badger), Ubuntu 6.06 LTS (Dapper Drake), Ubuntu 6.10 (Edgy Eft), Ubuntu 7.04 (Feisty Fawn), Ubuntu 7.10 (Gutsy Gibbon),Ubuntu 8.04 LTS (Hardy Heron), Ubuntu 8.10 (Intrepid Ibex),, Ubuntu 9.04 (Jaunty Jackalope), Ubuntu 9.10 (Karmic Koala), Ubuntu 10.04 LTS (Lucid Lynx), Ubuntu 10.10 (Maverick Meerkat), Ubuntu 11.04 (Natty Narwhal), Ubuntu 11.10 (Oneiric Ocelot), Ubuntu 12.04 LTS (Precise Pangolin), Ubuntu 12.10 (Quantal Quetzal), Ubuntu 13.04 (Raring Ringtail), Ubuntu 13.10 (Saucy Salamander), Ubuntu 14.04 LTS (Trusty Tahr), Ubuntu 14.10 (Utopic Unicorn), Ubuntu 16.04 LTS
در بالا سه روش از روش‌های نسخه‌بندی نرم‌افزار را با ذکر مثال آوردیم. در مثال اول مایکروسافت ابتدا بر اساس روش اهمیت تغییر فعالیت می‌کرده سپس بر اساس روش نام سال، در مثال دوم، ویم از روش اهمیت تغییر استفاده کرده و در مثال سوم اوبونتو از روش نام شماره ماه سال و همچنین از نام رمز بهره برده است.
به فرایند تخصیص اسم‌ها و شماره‌های منحصر به فرد به نرم‌افزارهای کامپیوتری، نسخه‌بندی نرم‌افزار گفته می‌شود. عموما در یک رده شماره نگارش معین (اصلی-جزئی) شماره‌های نرم‌افزار به ترتیب افزایشی، متناسب با پیشرفت در توسعه نرم‌افزار تخصیص داده می‌شوند. در سطح‌های پایین‌تر، کنترل تجدید نظر برای پیگیری تفاوت نسخه‌های مختلف اطلاعات دیجیتالی استفاده می‌شود. خواه این اطلاعات دیجیتالی، نرم‌افزار باشند یا یک سند اطلاعاتی.
روش‌های نسخه‌بندی نرم‌افزار
روش‌های گوناگونی برای پیگیری نسخه‌های گوناگون یک قعطه نرم‌افزاری به وجود آمده‌اند. حضور همه‌جانبه کامپیوترها باعث شده است که این روش‌های نسخه‌بندی در غیر از رشته کامپیوتر نیز مورد استفاده قرار گیرد.
شناساگرهای وابسته به توالی
در برنامه‌های نسخه‌بندی نرم‌افزاری وابسته به توالی، به هر انتشار نرم‌افزار شناسه‌ای منحصر به فرد تخصیص داده می‌شود که از یک یا چند توالی یا مجموعه‌ای از اعداد یا حروف تشکیل شده است. روش‌های نسخه‌بندی نرم‌افزار در قسمت‌هایی مثل اندازه توالی‌ها، اختصاص مفهوم به توالی‌های مجزا، و همچنین وسیله و روش افزایش توالی‌ها با یکدیگر متفاوتند.
اهمیت تغییر
در برخی روش‌ها، از شناسه‌های وابسته به توالی برای رساندن اهمیت تغییرات بین انتشارهای یک نرم‌افزار استفاده می‌شود. تغییرات بین دو انتشار، توسط سطح اهمیت طبقه‌بندی می‌شوند و تصمیم در مورد اینکه کدام توالی در بین دو انتشار نرم‌افزار تغییر کند به اهمیت تغییرات از انتشار قبلی بستگی دارد؛ بنابراین اولین توالی هنگامی تغییر می‌کند که مهمترین و بیشترین تغییرات در بین دو انتشار رخ داده باشد و تغییرات بعدی توالی‌ها نشانگر تغییرات کم اهمیت بین دو انتشار هستند.
برای مثال، در روشی که از شناسه‌ای با چهار توالی استفاده می‌کند، اولین توالی وقتی افزایش می‌یابد که کد به طور کامل بازنویسی شده باشد، در حالی که اگر در رابط کاربری یا در مستندات برنامه تغییر کوچکی انجام شده باشد شناسه چهارم تغییر می‌کند.
این روش به کاربران اجازه می‌دهد تا میزان پیشرفت پروژه و همچنین میزان آزمایش‌هایی را که روی پروژه انجام شده است را ارزیابی کنند. اگر تغییرات در قسمت میانی صورت گیرد، برای مثال، اگر سیر انتشار ۱٫۳ انتشاری به صورت 1.3rc4 داشته باشیم، این انتشار نشان‌دهنده آزمایشی بودن این انتشار است و در حقیقت دارای تغییراتی است که لزوما در دنیای واقعی آزمایش نشده‌اند. این روش به طور معمول «سطح سوم از شماره بندی» (تغییر) را میسر می‌کند:
1.3.1, 1.3.2, 1.3.3, 1.3.4… 1.4b1, …
در اصل در انتشارهای بعدی، عدد بزرگتر (major number) وقتی افزایش می‌یابد که پرش یا جهش‌های بارزتری وجود داشته باشد، عدد کوچکتر (Minor Number) وقتی افزایش می‌یابد که تنها مشخصات کوچکی افزوده شده باشند یا رفع باگ مهمی انجام شود، و رقم تجدید نظر (Revision Number) وقتی افزایش می‌یابد که نواقص و باگ‌های کوچکی رفع شوند. برای مثال یک محصول می‌تواند دارای چنینن سیری از انتشارات باشد:
۰٫۹٫۱, ۰٫۹٫۲, ۰٫۹٫۳, ۱٫۰, ۱٫۰٫۱, ۱٫۰٫۲, ۱٫۱, ۱٫۱٫۱, ۲٫۰, ۲٫۰٫۱, ۲٫۰٫۲, ۲٫۱, ۲٫۱٫۱, ۲٫۱٫۲, ۲٫۲, …
ممکن است توسعه دهنگان از نسخه ۵٫۰ با نسخه ۵٫۵ جهش کنند تا نشان دهند که ویژگی‌های مهمی افزوده شده است، اما این ویزگی‌ها در حد کافی نبوده است که عدد بزرگتر (Major Number) را تغییر دهند.
روش متفاوت دیگر، آن است که در کنار اعداد برزگتر و کوچکتر، از حروف الفبا برای تفکیک کردن انواع انتشار -یعنی آلفا، بتا، کاندیدای انتشار- استفاده شود. یک روند انتشار که از این روش استفاده می‌کند می‌تواند شبیه به موارد زیر باشد:
۰٫۵, ۰٫۶, ۰٫۷, ۰٫۸, ۰٫۹ 1.0b1, 1.0b2 (با کمی بهبود), 1.0b3 (با بهبودهای بیشتر) 1.0rc1(به اندازه کافی پایدار است) == ۱٫۰
اگر مشخص شود که 1.0rc1 نیاز به رفع باگ دارد، در اینصورت به نسخه 1.0rc2 (بخوانید دومین نسخه کاندیدای انتشار از نسخه اول نرم‌افزار) تبدیل می‌شود و همین طور ادامه می‌یابد. مهمترین ویژگی این روش آن است که اولین نسخه یک سطح مشخص (بتا، RC، تولید) باید با آخرین نسخه زیر انتشار آن برابر باشد: یعنی شما نمی‌توانید از آخرین نسخه بتا به اولین نسخه RC تغییرات جدید به نرم‌افزار اضافه کنید و همچنین از آخرین RC به انتشار نهایی نرم‌افزار. در صورت انجام چنین کاری باید یک انتشار دیگر در سطح پایینی توالی‌ها ایجاد کنید.
با این حال چون نسخه‌بندی شماره‌ها ساخته دست انسان هستند می‌توان تغییرات دلخواهی را ایجاد کرد که از این اصول تخلف می‌کنند: برای مثال اولین توالی می‌تواند بین نسخه‌هایی افزایش یابد که تنها یک خط از کد آنها با یکدیگر متفاوت است تا این حالت (کاذب) را به وجود آورند که تغییرات بسیار مهمی روی داده است.
دیگر روش‌ها به توالی‌های مجزا معنا می‌بخشد:
major.minor
یا
major.minor
دوباره، در این مثال‌ها، تغییرات هر توالی از سمت چپ، نشاندهنده اهمیت بیشتر و بارز بودن تغییرات در پروژه است و تعریف تمایز این توالی‌ها توسط نویسنده به طور اختیاری انجام می‌شود.
در اکثر برنامه‌های تجاری اولین شماره انتشار یک محصول از نسحه شماره یک شروع می‌شود.
طراحی مرحله توسعه
بعضی از روش‌ها در اولین توالی از صفر شروع می‌کنند تا برای انتشارهایی که به اندازه کافی برای توسعه کلی و عملی پایدار نبوده‌اند و تنها برای آزمایش یا استفاده داخلی منظور گردیده‌اند، وضعیت آلفا با بتایی را مشخص کنند.
جدا کردن توالی‌ها
توالی‌ها باید پس از پرینت شدن به‌وسیله کاراکترهایی جدا شوند. بسته به انتخاب «روش نسخه‌بندی نرم‌افزار» نوع کاراکترها و کاربرد آن‌ها نیز متفاوت است.
لیست زیر، نمونه‌هایی فرضی از برنامه‌های جداسازی برای یک انتشار را مشخص می‌کند («سیزدهمین نسخه درجه سه» از «چهارمین نسخه درجه دو» از «دومین نسخه درجه یک»):
یک روش نسخه‌بندی نرم‌افزار، ممکن است بین همه توالی‌ها از یک کاراکتر استفاده کند: ۲٫۴٫۱۳، ۲/۴/۱۳، ۲-۴-۱۳
ممکن است یک برنامه با روش‌های ناهمگونی جداسازی را انجام دهد، و برخی از توالی‌ها را جدا کرده و برخی دیگر را جدا نسازد: ۲٫۴۱۳
در یک توالی از کاراکترهای متفاوتی برای جداسازی استفاده شود: ۲٫۴-۳
وقتی برای جداسازی توالی‌ها از نقطه استفاده شود، این نقطه نشان‌دهنده یک نقطه اعشاری نیست و توالی دارای اهمیت موقعیتی نمی‌باشد. برای مثال شناسه ۲٫۵ به معنای دو و نیم یا یک دوم مانده به نسخه سوم نیست بلکه به معنای پنجمین ویرایش درجه دوم از دومین ویرایش درجه یک می‌باشد و هرگز درست و مناسب نخواهد بود مگر اینکه نسخه‌های ۲٫۱، ۲٫۲، ۲٫۳ و ۲٫۴ هم وجود داشته باشند.
تعداد توالی‌ها
گاهی یک عدد چهارم، ضمنی هم وجود دارد که به ساخت نرم‌افزار مربوط می‌شود. همچنین برخی از شرکت‌ها تاریخ ساخت را نیز وارد می‌کنند. شماره نسخه‌ها می‌توانند حروف و دیگر عبارات را نیز استفاده کنند، برای مثال Lotus 1-2-3 Release 1a.
توالی صعودی
درباره نحوه افزایش اعداد ویراستی عددی یا رقمی دو مکتب فکر وجود دارد. آزادترین پکیج‌های نرم‌افزاری اعداد را نوعی جریانات پیوسته می‌دانند، بنابراین یک نرم‌افزار آزاد یا محصول متن‌باز دارای اعداد ویراستی مانند ۱٫۷٫۰, ۱٫۸٫۰, ۱٫۸٫۱, ۱٫۹٫۰, ۱٫۱۰٫۰, ۱٫۱۱٫۰, ۱٫۱۱٫۱, ۱٫۱۱٫۲ می‌باشند. نمونه‌ای از این نوع بسته نرم‌افزاری mediawiki است، با این حال برخی از برنامه‌ها به شیوه دیگری با اعداد ویراستی رفتار می‌کنند و ممکن است اعداد ویراستی مثل ۱٫۸, ۱٫۹, ۱٫۹۱, ۱٫۹۲ داشته باشد. در بسته‌های نرم‌افزاری که از این روش استفاده می‌کنند، نسخه ۱٫۹۱ ویرایش کوچک بعد از ۱٫۹ می‌باشد. عرضه‌های تعمیری (یعنی تنها رفع خطاها) را 1.91a, 1.91b و به همین روال می‌نامند.
قالب استاندارد شماره گذاری GNU به صورت major.minor.reversion می‌باشد اما emacs به طور مشهود از قالب دیگری استفاده می‌کند که در آن عدد اصلی («۱») خذف شده و یک اصطلاح «مکان کاربر» که همیشه صفر است به بسته‌های اولیه emacs افزود می‌شود ما توسط توزیع کننده‌ها افزایش می‌یابد.
استفاده از اعداد منفی
برخی از پروژه‌ها از اعداد منفی استفاده می‌کنند. یک مثال کامپایلر smalleiffel است که از ۱٫۰- آغاز شده و به ۰٫۰ می‌رسد و معمولا در ۰٫۷۵- قرار دارد.
درجه سازگاری
برخی از پروژه‌ها برای اشاره به انتشارهای ناسازگار ار عدد ویراستی بزرگ استفاده می‌کنند، Apache APR و FarCry CMS از این دسته هستند.
زمان
پروژه Wine از یک قالب ویرایش زمانی استفاده می‌کند که از سال، ماه، روز انتشار استفاذه می‌کند. برای مثال Wine 20040505. اکنون Wine از یک روند استاندارد استفاده می‌کند. جدیدترین ویراست آن در تاریخ ۶ ژوئن ۲۰۰۸، 1.0-rc4 می‌باشد. لینوکس اوبونتو از یک برنامه ویرایشی مشابه استفاده می‌کند، برای مثال Ubuntu 8.04 در آوریل ۲۰۰۸ صادر شد.
وقتی از از زمان برای نسخه‌بندی استفاده می‌کنیم برای مثال استفاده از زمان در نام‌های فایل‌ها، متداول است که از یک قالب ISO استفاده کنیم: YYYY-MM-DD
چون از لحاط رشته حروف به صورت افزایشی/کاهشی ذخیره می‌شود. علامت‌های "-" معمولا حذف می‌شوند.
شماره گذاری نرم‌افزاری Microsoft Office نیز یک شماره گذاری بر حسب زمان می‌باشد.
سال انتشار
نمونه‌های دیگر نسخه‌ها را به وسیله سال شناسایی می‌کنند (Adobe Illustrator 88 و WordPerfect Office 2003). با این حال وقتی تاریخی استفاده می‌شود تا به ویرایش اشاره کند این کار تنها به خاطر اهداف بازاریابی صورت می‌گیرد و یک عدد ویرایشی واقعی صادر می‌شود. برای مثال Microsoft Windows 2000 Server به صورت داخلی به عنوان Windows NT 5.0 ویرایش شده است.
کدهای الفبایی
مثال‌ها
Macromedia Flash MX
Adobe Photoshop CS2
تک
تک یک روش خاصی برای نسخه‌بندی نرم‌افزار دارد. از زمان ویرایش ۳ تا کنون، به روزرسانی‌ها با افزودن یک رقم اضافی به انتهای شماره‌های نسخ صورت گرفته است. بنابراین عدد ویرایش به سمت  میل می‌کند. ویرایش فعلی ۳٫۱۴۱۵۹۲۶ می‌باشد. این امر انعکاسی از این حقیقت است که تک اکنون بسیار با ثبات است و تنها به روزرسانی‌های ناچیزی صورت گرفته است. توسعه دهنده تک دونالد نوث عقیده دارد که آخرین تغییر که پس از مرگش روی می‌دهد، باید برای تغییر عدد ویرایش به  صورت گیرد، این تغییر باید در جائی صورت گیرد که همه باگهای باقی‌مانده به یک ویژگی ثابت تبدیل خواهند شد.
به شیوه مشابه، نسخه‌بندی نرم‌افزار METAFONT به عدد e میل می‌کند.
قالب‌های دیگر
برخی تولید کنندگان نرم‌افزار برای اشاره به انتشار نرم‌افزارهایشان از قالب‌های مختلف استفاده می‌کنند. برای مثال، سیستم‌عامل Microsoft Windows در ابتدا با ارقام استاندارد و ویراست رقمی (ویندوز ۱٫۰ و ویندوز ۳٫۰)، سپس به وسیله سال (ویندوز ۹۵، ویندوز ۹۸، ویندوز ۲۰۰۰)، سپس استفاده از کدهای الفبایی عددی (ویندوز ME، ویندوز XP) و اکنون استفاده از اسامی ویژه (ویندوز ویستا).
پروژه Debian برای انتشار سیستم‌عامل خود از قالب ویرایشی اصلی/فرعی استفاده می‌کند، اما اسامی رمزی را (اسم رمز) از فیلم داستان Toy Story گرفته است تا در طول توسعه سیستم‌عامل خود بتواند با این اسم رمزها به انتشارهای پایدار و ناپایدار اشاره کند.
اعداد ویرایشی داخلی
ممکن است نرم‌افزارها از یک عدد ویراشی داخلی استفاده کنند که از عدد ویرایشی مندرج در نام محصول متفاوت است. برای مثال J2SE5 5.0 دارای عدد ویرایشی داخلی ۱٫۵٫۰ می‌باشد. ویندوز NT 4، ویندوز ۴٫۰ NT است، ویندوز ۲۰۰۰، ویندوز NT ۵٫۰ است. ویندوز XP، ویندوز NT ۵٫۱، ویندوز سرور ۲۰۰۳، ویندوز NT ۵٫۲ می‌باشد. ویندوز ویستا، ویندوز NT ۶٫۰ می‌باشد و ویندوز ۷، ویندوز NT ۶٫۱ می‌باشد.
نسخه‌های قبل از انتشار
در کنار قالب‌های نسخه‌بندی متعددی که در بالا ذکر شدند، همانطور که برنامه راه خویش را از میان مراحل چرخه عمر انتشار نرم‌افزار باز می‌کند، سیستمی برای اشاره به نسخه‌های قبل از انتشار استفاده می‌شود. برنامه‌هایی که در مرحله اولیه هستند اغلب «آلفا»، اولین حرف در الفبای یونانی نامیده می‌شوند. پس از تکمیل و زمانی که هنوز برای صدور آماده نیستند آنها را نرم‌افزار «بتا»، دومین حرف از الفبای یونانی می‌نامند. در کل نرم‌افزار آلفا تنها توسط توسعه‌دهندگان آزمایش می‌شود در حالی‌که نرم‌افزار بتا برای آزمایش کلی توزیع می‌شود. نرم‌افزار نسخه آلفا و بتا اغلب نسخه‌های عددی کم‌تر از ۱ دارند (مثل ۰٫۹) تا نشان دهند که روند آنها در جهت یک انتشار ۱٫۰ عمومی قرار دارد. با این حال اگر نسخه قبل از انتشار یک بسته نرم‌افزاری مانند ویرایش ۲٫۵ باشد یک ”a” یا "alpha" به رقم ویرایش افزوده می‌شود بنابراین ویرایش آلفا از انتشار ۲٫۵ را می‌توان با 2.5a یا 2.5.a شناسایی کرد.
بسته‌های نرم‌افزاری که به تازگی به عنوان یک ویرایش ویژه صادر شده‌اند می‌توانند برچسب ویرایش داشته باشند که با "RC-#" دنبال می‌شوند و به عدد کاندیدای انتشار اشاره دارند. وقتی نسخه یا ویرایش واقعا صادر شود، برچسب rc ناپدید می‌شود.
با این حال این امر می‌تواند برای برخی از مدیران بسته مشکلی آفرین باشد. برای مثال، بسته اتوماسیون رادیویی Rivendell قصد دارد اولین بسته انتشار تولیدی کامل خود به نام v1.0.1 را منتشر کند چون اگر آنها آن را v1.0.0 بنامند مدیر بسته RPM نصب آن را رد می‌کند چون تصور می‌کند که این نسخه قدیمی‌تر از 1.0.0rc2 می‌باشد.
اصلاحاتی در سیستم عددی
ویراست‌های اعداد فرد برای توسعه انتشار
تا زمان سری‌های 2.6.x، هسته لینوکس برای اشاره به انتشارهای توسعه‌ای از اعداد ویراستی کوجک فرد و برای اشاره به انتشارهای پایدار از اعداد ویراستی کوچک زوج استفاده می‌کرد. برای مثال، لینوکس ۲٫۳ یک خانواده پیشرفته از دومین طرح اصلی هسته لینوکس است و لینوکس ۲٫۴ خانواده اصلی انتشار بود. پس از عدد ویرایشی فرعی در هسته لینوکس، عدد انتشار به ترتیب افزایشی قرار دارد، برای مثال لینوکس ۲٫۴٫۰ تا لینوکس ۲٫۴٫۲۲، به علاوه یک رقم ویراستی ناچیز به ۲٫۶۸ اضافه شد و ۲٫۶٫۸٫۱ را می‌ساز که یه تغییر خیلی جزئی اشاره می‌کند، رقم چهارم پس از ۲٫۶٫۱۱٫۱ استاندارد شد.
پایگاه‌های مرتبط
http://semver.ir/ نسخه بندی معنایی در نرم‌افزارها