andrzejn: (Curious)
[personal profile] andrzejn
[livejournal.com profile] asena просит привести примеры ситуаций из ваших областей деятельности, которые не требуют специальных знаний, а только общей базовой подготовки и сообразительности. Я подумал и подобрал общие вопросы из программирования, которые мы обычно задаём кандидатам на собеседованиях перед тем, как перейти к вопросам по конкретным технологиям.

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

1. У нас есть сложная форма ввода: сотни полей и специальные правила на каждом из них (если юзер поставил галочку здесь, показать ему ещё вот эту секцию; если выбрал из списка вот это значение, то автоматически заполнить вот эти поля; вот эти числа просуммировать, сравнить вот с этим полем, и если выйдет больше, то показать ошибку и не дать сохранять; и так далее). Компьютер у нас быстрый, но проверок много, все проверки для всех полей формы занимают в сумме около 0.1 секунды. Какой из вариантов реализации выбрать:

а) сделать сотни маленьких процедурок, чтобы при изменении любого поля отрабатывали только те проверки, на которые это поле влияет;

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

2. У нас есть автоматический регулятор (допустим, реактора). Есть десяток входных параметров: температура, давление, уровень радиации и так далее. Есть десяток управляющих воздействий: поднимать-опускать стержни, доливать-спускать воду, выпускать пар и так далее. Есть оптимум - один набор входных значений, который означает, что реактор работает идеально. Есть допуски - область значений "оптимум плюс-минус дельта", когда реактор в этой области - всё тоже в порядке. Есть алгоритм управления: на любое состояние на входе мы можем совершить действия, которые приведут реактор в оптимум. Мы живём в реальном мире: параметры реактора постоянно изменяются, и нам постоянно нужно возвращать его в норму. Какой вариант реализации выбрать:

а) при любом отклонении от оптимума немедленно возвращать реактор в оптимум;

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

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

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

б) записать подозрения для позднейшей проверки и заняться следующим багом из списка;

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

4. Программа делает параллельно много вещей (рисует мультик, сортирует файлы на диске, обновляет информацию в базе, реагирует на нажатия клавиш и так далее), то есть в ней запущено множество параллельных процессов. Есть ресурсы, к которым несколько процессов не должны обращаться одновременно (нельзя одновременно перекладывать два разных файла, нельзя одновременно связываться с сетью, нельзя двоим одновременно проверять клавиатуру...). Для этого применяют блокировки: когда один процесс занимает критический ресурс, другие процессы, которые тоже хотят этот ресурс, ждут в очереди. Критических участков у нас четыре: диск, сеть, клавиатура и соединение с базой данных. Процессов у нас десяток, они проскакивают критические участки быстро, поэтому длинные очереди нигде не скапливаются, юзер задержек не замечает. Какой из вариантов реализации выбрать:

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

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

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

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

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

Upd.: Добавил правильные ответы.

Date: Saturday, 12 September 2009 06:36 (UTC)
zhiva: (Default)
From: [personal profile] zhiva
# у нас хватает хороших программистов, денег и времени #

сферических в вакууме...

;)))

Date: Saturday, 12 September 2009 06:51 (UTC)
From: [identity profile] angie-may.livejournal.com
п. 3 доставил.
на практике будет всегда выбран вариант (в) :))))

Re: ;)))

Date: Saturday, 12 September 2009 07:30 (UTC)
From: [identity profile] nasse.livejournal.com
Не. Бывает еще вариант "написать автоматический тест"

Re: ;)))

Date: Saturday, 12 September 2009 07:42 (UTC)
From: [identity profile] angie-may.livejournal.com
Где вы видели собаку с колбасой на шее программистов, пишущих автотесты для своих же программ? ))) дайте контакты, я их приглашу на работу!

шучу конечно, но в каждой шутке....

Re: ;)))

Date: Saturday, 12 September 2009 07:48 (UTC)
From: [identity profile] nasse.livejournal.com
Вот в конторе, где я работаю, программисты такие :)

Date: Saturday, 12 September 2009 07:10 (UTC)
From: [identity profile] zvantsev.livejournal.com
К Вашему вопросу надо сделать уточнение: Вы имеете в виду реальные (квазиреальные) ситуации или некие модели? В мало-мальски реальных ситуациях программер работает над программами-монстрами, авторы которых длинной вереницей ушли в неизвестность. А если программирование идет с нуля, то всё равно ничего толком не сделаешь — сдавать надо позавчера. Ну, например:

1. У нас есть сложная форма ввода, которую обслуживает здоровенная и никому давно толком не известная программища. Она при изменении некоторых полей обрабатывает все данные формы, а на другие, тоже важные поля, вообще плюет. Что будете делать?

2. У нас есть автоматический регулятор (допустим, реактора). Тот реактор давно списан, работает совсем другой агрегат, но автоматический регулятор оставили старый, по неграмотности и от безысходности. Сначала всё было вроде ничего, а последнее время регулятор все время сообщает, что реактор в красной зоне, при этом на вид ничего смертоносного не заметно. Как бы это поправить?

