видове програмиране

+14 гласа
4,924 прегледа
попитан 2016 август 13 от merdarla (220 точки)
Здравейте, може ли да изброите видовете програмиране(като функционално), и накратко да обясните същността им. Благодаря!

3 отговори

+3 гласа
отговорени 2016 октомври 22 от Павката (3,410 точки)
С уточнението, че класификациите са много и темата е прекалено голяма ще опитам да спомена най-често изпозваните в практиката видове.

Видове програмиране по отношение на моделирането:
=================================================
Има няколко големи типа програмни парадигми, които са най-често срещани:
Императивно програмиране:
Това са типовете, които повечето учим като въвеждащи в програмирането. Накратко означава, че програмиста предлага стъпки за изчисления. Най-голяма част от използваните езици са императивни: C, C++, Java, Python, Lua, Ruby, Pascal, JavaScript, C#, ...

Функционално програмиране:
Занимава се основно с функции и много малко със състояния. Функциите са написани напълно в релация с входящите параметри и без състояния или странични ефекти. Те се наричат чисти (pure) функции. За дадено множество от входящи параметри имаме един и същ резултат (не зависещ и не променящ се от състояния). Езици задължаващи да се ползва такъв тип програмиране са: Haskell, Clojure, F#, Scala. Всички императивни езици могат да бъдат използвани по функционален начин, но те не задължават такова използване.

Декларативно програмиране:
В този тип езици се представя крайното състояние или казано по друг начин какво искаме да се случи, но не и как искаме да се случи. Езиците от този тип работят след стартиране на програмата, за да решат как да се достигне търсеното състояние. Езици ползващи декларативно програмиране са Prolog и Erlang.

Обектно ориентирано програмиране:
Има няколко ООП стила, които могат да бъдат допълнително дискутирани. Класическия клас/инстанция стил в ООП често е рефериран като Симула стил. C, C++, Ruby, Java, ... поддържат този стил. Стила Smalltalk също използва класове и инстанции, но вместо извикване на техни методи използва изпращане на съобщения. Една от основните разлики е, че невалидните съобщения могат също да бъдат манипулирани. Език използващ тази парадигма е Objective-C. Стила "прототип" не различава класове от инстанции. Прототипните обекти са просто именувани стойности. Едно име може да реферира функция, метод или стойност и може да бъде клонирано от други обекти. Езици използващи този стил са Javascript, Io, Lua.

По-детайлни описания има за тези и други има тук:
https://en.wikipedia.org/wiki/Programming_paradigm

Видове програмиране по отношение на продукта:
=============================================
Две гледни точки има тук:
http://hyperiondev.com/hub/software-development/10-different-types-software-development/
https://jamesmccaffrey.wordpress.com/2006/04/24/the-7-types-of-software-development/

Видове програмиране по отношение на клиента:
============================================
Системно програмиране - извършва се дейност свързана с поддръжка и разработване на драйвери, модификации на части от ОС, код подпомагащ достъп до периферия, виртуализация, сигурност, конфигуриране на стартирането, спирането и други важни състояния за системата
Разработване на фронт-енд - използват се умения за дизайн и разработване на потребителски интерфейс, компютърна графика, често употребявани контроли.
Разработване и поддръжка на бази данни - използване и конфигуриране на бази от данни, работа по сигурността.
Разработване на бек-енд компоненти - възможно е да ползва програмиране за бази данни, сигурност, конкурентно или разпределено програмиране, в някои случаи сигурност и познания по мрежи. Рядко се налага да работи с графични и други потребителски интерфейси.
Разработване на системи свързани с качеството - занимава се с валидация, проверка на процеси, съответстсвие с клиентски спецификации, автоматизация.
+1 глас
отговорени 2016 август 29 от Daniel Ivanov (11,160 точки)

Здравей,

Щях да ти отговоря още преди 2 седмици, но не бях в града,а никой от колегите не го е погледнал.

Добър въпрос бих казал, понеже ако се отговори на него, би се улеснило ученето по QA-ство на хората, които имат желание и интерес (както се вижда от въпросите напоследък) и някак си по-прибрано и организирано би изглеждало. Малко ще се застъпват нещата с преден въпрос.  Но да започваме класификацията:

1.Чрез познаване вътрешността (internal-ите) на софтуера:

- Black box testing;

- White box testing;

- Grey box testing.

2.По обект на тестването:

-Функционално тестване – ще обясня по-долу какво представлява;

-UI testing от User Interface (тестване на потребителския интерфейс);

