Дневник альтруиста. Причины

9938316d24d8e87ea0de2cbe8fa4ca60

«Си (язык программирования) позволяет легко выстрелить себе в ногу. С C++ это сделать сложнее, но, когда вы это делаете, вы отстреливаете себе ногу целиком.»

Бьёрн Страуструп

Предыстория

Небольшая предыстория определенно требуется, так что с нее и начнем.

Я разработчик всякой десктопной всячины на моём любимом С++. По мере решения задач в самых разных областях от написания Python скриптов для Google таблиц до создания дополненной реальности под телевизионный формат пришло весьма однозначное мнение, что наработки, которые не попадают под NDA или не противоречат совести, обязательно нужно выкладывать в открытый доступ.

Важно подчеркнуть, что я акцентирую внимание именно на каких-то маленьких утилитах и инструментах. Про большие проект даже говорить не нужно — это титаны, на которых в принципе держится и развивается современное IT. Но зачем тогда публиковать что‑то маленькое, если все ответы можно найти либо на Stack Overflow,  либо в титанах из мира GitHub? Вон, посмотрите хотя бы на Hazel Engine. Это настоящий учебный полигон по библиотеке Dear ImGui. Ну что ж, для ответа на этот вопрос я поделюсь своим примером, ведь являюсь очень дотошным человеков и все проекты на всех местах работы дублирую себе в облако (уважаемые наниматели и работодатели, извините).

Пример из жизни

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

На всякий случай скажу, что к автору нижеприведенного кода (он же тимлид, синьор, менеджер, красавец, комсомолец и просто замечательный человек) я испытываю самое большое уважение и понимание, т.к. за буквально одну ночь под баффами энергетиков и насильственной мотивации он мог написать тысячи строчек РАБОТАЮЩЕГО кода. Как говорится: «Задачу принял. Когда нужно сделать? Вчера? Завтра утром пришлю результат».

Внимание, пример одного метода библиотеки:

public double ParseLengthValue(byte a, byte b, byte c)
{
    bool negativeSign = (a & 0b10000000) > 0;
    double val = 0;
    if (_isWithFracture)
    {
        int intPart = 0;
        double fracPart = 0;
        //val = intPart + fracPart;
        if (negativeSign)
        {
            intPart = ((~a & 0b01111111) << 10) | ((~b & 0b11111111) << 2) | ((~c & 0b11000000) >> 2);
            fracPart = (c & 0b00111111) / (double)0b00111111;
            fracPart = 1 - fracPart;
        }
        else
        {
            intPart = ((a & 0b01111111) << 10) | ((b & 0b11111111) << 2) | ((c & 0b11000000) >> 2);
            fracPart = (c & 0b00111111) / (double)0b00111111;
        }
        val = intPart + fracPart;
     }
     else
     {
         int tmp = ((((a & 0b01111111) << 16) | (b << 8) | c) & 0b011111111111111111111111);
         if (negativeSign)
         {
             tmp = (~tmp) & 0b011111111111111111111111;
         }
         val = tmp / 64.0;
     }
     return negativeSign ? -val : val;
}

Ушко, за которым меня почесали, начало неприятно зудеть. Спустя миллионы вопросов, уточнений и молитв пришло понимание, как устроен весь проект и начато переписывание под C++. К слову говоря, львиную часть кода я просто копипастнул себе. Ну, а чего добру пропадать и силы лишние тратить, верно ведь?

Но к чему этот маленький пример? В коде происходит парсинг данных такого протокола, как FreeD, о котором по большей части в интернете предостаточно информации. Но вот в чем загвоздка — на GitHub и прочих площадках открытого кода об этом ни‑че‑го. Если вы попробуете сейчас найти хоть какой‑то код на тему а‑ля «parse freeD packet», то скорее всего найдёте только мой код, и здесь я опешу и попрошу его смотреть только в случае ЧП, ибо в случае чего вместе с историей браузера я завещаю удалить и половину моих репозиториев (когда-нибудь я вас перепишу на нормальный лад, ну честно).

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

Вывод

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

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

Продолжение?

Собственно о самом заголовке статьи: почему «Дневник альтруиста. Причины»? В очередной тысячный раз я столкнулся лбом с Си кодом, который оказался крайне полезным для нужд компании, — dfu‑util. Как прекрасен и полезен этот проект — не описать, но, к сожалению, в самых лучших традициях языка С++, чтобы его подключить к проекту в виде сабмодуля нужно выстрелить себе в колено стрелой и забыть о дороге приключений. Собственно, я решил вести небольшой дневник параллельно с написанием инструмента, который дополнит и расширит сию чудесную утилиту. Не путать с «дополнит и расширит» с «заменит»!

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

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

P.S. S. Проект конечно же будет в публичном доступе, а это значит, что каждый может влиять на его написание или форкнуть и написать свою реализацию. Естественно, подобная активность — самая прекрасная часть мира IT.

© Habrahabr.ru