Сайт о телевидении

Сайт о телевидении

» » Уровни языков программирования и их развитие. Уровни языков программирования. Языки программирования «Высокого» и «Низкого уровня»

Уровни языков программирования и их развитие. Уровни языков программирования. Языки программирования «Высокого» и «Низкого уровня»

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

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

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

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

С помощью языка программирования создается не готовая к исполнению программа, а только её текст (его называют исходным кодом - source code), описывающий разработанный алгоритм. Исходные тексты программ легко переносимы на другие платформы, для которых разработаны трансляторы этого языка. Трансляторы (программы-переводчики исходного кода в машинный) бывают двух основных типов: компиляторы и интерпретаторы.

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

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

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

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

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. Убедительная просьба не развивать холивары на тему, что должен и что не должен знать программист. Это личный выбор каждого и статья совсем не об этом. Здесь приведена классификация знаний и взаимосви между ними. Это интересно не всем, это нужно не всем.

Jт Junior до Senior не минуя Middle и с прицелом на TeamLead... Статья о рангах и ступенях IT карьеры разработчиков и некоторых других IT специалистов. Субъективный, но безпристрастный взгляд на развитие IT специалистов...

Ранги в профессии программист или рост IT специалистов в IT карьере.

Данный материал представляет собой очерк вакансий-позиций, доступных разработчику программного обеспечения, которые в результате упорного труда продвигают его по карьерной лестнице. Автор статьи сам разработчик Middle класса (уже не Junior, но ещё не Senior, согласно спецификации, приведенной в статье – просто Developer) попытался привести описания основных позиций в карьере программиста и произвести краткий анализ способностей и амбиций, особенностей, свойственных тем или иным рангам, как и росту прав и обязанностей согласно занимаемой должности.

Надеемся, что этот материал понравится и будет полезен Вам.

Итак, как известно, программисты или разработчики имеют свои ступени профессионального роста. Обычно это Junior, Middle (или, как говорят куда чаще – просто Developer) и Senior. Ученик, подмастерье и мастер, если хотите. Для каждой из этих позиций характерны свои особенности, каждая из них влияет на обязанности и права разработчика, занимающего эту позицию и влияет на его характер, амбиции и способы решать рабочие вопросы. Написать данную статью, не опасаясь обвинений в необъективности, автору позволили некоторые наблюдения, сделанные в результате многолетней работы в IT компаниях, а также соединение собственных наблюдений с массой тематических материалов, прочитанных как в украинских, так и в зарубежных IT изданиях.

Таким образом, получилось, что о позиции Junior developer можно сказать следующее:

Позиция - Junior Developer

Младший программист – Junior Developer, это молодой разработчик с малым количеством опыта или вовсе без такового, только начавший работу в избранной технологичной области. Обучается, как правило, по видеокурсам и видеоурокам, причём постоянно ведь опыта разработки у него так мало, что он очень много времени тратит на советы с более опытным разработчиком и понимание того как команда работает над проектом. Накопив достаточно опыта и реализовав несколько проектов, junior переходит на middle уровень – становясь полноценным разработчиком. Но всё же, Junior разработчики находятся в постоянном, непрерывном и самостоятельном образовательном процессе. Обучение для junior разработчика - это все. Испытывая постоянную необходимость в выполнении задач, поставленных по работе над проектом, идеальная схема обучения для Junior разработчика - это видео обучение программированию в рамках избранной технологии. Опираясь на просмотренные видео уроки по программированию, онлайн консультации и советы более опытных коллег, junior разработчик растёт достаточно быстро для того чтобы уже через 1-1,5 года занять позицию полноценного разработчика. Требования, обычно выставляемые к Junior разработчику, приблизительно таковы, как и у Developer и Senior.

Это следующие знания:

Основы программирования (системы исчисления, разница между оператором и операцией, понимание алгоритмов, методик ООП)

Языки: С#, C++, Java, PHP, JavaScript (синтаксис, ООП возможности, многопоточность, стандартные библиотеки, паттерны проектирования)

OOP и OOD (парадигмы)

