Re[17]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 15:17
Оценка: +3
Здравствуйте, smeeld, Вы писали:

S>Обзавидовался весь. Для меня Яндекс-это примерно то же самое, что и какой-нибудь РФ-овский стройгазнефтепровод, что и остальные 99.5% шаражек в РФ.


Простите за нескромный вопрос: а можно ваш код где-то в публичном доступе увидеть?

Очень хочется понять уровень разработчика, для которого Яндекс эквивалентен по уровню распильной госконторе.

Правда, зная вашу привычку уходить от конкретики, на положительный ответ надежды нет, но вдруг.
Re[18]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 15:25
Оценка:
Здравствуйте, so5team, Вы писали:

S>Правда, зная вашу привычку уходить от конкретики, на положительный ответ надежды нет, но вдруг.


Паспортные данные не прислать? Ссыль на проекты не дам. Куски кода прислать могу, но что это вам даст? Там тупо C++.
Re[15]: Собеседования в Яндекс++
От: koenig  
Дата: 04.06.19 15:26
Оценка: +2
DB>Я что-то вообще не понимаю, что происходит в этой теме. Столько эмоций на ровном месте.

застарелые обиды, наверняка
Re[18]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 15:46
Оценка:
Здравствуйте, so5team, Вы писали:

S>Простите за нескромный вопрос: а можно ваш код где-то в публичном доступе увидеть?


Вот прямо с текущего экрана, смотри:
   
    node_desc_type* allocate_next_cluster_shared_segment(bool wait){
       void* basep;
       DEBUG << " Prepare to fetsh shared journal segment ... ";
       scatter_desc_type *descp;
       cluster_node_desc_type* node_descp;
       shared_segment_lock_type shared_lck (shared_segment_ctrl);
       check_migrate_cluster_node_store();
       while((node_descp = get_cluster_node(current_cluster_node++)) != nullptr){
         if(node_descp->is_alive() and node_descp->is_idle()){
           while(journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0){
             if(node_descp->get_current_storage_chunk() >= get_journal_storage_chunk_count()){
               break;
             }else{
               node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
               node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
               continue;
             }
           }
           if(node_descp->get_shared_segment() == EMPTY_SEGMENT)
             continue;

           basep = reinterpret_cast<void*>(journal_store(node_descp->get_current_storage_chunk()).descriptor_table());

           descp = journal_storage(node_descp->get_current_storage_chunk()).template
                                   get_ptr<scatter_desc_type>(basep, node_descp->get_shared_segment());
           if(descp->is_shared()){
             if(descp->get_created_timestamp() < init_timestamp() and descp->get_init_timestamp() < prev_timestamp()){
               DEBUG << "Initializing Shared Descriptor With offset: " << descp->self();
               descp->init(init_timestamp(), journal_storage_info(node_descp->get_current_storage_chunk()).first(),
                           journal_store(node_descp->get_current_storage_chunk()).raw_size());
             }
             return node_descp;
           }
         }
       }
       if(wait){
         shared_segment_cv.wait(shared_lck);
         if(current_cluster_node() >= journal_store().cluster_node_count())
           set_current_cluster_node(FIRST_NODE_INDEX);
       }
       return nullptr;
    }
Re[19]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 16:23
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Вот прямо с текущего экрана, смотри:


Комментарии и пробелы оттуда специально удалены? Или это код как он есть?
Re[20]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 16:55
Оценка:
Здравствуйте, so5team, Вы писали:

S>Комментарии и пробелы оттуда специально удалены? Или это код как он есть?


Коментарии там идут всегда в начале файла. А пробелы там где надо-выставлены.
Re[21]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 17:03
Оценка: +1
Здравствуйте, smeeld, Вы писали:

S>>Комментарии и пробелы оттуда специально удалены? Или это код как он есть?


S>Коментарии там идут всегда в начале файла. А пробелы там где надо-выставлены.


