Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування

Замовити дзвінок

Вибери свою IT спеціальність

Підписка

Замовити дзвінок

+38 099 757 27 82
Результати пошуку за запитом: принцип открытости*
Ігри для тренування навичок програмування

Автор: Армен Маїлян

Code Wars CodinGame Cyber Dojo CodeCombat CodeMonkey CSS Diner Flexbox Froggy Flexbox Defense Ruby Warrior Untrusted Robocode CheckIO Elevator Saga Вывод Когда начинали писать код многие из современных гуру программирования, их возможности в обучении были ограничены – книги, справочники, наборы технической документации и спецификаций. Со временем ситуация улучшилась. Начали появляться  различные онлайн ресурсы.  Появилось множество видеоуроков. Родилось и набрало силы новое направление в обучении – онлайн обучение. Онлайн обучение прошло долгий путь в последние несколько лет. Появились интерактивные курсы, в сети Интернет выложено множество видеоуроков, различные онлайн-уроки проводятся с квалифицированными тренерами по множеству направлений. Одним из новых и очень увлекательных способов интерактивного онлайн обучения программированию стали игры, в которых нужно выполнять задания с использованием различных языков программирования. Конечно, одно только написание кода в играх не сделают из вас профессионального разработчика, однако такие игры могут стать действительно полезным способом отработать навыки  и поддержать интерес к обучению. Игры увлекают. Вы внезапно обнаружите, что потратили несколько часов на закрепление своих навыков программирования, даже не осознавая этого. 1. Code Wars Code Wars поможет вам улучшить ваши навыки написания кода, соревнуясь с другими разработчиками. Игра предлагает большое разнообразие языков, включая JavaScript, Swift, PHP, Python, Ruby и Haskell. Сначала вам нужно будет подтвердить ваши навыки, пройдя базовый тест на понимание языка, который вы хотите практиковать. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: Clojure, C, C++, C#, Crystal, Dart, Elixir, F#, Go, Haskell, Java, JavaScript, PHP, Python, Ruby, Rust, Shell, SQL, Swift, TypeScript.   2. CodinGame CodinGame предлагает набор бесплатных игр, которые помогут вам в освоении более 25 различных языков программирования, включая C#, Java, Python, JavaScript, Ruby и PHP. Вы можете выполнять игровые практические задания для проверки навыков или посмотреть примеры, объясняющие различные конструкции языка. Одна из особенностей CodinGame заключается в том, что вы можете играть с друзьями или коллегами, а также участвовать в международных соревнованиях по программированию. Материалы игр доступны на английском и французском языках. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский, Французский. Доступные языки программирования:  Bash, C, C++, C#, Clojure, Dart, F#, Java, JavaScript, Go, Groovy, Haskell, Kotlin, Lua, Objective‑C, OCaml, Pascal, Perl, PHP, Python2, Python3, Ruby, Rust, Scala, Swift, VB.NET. 3. Cyber Dojo В Cyber Dojo есть практические упражнения и задачи для десятков языков программирования, включая C#, Java, C++, Ruby, JavaScript, PHP, Python и другие. Каждое упражнение предполагает определенную задачу, чтобы дополнить имеющийся код, выполняющий определенную задачу. Несмотря на то, что это не совсем игра, а скорее большой набор интересных задач, это все же отличный способ попрактиковать свои навыки в коде. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: Assembler, BCPL, Bash, C, C#, C++, Chapel, Clojure, CoffeeScript, D, Elixir, F#, Fortran, Go, Groovy, Haskell, Java, JavaScript, Kotlin, PHP, Pascal, Perl, Python, R, Ruby, Swift, VHDL, assert, VisualBasic, NUnit. 4. CodeCombat CodeCombat ориентирован на учителей и учеников, но играть может каждый. Эта достаточно яркая и увлекательная платформа подойдет для практики в таких языках как Python, JavaScript, CoffeeScript, HTML и CSS. На начальном уровне подземелий вы будете перемещать своего персонажа по различным уровням игры, используя базовые команды. Далее команды усложняются. Можно играть самому, участвовать в соревнованиях и многопользовательских вариантах игр – все это поможет вам не заскучать во время отработки в этой игре полученных ранее навыков программирования. Имеется возможность играть бесплатно, но получить доступ ко всему контенту можно только по платной подписке. Особенности игры: браузерная игра, есть платный контент. Доступные языки интерфейса: Английский, Русский, Украинский и еще 57 языков. Доступные языки программирования: Python, JavaScript, CoffeeScript, HTML и CSS. 5. CodeMonkey CodeMonkey это онлайн игра, которая обучает программированию с использованием CoffeeScript. CoffeeScript – это современный открытый язык программирования, который по своей сути является  просто надстройкой и синтаксическим сахаром для JavaScript. В основном CoffeeScript используется для веб-приложений. В игре пользователи с помощью кода контролируют поведение обезьяны и помогают ей собирать бананы. CodeMonkey предназначен скорее для обучения детей. Однако данная игра подойдет и взрослым, желающим в простой игровой манере закрепить знания языка. Несмотря на относительно детский интерфейс игры, задачи в CodeMonkey затрагивают такие темы языка программирования, как: объекты, вызовы функций, аргументы, циклы, переменные, массивы, цикл for, определение функций, булевые условия, цикл until, if и if-else условия, булевые операторы, события клавиатуры и мыши.   Имеется бесплатная триальная версия и ряд премиум подписок, позволяющих, в частности, учителям подключать учеников для обучения и контроля выполнения заданий. Особенности игры: браузерная игра, триальная версия на 14 дней и платная подписка. Доступные языки интерфейса: Английский, Русский, и еще 16 языков. Доступные языки программирования:  CoffeeScript (JavaScript). 6. CSS Diner CSS Diner - простой, но достаточно увлекательный способ изучения языка CSS. Последовательно проходя 32 уровня, вы в игровой манере сможете познакомиться с основами работы CSS-селекторов. Начиная с простых селекторов по классам  и тэгам  уровни этой бесплатной игры постепенно усложняется, основываясь на том, что вы запомнили на предыдущих уровнях. Под конец вы будете использовать сложные структурные селекторы наподобие и их комбинации. Эта игра будет полезна тем, кто ищет удобный и нескучный инструмент, чтобы попрактиковаться в верстке. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: CSS. 7. Flexbox Froggy Flexbox Froggy это удобный инструмент для тех, кто уже имеет определенные навыки работы с CSS и хочет на практике, и в интересной манере, изучить основы такой технологии, как CSS Flexible Box Layout Module (или CSS Flexbox).  У Flexbox Froggy достаточно простой интерфейс, с помощью которого вы научитесь основам выравнивания во Flexbox, пока вы помогаете лягушонку Фрогги и его друзьям в их приключениях. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский, Русский, Украинский и еще 28 языков. Доступные языки программирования: CSS. 8. Flexbox Defense Flexbox Defense - еще один интересный способ попрактиковаться в навыках работы с Flexbox. Это игра по принципу Tower Defense. В этой игре вы будете с помощью CSS свойств размещать пушки в нужные места вдоль пути, чтобы победить встречные волны врагов. Вы получите нужную практику в интересной интерактивной манере, используя те же команды, что и в Flexbox Froggy. Особенности игры: браузерная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: CSS. 9. Ruby Warrior Если вы хотите изучать язык Ruby, тогда Ruby Warrior - это игра для вас. Управляя персонажем рыцаря с помощью кода на Ruby, вы будете выполнять игровые задачи, сражаться с монстрами и проходить подземелья. В игре есть простые и сложные задания, подходящие вашему уровню владения языком Ruby. Играя в Ruby Warrior вы улучшите ваши знания циклических и условных конструкций, создания и вызова методов. Авторизация в игре происходит через аккаунт Facebook. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: Ruby. 10. Untrusted Untrusted - это приключенческая игра, которая поможет вам проверить и закрепить ваши знания и навыки JavaScript для решения различных проблем. Вы будете использовать код на JavaScript, чтобы провести доктора Эвала по разным локациям электронной вселенной. Это увлекательная бесплатная игра поможет отработать достаточно сложные навыки применения JavaScript. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Языки: JavaScript 11. Robocode Robocode  подойдет вам, если вы когда-нибудь интересовались играми с противостоянием различных роботов. Играя в Robocode, вы приобретете и укрепите навыки программирования, создавая виртуальные боевые роботы-танки. Логику поведения этих роботов вы будете прописывать, используя языки Java или C# с помощью вашей IDE. Битвы с такими роботами затем разыгрываются в браузере на экране в режиме реального времени. Особенности игры: бесплатная игра; онлайн игра, но требует установки определенных модулей на ваш ПК. Доступные языки интерфейса: Английский. Языки: Java или C#. 12. CheckIO CheckIO  - это стратегическая игра, которая будет интересна как начинающим, так и уже продвинутым программистам. Вы будете выполнять  задания, которые помогут лучше изучить особенности выбранного языка программирования. Данная игра поможет вам вписать код лучше. Набирая балы за выполнение задания, вы можете также сравнивать свои ответы с ответами других игроков CheckIO. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: Python, JavaScript. 13. Elevator Saga Elevator Saga поможет вам протестировать ваши знания JavaScript во время решения  проблем, связанных с перемещением лифта и транспортировкой людей наиболее эффективным способом. Начинается задача с перемещения 15 человек, затем задачи становятся сложнее. Особенности игры: браузерная игра, бесплатная игра. Доступные языки интерфейса: Английский. Доступные языки программирования: JavaScript. Для удобства подбора подходящей игры мы собрали их в таблицу: Не всегда только суровая зубрежка и толстые учебники способствуют получению знаний. Обучение в игровой форме – это также один из лучших способов запомнить что-то новое или закрепить уже существующий навык. Вывод Многие из представленных в этом обзоре игр смогут реально помочь Вам улучшить понимание основного инструмента разработчика – языка программирования. Мы включили в этот обзор как игры, полезные при изучении языков программирования, так и те из них, что помогут лучше запомнить конструкции CSS, HTML, SQL. В некоторых играх вы будете выполнять готовые задачи, зарабатывая баллы и играя «против компьютера», некоторые игры позволят вам соревноваться с другими разработчиками в поиске решений чужих задач и предложении встречных задач. Учитесь, играючи и обучайтесь во время игры! Мы надеемся, что наша подборка игр поможет вам в этом. Также всем, кто изучает программирование, мы рекомендуем использовать интерактивный тренажер навыков ITVDN. В тренажере вас ждут задания, которые нужно выполнять, используя навыки программирования. За правильные решения вы будете получать баллы. В случае ошибки, вы сможете воспользоваться подсказками, но за использование подсказок будут сниматься баллы. Итак, ваша задача – выполнить все задания на тренажере, набрав максимальное количество баллов! На ITVDN доступны интерактивные тренажеры по таким языкам программирования и технологиям: HTML5&CSS3 (уровень Starter и Essential) JavaScript (уровень Essential и Advanced) Python (уровень Starter и Essential) Java Starter C# (уровень Starter и Essential) SQL Essential C++ (уровень Starter и Essential) Перейти в Тренажер ITVDN  
10 заповідей Node.js розробника

Автор: Редакция ITVDN

10 отменных советов как стать лучшим Node.JS разработчиком 2018 года от автора Азата Мардана. Эта статья содержит в себе собранный и тщательно отфильтрованный опыт писателей и спикеров технологии всего Веб-сообщества. Заметка: первоначально заголовком статьи должно было быть «Лучшие практики Node.JS от Гуру Технологии». Эта статья охватывает не «новые» и «лучшие» практики 2017-2018 года, а тщательно выверенные и проверенные временем и практикой паттерны, которые стопроцентно приведут к успеху. И хотя многие из проверенных практик Вам определенно пригодятся в 2018, 2019 и даже более поздних годах, статья не включает в себя такие новшества, как async/await и прочее. Почему? Потому что эти фичи не включены в состав, собственно говоря, кода Node.JS-ядра или кода таких популярных проектов как npm, Express и прочие. Полноценно заниматься разработкой на Node.JS я начал в 2012 году, когда присоединился к Storify. С тех пор я никогда не жалел о принятом решении и не ощущал, как будто я многое потерял, закинув Python, Ruby, Java или PHP – языки, с которыми я работал на протяжении предыдущего десятилетия. Работа в компании Storify для мня оказалась достаточно интенсивной. В отличии от большинства компаний, все приложения Storify работают исключительно на JavaScript. Как вы понимаете, большинство компаний, особенно такие крупные как PayPal, Walmart или Capital One, используют Node.JS только для конкретных определенных задач. Как правило, это gateway API. Однако, с точки зрения программиста, ничего не может быть лучше, чем работа и погружение с головой в одну определенную технологию. Краткая сводка: Избегайте нагромождения – пытайтесь разбивать свой код на столько мелких составных частей, насколько это вообще возможно. И даже больше. Используйте асинхронный подход – избегайте синхронное программирование словно чумы. Избегайте блокировки потоков – помещайте ВСЕ требуемые утверждения в начало файла, ибо они синхронные и, следовательно, будут блокировать программу. Require должен быть закеширован – считайте, это такая фича в Вашем коде. Или баг. Как Вам угодно. Всегда проверяйте свой код – ошибки – это не вышивание, которое можно выбросить в любом момент. Никогда не упускайте обнаруженные ошибки! Используйте try…catch только в синхронном потоке – try…catch бесполезен в асинхронном коде. Кроме того, v8 никогда не оптимизирует try…catch-код. Возвращайте значения или используйте if…else – просто на всякий случай: возвращайте значения что бы остановить выполнение участка кода. Обращайте внимание на события ошибок – почти все Node.JS-классы или объекты реализуют паттерн-наблюдатель и производят события-ошибки. Не стоит пропускать их. Познайте свой npm – устанавливайте модули с ключами –S или –D вместо –save или –save-dev. Используйте текущие версии в package.json – при работе с npm он по-тупому просто добавляет верхнюю скобочку по умолчанию при использовании вместе с ключом –S. Дабы избежать этого, просто вручную блокируйте версии. Никогда не доверяйте semver в своих приложениях, но доверьтесь ему в модулях с открытым исходным кодом. Бонус – используйте разные зависимости. Помещайте то, что требует проект только в процессе разработки в devDependencies. После этого используйте npm i –production. Чем больше ненужных зависимостей используется, тем больше риск возникновения уязвимостей.   Давайте разберем некоторые из этих пунктов поподробнее: Избегайте нагромождения Взгляните на некоторые модули, написанные Исааком З. Шлейтером, создателем npm. К примеру, use-strict включает «строгий» режим написания JavaScript-модульного кода. Включается эта опция всего лишь в три строчки: Но почему-же все-таки стоит избегать нагромождения кода? Одна известная фраза американского воздушного флота гласит: «все должно быть просто до идиотизма». И на это существуют свои причины. Человеческий разум не может держать в памяти больше чем от 5 до 7 вещей одновременно. Это просто как факт. Разбивая код на небольшие составные части, Вы и другие разработчики легко сможете разобраться в нем и понять, для чего он предназначен. Так же упрощается процесс тестирования. Вот пример:   Или еще: Уверен, большинство из Вас отдадут предпочтение второму примеру, когда имена переменных сразу же делают понятной их суть. Конечно, в процессе написания кода Вы можете думать, что Вы понимаете, как он работает и так. Возможно, Вам даже захочется продемонстрировать свою смекалку и сообразительность, объединив несколько методов вместе в одну строку. Пожалуйста, пишите так, как если бы Вы были более неопытны. Как если бы Вы не смотрели в код на протяжении 6 месяцев, или очень устали и, кроме того, еще и выпили. Если Вы пишете код на пике своей ментальной активности, Вам будет труднее понимать его позже, не говоря уже о Ваших коллегах, которые даже не знакомы с ходом Ваших мыслей. Держать все в относительной простоте единственно верный метод – особенно в рамках Node.JS-технологии, где используется асинхронный подход. Другими словами, преимущества от использования подхода малых частей значительно более перевешивают недостатки. Помимо прочего, они позволяют значительно быстрее исправить различные ошибки, которые могут возникнуть по разным причинам в процессе работы с Node.JS-приложением.   Используйте асинхронный подход Синхронный код мало где используется в нынешнем Node.JS. Как правило, он находит свое применение в написании CLI-команд или скриптов, не связанных с веб-приложениями. Что же касательно веб-разработки, Node.JS программисты предпочитают использовать асинхронный подход, так как это позволяет избежать блокировки потоков. К примеру, синхронный код будет приемлем, если мы строит скрипт для работы с базой данных, не системы для обработки параллельных/конкурентных задач: Но, в случае веб-приложения, лучше использовать следующее: Отличительная особенность состоит в том, пишите ли вы долго исполняемый конкурентный код или небольшой скрипт с малым временем жизни. А вообще, лучше запомните одно хорошее правило: всегда пишите асинхронный код в Node.JS.   Избегайте блокировки require S обладает простой системой загрузки модулей, которая использует общий формат CommonJS. Самый простой способ подключить модули, разбросанные по отдельным файлам – использовать встроенную функцию require. В отличии о AMD/requirejs, Node/CommonJS синхронна. По сути, функция работает согласно следующему принципу: Вы импортируете то, что было экспортировано в виде модуля или файла. О чем большинство разработчиков даже не догадывается, так это о том, что require кэшируемая. Потому, до тех пор, пока нет заметных изменений зарезервированного имени файла (и, в случае использования npm-модулей, их нет), код модуля будет выполнен и подгружен в переменную только единожды (для обработки). Подобная методика позитивно сказывается на оптимизации. Однако, даже с кэширование, лучше сначала попробуйте обойтись без require. Попробуйте использовать axios-модули. Путь /connect в свою очередь будет медленнее чем требуется, ибо импорт модулей происходит после генерации запроса: Гораздо лучше будет загрузить модули тогда, когда сервер еще даже не определен, не в маршруте: Require должен быть закэширован Хотя я и упоминал о том, что require может быть закэширован, но что так же интересно, так это то, что мы можем поместить код вне module.exports. К примеру: Зная, что некоторые участки кода могут быть запущены только один раз, подобная реализация окажется более чем полезной.   Всегда проверяйте свой код Node.JS – это Вам не Java. В Java Вы выкидываете исключения потому как в большинстве случаев Ваше Java-приложение не должно продолжать работать в случае ошибки. В Java для этого Вы просто используете try…catch. В случае Node.JS история обстоит несколько по-иному. Так как технология выполняется в асинхронном режиме, контекст ошибки всегда будет отделен от любого перехватчика (такого как try…catch) в случае возникновения самой ошибки. Этот код в Node.JS будет просто-напросто бесполезен: Но! Привычный try…catch все еще может быть использован в синхронном режиме. Вот более действенный рефакторинг предыдущего участка кода: Если мы не можем обернуть request-вызов в блок try…catch, ошибка будет не перехвачена. Однако, это легко решается при помощи callback-аргумента error. Кроме того, Вам нужно всегда вручную отлавливать error в каждом и каждом callback`е. Проверяйте наличие ошибки (и убедитесь, что она не равна null) и затем, или демонстрируйте содержание ошибки пользователю или клиенту и потому логируйте ее, или отправляйте ее обратно в место вызова при помощи error-callback`а. В качестве небольшого фокуса Вы можете использовать библиотеку okay. Применяйте ее как наведено ниже что бы обойти ручной проверки на ошибки: Возвращайте значения или используйте if…else .JS – параллельный. Эта особенность может привести к багам, если не отнестись к ней с должной осторожностью. Что бы обезопасить себя, останавливайте выполнение участка кода при помощи ключевого слова return: Избегайте бессмысленной работы (и ошибок) из-за неостановленного вовремя исполнения: Просто убедитесь, что return всегда будет стоять на страже целесообразности работы Вашего кода.   Обращайте внимание на события ошибок Почти все классы/объекты Node.JS реализую паттерн-наблюдатель, который порождает событие-ошибку. Это прекрасная возможность для разработчика отловить особо подлые ошибки и придушить их до того, как они устроят хаос. В качестве полезной привычки было бы неплохо создавать программы-прослушиватели событий-ошибок при помощи использования .on(): Познайте свой npm Многие Node.JS и front-end событийные разработчики знают, что –save (для npm install) не только установит модуль, но так же и создаст запись в package.json с упоминанием текущей версии модуля. Для аналогичных целей существует и –save-dev, опция для модулей, которые нужны только во время разработки. Но знаете ли Вы, что вместо этого можно спокойно использовать –S и –D? Теперь да. И пока Вы в режиме установки модулей, удаляйте символ ^, который будут порождать команды –S и –D. Эти значки могут быть особенно опасными, так как они позволят npm автоматически обновить модуль к последней незначительной версии (вторая цифра в семантике версирования). К примеру, с версии 6.1.0 до версии 6.2.0. Команда NPM полагается на semver, но Вы не должны. Я хочу сказать, что они используют авто обновления к промежуточным версиям модулей с открытым исходным кодом, так как они полагают, что никаких радикальных изменений в этих самых промежуточных версиях не будет. Мой вам совет: не стоит слишком в это верить. Более того, используйте npm shrinkwrap. Команда создаст новый файл с текущими версиями зависимостей зависимостей. И в заключение В этом посте мы охватили много всего: от работы с callback'ами до работы с асинхронными потоками, проверки на ошибки и снятия блокировки зависимостей. Надеюсь, Вы нашли для себя что-то новое и познавательное здесь. Немного об авторе Азат является техническим консультантом и менеджером в Capital One. JavaScript/Node.js-эксперт, автор различных онлайн-курсов. Издатель более чем 12 книг, посвященных теме, включающие такие хиты продаж как Full Stack JavaScript, React Quickly, Practical Node.JS и Pro Express.js и другие. В свое свободное время Азат читает о технике на Webapplog.com, проводит конференции и работает над продуктами с открытым исходным кодом. До того, как стать экспертом Node.JS, работал в федеральных правительственных агентствах США, принимал участие в небольших старт-апах и больших корпорациях, имея дело с такими технологиями, как Java, SQL, PHP, Ruby и прочие. Азат обожает все, что связано с технологиями и финансами, так же увлекается инновационными способами обучения и просвещения людей. Автор перевода: Евгений Лукашук Источник
Як реалізувати інтернаціоналізацію в React

Автор: Yury Dymov

