Понятие программирования. Реферат: Понятие о программировании

Теоретический раздел любой науки базируется на математических методах исследования. Это относится и к информатике. Она использует методы математики для построения и изучения моделей обработки, передачи и использования информации, создаёт тот теоретический фундамент, на котором строится всё здание информатики.

По своей природе информация дискретна и представляется обычно в символьно-цифровом виде в текстах и точечном виде на рисунках. С учётом этого в информатике широко используется математическая логика как раздел дискретной математики. Следующее направление теоретической информатики - вычислительная математика , которая разрабатывает методы решения задач на компьютерах с использованием алгоритмов и программ.

Подраздел теория информации (а также теория кодирования и передачи информации) изучает информацию в виде абстрактного объекта, лишённого конкретного содержания. Здесь исследуются общие свойства информации и законы, управляющие её рождением, развитием и уничтожением. Здесь же изучаются те формы, в которые может отобразиться содержание любой конкретной элементарной единицы информации.

Системный анализ - еще одно направление теоретической информатики. В нём изучается структура реальных объектов, явлений, процессов и определяются способы их формализованного описания через информационные модели. Имитационное моделирование - один из важнейших методов компьютерного моделирования, в котором воспроизводятся процессы и явления, протекающие в реальных объектах.

Наконец, теория принятия решений изучает общие схемы выбора нужного решения из множества альтернативных возможностей. Такой выбор часто происходит в условиях конфликта или противоборства. Модели такого типа изучаются в теории игр. Рисунок 1 Условное изображение структуры информатики в виде карты:

Искусственный интеллект

Это направление информатики - самое молодое, возникшее в середине 70-х годов. Однако именно искусственный интеллект определяет стратегические направления развития информатики. Искусственный интеллект тесно связан с теоретической информатикой , откуда он заимствовал многие модели и методы, например, использование логических средств для преобразования знаний. Столь же прочны связи этого направления с кибернетикой. Математическая и прикладная лингвистика, нейрокибернетика и гомеостатика теснейшим образом связаны с развитием искусственного интеллекта . И конечно, работы в этой области немыслимы без развития систем программирования (рис. 1).

Рис. 1

Основная цель работ в области искусственного интеллекта - стремление проникнуть в тайны творческой деятельности людей, их способности к овладению знаниями, навыками и умениями. Для этого необходимо раскрыть те глубинные механизмы, с помощью которых человек способен научиться практически любому виду деятельности. И если суть этих механизмов будет разгадана, то есть надежда реализовать их подобие в искусственных системах, т.е. сделать их по-настоящему интеллектуальными. Такая цель исследований в области искусственного интеллекта тесно связывает их с достижениями психологии - науки, одной из задач которой является изучение интеллекта человека. В психологии сейчас активно развивается особое направление - когнитивная психология , исследования в котором направлены на раскрытие закономерностей и механизмов, связанных с процессами познавательной деятельности человека и которые интересуют специалистов в области искусственного интеллекта.

Другое направление психологии - психолингвистика также интересует специалистов в области искусственного интеллекта. Её результаты касаются моделирования общения не только с помощью естественного языка, но и с использованием иных средств: жестов, мимики, интонации и т.п.

Кроме теоретических исследований активно развиваются и прикладные аспекты искусственного интеллекта. Например, робототехника занимается созданием технических систем, которые способны действовать в реальной среде и частично или полностью заменить человека в некоторых сферах его интеллектуальной и производственной деятельности. Такие системы получили название роботов.

Экспертная система - еще одно прикладное направление искусственного интеллекта. В отличие от других интеллектуальных систем, экспертная система имеет три главные особенности: 1 - она адаптирована для любого пользователя, 2 - она позволяет получать не только новые знания, но и профессиональные умения и навыки, связанные с данными знаниями, т.е. не только даёт знать что..., но и знать как..., 3 - она передаёт не только знания, но и пояснения и разъяснения, т.е. обладает обучающей функцией.

Программирование

Программирование как научное направление возникло с появлением вычислительных машин и только программное обеспечение определяет эффективность использования ЭВМ. В настоящее время это достаточно продвинутое направление информатики. В этой области работает значительный отряд специалистов, которые подразделяются на системных и прикладных программистов.