Ну тогда результат вполне ожидаемый для уровня пафоса матерых профи вроде вас.
Re[22]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 17:12
Оценка:
Здравствуйте, so5team, Вы писали:

S>Ну тогда результат вполне ожидаемый для уровня пафоса матерых профи вроде вас.


Да, пробелы мы не ставим, и каждую строку не коментируем, это не детский сад.
Re[23]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 17:18
Оценка: 6 (1) +4
Здравствуйте, smeeld, Вы писали:

S>Да, пробелы мы не ставим, и каждую строку не коментируем, это не детский сад.


Как только кто-то начинает заводить разговор о том, что у нас не детский сад, то это сразу включается сирена: люди, скорее всего, уверены в том, что уж они-то точно знают, как писать код. Но, блин, почему-то пишут какую-то плохочитаемую хрень. Вроде показанного вами фрагмента.

Неинициализированные переменные, объявленные вне цикла, а использующиеся только внутри цикла и не сохраняющие свои значения между итерациями -- это сделано, вероятно, по показаниям профайлера. Так ведь?
Re[24]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 18:11
Оценка: -3
Здравствуйте, so5team, Вы писали:

S>Неинициализированные переменные, объявленные вне цикла, а использующиеся только внутри цикла и не сохраняющие свои значения между итерациями -- это сделано, вероятно, по показаниям профайлера. Так ведь?


Ну и в чём тут проблема? Где ты их не объявляй, компилятор в любом случае поместит их куда ему надо. Было бы неверно, если бы эти переменные использовались где-то кроме цикла, тогда по невнимательности можно допустить использование значения, присвоенного в цикле, где-то в другом месте, но и это если сильно постараться быть дебилом. Тут же просто собраны все объявления переменных в одном месте, в начале фукнции, это выглядит красивее, чем если ты будешь объявлениями переменных засорять тело цикла. Так что тут дело вкуса.
Re[24]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 18:17
Оценка:
Здравствуйте, so5team, Вы писали:



S>и не сохраняющие свои значения между итерациями


И не должны там переменные сохранять значения между итерациями, вся информация, нужная для каждой итерации, хранится в другом месте, и извлекается соотвествующими функиями, с присвоением значений тем самым локальным переменным функции, через которые эта инфа становится доступна на каждой итерации. Читайте код внимательней, или вы только коментарии читать обучены, и без них ничего не понимаете?
Re[25]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 18:23
Оценка: +1
Здравствуйте, smeeld, Вы писали:

S>>Неинициализированные переменные, объявленные вне цикла, а использующиеся только внутри цикла и не сохраняющие свои значения между итерациями -- это сделано, вероятно, по показаниям профайлера. Так ведь?


S>Ну и в чём тут проблема?


В том, что неинициализированная переменная -- это потенциальный источник багов. Тем более, что здесь вообще элементарно эта проблема исправляется:
    node_desc_type* allocate_next_cluster_shared_segment(bool wait){
       DEBUG << " Prepare to fetsh shared journal segment ... ";
       shared_segment_lock_type shared_lck (shared_segment_ctrl);
       check_migrate_cluster_node_store();
       while(cluster_node_desc_type* node_descp = get_cluster_node(current_cluster_node++)){
         if(node_descp->is_alive() and node_descp->is_idle()){
           while(journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0){
             if(node_descp->get_current_storage_chunk() >= get_journal_storage_chunk_count()){
               break;
             }else{
               node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
               node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
               continue;
             }
           }
           if(node_descp->get_shared_segment() == EMPTY_SEGMENT)
             continue;

           void* basep = journal_store(node_descp->get_current_storage_chunk()).descriptor_table();

           scatter_desc_type *descp = journal_storage(node_descp->get_current_storage_chunk()).template
                                   get_ptr<scatter_desc_type>(basep, node_descp->get_shared_segment());
           if(descp->is_shared()){
             if(descp->get_created_timestamp() < init_timestamp() and descp->get_init_timestamp() < prev_timestamp()){
               DEBUG << "Initializing Shared Descriptor With offset: " << descp->self();
               descp->init(init_timestamp(), journal_storage_info(node_descp->get_current_storage_chunk()).first(),
                           journal_store(node_descp->get_current_storage_chunk()).raw_size());
             }
             return node_descp;
           }
         }
       }
       if(wait){
         shared_segment_cv.wait(shared_lck);
         if(current_cluster_node() >= journal_store().cluster_node_count())
           set_current_cluster_node(FIRST_NODE_INDEX);
       }
       return nullptr;
    }


Кроме того, слишком часто в коде повторяется вызов node_descp->get_current_storage_chunk(), что явно наводит на мысль о том, что данное значение можно закешировать. И то сделает основную часть кода гораздо компактнее.

S> Так что тут дело вкуса.


Скорее здесь имеет место чрезмерное самомнение.
Re[26]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 18:39
Оценка:
Еще вот этот вот фрагмент:
       while(cluster_node_desc_type* node_descp = get_cluster_node(current_cluster_node++)){
         if(node_descp->is_alive() and node_descp->is_idle()){
           while(journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0){
             if(node_descp->get_current_storage_chunk() >= get_journal_storage_chunk_count()){
               break;
             }else{
               node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
               node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
               continue;
             }
           }
           if(node_descp->get_shared_segment() == EMPTY_SEGMENT)
             continue;
    }

while внутри whild и в обоих используются continue... Тем более, что внутри вложенного while в секции else вроде как continue и не к чему... Говнокодом попахивает. Напрашивается вынесение внутреннего while в отдельную функцию или в локальную лямбду, раз уж у вас там что-то похожее на C++11.
Re[26]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 18:43
Оценка: :)
Здравствуйте, so5team, Вы писали:


S>В том, что неинициализированная переменная -- это потенциальный источник багов.


Вы не поверите, но любой код-потенциальный источник багов. Говорить об опасности двух неиницализированных локальных переменных в функции размером на один экран-это демонстрировать отсутствия опыта разработки софта, это типичное поведение джуна, боящегося каждого шага и делающего всё по букварю. Чем Вы себя и выдали.

>>Тем более, что здесь вообще элементарно эта проблема исправляется:


А вот теперь стало выглядеть уродливо, переменные должны объявляться вначале функции, чтоб не засорять остальное тело. Есть масса людей, приверженцев именно подобного code style.

S>Кроме того, слишком часто в коде повторяется вызов node_descp->get_current_storage_chunk(), что явно наводит на мысль о том, что данное значение можно закешировать. И то сделает основную часть кода гораздо компактнее.


Оно и закешируется, оно не просто закешируется, эта функция в коде будет везде заменена компилятором на значение поля, которое данная функция возвращает, это inline функция. Нет необходимости обьявлять переменную, присваивать ей значение, и использовать далее это значение, мне больше нравится оформлять применение значения как вызов функции, возвращающей это значение.
Re[27]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 18:47
Оценка: +6
Здравствуйте, smeeld, Вы писали:

S>А вот теперь стало выглядеть уродливо, переменные должны объявляться вначале функции, чтоб не засорять остальное тело.


Бесплатный совет: научитесь код простой и понятный писать, потом о чьем-то джуниорстве рассуждайте.

А то как не послушаешь матерых профи из Ынтырпрайзных проектов, так круче них только горы и яйца. А посмотришь в их код, так остается всего один вопрос: "Как можно настолько неадекватно себя оценивать?"

Правильно Яндекс высокий входной фильтр выставляет.
Re[19]: Собеседования в Яндекс++
От: a7d3  
Дата: 04.06.19 18:52
Оценка: +2
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, so5team, Вы писали:


S>>Простите за нескромный вопрос: а можно ваш код где-то в публичном доступе увидеть?


