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

300+ курсів за популярними IT-напрямками

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

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: mvc4 5
Ігри для тренування навичок програмування

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

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  
ASP.NET Core vs Node.JS

Автор: Guillaume Jacquart

Я работал с .NET-платформой на протяжении 5 лет – как в плане профессиональной необходимости в качестве бек-енд разработчика и архитектора, так и в плане определенных личных задач - таких как открытые и закрытые сторонние проекты. После нескольких лет работы с экосистемой PHP и имея солидный стаж в плане Java, я пришел к выводу, что язык C# для меня представляет, пожалуй, наибольший интерес – благодаря своему удобству и эффективности. Этот язык комплексный, тщательно продуманный и лично для меня в работе с C# лучшую среду программирования, нежели Visual Studio, человечество еще не изобрело. Более того, ASP.NET уже содержит в себе все, что необходимо веб-разработчику, не требуя установки дополнительных фрейморков и библиотек. Единственное, что меня не очень устраивало в плане .NET-системы, это ее «закрытость» и использование преимущественно Microsoft-платформы (хотя и существуют специальные Mono, которые позволяют в качестве альтернативы запускать шарп-проекты и под Linux, но достигается это ценой утраты целого ряда полезных фичей). По этой причине я обратил свое внимание на Node.JS, хотя мои коллеги называли JavaScript бесполезным языком, а Node.JS – хламом. Я был очарован однопоточной каллбэк-системой, я наслаждался, создавая REST API, используя ExpressJS. Но затем Microsoft выпустила кроссплатформенную технологию ASP.NET Core, и я призадумался, что же и когда стоит использовать. После чего я решил собрать как можно больше информации касательно возможностей и реализации тех или иных фичей двух технологий, после чего выбрал для себя, по моему мнению, наиболее удобную технологию, в рамках которой и развернул свой новый проект. Надеюсь, эта публикация вам тоже поможет прийти к определенному решению. Модель обработки запроса Node.JS Node.JS успел зарекомендовать себя как однопоточный обработчик запросов. Что это значит? Это значит, что вместо обработки каждого поступившего http-запроса внутри отдельного потока или процесса (наподобие Apache), обработка производится внутри одного потока. Подобный подход делает обработку запросов однопоточной, тогда как в Apachi\PHP обработка является многопоточной. Однако, что касательно Node.JS, здесь преимущество заключается в асинхронной работе системного ввода-вывода, которое, соответственно, не блокирует требуемый поток. Операция ввода\вывода производится в рамках отдельного потока, в то время как основной продолжает свою работу. Как только вторичный поток завершает свою работу, вызывается callback, который, соответственно, передает в контекст основного потока результат. С одной стороны, использование подобного подхода прекрасно подходит для приложений, интенсивно работающих с вводом\выводом. С другой стороны, появляется вероятность так называемого «ада обратных вызовов», который провялятся в цикличной сложности кода. Будем надеяться, что новая версия введёт в обиход полноценные async\await. Однопоточная модель обработки запросов Node.JS может быть сгруппирована при помощи использования нативной кластеризации, Nginx или PM2. ASP.NET (синхронный) Исторически так сложилось, что обработка запросов ASP.NET MVC (или Web Api) производится подобно Apache / PHP: каждый запрос обрабатывается внутри своего собственного потока пула потоков. И каждая команда ввода-вывода производится синхронно внутри каждого из потоков. В контексте жесткой работы с вводом-выводом подобный подход, конечно, менее удобный, если сравнивать со схемой Node.JS. Хвала Небесам, .NET Framework 4.5 вводит в C# async\await, что также исправляет сложившуюся ситуацию. ASP.NET Core (асинхронный) Паттерн async\await позволяет в полной мере ощутить все прелести асинхронного программирования. Действительно, теперь появилась возможность указать каждый обработчик запросов как асинхронный, благодаря чему работа с системой ввода-вывода будет производиться в контексте своего потока. Это позволит не блокировать основной поток. Подобная модель на базе Task`ов позволяет использовать обратные вызовы, ощутить все прелести асинхронности и прочее. .NET Core часто применяет паттерн async\await при интенсивной работе с системой ввода-вывода.   Async\await Node.JS VS Async\await ASP.NET Core Пример кода Node.JS для асинхронного запроса в базу данных: Пример того же кода на ASP.NET Core (фрагмент класса Startup):   Разница между двумя моделями в том, что ASP.NET Core способен обрабатывать большее количество запросов благодаря своей дефолтной параллельности. В то же время переключение между асинхронными потоками может занимать время в случае использования большого количества общих для многих потоков переменных. В такой ситуации все же Node.JS будет быстрее.   Много современных языков программирования, вроде того же C#, реализуют асинхронный ввод-вывод, который часто недооценен сообществом Node.JS-разработчиков, но который может приводить к приятным неожиданностям. В этом случае Node.JS в значительно меньшей мере технологичный, если сравнивать его с ASP.NET Core. Язык программирования Особенности и безопасность Вращаться в среде C#-разработчиков – значит выслушать множество критики в адрес динамической типизации и удивительных булевых преобразований JavaScript. Впрочем, эта критика является обоснованной, если учитывать, что JavaScript был разработан всего за 10 дней для динамического контента HTML.   С другой стороны, с того времени язык очень даже «вырос», и новая спецификация привносит такие фичи, как: Классы Новые идентификаторы (const, let), повышающие надежность кода Указательные функции Интерполяцию строк Генераторы Элементы рефлексии Впрочем, C# все равно остается намного более мощным языком программирования, ибо все вышеперечисленное – всего лишь небольшая часть того, чем может похвастаться строго-типизированный объектно-ориентированный язык программирования. Мне кажется, что для C# лучшей среды работы, нежели Visual Studio, просто не найти. Однако, если учитывать рост спроса на рынок микросервисов, большинство из особенностей подобных гигантов здесь не найдут свое применение. Изучение Если вы раньше работали с классической MVC-архитектурой, переход на Node.JS \ Express затребует некоторое время, чтобы привыкнуть. Некоторые же вещи могут вообще оказаться в новинку. Также нужно будет время для того, чтобы «переварить» событийно-ориентированную парадигму Node.JS. Что действительно может показаться запутанным впервые при работе со средними или большими приложениями, так это паттерны рефакторинга кода и, собственно говоря, архитектура кода. Так как функциональность Express.js очень гибкая, выбор «правильной» архитектуры и файловой структуры может быть затруднительным. С другой стороны, для создания качественного приложения без этого – никак. Что же касается ASP.NET (Core) MVC / WebApi, то тут уже предоставляется готовая файловая структура. Да, разработчик может применить немного «креативности» при создании бизнес-логики и слоя для работы с базой, но предопределенность архитектуры упрощает разработку. Однако, в случае с маленькими приложениями, JS-платформа более предпочтительна, так как позволяет написать сайт-визитку с использованием одного лишь js-файла и одного лишь package.json. Продуктивность Я обнаружил, что написание простого кода является более быстрым при использовании Node.JS. Причина в том, что простые приложения тут проявляют большую «гибкость». Также возникают вопросы касательно типизации языка, так как в некоторых случаях оказывается, что динамическая типизация является скорее плюсом, чем минусом. С другой стороны, я заметил, что при написании объемного кода, более читабельным он оказывается при работе с C#, чем с JavaScript. Думаю, причина этому – строгие ооп-парадигмы. Что касается отладки и юнит-тестирования, тут C# / Visual Studio также показывают лучшую продуктивность, хотя и сказать, что JavaScript совместно с Visual Studio Code пасет задних, нельзя. Время построения маленьких js-приложений также меньше. Екосистема В этом плане две технологии отличаются больше всего. Node.JS обязана своим развитием в основном сообществу, которое и разработало для неё большее количество существующих популярных библиотек. С одной стороны, вы чувствуете себя очень свободно в выборе модулей для разработки. С другой же, внезапное обновление одного из пакетов, отсутствие надлежащей проверки на ошибки и стабильность, в некоторых случаях могут легко привести к обвалу всего приложения. ASP.NET Core технология разработана проверенной командой профессионалов из Microsoft. И она предоставляет абсолютно все, что необходимо разработчику веб-приложений любых направлений. Кроме того, сторонние библиотеки также качественно выполнены и разработаны другими крупными проверенными компаниями. Один из многочисленных примеров – ORM-инструменты. Entity Framework, официальный инструментарий для работы с базой данных, предоставляет абсолютно все, что необходимо разработчику. Публикация и запуск А вот это та область, где Node.JS, без сомнения, лидирует. Технология является открытой, кросс-платформенной, поддерживает докеризацию. Это значит, что вы запросто сможете запустить свое приложение под такими платформами: На собственном Linux, Windows или Mac-сервере. Все, что для этого нужно – это движок Node.JS и реверсивный прокси-сервер (наиболее популярный – Nginx). Докер-контейнер. Большинство PaaS-провайдеров (AWS, Google App Engine, Azure, Heroku, …) Сервис Now, который позволяет провести запуск Node.JS-приложения в одну строчку без предварительной конфигурации. Также есть много подходящих CI & CD – платформ. Что же в случае ASP.NET-стека, тут все обстоит несколько печальнее. Хотя и ASP.NET Core также кросс-платформенная, количество сервисов для публикации несоизмеримо меньшее. Вот какие хостинги я знаю на данный момент: Собственный Windows-сервер с классическим IIS. Собственный Linux-сервер с реверсивным прокси. Докер-контейнер под Windows. Работает отлично, но занимает много места. Некоторые облачные сервисы PaaS. В основном, Azure, но есть также некоторые неофициальные билды Heroku. Заключение Node.JS обладает асинхронной событийно-ориентированной моделью обработки запросов, которая не очень то и уступает многопоточной async\await модели ASP.NET. Производительность Node.JS – приложений не всегда лучше, чем ASP.NET Core. Можно сказать, она даже хуже. Язык JavaScript не так уж и плох (и становится лучше!). А использование его вместе с Node.JS может дать приятный результат. ASP.NET (Core) лучше всего подходит для объемных приложений и предоставляет все необходимые разработчику инструменты высшего качества. Для микро- или среднеразмерных сервисов Node.JS предоставляет широкие возможности в плане публикации. И, как всегда, не существует одного лучшего инструмента «на все случаи жизни». Попробуйте доступные и подберите для себя тот, который лучше всего отвечает вашим требованиям. Автор перевода: Евгений Лукашук Источник
Найкращі практики Node.JS

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

Добро пожаловать в наш небольшой сборник советов от ведущих разработчиков на платформе Node.JS! Цель сей статьи – обобщить все те знания, которые были в свое время опубликованы в различных обучающих постах или журналах. Автор статьи – Йони Голдберг, независимый разработчик и консультант Node.JS. Итак, начнем! 1) Мониторинг Что это: мониторинг – это такая интересная игра в «найти баг быстрее, чем это сделают твои пользователи». И, помимо прочего, эта игра обладает беспрецедентной важностью. Современный рынок переполнен всеми видами предложений - на любой вкус. Учитывайте: вы должны строго следовать заданной концепции, не переполняя ее различными «доп. фичами». Подберите для себя такое решение, которое удовлетворяет всем требованиям. В противном случае - провал. Разочарованные клиенты. Все просто.   2) «Умное логгирование» - Ваш друг Что это: логи, как правило, очень быстро превращаются в свалку утверждений и записей всех видов и типов. Однако при должном подходе, логи являют собой образец чистоты, легко дающие понять всю необходимую информацию, связанную с программой. Планируйте ведение логов с самого начала: как они будут собираться, храниться и анализироваться. Убедитесь, что желаемая информация (такая, как частота возникновения ошибок и прочее) в любой момент может быть легко извлечена. В противном случае: вы окончите бесконечными копаниями в нечитабельных логах и, в конце концов, потратите уйму времени на «костыли», дабы понять хоть что-то из написанного.   3) Сваливайте все возможные задачи на обратный прокси Что это: увы, но Node.JS ужасен, когда речь заходит о выполнении ресурсоемких задач на центральном процессоре (такие, как g-zip упаковка, SSL-терминация и прочее). Используйте вместо этого промежуточные middleware-сервисы, такие как nginx, HAproxy или облачные. В противном случае: Ваша невинная однопоточная операция займет процессор на длительное время. Как следствие, ваше устройство будет уделять больше времени различным промежуточным задачам, нежели непосредственно Node.JS-приложению. Не буду говорить о производительности.   4) Блокируйте зависимости Что это: код должен быть идентичен для всех сред. Однако, на удивление, можно обнаружить, что NPM творит с зависимостями что-то неимоверное – как только Вы попытаетесь установить пакет в различных средах, программа пытается использовать последнюю версию, характерную для конкретной среды, что, безусловно, вносит свои особенности. Дабы избежать этого, используйте файлы конфигурации. npmrc. Они настраивают NPM таким образом, чтобы тот сохранял текущую версию пакета, не последнюю. Как вариант Вы можете использовать “shrinkwrap”-опцию, так как NPM5 блокирует зависимости по умолчанию. В противном случае: во время тщательного теста QA пропустят версию, которая в продукции будет вести себя неожиданным для разработчика образом. Даже хуже, разные серверы одновременно в том же кластере будут исполнять разный код.   5) Выбирайте правильные инструменты: экономьте время Что это: процесс должен выполняться и перезапускаться в случае ошибок. Возможно, в обычной ситуации в качестве рестартера может сгодиться и что-то наподобие PM2, но в современном мире, где правит балом Докер и его приспешники, все подобные инструменты должны быть подобраны особенно тщательно. В противном случае: использование десятков приложений с сотнями своих инструментов в конце концов приведет к хаосу.   6) Убедитесь, что вы используете только лучшие практики отлавливания багов Что это: как правило, анализ ошибок – наиболее затратная по времени и устрашающая процедура в поддержании стабильности Node.JS-среды. В основном, причина этому – однопоточная модель приложений и отсутствие выработанной стратегии по отношению к ошибкам в многопоточной среде. Быстрых решений не существует, Вы должны в полной мере осознать и приручить это багнутое чудовище.   7) Используйте все ядра процессора Что это: в своей стандартной ипостаси приложения Node.JS используют только одно ядро процессора, в то время как остальные в задаче никакого участия не принимают. Ответственность за утилизацию всех ядер лежит только на Вас. К примеру, для небольших и средних приложений Вы можете использовать Node Cluster или PM2. Для более полновесных программ обратите внимание на репликацию процесса при помощи Docker-кластера (такие, как K8S, ECS) или деплоймент-скрипты на базе инициализации Linux (system – как вариант). В противном случае: Ваше приложение, скорее всего, будет использовать только 25 процентов доступных вычислительных ресурсов (!) или даже меньше. Заметьте, типичный сервер минимум 4-х ядерный, наивный деплой обычного NodeJS использует лишь одно (даже если Вы используете PaaS сервисы наподобие AWS beanstalk)!   8) Разумно планируйте диагностику Что это: работайте с системной информацией как с количеством используемой памяти или REPL и специальных защищенных API. Хотя полагаться на стандартные инструменты и надежней, некоторую ценную информацию и некоторые операции лучше извлекать и производить напрямую в коде. В противном случае: в один прекрасный момент Вы обнаружите, что тратите очень много информации на деплой – поставляя код в продукцию просто затем, чтобы получить некоторую информацию для диагностики.   9) Используйте APM-программы Что это: программы мониторинга вроде APM, чтобы активно оценивать кодовую базу. Посему и их действия могут выходить за рамки действий простых программ мониторинга. К примеру: некоторые APM подсвечивают проблемные транзакции, которые могут вызвать падения производительности на стороне клиента и предполагают причину подобных проблем. В противном случае: Вы можете провести тонны времени на анализ производительности и поиски проблемных мест. Вероятно, Вы так никогда и не будете уверенными, что именно замедляет работу Вашего приложения больше всего и как приложение будет вести себя в «реальном мире».   10) Завершенный код – завершенный продукт Что это: «только идеальный код может быть выпущен в продукцию». Запомните это с самого первого дня разработки. Возможно, это и звучит как что-то из репертуара законченного перфекциониста, но, поверьте, результат того стоит. В противном случае: IT-сообщество вряд ли оценит и сохранит для потомков плохо написанную систему.   11) Обращайте внимание на защиту Что это: Node.JS включает в себя некоторые уникальные защитные механизмы. Понятно и без слов, что более «защищенная» система требует больше времени на ее анализ. В противном случае: что может быть хуже, чем брешь в защите, когда продукт уже в производстве? Просто банальная проблема, которую Вы забыли исправить.   12) Отслеживайте и контролируйте память Что это: Node.JS достаточно неоднозначно работает с памятью: движок v8 обладает ограничением в виде 1.4 ГБ, и были известны случаи, когда код был излишне «памятозатратным». Потому и контроль над использованием памяти – вопрос отнюдь не тривиальный. В небольших приложениях Вы можете настраивать работу с памятью, время от времени используя команды оболочки. Однако в проектах больших масштабов позаботьтесь о выводе состояния памяти в  надежную систему мониторинга. В противном случае: вы обнаружите ежедневную «утечку» памяти в несколько сотен мегабайт, как это произошло с Walmart.   13) Разделяйте клиентскую и серверную часть Что это: для фронт-енд части используйте такие middleware компоненты, как nginx, S3, CDN и прочие. Выполнение подобных задач на Node.JS-сервере очень плохо сказывается на его производительности. Причина этому: обработка великого множества статических файлов в однопотоковой модели. В противном случае: Ваш единственный Node.JS-поток будет занят обработкой сотен html/изображений/angular/react-файлов вместо того, чтобы заняться непосредственно обработкой динамического контента. Или, другими словами, того, для чего и была разработана технология Node.JS.   14) Храните данные вне сервера Что это: сохраняйте любую информацию – будь то пользовательские сессии, кэш, загруженные файлы – на внешнем накопителе. Представляйте, как будто Ваш сервер будет регулярно «падать». Используйте «безсерверную» платформу (например, AWS Lambda). В противном случае: «падение» конкретного сервера в результате приведет не только к утилизации нерабочей машины, но и к падению производительности самого приложения. Более того, зависимость от конкретного сервера значительно уменьшит гибкость всей системы.   15) Используйте инструменты с автоопределением уязвимостей Что это: даже такие проверенные временем зависимости, как Express и другие, имеют бреши, которые время от времени могут ставить всю систему под угрозу. Однако подобное можно легко обойти, если использовать различные бесплатные или коммерческие продукты, которые постоянно проверяются на предмет уязвимостей и могут быть мгновенно исправлены в случае необходимости. В противном случае: держать код в чистоте и без уязвимостей в случае неиспользования соответствующих инструментов затребует постоянного отслеживания новостных сводок и обновлений. Немного напрягает.   16) Присваивайте каждой записи лога свой TransactionId Что это: присваивайте уникальный идентификатор каждой записи в логе. Подобный подход в значительной мере упростит работу и поиск ошибок. К сожалению, из-за асинхронной природы Node.JS реализовать подобное – задача отнюдь не тривиальная. В противном случае: Поиск производственных ошибок будет достаточно длительным. Как следствие, Вы закопаетесь в логе ко всем чертям.   17) NODE_ENV = production Что это: устанавливайте переменной окружения NODE_ENV значение production или development. Это нужно для того, чтобы указать NPM, включить ли оптимизацию или нет – так как многие подобные сервисы обладают опцией автоопределения состояния среды. В противном случае: игнорирование этого нюанса может сильно замедлить производительность. К примеру, если проигнорировать NODE_ENV, используя Express для серверного рендеринга, производительность упадет в три раза!   18) Развертывайте приложение быстро Что это: исследователи отмечают, что команды, которые проводят большее количество Node.JS-размещений, имеют меньший риск столкнуться с целым рядом проблем. Быстрые и автоматизированные размещения, не требующие рискованных ручных этапов и сервисов, в значительной мере ускоряют процесс размещения. Возможно, Вам стоит обратить свое внимание на Docker в комбинации с CI-инструментами. В противном случае: длительное размещение -> падения производительности и человеческие ошибки -> неуверенность команды -> меньшее количество размещений и, как следствие, потенциальных фич.   19) Помещайте NPM-версию в каждое размещение Что это: с каждым новым релизом указывайте в package.json-версию текущего NPM. Это внесет ясность в работе с приложением. Сей фактор важен, так как, к примеру, в среде MicroService некоторые сервисы могут обращать внимание на версию Вашего NPM. Вы можете использовать команду “npm version”, которая укажет версию автоматически. В противном случае: достаточно часто разработчики пытаются исправить баг, часто в конце обнаруживая, что они ищут его не в той версии, в которой стоило бы.   20) Следите за актуальной информацией Традиционное: отслеживайте последние обновления Node.JSб NPM и прочих технологий, с которыми Вы работаете. До новых встреч! Автор перевода: Евгений Лукашук Источник
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 и прочие. Азат обожает все, что связано с технологиями и финансами, так же увлекается инновационными способами обучения и просвещения людей. Автор перевода: Евгений Лукашук Источник
Java Developer: плануємо навчання правильно

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

