فرایندی است که از فرموله‌سازی اصلی یک مسئله رایانشی به برنامه‌های رایانه‌ای قابل اجرا به دست می‌آید.

| توسعه نرم‌افزار |
| --- |
| فعالیت‌های اصلیدر مهندسی نرم‌افزار
* فرایند
* نیازمندی‌ها
* طراحی
* ساخت
* آزمون
* اشکال‌زدایی
* استقرار
* نگهداری
 |
| پارادایم‌ها و مدل‌ها
* چابک
* افزایشی
* پروتوتایپ
* مدل مارپیچی
* آبشاری
 |
| متدولوژی‌ها و چارچوب‌ها
* دواپس
* DSDM
* FDD
* IID
* Kanban
* MDD
* MSF
* PSP
* Scrum
* TSP
* RUP
* مدل وی
* XP
 |
| رشته‌های مورد حمایت
* رشته‌های مورد حمایت
مدیریت پیکربندی
* مستندسازی
* تضمین کیفیت (SQA)
* مدیریت پروژه
* تجربه کاربری
 |
| کاربردهای عملی
* توسعه آزمون محور
* BDD
* CI
* CD
* DDD
* PP
* TDD
 |
| ابزار
* کامپایلر
* اشکال‌زدا
* رخ‌نمانگار
* سازنده رابط کاربری گرافیکی
* مقایسه ابزارهای زبان مدل‌سازی یکپارچه
* محیط توسعه یکپارچه
* Build automation
* Release automation
* Infrastructure as Code
* آزمون
 |
| استانداردها و بدنه‌های دانش
* CMMI
* IEEE standards
* ایزو ۹۰۰۰
* ISO/IEC standards
* SWEBOK
* پم‌باک
* BABOK
 |
| واژه‌نامه‌ها
* هوش مصنوعی
* علوم رایانه
 |
| * ن
* ب
* و
 |

**برنامه‌سازی رایانه‌ای** یا **برنامه‌نویسی کامپیوتری** همان فرایند طراحی و ساخت یک برنامه رایانه‌ای اجراپذیر برای به‌دست‌آوردن یک نتیجه رایانشی خاص، یا انجام یک عمل خاص می‌باشد. برنامه‌نویسی شامل عمل‌هایی مثل: تحلیل، ایجاد الگوریتم‌ها، رخ‌نمانگاری دقت الگوریتم‌ها و مصرف منابع و پیاده‌سازی آن الگوریتم‌ها به یک زبان برنامه‌نویسی انتخاب شده‌است (که معمولاً به آن **کدگذاری** (coding) گفته می‌شود). کد منبع یک برنامه به یک یا بیش از یک زبان نوشته می‌شود که این زبان برای «برنامه‌نویس» قابل فهم است (به جای کد ماشین که به صورت مستقیم توسط واحد پردازش مرکزی اجرا می‌شود). هدف از برنامه‌نویسی، پیداکردن ترتیبی از دستورالعمل‌ها است که انجام یک عمل را در یک رایانه خودکارسازی می‌کند. این دستورالعمل ها معمولاً برای حل‌کردن یک برنامه داده می شوند و می‌تواند تا حد یک سیستم‌عامل پیچیده توسعه پیدا کنند. بنابراین، یک برنامه‌نویسی حرفه‌ای نیاز به مهارت در چندین موضوع متفاوت دارد که شامل دانش دامنه کاربردی، الگوریتم‌های خاص و منطق صوری است.

برنامه‌نویسی به‌طور خلاصه یعنی تعیین یک سری دستور برای اجرا شدن توسط رایانه به منظور رسیدن به هدفی دلخواه.

تاریخچه
-------

مقالهٔ اصلی: تاریخچه زبان‌های برنامه‌نویسی
دستگاه‌های قابل برنامه‌ریزی قرن هاست که وجود دارند. در اوایل قرن نهم میلادی، یک ترتیب سنج موسیقی قابل برنامه‌ریزی توسط برادران فارسی بانو موسی اختراع شد که یک دستگاه پخش خودکار فلوت را در کتاب دستگاه‌های مبتکر توصیف کرد. در سال ۱۲۰۶میلادی، مهندس کوردالجزاری یک دستگاه درام قابل برنامه‌ریزی را اختراع کرد که در آن می‌توان از اتوماتیک مکانیکی موسیقی برای پخش ریتم‌های مختلف و الگوهای طبل، از طریق میخ‌ها و کامپ‌ها استفاده کرد. در سال ۱۸۰۱، با تغییر دادن برنامه «ژاکارد»، بافندگی ژاکارد می‌تواند بافتهای کاملاً متفاوتی تولید کند - مجموعه ای از کارتهای کارتن با سوراخهایی که در آنها وجود دارد.

الگوریتم‌های رمزگشایی و رمزگذاری و تحلیل رمز کد نیز قرن‌ها وجود داشته‌است. در قرن نهم میلادی، ریاضیدان عرب، آل کندی، برای رمزگشایی کدهای رمزگذاری شده، الگوریتم رمزنگاری را در «دست نوشته در رمزگشایی پیام‌های رمزنگاری» شرح داد. او اولین توصیف رمز پزشکی را با استفاده از آنالیز فراوانی، اولین الگوریتم رمزگشایی کد، ارائه داد.