Системные программисты являются, как правило, специалистами очень высокого уровня и разрабатывают системное программное обеспечение , которое включает в себя операционные системы, языки программирования и трансляторы. Операционные системы обеспечивают функционирование вычислительной техники и предоставляют пользователю комфортные условия взаимодействия с компьютером.

Языки программирования создаются для разработки прикладного программного обеспечения. Эти языки относятся к языкам высокого уровня, мнемоника и семантика которых близка к естественному языку общения людей.

Есть ещё машинные языки, которые используются непосредственно в ЭВМ и которые состоят из последовательности машинных команд, закодированных в микропроцессорах. Для преобразования программ, написанных на языке высокого уровня в программы на машинном языке используются специальные программы - трансляторы , которые также создаются системными программистами.

Прикладное или проблемно-ориентированное программирование ориентировано на разработку пользовательских программ для решения тех или иных задач в различных областях науки, техники, производства. Например, в образовании используются пакеты педагогических программных средств (ППС) , в которые включаются обучающие и контролирующие программные средства в определённой предметной области.

Прикладная информатика

Достижения современной информатики широко используются в различных областях человеческой деятельности: в научных исследованиях (АСНИ - автоматизированные системы для научных исследований), в разработке новых изделий (САПР - системы автоматизированного проектирования), в информационных системах (АИС - автоматизированные информационные системы), в управлении (АСУ - автоматические системы управления), в обучении (АОС - автоматизированные обучающие системы) и др.

План лекции:

1.1.Понятие «язык программирования»

1.2.Компиляторы и интерпретаторы

1.3.Системы программирования

1.4.Классификация и обзор языков программирования

1.5.Объектно-ориентированное программирование (ООП)

1.6.Этапы подготовки и решения задач на компьютере

Компьютерная программа представляет собой логически упорядоченную последовательность команд, предназначен­ных для управления компьютером. Процессор компьютера исполняет программы, написанные на машинным кодом. Писать программы в машинных кодах вручную очень сложно, причем с ростом размера программы эта задача усложняется. В компьютерах первого поколения использовались программы, написанные в ма­шинных кодах, причем для каждого компьютера существовал свой собственный машинный код. В тот период (начало 50-х гг.) средства програм­мирования и программное обеспечение только зарождались и были еще не развиты. Для того чтобы сделать программу читабельной и иметь возможность следить за ее смысловой структурой, разработали символический язык ассемблер, близкий к машинному (конец 50-х – начало 60-х гг.), в котором появилось понятие переменной. Ассемб­лер стал первым полноценным языком программирования. Благода­ря этому заметно уменьшилось время разработки и возросла надеж­ность программ. Для записи кодов операций и обрабатываемой информации в ассемблере используются стандартные обозначения, позволяющие записывать числа и текст в общепринятом виде, для кодов команд приняты мнемонические обозначения, например MOV AX, BX (переместить машинное слово из регистра AX в регистр BX), ADD AX, CX (сложить регистр AX c CX), JMP loop1 (безусловный переход не метку loop1) и др. Для обозначе­ния величин, размещаемых в памяти, можно применять имена констант. После ввода программы ассемблер сам заменяет символические имена на адреса памяти, а символические коды команд на числовые. Исполь­зование ассемблера сделало процесс программирование более нагляд­ным. Дальнейшее развитие этой идеи привело к созданию языков программирования высокого уровня, в которых длинные и сложные последовательности машинных кодов были заменены одним един­ственным обозначающим их словом – операторы.

    1. Понятие «язык программирования»

Сегодня практически все программы создаются с помощью язы­ков программирования. Теоретически программу можно написать и на естественном языке (говорят: программирование на метаязыке), но из-за неоднозначности естественного языка автоматически пере­вести такую программу в машинный код пока невозможно.

Языки программирования - это формальные искусственные язы­ки. В отличие от естественных, язык программирования имеет ограниченный запас слов (операторов) и строгие правила их написания, а правила грам­матики и семантики, как и для любого формального языка, явно однозначно и четко сформулированы.

