Исходники: текст или что-то другое?

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

  • заботливо раскиданная по коду отладочная печать на терминал и
  • пресловутый «долгий пристальный взгляд».

Были еще встроенные в ОС средства протоколирования, но они именно в эти две недели не работали. Удивительное совпадение. Хотя нет, скорее, все дело в кривизне рук. Неважно.

Так вот, отладочная печать прекрасно себя зарекомендовала. Изучение длинных простыней протоколов из строк вроде «(kernDispatchThread) pre-switch ct=174380000 diff=55489 nn=4», «test 4»и даже просто «hahaha!!!» позволяют получить истинное удовольствие от расследования а-ля Хаус. Ну-ка, кто у нас тут вытеснил этот поток? Но вот аномальная последовательность строк найдена, и теперь никуда не денешься — придется разглядывать код, который эту аномалию продемонстрировал.

Казалось бы, самое время сказать: «Трепещите, о презренные байты! Склонитесь перед интеллектом Человека!». Но нет, байты трепетать отказываются, функции плодятся прямо на глазах, макросы-сволочи делают вид, что они функции, или даже того хуже — оперируют именами локальных переменных (ужас-ужас!). Вся эта компания разбегается по двум десяткам файлов, откуда, ехидно посмеиваясь, гадит в глобальные переменные, норовя смешать физическую и виртуальную адресацию.

Вот как-то так я и провел две недели.

И не переставало мне думаться, что текст в качестве носителья исходного кода всем хорош: и редактировать его легко, и всякие diff’ы со слияниями делать, и от платформы не зависит (ну, почти), да и сколько уже проверенных временем алгоритмов на строках есть. Вот только читать чужие исходники неудобно. Хорошая IDE позволяет от вызова функции перейти к ее определению, но серебряной пулей тут и не пахнет. Пока читаешь код вызванной функции, забываешь, что делала вызывающая. И хорошо еще когда в когнитивном процессе участвует две функции. А что если 10? Или 50?

В таком случае поможет только абстрагирование: надо поделить 50 функций на 5 групп, рассмотреть взаимодействие этих групп, а потом — внутри каждой в отдельности. Да, модульное программирование явно неглупые люди придумали. Вот только выделение абстракций — отдельная большая работа. Если мы читаем свой код, то эта работа уже сделана еще при его написании. А вот выделение абстракций на уже существующем коде… Вот тут-то его текстовая природа и подкладывает нам козу: чтобы выделить абстракции, нужно сначала код прочитать и понять.

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

В таком подходе есть ряд очевидных недостатков. Например, нужен гигантский монитор. И отсутствие аллергии на работу мышкой. И ширина строк кода должна быть вменяемой (обратили внимание, какие они короткие в демке?). Но в целом идея здравая: кто сказал, что код — это обязательно плоский текст? (Я не говорил.) При анализе чужого кода такая штука уж точно будет полезной.

P.S. Я давно уже дочитал «Организацию ЭВМ» и с пяток книжек сверху. Просто под линуксом не работает мой антикварный сканер. Постараюсь что-нибудь придумать.

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

13 комментариев

  • Да блин. У меня даже студия не понимает где лежит определение типа в CGAL. И я тоже не понимаю, а ищу по имени хедера. Ибо (см. пример ниже). Чую матерую С/С++ библиотеку на шаблонах и макросах никакой Code Bubble не проглотит.

    Пример объявления типов для не особо сложного CGAL приложения:

    typedef CGAL::Quotient Number_type;
    typedef CGAL::Lazy_exact_nt Lazy_exact_nt;
    typedef CGAL::Cartesian Kernel;
    typedef CGAL::Gps_circle_segment_traits_2 Traits_2;
    typedef Traits_2::General_polygon_with_holes_2 General_polygon_with_holes_2;

    Причем CGAL::Gmpzf, CGAL::Quotient, CGAL::Cartesian — все взаимозаменяемые типы,
    хотя не наследуют от общего класса. Они взаимозаменяемые потому что в шаблонах вызываются
    операции, которые в них есть.

    А полигон состоит из X_monotone_curve_2, которые определены как подтип в Traits:

    typedef Traits_2::X_monotone_curve_2 X_monotone_curve_2;

    И чтобы до их определения добраться, нужно знать, кто такой Traits_2:

    template
    class Gps_circle_segment_traits_2 : public Gps_traits_2<Arr_circle_segment_traits_2 >

    template <typename Arr_traits, typename General_polygon_t = General_polygon_2 >
    class Gps_traits_2 : public Arr_traits

    И примерно половину из переходов GoToDefinition IDE не находит.

    PS Выговорился.

    • Движок съел скобки-уголки в объявлении типов =(
      В общем, типы там все шаблонизированы.

    • Думаю, он не потянет даже простейший полиморфизм. Вызвается метод через интерфейс — что будем показывать? Это не говоря уже о какой-нибудь рефлексии.

      Важен сам подход — другой способ восприятия кода.

      • Напоминает reverse engineering в CASE средстве.
        Или опять же RE в IDA Pro. Только там asm…

        Вообще очень интересно это будет изучать на доске с touch возможностями.
        Надеюсь я застану время, когда что-то вроде MS surface будет висеть на стенках и с помощью него будут проектировать.

        • Да, для высокоуровневого проектирования мультитач + большой экран — самое оно. Правда, мне не обязательно, чтобы Surface был именно MS :)

          • Говорил, кстати, недавно с Лехой Тетеревым.
            Говорит Surface Team сейчас переживает не лучшие времена. Разработчиков оттуда перевели в другие, более денежно-приносящие места.

  • Обложки книжек можно копипастить с озона/амазона.
    Или у тебя аутентичные издания?

Оставьте свой отзыв

Или введите OpenId:

XHTML: Можно использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">