اولین برنامه رایانه ای به‌طور کلی به سال ۱۸۴۳ مربوط می‌شود، هنگامی که Ada Lovelace، ریاضیدان، الگوریتمی را برای محاسبه دنباله ای از اعداد Bernoulli منتشر کرد، که قرار است توسط موتور تحلیلی چارلز بابیج انجام شود.

در دهه ۱۸۸۰ هرمان هالریت مفهوم ذخیره داده‌ها را به صورتی که قابل خواندن با دستگاه باشند اختراع کرد. بعداً یک کنترل پنل (افزونه) که به Tabulator Type 190 آن اضافه شده بود اجازه داد که برای مشاغل مختلف برنامه‌ریزی شود و تا اواخر دهه ۱۹۴۰ تجهیزات ضبط واحدی مانند IBM 602 و IBM 604 توسط پنل‌های کنترل به روش مشابهی برنامه‌ریزی شدند. در سال ۱۹۴۹، اولین کامپیوترهای الکترونیکی با همین شیوه و با مفهوم رایانه‌هایی با قابلیت ذخیره برنامه معرفی شدند که در آنها هم برنامه ها و هم داده‌ها به همان شیوه در حافظه کامپیوتر ذخیره و دستکاری می شدند.

کد ماشین زبان برنامه‌های اولیه بود که در مجموعه دستورالعمل‌های دستگاه خاص، غالباً به صورت دودویی نوشته شده‌است. به زودی زبانهای مونتاژ ایجاد شد که به برنامه‌نویس اجازه می‌دهد تا دستورالعمل‌ها را در قالب متن مشخص کند (به عنوان مثال، ADD X، TOTAL)، با اختصار برای هر کد عملیات و نام‌های معنی دار برای مشخص کردن آدرس‌ها است. اما از آنجا که یک زبان مونتاژ چیزی بیش از یک نشان دیگر برای یک زبان ماشین نیست، هر دو ماشین با مجموعه‌های مختلف دستورالعمل نیز دارای زبان‌های مونتاژ متفاوت هستند.

زبان‌های سطح بالا روند تهیه یک برنامه را ساده‌تر و قابل فهم تر و محدودتر به سخت‌افزار زیرین می‌کردند. FORTRAN، اولین زبان سطح پرکاربرد برای اجرای عملی، در سال ۱۹۵۷ منتشر شد [۱۰] و بسیاری از زبان‌های دیگر به زودی توسعه یافتند - به ویژه، COBOL با هدف پردازش داده‌های تجاری و لیپ برای تحقیقات رایانه است.

برنامه‌ها بیشتر با استفاده از کارت‌های پانچ شده یا نوار کاغذی وارد می‌شدند. برنامه عصر رایانه را در عصر کارت پانچ ببینید. در اواخر دهه ۱۹۶۰، دستگاه‌های ذخیره‌سازی داده و پایانه‌های رایانه به اندازه کافی ارزان شدند که می‌توان برنامه‌ها را با تایپ کردن مستقیم به رایانه‌ها ایجاد کرد. ویرایشگرهای متن (خود برنامه‌ها) ساخته شده‌اند که اجازه می‌دهد تغییرات و اصلاحات بسیار آسانتر از کارت‌های سوراخ شده انجام شود.

برنامه‌نویسی مدرن
-----------------

برنامه نویسی مدرن، چگونگی ایجاد اشکالاتی (نه باگ‌ها) را که ممکن است پیش بیایند، پیش‌بینی کرده‌است که شامل حالت‌هایی مانند دریافت اطلاعات نادرست، نامناسب یا غلط می‌شود؛ همچنین کمبود منابعی مانند حافظه، سرویس‌های سیستم عامل یا اتصال به شبکه و سایر اشکالات مانند خطای کاربر یا اشکالات قطع برق نیز در این دسته قرار می‌گیرند.

* کاربرد پذیری ارگونومی یک برنامه: آسانی استفاده از برنامه برای شخصی که می‌خواهد از آن برای کار در نظر گرفته شده استفاده کند یا گاهی برای کارهای پیش‌بینی نشده آن را به کار برد. این مورد می‌تواند به تنهایی و علی‌رغم تمام موارد دیگر باعث موفقیت یا شکست شود. طیف وسیعی از عناصر متنی، تصویری و گاهی سخت‌افزاری وجود دارند که می‌توانند باعث ارتقای وضوح، درک، پیوستگی و کامل بودن واسط کاربری برنامه شوند.
* قابلیت حمل: طیف سخت‌افزارها و سیستم عامل‌هایی که کد منبع (سورس کد) برنامه را بتوان روی آن‌ها با مترجم یا مفسر اجرا کرد. این قابلیت بستگی به تفاوت در تسهیلاتی دارد که سیستم‌های مختلف از نظر منابع سخت‌افزاری و سیستم عامل‌ها برای برنامه‌نویسی ارائه می‌کنند. همچنین رفتار پیش‌بینی شده سخت‌افزارها و سیستم‌های عامل و در دسترس بودن مترجم‌ها (و منابع کتابخانه‌ای) اختصاصی در آن سیستم‌ها برای کد منبع موجود نیز مهم است.
* نگهداشت پذیری: این که سازندگان و ارتقا دهندگان فعلی برنامه یا افراد دیگری در آن بتوانند به راحتی ارتقاها یا تغییراتی در برنامه انجام دهند تا خطاها و حفره‌های امنیتی را رفع کنند یا بتوانند آن را برای محیط جدیدی تطبیق دهند. در این مورد، تلاش مناسب اولیه در ایجاد برنامه نقش عمده‌ای بازی می‌کند. این خاصیت ممکن است تأثیر خیلی زیادی روی کاربر نهایی برنامه نداشته باشد ولی در بلند مدت برای سرنوشت یک برنامه خیلی مهم است.
* کارایی / عملکرد :اندازه‌گیری منابع سیستمی مورد نیاز برای یک برنامه (زمان پردازنده، فضای حافظه، وسایل کند مثل دیسک‌ها، پهنای باند شبکه و موارد دیگری مثل تعامل با کاربر): هر چقدر کمتر، بهتر. این خاصیت همچنین شامل مدیریت صحیح منابع مانند پاک کردن فایلهای موقت و از بین بردن نشتی‌های حافظه نیز می‌شود.