Умение обучаться по видеокурсам и видеоурокам по программированию, не прибегая к дополнительным разъяснениям. Такой навык очень помогает Junior разработчикам вырости до Middle.

Работа с базами данных (JDBC, язык SQL, MSQL, SQL lite и т.п.)

Базовое знание какого-либо конкретного фреймворка (например, веб-сервисов или Spring).

По субъективным заметкам программистов, за Junior Developerами замечено:

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

Ресурсы для Junior разработчиков:

Видео портал ITVDN.com – Видеокурсы и видеоуроки для начинающих и опытных программистов.

MSDN.com – Технологии Microsoft

97 Things Every Programmer Should Know (список)

Other Things Every Programmer Should Know (список)

Channel9.com – Форум Microsoft разработчиков

Следующий шаг в карьерном и профессиональном росте программиста - Программист или Developer

Developer или Middle Dev

Программист или Developer или Middle dev (англ. разработчик) - это человек, ответственный за качественное и своевременное исполнение разработки информационно-программных систем, основанных на применении современных программных технологий. Программист выполняет задачи по написанию и базовому тестированию порученных ему компонентов системы, работает developer по внешним спецификациям. Поддерживает Junior разработчиков, занимается как архитектурой проектов, так и модульной реализацией, производит реализацию работоспособности прототипов, постоянно занимается самообразованием, понимает алгоритмы, Software Engineering Process, обладает знаниями в следующих областях: языки разметки, понимание технологии web-серверов и серверов приложений, знанием клиентских и серверных технологий, работы браузера, СУБД, операционных систем, офисных пакетов, сред разработки, профильных языков программирования, технического английского. Как правило, имеет высшее образование, хотя случается и что не имеет, это не критичный показатель, критичный - наличие знаний и опыта.

По заметкам программистов за developerами замечено:

Любит поучать Junior developers, прямые вопросы от Juniors нередко вызывают у Middle developers раздражение, контроля над выполнением работ, как правило, не требует - отвечает за отдельные функции и модули и сам контролирует их работу, осознавая, что выполняемая им работа определяет рабочий процесс коллег. Это ответственные люди, которых редко нужно учить, так как они постоянно занимаются самообразованием в форме просмотра видео курсов по программированию, посещения семинаров и участия в вебинарах, чтения профильной литературы и ресурсов. Умеет решать поставленные задачи самостоятельно, понимает основы построения архитектуры проектов, мыслит не категориями языка, от которых, наконец, отвязался, но понятиями предметной области, умеет писать структурно и последовательно, думает о будущей поддержке продукта. К концу первого года работы в команде перестаёт писать плохой код.

Ресурсы для developers:

Github.com – Профессиональный ресурс для разработчиков.

ITVDN.com – Портал видео IT обучения

MSDN.com – Продукты и технологии Microsoft

Codefor.com – Форум разработчиков

habrahabr.ru – Крупнейшее профильное IT сообщество рунета

И вот, наконец, мы добрались и до позиции Senior developer.

Senior developer (Ведущий разработчик)

Ведущий программист – человек ответственный за качество и своевременность работ по разработке информационно-программных систем, основанных на применении новейших программных технологий. Обладает глубокими, структурированными знаниями и работает внутри проектной команды, совершенно не имея необходимости контактировать с представителями менеджмента заказчика. Выполняет такие работы, как: детальное проектирование и создание спецификаций проектов, полностью контролирует и зачастую и самостоятельно выполняет проектирование мелких проектов и внутренних под-проектов (модулей), программирование и базовое тестирование компонентов. Как правило, имеет законченное высшее образование, реже незаконченное, стаж от 3х лет в качестве developer, умеет комментировать программы, не прибегая к использованию словаря, разрабатывать документацию, свободно общаться на английском языке, владеет методами и инструментами анализа и проектирования, Software Engineering Process, языками разметки, глубоким пониманием клиент-сервер технологии, работ браузера, web серверов, серверов приложений, БД, ОС, офисными пакетами, может контролировать других разработчиков и ставить им задачи.

По заметкам коллег-программистов, за Senior Developers замечено:

Отвечает за проект, умеет подготовить инфраструктуру, занимается решением сложных задач. Является наставником для developers и junior. Обладает набором конкретных решений в области тех или иных наиболее часто возникающих задач, за счёт чего демонстрирует бешенную производительность в сравнении с middle developers. Делает на порядок меньше ошибок, ошибки допущенные Senior, как правило, им же легко устраняются и связаны обычно со спешкой или постоянным недосыпом. Забавно, но нередко знает конкретные языки хуже, чем junior, что компенсируется знанием того, как обходить скользкие места и тремя-пятью решениями на каждую задачу, которые держит в голове, также за счёт того, что превосходно концентрируется на главном, игнорируя несущественные детали. Собственно, за это и держат – способен увидеть суть, нередко даже не дочитав до конца ТЗ.

Ресурсы для senior разработчиков:

Знают и не с кем ими не делятся. Можно разве что подсмотреть через плёчо, сидя рядом.

На этом первую часть нашей статьи о Рангах в карьере программиста и составляющих профессии от А до Я, можно читать завершённой. Надеемся, что данная статья была интересна Вам и следующий её выпуск, рассказывающий о Team Lead, Architect и CIO будет, ожидаем Вами.

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

Junior Developer

  • Всегда требует не только самообразования, но и контроля.
  • Всегда оптимист и всегда недооценивает сложности поставленных задач.
  • Жалуется только на нехватку времени, на остальное боится.
  • Не задаёт необходимые вопросы, так как опасается блеснуть незнанием.
  • Часто ошибается и потому завышает сроки, чтобы успеть переделать до сдачи.
  • В перманентной вражде с SEO и Тестировщиком – с Тестировщиком, так как тот находит баги, с SEO так как тот заставляет заниматься, по мнению любого разработчика несущественной ерундой, за которую тем не менее третирует начальство.
  • Менеджеров, совершенно не воспринимает всерьез, так как пока не понимает всей серьёзности их функций.
  • Даже самую рутинную работу считает сложной, хотя способен написать тысячи строк «одинакового» кода.

Developer

  • Пессимист, недооценивающий себя, и живущий в страхе промаха и провала.
  • Всегда находит новинку, чтобы обсудить, время на перекур что бы обсудить, и время на чашечку кофе, чтобы узнать, что обсуждают другие.
  • Не стесняется и может даже эксплуатировать коллег, выманивая все возможные знания, умения, применяя которые о коллегах упомянуть забывает.
  • Наступая на грабли, молчит и скрипя зубами сам исправляет ситуацию, так чтобы никто даже и не знал.
  • Разделяет мнение Juniora о тестировщиках и SEO
  • Роль менеджера понимает, но тем не менее менеджеров недолюбливает как непонимающих элементарного.
  • Знает, сколько он стоит и при случае показывает, что знает это.
  • Старается работать только над тем, что интересно.
  • Нередко ухитряется вести по 2-3 проекта параллельно, чем очень удивляет Junior developers.

Senior Developer

  • Реалист – всегда закладывает не только свои сложности, но и общие риски, при этом, не слишком завышая сроки. Как делает это, не знает сам, говорит, при этом кратко – опыт.
  • Успевает всё. И митинги и work tasks и помогать коллегам.
  • Может легко, не стесняясь, сказать, что не знает чего-то. При этом так же легко помогает разобраться в том, что знает.
  • Грабли у Senior, как ядерное оружие, мощные и критичные – если уж ударят, то глобально. Бывают наверняка и простые грабли, но они их удачно скрывают, так, что о них не знает никто.
  • Любят работу – радуются успеху проектов как в детстве, причём даже когда те не слишком сказываются на благосостоянии.
  • Тестер – советник.
  • Менеджер – щит перед заказчиком.
  • Не стесняется требовать повышения ЗП, крайне не любит привлекать к работе посторонних или новичков, даже если те знают и умеют много и хорошо.
  • Ворчит, но работу делает и в зависящем от него всегда успешно.

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

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. Убедительная просьба не развивать холивары на тему, что должен и что не должен знать программист. Это личный выбор каждого и статья совсем не об этом. Здесь приведена классификация знаний и взаимосви между ними. Это интересно не всем, это нужно не всем.

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

