Category: Разное

09
Апр
2021

🖋 Как создавать инклюзивные и доступные цифровые продукты

Хорошо спроектированный и продуманный UI/UX влияет на желание людей пользоваться продуктом. Разбираемся в мелочах, которые позволяют сделать интерфейс более понятным и привлекательным.

02
Апр
2021

🗣 45 русскоязычных подкастов для программистов

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

01
Апр
2021

🤔 Как научиться программировать за 24 часа?

Вопрос не самый простой, но и на него можно ответить, если немного поразмышлять.

Допустим, вы знаете компьютер, и хотите научиться программировать. Поскольку многие «умельцы» не де…

30
Мар
2021

🤖 Применение искусственного интеллекта для общественного блага

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

Что…

05
Мар
2021

🕸 Как найти утечки памяти на сайтах и в веб-приложениях

Утечки памяти мешают пользователям долго работать с вашим веб-приложением – из-за них можно потерять аудиторию. Попробуем разобраться как этого издежать.

Перевод публикуется с сокращениями, автор оригинальной статьи
Rafal Kuć.

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

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

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

Для отслеживания этих неприятностей можно использовать Sematext
Experience
– инструмент мониторинга, позволяющий не только контролировать использование веб-приложениями памяти, но также быстро и эффективно
обнаруживать утечки. В статье мы подробно рассмотрим, как это
делается.


Что такое утечка памяти

Утечка памяти
– это избыточное потребление ресурсов из-за неправильного управления распределением памяти в программном обеспечении. Она происходит, когда веб-приложение выделяет память
и продолжает использовать ее даже когда та больше не нужна.

Что вызывает утечку памяти: признаки, на которые следует обратить внимание

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

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

Во фронтенд-приложениях
существует несколько распространенных паттернов, которые могут вызвать утечку
памяти. К ним относятся:

  • Замыкания – внутренние функции, имеющие ссылки на переменные внешних. Таким образом внутренняя функция не позволяет сборщику мусора освободить память.
  • Случайные глобальные переменные – ранее необъявленные переменные станут глобальными и не будут освобождены.
  • Несвязанные коллекции – массивы, мапы и наборы позволяют хранить данные в каком-то виде, но с багами в коде они могут привести к утечке памяти из-за вечного хранения ссылок. Такой пример будет рассмотрен ниже.
  • Отсоединенный DOM – элемент Document Object Model, который больше не используется, но на него продолжают ссылаться.
  • Несвязанные таймеры – работающие вечно и сохраняющие объекты таймеры могут привести к утечке памяти.

Как обнаружить утечки памяти: пример приложения

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

        function(product, timestamp, page) {
 visited.push({product, timestamp, page})
}
    

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

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

Интеграция Sematext Experience с веб-приложением

Первый шаг – настроить
приложение на использование
Sematext
Browser SDK
для отправки данных в облако Sematext.

Для этого
добавим скрипт перед закрывающим тегом </head>:

        <script type="text/javascript">
 (function(e,r,n,t,s){var a=[];e[s]=function(){a.push(arguments)};e[s].queue=a; var o=[];var i=[];var c=true;var p=void 0;if(window.PerformanceObserver&& window.PerformanceObserver.supportedEntryTypes&&( PerformanceObserver.supportedEntryTypes.indexOf("longtask")>=0|| PerformanceObserver.supportedEntryTypes.indexOf("element")>=0)){ p=new PerformanceObserver(function(e){e.getEntries().forEach(function(e){ switch(e.entryType){case"element":i.push(e);break;case"longtask":o.push(e);break; default:break}})});p.observe({entryTypes:["longtask","element"]})}e[s+"lt"]={ longTasks:o,timingElements:i,inPageLoad:c,observer:p};if(t){var u=r.createElement(n); u.async=1;u.src=t;var f=r.getElementsByTagName(n)[0];f.parentNode.insertBefore(u,f)}})
 (window,document,"script","//cdn.sematext.com/experience.js","strum");
</script>
    

Второй шаг
зависит от типа вашего веб-приложения и используемого фреймворка – нужно сообщить Browser SDK, как ему себя настроить. Например, для стандартного развертывания
нескольких веб-страниц вы бы использовали перед закрывающим тегом </head>
что-то вроде этого:

        <script type="text/javascript">
 strum('config', { token: '<token>', 'receiverUrl': 'https://rum-receiver.sematext.com' });
</script>
    

Если вы
используете какую-либо одностраничную архитектуру, инструкции по установке
приложения
Sematext
Experience
помогут выполнить все необходимые
для отправки метрик шаги.

Выявление утечки памяти

Зная
что делает пользователь, мы можем взглянуть на графики в Sematext Experience. Перейдите к отчету об использовании памяти в приложении:


Если бы у вас
было подобное смоделированному веб-приложение с утечкой
, вы
могли бы наблюдать, как бесконечно растет потребление памяти. Не совсем бесконечно: рано
или поздно работа браузера завершится аварийно
.
Диаграмма использования памяти должна быть привязана к некоторым значениям.
Например, вот так:


Можно
наблюдать скачкообразные сегменты, но в более длительном периоде использование
памяти остается между максимумом и минимумом и не растет бесконечно. Мы видим,
что в нашем гипотетическом примере e-commerce это не так. Если перейти к
просмотру одной сессии, виден постоянный рост использования памяти с менее
чем 2 МБ до 12 МБ, и нет никакого падения в течение этого времени. Обычно это
означает, что где-то в приложении произошла утечка памяти. Глядя на данные сессии, мы можем видеть загрузку страниц и
HTTP-запросы:


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

Поддерживаемые браузеры

Возможности
измерения памяти Sematext Browser SDK зависят от используемого браузером API для предоставления связанных с памятью метрик. Поддерживается он только в Chrome и проходил испытания Chrome Origin для
Chrome 82-87. Начиная с Chrome 89 API будет полностью доступен — это означает, что пользователям потребуется новейший веб-браузер Google.

Заключение

С помощью
правильных инструментов выявить проблемы с утечкой памяти довольно просто. Именно для
этой цели был создан и постоянно совершенствуется Sematext Experience – он предоставляет вам комплексное, доступное и простое в использовании решение для
мониторинга.

Дополнительные
материалы:

03
Мар
2021

🎨 50 онлайн-инструментов для дизайна: веб-сайты и мобильные приложения

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

23
Фев
2021

🎨 40 лучших веб-сайтов и телеграм-каналов по UX/UI для дизайнеров интерфейса в 2021 году

Созданием интерфейсов занимаются не только программисты – сначала их должен придумать исследующий пользовательский опыт дизайнер. Делимся подборкой из сорока интересных сайтов и каналов Телеграм по UX/UI.

02
Фев
2021

📚 С чего начиналась наука о данных: история в лицах и ключевых работах

Через ключевые научные работы и их авторов попробуем разобраться, с чего начиналась история Data Science и как новая наука формировалась в течение десятилетий. Начнем отсчет с докомпьютерной эры.

31
Янв
2021

🤹 11 забавных пасхалок в Python

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

Змеиные яйца

Когда создатель языка Гвидо ван Россум начал внедрять Python, он также читал опубликованные сценарии из «Летающего цирка Монти Пайтона», комедийного сериала BBC 1970-х годов. Ван Россум подумал, что ему нужно короткое, уникальное и немного загадочное имя, поэтому он решил назвать язык Python. Как указано в официальной документации, вовсе не обязательно любить это шоу, чтобы пользоваться всеми преимуществами Python.

N.B. Все последующие пасхалки вы можете проверить самостоятельно в интерпретаторе просто запустив команду:

        $ python3
    

Летающий змий

Одна из самых забавных пасхалок в Python запускается командой:

        >>>import antigravity
    

Команда открывает в браузере комикс XKCD, в котором упоминается Python.


Учтите, что вы можете надолго «зависнуть в воздухе» листая комикс!)

Модуль антигравитации, ссылающийся на комикс XKCD, в котором упоминается Python, был добавлен в Python 3 Скипом Монтанаро.

Geohash


Любопытно, что в этой пасхалке есть еще одна пасхалка. Изучение реализации модуля antigravity.py обнаруживает скрытую функцию под названием «geohash», которая является ссылкой на другой комикс XKCD о геохешировании.

        >>> help(antigravity.geohash)
    

Функция использует алгоритм Рэндалла Манро, который генерирует случайные координаты GPS каждый день на основе промышленного индекса Доу-Джонса и текущей даты.

Некоторые считают, что функцию можно использовать для назначения встреч в офлайне )

Змеиный Дзен

Zen of Python представляет набор из 19 руководящих принципов для написания компьютерных программ, которые влияют на дизайн языка. Инженер-программист Тим Петерс написал этот набор и разместил его в списке рассылки Python в 1999 году. В списке Петерса оставался открытым 20-й принцип, «который должен заполнить Гвидо».

Дзен Питерса был включен под номером 20 в официальные предложения языка Python Enhancement Proposals. Он также включен в интерпретатор Python, как единственное официальное пасхальное яйцо, которое указано как в Руководстве разработчика Python.

В мае 2020 года Барри Варшава переложил афоризмы на музыку.

Список можно увидеть в консоли, если ввести следующую команду:

        >>> import this
    

Умышленная ирония, стоящая за Zen of Python, заключается в том, что сам this.py модуль нарушает почти все афоризмы. Модуль реализован в виде шифра ROT13.

        s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.

Rkcyvpvg vf orggre guna vzcyvpvg.

Fvzcyr vf orggre guna pbzcyrk.

Pbzcyrk vf orggre guna pbzcyvpngrq.

Syng vf orggre guna arfgrq.

Fcnefr vf orggre guna qrafr.

Ernqnovyvgl pbhagf.

Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.

Nygubhtu cenpgvpnyvgl orngf chevgl.

Reebef fubhyq arire cnff fvyragyl.

Hayrff rkcyvpvgyl fvyraprq.

Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.

Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.

Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.

Abj vf orggre guna arire.

Nygubhtu arire vf bsgra orggre guna *evtug* abj.

Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.

Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.

Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}

for c in (65, 97):

    for i in range(26):

        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))
    

Змеиная любовь

Как бы продолжая афоризмы из Дзена, Python иногда предлагает порассуждать на любовную тему:

        >>> import this

...

>>> love = this

>>> this is love

True

>>> love is True

False

>>> love is False

False

>>> love is not True or False

True

>>> love is not True or False; love is love # Love is complicated

True

True
    

Что касается заявления love is not True or False; love is love, оно иронично, но не требует пояснений.

Нет шансов для фигурных скобок

Предпочитаете фигурные скобки в стиле C вместо отступов? Увы их никогда не будет:

        >>> from __future__ import braces

 File "<stdin>", line 1

SyntaxError: not a chance
    

types.CodeType – не для слабонервных

Если вы начнете копаться во внутренностях Python, можно наткнуться на предупреждение help для types.CodeType, которое буквально гласит что это не для слабонервных: «Not for the faint of heart».

        >>> import types

>>> help(types.CodeType)

...

Help on class code in module builtins:                                                                                                                         

