Програмиране
Програмирането е процесът на създаване на компютърни програми – програмен код или алгоритъм, който може да бъде разчетен и изпълнен от компютър. Програмиране се наричат също академичната дисциплина и компютърната наука – дял от математиката и информатиката – които се занимават с алгоритмите и методите и средствата на програмирането.

При програмирането се използват различни езици за програмиране, на които се записват изходните кодове на програмата. Тези езици имат различно предназначение, като някои от тях са езици на ниско, други на високо ниво, някои са уеб езици за програмиране, някои са скриптови, други функционални или процедурни, както и такива, които включват работа с обекти – обектно ориентирани езици за програмиране. Алгоритмите се делят най-общо на прости, сложни, и такива които изискват теореми или създаването на нови теореми (в математиката). Алгоритмите са специфична област на изучаване в програмирането и компютърните науки, в математиката, както и за оптимизацията на програмния код и добрата работа на процесора.

Програмирането включва писането на код, тестването му и поддържането на изходния код. Програмата е изпълнима от компютъра, но за да бъде полезна за потребителите, тя трябва да отговаря на поставените изисквания към софтуера. За разлика от системния софтуер, софтуерът за потребителите има други етапи на създаване, като се отделя внимание на функционалните и потребителски изисквания („Какво иска потребителят?“). Потребителят може да е голям клиент или множество по-малки клиенти, или дори фирма, заявила разработка на софтуер, затова във всеки конкретен случай се дефинират софтуерни изисквания (requirements) според нуждите на потребителите. След това се пристъпва към най-общото разграфяване по етапи и дизайн като решение на софтуерно програмния процес: от една страна, самият софтуер се проектира най-общо като потребителски дизайн и интерфейс, от друга страна, се разпределят неговите функционалности на изпълнението за написване като код, в необходимата последователност.

Програмният код, който се пише на даден език за програмиране, се пише на базата на избраните според изискванията и спецификациите алгоритмични параметри, той може да бъде и модификация на съществуващ вече код или да бъде базиран на код на друг език, с цел решаването на даден математически проблем или програмно изискване. Отделно готовият софтуерен продукт подлежи на тестване на потребителския интерфейс. Макар че обикновено се възприема, че софтуерният продукт се тества от тестови екип по осигуряване на качеството, в действителност това е основното тестване на даден софтуер или програмен продукт, това може и да е уебсайт или конкретна онлайн функционалност към уебсайт, а основното тестване се прави от софтуерния мениджърски екип и дори от топ мениджъра, които проверяват дали писаното като код и тествано от тестовия екип е действително работещо. Компании от софтуерната индустрия, които се опитват да прехвърлят основното тестване към тестващия екип в действителност възлагат мениджърска работа и отговорности към тестващите, като отказът от този тип отговорност от страна на софтуерния мениджмънт понякога става причина такива компании да излязат от пазара или се налага да се преструктурират, независимо колко изгодно на пръв поглед изглежда да се прехвърля отговорното тестване, което предхожда пускането на софтуера към клиентите на тестовия екип.

В действителност най-солидните компании като Майкрософт например разчитат на код, писан и от самия основател на компанията, така че може да се каже, че тестването на софтуер за клиенти е мениджърски минимум, който разбира се не отменя работата на софтуерни или тестови екипи. В този смисъл от значително предимство е основателят или президентът (дори това да е жена) на една софтуерна или програмистка компания да е програмист, да може да програмира на практика, да може да прави софтуер, да има личен опит в създаването на софтуерни продукти, да разбира значението на това един софтуер да е работещ и да е тестван, преди да бъде подаден на потребителите, да е програмист или поне инженер в някоя близка област, която да му дава възможност да разбира значението на термини като „изисквания“ и „спецификации“, а не да ги поставя в полето за неясни софтуерни термини, това са термини от инженерните науки като цяло.

В сферата на софтуерното инженерство, програмирането е основната част от процеса на разработка на софтуер, но създаването на стабилен работещ софтуер изисква много повече от способността да се пише код.