Языки программирования, ориентированные на команды про­цессора и учитывающие его особенности, называют языками низко­го уровня . «Низкий уровень» не означает неразвитый, имеется в виду, что операторы этого языка близки к машинному коду и ориентиро­ваны на конкретные команды процессора.

Языком самого низкого уровня является ассемблер. Программа, написанная на нем, представляет последовательность команд машин­ных кодов, но записанных с помощью символьных мнемоник. С по­мощью языков низкого уровня создаются компактные оптимальные по быстродействию программы. Например, драйверы устройств, модули стыковки с нестандартным оборудованием, когда важнее компактность, быстро­действие, прямой доступ к аппаратным ресурсам.

Языки программирования, имитирующие естественные, обладающие укрупненными командами, ориентированные отдельные прикладные области обработки информации, называют языками высокого уровня. Чем выше уровень языка, тем ближе структуры данных и конструкции, использующиеся в програм­ме, к понятиям исходной задачи. Особенности конкретных компь­ютерных архитектур в них не учитываются, поэтому исходные тек­сты программ легко переносимы на другие платформы, имеющие трансляторы этого языка. Разрабатывать программы на языках вы­сокого уровня с помощью понятных и мощных команд значительно проще, число ошибок, допускаемых в процессе программирования, намного меньше. В настоящее время насчитывается несколько сотен таких языков (без учета их диалектов).

Таким образом, языки программирования высокого уровня, ори­ентированные на решение больших содержательных прикладных за­дач, являются аппаратно-независимыми и требуют использования соответствующих программ-переводчиков для преобразования текста программы в машинный код, который в итоге и обрабатывается про­цессором.

В период появления первых компьютерных систем остро встал вопрос того, как «научить» машину воспринимать указываемые к исполнению задачи человеком. Тут и появился термин «компьютерное программирование». Сегодня многие пользователи, не знакомые с основами и тонкостями этих процессов, считают, что это что-то из области фантастики, недоступное рядовому обывателю. Однако при желании можно освоить программирование и самому. Но не будем забегать вперед и разложим все, как говорится, по полочкам.

Что такое программирование в общем понимании?

Если посмотреть на основные трактовки данного термина, нетрудно сделать простейший вывод. Что такое программирование? Это написание программ.

Тут же возникает вопрос того, что же такое программа. Программа или приложение - это, грубо говоря, набор специализированных команд, инструкций, директив или исполняемых сценариев, которые подлежат исполнению машиной, причем на уровне и «железных» устройств, и других задействованных средств.

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

Немного истории

Говоря о том, что такое программирование в современной трактовке, стоит обратить свой взгляд на историю его возникновения. По сути, автоматизированное выполнение каких-то определенных действий, например, в области математических вычислений, известно человечеству достаточно давно.

Вспомнить хотя бы Древнюю Грецию, в которой было использовано устройство с шестернями разной величины, позволявшее производить простейшие арифметические действия. Это был самый настоящий прототип современного калькулятора.

В 1206 году появился уникальный аппарат по отслеживанию так называемого метонова цикла, построенный Аль-Джазари, который использовал сложные на то время механизмы, основанные на зажимах и кулачках.

Только в 1804 году свет увидел жаккардовый ткацкий станок, который был способен воспроизводить узоры на тканях, созданные на основе перфокарт.

Но настоящим прорывом стало программируемое аналитическое устройство, разработанное Чарльзом Бэббиджем, которое, к сожалению, при его жизни так и не было построено.

Зато в 1846 году дочь Байрона создала первую в мире программу для аналитической машины, которая решила уравнение Бернулли. Конечно, алгоритмы программирования, которые применяла графиня Ада Августа Лавлейс, были весьма примитивными, но именно они заложили то самое зерно, которое было использовано при создании современных компьютерных программ. И именно ее считают во всем мире прародительницей программирования.

Каким образом компьютер воспринимает команды?

Любая компьютерная программа должна машиной каким-то образом выполняться. Ей мало написать, мол, сделай то-то и то-то. Для этого были созданы языки программирования.

Но написать последовательность команд на каком-то языке, которых сегодня существует очень много, оказывается недостаточно. Машина все равно не воспримет текстовые фразы или математические формулы.