S>Вот прямо с текущего экрана, смотри:


Знакомый почерк, такой код по современным меркам считается плохим и неудачным.
Потому что повсеместно перешли на принципы чистого кода, легко читаемого, во имя или ради идеи полного отказа от написания сопроводительной документации.
Не стоит такое присылать тем работодателям, что запросят семплы кода.
Re[27]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 19:08
Оценка:
Здравствуйте, so5team, Вы писали:


S>Тем более, что внутри вложенного while в секции else вроде как continue и не к чему... Говнокодом попахивает.


Нет, приятель, это борьба с оптимизирующими компиляторами. Он там, в том месте, запросто может завершить цикл когда это не нужно. Вы просто не знаете что скрывается за той функцией, стоящей во главе while.

S>Напрашивается вынесение внутреннего while в отдельную функцию или в локальную лямбду.


Лямбда будет выглядет также, только более уродливо и громоздко. А отдельная функция в том случае-тот самый реальный потенциальный источник багов, так как там транзакция к стораджу, и раскидывать логику по разным функиям-это гораздо более опасно, чем две неинициализированные локальные переменные. Короче, Вы цепляетесь к ничего не значящим мелочам, но допускаете ошибки значительно более серьёзные.
Re[20]: Собеседования в Яндекс++
От: smeeld  
Дата: 04.06.19 19:10
Оценка: :)
Здравствуйте, a7d3, Вы писали:

A>Не стоит такое присылать тем работодателям, что запросят семплы кода.


Спасибо за совет, но категория работодателей, которым такой style не понравится, мне не интересны,
Re[28]: Собеседования в Яндекс++
От: so5team https://stiffstream.com
Дата: 04.06.19 19:24
Оценка: +2
Здравствуйте, smeeld, Вы писали:

S>>Тем более, что внутри вложенного while в секции else вроде как continue и не к чему... Говнокодом попахивает.


S>Нет, приятель, это борьба с оптимизирующими компиляторами. Он там, в том месте, запросто может завершить цикл когда это не нужно. Вы просто не знаете что скрывается за той функцией, стоящей во главе while.


Вы пытаетесь сказать, что между вот этим:
while(journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0){
   if(node_descp->get_current_storage_chunk() >= get_journal_storage_chunk_count()){
       break;
   }
   else {
      node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
      node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
      continue;
   }
}

и вот этим:
while(journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0){
   if(node_descp->get_current_storage_chunk() >= get_journal_storage_chunk_count()){
       break;
   }
   else {
      node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
      node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
   }
}

будет принципиальная разница?

Доказать можете?

S>>Напрашивается вынесение внутреннего while в отдельную функцию или в локальную лямбду.


S>Лямбда будет выглядет также, только более уродливо и громоздко.


Попробуйте сперва.

S>А отдельная функция в том случае-тот самый реальный потенциальный источник багов, так как там транзакция к стораджу, и раскидывать логику по разным функиям-это гораздо более опасно, чем две неинициализированные локальные переменные.


Бла-бла-бла. Написали говнокод а теперь пытаетесь умными словами прикрыться.

Ваш фрагмент можно написать сильно понятнее и, вероятно, даже компактнее. Но вы слишком уверены в том, что умеете код писать, поэтому не можете посмотреть на собственное творение непредвзято.

Кстати, понять, почему вот это имеет смысл:
node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());

тоже очень не просто.
Re[21]: Собеседования в Яндекс++
От: a7d3  
Дата: 04.06.19 19:24
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, a7d3, Вы писали:


A>>Не стоит такое присылать тем работодателям, что запросят семплы кода.


S>Спасибо за совет, но категория работодателей, которым такой style не понравится, мне не интересны,


Это ни разу не совет, а просто мысли в слух, констатация.

Что из литературы доводилось читать по принципам и подходам к организации кода?
Например, есть Steve McConnell “Code Complete”, Robert Martin “Clean Code”.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.