В някои специализирани приложения или специфични ситуации, програма може да бъде написана или модифицирана чрез директно зареждане на нужните инструкции на машинен код и тяхното изпълнение.

Програмист 
Програмистът е действителен специалист по писането на предимно нов код. Включително ползването на различни известни алгоритми или при необходимост създаването на такива. Когато пише алгоритмите за една програма програмистът е и математик.

 Писане на код
 Писане на алгоритми

Софтуерен инженер 

Софтуерният инженер може да пише компютърни програми, както и програмистът, но неговата задача е по-различна: да разпредели възложените за изпълнение задачи върху няколко екипа или дори множество екипи. Като той може да разпределя времето между отделните екипи и в някаква степен да координира работата им или да работи в рамките на един екип.

Работата на софтуерния инженер обикновено включва:

 Анализ на изискванията – анализът на изискванията е процес, който се извършва от самите програмисти, или от екип софтуерни инженери и други специалисти, участващи в процеса, на които е възложено изпълнение на софтуер, без да имат пряка връзка с потребителите, тоест на тях са зададени писани изисквания, които трябва съответно да бъдат „разчетени“
 Спецификация – инженерните спецификации се отнасят до параметрите, които трябва да отговарят на съществуващите стандарти
 Софтуерен дизайн или архитектура на софтуера
 Писане на код
 Компилиране на код
 Тестване
 Софтуерна документация
 Интеграция на софтуер (пример интеграция на Текстови редактор с останалите програми от офис пакет)
 Основна поддръжка

Софтуерен разработчик 

Софтуерният инженер възлага на софтуерния разработчик на базата на съществуващ код и съществуващ софтуер да допълва и доизгражда дадена програма и софтуер.

Мениджър на софтуерен екип 
Това е мениджърът, който ръководи дейността на целия софтуерен екип или на няколко софтуерни екипа, които могат да се състоят от програмисти, разработчици (виж по-горе за разликата между двете), също софтуерни инженери и тестъри, които осигуряват качеството, включително ръководи мениджърите на тестовите екипи, както и всички останали софтуерни специалисти, които са част от софтуерния екип като цяло.

История на програмирането 
Най-старата машина за програмиране (това е машина, чието поведение може да се контролира от промените на програма) е програмният хуманоиден робот на Ал Джазари през 1206 г. Външният вид на робота на Ал Джазари е механизирана лодка с четирима автоматични музиканти, която се носи по езерото и забавлява гостите по време на кралските балове. Неговият механизъм включва програмируеми барабани с ключе, захванати на малка ръчка, които отмерват ритъма. Барабанистът е можел да изпълнява различни ритми в зависимост от положението на ключето.

Често за образец на ранното изкуство е считан жакардовият стан, създаден през 1801 г. В тази машина се използвали картонени карти с дупки по тях, като дупките показват извивките на дрехата. Така в зависимост от картите, които му се поставят, станът можел да произвежда напълно различни дрехи. Такива карти е използвал и Чарлз Бабидж през 1830 г., за да управлява своята сметачна машина. Тук отворите се използват за контрол на машината.

Това нововъведение по-късно е подобрено от Херман Холерит, който прилага перфорацията по определена схема за въвеждане на данни. Холерит изобретява специална перфорираща машина за въвеждане на големи масиви от данни, наречена табулатор. Тя се основава на релета и работи с перфокарти, които получават неговото име. Освен тях изобретява и четец за тези карти. Първото приложение на машината е при обработката на резултатите от преброяване на населението в САЩ през 1890 г. когато резултатите са обработени много по-евтино от очакваното и преди определения срок (при предишното преброяване обработката отнела години). Следват усъвършенствувания на машината и през 1906 г. моделът Type I Tabulator вече е снабден с комутационен панел и позволява бързо и автоматизирано да се изпълняват различни задачи в счетоводството и складовото стопанство (първата крачка към програмирането).