### خوانایی کد منبع

در برنامه‌ریزی رایانه، خوانایی عبارت است از این که خواننده متن کد منبع بتواند هدف، جریان برنامه و عملکرد کد منبع را متوجه شود. این موضوع در مجموعه نیازهای کیفیتی شامل موارد قابلیت انتقال، کاربرد پذیری و نگهداشت پذیری می‌شود.

خوانایی خیلی مهم است به این علت که برنامه نویسان بیشترین وقتشان را به جای این که صرف نوشتن کد جدید بکنند، در زمینه درک و تغییر کد منبع موجود می‌کنند. کدهای ناخوانا معمولاً به خطا، نارسایی و کدهای تکراری ختم می‌شوند. تحقیقی نشان داده است که تغییراتی جزئی و ساده‌ برای خوانایی برنامه می‌تواند منجر به این شود که کد نهایی نوشته شده کوتاه‌تر شود و همچنین زمان فهم آن به‌طور قابل توجهی کاهش یابد.

پیروی از یک سبک برنامه‌نویسی منسجم معمولاً به خوانایی کمک می‌کند؛ اگر چه "خوانایی" چیزی بیش از اتکای صرف به سبک برنامه‌نویسی است. عوامل زیادی که معمولاً دخالتی در توانایی رایانه برای ترجمه مناسب و اجرای بهتر برنامه ندارند، به خوانایی کمک می‌کنند. بعضی از این عوامل عبارتند از:

* بلوک بندی متفاوت (فاصله سفید)
* یادآورها
* تکه‌تکه کردن نوشته‌های طولانی
* قواعد نامگذاری برای اشیا (مثل متغیرها، کلاسها، روال‌ها و غیره)

جنبه‌های دیداری برای این کار (مثل تورفتگی، شکستن خطوط، علامت‌گذاری رنگی و مانند این‌ها) معمولاً به وسیله ویرایشگر کد منبع فراهم می‌شود، اما جنبه‌های محتوایی بازتابی از استعداد و توانایی‌های برنامه‌نویس است.

زبانهای برنامه‌نویسی دیداری متعددی با این منظور توسعه داده شده‌اند تا بتوانند از روش‌های غیر سنتی برای ارائه کد و تصویر استفاده کنند. محیط‌های یکپارچه توسعه نرم‌افزار (IDEها) می‌خواهند تا تمام این گونه کمک‌ها را به شکل یکپارچه ارائه کنند. تکنیک‌هایی برای بازسازی کد می‌تواند خوانایی را افزایش دهد.

### پیچیدگی الگوریتمی

محیط‌های دانشگاهی و همچنین مهندسین فعال در برنامه‌نویسی هر دو عمیقاً به دنبال کشف و تکمیل الگوریتم‌های کارآمد تر برای گروه مشکلات مشخص شده هستند. برای نیل به این هدف الگوریتم‌ها در ترتیب‌هایی طبقه‌بندی می‌شوند که به عنوان نماد O بزرگ خوانده می‌شوند. این طبقه‌بندی نشانگر استفاده الگوریتم از منابع، مثل زمان اجرا یا انباشت حافظه در ازای اندازه یک داده وارده است.

برنامه نویسان حرفه‌ای با گستره‌ای از الگوریتم‌های خوب سازمان یافته آشنایی دارند و پیچیدگی‌های مخصوص آن‌ها را می‌دانند و در نتیجه از این دانسته‌ها برای انتخاب الگوریتم‌های مناسب برای شرایط مورد نظر خود، استفاده می‌کنند.

#### الگوریتم‌های شطرنج به عنوان نمونه

"برنامه نویسی رایانه برای بازی شطرنج" مقاله ای در سال ۱۹۵۰ بود که یک الگوریتم "minimax" را که بخشی از تاریخ پیچیدگی الگوریتمی است ارزیابی می‌کند. دوره ای در مورد IBM's Deep Blue (کامپیوتر شطرنج) بخشی از برنامه درسی علوم کامپیوتر در دانشگاه استنفورد است.

### کاربرد الگوریتم و روندنما در برنامه‌نویسی