class code(object)                                                                        

 |  code(argcount, kwonlyargcount, nlocals, stacksize, flags, codestring,                 

 |        constants, names, varnames, filename, name, firstlineno,                        

 |        lnotab[, freevars[, cellvars]])                                                 

 |                                                                                        

 |  Create a code object.  Not for the faint of heart.                                    

 |                                                                                        

 |  Methods defined here:                                                                 

 |                                                                                                                                       

 …
    

PEP 401 и FLUFL

Первоапрельская шутка (4/01), PEP 401 заявляет, что Гвидо ван Россум уходит в отставку. Новый титул, данный ему, будет произноситься как «BDEVIL» (Benevolent Dictator Emeritus Vacationing Indefinitely from the Language – Доброжелательный диктатор, почетно отдыхающий от языка на неопределенный срок), а преемником Гвидо станет Барри Варшава, или, как его ласково называют, дядя Барри. Официальный титул дяди Барри – «FLUFL» (Friendly Language Uncle For Life – Дядя на всю жизнь):

Гвидо написал оригинальную реализацию Python в 1989 году и после почти 20 лет руководства сообществом решил уйти в сторону как Доброжелательный диктатор на всю жизнь. Гвидо оставляет Python в надежных руках его нового лидера и его яркого сообщества, чтобы подготовиться к своей мечте всей жизни о восхождении на Эверест. После единодушного голосования Руководящего союза Python (не путать с Python Secret Underground, которого категорически не существует) на конференции PyCon 2009, был выбран преемник Гвидо: Барри Варшава, или как он с любовью известен, дядя Барри.

Дядя Барри принимает следующие решения, чтобы продемонстрировать свое намерение вести сообщество так же ответственно и открыто, как и его предшественник, имя которого ускользает от него:

  1. Выбор Hg в качестве предпочтительной системы DVCS явился явным доказательством безумия BDEVIL, и отмена этого решения перейти на Bzr вместо этого – единственный верный выбор.
  2. Оператор неравенства != В Python 3.0 был ужасной ошибкой, вызывающей боль в пальцах, FLUFL восстанавливает оператор <> в качестве единственного написания. Это изменение достаточно важно, чтобы быть реализованным и выпущенным в Python 3.1. Чтобы облегчить переход к этой функции, был добавлен новый оператор future из __future__ import barry_as_FLUFL.
  3. Функция печати в Python 3.0 была ужасной, вызывающей боль ошибкой, FLUFL восстанавливает оператор печати. Это изменение достаточно важно для реализации и выпуска в Python 3.0.2.
  4. Неутешительная кривая принятия Python 3.0 свидетельствует о его полном отказе, вся работа над Python 3.1 и последующими версиями Python 3.x настоящим прекращается. Все функции Python 3.0 будут перенесены обратно на Python 2.7, который станет официальным и единственным следующим выпуском. Типы строк и байтов Python 3.0 будут обратно перенесены в Python 2.6.2 для удобства разработчиков.
  5. Признание того, что C – это язык 20-го века, который почти повсеместно отвергается программистами в возрасте до 30 лет, реализация CPython будет прекращена с выпуском Python 2.6.2 и 3.0.2. После этого эталонная реализация Python будет нацелена на виртуальную машину Parrot. Альтернативные реализации Python (например, Jython, IronPython и PyPy) официально не приветствуются, но допускаются.
  6. Признается, что Python Software Foundation, превосходно выполнив свою миссию, распускается. Управляющий союз Python (не путать с Python Secret Underground, которого категорически не существует) теперь является единственным распорядителем всей интеллектуальной собственности Python. Все средства PSF настоящим переводятся в PSU (не в этот PSU, а в другой PSU).

Отголосок этой шутки можно по прежнему лицезреть в интерпретаторе:

        >>> from __future__ import barry_as_FLUFL

>>> 0 != 1

SyntaxError: with Barry as BDFL, use '<>' instead of '!='

>>> 0 <> 1

True

>>> 1 <> 1

False
    

Хеш бесконечности

Хеш – это фиксированное целое число, идентифицирующее конкретную величину. Хеш бесконечности в Python равен 10⁵ x π. Интересно, что float(‘-inf’) в Python3 хэш равен «-10⁵ x π», а в Python 2 – «-10-x e».

        >>> hash (float ('inf')) 

314159 

>>> hash (float ('nan')) 

0
    

Еще раз Монти Пайтон

Учитывая, что создатель языка любит это шоу неудивительно, что в официальной документации явно сказано: «Ссылки на скетчи Monty Python в документации не только разрешены, но и приветствуются!». Метасинтаксические переменные в Python принимают имена spam и egg, а не более традиционно используемые foo и bar.

Вот еще пример использования str.format(), явно отсылающий к фильму «Монти Пайтон и Священный Грааль»:

        >>> print 'We are the {} who say "{}!"'.format('knights', 'Ni')

We are the knights who say "Ni!"
    

Математический модуль

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

        >>> from math import pi

>>> π = pi

>>> area = π * r**2

>>> résumé = 'knows Python'

>>> 'Python' in résumé

True
    

Еще одна хорошо известная математическая константа, определенная в математическом модуле, – это e. Оно называется числом Эйлера и является основанием натурального логарифма. Его значение – 2,718281828459045.

        >>> import math

>>> math.e

2.718281828459045
    

HelloWorld

«Hello, World!» часто используется для иллюстрации основного синтаксиса языка программирования. Это также часто первая программа для многих новичков. Сложно сделать это еще проще чем в Python:

        >>> import __hello__

Hello world!
    

Разработчики Python скрыли модуль, который мог выполнять Hello World, просто импортировав этот модуль! Повторный импорт библиотеки не приводит к повторному появлению сообщения.

Заключение

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

24
Янв
2021

☕ 7 ошибок, которые я сделал (и сожалею) как разработчик JavaScript

Если вы хотите заполучить более высокооплачиваемую работу, обратите внимание на ошибки из статьи и перестаньте их совершать.

Перевод публикуется с сокращениями, автор оригинальной …

23
Янв
2021

🚀 Объектно-ориентированное программирование – самая большая ошибка компьютерных наук

Рассказываем, как ООП наносит огромный ущерб экономике и почему пора менять парадигму программирования. Присоединяйтесь к надвигающейся революции!

C++ и Java, вероятно, являются одними из худших ошибок, которые когда-либо делала компьютерная наука. Многие выдающиеся программисты, включая создателя ООП Алана Кея, критиковали и продолжают критиковать эти языки за то, что они извратили первоначальную идею и породили самую печально известную парадигму современной разработки.

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

Почему же ООП так опасен?

***

Представьте, что вы садитесь в свою хорошо знакомую машину и едете по хорошо знакомому маршруту. И вдруг что-то идет не так, как всегда. Вы отпускаете педаль газа, но машина продолжает ускоряться! Давите на тормоз – не помогает!

Страшно? Подобный инцидент произошел в 2007 году с Джин Букаут – и еще с сотнями водителей Toyota Camry. Десятки человек погибли.

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

Команда экспертов 18 месяцев разбирала кодовую базу Toyota – и нашла сотни потенциальных причин возникновения непреднамеренного ускорения. Код в целом был запутанным и беспорядочным – то, что на сленге называется «спагетти». Из-за этого Toyota пришлось отозвать более 9 млн автомобилей и выплатить более 3 млрд долларов.


Проблема спагетти

Подобные инциденты не уникальны – и это пугает. Например, два самолета Boeing 737 Max потерпели крушение из-за ошибки, вызванной спагетти-кодом (346 жертв, 60 млрд долларов ущерба). То же самое может случиться, например, на атомной электростанции или в реанимационной палате.

Как ни странно, программный код пишется прежде всего для людей. Мартин Фаулер говорил, что любой дурак может написать код, понятный компьютеру, а хорошие программисты пишут код, понятный людям. Если код непонятен, то очень скоро он перестанет работать.

Спагетти-код непонятен, связи между его частями не очевидны. Любое изменение может что-нибудь сломать. На такой код невозможно писать тесты, его сложно расширять и больно поддерживать.

Откуда берется спагетти-код?

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

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

ООП – корень зла

ООП не накладывает на код никаких ограничений, которые могли бы предотвратить его запутывание. Безусловно, есть лучшие практики разработки – внедрение зависимостей, TDD, Domain Driven Design, которые реально помогают. Однако они не внедрены в парадигму, не обеспечиваются ей, и нет инструментария, который мог бы следить за их соблюдением.

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

Ссылочные типы

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

Это превращает программу в один большой сгусток глобального состояния и противоречит первоначальной идее ООП. Алан Кей, создавая свой язык Simula, предполагал, что части программы будут общаться между собой подобно биологическим клеткам, то есть независимо. Они должны были посылать друг другу сообщения, оставаясь закрытыми от внешнего мира (инкапсуляция).

Но в современном ООП одни «клетки» проникают внутрь других и меняют их состояние. Это приводит к большой связанности кода. Изменения в одном месте программы могут привести к неожиданным последствиям в другом.

Предсказуемость

Склонность к спагеттификации – не единственная проблема ООП-парадигмы.

Работая с ПО мы обычно хотим, чтобы оно было надежным и предсказуемым. 2 + 2 всегда должно быть равно 4, а нажатие на педаль тормоза всегда должно приводить к замедлению автомобиля. Это называется детерминированностью.

Если 2+2 будет равно 5 хотя бы один раз из миллиона, это может привести к ужасным последствиям.

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

Если эта цитата вам не нравится, то это потому, что недетерминированность в целом никуда не годится.

Вот пример кода, который просто вызывает функцию:

nondet-det-func.js
        console.log( 'result', computea(2) );
console.log( 'result', computea(2) );
console.log( 'result', computea(2) );

// result 4
// result 4
// result 4
    

Мы не знаем, что делает эта функция, но кажется, что она всегда возвращает один и тот же результат для одних и тех же входных данных.

А вот другой код:

nondet-nondet-func.js
        console.log( 'result', computeb(2) );
console.log( 'result', computeb(2) );
console.log( 'result', computeb(2) );

// result 4
// result 4
// result 4
// result 2    <=  плохо!
    

Эта функция вернула разные значения для одних и тех же входных параметров. Функция computeb недетерминирована. Она может выдавать ожидаемое значение, но это не гарантируется.

Что делает функцию детерминированной или недетерминированной?

  • Функция, не зависящая от внешнего состояния, на 100% детерминирована.
  • Функция, которая вызывает только другие детерминированные функции, также является детерминированной.
nondet-func-impl.js
        function computea(x) {
  return x * x;
}

function computeb(x) {
  return Math.random() < 0.9
          ? x * x
          : x;
}
    

Результат работы функции computea зависит только от аргумента x и всегда будет одинаков для одинакового x. Эта функция детерминирована.

Функция computeb недетерминирована, потому что вызывает недетерминированную функцию Math.random. С чем мы взяли, что Math.random недетерминирована? Она не принимает аргументов, а вычисление случайной величины основывается на системном времени, то есть зависит от внешнего состояния.

Детерминированный код предсказуем, недетерминированный – нет.

Непредсказуемость

Давайте рассмотрим простую функцию сложения:

nondet-simple-add.js
        function add(a, b) {
  return a + b;
};
    

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

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

nondet-add-boxed.js
        const box = value => ({ value });

const two = box(2);
const twoPrime = box(2);

function add(a, b) {
  return a.value + b.value;
}

console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));

