© Ralph McQuarrie

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

Чемпионы по рейтингу


Чему я научился на своём горьком опыте (за 30 лет в разработке ПО) (AloneCoder)


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

Как мы из пещеры SMS отправляли (Qubique)


Однажды мой коллега Пётр предложил поучаствовать в одном интересном проекте — в создании «пещерного телефона для спелеологов», так как сам увлекается спелеологией. У спелеологов есть такая проблема: беспроводная связь под землей на практике не работает. Приемлемый радиоприем возможен только в зоне прямой видимости, но стоит зайти за пару поворотов — и связи нет. А общаться надо на протяжении всей пещеры, длина которой может быть несколько километров. Мобильная связь там, конечно же, не ловит, а значит связи с внешним миром у групп, автономно работающих в пещере несколько недель, никакой нет.

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

Столярная мастерская своими руками: ожидания и реальность (zipp3r)


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

Самые позорные ошибки в моей карьере программиста (на текущий момент) (AloneCoder)


Как говорится, если тебе не стыдно за свой старый код, значит, ты не растешь как программист — и я согласна с таким мнением. Я начала программировать для развлечения более 40 лет назад, а 30 лет назад и профессионально, так что ошибок у меня набралось очень много. Будучи профессором информатики, я учу своих студентов извлекать уроки из ошибок — своих, моих, чужих. Думаю, пришло время рассказать о моих ошибках, чтобы не растерять скромность. Надеюсь, кому-то они окажутся полезны.

Реставрируем фотографии с помощью нейросетей (kitashov)


Я работаю программистом-исследователем в команде компьютерного зрения Mail.ru Group. Ко Дню Победы в этом году мы решили сделать проект по реставрации военных фотографий. Что такое реставрация фотографий? Она состоит из трех этапов:

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

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

Модели дженериков и метапрограммирования: Go, Rust, Swift, D и другие (AloneCoder)


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

Я считаю дженерики интересным вариантом, потому что они являются простым частным случаем общей задачи метапрограммирования: написания программ, способных генерировать классы других программ. В доказательство я покажу, как три разных и абсолютно общих метода метапрограммирования могут считаться разнонаправленными расширениями в пространстве систем дженериков: динамических языков вроде Python, процедурных систем макросов вроде Template Haskel и поэтапной компиляции вроде Zig и Terra.

Почему const не ускоряет код на С/C++? (AloneCoder)


Несколько месяцев назад я упомянул в одном посте, что это миф, будто бы const помогает включать оптимизации компилятора в C и C++. Я решил, что нужно объяснить это утверждение, особенно потому, что раньше я сам верил в этот миф. Начну с теории и искусственных примеров, а затем перейду к экспериментам и бенчмаркам на реальной кодовой базе — SQLite.

HTTP-заголовки для ответственного разработчика (AloneCoder)


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

Разработчики соединяют людей.
Разработчики помогают людям.
Разработчики дают людям возможности.

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

Суперинфекции, антибиотики и модели зомби-апокалипсиса (randall)


Бактерии, а не рак, террористы и катастрофы унесли жизни огромного количества людей. Одна только Yersinia pestis (чумная палочка) привела к смерти 150 млн человек. Прием антибиотиков является основным методом борьбы с бактериальными инфекциями. Но что если лекарства перестанут действовать?

Это не риторический вопрос и не вводная для моделирования гипотезы, а реальная ситуация в обозримом будущем на фоне роста бактериальной устойчивости. У Всемирной организации здравоохранения (ВОЗ) и национальных служб есть общий план действий, но детального алгоритма предотвращения бактериальной пандемии нет ни у одного государства.

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

Работа с часовыми поясами в JavaScript (randall)


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

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

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

Чемпионы по комментариям


EDC здорового айтишника: всё своё ношу с собой (Barrayar)


Мы носим с собой какие-то полезные вещи, которыми пользуемся если не каждый день, то довольно часто. Всё это барахлишко называют EDC — Everyday Carry. И сегодня, при невероятном обилии и доступности всевозможных инструментов, гаджетов, приспособлений, приблуд и мелких ништячков, в наших карманах и сумках можно найти самые интересные комбинации вещей. А на сайте everydaycarry.com можно выложить фото своего EDC и подписать каждую вещь. Мы собрали самые интересные наборы айтишников оттуда. А ещё попросили показать, что лежит в карманах и рюкзаках наших сотрудников.

