LINUX.ORG.RU

Embedded C: вопросы на собеседованиях

 , ,


4

5

Я знаю, на лоре много сишников и ембедщиков. А проводящих собеседования на работу еще больше.

Так вот, уважаемые отбиральщики мужей у жен специалистов на должность embedded C developer, что вы обычно на собесах спрашиваете?

Особенно интересны вопросы по Сишке с намеком на завалить кандидата — неочевидные или на хорошее знание стандарта.

Знаю, в гугле такого много, но хочется от живых людей примеры, а не от индусов, пиарящих себя и свой сайт.



Последнее исправление: untitl3d (всего исправлений: 3)

Ответ на: комментарий от Legioner

Я ещё раз повторюсь, что ничего не мешает внедрять подмножество С++, соответствующее навыкам команды. Но вот то подмножество С++, которое называется С, оно слишком убогое.

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

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

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

Enthusiast ★★
()
Последнее исправление: Enthusiast (всего исправлений: 1)
Ответ на: комментарий от Legioner

Любой программист учится всю жизнь. Если человек считает, что можно что-то изучить и расслабиться, значит он не программист.

Я с этим согласен. Только я бы расширил с программиста до человека в принципе. Но:

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

Немного гиперболизированная иллюстрация с микрокотроллерами: допустим я, будучи студентом, потратил пару лет на изучение микроконтроллера (атмега8, например) переферии, тулчейна, программаторов – всего. На изучение мне потребовалось пара лет. Я разобрался и начал применять. Микроконтроллер не топовый, но, простой, понятный, дешевый, под все есть свободные тулчейн, куча литературы и опыта у старших коллег. 99 процентов задач покрывает. НО: за время, пока я со всем этим разбирался вышел еще один микроконроллер, чуть мощнее, чуть дешевле, – следуя твоей логике, нужно бросать разработку под предыдущий и начинать осваивать этот – пара лет. За эти пару лет – вышло еещ два. ДУмаю мысль понятна.

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

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

pihter ★★★★★
()
Ответ на: комментарий от Legioner

Но вот то подмножество С++, которое называется С, оно слишком убогое.

Это мнение. А мое мнение, что плюсы – переусложнены, и слишом раздуты, чтоб их можно было нормально прокурить. И это тоже только мнение. Твое мнение и мое мнение. Спор о вкусах

pihter ★★★★★
()
Ответ на: комментарий от Legioner

Отказываться от циркулярной пилы потому, что где-то там кто-то отпилил себе пальцы и делать мебель ручной пилой это не нормально

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

pihter ★★★★★
()
Ответ на: комментарий от Legioner

программирование пока до такого не докатилось, тут важен исключительно результат, а не японские ножовки.

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

pihter ★★★★★
()
Ответ на: комментарий от Legioner

Имхо те, кто предпочитает С, профнепригодны как программисты. С это подмножество С++. Отказываться от С++ это значит отказываться от дополнительных возможностей. В этом смысла ровно ноль. Кроме боязни сложного.

На крестах можно комфортно писать до поры, до времени. Потом сложность сопровождения начинает расти экспоненциально. На Си с ростом проекта всё ровней.

Это если околосистемное. Всё другое остальное имеет смысл на более вменяемых языках писать.

mv ★★★★★
()
Ответ на: комментарий от Oberstserj

Не удержался.

Ты ещё здесь, оборванец? Залез в свою убитую съемную хату на окраине Мюниха (или где ты там) и возомнил себя пупом земли? Бгг. Взоржал. БОльшую часть твоего бреда комментировать не буду, но ты там что-то позволил себе вякать про моих новобранцев? Не переживай, у них всё хорошо и их жизнь удалась. Я думаю что любой из них тебя проглотит, облизнётся, и пойдёт дальше не заметив. И никто их на амбразуру не кидал и не кидает - за своих людей перед начальством отвечаю только я. Если твой manager / team lead ублюдок - зачем ты на других проецируешь? Фрейд? Иди лечись. И познавай как устроен этот мир - тебе ещё много открытий чудных предстоит.