Наименование параметра Значение
Тема статьи: Уровни языков программирования
Рубрика (тематическая категория) Программирование

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

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

Программы, которые принято называть – компиляторами.

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

Интерпретато р берет очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет (обычно после анализа оператор транслируется в неĸᴏᴛᴏᴩᴏᴇ промежуточное представление или даже машинный код для более эффективного дальнейшего исполнения). Только после того как текущий оператор успешно выполнен, интерпретатор перейдет к следующему.

Компиляторы автоматически переводят текст программы в машинный код (полностью обрабатывают весь текст программы). Οʜᴎ просматривают его в поисках синтаксических ошибок (иногда несколько раз), выполняют определœенный смысловой анализ и затем автоматически переводят (транслируют) на машинный язык - генерируют машинный код. В реальных системах программирования перемешаны технологии и компиляции, и интерпретации.

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

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

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

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

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

Переменная в программировании: тип, имя и значение . Мы знаем что в математике переменные - ϶ᴛᴏ данные которые меняют свои значения. В программировании переменная - ϶ᴛᴏ небольшая область в оперативной памяти компьютера, куда во время работы программы можно занести и хранить в закодированном виде неĸᴏᴛᴏᴩᴏᴇ значение, которым при крайне важно сти можно пользоваться и ĸᴏᴛᴏᴩᴏᴇ можно изменять.

Имя переменной - ϶ᴛᴏ название места (ячейки) в общем объёме ОЗУ используемое в программе на алгоритмическом языке вместо указания адреса , определяемого номером в шестнадцатеричной системе счисления. Языки программирования позволяют работать с простыми переменными и индексированными (элементами массива).

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

Основные этапы решения задач на ЭВМ:

Вне зависимости от того, на каком алгоритмическом языке создается программа, этапы подготовки и решения задач на ЭВМ выглядят следующим образом:

1. Математическая постановка задачи - это формулировка задачи как задачи некоторого раздела математики.

2. Построение математической модели.

Модель - Это замещение изучаемого объекта другим объектом, который отражает существенные стороны данного объекта. Изучаемый объект может иметь несколько моделœей исходя из требуемой точности результатов вычислений.

Пример . Определить периметр крышки стола.

рисунок 1 рисунок 2

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

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

В случае если это доказано, то математическая постановка задачи имеет такой вид:

исходные данные : r- радиус закругления,

a, b, c, d- размеры прямолинœейных частей фигуры;

результат : Р (периметр);

Вычислить значение Р: Р= 2Пr+a+b+c+d.

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

исходные данные : а, b, с, d- размеры прямолинœейной части фигуры;

результат : Р (периметр).

Вычислить значение Р: Р=a+b+c+d.

В качестве модели объекта задачи можно взять прямоугольник со сторонами а и b. В случае если окажется, что при заданной точности вычисления противоположенные стороны крышки можно считать равными, как и диагонали ее, МПЗ имеет такой вид:

исходные данные: a, b - размеры прямоугольника;

результат : P (периметр)

Вычислить значение Р:

3. Выбор метода решения.

4. Построение алгоритма.

5. Запись алгоритма на языке программирования.

6. Отладка программы на ЭВМ.

Пример решения задачи . Составить программу начисления зарплаты согласно следующему правилу:

если стаж сотрудника менее 5 лет, то зарплата 130 руб., при стаже работы от 5 до 15 лет - 180 руб., при стаже свыше 15 лет зарплата повышается с каждым годом на 10 руб.

Сформулируем задачу в математическом виде: Вычислить

130, в случае если ST< 5;

ZP < 180, в случае если 5

180 +(T-15)10, в случае если 15

ZP - заработанная плата͵ ST - стаж работы.

Описание алгоритма на естественном языке:

2. В случае если ST< 5, то ZP:=130, перейти в п.5,

3. В случае если ST< 15, то ZP:=180, перейти к п. 5

4. ZP = 180+(ST-15)‣‣‣10

5. Сообщить значение, ST

Пример блок-схемы алгоритма решения задачи

Уровни языков программирования - понятие и виды. Классификация и особенности категории "Уровни языков программирования" 2017, 2018.