// output:
// 2 + 2' == 4
// 2 + 2' == 4
// 2 + 2' == 4
    

Пока все идет хорошо. Давайте внесем небольшое изменение в тело функции add:

nondet-add-mutation.js
        function add(a, b) {
  a.value += b.value;
  return a.value;
}

console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));
console.log("2 + 2' == " + add(two, twoPrime));

// output:
// 2 + 2' == 4
// 2 + 2' == 6
// 2 + 2' == 8
    

Что случилось? Внезапно результат перестает быть предсказуемым! В первый раз код сработал нормально, но с каждым последующим запуском его вывод становился все более и более неожиданным.

Другими словами, функция больше не детерминирована.

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

***

Детерминированная программа гарантирует, что 2+2 == 4 . Другими словами для входных параметров (2, 2) функция add всегда должна возвращать 4. Независимо от того, сколько раз вы ее вызвали, работает ли она параллельно и что происходит за ее пределами.

Недетерминированные программы – это полная противоположность. В большинстве случаев вызов add(2, 2) вернет 4 . Но время от времени функция может возвращать 3, 5 или даже 1004. Недетерминизм крайне нежелателен, и теперь вы понимаете, почему.

Каковы последствия недетерминированного кода? В нем легко появляются дефекты – баги, которые заставляют разработчиков тратить драгоценное время на отладку и значительно ухудшают качество работы ПО.

Чтобы сделать наши программы более надежными, мы должны в первую очередь заняться их детерминизмом.


Побочные эффекты

Что такое побочный эффект? Если вы принимаете лекарство от головной боли, но оно вызывает у вас тошноту, то тошнота является побочным эффектом. Проще говоря, этот что-то нежелательное и не связанное с основной задачей препарата.

Вернемся к нашей функции сложения:

nondet-add-func-only.js
        function add(a, b) {
  a.value += b.value;
  return a.value;
}
add(two, twoPrime)
    

Функция add выполняет ожидаемую операцию, она добавляет a к b . Однако это также приводит к побочному эффекту – изменению объекта a.

Так как объекты передаются по ссылке, то и объект two за пределами функции изменился. two.value теперь равно 4. После второго вызова станет 6 и так далее.

Чистота

Разобравшись с детерминизмом и побочными эффектами, мы готовы говорить о чистоте.

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

Чистые функции имеют множество преимуществ:

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

И так далее. Проще говоря, чистые функции возвращают радость в программирование.

Насколько чисто ООП?

Для примера давайте поговорим о двух фичах ООП — геттерах и сеттерах.

Результат геттера зависит от внешнего состояния — состояния объекта. Многократный вызов геттера может привести к различным выходным данным, в зависимости от состояния системы. Это делает геттеры изначально недетерминированными.

Сеттеры предназначены для изменения состояния объекта, что делает их по своей сути побочными эффектами.

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

Чистое решение

Есть ли что-то, что может спасти программирование – луч надежды в мрачном мире программных сбоев? Что-то достаточно надежное и детерминированное, чтобы на нем можно было строить качественное ПО? Это математика.


В computer science математика воплотилась в парадигме функционального программирования, основанного на системе лямбда-исчисления.

А на чем основано современного ООП? Уже не на биологических законах клеток, как планировал Алан Кей. Оно базируется на множестве нелепых идей вроде классов и наследования, склеенных скотчем, чтобы лучше держались.

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

Значит ли это, что в такой программе нет багов? Конечно нет. Однако и баги в ней детерминированы. Для одних и тех же данных всегда будет возникать одна и та же ошибка, что существенно облегчает ее исправление.

Как я тут оказался?

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

Очень похожий процесс происходит сейчас с ООП. Только вместо вопроса «как я попал в эту точку исполнения», мы спрашиваем «как я попал в это состояние».

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

Функциональное программирование избавит нас от сложных вопросов. Когда состояние остается неизменным, оно не вызывает проблем.

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

А как же спагетти-код?

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

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

Но ООП и ФП дополняют друг друга!

Жаль вас разочаровывать, но это не так.

Объектно-ориентированное программирование – полная противоположность функциональному. Оно нарушает многие фундаментальные принципы:

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

Программисты ООП тратят большую часть своего времени на исправление ошибок. Программисты ФП – на написание работающего кода.

Действуйте, пока не поздно

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

Пришло время принять меры. Мы все должны осознать опасность ООП и начать делать маленькие шаги в сторону функционального программирования. Это не быстрый процесс, реального сдвига можно ожидать не раньше, чем через 10 лет, однако он должен произойти.

В ближайшем будущем ООП-программисты станут «динозаврами», как сейчас разработчики на COBOL. C++, Java, C# умрут. TypeScript тоже умрет.

Начните изучать функциональное программирование прямо сейчас! F#, ReasonML и Elixir – все это отличные варианты для начала.

Присоединяйтесь к надвигающейся революции!

14
Янв
2021

🕸 Что не так с веб-сборкой?

Ее потенциал и перспективы огромны. Что же пошло не так? Почему не все используют WASM? Попробуем ответить на эти вопросы.

Перевод публикуется с сокращениями, автор оригинальной ст…

11
Янв
2021

❓ Почему нельзя соглашаться на тестовый кодинг во время собеседования

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

Перевод публикуется с сокращени…

06
Янв
2021

💸 Программирование с пассивным доходом: 5 способов для разработчиков ПО

О, это прекрасное чувство – получать деньги за любимую работу, особенно если речь идет о пассивным доходе. Держите 5 способов подзаработать на досуге.

Перевод публикуется с сокра…

31
Дек
2020

🎄 С Новым годом!

Через несколько часов в Москве пробьют куранты, а нам пора подвести итоги и поздравить читателей с наступающими праздниками.

Уходящий год был непростым, и это не дежурная фраза. Кт…

26
Дек
2020

📈 Инфлюенсеры в Big Data и Machine Learning: за кем следить в 2021 году?

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

Инфлюенсеры – это лидеры мнений. Обычно пользователи социальных сетей, которые имеют обширную и лояльную аудиторию. Big Data и ML – одни из самых быстро развивающихся сфер в ИТ, поэтому специалистам важно следить за инфлюенсерами и влиятельными сообществами. Ведущие профессионалы отрасли регулярно делятся с широкой аудиторией опытом, а также последними разработками и новостями.

О работе специалистов по анализу больших данных мы писали в статье «Стать аналитиком Big Data: пошаговое руководство». Продолжая тему, мы собрали в одной публикации влиятельных инфлюенсеров в сфере Big Data и ML, а также сообщества, на которые стоит подписаться в 2021 году.

Предлагаем вашему вниманию подборку самых влиятельных сообществ и инфлюенсеров в сфере Big Data и Machine Learning.

<a href="https://rismedia.com/wp-content/uploads/2020/06/social_media_strategy_1153737066.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Сообщества

Big Data and Analytics

Сообщество LinkedIn, в котором собраны не только курсы и офферы для аналитиков Big Data, но и вся актуальная информация от ведущих экспертов области. Сообщества на LinkedIn – одно из лучших мест для энтузиастов данных и начинающих ученых, желающих овладеть искусством работы с большими данными. Активное участие в дискуссиях и собственные публикации дают возможность укрепить знания, найти наставника и расширить сеть профессиональных контактов.

Data Science Central

Твиттер-аккаунт одного из самых известных сообществ Data Science, где вы найдете новости о последних технологиях Big Data, машинного обучения, AI, Deep Learning, dataviz, Hadoop, IoT, и BI. Data Science Central объединяет пользователей, которые хотят получить уникальный опыт участия в дискуссиях на темы сбора и интеграции, а также аналитики и визуализации данных. Построенное на инновационной платформе сообщество включает технические форумы и сведения о рыночных тенденциях, а также дает возможности социального взаимодействия и трудоустройства.

DataDriven

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

<a href="https://t4.ftcdn.net/jpg/02/61/98/23/360_F_261982331_9P4vDtQz8briwqDPIs7f94LW7IUuXHiX.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Инфлюенсеры

Ronald Van Loon

Ronald Van Loon, директор Advertisement компании, которая предлагает партнерам и клиентам консалтинговые, технологические, информационные и автоматизированные решения. Известный инфлюенсер в сфере Data Science, Ronald публикует статьи и посты на темы больших данных, искусственного интеллекта, автономных автомобилей, аналитики и многого другого.

Kenneth Cukier

Kenneth Cukier – редактор данных в The Economist и соавтор книги «Big Data: A Revolution That Will Transform How We Live, Work, and Think», а также популярный спикер и член совета по развитию на основе данных World Economic Forum. Cukier является постоянным гостем на BBC, CNN и NPR. С 2002 по 2004 год он был научным сотрудником Гарвардской школы управления имени Кеннеди. Он также является стипендиатом Оксфордской бизнес-школы, где проводит исследования в области авиации.

Ganapathi Pulipaka

Ganapathi Pulipaka – главный Data Scientist в Accenture. Он разработал ряд программ Deep Learning и машинного обучения и продолжает публиковать новые идеи на GitHub и Medium. Советуем подписаться тем, кто заинтересован в математическом моделировании, нейросетях и визуализации данных в TensorFlow.

Kirk Borne

Kirk Borne является советником и главным специалистом по обработке данных в Booz Allen Hamilton. Kirk – астрофизик и консультант по большим данным, он также специализируется на интеллектуальном анализе данных, машинном обучении и вычислительной астрофизике. Kirk уже более 20 лет участвует в нескольких проектах NASA, включая его астрономический центр и операции с данными космической науки. В своем аккаунте в Твиттер он публикует множество ресурсов по машинному обучению и делится опытом работы.

Iain Brown

Dr. Ian Brown – консультант по большим данным и руководитель научных данных для SAS UK&I. За последние десять лет он работал в нескольких секторах, обеспечивая лидерство по темам риска, искусственного интеллекта и машинного обучения. Ian активно публикует посты в Твиттер и рассказывает о проектах в сфере искусственного интеллекта.

Yves Mulkers

Yves Mulkers – стратег данных и основатель популярного цифрового издания 7wData. Как специалист по интеграции, Yves в постах фокусируется на организации данных и возможностях архитектуры данных в организации. Он публикует свое видение проблем бизнес-аналитики и связанных с данными вопросов.

Mike Quindazzi

Mike Quindazzi – лидер продаж цифровых альянсов в PWC. Он помогает управлять бизнес-результатами, предлагая консультации по новым технологиям, вроде беспилотных летательных аппаратов, 3D-печати, блокчейна, IoT, больших данных и робототехники. Mike работал с такими брендами, как Microsoft, SAP, Amazon и Oracle, и помог сформировать инновационные подходы к решению их проблем. Он часто публикует свое мнение о развитии сферы больших данных и рассуждения на темы, связанные с AI и машинным обучением.

Evan Kirstel

Evan Kirstel является ведущим технологическим влиятельным лицом в сегменте B2B и соавтором eVira Health, которая предлагает консультации, а также разработку продуктов и стратегий развития бизнеса для сообщества медицинских технологий. Он работал с такими известными брендами, как IBM, Intel и AT&T, среди прочих, чтобы максимизировать их видимость и масштабирование в 5G, blockchain, AI, cloud, IoT, AR, VR, Big Data и analytics.

Marcus Borba