Зачем нужны дженерики в Go? (AloneCoder)


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

Go вышел 10 ноября 2009-го. Меньше чем через сутки появился первый комментарий про дженерики. В нём также упомянуты исключения, которые мы добавили в язык в виде паники и восстановления (panic and recover) в начале 2010-го.

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

Что почитать и посмотреть из свежей фантастики: Марс, киборги и восставший AI (Barrayar)


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

Чемпионы по добавлению в избранное


Для тех, кто познаёт ушами: подкасты для разработчиков (Barrayar)


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

Как сделать из сайта приложение и выложить его в Google Play за несколько часов. Часть 1/2: Progressive Web App (macket)


Наверное, все близкие к веб-разработке люди уже наслышаны о Progressive Web App. Ещё бы! Эта технология практически уравняла веб и мобильную разработку с точки зрения распространения продуктов и вовлечённости пользователей. Да, современный фронтенд, написанный, например, на React, работает как приложение. Но вот только скачивается это приложение в браузер и запускается из него. В этом и заключается огромный гандикап, который всегда имела мобильная разработка. Давайте подумаем, чем с точки зрения обычного пользователя, «приложение» отличается от «сайта». Сразу в голову приходит, что приложение в телефоне, а сайт на компьютере. Но ведь есть мобильный браузер, так что сайт и в телефоне тоже. Тогда остаётся 3 существенных отличия:

  1. Иконка приложения есть на главном экране смартфона.
  2. Приложение открывается в отдельном окне.
  3. Приложение отправляет push-уведомления.

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

И казалось бы, всё прекрасно! Но увы, за 10 с лишним лет мобильной эпохи пользователи слишком сильно привыкли искать приложения в Google Play и App Store. Ломать привычки пользователей — дело неблагодарное, и потому ребята из Google (кстати, Google является разработчиком PWA) решили, что если гора не идёт к Магомеду, то… В общем, совсем недавно, 6 февраля 2019 года, они обеспечили использование Trusted Web Activities для выкладки веб-приложений в Google Play.

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

JavaScript-движки: как они работают? От стека вызовов до промисов — (почти) всё, что вам нужно знать (AloneCoder)


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

Чемпионы по просмотрам


Гнев на код: программисты и негатив (AloneCoder)


Я смотрю на кусок кода. Возможно, это худший код, что мне когда-либо встречался. Чтобы обновить всего одну запись в базе данных, он извлекает все записи в коллекции, а затем отправляет запрос на обновление каждой записи в базе, даже тех, которые обновлять не требуется. Тут есть map-функция, которая просто возвращает переданное ей значение. Есть условные проверки переменных с очевидно одинаковым значением, просто поименованных в разных стилях (firstName и first_name). Для каждого UPDATE’а код отправляет сообщение в другую очередь, которая обрабатывается другой serverless-функцией, но которая выполняет всю работу для другой коллекции в той же базе данных. Я не упомянул, что эта serverless-функция из облачной «сервис-ориентированной архитектуры», содержащей более 100 функций в окружении?

Как вообще можно было такое сделать? Я закрываю лицо и явственно всхлипываю сквозь смех. Мои коллеги спрашивают, что случилось, и я в красках пересказываю Worst Hits Of BulkDataImporter.js 2018. Все сочувственно кивают мне и соглашаются: как они могли так с нами поступить?

Возможности современного JavaScript, о которых вы могли не знать (AloneCoder)


Несмотря на то, что в последние семь лет я пишу на JavaScript почти каждый рабочий день, должен признаться, что уделяю мало внимания сообщениям о нововведениях от ES. Главные возможности вроде async/await и прокси — это одно, но ещё каждый год идёт поток мелких поэтапных изменений, которые не попадают в моё поле зрения, поскольку всегда находится что-то более важное для изучения.

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

XML практически всегда применяется не по назначению (AloneCoder)


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

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

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

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

С этой точки зрения существует простой способ проверить, насколько хорошо сделана схема XML. Возьмем для примера документ в предполагаемой схеме и удалим из него все теги и атрибуты. Если в том, что осталось, нет смысла (или если осталась пустая строка), то либо ваша схема построена неправильно, либо вам просто не стоило применять XML.

Далее я приведу несколько наиболее часто встречающихся примеров неправильно построенных схем.

* * *
Спасибо всем дочитавшим. И с наступающим!

Комментарии (0)