Основные этапы программирования
Программирование — это процесс разработки(создания, проектирования) компьютерной программы, как комбинации компьютерных инструкций и данных, позволяющей аппаратному обеспечению вычислительной системы выполнять вычисления или функции управления (стандарт ISO/IEC/IEEE 24765:2010). В этом процессе деятельности человека(программиста) наблюдаются некоторые закономерности, которые отражаются в таких понятиях, как виды и парадигмы программирования.
Но прежде чем давать характеристику видам и парадигмам программирования, рассмотрим более подробно сам процесс создания программы.
С одной стороны программирование это творческий процесс, требующий на основе знаний о методах решения поставленной задачи проявить смекалку в их выборе или разработке нового метода и алгоритма, а с другой стороны программирование это инженерное дело, то есть ремесло, в котором очень важен практический опыт и умение грамотно составить код программы, так чтобы затраты и результат были хотя бы сопоставимы.
Программирование это достаточно сложный процесс, включающий в себя следующие основные этапы:
- постановка задачи и ее формализация;
- выбор или разработку алгоритма решения поставленной задачи;
- кодирование алгоритма на выбранном языке программирования;
- отладка(тестирование) созданной программы в нормальных условиях и в критических ситуациях.
Основные виды программирования
Виды программирования определяют прикладную особенность процесса программирования, содержательная особенность этого процесса характеризуется парадигмой программирования.
В зависимости от предмета приложения различают следующие виды программирования:
- системное программирование, связанное с разработкой операционных систем(драйверов), систем разработки программного обеспечения(компиляторов, отладчиков и т.п.);
- сетевое программирование это процесс создание программных систем, которые будут работать в существующей локальной, корпоративной или глобальной сети;
- прикладное программирование — процесс создание программных продуктов, предназначенных для решения прикладных задач бизнеса, IТ- технологии и т.п.;
- Web-программирование — написание кода на специальных “скриптовых языках” для использования в веб-браузерах или на Web-серверах, предназначенного для создание страниц сайтов, блогов и т.п.;
- мобильное программирование — написание кода на специальных языках для мобильных приложений, под мобильные операционные системы и платформы.
Основные парадигмы программирования
Кроме вида программирования процесс создания программы характеризуется и таким понятие как парадигмы программирования. В общем случае с философской точки зрения парадигма это устоявшаяся система научных взглядов, в рамках которой ведутся исследования (Т. Кун).
В данном случае парадигма отражает систему взглядов на форму(структуру) и содержание процесса программирования. К сожалению, в обиходе наблюдается несколько различных определений парадигмы программирования, которые не всегда точно соответствуют ее научному понятию.
Вот некоторые из них:
- Парадигма программирования — это совокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию).
- Парадигма программирования это способ концептуализации, определяющий организацию вычислений и структурирование работы, выполняемой компьютером.
- Парадигмы программирования — это способ классификации языков программирования на основе их особенностей.
С другими вариантами,не менее экзотических определений, можно познакомиться в статье «Парадигма программирования«.
В этих определениях парадигма программирования, стиль(приемы) программирования, концепция организации вычислений и классификация языков программирования являются синонимами. На наш взгляд это не верно. Это разные вещи. Каждое из этих понятий важно для программирования и заслуживает особого внимания, но в данной статье о них речь не идет.
Ближе всего к научному понятию парадигмы находится определение. Парадигма программирования – это совокупность принципов, методов и понятий, определяющих способ конструирования программ.
Парадигма программирования, как набор принципов и методик по созданию кода программы, ее структуризации, позволяют не только упорядочить процесс ее создания, но и сделать программу структурированной, удобной и понятной другим программистам, работающим в той же парадигме. Именно парадигмы программирования определяют: правила написания, структуру(архитектуру) программы, используемые шаблоны паттерны) и другие свойства и качества проектируемой программы.
Для определения вида и формализации понятия парадигмы программирования необходимо определиться с принципом, лежащим в ее основе. Приведенные выше определения парадигмы программирования как раз и не корректны, что в их основе лежат не корректно выбранные принципы. В качестве такого принципа следует брать принцип декомпозиции(разделения на части) решаемой с помощью создаваемой программой задачи. Тогда в зависимости от использования принципа декомпозиции можно выделить следующие парадигмы программирования:
парадигма императивного программирования — декомпозиции нет, в исходном коде программы записываются инструкции (команды), которые должны выполняться последовательно, а переходы осуществляются с помощью оператора go to, используемые данные могут читаться из памяти и записываться в память;
парадигма структурного программирования, в соответствии с которой любая программа, которая строится без использования оператора go to, а состоит из совокупности трёх базовых управляющих конструкций, реализующих три базовых алгоритмические структуры; последовательность, ветвление, при этом разработка программы ведётся пошагово, методом «сверху вниз».
парадигма процедурного программирования, в рамках которой применяется принцип декомпозиции решаемой задачи на отдельные функции, реализуемые программно в виде процедур, в результате создается программа, представляющая собой совокупность взаимодействующих процедур(функций);
парадигма объектно-ориетированного программирования, когда выполняется декомпозиция решаемой задач(предметной области) на объекты, а программа представляется в виде совокупности взаимодействующих объектов, созданных на основе предопределенных типов данных — классов;
аспектно-ориентированное, когда в программе реализуется так называемая сквозная функциональность, предназначенная для решения специальных задач с точки зрения определенных аспектов.
парадигма декларативного программирования, в которой используется принцип спецификации решения поставленных задач, когда программист описывает проблему, а также то, какой результат хочется получить на выходе, а алгоритм решения задачи не имеет четкого определения.
Примечание. Термин парадигма структурного программирования не является корректным. Потому что и процедурное и объектно ориентированное программирования является структурным. Это понятие было введено Эдсгером Дейкстрой и на тот момент было вполне корректным, поэтому изменять его не будем.
Другие виды парадигмы программирования, которых сегодня достаточно много, в данной статье рассматривать не будем. Остановимся на перечислении. Основные виды или парадигмы программирования: процедурное, операторное, функциональное, логическое, структурное (модульное), объектно-ориентированное,графическое, экстремальное, декларативное; логическое и др.
Иногда можно встретить, что существу. парадигма модульного программирования. Но это не верно. Модульное программирование это не парадигма, а способ организации структуры программы в виде взаимодействующих модулей, в каждый из которых можно разместить блоки управляющих конструкций, процедуры, объекты и т.п.
Аналогично компонентное программирование тоже не парадигма программирования, потому что в компонентах также могут размещаться блоки управляющих конструкций, процедуры, объекты и т.п. м это никак не связано с принципом декомпозиции.
Основные языки программирования
Программы это алгоритмы и структуры данных, как сказал один из основателей языков программирования Никлаус Вирт, реализованные на определенном языке программирования.Язык программирования это совокупность алфавита(набора допустимых символов), синтаксиса(набора правил) и семантики(смыслового содержания).
Основными видами современных языков программирования являются:
- языки типа ассемблера — используются при низкоуровневом программировании;
- алгоритмические – используются при сетевом и прикладном программировании;
- скриптовые — для создания Web-приложений;
- мобильные, предназначенные для кодирования приложений, используемых в мобильных устройствах.
Интересная, но не бесспорная статья «Что такое программирование и кто такие программисты«, в которой дается определение программирования, анализируется профессия программиста и, в частности, указывается, что к наиболее распространенным языкам программирования можно отнести следующие:
- Python — язык общего назначения, который используется в большинстве IT-компаний мира;
- Java — серверный язык, который используется для веб-разработки и создания приложений для мобильных устройств;
- C — с его помощью пишут драйвера, ядра для ОС, библиотеки для других языков программирования;
- C++ — он нужен для создания большинства программ и игр для ПК;
- C# — используется для создания программ на Windows и компьютерных игр;
- JavaScript — предназначен для создания сайтов и отвечает за правильное поведение элементов на веб-странице;
- PHP — нужен для создания программ, которые работают на сервере и обрабатывают клиентские запросы;
- Ruby — используется в системном администрировании, веб-разработке, работе операционных систем Linux и MacOS;
- SQL — язык для создания и администрирования баз данных;
- Go — язык общего назначения
Сегодня на практике наиболее распространенными являются алгоритмические языки программирования Python, С, С++, C#, Pascal и Java, а также скриптовые языки JavaScript и РНР.
Всего языков программирования много, некоторые говорят около 200. Причем постоянно появляются все новые и новые. Так совсем недавно вышел в свет новый объектно-ориентированный язык программирования общего назначения Crystal, спроектированный и разработанный Арье Боренцвейгом, Хуаном Вайнерманом и Брайаном Кардиффом аргентинской компании Manas Technology Solutions.
Какими навыками надо владеть программисту
Программы это алгоритмы и структуры данных, которые должен хорошо знать программист и уметь ими пользоваться. Нельзя программирование сводить только к кодированию программы. Кодеровщик и программист кардинально отличаются друг от друга. Отличие между «кодеровщиком» и «программистом» похоже на различие между наукой и псевдонаукой, скажем алхимией и химией. Разница между программистом и кодеровщиком довольно простая: задача кодеровщика — написать код, задача программиста — создать программу и это не одно и то же.
В программировании нужно мыслить своеобразно: строить алгоритмы, мыслить аналитически и структурировано. Фраза Никлауса Вирта о том, что «программы это алгоритмы и структуры данных» не просто фраза, а концепция программирования. Очень важно любить математику и уметь с ней работать. Если таковы качества есть, то можно приступать.
Во-первых, надо хорошо разобраться с компьютером, его устройством в целом и взаимодействием отдельных частей-процессора, всех видов памяти от регистровой до дисковой, Одним словом необходимо глубокое понимание архитектуры программной среды
Для профессионального программиста не должно быть так, что выделение памяти — магия, сборка мусора — ещё большая магия, как хранятся и обрабатываются данные в используемых библиотеках — его не просто не интересует, он даже не догадывается, что ему может быть полезно этим поинтересоваться.
Во-вторых, надо выйти на уровень понимания работы операционной системы с программой (задачей). Совершенно необходимо знать что такое процесс, системные вызовы и т.п. Одним словом надо понимать, как программный код взаимодействует с компьютерной системой.
В — третьих, для программирования необходимо владеть одним или несколькими языками программирования, надо правильно выбрать и хорошо изучить синтаксис и семантику одного из языков программирования. Опыт показывает, что профессиональному программисту одним языком не обойтись. Значит надо хорошо продумать стратегию их изучения. Простейшая — от простого к сложному. Но никогда не забывайте про язык assembler, на нем обязательно нужно уметь писать программы, особенно для интеловских процессоров, чтобы лучше понять структуру программы и ее расположение в памяти компьютера и т.п.
В-четвертых, нужно не только мыслить алгоритмически, но и знать хотя бы простейшие алгоритмы, например, сортировки, поиска максимума и другие. В будущем следует освоить методику изучения алгоритмов и их разработки.
В-пятых, язык и алгоритмы это хорошо, но за ними всегда стоит платформа исполнения программы и область применения. Поэтому выбирать и изучать нужно не только язык, но и платформу. При этом следует различать платформу, как среду разработки программ, и платформу, как среду выполнения программ. Да, в начале пути лучше выбрать ту платформу и область применения, в которой быстрее можно получить результат. Но в конечном итоге от платформы многое зависит. Особенно от платформы, как среды выполнения программы.
Это очень краткое, конспективное изложения того, что надо знать и уметь программисту. Но его достаточно, чтобы начать. Со временем сама жизнь покажет, что надо знать и уметь. Главное надо уметь учиться быстро и глубоко. К сожалению программистом может быть не каждый, но программировать может любой.
Что такое процедурное программирование?
В основе процедурного, операторного и функционального типов программирования лежат процедуры, операторы и функции, используемые как основные объекты языка.
Что такое процедурное программирование? Процедурное или, как его называют структурное, императивное, программирование на алгоритмическом языке базируется на таких понятиях как процедура и функция. Под процедурой или функцией понимаются обособленные фрагменты кода, позволяющие группировать его так, чтобы иметь возможность вызывать их(фрагментов) многократно по присвоенным ранее им именам в любой части программы. Структурно процедура и функция различаются друг от друга.
В соответствие с методологией процедурного(структурного) программирования на алгоритмическом языке, любая программа представляется как совокупность взаимодействующих процедур и функций. Формирование процедур и функций осуществляется на основе применения принципа декомпозиции — разделения общей, как правило, большой задачи на отдельные части(маленькие подзадачи) по функциональному признаку. Тогда каждая отдельная процедура или функция будет реализовывать(выполнять) конкретную задачу(подзадачу,функцию).
Процедурное программирование, как правило, оперирует с простыми алгоритмами и структурами данных, так называемыми примитивными или базовыми алгоритмическими структурами. Эти структуры данных в языках программирования описываются простыми (базовыми) типами. К таким типам относятся: числовые, битовые, логические, символьные, строковыми, перечисляемые, интервальные, а также массивами простых типов данных.
В различных языках программирования набор простых типов данных может несколько отличаться от указанного. Кроме того, размер памяти, необходимый для данных того или иного типа, может быть разным не только в разных языках программирования, но и в разных реализациях одного и того же языка, а также зависит от вида среды выполнения программы и типа процессора.
Для грамотного применения процедур и функций при построении программы необходимо хорошо знать способы:
- объявления процедур и функций в данном алгоритмическом языке;
- объявления формальных и способы передачи фактических аргументов в процедуры и функции;
- возврата значений — результатов выполнения процедуры и функции.
В серии статей данного сайта показано как это делать на алгоритмическом языке программирования Crystal. В других языках программирования имеются свои особенности. Они легко изучаются и усваиваются при изучении языка программирования.
Для применения процедурного программирования достаточно хорошо знать как программно реализуются базовые алгоритмические структуры. Ибо любая программа в этом случае представляет собой совокупность программных реализаций базовых алгоритмических структур.
Что такое объектно-ориетированное программирование?
Использование простых структур(типов) данных и процедурного программирования при обработке сложных структур данных крайне не рационально. Поэтому при обработке сложных(структурированных) типов данных необходимо использование объектно-ориентированного(объектного) программирования. Что же такое объектно-ориентированное программирование? Каковы алгоритмы и структуры данных в этом случае примеряются в программах.
Объектно-ориентированное программирование ( ООП ) — это парадигма программирования, основанная на концепции «объектов», которые могут содержать данные и код: данные в форме полей, часто называемые атрибутами или свойствами, и код в форме процедур или функций, как правило, называемые методами.
Программа в объектном программировании представляется как совокупность взаимодействующих объектов. Для представления объектов в данном виде программирования используются специальные пользовательские типы данных — классы, которые являются образцами или шаблонами для создания объектов – экземпляров классов.
Объектное программирование характеризуется еще также тем, что в его программах реализуются три принципа:
- Инкапсуляция(сокрытие данных и методов), которая связывает воедино данные и методы, манипулируюшие данными, и защищает их как от внешнего вмешательства, так и от неправильного использования пользователями программ;
- Наследование- это возможность создания новых классов (подклассов, производных классов) из существующих базовых классов, с последующим формированием их в иерархию классов;
- Полиморфизм, который позволяет использовать одно и то же имя для решения двух или более схожих, но технически разных задач.
Единицей инкапсуляции, наследования и полиморфизма является класс. Класс представляет сложные структуры данных(объекты), часто совпадающие с реальными объектами(человек, дом, дерево и т.п.). Для создания объектных программ необходимо научиться манипулировать такими структурами данных. Иногда для этого требуется преодолеть специальный психологический барьер в мышлении. Пример ООП на языке Crystal можно посмотреть в статье.
Другой вариант объектно-ориентированного программирования на языке Паскаль при создании оконного приложения рассматривается в статье.
Что такое аспектно-ориентированное программирование
Традиционные парадигмы процедурного и объектно-ориентированного программирования используют при проектировании программы функциональную или объектную декомпозицию задачи и не позволяют локализовать, так называемую сквозную функциональность в отдельных модулях.
Функциональность называется сквозной (scattered — разбросанный, tangled — переплетённый), погтому что её реализация распределена по различным модулям программы. Типичными примерами сквозной функциональности являются: ведение лога(журнала), обработка исключений, трассировка, аутентификация и проверка прав доступа, оценка производительности информационной системы и т.п. На помощь приходит аспектно-ориентированный подход.
Аспектно-ориентированноепрограмми́рование (АОП) — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. Аспектно-ориентированный подход рассматривает программную систему как набор модулей, каждый из которых отражает определенный аспект — цель, особенность функционирования системы.
Все языки АОП предоставляют средства для выделения сквозной функциональности в отдельную сущность.
Основные понятия АОП:
- Аспект — модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом.
- Совет — средство оформления кода, которое должно быть вызвано из точки соединения. Совет может быть выполнен до, после или вместо точки соединения.
- Точка соединения — точка в выполняемой программе, где следует применить совет. Многие реализации АОП позволяют использовать вызовы методов и обращения к полям объекта в качестве точек соединения.
- Срез — набор точек соединения. Срез определяет, подходит ли данная точка соединения к данному совету. Самые удобные реализации АОП используют для определения срезов синтаксис основного языка (например, в AspectJ применяются Java-сигнатуры) и допускают их повторное использование с помощью переименования и комбинирования.
- Внедрение — изменение структуры класса и/или изменение иерархии наследования для добавления функциональности аспекта в инородный код. Обычно реализуется с помощью некоторого метаобъектного протокола.
АОП можно поддерживать в рамках уже существующих языков. Так, в частности, исследовательский центр Xerox PARC разработал систему AspectJ, поддерживающую АОП в рамках языка Java.
Заключение
Программирование это процесс создания программы, представляющей собой совокупность алгоритмов и структур данных в ней обрабатывающих по соответствующим правилам и для достижения поставленной цели, связанной, как правило, с улучшением или повышением эффективности бизнес-процессов.
Парадигмы программирования это набор принципов и методик написания кода программы на основе алгоритмов обработки структур данных.
Виды программирования определяют прикладную особенность процесса программирования. В различных видах программирования используются различные алгоритмы и структуры данных.
Наиболее востребованными являются профессионалы по разработке прикладных программных продуктов на языках Python, С++, C# и Java, а также специалисты в области web — программирования на языках JavaScript, РНР и том же Python, растет потребность и в таких относительно новых направлениях как обработка больших данных(Big Data), машинное обучение и искусственный интеллект.
В перспективе программисту следует совершенствовать свои навыки и достичь такого уровня, что кроме языка программирования выбирать и эффективно использовать платформу программирования (среду выполнения программ, библиотеку и т.п.).
Смотрите также…
- Онлайн школы и курсы IT профессий
- Как стать программистом?
- Как стать Web программистом?
- Как изучать алгоритмы решения задач?
- Как изучать простые типы данных языка программирования?
- Курсы и высшее образование в профессии программиста