Получите бесплатно 4 курса для лёгкого старта работы в IT
Получить курсы бесплатно
ГлавнаяБлогОбъектно-ориентированное программирование: суть и задачи
Объектно-ориентированное программирование
13 474
Время чтения: 14 минут

Объектно-ориентированное программирование: суть и задачи

13 474
Время чтения: 14 минут
Сохранить статью:
Сохранить статью:

Что это такое? Объектно-ориентированное программирование – парадигма, в центре которой данные и объекты, а не функции, как при процедурном подходе. Примером ООП будет открытие торговой точки, которое начинают с продумывания прилавков и ассортимента, которые являются объектами.

На что обратить внимание? Принципами объектно-ориентированного программирования являются полиморфизм, абстракция, наследование и инкапсуляция. Они используются во многих популярных языках — C++, Python, PHP, JS, Java.

В статье рассказывается:

  1. Суть объектно-ориентированного программирования
  2. Принципы ООП
  3. Структура объектно-ориентированного программирования
  4. Плюсы и минусы объектно-ориентированного программирования
  5. Языки в ООП
  6. 3 полезных книги по ООП
  7. Часто задаваемые вопросы об объектно-ориентированном программировании
  8. Пройди тест и узнай, какая сфера тебе подходит:
    айти, дизайн или маркетинг.
    Бесплатно от Geekbrains

Суть объектно-ориентированного программирования

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

Суть объектно-ориентированного программирования
Суть объектно-ориентированного программирования

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

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

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

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

Задачи, которые решаются с помощью подхода ООП:

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

Принципы ООП

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

Инкапсуляция

Все важные данные, которые требуются для функционирования объекта, должны хранится в нем самом. Лишь некоторая информация доступна для внешних элементов.

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

Узнай, какие ИТ - профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Павел Симонов - исполнительный директор Geekbrains
Павел Симонов
Исполнительный директор Geekbrains
Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.
Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!

Скачивайте и используйте уже сегодня:

Павел Симонов - исполнительный директор Geekbrains
Павел Симонов
Исполнительный директор Geekbrains
pdf иконка

Топ-30 самых востребованных и высокооплачиваемых профессий 2023

Поможет разобраться в актуальной ситуации на рынке труда

doc иконка

Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка

Только проверенные нейросети с доступом из России и свободным использованием

pdf иконка

ТОП-100 площадок для поиска работы от GeekBrains

Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽

pdf 3,7mb
doc 1,7mb
Уже скачали 27968 pdf иконка

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

Наследование

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

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

Для наглядности рассмотрим конкретный пример:

  • Класс«Транспортное средство» имеет следующие характеристики: возможность набирать скорость и перевозить пассажиров.
  • Соответствующим ему подклассом является «Автобус». Он наследует описанные характеристики своего класса. При этом подкласс уточняет их определенным количеством мест для пассажиров и максимальной скоростью передвижения.
  • Формируется объект«Икарус». Он имеет конкретную скорость, планировку, количество дверей, тип сигнала и прочие особенности.

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

export class Bus extends Vehicle()

Затем код дополняется более конкретными свойствами нового объекта (скорость, планировка и т.д.).

Принципы ООП
Принципы ООП

Абстракция

Это еще одно свойство объектно-ориентированного программирования. Его суть заключается в том, что каждый верхний слой над объектом (класс) является более абстрактным, чем его «младшая версия». Разработчику не нужно много раз создавать один и тот же объект, приписывая одинаковые атрибуты и методы.

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

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

Полиморфизм

Одни и те же методы могут применяться для обработки различных типов информации. В разных ЯП полиморфизм имеет различные свойства. К примеру, в строго типизированном языке C++ задействуется «перегрузка», а в JavaScript функции могут обрабатывать различные типы данных без необходимости заранее указывать тип.

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

Структура объектно-ориентированного программирования

Есть четыре базовых элемента кода, который написан по парадигме объектно-ориентированного программирования:

  • Объект

Речь идет о части кода, описывающей элемент с определенными характеристиками и функциями. К примеру, объектами являются карточки товаров в каталоге интернет-магазина, кнопка «заказать» и т.д.

  • Класс

Это шаблон, который позволяет формировать новые объекты. Если продолжить пример с интернет-магазином, то классом будет являться «Карточка товара». Он описывает общие характеристики всех конкретных карточек или объектов, о которых мы говорили выше.