Об авторе Юрий Думов работает архитектором программного обеспечения в SAP, имеет более 10 лет опыта в разработке веб и мобильных приложений. Прежде всего, давайте введем некоторые сокращения. Internationalization - достаточно длинное слово, поэтому предлагаю его заменить в нашем контексте на “intl”. Интернационализация в общем плане может быть разделена на следующие подпункты: Определение пользовательской локали Перевод UI-элементов, заголовков, подсказок и прочего Поддержка местных специфических сервисов, таких как даты, валюты и числа На заметку: в этой статье я заострю ваше внимание лишь на front-end части. Мы разработаем несложное универсальное React-приложение с полной поддержкой интернационализации. Для начала предлагаю воспользоваться моим репозиторием. Здесь у нас есть веб-сервер Express для серверного рендеринга, вебпак для построения клиентского JS, Babel для конвертации современного JavaScript в ES5. Также мы будем использовать npm-run, nodemon для запуска веб-сервера под средой разработчика и webpak-dev-server для ассетов. Нашей точкой входа в серверное приложение будет служить server.js. Здесь мы загружаем Babel и babel-polyfill для создания прочего серверного кода в современном стандарте JavaScript. В качестве бизнес-логики сервера мы используем src/server.jsx. Тут мы устанавливаем Express-сервер для прослушки порта 3001. Для рендеринга мы используем очень простой компонент components/App.jsx, который также является частью точки входа в универсальное приложение. Точкой входа в клиентский JS нам служит src/client.jsx. Тут мы фиксируем корневой компонент - component/App.jsx - для placeholder'а react-view в HTML-разметке, предоставляемой Express-сервером. Таким образом, сейчас мы склонируем репозиторий, запустим npm-install и выполним nodemon и webpack-dev-server одновременно в двух консолях. В первой консоли: И во второй: Наш веб-сервер должен быть доступен по localhost:3001. Откройте предпочитаемый вами браузер и убедитесь в этом сами! Итак, мы готовы начать. Определение пользовательской локали Существует два возможных решения этого вопроса. По какой-то причине большинство популярных веб-сайтов, включая Skype и NBA, используют гео-IP для определения местоположения пользователя, таким образом определяя его родной язык. Подобный подход не только является дорогим в плане реализации, но и еще не совсем точным. Сейчас очень много людей путешествует, по этой причине местоположение пользователя не является надежным ориентиром при выборе подходящего языка приложения. Вместо этого мы предпочтем второй способ решить данную проблему при помощи обработки на стороне сервера заголовка Accept-Language. Этот заголовок отправляется любым более-менее современным браузером.   -Language Этот заголовок предоставляет информацию о возможных вариантах языка, принятого в качестве ответа. Каждый язык обладает своим «приоритетом», показывая, как часто пользователь может его использовать. По умолчанию уровень «приоритетности» равен 1. К примеру, «Accept-Language: da, en-gb;q=0.8, en;q=0.7» означает «я предпочитаю датский, но могу также принять британский или другие виды английского».   (Также стоит упомянуть, что сей подход так же несовершенен. К примеру, пользователь может посетить ваш веб-сайт из интернет-кафе или публичного ПК. Лучше всего разработать виджет, при помощи которого пользователь на интуитивном уровне сможет поменять язык сайта.)   Реализация определения локали пользователя Вот пример кода веб-сервера Node.js. Мы используем пакет accept-language, что извлекает локали из http-заголовков и находит наиболее предпочтительные, исходя из поддерживаемых вашим веб-сайтом. Если таковые не были найдены, тогда сайт будет использовать свою дефолтную локаль.   Приступим к установке пакетов: После чего в src/server.jsx у нас будет следующее: Здесь мы импортируем accept-language и устанавливаем поддержку английских и русских локалей. Также мы реализовываем функцию detectLocale, что извлекает значение локали из куки. Если ни одна не была обнаружена, начинается обработка Accept-Language. Наконец, мы выбираем дефолтную локаль. После обработки запроса мы добавим заголовок Set-Cookie для обнаруженной локали в ответ. Это значение будет использовано для всех последующих запросов.   Перевод UI-элементов, заголовков, подсказок и прочего Здесь я собираюсь использовать React Intl-пакет. Это наиболее популярная и, так сказать, проверенная боем реализация интернационализации для React-приложений. Впрочем все библиотеки так или иначе строятся по одному принципу: они обеспечивают нас компонентами высшего порядка, что внедряют уже готовые функции интернационализации для обработки сообщений, дат, номеров, валют посредством специальных фич React.   Во-первых, мы должны установить провайдер интернационализации. Для этого мы немного изменим src/server.jsx и src/client.jsx. src/server.jsx:          здесь src/client.jsx: Так, теперь IntlProvider-дочерний компонент получит доступ к функциям интернационализации. Давайте добавим переведенный текст в наше приложение и клавишу для изменения локали. У нас есть два способа, как это можно сделать: через FormattedMessage или через formatMessage – функцию. Разница в том, что компонент будет обернут в span-тэг, что хорошо для текстовых данных, но не хорошо для значений HTML-атрибутов, таких как alt и title. Давайте опробуем и их!   Вот src/components/App.jsx: Отметьте, что атрибут id должен быть всегда уникальным для всего приложения в целом, так что было бы не лишним установить для себя некоторые правила именования сообщений. Я предпочитаю следовать формату «имяКомпонента.некийУникальныйИдентификатор». В качестве некой дефолтной локали будет использовано сообщение defaultMessage. Атрибут description предоставит некую информацию для переводчика.   Перезапустите nodemon и обновите страницу в браузере. Вы должны увидеть «Hello World». Но если вы открываете статью при помощи инструментов разработчика, вы увидите, что текст теперь внутри тэга span. В этом случае это не ошибка, но иногда мы предпочитаем просто получить текст, без никаких дополнительных тэгов. Для этого нам нужен прямой доступ к объекту интернационализации React Intl.   Давайте вернемся назад к src/components/App.jsx: Нам нужно написать гораздо больше кода, чем раньше. Во-первых, мы используем injectIntl, который «упаковывает» наш компонент приложения и внедряет intl-объект. Чтобы получить переведенное сообщение, нам нужно вызвать formatMessage и передать в качестве параметра message. Этот message должен иметь свой уникальный идентификатор и атрибуты defineMesasges из React Intl.   Лучшее, что есть в React Intl, так это его экосистема. Давайте добавим babel-plugin-react-intl к нашему приложению и построим словарь трансляции. Мы передадим этот словарь переводчикам, которым не нужно никаких задатков программирования для выполнения своей работы. .babelrc: Перезапустите nodemon, и вы увидите, что папка build/messages была успешно создана в корневой директории проекта, вместе с некоторыми другими папками и файлами внутри. Теперь нам необходимо собрать эти файлы в один JSON. Для этого вы можете использовать мой скрипт. Сохраните его как scripts/translate.js.   Теперь нам нужно добавить новый скрипт в package.json: Что же, попробуем! В конце вы должны увидеть файл en.json в build/lang. И все работает! Теперь пришло время для кое-чего поинтересней. На стороне сервера мы можем загрузить все переводы в память и, соответственно, выдавать их в зависимости от характера запроса. Однако на клиентской стороне этот подход неприемлем. Потому вместо этого мы будем один раз принимать json-файл со всеми переводами, а клиент автоматически определит, какой из текстов ему нужен.   Скопируем результирующий файл в public/assets. На заметку: если вы пользуетесь Windows, симлинки для вас недоступны. Таким образом, вам нужно будет вручную копировать команды каждый раз, как только вы будете перестраивать ваши переводы. public/assets/ru.json применим следующее: Теперь нам нужно повязать серверный и клиентский коды. Для сервера наш src/server.jsx должен выглядеть так: Здесь мы делаем следующее: Кэшируем сообщения и специфичный для данной локали JS для валют, DateTime, Number во время запуска приложения. Расширяем метод renderHTML так, что мы можем вставить специфичный для данной локали JS прямо в разметку. Предоставляем переведенные сообщения IntlProvider (все те сообщения теперь доступны в качестве дочерних компонентов). Что же касается стороны сервера, во-первых, нам нужно установить библиотеку для выполнения AJAX-запросов. Я предпочитаю использовать изоморфное обновление, так как, скорее всего, нам предстоит запрашивать данные из сторонних API, и изоморфное обновление очень хорошо с этим справляется. Вот src/client.jsx: Также мы должны затронуть src/server.jsx, чтобы Express предоставлял json с переводом на сторону клиента. Заметьте, что на продакшине вы, скорее всего, будете использовать что-то вроде nginx. После инициализации JavaScript, client.jsx возьмет локаль из куки и запросит JSON с переводом. Во всем остальном наше приложение будет работать, как и раньше. Пришло время проверить, как все будет работать в браузере. Откройте вкладку «Network» в панели разработчика и удостоверьтесь, что JSON с переводом был успешно получен нашим клиентом. Подведя итог, давайте добавим небольшой виджет для изменения локали в src/components/LocaleButton.jsx: И так же в src/components/App.jsx: Заметьте, как только пользователь меняет свою локаль, мы перезагружаем страницу, чтобы убедиться, что новый JSON-файл с переводом был успешно извлечен. Теперь же время протестировать! Окей, мы изучили, как определять локаль пользователя и как отображать переведенные сообщения. Перед тем, как двигаться в направлении заключительной части, давайте обсудим пару также немаловажных нюансов. Плюрализация и шаблоны В английском большинство слов могут принимать одну или две возможные формы: «одно яблоко», «много яблок». В других языках все намного сложнее. К примеру, русский имеет 4 различные формы. Надеемся, React сумеет справиться и с этим. Он также поддерживает шаблоны, так что вы можете предоставить переменные, которые могут быть подставлены в шаблон во время рендеринга. Вот как это работает. В src/components/App.jsx у нас есть: Тут мы определяем шаблон с переменной count. Мы напечатаем или «одно яблоко», если значение переменной равно 1, 21 и так далее, или «два яблока» в противном случае. Нам нужно передать все переменные в formatMessage. Давайте перестроим наш файл переводов и добавим русский перевод для теста. Вот наш public/assets/ru.json файл: Теперь все случаи предусмотрены! Поддержка местных специфических сервисов, таких как даты, валюты и числа Ваша информация будет представляться по-разному в зависимости от локали. К примеру, русская локаль нам покажет $500.00 и 12/10/2016.   Intl предоставляет React-компоненты для такого типа данных, которые автоматически обновляются каждые 10 секунд, если вы за это время не перезаписывали значения. это в src/components/App.jsx: Обновите браузер и проверьте страницу. Вам необходимо будет подождать 10 секунд, чтобы увидеть, как обновится FormattedRelative.   Круто, не правда ли? Что же, теперь мы можем столкнуться еще с одной проблемой – универсального рендеринга.   В среднем между формированием разметки и инициализацией JS проходит порядка 2-х секунд. Это значит, что все DateTime`сы, сгенерированные на странице, могут иметь разные значения на стороне клиента и сервера. Что, как следствие, разрушает универсальный рендеринг.   Вот src/server.jsx: вот src/client.jsx: Перезапустите nodemon и проблема почти исчезнет! Она может, правда, остаться в случае, если вы используете Date.now() вместо показаний, записанных в базе. Чтобы сделать пример более «жизненным», заменим в app.jsx Date.now() на последний таймштамп, что-то вроде 1480187019228.   (Впрочем, вы можете столкнутся с другой проблемой – когда сервер не в состоянии отрендерить DateTime в нормальном формате. Это потому, что 4 версия Node.js по умолчанию не поддерживала Intl.) Звучит слишком хорошо, чтобы быть правдой, не так ли? Мы как истинные фронт-енд разработчики всегда были на стороже того, что касается браузеров и платформ. React Intl использует нативный браузерный API для обработки форматов DateTime и Number. И, несмотря на тот факт, что подобная функциональность была представлена в 2012 году, до сих пор есть современные браузеры, которые ее все еще не поддерживают. Даже Safari поддерживает ее только частично. Вот таблица с детальной информацией: ​ Это значит, что если вы желаете покрыть большинство браузеров, которые не поддерживают Intl API на нативном уровне, polyfill для вас просто незаменим. Хвала Всевышнему, существует Intl.js. С одной стороны, кажется, вот оно – идеальное решение, но, как показывает мой опыт, всегда существуют свои недостатки. Во-первых, вам нужно добавить Js-bundle, что несколько ресурсоемко. Также для уменьшения размера вам нужно будет передавать ваш Intl.Js только для браузеров, у которых нет своей нативной поддержки. Конечно, все эти техники уже давным-давно известны, и существует великое множество статей, посвященных им. Но все равно, Intl.js – не абсолютное решение, так как все же представления DateTime и Number на стороне сервера и на стороне клиента могут несколько отличаться, что, разумеется, влечет за собой ошибки при серверном рендеринге.   Наконец, я пришел к своему собственному решению, которое хоть и имеет свои недостатки, но мои запросы в большинстве случаев оно устраивает. Я реализовал очень поверхностный polyfill, что имеет лишь небольшую часть из требуемой функциональности. В то время, как в большинстве случаев подобное решение непригодное, оно лишь добавляет лишние 2 КБ к размеру JS-файла, так что даже нет необходимости реализовывать динамическую загрузку кода для устаревших браузеров, что значительно упрощает решение в целом.   И в заключение Возможно, сейчас вас не покидает чувство, как будто здесь написано слишком сложное решение. Также, возможно, сейчас вы подумываете о том, чтобы реализовать все самим. Я бы не советовал этого делать. В конце концов, вы все равно придете к выводам, представленным в данной статье. Или, что хуже, зайдете в тупик одного решения и не сможете увидеть остальные. Вы можете подумать, что можно легко решить проблему с Intl API, используя вместо него Moment.js (я специально не рассматривал другие библиотеки, так как они либо неподдерживаемые, либо неиспользуемые). К счастью, я уже опробовал это, так что я могу сохранить вам много времени. Moment.js монолитен и очень тяжел, так что если для кого-то он и подойдет, то остальная масса пользователей будет неудовлетворенной результатом. Разработка собственного polyfill не звучит интригующе, так как вам наверняка придется выделить определенное время для борьбы с возникающими при этом багами. Подведя итог, могу лишь сказать, что не существует идеального решения касательно проблемы на данный момент: просто выберите то, что вам подойдет лучше всего.   Надеюсь, эта статья дала вам все, что нужно знать для создания интернационализируемого React front-end приложения. Теперь вы выучили, как определять локаль пользователя, сохранять ее в куки, писать виджет для изменения локали и многое другое! Также вы ознакомились с некоторыми возможными проблема и ловушками, в которые вы можете попасть в процессе написания приложения.   Удачи в разработке! Автор перевода: Евгений Лукашук Источник
Робота з Touch в Unity3D

Автор: Олег Загородній

