Pull to refresh
-27
Александр Ковалёв @Koval97read⁠-⁠only

Программист С++ низкого уровня

Send message

Но о чем говорить если в ООП знаний нет.

А то что знания могут приобретатся в процессе, вам никто не говорил?

Тогда и менеджмент идёт не по классическому принципу "отдал поручение и забыл", а там надейся что всё протестируют, что всю архитектуру поймут, что документацию кому-то придёт в голову написать.

А тут человека пригласили, объяснили мол "хотим ускорить загрузку страниц, а у тебя выходит много лишних скриптов (ещё видимо, подгружаемых не из кэша, и даже не основного под-сервера, а с разных серверов). Поэтому предлагаю перейти на полноценные компоненты..." и начинаете рисовать и рассказывать. А ваш сотрудник просто записывает. По ходу обсуждения сразу задаёт вопросы, и записывает ответы. Тут много пространства для манёвра, главное чтобы человек понял - зачем всё это? И здесь вы объяснили "такой-то компоненты мы используем для этого, потому что ... и далее по пунктам..", "такое-то решение выбрали из-за... и далее расписывайте". Главное, чтобы "не с фонаря взяли" или "левая пятка повела", а человечески нормально объяснить. Тогда и вас поймут, и вы дураком выглядеть не будете.

Оно же всё из таких мелочей складывается. Это я ещё как "менеджер менеджеру" объясняю, а разработчики и линейные сотрудники думают по другому. Они сразу ищут любой вариант помягче покинуть компанию с "директором-самодуром", и делают это при первой же возможности. Можете сразу возражать что "к счастью, далеко не все", "а у них другой выбор есть" (поверьте есть и гораздо больше, чем пишут в соц. сетях), "я же извиняюсь" (что-то не видно извинений, самодурство только вижу, к счастью, хоть не безапелляционное), "знаний же нету" (а откуда вам знать какие знания есть, а каких нет? Или вы это только с фонаря берёте для красивого словца? Вот и сотруднику возразят вам так же, особенно первый же руководитель подразделения, который и клиентов уведёт, и половину отдела в придачу - ему-то генератор хронофагов зачем?), и далее предвкушая возражение "на мне же всё держится", ваши же слова - уйдёте вы, заболеете или что-то с вами случится, то всё, конец вашей компании? И всему что вы создавали конец из-за одной лишь озабоченности "иллюзией контроля"? Будь у меня одноименная книга, то уже скинул бы ссылку.

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

Хороший специалист может "вьехать" в новый фрейворк за неделю,

А совсем зелёный за три недели. Либо с опытом приходит и понимание, где заканчиваются сферические метания "менеджеров", которые ни одного дня с настоящими людьми не проработали, и начинается разработка собственно продукта: от альфа-прототипа до релизной сборки, которую не стыдно людям продавать.

Собственно все что вы описали и есть опыт. Только это ваш опыт, а не его. Вы же вместо того, чтобы объяснить "для чего" решили сразу "сделай мне так и так". Вот человек вас и не понял, и вы ему не дали времени разобраться. Можно было хотя бы базовую схему нарисовать, чтобы у человека было на виду с чем он работает - все таки его первый опыт, вот он и действует осмотрительно.

Стратегические цели - у нас важнее хлеба насущного, коллега.

По собственному опыту знаю, что "опыт работы" можно спокойно написать любой. А к нему уже в резюме просто прикруть парочку программ "для примера" и если работодатель адекватный, то спокойно пообщаетесь и без особых залупаний возьмёт. Встречаются, конечно, дебилы, но им и нормальный отказ лень написать.

У меня месяц назад оффер был программировать системы управления под испытательные стенды для железнодорожников. Та еще интересная работёнка, но директор у них попался на редкость чудак с буквы М: единственный программист, кому самое то быть Team Lead-ом, нанять хотел пару коллег, все отмазывался "я ничего не решаю". В итоге за две недели собеседований завалили 7 кандидатов, при чем не дураков, и заставил бедного программиста выкручиваться "мол не прошли". Вот вроде не дураки, и люди как менеджеры умеют продать вакансию, и предприятие не абы как работает, но даже в такой бочке мёда нашлась мерзкая ложка дёгтя.

3 года и ни одного собеса? Я бы еще понял, что 3 месяца, 5 собесов, 1 оффер - и это без проектов в репозитории. Про резюме полнее оформил и отклики по 3 -4 по вечерам пишу. Это как вы о себе расписываете тогда?