یکی از مهم‌ترین پیش‌نیازهای برنامه‌نویسی اطلاع داشتن از نحوهٔ حل مسئله و الگوریتم‌های برنامه‌نویسی است، الگوریتم‌ها به صورت خاص نحوهٔ حل و منطق زبان برنامه‌نویسی را بیان می‌کنند، نمای تصویری الگوریتم را روندنما می‌نامند، پس از نوشتن یک الگوریتم کامل برنامه‌نویسی می‌توان اقدام به رسم روندنما کرد تا نمود بصری الگوریتم به خوبی نمایان گردد.

### روش‌ها

قدم اول در فرایند توسعه بیشتر نرم‌افزارها به شکل معمول شامل بررسی نیازمندی‌ها، سپس آزمایش برای تشخیص الگوی متغیرها، اجرا و سپس حذف خرابی‌ها (اشکال زدایی) است. راه‌های مختلفی برای رسیدن به هر کدام از این وظایف وجود دارند. یک راه پرطرفدار برای تحلیل نیازمندی‌ها تحلیل مورد کاربردی است. بسیاری از برنامه نویسان از شکل توسعه چابک نرم‌افزاری استفاده می‌کنند؛ در این روش مراحل مختلف توسعه نرم‌افزار به شکل چرخه‌های کوتاه با هم ترکیب می‌شوند به‌طوری که هر کدام از این چرخه‌ها فقط چند هفته طول بکشند. این در مقابل روش معمول است که ممکن است چند سال زمان ببرد. روش‌های خیلی زیادی برای روند توسعه برنامه‌ها وجود دارند.

### محبوب‌ترین زبان در برنامه‌نویسی

تعیین اینکه محبوب‌ترین زبان برنامه‌نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبان‌ها در کاربردهای خاصی محبوب است و بعضی دیگر مرتباً در نوشتن کاربردهای گوناگون استفاده می‌شود.
روش‌های اندازه‌گیری محبوبیت زبان شامل موارد زیر می‌باشد:
شمردن تعداد آگهی‌های اشتغال و توجه به یک زبان، تعداد کتاب‌های آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان؛ که امروز می‌توان زبان برنامه‌نویسی پایتون و جاوا اسکریپت از محبوب‌ترین زبان‌های برنامه‌نویسی جهان دانستند؛ به‌خصوص پایتون که به دلیل سادگی و کارایی بالا در زمینه‌های مختلف افراد زیادی را به خود جذب کرده‌است. در رده‌های بعدی زبان برنامه‌نویسی سی شارپ هم جایگاه به خصوصی دارد.

### روش‌شناسی

اولین قدم در اکثر فرایندهای رسمی توسعه نرم‌افزار، تجزیه و تحلیل الزامات است و پس از آن آزمایش برای تعیین مدل‌سازی ارزش، پیاده‌سازی و حذف نقص (اشکال زدایی) انجام می‌شود. برای هر یک از این کارها رویکردهای مختلفی وجود دارد. یکی از رویکردهای محبوب برای تجزیه و تحلیل الزامات، استفاده از آنالیز Case است. بسیاری از برنامه نویسان از اشکال توسعه نرم‌افزار Agile استفاده می‌کنند که مراحل مختلف توسعه نرم‌افزار رسمی در چرخه‌های کوتاه که چند هفته به طول می‌انجامند در کنار هم قرار گرفته‌اند. رویکردهای زیادی برای فرایند توسعه نرم‌افزار وجود دارد.

تکنیک‌های محبوب سازی مدل‌سازی شامل تحلیل و طراحی شی گرا (OOAD) و معماری مدل محور (MDA) است. زبان مدل‌سازی متحد (UML) علامتی است که برای OOAD و MDA استفاده می‌شود.

تکنیک مشابهی که برای طراحی بانک اطلاعاتی مورد استفاده قرار می‌گیرد، مدل‌سازی رابطه-رابطه (Entity-Modelation) (مدل‌سازی ER) است.

تکنیک‌های اجرای شامل زبان‌های ضروری (شی گرا یا رویه ای)، زبان‌های کاربردی و زبان‌های منطقی است.

### اندازه‌گیری میزان استفاده از زبان

تعیین اینکه محبوب‌ترین زبان‌های برنامه‌نویسی مدرن چیست، بسیار دشوار است. روش‌های سنجش محبوبیت زبان برنامه‌نویسی عبارتند از: شمارش تعداد آگهی‌های شغلی که به آن زبان اشاره می‌کنند، تعداد کتاب‌های فروخته شده و دوره‌های آموزش زبان (این اهمیت بیش از حد زبان‌های جدید را بالاتر می‌برد) و تخمین تعداد خطوط موجود کد نوشته شده به زبان (این کمترین تعداد کاربران زبان‌های تجاری مانند COBOL را دست کم می‌گیرد).

برخی از زبان‌ها برای انواع خاصی از برنامه‌ها بسیار محبوب هستند، در حالی که برخی از زبان‌ها به‌طور مرتب برای نوشتن انواع مختلف برنامه‌ها مورد استفاده قرار می‌گیرند. به عنوان مثال، COBOL هنوز هم در مراکز داده‌های شرکتی غالباً در رایانه‌های اصلی بزرگ، Fortran در برنامه‌های مهندسی، زبان‌های اسکریپت در توسعه وب و C در نرم‌افزارهای تعبیه شده قوی است. برنامه‌نویسی بسیاری از برنامه‌ها از ترکیبی از چندین زبان در ساخت و استفاده خود استفاده می‌کنند. زبان‌های جدید عموماً در حدود نحو یک زبان قبلی طراحی شده‌اند که قابلیت‌های جدیدی نیز به آن اضافه شده‌است (به عنوان مثال ++C جهت‌یابی به شی را به C اضافه می‌کند، و جاوا مدیریت حافظه و بایت کد را به ++C اضافه می‌کند، اما در نتیجه بازده و توانایی کم را از دست می‌دهد)