-Usability testing (букв. тестване за ползваемост) – проверява дали софтуера е user-friendly или дали е лесен за използване от потребителя;

-Internalization & Localization testing (тестване на локализацията като например дали превода е верен или дали графичния интефейс отговаря на съответния пазар);

-Load/performance testing – при този вид тестване се проверява как софтуера се държи от гледна точка на това дали е стабилен при натоварване;

-Security testing – тестване на сигурността;

-Compatibility testing – дали софтуера е съвместим с хардуера, операционната система, с друг софтуер или с базата от данни.

3.По време на изпълнение:

-Преди всякакъв релийз (Алфа тестинг);

-След бета релийз (Бета тестинг);

Ще обясним какво е и релийз – това е публикацията или изкарването на финална версия на едно приложение. Софтуерният релийз може да бъде публичен или частен (public/private) и обикновено дава основата на нова или ъпгрейдната версия.

4.По позитивност:

-Позитивно тестване;

-Негативно тестване;

5.По степен на изолация на тестваните компоненти:

-Компонентно тестване – прави се след unit testing-а и тук влиза и друг въпрос от преди – за stub-овете и driver-ите;

-Интеграционно тестване;

-Системно тестване;

6.По степен на автоматизация:

-Ръчно (Manual);

-Полу-автоматизирано (Semi-Automated) – средно между ръчно и автоматизирано, както grey-box тестингът е между white & black. Обикновено се ползва, когато части от приложението не са достатъчно стабилни за автоматизация;

-Автоматизирано тестване (Automated).

7.По готовност:

-Формално/Документирано тестване;

-Ad hoc testing или на бълг. специално тестване.

0 гласа
отговорени 2016 август 29 от Daniel Ivanov (11,160 точки)

Функционално и нефункционално тестване:

Функционално тестване:

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

-Инсталацията на приложението върху локализирани машини с готови операционни системи;

-Входящия текст (text input-а);

-String handling-а, текста, информацията, най-вече с non-Unicode приложения. (Unicode символите искат повече байтове за съхраняване на данни в базата от данни);

-Регионалните настройки по подразбиране;

-Text handling – copy-paste-ване, редактиране, специалните шрифтове и скритпове, които не са на латински;

-Дали са адекватни и неповторими hot-key shortcut-овете.

Нефункционално тестване:

При него се тестват качествените характеристики на компонента или системата. Нефункцоналното тестване проверява как цялостно системата/компонента оперира, а не отделните/специфичните функции. Включва следните тестове:

Reliability testing (Тестване за надежност);

Usability testing;

 Efficiency testing (тест за ефикасност – дали върши възмножно най-много работа за възм. най-кратко време);

 Maintainability testing (дали системата е лесна за поддържане);

Portability testing (дали лесно се импортира от едно устройство на друго или оп.система или т.н.среда- environment);

 Baseline testing(при него се валидират документациите и спецификациите);

 Compliance testing (по времето на този тест се вижда дали отговаря на IT стандартите, предначертани от самата компания);

Documentation testing (Там са тест кейсовете, тест репортите, спецификациите, тоест проверява се документацията);

Endurance testing (проверява се издържливостта на системата като се натоварва за дълъг период от време);

Load testing (да се види как върви програмата при минимално и при голямо натоварване с цел проверяване на максималния капацитет, проверка за bottlenecks и др);

Performance testing (Разликата е,чеможе да се сравнят 2 системи с цел да се провери коя е по-бърза от другата и защо, при натоварване може да се открие в коя част от системата има проблем);

Compatibility testing;

 Security testing;

Scalability testing (Фокусирано е върху произодителността на уеб сайтовете, хадруерните и софтуерните продукти, както и върху вътрешните приложения от минимално до максимално натоварване и дали биха могли да вършат повече работа при по-голямо натоваране, ако им се добави още ресурс – още хардуер като RAM, CPU...);

Volume testing;

Stress testing;

Recovery testing (колко бързо се възстановява системата след проблеми – спиране на ток, смяна на хардуер и др.);

Internalization & Localization testing.

Нещата изглеждат много сходни, но има тънка граница между тях:

Volume testing (тестване на обема) – при него има много данни (data);

Load testing (тестване на товара) – при него има много потребители;

Stress test – при него има прекалено много потребители, данни и малко капацитет.

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

коментиран 2016 август 30 от merdarla (220 точки)
Благодаря за усилията, но въпросът ми изобщо не е за тестинг, а за програмиране... Видове програмиране.
...