Получи случайную криптовалюту за регистрацию!

How To IT

Логотип телеграм канала @howto_it — How To IT H
Логотип телеграм канала @howto_it — How To IT
Адрес канала: @howto_it
Категории: Технологии
Язык: Русский
Количество подписчиков: 2.88K
Описание канала:

Твой путеводитель в мир IT
По вопросам: @EKorjikov
Прайс: https://telega.in/c/HowTo_IT

Рейтинги и Отзывы

3.00

2 отзыва

Оценить канал howto_it и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

1

3 звезд

0

2 звезд

1

1 звезд

0


Последние сообщения 4

2021-09-13 17:25:03 ​​11 cайтов, на которых можно порешать задачи по программированию

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

1. Codeforces
Несомненно самая популярная и известная платформа во всем мире для проведения соревнований на алгоритмику. Кроме крупных контестов сайт зачастую проводит свои «раунды» — участникам даются 5 задач на два часа. Есть система рейтинга, на основе которой участники делятся на два дивизиона. Таким образом, профи не соревнуются с новичками напрямую. Все задачи можно сдать и проверить даже после соревнований. Кроме «раундов» доступны и «тренировки» — задачи с прошедших соревнований публикуются в режиме дорешивания.

2. TopCoder — ненамного отстающая по популярности от Codeforces американская платформа. Примечательна тем, что кроме алгоритмических контестов, которые описывались ранее, на ней проводятся и соревнования по промышленному программированию и марафоны — соревнования с задачами на исследование, для которых нет единого верного алгоритма, а есть лишь ответ, подходящий больше или меньше. На решение таких задач участникам обычно дается одна или две недели.

3. Timus Online Judge — русскоязычная (хотя английский язык также поддерживается) платформа, на которой более тысячи задач удачно отсортированы по темам и по сложности. Также тут регулярно проводятся контесты уральского региона, которые, впрочем, не представляют для вас ничего интересного, если только вы не студент УрФУ или другого близлежащего вуза

4. SPOJ — крупный англоязычный сайт с более чем 20000 задачами на абсолютно разные темы: динамическое программирование, графы, структуры данных и т.д. Изредка проводит контесты, которые не представляют интереса, если вы не живете в странах их проведения.

5. informatics.mccme.ru — платформа с множеством теоретических материалов и задач по соответствующим темам. Все очень удобно собрано по категориям и темам. Также содержит большую базу задач с прошедших олимпиад школьников.

6. CodeChef — менее крупный аналог Codeforces и TopCoder, тоже с огромным архивом задач и регулярными контестами.

7. acmp.ru — сайт, который будет полезен всем благодаря своему архиву задач, удобно (и по большей части правильно) отсортированному по сложности и темам. Соревнования проводятся, но участвовать в них имеет смысл только школьникам Красноярского края, для которых эта платформа изначально и предназначалась.

8. Project Euler — сборник 500 задач, которые невозможно решить без знаний математических и геометрических алгоритмов. Иногда используется на собеседованиях для приема на работу, чтобы лучше выяснить алгоритмическую подготовку претендента.

9. Kaggle — данная платформа отличается от описанных ранее тем, что тут не проводится алгоритмических соревнований — только задачи на исследование (как в марафонах на вышеприведенном TopCoder). Например, одна из задач, на которой сейчас там проверяют свои умения участники, состоит в распознании написанных вручную цифр.

10. HackerRank наоборот будет больше интересен профессионалам, которые уже многое умеют. На этом сайте собрано множество задач на самые разные разделы Computer Science: традиционная алгоритмика, ИИ, машинное обучение и т.д. Если вы решите много задач, то вами могут заинтересоваться работодатели, регуляторно мониторящие эту платформу.

11. C Puzzles — подборка головоломок, специфичный для языка С, со всеми его причудами. Например, дан код, который, по логике, не должен работать, но, тем не менее, он компилируется и даже правильно выполняет свою задачу. Надо понять, почему так? На этой сайте вы сможете приобрести навык отладки программ и чтения кода других.

#совет #кодинг
654 views14:25
Открыть/Комментировать
2021-09-12 18:10:217 способов испортить код. Избавляемся от вредных привычек

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

1. Костыли  

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

2. Велосипед

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

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