Универсальным средством стало использование двоичного (бинарного) кода, состоящего из последовательностей нулей и единиц, которые воспринимаются любым компьютерным устройством. Но как перевести смысловые фразы и формулы в такой вид? Для этого используются компиляторы, которые и преобразовывают список команд в понятный машине двоичный код. Можно встретить и троичные, и шестнадцатиричные коды, но они используются крайне редко.

Мнемокоды

Понятно, что вводить двоичные команды даже на примитивных устройствах было крайне затруднительно, ведь запомнить такие последовательности человек по природе своей просто не в состоянии.

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

Понятие переменных

Но и этим дело не ограничилось. Применяемые на заре развития алгоритмы программирования потребовали ввода новой величины, получившей название переменной.

Суть ее использования в любом языке программирования состоит в присвоении определенной области памяти, в которой хранится какое-то значение, буквенного обозначения. Для того чтобы перевести мнемокоды в инструкции, а переменные в области памяти, использовались инструменты, называемые трансляторами. И все языки, использовавшие такую методику, получили название ассемблеров.

Языки программирования

Сами же языковые средства, на которых пишутся (или в свое время писались) компьютерные программы, условно можно разделить на низко- и высокоуровневые.

Если кто из старшего поколения помнит, даже в советские времена в школах на уроках информатики преподавался язык Basic. С его помощью на тогдашних машинах Yamaha КУВТ можно было создавать примитивные программы математических вычислений, программировать простейшие картинки или музыку, звучащую из системного динамика. Для математики можно было использовать и логические операторы вроде «если», «то», «иначе». Но проблема всех тех, кто хорошенько обучился этому языку, состояла в том, что они никак не могли освоить новые средства.

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

К ООП смело можно отнести язык C+/++, на основе команд которого созданы те же операционные системы Windows. Программирование на «Си» является достаточно сложным, тем не менее при желании можно освоить и его. Как говорится, было бы желание. Можно пойти на те же курсы программирования или использовать для обучения соответствующую литературу. Правда, как считает большинство специалистов, самому вникнуть в основы языка еще можно, а вот развивать свои знания на практике буде крайне сложно. Тут никакие труды вроде книг «Программирование для чайников» не помогут.

Но вернемся к языкам. Относительно недавно появились языки, работающие на основе интерпретаторов (.NET Framework, Python, Java, Perl и т.д.). В них вместо машинного кода генерируется особый байт-код, который представляет собой двоичный код виртуальной машины.

Кстати сказать, программирование на Java можно без особых усилий освоить самому. Например, для мобильных устройств на основе Android-систем можно параллельно использовать Android Studio и пакет Java SDK, а в качестве тестировщика установить Genymotion. Можно поступить еще проще, обратившись к онлайн-конструктору App Inventor, в котором создание последовательности команд производится наподобие складывания пазлов.

Понятие парадигм

Понятие парадигм возникло не на пустом месте. В самом общем понимании парадигмы представляют собой некий взгляд на окружающий мир и действия, которые в его отношении можно предпринять. В компьютерном мире под таким термином понимается некое обобщение по отношению к работе программы.

Существуют приложения, ориентированные исключительно на одну парадигму или выполнение только одной задачи, но все современные языки и программы, создаваемые на их основе, решают несколько задач. Отсюда и появился термин многозадачности.

Современное программирование и его особенности

На современном этапе развития компьютерных технологий приоритетным для многих программистов являются ООП и программирование на Java. Заметьте, пакеты Java-платформы поддерживаются любой из ныне известных операционных систем, не говоря уже о мобильных устройствах.

И хотя, как считается, язык C+/++ является доминирующим, не стоит сбрасывать со счетов и Ассемблер. Удивительно, но большинство вирусов написано именно на нем. А если взять в расчет веб-программирование, скажем, на основе Delphi, тут вообще открываются такие широкие возможности и перспективы, что многие начинающие программисты об этом даже не догадываются.

Можно ли самому научиться программированию?

