Как стать автором
Поиск
Написать публикацию
Обновить
1132.9

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Алгоритм ранжирования ошибок

Время на прочтение9 мин
Количество просмотров3.8K

Возможно Вам доводилось слышать про протокол журнала событий syslog, в котором можно насчитать аж 8 уровней важности: emergency, alert, critical, error, warning, notice, info, debug. Наверняка Вы, как и я какое-то время назад, думаете, “зачем столько”? А что если я скажу, что количество уровней там просто идеально? И использовать можно все - даже debug - для продакшн. Во всяком случае, каждому из них можно придать формальный критерий. Это особенно иронично для меня самого, так как всего пару месяцев назад я написал статью в духе “зачем так сложно!”. Так что если Вам интересно посмотреть на пример технического “переобувания” или оценить строгий алгоритм ранжирования уровней важности событий в системе - прошу.

Читать далее

Искусство написания циклов на Python

Время на прочтение4 мин
Количество просмотров98K


Цикл for — самый базовый инструмент потока управления большинства языков программирования. Например, простой цикл for на C выглядит так:

int i;
for (i=0;i<N;i++)
{
  //do something
}

Не существует более изящного способа написания цикла for на C. В сложных случаях обычно приходится писать уродливые вложенные циклы или задавать множество вспомогательных переменных (например, как i в показанном выше коде).

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

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

О сложности в работе программиста

Время на прочтение7 мин
Количество просмотров14K

Я хочу сегодня порассуждать об окружающей нас (людей) сложности и о нашем умении с ней работать. Не о той сложности, про которую пишут в статусах семейного положения в соцсетях, типа, «всё сложно», а о сложности в организационно-технических системах (кстати, по-моему, неплохое название для ВУЗовской специальности получилось). На оригинальность и, тем более, истину не претендую (тем более что, как минимум, наполовину я тут собираюсь низводить, курощать и дуракавалять). Часть этих рассуждений я уже выносил куда-то в комментарии, но для меня этот вопрос не закрыт. Поэтому жизнь всегда подбрасывает мне разные показательные примеры, которые побуждают размышлять дальше. Несмотря на пятницу, это не задумывалось, как развлекательное чтиво, тут не будет весёлых картинок, если что – я вас предупредил. Если хотите прочитать только одно предложение, и пойти читать остальные весёлые пятничные статьи – то вот оно: «Упрощать сложность там, где это можно сделать, справляться со сложностью там, где упрощать её нельзя, и нарабатывать опыт и умение отличать первый случай от второго». Годится как пятничный тост.
Читать дальше →

Процессор, эмулирующий сам себя — может быть быстрее самого себя

Время на прочтение1 мин
Количество просмотров38K

Современный мир ПО содержит настолько много слоёв, что оптимизации могут быть в самых неожиданных местах. Знакомьтесь - год 2000, проект HP Dynamo. Это эмулятор процессора PA-8000, работающий на этом же процессоре PA-8000, но с технологией JIT. И реальные программы, запускающиеся в эмуляторе - в итоге работают быстрее, чем на голом процессоре.

td;dr - всё сказано в заголовке

Читать далее

Ко-вариантность и типы данных

Время на прочтение14 мин
Количество просмотров7.7K

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

Я надеюсь что может у меня получиться объяснить эту тему с другой стороны используя метафоры “присвоения” в разрезе лямбд.

Зачем вообще эта вариантность нужна ?

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

Ко-вариантность это о типах данных и их контроле со стороны компиляторов. И ровно с этого места надо откатиться и сказать о типах данных и зачем это нам нужно.

Читать далее

Как писать кодогенераторы в Go

Время на прочтение14 мин
Количество просмотров18K

Однообразный код писать неинтересно, нудно, но приходится. Испокон веков изворотливые программисты ищут Святой Грааль формализма, позволяющего переложить рутинные задачи на машину, писать только раз и переиспользовать код. Так появились структурное программирование, потом объектно-ориентированное, полиморфизм с параметризованными типами, кодогенерация на основе формальных грамматик, препроцессоры макроязыка и прочее…​ Под катом рассмотрим, как обстоят дела именно в Go.

Читать далее

Погружение во внедрение зависимостей (DI), или как взломать Матрицу

Время на прочтение9 мин
Количество просмотров7.1K

