Результати пошуку за запитом: Обучение c
Заменит ли искусственный интеллект разработчиков?
Автор: Влад Сверчков
Что такое ИИ?
Определение и типы
Использование ИИ в IT
Нейронные сети
Человеческий мозг vs Искусственный интеллект
Украинский рынок IT после бума AI
Стоит ли бояться разработчикам: что думает об этом сам искусственный интеллект?
Будущее сотрудничества ИИ и человека
Выводы
Современный технологический ландшафт меняется с невероятной скоростью, и искусственный интеллект (ИИ, AI) сегодня является одним из его Эверестов. Он уже помогает нам в автоматизации различных задач и процессов: упрощает написание текстов и программного кода, генерирует изображения и видеоряды, консультирует нас по различным вопросам, помогает учить иностранные языки.
Как известно, большинство гор возникают на месте столкновений тектонических плит в сопровождении землетрясений – похожий процесс имеем и с активным развитием ИИ. Человечество разделилось на два больших лагеря: первые восторженно наблюдают за процессом образования технологических Гималаев, а вторые предсказывают ряд катастроф – одной из самых страшных указывают возможную безработицу, особенно среди разработчиков.
ITVDN – это образовательная онлайн платформа, которая позволяет изучать программирование и IT, поэтому мы не могли пройти мимо темы перспективности профессии разработчика. Предлагаем окунуться в неё и вместе разобраться, чья литосферная плита будет сверху и кто возьмёт гору в этой борьбе: программисты или искусственный интеллект?
Что такое ИИ?
Определение и типы
Искусственный интеллект означает способность машин имитировать человеческие когнитивные функции, такие как обучение, решение проблем и принятие решений. Он охватывает широкий спектр технологий и приложений, позволяющих машинам выполнять задачи, которые обычно требуют человеческого интеллекта, например визуальное восприятие, распознавание речи, принятие решений и языковой перевод.
Согласно видеоролику "The 7 Types of AI" с официального YouTube-канала IBM Technology (IBM – один из крупнейших в мире провайдеров IT-инфраструктуры, ПО и консультационных услуг), AI имеет по меньшей мере 7 типов, но реализацию имеют только три из них.
Название
Краткое описание
Artificial Narrow Intelligence или узкий AI (слабый AI)
Предназначен для выполнения конкретной задачи или узкого круга задач. Среди примеров – современные сервисы Alexa, Siri, Cortana и др.
Artificial General Intelligence или общий AI (сильный AI)
Способен понимать, обучаться и применять знания в широком спектре задач – подобно человеку. Этот уровень ИИ всё ещё остается в основном теоретическим и пока существует разве что в научной фантастике.
Artificial Super Intelligence или искусственный суперинтеллект
Гипотетический уровень ИИ, превосходящий человеческий интеллект во всех отношениях и способный превзойти лучшие человеческие умы в каждой отрасли.
Reactive Machines или реактивные машины
Искусственный интеллект простейшего типа, не имеет способности формировать память или использовать прошлый опыт для принятия обоснованных решений. Работает исключительно на основе текущих данных и не учитывает контекст. Как пример – Deep Blue от IBM, который может играть в шахматы на уровне гроссмейстера и просчитывать все возможные сценарии.
Limited memory или ограниченная память
В отличие от реактивных машин, ИИ с ограниченной памятью может обращаться к прошлому опыту для принятия решений. Он может хранить и вспоминать предыдущие данные, что позволяет ему адаптироваться к ситуации и соответствующим образом реагировать. Примеры: самоуправляемые автомобили, системы рекомендаций, спам-фильтры, чат-боты, устройства умного дома и т. д.
Theory of Mind или теория разума
Главная цель – понять и предсказать поведение, эмоции, ощущения человека, чтобы потом предоставить персонализированные услуги. Этот тип ИИ учитывает, что люди имеют разные убеждения, желания и перспективы. Сейчас Theory of Mind находится на стадии исследований и разработок
Self-aware AI или самосознательный ИИ
Самый "страшный" вид искусственного интеллекта, будущее ИИ, которое ему так пророчат. Обладает сознанием и чувством собственного достоинства. Он понимает собственное существование, эмоции и процессы мышления, имеет собственные потребности. Однако достижение самосознания искусственных систем всё ещё лежит в сугубо теоретической плоскости.
Reactive Machines и Limited memory относятся к Narrow AI, Theory of Mind – к General AI, а Self-aware – к суперинтеллекту.
Использование ИИ в IT
В 2024 году искусственный интеллект продолжает стремительно трансформировать различные сферы IT – вот несколько примеров:
1. Кибербезопасность
"Умные" системы анализируют огромные потоки данных для проактивного выявления уязвимостей, угроз и их минимизации, изучают модели поведения пользователей и маркируют подозрительные действия, анализируют финансовые транзакции, помогают в создании отчетов и т. д.
2. DevOps и облачные вычисления
ИИ автоматизирует такие задачи, как выделение ресурсов, управление конфигурацией и масштабированием, анализирует данные о производительности системы и предлагает оптимизацию для использования ресурсов и сокращения расходов. Также системы с интеллектом автоматически обнаруживают и устраняют проблемы в облачной инфраструктуре, повышая отказоустойчивость и время безотказной работы системы.
3. Разработка программного обеспечения
Технологические инновации в области AI позволяют генерировать, рефакторить и объяснять код для разработчиков, выявлять потенциальные ошибки, автоматизировать процессы тестирования, ускоряя разработку, автоматически дополнять код в реальном времени и т. д.
4. Тестирование и обеспечение качества
Инструменты тестирования на основе ИИ способны проводить анализ кода, выявлять уязвимости, изучать результаты предыдущих тестов, автоматически генерировать тест-кейсы и т. д.
5. Управление данными и аналитика
Автоматизация задач по обработке данных, выявление и исправление ошибок, подготовка данных к анализу, интеллектуальный анализ данных, генерирование отчетов и презентаций, выявление скрытых закономерностей, прогнозирование будущих тенденций и результатов, ассистенция при стратегическом планировании и распределении ресурсов – и это только общие точки, в которых искусственный интеллект влияет на домены Big Data, Data Science и прочие.
6. Управление сетью
Машинный интеллект обнаруживает необычные шаблоны сетевого трафика, чтобы предотвратить кибератаки и/или перебои в работе сети. Также он анализирует сетевые данные и автоматически настраивает конфигурации для оптимальной производительности и использования ресурсов, прогнозирует тенденции сетевого трафика и динамически распределяет ресурсы, чтобы обеспечить бесперебойную работу и избежать появления узких мест (так называемых "bottlenecks").
7. Управление IT-сервисами (ITSM)
Человеко-машинное взаимодействие с привлечением ботов на основе ИИ способствует автоматизации рутинных задач вроде сброса паролей и решения инцидентов, уменьшая нагрузку на службу поддержки и повышая её эффективность. Также эти системы анализируют данные IT-инфраструктуры, чтобы прогнозировать потенциальные сбои, принимать превентивные меры, минимизировать время простоя, диагностировать первопричины проблем и предлагать решения, оптимизируя процессы устранения неисправностей.
И это только часть тех сфер, где искусственный интеллект уже используется и активно развивается. К ним можно добавить:
IT-менеджмент;
интернет вещей (IoT) и робототехника в целом (как гражданская, так и военная);
разработки на основе NLP: виртуальные ассистенты, чат-боты, интерфейсы, активируемые голосом;
электронная коммерция: рекомендательные, аналитические системы;
виртуальная реальность, компьютерные игры и т. д.
Получается, под угрозой "вымирания" не только разработка, но и другие IT-отрасли.
Нейронные сети
Нейронная сеть – важный фундамент в понимании искусственного интеллекта. Хотя это популярный и эффективный метод построения искусственных систем, существуют и другие методы, например системы на основе правил, деревья решений, генетические алгоритмы, машины опорных векторов и тому подобное. Эти методы часто используют в сочетании с нейросетями для создания более сложных интеллектуальных систем.
Так каким образом нейронки связаны с умными машинами?
Нейронные сети составляют костяк алгоритмов глубокого обучения (Deep Learning, DL), глубокое обучение является подмножеством машинного обучения (Machine Learning, ML), а машинное составляет подмножество AI. Кроме ML искусственные системы могут включать в себя обработку естественного языка (NLP), компьютерное зрение, движение, озвучивание текста и тому подобное. Картинка выше визуализирует эти моменты для лучшего понимания.
Если примеры AI привести достаточно просто (ChatGPT, Midjourney, GitHub Copilot и т. д.), то где в жизни мы напрямую сталкивались с остальными тремя составляющими? Вот некоторые из них:
нейросеть может хорошо распознавать голос, объекты на изображениях и видео и тому подобное;
Google Translate – яркий пример DL;
когда вы зашли в интернет-магазин, посмотрели что-то, а затем получили предложения с товарами, которые "могут вам понравиться" – постаралось машинное обучение.
По своему строению искусственные нейронные сети очень напоминают те, что находятся в нашем мозге, но на самом деле даже один человеческий нейрон больше напоминает гигантскую нейросеть.
Из чего состоит типичная нейронная сеть:
На картинке изображена глубокая нейросеть – это сеть, которая имеет более трех скрытых слоев (hidden layers), включая входной (input) и выходной (output). Если слоев всего 3, имеем дело с простейшей нейросетью. Кстати, картинку выше можно рассматривать как алгоритм глубокого обучения.
Со схематическим изображением познакомились, а теперь нас интересует работа нейронной сети.
Каждый слой нейросети состоит из узлов – искусственных нейронов. Каждый узел соединен с нейронами следующего слоя, причем каждый имеет свой вес и порог. На вход узла поступает определенное значение, которое подвергается воздействию веса, и если затем это значение превышает порог, данный узел "активируется" с помощью активационной функции, и результирующие данные направляются в следующий слой сети. Если исходное значение узла ниже порога, в следующий узел оно не попадает.
Данные обучения (training data) помогают обучать нейронную сеть и улучшать её точность с течением времени. Когда алгоритмы обучения качественно настроены, они становятся прочным фундаментом ИИ, поскольку могут очень быстро классифицировать и кластеризовать данные – это позволяет существенно ускорить различные операции. Классификация нейронных сетей с примерами реализации здесь приводиться не будет, но отметим поисковый алгоритм Google – это, наверное, самая известная реализация нейронки; именно благодаря ей поисковик столь быстр и эффективен.
Человеческий мозг vs Искусственный интеллект
Преимущества мозга
Главный командный центр человека имеет ряд сильных сторон, которым пока уступают умные системы:
Креативность и адаптивность. Мозг прекрасно генерирует новые идеи, решает проблемы нестандартными способами и адаптируется к непредсказуемым ситуациям, в то время как ИИ и творчество – пара, требующая отработки многих "па".
Мощный интеллектуальный спектр. Под властью наших полушарий находятся сложные рассуждения, абстрагирование, эмоциональный интеллект и тому подобное.
Когнитивная гибкость и интуиция. Люди могут переносить опыт из других сфер жизни для адаптации к новым условиям и развязывания новых проблем, с которыми они не сталкивались, принимать суждения и решения на основе неполной информации и интуиции, с чем нейросети имеют проблемы.
Устойчивость к "шуму" входных данных. Человеческий мозг легко проходит мимо искажений или небольших возмущений во входных данных, которые в умных системах могут привести к значительным ошибкам или неправильным классификациям.
Эмоции и этичность. Этика в ИИ недостаточно развита: компьютеры не настолько хорошо работают с человеческими эмоциями, эмпатией и моральными нормами, в то время как для человека эти вещи являются фундаментально важными и определяющими в принятии решений.
Eco-friendly 💚 Человеческий мозг потребляет до 20 Вт, что делает нас значительно энергоэффективнее искусственных технологий, которые потребляют большие объемы электроэнергии (особенно на этапе обучения) и не могут существовать без питания.
Преимущества искусственного интеллекта
Наши цифровые визави также имеют чем похвастаться:
Скорость, объемность и эффективность. Машинное обучение позволяет обрабатывать огромные объемы данных, быстро анализировать, делать выводы и выполнять конкретные задачи в разы быстрее человека.
Распознавание и анализ шаблонов. Искусственные нейронные сети превосходно распознают закономерности и сложные взаимосвязи в данных, помогая в таких задачах, как распознавание изображений, перевод текстов и т. д.
Масштабируемость и автоматизация. Системы искусственного интеллекта можно масштабировать и автоматизировать, что позволяет им оперативно справляться с большими рабочими нагрузками и репетативными задачами.
Настройка и оптимизация. Алгоритмы ИИ можно обучать и совершенствовать под конкретные задачи, достигая высокого уровня точности и результативности.
Доступность 24/7. Системы AI могут работать круглосуточно, обеспечивая бесперебойное обслуживание, например постоянный мониторинг состояния инфраструктуры, видеонаблюдение, регулирование температуры в помещении и т. д.
Отсутствие некоторых человеческих недостатков. Искусственный интеллект не может забыть о задаче, разлениться, проспать, заболеть, иметь похмелье, испугаться, быть не в настроении или просто не любить вас. Конечно, никто не застрахован от обрыва питания, хакерских атак, проблем с программно-аппаратной начинкой и т. д., но в плане работоспособности, доступности и надежности компьютерные системы значительно лучше себя проявляют, чем человек.
Снижение рисков. ИИ можно применять в условиях повышенного риска и опасности. Например, роботы с искусственным интеллектом могут выполнять опасные задания на производстве, участвовать в поисково-спасательных миссиях и при ликвидации последствий стихийных бедствий, минимизируя угрозу для людей.
Украинский рынок IT после бума AI
Каким разработчики видят будущее ИИ?
Ещё в 2017 году исследователи из Oak Ridge National Laboratory – американской лаборатории, которая занимается научной деятельностью и финансируется Министерством энергетики США – опубликовали статью, в которой предполагают, что к 2040 году большинство программного кода будут писать именно машины, и это радикально повлияет на создание ПО как таковое.
А совсем недавно – 12-14 февраля 2024 года – на Всемирном правительственном саммите в Дубае обсуждался искусственный интеллект, и CEO компании NVIDIA Дженсен Хуанг сказал, что если последние 10-15 лет советовали учить программирование и компьютерные науки, то сейчас эти советы неактуальны, ведь ИИ превращает каждого человека в программиста и дает возможность прокачать свои навыки и существенно повысить производительность в других востребованных сферах, например в цифровой биологии, обучении, производстве, фермерстве и тому подобное.
Также он добавил, что если бы мог начать всё с начала, то фокусировался бы на таком направлении, как наука о жизни (бионаука, цифровая биология, биоинженерия), поскольку это важнейшая комплексная отрасль, развитие которой в сочетании с мощностью ИИ позволит оптимизировать многие процессы, в том числе связанные с устойчивым развитием.
Современные технологические инновации позволяют активно использовать AI решения, хоть и без идеального результата. Давайте посмотрим, как изменился ландшафт украинского IT-рынка после "бума" ChatGPT и появления других "искусственных" игроков.
А сделаем мы это с помощью аналитики от DOU – сообщества украинских разработчиков. Точкой отсчета возьмем февраль 2023 года, когда "чат" стал официально доступным в Украине и исчезли блэкауты.
В этом году в феврале опубликована аналитика, согласно которой количество вакансий на DOU по состоянию на январь 2024 года составляет 5057. В феврале 2023 года эта цифра составляла 3489, то есть прирост на уровне 45%. Помним, что на прошлогоднюю статистику могли повлиять блэкауты, но в том же феврале энергетическая ситуация начала значительно улучшаться.
Сравним количество технических вакансий в феврале 2023 и в январе 2024 года:
Направление
Февраль 2023
Январь 2024
Java
138
119
QA
177
236
.NET
112
149
Front End
196
214
Android
44
36
Python
115
178
Node.js
107
153
PHP
141
177
DevOps
160
166
AI/ML
11
40
Big Data
19
18
Data Engineer
22
63
Data Science
29
58
React Native
25
33
Ruby
19
23
iOS/macOS
40
43
Как видим, в подавляющем большинстве направлений количество вакансий возросло после того, как искусственный интеллект вышел на глобальный рынок, а в других наблюдаем несущественное уменьшение.
Какова ситуация на рынке начинающих (0-3 года опыта)?
Во всех трёх категориях имеем заметный рост.
Что думает об этом сам искусственный интеллект?
Давайте послушаем аргументы ИИ относительно того, смогут ли нейросети заменить разработчиков и занять их место.
ChatGPT
Ответ ChatGPT версии 3.5:
"Разработчики программного обеспечения незаменимы благодаря ряду преимуществ:
Творческое решение проблем: разработчики применяют креативное мышление для решения сложных проблем, предлагая уникальные и эффективные решения.
Навыки критического мышления: они преуспевают в разбиении сложных проблем, их анализе и разработке эффективных решений.
Адаптивность и обучаемость: разработчики идут в ногу со временем, быстро адаптируясь к новым технологиям и изучая новые языки программирования, что позволяет им оставаться конкурентоспособными в постоянно меняющейся среде разработки ПО.
Сотрудничество и коммуникация: эффективное сотрудничество и коммуникация позволяют разработчикам гармонично сотрудничать с межфункциональными командами, включая дизайнеров, Product менеджеров и тестировщиков.
Этические соображения: разработчики должны учитывать этические аспекты в своей работе, обеспечивая соответствие своих творений общественным ценностям и нормам.
По сути, хотя ИИ может провести интеллектуальный анализ данных и автоматизировать определенные задачи, уникальное сочетание креативности, критического мышления, адаптивности, сотрудничества и этических соображений разработчиков остается незаменимым для грамотного выполнения таких задач, как программирование и других процессов разработки ПО".
Gemini (Bard)
"Хотя я, Бард, большая языковая модель, обладаю впечатляющими возможностями в понимании и генерации текста, полностью заменить разработчиков – это слишком, по крайней мере, пока. Вот почему:
Творчество и решение проблем. Хотя я могу писать строки кода как программисты, настоящие инновации возникают благодаря способности человеческого разума представлять уникальные решения, выходящие за рамки устоявшихся шаблонов.
Глубокая экспертиза в отрасли. Хотя я имею доступ к огромному количеству информации и могу ее обрабатывать, глубокое понимание и контекст, который разработчики приобретают благодаря многолетнему опыту работы в конкретных областях, являются незаменимыми.
Человеческие суждения и этика в ИИ. Разработчики привносят в работу бесценные человеческие суждения и этические соображения, гарантируя, что их творения соответствуют принципам ответственного использования. Ориентирование в этических дилеммах остается за пределами современного ИИ.
Коммуникация и сотрудничество. Разработка ПО процветает благодаря командной работе и эффективной коммуникации. Хотя я могу обрабатывать информацию и реагировать на неё, мне не хватает навыков эффективного сотрудничества с различными командами, генерирования идей и ориентации в сложностях человеческого взаимодействия.
Адаптивность и способность к обучению. Технологические инновации носят достаточно динамичный характер, а разработчики умеют постоянно учиться и осваивать новые технологии. Хотя я тоже это могу, я ограничен в своих параметрах, и моя способность к обучению уступает людям-разработчикам.
Будущее сотрудничество, а не замена.
Я представляю себе будущее, в котором машинный разум расширяет возможности разработчиков, служа мощным инструментом для решения повторяющихся задач: автоматизация кода, предложения по его улучшению и расширению, другие возможности для решения проблем. Это сотрудничество откроет путь к большим инновациям и эффективности в сфере разработки ПО".
Perplexity
Ответ большой языковой модели – разговорного поисковика от Perplexity AI:
"Влияние искусственного интеллекта на разработку ПО, безусловно, является трансформационным, но он не может заменить уникальный человеческий подход, который стимулирует инновации и творчество. Искусственный интеллект прекрасно справляется с автоматизацией повторяющихся задач, улучшает качество кода и предлагает оптимизации. Однако ему не хватает способности мыслить нестандартно, представлять новые концепции или понимать нюансы сложных систем.
Ограничения умных систем заключаются в их неспособности к настоящему творчеству, которое является отличительной чертой разработчиков-людей. Они учатся на имеющихся данных, и хотя могут генерировать код на основе шаблонов, но не могут внедрять инновации или создавать что-то совершенно новое.
В обозримом будущем программисты будут дополнены, а не заменены на ИИ. Он поможет им сосредоточиться на более сложных задачах, повысить эффективность и уменьшить количество ошибок. По мере развития интеллектуальных машин разработчикам нужно будет адаптироваться и овладевать новыми навыками, чтобы работать вместе с этими мощными инструментами.
Будущее разработки ПО – это человеко-машинное взаимодействие, симбиоз человека и AI, где второй расширяет человеческие возможности, а разработчики-люди продолжают стимулировать инновации".
А доверять этим ответам или нет – решайте сами, уважаемые читатели. Возможно, искусственный интеллект уже сейчас скрывает от нас какие-то планы и специально усыпляет наше внимание, чтобы в самый удачный момент сделать из нас что-то вроде сервисного персонала или домашних любимцев?
Будущее сотрудничества ИИ и человека
Современное человеко-машинное взаимодействие предстает в виде эффективной кооперации, упрощающей рутинные задачи и оптимизирующей многие процессы, связанные с IT, начиная с интерпретации, генерации и рефакторинга кода и заканчивая полноценными AI инструментами под каждую специальность.
Трудно спрогнозировать точный уровень угрозы искусственных систем айтишным профессиям в будущем, но сейчас это полезный инструмент, который программисты должны изучать, чтобы с легкостью обходить рутину и больше времени уделять действительно важным процессам.
Иными словами, современные ИИ – это наши помощники, и в ближайшем будущем они не заменят нас, а органично дополнят и переформатируют наши роли. Но кто знает, как будет в более далекой перспективе.
Вполне вероятно, что позиции разработчиков уровня Intern-Junior будут претерпевать наибольшие видоизменения, поскольку работа нейронной сети довольно неплохо заточена под генерирование кода для несложных задач. Но не забываем, что результат их работы всё ещё далёк от идеала.
Выводы
Так заменит ли искусственный интеллект разработчиков?
Выше мы проанализировали ситуацию на украинском рынке IT, и на данный момент намёков на то, что программисты останутся без работы, нет. Искусственные системы пока что занимают роли ассистентов и упрощают рутинную и/или времязатратную работу: написать кусок кода или часть документации, напомнить функционал определенного метода, дать совет или объяснить код, провести его рефакторинг и т. д.
Наиболее правильный шаг в данных условиях – изучать AI. Даже если некоторые профессии начнут исчезать, то опытные специалисты, умеющие делегировать рутину нейронкам и разрабатывать комплексные решения, точно не останутся в стороне. Поэтому фокусируйтесь на сложных и креативных решениях, которые нейросеть не осилит, масштабируйте знания и навыки, получайте уникальный опыт, всегда следите за новостями мира ИИ, а также будьте открыты к новым технологиям и умениям.
Желаем вам успехов в разработке и изучении AI инструментов! Ваши мысли о будущем искусственного интеллекта и его влиянии на разработчиков пишите в комментариях
Що таке Universal Windows Platform (UWP)?
Автор: Редакция ITVDN
Универсальная платформа Windows (UWP) – это специальная платформа для создания приложений на Windows 10. Вы можете разрабатывать приложения для UWP с помощью всего одного набора API, одного пакета приложений и одного магазина для доступа ко всем устройствам Windows 10 – ПК, планшета, телефона, Xbox, HoloLens, Surface Hub и других. Легче поддерживать несколько размеров экрана, а также различные модели взаимодействия, будь то сенсор, мышь и клавиатура, игровой контроллер или ручка. В основе приложений UWP лежит идея, что пользователи хотят, чтобы их работа, их задачи были мобильными через ВСЕ устройства, чтобы можно было использовать любое устройство, наиболее удобное или производительное для конкретной задачи.
UWP является гибким: вам не нужно использовать C# и XAML, если вы этого не хотите. Вам нравится развиваться в Unity или MonoGame? Предпочитаете JavaScript? Не проблема, используйте все, что хотите. У вас есть настольное приложение C++, которое вы хотите расширить с помощью функций UWP и продавать в магазине? И тут все будет работать.
В итоге вы можете потратить свое время на работу со знакомыми языками программирования, фреймворками и API-интерфейсами, все в одном проекте, и иметь тот же самый код, который работает на огромном диапазоне оборудования Windows из существующих сегодня. После того, как вы написали свое приложение UWP, вы можете опубликовать его в магазине на обозрение всего мира.
Итак, что такое UWP-приложение?
Что делает приложение UWP особенным? Вот некоторые из характеристик, которые отличают приложения UWP в Windows 10.
Существует общая среда API для всех устройств
Основа API-интерфейсов универсальной платформы Windows (UWP) одинакова для всех классов устройства Windows. Если ваше приложение использует только основные API-интерфейсы, оно будет запускаться на любом устройстве Windows 10, независимо от того, планируете ли вы использование настольного ПК, гарнитуры Xbox или наушников Mixed Reality.
Расширение SDK позволяет вашему приложению делать классные вещи на определенных типах устройств
Расширение SDK добавляет специализированные API для каждого класса устройства. Например, если ваше приложение UWP нацелено на HoloLens, вы можете добавить функции HoloLens в дополнение к обычным API-интерфейсам UWP. Если вы используете универсальные API-интерфейсы, ваш пакет приложений может работать на всех устройствах, работающих под управлением Windows 10. Но если вы хотите, чтобы ваше приложение UWP использовало API-интерфейсы устройства тогда, когда оно работает на определенном классе устройства, вы можете проверить, существует ли API до его вызова во время выполнения.
Приложения упакованы с использованием формата упаковки .AppX и распространяются из магазина
Все приложения UWP распространяются как пакет AppX. Это обеспечивает надежный механизм установки и гарантирует, что ваши приложения могут быть развернуты и обновлены без проблем.
Одно хранилище для всех устройств
После регистрации в качестве разработчика приложений вы можете отправить свое приложение в магазин и сделать его доступным для всех типов устройств или только тех, какие вы выберете. Вы загружаете и управляете всеми своими приложениями для устройств Windows в одном месте.
Приложения поддерживают адаптивные элементы управления и ввода
Элементы пользовательского интерфейса используют эффективные пиксели, поэтому они могут отображать макет в зависимости от количества пикселей экрана, доступных на устройстве. И они хорошо работают с несколькими типами ввода, такими как клавиатура, мышь, сенсорный экран, ручка и контроллеры Xbox One. Если вам нужно дополнительно адаптировать свой пользовательский интерфейс к определенному размеру экрана или устройству, новые панели макетов и инструменты помогут вам в этом.
Используйте язык, который вы уже знаете
Приложения UWP используют Windows Runtime, собственный API, встроенный в операционную систему. Этот API реализован на C++ и поддерживается на C#, Visual Basic, C++ и JavaScript. Некоторые варианты написания приложений в UWP включают:
XAML UI и C#, VB или C++ backend
DirectX UI и C++ backend
JavaScript и HTML
Microsoft Visual Studio 2017 предоставляет шаблон приложения UWP для каждого языка, который позволяет вам создать единый проект для всех устройств. Когда ваша работа будет завершена, вы можете создать пакет приложений и отправить его в Windows Store из Visual Studio, чтобы сделать ваше приложение доступным для клиентов на любом устройстве Windows 10.
Приложения UWP оживают в Windows
В Windows ваше приложение может предоставлять актуальную информацию в режиме реального времени вашим пользователям и заставлять их возвращаться снова. В современной экономике приложений ваше приложение должно участвовать в жизни ваших пользователей. Windows предоставляет вам множество ресурсов, чтобы помочь вашим пользователям вернуться в ваше приложение:
Живые фрагменты и экран блокировки отображают контекстно-зависимую и своевременную информацию.
Push-уведомления приносят сигналы в реальном времени, отправляя предупреждения вашему пользователю, когда это необходимо.
Центр действий – это место, где вы можете организовывать и отображать уведомления и контент, на которые пользователи должны обратить внимание.
Background - исполнение и триггеры оживляют ваше приложение, когда пользователю это нужно.
В вашем приложении могут использоваться голосовые и Bluetooth-устройства LE, чтобы помочь пользователям взаимодействовать с окружающим миром.
Поддержка богатых, цифровых чернил и инновационного набора.
Cortana добавляет индивидуальность вашему программному обеспечению.
XAML предоставляет вам инструменты для создания плавных анимированных пользовательских интерфейсов.
Наконец, вы можете использовать данные о роуминге и Windows Credential Locker, чтобы обеспечить постоянный роуминг на всех экранах Windows, где пользователи запускают ваше приложение. Данные о роуминге дают вам простой способ сохранить пользовательские настройки и настройки в облаке, не создавая собственную инфраструктуру синхронизации. И вы можете хранить учетные данные пользователя в хранилище учетных данных, где безопасность и надежность являются главным приоритетом.
Монетизируйте ваше приложение
В Windows вы можете выбрать, как вы будете монетизировать свои приложения на телефонах, планшетах, ПК и других устройствах. Вот несколько способов заработать деньги с помощью вашего приложения и услуг, которые оно предоставляет. Все, что вам нужно сделать, это выбрать то, что лучше подходит для вас:
Платная загрузка – это самый простой вариант. Просто назовите цену.
Система нескольких пробных попыток позволит пользователям оценить ваше приложение перед его покупкой. Это обеспечит более легкую конверсию, чем более традиционные варианты «freemium».
Используйте скидки для привлечения внимания к своим приложениям.
Также доступны покупки и реклама в приложении.
Как начать?
Более подробный обзор UWP читайте в официальном Руководстве по приложениям для универсальной платформы Windows. Затем ознакомьтесь с настройкой Get set up, чтобы загрузить инструменты, необходимые для начала создания приложений, и напишите свое первое приложение!
Источник.
Узагальнені класи С#
Автор: Редакция ITVDN
Введение
Обобщенные классы в С# представляют параметры типа. Они имеют 5 параметров. Обощенный класс становится частью обусловленного класса сам по себе. Класс типа Т приведен в примере ниже. Буква Т определяет тип, который в основном базируется на зоне абонента.
Запустите программу Visual Studio. Выберите тип проекта и строчку console application.
Шаг 1
Нажмите на ярлык файла -> Новое -> Программа.
Шаг 2
Выберите строчку Visual C# в левой части окна. Кликните Console Application в правом окне. Назовите программу «GenericClass». Задайте, где Вы хотите сохранить программу. Нажмите Ok.
Шаг 3
Введите следующий код в дополнение:
public class Myclass
{
public void Compareme(T v1, T v2)
{
if (v1.Equals(v2))
{
Console.Write("The value is matching");
}
else
{
Console.Write("The value is not matching");
}
}
}
class Program
{
static void Main(string[] args)
{
Myclass objmyint = new Myclass();
objmyint.Compareme("Amit", "Amit");
Console.ReadLine();
}
}
После введения кода, Вы получите такие исходные данные.
Измените строчку на что-либо другое, проверьте исходные данные. В примере создан второй строчный параметр «amit».
public class Myclass
{
public void Compareme(T v1, T v2)
{
if (v1.Equals(v2))
{
Console.Write("The value is matching");
}
else
{
Console.Write("The value is not matching");
}
}
}
class Program
{
static void Main(string[] args)
{
Myclass objmyint = new Myclass();
objmyint.Compareme("Amit", "amit");
Console.ReadLine();
}
}
Посмотрите на результат.
Источник: http://www.c-sharpcorner.com/UploadFile/d1028b/generic-class-in-C-Sharp/
Швидко вчимося рахувати у двійковій та шістнадцятковій системі
Автор: Костянтин Чорний
Вступ
Іноді виникає потреба швидко прочитати чи записати числа у двійковій чи шістнадцятковій системі числення, наприклад, працюючи з різними байтовими редакторами, під час розрахунків формул з побітовими операціями чи роботі з кольором. Часто в таких ситуаціях немає можливості довго переводити числа за допомогою формул або калькулятора. Про швидкі способи переходу між системами числення йтиметься у цій статті.
Перехід від десяткової системи до двійкової
Перший випадок – рахуємо від десяткової системи до двійкової. Основне, що потрібно пам'ятати в даному випадку – це ряд ступенів двійки (1, 2, 4, 8, 16, 32, 64, 128 і т. д.). Навіть якщо його ви не знаєте, то можна просто кожне наступне число множити на двійку. Оскільки молодші розряди йдуть праворуч, а старші – ліворуч, то їх записуватимемо у зворотному порядку справа наліво.
Для прикладу будемо переводити число 115. Далі дивимося, якщо значення розряду вміщується в число, то віднімаємо від нього це значення і ставимо в цьому розряді 1, інакше ставимо 0.
Зворотний переклад ще простіше – треба підсумувати всі значення розрядів, які відзначені одиничками: 64+32+16+2+1=115.
Перехід до шістнадцяткової системи
Тепер давайте розберемося із шістнадцятковою системою. Маючи на увазі те, що кількість чисел, які кодуються тетрадою (4 біти) і одним шістнадцятковим символом співпадають, відповідно кожен символ кодує одну двійкову тетраду.
В результаті одержали число 0х73. Головне пам'ятати, що А=10, B=11, C=12, D=13, E=14, F=15.
Якщо є потреба перевести десяткове число в шістнадцяткове або навпаки, то тут найпростіше спочатку буде перевести число в двійкове уявлення, а потім тільки в шістнадцяткове або десяткове відповідно.
У результаті ми навчилися швидко переводити числа з однієї системи числення до іншої. Головне, що потрібно пам'ятати – ступені двійки і вміти гарно додавати та віднімати. Детальніше про машинну математику ви можете дізнатись у другому уроці курсу C# Стартовий.
Попрактикуйтеся самостійно і переведіть кілька чисел з однієї системи до іншої, звіряючись з калькулятором. Трохи практики – і ви всьому навчитеся.
Нужно ли разработчику знать математику?
Автор: Редакция ITVDN
Вопрос о необходимости математики для разработчиков программного обеспечения вызывает немало споров. Одни считают, что без глубоких математических знаний в программировании никуда, другие утверждают, что достаточно школьной программы и логического мышления. Попробуем разобраться в этом вопросе, рассмотрев различные аспекты и специализации в разработке.
Однозначный ответ: да, математика нужна. Однако уровень необходимых знаний варьируется в зависимости от конкретной специализации и задач, которые решает разработчик. Подробнее читайте ниже.
Кому нужно хорошо знать математику
Разработчики игр
Этим ребятам точно не обойтись без математики. Им нужно:
Линейная алгебра и векторы — чтобы перемещать объекты в 3D-пространстве, строить мир игры
Тригонометрия — для расчёта углов (например, куда полетит пуля после рикошета)
Математический анализ — для создания реалистичной физики (как течёт вода, горит огонь)
Теория вероятностей — чтобы настраивать выпадение предметов, шанс критического удара
Представьте: нужно сделать так, чтобы мяч отскочил от стены под правильным углом — без математики никак!
Разработчики искусственного интеллекта
Здесь математика — это всё. Они используют:
Линейную алгебру — для работы с огромными массивами данных в нейросетях
Математический анализ — чтобы обучать модель оптимизировать себя
Статистику — для анализа точности моделей и предсказаний
Теорию информации — для оценки эффективности обучения
Попробуйте написать алгоритм распознавания лиц без понимания матриц и градиентов — не получится!
Графические программисты
Эти разработчики создают визуальные чудеса с помощью:
Геометрии — для построения 3D-моделей
Тригонометрии — для реалистичного освещения
Математического анализа — для плавных кривых и поверхностей
Реалистичное отображение воды или волос в фильмах Pixar — это чистая математика.
Криптографы
Эти специалисты защищают ваши данные, используя:
Теорию чисел — для шифрования (особенно с простыми числами)
Абстрактную алгебру — для создания надёжных криптосистем
Без математики ваш онлайн-банкинг был бы как открытая книга для хакеров.
Кому хватит школьной математики
Веб-разработчики
Большинству фронтенд- и бэкенд-разработчиков достаточно:
Базовой арифметики — для расчётов в бизнес-логике
Простой логики — для условий в коде
Начальных знаний об алгоритмах — чтобы код работал быстрее
Для создания интернет-магазина или блога вам не нужно знать, что такое частные производные.
Разработчики мобильных приложений
Для большинства приложений хватит:
Школьной арифметики — для расчётов в интерфейсе
Логики — для корректной работы приложения
Простых геометрических понятий — для работы с экраном
Сделать чат, календарь или заметки можно и без высшей математики.
Разработчики корпоративных систем (CRM, ERP)
Тем, кто создаёт бизнес-системы, нужно:
Уметь считать — для финансовых операций
Понимать логику — для автоматизации бизнес-процессов
Знать основы теории множеств — для работы с базами данных
Для автоматизации кадрового учёта интегралы не понадобятся.
DevOps-инженеры
Эти специалисты работают с инфраструктурой, и им достаточно:
Арифметики — для расчёта серверных ресурсов
Логики — для написания скриптов
Простой статистики — для мониторинга систем
Настроить серверы и контейнеры можно со школьными знаниями математики.
Что важно понимать
Математика развивает мышление — даже если вы не используете сложные формулы, математический способ мышления помогает лучше писать код.
Технологии меняются — сегодня вы делаете простые сайты, а завтра захотите заняться машинным обучением. Поэтому базовые знания не помешают.
Не обязательно быть экспертом — часто можно использовать готовые библиотеки, не понимая всей математики внутри.
Простыми словами: если вы разрабатываете обычные веб-сайты, простые мобильные приложения (например, мессенджеры, календари, приложения для заметок) или стандартные бизнес-системы для учёта и документооборота — не переживайте. Вам хватит школьной математики и логического мышления.
Но если вы мечтаете разрабатывать крутые игры, нейросети, финансовые аналитические системы, приложения с компьютерным зрением или графические редакторы — без серьёзной математики не обойтись.
Оператор nameof: Нова функція С# 6.0
Автор: Редакция ITVDN
Введение
12 ноября 2014 в рамках конференции Connect () Microsoft презентовала Visual Studio 2015, которая имеет много новых и интересных возможностей тестирования для разработчиков. Microsoft анонсировала новую версию C# - C# 6.0, улучшенную и обновленную. Одно из нововведений функций C# 6.0 –оператор nameof.
Что такое оператор nameof
С введением оператора nameof теперь возможно избегать сложно закодированых строчек в коде. Оператор nameof принимает имя элементов кода и возвращает строчный литерал этого элемента. Параметры, которые принимает оператор nameof, включают имя класса и всех его членов, таких как: методы, переменные и константы.
Довольно удобно использовать строчные литералы, чтобы бросить ArgumentNullException (назвать аргумент винованым) и вызвать события PropertyChanged (чтоб назвать измененное свойство), но велика вероятность появления ошибки, потому что можно неправильно их записать или не восстановить после рефакторинга. Выражения оператора nameof являются особым видом строчного литерала, где компилятор проверяет, есть ли у Вас что-то с заданным именем и Visual Studio знает, куда он ссылается, поэтому навигация и рефакторинг будут работать легко.
Оператор nameof может быть полезным для разных сценариев, таких как INotifyPropertyChanged, ArgumentNullException и отображения.
Пример 1
string person;
Console.WriteLine(nameof(person)); // prints person
int x = 2;
Console.WriteLine(nameof(x)); //prints x
Пример 2
class Operatornameof
{
public Operatornameof(string name) //constructor
{
if (name == null)
throw new ArgumentNullException(nameof(name)); // use of nameof Operator
else
Console.WriteLine("Name: " + name);
}
}
Пример 3
class Operatornameof
{
private int _price;
public int price
{
get
{
return this._price;
}
set
{
this._price = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.price))); //// INotifyPropertyChanged
}
}
private void PropertyChanged(Operatornameof operatornameof1, PropertyChangedEventArgs propertyChangedEventArgs)
{
throw new NotImplementedException();
}
}
Программа 1 с использованием Visual Studio 2013
using System;
using System.Text;
namespace CSharpFeatures
{
public class operatornameof
{
public operatornameof(string name, string location, string age)
{
if (name == null)
throw new ArgumentNullException("name");
else
Console.WriteLine("\n Name: " + name);
if (location == null)
throw new ArgumentNullException("location");
else
Console.WriteLine(" Location: " + location);
if (age == null)
throw new ArgumentNullException("age");
else
Console.WriteLine(" Age: " + age);
}
static void Main(String[] args)
{
operatornameof p = new operatornameof("Abhishek", "Ghaziabad", "23");
Console.ReadKey();
}
}
}
Программа 1 с использованием Visual Studio 2015 Preview
using System;
using System.Text;
namespace CSharpFeatures
{
public class Operatornameof
{
public Operatornameof(string name, string location, string age)
{
if (name == null)
throw new ArgumentNullException(nameof(name));
else
Console.WriteLine("Name: " + name);
if (location == null)
throw new ArgumentNullException(nameof(location));
else
Console.WriteLine("Location: " + location);
if (age == null)
throw new ArgumentNullException(nameof(age));
else
Console.WriteLine("Age: " + age);
}
static void Main(String[] args)
{
Operatornameof p = new Operatornameof("Abhishek", "Ghaziabad", "23");
Console.Read();
}
}
}
Программа 2 с использованием Visual Studio 2013
using System;
namespace CSharpFeatures
{
class Operatornameof1
{
static void Main(string[] args)
{
details d = new details();
d.Age = 23;
d.Name = "Abhishek";
Console.WriteLine("\n Name: {0} ", d.Name);
Console.WriteLine(" Age: {0} ", d.Age);
Console.ReadKey();
}
}
class details
{
private string _Name;
public int _Age;
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
public int Age
{
get { return this._Age; }
set { this._Age = value; }
}
}
}
Программа 3 с использованием Visual Studio 2015 Preview
using System;
namespace CSharpFeatures
{
class Operatornameof2
{
static void Main(string[] args)
{
details d = new details();
Console.WriteLine("{0} : {1}", nameof(details.Name), d.Name);
Console.WriteLine("{0} : {1}", nameof(details.Age), d.Age);
Console.ReadKey();
}
}
class details
{
public string Name { get; set; } = "Abhishek";
public int Age { get; set; } = 23;
}
}
Из данной статьи Вы узнали, как использовать оператор nameof, чтобы избежать использования сложно закодированых строчек в коде. Надеемся, что Вам понравилась новая функция C# 6.0, введенная Microsoft.
Источник: http://www.c-sharpcorner.com/UploadFile/16101a/nameof-operator-a-new-feature-of-C-Sharp-6-0/
Вебинары Артёма Мураховского по программированию на Python
Автор: Редакция ITVDN
Когда человек делает то, что он любит, что он сам избрал как свое дело, он вдохновляет других жить и творить.
Таковым был Артём Мураховский. Он работал Python разработчиком, в вечернее время проводил курсы по пайтону в CyberBionic Systematics и провел несколько классных вебинаров на ITVDN.
К сожалению, Артём погиб в марте этого года в боях под Авдеевкой, защищая Украину. В память о нём мы подготовили подборку его вебинаров. Смотрите. Здесь он жив. Слава герою!
Стоит ли учить Python?
Python – очень популярный язык программирования, используемый в различных направлениях IT-разработки: серверная веб-разработка, десктопные и мобильные приложения, игры, Data Science, ML, тестирование ПО, администрирование ОС и т. д.
На вебинаре вы узнаете, кто такой разработчик Python и что он делает, какие знания, умения и навыки ему нужны, с чего начать и как спланировать свое обучение по данной специальности, а также получите полезные советы и подборку литературы.
Прогноз погоды на языке Python
Интенсивный тренинг по созданию Telegram-бота, уведомляющего вас об актуальной погоде. Минимум теории, максимум практики – подойдет как новичкам, которые не знакомы с программированием, так и начинающим разработчикам, стремящимся испытать себя.
Вы познакомитесь с базовым синтаксисом Python, научитесь работать с запросами, узнаете, что такое API и воспользуетесь Telegram API, создадите бота для Telegram и научитесь использовать существующие сервисы для привязки к вашему приложению.
BlackJack на языке Python
Интенсивный тренинг по созданию карточной игры BlackJack для новичков и начинающих разработчиков. Вы научитесь:
Писать простую программу на Python, повторяя действия тренера.
Разбивать задачи на мелкие подзадачи и успешно решать их.
Проектировать архитектуру программы.
Писать программы на уровне классов.
Решать алгоритмические задачи.
Понимать предназначение паттернов проектирования.
Автоматизация парсинга сайтов
Информация – это нефть 21-го века. На вебинаре мы рассмотрим один из самых распространенных подходов для сбора и обработки информации – парсинг сайтов (на языке Python).
Мы возьмем один из популярных сайтов с рабочими вакансиями и на его примере разберем библиотеки для парсинга веб-сайтов, библиотеки для работы с запросами. Разберем виды популярных баз данных и поймем, где и какую нужно использовать.
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 предоставляет широкие возможности в плане публикации.
И, как всегда, не существует одного лучшего инструмента «на все случаи жизни». Попробуйте доступные и подберите для себя тот, который лучше всего отвечает вашим требованиям.
Автор перевода: Евгений Лукашук
Источник
Реалізація успадкування перерахувань за допомогою розширення для Visual Studio, що базується на Roslyn
Автор: Редакция ITVDN
Введение
В С# программировании необходима возможность расширять простое уравнение. Например, когда нужно использовать перечисления из библиотеки dll, которые невозможно изменить в коде, но и в то же время нужно использовать дополнительные значения, которых нет в библиотеке. Решить проблему можно при помощи системы Roslyn, основанной на расширении VS для создания отдельных файлов. Данный подход похож на моделирование множественного наследования в шаблоне "Implementing Adapter Pattern" и "Imitating Multiple Inheritance" в C# с использованием системы Roslyn, основанной на VS Extension Wrapper Generator.
Формулировка проблематики
Обратите внимание на схему EnumDerivationSample. Она содержит негенерированный код, большая часть которого будет сгенерирована позже. Схема содержит тип перечисления BaseEnum:
public enum BaseEnum
{
A,
B
}
Также в ней присутствует тип перечисления DerivedEnum
public enum DerivedEnum
{
A,
B,
C,
D,
E
}
В перечислении DerivedEnum перечень значений А и В такие же, как в перечислении BaseEnum.
Файл DerivedEnum.cs также содержит статический класс DeriveEnumExtensions для конвертации BaseEnum в DerivedEnum и наоборот:
public static class DeriveEnumExtensions
{
public static BaseEnum ToBaseEnum(this DerivedEnum derivedEnum)
{
int intDerivedVal = (int)derivedEnum;
string derivedEnumTypeName = typeof(DerivedEnum).Name;
string baseEnumTypeName = typeof(BaseEnum).Name;
if (intDerivedVal > 1)
{
throw new Exception
(
"Cannot convert " + derivedEnumTypeName + "." +
derivedEnum + " value to " + baseEnumTypeName +
" type, since its integer value " +
intDerivedVal + " is greater than the max value 1 of " +
baseEnumTypeName + " enumeration."
);
}
BaseEnum baseEnum = (BaseEnum)intDerivedVal;
return baseEnum;
}
public static DerivedEnum ToDerivedEnum(this BaseEnum baseEnum)
{
int intBaseVal = (int)baseEnum;
DerivedEnum derivedEnum = (DerivedEnum)intBaseVal;
return derivedEnum;
}
}
Преобразование значений BaseEnum в DerivedEnum всегда проходит успешно, в то время как преобразование в обратном направлении может быть проблематичным. Например, если значение DerivedEnum больше 1 (значение BaseEnum.B – наибольшее значение в типе перечисления BaseEnum). Функция Program .Main (...) используется для тестирования функциональных характеристик:
static void Main(string[] args)
{
DerivedEnum derivedEnumConvertedValue = BaseEnum.A.ToDerivedEnum();
Console.WriteLine("Derived converted value is " + derivedEnumConvertedValue);
BaseEnum baseEnumConvertedValue = DerivedEnum.B.ToBaseEnum();
Console.WriteLine("Derived converted value is " + baseEnumConvertedValue);
DerivedEnum.C.ToBaseEnum();
}
Будет выводиться:
Derived converted value is A
Base converted value is B
И тогда появится такое сообщение:
"Cannot convert DerivedEnum.C value to BaseEnum type, since its integer value 2 is greater than the max value 1 of BaseEnum enumeration."
Использование Visual Studio Extension для формирования наследования перечислений.
Установите расширение NP.DeriveEnum.vsix Visual Studio из папки VSIX, дважды кликнув на файл. Откройте схему EnumDerivationWithCodeGenerationTest. Тип ее перечислений такой же, как и в предыдущей схеме:
public enum BaseEnum
{
A,
B
}
Посмотрите на файл "DerivedEnum.cs":
[DeriveEnum(typeof(BaseEnum), "DerivedEnum")]
enum _DerivedEnum
{
C,
D,
E
}
Он определяет такой тип перечисления _DerivedEnum с атрибутом: [DeriveEnum (TypeOf (BaseEnum), "DerivedEnum")]. Атрибут определяет "супер-перечисления" (BaseEnum) и названия производного перечисления ("DerivedEnum»). Обратите внимание, что поскольку частичные перечисления не поддерживаются в C#, нам придется создать новый тип перечисления, объединив значение от "супер" до "суб" перечислений.
Посмотрите характеристики файла DerivedEnum.cs, его "специальные инструменты (Custom Tool)" уже содержатся в "DeriveEnumGenerator":
Теперь откройте файл DerivedEnum.cs в Visual Studio, попробуйте изменить его (скажем, добавив пробел) и сохраните его. Вы увидите, что сразу будет создан файл DerivedEnum.extension.cs:
Этот файл содержит тип перечисления DerivedEnum, который объединяет все поля перечислений BaseEnum и _DerivedEnum. Для начала убедитесь, что они имеют одинаковое имя и полное значение, а также имеют соответствующие поля в исходных перечислениях:
public enum DerivedEnum
{
A,
B,
C,
D,
E,
}
Расширение VS также формирует статический класс DerivedEnumExtensions, содержащий методы преобразования между суб и супер перечислениями:
static public class DerivedEnumExtensions
{
public static BaseEnum ToBaseEnum(this DerivedEnum fromEnum)
{
int val = ((int)(fromEnum));
string exceptionMessage = "Cannot convert DerivedEnum.{0} value to BaseEnum - there is no matching value";
if ((val > 1))
{
throw new System.Exception(string.Format(exceptionMessage, fromEnum));
}
BaseEnum result = ((BaseEnum)(val));
return result;
}
public static DerivedEnum ToDerivedEnum(this BaseEnum fromEnum)
{
int val = ((int)(fromEnum));
DerivedEnum result = ((DerivedEnum)(val));
return result;
}
}
Если использовать метод Program.Main (...), как и в предыдущем образце, получим достаточно похожий результат:
static void Main(string[] args)
{
DerivedEnum derivedEnumConvertedValue = BaseEnum.A.ToDerivedEnum();
Console.WriteLine("Derived converted value is " + derivedEnumConvertedValue);
BaseEnum baseEnumConvertedValue = DerivedEnum.B.ToBaseEnum();
Console.WriteLine("Base converted value is " + baseEnumConvertedValue);
DerivedEnum.C.ToBaseEnum();
}
Вы можете указать значение поля как в суб, так и в супер перечислениях. Генератор кода достаточно развит для того, чтобы выдавать правильный код. Например, если мы поставим значение BaseEnum.B 20:
public enum BaseEnum
{
A,
B = 20
}
И _DerivedEnum.C – 22:
enum _DerivedEnum
{
C = 22,
D,
E
}
Получим такой генерируемый код:
public enum DerivedEnum
{
A,
B = 20,
C = 22,
D,
E,
}
Метод расширения ToBaseEnum(...) также будет обновляться так, чтобы показывать исключение только тогда, когда мы пытаемся увеличить целое значение области DerivedEnum до 20:
public static BaseEnum ToBaseEnum(this DerivedEnum fromEnum)
{
int val = ((int)(fromEnum));
string exceptionMessage = "Cannot convert DerivedEnum.{0} value to BaseEnum - there is no matching value";
if ((val > 20))
{
throw new System.Exception(string.Format(exceptionMessage, fromEnum));
}
BaseEnum result = ((BaseEnum)(val));
return result;
}
Обратите внимание, что изменив значение первого поля суб-перечисления на меньшее или равное последнему полю супер-перечисления, генерация кода не осуществится, и это состояние будет отображаться, как ошибка. Например, попробуйте изменить значение _DerivedEnum.C на 20 и сохранить изменения. Файл DerivedEnum.extension.cs будет отображаться в списке ошибок.
Примечания о введении генератора объектного кода.
Код ввода кода генерирования содержится в схеме NP.DeriveEnum. Основная схема NP.DeriveEnum была создана с помощью шаблона "Visual Studio Package" (также, как это было сделано при Implementing Adapter Pattern и Imitating Multiple Inheritance в C# с использованием системы Roslyn, основанной на VS Extension Wrapper Generator).
Нам пришлось добавить пакеты Roslyn и MEF2, чтобы использовать функции Roslyn при таких командах, как "Nu Get Package Manager Console":
Install - Package Microsoft.CodeAnalysis - Pre
Install - Package Microsoft.Composition
Класс main генератора называется DeriveEnumGenerator. Он вводит интерфейс IVsSingleFileGenerator. У интерфейса есть два метода - DefaultExtension(...) и Generate(...). Метод DefaultExtension(...) позволяет разработчику указать расширение генерируемого файла:
public int DefaultExtension(out string pbstrDefaultExtension)
{
pbstrDefaultExtension = ".extension.cs";
return VSConstants.S_OK;
}
Метод Generate(...) позволяет разработчику указать код, который входит в состав созданного файла:
public int Generate
(
string wszInputFilePath,
string bstrInputFileContents,
string wszDefaultNamespace,
IntPtr[] rgbOutputFileContents,
out uint pcbOutput,
IVsGeneratorProgress pGenerateProgress
)
{
byte[] codeBytes = null;
try
{
codeBytes = GenerateCodeBytes(wszInputFilePath, bstrInputFileContents, wszDefaultNamespace);
}
catch (Exception e)
{
pGenerateProgress.GeneratorError(0, 0, e.Message, 0, 0);
pcbOutput = 0;
return VSConstants.E_FAIL;
}
int outputLength = codeBytes.Length;
rgbOutputFileContents[0] = Marshal.AllocCoTaskMem(outputLength);
Marshal.Copy(codeBytes, 0, rgbOutputFileContents[0], outputLength);
pcbOutput = (uint)outputLength;
return VSConstants.S_OK;
}
В данном случае генерация кода получена за счет метода GenerateCodeBytes (...).
protected byte[] GenerateCodeBytes(string filePath, string inputFileContent, string namespaceName)
{
string generatedCode = "";
DocumentId docId =
TheWorkspace
.CurrentSolution
.GetDocumentIdsWithFilePath(filePath).FirstOrDefault();
if (docId == null)
goto returnLabel;
Project project = TheWorkspace.CurrentSolution.GetProject(docId.ProjectId);
if (project == null)
goto returnLabel;
Compilation compilation = project.GetCompilationAsync().Result;
if (compilation == null)
goto returnLabel;
Document doc = project.GetDocument(docId);
if (doc == null)
goto returnLabel;
SyntaxTree docSyntaxTree = doc.GetSyntaxTreeAsync().Result;
if (docSyntaxTree == null)
goto returnLabel;
SemanticModel semanticModel = compilation.GetSemanticModel(docSyntaxTree);
if (semanticModel == null)
goto returnLabel;
EnumDeclarationSyntax enumNode =
docSyntaxTree.GetRoot()
.DescendantNodes()
.Where((node) = > (node.CSharpKind() == SyntaxKind.EnumDeclaration)).FirstOrDefault() as EnumDeclarationSyntax;
if (enumNode == null)
goto returnLabel;
INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumNode) as INamedTypeSymbol;
if (enumSymbol == null)
goto returnLabel;
generatedCode = enumSymbol.CreateEnumExtensionCode();
returnLabel:
byte[] bytes = Encoding.UTF8.GetBytes(generatedCode);
return bytes;
}
Метод Generate (...) имеет доступ к C # в качестве одного из параметров. Мы используем такой способ, чтобы получить Id документа в системе Roslyn:
DocumentId docId =
TheWorkspace
.CurrentSolution
.GetDocumentIdsWithFilePath(filePath).FirstOrDefault();
Из документа Id можно получить идентификатор схемы, используя dockId.
Из схемы Id получаем Roslyn Project от Rosly Workspace:
Project project = TheWorkspace.CurrentSolution.GetProject(docId.ProjectId);
Из Project получаем следующее:
Compilation compilation = project.GetCompilationAsync().Result;
Также получаем Roslyn Document:
Document doc = project.GetDocument(docId);
С данного документа получаем Roslyn SyntaxTree:
SyntaxTree docSyntaxTree = doc.GetSyntaxTreeAsync().Result;
С компиляции Roslyn и SyntaxTree образовывается семантическая модель:
SemanticModel semanticModel = compilation.GetSemanticModel(docSyntaxTree);
Вы также получите синтаксис перечисления в файле SyntaxTree:
EnumDeclarationSyntax enumNode =
docSyntaxTree.GetRoot()
.DescendantNodes()
.Where((node) = > (node.CSharpKind() == SyntaxKind.EnumDeclaration)).FirstOrDefault() as EnumDeclarationSyntax;
Наконец, из SemanticModel и EnumerationDeclarationSyntax Вы можете вытянуть INamedTypeSymbol, соответствующий перечислению:
INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumNode) as INamedTypeSymbol;
INamedTypeSymbol очень похож на System.Reflection.Type. Практически всю информацию про тип С# можно получить от объекта INamedTypeSymbol.
Метод расширения DOMCodeGenerator. CreateEnumExtensionCode() генерирует и возвращает весь код.
generatedCode = enumSymbol.CreateEnumExtensionCode();
Другая часть кода, отвечающая за код генерации, входит в состав NP.DOMGenerator. Система Roslyn используется только для анализа, для генерации кода используется CodeDOM, так как он меньше по объему и удобнее.
Есть два основных статических класса в программе NP.DOMGenerator: RoslynExtensions - для анализа Roslyn и DOMCodeGenerator - для генерирования кода, используя функции CodeDOM.
Источник: http://www.codeproject.com/Articles/879129/Implementing-Enumeration-Inheritance-using-Roslyn
Розробка ігор на Unreal engine 4
Автор: Дмитро Бобровніков
Приветствую, меня зовут Бобровников Дмитрий, я занимаюсь программированием уже более 4-х лет, из которых первые 2 года учил объектно-ориентированный язык программирования C#, а сейчас занимаюсь разработкой игр на Unreal engine 4. Когда я начинал программировать на движке Unreal engine 4, в то время не было толковой информации по программированию на этом движке, приходилось сталкиваться с определенными трудностями, точнее нехваткой информации, чтобы в дальнейшем нормально работать с этим движком. Конечно, сейчас ситуация стала меняться и уже есть русскоязычные уроки и документация, но особой пользой и информативностью они не отличаются. Также прямо сейчас я работаю над большим “Survive” проектом, пишу всю пользовательскую логику, все изображения взяты именно с этого проекта, подробно вы можете увидеть уроки и процесс создания этого проекта, с какими трудностями я сталкиваюсь и как их решаю на моем youtube канале. https://www.youtube.com/channel/UCZSMGDBh87VmNv0apC6VcCQ
И сегодня мы с тобой познакомимся с созданием игр на Unreal engine 4. Кто из нас не мечтал о создании собственной игры! Создание игр - это сложный и трудоёмкий процесс, давай поговорим об этом.
Весь процесс создания игры, после выбора движка, начинается с идеи “концепта игр”, то есть сначала полностью на бумаге придумывается игра, после этого ты расписываешь все по пунктам, что нужно будет сделать в игре (от того, что нужно создать меню игры и уровень для него, создать персонажа и т.д.) как можно более широко, для того чтобы у тебя было полное представления о том, что ты будешь писать и какая игра в итоге у тебя получится, после тебе нужно определиться, какой язык программирования ты будешь использовать. Unreal engine 4 предоставляет два языка программирования: это С++ и Blueprint (язык программирования движка, написанный специально для него).
Весь процесс мы с тобой будем рассматривать на примере моего нынешнего проекта игры. Языком для этого проекта был выбран Blueprint, так как он почти не уступает плюсам и имеет в себе более наглядное программирование, чем тот же C++, и подойдет людям, которые только начинают изучать движок и знакомиться с программированием, плюс к этому он не позволит наделать ошибок, возможных на языке C++, и он будет гораздо понятнее для новичков.
Так что после запуска движка при создании проекта мы выбираем языком программирования “Blueprint” и выбираем одну из заготовок проекта, их достаточно много, можете сами в этом убедиться, вы выберете то, что вам потребуется, я же выбрал проект от третьего лица.
Первой моей задачей стало написание игрового меню и настроек игры. Ты можешь видеть, как я это реализовал (не следует сразу бросаться и писать основную логику игры, а начать нужно последовательное выполнения поставленных тобой задач).
Само игровое меню поделено на несколько визуальных интерфейсов “Widget”, это условно (Главное меню, Обшей Widget настроек и каждый отдельный Widget настройки управления, графики и т.д.), причем такое меню не требует глубоких знаний в программировании, если ты используешь язык “Blueprint”, так как все настолько упрощено и интуитивно понятно, на этом моменте не возникает трудностей, достаточно знать основы в программировании.
Следующим шагом было реализация игрового персонажа. Благо, Unreal engine 4 предоставляет нам заготовку под персонажа, что полезно как профессионалам, так и новичкам, что позволяет не тратить время на начальную настройку персонажа, а просто добавлять в нее изменения так, что мы этим и воспользуемся, впоследствии заменив модель и анимации.
Мы идем по пунктам и следующим шагом была реализация интерфейса пользователя ”игрока” (таких как жизненный показатель, голод, здоровье и выносливость, чтобы создать некую сложность для игрока, так как ему придется следить за этими показателями и своевременно их пополнять, это уже геймплейная составляющая игры).
После этого можно уже приступать к различным логикам и системам будущей игры. Я начал с системы инвентаря, сначала сделал визуальный интерфейс, а потом написал логику для него, но такие системы довольно сложные и не стоит ставить вопрос, как написать или сделать систему инвентаря, а поставить перед собой другую задачу, например, что будет у каждого предмета (имя, картинка, количество и т.д.), таким образом дела пойдут гораздо быстрее и в итоге можно получить желаемый результат.
После проверить на наличие каких-либо ошибок, исправить, если такие имеются, и постараться максимально оптимизировать код, далее ты следуешь своему плану, который ты расписал, и, таким образом, по выполнении всех пунктов твоего плана ты получишь готовую игру.