През 1896 г. Холерит основава компанията Tabulating Machine Company (днес IBM). До края на 40-те години имало различни видове машини за програмиране с комутационен панел, които да изпълняват четенето на картите. Ранните компютри също са били програмирани чрез комутационни панели.

Архитектурата на Джон фон Нойман позволява програмите да бъдат запаметени в компютърна памет. Ранните програми трябвало стриктно да задават инструкциите на отделната машина, обикновено в бинарен вид. Всеки модел компютър се нуждаел от различни команди за изпълняването на една и съща задача. По-късно са създадени езиците за програмиране, които позволяват на програмистите да представят всяка инструкция в текстов формат, като въвеждат абревиатури за всички операции, вместо да ползват числа и специфични адреси в символен формат. През 1954 г. е създаден FORTRAN – първият език на високо ниво. Това позволило на програмистите да извършват изчисленията директно чрез задаване на нужната формула. Изходният текстов код на програмата се превежда до машинни инструкции чрез специална програма, наречена компилатор. След това са създадени още много езици за програмиране (някои от тях с комерсиална цел) – като например COBOL. Програмите обаче все още се въвеждат с перфокарти или перфолента.

Към края на 60-те години устройствата за съхранение на данни и компютърните терминали се развиват достатъчно, за да стане възможно програмите да бъдат писани директно на клавиатурата. Създадени са текстови редактори, които позволяват на програмистите да въвеждат, редактират и обработват кода си много по-лесно, отколкото с перфокартите.

Програмирането в България 
Както програмирането в други страни, така и програмирането в България има своите основни характеристики. Например в САЩ се възприема, че програмирането основно се отнася до операционни системи като Уиндоус, софтуерни офис пакети и подобни, в България обикновено от 90-те насам се смята, че програмирането е в голяма част свързано с мрежовото програмиране, поради високото ниво на Интернет разрастването от 90-те, доброто качество от началото на хилядолетието и т.н. Разбира се, това не означава, че у нас не се програмира и стандартен софтуер, но много често, когато това е за вътрешни или външни компании, това са програмни продукти, свързани с работата за онлайн решения и платформи, които позволяват потребителя да може да прави по-сложно функциониращи неща онлайн.

Основи на програмирането през социализма в България 
Още преди въвеждането на персоналните компютри, в заводите и други социалистически предприятия има мейнфрейм компютри от вида цяла зала или стая, като се почне от ламповите, от ранния социализъм, се премине през работещите с перфокарти и принтери компютри (които не са персонални), които, както се разбира, са програмируеми и дори основно програмируеми, тъй като не много често работят с готов софтуер или програма.

Пред-модерно програмиране в България 
В България първите програмируеми компютри, използвани за програмиране, инсталиране на софтуер, тестване на софтуер и комуникация в мрежа, са тези в БАН (особено Институт по информатика) и в някои заводи, които са пряко свързани с него. Програмите най-често се стартират и пишат под DOS. Макар условията за програмиране в БАН да изглеждат на пръв поглед донякъде посредствени, именно БАН е основата за създаването на Интернет бума и този на персоналните компютри в България през 1993 г., като на базата на правеното в БАН се стартират нови производства на платки в частния сектор, сглобяване и производство на персонални компютри, и дайъл-ъп свързаност за тези компютри. В някои училища и университети в областта на математиката, които също са свързани с БАН, също се програмира под DOS или дори на BASIC, Pascal.