4. Пренебрежение трендами

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

5. Попытки продумывать процесс разработки целиком

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

6. Отсутствие желания понять основы

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

7. Обучение без практики 

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

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

#совет #кодинг
698 views15:10
Открыть/Комментировать
2021-09-11 17:30:07ТОП-5 проблем программистов: как решать?

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

Проблема №1: Программист ошибся в оценке объема работ и просит расширения
Такие ошибки традиционно возникают из-за неверной первоначальной оценки масштаба проекта — когда ориентация идет на лучший сценарий, без адекватной оценки потенциальных рисков и сложностей, объёма задач и взаимовлияния выполняемых функций.

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

Решение
Нужно допускать, что процессы могут протекать с затруднениями — и не забывать худший вариант. Вместо того, чтобы ставить жёсткие дедлайны, лучше оценивать процессы в баллах или условных единицах. И в дальнейшем планировать результаты, опираясь на количество баллов, полученных в последних спринтах.

Проблема №2: Программист ошибся при выборе технологии, что негативно сказалось на проекте
Технологии меняются так быстро, что зачастую разработчики не успевают их изучить. И тут возникают две крайности: либо программисты приступают к работе без достаточного знания технологии (и это вина менеджера по продукту, который положился на такого специалиста), либо, напротив, слишком сильно погружаются в её изучение, посещают многочисленные онлайн-курсы, читают книги.

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

Проблема №3: Код, написанный одним программистом, непонятен другому и требует много времени на изучение
Большая часть программирования – это работы по улучшению существующей кодовой базы или её полное переписывание. Самые успешные кодовые базы в мире были разработаны сотнями людей, которые никогда не встречались друг с другом. У многих из этих проектов было очень мало документации (или вообще не было), отсутствовали комментарии в кодовой базе, рекомендации или помощь.

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

Решение
Профессионалы должны принимать такие ситуации и вызовы, чтобы оправдывать звание настоящего программиста!

Проблема №4: Новый программист на проекте критикует предыдущего и рекомендует переделать всё с нуля
Работа на проектом носит командный характер, и новым участникам важно это понимать. Если критика неконструктивна и затратна, то она никак не скажется на прогрессе.

Решение
В данной ситуации нужны шаги с обеих сторон. Новички должны влиться в команду и помочь ей работать продуктивнее. А, рекрутёрам или менеджерам проекта — если они заметили в сотруднике такие черты — лучше изначально отказаться от услуг «критикана» и поменять его на другого специалиста.

Проблема №5: программист просит выделить время на переработку своего кода и устранение дефектов, которые не видны пользователям системы
Основная цель переработки или перепроектирования (рефакторинга) кода — сделать его более эффективным и удобным в обслуживании. Это помогает снизить затраты на будущее обслуживание и поможет предотвратить новые ошибки.

Решение
Делать переработку кода медленно, но неуклонно. И при планомерной работе вы увидите, что постепенно код становится более компактным и читаемым. Люди увидят изменения, но на это требуется время.

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

#совет
327 views14:30
Открыть/Комментировать
2021-09-10 16:01:30Чем опасны cookies

Файлы cookie используются в веб-браузерах на протяжении 25 лет. Рекламодатели используют файлы cookie для показа рекламы, владельцы веб-сайтов — для оценки своей аудитории, Разработчикам они. помогают обеспечивать более персонализированное и удобное посещение сайтов. Например, файлы cookie позволяют сайтам запоминать вас: ваш логин, настройки входа в систему, языковые настройки, корзины покупок и многое другое.

Вредны ли cookies?

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

С момента изобретения файлов cookie вся отрасль полагалась на возможность отслеживать пользователей сайта. Сторонние файлы (которые вы получаете при посещении веб-сайта от других, «третьих лиц») считаются  самым популярным механизмом, для идентификации пользователя, который перемещается между разными сайтами.
Локальное хранилище, хранилище сеансов, IndexedDB, ETag и параметры последнего изменения, веб-кеш, назначение уникального идентификатора и так далее уже позволяют успешно обойти ограничения «плохих файлов cookie».

Как защитить себя?

