Перейти к содержимому

Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 193

#121
dzid

dzid
  • Свой человек
  • 939 сообщений

а более сложных вопросов нет? у нас на собеседовании также спрашивают 3 основных принципа ООП. ну кое что из теории баз данных, типа что такое реляция и тп.

А зачем? Мы, бояре - народ ленивый работяссий, нам работать надо, а не лясы точить. Такая уж наша боярская доля...

А если серьезно - практика показала достаточность. Есть внятный ответ - знаний по минимуму хватает, и можно приступать к выяснению, что подопытный умеет еще. Умение кодировать - всего лишь инструмент, обучить которому можно и обезьяну. Если человек знает матан и не совсем забыл теорему Коши - у нас есть вычислительные алгоритмы. Знает, чем отличается dot от cross - 3D графика по нему плачет ждет. Писал в детстве полиморфные вирусы - ну таки система защиты ПО от нелегального использования тоже требует доработки!

А просто "кодер на Ц++" пойдет домой... Нету ему работы - "накодить" в угол все могут...
  • 0

#122
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

а более сложных вопросов нет? у нас на собеседовании также спрашивают 3 основных принципа ООП. ну кое что из теории баз данных, типа что такое реляция и тп.

Вот пример на C# (на других языках тоже можно сделать аналогично). Не сказать, чтобы сложный пример, но многие не могут с ним справиться.
class Program
{
   public static string Foo(string str)
   {
		try
		{
		   return str;
		}
		finally
		{
			str = "Modified in finally!";
		}
	static void Main(string[] args)
	{
			string str = "Original string";
			Console.WriteLine(Foo(str));
			Console.WriteLine(str);
	}
}
Не пользуясь компилятором (на собеседовании его у вас нет) ответьте, будет ли работать такая программа? Если нет, почему? Если да, что будет выведено на экран? Объясните, почему.
  • 0

#123
Big Joe

Big Joe
  • Постоялец
  • 316 сообщений
Я как человек который только недавно начал изучать Шарп, сразу определил результат задачи. Задача очень проста для собеседования Имхо

Сообщение отредактировал Big Joe: 21.12.2009, 21:50:11

  • 0

#124
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Это хорошо, однако надо не только определить результат задачи, но и объяснить его.
  • 0

#125
yedyge

yedyge
  • Свой человек
  • 879 сообщений
какой-то непростой пример.
оно понятно, что будет первый вариант строки, однако...

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

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

в какой доке видно пояснение этому эффекту сдвига адреса локальной переменной?

я бы и в сгенерированном асме поглядел, да асм - это не ansi/iso, так что смысла не было.
  • 0

#126
hes

hes
  • В доску свой
  • 1 567 сообщений

Это хорошо, однако надо не только определить результат задачи, но и объяснить его.

я уже лет пять как с ораклом работаю, не осилю :D я плохой программист ? :-)

Сообщение отредактировал hes: 22.12.2009, 11:27:30

  • 0

#127
Havoc

Havoc
  • Завсегдатай
  • 296 сообщений

Вот пример на C# (на других языках тоже можно сделать аналогично). Не сказать, чтобы сложный пример, но многие не могут с ним справиться.
....


Чего там объяснять, скобка не закрыта.

Вот сортировку пузырьком 1 из 10 отвечает.
  • 0

#128
hes

hes
  • В доску свой
  • 1 567 сообщений

Чего там объяснять, скобка не закрыта.

Вот сортировку пузырьком 1 из 10 отвечает.

в смысле принцип сортировки или алгоритм ?
  • 0

#129
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

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

В смысле, вы хотели сказать, после вызова Foo(str) переменная str в Main все равно продолжает указывать на "Original string"? Вы пока еще не объяснили, почему так.

в доках объяснения я не нашёл.

И не найдете. Там можно только найти, что если исключения в блоке try не возникло, то код в блоке finally будет обязательно выполнен, причем сразу же после выполнения кода в блоке try. С другой стороны, return служит для возврата из функции. По ходу возникают еще вопросы, будет ли выполнен блок finally? Если да, что произойдет со str внутри finally? Или до finally вообще не дойдет, выход из Foo() произойдет на return?
  • 0

#130
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений


надо не только определить результат задачи, но и объяснить его.

я уже лет пять как с ораклом работаю, не осилю :-) я плохой программист ? :-)

Ну нет, так вопрос не ставился. Для кого-то хороший, для кого-то не очень. Все относительно. :bored:
  • 0

#131
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Чего там объяснять, скобка не закрыта.

Спасибо за поправку. Суть примера, конечно, не в единственной пропущенной скобке (да, я разбаловался. Давно уже не вводил код в обычном текстовом редакторе без удобной подсветки синтаксиса). Исправленное условие выглядит так:
class Program
{
   public static string Foo(string str)
   {
		try
		{
		   return str;
		}
		finally
		{
			str = "Modified in finally!";
		}
	}
	static void Main(string[] args)
	{
			string str = "Original string";
		   //Что будет выведено?
			Console.WriteLine(Foo(str));
		   //А здесь?
			Console.WriteLine(str);
	}
}

  • 0