Програмиране на персонални компютри в България 
Стартирането на програмирането на PC-та започва основно след падането на Берлинската стена и вносът на такива компютри, както и на части от чужбина, което става доста сериозен „пазар“ не само в Източна Европа, но подтиква масовото разработване и пускане за масовите потребители на персонални компютри, които освен това биват свързани в мрежа, Интернет, и така става възможна глобалната мрежа, чрез този бум от началото на 90-те. С разрастването на мрежата, се разрастват и нуждите от уебпрограмиране, което е валидно и сега. Като разликата от началото на новото хилядолетие към днешните принципи в програмирането, е че тогава скоростта на мрежата е гарантирана и се набляга на графичния дизайн, като се работи върху скриптови езици, флаш, и други, които са ориентирани към потребителския вкус, докато сега, въпреки нарасналата мощност на персоналните компютри има сериозни проблеми с интернет трафика, което прави дизайна на множество сайтове „стандартен“, тъй като повечето решения са ориентирани към интернет проблемите, например за мобилния интернет, където липсва стандартизация.

Модерното програмиране 
Модерното програмиране и у нас, и в чужбина, включва възможността да се програмира не само върху PC, но и върху лаптопи и други мобилни устройства, макар че това е малко по-трудно при липсата на wide screen, но все пак дава възможност да се програмира навсякъде и по всяко време. Програмирането върху мобилно устройство задава разликата между мобилен потребител и мобилен програмист. По-сложна е ситуацията с мобилното системно администриране, но доколкото то засега работи основно с потребители, а не с програмисти, то неговият task не се е усложнил твърде много. Практиката е такава, че макар много удобни за стартиране на всякакъв вид софтуер Android телефоните, които са преимуществено налични у нас, не са достатъчно добре адаптирани за мобилно програмиране, за разлика от Macintosh Apple (както и в началото на PC програмирането също разликата между Macintosh и Intel компютри), като при Macintosh телефоните имат опции, включително програмиране с AI, да работят с процедурно програмиране, да работят във областта на функционалното програмиране и други (виж например basic за Android). Като цяло Macintosh Apple са programming enabled.

Характеристики за качество 
Характеристиките за качество на изходния софтуерен продукт са в голяма степен зависими не само от работата на софтуерния екип, но и от качеството на ползвания хардуер.

Все пак какъвто и да е пътят за разработване, програма предназначена за потребителя трябва да отговаря на някои характеристики и основни свойства. Следните свойства са сред най-важните:

 способност програмата и софтуера да се стартира, при стартиране да дава графичен потребителски интерфейс (GUI)
 Ползваемост (ергономичност) на програмата: колко лесно, или лекотата, с която човек може да използва програмата по нейното предназначение или в някои случаи дори за неочаквани за потребителя цели. Проблеми с ползваемостта могат да нарушат успешното ползване на програмата, независимо от другите проблеми. Ползваемостта включва широк спектър от текстови, графични и понякога хардуерни елементи, които подобряват яснотата, интуитивността, сплотеността и пълнотата на потребителския интерфейс на програмата.
 Издръжливост : колко добре дадена програма предотвратява проблеми, дължащи се на грешки, а не на бъгове. Това включва ситуации като неправилни, неподходящи или повредени данни, липса на необходимите ресурси като памет, услуги на операционната система и мрежови връзки, потребителска грешка и неочаквани прекъсвания на захранването.
Преносимост: обсега от компютърен хардуер и платформи на операционната система, на които изходният код на програмата може да бъде компилиран / интерпретиран и стартиран.
 Надеждност: колко често резултатите от дадена програма са верни. Това зависи от концептуалната коректност на алгоритмите и минимизирането на програмните грешки, като грешки в управлението на ресурсите (напр. препълване на буфер и условия на състезание ) и логически грешки (като грешки при деление на нула или грешка при едно )