Многие пользователи переживают, что, принимая cookie, они раскрывают доступ к личной информации хакерам. Риски действительно существуют при определенных условиях. Например, если человек использует публичный Wi-Fi, незащищенные или уже взломанные устройства. Также проблема может возникнуть со стороны владельцев платформ для е-коммерции. Если не уделять должное внимание IT-безопасности, хакеры могут украсть cookies и использовать в своих целях. Однако при соблюдении правил кибергигиены эти риски существенно минимизируются.
Рекомендуем не принимать файлы cookie автоматически. Как вариант, можно отклонять все и проанализировать, будет ли удобно вводить личные данные с каждым новым посещением веб-страниц. Кроме того, пользователи могут регулярно удалять эти файлы вручную.
Также режим инкогнито — простое решение, при котором cookie удаляются сами после завершения сеанса в браузере. Вместо привычных поисковиков типа Google или Bing можно стоит рассмотреть поисковик DuckDuckGo.
Плюс ко всему повысить безопасность поможет использование VPN.

Как бороться с cookies?

После того как в ЕС вступил в силу GDPR — Общий регламент защиты персональных данных С, — сайты обязались размещать сообщения об использовании cookie. До этого пользователь был вынужден либо принять их, либо покинуть страницу. С прошлого года большинство сайтов компаний, работающих в ЕС, стали предлагать выбрать, на какие cookies соглашаться, а на какие нет. Соответственно, если отметить, что не хотите, чтобы аналитические или «отслеживающие» cookies загружались, то они не будут загружены на компьютер. Однако тут используется не особо честный «трюк». Информационное окно о cookies всплывает каждый раз, когда открываешь сайт, до тех пор пока пользователь не согласится на их использование.
После запрета «вредных» cookie, в особенности трехсторонних файлов, рынок переполнился блокирующими расширениями.
Среди популярных: I don’t care about cookies, Cookie Notice Blocker, CookiesBlock — cookie pop-ups, GDPR Auto cookie consent.
А примером защиты конфиденциальности пользователей стала компания Google. Она объявила, что к 2022 году прекратит использование cookie от третьих лиц в браузере Chrome.

Для сохранения конфиденциальности, и экономии места на устройствах мы рекомендуем регулярно удалять сookies. Кроме того, не забывайте и об элементарных правилах кибергигиены. Обновляйте ПО, меняйте пароли, смотрите, на какие сайты заходите и какие ссылки открываете, используйте антивирусы. И не подключайтесь к Wi-Fi в незнакомых местах.

#познавательное
430 views13:01
Открыть/Комментировать
2021-09-09 17:00:24Игры для IT-шников.

Помните, как в детстве были разные игры, связанные с разными школьными предметами, да и которые помогали нам запоминать всякие полезности? Для программистов тоже есть такие! Ни для кого не секрет, что играя и учась, важные предметы и основы запоминаются легче и быстрее. Так что держите полезные игры =)

Git Game

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

Hacker

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

Hex Invaders

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

Flexbox Froggy

Flexbox Froggy — это логическая онлайн-игра для программистов, в которой вы должны помочь лягушкам добраться до их кувшинок. Делается это с помощью CSS Flexbox, что очень поможет развить навыки вёрстки.

Pixactly

Pixactly — это простая по виду, но не по содержанию игра для начинающих программистов. Вам даётся местоположение двух пикселей, а вы должны нарисовать по этим координатам прямоугольник.

CSS Diner

Отличная игра для знакомства с CSS-селекторами. Игроку даётся стол с посудой, заданный анимированной HTML-формой, и конкретный предмет или предметы, которые нужно взять со стола. Изучено будет всё, от основ до ~ и :first-child.

#совет
829 views14:00
Открыть/Комментировать
2021-09-07 15:00:23Инструменты, которыми пользуются Java-программисты в повседневной работе

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

IntelliJ IDEA

IntelliJ IDEA — это основная IDE (Integrated Development Environment), которая используется Java-программистами для написания, запуска и отладки кода. В ней реализована отличная поддержка популярных фреймворков (Spring, Micronaut) и есть огромное количество плагинов, облегчающих разработку.

Хранилища данных

Редко какое backend-приложение может обойтись без базы данных. На каждом проекте она может быть своей — SQL (PostgreSQL, Oracle), NoSQL (MongoDB, Apache Cassandra) — или комбинацией из нескольких БД. Сюда же можно отнести очереди сообщений (Apache Kafka, RabbitMQ) и кэш (Redis, Hazelcast, Apache Ignite).

