Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Програмна археологія і проблема власника коду

with 14 comments

Уявіть собі, виявляється така дисципліна програмної інженерії як археологія існує досить давно, і в 2001 спеціально по ній навіть проводили конференцію.

Ну і я, собі теж, маючи необхідність прикрутив до Vim таку лопату, яка дозволяє копати в Mercurial:

103 command! nargs=* Blame call Blame(<f-args>)
104 function! Blame()
105     " gets zero, one or two params
106     " first param – revision to annotate (if false – don’t pass)
107     " second param – pattern to search
108     let revision = (a:0 >= 1) && a:1 ? ‘ -r ‘ . a:1 :
109     let pattern = (a:0 >= 2) && a:2 ? ‘| grep ‘. a:2 :
110
111     let command = ":!hg blame -nvud % ". revision . "| cat -n ". pattern ." | less"
112     execute command
113 endfunction

Лопата жахлива бо я на VimScript ніфіга не вмію писати. І взагалі не люблю мови в яких оператор конкатенації рядків – це крапочка. 🙂

Але вона працює, і дозволяє вияснити хто, коли і під яким приводом (зазвичай посилання в Jira) написав код на який я дивлюсь. Найчастіше якщо трапляється якийсь великий WTF то виявляється що це написав мій CEO ще в 2008, не пояснюючи мотивів, бо тоді й не було кому пояснювати. 🙂 Ну, і його питати немає сенсу, не тому що субординація, чи він зайнятий, а тому, що це було дуже давно, і звісно він не пам’ятає.

Але загалом все нормально. Тільки от з’являється проблемка. Коли я хочу збільшити пов’язаність якогось модуля, доводиться робити переміщення методів. Коли я хочу щоб метод похудав на 100-200 рядочків, доводиться робити витягнення метода. Обидва рефакторинги переміщують рядки коду, і для Mercurial змінюють його власника, бо він бачить лише що я видалив одні рядки, і вставив якісь інші. Те що вони однакові він не бачить.

Git вирішує цю проблему за допомогою евристики по метриках подібності. Що правда трохи страшнувато звучить, бо я не знаю чи можна буде передбачити результат його роботи.

Зібравши один модуль я навіть вгорі копірайти написав, аби в разі чого люди знали що за поясненнями можна іти не тільки до мене.
І от маю дилему – привласнювати код якось невиховано, але якщо наступна моя задача знову полягатиме в перечитуванні 300-рядкового методу, то я сильно пожалію що залишив код в такому стані.

Тепер питання: а вам доводилось займатись археологією? Що за проект? Як враження? 🙂

Advertisements

Written by bunyk

Червень 20, 2012 at 19:57

Оприлюднено в Кодерство

Tagged with , ,

Відповідей: 14

Subscribe to comments with RSS.

  1. У нас на цю тему було таке правило: робити мінімум рефакторингу, писати одразу ідеальний код.

    До-речі, в TFS не треба придумувати своїх велосипедів, там зразу є перегляд коду з анотаціями – хто що писав.

    danbst

    Червень 20, 2012 at 22:53

    • Вау, “это очень сильное колдунство”! Вже біжу купляти Майкрософт Тім Фоундейшн Презентейшн Обригейшн Комьюнікейшн. Адже що може бути крутіше за VCS? Тільки VCS, інсталяха якої важить 1 гектар, в ексклюзивна для псевдо-ОС!

      Alexander Yakushev

      Червень 20, 2012 at 23:42

      • От не нада іронії.Мікрософт – це не корпорація мудаків, там є також прогери, і є хороші прогери. І TFS з’явився саме для них, під їх потреби. Те, що я виставив перегляд історії в TFS як перевагу, не означає що я закликаю купувати TFS заради цієї одної фічі. Я хотів показати, що TFS – це сила, бо там продумані навіть такі “мєлочі”!!! ненависть

        danbst

        Червень 21, 2012 at 10:19

        • Моя іронія в тому, що навіть такі “мєлочі” вже присутні в git/mercurial на протязі семи років. При цьому вони не важать гігабайтів, працюють на будь-якій ОС і для них існують десятки різних клієнтів (включаючи клієнти для нормальних текстових редакторів, а не звичайний “notepad” віжуал студії. Where is your Microsoft god now?

          Alexander Yakushev

          Червень 21, 2012 at 10:48

          • Що в тебе вічно за проблеми з Богом і MicroSoft-ом? 🙂

            bunyk

            Червень 21, 2012 at 20:38

            • У нас своя історія відносин 😉 .

              Alexander Yakushev

              Червень 22, 2012 at 08:45

        • Прочитав оцей допис і плакав: http://www.derekhammer.com/2011/09/11/tfs-is-destroying-your-development-capacity.html .
          Мало того, що в TFS централізована VCS, так ще й проект стає рід-онлі, якщо відсутнє підключення до серверу. Оце воістину хороші прогери зробили інструменти для своїх потреб! І, відміть, лише за 5000 тисяч доларів за 5 ліцензій!

          Alexander Yakushev

          Червень 21, 2012 at 14:19

    • А що ви робили, якусь ERP-систему? І у все тій же фірмі “ІТ”?

      bunyk

      Червень 21, 2012 at 20:40

  2. Перекопував код Clojure, коли з’ясовував чому версія 1.3 зламалась для Андроїда 2.3. Використовував git bisect для відловлювання і M-x vc-annotate (http://i.imgur.com/2n0hJ.png). Останній розмальовує код різними кольорами в залежності від давності зміни і, доречі, вміє працювати зі всіма популярними системами контролю версій. Це я так, до слова, раптом тобі набридне забивати цвяхи саморобними лопатами ;).

    Alexander Yakushev

    Червень 20, 2012 at 23:36

    • Красиво, в мене поки що все монохромне. Мені показували як tortoise hg розфарбовує все подібно, але я так і не навчився ним користуватись.

      bunyk

      Червень 21, 2012 at 20:36

  3. Оу, моя лопата всім лопатам лопата, робив, коли було особливо скучно:

    funct SVNBlame()
        let l:scr = StoreScreenState()
        normal gg
        set scrollbind
        20vnew 
        set scrollbind
        let $__filename=@%
        read !svn blame $__filename | awk '{ print $1, $2 }'
        call RestoreScreenState(l:scr)
        set nomodified
    endf
    
    funct StoreScreenState()       " return [ topline, offset ]
        let l:linenum = line('.')  " current
        normal m'H
        let l:linetop = line('.')  " top line
        normal ''
        return [ l:linetop, l:linenum - l:linetop]
    endf
    
    funct RestoreScreenState(state)
        exe "normal ggdd" . string(a:state[0]) . "zt" . string(a:state[1]) . "j"
    endf
    

    А щодо VimScript — писати на ньому не _вміє_, мабуть, ніхто) Це не та мова, де можна «вміти» у майстерному розумінні, хоча в ньому є всякі цікаві функціональні плюшки (map(dct, “print v:val”), filter(dct, ‘v:key > 8’) тощо). Але ці постійні normal, exec та їхні вибухові суміші — це уже справді від лукавого.

    Dmytrish

    Червень 23, 2012 at 07:45

  4. Я ще на роботі часто копаюсь в логах, і. оскільки проект активно змінюється, часто доводиться читати логи невідомої давності, в яких посилаються на номер рядка, який уже давно недійсний, і мені б хотілось фічу: знайти останню ревізію/комміт/чейнжлог, в якому цей рядок мав даний номер.

    Dmytrish

    Червень 23, 2012 at 07:49


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: