• Маленькое удобство, способное прекратить вселенские споры
    +1
    с двумя

    Всего с двумя? Точно-точно?

    for (int i=0;i<10;i++)

    Какой ужас.

    printf("Hello world!");

    Тут уж или puts(), или что-то в конце строки забыто.

  • Колоноскопия. О деликатной теме без насмешек
    +1
    Не знаю что там исследования, но по себе прекрасно знаю: влияет. Может не самый типичный случай, но долихосигма.
  • Колоноскопия. О деликатной теме без насмешек
    +1
    > долихосигмы

    Собсно, именно так у меня и её отловили лет 30 назад :) Но тут два вопроса появляются:

    1) Это нынче единственное предназначение ирригоскопии?

    2) Особенность организма прописана во всех медкарточках. Но, тем не менее, тем более учитывая кучу факторов (через неделю 50 стукнет, в недавнем анамнезе 4 стента и один инфаркт), ни при одном обращении к докторам по любому поводу — никто никогда не назначал колону.

    P.S. А в детстве при ФГДС я читерил: перед процедурой глотал атропин…
  • Колоноскопия. О деликатной теме без насмешек
    0
    А ирригоскопия сейчас вообще жива?
  • 6 полезных привычек, которые, что удивительно, есть лишь у немногих программистов
    0
    Это в идеале. На практике, увы, так не бывало ни разу.
  • «Database as Сode» Experience
    –8
    в допетровской Руси.

    18 дек 11, 21:43

    А вы хотя бы ПТУ закончили?
  • О каждодневном совершенствовании JavaScript-программиста
    –6
    JavaScript-программиста

    Фе. Ты или программмист, или.
  • 6 полезных привычек, которые, что удивительно, есть лишь у немногих программистов
    +2
    Нет, две ветки. Практически во всех проектах, с которыми имел дело, было так, даже если нужно отформатировать какое-то legacy в соответствии с coding style, приструнить случайно затесавшиеся табы или убрать виндовые переводы строк. И только после код ревью, тестов и влияния первого в мастер — новые правки.
  • «Программирование лучше секса»
    +1
    О, очередной теоретик. Привёл пример из IOCCC, а что сказать хотеть — забывать, да?
  • Ваш профессиональный спад придет (гораздо) раньше, чем вы думаете
    +3
    Большинство стариков несчастны именно потому, что не могут смириться с тем, что они старые

    Да, есть такое. Для меня это не очень понятно (есличо мне 50, 4 железяки в сердце, и я за эвтаназию, к себе приму спокойно; маме 75 и третий инсульт, но она будет доставать окружающих редкими проблесками разума...)
  • Ваш профессиональный спад придет (гораздо) раньше, чем вы думаете
    +14
    В наших реалиях над советом пойти преподавать, вместо того, чтобы тянуть лямку до последнего, можно только грустно посмеяться. Нет, если вас устраивает оплата примерно в $350 баксов в месяц (а больше вам вряд ли кто-то заплатит, если вы ещё в молодости не строили преподавательскую и/или научную карьеру)

    Ага. Перед глазами пример, как доцента физфака, преподавателя с 20+ стажем и восторженными отзывами студентов, секретаря учёного совета, и прочая, буквально выперли в никуда. Зарплата у неё, кстати, при всех должностях и заслугах была… тадам! 24 тыщи. А формальный повод ещё веселей: недобирала страницы методичек, которые нужно шпарить в свободное время. Сама ушла…
  • Tech Talks Delivery Club на РИТ++
    –3
    Когда я вижу чувака из Delivery, который несётся по тротуару на самокате, у меня одна мысль: а не тормознуть ли его шлагбаумом? Да так, чтобы надолго, желательно навсегда.
  • C2x: будущий стандарт C
    –1
    И придется кроме своих костылей таскать еще и стандартно-библиотечные

    Чем и занимаемся сейчас…

    просто портировать код с «больших» платформ станет чуть сложнее.

    Хе, а для нас они «маленькие» :-)

    Просто поною.

    Вот так выглядит нынче банальная strlen() в версии FreeBSD (часть комментариев вырезаю):

    Тык
    #include <sys/cdefs.h>
    __FBSDID("$FreeBSD$");
    
    #include <sys/limits.h>
    #include <sys/types.h>
    #include <string.h>
    
    /*
     * Portable strlen() for 32-bit and 64-bit systems.
     *
     * Rationale: it is generally much more efficient to do word length
     * operations and avoid branches on modern computer systems, as
     * compared to byte-length operations with a lot of branches.
     *
     * The expression:
     *
     *  ((x - 0x01....01) & ~x & 0x80....80)
     *
     * would evaluate to a non-zero value iff any of the bytes in the
     * original word is zero.
     *
     * On multi-issue processors, we can divide the above expression into:
     *  a)  (x - 0x01....01)
     *  b) (~x & 0x80....80)
     *  c) a & b
     *
     * Where, a) and b) can be partially computed in parallel.
     *
     * The algorithm above is found on "Hacker's Delight" by
     * Henry S. Warren, Jr.
     */
    
    /* Magic numbers for the algorithm */
    #if LONG_BIT == 32
    static const unsigned long mask01 = 0x01010101;
    static const unsigned long mask80 = 0x80808080;
    #elif LONG_BIT == 64
    static const unsigned long mask01 = 0x0101010101010101;
    static const unsigned long mask80 = 0x8080808080808080;
    #else
    #error Unsupported word size
    #endif
    
    #define LONGPTR_MASK (sizeof(long) - 1)
    
    /*
     * Helper macro to return string length if we caught the zero
     * byte.
     */
    #define testbyte(x)             \
        do {                    \
            if (p[x] == '\0')       \
                return (p - str + x);   \
        } while (0)
    
    size_t
    strlen(const char *str)
    {
        const char *p;
        const unsigned long *lp;
        long va, vb;
    
        /*
         * Before trying the hard (unaligned byte-by-byte access) way
         * to figure out whether there is a nul character, try to see
         * if there is a nul character is within this accessible word
         * first.
         *
         * p and (p & ~LONGPTR_MASK) must be equally accessible since
         * they always fall in the same memory page, as long as page
         * boundaries is integral multiple of word size.
         */
        lp = (const unsigned long *)((uintptr_t)str & ~LONGPTR_MASK);
        va = (*lp - mask01);
        vb = ((~*lp) & mask80);
        lp++;
        if (va & vb)
            /* Check if we have \0 in the first part */
            for (p = str; p < (const char *)lp; p++)
                if (*p == '\0')
                    return (p - str);
    
        /* Scan the rest of the string using word sized operation */
        for (; ; lp++) {
            va = (*lp - mask01);
            vb = ((~*lp) & mask80);
            if (va & vb) {
                p = (const char *)(lp);
                testbyte(0);
                testbyte(1);
                testbyte(2);
                testbyte(3);
    #if (LONG_BIT >= 64)
                testbyte(4);
                testbyte(5);
                testbyte(6);
                testbyte(7);
    #endif
            }
        }
    
        /* NOTREACHED */
        return (0);
    }
    


    Вот так в glibc:

    Тык
    #include <string.h>
    #include <stdlib.h>
    
    #undef strlen
    
    #ifndef STRLEN
    # define STRLEN strlen
    #endif
    
    /* Return the length of the null-terminated string STR.  Scan for
       the null terminator quickly by testing four bytes at a time.  */
    size_t
    STRLEN (const char *str)
    {
      const char *char_ptr;
      const unsigned long int *longword_ptr;
      unsigned long int longword, himagic, lomagic;
    
      /* Handle the first few characters by reading one character at a time.
         Do this until CHAR_PTR is aligned on a longword boundary.  */
      for (char_ptr = str; ((unsigned long int) char_ptr
                & (sizeof (longword) - 1)) != 0;
           ++char_ptr)
        if (*char_ptr == '\0')
          return char_ptr - str;
    
      /* All these elucidatory comments refer to 4-byte longwords,
         but the theory applies equally well to 8-byte longwords.  */
    
      longword_ptr = (unsigned long int *) char_ptr;
    
      /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
         the "holes."  Note that there is a hole just to the left of
         each byte, with an extra at the end:
    
         bits:  01111110 11111110 11111110 11111111
         bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
    
         The 1-bits make sure that carries propagate to the next 0-bit.
         The 0-bits provide holes for carries to fall into.  */
      himagic = 0x80808080L;
      lomagic = 0x01010101L;
      if (sizeof (longword) > 4)
        {
          /* 64-bit version of the magic.  */
          /* Do the shift in two steps to avoid a warning if long has 32 bits.  */
          himagic = ((himagic << 16) << 16) | himagic;
          lomagic = ((lomagic << 16) << 16) | lomagic;
        }
      if (sizeof (longword) > 8)
        abort ();
    
      /* Instead of the traditional loop which tests each character,
         we will test a longword at a time.  The tricky part is testing
         if *any of the four* bytes in the longword in question are zero.  */
      for (;;)
        {
          longword = *longword_ptr++;
    
          if (((longword - lomagic) & ~longword & himagic) != 0)
        {
          /* Which of the bytes was the zero?  If none of them were, it was
             a misfire; continue the search.  */
    
          const char *cp = (const char *) (longword_ptr - 1);
    
          if (cp[0] == 0)
            return cp - str;
          if (cp[1] == 0)
            return cp - str + 1;
          if (cp[2] == 0)
            return cp - str + 2;
          if (cp[3] == 0)
            return cp - str + 3;
          if (sizeof (longword) > 4)
            {
              if (cp[4] == 0)
            return cp - str + 4;
              if (cp[5] == 0)
            return cp - str + 5;
              if (cp[6] == 0)
            return cp - str + 6;
              if (cp[7] == 0)
            return cp - str + 7;
            }
        }
        }
    }
    libc_hidden_builtin_def (strlen)



    А вот так у нас:
    Тык
      .title  C$STRLEN
        edit_level  005
    ; Facility: 
    ;   DEC C Run Time Library on the Alpha/VMS Platform
    ;--
        ; r16 = src pointer
        ; Returns r0 = length
        ; Destroys r16,r27-r28
    
            .psect $LINK$,noexe,nowrt
        $PROCEDURE_DESCRIPTOR DECC$STRLEN, ALIASES=decc$strlen, ENTRY=strlen_code
            .psect $CODE,pic,shr,exe,nord,nowrt   ; A 3 instruction jacket should do
    
    strlen_code:
        ldq_u   r27, (r16)      ; Get QW containing start of string
        lda r28, -1(r31)        ; Mask of all ones
        mskql   r28, r16, r28       ; Nonzeros in low bytes to be ignored
        and r16, #7, r0     ; Alignment = bytes not to be counted
        or  r27, r28, r27       ; Fill ignored bytes with nonzeros
        cmpbge  r31, r27, r27       ; Any null bytes in this QW?
        subq    r31, r0, r0     ; Initialize count to -alignment
        bne r27, bottom     ; Skip if null byte seen
    
    loop:   ldq_u   r27, 8(r16)     ; Load next QW of string
        addq    r16, #8, r16        ; Advance pointer
        addq    r0, #8, r0      ; Increment length
        cmpbge  r31, r27, r27       ; Any nulls in this QW?
        beq r27, loop       ; Repeat if not
    
    bottom: and r27, #^xF, r28      ; Null in low longword?
        subq    r27, #1, r16        ; Complement the lowest 1-bit in mask
        blbs    r27, done       ; Exit if null appears in first byte
        andnot  r27, r16, r27       ; Make single-bit mask of null location
        beq r28, geq_4      ; Skip if null is in high longword
        srl r27, #2, r27        ; Map 2/4/8 --> 0/1/2
        addq    r0, #1, r0      ; Bump length by one...
        addq    r0, r27, r0     ; ... and then by null location
    done:   ret r31, (r26)
    
        ;.align quad
    geq_4:  srl r27, #5, r28        ; Map 10/20/40/80 --> 0/1/2/4
        srl r27, #7, r27        ; Map 10/20/40/80 --> 0/0/0/1
        addq    r0, #4, r0      ; Bump length by four
        subq    r28, r27, r28       ; Compute location within high LW...
        addq    r0, r28, r0     ; ... and add to length
        ret r31, (r26)
    
        .end



    Ну или
    так
    #if defined(__ia64)
    /*
    ** Only compile on IA64 due to problems with linkages set in STRING.H
    ** for Alpha and VAX.
    */
    #include <editlevel.src>
    #pragma module c$strlen EDIT_LEVEL(1)          /* number of bytes in string */
    
    #include <string.h>
    #include <wide_types.src>
    /*
    **  strlen
    **  Return values:
    **      Returns the number of bytes in a string.
    */
    
    /* Disable builtin name */
    #undef strlen
    
    #ifdef __ALPHA
    #define strlen decc$strlen2
    #endif
    
    __size_t strlen(__wide_const_char_ptr s)
    {
        register __wide_const_char_ptr ps  = s;
        register __wide_const_char_ptr b  = 
            (__wide_char_ptr)((__int64)(s + 7) & (__int64)(~7));
    
        /* Check for zero byte up until a quadword boundary */
        for (; ps < b && *ps ; ps++);
    
        /* Check full quadwords (faster) if zero byte not found. */
        if (*ps) {
            register __wide_const_char_ptr qword = ps;
    
        /* Loop until next quadword has null byte */
            for (; qword[0] && qword[1] && qword[2] && qword[3] &&
                   qword[4] && qword[5] && qword[6] && qword[7];
                   qword  += 8 );
    
        /* Find the null byte within the last quadword */
            for (ps=qword; *ps; ps++);
        }
    
        /* return (end-start) = size of string */
        return ps - s;
    }
    
    #endif /* __ia64 */
    

    И сколько нужно тесткейсов написать, чтобы ВСЕ варианты обработать? Да, для банальной strlen :) А ещё интеграционные тесты, регресс, и прочее.

    И это самый простой пример.

    Про не такую уж стандартную «ерунду» и не говорю. Но если будет принят хоть какой-то вперёд идущий стандарт, это подстегнёт разработчиков компиляторов подтягиваться. Для нас это хорошо. Ну и переложит ответственность на других :-) А то пока за CRTL в данном случае отвечаем мы, компилятор сам по себе, стандарты вообще фиг знает где болтаются :)

    Не всё мне тут нравится, но я за определённость. OK, синтаксис K&R убрали, но… Или уже POSIX, или ну в пень эти виляния.

    P.S. Прекрасно понимаю ваши проблемы. Но и у нас их тоже до фига. А стандарт… Он для всех (читай для большинства) :)
  • C2x: будущий стандарт C
    –1
    мне это видится путем к стандартной библиотеке C++ со всеми ее минусами и плюсами.

    Ну нет у нас плюсов, и не предвидится :) Точнее, есть немного, но только для небольшого количества портируемых программ, да и то их напильником приходится допиливать, чтобы
    компилятор справлялся
    $ cxx/version
    VSI C++ V7.4-008 for OpenVMS Alpha V8.4-2L2



    А объёмы очень нехилые. Поэтому пополнения стандартной библиотеки C очень даже приветствуются.

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

    Вот тут я не совсем понял. Зачем править код, если можно изначально обходиться без той же strndup()? Как-то жили ведь до этого.
  • C2x: будущий стандарт C
    0
    И эти 2 функции легко реализуются через уже существующие, так что я не понимаю зачем их тащить в стандарт.

    Как раз затем, чтобы не реализовывать их каждый раз :) Мы, например, постоянно сталкиваемся с утилитами или библиотеками, где много чего вроде такий функций вовсю используется (_GNU_SOURCE, _XOPEN_SOURCE, _BSD_SOURCE, _POSIX_C_SOURCE etc). Приходится поддерживать (и регулярно пополнять) отдельную RTL со всем добром. А это немало человеко-часов, unit-тесты и прочие затраты ресурсов и времени.

    с точки зрения портирования кода это дополнительные действия.

    А чем не вариант написать свои malloc()/calloc()/free()? IMHO, в этом случае такой подход может быть оправдан и не так затратен.
  • C2x: будущий стандарт C
    +2
    А так ли много других функций с неиспользуемыми агрументами? Если много, то что-то здесь не так…

    P.S. Афигеть как мы опередили стандарты. Буквально неделю назад strndup() вошла в состав RTL VMS :) Но, с другой стороны, язык и библиотека — вещи разные, да. Ещё про alloca() можно вспомнить, или про va_copy…
  • Инсайды от сотрудника Facebook: как попасть на стажировку, получить оффер и все о работе в компании
    0
    Ну, у меня пока зациклиться не получилось :) Хотя с грандами имел дело. Но соглашусь с Мертвоедом:
    Сложность решаемых задач куда интереснее.

    Да. В данный момент у нас всего 4 разработчика. И это офигенно (все матёрые зубры, глубоко за 30, и задачки уровня «а ну-ка попробуй скомпилючить libpq под альфу»)
  • Инсайды от сотрудника Facebook: как попасть на стажировку, получить оффер и все о работе в компании
    0
    А мне лет через 20 стало глубоко насрать :)
  • Инсайды от сотрудника Facebook: как попасть на стажировку, получить оффер и все о работе в компании
    0
    Возможно, «уух какие технологии», «уух какой карьерный рост». Ну и причастность к чему-то большому, для начинающих это, наверное, важно…

    в 99% случаев в маленькой компании будет и комфортной и платить будут больше.

    Понимание этого приходит позже.
  • Вступил в силу новый ГОСТ для цифровых ресурсов: все платформы должны быть доступны для инвалидов
    –3
    Вот всё, что об этом нужно знать:

    Пунктуация тоже авторская

  • Говорим про тестовые задания: несколько историй и опрос
    0
    О, придумал ещё одно тестовое задание (прямо по следам конкретной задачи, с которой имел дело недавно).
    Выполняется здесь и сейчас, без домашки и оплаты :)
    Придумайте хотя бы один unit-тест для qsort_r()
  • Говорим про тестовые задания: несколько историй и опрос
    +1
    В очередной раз поднимается эта тема. И, в который раз, вижу два пограничных варианта.

    1. Даётся что-то монстрообразное, выполнение чего занимает от часов до дней.
    2. Ой, олимпиадная задачка.

    А других что, не бывает? Могу привести примеры, которые мне самому очень нравятся, и которые давались после болтовни на технические темы. Решались на месте.

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

    Исходно: Perl, C++
    Имеется массив слов. Нужно создать некую структуру данных, в которой были бы сгруппированы слова, являющиеся анаграммами, и отдельно — слова, анаграммами не являющиеся. Объяснить выбор структуры для хранения результата.

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

    Исходно: C, но в принципе любой язык
    Написать функцию, которая возвращает максимальная сумму непрерывной возрастающей последовательности в массиве челых чисел. Ограничение — O(n).

    (работаю сейчас)

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

    P.P.S. Впрочем, в моих областях можно и калькулятор попросить написать. С объяснениями, почему обратная польская, а не спуск, или наоборот :)
  • Илон Маск расшифровал имя данное его новорожденному сыну
    0
    Моё имя Всеволод. Угадайте, сколько раз за 50 лет я был Серёжей, Славой, Володей, другими именами (всё, что начинается на букву «С» или «В» — только вершина айсберга)
    А тут вполне конкретика. Так что нормуль.
  • Главная причина, почему все-таки Linux
    +1
    Дайте ссылку, тогда можно будет предметней.
  • Главная причина, почему все-таки Linux
    +1
    А вот и причина прилетела. Помер винт. Только не говорите что у вас такого не бывает. Ему можно, он совсем старенький. Но /home-то, с конфигами, на другом :) И восстановление привычного окружения заняло минуты.
  • Илон Маск расшифровал имя данное его новорожденному сыну
    +7
    И не только у математиков. Английский язык — не единственный в мире.
  • Главная причина, почему все-таки Linux
    +2
    Никогда специально шрифтами не интересовался, обнаружил специально для этого обсуждения

    Вот, кстати, да. Понял бы это ещё на заре, когда был ещё «ДятлоЛинукс» (KSI, если кто помнит), а YaST в сусе иногда такие свостопляски выдавал… И мониторы «рыбий глаз». То есть в прошлом веке :)

    Как и про многие другие проблемы, узнаю об их существовании только в ходе подобных э… Срачей.
  • Главная причина, почему все-таки Linux
    +1
    В отсутствии работоспособных нормальных GUI.

    Можно подробней, что не так с моей крыской?
    Когда из GUI не поставился пакет — я полез в консоль

    Так это же замечательно, что есть такая возможность.
    3. Когда мне потребовались кодеки для видео я полез в консоль.

    Не знаю, что за специфические кодеки понадобились. Но последний раз я имел дело с такой проблемой как раз под XP лет 15 назад (что-то про какой-то к-лайт кодек пак всплывает в памяти...). В том же минте вот даже не помню, чтобы хоть раз приходилось задаваться вопросом «а не поставить ли кодек».
    При переполнении вара ОС не стартует.

    Это ж надо так постараться, чтобы вар!

    Впрочем, повторюсь: ни эта, ни другие перечисленные проблемы меня не парят. Некоторые вообще не знакомы. Конечно, сталкивался с чем-то, как же без этого. Но если провести анализ, то можно сказать так. За 10 с лишним лет linux only (и не только на личных компах) проблемы были единичные, их помню практически поимённо. За всё время юзания Windows, начиная с 3.11, проблемы были всегда и постоянно. Их было так много, что список давно обнулил из-за переполнения. Больше в это болото вступать не хочу.
  • Главная причина, почему все-таки Linux
    +1
    Я прекрасно понимаю, что моё мнение не равно мнению большинства.
    сделайте его дружелюбнее
    Но лет 10 назад окончательно снёс винды у себя, и с тех пор кому только не ставил (из ближайшего окружения). Разницы в «дружелюбности» не замечал никто. Более того, недавно появилась потребность в win10, так эти же люди удивлялись: что это за неюзабельное и тормозящее гуано?

    Да, какие-то проблемы были. Связанные со специфическим софтом уровня сложных формул в MathLab, изначально сделаных в MS Office. Проблемы с цисковским Webex. Но это специфические задачи, которых везде до фига.

    А в чём «недружелюбность» я не очень понимаю. Во всяком случае на уровне решения 99% бытовых задач.
  • Главная причина, почему все-таки Linux
    +1
    Одна из? Серьёзно? Даже спрашивать дальше не хочу.

    Как же я рад, что после 25+ лет в разработке, после зоопарка языков и технологий, вернулся в C и ассемблеры :)
  • Главная причина, почему все-таки Linux
    0
    IDE бывают разные :) Моя боевая, например, выглядит…

    так



    Есть, конечно, VMS IDE, но фиг знает как оно, у меня виндов нет :) А под линуксом для предварительной отладки вполне комфортно под 4 ядрами i5 с 16 Gb.
  • Главная причина, почему все-таки Linux
    +2
    Ну, бывает… У меня есть обратный пример. На новой работе выдали комп с 10. Никакой специфической привязки к Windows по работе нет. Просто достаточно навороченая экосистема с VPN, явками-паролями, общением через MS Teams, почта-календарь в Outlook 365, и т.д. Команда размазана по нескольким странам, так что выбор можно понять. Помучился пару дней… А потом разогнали по домам на карантин. Там я обложился внутренней документацией и за полдня поднял всю экосистему на домашнем Mint. Уже второй месяц никакого дискомфорта не испытываю. Всё летает (несмотря на то, что у офисного i5 8 ядер, а у меня 4, мой шустрей!), задачи решаются без проблем… По выходу из карантина обещали рабочий комп заменить (там какие-то заморочки с безопасностью и битлокером, который хрен знает как снять, чтобы ОС переставить, не особо вникал, да и не интересно).

    В общем, если показать наглядно что твой подход работает, вменяемое начальство пойдёт навстречу. И даже попросит написать руководство по настройке для таких же «виндовых мучеников» :)
  • Главная причина, почему все-таки Linux
    0
    Вяло пожимая плечами… Лично я с такой проблемой не сталкивался. Но этот частный случай, безусловно, повод сказать, что Linux — говно.
    Ну да, и именно убунта, да и Linux вообще, виноваты в неподдержке TLS1…
  • Главная причина, почему все-таки Linux
    0
    За последние лет 10 напильником пришлось работать 1 (один) раз. При установке драйверов для древнючего сканера.
  • ПШЕ AndroidStudio или как использовать VCS Tools по полной
    0
    print не прорвётся через unit-тест, мимо.
    нужно и можно

    Можно. Но живы же как-то до сих пор :) И нормально живём.
  • ПШЕ AndroidStudio или как использовать VCS Tools по полной
    0
    В обоих проектах структура тянется давно. В первом с 1994, во втором с 1979 :) Конечно, не всегда был гит. Но были (и есть) подпроекты, у каждого своя команда. В данный момент в моём подпроекте 8 человек. Всего в проекте около 200. Тестировние, вливание «под» в общее целое — отдельный вопрос. Но никогда «вопрос typo» не стоял. Вплоть до того, что исправление одной циферки в копирайте делается отдельным коммитом уже после code review в PR (но до принятия, само собой). Без правки истории.
  • ПШЕ AndroidStudio или как использовать VCS Tools по полной
    0
    можно ли рабочий код и его тестирование разделять отдельными коммитами?

    Вот тут я совсем потерял мысль :) Есть юнит-тесты, в моём случае это CUnit на каждый чих (хоть и ненавижу эту бюрократию, но надо, и оно оправдывается — иногда такие банальные ляпы бывают). Вот буквально сегодня столкнулся с тем, что попросили поправить аж на уровне pull request. А коммиты… дело интимное. Ну, не на уровне Ctrl+S, но близко.
  • ПШЕ AndroidStudio или как использовать VCS Tools по полной
    0
    $ find . -name '*.[cpp|h]' | wc -l 
    14330
    $ find . -name '*.[cpp|h]' | xargs cat | wc -l                                                        
    5282953
    


    Это прошлый. Нынешний поскромней, примерно вот такой:

    $ find . -name '*.[c|h]' | wc -l                                                                       
    12290
    $ find . -name '*.[c|h]' | xargs cat | wc -l 
    1374514
    
  • ПШЕ AndroidStudio или как использовать VCS Tools по полной
    –1
    Из чего я делаю вывод, что вы никогда не работали в крупных проектах

    Неправильный вывод :)
    и тем паче в opensource-проектах

    Это да, то есть не имел дело настолько серьёзно.

    Правка истории коммитов, IMHO, порочная практика. Она маскирует реальную картину происходящего. Коммент коммита поправить — да, но и только.
  • ПШЕ AndroidStudio или как использовать VCS Tools по полной
    –7
    Вы создали большой PR с большим количеством коммитов, да перед пушем заметили, что одно из сообщений некорректно и было бы неплохо его отредактировать, пока жесткий ревьювер не четвертовал Вас за такую оплошность

    Э… Если код ревьювер докопается до моего коммита с комментарием "#ля, очепятка", я приложу все усилия, чтобы его гнали ссаными тряпками.