### اشکال زدایی

اشکال زدایی کار بسیار مهمی در فرایند توسعه نرم‌افزار است زیرا نقص در یک برنامه می‌تواند عواقب قابل توجهی برای کاربران آن داشته باشد. بعضی از زبان‌ها بیشتر مستعد ابتلا به برخی از خطاها هستند زیرا مشخصات آن‌ها به کامپایلرها نیاز ندارد تا به همان اندازه سایر زبان‌ها بررسی کنند. استفاده از ابزار تجزیه و تحلیل کد استاتیک می‌تواند به تشخیص برخی از مشکلات احتمالی کمک کند.

به‌طور معمول اولین مرحله برای اشکال زدایی تلاش برای تولید مثل مشکل است. این می‌تواند یک کار غیر مهم باشد، به عنوان مثال با فرایندهای موازی یا برخی از اشکالات نرم‌افزاری غیرمعمول. همچنین، شرایط خاص کاربر و تاریخچه استفاده می‌تواند تولید مشکل را دشوار کند.

پس از تولید مجدد اشکال، ممکن است ورودی برنامه ساده شود تا اشکال زدایی آسان‌تر شود. به عنوان مثال، یک اشکال در کامپایلر می‌تواند هنگام عبور از فایل منبع بزرگ خراب شود. با این حال، پس از ساده‌سازی مورد آزمایشی، فقط چند خط از پرونده منبع اصلی می‌تواند برای تکثیر همان تصادف کافی باشد. چنین ساده‌سازی می‌تواند به صورت دستی و با استفاده از روش تقسیم و تسخیر انجام شود. برنامه‌نویس سعی خواهد کرد که برخی از قسمت‌های تست اصلی را حذف کند و بررسی کند که آیا این مشکل هنوز وجود دارد یا خیر. هنگام اشکال زدایی مشکل در یک رابط کاربری گرافیکی، برنامه‌نویس می‌تواند سعی کند برخی از تعامل‌های کاربر را از توضیحات اصلی مسئله جستجو کند و بررسی کند که آیا اقدامات دیگر برای ظاهر اشکالات وجود دارد یا خیر.

اشکال زدایی اغلب با IDE‌هایی مانند Visual Studio Code , Eclipse , Visual Studio , Xcode , Kdevelop , NetBeans و Code :: Blocks انجام می‌شود. از اشکال زدایی‌های مستقل مانند GDB نیز استفاده می‌شوند و این‌ها معمولاً کمتر از یک محیط بصری استفاده می‌کنند، معمولاً با استفاده از یک خط فرمان. برخی از ویرایشگرهای متنی مانند Emacs به GDB اجازه می‌دهند تا از طریق آن‌ها فراخوانی شود تا محیط بصری را فراهم کند.

نمونه یک برنامه
---------------

یک برنامهٔ ساده در زبان برنامه‌نویسی 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) دستورها را تبدیل به فرامینی می‌کند که لایه زیرین، که ممکن است همان سخت‌افزار باشد، می‌تواند آن‌ها را *اجرا* کند.

برای راحت‌تر شدن کدنویسی (برنامه‌نویسی) از نرم‌افزارهای مختلفی وابسته به زبان آن استفاده می‌کنند که به آن‌ها محیط یکپارچه توسعه نرم‌افزار گفته می‌شود به عنوان مثال برای کدنویسی به زبان سی شارپ از نرم‌افزار مایکروسافت ویژوال استودیو استفاده می‌شود.

پارادایم‌ها
-----------

مقالهٔ اصلی: پارادایم برنامه‌نویسی
زبان‌های برنامه‌نویسی گوناگون براساس قابلیت‌های در نظر گرفته شده از شیوهٔ خط‌های مختلف استفاده می‌کنند. موارد ریزتری مانند چگونگی برخورد با نیازهای پشت پردهٔ ماشین مانند مدیریت حافظه و مدیریت زباله نیز در زبان‌های مختلف متفاوت است. علاوه بر این‌ها، مفاهیمی متفاوت از (اجرای) یک برنامه تصور شده‌اند که پارادایم یا الگو نام دارند.

زبان‌های برنامه‌نویسی
---------------------

مقاله اصلی: زبان برنامه‌نویسی
زبان‌های مختلف برنامه‌نویسی وجود دارند که هر کدام از آن‌ها سبک‌های خاصی را پشتیبانی می‌کنند (به نام پارادایم‌های برنامه‌نویسی). انتخاب زبان مورد استفاده، مورد توجه بسیاری از مباحث از قبیل خط مشی شرکت، مناسب بودن در انجام کار، در دسترس بودن بسته‌های شخص ثالث یا ترجیح شخصی است. در حالت ایدئال، زبان برنامه‌نویسی که برای کار مورد نظر مناسب‌تر باشد، انتخاب می‌شود.