3. Вы исправляете баг в программе. В процессе исполнения вы замечаете в исходниках ещё пятьдесят похожих по реализации мест, а также двадцать сомнительных алгоритмов в соседних модулях. Но того бага, что вы искали, в этих модулях нет, нужный исходник вообще утерян. Какие будут предложения?

4. Программа делает параллельно много вещей, то есть в ней запущено множество параллельных процессов. Время от времени она виснет сама и подвешивает другие, не менее важные программы. Похоже, что писавшие ее (пять лет) и давно уволившиеся программеры использовали вперемешку все им известные и неизвестные методы управления процессами. Как будем разгребать?

5. Мы пишем программу: большую и нужную. Многие алгоритмы в программе можно сделать разными способами. При этом у нас два программера: вы и ваш начальник, опытнейший программист, помнящий еще машину «Стрела». Составьте сетевой план-график работ.

Date: Saturday, 12 September 2009 08:11 (UTC)
From: [identity profile] nasse.livejournal.com
Хм. Для таких задачек реальный опыт противопоказан :))))))

Date: Saturday, 12 September 2009 09:40 (UTC)
From: [identity profile] nicka-startcev.livejournal.com
в половине вопросов непонятен критерий оптимизации:
а) мы хотим быстро выпустить хоть что-то
б) мы хотим быстрый код
в) мы хотим поддерживаемый код

Соответственно, оптимальности будут разными.

1а - чуток проверить и забить
1б - разбить это дикое уёжище на пачку независимых форм, отпрофилировать. как-то декларативно (make-образно) описать зависимости мелких кусочков кода.
1в - опять же отрефакторить, чтоб не было такого монстра. Например, сделать визард с логически сгруппированными зависимыми подгруппами.

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

3 - пропущен вариант 'подсказать тестерам как именно проверить именно эту часть кода'. Скорее всего, там будут низкоприоритетные баги. Если мы хотим быстро выпустить проукт -- то на них забить, если мы хотим вылизанный продукт, то, пока контекст в голове, надо заняться именно этими багами.

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

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

Date: Saturday, 12 September 2009 07:39 (UTC)
From: [identity profile] nasse.livejournal.com
Какие-то все задачки абстрактные в вакууме...

Date: Saturday, 12 September 2009 08:07 (UTC)
From: [identity profile] nasse.livejournal.com
Мнэ... Обладая некоторым опытом, хотя и не програмистским, я не могу ответить на эти вопросы, могу только задать дополнительные :)

1. Насколько независимы поля формы? Что будет с уже введенными правильно юзерскими данными, если что-то отвалится? Достаточно ли удобен юзеру такой громоздкий интерфейс? Не стоит ли нафиг порезать форму на несколько? Кто юзер? Есть ли там значения по умолчанию? Насколько тяжеловесны обработки? Что самое тяжелое? Кто, блин, проектировщик этого убожества? Очевидно же, что заполнение формы когаздо более медленный и череповатый процесс по сравнению с проверками?

2. Как соотносятся время опроса датчиков и время обслуживания одного отклонения?

3. Сколько юзеров и насколько они вменяемы? Чем заняты тестеры? В каких условиях могут вылететь аналогичные баги?

4. Какой маньяк проектировал это чудо-дерево? Как устроено характерное использование?

5. КТО ЭТО ПРОЕКТИРОВАЛ, БЛИН?

Date: Saturday, 12 September 2009 08:09 (UTC)
From: [identity profile] nasse.livejournal.com
Да. По 2. Что говорят физики? Все ли параметры независимы, и за какими отклонениями какой ГРУППЫ параметров в пределах допоустимой области надо следить особо?

Date: Saturday, 12 September 2009 08:19 (UTC)
From: [identity profile] http://users.livejournal.com/_navi_/
по 2 физики говорят, что вообще говоря держать реактор в состоянии оптимума очень вероятно совсем не оптимально по управлению (если вообще реалистично с учётом задержек). Поэтому в любом случае управление будет состоять в удержании состояния в какой-то окрестности оптимума, так чтобы ещё и экономически эффективно было, и всё ещё неопасно.

Date: Saturday, 12 September 2009 08:43 (UTC)
From: [identity profile] nasse.livejournal.com
Есть ли череповатые закономерности вида "поехала в одну сторону группа параметров" в пределах "зеленой" зоны? (Это я про "безусловно, обрабатываем выходы из "зеленой" зоны. Но есть ли что-то еще значимое?")

Date: Saturday, 12 September 2009 11:30 (UTC)
From: [identity profile] nasse.livejournal.com
Я админ :)
Обычно мне приходится решать задачи "как сделать, чтобы ЭТО на самом деле работало" и "как узнать, что на самом деле нужно энд-юзеру". И "как сделать, чтобы юзеру не приходилось читать инструкцию, которую он все равно не будет читать" А при обсуждении с программистами их задач - "где ЕЩЕ лежат грабли". Очевидные-то они найдут...