Docker

Docker — программная платформа, используемая backend-разработчиками на всех стадиях (разработка, тестирование, развёртывание), позволяющая быстро запускать любой софт в изолированной среде. Таким образом, при разработке и тестировании с помощью Docker можно запускать требуемое окружение (базы данных, серверы авторизации и т.д.), а при развёртывании с помощью него запускается само приложение.

Kubectl

Docker-контейнеры не поднимаются поодиночке. Для этого есть специальные оркестраторы, следящие за их состоянием, ограничивающие потребляемые ресурсы и перезапускающие контейнеры в случае необходимости. Основным используемым оркестратором сейчас является Kubernetes.
Kubectl — это консольная утилита, позволяющая подключаться к кластеру Kubernetes, в котором развёрнуты Docker-контейнеры со всеми сервисами проекта. Она используется при развёртывании приложений и дебаге в случае возникновения ошибки.

Jenkins / Teamcity

Jenkins и Teamcity — это
инструменты создания CI/CD-конвейера для автоматического тестирования и развёртывания новых версий приложений. Как правило, в компании используется один из этих двух инструментов.
С помощью таких конвейеров можно, например, запускать прогоны тестов сразу после коммита, разворачивать новую версию приложения в окружении разработки, если все тесты прошли успешно, или отправить Slack-ботом сообщение в чат, если какие-то тесты упали.

Grafana + Prometheus

Это самые популярные средства мониторинга:
• Prometheus — это key-value-хранилище, в которое складируют все метрики приложений и баз данных.
• Grafana — средство визуализации метрик, в котором строят графики загрузки CPU, потребления RAM и многого другого, что помогает разобраться в проблемах приложений при аномальной нагрузке или, например, неожиданных перезапусках.

ELK (Elasticsearch + Logstash + Kibana)

Для хранения и просмотра логов редко в каких компаниях изобретают свои велосипеды. Стандартом де-факто сейчас является ELK-стек:
• Logstash — средство для парсинга логов приложений и отправки их в Elasticsearch (для Kubernetes вместо Logstash может использоваться Fluentd).
• Elasticsearch — база данных с богатой функциональностью по построению индексов полнотекстового поиска.
• Kibana — средство визуализации логов и метрик, использующаяся, как правило, для поиска по логам.

Заключение

Не все из этих инструментов требуется понимать глубоко. Как правило, базы данных, Kubernetes, Jenkins/Teamcity, Grafana + Prometheus и ELK администрируются DevOps-специалистами. Тем не менее, любой Senior Java Engineer должен владеть ими хотя бы на уровне пользователя, чтобы быстро найти проблему, случившуюся в production- или staging-окружении.

#совет #JavaScript
578 views12:00
Открыть/Комментировать
2021-09-06 17:00:19Игровые движки

Движок игры (game engine) – это ее основное ядро, базовое программное обеспечение, на основе которого строятся все остальные составляющие игры. Программный код, который может использоваться для создания вариаций игры, аддонов к ней или даже совершенно нового игрового мира.
Впервые определение появилось в середине 90-тых годов, когда начали появляться игры, похожие на главный шутер того времени – Doom. В то же время в свободном доступе начали появляться игровые движки, на основе которых и сторонние разработчики, и обычные пользователи могли пробовать писать собственные игры.
С тех пор игровые движки становились все более сложными технически, длинными и насыщенными по своему программному коду. Но при этом, как и в начале своего существования, они содержат в себе жестко фиксированные данные:

Игровую логику;
Физику объектов;
Правила отрисовки объектов;
Геймплей в целом.

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

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

Интересный факт для тех, кто интересуется разработкой игр: помимо дорогих движков, используемых маститыми разработчиками, существует множество бесплатных аналогов, которые запросто можно скачать в Steam (магазин игр на ПК).
Так что при желании вы можете создавать собственные виртуальные миры без какого-либо финансового вложения.

Лучшие игровые движки

В отличие от игр как таковых, движки не сменяют друг друга так часто. Так что некоторые из них используются уже практически десять лет. Вот вам несколько примеров наиболее именитых систем: RAGE, CryEngine, Naughty Dog Game Engine, Avalanche Engine, IW Engine, Anvil Engine, EGO Engine, Geo-Mod Engine, The Dead Engine и, конечно же, Unreal Engine.