#132
Big Joe

Big Joe
  • Постоялец
  • 316 сообщений
А чем все отвечающие докажут, что не использовали компилятор? Тогда в чем фишка)
  • 0

#133
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Конечно, ничем не докажут, что не пользовались компилятором. Я это предвидел, поэтому основной упор и был сделан не на ответ, какой будет результат, а на объяснение, почему так.

Но вообще, это в ваших же интересах, попробовать свои силы. На собеседовании компилятора не будет.

Кстати, некоторые центры тестирования (например, Brainbench) применяют довольно эффективный способ, чтобы дистанционно удаленный отвечающий не мог пользоваться компилятором. Они выкладывают вопрос и код к нему в формате рисунка jpeg, так что метод Copy-Paste не проходит. А вручную ввести с экрана код в компилятор тоже не получится - время для ответа на каждый вопрос очень ограничено.
  • 0

#134
Havoc

Havoc
  • Завсегдатай
  • 296 сообщений

в смысле принцип сортировки или алгоритм ?


Если быть более точным, то дается задача: дан одномерный массив, необходимо отсортировать его по возрастанию (убыванию). Необходимо ее решить.
Таким образом ни на конкретном алгоритме, ни на языке, ни на представлении алгоритма не заостряется внимание.
  • 0

#135
Havoc

Havoc
  • Завсегдатай
  • 296 сообщений

Конечно, ничем не докажут, что не пользовались компилятором. Я это предвидел, поэтому основной упор и был сделан не на ответ, какой будет результат, а на объяснение, почему так.


Два раза выводится Original string, а объяснить я попробую при помощи программы на С++, которая работает аналогично, но выводит также и адреса в памяти.

char* foo(char* str)
{
	__try
	{
		printf("str in foo %s\n", str);
		printf("str in foo points to %d\n", str);
		printf("str's in foo address %d\n", &str);
		printf("\n");
		return str;
	}
	__finally
	{
		str = "Modified in finally!";
		printf("str in foo-finally %s\n", str);
		printf("str in foo-finally points to %d\n", str);
		printf("str's in foo-finally address %d\n", &str);
		printf("\n");
	}
}

int main()
{
	char* str = "Original string";

	printf("str %s\n", str);
	printf("str points to %d\n", str);
	printf("str's address to %d\n", &str);
	printf("\n");

	char* newstr = foo(str);

	printf("==============Main output=================\n");
	printf("newstr %s\n", newstr);
	printf("str %s\n", str);


	scanf("%s", str);

	return 0;
}


Программа на моей машине выводит следующее:

str Original string
str points to 4282432
str's address to 1245024

str in foo Original string
str in foo points to 4282432
str's in foo address 1244800

str in foo-finally Modified in finally!
str in foo-finally points to 4283208
str's in foo-finally address 1244800

==============Main output=================
newstr Original string
str Original string

Таким образом, тут наглядно видно что и где происходит.
В момент, когда мы инициализируем указатель
char* str = "Original string";
адрес начала данной строки в памяти равен 4282432.
Но само значение "4282432" лежит по адресу 1245024, и ассоциированно с переменной str в методе main.

Что происходит, когда мы передаем str в функцию foo - строка передается по указателю, но сам-то указатель передается по значению, а это означает, что создается новый указатель, и в него записывается значение 4282432, но этот указатель и указатель в main - два разных указателя, хотя указывают они на один и тот же адрес.
Это доказывает вывод, в котором адрес этого нового указателя 1244800. Для простоты назовем этот указатель str2.

Что происходит далее, далее вызывается блок try-finally, в котором, как известно, finally отрабатывает только после того, как отработал try.
В блоке try происходит return, который нам возвращает адрес, находящийся в str2 на тот момент, то есть 4282432, адрес строки "Original string", и только потом выполняет finally, в котором str2 присваивается адрес строки "Modified in finally!", но это уже ни на что не влияет, ни на значение, которое возвратит foo, ни тем паче на значение, хранящееся в str - т.к. в foo все операции проходят с указателем str2.

Таким образом, адрес, на который указывает str не меняется, и foo() возвращает тот же самый адрес, соответственно, дважды выводится "Original string".

Более того, нормальный анализатор кода обязательно укажет на блок finally, который по чути ничего принципиально не делает.

Поскольку в C# string является ref-типом, вся логика та же самая.

И немного ИМХО: задача интересная, но давать ее на собеседовании лично я бы не стал. Если, конечно, вы работаете не в Google или Microsoft.
Объективно достойный кандидат может и не ответить, и будет вам false-negative. В некоторых конторах это нормально, (например, см. выше), но в условиях КЗ это слишком.
Но опять же, это только мое ИМХО.
  • 0

#136
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

<...>
Что происходит, когда мы передаем str в функцию foo - строка передается по указателю, но сам-то указатель передается по значению, а это означает, что создается новый указатель, и в него записывается значение 4282432, но этот указатель и указатель в main - два разных указателя, хотя указывают они на один и тот же адрес.
Это доказывает вывод, в котором адрес этого нового указателя 1244800. Для простоты назовем этот указатель str2.

