دانلود
بارگیری و بارگذاری
بارگیری یا دانلود (به انگلیسی: Download)، فرآیند برداشت دادههای الکترونیکی از یک رایانه (معمولاً یک رایانه دور یا یک سرور) به رایانهٔ دیگر (معمولاً رایانه شما یا یک رایانهٔ محلی)، با مودم یا شبکه رایانهای را گویند. همچنین فرستادن بلوکی از دادهها، مانند یک پرونده، با ساختار پست اسکریپت، به دستگاه مستقلی مانند چاپگر پست اسکریپت نیز بارگیری نامیده میشود. عمل وارون فرایند فوق را بارگذاری یا آپلود (به انگلیسی: Upload) گویند.

واژههای مصوب فرهنگستان برای دانلود و آپلود به ترتیب پایینگذاری و بالاگذاری هستند. در زبان اردو به این دو کنش به ترتیب «زیراثقال» و «زِبَراثقال» میگویند.
بارگیری
کاربرد نخست این واژه در زمینهٔ رایانهها، از فعل دریافت کردن ریشه گرفته، به معنی گرفتن یک پرونده (یا بارگیری)، از یک رایانه، یک خدماتدهندهٔ وب، و یا سامانهای همانند. این واژه در گویش خیابانی و فرهنگ عامیانه، مانند واژهٔ انگلیسی آن، دانلود (Download) گفته میشود.
بارگذاری
بارگذاری، یعنی ارسال کردن یک پرونده، از رایانهای به رایانهٔ دیگر. این واژه در گویش خیابانی، مانند واژه انگلیسی آن، آپلود (Upload) گفته میشود.
نرمافزار
نرمافزار (به انگلیسی: Software) یا برنامه، مجموعهای از دستورالعملهای دقیق و مرحله به مرحله است که هدف خاصی را دنبال میکنند.
ظاهراً، اولین بار جان توکی در سال ۱۹۵۸ این واژه را بهاین معنا بهکار بردهاست. احتمالاً این واژه در مقابل سختافزار (به انگلیسی: Hardware) به کار بردهاند که بسیار پیش از پیدایش رایانه (به معنای اسباب و اشیاء) بهکار میرفتهاست.
دو گروه کلی نرمافزارها
نرمافزارهای رایانه را میتوان به دو دسته بزرگ تقسیم کرد:
نرمافزار سیستم (به انگلیسی: System software)
نرمافزار کاربردی (به انگلیسی: Application software)
میتوان گفت نرمافزارهای کاربردی، برنامههای مورد استفاده کاربرند و نرمافزارهای سیستمی، مدیریت رایانه را برعهده دارند. مهمترین نرمافزار سیستم، سیستمعامل است.
سیستم عامل
وقتی برنامهای را روی رایانه خود نصب میکنید، اجزای سختافزاری آن به فرمان آن برنامه در میآیند. برای نمونه هنگامی که با یک برنامه اجرای موسیقی کار میکنید، کارت صدای رایانه تان با برنامه پخش موسیقی همکاری میکند و یک آهنگ یا پرونده (فایل) صوتی را از طریق بلندگوی رایانه تان پخش میکند.
این ارتباط میان نرمافزار و سختافزار توسط سیستم عامل انجام میشود. این تنها قسمتی از کار سیستم عامل است.
سیستم عامل خود یک برنامه نرم افزاری است با این تفاوت که چون تمام منابع و امکانات سخت افزاری در اختیار وی می باشد دارای ویژگی منحصر به فرد می باشد بنابراین آن را در رده نرم افزارها می خوانیم با این ویژگی که از اهمیت خاصی برخوردار است. به بیان دیگر سیستم عامل یک برنامه جامع است که اجازه در اختیار قراردادن منابع و امکانات سخت افزاری را برای نرم افزارها صادر می کند و این سیستم عامل است که مسئول صحت عملکرد سیستم و منابع آن است.
سیستم عامل شامل 4 بخش مهم است
1- مدیریت پردازش و پردازشگر
2- مدیریت حافظه
3- مدیریت دستگاههای ورودی و خروجی (I/O)
4- مدیریت فایل
سه گروه کلی نرمافزارهای معماری
از دیدگاه ساختاری (معماری) (architecture)، نرمافزارها به دستههای زیر تقسیم میشوند:
کاربر-بنیان یا Client Base
کارگزار-بنیان یا Server Base
کاربر کارگزار بنیان یا Client-Server Base
امروزه واژه نرمافزار را در معناهایی به جز معنی برنامه رایانهای نیز بهکار میبرند. مثلاً در دانش مدیریت برای اشاره به روشها و دانش فنی (در برابر وسایل و تجهیزات و نیروی انسانی). نرمافزارها انواع گوناگونی دارند که مهم ترین دسته بندی آنها دستهٔ تجاری و آزاد است. به ویژه با رویکردهای طرحهای گنو و لینوکس معنای ژرف تری به نرمافزارهای آزاد داده شده تا آنجا که برخی نرمافزارها را نماد فرهنگ می دانند. نرمافزارها را برنامه نویسان تدوین کرده و انتشار میدهند. این برنامه نویسان ممکن است در یک شرکت مشغول کار باشند یا در خانه برنامه نویسی کنند مانند برنامه نویسان برخی نرمافزارهای لینوکس. امروزه بیشتر کاربران تنها با ظاهر گرافیکی این برنامهها کار میکنند و اقدامات بسیاری از آنها از دید کاربر پنهان میماند به عبارتی هر نرمافزار مجموعهای از رمزها است که از الگوریتمی خاص پشتیبانی میکنند این رمزها خود با رمزهای گرافیکی آمیخته شده و بسیاری از اقدامات برنامه به دور از چشم کاربر عادی رخ میدهد. برنامهها با رمزهایی نوشته میشوند که بعداً یک رمزخوان آن را در رایانه کاربر اجرا میکند.
رقابت نرمافزاری
در حال حاضر نرمافزارهای کامپیوتری فراوان را میتوان در بازار یافت که به طور جدی به رقابت خود برای بقا ادامه میدهند. از مسائل قابل ذکر در این مورد میتوان به خرید سهام شرکتهای نرمافزاری کوچک و بزرگ توسط شرکتهای دیگر اشاره نمود. همچنان که شرکت بزرگ گوگل به خرید سهام شرکتهای بزرگ همچنان ادامه میدهد، در مدت کمی توانسته بسیاری از شرکتها را تحت سلطه خود درآورد.
نرمافزار سیستم
نرمافزار سیستم به نرمافزاری در رایانه گفته میشود که به کارکرد سیستم رایانه یا کاربردهای سطح پایین (یا Low Level) رایانه مربوط باشد. این نرمافزارها به ساختار فیزیکی سختافزار رایانه وابسته هستند و در نوشتن آنها از زبانهای سطح پائین مانند زبان اسمبلی استفاده میشود. سیستمعامل و درایورها از نرمافزارهای سیستم هستند. از جمله زبان هایی که برای نگارش نرمافزارهای سیستمی استفاده میشود، زبان برنامه نویسی C میباشد. کار کردن با سی برای برنامه نویسان راحت تر است و آنان این زبان را به اسمبلی ترجیح میدهند. اگر برای نگارش نرمافزار سیستمی مشکل محدودیت فضای سختافزاری داشته باشیم بهتر است با زبان اسمبلی کار کنیم که حجم آن پایین تر است. نرمافزارهای سیستمی به سختافزار وابسته اند.
در برابر نرمافزار سیستم، نرمافزار کاربردی قرار دارد که برای کاربردهای سطح بالا و غیرسیستمی رایانه است و معمولاً به زبانهای سطح بالا نوشته میشود که از جزئیات سختافزاری سیستم مستقل است.
نرمافزار کاربردی
نرمافزار کاربردی (به انگلیسی: Application software) عبارت است از نرمافزاری که با استفادهٔ مستقیم از منابع و قابلیتهای رایانه کاری را مستقیماً برای کاربر انجام میدهد. باید توجه داشت که این عبارت در مقابل عبارت نرمافزار سیستمی معنی پیدا میکند.
نرمافزار سیستمی در مقابل در پسزمینه عمل میکند و خدماتی را فراهم میکند که دیگر نرمافزارها و یا سیستمعامل میتوانند برای انجام کارهای خود از آن استفاده کنند. اما در عوض معمولاً مستقیماً با کاربر عادی در تماس نیست و خدماتی را به او ارایه نمیدهد.
در عمل بیشتر نرمافزارهایی که کاربران با آنها سر و کار دارند از این دسته محسوب میشوند. برای مثال میتوان به نرمافزارهای رومیزی یعنی واژهپردازها، صفحه گستردهها، نرمافزارهای طراحی گرافیکی، بازیهای رایانهای و امثال آنها اشاره کرد.
بسیاری نرمافزارهای کاربردی، برای توسعهدهندگان ابزار رابط برنامهنویسی کاربردی هم فراهم میکنند تا بتوان از قابلیتهای نرمافزار در نرمافزارهای جدید استفاده کرد. برای مثال نرمافزار ادوبی آکروبات هنگام نصب ایپیآی فراهم میکند که برنامهنویس میتواند با استفاده از آن تواناییهای آکروبات را در برنامهٔ خود به کار گیرد.
برای عنوان نمونههای دیگر میتوان به نرمافزارهای پردازش متن، برگههای گسترده (صفحات گسترده) و نرمافزارهای پخش نوا و نما اشاره کرد.
مهندسی نرمافزار
مهندسی نرمافزار (به انگلیسی: Software engineering) یعنی استفاده از اصول مهندسی بجا و مناسب برای تولید و ارائه محصول نرمافزاری با کیفیت که قابل اطمینان و با صرفه بوده و برروی ماشینهای واقعی به طور کارآمدی عمل کند.
مهندسی نرمافزار یک روش سیستماتیک، منظم و دقیق برای ساخت و ارائه محصولی نرمافزاری با کیفیت است.
مهندسی نرمافزار اغلب شامل فرایند خطی تحلیل، طراحی، پیادهسازی و آزمون است؛ که با به کارگیری روشهای فنی و علمی از علوم مهندسی موجب تولید نرمافزاری با کیفیت مطلوب در طول یک فرایند انتخابی مناسب پروژه میشود.
کاربردهای مهندسی نرمافزار دارای ارزشهای اجتماعی و اقتصادی هستند، زیرا بهرهوری مردم را بالا برده، چند و چون زندگی آنان را بهتر میکنند. مردم با بهرهگیری از نرمافزار، توانایی انجام کارهایی را دارند که قبل از آن برایشان شدنی نبود. نمونههایی از این دست نرمافزارها عبارتاند از: سامانههای توکار، نرمافزار اداری، بازیهای رایانهای و اینترنت.
فناوریها و خدمات مهندسی نرمافزار به کاربران برای بهبود بهرهوری و کیفیت یاری میرساند. نمونههایی از زمینههای بهبود: پایگاه دادهها، زبانها، کتابخانهها، الگوها، فرایندها و ابزار.
مهم ترین شاخص مهندسی نرمافزار
مهم ترین شاخص در مهندسی نرمافزار تولید نرمافزار با کیفیت مناسب در جهت «نیازهای مشتری» است.
پیشینه مهندسی نرمافزار
اصطلاح مهندسی نرمافزار پس از سال ۱۹۶۸ میلادی شناخته شد. این اصطلاح طی نشست «مهندسی نرمافزار ناتو ۱۹۶۸» (که در گارمیش-پارتنکیرشن، آلمان برگزار شد) توسط ریاست نشست فریدریش ال باوئر معرفی شد و از آن پس بهطور گسترده مورد استفاده قرار گرفت.
اصطلاح مهندسینرمافزار عموماً به معانی مختلفی بهکار میرود:
بهعنوان یک اصطلاح غیر رسمی امروزی برای محدوده وسیع فعالیتهایی که پیش از این برنامهنویسی و تحلیل سامانهها نامیده میشد.
بهعنوان یک اصطلاح جامع برای تمامی جنبههای عملی برنامهنویسی رایانه، در مقابل تئوری برنامهنویسی رایانه، که علوم رایانه نامیده میشود.
بهعنوان اصطلاح مجسمکننده طرفداری از یک رویکرد خاص نسبت به برنامهنویسی رایانه که اصرار میکند، مهندسی نرمافزار، بهجای آنکه هنر یا مهارت باشد، باید بهعنوان یک رشته عملی مهندسی تلقی شود و از جمعکردن و تدوین روشهای عملی توصیهشده به شکل متدولوژیهای مهندسی نرمافزار طرفداری میکند.
مهندسی نرمافزار عبارتست از:
کاربرد یک رویکرد سامانهشناسی، انتظامیافته، قابل سنجش نسبت به توسعه، عملکرد و نگهداری نرمافزار، که کاربرد مهندسی در نرمافزار است.
مطالعه روشهای موجود در استاندارد IEEE
محدوده مهندسی نرمافزار و تمرکز آن
مهندسی نرمافزار به مفهوم توسعه و بازبینی یک سامانه نرمافزاری مربوط میباشد. این رشته علمی با شناسایی، تعریف، فهمیدن و بازبینی خصوصیات مورد نیاز نرمافزار حاصل سر و کار دارد. این خصوصیات نرمافزاری ممکن است شامل پاسخگویی به نیازها، اطمینانپذیری، قابلیت نگهداری، در دسترس بودن، آزمونپذیری، استفاده آسان، قابلیت حمل و سایر خصوصیات باشد.
مهندسی نرمافزار ضمن اشاره به خصوصیات فوق، مشخصات معین طراحی و فنی را آماده میکند که اگر بهدرستی پیادهسازی شود، نرمافزاری را تولید خواهد کرد که میتواند بررسی شود که آیا این نیازمندیها را تأمین میکند یا خیر.
مهندسی نرمافزار همچنین با خصوصیات پروسه توسعه نرمافزاری در ارتباط است. در این رابطه، با خصوصیاتی مانند هزینه توسعه نرمافزار، طول مدت توسعه نرمافزار و ریسکهای توسعه نرمافزار درگیر است.
نیاز به مهندسی نرمافزار
نرمافزار عموماً از محصولات و موقعیتهایی شناخته میشود که قابلیت اطمینان زیادی از آن انتظار میرود، حتی در شرایط طاقت فرسا، مانند نظارت و کنترل نیروگاههای انرژی هستهای، یا هدایت یک هواپیمای مسافربری در هوا، چنین برنامههایی شامل هزاران خط کد هستند، که از نظر پیچیدگی با پیچیدهترین ماشینهای نوین قابل مقایسه هستند. بهعنوان مثال، یک هواپیمای مسافربری چند میلیون قطعه فیزیکی دارد (و یک شاتل فضایی حدود ده میلیون بخش دارد)، در حالی که نرمافزارِ هدایت چنین هواپیمایی میتواند تا ۴ میلیون خط کد داشته باشد.
با توجه به گسترش روزافزون دنیای رایانه امروزه بیش از هر زمان دیگری نیاز به متخصصان رایانه احساس میشود. متاسفانه این رشته در ایران بازار کار خوبی ندارد طبق آمارها ۶۳٫۲۷ درصد از فارغالتحصیلان در سال ۹۰ مشغول به کار در سایر مشاغل هستند. اما برای مهندسان سختافزار هم امکان کار در شرکتهای تولیدکننده قطعات و دستگاهها و مراکز صنعتی – تولیدی بسیار فراهم است و از نظر سطح درآمدی هم با توجه به دانش و پشتکار شخصی در حد متوسط قرار دارند. به طور کلی این رشته در ایران با استقبال چندانی رو به رو نیست؛ این نیز حاکی از نبود برخی از زیرساختها در ایران هست.
تکنولوژیها و روشهای عملی
مهندسان نرمافزار طرفدار تکنولوژیها و روشهای عملی بسیار متفاوت و مختلفی هستند، که با هم ناسازگار هستند. این بحث در سالهای دهه ۶۰ میلادی شروع شد و ممکن است برای همیشه ادامه پیدا کند. مهندسان نرمافزار از تکنولوژیها و روشهای عملی بسیار متنوعی استفاده میکنند. کسانی که کار عملی میکنند از تکنولوژیهای متنوعی استفاده میکنند: کامپایلرها، منابع کد، پردازشگرهای متن. کسانی که کار عملی میکنند از روشهای عملی بسیار متنوعی استفاده میکنند تا تلاشهایشان را اجرا و هماهنگ کنند: برنامهنویسی در دستههای دونفری، بازبینی کد، و جلسات روزانه. هدف هر مهندس نرمافزار بایستی رسیدن به ایدههای جدید خارج از الگوهای طراحی شده قبلی باشد، که باید شفاف بوده و بهخوبی مستند شده باشد.
با وجود رشد فزاینده اقتصادی و قابلیت تولید فزایندهای که توسط نرمافزار ایجاد شده، هنوز هم بحث و جدلهای ماندگار درباره کیفیت نرمافزار ادامه دارند.
ماهیت مهندسی نرمافزار
دیوید پارناس گفتهاست که مهندسی نرمافزار یک شکل از مهندسی است. استیو مککانل گفتهاست که هنوز اینطور نیست، ولی مهندسی نرمافزار باید یک شکل از مهندسی شود. دونالد کنوت گفتهاست که برنامهنویسی یک هنر است.
دیوان فعالیتهای آماری آمریکا مهندسان نرمافزار را به عنوان زیرگروهی از «متخصصان رایانه»، با فرصتهای شغلیای مانند «دانشمند رایانه»، «برنامه نویس» و «مدیر شبکه» دسته بندی کردهاست. BLS تمام مهندسان دیگر این شاخه علمی، که شامل مهندسان سختافزار رایانه نیز هست، را بهعنوان «مهندسان» دسته بندی میکند.
نرمافزار آزاد
نرمافزار آزاد (به انگلیسی: Free software) نرمافزاری است که بههمراه کد منبع توزیع شده و با قوانینی منتشر میشود که آزادی استفاده، مطالعه، ویرایش و انتشار مجددِ کاربران را تضمین میکند. نرمافزارهای آزاد معمولاً با همکاری برنامهنویسهای داوطلب بهعنوان یک پروژه بهوجود میآیند.
نرمافزارهای آزاد با نرمافزارهای مالکیتی (مانند مایکروسافت ویندوز) که آزادی کاربر در استفاده، مطالعه، ویرایش یا انتشار مجدد را در درجههای مختلف محدود میکنند، متفاوت است. این محدودیتها با در نظر گرفتن مجازاتهایی قانونی برای کاربرانی که قوانین آنها را نقض میکنند، بهوجود میآیند. نرمافزارهای مالکیتی عموماً به صورت بستههای اجراپذیر باینری و بدون دسترسی به کد منبع فروخته میشوند که جلوی ویرایش و وصلهکردن نرمافزار توسط کاربر را میگیرد و او را برای بهروزرسانی و پشتیبانی به شرکت نرمافزاری تولید کننده وابسته میکنند. نرمافزارهای آزاد از نرمافزاریهای رایگان که برای استفاده، از کاربر پولی دریافت نمیکنند، نیز متفاوتاند. این نوع نرمافزارها نیز معمولاً تمامی حقوق نرمافزار را برای تولیدکنندهٔ آن محفوظ داشته و جلوی مهندسی معکوس، ویرایش و یا توزیع مجدد توسط کاربر را میگیرند. بنابراین موضوع اصلی نرمافزار آزاد، موضوع آزادی است و نه قیمت آن: کاربران آزادند که هر چه میخواهند با نرمافزار انجام دهند. این آزادی شامل انتشار مجدد نرمافزار بهصورت رایگان و یا با سود نیز میشود. یعنی نرمافزار آزاد میتواند به صورت رایگان و یا در ازای دریافت مبلغی پول در اختیار کاربر قرار بگیرد.
ریچارد استالمن در سال ۱۹۸۵ در زمانی که در حال آغاز پروژهٔ گنو و بهوجود آوردن بنیاد نرمافزارهای آزاد بود، برای اولین بار از عبارت «نرمافزار آزاد» استفاده کرد. براساس تعریف بنیاد نرمافزارهای آزاد کاربران یک نرمافزارِ آزاد، آزاد هستند؛ چون به اجازه گرفتن نیازی ندارند؛ آنها در انجام کارهای دلخواهشان (مانند حق نشر و کپیبرداری) محدود نیستند؛ نیازی به موافقت با هیچ توافقنامهای ندارند؛ و در همان ابتدا نیز با نداشتن کد منبع محدود نبودهاند.
تعریف
طبق تعریف نرمافزار آزاد توسط بنیاد نرمافزارهای آزاد، هر نرمافزاری که آزادیهای زیر را برای کاربرانش فراهم کند به عنوان یک نرمافزار آزاد شناخته میشود:
کاربران باید اجازه داشته باشند که نرمافزار مورد نظر را برای هر قصد و منظوری اجرا کنند.
کاربران باید اجازه داشته باشند کدهای منبع نرمافزار را مطالعه کرده و آن را مطابق با نیازهای خود تغییر دهند. برای رسیدن به این هدف، کدهای منبع نرمافزار باید در اختیار کاربر قرار گیرد.
کاربران باید اجازه داشته باشند نرمافزار را مجدداً منشتر کرده و در اختیار دیگران قرار دهند. این کار میتواند به صورت رایگان و یا در ازای دریافت مبلغی پول صورت گیرد.
اگر کاربری نرمافزار را تغییر داد، باید اجازه داشته باشد آن را مجدداً منتشر کرده و در اختیار دیگران قرار دهد. برای تغییر دادن نرمافزار، لازم است تا کدهای منبع نرمافزار در اختیار کاربر قرار گیرد.
همچنین موسسه پیشگامان متنباز هم تعریف مشابهی از نرمافزار آزاد ارائه میدهد. طبق تعریف این موسسه، نرمافزار بازمتن تنها به معنی در دسترس ساختن کدمنبع نیست. علاوه بر آن مجوز باید ویژگیهای زیر را هم داشته باشد:
نرمافزار باید قابل توزیع مجدد باشد (چه به صورت رایگان، چه در ازای دریافت مبلغی پول)
نرمافزار باید شامل کد منبع باشد و این کد منبع را باید بتوان تغییر داد و مجدداً منتشر کرد.
مجوز نباید در برابر افراد یا گروه خاصی تبعیض قائل شود.
مجوز نباید کاربر را برای رسیدن به یک هدف خاص محدود کند.
مجوز نباید مختص به یک محصول خاص باشد.
مجوز نباید نرمافزارهای دیگری که به همراه نرمافزار مورد نظر عرضه شدهاند را محدود کرده و تحت تاثیر قرار دهد. برای مثال اگر چند نرمافزار بر روی یک دیسک منتشر شدند، مجوز نباید اصراری بر روی متنبازبودن آنها داشته باشد.
مجوز نباید تکنولوژی خاصی را محدود کند.
تاریخچه
در اوایل، نرمافزارها به صورت آزاد منتشر میشدند و برنامهنویسان و شرکتها آنها را به صورت آزادانه در اختیار یکدیگر قرار میداند. در اوایل، تجارت رایانه بیشتر مبتنی بر سختافزار بود و شرکتها درامد خود را بیشتر از راه تولید سختافزار کسب میکردند و هر شرکت، سختافزاری ناسازگار با دیگر شرکتها تولید میکرد. مشتریان، که بیشتر مهندسان و دانشمندان بودند، تشویق میشدند که نرمافزارهای ارائه شده توسط سختافزار را بهبود بخشیده و حتی آن را در اختیار دیگران هم قرار دهند. از آنجا که در آن زمانها سختافزارهای تولید شده توسط شرکتهای مختلف با یکدیگر ناسازگار بود و سختافزار استانداردی وجود نداشت، و همینطور از آنجا که در آن زمان مفسرها و کامپایلرها هنوز جا نیفتاده بودند (که این برنامهها برنامهها را قابل حملتر میکنند)، شانس کمی وجود داشت که نرمافزار مورد نظر بر روی سختافزار شرکت رقیب هم به خوبی اجرا شود.
رفتهرفته که صنعت رایانه پیشرفت کرد و سختافزارها بیشتر استاندارد شدند و همینطور کامپایلرها و مفسرها پیشرفت کردند، زمینه برای رشد نرمافزارهای انحصاری فراهم شد. با چنین پیشرفتهایی، برنامهها راحتتر از سختافزار یک شرکت به سختافزار شرکت رقیب پورت میشدند و راحت میشد یک نرمافزار را بر روی سختافزارهای مختلفی از شرکتهای مختلف اجرا کرد. بدین ترتیب یک نفر میتوانست نرمافزاری بنویسد که مستقل از سختافزار خاصی عمل کند و بر روی طیف وسیعی از آنها اجرا شود. علاوه بر آن، با استاندارد شدن سختافزارها، تفاوتهای ناچیزی که آنها در کارایی داشتند رفته رفته ناپدید شد. تولید کنندگان به این نتیجه رسیده بودند که باید به نرمافزار هم به چشم یک وسیله فروشی نگاه کنند. شرکتها شروع به فروش نرمافزارهای خود کردند و دست کاربران خود را برای تغییر در نرمافزارها و انتشار مجدد آنها بستند. به گونه ای که در سال ۱۹۶۸ شرکتی به نام ایدیآر (به انگلیسی: ADR) اولین نرمافزار دارای مجوز را عرضه کرد. در سال ۱۹۶۹، شرکت آیبیام به خاطر اینکه به همراه سختافزارهای خود، نرمافزارهای آزاد ارائه میکرد، توسط وزارت دادگستری ایالات متحده آمریکا به از بین بردن کسب و کار و ایجاد یک شرایط ضدرقابتی برای دیگر متهم شد. آیبیام دیگر به همراه سختافزارهای خود نرمافزار ارائه نکرد و بدین ترتیب نرمافزارها و سختافزارها از یکدیگر جدا شدند و فاصله گرفتند.
در سال ۱۹۸۳، ریچارد استالمن از آزمایشگاه هوش مصنوعی و علوم رایانه امآیتی، پروژه گنو را بنیان نهاد. او که از تغییر فرهنگ در صنعت رایانه و کاربرانش ناامید شده بود، قصد داشت سیستمعاملی به نام گنو را به صورت یک نرمافزار آزاد توسعه دهد. در ژانویه ۱۹۸۴ توسعه سیستمعامل گنو آغاز گشت و بنیاد نرمافزارهای آزاد در اکتبر ۱۹۸۵ بنیان نهاده شد. در سال ۱۹۸۹، اولین نسخه از اجازهنامه همگانی گنو منشتر شد. البته جیپیال اولین پروانه نرمافزار آزاد نبود و قبل از آن پروانههای نرمافزار آزاد دیگری مانند پروانه بیاسدی در سال ۱۹۸۸ عرضه شده بودند. تا کنون پروانههای نرمافزار آزاد زیادی توسط افراد و شرکتهای مختلف منتشر شده است که آز این میان میتوان به پروانه امآیتی، پروانه آپاچی، پروانه آیاسسی، پروانه همگانی موزیلا و ... اشاره کرد.
در سال ۱۹۹۷، اریک ریموند مقالهای با نام کلیسای جامع و بازار را منتشر کرد و در آن به بررسی اصول نرمافزارهای آزاد و مزایای آنها پرداخت. این مقاله به شدت مورد توجه قرار گرفت و یکی از دلایلی بود که شرکت ارتباطات نتاسکیپ، کد منبع مرورگر اینترنتی خود را به صورت نرمافزار آزاد منتشر کرد. این کار باعث شد تا شرکتهای دیگری هم به نرمافزارهای آزاد توجه نشان دهند. کدهای منبع نتاسکیپ، بعدها اساس توسعه مرورگر فایرفاکس و برنامه تاندربیرد قرار گرفت.
مسئله نامگذاری
در زبان انگلیسی، کلمه Free معانی متفاوتی همچون آزادی، رایگان بودن و ... دارد. عدهای بر این عقیده بودند که ممکن است این کلمه باعث کژفهمی شده و باعث شود مردم به نرمافزارهای آزاد، به چشم نرمافزارهای رایگان نگاه کنند. این در حالی است که یک نرمافزار آزاد، لزوماً رایگان نیست. آنها در سال ۱۹۹۸ کمپین دیگری به نام «نرمافزارهای متنباز» (به انگلیسی: Open Source) را تشکیل دادند تا با تاکید بیشتر بر روی مدل توسعه و مسائل تکنیکی، به جای مسائل فلسفی و اخلاقی، مردم و شرکتها را هر چه بیشتر به استفاده از نرمافزار آزاد تشویق کنند. تقریباً هر دو مفهوم، اشاره به یک چیز دارند و یک نرمافزار متنباز، نرمافزار آزاد هم هست (و برعکس)، اما طرفداران ایده نرمافزارهای متنباز، آن را روشی برای توسعه نرمافزارهای بهتر معرفی میکنند و تاکید کمتری بر جنبش اجتماعی و فلسفه پشت این گونه نرمافزارها دارند. طبق گفته موسسه پیشگامان متنباز (که توسط طرفداران ایده نرمافزار متنباز بوجود آمده)، عبارت «نرمافزار آزاد» واژه ای قدیمیتر است و به گونهای منعکس کننده نام بنیاد نرمافزارهای آزاد است، سازمانی که در سال ۱۹۸۵ برای محافظت و ترویج نرمافزارهای آزاد بوجود آمد؛ با اینکه بنیانگذاران ایده متنباز هم از توسعه و ترویج نرمافزارهای آزاد حمایت میکنند، اما در مورد چگونگی ترویج آنها با بنیاد نرمافزارهای آزاد موافق نیستند و اعتقاد دارند که آزادی نرمافزار در درجه اول یک امر عملی است تا ایدئولوژیکی.
پروانههای نرمافزار آزاد
نرمافزارهای آزاد به همراه اجازهنامهای عرضه میشوند که این اجازهنامه آزادیهای نام برده شده را برای کاربران تضمین میکند. از جمله پروانههای نرمافزار آزاد میتوان به پروانه نرمافزار جیپیال، بیاسدی، پروانه امآیتی، پروانه آیاسسی و ... نام برد. این اجازه نامهها تفاوتهایی با یکدیگر دارند و هر کدام توسط افراد و شرکتهای خاصی برای اهداف خاصی منتشر شدهاند. یک دستهبندی کلی برای پروانههای نرمافزار آزاد این است که آیا آنها به صورت کپیلفت هستند یا نه. پروانههایی که کپیلفت هستند، مانند پروانه جیپیال، تاکید دارند که نسخههای مشتق شده از نرمافزار هم باید به صورت نرمافزار آزاد منتشر شوند. مجوزهای غیر کپیلفت تاکیدی بر روی این مساله ندارند و نسخههای مشتق شده از این گونه نرمافزارها را میتوان آزادانه به هر شکل دلخواهی، چه به صورت نرمافزار آزاد و چه به صورت نرمافزار انحصاری منتشر کرد. چنین مجوزهایی را اصطلاحاً «سهلگیرانه» (به انگلیسی: permissive) مینامند. از جمله رایجترین پروانههای کپیلفت، پروانه جیپیال و از جمله رایجترین پروانههای غیر کپیلفت، پروانه بیاسدی و پروانه امآیتی است. امروزه هر دو دسته از این پروانهها به صورت گسترده توسط پروژههای مختلف مورد استفاده قرار میگیرند. برای مثال، هسته لینوکس از پروانه جیپیال و پروژه فریبیاسدی از پروانه بیاسدی استفاده میکنند.
مسئله دیگر در مقایسه پروانههای نرمافزار آزاد، مسئله پیوند دادن کتابخانهها در دیگر نرمافزارهایی است که از یک پروانه غیرمشابه با پروانه کتابخانه استفاده میکنند. برخی از پروانههای نرمافزار آزاد، اجازه نمیدهند که کتابخانههای اشتراکی، توسط نرمافزارهایی که از یک پروانه غیر مشابه استفاده میکنند، پیوند زده شوند و مورد استفاده قرار گیرند. برای مثال، اگر کتابخانهای تحت پروانه جیپیال منتشر شده باشد، تنها نرمافزارهایی که تحت پروانه جیپیال منتشر شدهاند میتوانند به این کتابخانه پیوند داده شوند و از آن استفاده کنند. این کار مانع میشود تا نرمافزارهای انحصاری و یا حتی دیگر نرمافزارهای آزاد از یک کتابخانه با مجوز جیپیال استفاده کنند. بنیاد نرمافزارهای آزاد برای رفع این محدودیت جیپیال، پروانه الجیپیال را منتشر کرده است.
مدل تجاری
نرمافزارهای آزاد را میتوان مستقیماً به فروش رساند و به این ترتیب از فروش آنها کسب درامد کرد. اما این مسئله نباید آزادی های بالا را محدود کند. کاربر پس از خرید یک نرمافزار آزاد، میتواند آن را برای هر منظوری استفاده کرده، تغییر داده، و مجدداً منتشر کند (چه به صورت رایگان و چه به صورت تجاری). علاوه بر فروش مستقیم نرمافزار، میتوان با ارائه خدمات و پشتیبانی از نرمافزارهای آزاد، کسب درامد کرد. مثلاً یک شرکت میتواند با اضافه کردن یک قابلیت جدید به یک نرمافزار آزاد یا در قبال برطرف کردن یک ایراد امنیتی، مبلغی پول از مشتریانش دریافت کند. یا همچنین یک شرکت میتواند نحوه استفاده از یک برنامه را به کارمندان و کاربران یک شرکت دیگر آموزش دهد و در قبال آن دستمزد دریافت کند. برخی از پروانههای سهلگیر نرمافزار آزاد، به کاربران اجازه میدهند تا نرمافزار را بدون در اختیار قرار دادن کدهای منبع توزیع کنند. بدین ترتیب دست کاربران تجاری بیشتر باز خواهد بود. برخی از شرکتها، نرمافزارهای خود را با دو مجوز مختلف، هم به صورت آزاد و هم به صورت غیرآزاد عرضه میکنند.
برخی از توسعهدهندگان مستقل نرمافزار آزاد، کمکهای مالی از طرف افراد داوطلب قبول میکنند. به عنوان مثال، سورسفورج امکاناتی دارد که یک کاربر داوطلب میتواند مبلغی پول را به یک پروژه نرمافزار آزاد اهدا کند.
مثالهایی از نرمافزارهای آزاد کاربردی
هستهٔ سیستمعامل گنو/لینوکس، داروین.
تعدادی از سیستمعاملهای خانواده بیاسدی مانند فریبیاسدی, اپنبیاسدی, نتبیاسدی, دراگونفلیبیاسدی.
کامپایلر جیسیسی، کتابخانهٔ زبان برنامهنویسی سی
کامپایلر کلنگ
پایگاهدادههای رابطهای مانند: mysql، پستگر اسکیوال، برکلی دیبی
زبانهای برنامهنویسی مانند تیسیال، روبی، پایتون، پرل و پیاچپی.
مرورگر وب فایرفاکس (Firefox)
اُپن آفیس (Open Office)
میزکار کیدیای (KDE)
میز کار الاکسدیئی (LXDE)
میزکار اکسافسیئی (XFCE)
میزکار گنوم (Gnome)
برنامههای حروف چینی مانند تک، لاتک و فارسی تک
نرمافزارهای مدیریت محتوا مانند جوملا (!Joomla)، پیاچپی-نیوک (PHP-Nuke)، پست نیوک (postnuke) و مامبو (mambo) ,وردپرس (wordpress), دروپال (drupal) , ....
نرمافزارهای ساخت انجمن (Forum) مانند پیاچپیبیبی (phpbb)، اساماف (smf)، یاب (YaBB) و فروم (phorum)
ویرایشگرهای متن ویم و ایمکس
مجموعه اداری لیبرهآفیس
برنامهنویسی
برنامهنویسی رایانه در فرهنگ واژه غیر متخصّصین ممکن است به تمام پروژه ساخت نرمافزار یا برنامهٔ رایانهای گفته شود. با این همه برنامهنویسی تنها بخشی از فرایند توسعهٔ نرمافزار یا برنامه رایانهای است. اهمیت، توجه و منابع اختصاص داده شده به برنامهنویسی، بسته به ویژگیهای مشخص شده محصول و خواست افراد درگیر در پروژه و کاربران و در نهایت شیوهٔ انتخاب شده مهندسی نرمافزار متغیر است.
برنامه نویسی کامپیوتر (که اغلب به طور کوتاه برنامه نویسی نامیده می شود) فرآیند سوق دادن ساختار اصلی یک مسأله محاسباتی به برنامه ای قابل اجرا است. این کار مستلزم فعالیت هایی همچون تحلیل و درک مسأله است و عموما حل چنین مسایلی منجر می شود به ایجاد یک الگوریتم، بازبینی نیازمندی های الگوریتم که شامل صحت و میزان منابع مصرفی است، پیاده سازی(که معمولا به عنوان کدینگ از آن یاد می شود) این الگوریتم در یک زبان برنامه نویسی مقصد، تست کردن، اشکال زدایی، نگه داری کد منبع، پیاده سازی سیستم ساخت(build system) و مدیریت مصنوعات مشتق شده مانند کد ترجمه شده به زبان ماشین برنامه های کامپیوتری. الگوریتم اغلب تنها به شکل قابل تجزیه و تحلیل برای انسان و قابل استدلال با منطق نمایش داده می شود. کد منبع به یک یا چند زبان برنامه نویسی(مانند JavaScript ،Smalltalk ،Python ،Java ،C# ،C++ ،C، و غیره) نوشته شده است.
تاریخچه
موضوع دستگاههایی که به دنبالهای از دستورالعملهای از قبل تعریف شده عمل میکند بر میگردد به Greek Mythology.
برنامه نویسی مدرن
برنامه نویسی مدرن
اندازه گیری کاربرد زبان
تعیین اینکه محبوبترین زبان برنامه نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبانها در کاربردهای خاصی محبوب است و بعضی دیگر مرتباً در نوشتن کاربردهای گوناگون استفاده میشود. روشهای اندازه گیری محبوبیت زبان شامل موارد زیر میباشد: شمردن تعداد آگهیهای اشتغال و توجه به یک زبان، تعداد کتابهای آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان
اشکال زدایی
اشکال زدایی وظیفه بسیار مهمی در فرایند توسعه نرمافزار میباشد، زیرا یک برنامه غلط میتواند پیامدهای مهمی برای کاربر خود داشته باشد. بعضی از زبانها بیشتر در معرض برخی اشتباهات میباشند، به خاطر خصوصیاتشان نیاز به بررسی بیشتر کامپایلر نسبت به زبانهای دیگر ندارند.
زبان برنامهنویسی
اجرا و عملی ساختن الگوریتمهای انتزاعی وابسته به هم بهوسیله تولید یک برنامه رایانهای مشخص با ابزار زبان برنامهنویسی ممکن است.
نمونه یک برنامه
یک برنامهٔ ساده در زبان برنامهنویسیBasic که از سادهترین زبانهای برنامهنویسی است میتواند به شکل زیر باشد:
REM MY FIRST TRY TO COMMAND THIS MACHINE TO DO WHAT I LIKE
PRINT "HELLO NEW WORLD!"
END
سطر نخست که با واژه کلیدی "REM" آغاز شده و از سوی برنامهٔ واسط درنظر گرفته نمیشود و تنها برای نگاه داشتن یک توضیح یا مانند آن برای خود برنامهنویس است. سطر دوم با واژه کلیدی "PRINT" به دستگاه فرمان میدهد تا نوشته "HELLO NEW WORLD!" ("سلام دنیای نو!") را روی نمایشگر بنویسد (چاپ کند). سطر آخر پایان فرامین و برنامه را به ماشین اطلاع میدهد.
پس از نوشتن یک برنامه مانند بالا، برنامهٔ مترجم (در اینجا Basic) دستورات را تبدیل به فرامینی میکند که لایه زیرین، که ممکن است همان سختافزار باشد، میتواند آنها را اجرا کند.
پارادایمها
زبانهای برنامهنویسی گوناگون براساس قابلیتهای درنظر گرفته شده از شیوهٔ خطهای مختلف استفاده میکنند. موارد ریزتری مانند چگونگی برخورد با نیازهای پشت پردهٔ ماشین مانند مدیریت حافظه و مدیریت زباله نیز در زبانهای مختلف متفاوت است. علاوه بر اینها، مفاهیمی متفاوت از (اجرای) یک برنامه تصور شدهاند که پارادایم یا الگو نام دارند.
وارسی مدل
در علوم کامپیوتر، وارسی مدل به این مسئله اشاره دارد که آیا مدل یک سیستم یک نیازمندی خاص را پشتیبانی میکند یا خیر. بررسی امکان بروز بن بست، مسابقه و حالتهای خاصی که سیستم را از کار میاندازد، وظیفهٔ فرایند وارسی مدل نرمافزار است. به طور خلاصه، وارسی مدل تکنیکی است برای تائید صحت عملکرد یک سیستم که دارای حالتهای محدود(en:Finate-state machine) است. این روش برای اطمینان حاصل کردن از صحت عملکرد نیازمندیها و طراحی یک سیستم بلادرنگ و نهفته به کار میرود. این شیوهٔ صحت سنجی، تمامی حالتهای ممکن سیستم را کاوش میکند و کلیهٔ سناریوهای ممکن را به روش نظاممند امتحان میکند.
روشهای وارسی مدل
در وارسی مدل کلیهٔ حالتها و انتقالهای مدل ریاضی مورد بررسی قرار میگیرد. با استفاده از یک روش هوشمندانه با دامنهٔ خاص، میتوان تمامی حالتها را با کاهش زمان محاسبه طی انجام یک عملیات، بررسی کرد. شیوههای پیاده سازی شامل شمارش فضای حالتها، شمارش فضای حالتهای نمادین، تفسیر انتزاعی، شبیه سازی نمادین و پالایش انتزاعی است. ویژگیهایی که اغلب مورد صحت سنجی قرار میگیرند، به صورت منطقهای زمانی مثل منطق زمانی خطی (LTL) و یا منطق محاسبات درختی (CTL) توصیف میشوند.
مزایا و کاربردها
این شیوه به نسبت سایر روشها مثل وارسی اثبات، از سرعت بالایی برخوردار است.
با استفاده از مثال نقضی که در گزارش وارسی تولید میگردد، علت عدم ارضای ویژگی مورد انتظار در سیستم را میتوان کشف نمود.
این روش، صحت سنجی پارهای را میسر میکند. به بیانی دیگر میتوان هر ویژگی به طور مجزا وارسی گردد.
در هر مرحله از توسعهٔ تولید نرم¬افزار (طراحی، پیاده سازی و...) می¬توان از این روش بهره برد.
کشف خطاهایی که در الگوریتمهای پیچیده نظیر پروتکلهای ارتباطی و الگوریتمهای جمع آوری زباله ممکن است رخ دهند و تشخیص آنها در فاز طراحی مشکل است؛ با استفاده از این روش امکان پذیر است.
از جمله ویژگیهای سیستمی که در وارسی مدل میتوان از صحت عملکرد آنها در مرحلهٔ پیاده سازی سیستم اطمینان حاصل نمود، عبارتند از:
کشف بروز بن بست در برنامههای همروند.
وارسی مشخصات زمانی؛ برای مثال بررسی بروز بن بست بعد از گذشت یک ساعت از راه اندازی مجدد سیستم.
تفاوت وارسی مدل با تست نرمافزار
در وارسی مدل تمامی برنامه بررسی میشود مگر آن که یک عیب پیدا شود. اما در تست نرمافزار بر حسب مجموعهٔ ورودی، در آن واحد فقط و فقط یک مسیر اجرا و وارسی میشود.
تست نرمافزار
اهداف تست نگرش ما در تست نرم افزا ر تست: اجراي یک برنامه با هدف پیدا کردن خطا تست خوب: احتمال پیدا کردن خطاهاي کشف نشده توسط ارزیابی زیاد است. تست موفق: که حداقل یک خطاي کشف نشده را بیابد تست فقط وجود خطا را نشان می دهد و نه عدم وجود آن را. پیدا نشدن خطا در تست به معناي بدون خطا بودن برنامه نیست. اصول تست تست با توجه به نیازمندیهاي کاربر برنامه ریزي قبل از اجرا (test plan) نوشتن برنامه تست قانون پارتو %80 خطاهاي کشف نشده در 20 % کد است تست باید از اجزاي کوچک شروع شود ممکن نیست (exhaustive) تست کامل براي موثر بودن باید توسط شخصثالث بیطرف انجام شود معیارهاي تست پذیر بودن نرم افزار ١. قابلیت اجرا Operability هرچه نرم افزار بهتر کار کند و در محیط هاي بیشتري قابل اجرا باشد، n بهتر قابل ارزیابی است ٢. مشاهده پذیري Observability قابلیت مشاهده نتایج ارزیابی ٣. کنترل پذیري Controlability قابلیت اجراي تستهاي خودکار (مثل امکان اجراي خودکار تست هاي واحد توسط jUnit براي زبان جاوا) ۴. تجزیه پذیري Decomposability ارزیابی می تواند هدفمند تر شود ۵. سادگی Simplicity کاهش پیچیدگی معماري و منطق برنامه ۶. پایداري Stability براي ارزیابی تغییرات کمی بخواهد ٧. درك پذیري Understandability قابلیت درك طراحی و وابستگیهاي بین اجزا سطوح مختلف تست • تست واحد(Unit testing ) • تست یکپارچه سازي(Integration testing ) • تست یکپارچه سازي افزایشی • تست یکپارچه سازي • تست سیستم(System testing ) • تست پذیرش(Acceptance testing ) • تست آلفا • تست بتا تست واحد . پایین ترین سطح تست است micro level هر کد تست واحد، یک قطعه کد یا یک تابع (متد) خاص را تست می کند. این تست نیاز به دانش در مورد طراحی و نحوه عملکرد داخلی تابع یا قطعه کد دارد. توسط برنامه نویس (و نه تست کننده) انجام می شود. تست یکپارچه سازي افزایشی با افزوده شدن قابلیت جدید به نرم افزار، مجددا نرم افزار تست می شود. هدف این تست، بررسی درستی نرم افزار پس از افزوده شدن امکان جدید است. امکانات نرم افزار باید از هم استقلال داشته باشند تا بتوان پیش از تکمیل کل نرم افزار و به صورت افزایشی نرم افزار را تست کرد. توسط برنامه نویس یا تیم تست انجام می شود تست یکپارچه سازي تست نرم افزار حاصل از کنار هم قرار گرفتن قطعات مختلف آن به منظور بررسی درستی عملکرد نرم افزار یکپارچه شده قطعات مختلف شامل قطعه کدها (ماژول هایی از کد برنامه هاي مجزا که در کنار هم برنامه اصلی را تشکیل می دهند برنامه هاي مشتري-کارگزار عمل کننده در یک شبکه پس از تست واحد انجام می شود تست سیستم به منظور بررسی عملکرد نرم افزار بر روي پلتفرم هاي مختلف انجام می شود و نرم افزارهاي OS پلتفرم: سخت افزار + نرم افزار (شامل کاربردي مورد نیاز برنامه) به منظور اطمینان از اینکه برنامه با مولفه هاي دیگر محیط اجرایش به خوبی کار می کند به منظور اطمینان از اینکه نرم افزار ارائه شده در محیط مورد نظر قابل استفاده است. مثالی از مشکل حاصل از انجام ندادن تست سیستم
نرم افزار بازي شیر شاه دیزنی Disney’s Lion King Game
در پاییز سال 1994 شرکت دیزنی اولین CD بازي خود تحت عنوان شیر شاه Lion King که بر اساس کارتونی به همین نام ساخته شده بود را وارد بازار کرد. بسیاري از شرکتهاي دیگر تا آن زمان اقدام به ساخت بازیهاي رایانه اي کرده بودند اما این اولین بار بود که شرکت دیزنی وارد این تجارت شده بود. دیزنی براي فروش این بازي دست به تبلیغات گسترده اي زد و در نتیجه این محصول با فروش بسیار بالایی مواجه شد. اما اتفاقات پس از آن تبدیل به کابوسی براي این شرکت شد. در 26 دسامبر، روز پس از کریسمس تلفن هاي بخش پشتیبانی مشتریان شرکت دیزنی شروع کرد به زنگ زدن و زنگ زدن و زنگ زدن! متصدیان پاسخگویی به تماس ها با خیل عظیمی از والدین عصبانی با بچه هاي گریان مواجه شدند که ادعا می کرند نرم افزار مزبور کار نمی کند. این خبر به سرعت در مطبوعات و تلویزیون نیز پخش شد و کریسمس آن سال را براي بسیاري از پرسنل دیزنی تلخ کرد. تست علت چه بود؟ پس از بررسی مشخص شد که دیزنی نرم افزار خود را بر روي بسیاري از مدل هاي PCتست نکرده بود و در نتیجه تنها بر روي سیستمهایی کار می کرد که برنامه نویسان دیزنی روي آن سیستم ها نرم افزار خود را توسعه داده بودند و نه دستگاههاي متداولی که عموم مردم از آن استفاده می کردند. تست پذیرش به منظور بررسی اینکه نرم افزار نیازهاي مشتري را برآورده می کند، انجام می شود بعد از تست سیستم انجام می شود. شامل: تست آلفا: تست آلفا در سایت توسعه دهنده نرم افزار و در اغلب موارد n توسط کارمندان داخلی و در بعضی از موارد توسط مشتري تعدادي از کاربرانش که به محل دعوت می شوند انجام می گیرد. تست بتا: در تست بتا نسخه هایی از نرم افزار در اختیار تعدادي از کاربران قرار می گیرد تا در بازه اي با آن کار کنند و خطاها را گزارش دهند. روشهاي ارزیابی روش جعبه سفید دانستن نحوه کار داخلی برنامه امکان تایید نحوه عمل هر تکه کد و مسیر اجرا مراحل اولیه ارزیابی روش جعبه سیاه دانستن عمل مورد انتظار و مطلوب امکان تایید کاري که سیستم باید انجام دهد مراحل انتهایی ارزیابی استرتژی تست استراتژی تست نرمافزار یک توصیف رسمی از این است که نرمافزار چگونه تست خواهد شد. هدف استراتژی تست تعریف همه مراحل برای فرایند تست نرمافزار است که شامل برنامه ریزی آزمایش، طراحی ابزار آرمایش، اجرای آزمایش و جمع آوری و ارزیابی دادههای بدست آمده باشد.
==استراتژی جعبه سیاه==این آزمایش جایگزین آزمایش جعبه سفید نمیباشد بلکه مکمل آن است.وخطاهایی متفاوت باآن راتست میکند.
شما نرمافزاری را که به آن نیاز داشتید را تهیه می کنید و بر روی سیستم خود نصب می کنید، شما در اکثر موارد بعد از نصب برنامه فقط یک نسخه اجرایی آنرا در سیستم خود خواهید داشت، و هیچ دسترسی به سورس کد و منابع دیگر برنامه نخواهید داشت. سیستم نرمافزاری موجود برای شما مانند یک جعبه سیاه است که شما نمیتوانید دورن آنرا مشاهده کنید و به آن دسترسی داشته باشید. استراتژی جعبه سیاه دقیقاً از این دیدگاه برنامه را مورد آزمایش قرار می دهد، یعنی با این پیش فرض که شما هیچ اطلاعاتی از کد و طراحی داخلی برنامه ندارید. حالا هیچ اطلاعاتی از کد و طراحی برنامه در اختیار ما نیست، پس چگونه می توان به صحت کارکرد برنامه پی برد؟ جواب خیلی ساده است، با تمرکز بر ورودیها و خروجی ها، برای اینکار آزمایش کننده نرمافزار به مستندات نرمافزار مراجعه میکند تا مشخص کند که سیستم در مقابل یک عمل خاص چه پاسخی را باید بدهد. سپس دادههای را برای هر کدام از عملیات انتخاب میکند و رفتار سیستم را در مقابل آن دادهها با رفتار واقعی سیستم که در مستندات وجود دارد مقایسه و بررسی می کند.
در یک استراتژی آزمایش جعبه سیاه ما عموماً موارد زیر را مورد بررسی و آزمایش قرار می دهیم:
۱. بررسی اینکه سیستم نیازمندهای عملیاتی و غیر عملیاتی را تامین میکند یا نه.
۲. اعتبارسنجی ورودیها
۳. بررسی مقادیر مرزی برای متغیرها: به یک متغیر مقداری کمتر از حداقل مقداری که می تواند قبول کند یا بیشتر از حداکثر مقداری که می تواند قبول کند می دهیم و سیستم را در این شرایط تست می کنیم.
۴. بررسی خروجهای سیستم: یک مجموعه از ورودهای صحیح با خروجهای مربوط به آن را تهیه می کنیم و سپس ورودها را به سیستم وارد می کنیم و خروجهای که توسط سیستم داده میشود را با خروجیهای واقعی مقایسه می کنیم.
۵. بررسی رفتار سیستم در برابر پردازش ورودها و پرس و جوهای بزرگ و سنگین
برای موارد بالا و مواردی دیگری که ذکر نشد روشهای مختلف تست در استراتژی جعبه سیاه وجود دارد که عبارتند از:
en:Functional testing
en:Stress testing
en:Recovery Testing
en:Volume testing
User Acceptance testinge
en:System testing
en:Sanity or Smoke testing
en:Load testing
en:Usability testing
en:Exploratory testing
Ad-hoc Testing
en:Alpha testing
en:Beta testing
آیا می توان در استراتژی جعبه سیاه، از این مطمئن شد که سیستم به طور کامل تست شده است؟ خیر، هرگز در این استراتژی نمی توان مطمئن شد که سیستم به طور کامل تست شده است.
استراتژی جعبه سفید
حال تصور کنید که شما خود یک توسعه دهنده نرمافزار هستید، پس شما می توانید به سورس، طراحی و منابع دیگر نرمافزار دسترسی داشته باشید. در این حالت سیستم را می توان به یک جعبه شیشه ای (جعبه سفید) تشبیه کرد که شما می توانید براحتی محتویات داخل و نحوه عملکرد آنرا مشاهده کنید. آزمایش جعبه سفید نیز دقیقاً از دیدگاه توسعه دهنده نرمافزار را مورد آزمایش قرار می دهد یعنی با این فرض که شما به منطق داخلی و ساختار کد برنامه دسترسی و احاطه دارید و می دانید که سیستم چگونه پیاده سازی شده است. شما با دانستن این موارد می توانید مشخص کنید که آیا اعمال داخلی بر طبق مشخصهها نجام میشود و یا نه.
در یک استراتژی آزمایش جعبه سفید ما عموماً موارد زیر را مورد توجه و بررسی قرار می دهیم:
۱. بررسی سطر به سطر کد (Code coverage): در این حالت باید سیستم را به گونه ای اجراء و بررسی کنیم که مطمئن شویم سطر به سطر کد برنامه حداقل یکبار اجراء شده است.
۲. بررسی همه انشعابها در کد برنامه (branch) : در کد برنامه باید تمام عبارتهای شرطی ( if elseها و Switch case ها) را تک به تک مورد بررسی قرار داد. به این صورت که در یک عبارت if else هم فسمت if و هم قسمت else هر کدام بصورت مجزا یکبار اجراء شوند.
۳. بررسی همه حلقهها در برنامه : حلقهها در نرمافزار نقش اساسی دارند، چون می تونند با اشتباه جزئی مقدار زیادی از منابع را مصرف کرد برای مثال شرط خروج از حلقه به اشتباه هیچ وقت True نشود. برای نمونه حلقهها را با ورودی بزرگتر از شرط خروج حلقه چک کنید یعنی حلقه اصلاً اجر نشود. تستی طراحی کنید که حلقه دقیقاً یکبار اجراء شود، تستی طراحی کنید که حلقه در یک بازه خاص اجراء شود و ....
۴. مدیریت خطای مطلوب : برسی اینکه اگر به یک متد یک ورودی نامعتبر وارد شود، نحوه آگاه سازی و نمایش مطلوب خطا برای کاربر چگونه باشد؟
۵. بررسی امنیت : سیستم را از این جهت که چگونه در برابر دسترسیهای غیرمجاز، هک، کرک و هر چیز دیگر که می تواند به آن آسیب برساند مورد بررسی قرار می دهد. در اینجا ما باید مکانهای از کد را که دادهها را اعتبارسنجی و مدیریت می کنند، دسترسی به منابع یا عملیات مهم و حیاتی را انجام می دهند را بررسی کنیم.
بارگیری یا دانلود (به انگلیسی: Download)، فرآیند برداشت دادههای الکترونیکی از یک رایانه (معمولاً یک رایانه دور یا یک سرور) به رایانهٔ دیگر (معمولاً رایانه شما یا یک رایانهٔ محلی)، با مودم یا شبکه رایانهای را گویند. همچنین فرستادن بلوکی از دادهها، مانند یک پرونده، با ساختار پست اسکریپت، به دستگاه مستقلی مانند چاپگر پست اسکریپت نیز بارگیری نامیده میشود. عمل وارون فرایند فوق را بارگذاری یا آپلود (به انگلیسی: Upload) گویند.

واژههای مصوب فرهنگستان برای دانلود و آپلود به ترتیب پایینگذاری و بالاگذاری هستند. در زبان اردو به این دو کنش به ترتیب «زیراثقال» و «زِبَراثقال» میگویند.
بارگیری
کاربرد نخست این واژه در زمینهٔ رایانهها، از فعل دریافت کردن ریشه گرفته، به معنی گرفتن یک پرونده (یا بارگیری)، از یک رایانه، یک خدماتدهندهٔ وب، و یا سامانهای همانند. این واژه در گویش خیابانی و فرهنگ عامیانه، مانند واژهٔ انگلیسی آن، دانلود (Download) گفته میشود.
بارگذاری
بارگذاری، یعنی ارسال کردن یک پرونده، از رایانهای به رایانهٔ دیگر. این واژه در گویش خیابانی، مانند واژه انگلیسی آن، آپلود (Upload) گفته میشود.
نرمافزار
نرمافزار (به انگلیسی: Software) یا برنامه، مجموعهای از دستورالعملهای دقیق و مرحله به مرحله است که هدف خاصی را دنبال میکنند.
ظاهراً، اولین بار جان توکی در سال ۱۹۵۸ این واژه را بهاین معنا بهکار بردهاست. احتمالاً این واژه در مقابل سختافزار (به انگلیسی: Hardware) به کار بردهاند که بسیار پیش از پیدایش رایانه (به معنای اسباب و اشیاء) بهکار میرفتهاست.
دو گروه کلی نرمافزارها
نرمافزارهای رایانه را میتوان به دو دسته بزرگ تقسیم کرد:
نرمافزار سیستم (به انگلیسی: System software)
نرمافزار کاربردی (به انگلیسی: Application software)
میتوان گفت نرمافزارهای کاربردی، برنامههای مورد استفاده کاربرند و نرمافزارهای سیستمی، مدیریت رایانه را برعهده دارند. مهمترین نرمافزار سیستم، سیستمعامل است.
سیستم عامل
وقتی برنامهای را روی رایانه خود نصب میکنید، اجزای سختافزاری آن به فرمان آن برنامه در میآیند. برای نمونه هنگامی که با یک برنامه اجرای موسیقی کار میکنید، کارت صدای رایانه تان با برنامه پخش موسیقی همکاری میکند و یک آهنگ یا پرونده (فایل) صوتی را از طریق بلندگوی رایانه تان پخش میکند.
این ارتباط میان نرمافزار و سختافزار توسط سیستم عامل انجام میشود. این تنها قسمتی از کار سیستم عامل است.
سیستم عامل خود یک برنامه نرم افزاری است با این تفاوت که چون تمام منابع و امکانات سخت افزاری در اختیار وی می باشد دارای ویژگی منحصر به فرد می باشد بنابراین آن را در رده نرم افزارها می خوانیم با این ویژگی که از اهمیت خاصی برخوردار است. به بیان دیگر سیستم عامل یک برنامه جامع است که اجازه در اختیار قراردادن منابع و امکانات سخت افزاری را برای نرم افزارها صادر می کند و این سیستم عامل است که مسئول صحت عملکرد سیستم و منابع آن است.
سیستم عامل شامل 4 بخش مهم است
1- مدیریت پردازش و پردازشگر
2- مدیریت حافظه
3- مدیریت دستگاههای ورودی و خروجی (I/O)
4- مدیریت فایل
سه گروه کلی نرمافزارهای معماری
از دیدگاه ساختاری (معماری) (architecture)، نرمافزارها به دستههای زیر تقسیم میشوند:
کاربر-بنیان یا Client Base
کارگزار-بنیان یا Server Base
کاربر کارگزار بنیان یا Client-Server Base
امروزه واژه نرمافزار را در معناهایی به جز معنی برنامه رایانهای نیز بهکار میبرند. مثلاً در دانش مدیریت برای اشاره به روشها و دانش فنی (در برابر وسایل و تجهیزات و نیروی انسانی). نرمافزارها انواع گوناگونی دارند که مهم ترین دسته بندی آنها دستهٔ تجاری و آزاد است. به ویژه با رویکردهای طرحهای گنو و لینوکس معنای ژرف تری به نرمافزارهای آزاد داده شده تا آنجا که برخی نرمافزارها را نماد فرهنگ می دانند. نرمافزارها را برنامه نویسان تدوین کرده و انتشار میدهند. این برنامه نویسان ممکن است در یک شرکت مشغول کار باشند یا در خانه برنامه نویسی کنند مانند برنامه نویسان برخی نرمافزارهای لینوکس. امروزه بیشتر کاربران تنها با ظاهر گرافیکی این برنامهها کار میکنند و اقدامات بسیاری از آنها از دید کاربر پنهان میماند به عبارتی هر نرمافزار مجموعهای از رمزها است که از الگوریتمی خاص پشتیبانی میکنند این رمزها خود با رمزهای گرافیکی آمیخته شده و بسیاری از اقدامات برنامه به دور از چشم کاربر عادی رخ میدهد. برنامهها با رمزهایی نوشته میشوند که بعداً یک رمزخوان آن را در رایانه کاربر اجرا میکند.
رقابت نرمافزاری
در حال حاضر نرمافزارهای کامپیوتری فراوان را میتوان در بازار یافت که به طور جدی به رقابت خود برای بقا ادامه میدهند. از مسائل قابل ذکر در این مورد میتوان به خرید سهام شرکتهای نرمافزاری کوچک و بزرگ توسط شرکتهای دیگر اشاره نمود. همچنان که شرکت بزرگ گوگل به خرید سهام شرکتهای بزرگ همچنان ادامه میدهد، در مدت کمی توانسته بسیاری از شرکتها را تحت سلطه خود درآورد.
نرمافزار سیستم
نرمافزار سیستم به نرمافزاری در رایانه گفته میشود که به کارکرد سیستم رایانه یا کاربردهای سطح پایین (یا Low Level) رایانه مربوط باشد. این نرمافزارها به ساختار فیزیکی سختافزار رایانه وابسته هستند و در نوشتن آنها از زبانهای سطح پائین مانند زبان اسمبلی استفاده میشود. سیستمعامل و درایورها از نرمافزارهای سیستم هستند. از جمله زبان هایی که برای نگارش نرمافزارهای سیستمی استفاده میشود، زبان برنامه نویسی C میباشد. کار کردن با سی برای برنامه نویسان راحت تر است و آنان این زبان را به اسمبلی ترجیح میدهند. اگر برای نگارش نرمافزار سیستمی مشکل محدودیت فضای سختافزاری داشته باشیم بهتر است با زبان اسمبلی کار کنیم که حجم آن پایین تر است. نرمافزارهای سیستمی به سختافزار وابسته اند.
در برابر نرمافزار سیستم، نرمافزار کاربردی قرار دارد که برای کاربردهای سطح بالا و غیرسیستمی رایانه است و معمولاً به زبانهای سطح بالا نوشته میشود که از جزئیات سختافزاری سیستم مستقل است.
نرمافزار کاربردی
نرمافزار کاربردی (به انگلیسی: Application software) عبارت است از نرمافزاری که با استفادهٔ مستقیم از منابع و قابلیتهای رایانه کاری را مستقیماً برای کاربر انجام میدهد. باید توجه داشت که این عبارت در مقابل عبارت نرمافزار سیستمی معنی پیدا میکند.
نرمافزار سیستمی در مقابل در پسزمینه عمل میکند و خدماتی را فراهم میکند که دیگر نرمافزارها و یا سیستمعامل میتوانند برای انجام کارهای خود از آن استفاده کنند. اما در عوض معمولاً مستقیماً با کاربر عادی در تماس نیست و خدماتی را به او ارایه نمیدهد.
در عمل بیشتر نرمافزارهایی که کاربران با آنها سر و کار دارند از این دسته محسوب میشوند. برای مثال میتوان به نرمافزارهای رومیزی یعنی واژهپردازها، صفحه گستردهها، نرمافزارهای طراحی گرافیکی، بازیهای رایانهای و امثال آنها اشاره کرد.
بسیاری نرمافزارهای کاربردی، برای توسعهدهندگان ابزار رابط برنامهنویسی کاربردی هم فراهم میکنند تا بتوان از قابلیتهای نرمافزار در نرمافزارهای جدید استفاده کرد. برای مثال نرمافزار ادوبی آکروبات هنگام نصب ایپیآی فراهم میکند که برنامهنویس میتواند با استفاده از آن تواناییهای آکروبات را در برنامهٔ خود به کار گیرد.
برای عنوان نمونههای دیگر میتوان به نرمافزارهای پردازش متن، برگههای گسترده (صفحات گسترده) و نرمافزارهای پخش نوا و نما اشاره کرد.
مهندسی نرمافزار
مهندسی نرمافزار (به انگلیسی: Software engineering) یعنی استفاده از اصول مهندسی بجا و مناسب برای تولید و ارائه محصول نرمافزاری با کیفیت که قابل اطمینان و با صرفه بوده و برروی ماشینهای واقعی به طور کارآمدی عمل کند.
مهندسی نرمافزار یک روش سیستماتیک، منظم و دقیق برای ساخت و ارائه محصولی نرمافزاری با کیفیت است.
مهندسی نرمافزار اغلب شامل فرایند خطی تحلیل، طراحی، پیادهسازی و آزمون است؛ که با به کارگیری روشهای فنی و علمی از علوم مهندسی موجب تولید نرمافزاری با کیفیت مطلوب در طول یک فرایند انتخابی مناسب پروژه میشود.
کاربردهای مهندسی نرمافزار دارای ارزشهای اجتماعی و اقتصادی هستند، زیرا بهرهوری مردم را بالا برده، چند و چون زندگی آنان را بهتر میکنند. مردم با بهرهگیری از نرمافزار، توانایی انجام کارهایی را دارند که قبل از آن برایشان شدنی نبود. نمونههایی از این دست نرمافزارها عبارتاند از: سامانههای توکار، نرمافزار اداری، بازیهای رایانهای و اینترنت.
فناوریها و خدمات مهندسی نرمافزار به کاربران برای بهبود بهرهوری و کیفیت یاری میرساند. نمونههایی از زمینههای بهبود: پایگاه دادهها، زبانها، کتابخانهها، الگوها، فرایندها و ابزار.
مهم ترین شاخص مهندسی نرمافزار
مهم ترین شاخص در مهندسی نرمافزار تولید نرمافزار با کیفیت مناسب در جهت «نیازهای مشتری» است.
پیشینه مهندسی نرمافزار
اصطلاح مهندسی نرمافزار پس از سال ۱۹۶۸ میلادی شناخته شد. این اصطلاح طی نشست «مهندسی نرمافزار ناتو ۱۹۶۸» (که در گارمیش-پارتنکیرشن، آلمان برگزار شد) توسط ریاست نشست فریدریش ال باوئر معرفی شد و از آن پس بهطور گسترده مورد استفاده قرار گرفت.
اصطلاح مهندسینرمافزار عموماً به معانی مختلفی بهکار میرود:
بهعنوان یک اصطلاح غیر رسمی امروزی برای محدوده وسیع فعالیتهایی که پیش از این برنامهنویسی و تحلیل سامانهها نامیده میشد.
بهعنوان یک اصطلاح جامع برای تمامی جنبههای عملی برنامهنویسی رایانه، در مقابل تئوری برنامهنویسی رایانه، که علوم رایانه نامیده میشود.
بهعنوان اصطلاح مجسمکننده طرفداری از یک رویکرد خاص نسبت به برنامهنویسی رایانه که اصرار میکند، مهندسی نرمافزار، بهجای آنکه هنر یا مهارت باشد، باید بهعنوان یک رشته عملی مهندسی تلقی شود و از جمعکردن و تدوین روشهای عملی توصیهشده به شکل متدولوژیهای مهندسی نرمافزار طرفداری میکند.
مهندسی نرمافزار عبارتست از:
کاربرد یک رویکرد سامانهشناسی، انتظامیافته، قابل سنجش نسبت به توسعه، عملکرد و نگهداری نرمافزار، که کاربرد مهندسی در نرمافزار است.
مطالعه روشهای موجود در استاندارد IEEE
محدوده مهندسی نرمافزار و تمرکز آن
مهندسی نرمافزار به مفهوم توسعه و بازبینی یک سامانه نرمافزاری مربوط میباشد. این رشته علمی با شناسایی، تعریف، فهمیدن و بازبینی خصوصیات مورد نیاز نرمافزار حاصل سر و کار دارد. این خصوصیات نرمافزاری ممکن است شامل پاسخگویی به نیازها، اطمینانپذیری، قابلیت نگهداری، در دسترس بودن، آزمونپذیری، استفاده آسان، قابلیت حمل و سایر خصوصیات باشد.
مهندسی نرمافزار ضمن اشاره به خصوصیات فوق، مشخصات معین طراحی و فنی را آماده میکند که اگر بهدرستی پیادهسازی شود، نرمافزاری را تولید خواهد کرد که میتواند بررسی شود که آیا این نیازمندیها را تأمین میکند یا خیر.
مهندسی نرمافزار همچنین با خصوصیات پروسه توسعه نرمافزاری در ارتباط است. در این رابطه، با خصوصیاتی مانند هزینه توسعه نرمافزار، طول مدت توسعه نرمافزار و ریسکهای توسعه نرمافزار درگیر است.
نیاز به مهندسی نرمافزار
نرمافزار عموماً از محصولات و موقعیتهایی شناخته میشود که قابلیت اطمینان زیادی از آن انتظار میرود، حتی در شرایط طاقت فرسا، مانند نظارت و کنترل نیروگاههای انرژی هستهای، یا هدایت یک هواپیمای مسافربری در هوا، چنین برنامههایی شامل هزاران خط کد هستند، که از نظر پیچیدگی با پیچیدهترین ماشینهای نوین قابل مقایسه هستند. بهعنوان مثال، یک هواپیمای مسافربری چند میلیون قطعه فیزیکی دارد (و یک شاتل فضایی حدود ده میلیون بخش دارد)، در حالی که نرمافزارِ هدایت چنین هواپیمایی میتواند تا ۴ میلیون خط کد داشته باشد.
با توجه به گسترش روزافزون دنیای رایانه امروزه بیش از هر زمان دیگری نیاز به متخصصان رایانه احساس میشود. متاسفانه این رشته در ایران بازار کار خوبی ندارد طبق آمارها ۶۳٫۲۷ درصد از فارغالتحصیلان در سال ۹۰ مشغول به کار در سایر مشاغل هستند. اما برای مهندسان سختافزار هم امکان کار در شرکتهای تولیدکننده قطعات و دستگاهها و مراکز صنعتی – تولیدی بسیار فراهم است و از نظر سطح درآمدی هم با توجه به دانش و پشتکار شخصی در حد متوسط قرار دارند. به طور کلی این رشته در ایران با استقبال چندانی رو به رو نیست؛ این نیز حاکی از نبود برخی از زیرساختها در ایران هست.
تکنولوژیها و روشهای عملی
مهندسان نرمافزار طرفدار تکنولوژیها و روشهای عملی بسیار متفاوت و مختلفی هستند، که با هم ناسازگار هستند. این بحث در سالهای دهه ۶۰ میلادی شروع شد و ممکن است برای همیشه ادامه پیدا کند. مهندسان نرمافزار از تکنولوژیها و روشهای عملی بسیار متنوعی استفاده میکنند. کسانی که کار عملی میکنند از تکنولوژیهای متنوعی استفاده میکنند: کامپایلرها، منابع کد، پردازشگرهای متن. کسانی که کار عملی میکنند از روشهای عملی بسیار متنوعی استفاده میکنند تا تلاشهایشان را اجرا و هماهنگ کنند: برنامهنویسی در دستههای دونفری، بازبینی کد، و جلسات روزانه. هدف هر مهندس نرمافزار بایستی رسیدن به ایدههای جدید خارج از الگوهای طراحی شده قبلی باشد، که باید شفاف بوده و بهخوبی مستند شده باشد.
با وجود رشد فزاینده اقتصادی و قابلیت تولید فزایندهای که توسط نرمافزار ایجاد شده، هنوز هم بحث و جدلهای ماندگار درباره کیفیت نرمافزار ادامه دارند.
ماهیت مهندسی نرمافزار
دیوید پارناس گفتهاست که مهندسی نرمافزار یک شکل از مهندسی است. استیو مککانل گفتهاست که هنوز اینطور نیست، ولی مهندسی نرمافزار باید یک شکل از مهندسی شود. دونالد کنوت گفتهاست که برنامهنویسی یک هنر است.
دیوان فعالیتهای آماری آمریکا مهندسان نرمافزار را به عنوان زیرگروهی از «متخصصان رایانه»، با فرصتهای شغلیای مانند «دانشمند رایانه»، «برنامه نویس» و «مدیر شبکه» دسته بندی کردهاست. BLS تمام مهندسان دیگر این شاخه علمی، که شامل مهندسان سختافزار رایانه نیز هست، را بهعنوان «مهندسان» دسته بندی میکند.
نرمافزار آزاد
نرمافزار آزاد (به انگلیسی: Free software) نرمافزاری است که بههمراه کد منبع توزیع شده و با قوانینی منتشر میشود که آزادی استفاده، مطالعه، ویرایش و انتشار مجددِ کاربران را تضمین میکند. نرمافزارهای آزاد معمولاً با همکاری برنامهنویسهای داوطلب بهعنوان یک پروژه بهوجود میآیند.
نرمافزارهای آزاد با نرمافزارهای مالکیتی (مانند مایکروسافت ویندوز) که آزادی کاربر در استفاده، مطالعه، ویرایش یا انتشار مجدد را در درجههای مختلف محدود میکنند، متفاوت است. این محدودیتها با در نظر گرفتن مجازاتهایی قانونی برای کاربرانی که قوانین آنها را نقض میکنند، بهوجود میآیند. نرمافزارهای مالکیتی عموماً به صورت بستههای اجراپذیر باینری و بدون دسترسی به کد منبع فروخته میشوند که جلوی ویرایش و وصلهکردن نرمافزار توسط کاربر را میگیرد و او را برای بهروزرسانی و پشتیبانی به شرکت نرمافزاری تولید کننده وابسته میکنند. نرمافزارهای آزاد از نرمافزاریهای رایگان که برای استفاده، از کاربر پولی دریافت نمیکنند، نیز متفاوتاند. این نوع نرمافزارها نیز معمولاً تمامی حقوق نرمافزار را برای تولیدکنندهٔ آن محفوظ داشته و جلوی مهندسی معکوس، ویرایش و یا توزیع مجدد توسط کاربر را میگیرند. بنابراین موضوع اصلی نرمافزار آزاد، موضوع آزادی است و نه قیمت آن: کاربران آزادند که هر چه میخواهند با نرمافزار انجام دهند. این آزادی شامل انتشار مجدد نرمافزار بهصورت رایگان و یا با سود نیز میشود. یعنی نرمافزار آزاد میتواند به صورت رایگان و یا در ازای دریافت مبلغی پول در اختیار کاربر قرار بگیرد.
ریچارد استالمن در سال ۱۹۸۵ در زمانی که در حال آغاز پروژهٔ گنو و بهوجود آوردن بنیاد نرمافزارهای آزاد بود، برای اولین بار از عبارت «نرمافزار آزاد» استفاده کرد. براساس تعریف بنیاد نرمافزارهای آزاد کاربران یک نرمافزارِ آزاد، آزاد هستند؛ چون به اجازه گرفتن نیازی ندارند؛ آنها در انجام کارهای دلخواهشان (مانند حق نشر و کپیبرداری) محدود نیستند؛ نیازی به موافقت با هیچ توافقنامهای ندارند؛ و در همان ابتدا نیز با نداشتن کد منبع محدود نبودهاند.
تعریف
طبق تعریف نرمافزار آزاد توسط بنیاد نرمافزارهای آزاد، هر نرمافزاری که آزادیهای زیر را برای کاربرانش فراهم کند به عنوان یک نرمافزار آزاد شناخته میشود:
کاربران باید اجازه داشته باشند که نرمافزار مورد نظر را برای هر قصد و منظوری اجرا کنند.
کاربران باید اجازه داشته باشند کدهای منبع نرمافزار را مطالعه کرده و آن را مطابق با نیازهای خود تغییر دهند. برای رسیدن به این هدف، کدهای منبع نرمافزار باید در اختیار کاربر قرار گیرد.
کاربران باید اجازه داشته باشند نرمافزار را مجدداً منشتر کرده و در اختیار دیگران قرار دهند. این کار میتواند به صورت رایگان و یا در ازای دریافت مبلغی پول صورت گیرد.
اگر کاربری نرمافزار را تغییر داد، باید اجازه داشته باشد آن را مجدداً منتشر کرده و در اختیار دیگران قرار دهد. برای تغییر دادن نرمافزار، لازم است تا کدهای منبع نرمافزار در اختیار کاربر قرار گیرد.
همچنین موسسه پیشگامان متنباز هم تعریف مشابهی از نرمافزار آزاد ارائه میدهد. طبق تعریف این موسسه، نرمافزار بازمتن تنها به معنی در دسترس ساختن کدمنبع نیست. علاوه بر آن مجوز باید ویژگیهای زیر را هم داشته باشد:
نرمافزار باید قابل توزیع مجدد باشد (چه به صورت رایگان، چه در ازای دریافت مبلغی پول)
نرمافزار باید شامل کد منبع باشد و این کد منبع را باید بتوان تغییر داد و مجدداً منتشر کرد.
مجوز نباید در برابر افراد یا گروه خاصی تبعیض قائل شود.
مجوز نباید کاربر را برای رسیدن به یک هدف خاص محدود کند.
مجوز نباید مختص به یک محصول خاص باشد.
مجوز نباید نرمافزارهای دیگری که به همراه نرمافزار مورد نظر عرضه شدهاند را محدود کرده و تحت تاثیر قرار دهد. برای مثال اگر چند نرمافزار بر روی یک دیسک منتشر شدند، مجوز نباید اصراری بر روی متنبازبودن آنها داشته باشد.
مجوز نباید تکنولوژی خاصی را محدود کند.
تاریخچه
در اوایل، نرمافزارها به صورت آزاد منتشر میشدند و برنامهنویسان و شرکتها آنها را به صورت آزادانه در اختیار یکدیگر قرار میداند. در اوایل، تجارت رایانه بیشتر مبتنی بر سختافزار بود و شرکتها درامد خود را بیشتر از راه تولید سختافزار کسب میکردند و هر شرکت، سختافزاری ناسازگار با دیگر شرکتها تولید میکرد. مشتریان، که بیشتر مهندسان و دانشمندان بودند، تشویق میشدند که نرمافزارهای ارائه شده توسط سختافزار را بهبود بخشیده و حتی آن را در اختیار دیگران هم قرار دهند. از آنجا که در آن زمانها سختافزارهای تولید شده توسط شرکتهای مختلف با یکدیگر ناسازگار بود و سختافزار استانداردی وجود نداشت، و همینطور از آنجا که در آن زمان مفسرها و کامپایلرها هنوز جا نیفتاده بودند (که این برنامهها برنامهها را قابل حملتر میکنند)، شانس کمی وجود داشت که نرمافزار مورد نظر بر روی سختافزار شرکت رقیب هم به خوبی اجرا شود.
رفتهرفته که صنعت رایانه پیشرفت کرد و سختافزارها بیشتر استاندارد شدند و همینطور کامپایلرها و مفسرها پیشرفت کردند، زمینه برای رشد نرمافزارهای انحصاری فراهم شد. با چنین پیشرفتهایی، برنامهها راحتتر از سختافزار یک شرکت به سختافزار شرکت رقیب پورت میشدند و راحت میشد یک نرمافزار را بر روی سختافزارهای مختلفی از شرکتهای مختلف اجرا کرد. بدین ترتیب یک نفر میتوانست نرمافزاری بنویسد که مستقل از سختافزار خاصی عمل کند و بر روی طیف وسیعی از آنها اجرا شود. علاوه بر آن، با استاندارد شدن سختافزارها، تفاوتهای ناچیزی که آنها در کارایی داشتند رفته رفته ناپدید شد. تولید کنندگان به این نتیجه رسیده بودند که باید به نرمافزار هم به چشم یک وسیله فروشی نگاه کنند. شرکتها شروع به فروش نرمافزارهای خود کردند و دست کاربران خود را برای تغییر در نرمافزارها و انتشار مجدد آنها بستند. به گونه ای که در سال ۱۹۶۸ شرکتی به نام ایدیآر (به انگلیسی: ADR) اولین نرمافزار دارای مجوز را عرضه کرد. در سال ۱۹۶۹، شرکت آیبیام به خاطر اینکه به همراه سختافزارهای خود، نرمافزارهای آزاد ارائه میکرد، توسط وزارت دادگستری ایالات متحده آمریکا به از بین بردن کسب و کار و ایجاد یک شرایط ضدرقابتی برای دیگر متهم شد. آیبیام دیگر به همراه سختافزارهای خود نرمافزار ارائه نکرد و بدین ترتیب نرمافزارها و سختافزارها از یکدیگر جدا شدند و فاصله گرفتند.
در سال ۱۹۸۳، ریچارد استالمن از آزمایشگاه هوش مصنوعی و علوم رایانه امآیتی، پروژه گنو را بنیان نهاد. او که از تغییر فرهنگ در صنعت رایانه و کاربرانش ناامید شده بود، قصد داشت سیستمعاملی به نام گنو را به صورت یک نرمافزار آزاد توسعه دهد. در ژانویه ۱۹۸۴ توسعه سیستمعامل گنو آغاز گشت و بنیاد نرمافزارهای آزاد در اکتبر ۱۹۸۵ بنیان نهاده شد. در سال ۱۹۸۹، اولین نسخه از اجازهنامه همگانی گنو منشتر شد. البته جیپیال اولین پروانه نرمافزار آزاد نبود و قبل از آن پروانههای نرمافزار آزاد دیگری مانند پروانه بیاسدی در سال ۱۹۸۸ عرضه شده بودند. تا کنون پروانههای نرمافزار آزاد زیادی توسط افراد و شرکتهای مختلف منتشر شده است که آز این میان میتوان به پروانه امآیتی، پروانه آپاچی، پروانه آیاسسی، پروانه همگانی موزیلا و ... اشاره کرد.
در سال ۱۹۹۷، اریک ریموند مقالهای با نام کلیسای جامع و بازار را منتشر کرد و در آن به بررسی اصول نرمافزارهای آزاد و مزایای آنها پرداخت. این مقاله به شدت مورد توجه قرار گرفت و یکی از دلایلی بود که شرکت ارتباطات نتاسکیپ، کد منبع مرورگر اینترنتی خود را به صورت نرمافزار آزاد منتشر کرد. این کار باعث شد تا شرکتهای دیگری هم به نرمافزارهای آزاد توجه نشان دهند. کدهای منبع نتاسکیپ، بعدها اساس توسعه مرورگر فایرفاکس و برنامه تاندربیرد قرار گرفت.
مسئله نامگذاری
در زبان انگلیسی، کلمه Free معانی متفاوتی همچون آزادی، رایگان بودن و ... دارد. عدهای بر این عقیده بودند که ممکن است این کلمه باعث کژفهمی شده و باعث شود مردم به نرمافزارهای آزاد، به چشم نرمافزارهای رایگان نگاه کنند. این در حالی است که یک نرمافزار آزاد، لزوماً رایگان نیست. آنها در سال ۱۹۹۸ کمپین دیگری به نام «نرمافزارهای متنباز» (به انگلیسی: Open Source) را تشکیل دادند تا با تاکید بیشتر بر روی مدل توسعه و مسائل تکنیکی، به جای مسائل فلسفی و اخلاقی، مردم و شرکتها را هر چه بیشتر به استفاده از نرمافزار آزاد تشویق کنند. تقریباً هر دو مفهوم، اشاره به یک چیز دارند و یک نرمافزار متنباز، نرمافزار آزاد هم هست (و برعکس)، اما طرفداران ایده نرمافزارهای متنباز، آن را روشی برای توسعه نرمافزارهای بهتر معرفی میکنند و تاکید کمتری بر جنبش اجتماعی و فلسفه پشت این گونه نرمافزارها دارند. طبق گفته موسسه پیشگامان متنباز (که توسط طرفداران ایده نرمافزار متنباز بوجود آمده)، عبارت «نرمافزار آزاد» واژه ای قدیمیتر است و به گونهای منعکس کننده نام بنیاد نرمافزارهای آزاد است، سازمانی که در سال ۱۹۸۵ برای محافظت و ترویج نرمافزارهای آزاد بوجود آمد؛ با اینکه بنیانگذاران ایده متنباز هم از توسعه و ترویج نرمافزارهای آزاد حمایت میکنند، اما در مورد چگونگی ترویج آنها با بنیاد نرمافزارهای آزاد موافق نیستند و اعتقاد دارند که آزادی نرمافزار در درجه اول یک امر عملی است تا ایدئولوژیکی.
پروانههای نرمافزار آزاد
نرمافزارهای آزاد به همراه اجازهنامهای عرضه میشوند که این اجازهنامه آزادیهای نام برده شده را برای کاربران تضمین میکند. از جمله پروانههای نرمافزار آزاد میتوان به پروانه نرمافزار جیپیال، بیاسدی، پروانه امآیتی، پروانه آیاسسی و ... نام برد. این اجازه نامهها تفاوتهایی با یکدیگر دارند و هر کدام توسط افراد و شرکتهای خاصی برای اهداف خاصی منتشر شدهاند. یک دستهبندی کلی برای پروانههای نرمافزار آزاد این است که آیا آنها به صورت کپیلفت هستند یا نه. پروانههایی که کپیلفت هستند، مانند پروانه جیپیال، تاکید دارند که نسخههای مشتق شده از نرمافزار هم باید به صورت نرمافزار آزاد منتشر شوند. مجوزهای غیر کپیلفت تاکیدی بر روی این مساله ندارند و نسخههای مشتق شده از این گونه نرمافزارها را میتوان آزادانه به هر شکل دلخواهی، چه به صورت نرمافزار آزاد و چه به صورت نرمافزار انحصاری منتشر کرد. چنین مجوزهایی را اصطلاحاً «سهلگیرانه» (به انگلیسی: permissive) مینامند. از جمله رایجترین پروانههای کپیلفت، پروانه جیپیال و از جمله رایجترین پروانههای غیر کپیلفت، پروانه بیاسدی و پروانه امآیتی است. امروزه هر دو دسته از این پروانهها به صورت گسترده توسط پروژههای مختلف مورد استفاده قرار میگیرند. برای مثال، هسته لینوکس از پروانه جیپیال و پروژه فریبیاسدی از پروانه بیاسدی استفاده میکنند.
مسئله دیگر در مقایسه پروانههای نرمافزار آزاد، مسئله پیوند دادن کتابخانهها در دیگر نرمافزارهایی است که از یک پروانه غیرمشابه با پروانه کتابخانه استفاده میکنند. برخی از پروانههای نرمافزار آزاد، اجازه نمیدهند که کتابخانههای اشتراکی، توسط نرمافزارهایی که از یک پروانه غیر مشابه استفاده میکنند، پیوند زده شوند و مورد استفاده قرار گیرند. برای مثال، اگر کتابخانهای تحت پروانه جیپیال منتشر شده باشد، تنها نرمافزارهایی که تحت پروانه جیپیال منتشر شدهاند میتوانند به این کتابخانه پیوند داده شوند و از آن استفاده کنند. این کار مانع میشود تا نرمافزارهای انحصاری و یا حتی دیگر نرمافزارهای آزاد از یک کتابخانه با مجوز جیپیال استفاده کنند. بنیاد نرمافزارهای آزاد برای رفع این محدودیت جیپیال، پروانه الجیپیال را منتشر کرده است.
مدل تجاری
نرمافزارهای آزاد را میتوان مستقیماً به فروش رساند و به این ترتیب از فروش آنها کسب درامد کرد. اما این مسئله نباید آزادی های بالا را محدود کند. کاربر پس از خرید یک نرمافزار آزاد، میتواند آن را برای هر منظوری استفاده کرده، تغییر داده، و مجدداً منتشر کند (چه به صورت رایگان و چه به صورت تجاری). علاوه بر فروش مستقیم نرمافزار، میتوان با ارائه خدمات و پشتیبانی از نرمافزارهای آزاد، کسب درامد کرد. مثلاً یک شرکت میتواند با اضافه کردن یک قابلیت جدید به یک نرمافزار آزاد یا در قبال برطرف کردن یک ایراد امنیتی، مبلغی پول از مشتریانش دریافت کند. یا همچنین یک شرکت میتواند نحوه استفاده از یک برنامه را به کارمندان و کاربران یک شرکت دیگر آموزش دهد و در قبال آن دستمزد دریافت کند. برخی از پروانههای سهلگیر نرمافزار آزاد، به کاربران اجازه میدهند تا نرمافزار را بدون در اختیار قرار دادن کدهای منبع توزیع کنند. بدین ترتیب دست کاربران تجاری بیشتر باز خواهد بود. برخی از شرکتها، نرمافزارهای خود را با دو مجوز مختلف، هم به صورت آزاد و هم به صورت غیرآزاد عرضه میکنند.
برخی از توسعهدهندگان مستقل نرمافزار آزاد، کمکهای مالی از طرف افراد داوطلب قبول میکنند. به عنوان مثال، سورسفورج امکاناتی دارد که یک کاربر داوطلب میتواند مبلغی پول را به یک پروژه نرمافزار آزاد اهدا کند.
مثالهایی از نرمافزارهای آزاد کاربردی
هستهٔ سیستمعامل گنو/لینوکس، داروین.
تعدادی از سیستمعاملهای خانواده بیاسدی مانند فریبیاسدی, اپنبیاسدی, نتبیاسدی, دراگونفلیبیاسدی.
کامپایلر جیسیسی، کتابخانهٔ زبان برنامهنویسی سی
کامپایلر کلنگ
پایگاهدادههای رابطهای مانند: mysql، پستگر اسکیوال، برکلی دیبی
زبانهای برنامهنویسی مانند تیسیال، روبی، پایتون، پرل و پیاچپی.
مرورگر وب فایرفاکس (Firefox)
اُپن آفیس (Open Office)
میزکار کیدیای (KDE)
میز کار الاکسدیئی (LXDE)
میزکار اکسافسیئی (XFCE)
میزکار گنوم (Gnome)
برنامههای حروف چینی مانند تک، لاتک و فارسی تک
نرمافزارهای مدیریت محتوا مانند جوملا (!Joomla)، پیاچپی-نیوک (PHP-Nuke)، پست نیوک (postnuke) و مامبو (mambo) ,وردپرس (wordpress), دروپال (drupal) , ....
نرمافزارهای ساخت انجمن (Forum) مانند پیاچپیبیبی (phpbb)، اساماف (smf)، یاب (YaBB) و فروم (phorum)
ویرایشگرهای متن ویم و ایمکس
مجموعه اداری لیبرهآفیس
برنامهنویسی
برنامهنویسی رایانه در فرهنگ واژه غیر متخصّصین ممکن است به تمام پروژه ساخت نرمافزار یا برنامهٔ رایانهای گفته شود. با این همه برنامهنویسی تنها بخشی از فرایند توسعهٔ نرمافزار یا برنامه رایانهای است. اهمیت، توجه و منابع اختصاص داده شده به برنامهنویسی، بسته به ویژگیهای مشخص شده محصول و خواست افراد درگیر در پروژه و کاربران و در نهایت شیوهٔ انتخاب شده مهندسی نرمافزار متغیر است.
برنامه نویسی کامپیوتر (که اغلب به طور کوتاه برنامه نویسی نامیده می شود) فرآیند سوق دادن ساختار اصلی یک مسأله محاسباتی به برنامه ای قابل اجرا است. این کار مستلزم فعالیت هایی همچون تحلیل و درک مسأله است و عموما حل چنین مسایلی منجر می شود به ایجاد یک الگوریتم، بازبینی نیازمندی های الگوریتم که شامل صحت و میزان منابع مصرفی است، پیاده سازی(که معمولا به عنوان کدینگ از آن یاد می شود) این الگوریتم در یک زبان برنامه نویسی مقصد، تست کردن، اشکال زدایی، نگه داری کد منبع، پیاده سازی سیستم ساخت(build system) و مدیریت مصنوعات مشتق شده مانند کد ترجمه شده به زبان ماشین برنامه های کامپیوتری. الگوریتم اغلب تنها به شکل قابل تجزیه و تحلیل برای انسان و قابل استدلال با منطق نمایش داده می شود. کد منبع به یک یا چند زبان برنامه نویسی(مانند JavaScript ،Smalltalk ،Python ،Java ،C# ،C++ ،C، و غیره) نوشته شده است.
تاریخچه
موضوع دستگاههایی که به دنبالهای از دستورالعملهای از قبل تعریف شده عمل میکند بر میگردد به Greek Mythology.
برنامه نویسی مدرن
برنامه نویسی مدرن
اندازه گیری کاربرد زبان
تعیین اینکه محبوبترین زبان برنامه نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبانها در کاربردهای خاصی محبوب است و بعضی دیگر مرتباً در نوشتن کاربردهای گوناگون استفاده میشود. روشهای اندازه گیری محبوبیت زبان شامل موارد زیر میباشد: شمردن تعداد آگهیهای اشتغال و توجه به یک زبان، تعداد کتابهای آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان
اشکال زدایی
اشکال زدایی وظیفه بسیار مهمی در فرایند توسعه نرمافزار میباشد، زیرا یک برنامه غلط میتواند پیامدهای مهمی برای کاربر خود داشته باشد. بعضی از زبانها بیشتر در معرض برخی اشتباهات میباشند، به خاطر خصوصیاتشان نیاز به بررسی بیشتر کامپایلر نسبت به زبانهای دیگر ندارند.
زبان برنامهنویسی
اجرا و عملی ساختن الگوریتمهای انتزاعی وابسته به هم بهوسیله تولید یک برنامه رایانهای مشخص با ابزار زبان برنامهنویسی ممکن است.
نمونه یک برنامه
یک برنامهٔ ساده در زبان برنامهنویسیBasic که از سادهترین زبانهای برنامهنویسی است میتواند به شکل زیر باشد:
REM MY FIRST TRY TO COMMAND THIS MACHINE TO DO WHAT I LIKE
PRINT "HELLO NEW WORLD!"
END
سطر نخست که با واژه کلیدی "REM" آغاز شده و از سوی برنامهٔ واسط درنظر گرفته نمیشود و تنها برای نگاه داشتن یک توضیح یا مانند آن برای خود برنامهنویس است. سطر دوم با واژه کلیدی "PRINT" به دستگاه فرمان میدهد تا نوشته "HELLO NEW WORLD!" ("سلام دنیای نو!") را روی نمایشگر بنویسد (چاپ کند). سطر آخر پایان فرامین و برنامه را به ماشین اطلاع میدهد.
پس از نوشتن یک برنامه مانند بالا، برنامهٔ مترجم (در اینجا Basic) دستورات را تبدیل به فرامینی میکند که لایه زیرین، که ممکن است همان سختافزار باشد، میتواند آنها را اجرا کند.
پارادایمها
زبانهای برنامهنویسی گوناگون براساس قابلیتهای درنظر گرفته شده از شیوهٔ خطهای مختلف استفاده میکنند. موارد ریزتری مانند چگونگی برخورد با نیازهای پشت پردهٔ ماشین مانند مدیریت حافظه و مدیریت زباله نیز در زبانهای مختلف متفاوت است. علاوه بر اینها، مفاهیمی متفاوت از (اجرای) یک برنامه تصور شدهاند که پارادایم یا الگو نام دارند.
وارسی مدل
در علوم کامپیوتر، وارسی مدل به این مسئله اشاره دارد که آیا مدل یک سیستم یک نیازمندی خاص را پشتیبانی میکند یا خیر. بررسی امکان بروز بن بست، مسابقه و حالتهای خاصی که سیستم را از کار میاندازد، وظیفهٔ فرایند وارسی مدل نرمافزار است. به طور خلاصه، وارسی مدل تکنیکی است برای تائید صحت عملکرد یک سیستم که دارای حالتهای محدود(en:Finate-state machine) است. این روش برای اطمینان حاصل کردن از صحت عملکرد نیازمندیها و طراحی یک سیستم بلادرنگ و نهفته به کار میرود. این شیوهٔ صحت سنجی، تمامی حالتهای ممکن سیستم را کاوش میکند و کلیهٔ سناریوهای ممکن را به روش نظاممند امتحان میکند.
روشهای وارسی مدل
در وارسی مدل کلیهٔ حالتها و انتقالهای مدل ریاضی مورد بررسی قرار میگیرد. با استفاده از یک روش هوشمندانه با دامنهٔ خاص، میتوان تمامی حالتها را با کاهش زمان محاسبه طی انجام یک عملیات، بررسی کرد. شیوههای پیاده سازی شامل شمارش فضای حالتها، شمارش فضای حالتهای نمادین، تفسیر انتزاعی، شبیه سازی نمادین و پالایش انتزاعی است. ویژگیهایی که اغلب مورد صحت سنجی قرار میگیرند، به صورت منطقهای زمانی مثل منطق زمانی خطی (LTL) و یا منطق محاسبات درختی (CTL) توصیف میشوند.
مزایا و کاربردها
این شیوه به نسبت سایر روشها مثل وارسی اثبات، از سرعت بالایی برخوردار است.
با استفاده از مثال نقضی که در گزارش وارسی تولید میگردد، علت عدم ارضای ویژگی مورد انتظار در سیستم را میتوان کشف نمود.
این روش، صحت سنجی پارهای را میسر میکند. به بیانی دیگر میتوان هر ویژگی به طور مجزا وارسی گردد.
در هر مرحله از توسعهٔ تولید نرم¬افزار (طراحی، پیاده سازی و...) می¬توان از این روش بهره برد.
کشف خطاهایی که در الگوریتمهای پیچیده نظیر پروتکلهای ارتباطی و الگوریتمهای جمع آوری زباله ممکن است رخ دهند و تشخیص آنها در فاز طراحی مشکل است؛ با استفاده از این روش امکان پذیر است.
از جمله ویژگیهای سیستمی که در وارسی مدل میتوان از صحت عملکرد آنها در مرحلهٔ پیاده سازی سیستم اطمینان حاصل نمود، عبارتند از:
کشف بروز بن بست در برنامههای همروند.
وارسی مشخصات زمانی؛ برای مثال بررسی بروز بن بست بعد از گذشت یک ساعت از راه اندازی مجدد سیستم.
تفاوت وارسی مدل با تست نرمافزار
در وارسی مدل تمامی برنامه بررسی میشود مگر آن که یک عیب پیدا شود. اما در تست نرمافزار بر حسب مجموعهٔ ورودی، در آن واحد فقط و فقط یک مسیر اجرا و وارسی میشود.
تست نرمافزار
اهداف تست نگرش ما در تست نرم افزا ر تست: اجراي یک برنامه با هدف پیدا کردن خطا تست خوب: احتمال پیدا کردن خطاهاي کشف نشده توسط ارزیابی زیاد است. تست موفق: که حداقل یک خطاي کشف نشده را بیابد تست فقط وجود خطا را نشان می دهد و نه عدم وجود آن را. پیدا نشدن خطا در تست به معناي بدون خطا بودن برنامه نیست. اصول تست تست با توجه به نیازمندیهاي کاربر برنامه ریزي قبل از اجرا (test plan) نوشتن برنامه تست قانون پارتو %80 خطاهاي کشف نشده در 20 % کد است تست باید از اجزاي کوچک شروع شود ممکن نیست (exhaustive) تست کامل براي موثر بودن باید توسط شخصثالث بیطرف انجام شود معیارهاي تست پذیر بودن نرم افزار ١. قابلیت اجرا Operability هرچه نرم افزار بهتر کار کند و در محیط هاي بیشتري قابل اجرا باشد، n بهتر قابل ارزیابی است ٢. مشاهده پذیري Observability قابلیت مشاهده نتایج ارزیابی ٣. کنترل پذیري Controlability قابلیت اجراي تستهاي خودکار (مثل امکان اجراي خودکار تست هاي واحد توسط jUnit براي زبان جاوا) ۴. تجزیه پذیري Decomposability ارزیابی می تواند هدفمند تر شود ۵. سادگی Simplicity کاهش پیچیدگی معماري و منطق برنامه ۶. پایداري Stability براي ارزیابی تغییرات کمی بخواهد ٧. درك پذیري Understandability قابلیت درك طراحی و وابستگیهاي بین اجزا سطوح مختلف تست • تست واحد(Unit testing ) • تست یکپارچه سازي(Integration testing ) • تست یکپارچه سازي افزایشی • تست یکپارچه سازي • تست سیستم(System testing ) • تست پذیرش(Acceptance testing ) • تست آلفا • تست بتا تست واحد . پایین ترین سطح تست است micro level هر کد تست واحد، یک قطعه کد یا یک تابع (متد) خاص را تست می کند. این تست نیاز به دانش در مورد طراحی و نحوه عملکرد داخلی تابع یا قطعه کد دارد. توسط برنامه نویس (و نه تست کننده) انجام می شود. تست یکپارچه سازي افزایشی با افزوده شدن قابلیت جدید به نرم افزار، مجددا نرم افزار تست می شود. هدف این تست، بررسی درستی نرم افزار پس از افزوده شدن امکان جدید است. امکانات نرم افزار باید از هم استقلال داشته باشند تا بتوان پیش از تکمیل کل نرم افزار و به صورت افزایشی نرم افزار را تست کرد. توسط برنامه نویس یا تیم تست انجام می شود تست یکپارچه سازي تست نرم افزار حاصل از کنار هم قرار گرفتن قطعات مختلف آن به منظور بررسی درستی عملکرد نرم افزار یکپارچه شده قطعات مختلف شامل قطعه کدها (ماژول هایی از کد برنامه هاي مجزا که در کنار هم برنامه اصلی را تشکیل می دهند برنامه هاي مشتري-کارگزار عمل کننده در یک شبکه پس از تست واحد انجام می شود تست سیستم به منظور بررسی عملکرد نرم افزار بر روي پلتفرم هاي مختلف انجام می شود و نرم افزارهاي OS پلتفرم: سخت افزار + نرم افزار (شامل کاربردي مورد نیاز برنامه) به منظور اطمینان از اینکه برنامه با مولفه هاي دیگر محیط اجرایش به خوبی کار می کند به منظور اطمینان از اینکه نرم افزار ارائه شده در محیط مورد نظر قابل استفاده است. مثالی از مشکل حاصل از انجام ندادن تست سیستم
نرم افزار بازي شیر شاه دیزنی Disney’s Lion King Game
در پاییز سال 1994 شرکت دیزنی اولین CD بازي خود تحت عنوان شیر شاه Lion King که بر اساس کارتونی به همین نام ساخته شده بود را وارد بازار کرد. بسیاري از شرکتهاي دیگر تا آن زمان اقدام به ساخت بازیهاي رایانه اي کرده بودند اما این اولین بار بود که شرکت دیزنی وارد این تجارت شده بود. دیزنی براي فروش این بازي دست به تبلیغات گسترده اي زد و در نتیجه این محصول با فروش بسیار بالایی مواجه شد. اما اتفاقات پس از آن تبدیل به کابوسی براي این شرکت شد. در 26 دسامبر، روز پس از کریسمس تلفن هاي بخش پشتیبانی مشتریان شرکت دیزنی شروع کرد به زنگ زدن و زنگ زدن و زنگ زدن! متصدیان پاسخگویی به تماس ها با خیل عظیمی از والدین عصبانی با بچه هاي گریان مواجه شدند که ادعا می کرند نرم افزار مزبور کار نمی کند. این خبر به سرعت در مطبوعات و تلویزیون نیز پخش شد و کریسمس آن سال را براي بسیاري از پرسنل دیزنی تلخ کرد. تست علت چه بود؟ پس از بررسی مشخص شد که دیزنی نرم افزار خود را بر روي بسیاري از مدل هاي PCتست نکرده بود و در نتیجه تنها بر روي سیستمهایی کار می کرد که برنامه نویسان دیزنی روي آن سیستم ها نرم افزار خود را توسعه داده بودند و نه دستگاههاي متداولی که عموم مردم از آن استفاده می کردند. تست پذیرش به منظور بررسی اینکه نرم افزار نیازهاي مشتري را برآورده می کند، انجام می شود بعد از تست سیستم انجام می شود. شامل: تست آلفا: تست آلفا در سایت توسعه دهنده نرم افزار و در اغلب موارد n توسط کارمندان داخلی و در بعضی از موارد توسط مشتري تعدادي از کاربرانش که به محل دعوت می شوند انجام می گیرد. تست بتا: در تست بتا نسخه هایی از نرم افزار در اختیار تعدادي از کاربران قرار می گیرد تا در بازه اي با آن کار کنند و خطاها را گزارش دهند. روشهاي ارزیابی روش جعبه سفید دانستن نحوه کار داخلی برنامه امکان تایید نحوه عمل هر تکه کد و مسیر اجرا مراحل اولیه ارزیابی روش جعبه سیاه دانستن عمل مورد انتظار و مطلوب امکان تایید کاري که سیستم باید انجام دهد مراحل انتهایی ارزیابی استرتژی تست استراتژی تست نرمافزار یک توصیف رسمی از این است که نرمافزار چگونه تست خواهد شد. هدف استراتژی تست تعریف همه مراحل برای فرایند تست نرمافزار است که شامل برنامه ریزی آزمایش، طراحی ابزار آرمایش، اجرای آزمایش و جمع آوری و ارزیابی دادههای بدست آمده باشد.
==استراتژی جعبه سیاه==این آزمایش جایگزین آزمایش جعبه سفید نمیباشد بلکه مکمل آن است.وخطاهایی متفاوت باآن راتست میکند.
شما نرمافزاری را که به آن نیاز داشتید را تهیه می کنید و بر روی سیستم خود نصب می کنید، شما در اکثر موارد بعد از نصب برنامه فقط یک نسخه اجرایی آنرا در سیستم خود خواهید داشت، و هیچ دسترسی به سورس کد و منابع دیگر برنامه نخواهید داشت. سیستم نرمافزاری موجود برای شما مانند یک جعبه سیاه است که شما نمیتوانید دورن آنرا مشاهده کنید و به آن دسترسی داشته باشید. استراتژی جعبه سیاه دقیقاً از این دیدگاه برنامه را مورد آزمایش قرار می دهد، یعنی با این پیش فرض که شما هیچ اطلاعاتی از کد و طراحی داخلی برنامه ندارید. حالا هیچ اطلاعاتی از کد و طراحی برنامه در اختیار ما نیست، پس چگونه می توان به صحت کارکرد برنامه پی برد؟ جواب خیلی ساده است، با تمرکز بر ورودیها و خروجی ها، برای اینکار آزمایش کننده نرمافزار به مستندات نرمافزار مراجعه میکند تا مشخص کند که سیستم در مقابل یک عمل خاص چه پاسخی را باید بدهد. سپس دادههای را برای هر کدام از عملیات انتخاب میکند و رفتار سیستم را در مقابل آن دادهها با رفتار واقعی سیستم که در مستندات وجود دارد مقایسه و بررسی می کند.
در یک استراتژی آزمایش جعبه سیاه ما عموماً موارد زیر را مورد بررسی و آزمایش قرار می دهیم:
۱. بررسی اینکه سیستم نیازمندهای عملیاتی و غیر عملیاتی را تامین میکند یا نه.
۲. اعتبارسنجی ورودیها
۳. بررسی مقادیر مرزی برای متغیرها: به یک متغیر مقداری کمتر از حداقل مقداری که می تواند قبول کند یا بیشتر از حداکثر مقداری که می تواند قبول کند می دهیم و سیستم را در این شرایط تست می کنیم.
۴. بررسی خروجهای سیستم: یک مجموعه از ورودهای صحیح با خروجهای مربوط به آن را تهیه می کنیم و سپس ورودها را به سیستم وارد می کنیم و خروجهای که توسط سیستم داده میشود را با خروجیهای واقعی مقایسه می کنیم.
۵. بررسی رفتار سیستم در برابر پردازش ورودها و پرس و جوهای بزرگ و سنگین
برای موارد بالا و مواردی دیگری که ذکر نشد روشهای مختلف تست در استراتژی جعبه سیاه وجود دارد که عبارتند از:
en:Functional testing
en:Stress testing
en:Recovery Testing
en:Volume testing
User Acceptance testinge
en:System testing
en:Sanity or Smoke testing
en:Load testing
en:Usability testing
en:Exploratory testing
Ad-hoc Testing
en:Alpha testing
en:Beta testing
آیا می توان در استراتژی جعبه سیاه، از این مطمئن شد که سیستم به طور کامل تست شده است؟ خیر، هرگز در این استراتژی نمی توان مطمئن شد که سیستم به طور کامل تست شده است.
استراتژی جعبه سفید
حال تصور کنید که شما خود یک توسعه دهنده نرمافزار هستید، پس شما می توانید به سورس، طراحی و منابع دیگر نرمافزار دسترسی داشته باشید. در این حالت سیستم را می توان به یک جعبه شیشه ای (جعبه سفید) تشبیه کرد که شما می توانید براحتی محتویات داخل و نحوه عملکرد آنرا مشاهده کنید. آزمایش جعبه سفید نیز دقیقاً از دیدگاه توسعه دهنده نرمافزار را مورد آزمایش قرار می دهد یعنی با این فرض که شما به منطق داخلی و ساختار کد برنامه دسترسی و احاطه دارید و می دانید که سیستم چگونه پیاده سازی شده است. شما با دانستن این موارد می توانید مشخص کنید که آیا اعمال داخلی بر طبق مشخصهها نجام میشود و یا نه.
در یک استراتژی آزمایش جعبه سفید ما عموماً موارد زیر را مورد توجه و بررسی قرار می دهیم:
۱. بررسی سطر به سطر کد (Code coverage): در این حالت باید سیستم را به گونه ای اجراء و بررسی کنیم که مطمئن شویم سطر به سطر کد برنامه حداقل یکبار اجراء شده است.
۲. بررسی همه انشعابها در کد برنامه (branch) : در کد برنامه باید تمام عبارتهای شرطی ( if elseها و Switch case ها) را تک به تک مورد بررسی قرار داد. به این صورت که در یک عبارت if else هم فسمت if و هم قسمت else هر کدام بصورت مجزا یکبار اجراء شوند.
۳. بررسی همه حلقهها در برنامه : حلقهها در نرمافزار نقش اساسی دارند، چون می تونند با اشتباه جزئی مقدار زیادی از منابع را مصرف کرد برای مثال شرط خروج از حلقه به اشتباه هیچ وقت True نشود. برای نمونه حلقهها را با ورودی بزرگتر از شرط خروج حلقه چک کنید یعنی حلقه اصلاً اجر نشود. تستی طراحی کنید که حلقه دقیقاً یکبار اجراء شود، تستی طراحی کنید که حلقه در یک بازه خاص اجراء شود و ....
۴. مدیریت خطای مطلوب : برسی اینکه اگر به یک متد یک ورودی نامعتبر وارد شود، نحوه آگاه سازی و نمایش مطلوب خطا برای کاربر چگونه باشد؟
۵. بررسی امنیت : سیستم را از این جهت که چگونه در برابر دسترسیهای غیرمجاز، هک، کرک و هر چیز دیگر که می تواند به آن آسیب برساند مورد بررسی قرار می دهد. در اینجا ما باید مکانهای از کد را که دادهها را اعتبارسنجی و مدیریت می کنند، دسترسی به منابع یا عملیات مهم و حیاتی را انجام می دهند را بررسی کنیم.
جهتیابی با نشانههای طبیعی
هرگونهای از درختان برشها و خصوصیات خاصّ خود را دارد. باد و آفتاب بر درختان تأثیر میگذارند و این سرنخی است برای محاسبه جهت شمال-جنوب.
این روشها خیلی قابل اطمینان نیستند. مثلاً «باد غالب» ممکن است حالت عادی را به طور قابلملاحظهای تغییر دهد و باعث تغییر و انحراف آن شود. همچنین در جنگلهای انبوه -به دلیل عدم نفوذ و رسوخ آفتاب درون آنها- برخی روشها کارا نخواهند بود. اگر از علامتهای طبیعی استفاده میکنید، برای تصمیمگیری، باید هر چند تا علامت مختلف را که میتوانید پیدا کنید.

بسیاری از روشهای زیر بر اساس آفتاب هستند: در نیمکرهٔ شمالی زمین، جهت رو به جنوب در معرض آفتاب بیشتری است. تابش خورشید رشد شاخهها و برگها را زیاد میکند.
۱- جهتیابی با خزهها و گلسنگها: سمت شمالی درختان و تختهسنگها، گلسنگها و خزههای بیشتری دارد؛ چرا که نمناکتر و مرطوبتر از سمت جنوبی آنهاست.
خزه در جایی رشد میکند که دارای سایه و آب زیادی باشد؛ محلهای خنک و نمناک. تنهٔ درختان در سمت شمالی سایه و رطوبت بیشتری دارد، و در نتیجه خزهها معمولاً بیشتر در این سمت میرویند.
این روش همیشه نتیجهٔ درست به ما نمیدهد. ۱) هرچند سمت شمالی در سایهٔ بیشتری است، ولی لزوماً رطوبت سمت شمال بیشتر نیست؛ و برای رشد خزهها رطوبت مهمتر از سایه است(جایی که رطوبت در آنجا بیشتر ماندگار است). ۲) گاه ممکن است درختان و پوشش گیاهی مجاور طرف دیگر درخت را هم سایه کند. ۳) در یک اقلیم بارانی(جنگلها و بیشههای مرطوب) ممکن است همه طرف درخت نمناک باشد(یعنی خزه دور برخی درختان در همهطرف رشد کرده؛ البته معمولاً در جهت جنوب بیشتر رشد کردهاست). ۴) ممکن است باد مانع رشد خزه در طرف شمالی درخت شود. ۵) در مناطق خشک هم که اصلاً خزهای وجود ندارد!
ضمناً در نظر داشته باشید که معمولاً خزه در جهت نور آفتاب(جنوب) خرمایی رنگ است و در مکانهای سایه و مرطوب سبز یا طوسی رنگ.
۲- جهتیابی با درختان: از آنجا که سمت شمالی درختان در معرض آفتاب کمتری است، درختان در این سمتشان شاخوبرگ کمتری دارند.
به دلیل آنکه آفتاب بیشتر از سمت جنوب میتابد، درختان جنوب بهتر و بیشتر رشد میکنند. وجود درختانی مانند صنوبر سیاه و سفید، راش، بلوط، درختان آزاد، شاه بلوط هندی، افرا نروژی و درخت اقاقیا صحت این مسئله را ثابت میکند. این درختها در جنوب بیشتر دیده میشوند.
پوست درختان قدیمی در سمت رو به آفتاب(جنوب) معمولاً نازکتر است.
پوسیده بودن یک طرف از اکثر درختان جنگل، جهت شمال را به ما نشان میدهد؛ سمت پوسیده شمال است.
به خاطر نوع تابش خورشید، شاخههای جنوبی اکثر درختان افقیتر و شاخههای شمالی عمودیترند.
در کوههای سنگی، کاجهای انحناپذیر در شیب جنوبی، و صنوبرهای انگلمان در شیب شمالی میرویند.
معمولاً درختان برگ ریز در شیبهای جنوبی تپهها میرویند و سراشیبهای شمالی همیشه سبز است.
زمینِ اطراف ریشهٔ درختان، به سمت جنوب سستتر و توخالیتر از قسمت شمالی است. پس زمین به سمت شمال سفتتر بوده و به خشکی زمین جنوبی نیست.
رشد پوشش گیاهی در سمت جنوبی تپهها بیشتر از سمت شمالی خواهد بود.
۳-جهتیابی با تنهٔ درختان بریدهشده: اگر مقطع درخت بریدهشدهای را نگاه کنید، تعدادی دایرهٔ هم مرکز را مشاهده خواهید کرد، که هر یک از آنها نشان یک سال عمر درخت میباشد. درختی که بطور دائم آفتاب به تنهاش بتابد، دایرههای نشاندهنده عمر آن درخت در یک سمت به هم نزدیکتر شده و در سمت دیگر از هم دور خواهند بود. سمتی که فاصله خطوط حلقههای سنی درخت به هم نزدیکتر باشد سمت شمال را مشخص میکند، و سمتی که خطوط حلقههای سنی از هم فاصلهٔ بیشتری داشته باشد سمت جنوب را نشان میدهد؛ به علت تابش زیاد آفتاب و رشد شدیدتر آن.
۴- جهتیابی به کمک گلها و گیاهان: گیاهان، و گلهای درختان تمایل دارند رو به آفتاب قرار بگیرند؛ یعنی جنوب یا شرق.
برخی گیاهان برای جهتیابی اشتهار یافتهاند. مثلاً در آمریکا گُلی وجود دارد که همیشه جهتگیری شمالی-جنوبی دارد (رشد برگهایش به سمت خط شمال- جنوب است) و آن را «گیاه قطبنما(یا Compass Plant)» و یا «رُزینوید(Rosinweed)» میخوانند. نام علمی آن «سیلفیوم لاکینیاتوم» (Silphium laciniatum) است، و مسافران اولیهٔ این سرزمین از این گیاه برای جهتیابی استفاده میکردهاند.
اکالیپتوس استرالیایی هم گیاهی جهتیاب است. این گیاه که در سرزمینهای گرم و خشک میروید، برگهایش رو به شمال یا جنوب است.
همچنین درختی به نام «نخل رهنوردان([ یا Traveler’s Palm])» وجود دارد که محور شاخههایش شرقی-غربی اند.
همانطور که گفته شد، این که کدام طرف شرق است و کدام طرف غرب، یا کدام یک از طرفین شمال یا جنوب است را میتوان با توجه به سمت خورشید و ماه در آسمان یا روشهای دیگر یافت -ماه و خورشید تقریباً در سمت جنوبی آسمان قرار دارند.
۵- جهتیابی به کمک باد غالب: بادها را از جهتی که میوزند، نامگذاری میکنند مانند باد شمالی از شمال. هر منطقهای باد غالب و برجستهای دارد که در فصل خاص یا گاهی در تمام فصول حکمفرماست. باد غالب، باد خاصی است که وزش آن طولانیتر بوده و در جهت خاصی میوزد. با دانستن جهت بادهای غالب میتوانید چهار جهت اصلی را تشخیص دهید.
معمولاً نام باد را از جهتی که وزیدهاست، نامگذاری میکنند. مثلاً باد شمال یعنی بادی که از شمال به سمت جنوب میوزد.
برای جهتیابی به کمک باد غالب، ۱) ابتدا باید جهت باد غالب منطقه را دانست. ۲) سپس باید در جایی که هستیم جهت باد غالب را تشخیص دهیم. برای نمونه، اگر بدانیم که در منطقهٔ ما باد غالب از شرق میوزد، و ضمناً جهت باد غالب منطقه را تشخیص دهیم، طرف منشأ باد شرق خواهد بود؛ که با دانستن شرق، دیگر جهتهای اصلی هم به سادگی یافته میشوند.
نکتهٔ اول: اگر جهت باد غالب منطقهتان را نمیدانید، اطلاعات زیر ممکن است کمککار باشد:
در نواحی معتدل، باد غالب از غرب میوزد. (در هر دو نیم کره شمالی و جنوبی)
در نواحی گرمسیری، باد غالب بین مناطق شمال شرقی و جنوب شرقی جریان دارد.
در نواحی استوایی، باد غالب معمولاً از سمت شرق میوزد.
نکتهٔ دوم: جهت باد غالب منطقه را تشخیص دهیم:
در هر منطقهای باد غالب ویژگیهای خاص خود را دارد؛ مثل درجه حرارت، رطوبت و سرعت که در فصول مختلف تغییر میکند.
باد غالب بر رشد درختان و گیاهان، جهت جمع شدن برفهای باد آورنده و در جهت علفهای بلند تأثیرگذار است. در واقع باد غالب بیشترین تأثیر را بر روی جهت پوشش گیاهی، برف، ماسه یا دیگر اشیای روی سطح زمین دارد.
الف)درختان:
جهت خم شدن اغلب درختان منطقه نشان دهنده جهت وزش باد غالب منطقهاست. برای نمونه اگر درختان به طرف شمال منحرف و متمایل شدهاند، باد غالب محتملا از سمت جنوب وزیدهاست.
اثر دیگری که باد غالب بر درختان دارد این است که: در جهتی که از وزش باد در امان است، شاخ و برگ بیشتری رشد کردهاست.
در واقع باد ممکن است با صدمه زدن یا خشک کردن شاخههای جوان، رشد درخت را کند یا متوقف کند. معمولاً وزش باد، باعث کند شدن رشد درختان میشود؛ برعکسِ خورشید، که رشد شاخهها و برگها را زیاد میکند.
در زمستان باد غالب معمولاً با برف و تگرگ همراه است، که باعث شکستن شاخههای جوان میشود.
درختی که برای تعیین جهت استفاده میشود، باید در محلی باز و وسیع باشد. نباید در پناه تپه، درختان دیگر یا ساختمانها باشد. چند تا از درختان نزدیک به هم را مورد آزمایش قرار دهید. مطمئن شوید که درختان هرس نشده باشند.
از آنجا که درختان تحت تأثیر عوامل زیادی هستند، باید یافتههای خود را با مشاهدهٔ درختان متعددی در همسایگی یکدیگر تأیید کنید.
ب)ماسه و برف:
امواج ماسه در بیابانها، و امواج پستی-بلندیهای برف در مناطق قطبی جهت باد را نشان میدهند. البته گاه به خاطر آنکه این موجها خیلی کوچکاند و از چند سانتیمتر تجاوز نمیکنند، برای یافتن باد غالب نمیتوانند کمککار باشند، زیرا میتوانند با هر باد تند موضعی به سرعت تشکیل شوند.
در بیابانها انواع مختلف تلماسهها وجود دارند، که شکل آنها جهت باد غالب را نمایان میسازد؛ همچنین در مورد تلیخهای قطب: در مناطقی که به شدت پوشیده از برفاند، باد غالب تودههای برف را میراند و آنها را تبدیل به تلهای برآمدهای میسازد. این تلها از چند سانتیمتر تا یک متر ارتفاع دارند، و موازی باد غالب تشکیل میشوند. در واقع برف از لحاظ فیزیکی شبیه ماسه عمل میکند.
ج) نسیم: برخی مناطق الگوی حرکت جریان هوایشان نوسان بیشتری نسبت به جاهای دیگر دارد. مثلاً مردم کنار ساحل با نسیم دریا مأنوساند. معمولاً بعدازظهرها نسیم مداومی از طرف دریا میوزد. در شب هم معمولاً جهت نسیم برعکس میشود و از خشکی به سمت دریا میوزد. نسیم مشابهی در درهها و کوهها میوزد: در روز نسیمی از دره به سمت بالای کوه وزیدن میگیرد؛ و در شب برعکس، نسیم از بالا به سمت دره میوزد. اگر -مثلاً به کمک نقشه- بدانیم که دریا یا کوه (یا ساحل یا دره) در کدام جهتمان است، میتوانیم جهتهای اصلی را بیابیم.
د) هوای گرم و سرد: در نیمکرهٔ شمالی زمین هوایی که از شمال میآید معمولاً سردتر از هوایی است که از جنوب میآید(بادهای شمالی از بادهای جنوبی سردتر است).
هـ) سایر موارد:
اگر گمان میکنید که بادی که در لحظه میوزد باد غالب منطقهاست، میتوانید به درختان در مسیر باد نگاه کنید. با نگاه به نوک درختان میتوانید جهت باد را بفهمید.
میتوانید به تغییر جهت ابرها دقت کنید؛ بهویژه ابرهای بلندی که توسط بادهای غالب آورده میشوند.
در روی دریا و اقیانوسها بادهای غالب دارای ویژگیها و ابرهای خاص خود هستند.
۶- جهتیابی به کمک رودخانهها: بسیاری از رودها و نهرها در نیمکرهٔ شمالی زمین رو به جنوب سرازیرند، یعنی رو به استوا. این روند عمومی رودهاست، ولی همیشه درست نیست. مثلاً رود نیل -که تماماً در نیمکرهٔ شمالی است- به سوی شمال جریان دارد و به مدیترانه میریزد.
۷- جهتیابی به کمک حیوانات و حشرات:
مورچهها خاکِ لانهٔ خود را به سمت جنوب یا شرق میریزند. مورچهها چنین میکنند تا در هنگام روز خاکریزشان به عنوان سایهبانی برایشان عمل کند، تا راحتتر کار خود را انجام دهند.
مورچهها خانههای خود(مورتپهها) را بر روی شیبهای جنوب شرقی میسازند؛ زیرا خورشید در پاییز و زمستان بیشتر به این قسمتها میتابد. آنها مورتپههای خود را نزدیک درختان و صخرههای جنوبی و جنوب شرقی بنا میکنند.
اگر شما در کنار برکه یا دریاچهای باشید که پرندگان، ماهیان یا دوزیستان در حال تولیدمثل هستند، در نظر داشته باشید که آنها معمولاً ترجیح میدهند در سمت غربی زاد و ولد (تولیدمثل و پرورش) نمایند.
دارکوب(شانهبهسر) معمولاً حفرههایش را در سمت شرقی درخت حفر میکند.
سنجابها هم معمولاً در سوراخهای سمت شرقیِ درختان خانه و لانه میگزینند.
۸- جهتیابی به کمک خانههای شهری: امروزه معمولاً خانهها را به موازات شمال -جنوب یا شرق-غرب میسازند؛ یعنی نسبت به جهتهای اصلی مورب نمیسازند. این میتواند در تنظیم صحیح جهتها و تصحیح روشهای تقریبی بالا کمککار باشد. باید توجه کرد که در بسیاری موارد این اصل رعایت نشدهاست.
قطب مغناطیسی شمال
قطبهای مغناطیسی یعنی جایی که خطوط میدان مغناطیسی به صورت واگرا از زمین خارج (جنوب مغناطیسی) و یا به صورت همگرا به آن وارد (شمال مغناطیسی) میشوند.
عقربه قطبنما -به عنوان یک وسیله مغناطیسی (یک آهنربا)- وقتی که آزادانه معلق شود، قطبهای مغناطیسی را یافته و در جهت آنها آرایش میگیرد؛ یعنی جایی که عموماً شمال حقیقی نیست (بهجز برخی مناطق کره زمین). زاویه بین شمال حقیقی و شمال مغناطیسی، «میل مغناطیسی» نامیده میشود.
قطبهای مغناطیسی زمین در طول زمان تغییر میکنند. قطب شمال مغناطیسی در سال ۲۰۰۱ در موقعیت ۸۱٫۳ درجه شمالی و ۱۱۰٫۸ درجه غربی، در سال ۲۰۰۵ در موقعیت ۸۳٫۱ درجه شمالی و ۱۱۷٫۸ درجه غربی و در سال ۲۰۰۹ در موقعیت ۸۴٫۹ درجه شمالی و ۱۳۱٫۰ درجه غربی بودهاست. در سال ۲۰۱۲ قطب مغناطیسی شمال در موقعیت ۸۵٫۹ درجه شمالی و ۱۴۷٫۰ درجه غربی قرار گرفت.
هر ۲۵ هزار سال، قطبهای مغناطیسی یک دور کامل میزنند.
قطب شمال مغناطیسی، سالانه ۷٫۳۴ کیلومتر جابهجا میشود.
انحراف مغناطیسی
انحراف مغناطیسی خطای ناشی از تأثیرات جاذبههای مغناطیسی موضعی و منطقهای (مانند فلز و الکتریسیته) ااست، که باید در کنار میل مغناطیسی در نظر گرفته شود. هر گاه قطبنما در نزدیکی اشیای آهنی یا فولادی و یا منابع الکتریکی قرار گرفته باشد، عقربهاش از جهت قطب مقداری منحرف میشود. کلاً به همراه داشتن اشیایی از جنس آهن یا انواع مشابه آن میتواند باعث اختلال در حرکت عقربه شود. حتی وجود یک گیره کاغذ روی نقشه ممکن است مساله ساز شود. بنابراین، هنگام استفاده از قطبنما باید مطمئن شویم که از اشیای انحرافدهنده آن، بهطور کلی دور است. همچنین احتمال تأثیرگذاری جاذبههای مغناطیسی موجود در خاک نیز وجود دارد، که بسیار نادر است؛ ولی در مکانهایی که مثلاً معدن آهن وجود دارد باید در نظر گرفته شود.
میل مغناطیسی
انحراف مغناطیسی یا تغییر مغناطیسی یا میل مغناطیسی زاویه بین نصف النهار مغناطیسی و نصف النهار جغرافیایی در هر نقطه از سطح زمین است.
میل مغناطیسی، در هر نقطه از زمین، زاویه بین شمال حقیقی و شمال مغناطیسی در آن نقطه است؛ یعنی زاویهٔ بین سمتی که عقربهٔ قطبنما نشان میدهد، و سمت شمال جغرافیایی. منابع مختلف میل مغناطیسی را «شیب مغناطیسی» یا «تنزل مغناطیسی» یا «تغییر مغناطیسی» هم مینامند. برخی به آن انحراف مغناطیسی هم گفتهاند، ولی دیگران این واژه را برای انحراف عقربهٔ قطبنما در اثر عوامل محیطی (مانند وسایل آهنی و منابع الکتریکی و غیره) مناسبتر میدانند.
میل مغناطیسی با موقعیت، زمان (سالانه و روزانه)، ناهنجاریهای مغناطیسی محلی، ارتفاع (جزئی و قابل صرف نظر) و فعالیتهای مغناطیسی خورشید تغییر میکند. میل مغناطیسی در طول خطوطی &mdash؛ که اصطلاحا خطوط هم ارز∗ نامیده میشوند &mdash؛ ثابت است. خط فرضی با میل مغناطیسی صفر درجه در حال حاضر از غرب خلیج هودسن، دریاچه سوپریور، دریاچه میشیگان و فلوریدا عبور میکند.
تعیین میل مغناطیسی
اگر عقربه قطبنما شرق یا غربِ شمال واقعی را به عنوان شمال مشخص نماید، این اختلاف به ترتیب میل مغناطیسی شرقی یا غربی نامیده میشود. شمال مغناطیسی هم در نیمکره شمالی و هم در نیمکره جنوبی به عنوان مرجع میل مغناطیسی است. مقدار زاویهٔ انحراف بستگی با محل آزمایش دارد. برای تعیین میل مغناطیسی در یک منطقه مورد نظر میتوان از موارد زیر استفاده کرد:
نقشههای توپوگرافی چاپ شده: این نقشه ها با اندازه گیری های متعدد میل مغناطیسی در نقاط مختلف کرهٔ زمین تهیه می شوند. در برخی نقشهها میل مغناطیسی منطقه به وسیله زاویه بین دو پیکان شمال مغناطیسی (MN) و شمال حقیقی (GN) نشان داده شده است.
نمودارهای خطوط همارز چاپ شده و یا موجود در وبگاهها، که میل مغناطیسی را نشان میدهند.
حسابگر آنلاین برای مشخص نمودن آخرین میل مغناطیسی، برای یک موقعیت مشخص (طول و عرض جغرافیایی) و زمان مشخص.
لازم به ذکر است که در یک محل مقدار زاویهٔ انحراف برحسب زمان اندکی تغییر میکند و اندازهٔ آن در نقاط مختلف زمین متفاوت است.
در ایران میل مغناطیسی به سمت شرق است و مقدار زاویه آن در مکانهای مختلف متفاوت است. برای نمونه در ۱۲ خردادماه سال ۱۳۸۶ میل مغناطیسی تهران &mdash؛ طبق محاسبات &mdash؛ برابر ۴ درجه و چهار دقیقه به سمت شرق بودهاست، که هر سال نزدیک چهار دقیقه (کمتر از یکدهم درجه) به سمت شرق افزایش پیدا میکند.
مثال
چنانچه به کمک عقربهٔ مغناطیسی به طرف قطب شمال یا جنوب برویم، به قطب شمال و جنوب واقعی کرهٔ زمین نمیرسیم. علت این است که قطب شمال و جنوب جغرافیایی و مغناطیسی کرهٔ زمین، با هم یکی نیست؛ یعنی اینکه قطب شمال مغناطیسی زمین، درست روی قطب شمال جغرافیایی زمین قرار ندارد و اگر دو قطب جغرافیایی و مغناطیسی زمین را توسط خطی فرضی به به نام محور به هم وصل کنیم، بین دو محور مغناطیسی و محور جغرافیایی زمین، زاویهای ساخته میشود که به آن، زاویهٔ میل مغناطیسی گویند.
هرگونهای از درختان برشها و خصوصیات خاصّ خود را دارد. باد و آفتاب بر درختان تأثیر میگذارند و این سرنخی است برای محاسبه جهت شمال-جنوب.
این روشها خیلی قابل اطمینان نیستند. مثلاً «باد غالب» ممکن است حالت عادی را به طور قابلملاحظهای تغییر دهد و باعث تغییر و انحراف آن شود. همچنین در جنگلهای انبوه -به دلیل عدم نفوذ و رسوخ آفتاب درون آنها- برخی روشها کارا نخواهند بود. اگر از علامتهای طبیعی استفاده میکنید، برای تصمیمگیری، باید هر چند تا علامت مختلف را که میتوانید پیدا کنید.