Marcus Borba – создатель Borba Consulting, консалтинговой и исследовательской фирмы, которая решает сложные информационные задачи компаний с помощью таких инструментов, как аналитика больших данных и бизнес-аналитика. Считающийся одним из ведущих специалистов в области науки о данных и бизнес-аналитики, Marcus также регулярно публикует в своем Твиттере посты на темы нейронных сетей и машинного обучения.

Bill Schmarzo

Инфлюенсер и автор книги «The art of thinking like a Data Scientist». Он очень активен и на LinkedIn: прочтите пост «Will AI force Humans to become more Human» и подпишитесь, если хотите стать «Data Science Think Tank».

<a href="https://image.freepik.com/free-vector/blog-authors-writing-articles_179970-1523.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Michael Fisher

Michael Fisher – технический евангелист и старший системный аналитик в Whitcraft Group. Он считается ведущим специалистом в области IoT, 5G, VR и FinTech, и пишет о таких областях, как кибербезопасность, консалтинг и архитектура больших данных.

Srivatsan Srinivasan

Srivatsan Srinivasan – Chief Data Scientist/Architect в Cognizant. Его опыт в построении сложных аналитических конвейеров, моделей машинного обучения для бизнес-процессов и помощи компаниям в преобразовании пространства данных и аналитики, сможет помочь расширить понимание многих областей больших данных, облаков и искусственного интеллекта. Советуем обратить внимание на его посты в LinkedIn, которые точно будут полезны тем, кто хочет быть в курсе новейших технологий AI и лучших практик в области Data Science.

Nando de Freitas

Nando de Freitas – ученый, который возглавляет команду машинного обучения Google DeepMind. Профессор компьютерных наук Оксфордского университета, Nando de Freitas является специалистом в области машинного обучения с фокусом на нейронные сети, байесовскую оптимизацию и вывод, а также Deep Learning. Как главный ученый в Google DeepMind, он помогает в организации ее миссии – использовать технологии для широкой общественной пользы и научных открытий, обеспечивая при этом безопасность и соблюдение этических норм.

David Langer

Если вы регулярно читаете учебные публикации по теме Data Science на LinkedIn, скорее всего вы уже знакомы с David Langer. Помимо того, что он является VP of Analytics в Schedulicity, он также известен как инструктор и YouTube-блогер. У него слава одного из самых выдающихся педагогов в области Data Science. David Langer создает образовательный контент для всех заинтересованных в развитии навыков работы с данными.

Andrew Ng

Основатель и генеральный директор Landing AI, а также основатель Deeplearning.ai. Andrew работал главным научным сотрудником Baidu Research, был профессором Стэнфордского университета, основателем и председателем правления Coursera, поэтому его считают пионером в области онлайн-образования. Он основал проект Google Brain, который разработал крупномасштабные искусственные нейронные сети, в том числе ту, которая научилась распознавать кошек на видео. Andrew специализируется на Deep Learning и часто делает публикации на связанные с машинным обучением темы.

Kristen Kehrer

Kristen Kehrer является преподавателем Data Science в UC Berkeley Extension и основателем Data Moves Me. С 2010 года Kristen предлагает инновационные и эффективные решения для машинного обучения в различных отраслях промышленности, включая коммунальное хозяйство, здравоохранение и электронную коммерцию. Kristen является инфлюенсером и наставником, у которого можно многому научиться благодаря ее опыту и знаниям в области SQL и аналитики больших данных.

***

Без чтения публикаций ведущих специалистов отрасли сложно освоить развивающиеся так быстро профессии. Если же вы только планируете карьеру в этой области, стоит обратить внимание на курс Факультета Аналитики Big Data онлайн-университета GeekBrains. Программа обучения включает основательную математическую и подготовку, изучение основ языка Python и работы с базами данных, а также работу с Hadoop и Apache Spark. Курс ориентирован на применение навыков машинного обучения в бизнесе и построен на основе практической работы над проектами с ведущими специалистами отрасли и личным помощником-куратором. Успешно окончившим его студентам онлайн-университет помогает с трудоустройством.

22
Дек
2020

❓ Потребуются ли программисту на собеседовании алгоритмы и структуры данных?

Начинающие разработчики и даже программисты уровня middle прекрасно владеют современным инструментарием, но часто проваливают собеседования из-за нехватки теоретических познаний. Абстрактные структуры данных и алгоритмы могут стать для соискателя препятствием на пути к работе мечты. Рассказываем, как это исправить.

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


Чего хотят работодатели?

Программисты уровня junior и middle для рекрутеров ИТ-компаний – темные лошадки. Какой-нибудь senior или team lead гораздо понятнее работодателю, поскольку уже имеет имя, послужной список и большое количество реализованных проектов в портфолио. Чего ждать от новичков или специалиста среднего уровня, никому не известно, а значит и собеседовать их станут основательно – к этому стоит быть готовым. Требования к потенциальным кандидатам разнятся от компании к компании, но некоторые общие принципы выделить можно.

О чем на собеседованиях спрашивают в корпорациях?

Крупные ИТ-компании не ждут от начинающих разработчиков совершенного владения современными технологическими приемами. Даже программисту middle-уровня на сей счет может быть сделано послабление, но к вопросам наличия у соискателя теоретического базиса гиганты относятся очень серьезно. Список требований обширен и включает весь джентльменский набор из программы профильного вуза. Наличие академических познаний не гарантирует получения места, но их отсутствие точно не даст пройти HR-квест до конца. Как сказал бы математик: теория необходима, но недостаточна для трудоустройства.

О чем спрашивают в средних и небольших компаниях?

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

Чего хотят от соискателей стартапы?

Собеседования в стартапы – всегда лотерея. Слишком они разные, чтобы можно было выделить общий подход к найму. Вопросы об алгоритмах и абстрактных структурах данных могут не возникнуть вовсе или стать главными при отсеве негодных соискателей. Предсказать это не получится, но одна закономерность есть: обычно стартаперы ищут единомышленников. Тут нужно понять, разделяете ли вы идеи проекта, а потом уже думать, какие знания понадобятся для успешного трудоустройства. Учить тем не менее придется, смиритесь. Лишним это точно не будет.


Какие знания необходимо освоить?

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

  1. Основные структуры данных и алгоритмы: сюда входят стеки, очереди и связные списки, битовые операции, циклы, рекурсия и алгебраические алгоритмы;
  2. Алгоритмы сортировки: простые сортировки, линейная сортировка, пирамидальная сортировка, а также быстрая и внешняя сортировка;
  3. Деревья: двоичные, красно-черные и прочая, прочая, прочая;
  4. Хэш-таблицы: сюда же входят хэш-функции, универсальное и идеальное хэширование, а также разрешение коллизий;
  5. Теория графов и комбинаторная оптимизация: владеть этой областью нужно на уровне студента-математика первого курса. Ничего сложного, все сводится к основным определениям и решению типовых задач, вроде задачи коммивояжера.
  6. Алгоритмы на строках: тут придется вспомнить забытые со студенческих времен фамилии: Ахо-Корасика, Бойера-Мура и прочего Кнута-Морриса-Пратта. Еще потребуется подучить алгоритмы сжатия и шифрования;
  7. Вероятностные алгоритмы: MinHash, SimHash, HyperLogLog, Count-Min Sketch, фильтр Блума и вот это все;

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


Где можно научиться?

Перечисленные выше темы изучаются в вузах, но уже к старшим курсам ударившиеся в современные технологии студенты забывают о классике. У пришедших в программирование из других профессий специалистов теоретический базис тоже хромает, и это вполне естественно. Заполнить пробелы в знаниях помогают книги. В интернет-магазинах доступны неплохие работы: от модной «Грокаем алгоритмы», которую написал Адитья Бхарагава, до классической «Introduction to Algorithms» издательства MIT Press. Некоторым нравится «The Algorithm Design Manual» Стивена Скиены – выбрать есть из чего, но на изучение теории по книгам у работающих программистов не хватает ни времени, ни мотивации. Это тоже вполне естественно.

Не стоит заниматься ̶с̶а̶м̶о̶л̶е̶ч̶е̶н̶и̶е̶м̶самообучением, когда можно обратиться за помощью к профессионалам. Каждый хорош в своей работе: кто-то умеет писать программы, а кто-то – еще и учить этому других. Если вы хотите получить целостные и системные знания, компания OTUS предлагает IT-специалистам более 60 авторских курсов. Сейчас идет набор на пятимесячную программу онлайн-обучения «Алгоритмы и структуры данных»: вступительное тестирование можно пройти на сайте. Желающим также предлагают посетить бесплатный демо-урок, который пройдет 22 января.

Теоретический базис – фундамент вашей карьеры, а дом без фундамента построить невозможно.

09
Дек
2020

👶 10 ошибок начинающего разработчика

Обучение на собственных ошибках – правильный путь развития развития разработчика. Ошибки совершают абсолютно все новички, рассмотрим самые распространенные из них.

Перевод публикуе…

23
Ноя
2020

🖥🛠❓Брендовый неттоп vs самосборный мини-ПК: выбираем компьютер для программиста

Собрать компактный компьютер для программирования самому или взять готовый? Наш сравнительный обзор поможет выбрать. В него вошли восемнадцать неттопов и комплектующие для системника Mini ATX.

23
Ноя
2020

❹ ❌👨‍🎓️4 мифа о профессии программиста, в которые вы почему-то еще верите

В этой статье эксперты SkillFactory опровергают расхожие мифы о профессии программиста и подсказывают, что делать дальше.

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


Миф №1. Программирование – только для технарей

Мы не будем врать, что за пару недель можно переучиться из художника в программиста. На самом деле секрет не в том, какая оценка по математике у вас была в школе или в каком вузе – гуманитарном или техническом – вы учились.

Программистов отличает способность мыслить алгоритмически. У кого-то есть предрасположенность к такому мышлению, но это не значит, что его нельзя развить самостоятельно или при помощи наставников.

Например, получить профессию разработчика на Python может и новичок. Начать стоит с тренировок мышления и программирования через отработку алгоритмов. Этот навык поможет решать нетривиальные задачи по программированию в будущем.


Миф №2. Слишком долго учиться

Курсы по программированию длятся от 6 до 24 месяцев, в зависимости от программы. Учеба в вузе отнимет у вас минимум 4 года, но при этом вы изучаете общеобразовательные предметы, вроде риторики, философии, психологии и этики. Не говоря уже о том, что программы в вузах могут устаревать…

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


Миф №3. Нужно много свободного времени на учебу, а работу потом найти сложно

Во-первых, давайте зададимся вопросом: «много времени» – это сколько? 10 часов в неделю – это много или мало? А ведь именно столько времени нужно тратить на обучение новой профессии. Скорее всего эти же 10 часов вы проведете, залипая в ленте Фейсбука или Тиктока.

Во-вторых – со знанием Python сложно остаться без работы. Число вакансий растет с каждым годом: +127% с 2015 года по данным HH.ru. На курсе «Fullstack-разработчик на Python» в SkillFactory вас не только научат программировать, но и помогут найти работу. Начиная с первых недель обучения, ментор поможет определить карьерные цели и не сойти с намеченного пути, а карьерный центр подскажет, как оформить резюме и попасть на собеседования.


Миф №4. Программирование – только для мальчиков