Поддръжка: лекотата, с която дадена програма може да бъде модифицирана от нейните настоящи или бъдещи разработчици, за да се направят подобрения или да се персонализират, коригират грешки и дупки в сигурността или да се адаптира към нови среди. Добрите практики по време на първоначалната разработка са от значение в това отношение. Това качество може да не е пряко очевидно за крайния потребител, но може значително да повлияе на съдбата на програмата в дългосрочен план
Ефективност / производителност : Измерване на системните ресурси, които една програма консумира (време на процесора, място в паметта, бавни устройства като дискове, честотна лента на мрежата и до известна степен дори взаимодействие с потребителя): колкото по-малко, толкова по-добре. Това включва и внимателно управление на ресурсите, например почистване на временни файлове и елиминиране на течове в паметта. Това често се обсъжда в светлината на избрания език за програмиране. Въпреки че езикът със сигурност влияе върху производителността, дори и по-бавните езици, като Python, може да изпълняват програмите незабавно от човешка гледна точка. Скоростта, използването на ресурси и производителността са важни за програмите, които затрудняват системата, но ефективното използване на времето на програмиста също е важно и е свързано с разходите: повече хардуер може да бъде по-евтино.

Четимост на изходния код 
В компютърното програмиране четимостта се отнася до лекотата, с която човешкият четец може да разбере целта, контролния поток и работата на изходния код. Това засяга аспектите на качеството по-горе, включително преносимост, ползваемост и най-важното поддръжка.

Четимостта е важна, защото програмистите прекарват по-голямата част от времето си в четене, опитвайки се да разберат и модифицират съществуващ изходен код, вместо да пишат нов изходен код. Нечетливият код често води до грешки, неефективност и дублиран код. Проучване установи, че няколко прости трансформации на четливост правят кода по-кратък и драстично намаляват времето за разбирането му.

Следването на последователен стил на програмиране често помага за четливостта. Въпреки това, тя е нещо повече от стил на програмиране. Много фактори, които имат малко или нищо общо със способността на компютъра да компилира и изпълнява ефективно кода, допринасят за четливостта. Някои от тях са:

 Различни стилове на отстъп (бели места)
 Коментари
 Разлагане
 Конвенции за именуване на обекти (като променливи, класове, функции, процедури и т.н.)

Аспектите на презентация (като тире, нови редове, цвят Отбелязването и т.н.) често са разглеждани от изходния код редактор , но аспектите съдържание отразяват талант и умения на програмист.

Различни езици за визуално програмиране също са разработени с намерението да се разрешат проблемите с четливостта чрез приемане на нетрадиционни подходи към структурата и показването на кода. Интегрираните среди за разработка (IDE) имат за цел да интегрират цялата подобна помощ. Техники като рефакторинг на код могат да подобрят четливостта.

Построяване на алгоритъм 
Програмистката и софтуерно инженерна практика, както и научно и академично поле, и това на компютърното програмиране като по-ниско ниво програмиране, са до голяма степен свързани с изучаването на алгоритмите, на алгоритмичната теория, изучаване на съществуващите алгоритми, изучаване на алгоритмичните принципи, създаване на нови алгоритми, в някои случаи, ако това е възможно създаване на нови математически теории, на базата на които могат да се построят множество нови алгоритми, а при начинаещите откриването и прилагането на най-ефективните съществуващи алгоритми за даден клас проблеми.

Много често се говори за измервателна величина от типа сложност на алгоритъма, но в действителност при налична добра математическа теория се предполага, че един алгоритъм може да не е сложен за четене, сложна може да изглежда по-скоро математическата работа върху него. Тоест едно решение, дори това да е алгоритмично решение, дори да изглежда разбираемо, това не означава, че всеки програмист или потребител може самостоятелно да достигне до него, а че трябва съответно предимно да запамети готовият вид на алгоритъма или теоремата, върху която е базиран.

Все пак съществуват и сложни алгоритми, тяхната употреба се налага в някои случаи, макар че за леснотата на изпълнимост на алгоритъма, той трябва да е лесно четим и от компютъра, не само от самия програмист (разработчик).

Тук се говори за комплексност на алгоритъма (Algorithmic complexity), особено ако той борави и с по-горните методи, за разработване на нови математически решения, включване на сложни подалгоритми и т.н.

За тази цел алгоритмите се класифицират във видове и класове, която изразява използването на ресурси, като времето за изпълнение или необходимата памет, по отношение на размера на входа. Програмистите-експерти в тази област са запознати с разнообразието от добре установени алгоритми и тяхната съответна сложност и използват тези знания, за да изберат алгоритмите, най-подходящи за обстоятелствата.