Введение Ни для кого не секрет, что в мобильных играх, в отличие от компьютерных, практически единственным “устройством ввода” является палец. То есть, все действия, которые пользователь выполняет в игре, совершаются благодаря прикосновениям к экрану, или же тачам (англ. touch – прикосновение). В этой статье мы с Вами рассмотрим, как можно правильно обработать тачи, разберем, в чем разница между глобальными и локальными тачами, а также реализуем обработку некоторых популярных жестов, которыми Вы оперируете не только в играх, но и в повседневном пользовании смартфоном – swipe и zoom. Разумеется, все это мы будем делать, используя исключительно встроенный функционал Unity3D, без внешних плагинов и ассетов. Наведем справки Перед тем, как начать, рассмотрим, какие возможности нам предоставляет библиотека для работы с тачами. В документации Unity видим, что разработчики движка рекомендуют использовать класс Input для получения доступа к данным об акселерометре и мульти-таче мобильного устройства. Это нас вполне устраивает. В обязательном порядке необходимо подключить пространство имен UnityEngine.EventSystems, ведь именно оттуда родом большинство интерфейсов и классов, которые нам сегодня понадобятся. Например, IPointerClickHandler, IDragHandler и многие другие. В конце концов, классы BaseEventData и PointerEventData, из которых мы будем доставать все необходимые данные о событиях, проживают по тому же адресу. Что ж, не стоит волноваться, если Вы видите эти имена впервые. Моя задача - сдружить вас и наставить на путь плодотворной разработки. Если у Вас уже имеется опыт работы с данными классами, надеюсь, смогу поведать о каких-либо интересных спецификах работы с ними и еще некоторыми компонентами. Ближе к делу  или “Что такое глобальные и локальные тачи?” Немного теории. Чтобы правильно реализовать все, что мы задумали, сначала разберемся, что такое глобальные и локальные тачи. Если вкратце, то глобальные тачи – это прикосновения к экрану устройства в любой точке. То есть, мы будем говорить, что необходимо обработать глобальный тач, если для игрового процесса не важно, где именно игрок ткнет пальцем в экран. Думаю, все видели в играх заставку после загрузки уровня с большими буквами “Tap to start” либо что-то в этом роде. Бывают настолько простые игры, что, по сути, все управление игроком производится исключительно такими вот глобальными тачами. Например, в Flappy Bird, 2 Cars и многих других. Разумеется, не всегда все так просто. Случается, нам необходимо обработать тач в определенной области экрана, или по какой-либо кнопке, или по объекту. Такие тачи мы с Вами будет именовать локальными, так как они должны производиться в некой локальной области. Причем принципы реализации обработки тачей по 2D объектам или же элементам UI и обработки тачей по 3D объектам на сцене немного отличаются. Эти нюансы мы также рассмотрим. То есть перед тем, как перейти к воплощению идеи в жизнь, хорошенько подумайте, где и какой вид тача будет использоваться, ведь от этого зависит, как далеко в лес мы пойдем и как много дровишек нарубим. Практика. Подготовим рабочее место, как на картинке. Также создадим новый скрипт HandleScript и прикрепим его на куб. Как же считать прикосновение к экрану? Если в случае с кликами мыши в классе Input есть методы GetMouseButton (...Up, ...Down), то для тачей соответствующие методы отсутствуют. Здесь все даже проще. Разработчики предоставляют свойство touchCount (только для чтения), в котором хранится количество тачей в текущем кадре. То есть, чтобы считать глобальный тач, нам необходима всего одна строчка в методе Update: using UnityEngine; using UnityEngine.EventSystems; public class HandleScript : MonoBehaviour { void Update () {      if (Input.touchCount > 0) Debug.Log("Global touch!"); } } Как только пользователь задумает ткнуть пальцем в экран (чего мы, по сути, и ждем), выражение в блоке условия вернет true и на консоль вылетит наше сообщение. Что может быть проще? Важно: проверить данный способ обработки на компьютере не получится, так как в свойство touchCount записывается именно кол-во тачей. Клики мыши не в счет. Примечание: К примеру, при портировании на Windows Phone сообщения консоли, разумеется, отображаться не будут. Так что стоит реакцию на тач сделать более явной. Допустим: if (Input.touchCount > 0) transform.localScale *= 1.1f; Я специально буду обращать Ваше внимание на многие нюансы (для кого-то известные и очевидные, а для кого-то - нет), чтобы избавить от мелких и неприятных ошибок и сберечь парочку нервных клеток. Попробуйте сбилдить на свой смартфон и немного потапать в разных частях экрана. Что касается локальных тачей, то здесь есть несколько вариантов обработки. Также они зависят и от типа  объекта – 2D или 3D. Начнем, пожалуй, с 2D объектов. Давайте добавим на сцену какой-либо спрайт и сразу прилепим ему компонент 2D Box Collider (о нем чуть ниже). Еще добавим к этому спрайту наш скрипт HandleScript, но немного его подкорректируем. В Unity есть перечень методов, которые являются обработчиками определенных событий. Например, метод OnCollisionEnter вызывается, когда два твердых (Rigidbody) объекта соприкасаются, если вкратце. Так вот, среди вышеупомянутого перечня методов есть такой себе OnMouseDown метод. Он вызывается, как вы уже, наверное, догадались, в момент нажатия левой кнопки мыши непосредственно на объекте. Здесь есть три важных момента: Метод вызывается непосредственно в момент нажатия кнопки, а не отпускания или полного клика. Метод реагирует только на левую кнопку мыши. Срабатывает только при клике непосредственно на объект. Так как мы с Вами обрабатываем тачи, а не клики, то справедливы для нас будут только первый и третий пункты. То есть работу с человеческими пальцами данный метод тоже поддерживает. А может, и не только человеческими... Как же будет выглядеть наш код? using UnityEngine; using UnityEngine.EventSystems; public class HandleScript : MonoBehaviour { void OnMouseDown() {      transform.localScale *= 1.1f; } } Обратите внимание на сигнатуру метода и запомните. Ведь если сделать малейшую опечатку, событие касания/клика обрабатываться не будет. Проверить работу этого способа уже проще. Учитывая, что метод OnMouseDown реагирует как на мышь, так и на пальцы, билдить проект на смартфон не обязательно. Из этой серии есть еще метод OnMouseUp, который вызывается при отпускании пальца/кнопки. Важно: все события, связанные с кликами, движок Unity считывает, неявно используя Raycast’ы (лучи). Именно поэтому мы добавили на наш спрайт компонент 2D Box Collider. Если Вы еще не знаете, в чем суть работы Raycast’ов, обязательно почитайте в документации Unity. Важно: получается, указанные методы срабатывают при тапе/клике именно по коллайдеру объекта, а не по мэшу(Mesh)/спрайту. Попробуйте сбилдить и потапать на спрайт ящика либо зеленого куба. Теперь отключите их коллайдеры и проверьте, обрабатывается ли событие. Как видите, этот способ позволяет обработать тап как по 2D, так и по 3D объекту. Просто? Следующий способ обработать локальный тач тоже работает для обоих типов объектов, но немного отличается конфигурацией компонентов. Здесь мы с Вами будем уже работать с таким пространством имен, как UnityEngine.EventSystems. Если оно у Вас еще не подключено, самое время это сделать. Там, как я уже говорил, находятся необходимые нам интерфейсы и классы. Теперь обязательно добавьте на сцену объект EventSystem. Он находится во вкладке UI контекстного меню создания объекта. Итак, чтобы считать тап по 2D объекту (не элементу UI), необходимо обязательно прикрепить к камере компонент Physics 2D Raycaster. Для данного компонента обязательным является присутствие компонента Camera. Поэтому совсем неудивительно, что мы цепляем его именно на объект Main Camera. То есть после всех наших манипуляций игровая сцена должна выглядеть, как на картинке. Теперь, пожалуй, в код. Данный метод более универсальный, чем предыдущий, так как позволяет получить множество информации о состоянии курсора. Неважно, кто им управляет – палец или мышь. Нам понадобится интерфейс IPointerDownHandler из подключенного пространства имен. После реализации единственного его метода, получаем код, не менее простой, чем раньше. using UnityEngine; using UnityEngine.EventSystems; public class HandleScript : MonoBehaviour, IPointerDownHandler { public void OnPointerDown(PointerEventData eventData) {      Debug.Log(eventData.position); } } Разумеется, ошибиться с сигнатурой метода у вас не выйдет, так как Visual Studio сразу ругнется за нереализованный интерфейс. А в параметре eventData типа PointerEventData будет храниться вся информация о курсоре на момент срабатывания метода, а это очень полезно. Что же будет происходить? Здесь тоже все просто. В момент касания движок Unity пустит луч в сцену и в случае, когда тот пройдет сквозь коллайдер нашего спрайта, сработает метод обработчик OnPointerDown и в параметр eventData запишется вся информация о курсоре. Для считывания тачей также есть следующие интерфейсы: IPointerUpHandler, IPointerClickHandler, IPointerEnterHandler и IPointerExitHandler. Мне кажется, по их именам предельно ясно, какой из них какое событие позволяет обработать. Все, что Вам необходимо – наследоваться от нужного интерфейса, реализовать единственный его абстрактный метод и удивиться, как просто это работает. Главное, когда будете работать, не забудьте о компоненте Physics 2D Raycaster и объекте EventSystem, которые упоминались выше. Как вы уже, наверное, заметили, на 3D объекты данный способ не распространяется. Как это исправить? Элементарно. На объект-камеру необходимо также прикрепить компонент Physics Raycaser. Вот и все. Остальная суть остается та же. Попробуйте запустить проект. Заметили? Движок реагирует на клики мыши тоже. Теперь портируйте на ваш смартфон и удостоверьтесь, что все работает верно. Чтобы обработать тачи по элементам UI, Вам необходим будет компонент Graphic Raycaster. Но для него обязательным является компонент Canvas. Это, думаю, тоже вполне логично. Если прикрепить его на объект Canvas, то методы рассмотренных нами интерфейсов позволят также обработать тачи по кнопкам, панелям, тогглам и т.д. Итог по разделу о глобальных и локальных тачах. Давайте немного подсуммируем все, что только что было рассмотрено. Все тачи и клики обрабатываются неявным пусканием лучей из экрана в сцену. То есть определяется касание к коллайдерам объектов. При использовании интерфейсов из пространства имен UnityEngine.EventSystems обязательно надо добавить объект EventSystem. Physics 2D Raycaster – компонент для обработки тачей/кликов по 2D объектам. Physics Raycaster – компонент для обработки тачей/кликов по 3D объектам. Graphic Raycaster – компонент для обработки тачей/кликов по элементам UI. В отличие от предыдущих присутствует на объекте Canvas по умолчанию. Обработка Swipe жестов Как же выловить эти Swipe жесты и как определить их направление? На самом деле, это совсем несложно. Есть несколько интерфейсов, которые позволят нам это сделать:    IDragHandler, IBeginDragHandler, IEndDragHandler. Причем, они отлично подходят как для работы с Drag, так и Swipe жестами. Давайте почистим нашу сцену и приведем ее примерно вот к такому виду: У нас на объекте Canvas есть красная панель размером на весь экран и внутри нее имеется еще одна небольшая панель. Мы с Вами будем считывать Swipe’ы по красной панели и в зависимости от их направления двигать зеленую. Все до безобразия просто. Аналогичные действия Вы потом сможете проделать не только с элементами UI, как в этом примере, но и с 2D и 3D объектами. Сейчас же будем использовать панели, так как это получится более наглядно. Скрипт HandlerScript прикрепляем к внешней (красной) панели. using UnityEngine; using UnityEngine.EventSystems; public class HandleScript : MonoBehaviour, IDragHandler, IBeginDragHandler { public void OnBeginDrag(PointerEventData eventData) { } public void OnDrag(PointerEventData eventData) {  } } Вот как изначально должен выглядеть наш скрипт. Мы должны наследоваться он интерфейсов IDragHandler и IBeginDragHandler. Этого будет достаточно, чтобы считать Swipe. Скажу даже больше. Мы будем использовать только метод из второго интерфейса. Важно: необходимо обязательно реализовать интерфейс IDragHandler (пусть даже методом с пустым телом), чтобы срабатывали методы из интерфейсов IBeginDragHandler и IEndDragHandler. Дабы определить направление Swipe’а, мы будет использовать свойство delta в параметре eventData метода OnBeginDrag. В это свойство записывается разница позиций курсора между текущим и предыдущим кадрами. Мы просто напросто в момент начала Swipe’а глянем, какое значение этой дельты, и из этого уже определим, какое направление жеста. Возможно, у Вас возник вопрос. Откуда возьмется эта дельта, если метод OnBeginDrag сработает сразу, как только игрок начнет вести пальцем по экрану? Дело вот в чем. Этот метод вызывается только после того, как игрок сдвинет палец на какое-то пороговое значение расстояния от начальной точки. За это время успевает накопиться некоторая информация о происшедшем событии. То есть за этот небольшой промежуток времени мы можем определить, куда пользователь собирается вести свой палец. Мы всего лишь должны построить правильную условную конструкцию для определения направления и, исходя из условия, двигать зеленую панель в соответствующем направлении. В будущем это может быть ваш игрок в раннере или что-либо иное... using UnityEngine; using UnityEngine.EventSystems; public class HandleScript : MonoBehaviour, IDragHandler, IBeginDragHandler { Transform green;   // здесь будет ссылка на компонент Transform зеленой панели. void Start() {      green = transform.GetChild(0); // получаем ссылку на Transform зеленой панели. } public void OnBeginDrag(PointerEventData eventData) {      if (Mathf.Abs(eventData.delta.x) > Mathf.Abs(eventData.delta.y))      {             if (eventData.delta.x > 0) Debug.Log("Right");             else Debug.Log("Left");             green.position += new Vector3(eventData.delta.x, 0, 0);      }      else      {             if (eventData.delta.y > 0) Debug.Log("Up");             else Debug.Log("Down");             green.position += new Vector3(0, eventData.delta.y, 0);      } } public void OnDrag(PointerEventData eventData) { } } Что мы сделали? Сначала проверили, дельта по какой оси больше – X или Y? Если по оси X, значит движение будет по горизонтали, если же по Y – значит, по вертикали. А там еще раз проверили направление. Как видите, это делается элементарно просто, а работает безотказно. Обязательно проверьте, обрабатывается ли жест Swipe у вас на смартфоне. Если же Вам необходимо получить непосредственно угол Swipe’а, можно использовать формулу , которая позволяет вычислить синус угла прямоугольного треугольника из отношения противоположной и прилегающей сторон. Обработка Zoom’а Вернем сцену к первоначальному состоянию. Чтобы считать жест zoom’а, нам необходимо обработать глобальные тачи, поэтому наш скрипт HandleScript можно прикрепить даже на камеру. А код наш будет выглядеть вот так: using UnityEngine; public class HandleScript : MonoBehaviour { public float sensitivity; Vector2 f0start; Vector2 f1start; void Update() {      if (Input.touchCount < 2)      {             f0start = Vector2.zero;             f1start = Vector2.zero;      }      if (Input.touchCount == 2) Zoom(); } void Zoom() {      if (f0start == Vector2.zero && f1start == Vector2.zero)      {             f0start = Input.GetTouch(0).position;             f1start = Input.GetTouch(1).position;      }      Vector2 f0position = Input.GetTouch(0).position;      Vector2 f1position = Input.GetTouch(1).position;      float dir = Mathf.Sign(Vector2.Distance(f1start, f0start) - Vector2.Distance(f0position, f1position));      transform.position = Vector3.MoveTowards(transform.position, transform.position + transform.forward, dir * sensitivity * Time.deltaTime * Vector3.Distance(f0position, f1position)); } } В чем суть его работы?  Если пользователь прикасается к экрану двумя пальцами, координаты двух тачей записываются в соответствующие поля f0start и f1start. Именно с ними будут сравниваться все остальные позиции тачей, пока игрок не уберет от экрана пальцы. То есть мы просто сравниваем расстояние между двумя тачами. Если текущее расстояние меньше, чем начальное, то камера будет двигаться назад, если же больше – вперед. Условная конструкция в методе Zoom для того, чтобы позиции тачей записались в свойства только один раз в момент касания к экрану. Чувствительность zoom’а вы можете регулировать значением поля sensitivity прямо в окне Inspector. Попробуйте усовершенствовать этот скрипт сами. Допустим, сделать, чтобы сравнивались позиции не текущих и начальных тачей, а позиции тачей в этом и предыдущем кадре. Сравните результат. Заключение Как видите, обработка тачей и рассмотренных нами жестов реализуется очень просто. Все, что Вам необходимо – внимательность и фантазия. Если что-то не работает, обязательно проверьте, присутствуют ли необходимые компоненты на всех объектах, вызываются ли нужные методы и так далее. Совсем не обязательно искать внешние библиотеки, плагины и ассеты для того, чтобы работать с тачами в Unity. Разработчики предоставляют, по сути, всё, что вам может понадобится. Результат же зависит от Вашей фантазии. Не забывайте заглядывать в документацию Unity, там есть много всего интересного. Хотя, среди того, что мы сегодня рассмотрели, есть  вещи, о которых там не упоминают. Благодарю за внимание и желаю всем творческих успехов!
Співбесіда з QA. 250+ питань для Junior, Middle, Senior

Автор: Влад Сверчков

Junior 1.1 Теория тестирования. 1.2 AQA      1.2.1 Программирование и Selenium      1.2.2 TestNG/JUnit, Git, CI              1.3 Web              1.4 Mobile              1.5 Практические задания   Middle 2.1 Теория 2.2 AQA      2.2.1 Selenium      2.2.2 Тестовая инфраструктура 2.3 Web 2.4 Mobile 2.5 Практические задания   Senior 3.1 Теория 3.2 Практические задания     Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 12 января 2022 года. Оригинальная версия на украинском языке доступна по ссылке. Эту подборку вопросов, которые ставят кандидатам разных уровней на технических собеседованиях на позицию QA, составили совместными усилиями практики. Список – лишь ориентир. Кандидатам советуем пробежаться по вопросам и отметить неизвестные слова, погуглить и заодно повысить шансы пройти собеседование. Интервьюерам – пополнить свой запас интересных вопросов. Но не переборщите :) Если вы не претендуете на позицию QA, просмотрите переводы подборок вопросов по другим популярным IT-специальностям.   Junior   Теория тестирования 1. Что такое тестирование? 2. Зачем тестировать ПО? 3. Какие существуют этапы тестирования? 4. Какие типы тестирования можете назвать? 5. Какие уровни тестирования знаете? 6. Какие техники тест-дизайна знаете? 7. Что такое техника анализа классов эквивалентности? 8. Что такое техника анализа предельных значений? В чем ценность этой техники? 9. Что такое Regression и Confirmation тестирование, какая между ними разница? 10. Как часто следует проводить регрессионное тестирование продукта? 11. Какие бывают виды интеграционного тестирования? 12. Что такое Configuration Testing? 13. Что такое Exploratory Testing? 14. Какие существуют UI-стандарты? 15. Что такое Black/Grey/White Box Testing? 16. Что такое Performance Testing? 17. Что такое Smoke и Sanity тестирование и какая между ними разница? 18. Что такое Traceability Matrix? 19. Что такое Sanity Testing? 20. Что такое End-to-End тест? 21. Что такое тестирование безопасности? 22. Что такое испытание на основе рисков? 23. Что такое динамическое тестирование? 24. Что такое «парадокс пестицида»? 25. Опишите основные фазы STLC? Дайте определение Entry и Exit Criteria. 26. Что такое Bug, Error, Failure, Fault? 27. Какие есть атрибуты баг-репорта? Какие основные поля для заполнения? 28. Какова разница между приоритетом и серьезностью? 29. Приведите примеры серьезного, но не приоритетного бага. 30. В чем разница между валидацией и верификацией? 31. Зачем нужна тестовая документация? Какие её виды? 32. Что такое тест-план? Какие элементы у него есть? 33. Какую обязательную информацию должен содержать тест-план? Как правильно его использовать, поддерживать и нужен ли он вообще для большинства проектов? 34. Какая разница между чеклистом и тест-кейсами? 35. Приведите пример хорошего тест-кейса.   Ответы на некоторые из этих вопросов вы можете найти в видео курсе QA Стартовый (урок 1, урок 3, урок 4, урок 5), Основы тестирования (урок 6), Основы тестирования ПО (урок 1-5), а также в вебинаре “QA практикум. Техники тест дизайна” (часть 1 и часть 2).   AQA (Automation QA)   Программирование 36. Что такое ООП? Назовите его принципы с примерами? 37. Что такое интерфейс? Что такое абстрактный класс? Чем они отличаются? 38. Что такое SOLID? Приведите примеры. 39. Что такое DRY, KISS, YAGNI? 40. Какие паттерны GOF вам известны? Приведите примеры их использования. 41. Что такое PageObject и PageFactory? 42. Какая иерархия Collections? 43. Какая разница между Thread class и Runnable interface? 44. Какая разница между String, Stringbuffer и Stringbuilder? 45. Разница между final, finally и finalize?   Selenium 46. ​​Что такое Selenium и зачем его используют? 47. Что такое драйвер браузера? 48. Какие виды локаторов страницы существуют? Каковы их преимущества и недостатки? 49. Что такое Selenium Waits? Какие есть и чем отличаются? 50. Какие exceptions может бросить Selenium? Что они означают и как их обрабатывать? 51. Для чего используют JavaScriptExecutor? Приведите примеры. 52. Что такое Selenium Grid? 53. Какие способы click и send keys Selenium? 54. Как вы запускаете параллельное выполнение тестов? Что такое ThreadLocal? 55. Какая разница между Action и Actions? 56. Как написать метод isElementPresent? 57. Как вычитать данные из динамической веб-таблицы? 58. Можете ли вы назвать 10 интерфейсов в Selenium? 59. Назовите два способа, позволяющих автоматизировать капчу. 60. Вспомните типы навигационных команд Selenium. 61. Как найти поврежденные ссылки в Selenium WebDriver? 62. Какую технику следует рассмотреть, используя весь сценарий, если «нет ни frame id, ни frame name»?   Ответы на некоторые из этих вопросов вы можете найти в видео курсах Web Testing Automation on Java (урок 1), Автоматизация тестирования мобильных приложений (урок 5), а также в вебинаре “Selenoid или Selenium Grid — что лучше?”.   TestNG/JUnit 63. Для чего нужны TestNG/JUnit? 64. Какие инструкции используются в TestNG/JUnit? 65. Какие assertions есть в TestNG/JUnit? 66. Как выполнять тесты параллельно TestNG/JUnit?   Ответы на некоторые из этих вопросов вы можете найти в видео курсе Web Testing Automation on Java (урок 4).   Git 67. Для чего используют системы контроля версий? 68. Что такое Git? Каков принцип его работы? 69. Что такое commits, branches в Git? 70. Для чего нужны GitHub, GitLab и другие, базирующиеся на Git, вебхостинги проектов?   Ответы на некоторые из этих вопросов вы можете найти в видео курсе Основы работы с Git.   CI 71. Что такое CI? 72. Как автоматическое тестирование интегрируется в CI? 73. Как настроить Job или Pipeline на знакомом вам CI-инструменте? 74. Какие инструменты для генерации репорта после выполнения автоматических тестов вы знаете? 75. Какую информацию должен содержать отчет о выполнении автоматических тестов?   Ответы на некоторые из этих вопросов вы можете найти в видео курсе Web Testing (урок 4).   Web 76. Что такое клиент-серверная архитектура? 77. Что может выступать в роли клиента? 78. Что такое REST API, SOAP? В чем разница? 79. Какие протоколы передачи данных знаете? 80. Какие способы взаимодействия с API существуют? В чем разница между ними? 81. Как можно протестировать API, что там нужно проверять? 82. Как расшифровывается CRUD? 83. Чем отличается GET от POST? 84. Какие отличия между XML и JSON? 85. Какие знаете форматы передачи данных? 86. Как происходит шифрование? 87. Какие бывают виды баз данных? 88. Охарактеризуйте каждый класс status code (1хх; 2xx; 3xx; 4xx; 5xx). 89. Какие есть HTTP-методы? 90. Какие знаете Web elements? 91. Какие браузеры знаете? В чем их отличие? 92. Для чего необходимы инструменты разработчика в браузере (Chrome DevTools) и как они помогают в тестировании. 93. Что такое кэш? 94. Что такое сессия? 95. Зачем нужны cookies? 96. Что такое фрейм? 97. Что такое HTML/CSS/JavaScript? 98. Какую структуру имеет веб-страница? 99. Зачем чистить кэш? 100. Какие виды тестирования можно применить только к Web? 101. Для чего в веб-страницах используют JavaScript? 102. Что такое REST? 103. Что такое AJAX?   Ответы на некоторые из этих вопросов вы можете найти в видео курсах QA Стартовый (урок 6), Web Testing, SQL Базовый.   Mobile 104. Какие мобильные платформы существуют? 105. Какие версии Android и iOS используются на рынке (минимальные и максимальные)? 106. Какие версии Android нужно тестировать, если заказчик сказал поддерживать с версии 5.0? 107. Назовите типы мобильных приложений. 108. Каков формат файлов сборок приложений для Android и iOS? 109. Что такое ADB? 110. Как снять логи с AOS/IOS? 111. Что нужно проверять при использовании сканера отпечатка/Face ID? 112. Как я могу запускать тесты Android без Appium? 113. Объясните концепцию дизайна Appium.   Ответы на некоторые из этих вопросов вы можете найти в видео курсе Автоматизация тестирования мобильных приложений.   Практические задания 114. Написать чеклист для функционала корзины в интернет-магазине. 115. Написать тестовые наборы данных для поля ввода даты, которое отсеивает пользователей в возрасте до 18 лет. 116. Написать чеклист тестирования формы ввода данных платежной карты. 117. Протестовать «предмет» относительно различных видов тестирования. (Предмет - лифт, карандаш, калькулятор и т. д.) 118. Есть Input поле, принимающее целые значения от 18 до 99 включительно. Надо протестировать с помощью техники тест-дизайна Boundary Values ​​Analysis и Equivalence Partitioning. 119. Есть веб-страница с полями: e-mail, password и кнопкой submit. Необходимо привести примеры отрицательных тест-кейсов, которыми можно проверить эту страницу. 120. Привести примеры тест-кейсов для функционала, находящегося на нескольких страницах проекта (например, поле поиска). 121. Как протестировать процесс оплаты в интернет-магазине? 122. Как протестировать сломанный тостер? 123. Объясните для 7-летнего ребенка, что такое база данных. 124. Определите необходимое количество функциональных тест-кейсов, чтобы проверить Log in форму. 125. Есть форма регистрации в веб-приложении с полями (first name, last name, username, password, repeat password) и кнопкой Register. Какие проверки нужно провести? 126. Поле username должно быть обязательным, но оно не является обязательным. Приведите пример баг-репорта, созданного для этой ошибки. 127. Как бы вы провели smoke-testing для приложения типа Telegram? 133. Как будет выглядеть баг-репорт, если, к примеру, не работает электрический чайник? 128. Есть таблица books с полями: name, price, page_count. Следует выбрать все имена книг, в которых price более 10 единиц и количество страниц от 20 до 100. 129. У вас есть функционал калькулятора, который доступен через веб-браузер по ссылке. Он имеет только функцию делить, так сказать, MVP-версию. Диапазоны для вписывания в числитель и делитель от 0,1 до 99,9. Вывод значения происходит автоматически, потому что front-end реализован на React JS. Как вы будете тестировать этот функционал? Какие виды тестирования примените? Какие техники тест-дизайна используете?     130. Задание на работу с SQL.   извлечь номер телефона и адрес пользователя Muzik. Извлечь данные о пользователях, имеющих сумму заказа более 2000 грн. Подсчитать количество заказов в таблице и общую сумму сделанных заказов.     131. Ваша компания разрабатывает программное обеспечение для медицинских систем, и вы тестируете компонент, управляющий дефибриллятором сердца. Вы заметили, что одно решение в тестовом модуле состоит из 34 независимых атомарных условий. Какой метод тестирования белого ящика следует выбрать для этого и почему? 132. Оздоровительная программа для сотрудников совмещена с оплатой медицинского страхования и имеет следующие правила:   сотрудники, потребляющие 17 единиц или менее алкоголя в неделю, получают $28 скидки на оплату. Для сотрудников, которые заполнят «Оценку риска для здоровья», оплата уменьшается на $23. Сотрудники, участвующие в ежегодном контроле за состоянием здоровья в компании: получат скидку на $50 за то, что имеют индекс массы тела (ИМТ) 25,5 или менее, и $19 скидки при ИМТ ниже 30. Некурящие получают дополнительную скидку на $46. Курильщики, присоединившиеся к курсу отказа от курения, получают скидку в $24. Курильщики, не присоединившиеся к курсу отказа от курения, оплачивают дополнительно $75.   133. Используя технику классов эквивалентности, сколько тестов нужно написать, чтобы покрыть вышеупомянутые условия на 100%? 134. Какое минимальное количество тестов необходимо для покрытия следующих условий автогражданки:   лица до 18 лет не застраховываются. Для мужчин на красном авто прибавляется +15% к стоимости полиса. Для женщин от 18 до 64 лет страховая премия 1000 грн. Для мужчин от 18 до 64 лет страховая премия 1200 грн. Для лиц старше 64 лет страховая премия 1800 грн.   135. Напишите сценарии автоматического тестирования для сортировки по цене и добавлению товара в корзину на сайте. К вашим тестам добавьте документацию с настройками и разместите ваше решение на GitHub.   Middle   Теория 1. Назовите обязанности QA? 2. Что знаете о тестировании нагрузки? В каком случае следует проводить такое тестирование? На каком этапе готовности продукта? 3. Что такое таблица решений/decision table и как её можно использовать? 4. Что может быть критериями запуска и завершения тестирования? 5. Расскажите о вариантах интегрирования тестовой документации в проект, инструментах для работы с ней. 6. Как организовать сквозное тестирование (e2e)? 7. Какие тест-кейсы можно сдать для тестирования баз данных? 8. Приведите примеры подходов для тестирования локализации. 9. Что такое A/B тестирование? 10. Что такое mock/stub? Какие знаете инструменты для работы с ними? 11. Когда нужно использовать технику Pairwise? 12. Что такое fuzz-тестирование и где его используют? 13. Что такое REgexp? 14. Как меняется стоимость дефекта при тестировании программного обеспечения? 15. Каковы пути анализа бизнеса клиента? Как определить целесообразность того или иного функционала? 16. Назовите последовательность выполнения CI/CD процесса на проекте. 17. Какое должно быть процентное соотношение между положительным и отрицательным тестированием на проекте? 18. Какой вид тестирования целесообразнее проводить до релиза? 19. Есть ли разница между bug leakage и bug release? 20. Может ли быть ситуация, когда критерии завершения (exit criteria) не выполнены? Что должно происходить в этом случае? 21. Что мы действительно должны покрывать тест-кейсами, а что считается избыточным расходом времени и денег? Когда нецелесообразно писать тест-кейсы? 22. Для какого функционала труднее всего написать тест-кейсы? 23. Как посчитать Cyclomatic complexity? 24. В чем основная разница между defect detection percentage и defect removal efficiency? 25. Какие модели risk-based testing вы знаете? 26. Что такое тестирование API? Какими инструментами пользуются для его выполнения? 27. Что такое performance testing? Какими инструментами пользуются для его выполнения? 28. Что такое load и stress testing? Какими инструментами пользуются для их выполнения? 29. Что такое contract testing? 30. Какая разница между Scrum и Kanban? 31. Расскажите о ритуалах, ценностях и ролях в Scrum. 32. Как выбор методологии может повлиять на качество разработки? 33. Нулевой спринт в Scrum. Для тестирования есть задание под названием «Настройка среды». Что здесь нужно выполнять?   Ответы на некоторые из этих вопросов вы можете найти в видео курсах Web Testing, QA Стартовый, “Методология управления проектами. Вступление в SCRUM”.   AQA   Selenium 34. Расскажите, как вы будете строить и внедрять стратегию по автоматизации тестирования. 35. Как взаимодействуют клиентская библиотека Selenium, драйвер браузера и сам браузер? 36. Для чего используют browser capabilities, arguments и options? 37. Что такое iframe и как с ним работать в Selenium? 38. Как обрабатывать браузерные сообщения (alerts)? 39. Что такое Appium? 40. Что такое Electron-based applications? Как использовать Selenium и Appium для их тестирования? 41. Как взаимодействовать с запросами, отправляемыми из браузера? 42. Как взаимодействовать с cookies, LocalStorage и SessionStorage?   Ответы на некоторые из этих вопросов вы можете найти в видео курсе Web Testing Automation on Java (урок 1) и Автоматизация тестирования мобильных приложений.   Тестовая инфраструктура 43. Что такое и чем отличаются виртуальная машина, симулятор и эмулятор? 44. Что такое контейнер и чем он отличается от виртуальной машины? 45. Как используют виртуальные машины и контейнеры в автоматизации? 46. ​​Что такое IaaS и PaaS? Приведите примеры. 47. Что такое Configuration Management? 48. Что такое Provisioning? 49. Какие команды Linux Shell вам известны? Как с помощью команд Linux Shell найти лог-файл и строчку с ошибкой в ​​файле? 50. Какие команды Windows CMD вам известны? Как с помощью команд Windows CMD найти IP-адрес машины? 51. Что такое SSH и как им пользоваться? 52. Что такое bash и batch скрипты? Зачем их используют?   Web 53. Какая разница между авторизацией и аутентификацией? 54. Как происходит авторизация на сервере? 55. Какие статус-коды ошибок бывают? Может ли сервер отправить код 400, если проблема на его стороне? 56. Как выполнить Debug страницы в браузере? 57. Как протестировать адаптивную верстку? 58. Что такое WebSocket и как проверить обрыв соединения? 59. Каковы есть основные виды уязвимости веб-приложений? 60. Какие инструменты для тестирования Web performance client-side знаете? 61. Какова разница между методами GET и POST? 62. Какая разница между методами PUT и PATCH? 63. Какие знаете сниферы? 64. Какова разница между DROP и TRUNCATE? 65. Что такое case function? 66. Что такое collation? 67. Что такое схема GraphQL? 68. Объясните разницу между OLTP и OLAP. 69. Вспомните разные типы репликации в SQL Server? 70. Что вы понимаете под Self Join? Приведите примеры. 71. Что такое cursor и как им пользоваться?   Ответы на некоторые из этих вопросов вы можете найти в видео курсах Web Testing Automation on Java, SQL Базовый.   Mobile 72. Что основное нужно проверить при тестировании мобильного приложения? 73. Что такое Manifest.xml в .apk файле и какие данные там указывают? 74. Что такое режим разработчика Do not keep activities? 75. Как происходит перехват трафика http/https для мобильных устройств? 76. В каком виде хранятся данные в мобильных приложениях локально? 77. Как тестировать миграцию локальных данных? 78. Каковы основные компоненты Android-приложений (активити / фрагмент / сервис / интент-фильтр)? 79. Опишите жизненный цикл активити. 80. Что такое утечки памяти? Как найти? 81. Как протестировать билд на Android? 82. Что такое Testflight? Как тестировать с его помощью? 83. Как работает Android? Какая у него архитектура? 84. Как происходит деплой программ IOS/AOS?   Ответы на некоторые из этих вопросов вы можете найти в видео курсе Автоматизация тестирования мобильных приложений.   Практические задания 85. Что делать, если разработчик не соглашается, что указанный баг действительно является багом? А если в требованиях использована неоднозначная формулировка? Если бизнес-аналитик, PM и представитель клиента сейчас недоступны, чтобы подсказать? Как можно предотвратить такую ​​ситуацию? 86. Сложилась ситуация, когда команда тестирования не успевает закончить свою работу в дедлайн. Как правильно действовать в этом случае? А если релиз передвинуть нельзя? А если никакие фичи из релиза забрать нельзя? 87. Что делать, если проект уже начался, а QA-инженер там начал работать только когда начали разрабатываться бизнес-фичи? Какие этапы тестирования теперь нужно наверстать и нужно ли это? Как это сделать максимально грамотно без ущерба для загрузки по тестированию новых фич? Какие риски имеет позднее вовлечение QA-инженера в разработку? 88. Веб-страница с полями e-mail, password и кнопкой submit. Назовите отрицательные тест-кейсы, по которым можно проверить эту страницу. 89. Предположим, что после нажатия кнопки submit страница перезагружается и ранее введенные данные исчезают. Как проверить, что информация отправлена ​​в базу данных? 90. Как проверить, что данные отправились на сервер, если у нас нет доступа к бэкенду? 91. Приведите примеры улучшений для приведенной веб-страницы (любая на выбор). 92. Составить Smoke Test Suite для DOU.ua. 93. Протестовать функционал банкомата с помощью техники State Transition Diagram. 95. Написать предельные значения для ввода в форму оплаты товара на сайте. 96. Есть метод POST, который регистрирует нового пользователя на сайте, есть тело запроса, содержащее данные о почте, телефоне, имени пользователя и адресе проживания. Какие кейсы для проверки можете привести? 97. На что следует акцентировать внимание при автоматизации методов API? Что следует проверять? 98. Вы тестируете логин-форму, вводите логин и пароль, нажимаете кнопку логин и ничего не происходит. Ваши действия? 99. В течение 5 минут найдите и опишите дефекты, которые вы видите:     100. Вам нужно сделать Regression Testing за два дня. Как вы это сделаете, если Regression Run охватывает 1000 тест-кейсов? 101. Вы тестируете интернет-магазин, который продаёт карандаши. В заказе нужно указать количество карандашей (максимум для заказа – 1000 штук). В зависимости от заказанного количества карандашей отличается цена:   1–100 – 10 грн за шт. 101-200 – 9 грн за шт. 201-300 – 8 грн за шт.   С каждой новой сотней цена уменьшается на 1 гривну. Задание: используя тест-дизайн, опишите все необходимые тест-кейсы, которые будут максимально покрывать описанную функциональность.   102. Есть приложение типа мессенджера, пользователь заходит в чат и отсылает файл (видит сообщение Failed to send...) Когда это может быть баг, а когда нет? 103. Есть веб-приложение интернет-магазина (регистрация, логин, поиск товаров, корзина и покупки). Программу поддерживают следующие браузеры: Chrome, Safari, Edge. У нас есть ограниченное время на тестирование. Расскажите, как вы будете проверять приложение? 104. Напишите автоматические тестовые сценарии для проверки API операций создания и просмотра GitHub Gists. Интегрируйте ваш проект с известной вам CI-системой.   Senior   Теория 1. Как вы преодолеете трудности из-за отсутствия надлежащей документации для тестирования? 2. Какой подход является наилучшим для старта QA в проекте? 3. Какие препятствия могут возникнуть в обеспечении качества для Agile Tester? 4. Что такое Definition of Done? 5. Когда можно считать, что тестирование окончено? 6. Что такое RCA в тестировании? Нужно ли его проводить? 7. Какой подход вы используете для Test Cases Review? 8. Какие виды рисков существуют? Что такое Mitigation Plan? 9. На основе чего нужно составлять стратегию для проведения тестирования нагрузки? 10. Как часто следует ревьюировать тестовую документацию? 11. Как можно быстро сделать выборку необходимых проверок для смоук-тестирования? 12. Как запланировать загруженность команды тестировщиков? 13. Какую ценность несет анализ результатов тестирования команде и проекту в целом? 14. Как можно подкорректировать флоу разработки, чтобы получать более чистые результаты на выходе и уменьшить количество багов на проде? 15. Расскажите о метриках качества, которые вы применяли. Зачем они нужны? 16. Как провести эстимейт задачи? Каковы техники оценки объема тестирования существуют? 17. Как можно посчитать покрытие тестами функционала? 18. Какое оптимальное количество шагов в тестовом сценарии? 19. Как избежать появления регрессивных дефектов? 20. Что такое тестирование со смещением влево (Shift left testing)? 21. Как будете тестировать программу, если для продукта нет документации? 22. В чем смысл юнит-тестов? 23. Какие минусы полной автоматизации тестирования? 24. Что такое ROI и как его считать? 25. Что такое CI/CD? Какие плюсы и минусы этого подхода? 26. TOP OWASP: какие знаете уязвимости и методы защиты? 27. Что вы думаете по поводу BDD? Когда следует использовать, а когда будет только хуже? Если все же следует использовать, то для UI или API автоматизированного тестирования? 28. Что такое сокеты и как их тестировать, вручную и автоматизировано? Зачем их используют? 29. Когда следует делать стресс-тестирование на проектах? От чего отталкиваться, когда строите сценарий для такого тестирования? Что учесть при выборе инструмента? 30. Расскажите об алгоритмах шифрования трафика. 31. Что такое NIC? 32. Для чего нужен протокол RTP? 33. Что, по вашему мнению, лучше – SIP или PRI? 34. Что такое NAT?     Практические задания 35. Сформулируйте негативные сценарии для POST-запроса, который создаёт нового пользователя. 36. Как вы регулируете конфликтные ситуации между QA и разработчиками? 37. Есть проект, на котором нет тестовой документации, но проекту уже год. Мануальным QA не хватает времени на тестирование, они очень устали, есть желание уволиться. Какое решение по команде можно принять? 38. Продайте мне тестирование как клиенту, не желающему его покупать. Кратко и структурированно опишите вашу работу на каждом из этапов разработки ПО, используя профессиональные термины (не лить воду). 39. У вас есть онлайн-калькулятор. Вы вводите 1+1 и получаете 3. Расскажите, как вы будете искать причину проблемы. 40. Могут ли быть такие виды архитектур? Чего может быть недостаточно для правильной работы архитектур, приведенных ниже?   Пример 1     Пример 2     Пример 3     Пример 4   Вопросы при выполнении этого задания:   какие запросы выполняются по форме авторизации? Какой запрос выполняется, когда мы сохраняем данные в базе данных? Можно ли авторизоваться с помощью GET-запроса и нормально ли так делать? Какой код ответа мы получаем при падении ошибки на сервере, код при ошибочных credentials на форме авторизации? Можно ли заменить SSL-сертификат шифрованием данных в пакете от клиента к серверу для протокола HTTP или это будет равноценной заменой?   41. Есть веб-страница с полями e-mail, password и кнопкой submit. Предположим, что после нажатия кнопки submit страница перезагружается и ранее введенные данные исчезают. Как проверить, что данные отправлены в базу данных? 42. Какое минимальное количество тест-кейсов необходимо, чтобы убедиться в корректной работе этой веб-страницы? 43. Как проверить безопасность на веб-странице (на выбор)?   Редакция DOU.ua выражает благодарность за вопросы и рецензию: Роману Поботину, Андрею Заблоцкому, Виктору Максименко, Марьяне Батюк, Ирине Литвин, Сергею Могилевскому, Святославу Логину, Роману Маринскому, Олегу Заревичу, Олесе Паславской, Тарасу Лирке, Максиму Богуну, Вадиму Гуличу, Виталию Кашубе, Юрию Суравскому, Светлане Франковой, Владимиру Арутину, Станиславу Жупинасу, Людмиле Федчук, Иванне Черухе, Юлии Левченко, Владиславу Куличенко, Юрию Бояру.
ТОП-7 найкращих Linux дистрибутивів для розробника в 2019 році