Классы имеют свойство наследования. Иными словами, подклассы «Карточка товара для дома», «Карточка телевизора», «Карточка планшета» перенимают характеристики (например, стоимость товара, количество товаров на складе и т.д.) родительского класса «Карточка товара». Однако подкласс имеет и свои специфические свойства. К примеру, для «Карточки компьютера» указано количество USB-портов, а для «Карточки телевизора» – разрешение экрана.

Структура объектно-ориентированного программирования
Структура объектно-ориентированного программирования
  • Метод

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

  • Порекомендовать похожие товары.
  • Сопоставить характеристики двух товаров.
  • Проверить количество товара в наличии.
  • Внести в карточку конкретного объекта определенные данные.
  • Атрибут

Атрибуты – это характеристики объекта. К примеру, стоимость, производительность, диагональ экрана и т.д. Разработчик указывает их классе, а затем заполняет эти атрибуты конкретной информацией при помощи методов.

В качестве примера рассмотрим код на языке Java.

Как уже было отмечено, класс представляет собой общую абстракцию, которая описывает структуру объектов. Для начала сформируем класс “Item” для товара, который имеет две характеристики (атрибута) – наименование и стоимость. Чтобы это сделать, воспользуемся конструктором класса (методом), который поможет инициализировать объект. Пример объектно-ориентированного программирования:

class Item {

private String name;

private String price;

public Item(String name,

String price){

this.name = name;

this.price = price;

}

public void card() {

System.out.println(this.

name + » стоит » + this.price);

}

}

После этого укажем еще один метод – card. С его помощью мы узнаем наименование и цену для конкретного товара. После этого зададим атрибуты name и price. Затем сформируем подкласс, который будет иметь одно и то же название – «Телефон». При этом стоимость объектов может различаться.

class Phone extends Item {

public Phone(String price){

super(«Телефон»,price);

}

}

Таким образом, был взят общий класс Item со всеми его атрибутами и методами и сформирован подкласс, который перенял атрибут name. Если мы вызовем этот подкласс, то потребуется указать лишь стоимость. Название будет присваиваться автоматически.

Структура объектно-ориентированного программирования
Структура объектно-ориентированного программирования

Теперь попробуем вызвать подкласс и сформировать объект – телефон с конкретной ценой:

public class Main {

public static void main(String

args[]) {

Phone1 = new Phone(«30000»);

}

}

После этого разработчик получит возможность просматривать информацию об определенном телефоне. Для этого ему нужно будет использовать метод card:

Phone1.card();

Мы увидим информацию: «Телефон стоит 30 000».

Плюсы и минусы объектно-ориентированного программирования

Объектно-ориентированное программирование, как и любой подход, имеет свои плюсы и минусы. Для начала рассмотрим преимущества ООП:

  • Удобство. Разработчику гораздо проще писать код на основе этой парадигмы. Программисту нужно лишь один раз прописать все классы, методы и атрибуты. После этого он сможет создать любое количество объектов.
  • Читабельность. Код, написанный в соответствии с принципами объектно-ориентированного программирования, воспринимается намного проще. Его сможет прочесть даже неопытный разработчик, который знает основы данного подхода. У него получится без труда распознать структуру в чужом коде. Кроме того, программисту будет легче искать определенные части и исправлять ошибки.
  • Простота обновления. Разработчику не требуется прорабатывать каждую страницу по отдельности, если необходимо отредактировать все карточки товаров. Нужно лишь отредактировать базовый класс.
  • Возможность повторного использования кода. Нужно один раз написать код для кнопки «Добавить товар в корзину». После этого его можно будет задействовать при разработке других интернет-магазинов, мобильных приложений и т.д. Таким образом, специалисту не нужно повторно создавать код. Это упрощает процесс программирования и снижает вероятность совершения ошибки.
  • Возможность использования шаблонов. Разработчику не нужно собственноручно создавать большинство взаимодействий, так как он может воспользоваться общими шаблонами, которые необходимо лишь немного изменить.
Дарим скидку от 60%
на обучение «Frontend-разработчик» до 05 мая
Уже через 9 месяцев сможете устроиться на работу с доходом от 150 000 рублей
Забронировать скидку

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

Плюсы и минусы объектно-ориентированного программирования
Плюсы и минусы объектно-ориентированного программирования

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

Третий недостаток ООП – низкая производительность. Это является следствием предыдущего пункта. Объектно-ориентированное программирование потребляет больше энергии и требует больших мощностей. В результате падает скорость компиляции.