Что происходит далее, далее вызывается блок try-finally, в котором, как известно, finally отрабатывает только после того, как отработал try.
В блоке try происходит return, который нам возвращает адрес, находящийся в str2 на тот момент, то есть 4282432, адрес строки "Original string", и только потом выполняет finally, в котором str2 присваивается адрес строки "Modified in finally!", но это уже ни на что не влияет, ни на значение, которое возвратит foo, ни тем паче на значение, хранящееся в str - т.к. в foo все операции проходят с указателем str2.

Таким образом, адрес, на который указывает str не меняется, и foo() возвращает тот же самый адрес, соответственно, дважды выводится "Original string".

Хоть без компилятора и вывода дополнительных отладочных сообщений не обошлось, но... Все верно, будет дважды выведено "Original string". А главное, в ответе обращено внимание, что внутри Foo() все манипуляции происходят не с оригинальным указателем, а с его копией. Возвращаемое из Foo() значение тоже получено из копии указателя, однако еще до того, как эта копия стала указывать на новую строку. В общем, это правильный ответ с подробным объяснением всего, что происходит в программе.

Более того, нормальный анализатор кода обязательно укажет на блок finally, который по чути ничего принципиально не делает.

Зато можно убедиться, что блок finally выполняется "железно", и даже return в блоке try не приводит к немедленному возврату из функции Foo(). Это позволяет (хоть немного) проверить, насколько хорошо кандидат знаком с обработкой исключений.

И немного ИМХО: задача интересная, но давать ее на собеседовании лично я бы не стал. Если, конечно, вы работаете не в Google или Microsoft.

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

Объективно достойный кандидат может и не ответить, и будет вам false-negative. В некоторых конторах это нормально, (например, см. выше), но в условиях КЗ это слишком.
Но опять же, это только мое ИМХО.

А мне думается, можно аналогичные задачи предлагать и в условиях КЗ. Например, не для того, чтобы отсеять кандидата, а просто посмотреть его/ее реальные возможности. И тогда решить, какую зарплату ему/ей дать для начала. Тоже ИМХО.
  • 0

#137
dzid

dzid
  • Свой человек
  • 939 сообщений
На самом деле задачи такого плана - глупость. А идиоту, который напишет такой код в реальной программе, распечатать эту программу целиком вместе с исходниками всех используемых библиотек и ввести анально, дабы так не делал. Код должен быть простой, как советский валенок, понятный, как история КПСС, унифицированый, как Жигули, и работать надежно, как кувалда. Потом, если понадобится, его можно будет сделать быстрым.

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

Если уж очень хочется проверить мыслительные способности кандидата, лучше спросить, например:
1. Что такое массив (вектор);
2. Что такое связанный список;
3. Когда что использовать;
4. Предложите свою реализацию структуры данных, сочетающую в себе достоинства списка и вектора (то есть неограниченный объем, быструю вставку/удаление с краев, и быстрый произвольный доступ. Для этого в STL есть deque, типа нарисуйте внутреннее устройство).
Писать тут вообще ничего не надо, только рисовать.
  • 0

#138
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

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

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

Код должен быть простой, как советский валенок, понятный, как история КПСС, унифицированый, как Жигули, и работать надежно, как кувалда. Потом, если понадобится, его можно будет сделать быстрым.

А что, разве мы тут обсуждаем, каким должен быть рабочий код?

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

Да, да! А также изучение высшей математики, всяких там теорем Коши (а это что за хрен?), да еще и со сдачей экзаменов - это тоже тот еще фимоз головного мозга. Надо изучать только четыре арифметических действия, ну и конечно, начисление процентов в жизни пригодится. :rolleyes:

Если уж очень хочется проверить мыслительные способности кандидата, лучше спросить, например:
1. Что такое массив (вектор);
2. Что такое связанный список;
3. Когда что использовать;

И где тут проверка мыслительных способностей кандидата?
  • 0

#139
Big Joe

Big Joe
  • Постоялец
  • 316 сообщений
2 dzid

Так вы ведь только один вопрос задаете, чем класс отличается от объекта. И занимаетесь дрессировкой обезьян, делая из них кодеров. Отсюда вывод: Вы либо знатный Макаренко, либо слишком способные к вам мартышки приходят. Я бы оценил вопрос Visual1 на собеседовании нежели ваш ...
  • 0

#140
xn80akxm

xn80akxm
  • Частый гость
  • 91 сообщений
Приведу один из наших вопросов для собеседования. В качестве языка - JAVA.
Цель задачи заключается в том, чтобы потенциальный коллега показал свою способность
интерпретировать код у себя в голове и потом внятно объяснить,
что же с кодом не так, и что вообще он должен вывести.
class oops {
	static void main(string[] $) {
		system.out.println(1 - 0.9);
	}

}

Замечу, что грамотные спецы говорят о пазлах и гайдлайнах.
А что же скажете вы?
  • 0


Количество пользователей, читающих эту тему: 0

пользователей: 0, неизвестных прохожих: 0, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.