Давным-давно в далекой Галактике, когда сестры Вачовски еще были братьями, искусственный разум в лице Архитектора поработил человечество и создал Матрицу… Всем привет, это снова Максим Кравец из Holyweb, и сегодня я хочу поговорить про Dependency Injection, то есть про внедрение зависимостей, или просто DI. Зачем? Возможно, просто хочется почувствовать себя Морфеусом, произнеся сакраментальное: «Я не могу объяснить тебе, что такое DI, я могу лишь показать тебе правду».  

Читать далее

Новая система автоматически очищает массивы ненадёжных данных

Время на прочтение9 мин
Количество просмотров2.3K

Специально к старту курса о Data Science мы перевели статью о созданной исследователями из Массачусетского технологического института программе, занимающей около 50 строк кода (ссылку на который мы разместили в конце) и автоматически очищающей "грязные данные" — описки, дубликаты, пропущенные значения, опечатки и несоответствия, которых так опасаются аналитики, дата-сайентисты и дата-инженеры.

Система, получившая название PClean, — уже третья в серии проблемно-ориентированных языков вероятностного программирования, созданных членами Проекта вероятностного программирования (Probabilistic Computing Project), целью которого является упрощение и автоматизация разработки приложений ИИ (первая система была посвящена 3D-восприятию с помощью инверсной графики, а вторая — моделированию временных рядов и баз данных).

Читать далее

Опыт написания асинхронного поллинга сетевых устройств

Время на прочтение6 мин
Количество просмотров5.9K


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

Читать про идеи, итерации и грабли

Прошло тридцать лет, а QBasic по-прежнему лучший

Время на прочтение4 мин
Количество просмотров29K

Моему старшему сыну Ноа три месяца назад исполнилось семь лет. Если бы он мог обменять всю свою семью на два часа игры в Minecraft, то сделал бы это без раздумий. Ещё одна любовь всей его жизни — это Super Mario Maker. У меня бегали мурашки, когда я видел, как он играет в уровни, которые я проходил в его возрасте. Примерно пять месяцев назад я покинул свою семью ради ежегодного паломничества на ludum dare: соревнование разработчиков игр, во время которого мы запираемся в квартире с друзьями, возвращаемся в состояние пещерного человека, не спим 48 часов и создаём с нуля готовую игру. Когда я гордо демонстрировал свою революционную игру уровня AAA своей жене, Ноа, разумеется, заинтересовался. Поэтому я познакомил его с миром кода, показал, как из простых слов (он только что научился читать) можно создать настоящую игру. С того самого дня Ноа постоянно просил меня научить делать собственные видеоигры. И в течение следующих пяти месяцев я искал Святой Грааль языка/IDE для детей в надежде превратить эту искру интереса в запоминающийся опыт…

Мои поиски приводили меня на бесконечные форумы, благодаря которым я попробовал бесчисленное множество рекомендуемых языков и платформ: SmallBasic, Pico-8, Smalltalk, Scratch и т.д. Я даже задавал вопросы великим оракулам StackOverflow, но тщетно. Спустя пять месяцев я пришёл к разочаровывающему выводу: ничто и близко не сравнимо с тем, что было у меня в мои годы. 30 лет спустя QBasic по-прежнему остаётся лучшим языком для новичков в программировании.
Читать дальше →

Как реляционная СУБД делает JOIN?

Время на прочтение9 мин
Количество просмотров35K

Статья о том, как реляционная СУБД может выполнить JOIN. Для лучшего понимания мы попробуем своими руками написать такую же реализацию на языке C#. Что позволит нам лучше вникнуть в детали.

А чтобы было не совсем скучно - мы зададимся вопросом производительности. Что работает быстрее C# или SQL? И хоть сам по себе вопрос не корректен, к этому пониманию мы как раз и придем.

Читать далее

CI/CD монолита Авито: от коммита до моржа

Время на прочтение8 мин
Количество просмотров9.5K

Всем привет, меня зовут Александр Данковцев, я lead engineer команды Antimonolith. В этой статье я расскажу, как построен CI/CD монолита Авито. Речь пойдёт про нашу архитектуру стейджинга, pre-receive хуки, то, что из себя представляет сборка и деплой, как устроен прогон автотестов и какие проверки происходят на merge. А ещё рассмотрим after-merge actions.

Читать далее

Пишем обёртку над SQLAlchemy Сore

Время на прочтение8 мин
Количество просмотров11K