تجارت از این ایدئال شامل یافتن برنامه نویسان به اندازه کافی است که زبان را برای ایجاد یک تیم می‌شناسند، در دسترس بودن کامپایلرها برای آن زبان و کارایی که برنامه‌های آنها را با یک زبان خاص اجرا می‌کنند. زبان‌ها طیف تقریبی را از «سطح پایین» تا «سطح بالا» تشکیل می‌دهند.

زبان‌های «سطح پایین» به‌طور معمول بیشتر دستگاه محور و سریع‌تر اجرا می‌شوند و به زبان ماشین نزدیک‌تر هستند در حالی که زبان‌های «سطح بالا» انتزاعی‌تر و آسان‌تر برای استفاده هستند اما سرعت کمتری دارند. معمولاً کدگذاری به زبان‌های «سطح بالا» از زبان‌های «سطح پایین» ساده‌تر است.
برای نمونه پایتون زبانی ساده‌تر و سریع تر برای نوشتن و سی زبانی اصولی تر و زمانبر تر برای نوشتن می‌باشد.

آلن داونی در کتاب «چگونه به شکل یک استاد رایانه فکر کنیم» می‌نویسد:

جزئیات در زبان‌های برنامه‌نویسی مختلف، متفاوت به نظر می‌رسند ولی تعدادی از ساختارهای اساسی در همه زبان‌های برنامه‌نویسی یکسان هستند:

* ورودی: داده‌ها را از صفحه کلید، یک فایل یا وسایل دیگر فراهم می‌کند.
* خروجی: اطلاعات را روی صفحه تصویر نشان می‌دهد، به یک فایل می‌فرستد یا به دستگاه‌های دیگری انتقال می‌دهد.
* محاسبات: اعمال محاسباتی اساسی مثل جمع و ضرب را انجام می‌دهد.
* حالت‌های شرطی: شرط‌های مشخصی را کنترل می‌کند و بر اساس آن رشته مناسبی از عبارات را اجرا می‌کند.
* حلقه: بعضی اعمال را به شکل تکراری انجام می‌دهد، معمولاً با استفاده از تعدادی متغیرها این کار انجام می‌شود.

بسیاری از زبان‌های برنامه‌نویسی مکانیسم‌هایی را برای تماس با توابع ارائه شده توسط کتابخانه‌های مشترک فراهم می‌کنند. مشروط بر اینکه توابع موجود در یک کتابخانه از کنوانسیون‌های زمان اجرا مناسب پیروی کنند (مثلاً روش گذراندن آرگومان‌ها)، ممکن است این توابع به هر زبان دیگری نوشته شود.

