операционную систему unix можно охарактеризовать как
Операционную систему unix можно охарактеризовать как
Операционная система UNIX
Первой целью при разработке этой системы было стремление сохранить простоту и обойтись минимальным количеством функций. Все реальные сложности оставлялись пользовательским программам.
Второй целью была общность. Одни и те же методы и механизмы должны были использоваться во многих случаях. Поэтому общность в UNIX-системах проявляется во многих аспектах, и в частности:
Наконец, третья цель заключалась в создании операционной среды, в которой большие задачи можно было бы решать, комбинируя существующие небольшие программы, а не разрабатывая программы заново.
Важным, хотя и простым с позиций его реализации, является тот факт, что система UNIX предоставляет пользователям возможность направить выход одной программы непосредственно на вход другой (речь идет о программных каналах (pipe). См. об этом ниже и в разделе «Конвейеры и очереди сообщений», глава 6). В результате большие программные системы можно создавать путем композиции имеющихся небольших программ, а не путем написания новых, что в большинстве случаев упрощает задачу.
Блок-схема системного ядра ОС UNIX
Резедентная в ОП часть системы называется ядром. На диске ядро оформлено как выполняемый файл, считываемый начальным загрузчиком в ОП, начиная с нулевого адреса. После загрузки ядро получает управление и в дальнейшем постоянно присутствует в ОП, работая в режиме «Система».
На рисунке 17.1 показана блок-схема ядра операционной системы UNIX.
Рис.17.1. Блок-схема ядра операционной системы UNIX.
На рисунке 17.1 показана блок-схема ядра операционной системы UNIX. Ядро содержит системные программы, которые выполняют диспетчерские функции, и управляющие структуры данных, используемые этими программами. Все работы, выполняемые вне ядра, оформлены в виде процессов, работающих режиме «Пользователь»
Отличия ОС UNIX от других систем
К основным функциям операционной системы UNIX можно отнести следующее:
В структуре можно выделить три основные части:
На рисунке 17.2 представлена структура ОС UNIX.
Рис.17.2. Структура ОС UNIX.
Жизненый цикл процесса в ос UNIX.
На рисунке 12.1 представленна блок-схема жизненного цикла процесса в ОС UNIX.
Рис.12.1.Блок схема жизненного цикла процесса в ОС UNIX.
Для создания системного процесса используется системный вызов fork (разветвление), в результате которого получаются два идентичных процесса, называемые родительский процесс и порожденный (дочерний) процесс. Они не имеют общей первичной памяти, но совместно используют все открытые файлы. Для уничтожения процесса имеется вызов EXIT, который завершает работу данного процесса и передает код возврата (завершения) родительскому процессу. Сегменты данного процесса уничтожаются. Остается структура пользования для родительского процесса. Когда родительский процесс подучил информацию об уничтожении порожденного им процесса, тогда уничтожается структура пользования и освобождается место в таблице процессов.
УПРАВЛЕНИЕ ПРОЦЕССАМИ В ОС UNIX
Схемы взаимодействия между процессами соответствуют механизму сопрограмм. Использование сопрограмм упрощает логику ядра системы и требует одного выделенного процесса, который создается нестандартным образом. С него начинается работа системы после запуска. В ОС UNIX этот процесс называется «диспетчерским» («swapper»), он не имеет пользовательской фазы.
Все процессы в ОС UNIX, кроме диспетчерского, создаются операцией «Порождение». В этой операции участвуют два процесса: порождающий и порожденный. Порождающий выполняет системный вызов (fork), в результате появляется порожденный процесс.
Адресное пространство процесса состоит из 3 сегментов:
Управление процессами осуществляется в ОС UNIX с помощью двух структур.
1. PROC-STRUCTRE (блок управления процессом). Составляющие блока:
2. USER-STRUCTRE (структура использования)- содержит информацию о процессе, которая должна быть доступна только на уровне исполнения. Содержание структуры:
В ОС UNIX нет разницы между задачами и заданиями. Работы в системе представлены множеством конкурирующих процессов. Процесс строго последователен, нельзя выполнять асинхронные действия внутри процесса. Даже операция I/O не может быть выполнена асинхронно.
Распределением ресурсов между процессами занимается ядро ОС. Программы ядра выполняются от имени процесса. Процесс может находится: в режиме пользователя или в режиме системы.
На рисунке 12.2 приведена таблица связи между структурами.
Рис.12.2. Таблица связи между структурами.
Чем Linux отличается от UNIX, и что такое UNIX-подобная ОС?
UNIX (не стоит путать с определением «UNIX-подобная операционная система») — семейство операционных систем (Mac OS X, GNU/Linux).
Первая система была разработана в 1969 в Bell Laboratories, бывшей американской корпорации.
UNIX-подобная ОС
UNIX-подобная ОС (иногда используют сокращение *nix) — система, образованная под влиянием UNIX.
Слово UNIX используется как знак соответствия и как торговая марка.
Консорциум The Open Group обладает торговой маркой «UNIX», но наиболее известен как сертифицирующий орган для торговой марки UNIX. Недавно на The Open Group был пролит свет в связи с публикацией спецификации «Single UNIX Specification», стандартов которым должна удовлетворять ОС чтобы гордо называться Unix.
Вот здесь вы можете взглянуть на генеалогическое древо UNIX-подобных операционных систем.
Linux
Linux — общее название UNIX-пободных операционных систем, которые разработаны в рамках проекта GNU (проект по разработке СПО). Linux работает на огромном множестве архитектур процессора, начиная от ARM заканчивая Intel x86.
Наиболее известными и распространенными дистрибутивами являются Arch Linux, CentOS, Debian. Также существует много «отечественных», российских дистрибутивов — ALT Linux, ASPLinux и другие.
Возникает довольно много споров об именовании GNU/Linux.
Сторонники «open source» используют термин «Linux», а сторонники «free software» — «GNU/Linux». Я предпочитаю первый вариант. Иногда для удобства представления термина GNU/Linux используют написания «GNU+Linux», «GNU-Linux», «GNU Linux».
В отличие от коммерческих систем (MS Windows, Mac OS X) Linux не имеет географического центра разработки и определенной организации, которая владела бы системой. Сама система и программы для нее — результат работы огромных сообществ, тысяч проектов. Присоединиться к проекту или создать свой может каждый!
Вывод
Подводя итог, я могу сказать, что отличия между Linux и UNIX очевидны. UNIX — намного более широкое понятие, фундамент для построения и сертификации всех UNIX-подобных систем, а Linux — частный случай UNIX.
Что такое UNIX и зачем он нужен
Операционная система, которая изменила мир, хотя в ней почти никто не работал
В 1970-х годах в мире появился UNIX — операционная система, из которой растут ноги у большинства современных операционок. Для своего времени это был технологический прорыв, а заложенные там принципы мы используем до сих пор. В этой статье — что же там было такого революционного.
👍 Статья расширяет кругозор и помогает лучше понять информатику, но не имеет прикладной ценности. Если вам нужно что-то прикладное — прочитайте про размеры элементов в CSS.
Однозадачные компьютеры
Когда компьютеры только начали появляться, то работали они примерно так:
Получается, что они работали в однозадачном режиме: работает только одна программа, а для запуска второй нужно остановить первую. По этому принципу до сих пор работают контроллеры в ваших микроволновках и холодильниках, а также контроллеры типа Arduino.
Сначала такой подход всех устраивал, потом стало неудобно.
Многозадачные компьютеры
Чтобы компьютер работал более эффективно, программисты написали код, который управляет работой всего компьютера — операционную систему.
Первые операционные системы были псевдомногозадачными. Это значит, что они не запускали одновременно несколько программ, а в цикле по очереди брали по одной команде из каждой программы и выполняли их. Так как переключение между командами из разных программ происходит быстро, то создаётся впечатление, что они работают одновременно.
Потом эту проблему тоже решили, и компьютер мог выполнять несколько программ действительно одновременно, чтобы они не мешали друг другу. Так появились многозадачные операционные системы.
Но в то время домашних компьютеров не было, а желающих поработать за университетским компьютером было много, поэтому все работали по очереди. Например, один лаборант работал на нём с часу до двух, второй — с двух до трёх, а научный руководитель работал за компьютером с трёх до шести.
При этом мощности компьютеров уже хватало на то, чтобы с ним мог работать второй пользователь, не замедляя работу первого. А вот операционных систем, которые бы так умели, — не было. И здесь появляется UNIX.
UNIX — многопользовательская операционная система
Создатели UNIX Кен Томпсон и Деннис Ритчи (который потом напишет язык C) решили проблему так:
Со стороны пользователя кажется, что весь сервер в его распоряжении, но на самом деле сервером могут пользоваться одновременно десятки человек и не знать о том, что сервер выполняет что-то ещё. Сейчас это звучит обычно и примитивно, но для того времени это был прорыв.
Операционную систему, которая умеет всё это делать, назвали UNIX — сокращение от Uniplexed Information and Computing Service (единый информационно-вычислительный сервис). Изначально это называлось UNICS, но потом последние две буквы превратились в одну.
Что нового появилось в UNIX, чего до неё не было
Вот что впервые появилось именно в UNIX — и в виде идей, и в виде готового кода:
Файловая система с любой глубиной вложенности. Мы сейчас привыкли к папкам, в которых можно создавать другие папки, а в них третьи и так почти до бесконечности. Но до UNIX глубина вложенности была ограничена — нельзя было создать, например, папку внутри другой папки.
Модель работы с файлами. Пользователю раньше нужно было самому предусмотреть формат, размер и физическое размещение файлов на диске. В UNIX это всё взяла на себя операционная система.
Работа с программами напрямую. До UNIX настройку работы всех программ можно было сделать только в командной строке: запустил → компьютер что-то посчитал → показал результат. Если нужно изменить параметры, то это надо было делать через командную строку. В новой системе можно было менять настройки программ прямо внутри них — именно так и устроены сейчас все программы.
Вывод всего как текста. Раньше компьютеры работали с битами и выводили битовые последовательности. Их нужно было отдельно разбивать на нужные фрагменты или использовать встроенные программы для перевода битов в байты, а из них — в текст.
В UNIX единица вывода — это не бит, а байт. А в байт как раз умещается символ текста, а значит, с ним можно работать как с текстом: искать, склеивать с другими, отправлять в файл и так далее.
Регулярные выражения стали использоваться не только в профессиональных задачах, но и как основа для обработки вывода программ.
Язык C. Этот язык появился в UNIX как замена языка B. Но B был интерпретируемым языком (как Python), и для запуска программ нужен был его интерпретатор. Язык C — компилируемый, а значит, готовые программы можно запускать на любом совместимом компьютере, даже если на нём нет компилятора C.
Протокол TCP/IP. До UNIX этот протокол не был популярен, и компьютеры связывались друг с другом по более старому протоколу, который не имел столько возможностей. Теперь благодаря этой операционной системе весь мир пользуется интернетом, построенным на протоколе TCP/IP. Справедливости ради, этот протокол появился не в первой поставке UNIX.
Как работают в UNIX
Для управления этой системой почти всегда используется командная строка. Есть, конечно, и графический интерфейс для некоторых систем и задач, но штука в том, что UNIX заточен на работу в серверах. А у серверов чаще всего нет ни клавиатуры, ни монитора — только сетевые соединения, через которые пользователи и соединяются с сервером, чтобы им управлять.
Как UNIX стал стандартом
С середины 1970-х годов идёт довольно мутная история, в которой компания
AT&T долго и небезуспешно пытается заработать на UNIX, а американские университеты и инженеры-любители делают свою открытую версию. Идёт конкуренция между стандартами, инструментами, поставками и протоколами.
Конкуренция выливается в то, что у UNIX появляется множество более совершенных потомков. Их мы называем Unix-подобными системами.
Можно сказать, что Unix-подобность — это такой набор правил, условностей и стандартов, которых должны придерживаться новые операционки, чтобы сохранять преемственность и некоторую совместимость. То есть такой ГОСТ для операционных систем. Операционка может быть и без ГОСТа, но с ним лучше.
Где сегодня используется UNIX
В чистом виде UNIX сейчас используется только на серверах и оборудовании связи. Всё дело в том, что для домашнего использования эта система подходит слабо: у неё нет встроенного графического интерфейса и все операции и программы нужно настраивать вручную.
Зато если нужна гарантированная надёжность, производительность и масштабируемость, особенно при сетевых нагрузках, — используют UNIX или производные от неё. Про них сейчас тоже расскажем.
UNIX-подобные системы
На основе оригинальных версий Юникса появилось много разных операционных систем: BSD, Solaris, HP-UX и даже MacOS, который сделан на основе BSD версии 4.4. Идеи, которые были заложены 50 лет назад, оказались настолько рабочими, что применяются до сих пор.
А ещё есть Linux и его производные — RedHat, Calculate, Ubuntu и ещё сотня дистрибутивов. Многие думают, что Линукс — это развитие Юникса, но на самом деле это полностью самостоятельное и независимое от него семейство операционных систем, хотя и слова похожие. Про Линукс обязательно расскажем в следующей статье.
Философия Unix: Краткое введение
Философия Unix лежит в основе не только оригинальной UNIX, разрабатываемой Кеном Томпсоном в Bell Labs с 1969 года, но и ее многочисленных прямых потомков и клонов, к коим относятся Solaris, Linux и семейство BSD(1), называемые в совокупности Unix-подобными операционными системами. Она оказалась определяющим фактором быстрого роста и успеха Linux и стала причиной того, что эти операционные системы до сих пор считаются лучшими(1) операционными системами, разработанными на сегодняшний день, несмотря на то, что они, безусловно, являются самыми старыми операционными системами в широком доступе.
Не существует единого стандартизированного изложения философии. Но если бы ее нужно было описать одним словом, то это слово было бы модульность, что подразумевает систему, состоящую из компонентов (то есть модулей), которые могут быть собраны вместе и скомпонованы различными способами.
Модульность является обычным явлением в природе, и ее применение к продуктам, созданным руками человека (как товарам, так и услугам), было ключевым фактором в развитии и прогрессе индустриального общества. Тем не менее, она относительно мало использовалась для компьютерного программного обеспечения до разработки UNIX, и даже сегодня ее огромные преимущества не могут быть полностью раскрыты другими операционными системами, в первую очередь системами Microsoft Windows.
Несколько более длинное и более традиционное изложение философии Unix, но которое по сути говорит то же самое, было бы следующим: разрабатывайте программы так, чтобы они выполняли только одну задачу, но делали это хорошо, и чтобы они хорошо работали вместе с другими программами(3)..
Философия обычно излагается в виде серии кратких правил или принципов(4). Хотя все они обычно логически вытекают из концепции модульности (например, небольшой размер, эффективность, простые интерфейсы и легкость понимания), думаю будет полезно сформулировать и обсудить их по отдельности.
Среди этих принципов выделяют так называемое правило композиции, которое гласит, что программы (из которых состоит модульная операционная система) должны разрабатываться таким образом, чтобы их можно было легко подключать к другим программам. Еще одно — правило тишины, которое гласит, что программы по умолчанию не должны ничего говорить (т. е. не выдавать никаких результатов), кроме того, что может быть интересно, необычно или удивительно.
К реализации принципа модульности в Unix-подобных системах подошли очень серьезно, стараясь применять его не только к программам, но и к их составным частям, таким как алгоритмы, и даже к ядру (т. е. ядро операционной системы). Таким образом, Unix-подобная операционная система обычно (или, по крайней мере, в идеале) состоит из небольшого ядра и большого количества небольших специализированных программ, которые могут взаимодействовать друг с другом через множество четко определенных интерфейсов.
Самый известный из этих интерфейсов, который к тому же является одним из самых важных нововведений UNIX — это pipe (конвейер, пайп). Представленные вертикальным символом черты в командах, вводимых пользователем, пайпы позволяют комбинировать программы так, что выходные данные одной становятся входными данными другой. Такие конвейеры команд позволяют легко выполнять узкоспециализированные операции, которые были бы достаточно затруднительными или практически невозможными при использовании немодульной системы.
Другим важным принципом этой философии является использование читаемого текста (plain text — т. е. человеко читаемых буквенно-цифровых символов) вместо двоичных файлов (которые не очень легко читаются человеком) в максимально возможной степени для входных и выходных данных программ и файлов конфигурации. Это потому, что текст — это универсальный интерфейс, то есть, он может позволить программам легко взаимодействовать друг с другом в виде текстовых выходных и входных данных, избавляя их от трудностей, которые возникли бы у них, если бы каждая из них использовала взаимно несовместимые двоичные форматы, и потому, что с такими файлами людям легче взаимодействовать. Последнее означает, что людям легко изучать, исправлять, улучшать и расширять такие файлы, а также переносить (т. е. модифицировать) их на новые платформы (т. е. другие комбинации операционных систем и оборудования).
Помимо того, что она сделала Unix-подобные операционные системы более эффективными и простыми в использовании, философия Unix также способствует их развитию и совершенствованию. Это связано с тем, что использование небольших специализированных (т. е. модульных) программ значительно облегчает разработчикам их улучшение в сравнении с громоздкими многофункциональными программами. Одна из причин заключается в том, что небольшие программы могут быть достаточно маленькими и простыми для понимания одним человеческим разумом, в то время как большие и сложные программы, как правило, не могут. Это также связано с тем, что такая специализация делает практичным для разработки (включая улучшения) быть максимально распределенной, а не сконцентрированной в одном или нескольких центральных местах.
Исторический контекст
Еще одним важным фактором стремления Томпсона к максимальной простоте и эффективности был тот факт, что он изначально написал свою операционную систему для компьютера PDP-7, который имел чрезвычайно маленькую оперативную память, всего 4000 18-битных слов. (Однако это считалось вполне приемлемым, когда этот компьютер был создан в 1965 году, особенно с учетом его низкой стоимости — всего 72000$ за базовую модель.)
Хотя за последующие десятилетия размер и сложность Unix-подобных операционных систем значительно увеличились в ответ на непрерывное снижение стоимости памяти и повышение производительности CPU (центрального процессора), наследие первоначальной простоты продолжает жить, а Unix-подобные операционные системы по-прежнему гораздо более модульны, чем большинство других систем (в первую очередь систем Microsoft Windows).
Снижение доли рынка UNIX по сравнению с системами Microsoft Windows, начавшееся в 1990-х годах, иногда объяснялось мнением, что UNIX — это старая, неуклюжая система, которая изжила себя. Однако оказалось, что это снижение на самом деле не связано ни с каким-либо внутренним дефектом ни в философии, ни в самой операционной системе, ни с каким-либо врожденным превосходством систем Microsoft. Скорее, это было результатом того факта, что философия была разработана для другой эпохи, когда к программному обеспечению относились как к математике или любому другому научному знанию. То есть программное обеспечение было чем-то, чем можно было поделиться и улучшить для всеобщего блага, а не чем-то, что нужно было копить и оберегать ради увеличения корпоративной прибыли.
Таким образом, вместо отказа от философии требовалось что-то дополнительное, чтобы операционные системы, основанные на ней, могли снова процветать и расти в этой новой среде. Это дополнение появилось в форме концепции лицензирования свободного/бесплатного программного обеспечения, которая сохраняет программы бесплатными не только в финансовом смысле, но и в отношении их использования (включая копирование, изменение, расширение и распространение). Особенно важным в этом контексте было развитие концепции copyleft (авторского лева), которая предотвращает появление доминирующих версий, требующих использования дорогостоящего оборудования, а также способствует совместимости между различными версиями, не препятствуя инновациям. Результатом стало возвращение широкой общественности права собственности на Unix-подобные операционные системы и прикладные программы для использования с ними, что как следствие привело к оживлению технологического развития.
Контраст с проприетарными системами
Философия Unix явно сильно отличается от философии, лежащей в основе операционных систем Microsoft Windows. Даже больше, эти системы характеризуются некоторыми совсем противоположными качествами. По сути, они монолитны (т. е. не имеют модульности). Конкретные характеристики включают чрезвычайно большие размеры программ, большую сложность исходного кода, очевидное отсутствие мастерства во многих аспектах (например, плохая безопасность), отсутствие прозрачности (исходный код является тщательно охраняемым секретом) и отсутствие портативности (т.е. может работать только на одном базовом типе процессора).
Исходный код (source code, также называемый source или code) — это версия программного обеспечения (обычно прикладная программа или операционная система) в том виде, в котором она изначально написана (т. е. набрана на компьютере) человеком в виде обычного текста. Он может быть написан на любом из многочисленных языков программирования, одними из самых популярных из которых являются C, C ++, Java, Perl, PHP, Python и Tcl/Tk.
Этот резкий контраст вполне естественен, поскольку операционные системы Microsoft Windows, как и многие другие проприетарные (т. е. коммерческие) программы, возникли в другую эпоху и руководствуются совершенно другим набором приоритетов. Упор делается на завоевание или поддержание доли рынка и максимизацию прибыли, и мало внимания уделяется приоритетам разработчиков UNIX. Вероятно, также играет роль совершенно другая модель разработки (например, централизованная в противовес распределенной разработке).
Конечно, в таких рыночных целях нет ничего плохого. Даже больше, они, в целом, полезны, поскольку именно они были причиной огромного экономического роста, который произошел во всем мире в начале последнего тысячелетия. Тем не менее, как быстро отметят экономисты, эти цели приносят максимальную пользу обществу только там, где существует свободная конкуренция (т. е. существует множество продавцов и покупателей, конкурирующих на основе цены и качества), а не там, где рынки (в силу самых разных обстоятельств) становятся монополистическими (т. е. характеризуются только одним поставщиком или продавцом продукта без хороших альтернатив).
За пределами проприетарного UNIX
Большой успех UNIX и его философии оказал влияние далеко за пределы оригинальной операционной системы, которая была разработана в Bell Labs, а затем в Калифорнийском университете в Беркли (UCB). Возможно, наиболее важно то, что они формируют основу Linux, которая в настоящее время является самой быстрорастущей операционной системой и которая, по мнению многих компьютерных экспертов, может стать доминирующей системой для многих приложений в будущем.
Linux удалось вернуть преимущества философии Unix на первый план и в целом вернуть Unix-подобные операционные системы на их прежнюю лидирующую роль, в основном за счет использования лицензий свободного программного обеспечения. Также основополагающим фактором его успеха, а также растущего успеха других свободных программ стала доступность интернета, позволяющая программистам по всему миру сотрудничать. Это во многом помогло уравнять правила игры и позволить бесплатным программам эффективно конкурировать с проприетарных программами (и, возможно, даже поставить под угрозу модель разработки проприетарных программ), несмотря на огромные финансовые ресурсы последних.
Фактически, использование лицензирования свободного программного обеспечения вместе с возможностью для программистов (а также тестировщиков и обычных пользователей) участвовать в процессе разработки независимо от географического положения или членства в организации еще больше расширило базовую концепцию философии Unix (т. е. модульность) и привело к значительному увеличению преимуществ. Это то, что можно назвать философией Linux.
Помимо операционных систем, философия Unix также сыграла важную роль в быстром развитии и поразительном успехе интернета. Этого удалось добиться не только за счет предоставления выдающейся операционной системы, на которой базируется большая часть этой сети, но и за счет демонстрации ценности модульности как для аппаратных, так и для программных аспектов, которые являются основными факторами ее выдающейся производительности, включая ее высокую степень надежности и масштабируемости.
(1) Помимо FreeBSD, NetBSD и OpenBSD, сюда также входит Darwin, на котором базируется достаточно успешная Mac OS X.
(2) Unix-подобные операционные системы обычно считаются наиболее безопасными и надежными (т. е. наиболее устойчивый к сбоям в необычных или стрессовых обстоятельствах), наиболее портативными (т. е. наиболее простыми в адаптации для использования на других типах оборудования) и наиболее кастомизируемыми.
(3) Дуг Макилрой, изобретатель пайпов Unix, резюмировал философию в книге Питера Х. Салуса «Четверть века Unix» в 1994 году следующим образом: «Пишите программы, которые делают одно и делают это хорошо. Пишите программы для совместной работы. Пишите программы для обработки текстовых потоков, потому что это универсальный интерфейс «. Обычно это сильно сокращается до «Делай одно, делай это хорошо». Из трех частей только третья относится к Unix-подобным операционным системам.
(4) Эта философия была хорошо выражена Майком Ганкарцем в его книге 1995 года «Философия UNIX» как набор основных и второстепенных принципов. К первым относятся: маленький — красивый, заставьте каждую программу делать что-то хорошо, как можно скорее создавайте прототип, выберите портативность, а не эффективность, храните числовые данные в неструктурированных файлах, используйте программные средства себе на пользу, используйте shell-скрипты для увеличения мощи и портативности, избегайте скрытых пользовательских интерфейсов и сделайте каждую программу фильтром. К последним относятся: позвольте пользователю настраивать среду, делайте ядра операционных систем маленькими и легкими, используйте строчные буквы и будьте лаконичны, берегите деревья, тишина — это золото, думайте параллельно, сумма частей больше целого, хуже — лучше, и мыслите иерархически.
Материал подготовлен в рамках курса «Программист С». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.