CryEngine 4

Немецкая студия Crytek продолжает обновлять и осовременивать своей игровое ядро, при этом, как и прежние версии, CryEngine 4 распространяется практически бесплатно – с минимальной оплатой. При этом по своим возможностям он нисколько не урезан, и вы можете прекрасно видеть это в играх серии FarCry.
CryEngine 4 обеспечивает отображение огромных бесшовных локаций, инверсной кинематики транспорта и персонажей, отличную имитацию нетвердых объектов, настраиваемые параметры искусственного интеллекта, звучание формата 5.1, а также множество других преимуществ. В общем, это отличная платформа и для опытных разработчиков, и для начинающих игроделов.

Source

Движок Source не такой именитый, как многие другие в нашем списке, в отличие от компании, ее создавшей. Это Valve, которая написала на его основе такие хиты, как CS, Portal и Half Life.

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

Unreal Engine 4

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

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

#совет
424 views14:00
Открыть/Комментировать
2021-09-05 17:00:14Оптимизация кода. 2 часть.

Все программы в этом посте мы будем компилировать при помощи GCC с параметром -Og (базовый уровень оптимизации). Скомпилировав программу и сделав необходимые замеры, я получаю производительность CPE 11.05.

Для измерения CPE можно использовать инструкцию rdtsc, это счётчик тактов с момента последнего сброса процессора. Нужно сравнить значения счётчика до и после выполнения программы. Предупреждаю, что это ненадёжный метод. Для большей надёжности можно просто замерять потраченное процессорное время. Следующая программа пусть будет шаблоном, который демонстрирует оба метода: *КОД*

Избавляемся от неэффективностей цикла

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

Производительность новой версии не изменилась — CPE 11.05. Видимо, компилятор сам догадался выполнить эту оптимизацию. Давайте запустим GCC без параметра -Og и скомпилируем обе версии функции вообще без оптимизации. Теперь разница заметна: combine0CPE 12.7, combine1CPE 11.1.

В данном случае компилятор догадался вставить тело функции в место вызова этой функции. Но часто компилятор не будет этого делать, потому что не сможет определить, имеет функция побочные эффекты или нет. Если функция производит какие-то дополнительные действия, подобная трансформация может изменить поведение программы. Как экстремальный пример рассмотрим цикл, который превращает прописные буквы в строчные: *КОД*

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

#совет
564 views14:00
Открыть/Комментировать
2021-09-04 19:04:46Оптимизация кода. Как и зачем. Часть 1.

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

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

Блокировщики оптимизации

Компиляторы сами пытаются оптимизировать код. Когда GCC запущен с параметром -Og, он выполняет базовый уровень оптимизации, с параметром -O1 первый уровень оптимизации. Существует и более высокие уровни оптимизации: -O2, -O3 и т. д. Чем выше уровень оптимизации, тем более радикальные изменения компилятор вносит в программу. Компиляторы могут применять только безопасные оптимизации. Это значит, что компилятор может изменять программу только так, чтобы это не изменило её поведение для всех входных данных.

Нам, как программистам, нужно понимать, что существуют определённые характеристики кода, которые не позволят компилятору совершить оптимизацию. Мы их называем блокировщиками оптимизации. Рассмотрим два типа блокировщиков оптимизации. Одним из них являются указатели. Компилятор не может точно знать, будут ли два указателя указывать на одну и ту же область памяти, и поэтому не выполняет некоторые оптимизации. Вот пример такого: *КОД*

Функция twiddle2 выглядит более эффективной, она выполняет всего три запроса к памяти (прочитать *xp, прочитать *yp, записать *xp), в то время, как twiddle1 выполняет шесть запросов (четыре чтения и две записи). Можно ожидать, что эти две функции имеют одинаковое поведение. Однако представьте, что xp и yp указывают на одну и ту же ячейку памяти. Тогда twiddle1 увеличит *xp в четыре раза, а twiddle2 — в три раза. Эти функции имеют разное поведение в некотором случае. По этой причине компилятор не посмеет трансформировать менее эффективную функцию в более эффективную.