Ваша цель - стать Junior Java developer в кратчайшие сроки? Что, если мы скажем вам, что её можно достичь всего за шесть месяцев? Хотите узнать - как? Внимательно читайте статью и следуйте рекомендациям. Мотивация  Итак, первый и, наверное, самый важный шаг – это мотивация. Как всем известно, под лежачий камень вода не течёт. Так что нужно чётко сформулировать свою цель и уже сейчас начать что-то делать для её достижения.  Но прежде чем начинать действовать, честно спросите себя: «Зачем я делаю это? Действительно ли  мне это нужно?».  Ведь без понимания значимости того или иного занятия, не будет и желания работать. Не можете понять, действительно ли это ваша цель? Лучшим мерилом того, насколько вы хотите получить желаемое, является то, что вы готовы отдать за него. Готовы ли вы тратить, допустим, 10 или 20 часов в неделю на изучение Java? Если ответ отрицательный, то с рациональной точки зрения вам следует отказаться от этой цели. Потому что, если вы уделяете этому по 5-7 часов в неделю, вы просто тратите время впустую. Аналогично и с деньгами: если вы не готовы тратить их на изучение Java, скорее всего, вы не сильно верите в то, что вам это нужно. Так что чётко определяйте цель, осмысливайте её значимость для вас и начинайте действовать!   Периоды В становлении джава-программиста условно можно выделить три периода: До резюме Во время резюме После резюме «До резюме» - это тот период, когда ещё не следует рассылать свое резюме, но создать его нужно. Резюме – своего рода рекламный буклет, в котором записаны ваши цели и желания. То есть в нём вы даёте себе чёткую задачу того, чего хотите. И чем раньше вы поймёте свои желания, тем быстрее вы получите результат. «Во время резюме» - это период, когда вы уже имеете достаточно знаний и рассылать резюме можно. На данном этапе вам следует пересмотреть ранее созданное, адаптировать его и обновить. Вообще такие действия с резюме стоит проводить раз в одну-две недели. И прежде чем отсылать резюме, его, конечно же, нужно привести в как можно более актуальное состояние. Важно отметить, что именно в этот период вы набираетесь бесценного опыта. Так как в это время вы начинаете ходить на собеседования и набивать свои первые шишки, без которых никак не обойтись. «После резюме» - период, когда вы уже устроились на работу и ни о чём не беспокоитесь. Не забываем об eXtreme Practices Для монетизации себя как специалиста, вам просто необходимо познакомиться с экстрим-практиками. «Что же это за практики такие экстремальные?» - спросите вы. Экстремального с точки зрения опасности для жизни в этих практиках очень мало. Одними из самых популярных практик считаются TVD, парное программирование, непрерывная интеграция, рефакторинг и другие. Но вы можете вырабатывать и свои практики. Просто попробуйте понаблюдать за собой в процессе работы и отметьте, что сильнее всего вам помогает в достижении конкретной цели. На базе этих наблюдений вы сможете создать практику, которая подойдёт вам наилучшим образом. Ещё один хороший способ улучшить свою работу – ретроспектива. Регулярно проводите её и анализируйте свои действия в профессиональной сфере. Пересматривайте вопросы, задаваемые вам на собеседованиях, и свои ответы на них. Это нужно делать для того, чтобы проверять себя на соответствие потребностям рабочего рынка. Вводите метрики рабочих часов, пройденных курсов или тем из них. Благодаря этому вы сможете видеть и контролировать то, сколько своих ресурсов вы потратили на обучение. Такой подход покажет вам честную картину вашей работы. Как учиться? Для освоения чего-либо существует множество возможностей. Вам только нужно найти свой способ и приступать к обучению. Давайте детально разберём несколько методов, чтобы вы смогли понять, какой из них подойдёт вам лучше всего. Онлайн тренинг В последнее время большой популярностью пользуются онлайн-тренинги. Главный их плюс состоит в том, что для них создана конкретная программа, и вы имеете доступ к ней в любое время в любом месте. Но к выбору тренинга нужно подходить с большой ответственностью. Стоит очень внимательно выбирать программу и учитывать, кто ведёт тренинг. К минусам такого метода обучения, во-первых, можно отнести большую вероятность того, что вы не пройдёте тренинг до конца, а во-вторых - отсутствие общения с тренером и такими же учащимися, как и вы. Если вы всё же решили обучаться таким способом, то верным вариантом не забросить это дело будет найти кого-то, перед кем можно будет отчитываться о проделанной работе или проходить тренинг в паре с другом. Также вы можете заключить пари с кем-то из знакомых или в социальных сетях, и тогда вам будет сложно отвертеться от начатого. Офлайн тренинг Такие тренинги ограничены местом и временем, что бывает не очень удобно, а также в большинстве своём они платные. Но посещая их, вы лучше и быстрее усваиваете материал, так как общаетесь с тренером вживую. На офлайн тренинге вы имеете возможность работать в команде над проектом, который в дальнейшем можно будет разместить, например, на GitHub и создать некую точку контакта с рекрутерами. Хотя в этом плюсе есть свои минусы, потому что если вы пропустите несколько занятий, то вам будет сложно успевать за командой. Обучаясь на офлайн тренинге, вам нужно будет готовиться к встречам, выполнять задания и приходить с вопросами к тренеру – так вы получите максимальную пользу от учёбы. На тренинге вы также имеете возможность найти напарника, с которым идти по пути к цели будет проще, или целую команду, что дает надежду на работоустройство после окончания обучения.  Платные курсы Сам факт того, что вы платите кому-то деньги, должен гарантировать некий стандарт качества и честность оказания услуг. Обычно учебные центры, в которых создаются эти курсы, заинтересованы в качестве и поддержании своей репутации. Поэтому такой способ обучения достаточно эффективен и, к тому же, существует большая вероятность того, что вы окончите курс, так как уже заплатили за него. Если вам подходит такой метод, то к выбору курса стоит отнестись осознанно и трижды подумать, прежде чем отдавать деньги. Учтите, что оплата – это благодарность авторам курса, ответственность за результат всё равно лежит на вас. Ведь каким бы хорошим не был тренер на курсе, в его обязанности не входит учиться за вас, вы должны делать это сами. Собственный проект Учиться, создавая собственный проект – это очень смело, и очень круто. Но вы должны быть готовы к любым трудностям.  Используя этот метод, для достижения успеха вам необходимо решать актуальные задачи. Начните создавать, например, консольный проект с мыслью о том, что он скоро станет веб-интерфейсом. Реализовывайте в этом проекте всю полученную вами информацию по этой теме, оттачивайте свои умения! Помните, что главное – не результат, а процесс. Потому как именно в процессе вы набираетесь знаний и опыта. Персональный коучинг При таком способе обучения с вами работает более квалифицированный специалист и решает вашу конкретную задачу. Занимаясь персонально, вы получаете индивидуальный, сделанный под вас план и выгодное знакомство. Согласитесь, никому не помешает знакомый человек из той сферы, в которой вы хотите реализоваться. Правда, у этого метода есть один минус – нанимать личного тренера зачастую стоит больших денег. Но если вы настроены серьезно и верите в поставленную перед собой цель, то это не должно быть преградой. Тренинг в компании Обучаясь в компании, вы получаете максимальный результат минимальными усилиями. Такие тренинги, как правило, бесплатные, а после их успешного окончания вы получаете возможность устроиться на работу в эту же компанию. Программы тренингов всегда адаптированы под компанию, что убережёт вас от изучения ненужного и бесполезного. Но на эти тренинги всегда очень большой конкурс, и при отборе вам необходимо проявить себя наилучшим образом. Самостоятельно Этот способ требует минимальных инвестиций и максимальной отдачи. Перед тем, как приступать к самостоятельному обучению, стоит составить учебный план. Распишите все курсы и темы, которые вы хотите пройти, распределите их по пунктам и приоритетности. Не забывайте вести учёт времени по каждому из пунктов и следить за статусом каждого из них. Выбрав самообучение, вы становитесь на непростой путь и рискуете не дойти до конца. Тем более, что сегодня вы имеете доступ к огромному количеству информации, среди которой очень просто потеряться. Но если вы всегда готовы к борьбе с трудностями и не привыкли отступать, то сможете научиться чему-либо самостоятельно. Систематически занимайтесь, создавайте свои проекты, найдите себе напарника по учёбе, и вы обязательно добьетесь успеха. Каким должен быть JavaJunior? Естественно, джуниор должен хорошо знать язык и решать алгоритмические задачи. Вы должны понимать ООП и уметь моделировать. Знание коллекций, input/output и умение писать юнит-тесты только приветствуется. Также неплохо было бы выучить какой-то из фреймворков и понимать веб-сервисы. Но это всё от вас потребуется не сразу. Некоторые из вышеперечисленных и другие навыки вы получите непосредственно в ходе самой работы.  Создание и распространение резюме В интернете вы можете найти множество советов по составлению резюме, но всё же давайте обговорим некоторые моменты, что касаются этого дела. Итак, при написании резюме вам необходимо придерживаться порядка, который присущ данному виду документа и, конечно же, писать грамотно. Свой опыт работы стоит записывать в обратном хронологическом порядке и указывать только правдивую информацию, хотя слегка её приукрасить можно.  То, что резюме нужно составлять в деловом, корректном стиле - понятно само собой. Хорошо, вы написали резюме. Теперь, чтобы начать поиск работы, вам необходимо его разослать. С этим у вас не должно быть проблем. Присылайте свое резюме известным и не очень IT-компаниям. Поместите его на сайтах поиска работы, благо сейчас таких много. Не стесняйтесь использовать социальные сети и разные сообщества для поиска работы. Главное -  быть настойчивым и не лениться, тогда всё сложиться так, как вы того хотите. Техническое собеседование Отлично! Ваше резюме подошло, и вас позвали на собеседование в компанию. Как же к нему подготовиться? В первую очередь, вы должны соответствовать требованиям вакансии и показать навыки, описанные в резюме. По возможности, просите проведения собеседования утром, так как за целый день можно забить себе голову всяким и под вечер прийти никаким. Тем более доказано, что в первой половине дня человеческий мозг работает лучше. И да, в день собеседования не вздумайте доучивать то, что не выучили раньше - это только навредит вам. Будьте спокойны, не паникуйте. Ведь беспокойство сбивает с толку и уничтожает пунктуальность. Поэтому расслабьтесь и наберитесь уверенности. На собеседовании общайтесь грамотно. Согласитесь, что человек, разговаривающий грамотно, вызывает больше доверия и вести беседу с ним приятнее. Кстати, немного о ходе беседы. Не загоняйте себя в глухой угол, не стоит говорить о тех вещах, в которых вы не разбираетесь. Этим вы можете ухудшить ситуацию и произвести неправильное впечатление.  Также следует внимательно слушать своего собеседника. Таким образом вы покажете, что умеете прислушиваться к людям и работать в команде. Вывод Всё только начинается! Если вы дочитали эту статью до конца – поздравляем! Значит, вы решительно настроены и собираетесь достичь поставленной перед собой цели.  Будьте Человеком-Решением, а не Человеком-Проблемой, и тогда перед вами откроется множество дверей. Не сворачивайте с намеченного пути, продолжайте учиться и развиваться. Помните, что всё в вашей жизни зависит только от вас. Так что уж постарайтесь сделать всё наилучшим образом.
Індексація стовпців у Redis

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