Автор: Армен Маїлян

ТОП 7 дистрибутивов Linux 7-е место - Gentoo 6-е место - Gentoo 5-е место - Linux Mint 4-е место - Fedora 3-е место - Debia 2-е место - Arch Linux 1-е место - Ubuntu Несколько не вошедших в ТОП рейтинга, но все еще интересных дистрибутивов Linux Antergos Puppy Linux Manjaro Linux   Существует большое разнообразие операционных систем, используемых на рабочих станциях как простыми пользователями, так и разработчиками ПО. Какую же операционную систему следует выбрать разработчику в 2019 году? Согласно опросу, проведенному среди более чем 76 000 разработчиков и опубликованному в ежегодном отчете Stack Overflow’s 2018 Developer Survey, лидирующее положение в качестве основной операционной системы все еще занимает OS Windows. Однако, уже почти четверть из числа разработчиков используют в качестве основной ОС – Linux, или правильнее сказать Linux-based операционную систему. Этот немалый процент пользователей не может не заставить задуматься – а какие плюсы дает использование Linux в качестве операционной системы для разработчика? Возможно, имеет смысл мигрировать на Linux с OS Windows и MacOS? Но давайте для начала уточним несколько моментов.   Что такое Linux История UNIX-подобных операционных систем начинается в 1960-х годах с совместного проекта Массачусетского Технологического Института и компаний General Electric и Bell Labs. В последствии компании прекратили финансирование проекта и его развитие продолжилось энтузиастами. Это привело к появлению в 70-х годах системы UNICS, затем сменившей название на UNIX. В 1980-х годах набор дистрибутивов UNIX был выпущен под коммерческой лицензией компанией AT&T, в которую входила Bell Labs. Однако, по политическим причинам, AT&T была вынуждена предоставить исходный код OS UNIX, под ограничивающей возможности лицензией, ряду вузов, включая университет Беркли. Так, начиная с 1978 года, появилось одно из первых ответвлений Unix-подобных систем – BSD Unix. (BSD - Berkeley Software Distribution). Работавший в начале 1980-х в MIT Ричард Столлман был недоволен коммерциализацией и закрытостью лицензий UNIX. В 1983 году он объявил о новом проекте – GNU (GNU – рекурсивный акроним GNU’s Not UNIX). В рамках этого проекта получила начало разработка Unix-подобной операционной системы под свободной лицензией GNU GPL. Стоит отметить, что данная лицензия не только дает право разработчику свободно использовать программы, выпущенные под этой лицензией, но и обязывает разработчика выпускать все производные программы также под данной лицензией. Операционная система Linux появилась на свет в 1991 году благодаря Линусу Торвальдсу, разочаровавшемуся в существующих на тот момент операционных системах, бывших либо платными, либо выпущенными под лицензией BSD – с правом применения только в образовательных целях. В новой операционной системе Линусом Торвальдсом было переписано ядро, задачей которого является, в основном, координация доступа приложений к ресурсам системы. Возникшая на основе UNIX-подобной системы MINIX, работавшей под лицензией BSD, операционная система Linux в дальнейшем претерпела значительных изменений. Так были заменены многие компоненты на те, что написаны под лицензией GNU. В последствии произошло более глубокое слияние проектов GNU и Linux с образованием операционной системы GNU/Linux или той, что сейчас зачастую называют просто - Linux. До сих пор существует путаница в том, какие дистрибутивы ОС следует относить к Linux, а какие – нет. Ряд пользователей называет Linux-ом все операционные системы, использующие ядро Linux. В число таких ОС входит, в частности – Android. Другие пользователи признают под Linux только те дистрибутивы, которые состоят как из стандартного ядра, так и из обязательно включенной части ПО GNU (в число таких Android входить, соответственно, не будет). В рамках данной статьи, мы примем за определение Linux следующее: Операционная система Linux – это продукт, состоящий из ядра Linux, и набора внешних модулей GNU. Часто многие обзорные статьи и рейтинги операционных систем под заголовками «ТОП ... лучших Linux дистрибутивов» включают в себя не только сборки из семейного дерева Linux, но и те, которые фактически относятся к другим ветвям Unix-подобных систем, в частности - FreeBSD. Такая путаница действительно существует. Но не стоит забывать – это разные «ветви» развития операционных систем, имеющих общий исторический «корень» – Unix.   Преимущества Linux, как системы для разработчиков Почему Linux хорошая альтернатива для разработчика? Рассмотрим отдельно преимущества и недостатки использования Linux как основной операционной системы.   Общие преимущества для пользователей: Выбор. Огромное разнообразие дистрибутивов Linux, с разным набором компонентов, позволяет профессиональному пользователю найти тот, который будет удовлетворять его потребности как в работе, так и в быту. Настраиваемость и гибкость системы. Являясь, вероятно, самой настраиваемой и гибкой системой, Linux позволяет подогнать операционную систему под себя буквально. Бесплатное распространение. Распространяясь под лицензией GNU GPL, сами дистрибутивы Linux являются бесплатными. Однако ряд дистрибутивов являются коммерческими и полный спектр возможностей (поддержка, доступ в ряд репозиториев и т.п.) предоставляют на платной основе. Открытое программное обеспечение – Open Source. Огромное количество разнообразных программ с отрытым исходным кодом, бесплатных и общедоступных. Значительное количество специфических программ для обучения. При этом сохраняется возможность установки проприетарных программ. Использование эмулятора Wine позволяет запускать  на Linux многие приложения операционной системы Windows. Низкие системные требования и высокая скорость работы. Благодаря глубокой кастомизации дистрибутивов, обеспечивается более высокая скорость работы операционной системы и приложений. Это позволяет с большим комфортом пользоваться относительно старым железом при правильном подборе дистрибутива ОС. Активное сообщество пользователей и разработчиков. Безопасность. Конечно безопасность операционной системы в первую очередь зависит от пользователя, но нельзя не признать, что количество вирусов под Linux на порядки меньше чем под Windows. Кроме того, благодаря доступу к публичным, контролируемым репозиториям для установки ПО, нет необходимости брать программы из непроверенных источников. Также нельзя не отметить глубокую настраиваемость механизмов, обеспечивающих безопасность в Linux.   Преимущества Linux для разработчиков: Возможность тестировать разрабатываемое ПО прямо в том же окружении, в котором оно будет работать после выхода в продакшн. Вы можете иметь на вашем персональном компьютере весь тот же самый софт, с теми же версиями и настройками, как тот, который будет «крутиться» на сервере для вашего приложения. Удобство при активном использовании механизмов командной строки, Git и текстового редактора Vim отмечают многие разработчики. Стабильность в работе без перезагрузок. Многие пользователи не перезагружают операционную систему, пока не появляется необходимость в обновлении. Параноикам от мира разработчиков будет приятно знать, что Linux не собирает статистику на пользователя, в отличие от той же Windows   Недостатки Linux, как системы для разработчиков: Отсутствие ряда профессиональных программ, сравнимых с таковыми под Windows. Несмотря на возможность запуска многих программ под Wine нехватка профессиональных приложений ощущается. Особенно это заметно при необходимости работы с графикой и моделированием. Сложность разработки под Windows. Если вы работаете под Linux, это не значит, что в ваши задачи не будет входить написание кода под Windows. К сожалению полноценная Visual Studio под Linux не работает, а эта IDE сейчас является основной для Windows-разработки. Определенная сложность в обучении работы с инструментами. Нельзя не отметить, что порог вхождения в работе под Linux заметно выше.   Мы выделили основные плюсы и минусы в работе на Linux для программиста. Теперь давайте рассмотрим наиболее приемлемые Linux дистрибутивы. Разнообразие дистрибутивов Linux и статистика История дистрибутивов Linux насчитывает уже более 28 лет. Не удивительно, что из года в год появляющиеся и отмирающие ветви дистрибутивов этой операционной системы сегодня представляют уже целый зоопарк – фигурально выражаясь. Для примера можно посмотреть на стилизованный под периодическую систему список наиболее используемых дистрибутивов Linux, отсортированных по материнским версиям операционных систем. Как видно из этой схемы, таких дистрибутивов – не мало. И это только наиболее популярные. Известный портал distrowatch.com насчитывает только активных более 260 дистрибутивов. Чтобы помочь определиться с тем, какой дистрибутив Linux лучше выбрать разработчику, рассмотрим несколько рейтингов дистрибутивов Linux. Статистика использования пользователями разных дистрибутивов Linux согласно порталу phoronix.com Согласно данным опроса, проведенного в 2017 году порталом phoronix.com среди почти 30 000 людей, использовавших Linux дистрибутивы на ноутбуках, лидером по применению  является дистрибутив Ubuntu. Этот дистрибутив линукс получил 38,9% голосов. Следом за Ubuntu по популярности идет дистрибутив Arch Linux, получивший 27,1% пользователей.  Затем идут, Debian, Fedora и Linux Mint, получившие, соответственно, 15,3%, 14,8% и 10,8% аудитории. Шестое место в этом рейтинге дистрибутивов Linux занял openSUSE с 4,2%, а седьмое – Gentoo с 3,9% аудитории. Стоит отметить, что почти три четверти этих пользователей (73,1%) использовали указанную ими операционную систему для разработки ПО. Топ дистрибутивов Linux по статистике портала gamingonlinux.com По данным опроса, проведенного порталом gamingonlinux.com среди более 2 500 своих пользователей и действительному на 01.01.2019 – большая часть их пользователей использует Arch Linux - 21,2%. Затем идут Ubuntu – 19,15%, Linux Mint – 9,37%, Manjaro – 7,36%, Debian – 6,28%, Fedora – 4,72%, Antergos – 4,61%.   Опрос для рейтинга дистрибутивов линукс на портале reddit.com Проведенный на портале reddit.com в 2017 году, опрос среди почти 2 500 человек в сообществе r/unixporn, показал наибольшую популярность таких дистрибутивов линукс: Arch Linux использовали 27.0% пользователей, Ubuntu – 17,9%, Debian – 11,8%, Fedora – 6,09%. Затем идут Rasbian – 5,52%, Manjaro – 5,43% Antergos – 4,67%, Linux Mint – 3,41% и Gentoo – 2,44%. Множество других дистрибутивов Linux, включая openSUSE, Puppy Linux, CentOS и т.п., использует значительно меньшая доля пользователей. При этом указанные дистрибутивы использовались на ноутбуках более чем в 80% случаев, а на стационарных компьютерах – более чем в 60% случаев. Данные Google Trends Данные Google Trends, по пяти наиболее популярным дистрибутивам, показывают существенный отрыв Ubuntu даже от других дистрибутивов первой пятерки.   Давайте рассмотрим непосредственно наш рейтинг Linux дистрибутивов, составленный на основе указанных выше статистических данных.   ТОП 7 дистрибутивов Linux   7-е место - Gentoo Дистрибутив Gentoo версии 1.0 увидел свет в 2002. Этот дистрибутив создавался Дэниелом Роббинсом на основе другой его разработки, начатой еще в 1999 году -  Enoch Linux. В 2004 году Роббинсом был создан некоммерческий Фонд Gentoo, которому он передал в последствии права на торговые марки и авторские права, после чего покинул пост главного архитектора проекта. Философия проекта Gentoo состоит в предоставлении пользователям линукс, желающим иметь полный контроль своей системы, возможность контролировать, что установлено и запущено на их компьютере.  У пользователей есть возможность собирать персональные системы и серверы очень эффективными, если они готовы потратить немалое время, для установки и настройки системы. Gentoo рекомендует пользователям создавать ядро Linux с учетом их конкретного оборудования. Пользователи могут полностью контролировать, установленные и запущенные службы. Возможно существенно уменьшить потребление системой памяти в сравнении с работой других дистрибутивов, исключив незадействованные пакеты и службы ядра. Соответственно, может быть увеличена и скорость работы операционной системы - благодаря отсечению лишнего. Само название дистрибутива, происходит от названия вида пингвинов - Gentoo penguin, самого быстрого в мире. Значительная часть версий Linux являются пакетными. Сам процесс установки дистрибутивов такого типа происходит из пакетов, заранее собранных с откомпилированными исполняемыми файлами. Gentoo, в свою очередь, дистрибутив не пакетный, а source-based. У такого типа дистрибутивов исходники пакетов хранятся в репозиториях, а при установке – пакеты собираются из исходников прямо на пользовательском компьютере. Официальный сайт – https://www.gentoo.org/   Особенности линукс дистрибутива Gentoo: source-based дистрибутив; системы менеджмента пакетами Portage, Pkgcore, Paludis; для ряда приложений (особенно долго компилируемых) есть готовые бинарные сборки; созданные при компиляции на одном компьютере бинарные пакеты можно переносить на другой, с таким же железом; скользящие обновления (rolling-релиз); возможность установки существует для таких платформ - x86, x86-64, ARM, PowerPC, PowerPC 970, SPARC, MIPS, DEC Alpha, PA-RISC, IBM/390, SuperH и 68k.   Плюсы дистрибутива линукс Gentoo: глубокая настройка ОС с компилированием под индивидуального пользователя с конкретным железом; очень большое число доступных для установки приложений; большое количество доступных репозиториев; очень высокая стабильность работы правильно настроенных приложений; благодаря rolling-релизам обновление становятся менее болезненным; развитое сообщество пользователей и разработчиков; хорошая документация; возможность продолжения компиляции пакетов в случае если она была прервана; возможность устанавливать одновременно несколько веток софта; ряд исследований показывает, что в Gentoo потребление PHP памяти может быть уменьшено на количество вплоть до 50%.   Минусы дистрибутива Gentoo: излишне высокий порог вхождения для обычного пользователя; первоначальная установка занимает много времени; необходимость в частых обновлениях; если систему долго не обновлять, то обновление потом будет по сложности сравнимо с установкой с нуля; основная работа только через командную строку; возможны проблемы в процессе установки (компиляции пакетов) на слабых компьютерах.   Минимальные системные требования Gentoo Linux для desktop: Фактически может работать на самых минимальных возможных конфигурациях, в зависимости от задач и сборки.   6-е место - openSUSE Начало дистрибутиву openSUSE положено в 1992 году, когда четыре «любителя Linux» - Роланд Дайрофф, Томас Фер, Хьюберт Мантел и Бурхард Стейнбилд запустили SuSE - свой проект по продаже локализованных наборов Slackware Linux. Начиная с 1996 года, SuSE Linux стала независимым дистрибутивом. В дальнейшем, в состав SuSE Linux добавили менеджер пакетов RPM и представили общественности YaST - графический инструмент управления системой. Частые выходы новых версий дистрибутива, доступность SuSE Linux в магазинах Европы и Америки, наличие полной печатной документации – все это смогло поднять популярность дистрибутива. Novell Inc приобрела SuSE Linux в конце 2003 года. Вскоре произошел ряд изменений в политике SuSE. Так широкой публике представили YaST, дистрибутив SuSE лицензировали под GPL, образы дистрибутива начали распространять свободно с общедоступных серверов загрузки, и, что наиболее важно, разработка дистрибутива стала открытой для участия общественности. С версии SuSE 10.0, благодаря сообществу openSUSE, дистрибутив начинает распространятся полностью бесплатно, с открытым исходным кодом. На основе кода openSUSE был создан коммерческий продукт, сначала под именем Novell Linux, но позже разделившийся на два и изменивший название на SUSE Linux Enterprise Desktop и, также, SUSE Linux Enterprise Server. Сейчас проект openSUSE финансируется как компанией SUSE, так и рядом других компаний, и энтузиастов. Сейчас openSUSE доступен в двух основных редакциях - Leap, которая обеспечивает стабильную платформу с многолетней поддержкой и Tumbleweed, который обеспечивает скользящий выпуск обновлений дистрибутива. openSUSE часто хвалят за простоту настройки (через YaST), расширенную поддержку файловой системы Btrfs, а также за автоматические снимки файловой системы и загрузочные среды. Официальный сайт - https://www.opensuse.org/ Особенности дистрибутива openSUSE: версия ядра Linux – 4.12; в качестве графических сред, использует - Cinnamon, Enlightenment, GNOME, IceWM, KDE Plasma, LXDE, LXQt, MATE, Xfce; частота обновления версий – 12 месяцев; в качестве менеджера пакетов применяется RPM; поддерживает x86-64. Плюсы дистрибутива openSUSE: комплексный и интуитивно понятный инструмент настройки; большой репозиторий доступных пакетов ПО; отличная документация проекта; файловая система Btrfs, по умолчанию. Минусы дистрибутива openSUSE: ресурсоемкая работа рабочего стола и графики зачастую замедляет работу системы. Минимальные системные требования openSUSE: Pentium 4 1,6 GHz – процессор; 1 GB – оперативной памяти; 3 GB – свободного места на жестком диске; CD-ROM или USB порт.   5-е место - Linux Mint Linux Mint - основанный на Ubuntu ирландский дистрибутив, впервые выпущенный в 2006 году. Mint доминировал во многих рейтингах с 2011 по 2017 год. Такую популярность он приобрёл за свою стабильность, разнообразие поддерживаемых настольных менеджеров и полноценные мультимедийные возможности. Изначально планировалось выпускать несколько версий дистрибутива Mint под каждый выпуск версии Ubuntu. Однако, со временем, цикл разработки удлинился, сейчас составляя 2 года. При этом теперь дистрибутив базируется только на LTS-версиях Ubuntu (. В настоящий момент разрабатывается и управляется сообществом. Разработчики Mint сосредоточены на стабильности, поэтому они предпочитают консервативный цикл выпуска. Вы не будете получать новейшие обновления, но все равно будете в курсе событий разработки. Вас также не привлекут к разработке в качестве непроизвольного бета-тестера. Официальный сайт - https://linuxmint.com/   Особенности дистрибутива Mint: основывается на LTS версиях дистрибутива Ubuntu; версия ядра линукс – 4.15; специально разработанная среда рабочего стола Cinnamon, также доступны MATE, Xfce; частота обновления версий – 2 года; в качестве системы менеджмента пакетов - применяется dpkg; поддерживает x86 архитектуру; в сравнении с Ubuntu, базовый дистрибутив включает более расширенный мультимедийный функционал; использует тот же программный репозиторий, что и Ubuntu; вход под суперпользователем по умолчанию запрещён, как и в Ubuntu; своя система как обновления, так и установки приложений.   Плюсы дистрибутива Mint: превосходная коллекция мультимедийных инструментов; высокая стабильность работы; открытое сообщество разработчиков.   Минусы дистрибутива Mint: в альтернативные «общественные» релизы редко добавлены последние функции; проект не выпускает рекомендации по безопасности.   Минимальные системные требования дистрибутива Linux Mint: x86 - процессор; 512 MB – доступной оперативной памяти; 9 GB - места на жёстком диске; CD-привод или USB-порт.   4-е место - Fedora Хотя официально год представления дистрибутива общественности - 2004, фактически история Fedora начинается в 1995. Дистрибутив, с именем Fedora, его авторами Бобом Янгом и Марком Юингом изначально был назван - Red Hat Linux. В последствии, Red Hat представила в 1997 году новый менеджер пакетов – RPM (RPM - рекурсивный акроним RPM Package Manager - менеджер пакетов), во многом признанный революционным. В 2003 году, после выхода 9й версии Red Hat, в продуктах компании произошел ряд изменений. Имя Red Hat (товарный знак) - сохранился для коммерческих продуктов, публике же был представлен дистрибутив Fedora Core (затем сменивший имя на Fedora), изначально ориентированный на сообщество «любителей Linux». Несмотря на неприятие изменений сообществом, Fedora уже через несколько выпусков смогла вернуть себе звание одной из наиболее востребованных версий дистрибутива Linux. В свою очередь компания Red Hat, благодаря внедрению множества инноваций, превосходной поддержке клиентов и ряду других моментов, смогла стать крупнейшей и прибыльнейшей Linux-компанией в мире. В 2015 году Fedora представила обновленную версию своего дистрибутива под названием Atomic Host. Используя те же пакеты, что и Fedora's Server edition, Atomic обеспечивает обновления базовой ОС используя технологию OSTree. Сегодня Fedora - это один из самых распространенных и инновационных дистрибутивов Linux. К началу 2019 года только загрузок дистрибутива с официального сайта было произведено около 1 500 000. Широко известен вклад проекта Fedora в код ядра системы Linux, в ряд библиотек и технологий. Однако, в дистрибутиве все еще отсутствует определенность в стратегии развития десктоп-сегмента, которая упростила бы использование этого линукс дистрибутива для всех тех, кто выходит за рамки цели «любителя Linux». Официальный сайт - https://getfedora.org/   Особенности дистрибутива Fedora 29: версия ядра Linux – 4.18; менеджер пакетов RPM; использует по умолчанию графическую среду GNOME 3.30; частота обновления – 6-8 месяцев; поддерживает x86, x86-64, ARM, i686, POWER, MIPS, IBM System/39 платформы; единый глобальный репозиторий с исключительно бесплатным ПО (есть ряд неофициальных репозиториев); проект как разрабатывается, так и поддерживается сообществом, при этом спонсором выступает компания Red Hat; Fedora Project запретила поставку дистрибутива в Крым, Сирию, Судан, Иран, Северную Корею, и Кубу.   Плюсы дистрибутива Fedora: значительная инновационность дистрибутива; встроенная поддержка Docker; впечатляющие возможности обеспечения безопасности; огромное количество поддерживаемых пакетов; философская концепция свободного ПО; устоявшееся сообщество разработчиков и пользователей дистрибутива; наличие Live-CD со многими графическими оболочками.   Минусы дистрибутива Fedora: приоритеты дистрибутива Fedora, ориентированы, чаще, на решения корпоративных задач, а не на удобство при использовании персональных компьютеров; некоторые передовые внедрения (к примеру - раннее переключение на KDE 4 и GNOME 3) отталкивают ряд устоявшихся пользователей настольных компьютеров.   Минимальные системные требования дистрибутива Fedora: 1 GHz - процессор; 1 GB – оперативная память; 10 GB – свободного места на жестком диске.   3-е место - Debia   OS Debian GNU анонсировали в 1993 году. Создателем дистрибутива Debian был Ян Мердок, который, совместно с сотнями разработчиков-добровольцев, проектировал новый, полностью некоммерческий дистрибутив. Несмотря на общий скепсис в отношении новой операционной системы, Debian выжил. Кроме того, он стал крупнейшим дистрибутивом и, вероятно, самым крупным совместным проектом ПО из когда-либо созданных! Успешность Debian можно проиллюстрировать следующими цифрами. Его разрабатывали более 1000 добровольных разработчиков. Репозитории Debian содержат около 50 000 бинарных пакетов (написанных для 8 различных процессорных архитектур) и участвуют в создании около 130 установочных дистрибутивов и систем LiveCD на основе Debian. Ни одна другая ОС семейства Linux не может похвастаться похожими достижениями. Фактическая разработка OS Debian происходит в четырех (включая экспериментальную) основных ветвях с повышающимися уровнями стабильности работы ПО: «нестабильная» - «sid», «тестовая» и «стабильная». Именно благодаря этой схеме постепенной стабилизации и интеграции компонентов, Debian на сегодня считается одним из наиболее протестированных и наиболее свободных от ошибок дистрибутивов Linux. Официальны сайт - https://www.debian.org/   Особенности stable дистрибутива Debian Linux: дистрибутив основан на ядре версии 4.9. работает на следующих архитектурах - Intel x86, Intel 64, AMD64, ARM, ARM с аппаратным FPU, 64-битные ARM, 32bit MIPS, 64bit MIPS, Power Systems, 64-битный IBM S/390.   Плюсы дистрибутива Debian: признанная очень высокая стабильность; глубокий и последовательный контроль качества разработки; огромная библиотека пакетов в репозиториях - более 30 000 пакетов ПО; Универсальность касательно применения с различными видами процессорных архитектур. Debian поддерживает на сегодня больше их видов, чем любые другие линукс дистрибутивы. Минусы: достаточно быстрое устаревание стабильных версий из-за длинного цикла разработки – 1-3 года на цикл; консервативный состав дистрибутива – новые технологии, зачастую, не включаются в состав дистрибутива из-за необходимости поддержки сразу многих процессорных архитектур; относительно старая версия ядра; демократичность руководства проектом зачастую приводит к неоднозначным решениям, вызывая конфликты в сообществе разработчиков и тормозя развитие проекта.   Системные требования Debian: 128 MB – оперативная память; 2 GB - свободного места на жестком диске.   2-е место - Arch Linux Дистрибутив Arch Linux был основан Джаддом Винетом на философии KISS (keep it simple, stupid - не усложняй, тупица) в 2002 году. Сначала развитие проекта Arch Linux проходило, как дистрибутива для достаточно продвинутых пользователей, и Arch был мало популярен. Ситуация изменилась после того, как к дистрибутиву была применена политика обновлений Rolling release (плавающий релиз).  Теперь операционную систему достаточно стало установить единожды, после чего мощный менеджер пакетов сам обновлял соответствующие пакеты согласно выходящим обновлениям, без необходимости переустановки ОС. Из-за этого мажорные выпуски Arch Linux немногочисленны и ограничиваются базовым установочным образом, который обновляется только при значительных изменениях в базовой версии системы. Официальный сайт - https://www.archlinux.org/   Особенности дистрибутива Arch Linux: быстрый и мощный менеджер пакетов Pacman предоставляет возможность легко управлять и настраивать под себя как пакеты, размещенные в официальных репозиториях Arch, так и собранные самостоятельно; возможность устанавливать пакеты ПО из исходного кода; доступны следующие варианты графических оболочек – GNOME, KDE, LXDE, MATE, Xfce, Cinnamon, Enlightenment. в своем базовом виде дистрибутив Arch Linux содержит тщательно отобранный набор ПО, необходимого для ежедневной работы. основанная на философии «не усложняй», Arch Linux предоставляет ПО в том виде, в котором оно изначально представлено разработчиками. Для обеспечения совместимости вносятся только минимально необходимые изменения. последняя версия работает с ядром 4.20.5.   Плюсы дистрибутива Arch Linux: отличная инфраструктура управления программным обеспечением; возможности глубокой настройки системы под себя; удобства системы обновлений Rolling release; доступность обширной библиотеки документации системы.   Минусы дистрибутива Arch Linux: опасности ошибок и нестабильности при обновлениях благодаря особенностям принципа обновлений «roll-release»; требовательность к относительно высокому уровню знаний пользователя; зачастую невозможность установки новой - «мажорной» версии ОС, поверх старой.   Системные требования Arch Linux: x86_64 - совместимый процессор; 512 MB - оперативная память; 800 MB – свободного места на жестком диске; подключение к Интернету.   1-е место - Ubuntu Топ 1 нашего рейтинга -  операционная система Ubuntu, является широко распространенной версией Linux, в свое время основанной на другом дистрибутиве – Debian. Впервые о выходе Ubuntu заявили в 2004 году. Несмотря на относительную новизну, развиваться он начал стремительно. Пройдя тернистый путь популяризации длинной в 15 лет, Ubuntu занимает место самой популярной версии Linux для настольных компьютеров. Этот проект сделал очень много для разработки простой и удобной в использовании, бесплатной операционной системы для настольных компьютеров. Сегодня дистрибутив Ubuntu успешно конкурирует как со свободными, так проприетарными ОС. В чем причины потрясающего успеха Ubuntu? Среди главных выделяют Марка Шаттлворта - автора проекта.  Участвовавший ранее до Ubuntu в разработке Debian, Шаттлворт является мультимиллионером, владеющим компанией Canonical Ltd, которая и финансирует проект в настоящее время. Во-вторых, проект Ubuntu извлек уроки из проблем в разработках схожих проектов и смог избежать их – разработчики смогли создать удобную веб-инфраструктуру с Wiki-документацией и креативным средством сообщения о багах системы, профессионально подходя к конечным потребителям. В-третьих – с помощью финансовых возможностей автора, участники проекта смогли разослать бесплатные образцы дистрибутива заинтересованным пользователям. Это напрямую поспособствовало скорейшему распространению Ubuntu. Фактически, Ubuntu основывается на нестабильной ветке дистрибутива Debian, включив в себя такие распространенные пакеты, как - GNOME, LibreOffice, Firefox и др., обновив их до стабильных версий. Этот дистрибутив Linux выходит с предсказуемым шестимесячным графиком, периодически выпуская версии с долгосрочной поддержкой (LTS), которые поддерживаются обновлениями безопасности на протяжении 5 лет. Выпуск без LTS, в свою очередь, поддерживается 9 месяцев. Официальный сайт - https://www.ubuntu.com/   Особенности дистрибутива линукс Ubuntu: дистрибутив основывается на Debian; вход под суперпользователем отключен. Для получения полномочий суперпользователя используется утилита sudo; доступны варианты дистрибутивов с разными пакетами графических оболочек - GNOME - по умолчанию в версии 18.04, KDE – Kubuntu, Xfce – Xubuntu, LXDE/ LXQt – Lubuntu и другие. в версии Ubuntu 18.04 сбор пользовательских данных включён по умолчанию (возможно отключить); ядро Linux версии 4.15 в LTS версии; проект разрабатывается и поддерживается компанией Canonical.   Плюсы дистрибутива Ubuntu: исправлен цикл релиза и период поддержки, в сравнении с Debian; наличие долгосрочной поддержки (LTS) с 5-летним сроком предоставления обновлений безопасности; интерфейс, дружественный для начинающих; множество как официальной, так и пользовательской документации; широко распространенный дистрибутив с обширным комьюнити, большим количеством репозиториев и широкой возможностью выбора программ для установки. поддержка новейших технологий «из коробки» - к примеру, 3D эффекты графической оболочки и элементов рабочего стола; простая установка проприетарных драйверов для различных устройств беспроводных сетей и видеокарт NVIDIA и ATI; возможность выбора варианта дистрибутива с менее требовательной графической оболочкой.   Минусы: отсутствие совместимости с дистрибутивом Debian; часто выходящие важные изменения дистрибутива, как правило, отталкивают некоторых пользователей; не LTS релизы поставляются только с 9-месячной поддержкой безопасности.   Минимальные системные требования дистрибутива Ubuntu: 2 GHz dual core процессор; 2 GiB – доступная оперативная память; 25 GB – свободного места на жестком диске; CD/DVD привод или USB порт для.   Несколько не вошедших в ТОП рейтинга, но все еще интересных дистрибутивов Linux   Antergos Antergos- это относительно новый дистрибутив Linux, основывающийся на Arch. Изначально выпущенный в 2012 году под именем Cinnarch, этот дистрибутив был клоном Arch Linux, с Cinnamon в качестве окружения рабочего стола. На уровне системы отличий между Antergos и Arch Linux – нет. Разница между дистрибутивами находится в подходе к пользователю. В отличие от Arch, рассчитанного на уже опытного пользователя, Antergos направлен на всех, как опытных, так и начинающих Linux пользователей. В качестве установщика Antergos использует собственную разработку - CNCHI, созданный чтобы максимально упростить для пользователя процесс установки. Минимальный набор входящих в дистрибутив приложений подойдет тем, кто хочет собрать дистрибутив под свои нужды. Если же вам нужен уже готовый к работе дистрибутив, предоставляющий полный набор приложений для повседневного использования - вам Antergos не подойдет. Галийское слово Antergos (означающее: предки) было выбрано, «чтобы связать прошлое с настоящим». Это название символизирует, что несмотря на все глубокие существенные изменения в дистрибутиве, глубокая связь с основой дистрибутива, Arch Linux - остается. Официальный сайт - https://antergos.com/   Особенности дистрибутива Antergos: основывается на Arch Linux; Использует версию ядра 4.20; Доступны такие виды графической оболочки – Cinnamon, GNOME, KDE, Xfce, Openbox, MATE Скользящая модель обновлений.    Плюсы дистрибутива Antegos: Открытое сообщество, как для разработчиков, так и для пользователей с их пожеланиями и замечаниями; Собственный установщик, упрощающий процесс установки; Поддерживается то же железо, что и у Arch Linux, Отличный внешний вид благодаря сотрудничеству с Numix; Использует репозитории Arch Linux; Быстрый выход обновлений для разнообразного ПО.   Минусы дистрибутива Antergos: Сложности с установкой проприетарных драйверов на ряд устройств - нужно ставить вручную.   Puppy Linux Puppy Linux это дистрибутив Linux, созданный Барри Каулером в 2003 году. Puppy Linux – не является цельным дистрибутивом Linux, как Debian. Puppy Linux также не является дистрибутивом Linux с несколькими разновидностями, как Ubuntu (с его вариантами Ubuntu, Kubuntu, Xubuntu и т. д.), хотя и поставляется в разных вариантах. Puppy Linux - это совокупность нескольких дистрибутивов Linux, построенных на одних и тех же общих принципах, с использованием одного и того же набора инструментов, на основе уникального набора приложений и конфигураций, специфичных для Puppy, и в целом обеспечивающих согласованное поведение и работу, независимо от того, какой дистрибутив вы выбираете. Не смотря на очень маленький размер, дистрибутив является полнофункциональным. В отличие от дистрибутивов LiveCD, которые должны постоянно подгружать данные с компакт-диска, Puppy загружается сразу в RAM. Таким образом все ПО будет запускаться практически мгновенно и мгновенно реагировать на ввод данных пользователем. Puppy Linux может загружаться с любого USB-накопителя, CD-ROM, Zip-диска или супердиска LS 120/240, дискет, внутреннего жесткого диска. Он может даже использовать мультисессионный формат CD-RW / DVD-RW, чтобы сохранить всё обратно на CD / DVD без жесткого диска вообще.   Есть три основных направления дистрибутивов Puppy Linux: официальные дистрибутивы – являются дистрибутивами общего назначения и поддерживаются командой Puppy Linux. Как правило, создаются с использованием сборщика систем Puppy Linux (называемого Woof-CE). собранные в коллекцию Woof, дистрибутивы Puppy Linux - разрабатываются для удовлетворения конкретных потребностей, предназначаются для общего пользования и собраны с использованием системного компоновщика Puppy Linux с рядом дополнительных или модифицированных пакетов. неофициальные производные дистрибутивы («щенки») - являются ремастерами (или ремастерами ремастеров), созданными и поддерживаемыми энтузиастами Puppy. Обычно предназначаются для определенных конкретных целей.   Официальный сайт - http://puppylinux.com/   Особенности дистрибутивов Puppy Linux: минимум системных служб; ядро версии 4.4. Можно обновить до 4.9; свой менеджер пакетов - Puppy Package Manage; поддерживает архитектуру i386, x86_64.   Плюсы дистрибутивов Puppy Linux: ядро и софт, оптимизированные под домашнего пользователя; содержит все инструменты повседневного использования; легкая установка – драйвера на большинство современного и старого оборудования работают автоматически; малый размер системы – 300 MB или меньше; возможна работа в режиме полной установки, а также полноценная работа c CD-ROM (LiveCD) или USB-Flash; возможность установки нескольких FRUGAL дистрибутивов на раздел с установленным Windows; удобная переносная система с вашими настройками на USB-флешке, карте памяти или HDD; удобный оконный «бабушка-френдли» интерфейс системы; большое количество производных дистрибутивов под нужды каждого пользователя.   Минусы дистрибутивов Puppy Linux: Из-за необходимости поддерживать совместимость со старым железом, графический интерфейс, некоторыми пользователями воспринимается сильно устаревшим.   Рекомендуемые системные требования: 1 или больше GHz - процессор; 2 GB - оперативная память.   Manjaro Linux Manjaro это дистрибутив Linux, основывающийся на Arch Linux. Впервые представленный в 2011 году, дистрибутив Manjaro до 2013 года находился в режиме беты. Основываясь на Arch, проект Manjaro со времен своего основания своей целью ставил создание дистрибутива, сочетающего в себе как дружественность по отношению к неопытным пользователям, так и возможности Arch Linux. Официальный сайт - https://manjaro.org/ Особенности дистрибутива Manjaro: Использует менеджер пакетов Pacman; Поддерживает платформу x86-64; Поддерживает версию ядра 4.20.3; Отказ от использования персональных архив пакетов (Personal Package Arhive - PPA).   Плюсы дистрибутива Manjaro: Удобный менеджер драйверов с возможностью автоматической установки; Поддержка обширного списка оборудования; Использование репозиториев Arch, полная совместимость с Arch User Repository; rolling release в обновлениях с предварительным тестированием пакетов участниками проекта Manjaro; удобная возможность установки множество версий ядра и удобного переключения между ними; доброжелательное сообщество.   Минусы дистрибутива Manjaro: Отказ от поддержки архитектуры i686; Пользователи отмечают перенасыщенность брендингом включая обои, закладки в браузерах и тп; Относительно малочисленной сообщество со всем вытекающим для Linux-пользователя.   Вывод. Выбирая для себя операционную систему, стоит помнить, что операционная система — это инструмент, который, с одной стороны, должен быть для вас удобным, а с другой – обладать нужным для вас функционалом. Какая система лучше для пользователя: Windows или Linux, или MacOs, или FreeBSD– это тема многих «священных форумных войн», так и не давших однозначного ответа на этот вопрос. Такие же баталии, хотя и с меньшим градусом агрессии, проходят на тему «лучший дистрибутив linux». Мы не сможем дать Вам однозначного ответа на вопрос – какой дистрибутив является лучшим дистрибутивом Linux для разработчика. Если Вы только раздумываете над возможностью перейти на работу c OC Linux, Вам будет полезно рассмотреть наш рейтинг в качестве отправной точки. Если же Вы уже являетесь опытным пользователем Linux – мы надеемся, что наш рейтинг дистрибутивов Linux поможет Вам в выборе нового инструмента, или утвердит в желании остаться на проверенном Вами. Не так важно определиться раз и на всегда в операционной системе. Не бывает однозначно абсолютно удобных инструментов (многие разработчики используют одновременно 2 и более операционных систем.). Главное, чтобы Вы продолжали профессионально расти и развиваться, используя подходящие и удобные для Вас инструменты. Со своей стороны, портал ITVDN готов предоставлять для этого развития актуальную и полезную информацию.
Асинхронне програмування на JavaScript