Самый неприятный миф в этой статье. Да, сейчас среди программистов мужчин больше, чем женщин, но если бы этот миф был правдой, то мир никогда бы не узнал о Мариссе Майер (экс-директор Yahoo!), Адель Голдберг (разработала язык программирования Smalltalk), Катарине Фейк (основала фотохостинг Flickr) и других крутых женщинах-программистах.

Если все действительно не так страшно, то куда идти учиться?

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

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

***

С 17 по 30 ноября действуют скидки от 50% на все курсы онлайн-школы SkillFactory. Окончив онлайн-программу, вы сможете сразу же начать работать – это самый безопасный способ войти в сферу IT, не тратя несколько лет на учёбу, но при этом получив все базовые знания. Выгодно используя распродажу сейчас, вы инвестируете в своё будущее.

И кажется, что это одна из самых грамотных инвестиций в свое будущее.

21
Ноя
2020

🐍 10 классных функций Python 3.9

Новая версия популярного языка программирования вышла не так давно. Рассмотрим наиболее интересные возможности Python 3.9, на которые стоит обратить внимание как новичкам, так и профессионалам.

Перевод подготовлен совместно с факультетом Python-разработки GeekBrains. Автор оригинального текста Farhad Malik.

***

Как и большинство поклонников Python, я очень рад изучать и использовать новейшие функции. В этой статье будет представлен обзор возможностей Python 3.9, которые необходимо знать.

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

***

Было добавлено несколько новых функций, включая объединение и обновление словарей, строковые методы и внедрение модуля zoneinfo. Также нам представили стабильный и высокопроизводительный парсер.

Давайте разбираться с нововведениями.

1. Операторы обновления и слияния словарей

Во встроенный класс dict добавлено два оператора: | и |=.

| используется для объединения словарей, |= – для их обновления.

PEP 584

Код:

Объединение: |

        >>> a = {‘farhad’: 1, 'blog’: 2, 'python’: 3}

>>> b = {’farhad’: 'malik’, 'topic’: 'python3.9’}

>>> a | b

{’blog’: 2, 'python’: 3, ’farhad’:’malik’, 'topic’: 'python3.9’}

>>> b | a

{’farhad’: 1,’blog’: 2, 'python’: 3, 'topic’:’python3.9’ }
    

Обновление: |=

        >>> a |= b

>>> a

{’blog’: 2, 'python’: 3,’farhad’:’malik’}
    

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

Более детально

Как мы видим, добавлены новые операторы | и |=.

| можно рассматривать как оператор + (сложения) в списках, а |= – как оператор += (расширения).

В Python 3.8 есть несколько способов слияния и обновления словарей.

К примеру, можно использовать first_dict.update(second_dict). Проблема этого метода в том, что он изменит first_dict на месте. Чтобы этого избежать, нужно объявить временную переменную, сохранить в ней first_dict, а затем выполнить операцию обновления. Но появляется лишняя строка кода, просто чтобы оператор объединения/обновления работал.

Также мы можем применить {**first_dict, **second_dict}. Сложность этого метода в том, что его трудно обнаружить и сложнее понять смысл кода. Кроме того, исключаются типы mapping и учитывается только тип dict. Например, если first_dict – это defaultdict, а second_dict – это тип dict, то программа завершится ошибкой.

Этот способ не работает с подклассами dict, которые содержат функцию _init_.

Наконец, библиотека collections содержит функцию ChainMap. Она может принять два словаря, как ChainMap (first_dict, second_dict), и вернуть объединенный словарь, но об этой библиотеке знают немногие.

***

Для получения более подробной информации вы можете ознакомиться с источником.

https://www.python.org/dev/peps/pep-0584

2. Новый высокопроизводительный парсер на основе PEG

С Python 3.9 можно отказаться от использования LL (1) в пользу более гибкого и стабильного синтаксического анализатора на основе PEG.

PEP: 617

Более детально

Текущий парсер CPython основан на LL (1). Грамматика основана на LL (1), что позволяет парсить ее с помощью LL (1) анализатора. Парсер LL (1) работает сверху вниз и анализирует входные данные слева направо. Грамматика является контекстно-свободной, поэтому контекст токенов не учитывается.

Python 3.9 предлагает заменить его новым парсером на основе PEG, который снимет ограничения Python грамматики LL (1). Будет удален ряд хаков, существующих в текущем синтаксическом анализаторе. В долгосрочной перспективе это снизит стоимость обслуживания.

Несмотря на то, что синтаксические анализаторы и грамматики LL (1) просты в реализации, ограничения не позволяют им выражать общие конструкции естественным образом для разработчика языка и читателя. Парсер смотрит только на один токен вперед, чтобы различать возможности.

Оператор выбора | упорядоченный. Рассмотрим следующее правило:

rule: A|B|C

Контекстно-свободный парсер грамматики LL (1) будет генерировать конструкции, которые при заданной входной строке определят, нужно ли расширять A, B или C. Анализатор PEG отличается. Он проверит, успешна ли первая переменная, и только в случае провала перейдет ко второй или третьей.

Парсер PEG генерирует ровно одно допустимое дерево для строки. Он определенный, в отличие парсер LL (1).

Синтаксический анализатор PEG также напрямую генерирует узлы AST для правила через грамматические действия. За счет этого удается избежать создания промежуточных шагов.

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

***

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

https://www.python.org/dev/peps/pep-0617

3. Новые строковые функции для удаления префикса и суффикса

К объекту str добавлено две новых функции.

1. Первая удаляет префикс – str.removeprefix(‘префикс’).

2. Вторая удаляет суффикс – str.removesuffix(‘суффикс’).

PEP: 616

Код:

        'farhad_python'.removeprefix('farhad_')

#возвращает python

'farhad_python'.removesuffix('_python')

#возвращает farhad
    

Более детально

Одна из обыденных задач в приложении data science, которое включает в себя манипулирование текстом – удалить префикс/суффикс строк. Добавленные к объекту str функции можно использовать для удаления ненужных префиксов и суффиксов из строки.

Как мы уже знаем, первая функция удаляет префикс. Это str.removeprefix(‘префикс’). Вторая функция удаляет суффикс. Это str.removesuffix(‘суффикс’).

Строка – это набор символов, и каждый символ имеет индекс в строке. Индексы можно использовать вместе с : , чтобы вернуть подмножество строки. Эта функция известна как slice (срез) строки.

Если мы говорим о функциях, они проверяют, начинается ли строка с префикса (заканчивается ли она суффиксом), и если да, то возвращают строку без префикса или после суффикса, используя функцию среза str [:].

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

***

Для получения более подробной информации вы можете ознакомиться с источником.

https://www.python.org/dev/peps/pep-0616

4. Подсказки типов для встроенных универсальных типов

Аннотирование программ стало проще за счет удаления иерархии параллельных типов в Python.

Добавлена поддержка универсального синтаксиса во всех стандартных коллекциях, доступных в модуле набора текста.

Мы можем использовать встроенные типы коллекций list или dict в качестве универсальных типов вместо использования typing.List или typing.Dict в сигнатуре нашей функции.

Код стал выглядеть чище, а его понимание и объяснение упростилось.

PEP: 585

Более детально

Несмотря на то, что Python – это язык с динамической типизацией, аннотация типов в программе позволяет проводить самоанализ. Впоследствии аннотацию можно использовать для создания API проверки типов во время выполнения.

Как я говорил ранее, в Python 3.9 добавили поддержку универсального синтаксиса во всех стандартных коллекциях, доступных в модуле набора текста.

Универсальный тип – это обычно контейнер, к примеру list. Это тип, который можно параметризовать. Параметризованный тип – это пример универсального дженерика с ожидаемыми типами для элементов контейнера типа list [str].

Мы можем использовать встроенные типы коллекций list или dict в качестве универсальных типов вместо использования typing.List или typing.Dict.

Например, мы могли бы управлять проверкой типов среды выполнения Python, аннотируя код:

        print_value(input: str):

print(input)

# Мы получим уведомление, если входные данные не являются строкой
    

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

Например, мы увидим typing.List, typing.Dictionary вместе со встроенными list, dictionary и т. д. Это позволяет писать код:

        def read_blog_tags(tags: list[str]) -> None:

for tag in tags:

print("Tag Name", tag)
    
***

Для получения более подробной информации вы можете ознакомиться с источником.

https://www.python.org/dev/peps/pep-0585

5. Поддержка часового пояса IANA в DateTime

Модуль zoneinfo был создан в качестве поддержки базы данных часовых поясов IANA. Эта поддержка была добавлена в стандартную библиотеку.

PEP: 615

Часовые пояса IANA часто называют tz или zone info. Существует много часовых поясов IANA с разными путями поиска для указания часового пояса IANA объекта datetime. Например, мы можем передать имя пути поиска объекту datetime как Continent/City, чтобы установить его tzinfo.

dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))

Если мы передадим неверный ключ, возникнет ошибка zoneinfo.ZoneInfoNotFoundError.

Более детально

Библиотека datetime используется для создания объекта datetime и указания его часового пояса, путем установки свойства tzinfo. Все может обернуться созданием сложных правил часового пояса при использовании базового показателя datetime.tzinfo.

В большинстве случаев нужно просто установить объект и его часовой пояс: UTC, локальный часовой пояс системы, или часовой пояс IANA.

Можно создать объект zoneinfo.ZoneInfo(key), где ключ имеет строковый тип, указывающий путь поиска файла зоны в базе данных часовых поясов системы. Объект zoneinfo.ZoneInfo(key) может быть создан и установлен как свойство tzinfo объекта datetime.

Код:

        from zoneinfo import ZoneInfo

from datetime import datetime

dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("America/Los_Angeles"))
    
***

Для получения более подробной информации вы можете ознакомиться с источником.

https://www.python.org/dev/peps/pep-0615

6. Возможность отмены одновременных фьючерсов.

В concurrent.futures.Executor.shutdown () добавлен новый параметр cancel_futures.

Он отменяет все отложенные фьючерсы, которые не были запущены.

До версии 3.9 процесс ожидал их завершения перед завершением работы исполнителя.

Пояснение

Новый параметр cancel_futures был добавлен в ThreadPoolExecutor и ProcessPoolExecutor. Это работает так: если его значение – True, все ожидающие фьючерсы отменяются при вызове функции shutdown ().

При выполнении shutdown () интерпретатор проверяет, не собран ли исполнитель сборщиком мусора. Если он все еще находится в памяти, он получает все ожидающие обработки элементы, а затем отменяет фьючерсы.

Когда не остается незавершенных рабочих элементов, он завершает работу.

***

Для получения более подробной информации вы можете ознакомиться с источником.

https://bugs.python.org/issue30966

7. Улучшения AsyncIO и многопроцессорности

В библиотеку asyncio и многопроцессорную обработку были внесен ряд улучшений.

Например:

1. Параметр reuse_address asyncio.loop.create_datagram_endpoint () больше не поддерживается из-за серьезных пробелов в безопасности.

2. Добавлены новые сопрограммы: shutdown_default_executor () и asyncio.to_thread (). shutdown_default_executor назначает завершение работы для исполнителя по умолчанию, который ждет завершения ThreadPoolExecutor. asyncio.to_thread () в основном используется для запуска функций, связанных с вводом-выводом, в отдельном потоке, чтобы избежать блокировки цикла событий.