Вопросы, связанные с самостоятельным обучением, напрямую зависят от того, чему именно хочется научиться. Литература в виде книг «Программирование для чайников» дает лишь частичные ответы без конкретизации основных аспектов с учетом применения того или иного языка. Это, так сказать, для общего понимания. Курсы программирования - тоже вопрос спорный, ведь в данном случае все зависит не только от восприятия обучаемым, но и от того, какими знаниями обладает преподаватель, как он подает материал и т.д. Но если уж возникла необходимость изучения какого-то определенного языка или метода программирования, в наш век интернета проблемой это не является. Можно найти даже онлайн-курсы или подробное описание уроков по той же платформе Java, программированию Android- или iOS-устройств.

Краткие итоги

Что такое программирование в общих чертах, думается, уже понятно любому человеку. Здесь, правда, были затронуты только общие вопросы без конкретики использования каждого языка, средств написания приложений или сопутствующих программных модулей, интерпретации или трансляции команд, равно как и то, каким образом все это выполняется на уровне процессора, оперативной памяти или операционной системы. Все это достаточно сложно для понимания, а неподготовленному человеку вникнуть в суть всех этих процессов будет не так уж и просто. Тем не менее при желании и достаточно высокой степени мотивации изучить любой язык можно, а в дальнейшем стать высококлассным программистом.

2 года назад я написал статью о классификации знаний в области программирования. Это было на волне интереса и моей активной деятельности по самообразованию в компьютерных науках. Написал статью и забыл о ней. Публиковать на Хабре не собирался. В конце концов, она базируется на моем личном опыте и знаних, которые могут оказаться весьма субъективны.

Недавно, на фоне постоянно поступающих вопросов «как научиться программированию?», я вспомнил про этот материал и перечитал его. Прошло уже 2 года, пополнился опыт, добавились знания, изменились взгляды. Но эта статья для меня не утратила актуальности, и я не нашел почти ничего, что хотел бы в ней изменить. Мне показалось, что она все же достойна публикации. И, возможно, кому-то она поможет в собственном профессиональном развитии.

Но прежде, чем «запустить» материал, еще небольшое отступление. О том, почему вообще я все это писал. Дело в том, что у нас в странах бывшего СССР с образованием в области IT очень туго. С одной стороны нет программ обучения, которые подготовят специалистов на должном уровне (наверное, за очень редкими исключениями, которые можно отнести к погрешности). С другой стороны, из-за широких возможностей самообразования, программисты и не спешат учиться в ВУЗах - все стремятся начать практиковать как можно раньше. Часто изучается только одно направление (например PHP+Mysql - самое популярное) и в бой. Причем, на этом все заканчивается. В итоге у нас огромное количество программистов, которые и базовых вещей не знают. Отсюда вытекают проблемы с качеством кода, и с эффекивностью алгоритмов, с велосипедированием.

Но программирование - это полноценная область знаний, которая требует в том числе и инженерной подготовки. Точно так же, как строительство или телекоммуникации. Да, построить дом (особняк) можно своими руками и без образования. А поднять большинство сайтов можно прочитав пару книг по PHP и HTML. Но многоэтажку без специальной подготовки не построишь, как и Гугл не напишешь, не зная основ.

Возможности для самообразования в компьютерных науках сейчас огромны. Единственное, чего не хватает, - это системности подготовки. Как разобраться, что и в какой последовательности изучать? Мне кажется, что этот материал поможет разложить по полочкам области знаний в компьютерных науках и составить для себя программу изучения по книгам. Выбор книг - тема отдельная, в рамки статьи не входит, но это можно обсудить в комментариях.

Поехали.

Меня иногда спрашивают, что нужно выучить, чтобы стать программистом. Вопрос несколько наивный, т.к. нормально ответить на него по-моему невозможно. Т.е. для начала нужно выяснить, каким программистом нужно стать. Да и вообще, программистом ли? Кроме того, на рынке востребованы как высококвалифицированные дорогие специалисты, так и “рабочая сила”. Пакет знаний и опыта первых и вторых отличается в значительной степени.

Но, не смотря на такую расплывчатость вопроса, дать ответ на него все же можно. Можно описать примерный максимум знаний, которые так или иначе относятся к программированию. Собственно, этот максимум обычно и стремятся преподать в ВУЗах на специальностях, в названии которых фигурирует слово “программист”.