ПыСы. Потрут ведь, а жаль.

ПыПыСы. Заранее извиняюсь перед админами - с волками по волчьи, со свиньями по … Пришлось «опуститься на уровень».

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от Kogrom

А зачем такие плюсы нужны? Если уж брать, то полноценные.

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

И в плюсах есть RAII, что позволяет гарантировать отсутствие целого класса ошибок, особенно при выходах через break/return.

А в остальном можно писать как на Си.

monk ★★★★★
()
Ответ на: комментарий от monk

Если в коде на си начинаем часто использовать malloc, то да, надо подумать о переходе на C++. Здесь RAII будет актуально. Макропрограммироввние тоже больше нужно там, где активно используют данные. Но для микроконтроллеров это редко было актуально, так как ОЗУ было мало. Сейчас ситуация меняется.

Kogrom
()
Ответ на: комментарий от Harald

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

Morin ★★★★
()
Ответ на: комментарий от Harald

два года на изучение одной модели контроллера как-то многовато

а на изучение одного стандарта плюсов? Мысль-то была в том, что они выпускают быстрее, чем ты успеешь изучить

pihter ★★★★★
()
Ответ на: комментарий от Kogrom

Здесь RAII будет актуально.

Память не единственный ресурс. Блокировки, файлы, порты, … Даже банально индикатор после функции вернуть в исходное состояние.

Макропрограммироввние тоже больше нужно там, где активно используют данные.

Тут согласен. Хотя заголовочные библиотеки дополнительного ОЗУ не требуют, а пользу приносят.

monk ★★★★★
()

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

EugeneBas ★★
()
Последнее исправление: EugeneBas (всего исправлений: 1)
Ответ на: комментарий от Harald

Пример про микроконтроллеры был немного гиперболизированный (о чем Яне поленился сообщить когда его привёл) и служил для иллюстрации мысли, а все чего-то придрались к примеру, пропустив мысль

Ирл, я атмегу уже лет десять юзаю и мне до сих пор есть что там поизучать, уменя же это не работа

pihter ★★★★★
()
Ответ на: комментарий от bugfixer

Мне-то как раз ехать, посмотрел бы о чем разговор)

pihter ★★★★★
()
Ответ на: комментарий от untitl3d

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

Для подготовки смотреть - https://interrupt.memfault.com/blog/zero-to-main-1 (и сопутствующте статьи)

anonymous
()

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

alysnix ★★★
()
Ответ на: комментарий от EugeneBas

такие вопросы будут строиться на примерах говнокода

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

untitl3d
() автор топика
Ответ на: комментарий от alysnix

Это я просто так написал, типа сложные вопросы, на которых большинство заваливается.

untitl3d
() автор топика
Ответ на: комментарий от Legioner

Но вот то подмножество С++, которое называется С, оно слишком убогое.

Вот, кстати, хороший вопрос для отсеивания таких «легионеров»:

Является ли С подмножеством C++?

anonymous
()
Ответ на: комментарий от untitl3d

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

EugeneBas ★★
()
Ответ на: комментарий от Legioner

Имхо те, кто предпочитает С, профнепригодны как программисты. С это подмножество С++.

Legioner ★★★★★

ЛОР, такой ЛОР…

Oberstserj ★★
()
Ответ на: комментарий от pihter

оказывается у этой проблемы даже название есть!

Ага, аналогично. Детство и юношество по нехватке информации изобретали велосипед. А тем временем решения проблем уже до твоего рождения придумали :))

Oberstserj ★★
()
Ответ на: комментарий от pihter

Есть мнение, что решая те проблемы в си, которые надо было решить, плюсы создали еще больше проблем и самая главная, имхо, – инфляция знаний

Неистово удваиваю.

Oberstserj ★★
()
Ответ на: комментарий от Legioner

Если человек считает, что можно что-то изучить и расслабиться, значит он не программист

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

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

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

Oberstserj ★★
()
Ответ на: комментарий от Enthusiast

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

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

Подтверждаю на своем опыте найма людей. ППКС.

