Еще одна жертва тестовых заданий.

Собственно пост на хабре https://habr.com/ru/users/andreykl/posts/ Но так как могут потереть текст привожу ниже

О поиске работы. В целом конечно дело нелёгкое. Но иногда совсем накипает. Вчера был на собеседовании в ООО "Ритм". В целом, сам виноват. Согласился на тестовое задание не узнав всех подробностей. Оказалось у ребят 4 интервью. Я об этом узнал вначале собеседования, расстоиться не успел, было некогда. Глядя назад не знаю, взялся бы я за тестовое зная что 4 интервью? С одной стороны деваться некуда, вопрос о том что нужно уезжать. С другой, ну 4 - это ж не про работу? Так что смысл.. Но на второе интервью меня не пригласили. О чём хочу поведать, пока всё свежо в памяти. 3 интервьюира и собствнено я, кандидат. Речь о С, код тестового задания здесь https://github.com/andreykl/c-gen . Интервьюеры - Никита, Николай, и ещё коллега имя которого я (к своему сожалению, прошу прощения) забыл. По словам Никиты "по коду вы прошли". Т.е. вроде как код ничего. Я на синьора с не претендую, но код вроде норм (специально оставил ситуацию которая была на интервью, для чистоты). В начале интервью речь зашла об устройстве компилятора и фазах. Я сказал что в расте у компилятора разные уровни AST: HIR, MIR, THIR. Интервьюер Никита стал меня поправлять наводящими вопросами. Итогом было что я признал что он меня поймал и это не AST на самом деле. Что технически полностью правда, там довольно сложная структура которая не совсем соотвествует дереву. Конечно, знание таких подробностей весьма похвально. Особенно если бы Никита на ходу не придумал LIR, как уровень. Ну да бог с ним, ошибиться может каждый. Тем более он не претендовал на знание как я понял, так, просто меня поправил. Ну принято. Далее, у нас с Никитой у нас возник такой диалог (это уже по коду по ссылке выше, за точность каждого слова диалога не ручаюсь, но смысл передать постарался близко к оригиналу, на сколько помню). Никита: у вас там комментарий про правило пяти, это что за правило. Я: это правило по которому елси ты переопределяешь один из пяти пунктов (конструктор/оператор копирования, конструктор/опрератор присваивания, деструктор), то скорее всего тебе нужно переопределить все пять. Собственно, что и сделано в классе CodeWriter. Никита: ну а это что? Я: что именно? Никита: переопределение конструктора Я (пытаясь понять какой термин от меня хотят чтобы не попасть в ситуацию как с AST выше): управление ресурсами Никита: нет Я: А что? Никита: RAII Я немного подвисаю, начинаю что то говорить про то что мы получаем в конструкторе ресурсы и собственно поэтому речь идёт о правиле пяти, что эти за этими ресурсами нужно следить, а RAII это как раз способ автоматически следить за ресурсами, перепоручив это компилятору. В этом и смысл переопределения конструкторов/операторов - если переопределяешь один, скорее всего нужно переопределить все. Именно из за того что нужно единообразно управлять ресурсами. В частности, когда мы создаём локальную переменную в функции, нам не нужно использовать new/delete если мы пользуемся идиомой RAII... Одновременно с этим начинаю лихорадочно гуглить что такое RAII потому что подкорка мне как бы намекает что в слове RAII - R - это, собственно,ресурсы. Которые мы собственно менеждим. Никита: ну я бы не сказал что RAII это про new/delete. Я, продолжая что то бубнить: если мы определяем локальную переменную, она определяется на стеке (что уж там я хотел про этот стек казать я не помню), но тут вижу что выдал гугл А он выдал примерно следующее (среди прочего): Manual new/delete is prone to memory leaks... where as RAII ensures the destructor is called during stack unwinding. Т.е. как бы RAII противопоставляется ручному управлению памятью. На что я у Никиты стал спрашивать, вот отчего гугл мне такое говорит. Но Никита сказал это не противоречит его