Языки в ООП

Объектно-ориентированный язык программирования представляет собой набор формальных правил написания программы, который выстроен согласно принципам ООП. На сегодняшний день такие языки являются наиболее распространенными. Перечислим некоторые из них: Python, C#, C++, Cyclone, D, Delphi, Swift, Groovy, Io, Java, JavaScript, JScript .NET, Objective-C, Perl, Lua, Ruby, Scala, PHP, . При этом большинство из этих языков универсальны и могут использоваться в других парадигмах.

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

ООП PHP

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

Кроме того, отсутствуют специфические требования к веб-серверу, хотя большинство разработчиков применяет Open Server. Чтобы ознакомиться с документацией по классам и объектам ООП PHP, нужно перейти на официальный сайт.

Рассмотрим конкретный пример. Допустим, что перед программистом стоит задача создать таблицу работников компании с информацией о них. В первую очередь ему нужно будет сформировать класс ООП на PHP. Для этого необходимо создать файл в отдельной папке на сервере и дать ему название (к примеру, index). В этом же месте потребуется создать еще одну папку для класса – classes. Там будет размещен первый файл для PHP ООП класса (Employee). Затем он должен быть подключен в файле index с помощью команды require_once для последующего применения.

Теперь разработчику нужно сформировать сам класс – class Employee. Необходимо поставить фигурные скобки и описать внутри них тело класса. Речь идет о свойствах (name, age, phone number) и методах. Для инкапсуляции этой информации потребуется определить их свойства как private.

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

Теперь сформируем PHP ООП объект.

Языки в ООП
Языки в ООП

Разработчику потребуется указать имя класса, объект которого нужно создать. Делается это в файле index с помощью директивы new. После этого нужно сформировать переменную объекта (к примеру, 1) для которой будут указываться все значения:

$obj1 = new Employee(‘Ivan’, ‘Petrov’, 30);

Те же действия нужно будет выполнить для создания всех остальных объектов.

Рассмотрим принцип наследования в PHP ООП. Класс Employee будет наследовать характеристики от родительского класса Person, если разработчик задействует оператор extends. Программист также может добавить туда новые свойства (скажем, должность сотрудника):

class Employee extends Person

Стоит учесть, что в языке PHP характеристики могут наследоваться лишь от одного класса.

Разработчик может отредактировать поведение метода родителя (это называется переопределением). Предположим, что внутри класса Person содержится метод save. Он отвечает за автоматическое сохранение данных объекта в БД. Если скорректировать механизм сохранения в процессе наследования, то реакция на один и тот же метод save будет одинакова, однако реализована она будет по-своему. Это пример действия принципа полиморфизма в ООП PHP.

ООП Java

В этом случае можно использовать некоторые распространенные IDE (Integrated Development Environment). Например, NetBeans, BlueJ, IntelliJ IDEA и т.д. В рассмотренном примере мы задействуем NetBeans. В первую очередь потребуется сформировать новый проект и дать ему имя (скажем, OOPJava). Затем в левой части экрана отобразится структура проекта, в которой автоматически появится первый класс с названием Main. Внутри этого класса будет размещен метод public static void, в котором Java будет выполнять весь исходный код.

Нажав на имя пакета правой кнопкой мыши и выбрав New – Java Class, разработчик сможет сформировать новый класс. Далее нужно задать для него имя и указать все нужные характеристики в фигурных скобках. Новый объект в классе формируется по аналогии с предыдущим примером. Делается это с помощью директивы new.

ООП Java
ООП Java

ООП С++

Данный язык является многопарадигматичным. Однако практически все разработчики применяют его в рамках объектно-ориентированной парадигмы.

Процесс формирования классов и объектов в С++ очень схож с предыдущими языками, так что не будем повторяться и сразу перейдем к рассмотрению модификаторов доступа. Эти элементы хорошо передают суть принципа инкапсуляции. Как и в любом другом ЯП, в ООП C++ есть 3 типа модификаторов доступа:

  • public – информация будет отображаться везде, даже вне класса;
  • protected – информация будет отображаться в классе и его наследниках;
  • private – информация будет отображаться только в классе и, следовательно, для преобразований потребуются методы (set, get).
В компиляторе поля объекта будут показываться только с указанием модификатора доступа класса. По умолчанию в данном языке класс объявляется как private.