بسیاری از روشهای زیر بر اساس آفتاب هستند: در نیمکرهٔ شمالی زمین، جهت رو به جنوب در معرض آفتاب بیشتری است. تابش خورشید رشد شاخهها و برگها را زیاد میکند.
۱- جهتیابی با خزهها و گلسنگها: سمت شمالی درختان و تختهسنگها، گلسنگها و خزههای بیشتری دارد؛ چرا که نمناکتر و مرطوبتر از سمت جنوبی آنهاست.
خزه در جایی رشد میکند که دارای سایه و آب زیادی باشد؛ محلهای خنک و نمناک. تنهٔ درختان در سمت شمالی سایه و رطوبت بیشتری دارد، و در نتیجه خزهها معمولاً بیشتر در این سمت میرویند.
این روش همیشه نتیجهٔ درست به ما نمیدهد. ۱) هرچند سمت شمالی در سایهٔ بیشتری است، ولی لزوماً رطوبت سمت شمال بیشتر نیست؛ و برای رشد خزهها رطوبت مهمتر از سایه است(جایی که رطوبت در آنجا بیشتر ماندگار است). ۲) گاه ممکن است درختان و پوشش گیاهی مجاور طرف دیگر درخت را هم سایه کند. ۳) در یک اقلیم بارانی(جنگلها و بیشههای مرطوب) ممکن است همه طرف درخت نمناک باشد(یعنی خزه دور برخی درختان در همهطرف رشد کرده؛ البته معمولاً در جهت جنوب بیشتر رشد کردهاست). ۴) ممکن است باد مانع رشد خزه در طرف شمالی درخت شود. ۵) در مناطق خشک هم که اصلاً خزهای وجود ندارد!
ضمناً در نظر داشته باشید که معمولاً خزه در جهت نور آفتاب(جنوب) خرمایی رنگ است و در مکانهای سایه و مرطوب سبز یا طوسی رنگ.
۲- جهتیابی با درختان: از آنجا که سمت شمالی درختان در معرض آفتاب کمتری است، درختان در این سمتشان شاخوبرگ کمتری دارند.
به دلیل آنکه آفتاب بیشتر از سمت جنوب میتابد، درختان جنوب بهتر و بیشتر رشد میکنند. وجود درختانی مانند صنوبر سیاه و سفید، راش، بلوط، درختان آزاد، شاه بلوط هندی، افرا نروژی و درخت اقاقیا صحت این مسئله را ثابت میکند. این درختها در جنوب بیشتر دیده میشوند.
پوست درختان قدیمی در سمت رو به آفتاب(جنوب) معمولاً نازکتر است.
پوسیده بودن یک طرف از اکثر درختان جنگل، جهت شمال را به ما نشان میدهد؛ سمت پوسیده شمال است.
به خاطر نوع تابش خورشید، شاخههای جنوبی اکثر درختان افقیتر و شاخههای شمالی عمودیترند.
در کوههای سنگی، کاجهای انحناپذیر در شیب جنوبی، و صنوبرهای انگلمان در شیب شمالی میرویند.
معمولاً درختان برگ ریز در شیبهای جنوبی تپهها میرویند و سراشیبهای شمالی همیشه سبز است.
زمینِ اطراف ریشهٔ درختان، به سمت جنوب سستتر و توخالیتر از قسمت شمالی است. پس زمین به سمت شمال سفتتر بوده و به خشکی زمین جنوبی نیست.
رشد پوشش گیاهی در سمت جنوبی تپهها بیشتر از سمت شمالی خواهد بود.
۳-جهتیابی با تنهٔ درختان بریدهشده: اگر مقطع درخت بریدهشدهای را نگاه کنید، تعدادی دایرهٔ هم مرکز را مشاهده خواهید کرد، که هر یک از آنها نشان یک سال عمر درخت میباشد. درختی که بطور دائم آفتاب به تنهاش بتابد، دایرههای نشاندهنده عمر آن درخت در یک سمت به هم نزدیکتر شده و در سمت دیگر از هم دور خواهند بود. سمتی که فاصله خطوط حلقههای سنی درخت به هم نزدیکتر باشد سمت شمال را مشخص میکند، و سمتی که خطوط حلقههای سنی از هم فاصلهٔ بیشتری داشته باشد سمت جنوب را نشان میدهد؛ به علت تابش زیاد آفتاب و رشد شدیدتر آن.
۴- جهتیابی به کمک گلها و گیاهان: گیاهان، و گلهای درختان تمایل دارند رو به آفتاب قرار بگیرند؛ یعنی جنوب یا شرق.
برخی گیاهان برای جهتیابی اشتهار یافتهاند. مثلاً در آمریکا گُلی وجود دارد که همیشه جهتگیری شمالی-جنوبی دارد (رشد برگهایش به سمت خط شمال- جنوب است) و آن را «گیاه قطبنما(یا Compass Plant)» و یا «رُزینوید(Rosinweed)» میخوانند. نام علمی آن «سیلفیوم لاکینیاتوم» (Silphium laciniatum) است، و مسافران اولیهٔ این سرزمین از این گیاه برای جهتیابی استفاده میکردهاند.
اکالیپتوس استرالیایی هم گیاهی جهتیاب است. این گیاه که در سرزمینهای گرم و خشک میروید، برگهایش رو به شمال یا جنوب است.
همچنین درختی به نام «نخل رهنوردان([ یا Traveler’s Palm])» وجود دارد که محور شاخههایش شرقی-غربی اند.
همانطور که گفته شد، این که کدام طرف شرق است و کدام طرف غرب، یا کدام یک از طرفین شمال یا جنوب است را میتوان با توجه به سمت خورشید و ماه در آسمان یا روشهای دیگر یافت -ماه و خورشید تقریباً در سمت جنوبی آسمان قرار دارند.
۵- جهتیابی به کمک باد غالب: بادها را از جهتی که میوزند، نامگذاری میکنند مانند باد شمالی از شمال. هر منطقهای باد غالب و برجستهای دارد که در فصل خاص یا گاهی در تمام فصول حکمفرماست. باد غالب، باد خاصی است که وزش آن طولانیتر بوده و در جهت خاصی میوزد. با دانستن جهت بادهای غالب میتوانید چهار جهت اصلی را تشخیص دهید.
معمولاً نام باد را از جهتی که وزیدهاست، نامگذاری میکنند. مثلاً باد شمال یعنی بادی که از شمال به سمت جنوب میوزد.
برای جهتیابی به کمک باد غالب، ۱) ابتدا باید جهت باد غالب منطقه را دانست. ۲) سپس باید در جایی که هستیم جهت باد غالب را تشخیص دهیم. برای نمونه، اگر بدانیم که در منطقهٔ ما باد غالب از شرق میوزد، و ضمناً جهت باد غالب منطقه را تشخیص دهیم، طرف منشأ باد شرق خواهد بود؛ که با دانستن شرق، دیگر جهتهای اصلی هم به سادگی یافته میشوند.
نکتهٔ اول: اگر جهت باد غالب منطقهتان را نمیدانید، اطلاعات زیر ممکن است کمککار باشد:
در نواحی معتدل، باد غالب از غرب میوزد. (در هر دو نیم کره شمالی و جنوبی)
در نواحی گرمسیری، باد غالب بین مناطق شمال شرقی و جنوب شرقی جریان دارد.
در نواحی استوایی، باد غالب معمولاً از سمت شرق میوزد.
نکتهٔ دوم: جهت باد غالب منطقه را تشخیص دهیم:
در هر منطقهای باد غالب ویژگیهای خاص خود را دارد؛ مثل درجه حرارت، رطوبت و سرعت که در فصول مختلف تغییر میکند.
باد غالب بر رشد درختان و گیاهان، جهت جمع شدن برفهای باد آورنده و در جهت علفهای بلند تأثیرگذار است. در واقع باد غالب بیشترین تأثیر را بر روی جهت پوشش گیاهی، برف، ماسه یا دیگر اشیای روی سطح زمین دارد.
الف)درختان:
جهت خم شدن اغلب درختان منطقه نشان دهنده جهت وزش باد غالب منطقهاست. برای نمونه اگر درختان به طرف شمال منحرف و متمایل شدهاند، باد غالب محتملا از سمت جنوب وزیدهاست.
اثر دیگری که باد غالب بر درختان دارد این است که: در جهتی که از وزش باد در امان است، شاخ و برگ بیشتری رشد کردهاست.
در واقع باد ممکن است با صدمه زدن یا خشک کردن شاخههای جوان، رشد درخت را کند یا متوقف کند. معمولاً وزش باد، باعث کند شدن رشد درختان میشود؛ برعکسِ خورشید، که رشد شاخهها و برگها را زیاد میکند.
در زمستان باد غالب معمولاً با برف و تگرگ همراه است، که باعث شکستن شاخههای جوان میشود.
درختی که برای تعیین جهت استفاده میشود، باید در محلی باز و وسیع باشد. نباید در پناه تپه، درختان دیگر یا ساختمانها باشد. چند تا از درختان نزدیک به هم را مورد آزمایش قرار دهید. مطمئن شوید که درختان هرس نشده باشند.
از آنجا که درختان تحت تأثیر عوامل زیادی هستند، باید یافتههای خود را با مشاهدهٔ درختان متعددی در همسایگی یکدیگر تأیید کنید.
ب)ماسه و برف:
امواج ماسه در بیابانها، و امواج پستی-بلندیهای برف در مناطق قطبی جهت باد را نشان میدهند. البته گاه به خاطر آنکه این موجها خیلی کوچکاند و از چند سانتیمتر تجاوز نمیکنند، برای یافتن باد غالب نمیتوانند کمککار باشند، زیرا میتوانند با هر باد تند موضعی به سرعت تشکیل شوند.
در بیابانها انواع مختلف تلماسهها وجود دارند، که شکل آنها جهت باد غالب را نمایان میسازد؛ همچنین در مورد تلیخهای قطب: در مناطقی که به شدت پوشیده از برفاند، باد غالب تودههای برف را میراند و آنها را تبدیل به تلهای برآمدهای میسازد. این تلها از چند سانتیمتر تا یک متر ارتفاع دارند، و موازی باد غالب تشکیل میشوند. در واقع برف از لحاظ فیزیکی شبیه ماسه عمل میکند.
ج) نسیم: برخی مناطق الگوی حرکت جریان هوایشان نوسان بیشتری نسبت به جاهای دیگر دارد. مثلاً مردم کنار ساحل با نسیم دریا مأنوساند. معمولاً بعدازظهرها نسیم مداومی از طرف دریا میوزد. در شب هم معمولاً جهت نسیم برعکس میشود و از خشکی به سمت دریا میوزد. نسیم مشابهی در درهها و کوهها میوزد: در روز نسیمی از دره به سمت بالای کوه وزیدن میگیرد؛ و در شب برعکس، نسیم از بالا به سمت دره میوزد. اگر -مثلاً به کمک نقشه- بدانیم که دریا یا کوه (یا ساحل یا دره) در کدام جهتمان است، میتوانیم جهتهای اصلی را بیابیم.
د) هوای گرم و سرد: در نیمکرهٔ شمالی زمین هوایی که از شمال میآید معمولاً سردتر از هوایی است که از جنوب میآید(بادهای شمالی از بادهای جنوبی سردتر است).
هـ) سایر موارد:
اگر گمان میکنید که بادی که در لحظه میوزد باد غالب منطقهاست، میتوانید به درختان در مسیر باد نگاه کنید. با نگاه به نوک درختان میتوانید جهت باد را بفهمید.
میتوانید به تغییر جهت ابرها دقت کنید؛ بهویژه ابرهای بلندی که توسط بادهای غالب آورده میشوند.
در روی دریا و اقیانوسها بادهای غالب دارای ویژگیها و ابرهای خاص خود هستند.
۶- جهتیابی به کمک رودخانهها: بسیاری از رودها و نهرها در نیمکرهٔ شمالی زمین رو به جنوب سرازیرند، یعنی رو به استوا. این روند عمومی رودهاست، ولی همیشه درست نیست. مثلاً رود نیل -که تماماً در نیمکرهٔ شمالی است- به سوی شمال جریان دارد و به مدیترانه میریزد.
۷- جهتیابی به کمک حیوانات و حشرات:
مورچهها خاکِ لانهٔ خود را به سمت جنوب یا شرق میریزند. مورچهها چنین میکنند تا در هنگام روز خاکریزشان به عنوان سایهبانی برایشان عمل کند، تا راحتتر کار خود را انجام دهند.
مورچهها خانههای خود(مورتپهها) را بر روی شیبهای جنوب شرقی میسازند؛ زیرا خورشید در پاییز و زمستان بیشتر به این قسمتها میتابد. آنها مورتپههای خود را نزدیک درختان و صخرههای جنوبی و جنوب شرقی بنا میکنند.
اگر شما در کنار برکه یا دریاچهای باشید که پرندگان، ماهیان یا دوزیستان در حال تولیدمثل هستند، در نظر داشته باشید که آنها معمولاً ترجیح میدهند در سمت غربی زاد و ولد (تولیدمثل و پرورش) نمایند.
دارکوب(شانهبهسر) معمولاً حفرههایش را در سمت شرقی درخت حفر میکند.
سنجابها هم معمولاً در سوراخهای سمت شرقیِ درختان خانه و لانه میگزینند.
۸- جهتیابی به کمک خانههای شهری: امروزه معمولاً خانهها را به موازات شمال -جنوب یا شرق-غرب میسازند؛ یعنی نسبت به جهتهای اصلی مورب نمیسازند. این میتواند در تنظیم صحیح جهتها و تصحیح روشهای تقریبی بالا کمککار باشد. باید توجه کرد که در بسیاری موارد این اصل رعایت نشدهاست.
قطب مغناطیسی شمال
قطبهای مغناطیسی یعنی جایی که خطوط میدان مغناطیسی به صورت واگرا از زمین خارج (جنوب مغناطیسی) و یا به صورت همگرا به آن وارد (شمال مغناطیسی) میشوند.
عقربه قطبنما -به عنوان یک وسیله مغناطیسی (یک آهنربا)- وقتی که آزادانه معلق شود، قطبهای مغناطیسی را یافته و در جهت آنها آرایش میگیرد؛ یعنی جایی که عموماً شمال حقیقی نیست (بهجز برخی مناطق کره زمین). زاویه بین شمال حقیقی و شمال مغناطیسی، «میل مغناطیسی» نامیده میشود.
قطبهای مغناطیسی زمین در طول زمان تغییر میکنند. قطب شمال مغناطیسی در سال ۲۰۰۱ در موقعیت ۸۱٫۳ درجه شمالی و ۱۱۰٫۸ درجه غربی، در سال ۲۰۰۵ در موقعیت ۸۳٫۱ درجه شمالی و ۱۱۷٫۸ درجه غربی و در سال ۲۰۰۹ در موقعیت ۸۴٫۹ درجه شمالی و ۱۳۱٫۰ درجه غربی بودهاست. در سال ۲۰۱۲ قطب مغناطیسی شمال در موقعیت ۸۵٫۹ درجه شمالی و ۱۴۷٫۰ درجه غربی قرار گرفت.
هر ۲۵ هزار سال، قطبهای مغناطیسی یک دور کامل میزنند.
قطب شمال مغناطیسی، سالانه ۷٫۳۴ کیلومتر جابهجا میشود.
انحراف مغناطیسی
انحراف مغناطیسی خطای ناشی از تأثیرات جاذبههای مغناطیسی موضعی و منطقهای (مانند فلز و الکتریسیته) ااست، که باید در کنار میل مغناطیسی در نظر گرفته شود. هر گاه قطبنما در نزدیکی اشیای آهنی یا فولادی و یا منابع الکتریکی قرار گرفته باشد، عقربهاش از جهت قطب مقداری منحرف میشود. کلاً به همراه داشتن اشیایی از جنس آهن یا انواع مشابه آن میتواند باعث اختلال در حرکت عقربه شود. حتی وجود یک گیره کاغذ روی نقشه ممکن است مساله ساز شود. بنابراین، هنگام استفاده از قطبنما باید مطمئن شویم که از اشیای انحرافدهنده آن، بهطور کلی دور است. همچنین احتمال تأثیرگذاری جاذبههای مغناطیسی موجود در خاک نیز وجود دارد، که بسیار نادر است؛ ولی در مکانهایی که مثلاً معدن آهن وجود دارد باید در نظر گرفته شود.
میل مغناطیسی
انحراف مغناطیسی یا تغییر مغناطیسی یا میل مغناطیسی زاویه بین نصف النهار مغناطیسی و نصف النهار جغرافیایی در هر نقطه از سطح زمین است.
میل مغناطیسی، در هر نقطه از زمین، زاویه بین شمال حقیقی و شمال مغناطیسی در آن نقطه است؛ یعنی زاویهٔ بین سمتی که عقربهٔ قطبنما نشان میدهد، و سمت شمال جغرافیایی. منابع مختلف میل مغناطیسی را «شیب مغناطیسی» یا «تنزل مغناطیسی» یا «تغییر مغناطیسی» هم مینامند. برخی به آن انحراف مغناطیسی هم گفتهاند، ولی دیگران این واژه را برای انحراف عقربهٔ قطبنما در اثر عوامل محیطی (مانند وسایل آهنی و منابع الکتریکی و غیره) مناسبتر میدانند.
میل مغناطیسی با موقعیت، زمان (سالانه و روزانه)، ناهنجاریهای مغناطیسی محلی، ارتفاع (جزئی و قابل صرف نظر) و فعالیتهای مغناطیسی خورشید تغییر میکند. میل مغناطیسی در طول خطوطی &mdash؛ که اصطلاحا خطوط هم ارز∗ نامیده میشوند &mdash؛ ثابت است. خط فرضی با میل مغناطیسی صفر درجه در حال حاضر از غرب خلیج هودسن، دریاچه سوپریور، دریاچه میشیگان و فلوریدا عبور میکند.
تعیین میل مغناطیسی
اگر عقربه قطبنما شرق یا غربِ شمال واقعی را به عنوان شمال مشخص نماید، این اختلاف به ترتیب میل مغناطیسی شرقی یا غربی نامیده میشود. شمال مغناطیسی هم در نیمکره شمالی و هم در نیمکره جنوبی به عنوان مرجع میل مغناطیسی است. مقدار زاویهٔ انحراف بستگی با محل آزمایش دارد. برای تعیین میل مغناطیسی در یک منطقه مورد نظر میتوان از موارد زیر استفاده کرد:
نقشههای توپوگرافی چاپ شده: این نقشه ها با اندازه گیری های متعدد میل مغناطیسی در نقاط مختلف کرهٔ زمین تهیه می شوند. در برخی نقشهها میل مغناطیسی منطقه به وسیله زاویه بین دو پیکان شمال مغناطیسی (MN) و شمال حقیقی (GN) نشان داده شده است.
نمودارهای خطوط همارز چاپ شده و یا موجود در وبگاهها، که میل مغناطیسی را نشان میدهند.
حسابگر آنلاین برای مشخص نمودن آخرین میل مغناطیسی، برای یک موقعیت مشخص (طول و عرض جغرافیایی) و زمان مشخص.
لازم به ذکر است که در یک محل مقدار زاویهٔ انحراف برحسب زمان اندکی تغییر میکند و اندازهٔ آن در نقاط مختلف زمین متفاوت است.
در ایران میل مغناطیسی به سمت شرق است و مقدار زاویه آن در مکانهای مختلف متفاوت است. برای نمونه در ۱۲ خردادماه سال ۱۳۸۶ میل مغناطیسی تهران &mdash؛ طبق محاسبات &mdash؛ برابر ۴ درجه و چهار دقیقه به سمت شرق بودهاست، که هر سال نزدیک چهار دقیقه (کمتر از یکدهم درجه) به سمت شرق افزایش پیدا میکند.
مثال
چنانچه به کمک عقربهٔ مغناطیسی به طرف قطب شمال یا جنوب برویم، به قطب شمال و جنوب واقعی کرهٔ زمین نمیرسیم. علت این است که قطب شمال و جنوب جغرافیایی و مغناطیسی کرهٔ زمین، با هم یکی نیست؛ یعنی اینکه قطب شمال مغناطیسی زمین، درست روی قطب شمال جغرافیایی زمین قرار ندارد و اگر دو قطب جغرافیایی و مغناطیسی زمین را توسط خطی فرضی به به نام محور به هم وصل کنیم، بین دو محور مغناطیسی و محور جغرافیایی زمین، زاویهای ساخته میشود که به آن، زاویهٔ میل مغناطیسی گویند.