Что касается улучшений библиотеки многопроцессорности, в класс multiprocessing.SimpleQueue был добавлен новый метод close ().

Этот метод точно закрывает очередь. Это гарантирует, что очередь будет закрыта и не останется дольше ожидаемого. Помните, что методы get (), put (), empty () не должны вызываться после закрытия очереди.

***

Для получения более подробной информации вы можете ознакомиться с источником.

https://bugs.python.org/issue30966

8. Постоянные ошибки импорта пакетов

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

Встроенная функция __ import __ () вызывает ошибку ValueError, а importlib .__ import __ () вызывает ошибку ImportError.

Теперь это исправили. __Import __ () вызывает ImportError вместо ValueError.

***

Для получения более подробной информации вы можете ознакомиться с источником.

https://bugs.python.org/issue37444

9. Генерация случайных байтов

Еще одна функция, добавленная в версии 3.9 – random.Random.randbytes (). Эта функция может использоваться для генерации случайных байтов.

Можно генерировать случайные числа, но что, если нужно генерировать случайные байты? Раньше разработчикам приходилось для этого проявлять изобретательность. Хотя можно использовать os.getrandom (), os.urandom () или secrets.token_bytes (), но нельзя генерировать псевдослучайные паттерны.

К примеру, чтобы гарантировать, что случайные числа генерируются с ожидаемым поведением и процесс воспроизводится, обычно используется модуль random.Random.

В результате был введен метод random.Random.randbytes (). Он также может генерировать случайные байты контролируемым способом.

***

Для получения более подробной информации вы можете ознакомиться с источником.

https://bugs.python.org/issue40286

10. Исправление функции замены строки

Раньше «» .replace («», s, n) возвращал пустую строку вместо s для всех ненулевых n.

Этот баг сбивал с толку пользователей и приводил к нестабильному поведению приложений.

В Python 3.9 проблема была устранена, и теперь функция замены совместима с "" .replace ("", s).

Работает она следующим образом: для заданного максимального аргумента вхождения замены, набор символов из строки заменяется новым набором символов:

string.replace(s, old, new[, maxreplace])

В этом случае возвращается копия строки s со всеми вхождениями старой подстроки, замененной на новую. Если указан необязательный аргумент maxreplace, заменяются первые экземпляры maxreplace.

До этого функция replace имела непоследовательное поведение

        "".replace("", "blog", 1)

Возвращает ''

Ожидалось увидеть blog

"".replace("", "|", 1)

Возвращает ''

Ожидалось увидеть |

"".replace("", "prefix")

Но возвращает 'prefix'
    

Теперь:

        “”.replace(“”,s,n) возвращает s вместо пустой строки для всех ненулевых n
    

В Python 3.9 также был исключен ряд избыточных функций, таких как Py_UNICODE_MATCH.

Если вы хотите узнать больше об этих улучшениях, прочтите официальное руководство здесь.

***

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

18
Ноя
2020

📊Django, Pandas и Chart.js для быстрой панели инструментов

Попробуем разобраться, как можно использовать Django, Pandas и Chart.js для быстрого отображения данных в виде различных графиков и диаграмм.

Перевод публикуется с сокращениями, автор оригинальной статьи Shane
Gary.


Эту связку полезно применять для быстрой визуализации одной
таблицы с несколькими различными графиками, а также для создания надежного сайта на
Django и Chart.js.

Почему Pandas? Все задачи можно выполнить изнутри Django непосредственно из БД, т. к. правильные запросы к базе всегда будут выгоднее для
продакшена.

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

Почему Chart.js? Если вы хотите развернуть кучу различных
интерактивных диаграмм, изменив несколько переменных – Chart.js сделает это быстрее
других.

Исходные тексты и простой набор данных из туториала вы
найдете по ссылкам.

Настройка Django

Все действия в этом проекте будут происходить на сервере с Debian.

        pip install django pandas
django-admin startproject django_charts
cd django_charts
python manage.py migrate
python manage.py createsuperuser
python manage.py startapp data
cd data 
mkdir templates
cd ..
python manage.py runserver
    

Дополнительно можете установить себе palettable – цветовую палитру
для Python, однако код будет работать и без нее.

        pip install palettable
    

На основе набора данных мы создадим следующую модель, но она
должна быть изменена под ваши нужды.

        from django.db import models

class Purchase(models.Model):
    city = models.CharField(max_length=50)
    customer_type = models.CharField(max_length=50)
    gender = models.CharField(max_length=50)
    unit_price = models.FloatField()
    quantity = models.IntegerField()
    product_line = models.CharField(max_length=50)
    tax = models.FloatField()
    total = models.FloatField()
    date = models.DateField()
    time = models.TimeField()
    payment	= models.CharField(max_length=50)
    cogs = models.FloatField()
    profit = models.FloatField()
    rating  = models.FloatField()
    

Обязательно обновите БД после ее создания:

        python manage.py makemigrations
python manage.py migrate
    

С помощью Pandas и Django сделайте загрузку csv в базу данных для Kaggle:

        import pandas as pd
from .models import Purchase

# dataset from https://www.kaggle.com/aungpyaeap/supermarket-sales
# headers changed and invoice number col removed
def csv_to_db():
    df = pd.read_csv('supermarket_sales.csv') # use pandas to read the csv
    records = df.to_records()  # convert to records

    # loop through and create a purchase object using django
    for record in records:
        purchase = Purchase(
            city=record[3],
            customer_type=record[4],
            gender=record[5],
            product_line=record[6],
            unit_price=record[7],
            quantity=record[8],
            tax=record[9],
            total=record[10],
            date=datetime.strptime(record[11], '%m/%d/%Y').date(),
            time=record[12],
            payment=record[13],
            cogs=record[14],
            profit=record[16],
            rating=record[17],
        )
        purchase.save()

    

Импортируйте себе всю эту штуку:

        from django.views.generic import TemplateView
from .methods import csv_to_db
class Dashboard(TemplateView):
    template_name = 'dashboard.html'
    def get_context_data(self, **kwargs):
         # get the data from the default method       
        context = super().get_context_data(**kwargs)
        csv_to_db()
    

Затем создайте пустой файл base/dashboard.html и data/urls.py:

        from django.urls import path
from data import views

urlpatterns = [
    path('', views.Dashboard.as_view(), name='dashboard')
]
    

Отредактируйте django_charts/urls.py, чтобы добавить URL для данных:

        from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('data/', include('data.urls')),
]
    

Обновите список django_charts/settings.py, чтобы включить data
в INSTALLED_APPS:

        INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'data',
]
    

Убедимся, что можем видеть покупку в админке, добавив это в
data/admin.py:

        from django.contrib import admin
from .models import Purchase

admin.site.register(Purchase)
    

Теперь вы можете перейти на страницу дашборда (127.0.0.1:8000/data/),
а потом проверить в админке (127.0.0.1:8000/admin/data/purchase/), видны ли все
записи. Если вы используете тот же набор данных, их должно быть около 1000.

Настройка HTML

Есть базовый файл, который мы будем расширять:

        {% load static %}

<!doctype html>
<html lang="en">
  <head>
    <title>
      {% block title %}{% endblock %}
    </title>
    
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link rel="shortcut icon" type="image/x-icon" href="{% static 'img/favicon.png' %}">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">

  </head>
  <body>
    {% block page_content %}{% endblock %}
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script
        src="http://code.jquery.com/jquery-3.5.1.min.js"
        integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
        crossorigin="anonymous">
    </script>
    <script 
        src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" 
        integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" 
        crossorigin="anonymous">
    </script>
    <script 
        src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" 
        integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" 
        crossorigin="anonymous">
    </script>

    <!-- Chart.JS -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>

    <script>
      $(document).ready(function(){
        {% block js_scripts %}{% endblock %}
      })
    </script> 
  </body>
</html>
    

Немного модернизируем его:

        {% block title %}{% endblock %}
{% block custom_css %}{% endblock %}
{% block page_content %}{% endblock %}
{% block js_scripts %}{% endblock %}
    

Это даст возможность добавлять
блоки с любой страницы. Обратите внимание, что здесь включен bootstrap CDN,
чтобы использовать popper.js (это опционально). Можно выполнить проект совсем без
bootstrap, но придется отредактировать dashboard.html.

Все написанные сценарии обернуты в $(document).ready, чтобы не
происходило никаких манипуляций до тех пор, пока страница не будет готова.

Далее рассмотрим страницу с графиками – dashboard.html:

        {% extends 'base.html' %}

{% block page_content %}
    <div class="container">
        <div class="row mb-4 mt-4">
            <div class="col"
                <div class="card-deck">
                    {% for chart in charts %}
                        <div class="card">
                            <div class="card-body">
                                <div class="chart-container" style="height:150; width:150">
                                    {{ chart.html|safe }}
                                </div>
                            </div>
                        </div>
                        {% if forloop.counter|divisibleby:2 %}
                            <div class="w-100 d-none d-sm-block d-md-none mb-4"><!-- wrap every 2 on sm--></div>
                        {% endif %}
                        {% if forloop.counter|divisibleby:3 %}
                            <div class="w-100 d-none d-md-block d-lg-none mb-4"><!-- wrap every 3 on md--></div>
                        {% endif %}
                        {% if forloop.counter|divisibleby:4 %}
                            <div class="w-100 d-none d-lg-block d-xl-none mb-4"><!-- wrap every 4 on lg--></div>
                        {% endif %}
                        {% if forloop.counter|divisibleby:5 %}
                            <div class="w-100 d-none d-xl-block mb-4"><!-- wrap every 5 on xl--></div>
                        {% endif %}
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block js_scripts %}
    {% for chart in charts %}
        {{ chart.js|safe }}
    {% endfor %}
{% endblock %}
    

Здесь создается контейнер, строка и колонка, внутри которой
лежит «колода карт», создающая карты одинакового размера.

Колода карт будет пытаться втиснуть все в одну строку.
Счетчики forloop.counters используются для определения размера экрана и
соответствующего обертывания колоды карт, однако на практике вы обнаружите, что Chart.js зачастую игнорирует настройки размера холста.

views.py

Чтобы лучше понять происходящее, посмотрим на views.py:

        import pandas as pd
import numpy as np
from django.views.generic import TemplateView
from .methods import csv_to_db
from .models import Purchase
from .charts import objects_to_df, Chart

PALETTE = ['#465b65', '#184c9c', '#d33035', '#ffc107', '#28a745', '#6f7f8c', '#6610f2', '#6e9fa5', '#fd7e14', '#e83e8c', '#17a2b8', '#6f42c1' ]