Я учился на программиста в колледже, потом в университете. Именно университет немного разложил по полочкам понимание и взаимосвязь дисциплин, относящиеся к так называемым компьютерным наукам. Пусть знания, которые там давали, были недалекими и немного устаревшими, но системный подход у них был сформирован неплохой. Спустя годы практики после окончания обучения я пришел к выводу, что ВУЗовская классификация дисциплин вполне хороша и позволяет ответить на вопрос, что же следует знать любому программисту.

Конечно, знать все невозможно. Да и не нужно. Кроме того, какие-то вопросы нужно знать глубоко, а в других достаточно поверхностного обзорного понимания. По-этому в зависимости от специализации некоторые дисциплины более актуальны, некоторые менее. Но общие базовые знания необходимы почти по всем из них для любого инженера-программиста, от системщика до веб-разработчика.

В предыдущем абзаце я специально ввел термин “инженер-программист”. Как-то получается так, что программист - это не обязательно инженер. Даже из определения Википедии следует, что инженер - это в первую очередь проектировщик. Это тот, кто создает, т.е. проектирует системы. А в практике программирования проектирование нужно не всегда. Иногда достаточно кодирования: используя данный набор технологий, слепить что-то работающее. Типичный пример - стадо корпоративных или маркетинговых сайтов на джумлах, ворпрессах, друпалах и т.д. Это уровень техника, не инженера. Это уровень среднего образования. И работать техником можно даже после окончания курсов какого-либо языка программирования, крепкая теоретическая база там не нужна.

И, возвращаясь к инженерам-программистам, я хочу предложить свой граф дисциплин, которые изучают программисты. Очевидно, что одни дисциплины активно используют знания других, либо вовсе вырастают из других. Соответственно для полного понимания “верхнего” предмета, необходим какой-то уровень понимания нижнего.

Граф состоит из предметов (дисциплин) и разбит на уровни. Самый нижний - Общая база - вообще отношения к компьютерным наукам не имеет. Он приведен только для того, чтобы показать, на чем базируются дисциплины компьютерных наук.

Между дисциплинами существуют 2 вида связей: использование (обычная стрелка) и расширение (контур стрелки). Использование подразумевает необходимость фрагментарных знаний другого предмета, а расширение - необходимость как минимум обзорных, но полных знаний расширяемой дисциплины.

Первый уровень из CS (computer science) - Специальная база . Это стартовая площадка для любого программиста по четырем фронтам:

  1. арифметические основы ЭВМ (системы счисления и операции с числами, логические операции);
  2. физические основы ЭВМ (полупроводники, транзисторы, логические элементы, схемы, интегральные микросхемы);
  3. теория алгоритмов (алгоритмы и структуры данных; сложность, эффективность; способы представления информации в памяти);
  4. языки программирования (задача и понятие ЯП, уровни, типы языков, абстракция, уровни абстракции, трансляция/компиляция, шаблоны, принципы, парадигмы - обзор).

Специальная база предлагает фундаментальные теоретические знания, на которых строятся дисциплины более высоких уровней. Для среднего программиста необходимы обзорные знания по всем предметам специальной базы. Для некоторых специализаций требуется углубленное понимание теории алгоритмов (прежде всего - разработчикам разного рода библиотек).

Уровнем выше располагаются дисциплины, которые являются базовыми именно в программировании. По-этому я назвал этот уровень Основы . В него входят:

  1. архитектура ЭВМ (процессоры, микроархитектура, память, шины, ввод/вывод);
  2. обработка информации (теория информации, статистика, модели, поиск данных, лингвистические аспекты, обработка информации средствами табличных процессоров);
  3. основы C/C++ (базовые свойства языка, синтаксис, указатели, ввод/вывод, массивы, основы STL).

Следом за Основами идет Уровень 1 . Это первый прикладной уровень, и особо нетерпеливые могут начать коммерческую практику, овладев этим уровнем. Он включает 5 дисциплин:

  1. основы ASM (развитие архитектуры ЭВМ в направлении программирования, написание простейших драйверов и алгоритмов, ассемблерные вставки в C/C++);
  2. C/C++ (ООП, разработка прикладных приложений, библиотеки, WinAPI, make utils, параллельное программирование).
  3. операционные системы (архитектура ОС, процессы, межпроцессное взаимодействие, потоки, планирование, работы с памятью и переферией, POSIX-системы);
  4. системный анализ (предметная область, бизнес-процессы, потоки, диаграммы, принципы и теория системного анализа);
  5. базы данных (теория множеств, виды СУБД, реляционные СУБД, модели данных, SQL, конкретные БД).