Также отметим, что модификатор в C++ ООП устанавливается на область, а не конкретно на каждое поле и метод. Приведем конкретный пример:

class Employee

{

public:

String firstName;

String lastName;

int age

};

Только до 6.05
Скачай подборку материалов, чтобы гарантированно найти работу в IT за 14 дней
Список документов:
ТОП-100 площадок для поиска работы от GeekBrains
20 профессий 2023 года, с доходом от 150 000 рублей
Чек-лист «Как успешно пройти собеседование»
Чтобы получить файл, укажите e-mail:
Введите e-mail, чтобы получить доступ к документам
Подтвердите, что вы не робот,
указав номер телефона:
Введите телефон, чтобы получить доступ к документам
Уже скачали 52300

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

private:

int IDnumber

};

ООП JS

Объектно-ориентированное программирование в JavaScript несколько отличается от ООП в других языках. К примеру, чтобы сформировать новый объект в JS, помимо вышеуказанного способа с new, могут применяться фигурные скобки: Employee = {};. Этот метод является наиболее популярным.

НУЖНА КАРТИНКА

Существует два синтаксиса добавления характеристик в объект: через точку и через квадратные скобки. Например:

  • name = «Tom»;
  • Employee[«name»] = «Tom»;

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

В языке TypeScript, который был разработан на базе JavaScript в 2012 году, также могут применяться принципы ООП JS. Этот ЯП является полностью объектно-ориентированным.

ООП Python

Python может использоваться в разных парадигмах. Однако его основу составляет именно ООП. Рассмотрим пример создания класса со свойствами в этом языке:

class Employee:

name

age

phone number

Для добавления методов разработчику потребуется задействовать def:

def ИмяМетода(self, …):

# код метода

Сформируем объект:

obj1 = Employee()

obj2 = Employee()

Чтобы определить тип сформированных объектов, можно воспользоваться методом type. Нужно будет передать ему названия этих объектов:

print(type(obj1))

Ответ будет следующим:

<class ‘__main__.Employee’>

При обозначении модификаторов доступа в Python ООП, как правило, применяется символ подчеркивания:

  • protected – «_» перед элементом данных этого класса;
  • private – «__» перед членом данных этого класса (двойной символ подчеркивания).

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

3 полезных книги по ООП

Чтобы освоить ООП, разработчик может ознакомиться со специализированной литературой по этой теме. Рассмотрим несколько полезных книг по объектно-ориентированному программированию:

  • Бертран Мейер «Почувствуй класс. Учимся программировать хорошо с объектами и контрактами»

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

  • Гради Буч «Объектно-ориентированный анализ и проектирование с примерами приложений»

Не самая простая для изучения литература. Книгу сложно назвать практическим самоучителем по ООП. Она больше напоминает подведение итогов и теоретическое обоснование.

В своем труде Гради Буч рассмотрел взаимосвязь между объектно-ориентированным восприятием мира и когнитивными психологическими особенностями человека. Автор подчеркивает необходимость абстракции и иерархии.

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

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

  • Мэтт Вайсфельд «Объектно-ориентированное мышление»

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

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

3 полезных книги по ООП
3 полезных книги по ООП

Данная литература больше подойдет тем, кто хочет получить общее представление об ООП.

Часто задаваемые вопросы об объектно-ориентированном программировании

Чем ООП отличается от функционального программирования?

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

Где применяется объектно-ориентированное программирование?

Чаще всего ООП применяется в процессе написания ОС, СУБД, компиляторов, драйверов и различных прикладных программ. К примеру, на основе этой парадигмы разработаны практически все популярные браузеры, Microsoft Office, Adobe Photoshop и Illustrator.

Какой язык больше подходит для ООП?

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

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

Сортировать:
По дате публикации
По рейтингу
До конца акции осталось
0 дней 00:00:00
Дарим скидку 64% на обучение «Разработчик»
  • Получите новую профессию с гарантией трудоустройства
  • Начните учиться бесплатно, 3 месяца обучения в подарок
Забронировать скидку на обучение
Забрать подарок

Получите подробную стратегию для новичков на 2023 год, как с нуля выйти на доход 200 000 ₽ за 7 месяцев

Подарки от Geekbrains из закрытой базы:
Осталось 17 мест

Поздравляем!
Вы выиграли 4 курса по IT-профессиям.
Дождитесь звонка нашего менеджера для уточнения деталей

Иван Степанин
Иван Степанин печатает ...