Введение В отличие от memcache, Redis может быть использован в качестве постоянного хранилища, а не только как временный кэш. Так случилось, что Redis — это невероятно быстрая база данных, дающая поразительно лучшую производительность Вашему приложению в случае правильной настройки. В качестве предостережения хотелось бы добавить, что при работе с Redis в качестве основного хранилища таится много рисков, и эти риски значительно увеличиваются в случае некорректной настройки. Настоятельно рекомендуем предварительно провести тщательное исследование Redis перед тем, как заменять Вашу текущую базу данных в пользу Redis.  Несмотря на преимущество Redis в виде невероятной скорости работы, дающейся Вашему приложению, есть факт, который стоит обязательно учесть – Redis – это фундаментальное хранилище ключей/значений, и он не поддерживает индексы. И Вы можете столкнутся с непредвиденным «челленджем» при попытке проиндексировать Ваши значения. Однако, Вы можете обойти эти ограничения с помощью удивительно полезных предоставляемых Redis типов данных. В этой статье буду рассмотрены способы использования каждых наборов и отсортированных наборов для каждого индекса, и как сортировать записи по датам, а также извлекать строки в пределах диапазона дат. О комплексных типах Redis Redis поддерживает несколько комплексных типов — списки, «сеты», отсортированные «сеты» и хэши. В текущей статье не будут упомянуты типы, за исключением «сетов» и отсортированных «сетов». Собственно, «сеты» — это коллекция уникальных неупорядоченных значений. Между тем, отсортированные сеты немного отличаются от обычных сетов. Они позволяют хранить значения, к примеру, с баллами и, таким образом, все члены отсортированного набора можно будет запросить с помощью баллов или диапазона баллов. Это может быть очень удобным при хранении, например, даты. Происходит конвертация каждого одиночного элемента (даты) и хранится в его «тике». Таким образом получается упорядоченный набор значений. Затем можно использовать команду ZRANGEBYSCORE REDIS для получения значений, которые подходят под определённый диапазон. Redis, как хранилище ключевых значений, может также хранить элемент с любым типом данных в базе данных до тех пор, пока этот элемент будет иметь уникальный ключ, определённый для него, вне зависимости от того, какого типа этот элемент – строковый или числовой.   Использование в коде Код не так страшен, как может показаться с первого взгляда. Например, целый объект сохраняется с указателем ко всем индексам. Подход таков, что объект может быть сохранён, как скалярная строка с id в различных индексах. В коде есть класс «Person», позволяющий сохранять объекты класса «Person» с параметрами, например, имя, пол, страна проживания и дата рождения. Класс написан достаточно просто, на мелкие детали не придётся обращать внимание. Также в коде есть статический класс «RedisAdaptor», который содержит в себе вспомогательные функции для сохранения класса «Person» и вызова его объектов. Основная программа В основной программе имеется цикл, который прогоняется ежедневно на протяжении указанного года – 1971 и создаёт новый объект класса «Person» с указанием даты рождения. В случае с полом мы оставляем один единственный объект с указанием женского или мужского пола. Для страны (учитывая, что определены только 3 страны) каждый объект класса «Person» проживает в Индии, США и Англии. В качестве имени используется строка, генерируемая случайным образом. static void Main(string[] args) {     const int YEAR = 1971;     // We create one Person object for every single day in the given year.     for (int month = 1; month <= 12; ++month)     {         for (int day = 1; day <= 31; ++day)         {             try             {                 // Get any random name:                 string name = Util.GetAnyName();                 // And a DoB:                 DateTime dob = new DateTime(YEAR, month, day);                 // As for the gender, let's alternate:                 Gender gender = Gender.FEMALE;                 if (day % 2 == 0)                 {                     gender = Gender.MALE;                 }                 // And the country, let's round-robin between all three:                 Country country = Country.INDIA;                 if (day % 3 == 1)                 {                     country = Country.USA;                 }                 else if (day % 3 == 2)                 {                     country = Country.GB;                 }                 // Create a new Person object:                 Person person = new Person(name, gender, country, dob);                 //Console.WriteLine ("Created new Person object: {0}", person);                 // We call the function that will store a new person in Redis:                 RedisAdaptor.StorePersonObject(person);             }             catch (Exception)             {                 // If the control reaches here, it means the date was illegal.                 // So we just shrug your shoulders and move on to the next date.                 continue;             }         }     }     // At this point, we have 365 Person objects as a sorted set in our Redis database.     // Next, let's take a date range and retrieve Person objects from within that range.     DateTime fromDate = DateTime.Parse("5-May-" + YEAR);     DateTime toDate = DateTime.Parse("7-May-" + YEAR);     List persons = RedisAdaptor.RetrievePersonObjects(fromDate, toDate);     Console.WriteLine("Retrieved values in specified date range:");     foreach (Person person in persons)     {         Console.WriteLine(person);     }     // Next, let's select some folks who are female AND from the USA.     // This calls for a set intersection operation.     List personsSelection = RedisAdaptor.RetrieveSelection(Gender.FEMALE, Country.USA);     Console.WriteLine("Retrieved values in selection:");     foreach (Person person in personsSelection)     {         Console.WriteLine(person);     } } В классе «Redis Adaptor» есть одиночная функция, используемая для хранения и индексации значений, прошедших через него, и функция для запрашивания значений по диапазонам дат, полу и стране. Также в программе имеется несколько статических полей и констант для данных. Учтите, что индексация уже произошла в процессе сохранения. В этом участке мы проиндексировали пол, страну и дату рождения. static class RedisAdaptor {     const string REDIS_HOST = "127.0.0.1";     private static ConnectionMultiplexer _redis;     // Date of birth key:     const string REDIS_DOB_INDEX = "REDIS_DOB_INDEX";     // Gender keys:     const string REDIS_MALE_INDEX = "REDIS_MALE_INDEX";     const string REDIS_FEMALE_INDEX = "REDIS_FEMALE_INDEX";     // Country keys:     const string REDIS_C_IN_INDEX = "REDIS_C_IN_INDEX";     const string REDIS_C_USA_INDEX = "REDIS_C_USA_INDEX";     const string REDIS_C_GB_INDEX = "REDIS_C_GB_INDEX";     static RedisAdaptor()     {         // First, init the connection:         _redis = ConnectionMultiplexer.Connect(REDIS_HOST);     }     public static void StorePersonObject(Person person)     {         // We first JSONize the object so that it's easier to save:         string personJson = JsonConvert.SerializeObject(person);         //Console.WriteLine ("JSONized new Person object: {0}", personJson);         // And save it to Redis.         // First, get the database object:         IDatabase db = _redis.GetDatabase();         // Bear in mind that Redis is fundamentally a key-value store that does not provide         // indexes out of the box.         // We therefore work our way around this by creating and managing our own indexes.         // The first index that we have is for gender.         // We have two sets for this in Redis: one for males and the other for females.         if (person.Gender == Gender.MALE)         {             db.SetAdd(REDIS_MALE_INDEX, personJson);         }         else {             db.SetAdd(REDIS_FEMALE_INDEX, personJson);         }         // Next, we index by country.         if (person.Country == Country.INDIA)         {             db.SetAdd(REDIS_C_IN_INDEX, personJson);         }         else if (person.Country == Country.USA)         {             db.SetAdd(REDIS_C_USA_INDEX, personJson);         }         else if (person.Country == Country.GB)         {             db.SetAdd(REDIS_C_GB_INDEX, personJson);         }         // Next, we need to create an index to be able to retrieve values that are in a particular         // date range.         // Since we need to index by date, we use the sorted set structure in Redis. Sorted sets         // require a score (a real) to save a record. Therefore, in our case, we will use the         // DoB's `ticks' value as the score.         double dateTicks = (double)person.DoB.Ticks;         db.SortedSetAdd(REDIS_DOB_INDEX, personJson, dateTicks);     }     public static List RetrievePersonObjects(DateTime fromDate, DateTime toDate)     {         // First. let's convert the dates to tick values:         double fromTicks = fromDate.Ticks;         double toTicks = toDate.Ticks;         // And retrieve values from the sorted set.         // First, get the database object:         IDatabase db = _redis.GetDatabase();         RedisValue[] vals = db.SortedSetRangeByScore(REDIS_DOB_INDEX, fromTicks, toTicks);         List opList = new List();         foreach (RedisValue val in vals)         {             string personJson = val.ToString();             Person person = JsonConvert.DeserializeObject(personJson);             opList.Add(person);         }         return opList;     }     public static List RetrievePersonObjects(Gender gender)     {         // First, get the database object:         IDatabase db = _redis.GetDatabase();         string keyToUse = gender == Gender.MALE ? REDIS_MALE_INDEX : REDIS_FEMALE_INDEX;         RedisValue[] vals = db.SetMembers(keyToUse);         List opList = new List();         foreach (RedisValue val in vals)         {             string personJson = val.ToString();             Person person = JsonConvert.DeserializeObject(personJson);             opList.Add(person);         }         return opList;     }     public static List RetrievePersonObjects(Country country)     {         // First, get the database object:         IDatabase db = _redis.GetDatabase();         string keyToUse = REDIS_C_IN_INDEX;         if (country == Country.USA)         {             keyToUse = REDIS_C_USA_INDEX;         }         else if (country == Country.GB)         {             keyToUse = REDIS_C_GB_INDEX;         }         RedisValue[] vals = db.SetMembers(keyToUse);         List opList = new List();         foreach (RedisValue val in vals)         {             string personJson = val.ToString();             Person person = JsonConvert.DeserializeObject(personJson);             opList.Add(person);         }         return opList;     }     public static List RetrieveSelection(Gender gender, Country country)     {         // First, get the database object:         IDatabase db = _redis.GetDatabase();         string keyToUseGender = gender == Gender.MALE ? REDIS_MALE_INDEX : REDIS_FEMALE_INDEX;         string keyToUseCountry = REDIS_C_IN_INDEX;         if (country == Country.USA)         {             keyToUseCountry = REDIS_C_USA_INDEX;         }         else if (country == Country.GB)         {             keyToUseCountry = REDIS_C_GB_INDEX;         }         RedisKey[] keys = new RedisKey[] { keyToUseGender, keyToUseCountry };         RedisValue[] vals = db.SetCombine(SetOperation.Intersect, keys);         List opList = new List();         foreach (RedisValue val in vals)         {             string personJson = val.ToString();             Person person = JsonConvert.DeserializeObject(personJson);             opList.Add(person);         }         return opList;     } } Каждый ключ константы определяется в статическом классе, как, например, REDIS_DOB_INDEX, REDIS_MALE_INDEX, REDIS_FEMALE_INDEX и остальные,  всё это – ключи к индивидуальным сетам в хранилище Redis. Однажды, когда мы сохранили значения и создали индексы для сетов в Redis, мы сможем запрашивать их, используя различные версии перегруженных функций RetrievePersonObjects с параметрами – диапазоном дат, полом и страной. Запрос по полу достаточно прост: основываясь на определении пола, мы «погружаемся» в один из двух гендерных сетов и получаем запрошенное значение. Точно та же процедура используется в отношении индекса стран. Чтобы извлечь значения диапазона дат, используется метод SortedSetRangeByScore в объекте базы данных. Он принимает три аргумента: первый – имя сортированного сета, минимальные и максимальные значения. Ещё одна интересная фича в работе с сетами Redis – великолепные семантические сеты. С их помощью можно определять два и более сетов, в результате чего БД Redis делает объединение, пересечение или определяет разность сетов. В последней секции кода посмотрите на функцию снизу – «RetrieveSelection», которая декларирует два параметра – пол и страна. Эта функция соответственно возвращает два параметра – пол и страну. Источник: http://www.codeproject.com/Articles/1072137/Indexing-Columns-in-Redis
ТОП-10 найкращих відео з Python

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

Вітаємо! Друзі, цього разу ми підготували для вас підбірку найкращих вебінарів від ITVDN за напрямком Python. До рейтингу увійшли як пізнавальні вебінари з актуальною інформацією, так і вебінари, орієнтовані на прокачування ваших навичок створення коду. Давайте приступимо до їх розгляду.     Пишемо API додаток на Python за допомогою FastAPI та Docker   Автор – Антон Козаченко, Python Back-end Developer з Латвії   На вебінарі автор розбирає приклад написання API додатку на Python за допомогою фреймворку FastAPI та інструменту Docker. Розглядається фреймворк FastAPI, також створюється декілька методів API. Автор розглядає Docker, пише свою конфігурацію та запускає контейнери. Додатково відбувається покриття API додатку тестами.   План вебінару:   Ознайомлення із фреймворком FastAPI. Написання кількох endpoint-ів API. Написання тестів для цих endpoint-ів. Написання конфігурації для Docker. Запуск додатку в Docker containers. Запуск тестів.     2. Підготовка до технічної співбесіди з Python ➤ Як пройти співбесіду на Junior Python?   Авторка – Людмила Міщенко, Python розробниця   Вебінар присвячений ключовим моментам технічної співбесіди на позицію Junior Python Developer. Розглядаються найчастіші питання, логічні та технічні завдання. Ви дізнаєтесь, як правильно готуватися до співбесіди. Приділено увагу тому, як отримати користь від проходження технічного інтерв'ю та як залишити приємне враження про себе у спеціалістів компанії. Також автор порушує теми важливості роботи над помилками та аналізу співбесіди.   План вебінару:   Як готуватися до технічної співбесіди? На які запитання має знати відповідь Junior Python Developer? На що у відповідях кандидатів найбільше звертають увагу? Чи потрібні (і яку роль грають) pet-projects для фахівця-початківця? Як не розгубитися під час кодингу на співбесіді? (+ поради та лайфхаки) Робота над помилками та аналіз фідбеку після співбесіди.     3. Що краще: Django, Flask чи FastAPI? Огляд фреймворків для веб-розроблення на Python.   Автор – Максим Кузнєцов, Senior Python Developer   В даному вебінарі розглядаються декілька популярних веб-фреймворків на Python (Django, Flask, FastAPI). Автор порівнює їхню продуктивність і пояснює, для яких цілей який фреймворк більше підійде.   План вебінару:   Огляд Django та його фічі. Огляд Flask та його фічі. Огляд FastAPI та його фічі. Порівняння продуктивності. Коли який фреймворк вигідно застосовувати. Відповіді на питання.   Даний вебінар буде цікавий Python розробникам-початківцям, і тим, хто збирається перейти на Python і хоче спланувати своє навчання з урахуванням особливостей різних інструментів.     4. Створення гри BlackJack на Python з нуля (Частина 1 та Частина 2)   Автор – Артем Мураховський, Python Developer, тренер-консультант CyberBionic Systematics   "Створення гри BlackJack на Python" – це дводенний інтенсивний тренінг зі створення відомої карткової гри. Вебінар покликаний у захоплюючій формі познайомити новачків з Python та попрактикуватися у написанні коду цією мовою. Мінімум теорії та максимум практики – що ще потрібно для швидкого старту в програмуванні?   Чому можна навчитися, вивчивши відео матеріали тренінгу та випробувавши отримані знання на практиці:   Писати просту програму мовою Python Розбивати завдання на дрібні підзадачі та успішно їх вирішувати Проєктувати архітектуру програм Писати програми на рівні класів Розв'язувати алгоритмічні задачі Розуміти призначення патернів проєктування   План першого відео (першої частини):   Знайомство із середовищем розроблення PyCharm та мовою програмування Python. Розбір основних елементів мови. Створення архітектури програми на рівні класів. Поліпшення архітектури з використанням патернів. Створення перших об'єктів.   План другого відео (другої частини):   Створення структури проєкту. Наслідування та композиція. Створення спеціальних типів даних. Зв'язок компонентів між собою. Тестування. Підбиття підсумків.     5. Об'єктно-орієнтоване програмування в Python ➤ Що таке ООП та як воно працює.   Автор – Бондаренко Кирило, Data Scientist / Python Developer, "CreatorIQ"   Об'єктно-орієнтоване програмування (ООП) – дуже важлива парадигма у сучасному програмуванні. Цей вебінар розкриває основні принципи ООП і показує, як вони реалізовані у мові Python.   Наскільки важливим є знання ООП для Python розробника? Як часто доводиться використовувати ООП у роботі? У яких проєктах, у яких завданнях? Чи візьмуть вас працювати без знання ООП? Ці та інші питання будуть поставлені в даному вебінарі.   Теми, що розкриваються:   Що таке ООП і як це працює у Python. Приклади розв'язання задач через ООП. Підбиття підсумків. Відповіді на питання.     6. Створення чат-бота "прогноз погоди" на Python   Автор – Артем Мураховський, Python Developer, тренер-консультант CyberBionic Systematics   Якщо ви хочете випробувати свої сили в програмуванні на Python і створити власного Telegram-бота, який сповіщатиме вас про актуальну погоду, цей відеоролик буде дуже доречним.   Підійде як новачкам, які ніколи не програмували, так і розробникам-початківцям, які бажають поглибити і застосувати на практиці свої знання Python.   План:   Рівні моделі мережі Інтернет. Що таке бібліотеки на Python. Що таке API. Telegram API. Бібліотеки для Telegram API. Робота з чистим API.   Чого ви навчитеся:   Реалізовувати нескладну програму мовою Python, яка прогнозуватиме погоду. Основам базового синтаксису мови Python. Теоретичним основам API – зрозумієте, як він працює. Працювати із запитами. Створювати роботів для месенджеру Telegram. Використовувати існуючі сервіси для прив'язки до вашої програми.     Автоматизація парсингу сайтів на Python   Автор – Артем Мураховський, Python Developer, тренер-консультант CyberBionic Systematics   В епоху машинного навчання інформація стає нафтою XXI століття. Проєкти, пов'язані зі збором та аналізом даних, виходять на перші позиції у глобальних компаніях та в стартапах.   Як збирати та обробляти інформацію? Залежно від цілей проєкту, дані можуть збиратися абсолютно різні. На вебінарі ми розглянемо один із найпоширеніших підходів – парсинг сайтів.   Ми візьмемо один із популярних сайтів з робочими вакансіями та на його прикладі розберемо бібліотеки для парсингу веб-сайтів, бібліотеки для роботи із запитами. Розберемо види популярних баз даних і зрозуміємо, де і яку потрібно використовувати.   План вебінару:   Що таке парсинг веб-сайтів? Бібліотеки для парсингу веб-сайтів. Бібліотеки для роботи із мережею. Написання коду парсерів. SQL та NoSQL – за яких завдань який тип використовується. Написання коду менеджерів баз даних.     8. Створення простої казуальної гри на Python   Авторка – Людмила Міщенко, Python розробниця   На вебінарі буде розглянуто реалізацію простої гри на Python. Суть гри полягає у навчанні людей, особливо дітей, вести еко-дружній спосіб життя – правильно сортувати сміття. Тобто, користь буде не тільки для вас у отриманні нових знань у програмуванні, а й у спробі виявити більше турботи про нашу планету.   План вебінару:   1. Постановка задачі.   а) Мета вебінару – створити свою гру на Python, яка вчить сортувати сміття; б) правила гри – обирати правильний кошик для різного типу сміття; закінчення гри за таймером; наприкінці гри користувач отримує суму зароблених балів за правильно обрані кошики.   2. Реалізація програми:   а) встановлення модулів; б) завантаження потрібних зображень; в) написання логіки влучення сміття в кошик (поведінка кошика); г) оголошення та опис елементів сміття (органіка, пластик, папір) – клас поведінки сміття; д) виклик написаних класів та запуск гри.   3. Отримання результатів:   а) запуск та тестування коду; б) проходження гри; в) аналіз виконаної роботи – додавання та зміна умов гри, оптимізація коду, майбутні доопрацювання.       9. Структури даних у Python. Рівень Advanced   Автор – Бондаренко Кирило, Data Scientist / Python Developer, "CreatorIQ"   Якщо ви маєте труднощі з розумінням документованих структур мови Python, таких як list, tuple, dict, set, цей вебінар для вас. Ми розбиратимемося з тим, як написати такі структури даних, як черги (queues), дерева (trees), розглянемо роботу зі вкладеними словниками (nested dicts), а також застосування ООП для розширення можливостей існуючих структур даних.   Матеріал цієї зустрічі буде корисний Python розробникам із різних областей, зокрема Data Science спеціалістам та web-розробникам.   План вебінару:   Робота з розширенням структур даних мови через наслідування та ООП. Робота з комбінованими структурами, такими як nested dict, defaultdict, named tuple і т. д. Написання незадокументованих структур даних, таких як дерева, черги, зв'язані списки та інші.   Цей вебінар буде цікавий розробникам, які добре знайомі з Python, знають про імпорт бібліотек і хочуть заглибитися в роботу зі структурами даних для більшої ефективності роботи з ними.     10. Як стати Python розробником у 2021 році?   Автор – Артем Мураховський, Python Developer, тренер-консультант CyberBionic Systematics   В останні роки мова програмування Python стрімко набирає популярність. За даними Stack Overflow Developer Survey 2019, в якому взяли участь понад 87 тисяч IT-фахівців з різних країн, Python випередила навіть таких постійних та безперечних лідерів, як Java, С# та С++.   Зараз вона широко використовується в Data Science (машинне навчання, аналіз даних, візуалізація), розробленні вбудованого програмного забезпечення та реалізації серверної частини веб-додатків. Також за допомогою Python можна створювати ігри, десктопні та мобільні програми, писати тести для ПЗ та спрощувати адміністрування ОС.   Програма зустрічі:   Хто такий Python розробник і що він робить? Які знання, вміння та навички потрібні Python розробнику? Вимоги до розробників рівня Junior. З чого розпочати вивчення мови Python? Складання плану навчання. Рекомендована література. Відповіді на питання.   Вивчайте Python розроблення на ITVDN!
ТОП-10 найкращих відео з Java від ITVDN

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

Вітаємо, друзі!   Сьогодні на вас чекає підбірка класних, наповнених корисним контентом відео від ITVDN за напрямком Java. Топ насичений як теоретичними відеоматеріалами, які допомагають побудувати ефективне навчання, так і практичними вебінарами, орієнтованими на прокачування навичок програмування за допомогою джави та супутніх технологій (фреймворк Spring, Elasticsearch). Отже, які відео увійшли до цього рейтингу?     Карта спеціальності Java розробник   Автор – Андрій Бондаренко, Android Developer & Trainer, Samsung R&D Institute, Ukraine   Java – це популярна об'єктно-орієнтована мова програмування, якою написані програми для більш ніж 3-х мільярдів пристроїв по всій планеті. Сфера її застосування практично безмежна, а ті, хто добре володіють Java, мають великі можливості та завжди будуть забезпечені цікавими завданнями та високооплачуваною роботою.   На вебінарі ви отримаєте відповіді на всі питання, пов'язані з навчанням, набуттям досвіду, розстановкою пріоритетів у виборі технологій та навчальних матеріалів, а також кар'єрою програміста Java-напрямку.   Програма зустрічі:   Хто такий Java розробник? Актуальність спеціальності та затребуваність на IT-ринку. Як стати Java розробником: попередні вимоги; картка спеціальності; огляд обов'язкових та факультативних технологій.         Де та як вивчити мову програмування Java. Як отримати перший практичний досвід Стажування та перша робота - можливості і перспективи. Питання та відповіді.     Створення базового Spring Boot веб-сервісу на Java   Автор – В'ячеслав Аксьонов, Java/Kotlin Software Engineer   Spring Boot – це найпопулярніший фреймворк для розроблення веб-додатків на Java. У вебінарі буде розглянуто, як влаштовані додатки, котрі створені з використанням Spring Boot, на прикладі найпростішого stateless веб-сервісу. Також автор розгляне http взаємодії з використанням REST, побудову масштабованої архітектури бізнес-логіки, взаємодію з базами даних через найбільш популярні та прості прийоми.   План вебінару:   Що таке Spring/Spring Boot та Dependency Injection. Контекст та як його створювати. @Service/@Component/@Repository/@Controller – що все це таке і навіщо потрібно. Створюємо шаблон проєкту Spring Boot. Пишемо веб-сервіс із нуля. Розглядаємо найбільш простий та зручний спосіб роботи з базою даних. Перевіряємо працездатність та відповідаємо на запитання.     3. Як стати Java розробником у 2021?   Автор – Максим Федосов, Java Developer   З цього вебінару ви дізнаєтеся, як почати свій шлях у якості Java розробника – від новачка без досвіду в програмуванні до рівня фахівця, затребуваного на ринку.   У вебінарі будуть розглянуті дві сторони:   Що вчити: автор поділиться своїм баченням того, що потрібно вивчати насамперед як базу, що потрібно опановувати на етапі пошуку першої роботи, і що потрібно підтягнути, коли спеціаліст вже працює (на прикладі Java стеку). Як шукати роботу: з боку побудови кар'єри йтиметься про те, які шляхи можна обрати для побудови кар'єри, про ринок з точки зору роботодавця, курсів, шукачів. Який проєкт краще обрати, як часто змінювати роботу, як розвивати свою кар'єру.   Весь вебінар буде розділено на 2 частини – до першої роботи та під час роботи. В результаті у фахівців-початківців з'явиться конкретний план дій для того, щоб розпочати кар'єру, а у працюючих фахівців — розуміння того, як рости далі.   План вебінару:   Знайомство, трохи про себе та свій шлях у IT-сфері. Що потрібно вчити розробнику-початківцю Java. Напрацювання практики програмування. Портфоліо. Підготовка до пошуку роботи та подальша кар'єра.     4. Elasticsearch - пишемо свій пошуковик на Java   Автор – Федір Яременко, Senior Java Developer   На вебінарі буде розглянуто, як на Java реалізувати повнотекстовий пошук на об'ємному масиві документів з мінімальними затримками за допомогою Elasticsearch.   План вебінару:   Про повнотекстовий пошук та індексацію Огляд Elasticsearch Налаштування проєкту Додавання індексів Пошук за індексом Пошук за кількома полями Пошук у знайденому Агрегація результатів пошуку Пошук запитів з помилками Інші корисні опції пошуку Ранжування результатів Налаштування форматування результатів Пагінація Налаштування індексів для російської та української мов Асинхронні виклики Масштабування за допомогою кластера Візуалізація даних за допомогою Kibana Висновок       5. Створення 2D гри Танчики з Денді на Java з нуля   Автор – Андрій Бондаренко, Android Developer & Trainer, Samsung R&D Institute, Ukraine   Дане відео є захоплюючим онлайн тренінгом із написання графічної гри "Танки", який допоможе легко і швидко познайомитися з практичною стороною розроблення на Java. Нуль теорії – лише практика.   Кому це буде корисно:   Новачкам. Відсутність досвіду у програмуванні не повинна вас зупиняти. Ми даємо вам шанс зробити свою першу програму на Java та отримати досвід практичного застосування цієї мови програмування у створенні справжньої комп'ютерної гри. Розробникам-початківцям Java без досвіду. Ви зможете поглибити і застосувати на практиці знання мови Java під керівництвом тренера.   Чого ви навчитеся:   Писати прості програми та підпрограми з використанням мови Java Працювати з масивами даних Використовувати типи даних та класи Java Застосовувати всі базові навички (змінні, умовні конструкції, цикли, методи) на практиці   Програма тренінгу:   Створення карти поля бою. Робота над пересуванням танка Реалізація стрільби. Навчання танка рухатися у вказаний квадрант. Додавання танка-ворога. Підсумок: танк проходить все поле бою та чистить його. Відповіді на питання. Куди розвиватись далі?     6. Spring для початківців. Огляд можливостей та переваг. Початок роботи зі Spring   Автор – Дзюба Роман, Java Developer   Spring – це один з найбільш популярних та універсальних фреймворків для створення веб-додатків для бізнесу. Він дає Java-розробникам більшу свободу в проєктуванні програм, надаючи засоби вирішення проблем корпоративного масштабу. Spring має велику документацію і досить простий у використанні.   Дане відео є першим відеоуроком з відео курсу “Spring”, який знайомить з однойменним фреймворком.   На самому курсі розглядаються різні способи використання модулів Spring, написання REST додатків, використання MVC моделей та інші теми.   Проходження курсу за даним фреймворком буде корисним як тим, хто тільки познайомився з мовою Java і шукає, що вчити далі, так і тим, хто вже має певні знання і хоче освіжити в пам'яті навички використання SpringCore, SpringWeb, SpringSecurity.   Головні теми цього відео:   Ознайомлення із базовими принципами фреймворку. Переваги Spring, знайомство з основними принципами ООП та поняттям POJO. Області видимості Java Bean.     7. Створення гри Морський Бій на Java з нуля. (Частина 1, Частина 2)   Автор – Антон Кашніков, Java Developer, тренер-консультант CyberBionic Systematics   Відео у форматі онлайн тренінгу з написання консольної гри "Морський бій". З його допомогою ви швидко познайомитеся з Java, відразу ж розпочавши розроблення. Як результат – ви випробуєте джаву у справі, відчуєте її потужність, а також отримаєте на виході власноруч зроблену гру, яка після доопрацювання може стати чудовим проєктом у вашому майбутньому резюме Java розробника.   Програма тренінгу:   Частина 1   Знайомство із засобом розроблення IntelliJ IDEA та мовою програмування Java. Розбивання проєкту на підзавдання. Робота з масивами під час створення поля бою. Створення перших об'єктів. Використання об'єктів з масивами.   Частина 2   Тонкості роботи з консоллю при відображенні ігрових об'єктів. Продумування логіки гри. Створення геймплею. Оброблення винятків. Розбір помилок. Підбиття підсумків.     Що потрібно знати Java розробнику? ➤ Як вивчити Java?   Автор – Дмитро Саєвський, Java Developer   На цьому вебінарі ви дізнаєтеся, чим займається джавіст, які типи розроблення Java найбільш затребувані. Також автор розгляне весь шлях Java розробника з моменту вибору цієї спеціальності до рівня Senior.   План вебінару:   Типи розроблення Java. Якими вміннями повинен володіти Java розробник. Особливості Java. Історія версій Java. З чого розпочати навчання та скільки потрібно вчитися? Складання плану навчання. Кар'єрний шлях розробника. Рекомендовані посилання. Рекомендована література.     9. Підготовка до співбесіди з позицією Junior Java Developer   Авторка – Вікторія Силенко, Java розробниця desktop та web додатків.   Незважаючи на дату випуску даного вебінару, він досі залишається актуальним для тих, хто вирішив пов'язати свою кар'єру з розробленням Java і при цьому прагне з успіхом пройти співбесіду на позицію Junior Java Developer.   На цьому вебінарі ви дізнаєтесь, як правильно складати резюме, які популярні питання на співбесіді (+ відповіді), теми під час перевірки рівня англійської мови, як добре зарекомендувати себе у перші місяці роботи.     10. Створення багатопотокового клієнт-серверного додатку на Java   Автор – Євген Волосатов, професійний програміст, викладач мови Java у коледжі, автор відео курсів з мов C#, Java, PHP; має більше 20 років досвіду у якості провідного програміста в різних фірмах, має значний викладацький досвід; 6 років досвіду у проведенні вебінарів та створенні відео курсів   Євген Волосатов – справжній метр в області алгоритмів і структур даних на C#, Java, PHP — в даному вебінарі демонструє, як необхідно створювати багатопоточний клієнт-серверний додаток мовою Java.   На цьому вебінарі на вас чекає практика, котра зачіпає сокети та потоки. За допомогою Java буде написано невелику клієнт-серверну програму на сокетах. Для цього автор створить дві різні програми, які запускаються на різних комп'ютерах, але при цьому працюють спільно, надсилаючи одна одній дані.   Для зв'язку програм одна з одною буде створено універсальний клас Phone – він використовуватиметься як на сервері, так і на клієнті в JAR файлі. Наприкінці вебінару автор додасть багатопоточність до серверної частини, щоб сервер міг обробляти кілька клієнтів одночасно.   План вебінару:   Найпростіший сервер – Автовідповідач. Найпростіший клієнт – Вміти читати. Клієнт-серверний діалог. Універсальний сокет – Телефон. Серверна багатопоточність.   Для успішного засвоєння матеріалу необхідні базові навички роботи з Java у середовищі IntelliJ IDEA.   Вивчайте Java розроблення на ITVDN!
500+ питань на співбесіді щодо Ruby

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

Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 14 июня 2021 года. Оригинальная версия на украинском языке доступна по ссылке. Junior Ruby Developer Middle Ruby Developer Senior Ruby Developer Что нужно знать, когда проходишь техническое собеседование по Ruby? Конечно, ко всем вопросам готовым не будешь, но мы попросили интервьюеров-практиков прислать свои списки вопросов, а затем обобщили их в одном материале. Junior Общие вопросы 1. Какие принципы программирования вы знаете и какие из них вы пытаетесь соблюдать чаще всего? 2. Что такое парадигма ООП? Какие основные составляющие парадигмы? 3. Зачем нужна инкапсуляция? Что может произойти и не произойти, если все методы будут иметь модификатор доступа public? 4. Что такое наследование? Назовите пример(ы) плохого наследования (такое наследование, которое не стоило бы реализовывать). 5. Что такое полиморфизм? Приведите пример использования полиморфизма. 6. Что такое паттерн/шаблон проектирования? Какие шаблоны знаете? 7. Что такое клиент и сервер? Какая механика их взаимодействия? 8. Опишите путь, который проходит запрос после того, как в браузер ввести URL любого ресурса. 9. Что такое протокол HTTP? Какая разница между HTTP и HTTPS? 10. Что такое API? Может ли веб-приложение использовать более одного API? 11. Что такое REST API? Какие действия чаще всего выполняются над ресурсами? 12. Что такое сессия? Что такое cookies? Какая разница между ними? 13. Какие веб-уязвимости знаете? Как от них защититься? Какие есть инструменты, чтобы автоматически контролировать защиту от веб-уязвимостей? 14. Какими критериям пользуетесь для выбора библиотеки? 15. Что такое рефакторинг? Какие должны быть условия для выполнения рефакторинга? 16. Знаете ли вы семейство UNIX-подобных операционных систем (Linux, MacOS)? Назовите команды, которые чаще всего используете в терминале. 17. Что такое аутентификация? 18. Что такое авторизация? 19. Из каких частей состоит HTTP Request и HTTP Response? 20. Какие HTTP-статусы (HTTP-коды) знаете? На какие группы вы могли бы их разделить? 21. Какие HTTP-методы знаете? Зачем используется каждый из них? Git 22. Знакомы ли вы с системой Git? 23. Для чего нужны ветки в Git? Как сделать ветку? 24. Как скопировать с Git-хостинга (GitHub / GitLab / Bitbucket / другие) проект? 25. Что такое флаг -f? Для чего он и какие минусы использования? 26. Что такое Pull Request? Зачем ветви соединяют через Pull Request? 27. Какие еще команды чаще всего применяете, когда пользуетесь Git? Ruby 28. Как вы контролируете версии Ruby на своей локальной машине? 29. Что такое метапрограммирование? Какие плюсы и минусы при использовании метапрограммирования? 30. Какой менеджер библиотек для Ruby знаете? Как добавлять библиотеки? Как контролировать версии библиотек? Style guide 31. Что такое style guide и зачем его используют? 32. Какой популярный линтер контролирует выполнение большей части пунктов с Ruby Style Guide? Основы Ruby 33. Какие типы переменных есть в Ruby? 34. Что вернётся в результате сложения 10.5 и 10? 35. Чем отличаются переменные, начинающиеся с @, @@ и $? 36. Что такое attr_reader, attr_writer, attr_accessor и зачем они? 37. Что такое метод? 38. Что значит "?" в конце названия методов? Что означает "!" в конце названия методов? 39. Чем отличается энумератор map от each? 40. Что такое модуль? Какие есть варианты подключения модулей в класс? 41. Что такое класс и зачем он нужен? 42. Что такое модуль и зачем его используют? Чем модуль отличается от класса? 43. Что такое константа? 44. Что такое блок? Что такое yield? Можно ли передавать блоки в методы? Каким образом? 45. Что такое proc? 46. Что такое lambda? 47. В чем разница между proc и lambda? 48. Что такое eigenclass? 49. Какие виды условных операторов есть в Ruby? (if, unless, ternary, case) 50. Есть ли разница между операторами && и and? 51. Какие виды циклов есть в Ruby? (loop, while, until, for, each(), times(), upto()) Типы данных 52. Какие типы данных есть в Ruby? 53. Что такое интерполяция? 54. Что такое конкатенация? 55. Что такое массив в Ruby? 56. Что такое Hash в Ruby? Чем Hash отличается от массива? 57. Что такое символ и зачем он нужен? 58. Что такое Range и зачем его используют? 59. Что такое Time и Date? 60. Что такое Struct? 61. Что такое File? Структура классов и объектов 62. Что такое BasicObject? 63. Что такое Numeric? 64. Что такое Enumerable? 65. Что такое Struct? 66. Что такое OpenStruct? 67. Что такое Set? 68. Что такое Queue? 69. Что такое Object? 70. Что такое Kernel? ООП на Ruby 71. Есть ли интерфейсы в Ruby? 72. Что такое getter и setter в Ruby? Как их создавать? 73. Что такое инстансная переменная? 74. Что такое константа класса? 75. Какая разница между методом класса и методом объекта? 76. Какие есть области видимости? 77. Какие есть модификаторы доступа? Как private отличается от protected? 78. Поддерживает ли Ruby множественное наследование? 79. Как наследуются методы? Можно ли переопределить метод? 80. Зачем метод super? 81. Что такое Singleton-метод? 82. Что такое миксины? Зачем они и чем отличаются от декоратора? 83. Что такое include и extend и в чем разница между ними? 84. Какой путь поиска метода в иерархии классов? 85. Какая разница между последовательными и именуемыми аргументами метода? 86. Что такое exception? Когда они применяются? Как вызвать exception? Как отловить exception? Метапрограммирование 87. Что означает open class? 88. Что такое monkey patching? 89. Возможно ли создать класс динамически? Если да, то как именно? 90. Какие есть способы динамического управления методами, переменными и классами (define_method(), class_eval(), module_eval())? 91. Как происходит поиск метода в иерархии? Как можно обработать отсутствие метода (method_missing())? 92. Что такое алиас метода? Для чего нужны алиасы? 93. Как получить значение инстансной переменной? Как задать значение? Как проверить существование инстансной переменной (instance_variable_get(), instance_variable_set(), instance_variable_defined())? 94. Какие методы интроспекции есть в Ruby (class(), ancestors(), methods(), private_methods(), instance_variables(), singleton_methods(), local_variables())? 95. Что такое хуки и зачем их используют (inherited(), included(), method_added(), singleton_method_added(), method_missing())? RubyGems 96. Что такое gem? Что такое RubyGems? 97. С какой целью используют RVM? Что такое gemset? 98. Что такое Bundler и зачем он? 99. Что такое Gemfile и для чего его используют? 100. За что отвечает каждый из gem`ов? Если знаете нюансы в работе какого-либо из них — обязательно озвучьте. active_admin active_model_serializers bundle audit bcrypt devise jwt cancancan / pundit draper kaminari sidekiq rspec shoulda-matchers faker factory_bot simplecov rubocop (with extensions) pry Ruby on Rails 101. Что такое MVC? Является ли Rails MVC-фреймворком? 102. Что такое миграция? Для чего она нужна? Какие правила создания миграций? 103. Что такое роуты? Что такое resource и resources в роутах? 104. Чем отличается has_many through от has_and_belongs_to_many? 105. Зачем используют concerns? 106. Как работать с sensitive-данными в Rails-приложениях (токены, ключи и т. д.)? Как работает механизм credentials в Rails? 107. С какой целью используют локалы (locals)? Style guide 108. Знакомы ли вы с RoR style guide? Структура файлов в Rails 109. Из чего состоит Rails-приложение? Какая архитектура директорий? Зачем нужна каждая из них? 110. Чем отличается lib от vendor? 111. Как создать background job в Rails? 112. Какие способы загрузки ассоциаций в Rails? Модели и ActiveRecord 113. Зачем нужны модели? Что представляет собою модель? 114. Что такое ORM? Что такое ActiveRecord? 115. Какие есть правила наименования моделей и таблиц в базе данных? 116. Что такое миграции и зачем нужен этот механизм? Как создавать миграции? 117. Какие виды валидаций есть в AR? 118. Как можно вызвать валидацию? Когда валидация вызывается автоматически? Как можно отключить валидацию при сохранении? 119. Что такое callback в Rails? 120. Какие есть виды колбеков в AR? 121. Какие виды ассоциаций есть в AR? 122. Что такое has_one и belongs_to? 123. Что такое has_many? 124. Что такое has_many: through? 125. Что такое has_one: through? 126. Что такое has_and_belongs_to_many? 127. Что такое полиморфная ассоциация? 128. Что такое STI? 129. Каким образом можно получить данные из базы данных? Как получить один объект и коллекцию? Как задать условия выборки? 130. Что такое скоупы? Какова их функция? 131. Як выполнить произвольный SQL-запрос? 132. Как посмотреть информацию о том, как выполнялся запрос, какие использовались ключи и т. п.? Контроллеры 133. Что такое контроллер? Какую задачу выполняет? 134. Что такое action? Что такое CRUD action? 135. Что такое permit params? 136. Что такое ActiveRecord? Как он реализован в Rails-фреймворке? 137. Что такое параметры? Как они попадают в контроллер? Что такое дефолтные параметры (в роутах)? Что такое стронг-параметры? 138. Что такое cookies и зачем они? Где хранятся cookies? Как получить доступ к cookies? 139. Что такое сессии и в чем их задача? Где хранятся сессии? Как получить доступ к сессии? 140. Какие виды фильтров есть в Rails? (Before / after / around actions) 141. Зачем нужен объект Request? Какую информацию он содержит? 142. Для чего нужен объект Response? Какую информацию он содержит? 143. Что такое стриминг? Каким образом можно отдать файл на загрузку (Send_data, send_file)? 144. Что такое Rescue в контроллерах и для чего применяется? 145. Как принудительно включить использование HTTPS-протокола? Маршрутизация 146. Что такое роуты и в чем их функция? 147. Что означает аббревиатура CRUD? 148. Если нужно сделать новый CRUD для определенного ресурса, какие классы вы создадите и какие файлы измените? 149. Что такое ресурсы? 150. Что такое Singular ресурсы и что отличает их от обычных ресурсов? 151. Что делают неймспейсы в роутах? 152. Что такое вложенные ресурсы? 153. Что такое shallow nesting? 154. Что означает RESTful роуты? 155. Что такое нересурсные роуты? 156. Что такое actions в роутах? View 157. Что такое view и для чего он нужен? 158. Что такое layout? Чем отличается от view? 159. Что такое шаблонизатор и с какими шаблонизаторами приходилось работать? 160. Зачем нужен метод render? Что рендерить с его помощью? 161. Как передаются переменные во view? 162. Что такое partial? Когда стоит его применять? 163. Что такое хелпер и зачем его используют? 164. Какие есть хелперы для генерации роутов? 165. Какие есть хелперы для генерации форм? 166. Как создавать собственные хелперы? Интернационализация Rails 167. Что такое i18n? Зачем нужна i18n? Как она устроена в RoR? В каком виде можно хранить переводы? ActionMailer 168. Что такое ActionMailer и какие задачи он решает? AssetsPipeline 169. Что такое AssetsPipeline и какие задачи он выполняет? Инструменты консоли и rake-таски 170. Какие есть консольные команды для работы с RoR? Что такое rake-таски? Безопасность 171. Знаете ли вы какие-то уязвимые места, защиту от которых Rails предоставляет out of the box? 172. Какие атаки могут быть при неправильном использовании сессий? Почему нельзя хранить важные данные в сессиях? 173. Что такое CSRF? Как правильно защититься от CSRF? 174. В чем уязвимость Open Redirect? Как защититься от возможных атак, связанных с Open Redirect? 175. Какие уязвимости связаны с загрузкой файлов? Почему важно фильтровать имена и расширения файлов? Как защититься от опасности? 176. Почему нельзя загружать файлы в каталог, доступный снаружи? Что будет, если злоумышленник загрузит файл с кодом? 177. Какие уязвимости связаны с управлением пользователями (ссылка активации, пароли в чистом виде)? Как защититься? 178. Что такое инъекции и как происходит такая атака? Как их избежать? 179. Как организовать безопасную генерацию приглашений? Что такое deep_munge? Конфигурация 180. Где располагается основная конфигурация программы? 181. Что такое initializers? Зачем они? 182. Что такое окружение? Каково его назначение? 183. Как и где настраивается взаимодействие с базой данных? 184. Как и где настраивается Assets, генераторы, мидлвары, i18n? 185. Можно ли указывать произвольные настройки? Если да, то где и каким образом? Кэширование 186. Что такое кэш и зачем нужен этот механизм? 187. Какие виды кэширования есть в Rails? 188. Где может храниться кэш? 189. Зачем использовать кэширование страниц? 190. Зачем использовать кэширование экшенов? 191. Зачем использовать кэширование фрагментов? 192. Что такое Memcached? 193. Зачем и как реализуется низкоуровневое кэширование? 194. Как и когда кэшируется SQL? 195. Как тестировать кэширования в режиме разработки? Реляционные базы данных Теория реляционных баз данных 196. Что такое СУБД? 197. Что такое реляционная база данных? 198. Что такое нормализация базы данных? 199. Что такое нормальная форма? 200. Сколько есть нормальных форм баз данных? 201. Опишите первые три нормальные формы баз данных. 202. Что такое денормализация баз данных? 203. В чем разница между Primary Key, Foreign Key? Зачем они? 204. Какая разница между LEFT JOIN, INNER JOIN, RIGHT JOIN? 205. Как добавить запись в таблицу без ORM? 206. Как обновить запись в таблице без ORM? 207. Как удалить запись из таблицы без ORM? 208. Как прочитать записи в таблице без ORM? 209. Какие правила группировки данных в таблице вы знаете? SQL 210. Что такое DML (Data Manipulation Language)? 211. Что такое DDL (Data Definition Language)? 212. Что такое DCL (Data Control Language)? 213. Что такое TCL (Transaction Control Language)? 214. Как выбрать данные из нескольких таблиц? Какие виды JOIN вы знаете? 215. Какие агрегированные показатели можно использовать во время выборки из таблицы? 216. Что такое таблица в базе данных? 217. Как создать таблицу? 218. Как выбрать записи из таблицы? 219. Как вставить запись в таблицу? 220. Как изменить запись в таблице? 221. Как удалить запись из таблицы? 222. Как объединить выборку из разных таблиц? 223. Что такое группировка или агрегирование? 224. Каким образом можно задавать условия агрегирования? Индексы баз данных 225. Что такое индексы в базе данных? 226. Для чего нужны индексы? 227. Какие виды индексов существуют? 228. Что такое первичный ключ? 229. Что такое внешний ключ? 230. Что такое составной ключ? Полнотекстовый индекс в базах данных 231. Что такое полнотекстовый поиск и в чем его задача? 232. Что такое полнотекстовый индекс? 233. Что такое ts_vector? 234. Что такое ts_query? PostgreSQL 235. Что такое select distinct и какова его функция? 236. Каким образом можно сортировать результаты выборки? 237. Как ограничить количество результатов выборки? 238. Как проводить поиск по подстрокам? 239. Какие виды объединений (JOIN) есть в PostgreSQL? 240. Что такое подзапросы и в чем их задача? 241. Какие типы данных есть в PostgreSQL? 242. Какие есть виды символьных типов данных? 243. Какие есть виды типов данных для работы с датой и временем? 244. Что такое тип enum? Когда он используется? 245. Как можно создавать таблицы в базе данных? 246. Как изменять структуру таблицы? 247. Как удалять таблицы? 248. Как очистить таблицу? 249. Возможно ли задавать значения по умолчанию для полей? Если да, то как именно? 250. Возможно ли контролировать уникальность значений при вставке? Если да, то каким образом? 251. Что такое функции в PostgreSQL? 252. Какие операторы есть в PostgreSQL? Базы данных NoSQL Redis 253. Что такое Redis и зачем используют этот инструмент? Elasticsearch 254. Что такое Elasticsearch и зачем его используют? Статический анализ кода 255. Что такое Overcommit и зачем нужен? 256. Что такое Danger и для чего используется? 257. Что такое статические анализаторы кода? Зачем их используют? 258. Какие анализаторы для Ruby / Ruby on Rails знаете? 259. Какие статические анализаторы кода для JavaScript знаете? Тестирование 260. Какие виды тестирования знаете? Какие из них вы практиковали при использовании Rails? 261. Какой фреймворк для тестирования используете? 262. Какие показатели качества для своих тестов можете назвать? 263. С помощью какой библиотеки вы контролируете процент покрытия тестами? 264. Расскажите об основах тестирования в Ruby. Что такое RSpec? Какая разница между describe, context и it? 265. Какая разница между юнит-тестами и интеграционными? 266. Что проверяют приёмным тестированием? 267. Что проверяют интеграционным тестированием? 268. Что тестируют в моделях? 269. Что тестируют в контроллерах? 270. Что тестируют в сериалайзерах? 271. Как тестировать API? 272. Как тестировать различные Service Objects? 273. Что такое RSpec? Какие задачи выполняет этот инструмент? 274. В чем разница между let и let! в RSpec? 275. Какие хуки в RSpec знаете? 276. Что выполняется раньше: let! или хук before (:all) ? 277. Что такое Capybara? Какие задачи решает Capybara? 278. Что такое стабы? 279. Что такое моки? 280. Что такое матчер? 281. Какую задачу выполняет гем Shoulda Matchers? 282. Какую задачу выполняет Faker? 283. Зачем нужны Webmock и VCR? Чем они отличаются? 284. Что такое WebKit и PhantomJS? В чем разница между ними? Какие еще есть драйверы? 285. Как работать с базой данных в тестах? Как работает gem database_cleaner? Дополнительные RubyGems и Rails плагины 286. Какую задачу выполняет Devise? 287. Какую задачу выполняет Rake? 288. Какую задачу выполняет Cancancan и Pundit? 289. Какую задачу выполняет Kaminari и Will_paginate? 290. Какую задачу выполняет Carrierwave? 291. Какую задачу выполняет MiniMagick? 292. Какую задачу выполняет Aasm? 293. Какую задачу выполняет ActiveAdmin? 294. Какую задачу выполняет Nokogiri? 295. Какую задачу выполняет Formtastic и SimpleForm? 296. Какую задачу выполняет Omniauth? 297. Какую задачу выполняет Draper? 298. Какую задачу выполняет Faye? 299. Какую задачу выполняет Pusher? 300. Какую задачу выполняет Sidekiq, Resque? 301. Какую задачу выполняет Mongoid? Управление, сервисы и DevOps 302. Что такое SSH? Как и для чего используется? 303. Каким образом можно настроить аутентификацию на хосте без пароля? 304. Какие задачи выполняет Heroku? В чем его особенность? 305. Какие задачи выполняет Digitalocean? 306. Какие задачи выполняет Docker? Мониторинг 307. Какие задачи выполняют Airbrake, DataDog, NewRelic? 308. С какой целью используют Monit? Ruby Web Tools 309. Какие есть веб-серверы, написанные на Ruby? 310. Что такое Sinatra? 311. Что такое API? Для чего используется? Что такое сериалайзеры и зачем они нужны? 312. Что такое клиент-серверная модель? 313. Какая разница между GET- и POST-запросами? 314. Что такое HTTParty и какие задачи он выполняет? 315. Что такое Faraday и какие задачи он выполняет? 316. Что такое Rack? Что такое Rack-application? Что такое Rack middleware? 317. Что такое push-технология? Интеграции 318. Есть ли опыт интеграции с Facebook? Если да, то на каком проекте? 319. Есть ли опыт интеграции с Twitter? Если да, то на каком проекте? 320. Есть ли опыт интеграции с LinkedIn? Если да, то на каком проекте? 321. Есть ли опыт интеграции с Google? Если да, то на каком проекте? Практические задания 322. Описать в ООП-стиле: один из предметов интерьера в контексте конкретного бизнеса. Например, кресло, на котором сидит кандидат, теперь надо продавать в магазине. 323. Написать консольную версию игры «крестики-нолики», где входные данные передаются через gets, а выводят через puts. Два пользователя на одной машине должны иметь возможность сыграть партию. 324. Отсортировать массив. 325. Написать функцию, которая вернет уникальные элементы массива, не используя функцию uniq или set, to_set со стандартной библиотеки. Middle Общее 1. Что такое SOLID? Приведите примеры на каждую из букв. 2. Что такое микросервисная архитектура? Какие плюсы и минусы вы видите во время её использования? 3. Знаете ли вы шаблоны проектирования Singleton / Factory / Facade / Decorator / Template Method / Strategy? 4. Можно ли измерить скорость выполнения алгоритма? Какие факторы влияют на скорость? Какие виды зависимостей вы знаете? 5. Что такое методология Scrum? На каких активностях / встречах может присутствовать / быть полезным Software Developer? 6. Какие инструменты для логирования используете в работе? 7. Какие инструменты для мониторинга веб-приложений используете? 8. С помощью какого/каких инструментов вы деплоили приложения на staging / production? Опишите процесс. 9. Если один из ендпоинтов в приложении отрабатывает очень долго, что делать, чтобы улучшить скорость? 10. Чем отличается библиотека от фреймворка? 11. Что такое трехзвенная архитектура? Зачем и когда ее используют? Приведите примеры. 12. Что такое кэширование? Зачем и когда его используют? Приведите примеры. 13. Что такое функциональное разделение? Зачем и когда его используют? Приведите примеры. 14. Что такое Comet-сервер? Зачем и когда его используют? Приведите примеры. 15. Что такое денормализация? Зачем и когда ее используют? Приведите примеры. 16. Что такое деградация функциональности? Зачем она и в каких случаях используется? Приведите примеры. 17. Что такое сервис-ориентированная архитектура? Зачем и когда ее используют? Приведите примеры. 18. Что такое монолитное приложение? Зачем и когда его используют? Приведите примеры. 19. Что такое асинхронная обработка? Зачем и когда ее применяют? Приведите примеры. 20. Что такое ленивые вычисления? Зачем и когда их используют? Приведите примеры. Предметно-ориентированное проектирование 21. Что такое DDD? В чем преимущества перед классическим MVC? 22. Что такое домен? 23. Что такое модель? 24. Что такое контекст? 25. Что такое сущность? 26. Что такое value object? 27. Что такое агрегирование? Git и code review 28. Что делают команды cherry-pick, log, stash, reset, squash? 29. Что такое Gitflow? Какие правила использования Git на вашем прошлом проекте? 30. Каких правил именования комитов / ветвей / Pull Request`ов вы придерживаетесь? 31. На что обращаете внимание при code review? 32. Что бы вы могли назвать плохо проведенным code review? Базы данных 33. Для чего нужны индексы? 34. Какие есть виды индексов? 35. Ускоряют ли индексы все операции с базами? 36. Что такое DB view? 37. Чем отличаются materialized db view от non-materialized db view? 38. Как можно сохранить данные в различные таблицы и гарантировать, что все они или запишутся, или нет? 39. Можно ли строить индексы по нескольким полям? Важен ли порядок этих полей в индексе? 40. Какие вы знаете constraints при создании столбцов? 41. В чем разница между SQL и NoSQL базами данных? 42. Как бы вы импортировали большие массивы данных в БД (1-2 миллиона строк в CSV-файл)? 43. Что такое N+1 и как избегать? Реляционные базы данных 44. Какие различия между джоинами FULL OUTER JOIN, CROSS JOIN, NATURAL JOIN, INTERSECT и EXPECT? 45. Какие специфические типы данных есть в PostgreSQL? 46. Что такое view? С какой целью используется? 47. Что такое materialized view? 48. Что такое recursive view? 49. Что такое хранимая процедура и зачем она нужна? 50. Что такое партиционирование и какую проблему оно решает? 51. Умеете ли вы работать с чистыми SQL-запросами? 52. Каким образом можно работать с геолокацией в PostgreSQL? 53. Какие способы резервного копирования данных? Что такое pg_dump? В каком виде можно создавать резервные копии? NoSQL базы данных Redis 54. Что такое Redis? Какие задачи он выполняет? 55. Какие типы данных есть в Redis и для чего нужен каждый из них? 56. Что такое pub / sub? 57. Что такое транзакции? 58. Что такое mass insertion? 59. Что такое партиционирование? 60. Умеете ли работать с Redis в консоли? 61. Умеете ли настраивать Redis? Elasticsearch 62. Что такое Elasticsearch и какие задачи он выполняет? 63. Что такое кластер? 64. Что такое нода? 65. Что такое индекс? 66. Что такое тип? 67. Что такое документ? 68. Что такое шарды и реплики? 69. Что такое Query DSL? 70. Что такое мапинг? Статический анализ кода 71. Что такое overcommit и зачем нужна эта утилита? 72. Что такое danger и для чего используют эту утилиту? 73. Какую задачу выполняет каждый из нижеперечисленных гемов? Rubocop; Reek; Rails Best Practices; Brakeman; RubyCritic; SimpleCov; Bundle Audit; Bundle Leak; Traceroute. 74. Какие задачи выполняет каждый из нижеперечисленных модулей? Eslint; Stylelint; Prettier. Ruby 75. Какие проблемы в Ruby (как в языке программирования) вы видите? Какие, по вашему мнению, нужно решать как можно быстрее? 76. Какими библиотеками, кроме фреймворка Rails, пользовались для создания структуры проекта? 77. Как можно в Ruby запросить сторонний API? Какой встроенный класс позволяет это сделать? 78. Что такое Thread? Чем он отличается от Process? 79. Есть ли в Ruby возможность создать абстрактный класс? Есть ли способ искусственно создать абстрактный класс? 80. Есть ли в Ruby возможность множественного наследования? Есть ли способ искусственно заменить множественное наследование? 81. Назвать максимально точный путь поиска методов в Ruby 82. Какие минусы использования method_missing знаете? 83. Можно ли узнать идентификатор объекта в памяти, если да, то каким образом? 84. Какие виды enumerator для массива вы знаете? 85. Что такое мемоизация методов? Зачем ее используют? 86. С помощью какого хука можно посчитать количество потомков определенного класса? 87. В чем разница запуска rspec и bundle exec rspec? 88. Создавали ли вы гем в Ruby? Какая механика / последовательность действий для создания гема? 89. Что такое Rack middleware? 90. Есть такой код:             users = User.where (id: [1,3,4])             users.where (name: "Alex")             users.inspect После какой строчки кода ActiveRecord выполняет запрос в базу? Ruby on Rails 91. Что такое ActiveSupport? Зачем нужен? Какие задачи выполняет? Приведите пример методов, которые добавляет ActiveSupport. 92. Что такое Action Cable? Зачем используют этот фреймворк? 93. Как создать функциональность для отправки имейла в Rails-приложении? 94. Какие библиотеки для background jobs использовали? Какая механика работы таких библиотек? 95. Какие и виды кэша в Rails знаете? Где можно хранить кэш? 96. Какие библиотеки / подходы для создания API документации знаете / используете? 97. Что такое Swagger? Какие преимущества создания API документации в Swagger-формате? 98. Что такое Query Objects? Когда и как их можно использовать? 99. Что такое Decorators? Когда и как их можно использовать? 100. Что такое Form Objects / Contract? Когда и как их можно использовать? 101. Где и как вы рекомендуете держать бизнес-логику в Rails-приложении? 102. Что такое JSON API формат? Использовали ли вы библиотеки для сериализации объектов в JSON API формате? Тестирование 103. Работали ли вы с feature-тестами? Что такое capybara? 104. Что такое TDD? Какие преимущества / недостатки использования TDD-подхода видите? 105. Что такое BDD? В чем отличие между TDD и BDD? 106. Что может быть причиной того, что тесты на проекте выполняются очень долго? 107. Что такое принцип тестирования FIRST? 108. Как порекомендуете писать тесты на код, в котором посылается запрос на сторонний сервис (API)? 109. Какие инструменты помогают контролировать качество тестов? 110. Какие составляющие response`a вы тестируете, когда пишете тест на определенный эндпоинт? 111. Является ли 100% code coverage на проекте залогом низкой вероятности что-то «сломать» во время багфиксинга / имплементации новой функциональности? Объясните свой ответ. Управления, сервисы и DevOps 112. Опишите CI / CD-подход на своем последнем проекте? Как бы вы его изменили? 113. Какие в целом Continuous strategies знаете? Чем отличается Continuous Deployment от Continuous Delivery? 114. Что такое Docker? Чем отличается Docker от виртуальной машины? 115. Для чего используют docker-compose? 116. Умеете ли вы работать с Docker? 117. Что такое image в Docker? Как работать с ним в Docker? 118. Что такое container в Docker? Как работать с контейнерами? Как запускать и останавливать контейнеры? Как узнать список рабочих контейнеров? 119. Что такое Docker Daemon? 120. Что такое Docker Client? 121. Что такое Docker Hub? 122. Что такое Docker Compose? Практические задания 123. Написать клиент для открытого API ресурса с использованием только низкоуровневых библиотек: Net::HTTP, HTTP.rb, Faraday, etc. 124. Как бы вы посчитали количество пассажиров, которые заходят или выходят на определенной станции метро? 125. Посчитать количество автомобилей в пробке. 126. Организовать автомобильную стоянку. 127. Написать функцию, которая вернет уникальные элементы массива, не используя uniq или set, to_set со стандартной библиотеки. Ожидается вариант с применением хеш-таблицы, где ключами будут уникальные элементы из массива, а значениями true. Senior Общие вопросы 1. Опишите основные способы аутентификации в API. 2. Назовите основные принципы построения REST API. 3. Вам нужно спроектировать API, какие основные вопросы будете задавать клиенту? 4. Какие основные преимущества и недостатки монолитной архитектуры? 5. Какие основные преимущества и недостатки микросервисной архитектуры? 6. Что такое SOLID? Какие из принципов, по вашему мнению, чаще всего нарушаются, какие являются наиболее критичными? 7. Опишите Singleton-паттерн. Где и когда вы его использовали? 8. Опишите принцип работы DNS? 9. Что такое code smells? Каковы основные признаки плохого кода? 10. Что такое reverse proxy, для чего он нужен? 11. Что такое load balancer, основные разновидности? 12. Что такое MVC и как не попасть с ним в беду? 13. Опишите процесс обработки HTTP-запроса на примере любого веб-фреймворка в Ruby (Rails, Hanami, Sinatra, Roda, etc). 14. Чем отличается refactoring от оптимизации? Как и когда нужно выполнять каждый из вышеназванных процессов? 15. Знаете ли вы GraphQL? Какие плюсы и минусы вы видите по сравнению с REST? 16. Что такое multi-tenant architecture? Когда рекомендуете ее использовать? 17. Чем отличается понятие Dependency Inversion от Dependency Injection и от Inversion of Control? 18. Что такое GDPR? Назовите правила, которые использовали, чтобы быть GDPR compliant? Метапрограммирование и DSL 19. Параллельное выполнения кода через Thread, Fiber, Ractor. Объясните на примерах. 20. Дизайн-паттерны: Service, Form, Value, Policy, Guard, etc. Объясните на примерах. 21. Расскажите об архитектурных паттернах: Monolith, Microservices, Distributed app, etc. 22. Как организовать бизнес-логику, когда в проект уже 1000+ бизнес-операций? 23. Что такое Sidekiq? Как правильно организовывать очереди? 24. Расскажите об оптимизации быстродействия через benchmark, lineprof и flamegraph. 25. Работали ли вы с Garbage collector? Расскажите. 26. Расскажите о собственных примерах решений, которыми гордитесь и почему. Ruby / Rails 27. Что такое Thread? Какие особенности использования тредов в разработке? 28. Что такое Process? Какие особенности использования процессов в разработке? 29. Что такое Mutex? Приведите примеры использования мьютексов в разработке? 30. Если нужно определить, сколько выполняется тот или иной код, как порекомендуете это сделать? 31. Какие недостатки видите в Ruby? Когда и как они могут себя проявить во время разработки? 32. Можно ли передать контекст выполнения одного метода в другой метод? Если да, то как это сделать? 33. Какие callback-s знаете в Ruby? 34. Как реализовать Singlethon-класс Ruby? Опишите базовые концепты. 35. Как работает Garbage collection в Ruby? Опишите базовые концепты. 36. Что такое Ractor? Какая разница между классической моделью работы с тред и работой с помощью Ractor? 37. Как работают Lazy Enumerators? Чем они отличаются от классических Enumerators? Как и когда они могут помочь? 38. Назвать примеры использования Fiber`ов 39. Как include добавляет метод модуля в класс? Что происходит на уровне MRI? В чем разница по сравнению с extend и prepend? 40. У вас есть задача импортировать пользователей в базу Rails-приложения. Пользователи записаны в CSV-файле, где каждая строка - это данные. Опишите ваш подход к решению проблемы. Как изменится решение, если файл станет очень большим (> 300000 строк)? 41. Если в модели User у вас есть callback, то какие могут возникнуть проблемы при решении предыдущей задачи? 42. Как мы можем отслеживать прогресс Background Job? 43. Опишите жизненный цикл Request - Response в Rails. Через какие основные компоненты фреймворка проходит запрос и для чего они нужны? 44. Какие основные типы тестов используете и с какой целью? 45. Как вы относитесь к интеграционным тестам? 46. Что такое полиморфные ассоциации в ActiveRecord? 47. Как бы вы порекомендовали построить semantic versioning для Rails API, работающего с мобильными приложениями (iOS, Android, Web)? Поверхностно опишите стратегию. 48. Если необходимо, чтобы каждый запрос, пришедший к Rails app независимо от роута, возвращал 403 статус как можно быстрее, как бы вы порекомендовали реализовать код для этой задачи? 49. Какие, по вашему мнению, пять основных минусов Rails? Что бы вы порекомендовали изменить, чтобы нейтрализовать эти минусы? 50. Можно ли в Rails работать с несколькими базами, если да, то как это сделать? Базы данных 51. Что такое транзакция? Какие основные свойства транзакций? 52. Что такое database lock и чем он отличается от транзакций? 53. Что такое Pessimistic и Optimistic locking? 54. У нас есть таблица Users. Мы добавили к ней индекс в трех полях: first_name, last_name, email. Именно в таком порядке. Теперь делаем запрос SELECT * FROM users WHERE first_name = "Alex" AND email = "<a href="mailto:test@mail.com"> test@mail.com </a>". Поможет ли нам индекс ускорить такой запрос, и почему? 55. Что такое Database View? Какие виды есть? 56. Что такое Database trigger? 57. Что такое партицирование? Опишите кейсы, когда партицирование было бы полезным? 58. Поверхностно опишите шаги для реализации партицирования на примере любой СУБД. 59. Что такое триггеры? Как и когда их можно использовать? Какие плюсы и минусы вы видите в сравнении с тем, чтобы использовать триггеры / колбеки на уровне бэкенд? 60. Что такое WAL? Какую роль он играет? 61. Была ли у вас возможность / необходимость использовать шардинг? Чем отличается шардинг от партицирования? 62. Опишите принципы, преимущества и недостатки работы с primary / secondary (master / slave) репликацией? 63. Знакомы ли вы с CAP-теоремой? Если да, объясните основную идею. 64. Знаете ли вы ACID? Как вы понимаете букву "I" в этой аббревиатуре? 65. Представьте ситуацию, когда ваш сервер, на котором размещен redis, по неизвестным причинам перезапустился. Что рекомендуете сделать заранее, чтобы такие ситуации не нанесли большой вред? Тестирование 66. Знаете ли вы, что такое Load Testing? Чем может помочь разработчик при Load Testing? 67. Какие инструменты используют для того, чтобы собрать как можно больше метрик при Load Testing? 68. Какие подходы вы бы порекомендовали использовать, чтобы ускорить тесты на CI? 69. Как внедрить процесс написания тестов, если проект (Rails API) их совсем не имеет? Практические задания 70. Написать реализацию структуры данных Set. Объяснить алгоритмическую сложность добавления элементов к сету. 71. Спроектировать реферальную систему (то есть, пользователь может пригласить других пользователей, которые становятся его рефералами, они приглашают своих рефералов, и так формируется древовидная структура). Есть модель: class Users <ActiveRecord :: Base             end Как бы вы связали ее с рефералами? 72. Добавьте метод: class Users <ActiveRecord :: Base             end который возвращает рефералы пользователя поуровнево. Например, user имеет рефералы user1, user2. user1 имеет реферала user3, user2 имеет рефералов user4 и user5. Должны получить результат: {0 => [user]             1 => [user1, user2],             2 => [user3, user4, user5} Спасибо за вопросы Денису Земляному, Николаю Воронину, Сергею Гнилицкому, Владимиру Свередюку, Михаилу Одинюку, Виктору Нову, Александру Шестопалу, Андрею Зеленцу, Кириллу Шевченко, Виктору Новицкому.
Міфи про програмування та програмістів

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

Миф 1. Без знания математики дверь в программирование закрыта Миф 2. “Прочту книгу — стану программистом” Миф 3. Чтобы освоить программирование, необходимо быть очень умным Миф 4. Необходимо обладать талантом к написанию кода Миф 5. Программисты — замкнутые и необщительные люди Миф 6. Программирование — скучное занятие Миф 7. Программисты всё пишут с нуля Миф 8. Чтобы устроиться на работу в качестве программиста, необходимо очень долго учиться Миф 9. После курсов у вас сразу высокая ЗП Миф 10. “Выучи язык программирования… за 1 час!” Миф 11. Нельзя освоить программирование самостоятельно Миф 12. Программисты разбираются во всём, что связано с техникой Миф 13. Программирование — мужское занятие Миф 14. Существует самый-самый лучший языка программирования Миф 15. Разработчики компьютерных игр — самые богатые и счастливые люди в IT Миф 16. Начинающим айтишникам устроиться на работу невозможно Миф 17. Пойду в ВУЗ, там меня научат программированию Миф 18. Программирование имеет возрастные ограничения Миф 19. Программист — вымирающая профессия: роботы заменят этих специалистов Итоги   Приветствуем вас, друзья! При своей относительной молодости программирование успело обзавестись приличным количеством мифов. Время, когда писателей кода считали дикими отшельниками, потихоньку уходит. Однако, и по сегодняшний день многие имеют ложные представления о программировании. Некоторые считают, что программист - это человек, который взламывает компьютерные системы, банкоматы и совершает прочие несогласованные с буквой закона действия. Другие уверены: программист и компьютер тебе починит, и Windows переустановит, и ТВ-каналы настроит, и новый Фейсбук за ночь напишет, и покажет, как генерировать содержание документа в Ворде.  Более того, некоторые стереотипы настолько прижились, что стали отпугивать новичков в IT и мешать их профессиональному дебюту в данной сфере. Мы подготовили для вас рейтинг самых главных мифов, которые необходимо развеять в первую очередь. Давайте же приступим к их разрушению.   Миф 1. Без знания математики дверь в программирование закрыта Одно из самых распространенных заблуждений. Как мы уже упоминали в статьях “Нужно ли программисту высшее образование?” и “FAQ начинающего программиста”, важно не столько знание математики напрямую, сколько само математическое мышление. Сейчас мы все объясним. Для того, чтобы начать изучение любого популярного языка программирования (ЯП), с головой хватит знаний школьной алгебры. Согласно опросу Stack Overflow Developer Survey 2020, более 50% разработчиков-респондентов написало свою первую строку кода до 16 лет, а в этом возрасте никто еще не изучает высшую математику. Значит, сделать старт в программировании может любой, кто учился/учится в обыкновенной среднестатистической школе. Это первая ступенька на пути к качественному овладению ЯП. Когда вы начнете более-менее ориентироваться в языке и поднабьете руку на практических задачках, вам необходимо будет изучить смежные с математикой дисциплины: теорию множеств, графов, автоматов, алгоритмов, базовую логику. Это программа первых курсов технических вузов по IT-направлению, однако и самостоятельное ее освоение — вполне подъемная задача. При этом наименее зависимыми от математики являются такие специальности, как верстальщик и FrontEnd разработчик. Хорошие знания в области высшей математики необходимы тем, кто хочет реализовать себя в таких направлениях: научная область, шифрование, машинное и глубокое обучение, Data Science, разработка искусственного интеллекта и все, что связано с большими данными. Именно там находит широкое применение тот мат. аппарат, которым славятся технические вузы. Математика в программировании — это, прежде всего, о математическом и аналитическом мышлениях, которые тесно связаны с критическим мышлением и позволяют абстрагироваться, развязывать задачи с умелым применением логики. Именно правильный взгляд и рациональный подход к решению задач является главным оружием программиста, поскольку программирование — это динамика, в то время, как формулы, теоремы и аксиомы статичны. С развитием мат. мышления вам помогут различные книги, а также практика — кодинг, решение математических задачек и прочие упражнения, которые можно найти на просторах интернета. Кстати, критическое мышление отлично развивают шоу с фокусниками. Посмотрите их, подумайте над тем, как маэстро смог провернуть тот или иной трюк (затем посмотрите соответствующие разоблачения). Также будут полезны детективные игры в стиле “Шерлока Холмса”, где, казалось бы, мистическим событиям находяться вполне логические объяснения. Умение не принимать всю информацию как чистую правду, а смотреть на нее со всех возможных углов — очень полезный навык не только в кодинге, но и в повседневной жизни.   В любом случае, данный миф о математике разрушен, а это означает, что начать программировать вы можете прямо сейчас.   Миф 2. Можно стать программистом, просто прочтя одну или несколько книг (“Прочту книгу — стану программистом”) Программирование — это в большей степени практика. Теория здесь обязательно должна подкрепляться добротным кодингом. Это обеспечит закрепление полученной информации, а также будет гарантировать понимание вами материала и способствовать развитию ваших навыков написания кода. Поэтому чтение книг начинающими программистами должно обязательно сопровождаться соответствующими отработками (практикой), иначе получите ноль пользы от литературы и только зря потратите свое время, не достигнув желаемого.    Миф 3. Чтобы освоить программирование, необходимо быть очень умным Миф, который отпугивает множество потенциальных программистов. Появился он из-за ложного убеждения, мол, программисты — это сверхразумы, которые видят мир, как в “Матрице” — в форме бесконечно бегущих зеленых символов. На самом деле они обыкновенные люди. Просто они горят кодом. Программистам нравится создавать компьютерные программы, веб-сервисы, игры, мобильные приложения. Точно так же экстремалам-байкерам нравится выделывать различные трюки на железном коне, знатокам поварского дела — готовить вкусные и красивые блюда, летчикам — поднимать в воздух многотонные крылатые гиганты, водителям — колесить по бескрайним просторам, психологам — помогать людям понимать себя. Если посмотреть на каждую профессию со стороны, в каждой можно найти свои сложности. И каждое препятствие преодолевается прежде всего большим трудом и упорством. А мозги — это часть организма, которая поддается прокачке, как и мышцы тела. Поэтому если вы чувствуете, что “недостаточно умны” для программирования, начинайте ломать этот барьер, работайте над собой и ни в коем случае не позволяйте каким-либо предубеждениям вставать у вас на пути. Никто этот шаг за вас не предпримет, так что все в ваших руках.       Миф 4. Необходимо обладать талантом к написанию кода Успех программиста как такового обусловлен его заинтересованностью выполняемой задачи, количеством специализированных знаний, степенью владения ЯП и математическим мышлением, а также прилагаемыми усилиями. Таланта или какого-то дара в перечне нет. Так что программирование — это 95% усердной работы. Не ожидайте манны небесной — работайте, трудитесь и тогда вы сможете преуспеть в создании кода.   Миф 5. Программисты — замкнутые и необщительные люди Возможно, в далеком прошлом это и было правдой, однако сейчас все совершенно по-другому. Более того, одними из главных требований к личным качествам программистов сегодня являются коммуникабельность, открытость и умение работать в команде. Время компьютерных гиков-одиночек кануло в Лету. Различные конференции, хакатоны, совместный отдых и развлечения — эти вещи как-то мало совместимы с замкнутостью и необщительностью, вы не находите? Такой спектр коммуникабельности не всегда можно встретить в фирмах, которые специализируются на коммуникациях с клиентами, а тут целые мероприятия, куда разработчики приходят пообщаться, заиметь новые связи, обменяться опытом и просто отдохнуть.    Миф 6. Программирование — скучное занятие На первый взгляд это правдоподобно: человек сидит перед монитором (или несколькими), набирает строчки кода и так целый день напролет. Ну что тут может быть интересного? Даже как-то страшно становится... Однако, это очень урезанный взгляд на то, чем занимается программист. Прежде всего, в рассматриваемой ситуации он может: разрабатывать одну из механик компьютерной/мобильной игры; создавать мобильное приложение; реализовывать привлекательный внешний вид веб-сайта; разрабатывать программу для какого-то “умного” устройства; работать над автоматизацией каких-то рутинных процессов, которые обыватели проделывают чуть ли не каждый день; писать программное обеспечение для космического аппарата, самолета, машины; и многое другое. Поверьте, кто-кто, а программисты не скучают — для них всегда есть работа, которая требует и знаний, и навыков, и творческого подхода к решению. К тому же, у каждого человека свой спектр интересов. Кто-то программирование считает скучным вследствие своего гиперактивного способа жизни, а кто-то просто поддается влиянию когнитивного искажения, прислушиваясь к собственному ложному суждению, обусловленному субъективными предубеждениями и стереотипами, социальными, моральными и эмоциональными причинами, то есть, вырабатывает свое отношение к программированию на основе искаженной информации.   Миф 7. Программисты всё пишут с нуля Современные сложные программы состоят из сотен тысяч строк кода. Если бы программисты писали всё с нуля, то на разработку одной такой программы уходило бы очень много времени, особенно, если говорить про игры — там и вовсе приходилось бы для каждого нового экземпляра и движок свой создавать, и физику свою писать и делать много других лишних движений. А это и время, и деньги, и лишние нервы. Поэтому в среде программистов принято не заниматься разработкой “велосипедов”, а использовать проверенные наработки. Разработчики часто применяют сторонние библиотеки, а также код, который был написан ими самими либо другими кодерами для других проектов. Это существенно упрощает и ускоряет создание проектов любой сложности и любого объема.   Миф 8. Чтобы устроиться на работу в качестве программиста, необходимо очень долго учиться В каждом человеке это утверждение находит различное отображение. Кто-то может освоить ЯП и необходимые технологии за месяц. Кому-то на это потребуется пол года. Некоторые и за год не управятся. Все зависит от вашего желания и стремления изучать ЯП, а также от времени, выделяемого вами на теорию и практику. Поставьте перед собой четкую цель и не сворачивайте с выбранного пути. Максимально быстрого обучения можно достичь, выбрав хорошие курсы, разбавляя их большим количеством самостоятельной практики.    Миф 9. После курсов у вас сразу высокая ЗП Один из самых распространенных мифов, который делает программистов в глазах других, незнакомых с данной сферой занятости людей, буквально миллионерами. Мол, “вот мой знакомый недавно листовки раздавал, потом походил на курсы 2 месяца и теперь деньги лопатой гребет”. На самом деле все не так. Те, кто только окончил курсы по освоению той или иной IT-специальности, по своему уровню знаний и умений могут претендовать на должность разработчика-джуниора (младший разработчик, Junior Developer). Конечно, все зависит от выбранного направления и конкретного места работы, однако джуниоры не срывают куш и первое время имеют довольно невысокую зарплату, которая не всегда доходит до пятизначной отметки (если говорить об украинских гривнах). Приблизительно на третий год работы можно говорить о действительно хорошей заработной плате. Так что запомните: высокая ЗП — даже в IT — результат не курсов, а усердной и ответственной работы.     Миф 10. “Выучи язык программирования… за 1 час!” Миф касается различных видео уроков на YouTube, которые пестрят подобным названием и тем самым обманывают вас. Ни один язык программирования не учится за час. Большое количество опытных программистов утверждают: сколько лет они программируют, столько они изучают ЯП. Языки взаимодействия с электронно-вычислительными устройствами настолько же компактны и многогранны, как и те, которыми мы пользуемся в повседневности. Таким образом, во время изучения ЯП вы осваиваете основной синтаксис языка и то, как с ним работать. Затем во время профессиональной деятельности вы углубляетесь в язык и открываете для себя новые техники кодинга и решения различных задач. Но даже процесс овладения языком (синтаксис + основы работы с ним) — небыстрый процесс. У опытного программиста изучение нового ЯП может занять несколько дней. У новичка могут уйти месяцы — все зависит только от вас. Но на всевозможные “Выучи язык… за 1 час!” и подобные вещи не ведитесь; такие видео ролики создают иллюзию того, что вы знаете ЯП, в то время, как на самом деле вы толком ничего и не умеете.   Миф 11. Нельзя освоить программирование самостоятельно Можно. Просто на это уйдет больше времени, чем на обучение при помощи специализированных курсов. Причины тому очень просты: отсутствие ментора, который бы мог направлять вас в нужное русло, давать советы и отвечать на вопросы; отсутствие предельно четкого понимания о знаниях и умениях, которыми необходимо обладать, чтобы в будущем занять соответствующую должность; отсутствие четкой программы обучения, которая покроет весь необходимый профильный материал; отсутствие стимула и достаточной мотивации, которые обычно присутствуют в коллективной среде (тренер, другие учащиеся, домашние задания и т. д.). Главная проблема самостоятельного обучения в силе воли, которая зачастую быстро испаряется и в итоге изучение ЯП сводится к нулю. А программирование вещь серьезная — на недельку-другую все забросил и вот ты уже ничего не помнишь. Так что самостоятельно обучаться программированию можно, главное — запастись упорством, терпением, силой воли и мощной мотивацией, которая должна постоянно подпитываться.   Миф 12. Программисты разбираются во всём, что связано с техникой Как вы поняли из вступления статьи, это тоже миф, причем один из самых распространенных. Разработчик мобильных приложений специализируется на создании программ под мобильные устройства. Он знает соответствующие ЯП и смежные технологии, которые позволяют ему выполнять свою работу качественно и без лишних затрат времени, однако, с какой стати этот специалист должен уметь чинить телевизоры и устанавливать Windows? Или, например, человек увлекается программированием микроконтроллеров. Почему он должен уметь создавать веб-сайты, если это абсолютно другая отрасль в IT? Вы же не требуете от педиатра вылечить вам зуб, а от стоматолога — избавить вас от кашля? Хотя и тот и тот специалист — врач. Каждый является специалистом в своей области и не следует это забывать. Сюда же относится и миф о хакерах, согласно которому программисты приравниваются к людям этого рода деятельности. Опять-таки, сторонники данной теории слишком плохо знают IT-сферу, поэтому все равняют под одну гребенку. То, что человек разбирается в определенном ЯП и смежных технологиях не делает его хакером. Хакерство — это специфический род деятельности, который предусматривает достаточно глубокие знания компьютерных сетей, операционных систем, социальной инженерии, криптографии и множества других IT-ответвлений. Если хотите узнать больше подробностей, не пожалейте своего времени — совершите поиск по специализированным ресурсам и тогда сможете расставить все точки над “i“ — кто кем является и какой спектр знаний-умений какому IT-специалисту свойственен.     Миф 13. Программирование — мужское занятие Безусловно, мужчин в программировании больше, чем женщин. По данным исследования Stack Overflow Developer Survey 2020, женщин среди разработчиков 8%. В Украине процент женщин в IT в 2020 году достиг уровня 25%, согласно исследованиям DOU.ua. Однако, это связано, скорее, с определенными социальными и психологическими явлениями. Дело в том, что женщины по своей природе более “социальны”, чем представители мужского пола. Соответственно, они чаще выбирают те сферы занятости, которые предусматривают общение и социум. В то же время парни и мужчины увлечены преимущественно техническими науками, поскольку достаточно распространенная среди них интровертивность позволяет посвятить необходимое количество времени цифрам, формулам и вычислениям. Плюс детская любовь к конструкторам, машинам, компьютерным играм и всему, что связано с техникой, с экспериментами. Ну и стереотипы, привитые обществом — куда же без них. Однако, это ни в коем случае не означает, что женщинам путь в программирование заказан. С каждым годом все больше и больше представительниц прекрасного пола покоряют IT в различных его секторах. Не ведитесь на предубеждения — программирование абсолютно открыто для всех полов, народов и возрастов.    Миф 14. Существует самый-самый лучший языка программирования Очень часто в интернете можно наткнутся на неутихающие дискуссии касательно того, какой ЯП лучше. Однако “лучшего” не существует. ЯП подбирается под задачу, а не задачи под ЯП. Если вы хотите максимально быстро развернуть свой сайт, лучше обратить внимание на Python и фреймворк Django. Хотите самостоятельно запрограммировать, допустим, сигнализацию с инфракрасным датчиком? Выбирайте C/C++ либо низкоуровневый Assembler. Те же С/С++ подойдут под разработку тяжеловесных игр, а для более простых идеальным выбором будет среда разработки Unity вместе с языком C#. FrontEnd разработка немыслима без языков верстки HTML & CSS, а также языка программирования JavaScript. Определитесь с тем, какая сфера разработки вам интересна и тогда выбирайте тот язык, который вам по душе.    Миф 15. Разработчики компьютерных игр — самые богатые и счастливые люди в IT Казалось бы: ты посвящаешь себя тому, о чем мечтал, наверное, каждый ребенок девяностых и нулевых — компьютерным играм. Ну что может быть прекраснее этого? Воплощаешь в жизнь все свои детские задумки: создаешь героев, работаешь над их характерами, занимаешься реализацией собственного геймплея, придумываешь уникальные квесты, сюжет не хуже “Игры престолов”, открытый и насыщенный игровой мир… Да вот только одна проблема — это так не работает; на деле все получается совсем иначе. Чтобы стать разработчиком игр, необходимо ими “гореть”, причем “гореть” так, чтобы ни время, ни вода, ни песок, ни отсутствие кислорода не смогли потушить ваше пламя. Во-первых, богатство гейм девелоперов преувеличено. Если игра “выстреливает”, либо вы работаете на плюс-минус солидную студию, то тогда можно говорить о деньгах. Однако, приличное количество разработчиков занимаются инди-играми, то есть, разрабатывают игры без финансирования крупных компаний (в одиночку, либо небольшими группами энтузиастов). Естественно, пока вы работаете над своим продуктом, единственным источником внешних доходов могут быть лишь пожертвования (донаты) от потенциальной аудитории, которая заинтересована в вашем творении. Также, важно знать, что разрабатывать игры и играть в них — две абсолютно разные вещи. Игростроение — сам по себе трудоемкий и комплексный процесс, который сильно отличается от того, что мы себе воображали в детстве.   Подробнее о пути гейм-мейкеров вы можете прочесть в нашей статье “Как стать разработчиком игр”. В ней мы постарались собрать максимальное количество информации с отечественных и зарубежных информационных ресурсов, чтобы подать вам все самое вкусное в одном компактном виде.      Миф 16. Начинающим айтишникам устроится на работу невозможно Действительно, если брать на рассмотрение популярные направления в IT, то конкуренция достаточно большая. И это на фоне растущих с каждым годом требований от работодателей. Однако, это не означает, что IT-отрасль закрыла свои двери перед новичками. Как раз таки наоборот. Сегодня функционирует множество программ стажировок от известных компаний, занимающихся созданием программного обеспечения. Например, EPAM, GlobalLogic, SoftServe и другие открывают вакантные места для тех, кто хорошо знает предметную область, но не имеет опыта работы. Конечно, необходимо будет пройти тестирование и/или собеседование, однако, это уже упрощает процесс внедрения в рабочую среду желанной IT-секции.      Миф 17. Пойду в ВУЗ, там меня научат программированию В ВУЗе не обучают программированию в соответствии с теми требованиями и ожиданиями, которые предъявляют к соискателям IT компании. Хоть вам и будут преподавать алгоритмы и различные ЯП, но нагрузка в вузе будет настолько объемной и пёстрой, что вы физически не сможете нормально научиться программировать. Все равно вы будете вынуждены самостоятельно учить/доучивать тот или иной язык. Если бы вы поступали на факультет, допустим, прикладной математики, вы бы туда шли с сильными знаниями по математике, правда? Так же само и с айтишными факультетами: если вы туда идете, у вас УЖЕ должен быть опыт программирования на любом ЯП. Иначе вам будет очень тяжело и мучительно больно.   Миф 18. Программирование имеет возрастные ограничения Языки программирования, как и любые иностранные языки, вы можете начать изучать в любом возрасте. Возрастные рамки отсутствуют. Самое главное — это ваше желание учиться, развиваться и познавать. Как показывает практика, уже с 8-9 лет дети способны понимать основные концепции ЯП и успешно создавать собственные программы. Если говорить об относительно великовозрастных людях, с ними работает то же правило — никогда не поздно учиться и узнавать нечто новое. Более того, активная мозговая деятельность (как такая, которая происходит в процессе программирования) является отличной профилактикой многих заболеваний мозга, связанных со старением. Так что программирование и юных развивает, и взрослых прокачивает + помогает держать в тонусе свои мысли. Однако, при трудоустройстве возрастные ограничения могут иметь место. Это зависит от политики компании, которая ищет специалиста.   Миф 19. Программист — вымирающая профессия: роботы заменят этих специалистов Очень распространенное мнение, имеющее право на жизнь. С одной стороны, все верно: программ становится все больше и больше, а значит, потребность в программистах должна потихоньку отпадать (ведь скоро будет нечего программировать!); при этом активно развивается искусственный интеллект, способный перенимать определенные функции человека, включая написание кода, на себя. Поговорим о первом тезисе. Вроде бы все логично, но есть одно НО. Рассмотренная выше мысль будет абсолютно верна в том случае, когда мы говорим об информационных технологиях, как об области, которая находится в некоем вакууме, причем вакуум этот ограничен, то есть, имеет свой “потолок”, выше которого не прыгнешь. Наш же мир не является ограниченным, по крайней мере, человечество еще не смогло определить его грани. Да, человеческие возможности упираются в определенные физические ограничения (невозможно поднять руками или ногами самолет, самостоятельно прыгнуть на высоту 5 метров, проглотить целиком кокос и т. д.), однако в нашем мозгу пока что не было замечено четких ограничений. Более того, с его помощью мы научились обходить естественные физические преграды: придумали и реализовали специальный транспорт, который может перевозить тяжелые объекты; изобрели джамперы, джетпаки (реактивные ранцы) для совершения высоких прыжков и полетов в воздух на относительно небольшие высоты; специальные предметы для разделывания экзотических фруктов и т. п. Пока что ученые не смогли выжать максимум из нашего мозга и разглядеть границы нашего сознания. Если сложить вместе безграничность наших мыслей и безграничность мира, можно прийти к выводу, что любая сфера нашей жизни поддается совершенствованию и всегда есть, куда дальше двигаться. Все области нашей жизнедеятельности неразрывно связаны между собой, хотим мы того или нет. Особенно сфера IT — сейчас она находит свое отображение везде: музыка; киноиндустрия; компьютерные игры; банковская сфера; транспортная инфраструктура; сфера безопасности (физическая и кибербезопасность); СМИ; медицина; аграрная отрасль; все, что связано с космическими разработками; научные исследования любых направлений; сфера образования... Так можно продолжать, пока не будут перечислены все отрасли человеческой деятельности. Давайте обратимся к сухим фактам и посмотрим на то, как “умерли” некоторые профессии в результате их совершенствования: человечество уже научилось создавать искусственные фрукты и овощи, но фермеры никуда не пропали; более того — некоторые страны имеют острую нехватку профессионалов в аграрном деле; существуют дистанционно управляемые боевые машины, дроны и другие приспособления для ведения боевых действий, но никто не говорит о роспуске армейских подразделений; набор призывников и добровольцев продолжается и приветствуется во всех странах; в супермаркетах появились терминалы самообслуживания, однако продавцов никто не уволил; посмотрите вакансии на данную должность — их пруд пруди; пассажирские самолеты обустроены очень надежными и серьезными компьютерными системами, которые выполняют много работы за человека и даже имеют функцию автопилота, но никто не спешит увольнять самих пилотов; более того, в мире острая нехватка данных специалистов, а их зарплаты считаются одними из самых высоких в мире; такая же ситуация и с поездами — сегодня не надо кидать уголь в печь и разгонять поезд (как в XIX веке), но водители поездов никуда не испарились; беспилотные автомобили уже разъезжают по улицам некоторых городов, однако водители государственных и коммерческих предприятий тоже никуда не делись, вакансии пестрят предложениями для водителей; множество других примеров. Примерно та же ситуация и у программистов. Правда, сфера IT настолько многогранна, что профессии в результате развития данной области будут просто эволюционировать. Например, веб-мастер двухтысячных стал современным FullStack девелопером, а само направление сайтостроения поделилось на два лагеря — FrontEnd и BackEnd. На границе программирования и системного администрирования образовалась DevOps инженерия. IT-специальности будут попросту перерождаться и образовывать новый виток с новыми должностями. Для осознания системности нашего мира советуем прочесть книгу “Введение в системный анализ” (Ф. И. Перегудов, Ф. П. Тарасенко). Прекрасный труд, который очень хорошо демонстрирует взаимосвязанность всего, что нас окружает. Воспитывает системное мышление и заставляет смотреть на вещи более адекватно и трезво, находить логические связи между всевозможными событиями и процессами в нашем мире.  Поговорим о втором тезисе. Он касается искусственного интеллекта (ИИ). Сюда же добавим системы генерации кода, существующие в наше время. К примеру, взглянем на сервисы, которые позволяют создавать собственные сайты без знания IT технологий. Действительно, сегодня существуют подобные системы, использование которых исключает необходимость владения языками верстки и программирования, однако они предоставляют достаточно шаблонные решения. В них вы не сможете воплотить все свои задумки — это сможет сделать только живой специалист. Системы генерации кода хорошо справляются с типичными задачами, однако в реальных ситуациях, где не всегда всё просто и зачастую необходимо импровизировать, сохраняя при этом код “в чистоте”, они бессильны. Возвращаясь к разработчикам сайтов: верстальщики, FrontEnd и BackEnd разработчики не исчезли и спрос на них является одним из самых высоких среди направлений в IT. ИИ уже давно разрабатывается и ученые демонстрируют потрясающие результаты: системы, которые обыгрывают шахматных гроссмейстеров и легенд покера, робот София, системы по распознаванию образов и т. д. Однако, какого-то обвала рынка программистов не последовало, массовые увольнения специалистов замечены также не были. Все спокойно.  Посетите, например, такие ресурсы по поиску работы, как https://jobs.dou.ua/, grc.ua,  hh.ru — вакансий для сайтостроителей много, равно как и для других айтишных специальностей. Не похоже на упадок эпохи программирования. Несмотря на то, что сфера IT и без того находится на пике популярности, она испытывает дефицит рабочих кадров. Так что вы сможете прекрасно себя реализовывать в IT еще несколько десятилетий как минимум. Главное — следите за тенденциями в IT и ловите попутный ветер.   Итоги Большинство мифов, касающихся IT, рождены обыкновенным незнанием предметной области и изрядной долей ложных предубеждений. Сегодня мы постарались разрушить некоторую часть из них и показать вам, что программирование — не башня из слоновой кости, а вполне реальная и податливая сфера человеческой деятельности, в которой кипит жизнь и которая нуждается в пополнении своих рядов. Не бойтесь делать шаги навстречу программированию. Разрушайте стены незнаний и непониманий. Если вы в чем-то неуверенны,  интересуйтесь у знакомых-программистов, пишите на форумах, спрашивайте на стримах. Все зависит только от вас!   Желаем вам всевозможных успехов и профессиональных свершений! Оставайтесь с ITVDN!
Notification success