Для асинхронного Python существует мало полноценных ORM, и им далеко до таких монстров-комбайнов, как DjangoOrm и SQLAlchemy.ORM. Бедность ORM-инструментария для асинхронного программирования заставила многих программистов отказаться от зачастую непонятной им работы с ORM и перейти к более прозрачному взаимодействию с БД. Решение в лоб — написание raw SQL, но в этом случае запросы не будут защищены от инъекций, а запросы, составляемые по бизнес логике с опциональными параметрами, превратятся в конкатенацию строк. Важно найти баланс между прозрачностью выполнения кода, скоростью его написания и читаемостью.

Ниже я предлагаю реализацию такого баланса c использованием SQLAlchemy Core.

Читать далее

Ближайшие события

4 бесплатных мероприятия по созданию бизнес- приложений в июне

Время на прочтение4 мин
Количество просмотров924

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

Читать далее

Динамическая типизация C

Время на прочтение7 мин
Количество просмотров14K

Эта короткая статья, окажется абсолютно бесполезной для опытных программистов C/C++, но кому-то из начинающих, возможно, позволит сэкономить время. Хочу подчеркнуть, что в большинстве хороших книг по C/C++ данная тема рассмотрена в достаточной степени.

Во многих интерпретируемых языках используется динамическая типизация. Такой подход позволяет хранить в переменной с одним именем значения разных типов. В языке C используется строгая типизация, что, на мой взгляд более, чем правильно. Однако бывают случаи (хоть и не так часто), когда гораздо удобней было бы использовать динамическую типизацию. Зачастую, такая потребность напрямую связана с некачественным проектированием, но не всегда. Не зря же в Qt присутствует тип QVariant.

Здесь мы поговорим про язык C, хотя все, что описано ниже, применимо и к C++.

Читать далее

Если у вас нашли SCRUM

Время на прочтение3 мин
Количество просмотров16K

Сразу хочу успокоить. Сегодня SCRUM это уже не так страшно как десять лет назад. Современная медицина достигла невероятных высот. Люди со SCRUM живут полноценной жизнью. Остаются активными членами общества. Главное -  своевременно подобрать правильный режим лечения.

Анамнез

Работа с параметрами во внешнем EEPROM

Время на прочтение8 мин
Количество просмотров9.2K

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

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

И вот если вам интересен один из способов, который использую я со студентами добро пожаловать под cut

Доступ к EEPROM параметрам

Доступные текстовые метки для всех

Время на прочтение7 мин
Количество просмотров2K

Мое видео на тему «Специальные возможности в действии: практические советы по увеличению доступности пользовательских интерфейсов» уже доступно онлайн. Этот пост — дополненная расшифровка той части видео, где рассказывается, как создавать более информативные текстовые метки в виде кнопок и (или) ссылок, чтобы сделать покупки в Интернете более комфортными для пользователей программ экранного доступа и не нарушать рекомендаций по обеспечению доступности веб-контента (WCAG). Немаловажно, что тем самым мы не ломаем метки для пользователей голосового ввода. Описанные принципы подходят для всех видов текстовых меток, включая элементы управления формы.

Читать далее

Либо быстро, либо неправильно

Время на прочтение5 мин
Количество просмотров4.4K
image

В 2018 году я упражнялся на Advent of Code (здесь вы можете посмотреть стримы моих решений). Каждый день в декабре они публикуют небольшую проблему, и вы должны написать программу, которая её решит. Обычно это занимает от пары минут до пары часов и это довольно весело, я рекомендую вам попробовать. Когда задача выполнена, она всегда доступна, не только в декабре.

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

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

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

Теперь перейдем к программному обеспечению. Легко назвать решения Advent Of Code ошибочными, когда они медленные, поскольку мы знаем, что быстрое решение должно существовать. С реальными проблемами никто этого не гарантирует.

За исключением некоторых случаев.

Собственно, довольно часто.

На самом деле, я бы сказал, почти всегда.
Читать дальше →

Как мы потерпели неудачу, а затем преуспели в переходе на TypeScript

Время на прочтение8 мин
Количество просмотров5.3K

К старту курса о Fullstack-разработке на Python, где также рассматривается TypeScript, мы перевили статью о миграции в Heap.io — компании, которая предоставляет платформу аналитики продуктов, — c языка CoffeeScript на TypeScript; TS в Heap.io начали использовать более 4 лет назад. Несмотря на широкое предпочтение TypeScript среди инженеров, миграция была медленной, а чёткого пути к 100 % кода TS не было.

Читать далее

Вклад авторов