Следующий уровень - Уровень 2 - развивает предыдущий. Кстати, компьютерные сети попали в него только по той причине, что для их изучения желательно (но не обязательно) предварительно освоить операционные системы. По развитости этот предмет ближе все-таки к первому уровню.

Уровень 2 включает:

  1. разработку ПО (жизненный цикл ПО, этапы разработки, основы ведения программных проектов, инструменты);
  2. анализ данных (Data Mining, OLAP, машинное обучение, нейронные сети, ИИ);
  3. компьютерные сети (по уровням стеков TCP/IP и/или ISO/OSI “от и до”, протоколы, сетевое программирование на C/C++);
  4. языки программирования с управляемым кодом (управляемый код, виртуальные машины, сборщики мусора, юнит-тестирование, собственно практика на C# или Java);

Уровень 3 - последний уровень для среднего программиста. Он самый объемный и включает только те дисциплины, которые непосредственно связаны с разработкой ПО. Всего их получилось 6:

  1. разработка UI и юзабилити (принципы построения интерфейсов пользователя);
  2. управление командами и проектами (методологии разработки и другие вопросы управления);
  3. тестирование ПО (обзорно: виды тестирования, инструменты);
  4. веб-технологии (HTTP-протокол, веб-сервер, CGI, кэширование и проксирование, клиентское программирование);
  5. распределенные системы (архитектуры распределенных систем, протоколы сетевого взаимодействия компонентов, инструменты, принципы, подходы к построению распределенных систем, отказоустойчивость, большие данные, высокие нагрузки);
  6. интерпретируемые языки программирования (особенности, основы по двум-трем языкам, практика по одному-двум языкам: JS, PHP, Python, Ruby).

Все, что идет выше, - расширенные Экспертные знания . По большому счету этот уровень можно расширять неограниченно, добавляя в него смежные с разработкой дисциплины и наиболее сложные аспекты разработки ПО. Я привел 3 примера - разработка компиляторов, разработка операционных систем и построение архитектур больших программно-аппаратных систем, либо архитектур, рассчитанных на особо высокие нагрузки. Зависимости к нижним уровням га графе не рисовал, т.к. получится слишком много стрелок, идущих через все уровни, вплоть до Общей базы. Наверное, широкие зависимости - это один из признаков вопросов экспертного характера. Здесь как раз подтверждается то, что экспертный уровень требует самых широких знаний и хорошего опыта.

Интересно в графе то, что он не только показывает предпочтительный порядок изучения предметов, но также:

  1. дает возможность понять, какие дисциплины нужны больше, какие меньше для работы в определенной специализации (просто выбрать основной предмет специализации и смотреть по связям и удаленности до других);
  2. дает понимание, как изучать компьютерные науки, если начинать не с фундаментальных основ, а с прикладных знаний (например, PHP) - можно двигаться по связям в стороны и вниз - собственно именно таким был мой личный путь развития (и я никак не могу назвать его самым легким, эффективным и оптимальным).

Граф - это модель. А хорошая модель как правило дает ответы сразу на множество вопросов. Я поставил перед собой задачу сделать хороший граф, близкий к реальности. Естественно, он основан на моем личном опыте и не претендует на идеал. Я старался сделать его наиболее объективным. И еще раз напоминаю, что это граф для программиста. Т.е. для тестировщика, сисадмина и других близких к программированию профессий он будет более или менее близким, но явно другим.

P.S. Убедительная просьба не развивать холивары на тему, что должен и что не должен знать программист. Это личный выбор каждого и статья совсем не об этом. Здесь приведена классификация знаний и взаимосви между ними. Это интересно не всем, это нужно не всем.

Я не знаю, как обстоят дела в образовании сейчас, но 10-15 лет назад ни в школе, ни в университете никто всерьёз не объяснял, что программирование имеет свои типы, каждый из которых требует особого типа мышления. Не то чтобы это покалечило чьи-то судьбы, но изучение программных дисциплин могло бы проходить гораздо быстрее, если на стадии закладки фундамента мы представили многообразие языков и подходов, а не зомбически учили C++ в его консольных проявления.

Многие, сталкиваясь с необходимостью писать функциональный код, часто сожалеют, что процедурный образ мышления настолько глубоко засел в мозг, что перестроиться с него непросто. Поэтому лучше начинать путь в программисты не с выбора языка, а с выбора типа программирования.

Типы программирования

Условимся сразу: типов будет шесть. Это достаточно подробное деление. Обычно выделяют 3-4, но так как перед нами стоит задача выбора пути для новичков, оно вполне оправдано.

Процедурное программирование , оно же императивное.

Оно ставит задачу создания кода на языке, понятном используемой машине. Самый известный случай - машина Тьюринга, из известных языков программирования - С/C++, Ада, Паскаль, Go. Задачи здесь решаются планомерно: сначала объявляется объект, потом он определяется и затем выполняется с ним действие:

var
S: String;

S:= ‘Hello!’;

Декларативное программирование .

В процедурном случае вектор оптимизации языка направлен от машинного уровня к языку пользователя путем использования базовых принципов ООП, классов, методов и пр.. Здесь же во главе угла стоит непосредственно задача, а способ её исполнения второстепенен. Яркий пример - язык разметки HTML. Если вы хотите разместить кнопку, вам формально не надо создавать объект и присваивать ему атрибуты:

Функциональное программирование .

Как вы знаете из курса математики, результат выполнения любой функции можно представить в виде табличных данных, вопрос только в частоте дискретизации и диапазоне значений. То есть, сколько бы раз не была выполнена функция, каким бы не было её место в задаче, результат для одних и тех же значений останется один и тот же. В императивном программировании это выполняется далеко не всегда, ведь значения переменных могут изменяться в ходе программы, что сделает результат зависимым от конкретных условий.

Функциональное программирование лишено этого недостатка: здесь вы оперируете функциями - исходными, приращения и результативной, - но не конкретными значениями. Среди популярных представителей - Lisp, Clojure, Haskell. Функциональное программирование считается сложным и избыточным для большинства прикладных задач. Отсюда невысокий спрос на специалистов, но от этого же высокие зарплаты и действительно интересная работа.

Логическое программирование .

Как следует из названия, оно оперирует простой математической логикой. Яркие представители - Planner и Prolog. Достаточно ограниченный набор действий может быть реально полезен для создания простейшего искусственного интеллекта или разминки мозгов, но в реальной жизни логическое программирование самостоятельно используется редко.

Динамическое программирование .

Тот случай, когда для решения сложной комплексной задачи необходимо её разбить на несколько более простых, минимизировав количество циклов исполнения. В идеале каждая простая задача должна выполняться один раз, но на практике это бывает достаточно редко. Динамическое программирование - скорее концепция, применимая ко всем языкам, поэтому представителей у данного направления нет. Но особого образа мышления от вас это потребует точно так же.

Графическое программирование , оно же визуальное.

Оно предлагает разработчику работать с графическими изображениями, а не текстом. Выражаться это может по-разному - есть специальные языки, вроде Scratch или BluePrint, есть языки схем или диаграмм (LD или FBD), есть просто разделы программирования, связанные со взаимодействием с формами и графикой. В последнем случае это может быть любой язык, визуализация осуществляется средствами разработки (Borland Delphi/C++, Visual Studio, Adobe Dreamweaver и пр.). Такое графическое программирование в чистом виде встречается крайне редко, без понимания языка и структуры кода создать что-то серьезное невозможно.

Остальное

Программирование делят по множеству типов, и о некоторых новички даже не догадываются: синхронное/асинхронное/событийное, последовательное/параллельное, различное по решаемым задачам и задействованности ИИ и статистики.

Выбор стартовой парадигмы программирования не означает выбор только одного пути. Напротив, не привязываясь к конкретным языкам, профессиям и программным средам, начав со «своего» образа мышления, вы изначально настроите себя на правильное понимание сути. Успешным, счастливым и богатым айтишником становится не тот, кто попал в нужный поток, а тот, для кого любой поток - возможность реализовать свой потенциал.