Date: Saturday, 12 September 2009 16:54 (UTC)
From: [identity profile] chieftain-yu.livejournal.com
"Админ только настраивает и поддерживает для юзеров уже готовое." - у юзеров зачастую совсем иное мнение. А поскольку юзер может быть по пищевой цепочке выше админа, то...
И кроме того - регулярно встречаюсь с поделками от самых разных контор, где настройка проводится исключительно методом реверс-инжиниринга. А реверс-инжиниринг требует зачастую именно того, а чего мы собственно хотим.

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

Date: Saturday, 12 September 2009 11:33 (UTC)
From: [identity profile] nasse.livejournal.com
Да, из правильных ответов вызывают сомнение последние два...

Date: Saturday, 12 September 2009 08:40 (UTC)
From: [identity profile] gds.livejournal.com
давайте я попробую.

1. в среднем случае -- одну большую, иначе будет сложно уследить, какая мелкая процедура что меняет. Если же имеем гарантии того, что мелкие процедуры обращаются точно к разным элементам (например, не показывают/скрывают один и тот же блок гуи), то можно и их использовать. А в идеале -- строгая разбивка на три секции: 1. взять свойства элементов, влияющих на поведение формы, 2. из них посредством простейших и очевиднейших средств получить результаты, влияющие на свойства подконтрольных элементов, 3. на основании значений из п.2 изменить свойства подконтрольных элементов.

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

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

4. зависит от сложности алгоритмов. К сожалению, блокировки не композиционируются, из-за чего бывают дедлоки. Если очевидно, что с композиционируемостью проблем не будет, лучше делать "одна блокировка на один ресурс". Если вероятны проблемы -- "одна блокировка на все случаи жизни" (лучше, если пару тредов подождут подольше, нежели всё зависнет нафиг). Если есть возможность и удобные средства для работы с message passing, то использовать именно их вместо дебильных блокировок.

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

Date: Saturday, 12 September 2009 11:48 (UTC)
From: [identity profile] nasse.livejournal.com
Очень понравился ответ на вопрос 5.

Date: Saturday, 12 September 2009 10:08 (UTC)
etoile_verte: (art)
From: [personal profile] etoile_verte
Поскольку я тут, видимо, единственный непрограммист...





Мне кажется, что ответы излишне наводящие.

Date: Saturday, 12 September 2009 10:24 (UTC)
etoile_verte: (glum)
From: [personal profile] etoile_verte
Он ответил слишком сложно для меня.

Date: Saturday, 12 September 2009 11:21 (UTC)
etoile_verte: (glum)
From: [personal profile] etoile_verte
Как обычно, никакой разницы между правильным и неправильным. Т.е. доводы за противоположные ответы выглядят одинаково разумными.

Date: Saturday, 12 September 2009 13:54 (UTC)
From: [identity profile] landco.livejournal.com
**тщательно заземлил от наводок**

Date: Saturday, 12 September 2009 13:52 (UTC)
From: [identity profile] landco.livejournal.com
работа киллера!

Date: Saturday, 12 September 2009 17:35 (UTC)
From: [identity profile] ymi-an-island.livejournal.com
разочарован
ждал каких-нибудь клевых программистских задачек, которые можно было бы дать детям, нашел некие довольно понятные (не считая того, что надо догадываться о критерии оптимизации), но не завлекающие вопросы скорее из области менеджмента, чем программирования.

Date: Saturday, 12 September 2009 21:21 (UTC)
From: [identity profile] ymi-an-island.livejournal.com
ну да, я понимаю... нет, не сортировка конечно, боже упаси... но наверное есть какие-нибудь задачки на программирование, которые школьник, не знающий ни одного языка может решить из общих соображений... какая-нибудь проверка делимости числа нацело и т.п. Есть же какие-то олимпиады по программированию.

Date: Monday, 14 September 2009 13:58 (UTC)
From: [identity profile] roman-eremin.livejournal.com
Ну навскидку:
- Сколько на земле точек из которой можно пройти километр на север, километр на восток, километр на юг - и вернуться в исходную.

- Почему в зеркале право и лево меняются местами а верх и низ нет.

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

Вот таких простых вопросов лично мне достаточно для отбора кандидата на собеседовании (ну, конечно, с разговором и задачами по программированию)

Date: Saturday, 12 September 2009 19:18 (UTC)
From: [identity profile] beldmit.livejournal.com
1. б) - проще не забыть
2. На первый взгляд - б)
3. б). А лучше - послать задачу тестерам проверить эти места.
4. б), чтобы не возникло дедлоков - один процесс ждет клавиатуру, которая занята вторым процессом, который ждет диск, залоченный первым.
5. Я считаю, что б). Меньше вероятность ошибки, проще в дальнейшей поддержке и развитии.

Profile

andrzejn: (Default)
Андрій Новосьолов

June 2025

M T W T F S S
      1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sunday, 15 June 2025 22:02
Powered by Dreamwidth Studios
OSZAR »