Задача за $500. Часть вторая, про деньги

    В прошлом посте (tl;dr метод поиска сотрудников через конкурсы с денежными призами в интернете, а не по классической схеме «резюме, отдел кадров, работа») с первого комментария началось обсуждение рентабельности подхода, а именно – не слишком ли дорого такие поиски работников обойдутся. Постараюсь ответить на этот вопрос, ну и вообще рассказать, что получилось.

    Напомню вкратце общие положения:

    • Всем желающим предложена задача на языке Си;
    • Программист, приславший хорошее решение с первого раза, получает $500, без каких-либо обязательств;
    • Со второго и более раза – $250;
    • Трудоустройство (в т.ч. удаленная работа) предлагается при наличии взаимной симпатии;
    • Никаких резюме, «холодных» рассылок через LinkedIn и т.п. фигни.

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

    Результаты за полгода


    Призовая статистика: 14 человек прислали хорошее решение, еще четверо получили реферальные выплаты (реферальная система работает только через почту), всего 18 × $250 = $4500

    В результате на работу были приняты четыре программиста. Многие ребята от сотрудничества отказались, т.к. не нуждались в работе. Это отчасти подтверждает эффективность метода: нашли хороших, работающих программистов. (А как переманить их из Гугла и других Микрософтов – пусть в бухгалтерии голову ломают теперь.)

    Минимум один призер был замечен в (условном) читерстве – прислал неплохую компиляцию ответов с форума Stack Overflow. Впрочем, приз он получил, все по-честному.

    Итого в активе:

    • Фирма нашла сразу несколько классных специалистов;
    • Не совершая привычных «кадровых» обрядов, в частности, не читая килотонны резюме и не собеседуя всех и каждого;
    • Также у компании остались контакты «на будущее» – претендентов, которые почти подошли.

    Хорошо это или плохо?


    Оценить затраты, составившие за полгода $4500, можно в сравнении с «традиционными» сервисами поиска сотрудников (кадровыми агентствами). На территории бывшего СССР агентства хотят за свои услуги компенсацию в размере 1-3 окладов потенциального работника (несложно догадаться, что получается в среднем больше, чем $4500 за человека).

    Получается, что раздавать программистам деньги не только приятно (дарить подарки вообще классно), но и выгодно. Метод признан эффективным.

    Самое главное


    Мероприятие продолжается, и у желающих попасть под раздачу скучных денег и/или интересной работы есть все основания это сделать.

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

    Комментарии 113

      +1
      Если посмотреть на список людей, получивших выплаты, и просуммировать их, то получится $25,250, что уже превышает бюджет в $25k.
      То есть никто уже больше выплат не получит до тех пор, пока бюджет снова не увеличат.
        +4
        Теория заговора интересная, но разгадка как всегда очень простая: страницу забыли обновить. Сейчас попробую это исправить, спасибо.
        +2
        Заманчиво. Жаль, что я не программист на C.
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            Пару дней.
            –13
            Что-то мне не нравится, что вместо 5 минут у меня потребовалось 7, и оба решения мне не нравятся.
            Да и вообще, API мне не нравится.

            И да, есть еще 3е решение, исключительно на одном из инклудов, но мне такой подход кажется вообще маразмом.
            В общем, всё выглядит так, будто задание неполное, и реализовывать как бы то ни было при таком ТЗ вообще кажется странным.
              –3
              использование str_cpy и str_cat небезобасно, вот strl_xxx совсем другое дело
                +1
                Забавно. Я не С программист, но применил почти забытые знания из университета и гугл-фу — вроде неплохо получилось, отправил решение.
                Интересна статистика через пару недель: много ли таких как я — не целевой аудитории, которая польстилась на деньги?
                  0
                  а есть на javascript такое же? хочу 500 долларов
                    0
                    Есть, но там без призов, только работу предлагают.
                      +4
                      Вы серьезно? Вы же понимаете сколько сейчас с хабра понабежит ваши задачи решать ради лулзов, это же влетит в копеечку (я уж не стал отправлять просто т.к. не ищу работу на си и разорять вас ни к чему)
                    +2
                    Конкурсы это здорово, но на работе не конкурсы а рутина.
                      +7
                      Не совсем точное ТЗ.
                      Должны ли результирующие функции использовать стандартный формат ASCIIZ и оставлять на совести разработчика потенциально возможный вызов с аргументом, указывающим на строку без null-терминатора, что может привести к переполнению буфера?
                      Как будет реализована str_free? Будет ли это просто враппером над стандартным free, что дает нам использовать стандартный malloc для выделения памяти?
                      Если я правильно понимаю подразумеваемые моменты, то ответы на оба вопроса будут — да. Но хотелось бы уточнить, прежде чем приступать.
                        +2
                        Ответ на первый вопрос вытекает из условий, не обратил внимания сначала.
                        На второй — остается верить своей догадке.
                        Отправил решение, не столько ради денег, сколько из любопытства — верно ли я понял ТЗ :)

                        Правда, мне правда интересно, не слишком ли легкомысленно было писать о подобном конкурс на хабре? Здесь, я полагаю, найдется приличное количество людей, способных легко решить эту задачу.
                          +1
                          Согласен со всеми поднятыми вами вопросами. И добавлю: там на самом деле еще больше тонкостей. В связи с этим решение (которое может претендовать на приз) растягивается далеко не на 5 минут, даже если вы опытный программист.
                          0
                          А в чём, собственно, первичная цель? Функции должны быть эффективнее библиотечных?
                          Непонятно совсем что-то. Если главной целью не является производительность, тогда в чём смысл изобретения велосипеда?
                          Либо, если нужна максимальная эффективность, тогда может пострадать читаемость или кроссплатформенность.
                            +4
                            Ну так главная задача — угадать что организаторы понимают под " хорошим решением" :) А вы думали просто так 500 долларов дают?
                              0
                              Может они как раз и не хотят велосипед и достаточно просто передать параметры далее в библиотечные функции :)
                                0
                                А вы почитайте внимательнее условия, можно ли просто так передать параметры в библиотечные функции…
                                +2
                                Я участвовал в этом конкурсе и по результатам общения с организаторами могу подтвердить вашу догадку. Это именно конкурс «угадай мысли организатора». Например, организаторы считают нормальной практикой допущение undefined behavior в некоторых случаях. Конечно, в пользу этого у них есть множество аргументов.
                                  +2
                                  Справедливости ради замечу, что опытный программист (а именно такие требуются фирме) должен быть способен угадать большинство мыслей организаторов. Не забывайте, что основная цель данного конкурса — поиск подходящих программистов. А просто так красиво решить задачу, чтобы срубить бабла — очень непросто. В общем, совет всем, кто думает сделать попытку — подходите к делу обстоятельно. Обдумывайте каждую мелочь. В интернете, на сайте компании, есть страничка с «рекомендованным чтением» — прочтите ее внимательно.

                                  Вам могут предложить работу, даже если вы не на 100% справитесь с заданием, но при этом продемонстрируете свои профессиональные качества. Но эта работа требует на самом деле много знаний и опыта. Не каждый с ней справится.
                                    +1
                                    Еще пара советов соискателям. По каждой библиотечной функции, которую вы вызываете; по каждому оператору — обязательно почитайте стандарт, обратите внимание на все тонкости. Вас могут завалить на незнании каких-то аспектов работы функций или операторов, которые в реальной жизни редко проявляются. При этом стандарт не панацея — в некоторых случаях можно обоснованно (с точки зрения организаторов) допустить undefined behavior. Тут нужно руководствоваться вашим опытом, интуицией и знанием архитектуры современных компьютеров.

                                    Если из условия вам непонятно, предъявляются ли жесткие или мягкие требования к тому или иному аспекту работы вашей «библиотеки» — считайте, что требования жесткие. Ведь сказано: «library quality code», а не «quick and dirty hack». Представьте себя на месте организаторов. В мире много желающих срубить $500, а призовой фонд ограничен. Также в мире встречаются большие мастера программирования на C, и они тоже присылают свои решения. Ваше должно смотреться очень внушительно на фоне остальных, чтобы иметь шансы получить приз. Поэтому вас будут валить на любой мелочи, и прежде, чем отправлять решение, подумайте, как его можно завалить, и убедительно аргументируйте каждый аспект своего решения исходя из позиции: «library quality», «large-scale application».
                              –1
                              Мне нужна работа, но в подобных разводах участвовать отказываюсь.
                              Правда си я трогал всего то пару раз (на первый взгляд знаю решение).

                              Обычно надо угадать как составить резюме, что бы был шанс на собеседование, а тут надо угадать решение. А деньги только ради привлечения внимания.
                                +1
                                Если применять термин «лотерея», то надо отметить, что билеты тут бесплатные (ну, почти бесплатные: сколько стоят 5 минут вашего времени?).
                                С этим уточнением лично я не вижу никаких проблем в условиях конкурса. Хотите попробовать «вытянуть удачный билет» — пробуете. Не хотите — не пробуете.
                                  +2
                                  Поэтому от резюме и стараются отказаться, т.к. на должность Senior %language% developer резюме отправляют вообще все, в т.ч. «трогал %language% пару раз» и «ох, мы это вроде проходили в универе, я тогда болел, но все равно напишу».

                                  От этой угадайки приходится тратить время на заведомо неприятные и бессмысленные собеседования. Сам этой фигней раньше занимался, набирали веб-разработчиков на пхп для поддержки одной штуки. В резюме написано – Apache. Спрашиваю, мол, ну расскажи про Apache что-нибудь. «А, ну, это короче там скачиваешь такой Denwer, и в нем вот по-моему что-то такое есть, оно для пхп в общем, такие дела.»

                                  То есть соискатель именно что угадал, как составить резюме – подобрал ключевые слова. С заданиями, даже простыми, так не получится.
                                    0
                                    То есть соискатель именно что угадал, как составить резюме – подобрал ключевые слова. С заданиями, даже простыми, так не получится.
                                    Не вижу разницы. Даже скажу, что задания выполнять для меня проще, чем составлять какие то странные бумажки, я программист или кто.
                                      +2
                                      задания выполнять для меня проще, чем составлять какие то странные бумажки, я программист или кто
                                      Т.е. цель достигнута: фирме ведь нужен программист, а не кто-то другой.

                                      Если задание легко решают программисты, а другие ребята на нем валятся – это классное отборочное задание.

                                      Напомню, что задача нужна совсем не для того, чтобы хороший соискатель страдал. Она не должна быть сложной.
                                  0
                                  А С# программисты?
                                    0
                                    А почему вы спрашиваете?
                                    –1
                                    А в чем подвох?
                                      +3
                                      Отправил решение. Жду ответа в любом случае)
                                        +1
                                        Интересно, «размял» мозги. Ради прикола отправил решение.
                                          0
                                          Неясно за что минусят. Я что, кому-то помешал, тем, что отправил своё решение? Я действительно отправил ради прикола, почему нет? Мне действительно интересно, получить ответ.
                                            0
                                            Этот коммент «не в струю» видимо :)
                                            Сегодня пришел ответ с просьбой писать комментарии на английском и что им пришло около 400 писем, так что проверка займёт время :D
                                              0
                                              Интересно, как они поступят, если большая часть из них прислали корректные решения.
                                                0
                                                не прислали. я уверен что моё решение — некорректное, но мне просто интересно получить уточнённое ТЗ.
                                                  +1
                                                  Важно прислать не просто корректное, а как я понимаю элегантное, универсальное, оптимизированное. Возможно я допустил косяк, что не откомментил код. Возможно комментарии тоже считаются, возможно код должен быть красивым. Мне стало интересно, потратил 15 минут времени, отправил. Посмотрим.
                                                    0
                                                    Мне кажется, что мы все говорим о разных задачах. В особенности MichaelBorisov. Уж больно он нагнетает обстановку. Учитывая название(5min_challenge) и их замечание о 7 строчках на функцию. Хочется уже здесь начать обсуждать конкретный код и прийти к какому-то общему заключению.

                                                    К организаторам, неужели до 31 марта нельзя обсуждать конкретный код?
                                                      0
                                                      Хотя признаюсь, одну довольно существенную оптимизацию я упустил.
                                                        –1
                                                        А организаторы разве запрещают обсуждать код?
                                                          0
                                                          Мне казалось это правилом по умолчанию в различного рода интернет олимпиадах. Но раз можно, тогда я начну.
                                                            0
                                                            Если не секрет, можно ли озвучить статистику. Сколько людей прислало с момента публикации? Сколько успели проверить?
                                                +3
                                                Оставлю свои пять копеек по поводу того как нужно нанимать людей. Контора SlamData (специализируется на Scala и является работадателем очень известных Scala гуру таких как Daniel Spiewak) предлагает такой подход: вы присылаете pull-request в их флагманских продукт Precog и за это сразу-же получаете либо job-offer либо чек с оплатой потраченного времени.
                                                  +1
                                                  Да, пулл-реквесты это классно.
                                                  0
                                                  А не могли бы вы (автор) прокомментировать то, что вылезает на второй ссылке, когда гугл просишь поискать «Hola — Олимпиада программистов»?
                                                  Развод для программиста
                                                    0
                                                    Запросто. Это называется слабоумием.
                                                      +3
                                                      По сути ведь нет ноухау в функциях strcat/strcpy. Нет смысла за них как-то «разводить».
                                                      +1
                                                      Участвовал в этом конкурсе. Отослал свое решение, в итоге мне сказали, что я не гожусь, хотя в условии ясно говорилось, что дадут 2-й шанс, не дали и не сказали почему. Когда спросил почему, ничего внятного не сказали, сказали попробуй еще раз написать. Написал другое решение — в ответ 0 реакции. Также я по реферальной системе предложил решить задачу своему знакомому, он решил, ему что-то ответили, указали на что-то, он послал новое решение, оказалось что не пригоден. В итоге я решил, что это лохотрон. Не знаю каких кодеров там нашли и какое правильное решение с их точки зрения, но на лицо двойные стандарты.
                                                        0
                                                        Я тоже отправил, но ещё пока не обидели)) На меня уже произвели неизгладимое влияние Java и Javascript, поэтому я больше не делаю никаких сложных фокусов, даже когда пишу на С. Может быть, фокусы — это то что требуется, или максимально bulletproof-код.
                                                          +1
                                                          По своему опыту общения с организаторами скажу: требуется доскональное знание стандарта C, стандартной библиотеки. Нужно в деталях знать все функции библиотеки. Нужно иметь большой опыт программирования на Си, знать хорошие и плохие практики. Знать архитектуру современных компьютеров и компиляторов. Иметь опыт разработки, или участия в разработке, крупных программных проектов. Знать методы оптимизации программ по быстродействию и использованию памяти.

                                                          Задача, выставленная на конкурс, на самом деле очень сложная, учитывая все требования, предъявляемые к решению. Часть требований в условии не озвучена, и соискатель премии должен сам эти требования додумать. Это тоже часть задачи — дополнить условие.

                                                          Читайте и другие мои рекомендации выше.
                                                            0
                                                            Это все требуется для того чтобы написать str_cpy? Загляните в glibc. Чем не угодили предложенные там функции?
                                                              +1
                                                              Да, все это требуется. Без преувеличений. В стандартном Си нет функций с таким интерфейсом и семантикой, как str_cpy и str_cat в данном задании. Может быть, в glibc есть какие-то нестандартные расширения с такими возможностями — не знаю.
                                                        0
                                                        решил задание. жду ответ…
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                            0
                                                            Что ж, раз habrahabr.ru/post/213529/#comment_7349145 не запрещают обсуждать код, то давайте здесь обсудим возможные решения.
                                                            Мой вариант
                                                            char * str_cpy(char **s0, const char *s1)
                                                            {
                                                              size_t len = strlen(s1);
                                                              char *result = (char *)malloc(len+1);
                                                              memcpy(result, s1, len+1);
                                                            
                                                              if (*s0)
                                                                free(*s0);
                                                              *s0 = result;
                                                            
                                                              return *s0;
                                                            }
                                                            
                                                            char * str_cat(char **s0, const char *s1)
                                                            {
                                                              if (*s0)
                                                              {
                                                                size_t len0 = strlen(*s0);
                                                                size_t len1 = strlen(s1);
                                                                char *result = (char *)malloc(len0+len1+1);
                                                                memcpy(result, *s0, len0);
                                                                memcpy(result+len0, s1, len1+1);
                                                            
                                                                free(*s0);
                                                                *s0 = result;
                                                              }
                                                            
                                                              return *s0;
                                                            }
                                                            

                                                            Одна, на мой взгляд, возможная оптимизация в str_cpy: если длина текущей строки больше или равна новой, то память можно не выделять, а сразу копировать на место старой.
                                                              0
                                                              по поводу последней фразы — не, сразу копировать нельзя. по крайней мере, не через memcpy а через memmove.
                                                              А то они пересекающиеся строки подсунут, типа вот из задания:
                                                              str_cpy(&s, s+5);
                                                                0
                                                                Там ведь не совсем пересекающиеся строки. Левый указатель всегда будет меньше или равен правому, если правая подстрока подмножество левой. Поэтому при копировании не должно быть проблем.
                                                                  0
                                                                  hola.org/issues.html
                                                                  Whether these cases happen in the sample main() supplied, or in other valid reasonable use-cases.

                                                                  так что не всегда, можно и наоборот сделать
                                                                  str_cpy(&s, «something»);
                                                                  char* p = s+3;
                                                                  str_cat(&p, s);

                                                                  а, тут str_cat… все равно, что-то мне не нравится. у меня такое же решение, я его слать не стал.
                                                                    0
                                                                    str_cpy(&s, "something");
                                                                    char* p = s+3;
                                                                    str_cat(&p, s);
                                                                    

                                                                    А такое использование действительно подразумевается? В этом случае мы не можем и не должны освобождать старую память, а как это определить?
                                                                      0
                                                                      претендентов-то много :)
                                                                      меня еще вопрос интересует — а если невалидную строку подсунут? или очень длинную, чтоб strlen не справился?
                                                                      еще, я бы для str_cat воспользовался realloc()
                                                                        0
                                                                        Можно добавить всевозможных защит от дурака, но это всегда в ущерб производительности, ведь использование все же подразумевается корректным. И, кстати, как может strlen не справится с очень длинной, но корректной строкой?

                                                                        Да, realloc там как нельзя кстати. На пару строк кода меньше. По производительности думаю будет одинаково, выделяем же память без запаса.
                                                                          0
                                                                          и после realloc-таки придется использовать memmove, грабли с пересечением будут и в этой функции ))
                                                                            0
                                                                            Приведите корректный пример, который подразумевает пересечение строк и который не будет работать с memcpy.

                                                                            То, что вы привели выше:
                                                                            str_cpy(&s, "something");
                                                                            char* p = s+3;
                                                                            str_cat(&p, s);
                                                                            

                                                                            я считаю некорректным примером, т.к. программа упадет еще на realloc-е. Мы не можем освободить старую память, т.к. указатель указывает не на начало выделенного блока памяти.
                                                                        +1
                                                                        Передача в ф-ию адреса на указатель добавляет неявное условие, что str_cpy() дожно само управлять памятью для строк. При таком раскладе, адрес указателя передаваемый в ф-ию не может быть любым — указатель обязан указывать на начало выделенной памяти. Из этого следует, что char *p = s+3; противоречит такому негласному условию.

                                                                        В противном случае задача не решаема в 7 строк и данными инклюдами.
                                                                          0
                                                                          Именно. А значит можно использовать memcpy без перевыделения памяти в случае, если новая строка меньше или равна по длине старой, перекрытия не будет.
                                                                            0
                                                                            вот и я так рассуждал :) Когда мой вариант рассмотрят и если он не пройдёт, то опубликую его здесь для обсуждения :)
                                                                    0
                                                                    кстати, а если malloc вернет null?
                                                                      0
                                                                      Значит что-то действительно пошло не так и пусть лучше упадет. Но, может быть, лучше добавить проверки.
                                                                        0
                                                                        тогда решение не пройдет, по причине
                                                                        «Invalid memory writes» из списка который я привел выше
                                                                          0
                                                                          Как вы вообще нашли эту страницу — отдельный вопрос)
                                                                    +1
                                                                    я тоже отослал на конкурс решение. Оно не такое уж и простое. Ответа ещё не получил. Беглый взгляд и что я вижу у вас:
                                                                    — str_cpy(NULL, NULL) -> краш
                                                                    — str_cpy() -> always malloc() -> performance loss
                                                                    — str_cat(NULL, NULL) -> краш
                                                                    — str_cat() — 9 lines
                                                                    — all methods: malloc() returns nullptr -> crash

                                                                    думаю можно и дальше искать нюансы. Как тут выше по камментам сказали — задание только на первый взгляд простое. Много подводных камней.
                                                                      +1
                                                                      Всевозможная защита от некорректного использования это ваши подводные камни? По остальным пунктам выше уже обсудили.

                                                                      Если использовать realloc в str_cat, то она может выглядеть как-то так:
                                                                      char * str_cat(char **s0, const char *s1)
                                                                      {
                                                                        if (*s0)
                                                                        {
                                                                          size_t len0 = strlen(*s0);
                                                                          size_t len1 = strlen(s1);
                                                                          *s0 = (char *)realloc(*s0, len0+len1+1);
                                                                          memcpy((*s0)+len0, s1, len1+1);
                                                                        }
                                                                      
                                                                        return *s0;
                                                                      }
                                                                      
                                                                        +1
                                                                        снова ошибка: realloc() может вернуть NULL -> mem leak + crash
                                                                        еще раз говорю — много нюансов, одно из условий конкурса: «The code you write needs to be „library quality“; as good as you would expect a good libc to implement such functions.», поэтому да, надо учитывать ВСЁ =)
                                                                          0
                                                                          Это будет не memory leak, старую память он освободит. И мы опять возвращаемся к тому, что если при выделении памяти вам возвращают NULL, то вряд ли ваша программа будет дальше корректно работать, независимо от того, обработаете ли вы эту ситуацию или нет.

                                                                          UPD:
                                                                          Прошу прощения, не освободит, да, mem leak.
                                                                            0
                                                                            становится сложнее это засунуть в 7 строк, согласитесь.
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                Это не требование. Там есть замечание, что есть эффективное решение в 7 строк. Но эффективное не обязательно идеальное
                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                                              0
                                                                              Вы видимо что-то путаете, я ничего не говорил про освобождение памяти.
                                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                Организаторы конкурса считают glibc хорошим примером «library quality code». Поэтому, если в своем решении вы будете придерживаться тех же подходов, что встречаются в glibc — то у вас есть хорошие шансы.
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                хорошее замечание. я в своей реализации это упустил :( могу не ждать ответа :)
                                                                                  0
                                                                                  Хотя, если src подстрока dst, то она будет всегода короче dst и realloc() вероятней всего не будет производить malloc/free и вероятно вернёт тот же адрес. Но на сколько я помню в стандарте гарантий нет на счёт этого.
                                                                                    +1
                                                                                    Мы же говорим о str_cat, а там не важна длина второй строки, конкатенация же, поэтому всегда(ну или почти всегда) будет происходить malloc/free.
                                                                                  0
                                                                                  Да, это так, но это будет в любом случае, если мы выделяем новую память, т.к. старую мы обязаны освободить, так что невалидный указатель остается.
                                                                                    0
                                                                                    Поспешил, да, нельзя так просто использовать realloc.
                                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                                              0
                                                                              код-то проверяли? запускали?
                                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                Все, кто сомневается, как нужно отрабатывать ошибки вроде возврата NULL из malloc/realloc, а также по другим вопросам: почитайте внимательно эту страницу:

                                                                                hola.org/basics

                                                                                там содержатся ответы на многие вопросы.
                                                                                  0
                                                                                  Там бред содержится, имхо.
                                                                                  Просто один из coding convention'ов компании, совершенно не претендует на хороший код. Это то, что хотят видеть ОНИ, а не большинство. Почитал и ужаснулся.

                                                                                  Бред раз
                                                                                  Trivial > >= < <= == != expressions should not have spaces around them.
                                                                                  Trivial expressions examples: a_var, array[3].var[1], sizeof(xxx), (x + 1)
                                                                                  Pointers (->) are not counted as trivial expressions for > >= < <=, since its
                                                                                  hard to read x->y>z, while its not hard to read x->y==z.
                                                                                  BAD
                                                                                      if (x > 5)
                                                                                  

                                                                                  GOOD
                                                                                      if (x>5)
                                                                                  

                                                                                  BAD
                                                                                      if (x+1>5)
                                                                                  

                                                                                  GOOD
                                                                                      if (x+1 > 5)
                                                                                  

                                                                                  BAD
                                                                                      if (f(x, y) > g(y, z))
                                                                                  

                                                                                  GOOD
                                                                                      if (f(x, y)>g(y, z))
                                                                                  

                                                                                  BAD
                                                                                      if (x->y == 5)
                                                                                  

                                                                                  GOOD
                                                                                      if (x->y==5)
                                                                                  

                                                                                  BAD
                                                                                      if (x->y>=5)
                                                                                  

                                                                                  GOOD
                                                                                      if (x->y >= 5)
                                                                                  

                                                                                  Разве удобно читать такой ад? А когда десяток флагов проверяется, тоже всё скомкать, чтоб глаза вытекли? А последние 2 примера, вообще противоречат друг другу…

                                                                                  Бред два
                                                                                  Dont use 'const char *' (or 'char const *') in code. It is impossible to
                                                                                  integrate code written with consts into a large system.
                                                                                  BAD
                                                                                      const char *gen_token(const char *seed);
                                                                                  

                                                                                  GOOD
                                                                                      // Return a static buffer - dont change.
                                                                                      char *gen_token(char *seed);
                                                                                  

                                                                                  Что это? о_О Гугловый конвеншн, например, наоборот говорит: используйте квалификатор const везде, где это возможно. Сами пишут, что нужно писать «как в тру либах типа libc». Что-то я не видел, чтобы в libc запрещали использовать константы.

                                                                                  Открываем документацию для разработчиков libc и внезапно видим:
                                                                                  Character arrays that are declared const cannot be modified either. It's generally good style to declare non-modifiable string pointers to be of type const char *, since this often allows the C compiler to detect accidental modifications as well as providing some amount of documentation about what your program intends to do with the string.

                                                                                  Бред три
                                                                                  don't put a space after increment and decrement. increment after the value, not
                                                                                  before.
                                                                                  BAD
                                                                                      i --;
                                                                                      ++j;
                                                                                  

                                                                                  GOOD
                                                                                      i--;
                                                                                      j++;
                                                                                  

                                                                                  Аналогично, видел в каком-то конвеншне указание использовать только пре-(ин\де)кремент, а не пост-.

                                                                                  Бред четыре
                                                                                  no space between function name and opening brackets
                                                                                  no space between opening brackets and first parameter
                                                                                  one space after comma:
                                                                                  BAD
                                                                                      printf ("hello %s\n", "world");
                                                                                      printf( "hello world\n" );
                                                                                      printf("hello world\n","world");
                                                                                  

                                                                                  GOOD
                                                                                      printf("hello world\n", "world");
                                                                                  

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

                                                                                  PS Создаётся впечатление, что ищут не программиста\разработчика\«инженера», а быдлокодера — тупого, бестолкового зомби-набивателя_кода_на_клавиатуре, не более.
                                                                                  PPS Опять же, IMHO. Есть там и довольно интересные советы.
                                                                                    –1
                                                                                    Вы правы, именно расстановка пробелов отличает инженера от тупого быдлокодера.
                                                                                      –1
                                                                                      А более конструктивных аргументов против, кроме минусования профиля у вас нет?

                                                                                      Интересует хотя бы пара вопросов:

                                                                                      1. Почему тогда изначально перед «конкурсом» это условие не было обговорено, что раз уж пишете не пойми что, с не пойми какой задачей, то пишите по такому-то coding convention'у. Изначально нечестный подход. Получается, что что-то выиграет только тот, кто случайно попадёт пальцем в небов ваш стиль программирования. А это будет процентов 5, от силы.
                                                                                      2. Зачем упоминается качество реализации libc как пример, в то время, как ваши соглашения противоречат соглашению данной библиотеки?
                                                                                        0
                                                                                        А более конструктивных аргументов против
                                                                                        Разве удобно читать такой ад
                                                                                        Coding conventions нужны именно затем, чтобы не переливать из пустого в порожнее и не спорить с каждым юниором про эту фигню. Бессмысленный разговор бессмысленный, не может быть конструктивной аргументации против «разве удобно читать такой ад», «а я вот так привык», «мой текстовый редактор Visual Eclipse++ ставит пробелы лучше» и т.п. бессмысленных вещей.

                                                                                        А вопросы, это всегда пожалуйста:

                                                                                        1. Приведенные соглашения к задаче непосредственного отношения не имеют, это было бы даже немного странно.

                                                                                        2. См. 1
                                                                                          –1
                                                                                          1. Приведенные соглашения к задаче непосредственного отношения не имеют, это было бы даже немного странно.

                                                                                          Вы правы. Действительно, странно.

                                                                                          Позицию вашу понял, дальнейший разговор считаю бессмысленным, можете не утруждать себя ответами и минусами.
                                                                                          0
                                                                                          Вы борец за справедливость или вам нужна информация, которая может помочь вам победить в конкурсе?
                                                                                        +1
                                                                                        Ваши слова — да в уши тем, кто проверяет решения. Тихонько скажу по секрету, что Coding Conventions тоже проверяются. Тут вы либо оформите код так, как от вас требует заказчик (или начальство) — либо устроите на эту тему жаркие споры.

                                                                                        Дополнительно замечу по поводу споров о Coding Conventions. Допустим, вас берут на работу, включают в крупный проект, создание которого уже потянуло добрый десяток человеко-лет. В этом проекте все оформлено в соответствии с Coding conventions, которые вам не нравятся. Также от вас требуется соблюдать ненавистные conventions в новом коде, который вы пишете. Ваши действия?
                                                                                          0
                                                                                          Позволю себе высказать свое мнение. Я, как мне кажется, уже переболел тем, что всем навязывал свой стиль кодирования. Поэтому сейчас просто придерживаюсь того, который уже используется в проекте. Но. В условиях данного конкурса нигде не сказано, что следует соблюдать определенные правила кодирования.
                                                                                          Код, написанный вами, должен соответствовать по качеству библиотечному коду, как в хорошей имплементации libc.
                                                                                          Это слишком расплывчато.

                                                                                          Если организаторы, будем говорить условно, вычитают балл за несоответствие какому-то конкретному code convention, то это действительно бред.
                                                                                            0
                                                                                            Это слишком расплывчато.

                                                                                            Так в том и дело, что в их coding convention'е куча противоречий с dev-документацией libc.
                                                                                            Зачем было это писать, я не понимаю.
                                                                                            0
                                                                                            Да я не об этом говорю. Совершенно.
                                                                                            Я нисколько не против соглашений о коде.

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

                                                                                            Выше Thunderbird писал, что докопались до минимизации токенов в коде, а это чистый кодинг конвеншн. Так что какая может быть речь об адекватности конкурса. Обычный хантинг с минимальными затратами.
                                                                                        –1
                                                                                        deleted
                                                                                          +1
                                                                                          Вопрос к тем, кто отправил решение и получил ответ.
                                                                                          Сколько времени прошло между отправкой и ответом?
                                                                                          А то я решение отправил, а ответа нет никакого.
                                                                                            +1
                                                                                            Обычно 2-3 дня, но прямо сейчас может пройти неделя – почтовый хабраэффект.
                                                                                              0
                                                                                              Ровно неделя.
                                                                                                0
                                                                                                Прошла неделя. Мне написали, что проверяют.
                                                                                                P.S. Есть ощущение, что письмо генерировали умным автопереводом на русский.
                                                                                                  0
                                                                                                  На самом деле уставшей девочкой.
                                                                                                    0
                                                                                                    Это печально. На самом деле уровень организации конкурса для внешнего наблюдателя является неплохим мерилом того, что происходит внутри компании. Мне кажется, этот уровень можно было бы повысить почти бесплатно.

                                                                                                    Я могу сказать, чтобы сделал бы я на месте организатора.
                                                                                                    1. По своему опыту, качественно проверять стоит только два-три исходника за один заход. В день можно сделать четыре захода — 8-12 исходников. Итого, на 400 посылок получаем примерно 40 рабочих дней на ответ, т.е. два месяца.
                                                                                                    2. Безмолвно заставлять ждать людей два месяца некрасиво. Я бы сообщил о том, как устроена проверка, выдал участнику номер, и где-нибудь вывесил список ориентировочной даты ответа (номер -> дата). Для этого, можно было бы даже написать бота.
                                                                                                    3. Условия конкурса можно было бы сформулировать более четко. Нигде не описан формат посылки. Я бы с удовольствием перед проверкой глазами, прогнал решения через автоматические тесты. Приводить к стандартному виду все исходники — лишняя работа для проверяющего.
                                                                                                      0
                                                                                                      Согласен, да.
                                                                                                      В данный момент этот проект очень факультативный, возможно в будущем что-то такое сделают, я не уверен.

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

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

                                                                                              Самое читаемое