class Dashboard(TemplateView):
    template_name = 'dashboard.html'

    def get_context_data(self, **kwargs):

        # получение данные из метода по умолчанию
        context = super().get_context_data(**kwargs)

        # поля, которые мы будем использовать
        # df_fields = ['city', 'customer_type', 'gender', 'unit_price', 'quantity', 
        #     'product_line', 'tax', 'total' , 'date', 'time', 'payment', 
        #     'cogs', 'profit', 'rating']

        # поля для исключения
        # df_exclude = ['id', 'cogs']
        
        # создание фрейма данных с записями. chart.js не очень хорошо справляется 
        # с датами во всех ситуациях, поэтому наш метод преобразует их в строки
        # и нужно будет определить столбцы дат и нужный формат.
        
        df = objects_to_df(Purchase, date_cols=['%Y-%m', 'date'])

        # создание контекста charts для хранения всех графиков
        context['charts'] = []

        ### каждая диаграмма добавляется одинаково поэтому опишем первую
        # создадим объект диаграммы с уникальным chart_id и цветовой палитрой
        # если не указан chart_id или цветовая палитра, они будут генерироваться рандомно
        # тип диаграмм должен быть идентифицирован здесь и отличаться от типа chartjs
        city_payment_radar = Chart('radar', chart_id='city_payment_radar', palette=PALETTE)
        # создадим сводную таблицу pandas на основе полей и агрегации, которые мы хотим
        # стеки используются либо для группировки, либо для укладки определенного столбца
        city_payment_radar.from_df(df, values='total', stacks=['payment'], labels=['city'])
        # добавим контекст
        context['charts'].append(city_payment_radar.get_presentation())

        exp_polar = Chart('polarArea', chart_id='polar01', palette=PALETTE)
        exp_polar.from_df(df, values='total', labels=['payment'])
        context['charts'].append(exp_polar.get_presentation())

        exp_doughnut = Chart('doughnut', chart_id='doughnut01', palette=PALETTE)
        exp_doughnut.from_df(df, values='total', labels=['city'])
        context['charts'].append(exp_doughnut.get_presentation())

        exp_bar = Chart('bar', chart_id='bar01', palette=PALETTE)
        exp_bar.from_df(df, values='total', labels=['city'])
        context['charts'].append(exp_bar.get_presentation())

        city_payment = Chart('groupedBar', chart_id='city_payment', palette=PALETTE)
        city_payment.from_df(df, values='total', stacks=['payment'], labels=['date'])
        context['charts'].append(city_payment.get_presentation())

        city_payment_h = Chart('horizontalBar', chart_id='city_payment_h', palette=PALETTE)
        city_payment_h.from_df(df, values='total', stacks=['payment'], labels=['city'])
        context['charts'].append(city_payment_h.get_presentation())

        city_gender_h = Chart('stackedHorizontalBar', chart_id='city_gender_h', palette=PALETTE)
        city_gender_h.from_df(df, values='total', stacks=['gender'], labels=['city'])
        context['charts'].append(city_gender_h.get_presentation())

        city_gender = Chart('stackedBar', chart_id='city_gender', palette=PALETTE)
        city_gender.from_df(df, values='total', stacks=['gender'], labels=['city'])
        context['charts'].append(city_gender.get_presentation())

        return context
    

Будем использовать TemplateView. Это очень простое view, к которому можно что-то добавить. Единственный метод,
который необходимо расширить – get_context_data, использующийся в Django
для получения данных.

Мы вытаскиваем нужные объекты и создаем фрейм данных. Известно,
что
Chart.js не очень хорошо работает с датами –
конвертируем их в строки после создания фрейма. Затем добавляем каждый график в
контекст
Chart. Это позволяет перебирать графики в коде HTML, т. к. каждая диаграмма представляет собой словарь, содержащий гипертекст и
js-запись.

Charts.py

И наконец файл data/charts.py. Весь код легко переносится
в другой проект, и вы можете просто поместить его в свой view. Пробежимся по
некоторым функциям, а затем перейдем к классу Chart.

        def objects_to_df(model, fields=None, exclude=None, date_cols=None, **kwargs):
    """
    Возвращает фрейм данных pandas, содержащий записи в модели
    ``fields`` это необязательный список имен полей. Если это предусмотрено, вернется только
имя.
    ``exclude`` это необязательный список имен полей. Если это предусмотрено, 
именованные элементы исключатся из возвращаемого dict
    ``date_cols`` chart.js в настоящее время он не очень хорошо обрабатывает даты, поэтому эти
столбцы должны быть преобразованы в строку.
    ``kwargs`` можно включить, чтобы ограничить модельный запрос конкретными записями
    """
    
    if not fields:
        fields = [field.name for field in model._meta.get_fields()]

    if exclude:
        fields = [field for field in fields if field not in exclude]

    records = model.objects.filter(**kwargs).values_list(*fields)
    df = pd.DataFrame(list(records), columns=fields)

    if date_cols:
        strftime = date_cols.pop(0)
        for date_col in date_cols:
            df[date_col] = df[date_col].apply(lambda x: x.strftime(strftime))
    
    return df
    

Эта функция принимает модель Django и возвращает все записи. Можно
включить некоторые фильтры после всех аргументов имени. Например:

        objects_to_df(Purchase, fields=None, exclude=['id'], date_cols=['%Y-%m', 'date'], city='Mandalay')

    

Результат будет ограничен городом Мандалай. Поля include и exclude работают аналогично Django. Если вы ничего
не включаете,
будут выведены все поля из модели. Важно отметить, что exclude обрабатываются после include. Таким
образом, если включить и исключить столбец, он не будет отображаться.

        def get_options():
    """
    Дефолтное значение для всех графиков
    """
    return {}
    

Этот код устанавливает параметры по умолчанию для всех графиков.

        def generate_chart_id():
    """
    Вернет 8 рандомных сгенерированных символов ascii 
    """
    return ''.join(random.choice(string.ascii_letters) for i in range(8))
    

Если вы не хотите утруждать себя маркировкой каждого из них,
данная функция устанавливает случайный
ID, используемый JS для изменения элемента HTML. Этот идентификатор также используется для именования функции JS
и переменной, чтобы облегчить отладку.

        from palettable.lightbartlein.diverging import BlueDarkRed12_6 as palette # example import

def get_colors():
    """
    Цвета из palette.colors или случайным образом сгенерированный список цветов.
    Отлично работает с модулем palettable
    но не является обязательным и будет вызывать get_random_colors
    если palette.colors не задана
    """
    try:
        return palette.hex_colors
    except:
        return get_random_colors(6)
    

get_colors применяется для установки начальных цветов. Если ее
передать в палитру, она будет использоваться в качестве основной. Если ничего
не передавать и не импортировать из palletable, то цвета будут генерироваться случайным образом.

        def get_random_colors(num, colors=[]):
    
    while len(colors) < num:
        color = "#{:06x}".format(random.randint(0, 0xFFFFFF))

        if color not in colors:
            colors.append(color)

    return colors
    

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

По функциям все. Ниже приведен класс Chart.

        @dataclass
class Chart:
    """
    Класс в помощь к chart.js.
    ``datasets`` собственно данные. Содержит данные и варианты их получения.
    ``labels`` метки для данных.
    ``chart_id`` уникальный ID диаграммы. Будет сгенерирован рандомно
    если таковой не предусмотрен. Это должна быть допустимая JS-переменная.
    Не используйте '-'
    ``palette`` список цветов.  Будет сгенерирован, если ни один не указан.
    """
    chart_type: str
    datasets: List = field(default_factory=list)
    labels: List = field(default_factory=list)
    chart_id: str = field(default_factory=generate_chart_id)
    palette: List = field(default_factory=get_colors)
    options: dict = field(default_factory=get_options)
    

Здесь использовался dataclass – это относительно недавнее
дополнение Python и для быстрых классов оно будет хорошим выбором. Установка
начальных значений помогает гарантировать, что вы не используете изменяемый
объект для экземпляра.

        def from_lists(self, values, labels, stacks):
    """
    Функция построения графиков из списка
    ``values`` список датасетов, содержащий одно значение.
    ``labels`` метки значений.
    ``stacks`` метки для каждого набора данных в списке значений.
    """
    self.datasets = []

    # убеждаемся, что у нас правильное количество цветов
    if len(self.palette) < len(values):
        get_random_colors(num=len(values), colors=self.palette)
    
    # создаем датасет
    for i in range(len(stacks)):
        self.datasets.append(
            {
                'label': stacks[i],
                'backgroundColor': self.palette[i],
                'data': values[i],
            }
        )

    if len(values) == 1:
        self.datasets[0]['backgroundColor'] = self.palette

    self.labels = labels
    

from_dataframe помогает использовать несколько
строк кода для манипулирования практически любым фреймом данных, чтобы передавать
все непосредственно в from_lists для Chart.js. Мы применяем метод pivot_table и Pandas, чтобы создать pivot_table
на основе входных данных. Она может выгружать списки, которые нужны для
диаграммы.

        def from_df(self, df, values, labels, stacks=None, aggfunc=np.sum, round_values=0, fill_value=0):
    """
    Функция построения графиков из датафрейма.
    ``df`` используемый датафрейм.
    ``values`` имя колонки со значениями.
    ``stacks`` имя колонки со stack-ами.
    ``labels`` имя колонки с метками.
    ``aggfunc`` функция, агрегирующая значения. 
    ``round_values`` десятичный знак для округления.
    ``fill_value`` используется если значение пустое.
    """
    pivot = pd.pivot_table(
        df,
        values=values,
        index=stacks,
        columns=labels,
        aggfunc=aggfunc,
        fill_value=0
    )

    pivot = pivot.round(round_values)

    values = pivot.values.tolist()
    labels = pivot.columns.tolist()
    stacks = pivot.index.tolist()

    self.from_lists(values, labels, stacks)
    

Заключение

Чтобы внедрить код в своем проекте, скопируйте
chart.py и используйте его, как views.py в нашем. Обязательно убедитесь,
что базовый файл HTML импортирует chart.js cdn. Bootstrap – по желанию. Удачи в
обучении и экспериментах!

Весь код из статьи:

        @dataclass