Автор: Дмитро Охріменко

План: 1. Різниця між синхронним та асинхронним кодом 2. Багатозадачність процеси й потоки, у чому різниця 3. Особливості багатозадачності в JavaScript 4. Асинхронні операції на практиці HTTP-запит як найпоширеніший кейс 5. Підходи до написання асинхронного коду: Promise    Async/Await Observable 6. Практичні поради Різниця між синхронним та асинхронним кодом Для початку давайте визначимо ці два терміни: Синхронний код - це код, який виконується послідовно, функція за функцією. Асинхронний код - код, який може виконуватися паралельно: наступна функція запускається, не чекаючи завершення попередньої. Щоб провести аналогію з реального життя, уявімо кухаря. Якщо кухар працює синхронно, то поки він не завершить приготування однієї страви, не переходить до наступної. Але це неефективно й призводить до втрати часу. Якщо ж кухар діє асинхронно, то поки м’ясо запікається в духовці, а на плиті закипає вода, він нарізає овочі. Тобто він один, але не стоїть без діла - виконує інші задачі, поки щось готується саме. Уявімо, що кухар - це процесор. А запікання м’яса в духовці - це завантаження файлу з мережі. Кухар може просто стояти й дивитись, як м’ясо готується. А може нарізати овочі, перевіряти, чи не з’явились нові замовлення, або скролити стрічку в соцмережі. Так само і з програмами: поки мережева карта завантажує файл, процесор не мусить чекати - він може малювати інтерфейс, оновлювати прогрес-бар чи виконувати обчислення у фоні. Але для цього потрібно правильно написати код - так, щоб він міг працювати асинхронно. Код який виконується синхронно ```js console.log("Початок"); console.log("Дія"); сonsole.log("Кінець"); ``` Результат: Початок Дія Кінець   Код який виконується асинхронно. і ``js console.log("Початок"); setTimeout(() => { // за допомогою setTimeout ми відкладаємо запуск коду на певний час   console.log("Дія через 2 секунди"); }, 2000); сonsole.log("Кінець"); ``` Результат: Початок Кінець Дія через 2 секунди Це не та багатозадачність, як у деяких інших мовах програмування. Тут не використовуються додаткові потоки, а все працює завдяки механізму подій. Але про це детальніше дал Багатозадачність: процеси й потоки, у чому різниця Багатозадачність в операційній системі - це можливість запускати та керувати кількома задачами одночасно. Наприклад, працювати в браузері, слухати музику, завантажувати файл і паралельно редагувати код у Visual Studio. На практиці процесор дуже швидко перемикається між усіма цими задачами, створюючи ілюзію одночасного виконання. Якщо процесор багатоядерний - деякі задачі справді можуть виконуватись паралельно. Багатозадачність тісно пов'язана з двома важливими поняттями - процесами та потоками. Процес (process) - це окремий екземпляр програми у пам'яті, який має власні ресурси: виділену область оперативної пам'яті, дескриптори файлів, змінні оточення тощо.  Потік (thread) - це одиниця виконання всередині процесу. Потоки одного процесу працюють незалежно, але мають спільний доступ до пам'яті та ресурсів процесу. Процеси дозволяють запускати різні програми одночасно - наприклад, Google Chrome, Visual Studio Code і т.д.  Потоки дають змогу виконувати кілька задач усередині однієї програми. Наприклад, у Visual Studio Code один потік відповідає за оновлення інтерфейсу, інший перевіряє помилки в коді, ще один формує підказки під час написання. Це, звісно, спрощений приклад - у реальності VS Code використовує ще й окремі процеси для розширень і мовних серверів. Операційна система керує як процесами, так і потоками. Вона розподіляє процесорний час між ними, ставить у чергу, може призупиняти виконання або відновлювати його за потреби. Давайте трохи адаптуємо наш приклад з кухарем із попереднього посту. Уявімо, що процес - це ресторан, а потік - це кухар. Ресторан має все необхідне для приготування їжі: кухонне приладдя, продукти, рецепти (це можна розглядати як пам’ять і доступ до інших ресурсів). Кухар читає рецепт і, використовуючи ресурси ресторану, готує страву - так само, як потік виконує інструкції нашої програми, використовуючи ресурси процесу. Якщо ресторан хоче готувати кілька страв одночасно, йому потрібно більше кухарів, які працюють паралельно на одній кухні. Аналогічно, якщо програма повинна виконувати кілька задач одночасно - завантажувати файли, обробляти введення, оновлювати інтерфейс - вона може використовувати кілька потоків. Коли ми створюємо програму і хочемо зробити її зручною для користувача, а також ефективною з точки зору використання ресурсів, які виділяє операційна система на процес, ми іноді починаємо використовувати потоки та прийоми багатопотокового програмування. Це велика окрема тема, і ми її зараз чіпати не будемо. Одна з причин - у JavaScript немає прямого доступу до потоків. Уточнення. Якщо ви хочете використовувати JavaScript і все ж таки працювати з потоками - у вас є Web Workers:  https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers  А якщо JavaScript виконується не в браузері (наприклад, у Node.js), тоді можна використовувати модуль `worker_threads`. Але варто розуміти, що це не частина стандарту мови, а можливість середовища виконання. Додаткові корисні ресурси по цій темі: https://www.youtube.com/@CoreDumpped - канал з короткими відео про те як працює комп'ютер. Modern Operating System by Andrew Tanenbaum - принцип побудови та роботи операційних систем (може бути викликом для новачка, але нормально як для технічної книжки) Особливості багатозадачності в JavaScript JavaScript працює в одному потоці - це означає, що в будь-який момент часу виконується лише один фрагмент коду. Увесь код, який ми пишемо, виконується у call stack: це структура, в яку потрапляють усі функції, що викликаються. Якщо одна з функцій виконується довго (наприклад, важке обчислення), усі інші задачі - включно з обробкою кліків, рендерингом чи відповідями від сервера - будуть чекати, поки call stack не звільниться. Щоб не блокувати цей єдиний потік, браузер надає асинхронні API (setTimeout, fetch, Web API). Коли ми викликаємо, скажімо, fetch(), у стек додається лише короткий виклик цієї функції. Власне мережевий запит виконується в окремому потоці, який створює браузер. Тобто, один потік виконує задачі які є у call stack, а інший потік чекає поки відповідь поверне сервер. Але асинхронна операція колись завершиться і треба механізм який віддасть нашому головному потоку результат роботи іншого потоку. Коли це стається колбек або проміс‑резолвер не додається одразу у call stack. Спершу він потрапляє до черги подій (task queue). За роботою черги стежить event loop. Його правило просте - поки стек порожній дістати першу задачу із черги і покласти у стек. Так ми досягаємо псевдобагатозадачності: основний потік виконує короткі шматки коду послідовно, а довгі операції «живуть» поза стеком. Коли довгі операції завершуються вони формують чергу задач, які треба виконати а event loop ці задачі закидає до стеку, коли call stack стає порожнім. Це максимально спрощене пояснення, і без візуалізації може здатися складним. Якщо хочете краще зрозуміти, дуже раджу подивитись відео Jake Archibald — "In The Loop" на YouTube (англійською).  https://www.youtube.com/watch?v=8aGhZQkoFbQ Або приходьте на мій курс JavaScript Поглиблений, де ми розбираємо це на практиці.  Також корисна стаття на MDN, де ці процеси описані докладніше. Асинхронні операції на практиці: HTTP-запит як найпоширеніший кейс Один з прикладів асинхронної операції - це запит на сервер через HTTP-протокол. Якщо організовувати запит через JavaScript у браузері без використання React, Angular або Vue.js, то це можна зробити за допомогою: fetch XMLHttpRequest Спеціалізована бібліотека, наприклад, Axios Ось так буде виглядати простий код написаний на fetch ```js fetch('https://jsonplaceholder.typicode.com/users')   .then(res => res.json())   .then(data => console.log(data)); ``` А так на axios (axios одразу повертає розпарсений JSON як response.data, на відміну від fetch, де потрібно викликати .json() вручну) ```js axios.get('https://jsonplaceholder.typicode.com/users')   .then(response => console.log(response.data)); ``` Якщо розглянути саме fetch то ось що відбулося під капотом: fetch створює HTTP запит вказавши HTTP метод, заголовки, тіло тощо Цей запит передається у вбудовану систему Web API - окрему від JavaScript середу, яка працює в іншому потоці. JavaScript не чекає відповіді - основний потік продовжує виконувати інший код fetch повертає Promise - об'єкт, що представляє асинхронну операцію, результат якої з’явиться пізніше Коли відповідь від сервера приходить, Web API кладе callback в чергу. Event Loop перевіряє, чи call stack порожній, і виконує цю мікрозадачу. Така поведінка дозволяє браузеру одночасно виконувати інші задачі, не чекаючи завершення запиту. Про використання асинхронного коду в JavaScript є [безкоштовний урок на YouTube](https://www.youtube.com/watch?v=cvR1EQ1R0EQ) Також більше про синтаксис Promise можна дізнатися в уроці [Асинхронний код. Promise](https://itvdn.com/ua/video/javascript-essential-ua/js-promise-ua) на ITVDN, а детальніше про варіанти організації такого коду буде написано далі. Підходи до написання асинхронного коду Складність роботи з асинхронним кодом полягає в тому, що обробка результату операції відбувається не відразу, а через певний час після її запуску. Ми ініціюємо асинхронну операцію й можемо виконувати інші завдання, але все одно маємо якось дізнатися про її завершення та обробити результат. Проблема в тому, що в цей момент програма вже виконує інші дії. Тому для обробки асинхронних операцій використовується push-модель взаємодії: отримувача даних (наш код) викликає провайдер даних - окремий механізм, який керує асинхронною операцією. По суті, розробнику потрібно відреагувати на подію завершення асинхронної операції. Для цього існує кілька підходів: callback-функція Promise async/await (синтаксичний цукор над Promise) Observables Використання функцій зворотнього виклику (callback) Почнемо з callback-функцій. Це найпростіший підхід, але він може призвести до заплутаного коду, особливо коли одна асинхронна операція запускає іншу, і так утворюється ланцюг. Уявімо, що маємо функцію downloadImage(url, callback), яка завантажує зображення асинхронно, не блокуючи основний потік. Перший параметр - це адреса зображення, яке потрібно завантажити, а другий - функція, яку буде викликано після завершення завантаження. При цьому саме зображення буде передане як параметр у callback. Приклад використання: ```js downloadImage(url1, image => document.body.append(image)) ``` На перший погляд усе просто. Але якщо потрібно завантажити кілька зображень послідовно, код стає менш зрозумілим: ```js downloadImage(url1, image => {             document.body.append(image);             downloadImage(url2, image => {                         document.body.append(image);                         downloadImage(url3, image => {                                     document.body.append(image);                         })             }) }); ``` Така вкладена структура швидко ускладнюється, особливо якщо замість одного рядка з DOM-змінами з’являється додаткова логіка. Подібний стиль називають "Pyramid of Doom", і його краще уникати. Один зі способів спростити обробку асинхронних викликів - це використання Promise. Використання Promise Promise - це об’єкт, який представляє асинхронну операцію. У перекладі з англійської promise означає «обіцянка». Можна уявити, що це обіцянка від браузера надати в майбутньому або результат операції, або помилку, пов’язану з її виконанням. Приклад використання: перепишемо попередню функцію downloadImage, щоб вона повертала Promise. ```js let promise = downloadImage(url1); promise.then(image => document.body.append(image)); ``` Тут ми все одно використовуємо callback-функцію, але передаємо її вже в метод .then() об’єкта promise. Це важливий момент: тепер асинхронна операція має об’єктне представлення, яке можна передавати як параметр у різні частини коду; можна будувати ланцюжки промісів, позбуваючись вкладеності, яка виникала з callback. Приклад: ```js downloadImage(url1)                          // отримуємо проміс .then(image => {                             // вказуємо що робити коли promise перейде в стан resolved             document.body.append(image);             return downloadImage(url2);                // виконуємо метод, який повертає promise }) .then(image => {                             // результат роботи попереднього промісу передається як значення             document.body.append(image);             return downloadImage(url3); }) .then(image => {             document.body.append(image); }); ``` Тепер код виглядає лінійним і набагато зручнішим для супроводу. У прикладах вище ми не розглядали, як саме створюється Promise, адже важливо зрозуміти мотивацію використання цих об’єктів. Тим більше, що більшість API браузера вже повертають готові проміси. Наприклад: ```js fetch('<https://jsonplaceholder.typicode.com/users>')   .then(res => res.json()); ``` Якщо хочете детальніше розібратися зі створенням Promise вручну - перегляньте документацію на MDN або мій відео урок на ITVDN. Async/await Супроводжувати синхронний код завжди простіше, ніж асинхронний. У 2012 році в мові C# з’явився синтаксичний цукор, який значно спростив роботу з асинхронними операціями: замість вкладених callback можна було використовувати послідовний синтаксис з новими ключовими словами async та await. Згодом цю концепцію перейняли й інші мови програмування, зокрема Python та JavaScript. В JavaScript підтримку async/await додали у 2017 році. Призначення ключових слів async - додається до функції та вказує, що вона завжди повертає Promise. await - використовується перед об’єктом-промісом, щоб "дочекатися" результату перед виконанням наступних рядків коду. Перепишемо попередній приклад із завантаженням зображень, використовуючи async/await: ```js let image = null;   image = await downloadImage(url1); document.body.append(image);   image = await downloadImage(url2); document.body.append(image);   image = await downloadImage(url3); document.body.append(image); ``` Тепер код виглядає як звичайний синхронний: немає вкладених callback, усе читається рядок за рядком. Можна подумати, що await "зупиняє" виконання, очікуючи на результат промісу. Насправді ж код не блокує основний потік - під капотом він перетворюється на машину станів, де кожен стан описує дію до або після await. Ще одна перевага async/await - знайомий синтаксис для обробки помилок: ```js try {             let image = null;               image = await downloadImage(url1);             document.body.append(image);               image = await downloadImage(url2);             document.body.append(image);               image = await downloadImage(url3);             document.body.append(image); } catch (ex) { // обробка помилки } ``` У результаті асинхронний код виглядає так само зрозуміло, як і синхронний, що значно спрощує його супровід. Observable Observable - це ще один підхід до організації асинхронного коду. Назва походить від однойменного патерна проєктування (Observer pattern), який описує створення об’єктів, за якими можна «спостерігати», отримуючи від них сповіщення. Тобто це реалізація подієвої моделі за допомогою ООП. У сучасному JavaScript ця ідея пішла далі й стала основою реактивного програмування та бібліотеки RxJS. Якщо Promise представляє одне майбутнє значення (успішне або помилкове), то Observable - це потік значень, які можуть з’являтися з часом. Можна уявити: Promise - це одна посилка, яку ви отримаєте в майбутньому; Observable - це підписка на журнал, нові випуски якого надходитимуть регулярно. Щоб створити Observable, використовують конструктор або готові оператори RxJS. Наприклад, функція downloadImages(urls) може завантажувати кілька картинок і відправляти їх «у потік» по мірі завантаження: ```js import { Observable } from 'rxjs';   function downloadImages(urls) {   return new Observable(subscriber => {     urls.forEach(url => {       downloadImage(url, image => {         subscriber.next(image); // надсилаємо картинку у потік       });     });     subscriber.complete(); // повідомляємо, що потік завершено   }); } ``` Щоб використати Observable, на нього треба підписатися за допомогою subscribe: ```js downloadImages([url1, url2, url3])   .subscribe({     next: image => document.body.append(image), // що робити з новим значенням     error: err => console.error(err),           // обробка помилок   }); ``` Переваги Observable працюють із потоком даних, а не з одним результатом; підтримують підключення операторів трансформації (фільтрація, мапінг, комбінування потоків); можна легко скасувати виконання (відписатися від потоку). Нижче приклад обробки даних через оператори. В RxJS оператори підключаються через метод pipe: ```js import { filter, map } from 'rxjs/operators'; downloadImages([url1, url2, url3])   .pipe(     filter(image => image.width > 100), // пропускаємо лише великі картинки     map(image => {       image.classList.add('highlight');       return image;     })   )   .subscribe({     next: image => document.body.append(image),     error: err => console.error(err),     complete: () => console.log('Готово')   }); ``` Таким чином, як і у випадку з Promise, можна будувати ланцюжки обробки. Але Observable значно гнучкіші: вони дозволяють працювати не лише з одним значенням, а з динамічною послідовністю даних у часі. Для глибшого занурення рекомендую офіційний гайд Observable на RxJS.dev. та відео уроки Observables. Частина 1, та Observables. Частина 2[1]  Практичні поради по работі за асинхроним кодом Не змішуйте підходи без потреби Якщо почали писати з async/await, не вставляйте всередину .then() без особливої причини. Це ускладнює читання. Обробляйте помилки Використовуйте try/catch для async/await або .catch() для Promise. У випадку Observable завжди додавайте обробку error у subscribe(). Скасовуйте непотрібні операції Для Observable використовуйте unsubscribe(), коли потік більше не потрібен. Для fetch можна застосувати AbortController, щоб зменшити навантаження й уникнути витоків пам’яті. Уникайте "Pyramid of Doom" Замість вкладених callback застосовуйте Promise, async/await або Observable. Використовуйте паралельне виконання Якщо операції незалежні, запускайте їх одночасно через Promise.all(). Ізолюйте логіку обробки Розділяйте завантаження даних та маніпуляції з DOM. Це спростить тестування й повторне використання коду. Логуйте стан і помилки Під час розробки виводьте у консоль ключові події асинхронних операцій, щоб відстежувати їх послідовність. Пам’ятайте про event loop Розуміння різниці між мікрозадачами й макрозадачами допоможе прогнозувати порядок виконання коду. Перевіряйте сумісність середовища Деякі API можуть бути відсутні у певних середовищах (наприклад, fetch у Node.js доступний лише починаючи з версії 18).
Чи замінить штучний інтелект розробників?

Автор: Влад Сверчков

Що таке ШІ? Визначення та типи Використання ШІ в ІТ Нейронні мережі Людський мозок vs Штучний інтелект Український ринок ІТ після буму AI Чи варто боятися розробникам: що думає про це сам штучний інтелект? Майбутнє співробітництва ШІ та людини Висновки Сучасний технологічний ландшафт зазнає змін з неймовірною швидкістю, і штучний інтелект (ШІ, AI) сьогодні є одним з його Еверестів. Він вже допомагає нам в автоматизації різних завдань і процесів: спрощує написання текстів та програмного коду, генерує зображення та відеоряди, консультує нас із різних запитань, допомагає вчити іноземні мови. Як відомо, більшість гір виникають на місці зіткнень тектонічних плит під супровід землетрусів – схожий процес маємо і з активним розвитком ШІ. Людство розділилося на два великі табори: перші захоплено спостерігають за процесом утворення технологічних Гімалаїв, а другі пророкують ряд катастроф – однією з найстрашніших вказують можливе безробіття, особливо серед розробників. ITVDN – це освітня онлайн платформа для вивчення програмування та ІТ, тому ми не могли пройти осторонь теми перспективності професії розробника. Пропонуємо поринути в неї і разом розібратися, чия літосферна плита буде зверху та хто візьме гору в цій боротьбі – програмісти чи штучний інтелект? Що таке ШІ? Визначення та типи Штучний інтелект означає здатність машин імітувати людські когнітивні функції, такі як навчання, вирішення проблем і прийняття рішень. Він охоплює широкий спектр технологій і застосунків, що дозволяють машинам виконувати завдання, які зазвичай вимагають людського інтелекту, як-от візуальне сприйняття, розпізнавання мови, прийняття рішень і мовний переклад. Відповідно до відеоролику “The 7 Types of AI” з офіційного YouTube-каналу IBM Technology (IBM – один із найбільших в світі провайдерів ІТ-інфраструктури, ПЗ та консультаційних послуг), AI має щонайменше 7 типів, але реалізацію мають лише три з них.   Назва Короткий опис Artificial Narrow Intelligence або вузький AI (слабкий AI) Призначений для виконання конкретного завдання або вузького кола завдань. Серед прикладів – сучасні сервіси Alexa, Siri, Cortana тощо. Artificial General Intelligence або загальний AI (сильний AI) Здатен розуміти, навчатися і застосовувати знання в широкому спектрі завдань – подібно до людини. Цей рівень ШІ все ще залишається здебільшого теоретичним і наразі існує хіба що в науковій фантастиці. Artificial Super Intelligence або штучний суперінтелект Гіпотетичний рівень ШІ, перевершує людський інтелект у всіх відношеннях і здатний перевершити найкращі людські розуми в кожній галузі. Reactive Machines або реактивні машини Штучний інтелект найпростішого типу, не має здатності формувати пам'ять або використовувати минулий досвід для прийняття обґрунтованих рішень. Працює виключно на основі поточних даних і не враховує контекст. Як приклад – Deep Blue від IBM, який може грати в шахи на рівні гросмейстера і прораховувати усі можливі сценарії. Limited memory або обмежена пам’ять На відміну від реактивних машин, ШІ з обмеженою пам'яттю може звертатися до минулого досвіду для прийняття рішень. Він може зберігати і згадувати попередні дані, що дозволяє йому адаптуватися до ситуації і відповідним чином реагувати. Приклади: самокеровані автомобілі, системи рекомендацій, спам-фільтри, чат-боти, пристрої розумного будинку тощо. Theory of Mind або теорія розуму Головна мета – зрозуміти і передбачити поведінку, емоції, відчуття людини, аби потім надати персоналізовані послуги. Цей тип ШІ враховує, що люди мають різні переконання, бажання та перспективи. Наразі Theory of Mind перебуває на стадії досліджень і розробок Self-aware AI або самосвідомий ШІ “Найстрашніший” вид штучного інтелекту, майбутнє ШІ, яке йому так пророкують. Володіє свідомістю і почуттям власної гідності. Він розуміє власне існування, емоції та процеси мислення, має власні потреби. Однак досягнення самосвідомості штучних систем все ще лежить в суто теоретичній площині. Reactive Machines та Limited memory відносяться до Narrow AI, Theory of Mind – до General AI, а Self-aware – до суперінтелекту. Використання ШІ в ІТ В 2024 році штучний інтелект продовжує стрімко трансформувати різні сфери ІТ – ось декілька прикладів: 1. Кібербезпека “Розумні” системи аналізують величезні потоки даних для проактивного виявлення загроз та їх мінімізації, вивчають моделі поведінки користувачів і позначають підозрілі дії, аналізують фінансові транзакції, допомагають у створенні звітів тощо. 2. DevOps і хмарні обчислення ШІ автоматизує такі завдання, як виділення ресурсів, управління конфігурацією і масштабуванням, аналізує дані щодо продуктивності системи і пропонує оптимізацію для використання ресурсів і скорочення витрат. Також системи з інтелектом автоматично виявляють і усувають проблеми в хмарній інфраструктурі, підвищуючи відмовостійкість і час безвідмовної роботи системи. 3. Розроблення програмного забезпечення Технологічні інновації в галузі AI дозволяють генерувати, рефакторити та пояснювати код для розробників, виявляти потенційні помилки, автоматизувати процеси тестування, прискорюючи розроблення, автоматично доповнювати код в реальному часі тощо. 4. Тестування і забезпечення якості Інструменти тестування на основі ШІ здатні проводити аналіз коду, виявляти вразливості, вивчати результати попередніх тестів, автоматично генерувати тест-кейси тощо. 5. Управління даними та аналітика Автоматизація завдань з опрацювання даних, виявлення та виправлення помилок, підготовка даних до аналізу, інтелектуальний аналіз даних, генерування звітів та презентацій, виявлення прихованих закономірностей, прогнозування майбутніх тенденцій та результатів, асистенція під час стратегічного планування та розподілу ресурсів – і це тільки загальні точки, в яких штучний інтелект впливає на домени Big Data, Data Science тощо. 6. Управління мережею Машинний інтелект виявляє незвичайні шаблони мережевого трафіку, щоб запобігти кібератакам та/або перебоям у роботі мережі. Також він аналізує мережеві дані та автоматично налаштовує конфігурації для оптимальної продуктивності та використання ресурсів, прогнозує тенденції мережевого трафіку і динамічно розподіляє ресурси, щоб забезпечити безперебійну роботу і уникнути появи вузьких місць (так званих “bottlenecks”). 7. Управління ІТ-сервісами (ITSM) Людино-машинна взаємодія із залученням ботів на основі ШІ сприяє автоматизації рутинних завдань як-от скидання паролів і вирішення інцидентів, зменшуючи навантаження на службу підтримки та підвищуючи її ефективність. Також ці системи аналізують дані ІТ-інфраструктури, щоб прогнозувати потенційні збої, вживати превентивні заходи, мінімізувати час простою, діагностувати першопричини проблем і пропонувати рішення, оптимізуючи процеси усунення несправностей. І це тільки частина тих сфер, де штучний інтелект вже використовується і активно розвивається. До них можна додати: ІТ-менеджмент; інтернет речей (IoT) і робототехніка загалом (як цивільна, так і військова); розроблення на основі NLP: віртуальні асистенти, чат-боти, інтерфейси, що активуються голосом; електронна комерція: рекомендаційні, аналітичні системи; віртуальна реальність, комп’ютерні ігри тощо. Виходить, під загрозою “вимирання” не тільки розроблення, а й інші ІТ-галузі. Нейронні мережі Нейронна мережа – важливий фундамент в розумінні штучного інтелекту. Хоча це популярний та ефективний метод побудови штучних систем, існують й інші методи, наприклад системи на основі правил, дерева рішень, генетичні алгоритми, машини опорних векторів тощо. Ці методи часто використовують у поєднанні з нейромережами для створення більш складних інтелектуальних систем. То яким чином нейронки пов’язані з розумними машинами? Нейронні мережі складають кістяк алгоритмів глибокого навчання (Deep Learning, DL), глибоке навчання є підмножиною машинного навчання (Machine Learning, ML), а машинне становить підмножину AI. Окрім ML штучні системи можуть включати в себе оброблення природної мови (NLP), комп’ютерний зір, рух, озвучування тексту тощо. Картинка вище візуалізує ці моменти для кращого розуміння. Якщо приклади AI навести досить просто (ChatGPT, Midjourney, GitHub Copilot і т. д.), то де в житті ми напряму зіштовхувалися з іншими трьома складовими? Ось деякі з них: нейромережа може гарно розпізнавати голос, об’єкти на зображеннях та відео тощо; Google Translate – яскравий приклад DL; коли ви зайшли в інтернет-магазин, подивилися щось, а згодом отримали пропозиції з товарами, які “можуть вам сподобатися” – постаралося машинне навчання. За своєю будовою штучні нейронні мережі дуже нагадують ті, що знаходяться в нашому мозку, але насправді навіть один людський нейрон більше нагадує велетенську нейромережу. З чого складається типова нейронна мережа: На картинці зображено глибоку нейромережу – це мережа, яка має більше трьох прихованих шарів (hidden layers) включно з вхідним (input) та вихідним (output). Якщо шари всього 3, маємо справу з найпростішою нейромережею. До речі, картинку вище можна розглядати як алгоритм глибокого навчання. Зі схематичним зображенням познайомилися, а тепер нас цікавить робота нейронної мережі. Кожен шар нейромережі складається з вузлів – штучних нейронів. Кожен вузол з'єднаний з нейронами наступного шару, причому кожен має свою вагу та поріг. На вхід вузла надходить певне значення, яке зазнає впливу ваги, і якщо потім це значення перевищує поріг, даний вузол “активується” за допомогою активаційної функції, і результуючі дані надсилаються до наступного шару мережі. Якщо вихідне значення вузла нижче за поріг, до наступного вузла воно не потрапляє. Навчальні дані допомагають навчати нейронну мережу та покращувати її точність із часом. Коли алгоритми навчання якісно налаштовані, вони стають міцним фундаментом ШІ, оскільки можуть дуже швидко класифікувати та кластеризувати дані – це дозволяє суттєво прискорити різні операції. Класифікація нейронних мереж з прикладами реалізації тут наводитися не буде, але відмітимо пошуковий алгоритм Google – це, напевно, найвідоміша реалізація нейронки; саме завдяки їй пошуковик настільки швидкий та ефективний. Людський мозок vs Штучний інтелект Переваги мозку Головний командний центр людини має низку сильних сторін, яким поки поступаються розумні системи: Креативність та адаптивність. Мозок чудово генерує нові ідеї, вирішує проблеми нестандартними способами та адаптується до непередбачуваних ситуацій, в той час як ШІ та творчість – пара, яка потребує відпрацювання багатьох “па”. Потужний інтелектуальний спектр. Під владою наших півкуль знаходяться складні міркування, абстрагування, емоційний інтелект тощо. Когнітивна гнучкість та інтуїція. Люди можуть переносити досвід з інших сфер життя для адаптації до нових умов та вирішення нових проблем, з якими вони не стикалися, приймати судження та рішення на основі неповної інформації та інтуїції, з чим нейромережі мають проблеми. Стійкість до “шуму” вхідних даних. Людський мозок легко проходить повз викривлення або невеликі збурення у вхідних даних, які в розумних системах можуть призвести до значних помилок або неправильних класифікацій. Емоції та етичність. Етика в ШІ недостатньо розвинена: комп’ютери не настільки гарно працюють з людськими емоціями, емпатією та моральними нормами, в той час як для людини ці речі є фундаментально важливими та визначальними у прийнятті рішень. Eco-friendly 💚 Людський мозок споживає до 20 Вт, що робить нас значно енергоефективнішими за штучні технології, які споживають великі об’єми електроенергії (особливо на етапі навчання) і не можуть існувати без живлення. Переваги штучного інтелекту Наші цифрові візаві також мають чим похизуватися: Швидкість, об’ємність та ефективність. Машинне навчання дозволяє обробляти величезні обсяги даних, швидко аналізувати, робити висновки і виконувати конкретні завдання в рази швидше людини. Розпізнавання та аналіз шаблонів. Штучні нейронні мережі чудово розпізнають закономірності та складні взаємозв'язки в даних, допомагаючи в таких завданнях, як розпізнавання зображень, переклад текстів і т. д. Масштабованість і автоматизація. Системи штучного інтелекту можна масштабувати й автоматизувати, що дозволяє їм оперативно справлятися з великими робочими навантаженнями і репетативними задачами. Налаштування та оптимізація. Алгоритми ШІ можна навчати і вдосконалювати під конкретні завдання, досягаючи високого рівня точності і результативності. Доступність 24/7. Системи AI можуть працювати цілодобово, забезпечуючи безперебійне обслуговування, наприклад постійний моніторинг стану інфраструктури, відеоспостереження, регулювання температури в приміщенні тощо. Відсутність деяких людських вад. Штучний інтелект не може забути про задачу, розлінитися, проспати, захворіти, мати похмілля, злякатися, бути не в настрої або просто не любити вас. Звісно, ніхто не застрахований від зникнення живлення, хакерських атак, проблем з програмно-апаратною начинкою абощо, але в плані працездатності, доступності і надійності комп’ютерні системи значно краще себе проявляють, ніж людина. Зниження ризиків. ШІ можна застосовувати в умовах підвищеного ризику та небезпеки. Наприклад, роботи зі штучним інтелектом можуть виконувати небезпечні завдання на виробництві, брати участь у пошуково-рятувальних місіях і під час ліквідації наслідків стихійних лих, мінімізуючи загрозу для людей. Український ринок ІТ після буму AI Яким розробники бачать майбутнє ШІ? Ще в 2017 році дослідники з Oak Ridge National Laboratory – американської лабораторії, яка займається науковою діяльністю і фінансується Міністерством енергетики США – опублікували статтю, в якій припускають, що до 2040 року більшість програмного коду будуть писати саме машини, і це радикально вплине на створення ПЗ як таке. А зовсім нещодавно – 12-14 лютого 2024 року – на Всесвітньому урядовому саміті в Дубаї обговорювався штучний інтелект, і CEO компанії NVIDIA Дженсен Хуанг сказав, що якщо останні 10-15 років радили вчити програмування та комп’ютерні науки, то зараз ці поради неактуальні, адже ШІ перетворює кожну людину в програміста і дає можливість прокачати свої навички та суттєво підвищити продуктивність в інших затребуваних сферах, наприклад у цифровій біології, навчанні, виробництві, фермерстві тощо. Також він додав, що якби міг почати все з початку, то фокусувався б на такому напрямку, як наука про життя (біонаука, цифрова біологія, біоінженерія), оскільки це надважлива комплексна галузь, розвиток якої в поєднанні з потужністю ШІ дозволить оптимізувати багато процесів, в тому числі пов’язані зі сталим розвитком. Сучасні технологічні інновації дозволяють активно використовувати AI рішення, хоч і без ідеального результату. Давайте подивимось, як змінився ландшафт українського ІТ-ринку після “буму” ChatGPT та появи інших “штучних” гравців. А зробимо ми це за допомогою аналітики від DOU – спільноти українських розробників. Точкою відліку візьмемо лютий 2023 року, коли “чат” став офіційно доступним в Україні і зникли блекаути. Цьогоріч у лютому опубліковано аналітику, відповідно до якої кількість вакансій на DOU станом на січень 2024 року складає 5057. В лютому 2023 року ця цифра становила 3489, себто приріст на рівні 45%. Пам’ятаємо, що на минулорічну статистику могли вплинути блекаути, але в тому ж лютому енергетична ситуація почала значно покращуватися. Порівняємо кількість технічних вакансій у лютому 2023 та в січні 2024 року:   Напрямок Лютий 2023 Січень 2024 Java 138 119 QA 177 236 .NET 112 149 Front End 196 214 Android 44 36 Python 115 178 Node.js 107 153 PHP 141 177 DevOps 160 166 AI/ML 11 40 Big Data 19 18 Data Engineer 22 63 Data Science 29 58 React Native 25 33 Ruby 19 23 iOS/macOS 40 43 Як бачимо, в переважній більшості напрямків кількість вакансій зросла після того, як штучний інтелект вийшов на глобальний ринок, а в інших спостерігаємо несуттєве зменшення. Яка ситуація на ринку початківців (0-3 роки досвіду)? В усіх трьох категоріях маємо помітне зростання. Що думає про це сам штучний інтелект? Давайте послухаємо аргументи ШІ щодо того, чи зможуть нейромережі замінити розробників і зайняти їхнє місце. ChatGPT Відповідь ChatGPT версії 3.5: “Розробники програмного забезпечення незамінні завдяки низці переваг: Творче вирішення проблем: розробники застосовують креативне мислення для вирішення складних проблем, пропонуючи унікальні та ефективні розв’язки. Навички критичного мислення: вони досягають успіху в розбитті складних проблем, їх аналізі та розробці ефективних рішень. Адаптивність і здатність до навчання: розробники йдуть в ногу з часом, швидко адаптуючись до нових технологій та вивчаючи нові мови програмування, що дозволяє їм залишатися конкурентоспроможними в постійно мінливому середовищі розробки ПЗ. Співпраця та комунікація: ефективна співпраця та комунікація дозволяють розробникам гармонійно співпрацювати з міжфункціональними командами, включаючи дизайнерів, Product менеджерів та тестувальників. Етичні міркування: розробники повинні враховувати етичні аспекти у своїй роботі, забезпечуючи відповідність своїх творінь суспільним цінностям і нормам. По суті, хоча ШІ може провести інтелектуальний аналіз даних та автоматизувати певні завдання, унікальне поєднання креативності, критичного мислення, адаптивності, співпраці та етичних міркувань розробників залишається незамінним для грамотного програмування та інших процесів розробки ПЗ”. Gemini (Bard) “Хоча я, Бард, велика мовна модель, володію вражаючими можливостями в розумінні та генеруванні тексту, повністю замінити розробників – це занадто, принаймні поки що. Ось чому: Творчість та вирішення проблем. Хоча я можу писати рядки коду як програмісти, справжні інновації виникають завдяки здатності людського розуму уявляти унікальні рішення, що виходять за рамки усталених шаблонів. Глибока експертиза в галузі. Хоча я маю доступ до величезного обсягу інформації та можу її обробляти, глибоке розуміння та контекст, якого розробники набувають завдяки багаторічному досвіду роботи в конкретних галузях, є незамінними. Людські судження та етика в ШІ. Розробники привносять в роботу безцінні людські судження та етичні міркування, гарантуючи, що їхні творіння відповідають принципам відповідального використання. Орієнтування в етичних дилемах залишається поза межами сучасного ШІ. Комунікація та співпраця. Розробка ПЗ процвітає завдяки командній роботі та ефективній комунікації. Хоча я можу обробляти інформацію та реагувати на неї, мені бракує навичок ефективної співпраці з різними командами, генерування ідей та орієнтації в складнощах людської взаємодії. Адаптивність та здатність до навчання. Технологічні інновації носять досить динамічний характер, а розробники вміють постійно вчитися та опановувати нові технології. Хоча я також це можу, я обмежений в своїх параметрів, і моя здатність до навчання поступається людям-розробникам. Майбутня співпраця, а не заміна. Я уявляю собі майбутнє, в якому машинний розум розширює можливості розробників, слугуючи потужним інструментом для вирішення повторюваних завдань: автоматизація коду, пропозиції щодо його покращення та розширення, інші можливості для вирішення проблем. Ця співпраця відкриє шлях до більших інновацій та ефективності у сфері розробки ПЗ”. Perplexity Відповідь великої мовної моделі – розмовного пошуковика від Perplexity AI: “Вплив штучного інтелекту на розробку ПЗ є безперечно трансформаційним, але він не може замінити унікальний людський підхід, який стимулює інновації та творчість. Штучний інтелект чудово справляється з автоматизацією повторюваних завдань, покращує якість коду та пропонує оптимізації. Однак йому бракує здатності мислити нестандартно, уявляти нові концепції чи розуміти нюанси складних систем. Обмеження розумних систем полягають у їхній нездатності до справжньої творчості, яка є відмінною рисою розробників-людей. Вони навчаються на наявних даних, і хоча можуть генерувати код на основі шаблонів, але не можуть впроваджувати інновації чи створювати щось абсолютно нове. В осяжному майбутньому програмісти будуть доповнені, а не замінені на ШІ. Він допоможе їм зосередитися на більш складних завданнях, підвищити ефективність і зменшити кількість помилок. У міру розвитку інтелектуальних машин розробникам потрібно буде адаптуватися і опановувати нові навички, щоб працювати разом з цими потужними інструментами. Майбутнє розробки ПЗ – це людино-машинна взаємодія, симбіоз людини та AI, де другий розширює людські можливості, а розробники-люди продовжують стимулювати інновації”. А довіряти цим відповідям, чи ні – вирішуйте самі, шановні читачі. Можливо, штучний інтелект вже зараз приховує від нас якісь плани і спеціально присипляє нашу увагу, аби в найбільш вдалий момент зробити з нас щось на кшталт сервісного персоналу або домашніх улюбленців? Майбутнє співробітництва ШІ та людини Сучасна людино-машинна взаємодія постає у вигляді ефективної кооперації, що спрощує рутинні задачі та оптимізує багато процесів, пов’язаних з ІТ, починаючи з інтерпретації, генерації та рефакторингу коду і закінчуючи повноцінними AI інструментами під кожну спеціальність. Важко спрогнозувати точний рівень загрозливості штучних систем айтішним професіям у майбутньому, але зараз це корисний інструмент, який програмісти мають вивчати, аби з легкістю обходити рутину і більше часу приділяти дійсно важливим процесам. Іншими словами, сучасні ШІ – це наші помічники, і в найближчому майбутньому вони не замінять нас, а органічно доповнять і переформатують наші ролі. Та хто знає, як буде в більш далекій перспективі. Цілком ймовірно, що позиції розробників рівня Intern-Junior будуть зазнавати найбільших видозмін, оскільки робота нейронної мережі досить непогано заточена під генерування коду для нескладних задач. Але не забуваймо, що результат їхньої роботи все ще далекий від ідеалу. Висновки То чи замінить штучний інтелект розробників? Вище ми проаналізували ситуацію на українському ринку ІТ, і зараз натяків на те, що програмісти залишатися без роботи, немає. Штучні системи поки що займають роль асистентів і спрощують рутинну та/або часовитратну роботу: написати шматок коду або частину документації, нагадати функціонал певного методу, дати пораду або пояснити код, провести його рефакторинг тощо. Найрозумніший крок в даних умовах – вивчати AI. Навіть якщо деякі професії почнуть зникати, то досвідчені фахівці, котрі вміють делегувати рутину нейронкам і розробляти комплексні рішення, точно не залишаться осторонь. Тому фокусуйтеся на складних та креативних рішеннях, які нейромережа не осилить, масштабуйте знання та навички, отримуйте унікальний досвід, завжди слідкуйте за новинами світу ШІ, а також будьте відкриті до нових технологій та вмінь. Бажаємо вам успіхів у розробці та вивченні AI інструментів! Ваші думки щодо майбутнього штучного інтелекту та його впливу на розробників пишіть у коментарях
Співбесіда з DevOps. 300+ питань для Junior, Middle, Senior

Автор: Влад Сверчков

Junior 1.1 Общие вопросы и Linux. 1.2 Networks, Clouds. 1.3 Automation, Information Security. 1.4 Виртуализация, CI/CD, Development. 1.5 Monitoring/Logging. 1.6 Практические задания. Middle 2.1 Linux. 2.2 Networks. 2.3 Container orchestration. 2.4 Виртуализация и контейнеризация. 2.5 CI/CD, Clouds and Automation. 2.6 Monitoring/Logging. 2.7 Information Security. 2.8 Development, Databases. 2.9 Практические задания. Senior 3.1 Linux. 3.2 Networking, Разное. 3.3 Container orchestration, Clouds and Automation. 3.4 CI/CD, Information Security. 3.5 Observability, Databases. 3.6 Практические задания.     Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 7 декабря 2021 года. Оригинальная версия на украинском языке доступна по ссылке. Можно спорить о популярности DevOps, а можно просто готовиться к собеседованию и получить желанные 9K :) Чтобы помочь вам сориентироваться в вопросах, которые задают на интервью, мы поговорили с теми, кто их проводит, и составили список возможных вопросов.   Junior   Общие 1. Что такое DevOps? 2. Вы набираете google.com в браузере. Расскажите как можно подробнее, что происходит в это время? 3. Как работает HTTPS? 4. Объясните концепцию Infrastructure as Code, зачем это нужно и какие проблемы решает?   Linux 5. Опишите общую архитектуру операционной системы. 6. Опишите основное предназначение операционной системы. 7. Зачем нужны файловые системы? Какие существуют? 8. В чем разница между виртуализацией и контейнеризацией? 9. В чем преимущества контейнеров? 10. Какова файловая структура в Linux (UNIX) системах, расположенных в /etc, /dev, /proc, /sys, /lib, /var (несколько директорий на выбор)? 11. Что такое Load Average? 12. В чем разница между soft и hard symlink? 13. Как работают file permissions, зачем директории права исполнения (+x)? 14. Что такое zombie process? 15. С помощью чего можно собрать информацию о текущем состоянии процессора, памяти, диска, сети? 16. Что такое swappiness? 17. Как посмотреть свободное место на диске? 18. Что такое inode? 19. Расскажите поэтапно процесс загрузки Linux с момента включения питания компьютера. 20. Что произойдет при выполнении команд: 1. cat file1 > file2 2. cat file1 >> file2 21. В чем разница между Ctrl+C и Ctrl+Z? 22. Как перенаправить одновременно stderr и stdin? 23. Как убить процесс? Какие есть типы сигналов? 24. Что делает команда grep? 25. Что такое скрипт bash? 26. Какие типы переменных используются в bash? 27. Что выведут команды: 1. echo ${hostname}; 2. echo $(hostname);   Networks 28. Что такое модель OSI, TCP/IP? 29. Для чего нужны network masks? 30. Структура IP-пакета. Из чего состоит? Что такое фрагментация и почему она происходит? 31. Что такое коллизия? Почему возникает? 32. Что такое прокси? 33. Что такое firewalls и зачем они нужны? 34. Что такое NAT и для чего он нужен? 35. Какие типы IP-адресов вы знаете? 36. По какому порту и протоколу работают Ping и Traceroute?   Clouds 37. В чем разница между IaaS, PaaS и SaaS? 38. Что такое VPC и из каких компонентов должно состоять? 39. Что такое cloud-init? init/systemd/upstart configs?   Automation 40. Что такое IaaC и зачем он нужен? 41. Что такое Terraform? 42. Какие инструменты автоматизации вы знаете?   Information Security 43. В чем разница между аутентификацией и авторизацией? 44. Сертификаты. Как работает HTTPS? Что такое certificate ciphers? 45. Как безопасно передать данные своему коллеге? 46. ​​Что такое MFA, TOTP?   Виртуализация 47. В чем разница между виртуализацией и контейнеризацией? В чем плюсы и минусы? 48. Как при запуске Docker-контейнера «повесить» его из 80-го порта в контейнере на 8081 на хост? 49. Как передать в виртуальную машину USB device? 50. Docker-контейнер потребляет многие SWAP. Что делать?   CI/CD 51. Что такое Continuous Integration и Continuous Deployment? В чем разница между Continuous Deployment и Continuous Delivery? 52. Опишите основные этапы CI/CD. 53. Опишите пример процесса CI (и/или CD), который начинается с момента, когда разработчик запушил изменения/PR в Git? 54. Расскажите о разновидностях тестов, которые мы можем использовать в CI пайплайне. 55. Какие инструменты CI вы использовали? Есть ли опыт работы с Jenkinsfile? 56. Какие виды тестов вы знаете и зачем они нужны?   Development 57. Git. Как решить merge conflict? Что такое rebase, cherry-pick? 58. В чем разница между git merge и git rebase? 59. Какие UI использовали? 60. Какая разница между GitLab/GitHub/Bitbucket? 61. Какая разница между Git pull/Git fetch? 62. Что такое Git-Flow? 63. Версионирование. Какая разница между SemVer и CalVer? 64. Тестирование. Какие существуют виды? Как писать тесты, TDD? 65. В чем разница между компилируемыми и интерпретационными языками программирования?   Monitoring/Logging 66. Какие метрики нужно собирать? Разница между infrastructure и application monitoring. 67. Какая разница между pull и push model в системах мониторинга? 68. Какая разница между Black box и White box monitoring? 69. Расскажите о подходах к сбору application логов.   Практические задания 71. Напишите простую программу на ваш выбор. Программа должна получать сообщения из сервиса очередей и печатать его в stdout. Сервис очередей — по вашему усмотрению. 72. Разберите структуру сервиса (на примере Docker-Compose). 73. Практическая сессия работы с Git (Git command line: fetch, push, pull, rebase, checkout, submodules).   Middle   Linux 1. Опишите архитектуру ядра Linux. 2. Что такое ядро ​​и каково его предназначение? 3. Опишите общие части файловой системы Unix/Linux, архитектуру файловой системы. 4. В чем разница между RedHat и Debian? 5. В чем разница между /proc и /sys? 6. Ситуация: указывает, что на диске занято 50% места, а сделать файл даже под root юзером не можем. В чем проблема? 7. Мы удалили файл, открывший приложение. Как нам его восстановить? 8. Как найти PID процесса, его стартовые параметры? 9. Как проверить, открыт ли порт на удаленном хосте, локальном хосте? 10. Как искать файл по его содержимому? 11. Что такое SSH, как организовать доступ на сервер без пароля или с определенных хостов? Как ограничить доступные для выполнения команды? 12. Как проверить потреблённые ресурсы во время сеанса SSH? 13. Что означает разрешение на файл 755? 14. Что такое SELinux и зачем он нужен? 15. Как определить PCI-устройство в системе, например, RAID controller? 16. Как переименовать устройство, например, сетевую карту или диск? 17. Что такое LVM? Какие знаете примеры использования? 18. Что такое root reserved space? 19. Что такое exit code и как его узнать? 20. Почему вывод df -h указывает, что на диске занято мало места, но система не дает записать файл с сообщением “no space left on device”? 21. В чем разница между command1 & command2 и command1 && command2, а также command1 && command2 || command3? 22. Из сети резко вырос исходящий трафик на 25-й порт. Как, имея доступ на гейтвей, обнаружить вредителя из внутренней сети? 23. Как затюнить параметры Linux Kernel? 24. Что такое ulimits? 25. В чем разница между символическими и hard links? 26. Что такое фрагментация ext3 и ext4? 27. Зачем файловые системы ext* резервируют 5% места? 28. Как увеличить размер файловой системы? 29. Можем ли мы уменьшить размер файловой системы? 30. Что такое chroot и для чего он нужен? 31. У нас есть Linux box с 2 Гб оперативной памяти и Java-приложение, которое пытается выделить 4 Гб во время запуска. Удастся ли это? 32. Есть приложение, которое читает файл, который пользователь пытается удалить. Что случится? Можно ли удалить этот файл? Можно ли восстановить этот файл? 33. Какие механизмы создания процессов в Linux вы знаете? 34. Сравните systemd и init system. 35. У вас есть папка с большим количеством файлов, и вы хотите удалить все файлы с именами, начинающимися на A (прописная буква). Но команда rm –f A* выдает Argument list too long. Как удалить эти файлы? 36. Вы начинаете удалять файлы первым методом из предыдущего вопроса, но каждый rm запрашивает подтверждение. Это очень долго. Как можно ускорить эту операцию?   Networks 37. Расскажите о модели OSI. Опишите функции и назначение каждого уровня. 38. Какие сетевые топологии вы знаете? Опишите разницу между ними. 39. Зачем нужен IP-адрес, если MAC-адрес уникален? Разве мы не можем общаться только по MAC-адресу? 40. В чем разница между концентратором и коммутатором L2 в сетях Ethernet? 41. Что такое VLAN и для чего существует разделение на виртуальные локальные сети? 42. Какой номер порта используется для PING-коммуникации? 43. Что такое сеанс связи? Какой алгоритм использует TCP для доставки? 44. В чем основное отличие между TCP и UDP? 45. Зачем нам маршрутизатор по умолчанию? 46. Как хост решает DNS по умолчанию? 47. Компьютер начал получать IP-адрес из другой сети (есть подозрение, что в сети работает другой DHCP-сервер): как его найти и отключить? Какие методы защиты от такой проблемы? 48. Мы будем мигрировать сайт на новый IP-адрес. Как сделать, чтобы пользователи этого практически не заметили? 49. Что такое socket? 50. Как узнать, какие удаленные хосты подключаются к хосту через порт 8888? (с помощью команд и не используя /proc или /sys). 51. У нас есть несколько сетевых карт. Как увеличить пропускную способность сервера? 52. Как проверить открытые порты на удаленном сервере без команд Netcat или Nmap Linux?   Container orchestration 53. В чем преимущества Kubernetes как платформы? 54. Что такое control plane и из каких компонентов состоит? 55. Какие CNI вы использовали и чем они отличаются? 56. Чем отличается managed Kubernetes от self-deployed? 57. Как можно контролировать размещение подов в кластере? (taints/tolerations, affinities, topologies etc.) 58. Скейлинг кластера. Cluster autoscaler vs HPA vs VPA? Как сделать zero-downtime node decommission/cluster upgrade? PDB? Lifecycle hooks? 59. Какие способы для внешнего доступа к кластеру? ingress, node port, port-forward и т. д. 60. С каким PID запускается процесс в контейнере? 61. Что лучше использовать для изоляции окружения – Vagrant или Docker? 62. Какой инструмент оркестрирования контейнеров использовали? (Swarm, Kubernetes, Openshift, Rancher и т. д.) 63. Что происходит в Kubernetes после запуска kubectl (API, ReplicaSet Controller, storage back-end, scheduler, kubelet, worker node, pod)? 64. Какая разница между pod и контейнером в K8s? 65. Как мы можем сделать любой микросервис, работающий на K8s, доступным из внешней среды?   Виртуализация и контейнеризация 66. Какие типы виртуализации вы знаете? 67. Как работает Docker на macOS/Windows? 68. Что такое Docker-image и Docker-контейнер? Как они между собой связаны? 69. Каковы основные отличия между контейнерами докеров и виртуальными машинами? 70. Что такое image layer? Какое максимальное количество layers возможно? Почему нужно пытаться иметь малое количество layers? Какое оптимальное количество? 71. Как в виртуальной машине изменить размер диска после создания? Что нужно сделать с гостевой ОС? 72. Как в Docker реализовано ограничение ресурсов? 73. Существует виртуальная машина, к которой потерян доступ. Как, имея доступ к диску, восстановить root пароль/SSH-ключ? 74. Оптимизировать Dockerfile, объяснить, что и почему так: FROM golang RUN apt install -y pkg1 pkg2 pkgN # Dependencies for app COPY. . RUN go build -o app main.go CMD ./app 75. Что такое IPVS и какой у него функционал? 76. Какова структура API в Kubernetes? 77. Что такое operators и зачем они нужны?   CI/CD 78. Какие стадии должны быть в любом пайплайне (lint, test, build, deploy etc.)? 79. Как и где хранить build artifacts? 80. Что такое артефакт? 81. Есть два бренча: dev и stage. Мы забросили Dockerfile в dev, а затем сбилдили в dev и stage. Это будет одним артефактом или разными? 82. Что вы использовали для автоматизации настройки Jenkins и GitLab CI? 83. Сравните CI инструментов: Jenkins, GitLab CI, AWS Code Pipeline, GCP cloudbuild, GitHub actions, Circle CI. 84. Deployment strategies. Какие существуют и чем отличаются (recreate, blue-green, canary etc.)? 85. Как реализовать СI/CD для программы, которая зависит от нескольких других программ? 86. GitOps. В чем его преимущества и недостатки?   Clouds and Automation 87. Какова роль и преимущества облачных сервисов для DevOps? 88. Что такое immutable infrastructure? Как достичь? В чем преимущества и недостатки? Packer, AMI и т. д. 89. Структура Terraform. Как организовать multi-environment project? Terraform workspaces? 90. Лучшие практики по использованию многих Terraform states. 91. Как организовать доступ команде разработчиков к AWS/GCP/Azure? Role-based access, assume role, SSO. 92. Что такое Terraform provider, module? 93. Как версионировать Terraform modules? 94. Когда нужно использовать local-exec и remote-exec? 95. Что такое golden image и как его создать?   Monitoring/Logging 96. Как мониторинг помогает поддерживать всю архитектуру системы? 97. Какие инструменты мониторинга вы использовали? 98. Что такое медиана и процентиль? 99. Что такое SLI, SLO, SLA? Зачем это нужно? 100. Архитектура системы для сбора логов, ELK, EFK etc. Как сохранить логи при отказе хранилища? Нужно ли использовать для этого брокер сообщений? Нужно ли делать throttling/rate limits? 101. Prometheus long-term storage. Какие варианты? 102. Как работает Prometheus? 103. В чем принципиальное отличие между Grafana и Kibana? 104. В чем главное отличие между Ansible and Terraform? 105. Что такое SAAS monitoring и какие виды знаете? 106. Если вы используете Datadog/NewRelic, то как нам отслеживать падение инструментов мониторинга? 107. Что такое distributed tracing и error tracking systems? Как вы думаете, когда следует их использовать?   Information Security 108. В чем разница между RBAC и ABAC? 109. В чем заключается XSS атака? SQL injection? Что такое CSP? 110. Какие базовые меры можно предпринять для защиты SSH-соединения? 111. Root-пароль неизвестен или потерян. Какова процедура восстановления? 112. Как управлять правами на файловой системе в Linux? 113. Что такое Firewall? 114. Чем отличается stateless от stateful фаерволов? 115. Сколько таблиц в iptables? 116. Можно ли настроить трансляцию NAT с помощью iptables? Какую таблицу следует использовать? 117. Какую таблицу используют для смены заголовков пакетов? 118. Если вам ломают Linux-сервер, то как более эффективно блокировать трафик с IP-адресов? 119. Принцип работы GCP Firewall: можем ли мы профильтровать трафик на Load Balancer? 120. Что такое SELinux? 121. Можно ли полностью отключить SELinux на лету? 122. С какими secrets management systems вы работали? 123. У нас есть сервер NAT, и мы хотим обеспечить доступ по IP к серверу снаружи. Как нам это реализовать? 123. Чтобы попасть на сервер клиента, нужно залогиниться на 4+ jump хоста. Как автоматизировать? Где мы будем хранить наш SSH-ключ?   Development 125. Что такое cookies? Зачем нужны? JWT? 126. Что такое feature toggles и зачем они? 127. Что такое TDD (Test Driven Development) и BDD (Behaviour Driven Development)?   Databases 128. Что такое индекс и что такое ключ? 129. Каковы преимущества и недостатки индексов? 130. Представьте, что вы разрабатываете систему биллинга, которая должна обрабатывать тысячи счетов. Какую стратегию обновления данных вы бы выбрали? 131. Какие методы чаще всего используют для масштабирования реляционных баз данных? 132. Опишите механизм транзакций БД. 133. Как мы можем удалить таблицу или базу данных? 134. Как найти медленные запросы в MySQL/PostgreSQL? 135. Какие SQL-операторы манипулирования данными вы знаете? 136. Можно ли вывести список баз данных/таблиц через CLI? Как мы можем переключаться между базами данных MySQL/PostgreSQL? 137. Какие storage engines в MySQL вы знаете? Какие отличия? 138. Как реализована репликация MySQL master-master? Сколько серверов MySQL может быть задействовано в таком взаимодействии? 139. Как работает репликация MySQL/PostgreSQL? Какие параметры должны быть настроены для репликации? 140. Сравните SQL и NoSQL. 141. Sharding vs replication? 142. Какие есть виды индексов? Когда и зачем использовать? 143. Требования к схеме БД. Character sets, collations, default, not null и т. д. 144. Мы мигрируем MySQL/PostgreSQL из on-prem в облако. Как нам это сделать с минимальным даунтаймом? 145. Зачем и как тестировать перформанс баз данных?   Практические задания 146. Напишите Terraform module для инфраструктуры тестового сервиса в AWS. 147. Напишите hello-world программу на ваш выбор и сформируйте для нее helm chart/kustomize. 148. Как организовать деплой без downtime? 149. Опишите способы troubleshooting для Docker-контейнера. 150. Разобрать и объяснить структуру CI/CD pipeline (на примере gitlab.yml). 151. Продемонстрируйте навыки работы с GitOps, опишите деплоймент простенькой программы. 152. Как организовать деплой веб-приложения, запущенный на нескольких серверах без (или с минимальным) downtime? 153. Как с помощью Ansible узнать default gateway для пула серверов, и, если он отличается от желаемого, записать строчку «hostname: gateway» в файл на локальной машине?   Senior   Linux 1. Что может создавать высокую нагрузку на CPU (процессы приложений потребляют очень мало ресурсов CPU)? 2. У нас нет команд ifconfig, ip, и поставить мы их не можем. Как нам узнать ip address, mask, network, routes? 3. Что такое suid, sgid и sticky? 4. Что тюнилось с системой для нагрузки трафика 1GB, 10G, 40G+? 5. Что тюнилось с системой для высокой нагрузки на диск? 6. Что такое Linux namespaces? 7. Что такое Ceph, как работает? 8. Что нужно тюнить для Ceph? 9. Что произойдет, если /dev/sda1 перенесем в /root? 10. Мы удалили /dev/sda1. Как нам его восстановить? Что такое pseudo-devices? 11. Нам хакнули сервер, и в директории /var/www создали два миллиона файлов небольшого размера. Если использовать команду cd /var/www и затем rm -rf*, то у нас зависнет терминал. Как удалить файлы? 12. На каком уровне работает iptables? 13. Что такое eBPF и зачем нужен? 14. У вас есть файл, содержащий IP-адреса серверов (по одному в строке). Есть SSH доступ к этим машинам, и вам нужно выполнить задание (например, установить список пакетов на все узлы). Объясните, как можно это сделать.   Networking 15. В чем отличия между IPv4 и IPv6? Зачем мы мигрируем на IPv6? 16. Сосуществование IPv4 и IPv6: что это значит? 17. Действительно ли работают межсетевые экраны с поддержкой IPv6? 18. Как работает DHCPv6? Чем она отличается от DHCPv4? 19. Как фрагментируются пакеты IPv6 и чем это отличается от IPv4? 20. Нужно ли с IPv6 больше использовать NAT? 21. Что такое DPDK? 22. Что такое SR-IOV? В чем разница между DPDK и SR-IOV? 23. Что такое NetFlow и зачем нужен? 24. Что такое OpenFlow? 25.Что такое SDN и какие контроллеры вы знаете? Сравните контроллеры.   Разное 26. Что такое SDLC? 27. Расскажите о последнем опыте реализации архитектуры для сервиса. 28. Какой самый тяжелый скрипт писали? 29. Что такое configuration drift? Почему это происходит и как это усложняет жизнь инженерам\SRE\Ops? 30. Расскажите об архитектуре, за которую вы отвечаете, и укажите, как она масштабирована и отказоустойчива. 31. Назовите три важных KPI для DevOps-специалиста. 32. Как работает Kafka (clusters(brokers, controllers), topics, partitions)? 33. GitOps: Rancher Fleet vs Flux vs Argo? 34. Как использовать GitOps для обновления документации DevOps-приложений? 35. Расскажите об особенностях проектирования Kubernetes on-premise. 36. Как организовать On-call процесс для команды DevOps? 37. Опишите главные шаги загрузки операционной системы Linux.   Container orchestration 38. Service mesh. Что это такое и зачем нужно? 39. Cluster federation. Что это такое и зачем нужно? 40. Pod fine-grained access. Как реализовать? IRSA vs kube2iam vs kiam? 41. Как реализованы услуги в кубернетах? 42. Как дебажить трафик контейнера? 43. Что такое unikernel и зачем он нужен? 44. Почему коммьюнити переезжает из Docker containerd?   Clouds and Automation 45. Какие преимущества и недостатки cloud-провайдеров? 46. Cost оптимизация. Какие инструменты? Spot/preemptible instances, reservations? 47. Как организовать multi-account, multi-region cloud setup? 48. В чем разница между частными и публичными сетями в AWS? 49. AWS Lambda: имели ли опыт работы? 50. Когда следует переходить на AWS Lambda? Когда не стоит? Аналогичные решения в GCP или Kubernetes? 51. Когда лучше использовать CloudFormation, а когда Terraform?   CI/CD 52. Что такое state в контексте использования Terraform? 53. Какие существуют branching strategy? На что опираться при выборе? 54. Как реализовать feature/dynamic environments? 55. Как сделать эмуляцию ресурсов cloud-провайдера для локального тестирования и ускорения разработки? 56. Что такое MultiCloud? 57. Что такое Cloud-Agnostic и когда он потребуется? 58. Что такое Hybrid-Cloud и с какими решениями вы работали?   Information Security 59. Как должны храниться пароли в базах данных (Salt&Pepper, Rainbow Tables, Adaptive Hashing)? 60. Как передавать секреты в application (Secrets management)? 61. Сравните CI/CD SAST и DAST? 62. Какие вы знаете Kubernetes security practices? RBAC? OPA? Какие недостатки RBAC и какие кейсы знаете? 63. Расскажите о защите от DDOS атак, WAF. 64. Что такое Rootless containers и для чего он нужен? 65. Что такое AppArmor и Seccomp и зачем они нужны? 66. Приходилось ли работать с Falco? Если да, то что реализовывали? 67. HashiCorp Vault и как правильно передать нам секреты в контейнере и CI pipeline? 68. Что такое Admission Controllers и какие вы использовали? 69. Как хранятся секреты etcd? Как просмотреть ресурсы в etcd? 70. Чем проверяете на уязвимости ваш Kubernetes cluster? 71. Что такое Secure SDLC? 72. Что вы знаете о Cloud Infrastructure Attack via a Pull Request и как этого избежать?   Observability 73. Что такое observability и чем отличается от обычного мониторинга? Какие особенности необходимо учитывать в микросервисной архитектуре (tracing)? 74. Что такое SLI, SLO, SLA и зачем они нужны? Для чего используют error budget?   Databases 75. Что такое теорема CAP? Зачем это нужно? 76. Как работать с миграциями? Что делать в случае rollback? Как проверить, что миграция backward-compatible? 77. Опишите, как бы вы оптимизировали работу базы данных? (БД по выбору кандидата) Slow queries, buffers, thread pools? 78. Зачем нужно тестировать перформанс базы данных и какими инструментами?   Практические задания 79. Представьте, что вы CTO Booking или Airbnb. Какие бы вы принимали решения касательно: языков программирования. Infrastructure as a Code. архитектуры инфраструктуры. настройки CI/CD. 80. У вас есть файл, содержащий патчи в директории. Например: /var/tmp/temp/file1.c /var/tmp/file.ext /var/tmp/temp/ etc... один путь в строке. Если путь заканчивается на '/' — это путь в каталог. Вам нужно восстановить это дерево каталогов с пустыми файлами в другой файловой системе. Напишите bash-скрипт. 81. Представьте, что вам нужно убедить Spotify, использующего AWS, перейти на GCP. Как вы будете мотивировать Spotify мигрировать на GCP? 82. Есть сервисная компания, предоставляющая сервис трекинга перевозок. Есть клиенты, которые не желают, чтобы их данные процессировались в AWS. Как нам реализовать multi-cloud solution?   Редакция DOU выражает благодарность за помощь в подготовке статьи: Владу Волошину, Павлу Петриченко, Виталию Гарбулинскому (BrightLocal), Евгению Думе, Сергею Яремчуку, Вадиму Шкилю, Александру Билюку, Александру Нежинскому, Владиславу Граму, Станиславу Коленкину, Олегу Миколайченку, Антону Гаврилову.
Нужно ли программисту высшее образование?

Автор: Влад Сверчков

Статистика DOU и Stack Overflow Что происходит в технических вузах на “айтишных” направлениях? Вес диплома Чему учат в вузах? Нужна ли математика в программировании? Рейтинг украинских вузов Стоимость обучения в вузах Итоги   Здравствуйте, дорогие читатели блога ITVDN! Сегодня мы рассмотрим очень важную тему, которая имеет много острых углов. Касаться она будет высшего образования, а именно — его необходимости для программистов. Сразу отметим — тема полна многих нюансов. Мы постараемся охватить все важные моменты, которые помогут составить максимально целостную картину и дать подробный ответ на главный вопрос этой статьи. Давайте не будем тянуть с лирическим отступлением и сразу приступим к поиску информации, а также к расстановке всех точек над “i” в обсуждениях “нужно ли программисту высшее образование?” и что нужно для программиста в вузе вообще. Статистика DOU и Stack Overflow Прежде всего узнаем, как обстоят дела с высшим образованием у тех, кто сейчас занимается разработкой. Для этого обратимся к опросу Stack Overflow Developer Survey 2020, который в этом году собрал 65 000 анкет. Если верить данному источнику, 75% респондентов имеют как минимум степень бакалавра. Выходит, что примерно каждый четвертый разработчик без диплома. Из тех опрошенных, что профессионально пишут код и при этом учились на уровне университета, более 62% имеют степень в области компьютерных наук, компьютерной либо программной инженерии, и лишь около 10% имеют степень в другой инженерной сфере. Примечательно, что почти 10% респондентов имеют степень, связанную с бизнесом, гуманитарными науками либо изящными искусствами. Также, почти 85% опрошенных из числа профессиональных разработчиков считают, что формальное образование хотя бы мало-мальски является важным. Однако, почти 16% верят, что высшее образование и вовсе лишнее.   Теперь обратимся к портрету IT-специалиста по итогам 2020 года от DOU. Вся инфографика составлена на основании 12 419 анкет. Анализируя раздел “Образование и саморазвитие”, можно сказать следующее: кто бы что ни говорил о высшем образовании, но у большинства IT-специалистов есть оконченное высшее образование, а у некоторых — даже два. Две вышки преимущественно у Senior PM, а максимальное число кандидатов наук у специалистов Data Science, которым требуется сильная математическая база для выполнения должностных обязанностей (ее они и получают в вузах). Меньше всего окончивших высшее учебное заведение припадает на Junior разработчиков ПО. Это и не мудрено — большинство получают свою первую должность в IT еще будучи на студенческой скамье. Таким образом, как отечественная, так и зарубежная статистики показывают, что преимущественное количество профессиональных разработчиков все-таки имеют диплом. Отнюдь, это вовсе не означает, что на работу в области IT они попали исключительно благодаря знаниям, полученным в вузе. Тот же опрос от Stack Overflow, только за 2019 год, показал, что более 86% опрошенных самостоятельно изучали необходимый им язык, фреймворк или другой инструмент разработки. Хотя в опросе 2020-го года не было такого же пункта, мы уверены, что статистика самоучек на текущий год не сильно поменялась и плюс-минус тот же процент сохранился до сегодняшнего времени. Выходит интересная коллизия: если подавляющее большинство заканчивало (либо заканчивает в данный момент) вузы, то почему эти же студенты/выпускники самостоятельно изучают то, что им надо в работе? Чему обучают в университетах в таком случае? Давайте разбираться. Что происходит в технических вузах на “айтишных” направлениях? Современные высшие учебные заведения несут мало радости тем, кто собирается стать программистом. Безусловно, студенческая романтика и приключения поджидают вас в любом месте обретения высшего образования. Однако, мы ведем речь именно о целевом назначении этих заведений. Отвечаем на вопрос этого раздела: в университетах достаточно неоднозначное положение вещей. Все спорные моменты мы представим в виде списка: С одной стороны, в вузах действительно изучается программирование, алгоритмы, структуры данных, дискретная математика и другие важные для программистов вещи. С другой стороны, большое количество предметов являются лишними, либо таковыми, которые студентам не по душе. Мы не будем поднимать тему, какие дисциплины действительно важны для программистов, а какие имеют сомнительную ценность, однако факт остается фактом: очень часто учащиеся возмущены наличием филологических предметов, таких как: история, философия, менеджмент, право, история культуры и другими. Похожие ситуации возникают и с техническими направлениями. Допустим, студент ожидал обучения программированию на C# и других высокоуровневых языках; на деле же на “шарпы” припадает семестра 3, а на следующих курсах приходится работать с низкоуровневым Ассемблером и писать программы под логические контроллеры при помощи ST, FBD и SFC, которые часто используются для автоматизации производственных процессов. У каждого университета свои учебные программы, но подобные расхождения ожиданий и реальности встречаются везде. Отдельное внимание стоит уделить качеству образования. Выше мы говорили, что в университетах все же преподают то, что необходимо программисту, хоть и отчасти. Но и здесь есть несколько загвоздок. Первое, что стоит иметь ввиду: ни в одном отечественном вузе из вас не сделают, к примеру, современного .NET разработчика, либо DevOps инженера. Помимо того, что сами программы обучения устаревшие лет на 10 (в лучшем случае), их иногда ведут седовласые старожилы кафедр, которые зачитывают материал из книг эпохи Горбачева. И они не собираются обновлять учебную программу, поскольку вникать в новые технологии для них не комильфо. Также, иногда бывает, что такой преподаватель не прочь поучить вас жизни, либо попросту нивелировать как личность. Слышали истории о том, как студенты до ночи защищали лабораторные/расчетные работы? А о том, как некоторым просто невозможно сдать предмет, который даже близко не нужен программистам? Безусловно, встречаются и вполне лояльные, добрые и приятные преподаватели, но на каждой кафедре вы найдете такого человека, от которого вас будет хватать Кондратий. Хотите ли вы несколько семестров (а то и весь срок обучения) провести в компании такого человека? Относительно молодые программисты-преподаватели, которые занимаются разработкой на коммерческой основе, конечно, встречаются, и с каждым годом их все больше и больше, однако и среди них найти толковых лекторов — та еще задача. Зачастую такие преподы просто садятся за ноут, включают проектор, кодят (проецируя все на доску) и что-то комментируют, пока остальные сидят и 1.5 часа смотрят. Да, это лучше, чем те же великовозрастные преподаватели с мелом в руках. Но просто кодинга недостаточно. Студенты тоже люди; им нужна оживленная подача материала от интересного лектора, который умеет приковывать к себе и к своему коду внимание. Крутой программист, который умеет кодить, но не умеет доносить до остальных свои действия здесь лишний. Если нас читают лекторы-программисты более-менее известных вузов, которые при этом не пользуются популярностью у своих студентов, призываем их задуматься над своими методами подачи материала. Хороший программист не одно и то же, что хороший преподаватель. Если человек умеет грамотно преподносить материал, у него будет меньше проблем с посещаемостью и дисциплиной, а также больше позитивного фидбека от студентов. Преподавательство (от слов “преподать”, “преподавать”) — это навык донесения информации, и его необходимо развивать, над ним надо работать. Выбирая обучение в университете, стоит учитывать, что он ориентирован на самостоятельную работу студентов. Считается, что 80% учебного времени учащиеся должны уделять самостоятельному изучению предмета, а оставшиеся 20% возлагаются на лекции преподавателей. Те абитуриенты, которые считают, что в универе их выучат на программистов, ошибаются. Никто никого учить не собирается, ведь это не школа. И учащийся должен это осознавать. Также, часто бывает так, что на лекциях вам рассказывают одно, а на лабораторных вы делаете совсем другое. Тонны лабораторных и расчетно-графических работ — неизменные спутники каждого студента-технаря, в том числе и студента-программиста. Главные движущие силы технического университета — необходимая для работы “корочка”, ожидания и надежды членов семьи, а также армия. Впрочем, данный пункт подойдет для всех. Это ни для кого не секрет, но все же пускай и эта фраза прозвучит. Кто-то скажет, что такая ситуация в вузах — отличная школа жизни. С одной стороны, это действительно так. Но если посмотреть на систему обучения отечественных вузов с точки зрения “как должно быть” и “как на самом деле”, вы заметите, что опыт и знания, с которыми студенты заканчивают учебу, обретаются не благодаря, а вопреки этим самым вузам. Увы и ах. Вес диплома Нужно ли высшее образование в сфере IT для успешного трудоустройства? В украинских IT-компаниях зачастую требуют хотя бы диплом неоконченного высшего образования либо, чтоб кандидат был на пути к его получению. Однако, это не означает, что без диплома вас не примут в ряды разработчиков, просто у каждой компании своя политика, а чем крупнее компания, тем солиднее запросы по отношению к претендентам. Более того, диплом на собеседовании — это формальность, галочка. На деле же вы будете проходить тестовые задания и отвечать на технические вопросы, так что даже красная “корочка” фактически ничего не решает. Если говорить о развитых странах, то там все серьезнее. Учеба в высших учебных заведениях тяжелее и диплом действительно играет более значимую, нежели у нас, роль. На тех, кто закончил вуз, работодатель и смотрит-то по-другому, с уважением и признанием. Довольно часто иностранные компании вне зависимости от навыков и опыта требуют наличие диплома бакалавра либо, как минимум, чтоб вы на момент рассмотрения резюме находились на старших курсах вуза. Более того, диплом упрощает процесс получения рабочей визы, без которой вы не сможете отправиться работать программистом, например, в европейских государствах или США. А вот на какие должности вас однозначно не примут без диплома как в родной стране, так и за границей — это руководящие позиции в IT. Их занимать имеет право только человек с полным высшим образованием. Имеем две стороны медали. Если взглянуть на аверс — диплом для “галочки”, который при этом выстрадан потом и кровью. Но реверс говорит нам о зарубежье и руководящих должностях, а также — о незабываемой школе жизни, в конце концов. Чему учат в вузах? В каждом высшем учебном заведении своя учебная программа. Однако, если подытожить, то можно выделить следующие айтишные дисциплины: Алгоритмы и структуры данных Алгоритмическое программирование Программирование на популярных языках (C/C++, C#, Java, Python) Веб-программирование Компьютерная графика Дискретная математика Высшая математика Компьютерные сети Базы данных Теория информации и кодирования Криптография Операционные системы другие дисциплины Помимо этого, в вузах студентам также читают предметы, которые напрямую не связаны с программированием и информационными технологиями: экономика, право, история, психология, охрана труда, философия и другие. На стыке филологического и технического расположим английский язык, так как он сверхважен для успешного взаимодействия с зарубежным учебными материалами, статьями, видеороликами, профессиональными книгами. Также, он пригодится для свободного общения с иностранными коллегами и работодателями. Инглиш понадобится и для написания грамотного кода (без русизмов и искаженных названий).  При всем богатстве выборки дисциплин, в отечественном вузе вы можете рассчитывать лишь на азы какой-либо айтишной специальности. Вам дадут всё поверхностно — этих знаний хватит для понимания того, что вообще происходит в той или иной сфере. Всё остальное вы должны будете доучивать, самостоятельно практиковаться, посещать соответствующие курсы, проходить интернатуру в IT-компании и таким образом добирать недостающие знания. Конечно, на Западе существуют такие вузы, где вы сможете пройти хорошее профильное обучение. Например, факультет Informatics, Games Engineering in Technical University Of Munich (Германия). За рубежом осознают важность IT-индустрии и стараются соответствовать новым тенденциям, а не просто пичкать вас “вечной классикой”. Поэтому факультет разработки компьютерных игр — норма для развитых стран. Однако, в таких государствах и отношение к высшему образованию совсем иное. Например, в Чехии выпускников вузов действительно ценят работодатели, поскольку и учеба сложнее, и само преподавание на голову выше отечественных аналогов. Иностранное образование учитывает технологический прогресс и старается идти нога в ногу с ним. Чего не скажешь без комка в горле об обучении в большинстве вузов стран СНГ. Есть один бонус от вузов, о котором мы чуть не забыли. Многие отечественные университеты имеют программы сотрудничества с заграничными университетами. Таким образом, обучаясь на родине у вас есть возможность стать участником такой программы и перебраться за границу ради получения европейского образования. Круто, не правда ли? =) Нужна ли математика в программировании и в каком объеме? Одно из главных достоинств любого технического вуза — математическая база. Обычно, только в высшем образовательном учреждении можно получить хорошие знания высшей математики. Здесь мы поднимем еще один популярный вопрос, который часто задается теми, кто хочет идти в IT: кому нужна математика и нужна ли она вообще для программиста? Ответ — нужна. Однако, есть один приятный момент: каждому разработчику математика нужна в разной степени. Если вы хотите работать в качестве FrontEnd разработчика (создание клиентской стороны веб-приложений), то математика вам потребуется в меньшей степени, нежели для C# / .NET разработчика, который, например, занят разработкой корпоративных решений. Вузовский матан незаменим для тех, кто собирается связать свою профессиональную деятельность с наукой, шифрованием, Data Science, машинным обучением, искусственным интеллектом и всем, что связано с большими объемами данных. Для криптографических задач вам потребуется общая и линейная алгебра. В 3D-моделировании не обойтись без геометрии и механики. Для работы в большими массивами данных необходимы статистика, теория вероятностей, линейная алгебра. Биоинформатика требует знаний в области дискретной математики и статистики. Так можно перечислять множество IT-направлений. Однако, подавляющее большинство людей берут не тот ориентир. В программировании важна не столько математика, сколько само математическое мышление. Зачастую IT не требует глубоких познаний и необходимый мат. аппарат ограничивается начальными курсами университета (теория множеств, графов, автоматов, алгоритмы, базовая логика) + стандартная школьная программа (куда же без нее?). Василий Кобзарь, преподаватель GeekBrains, который специализируется на администрировании Linux, имеет прекрасный ответ на вопрос “насколько программисту нужно знание математики в работе?” (источник): “Если математика будет являться предметной областью, то знать её потребуется настолько хорошо, насколько это нужно для решения задачи. Однако, вопрос, видимо, поставлен для общего случая, и связан с бытующим мнением. Программисту хорошо было бы разобраться с логикой и абстрактной алгеброй, которые не преподаются ни в школе, ни в большинстве вузов. Также не помешают матстат и дискретка. Матан по большей части бесполезен, так же как и, скажем, тригонометрия. В общем, полезна та часть математики, что «ум в порядок приводит», а знание любых формул наизусть только забивает голову”.    Подводя итог этого раздела, скажем следующее. Математика в программировании — это прежде всего о математическом и аналитическом мышлении, которое помогает критически мыслить, абстрагироваться и развязывать задачи, умело используя логику. Именно рациональный подход к решению задач, который обеспечивается мат. мышлением — главный инструмент программиста. С его развитием вам помогут специализированные книги, а также практические упражнения — написание кода, решение математических задачек и прочие упражнения, которые можно найти на веб-ресурсах. Рейтинг украинских вузов Если говорить об Украине, то согласно тому же dou.ua, в первую десятку топовых технических образовательных учреждений, в которых есть IT-специальности, в 2019-м году попали: Национальный университет “Киево-Могилянская академия” (НаУКМА). Украинский католический университет (УКУ). Черноморский национальный университет имени П. Могилы (ЧНУ им. Петра Могилы). Харьковский национальный экономический университет имени С. Кузнеца (ХНЭУ им. Кузнеца). Донецкий национальный университет имени В. Стуса (ДонНУ им. В. Стуса). Харьковский национальный университет радиоэлектроники (ХНУРЭ). Сумской государственный университет (СумГУ). Киевский национальный университет имени Т. Шевченка (КНУ им. Шевченка). Черновицкий национальный университет имени Ю. Федьковича (ЧНУ им. Федьковича). Львовский национальный университет имени И. Франка (ЛНУ им. Франка). В опросе приняло участие 3038 студентов и выпускников украинских “вышей”. Таким образом, рейтинг вышел народным. Он был составлен на основании различных аспектов обучения в университете. В 2020-м году DOU и другие украинские информационные ресурсы не публиковали подобные исследования, поэтому довольствуемся прошлогодним рейтингом. Согласно данному рейтингу, 69.2% опрошенных все же советуют получить высшее образование в украинском вузе. Из них почти 16% рекомендовали бы отучиться в другом отечественном заведении, отличном от того, где респонденты сами получают/получали “вышку”, а 12% предпочли бы выбрать иную специальность/факультет. При этом почти каждый четвертый (24%) считает, что получать диплом надо только за границей. По мнению этих респондентов, за пределами страны качество образования лучше. Также, их привлекает опыт жизни и работы в другой стране. При этом 5.6% опрошенных были категоричны и выступили против получения высшего образования в принципе. Какие предметы нужно сдавать на программиста в ВУЗ – в каждом заведении могут быть свои критерии, однако обычно обязательными являются родной язык, математика, английский, а иногда и физика. Стоимость обучения в вузах Для выяснения данного вопроса, пройдемся по самым престижным украинским заведениям, а затем по вузам, которые занимают второстепенные позиции. Для начала возьмем стоимость контрактного обучения в КПИ на IT направлениях. Самой дешевой по цене на данный момент является специальность “Компьютерные науки” — 25 900 грн за год очного обучения на бакалавриате. Чуть дороже стоит “Кибербезопасность”, однако есть специальности и подороже: “Компьютерная инженерия”, “Инженерия программного обеспечения”, “Информационные системы и технологии” оцениваются в 33 300 грн. Возьмем на рассмотрение НаУКМА. “Компьютерные науки” и “Инженерия программного обеспечения” стоят 50 000 и 48 000 грн соответственно за год обучения на бакалавриате. В КНУ им. Шевченка ситуация следующая: те же специальности, что были перечислены выше, оцениваются в 36 700 грн за год очного обучения на бакалавриате. Перейдем к вузам, которые достигли меньших высот, нежели рассмотренные предшественники. На очереди у нас НАУ. “Компьютерные науки и информационные технологии” — 23 000 грн,  “Инженерия программного обеспечения” — 29 000 грн, “Компьютерная инженерия” — 28 000 грн, “Кибербезопасность” — 24 000 грн, “Информационные системы и технологии” — 26 000 грн. Национальный транспортный университет. За “Инженерию программного обеспечения” и “Компьютерные науки” придется отдать 17 200 грн. Год обучения на очном отделении, естественно. В СумГУ за “Кибербезопасность” и “Компьютерные науки” с вас возьмут 18 800 грн. Ценовой разброс довольно неплохой — примерно от 17 тысяч и до 50. Причем это не обязательно граничные значения. Мы рассмотрели лишь несколько университетов, а ведь их сотни и у каждого свой устав. Но даже с этого списка можно делать соответствующие выводы. Если сравнивать стоимость обучения в вузах с курсами по программированию, то получается, что курсы гораздо выгоднее. На курсах вы потратите примерно 15-25 тысяч на освоение IT-специальности, зато через полгода сможете работать на должности Junior разработчика и с легкостью отобьете всю ту сумму, которая была потрачена на обучение. В универе же вы потратите минимум 4 года и на выходе получите такой набор знаний, который недостаточен для работодателя. Все равно придется обращаться к посторонним ресурсам (книги, курсы, онлайн-ресурсы и т. д.) и заниматься самообразованием, чтобы дотянутся до требований той или иной компании. Итоги Итак, в ходе поисков ответа на вопрос “нужно ли программисту высшее образование?” нам удалось много чего выяснить. Разобьем главные тезисы на “за” и “против”. “За” обучение в вузе: большинство профессиональных программистов имеет высшее образование, а также рекомендует другим получить диплом некоторые компании требуют наличие диплома у кандидатов на обязательной основе; это же касается некоторых видов IT-профессий (биоинженерные разработки и т. д.) вузы по айтишным направлениям учат основам почти всего, что связано с IT высшая математика в вузе очень важна для тех, кто собирается связать свою профессиональную деятельность с наукой, шифрованием, Data Science, Big Data, машинным обучением, искусственным интеллектом и всем, что связано с большими объемами данных диплом помогает в получении визы и руководящих должностей в IT обучаясь в отечественном вузе, можно стать участником программы обмена студентами и выехать на учебу на Запад обучение на курсах нельзя назвать дешевым отсрочка от армии вуз — неплохой выбор, если вы хотите идти в науку “Против” обучения в вузе: диплом скорее нужен для “галочки”, все равно вас будут тестировать на собеседовании и проверять ваши умения и навыки главные движущие силы технического университета — не навыки и знания, а необходимая для работы “корочка”, ожидания и надежды членов семьи, а также армия многие учебные программы в образовательных учреждениях на IT-направлениях устаревшие вузы по айтишным направлениям учат только основам за год очного обучения в более-менее приличном вузе надо будет заплатить не менее 25 тысяч чтобы устроится программистом в IT-компанию, вам необходимо доучиваться после университетского образования Нейтральное, но не менее полезное высказывание: математическое и аналитическое мышление важнее, чем знание формул, однако, стоит учитывать, что знать математику потребуется настолько хорошо, насколько это нужно для решения рабочих задач Если закрыть глаза на множество противоречивых моментов, университет — это действительно своеобразная школа жизни. Самое важное, что можно для себя вынести из вуза — это связи, опыт от универа и опыт, полученный во время проживания в общежитии. Вы можете заполучить хорошие знакомства и узнать очень полезные советы касаемо перспектив в IT из первых уст. По знакомству возможно даже рекомендацию на должность в IT-компании получить. Так стоит ли получать высшее образование программисту? Увы, но как средство изучения конкретного IT-ремесла университет нельзя рассматривать, зато все побочное, что связано с ним, сделано на пристойном уровне. Студенческая романтика, незабываемая жизнь в общаге, ярмарки вакансий, программы сотрудничества универов с престижными IT-компаниями (курсы и интернатуры), программы сотрудничества с иностранными вузами и т. д. Именно эти плоды вы должны собирать во время учебы в вузе. Если вы решились получить высшее образование, вам не помешает следующий совет. Большинство бывших студентов рекомендуют отучиться первые год-два, а затем искать работу (проходить курсы, устраиваться в интернатуру). Как итог — по окончании бакалавриата вы имеете и университетскую базу, и диплом, и опыт работы. Время зря не потеряли, и при этом университетскую жизнь вкусили. Но если вы не готовы тратить столько времени ради сомнительных привилегий, делайте выбор в сторону курсов. Там вас не будут учить ничему лишнему и вы в максимально короткие сроки сможете освоить желаемую специальность, а затем получить свою первую работу в должности программиста.   Если у вас появились замечания либо пожелания к статье, смело оставляйте их в комментариях. Оставайтесь с ITVDN!
Notification success