Другой блокировщик оптимизации — вызов функций. Вообще, вызовы функций влекут накладные расходы, и нам нужно стараться их избегать. Вот пример: *КОД*

Первая функция вызывает f четыре раза, когда вторая — только один раз. Мы ожидаем, что компилятор догадается и преобразует первую функцию во вторую. Но функция f может иметь побочные эффекты, она может изменять глобальное состояние, как в этом примере: *КОД*

В этом cлучае func1 и func2 вернут разные результаты. Компилятору тяжело определить, имеет вызов функции побочные эффекты или нет. Когда он не может этого сделать, он рассчитывает на худшее и не выполняет оптимизацию.

Демонстрационная программа

Обычно медленные программы выполняют вычисления над большими массивами данных. Разумно будет оценивать эффективность таких программ в среднем количестве тактов, которые процессор тратит на обработку одного элемента массива. Введём метрику CPE (cycles per element). Если мы говорим, что программа имеет производительность CPE 2.5, значит она в среднем тратит 2.5 такта процессора на обработку одного элемента.

Мы представим простую программу, на примере которой продемонстрируем мощные приёмы оптимизации. Структура vec является вектором элементов типа float. Функция combine0 вычисляет результат перемножения всех элементов вектора. Эту функцию мы и будем оптимизировать. Размер массива сделаем 5000 и инициализируем его случайными числами.

*КОД*

#совет
687 views16:04
Открыть/Комментировать
2021-09-01 16:20:20Программирование для детей: 9 обучающих приложений

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

Программирование для дошкольников

Box Island
Максимально понятная мобильная игра, в которой нужно бродить по острову, преодолевать препятствия и собирать звёзды. Обучение детей основам программирования через последовательности и циклы — это отличное начало. Box Island развивает логическое мышление, распознавание образов и память.
Поддерживается русский язык.
Скачать Box Island

ScratchJr
Скретч известен как лучший вводный язык программирования, а ScratchJr — это адаптированный вариант для детей от 5 лет. С ним можно оживлять персонажей, создавать свои игры и сценарии. Развивает не только алгоритмическое, но и творческое мышление.
Почти всё приложение состоит из картинок, поэтому язык интерфейса значения не имеет.
Скачать ScratchJr

Lightbot
Ещё одно мобильное приложение, в котором ребёнку предстоит управлять роботом, направлять его и включать свет в нужных точках. Каждый новый этап игры сложнее предыдущего, повторяющихся команд всё больше, вследствие чего появляются своеобразные циклы.
Можно выбрать русский язык.
Скачать Lightbot

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

SpriteBox
Игра чем-то напоминает старого доброго Марио, но с более яркой картинкой и квестами-головоломками, которые знакомят детей с последовательностями, циклами и базовыми программными операциями.
Все задания на английском языке.
Скачать SpriteBox

Программирование для школьников

Scratch
Также есть визуальный язык программирования Scratch — для детей от 10 лет и старше. От ScratchJr программа отличается более продвинутым графическим редактором и редактором проектов. Так, Скретч обучает детей не только написанию программ, но и основам дизайна.
Поддерживается русский язык интерфейса.
Создать первый проект на Scratch

Kodu Game Lab
Программирование для детей, которые интересуются геймдевом, должно начинаться с этого приложения. Kodu — игра от Microsoft для визуального программирования. С ней ребёнок не просто научится программированию и дизайну, но также создаст настоящую 3D-игру, в которую можно поиграть на ПК или Xbox.
Только на английском языке.
Загрузить Kodu

Tynker
Это не игра, а целая платформа с обучающими приложениями для разных языков. Наиболее популярны игры для детей по изучению JavaScript, Python, HTML и CSS. Всего Tynker насчитывает около 2000 игр, включая темы по дополненной реальности и робототехнике.
Английский язык.
Сайт Tynker

Codecombat
Ещё одна платформа для детей по изучению программирования. Собранные здесь курсы и игры разрабатывались при поддержке педагогов. Платформа позволяет осваивать синтаксис и писать код с соблюдением лучших практик. Поддерживаются следующие языки программирования: JavaScript, Python, Java, CoffeeScript и Lua.
Есть поддержка русского языка.
Начать программировать с Codecombat

#совет
394 views13:20
Открыть/Комментировать