class Chart:
    chart_type: str
    datasets: List = field(default_factory=list)
    labels: List = field(default_factory=list)
    chart_id: str = field(default_factory=generate_chart_id)
    palette: List = field(default_factory=get_colors)
    options: dict = field(default_factory=get_options)

    def from_lists(self, values, labels, stacks):
       
        self.datasets = []

        if len(self.palette) < len(values):
            get_random_colors(num=len(values), colors=self.palette)
        
        for i in range(len(stacks)):
            self.datasets.append(
                {
                    'label': stacks[i],
                    'backgroundColor': self.palette[i],
                    'data': values[i],
                }
            )

        if len(values) == 1:
            self.datasets[0]['backgroundColor'] = self.palette

        self.labels = labels

    def from_df(self, df, values, labels, stacks=None, aggfunc=np.sum, round_values=0, fill_value=0):

        pivot = pd.pivot_table(
            df,
            values=values,
            index=stacks,
            columns=labels,
            aggfunc=aggfunc,
            fill_value=0
        )

        pivot = pivot.round(round_values)
        
        values = pivot.values.tolist()
        labels = pivot.columns.tolist()
        stacks = pivot.index.tolist()

        self.from_lists(values, labels, stacks)

    def get_elements(self):
       
        elements = {
            'data': {
                'labels': self.labels, 
                'datasets': self.datasets
            },
            'options': self.options
        }

        if self.chart_type == 'stackedBar':
            elements['type'] = 'bar'
            self.options['scales'] = {
                        'xAxes': [
                            {'stacked': 'true'}
                        ], 
                        'yAxes': [
                            {'stacked': 'true'}
                        ]
                    }

        if self.chart_type == 'bar':
            elements['type'] = 'bar'
            self.options['scales'] = {
                        'xAxes': [
                            {
                                'ticks': {
                                    'beginAtZero': 'true'
                                }
                            }
                        ], 
                        'yAxes': [
                            {
                                'ticks': {
                                    'beginAtZero': 'true'
                                }
                            }
                        ]
                    }

        if self.chart_type == 'groupedBar':
            elements['type'] = 'bar'
            self.options['scales'] = {
                        'xAxes': [
                            {
                                'ticks': {
                                    'beginAtZero': 'true'
                                }
                            }
                        ], 
                        'yAxes': [
                            {
                                'ticks': {
                                    'beginAtZero': 'true'
                                }
                            }
                        ]
                    }
        
        if self.chart_type == 'horizontalBar':
            elements['type'] = 'horizontalBar'
            self.options['scales'] = {
                        'xAxes': [
                            {
                                'ticks': {
                                    'beginAtZero': 'true'
                                }
                            }
                        ], 
                        'yAxes': [
                            {
                                'ticks': {
                                    'beginAtZero': 'true'
                                }
                            }
                        ]
                    }

        if self.chart_type == 'stackedHorizontalBar':
            elements['type'] = 'horizontalBar'
            self.options['scales'] = {
                        'xAxes': [
                            {'stacked': 'true'}
                        ], 
                        'yAxes': [
                            {'stacked': 'true'}
                        ]
                    }

        if self.chart_type == 'doughnut':
            elements['type'] = 'doughnut'
        
        if self.chart_type == 'polarArea':
            elements['type'] = 'polarArea'
        
        if self.chart_type == 'radar':
            elements['type'] = 'radar'

        return elements
    
    def get_html(self):
        code = f'<canvas id="{self.chart_id}"></canvas>'
        return code

    def get_js(self):
        code = f"""
            var chartElement = document.getElementById('{self.chart_id}').getContext('2d');
            var {self.chart_id}Chart = new Chart(chartElement, {self.get_elements()})
        """
        return code

    def get_presentation(self):
        code = {
            'html':self.get_html(),
            'js': self.get_js(),
        }
        return code
    

Дополнительные материалы:

18
Ноя
2020

🥇👨‍🎓️📈Хакатоны и соревнования для специалистов по Data Science

Мы собрали для вас все ближайшие мероприятия для карьерного роста и получения новых знаний в сфере Data Science. На фоне пандемии коронавируса многие из них проходят в онлайн-формате.

В статье «Научиться Data Science онлайн» мы рассказали, как овладеть стать специалистам по анализу данных с нуля. В подготовленной при поддержке Факультета Искусственного интеллекта онлайн-университета GeekBrains публикации мы собрали все ближайшие хакатоны и соревнования, которые помогут освоить навыки Data Scientist на практике.

Хакатоны

<a href="https://latimeshighschool.files.wordpress.com/2020/08/bytes-of-tech.png" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Хакатон FIT-M 2020

Когда: c 16 по 18 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: русский

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

Подробнее: https://fit-m.org/hack

Hack Life

Когда: c 21 по 22 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: русский

Призовой фонд: 100000 рублей

Самое интересное: хакатон для начинающих аналитиков, посвященный комфортной городской среде.

Подробнее: https://hacklife.fun/

SharkHacks

Когда: c 4 по 6 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

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

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

Подробнее: https://organize.mlh.io/participants/events/6046-sharkhacks

TechTogether New York 2020

Когда: c 4 по 6 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

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

Самое интересное: открытый хакатон для всех, кто интересуется STEM – от новичков до опытных хакеров.

Подробнее: https://newyork.techtogether.io/

Who Done It Hacks?

Когда: c 11 по 13 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

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

Самое интересное: хакатон в стиле Шерлока Холмса, во время которого вам предстоит следовать подсказкам для разгадки тайн.

Подробнее:https://organize.mlh.io/participants/events/6047-who-done-it-hacks

Hack Off

Когда: c 12 по 13 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

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

Самое интересное: 48-часовой хакатон на темы Data Science, AI, OIT, robotics, blockchain, AR и VR, open innovations.

Подробнее: https://www.hackoff.tech/

RoseHack

Когда: c 16 по 17 января 2021 г.

Где: онлайн

Стоимость участия: бесплатно

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

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

Подробнее: https://rosehack.com/

HoyaHacks

Когда: c 29 по 31 января 2021 г.

Где: онлайн

Стоимость участия: бесплатно

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

Самое интересное: хакатон для студентов, заинтересованных в создании чего-то нового. В качества бонуса – возможность пообщаться с профессионалами отрасли и выиграть призы.

Подробнее: http://hoyahacks.georgetown.domains/

Hacklytics

Когда: c 5 по 7 февраля 2021 г.

Где: онлайн

Стоимость участия: бесплатно

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

Самое интересное: хакатон на тему “Building a Data-Driven World” для студентов и специалистов Data Science.

Подробнее: https://hacklytics.io/

Соревнования

<a href="https://mysterium.network/wp-content/uploads/2019/10/Artboard-7-100.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Riiid! Answer Correctness Prediction

Дедлайн для регистрации команд: 31 декабря 2020 г.

Дата окончания: 7 января 2021 г.

Призы: 1 место – $50 000 , 2 место – $30 000, 3 место – $10 000, 4 и 5 место – $5 000. Команды-победители также будут приглашены представить свои модели на семинаре AAAI-2021 по образованию в области искусственного интеллекта (Imaginating Post-COVID Education with AI).

В этом конкурсе ваша задача создать алгоритмы для “Knowledge Tracing”, моделирования знаний студентов. Цель состоит в том, чтобы точно предсказать, как студенты будут действовать в определенных ситуациях. Для решения задачи нужно будет совместить навыки в области машинного обучения с данными EdNet Riiid.

Подробнее: https://www.kaggle.com/c/riiid-test-answer-prediction

NFL Big Data Bowl 2021

Дедлайн для регистрации команд: 7 января 2021 г.

Дата окончания: 7 января 2021 г.

Призы: 1-5 место – $15 000. Победители соревнования представят свои результаты в NLF, где одна команда сможет выиграть дополнительные 10 000 долларов.

В этом соревновании используется NFL’s Next Gen Stats data, которая включает в себя позицию и скорость каждого игрока на поле. Вам предстоит использовать данные игроков для всех выпадающих пасов регулярного сезона 2018 года. Цель соревнования – определить уникальные и эффективные подходы к измерению защитных стратегий этих игр.

Подробнее: https://www.kaggle.com/c/nfl-big-data-bowl-2021

Rock, Paper, Scissors

Дедлайн для регистрации команд: 1 февраля 2021 г.

Дата окончания: 8 февраля 2021 г.

Призы: мерч Kaggle достанется пяти лучшим проектам соревнования.

В этом соревновании-симуляторе вы создадите AI, который сможет играть против других в раундах Rock, Paper, Scissors. Сможете ли вы найти закономерности, чтобы выигрывать чаще? Можно ли значительно превзойти случайного игрока, когда в матчах участвуют неслучайные агенты?

Подробнее: https://www.kaggle.com/c/rock-paper-scissors

Predict Future Sales

Дата окончания: декабрь 2020 г.

Заключительный проект курса “How to win a data science competition”. В конкурсе вы будете работать со сложным набором временных рядов, состоящим из ежедневных данных о продажах 1C Company. Вам предстоит спрогнозировать общий объем продаж для каждого продукта и магазина в следующем месяце.

Подробнее: https://www.kaggle.com/c/competitive-data-science-predict-future-sales/overview

INGV – Volcanic Eruption Prediction

Дедлайн для регистрации команд: 30 декабря 2020 г.

Дата окончания: 30 декабря 2020 г.

Призы: мерч Kaggle достанется трем лучшим проектам соревнования.

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

Подробнее: https://www.kaggle.com/c/predict-volcanic-eruptions-ingv-oe

House Prices: Advanced Regression Techniques

Дата окончания: неизвестно

Это соревнование подходит имеющим опыт программирования на R или Python и знакомым с основами машинного обучения студентам, которые хотят расширить навыки перед участием в соревнованиях с денежными призами. С помощью 79 описывающих характеристики жилых домов в Эймсе (штат Айова, США) переменных участникам нужно предсказать окончательную цену каждого объекта. Практические навыки, которые вы сможете развить: Creative feature engineering и продвинутые методы регрессии, вроде random forest and gradient boosting.

Подробнее: https://www.kaggle.com/c/house-prices-advanced-regression-techniques

Digit Recognizer

Дата окончания: неизвестно

MNIST (“Modified National Institute of Standards and Technology”) — это “hello world” компьютерного зрения. В соревновании нужно правильно идентифицировать цифры из десятков тысяч рукописных изображений. Вам предстоит поэкспериментировать с различными алгоритмами, чтобы лучше понять их работу. Практические навыки, которые вы сможете развить: основы компьютерного зрения, включая простые нейронные сети, а также методы классификации, вроде SVM и K-nearest neighbors.

Подробнее: https://www.kaggle.com/c/digit-recognizer

I’m Something of a Painter Myself

Дата окончания: неизвестно

Призы: победители получат один из 3 призов “TPU Star” – 20 часов TPU в неделю на Kaggle в течение четырех недель.

GANs – генеративные состязательные сети, которые состоят их двух нейронных сетей: модели генератора и модели дискриминатора. Они будут работать друг против друга, причем генератор попытается обмануть дискриминатор, а дискриминатору нужно точно классифицировать реальные и сгенерированные изображения. Ваша задача – построить GANs, которые генерируют от 7000 до 10 000 изображений в стиле Моне.

Подробнее: https://www.kaggle.com/c/gan-getting-started

Contradictory, My Dear Watson

Дата окончания: неизвестно

Если у вас есть два предложения, одно может следовать из другого, противоречить ему, или они могут быть не связанными. Natural Language Inferencing (NLI) является одной из проблем NLP, которая заключается в определении связи между парой предложений. Задача соревнования — создать модель NLI, которая присваивает метки, соответствующие влечению, нейтральности и противоречию парам предпосылок и гипотез. Тренировочный и тестовый набор данных включают тексты на пятнадцати различных языках.

Подробнее: https://www.kaggle.com/c/contradictory-my-dear-watson

EMO 2021 HUAWEI Logistics Competition

Дата окончания: 1 марта 2021 г.

Призы: победители будут награждены денежными призами и трофеями, их также пригласят выступить с докладами на EMO 2021.

Соревнование от компании Huawei Technologies Ltd, посвященное оптимизации маршрутизации транспорта.

Подробнее: https://competitions.codalab.org/competitions/27329

***

Если вы только начинаете свой путь в Data Science, хотите получить диплом и помощь в трудоустройстве, стоит обратить внимание на курс Факультета Искусственного интеллекта онлайн-университета GeekBrains. Он включает основательную математическую подготовку, изучение программирования и статистического анализа, а также работу с базами данных реальных проектов.

18
Ноя
2020

💲🛠 🖥 👍 Лучшие настольные компьютеры для программиста в 2020 году

Мы отобрали 80 моделей комплектующих, из которых можно собрать десктоп для айтишника под разный бюджет и различные задачи. В статью вошли сборки от бюджетной за 33 тыс. руб. до способной тренировать нейронные сети за 200 тыс. руб.