"В итоге, выбирая между ними, стоит помнить: научить коммуникатора писать код чуть лучше — сложно, но реально. Научить «токсичного гения» не быть засранцем — задача, с которой не справляются даже лучшие психотерапевты, не то что тимлиды. "
Странное заключение.
Если коммуникатора научат писать код чуть лучше, это не повлияет на общую картину примерно никак. Скорее наоборот, надо давать коммуникатору возможность применять свой главный скилл на большем масштабе.
Утверждение про лучших психотерапевтов ничем не обоснованно и кажется, тут просто желание автора видеть "токсичного гения" уволенным в любом случае, сколько бы пользы его технические скилы не приносили компании. Хочется спросить, нет ли тут личной обиды.
>> модуль шифрования/обращения по сети/любая другая либа > Библиотека сама по себе является МВУ
То есть, у вас получается, что либа для общения по сети -- это модуль высокого уровня. У вас проблема с терминологией здесь -- почти все программисты скажут, что либа для общения по сети -- это низкоуровневая либа.
А зачем в статье вообще нужны понятия "верхний уровень" и "нижний уровень"?
Есть модуль1 и модуль2. Модуль1 хочет в рантайме вызывать код из модуля2. Есть два варианта: 1) Модуль1 это может делать напрямую, поинклудив модуль2, и создав конкретный объект описанного в модуле2 класса (или даже получив его в конструкторе). 2) Модуль1 может определить интерфейс, который описывает, что ему нужно от внешнего мира, и в конструкторе получать этот интерфейс, а модуль2 теперь должен инклудить модуль1 ради декларации интерфейса, чтобы его реализовать.
Вот и вся инверсия.
Тут понятия "верхний уровень" и "нижний уровень" эквивалентны просто тому, кто выше в стеке вызовов функций.
Мне думается, когда люди используют эти понятия, имеют в виду какую-то семантику, типа модуль нижнего уровня -- ввод-вывод, модуль верхнего уровня -- какая-то бизнес-логика, например, и это никак не связано с тем, кто кого вызывает.
Делается, и Пентагоном в том числе. Вот в этой статье Рейтерс, несмотря на название, есть про операции Пентагона в целом, не только про конкретных тролей-антиваксеров, дискредитировавших китайскую вакцину от ковида среди мусульман (типа не халяльная).
— Однако, мистер Дент, маршрут был выставлен для всеобщего ознакомления в местном бюро планирования и висел там девять месяцев. — Ага, как только я узнал, то сразу же помчался прямо в бюро. Это было вчера в полдень. Вы ведь не особенно утруждали себя предупреждениями? Я имею в виду: никому ни слова, ни одной душе, правда? — Но маршрут был обнародован для… — Обнародован? В конце концов мне пришлось спуститься в подвал, чтобы отыскать его! — Верно, там у нас находится отдел информации. — С фонариком! — Наверное, света не было. — И ступенек тоже! — Но послушайте, вы ведь нашли план! — Да, — сказал Артур, — нашел. На дне запертого шкафа в заколоченном туалете. А на двери табличка висела: «Осторожно, леопард!»
"...оставлю еще несколько интересных примеров, которые показывают, что модель действительно способна проводить рассуждения, похожие на человеческие. "
Ну вот возьмите вопрос про пчёл. Модель симулирует рассуждения, нигде даже близко не подходит, а потом опа и из воздуха берёт пчеловода.
"Пробуем другие подходы
Я начинаю размышлять о том, что объекты могут быть лошадьми, но это кажется маловероятным. Возможно, Джон Чаппелл - пчеловод, обматывающий ульи черными лентами и сообщающий пчелам об уходе старого хозяина и приходе нового."
Оригинальный заголовок статьи (I Have No Constructor, and I Must Initialize) отсылает к названию рассказа Харлана Эллисона "I Have No Mouth, and I Must Scream", и перевести его стоило бы не в таком стиле, как у вас.
Представьте, если бы название рассказа переводили бы как "Рта у меня нет, а кричать надо" (название совпадает с завершающими словами рассказа, где сверхразумный военный ИИ уничтожил человечество и пытает последнего человека).
Клиентский код не всегда может вызывать конструкторы -- например, мы можем хотеть иметь возможность подменять тип создаваемого объекта или клиентский код может не иметь значений параметров. В данном же случае фабрике из клиента передаётся и тип, и параметры. Точнее, ID типа, но он взаимно однозначно соответствует типу.
Для выноса бойлерплейта достаточно шаблонной функции в три строчки, а в случае передачи этой фабрики извне я опять же не понимаю зачем.
Возникает следующий вопрос: а как мы можем абстрагировать, отделить способ создания от самого объекта?
У меня возникает другой вопрос: зачем? В какой ситуации код
using VF = VariantFactory<Point, Line, Rect>; using ShapeType = VF::ResultType; ShapeType shape; VF{}( &shape, kUniqueId<line>, 1, 1, 4, 5); будет лучше, чем две строки ниже?
Смотреть надо не на километры, а на delta-V (она же характеристическая скорость орбитального манёвра). Нужно примерно 4 км/c дельта-вэ , чтобы перейти от орбиты 450 км на геостационарную. Это меньше половины дельта-вэ, нужной, чтобы добраться до орбиты 450 км.
"каждый проект, с которым я имел дело на C++, ощущался как монотонная рутина"
Значит, автор решал в своих проектах скучные задачи. Когда задача скучная, начинаешь играть с языком, чтобы хоть как-то веселее писать было. Для интересной задачи лучше, когда выражение идей в коде -- тривиальный процесс, а не квест.
"В итоге, выбирая между ними, стоит помнить: научить коммуникатора писать код чуть лучше — сложно, но реально. Научить «токсичного гения» не быть засранцем — задача, с которой не справляются даже лучшие психотерапевты, не то что тимлиды. "
Странное заключение.
Если коммуникатора научат писать код чуть лучше, это не повлияет на общую картину примерно никак. Скорее наоборот, надо давать коммуникатору возможность применять свой главный скилл на большем масштабе.
Утверждение про лучших психотерапевтов ничем не обоснованно и кажется, тут просто желание автора видеть "токсичного гения" уволенным в любом случае, сколько бы пользы его технические скилы не приносили компании. Хочется спросить, нет ли тут личной обиды.
Странно, что нет вариантов медицинские журналы, pubmed, cochrane.
>> модуль шифрования/обращения по сети/любая другая либа
> Библиотека сама по себе является
МВУТо есть, у вас получается, что либа для общения по сети -- это модуль высокого уровня. У вас проблема с терминологией здесь -- почти все программисты скажут, что либа для общения по сети -- это низкоуровневая либа.
Зависимость-то всё равно остаётся, только её компилятор не проверяет.
А зачем в статье вообще нужны понятия "верхний уровень" и "нижний уровень"?
Есть модуль1 и модуль2. Модуль1 хочет в рантайме вызывать код из модуля2. Есть два варианта:
1) Модуль1 это может делать напрямую, поинклудив модуль2, и создав конкретный объект описанного в модуле2 класса (или даже получив его в конструкторе).
2) Модуль1 может определить интерфейс, который описывает, что ему нужно от внешнего мира, и в конструкторе получать этот интерфейс, а модуль2 теперь должен инклудить модуль1 ради декларации интерфейса, чтобы его реализовать.
Вот и вся инверсия.
Тут понятия "верхний уровень" и "нижний уровень" эквивалентны просто тому, кто выше в стеке вызовов функций.
Мне думается, когда люди используют эти понятия, имеют в виду какую-то семантику, типа модуль нижнего уровня -- ввод-вывод, модуль верхнего уровня -- какая-то бизнес-логика, например, и это никак не связано с тем, кто кого вызывает.
Делается, и Пентагоном в том числе. Вот в этой статье Рейтерс, несмотря на название, есть про операции Пентагона в целом, не только про конкретных тролей-антиваксеров, дискредитировавших китайскую вакцину от ковида среди мусульман (типа не халяльная).
Пристыковываем к нему новый корневой блок. Дальше перестыковываем к новому остальные модули. Выкидываем старый корневой.
— Однако, мистер Дент, маршрут был выставлен для всеобщего ознакомления в местном бюро планирования и висел там девять месяцев.
— Ага, как только я узнал, то сразу же помчался прямо в бюро. Это было вчера в полдень. Вы ведь не особенно утруждали себя предупреждениями? Я имею в виду: никому ни слова, ни одной душе, правда?
— Но маршрут был обнародован для…
— Обнародован? В конце концов мне пришлось спуститься в подвал, чтобы отыскать его!
— Верно, там у нас находится отдел информации.
— С фонариком!
— Наверное, света не было.
— И ступенек тоже!
— Но послушайте, вы ведь нашли план!
— Да, — сказал Артур, — нашел. На дне запертого шкафа в заколоченном туалете. А на двери табличка висела: «Осторожно, леопард!»
"...оставлю еще несколько интересных примеров, которые показывают, что модель действительно способна проводить рассуждения, похожие на человеческие. "
Ну вот возьмите вопрос про пчёл. Модель симулирует рассуждения, нигде даже близко не подходит, а потом опа и из воздуха берёт пчеловода.
"Пробуем другие подходы
Я начинаю размышлять о том, что объекты могут быть лошадьми, но это кажется маловероятным. Возможно, Джон Чаппелл - пчеловод, обматывающий ульи черными лентами и сообщающий пчелам об уходе старого хозяина и приходе нового."
I Have No Mouth, and I Must Scream будет?
Ну и классическое: https://en.wikipedia.org/wiki/Instrumental_convergence#Paperclip_maximizer
Если не читали Бострома -- прочитайте.
Свои желания есть у людей, у которых есть деньги на обучение ИИ.
Которые, вероятно, попали в обучающую выборку. Но всё равно впечатляет, что o1 смогла "вспомнить" намного больше ответов, чем 4o.
Оригинальный заголовок статьи (I Have No Constructor, and I Must Initialize) отсылает к названию рассказа Харлана Эллисона "I Have No Mouth, and I Must Scream", и перевести его стоило бы не в таком стиле, как у вас.
Представьте, если бы название рассказа переводили бы как "Рта у меня нет, а кричать надо" (название совпадает с завершающими словами рассказа, где сверхразумный военный ИИ уничтожил человечество и пытает последнего человека).
https://ru.wikipedia.org/wiki/У_меня_нет_рта,_но_я_должен_кричать
Клиентский код не всегда может вызывать конструкторы -- например, мы можем хотеть иметь возможность подменять тип создаваемого объекта или клиентский код может не иметь значений параметров. В данном же случае фабрике из клиента передаётся и тип, и параметры. Точнее, ID типа, но он взаимно однозначно соответствует типу.
Для выноса бойлерплейта достаточно шаблонной функции в три строчки, а в случае передачи этой фабрики извне я опять же не понимаю зачем.
У меня возникает другой вопрос: зачем? В какой ситуации код
using VF = VariantFactory<Point, Line, Rect>;using ShapeType = VF::ResultType;
ShapeType shape;
VF{}( &shape, kUniqueId<line>, 1, 1, 4, 5);
будет лучше, чем две строки ниже?
using ShapeType = std::variant<Point, Line, Rect>;ShapeType shape{std::in_place_type_t<Line>, 1, 1, 4, 5};
Кроме дельта-вэ важна ещё и плоскость орбиты, кстати.
Смотреть надо не на километры, а на delta-V (она же характеристическая скорость орбитального манёвра). Нужно примерно 4 км/c дельта-вэ , чтобы перейти от орбиты 450 км на геостационарную. Это меньше половины дельта-вэ, нужной, чтобы добраться до орбиты 450 км.
Я думаю, любой документированный набор инструкций проца проще плюсов.
"каждый проект, с которым я имел дело на C++, ощущался как монотонная рутина"
Значит, автор решал в своих проектах скучные задачи. Когда задача скучная, начинаешь играть с языком, чтобы хоть как-то веселее писать было. Для интересной задачи лучше, когда выражение идей в коде -- тривиальный процесс, а не квест.