Езици за програмиране 

Различните езици за програмиране поддържат различни стилове на програмиране (парадигма на програмиране). Тези парадигми са свързани с областите на приложение на писания програмен код и софтуерен продукт. Например езиците за програмиране на добър софтуер, включително на операционни системи са C и C++, те отговарят едновременно за добрата работа на програмите с процесора и харддиска, тоест възможността за запаметяване на потребителска входова информация върху диска, при добра работа и функциониране на процесора и на цялата система, тук се отнася и въпросът за съвместимостта, тоест някои програми се пишат специфично за някои системи, за да могат да работят най-добре върху тях. Друг възможен подход, при желание за бързо написване и възможност за портативност, тоест преносимост, на програмата, това е Java, този език позволява програмата да се стартира и като приложение и онлайн, но това не означава много бърза работа. Модерното програмиране по неясни причини разчита в много голяма степен на огромните възможности на съвременния хардуер до степен, че игнорира тези базови езици и пише портативни програми и приложения буквално на какво ли не, включително и операционни системи (особено при неучастието на Бил Гейтс), такива се пишат на php, на други скриптови и онлайн езици, на спесици от парадигми, и въобще непрофесионално програмиране, което разчита на работата на заводите по електроника в света. Това в много голяма степен се вижда и в Android мобилните системи, но го има и в мобилния Уиндоус, който борави с някои принципи за стабилност, но е силно е повлиян от тези тенденции на неглижирано писане на софтуер. За много програмисти, дори в големи компании, теми като програмни обекти остават неясни, макар че те са твърде ясни, също така въпреки огромните заявки Android всъщност не може да работи добре с AI, а тези при Уиндос са от повторителен характер (тоест нямат действителни характеристики на мислене), което по някаква причина се отразява и на Android. Например причината за недоброто качество и липсата на ефективна работа на най-новите Уиндоус платформи се дължи на прекомерната употреба на php, което иначе трябва да става на C или на C++, опциите за теглене на приложения от сайт на Майкрософт не обясняват, защо и останалото трябва да се пише в тромав стил (дори и да е на C, то е пренесен php код), нито как терминът „спагети код“, който преди обозначава най-неработещият код на Майкрософт сега трябва да се отнася за най-доброто от Майкрософт или най-доброто на софтуерния пазар (виж китайски спагети, noodles или Moodle, както и странните рекламни спагетни слогани и аспирации за включване в софтуерната област, и внос на имидж)

Според стила основните сред тях са: обектно ориентирано, императивно, функционално и декларативно. Според друг източник обектно ориентираното програмиране спада към императивния стил, а функционалното програмиране спада към декларативния:

 Императивни
 Процедурни
 Рефлективни
 Декларативни
 Функционални
 Логически
 Структурни
 Обектно ориентирани
 Функционални + Логически
 Хибридни (декларативни + императивни)
 Генетични

Според предназначението си езиците за програмиране биват с общо предназначение и специализирани. Популярни съвременни езици за програмиране с общо предназначение са C, C++, Java, C#, Object Pascal, PHP, Perl. Специализирани езици за програмиране са например SQL (за заявки към системи за управление на бази от данни), JavaScript (за реализиране на динамично поведение в уеб сайтове от страна на клиента) и т.н.

Избирането на език за програмиране е свързано с много съображения като например фирмена политика, оперативна съвместимост, наличност на библиотеки или лични предпочитания.

Източници

Литература 
 Дейкстра Э., Дисциплина программирования – 1-е изд. – Москва, 1978. – 275 с.
 Дональд Кнут., Искусство программирования, В четырёх томах, Москва, 2001 − 2013

Вижте също 

 Езици за програмиране
 Мобилно програмиране
 Парадигма на програмиране
 Софтуер
 Софтуерни метрики (изследвания на програмите)