چند مورد از زبان‌های برنامه‌نویسی: سی شارپ (#C)، سی (C)، ++C، پایتون (Python)، جاوا (Java)، جاوا اسکریپت (Java Script) و …؛ این‌ها فقط چند نمونه از زبان‌های برنامه‌نویسی هستند.

برنامه نویسان
-------------

نوشتار اصلی: برنامه‌نویس

همچنین ببینید: توسعه دهنده نرم‌افزار، مهندس نرم‌افزار

برنامه نویسان رایانه کسانی هستند که نرم‌افزار رایانه ای می‌نویسند. مشاغل آنها معمولاً شامل موارد زیر است:

* کد نویسی
* اشکال زدایی
* سندپردازی
* یکپارچه سازی
* نگهداشت
* تجزیه و تحلیل مورد نیاز
* معماری نرم‌افزار
* آزمایش نرم‌افزار
* مشخصات

### مهارت‌ها

یک برنامه‌نویس رایانه علاوه بر دانستن زبان برنامه‌نویسی ملزم به برخورداری از توانایی‌هایی مانند تسلط به زبان انگلیسی، تایپ ده‌انگشتی، ذهنیت حل مسئله، تسلط کافی به ریاضیات و توانایی جستجوی صحیح در اینترنت است.

پانویس
------

1. ↑  «*برنامه‌سازی رایانه‌ای، برنامه‌نویسی رایانه‌ای*» [*رایانه و فناوری اطلاعات*] هم‌ارزِ «*computer programming*»؛ منبع: گروه واژه‌گزینی. جواد میرشکاری، ویراستار. *دفتر اول*. فرهنگ واژه‌های مصوب فرهنگستان. تهران: انتشارات فرهنگستان زبان و ادب فارسی. شابک ۹۶۴-۷۵۳۱-۳۱-۱ (ذیل سرواژهٔ *برنامه‌سازی رایانه‌ای*)
2. ↑  Bebbington, Shaun (2014). "What is coding". *Tumblr*. Archived from the original on 2020-04-29. Retrieved 2014-03-03.`{{cite web}}`: نگهداری یادکرد:تاریخ و سال (link)
3. 1 2  Bebbington, Shaun (2014). "What is programming". *Tumblr*. Archived from the original on 2020-04-29. Retrieved 2014-03-03.
4. ↑  "Programming 101: Tips to become a good programmer - Wisdom Geek". *Wisdom Geek* (به انگلیسی). 2016-05-19. Retrieved 2016-05-23.
5. ↑  James L. Elshoff, Michael Marcotty, Improving computer program readability to aid modification, Communications of the ACM, v.25 n.8, p.512-521, Aug 1982.

منابع
-----

* Programming: Principles and Practice Using C++ by Bjarne Stroustrup, Publisher: Addison-Wesley Professional, 2008
* Faster Smarter Beginning Programming by Jim Buyens, Publisher: Microsoft Press, 2002
* Java How to Program, by Harvey M. Deitel and Paul J. Deitel, Publisher: Prentice Hall, 2007
* Programming ASP.NET 3.5 by Jesse Liberty, Dan Maharry, and Dan Hurwitz, Publisher: O'Reilly Media, Inc. , ۲۰۰۹

جستارهای وابسته
---------------

* برنامه‌سازی موازی
* الگوریتم
* روندنما

| * ن
* ب
* و
مهندسی نرم‌افزار |
| --- |
| حوزه‌ها | تحلیل نیازمندی‌ها •  تحلیل سامانه‌ها •  طراحی نرم‌افزار •  برنامه‌نویسی •  روش‌های صوری •  وارسی مدل •  تست نرم‌افزار •  توسعه نرم‌افزار •  گسترش نرم‌افزار •  نگهداری نرم‌افزار |
| مفاهیم | مدل‌سازی داده •  معماری سازمانی •  مشخصات کاربردی •  زبان مدل‌سازی •  پارادایم برنامه‌نویسی •  نرم‌افزار •  معماری نرم‌افزار •  فرایند توسعه نرم‌افزار •  فرایند تولید نرم‌افزار •  کیفیت نرم‌افزار •  تضمین کیفیت نرم‌افزار •  Software archaeology •  تحلیل ساختمند |
| گرایشات | مدل چابک •  مدل طراحی جنبه‌گرا •  شیءگرایی •  آنتولوژی •  سرویس‌گرایی •  چرخه حیات توسعه سیستم‌ها |
| مدل‌ها | 

|  |  |
| --- | --- |
| مدل‌های توسعه | مدل چابک •  آریوپی  •  اسکرام •  مدل مارپیچی •  مدل آبشاری •  برنامه‌سازی مفرط •  مدل وی •  مدل تکراری و افزایشی •  پیش‌نمونه |
| مدل‌های دیگر | Automotive SPICE •  مدل بلوغ قابلیت یکپارچه •  مدل داده •  مدل تابع •  مدل اطلاعات •  فرامدل •  مدل شیءگرایی •  مدل‌سازی سیستم‌ها •  مدل نما |
| زبان‌های مدل سازی | IDEF •  زبان مدل‌سازی یکپارچه |

 |
| مهندساننرم‌افزار سرشناس | 
* ویکتور باسیلی
* کنت بک
* گریدی بوچ
* فردریک بروکز
* Barry Boehm
* وارد کانینگهام
* تام دی ماکرو
* ادسخر دیکسترا
* مارتین فولر
* تونی هور
* واتس هامفری
* مایکل ای. جکسون
* ایوار جاکوبسون
* Stephen J. Mellor
* برترند میر
* دیوید پارناس
* وینستون واکر رویس
* جیمز رامبا
* نیکلاوس ویرت
* Edward Yourdon
* Mohamed Fayad

 |
| حوزه‌های مرتبط | 
* علوم رایانه
* مهندسی کامپیوتر
* مدیریت پروژه
* مدیریت ریسک
* مهندسی سامانه‌ها

 |
|  •  رده  •  انبار |

| * ن
* ب
* و
علوم رایانه |
| --- |
| Note: This template roughly follows the 2012 ACM Computing Classification System. |
| سخت‌افزار | 
* برد مدار چاپی
* دستگاه جانبی
* مدار مجتمع
* یکپارچه‌سازی کلان‌مقیاس
* سامانه روی یک تراشه
* رایانش سبز
* خودکارسازی طراحی الکترونیکی
* شتاب‌دهنده سخت‌افزاری

 |
| سازمانسامانه‌های رایانه | 
* معماری رایانه
* سامانه نهفته
* رایانش بی‌درنگ
* اطمینان‌پذیری

 |
| شبکه رایانه‌ای | 
* معماری شبکه
* پروتکل ارتباطات
* سخت‌افزار شبکه
* برنامه‌ریز شبکه
* کارایی شبکه رایانه‌ای
* سرویس شبکه‌ای

 |
| سازمان نرم‌افزار | 
* مفسر
* میان‌افزار
* ماشین مجازی
* سیستم‌عامل
* کیفیت نرم‌افزار

 |
| نظریه زبان‌های برنامه‌نویسیو ابزار توسعه نرم‌افزار | 
* الگو برنامه‌نویسی
* زبان برنامه‌نویسی
* کامپایلر
* زبان خاص دامنه
* زبان مدل‌سازی
* چارچوب نرم‌افزاری
* محیط یکپارچه توسعه نرم‌افزار
* مدیریت پیکربندی نرم‌افزار
* کتابخانه (رایانه)
* مخزن نرم‌افزاری

 |
| توسعه نرم‌افزار | 
* فرایند توسعه نرم‌افزار
* تحلیل نیازمندی‌ها
* طراحی نرم‌افزار
* ساخت نرم‌افزار
* استقرار نرم‌افزار
* تعمیر و نگهداری نرم‌افزار
* تیم برنامه‌نویسی
* نرم‌افزار متن‌باز
* برنامه‌نویسی
* آزمون نرم‌افزار

 |
| نظریه محاسبات | 
* مدل محاسبه
* زبان صوری
* نظریه اتوماتا
* نظریه رایانش‌پذیری
* نظریه پیچیدگی محاسباتی
* منطق در علوم کامپیوتر
* معنی‌شناسی (علوم رایانه)

 |
| الگوریتمها | 
* الگوریتم
* تحلیل الگوریتم‌ها
* کارایی الگوریتمی
* الگوریتم‌های تصادفی
* هندسه محاسباتی

 |
| ریاضیاترایانه | 
* ریاضیات گسسته
* احتمالات
* آمار
* نرم‌افزار ریاضی
* نظریه اطلاعات
* آنالیز ریاضی
* آنالیز عددی

 |
| سامانه اطلاعاتی | 
* پایگاه داده
* ذخیره‌سازی داده رایانه
* سامانه اطلاعات سازمانی
* نرم‌افزار اجتماعی
* سامانه اطلاعات جغرافیایی
* سامانه پشتیبانی تصمیم
* کنترل فرایند
* پایگاه داده چند رسانه‌ای
* داده‌کاوی
* کتابخانه دیجیتال
* سکوی رایانش
* بازاریابی اینترنتی
* وب جهان‌گستر
* بازیابی اطلاعات
* مستندسازی فنی

 |
| امنیت رایانه | 
* رمزنگاری
* روش‌های صوری
* خدمات امنیتی
* سامانه تشخیص نفوذ
* خرابی سخت‌افزار
* امنیت شبکه
* امنیت اطلاعات
* امنیت برنامه

 |
| تعامل انسان و رایانه | 
* طراحی تعاملی
* رایانش اجتماعی
* رایانش فراگیر
* مصورسازی
* دسترس‌پذیری رایانه
* واسط‌های کاربر
* رایانش پوشیدنی

 |
| همروندی | 
* رایانش همزمان
* رایانش موازی
* رایانش توزیع‌شده
* چندریسمانی
* چندپردازشی

 |
| هوش مصنوعی | 
* پردازش زبان‌های طبیعی
* بازنمود دانش
* بینایی رایانه‌ای
* برنامه‌ریزی خودکار
* بهینه‌سازی
* نظریه کنترل
* فلسفه هوش مصنوعی
* هوش مصنوعی توزیع شده
* استدلال خودکار
* زبان‌شناسی رایانشی
* یادگیری ماشین

 |
| یادگیری ماشین | 
* یادگیری با نظارت
* یادگیری بی‌نظارت
* یادگیری تقویتی
* یادگیری چند-وظیفه‌ای
* روش اعتبارسنجی متقابل

 |
| گرافیک رایانه‌ای | 
* پویانمایی رایانه‌ای
* رندرینگ (گرافیک رایانه‌ای)
* روتوش
* واحد پردازش گرافیکی
* واقعیت ترکیبی
* واقعیت مجازی
* فشرده‌سازی تصویر
* مدلسازی جامد

 |
| رایانشکاربردی | 
* تجارت الکترونیک
* نرم‌افزار سازمانی
* ریاضیات محاسباتی
* فیزیک محاسباتی
* شیمی محاسباتی
* زیست‌شناسی محاسباتی
* علوم اجتماعی محاسباتی
* مهندسی و علم محاسبه
* انفورماتیک پزشکی
* هنر دیجیتال
* نشر الکترونیک
* جنگ مجازی
* رأی‌گیری الکترونیکی
* بازی ویدئویی
* واژه‌پرداز
* تحقیق در عملیات
* فناوری آموزشی
* سامانه مدیریت اسناد

 |
| توجه: بنا بر سامانه رده‌بندی رایانش ای‌سی‌ام علم رایانه همچنین می‌تواند به موضوع‌ها یا زمینه‌های گوناگون تقسیم شود.
* **کتاب:علوم رایانه**
* **رده:علوم رایانه**
* **طرح کلی علوم رایانه**
* **ویکی‌پدیا:ویکی‌پروژه علوم رایانه**
* **ویکی‌انبار**
 |

پیوند به بیرون
--------------

| * ن
* ب
* و
کیفیت نرم‌افزار |
| --- |
| کیفیت‌ها | 

|  |  |
| --- | --- |
| درونی | 
* Size
* نگهداشت‌پذیری
* Flexibility
* قابلیت حمل نرم افزار
* بازبهره‌پذیری
* برنامه‌نویسی رایانه‌ای
* مقیاس‌پذیری
* Testability
* فهم
* همراهی آزادانه
* Orthogonality

 |
| بیرونی | 
* کاربردپذیری
* مهندسی قابلیت اطمینان
* سازگارپذیری
* صحت
* صحت و دقت
* کارایی الگوریتمی
* توانمندی
* Security
* امنیت سیستم نرم‌افزار

 |

 |
| استانداردها و فهرست‌ها | 
* ISO/IEC 9126
* نیازمندی‌های غیرعملیاتی
* List of system quality attributes

 |
| فرآیندها | 
* Software quality management
* Software quality control
* تضمین کیفیت نرم‌افزار

 |
| 
* 
* Commons

 |