Oberstserj ★★
()
Ответ на: комментарий от pihter

А мое мнение, что плюсы – переусложнены, и слишом раздуты, чтоб их можно было нормально прокурить. И это тоже только мнение. Твое мнение и мое мнение. Спор о вкусах

Чем больше я смотрю на современный паскаль, тем больше недоумеваю, зачем жрать кактус++

Oberstserj ★★
()
Ответ на: комментарий от Harald

два года на изучение одной модели контроллера как-то многовато

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

Одно дело играться с абдуринкой, другое - разрабатывать серьезное устройство с поддержкой, гарантией и т.д.

Oberstserj ★★
()
Ответ на: комментарий от bugfixer

Все-таки тебя порвало!

Чистейшая победа за мной :))))

Oberstserj ★★
()

можно спросить про битовые поля. Можно ли применять их для аппаратных регистров (нет, ибо порядок их следования в байте не определен. Так что маски – выбор продвинутой молодежи).

Про то, когда нужен volatile, а когда – барьеры по памяти. До кучи – почему требуются специальные инструкции типа compare and swap для организации мьютексов, и как с помощью такой инструкции замутить этот самый мьютекс.

demidrol ★★★★★
()
Ответ на: комментарий от anonymous

Вот, кстати, хороший вопрос для отсеивания таких «легионеров»:

Кстати да.

Лоровские сишники не любят когда говорят, что С является подмножеством С++

И надпись C/C++ не любят.

Но комитеты С и С++ раз в месяц проводят встречи:

C and C++ Compatibility Study Group

Сентябрь: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2814.pdf

Август: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2795.pdf

Июль: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2789.pdf

и т.д.

и в комитете С не стесняются писать C/C++.

Можете поиском по странице проверить:

http://www.open-std.org/jtc1/sc22/wg14/www/wg14_document_log.htm

Как же так?

fsb4000 ★★★★★
()
Ответ на: комментарий от monk

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

Kogrom
()
Ответ на: комментарий от Kogrom

На голом железе тоже можно, хотя я и мои коллеги (лиды и РП) из отрасли считаем, что для имбедов C++ - перебор, ибо дает разработчикам слишком много возможностей писать элегантные, но совершено неподдерживаемые программы.

shkolnick-kun ★★★★★
()
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Ответ на: комментарий от Legioner

Будь ласка, попробуй скомпилировать вот это:

/* main.cpp */

#include <stdio.h>

void * a;
int *b = a;

int main(void)
{
    printf("%d\n", b);
}

и запости сюда выхлоп g++

shkolnick-kun ★★★★★
()

хорошее знание стандарта

Стандарт в эмбеддеде зависит от производителя. Например, у Keil очень своеобразный С и компилятор, которые только внешне похожи на ANSI-реализации. Поэтому твой первый вопрос собеседователю: «О каких именно микроконтроллерах идет речь?»

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от fsb4000

В приведенных тобой примерах нет опровержения или подтверждения. Там вообще ничего нет. А суть проста: С стал основой для крестов. Так что утверждение про подмножество как минимум некорректно.

Oberstserj ★★
()
Ответ на: комментарий от Legioner

Пиши сразу void *new; int *class = new; Я же говорю, буквоедство. Ещё про _Generic расскажи.

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


-------------- Build: Debug in lol (compiler: GNU GCC Compiler)---------------

g++ -Wall -fexceptions -g  -c /home/anon/Desktop/lol/main.cpp -o obj/Debug/main.o
g++  -o bin/Debug/lol obj/Debug/main.o   
/home/anon/Desktop/lol/main.cpp:4:10: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
    4 | int *b = a;
      |          ^
      |          |
      |          void*
/home/anon/Desktop/lol/main.cpp: In function 'int main()':
/home/anon/Desktop/lol/main.cpp:8:14: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int*' [-Wformat=]
    8 |     printf("%d\n", b);
      |             ~^     ~
      |              |     |
      |              int   int*
      |             %n
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 1 warning(s) (0 minute(s), 0 second(s))
 

shkolnick-kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.