Работодатели - боятся отвечать.

Золотые слова. Справедливости ради таких 30%, остальные пооверяют на "что не звездишь" или на "покажи что умеешь" и присылают простое тестовое, где даже первокурсник легко справится.

В регионах люди более сговорчивы, а если работодатель сам звездит, то негативный отзыв с одной звездой или жалоба быстрее переубедит. А жалобав гос. органы, а они только рады такому, ускорит сговорчивость звездунов еще в 3 раза.

И вот линейный/средний менеджер оказался перед выбором - заплатить и потратить 2 разработчиков или заплатить чуть больше, но за опытного... Какой сложный выбор

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

И как итог, менеджер пишет: "У нас нет другого выбора, как поднять зарплату ещё в 1,5 раза", а директору не остается ничего другого как издать соответствующий указ. Ведь момент, когда он мог внести в должностной список порядок документирования и стандарт тестирования, он безнадёжно упустил. И отстранить менеджера, который ему врет в три короба, не всегда может, либо нанял таких работничков, что не из кого повысить, а пригласить из других мест не умеет или ещё не знает откуда.

Золотые слова. Почаще бы встречать таких людей.

Канарейку за копейку все хотят, а платить по рыночной цене могут 20%. Остальные только и могут, что раздувать ожидания выше крыше, а реального содержания едва ли ло колена. Ещё и удивляются, что их чрезмерное раздутое эго никому не интересно, все только и жалуются, что люди используют их как трамплин.

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

Впечатляет. А можно для интереса узнать. Насколько у вас дружелюбная поддержка, если программист кидает вам репорт с комментариями ложноположительных срабатываний? А то к той же статье был комментарий, где у человека терпения не хватило и его первые 30 ложноположительных подряд вывели из себя.

Честно говоря, даже 10 ложноположительных подряд пережить той ещё выдержкой нужно обладать, особенно если проект очень личный.

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

Так и запишем: "Проверить вызов виртуальных функций через неявный указатель this"

Ещё пожелания есть?

P.S. У Шилдта указатель this разобран на страницах 284-285 в Главе 13. Массивы, указатели, ссылки и операторы динамического распределения памяти. И то что, внутри класса, он ссылается на него же в том числе. Просто он писал об этом в контексте, что сокращенная форма используется чаще, либо просто удобней, и пару нюансов об дружественных объектах указал.

А что он ожидал вызывая виртуальную функцию в своём же классе? Хочет вызвать функцию предка? Так оно делается через приведение типа к классу предку, и вызывай себе наздоровье.

Абстракции классов в виде private, public, protected, published не для красоты придумали.

Сомнительна даже сфера практического применения. Вот объясните для начала, где такое можно увидеть в реальных программах. Потому что сферических коней в вакууме я не обсуждаю.

Очередная copy paste ради copy paste. Я хоть заморочился, из справочника наглядный пример переписал, а вы хуже глупого студента.

Жаль, что сейчас не могу (с телефона сижу, стационарник сейчас не работает), специально для этого наглого гражданина напишу первую часть статьи, где все ваши мифы разрушу раз и навсегда. Заслужили, так заслужили.

По поводу false possitve сам бы лучше не написал. Абсолютно согласен, что ругаться на каждое такое присвоение - тот еще идиотизм. Выделяйте тогда warning-и по степени критичности, если ваш статистический анализатор умеет в семантический анализ.

Опасна не сама конвертация. Опасна аномальность этого действия.

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

Я уже писал, что битовые поля на такой случай есть, ими драйверы конфигурируют уже 20 лет и работает всё без заморочек.

А вы мне тут про маски, тонкости велосипедов по запиливаю того, что уже 20 лет существует в куда более удобном виде.

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

Спасает ваше положение только то, что комментарии стали дискуссией. И вместо того, чтобы минусовать сначала бы подумали ради чего я это всё пишу.

Далее. Про виртуальные функции вообще вашего юмора не понял.

Для начала следующий абзац с той же страницы 368:

"При обычном вызове виртуальные функции ничем не отличаются от остальных функций-членов. Особые свойства виртуальных функций проявляются при их вызове с помощью указателей. Как сказано в главе 13, указатели на объекты базового класса можно использовать для ссылки на объект произодных классов. Если указатель на объект базового класс устанавливается на объект производного класса, содержащий виртуальную функцию, выбор требуемой функции основывается на типе объекта, на который ссылается указатель, причем этот выбор осуществляется в ходе выполнения программы. Таким образом, если указатель ссылается на объекты разных типов, то будут вызваны разные виртуальные функции. Это относится и к ссылка на объекты базового класса. "

(И специально для вас я перепишу прекрасный наглядный пример, как это работает)

#include <iostream>
using namespace std;

class base {
  public:
    virtual void vfunc() {
      cout << "Функция vfunc() из класса base.\n";
    }
};

class derived1 : public base {
public:
  void vfunc() {
    cout << "Функция vfunc() из класса derived1.\n";
  }
};

class derived2 : public base {
public: 
  void vfunc() {
    cout << "Функция vfunc() из класса derived2.\n";
  }
};

int main()
{
  base *p, b;
  derived1 d1;
  derived2 d2;
  
  //Указатель на объект базового класса
  p = &b;
  p->vfunc(); //Вызов функции vfunc() из класса base.
  
  //Указатель на объект класса derived1
  p = &d1;
  p->vfunc(); //Вызов функции vfunc() из класса derived1
  
  //Указатель на объект класса derived2
  p = &d2;
  p->vfunc(); //Вызов функции vfunc() из класса derived2
  
  return 0;
}

Автор подчеркивает, что ключевое слово virtual используется только один раз. Далее в книге разъясняется, что оно наследуется.

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

Подразумевая, что вы оба, как неприлежные студенты, не разбираетесь в вопросе когда вызываются конструктор и диструктор класса. И в добавок совершенно упустили тему "В каком порядке определяются объекты родительских классов при определение предка, и в каком порядке они уничтожаются".

Возьмите оба луковицы и хорошенько подумайте над этим. Пересдача через две недели по расписанию у деканата кафедры. Всего хорошего.

Мне совершенно не нравится тактовка "потенциально опасны". В чем же опасны, если конвертация идет только в 0 или 1?

В вашей же строке:

BT_PROXIMITY_LINKLOSS_ALERT | BT_PROXIMITY_IMMEDIATE_ALERT;

В bool записывают побитовое ИЛИ. Окей, допустим это ошибка и хотели логическое ИЛИ - известный прием записи в булевые переменные результатов условий. Тогда если подразумевалось, что перечесление выше - это коды ошибок, то программист забыл нулевое значение, 0x0 - код успешного выполнения программы. И сравнивать следовало бы именно с ним.

В данном же случае переменная services_supported в структуре reporter_s всегда будет true. Компилятор посчитает, что в логике 00000001 и 00000010. Результат операции 00000011, то есть != 0, иначе говоря true. Запишет компилятор 11111111 или 10000000 или 00000001 значения не имеет. Либо логические условия if (bool) {...la-la-la...} исполнят содержимое блока только когда значение true, то есть любое ненулевое, в противном случае else {...}, если он вообще есть.

В чем здесь опасность вопрос открытый? И каким лесом здесь вообще целочисленное переполнение, если тут вообще не про числа речь?! Вы хоть сами матчасть от подделок форумных аналитиков отличайте, а то реально за державу уже обидно.

В первом кейсе ложноположительное срабатывание и у автора вопроса, и у автора статьи.

1) С стародавних времён любое ненулевое значение принималось за истину, и только нулевое - ложь. Это основы основ и об этом нельзя забывать.

2) Открываем справочник Герберта Шилдта "С++: полное руководство", страница 367:

"Виртуальные функции и полиформизм"

"Виртуальная функция (virtual function) - это функция-член, обявляемая в базовом классе и переопределяемая в производном. Чтобы создать виртуальную функцию, следует указать ключевое слово virtual перед её объявлением в базовом классе. Производный класс переопределяет эту функцию, приспосабливая ее для своих нужд. По существу, виртуальная функция реализует принцип "один интерфейс, несколько методов", лежащий в основе полиформизма. Виртуальная функция в базовом классе определяет вид интерфейса, т.е. способ вызова этой функции. Каждое переопределение виртуальной функции в производном классе реализует операции, присущие лишь данному классу. Иначе говоря, переопределение виртуальной функции создает конкретный метод (specific method)."

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

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

Information

Rating
Does not participate
Location
Омск, Омская обл., Россия
Date of birth
Registered
Activity