Вопросы на сообразительность
Saturday, 12 September 2009 09:30![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Но по-моему, они всё равно требуют специальных знаний и опыта. Те, которые ничего не требуют - они не выше начальный классов информатики в школе, это не серьёзно...
1. У нас есть сложная форма ввода: сотни полей и специальные правила на каждом из них (если юзер поставил галочку здесь, показать ему ещё вот эту секцию; если выбрал из списка вот это значение, то автоматически заполнить вот эти поля; вот эти числа просуммировать, сравнить вот с этим полем, и если выйдет больше, то показать ошибку и не дать сохранять; и так далее). Компьютер у нас быстрый, но проверок много, все проверки для всех полей формы занимают в сумме около 0.1 секунды. Какой из вариантов реализации выбрать:
а) сделать сотни маленьких процедурок, чтобы при изменении любого поля отрабатывали только те проверки, на которые это поле влияет;
б) сделать одну большую процедуру со всеми сотнями проверок и вызывать её при изменении любого поля (всякий раз перепроверяя сотни полей, которые не изменялись)?
2. У нас есть автоматический регулятор (допустим, реактора). Есть десяток входных параметров: температура, давление, уровень радиации и так далее. Есть десяток управляющих воздействий: поднимать-опускать стержни, доливать-спускать воду, выпускать пар и так далее. Есть оптимум - один набор входных значений, который означает, что реактор работает идеально. Есть допуски - область значений "оптимум плюс-минус дельта", когда реактор в этой области - всё тоже в порядке. Есть алгоритм управления: на любое состояние на входе мы можем совершить действия, которые приведут реактор в оптимум. Мы живём в реальном мире: параметры реактора постоянно изменяются, и нам постоянно нужно возвращать его в норму. Какой вариант реализации выбрать:
а) при любом отклонении от оптимума немедленно возвращать реактор в оптимум;
б) при выходе параметров из зоны допуска возвращать их в зону допуска, а пока реактор "плавает" туда-сюда в этой зоне - ничего не делать, хотя точно в оптимуме реактор и не будет практически никогда.
3. Вы исправляете баг в программе. В процессе исполнения вы замечаете в исходниках ещё пять похожих по реализации мест, а также два сомнительных алгоритма в соседних модулях. Юзеры и тестеры на те места не жаловались, вроде бы всё работает, да и вы сами не уверены, что там есть ошибки - просто подозреваете. Как действовать:
а) исправив свой баг, пойти и внимательно перепроверить сомнительные места (времени у вас достаточно, спешки нет);
б) записать подозрения для позднейшей проверки и заняться следующим багом из списка;
в) ничего не делать, пока юзеры и тестеры не пожалуются?
4. Программа делает параллельно много вещей (рисует мультик, сортирует файлы на диске, обновляет информацию в базе, реагирует на нажатия клавиш и так далее), то есть в ней запущено множество параллельных процессов. Есть ресурсы, к которым несколько процессов не должны обращаться одновременно (нельзя одновременно перекладывать два разных файла, нельзя одновременно связываться с сетью, нельзя двоим одновременно проверять клавиатуру...). Для этого применяют блокировки: когда один процесс занимает критический ресурс, другие процессы, которые тоже хотят этот ресурс, ждут в очереди. Критических участков у нас четыре: диск, сеть, клавиатура и соединение с базой данных. Процессов у нас десяток, они проскакивают критические участки быстро, поэтому длинные очереди нигде не скапливаются, юзер задержек не замечает. Какой из вариантов реализации выбрать:
а) сделать по одной блокировке на каждый критический ресурс (когда один процесс занимает диск, это нисколько не мешает другому обращаться к сети);
б) сделать одну общую блокировку на все случаи жизни (один процесс занимает диск - и на это время остальные не могут работать ни с базой, ни с клавиатурой...)?
5. Мы пишем программу: большую (команда менее чем из десятка человек не справится) и нужную (миллионы людей будут годами пользоваться этой программой, так что непременно будут новые версии, с исправлениями и доработками). Многие алгоритмы в программе можно сделать разными способами. Какой вариант реализации предпочтительнее:
а) выбирать самые быстрые, экономные по памяти и безупречные по результатам алгоритмы - но они будут большими, сложными для понимания и требовать много времени даже у хороших программистов (у нас хватает хороших программистов, денег и времени);
б) выбирать простые и очевидные для программистов реализации - но они притормаживают заметно для пользователя, отъедают лишние десятки мегабайт памяти, требуют не самого дохлого сетевого канала (ничего фатального, всё работает, у юзеров хватает ресурсов - но задержки, моргания картинки и косметические глюки слегка раздражают)?
Upd.: Добавил правильные ответы.
no subject
Date: Saturday, 12 September 2009 06:36 (UTC)сферических в вакууме...
;)))
Date: Saturday, 12 September 2009 06:51 (UTC)на практике будет всегда выбран вариант (в) :))))
Re: ;)))
Date: Saturday, 12 September 2009 07:30 (UTC)Re: ;)))
Date: Saturday, 12 September 2009 07:42 (UTC)собаку с колбасой на шеепрограммистов, пишущих автотесты для своих же программ? )))дайте контакты, я их приглашу на работу!шучу конечно, но в каждой шутке....
Re: ;)))
Date: Saturday, 12 September 2009 07:48 (UTC)no subject
Date: Saturday, 12 September 2009 07:10 (UTC)1. У нас есть сложная форма ввода, которую обслуживает здоровенная и никому давно толком не известная программища. Она при изменении некоторых полей обрабатывает все данные формы, а на другие, тоже важные поля, вообще плюет. Что будете делать?
2. У нас есть автоматический регулятор (допустим, реактора). Тот реактор давно списан, работает совсем другой агрегат, но автоматический регулятор оставили старый, по неграмотности и от безысходности. Сначала всё было вроде ничего, а последнее время регулятор все время сообщает, что реактор в красной зоне, при этом на вид ничего смертоносного не заметно. Как бы это поправить?
3. Вы исправляете баг в программе. В процессе исполнения вы замечаете в исходниках ещё пятьдесят похожих по реализации мест, а также двадцать сомнительных алгоритмов в соседних модулях. Но того бага, что вы искали, в этих модулях нет, нужный исходник вообще утерян. Какие будут предложения?
4. Программа делает параллельно много вещей, то есть в ней запущено множество параллельных процессов. Время от времени она виснет сама и подвешивает другие, не менее важные программы. Похоже, что писавшие ее (пять лет) и давно уволившиеся программеры использовали вперемешку все им известные и неизвестные методы управления процессами. Как будем разгребать?
5. Мы пишем программу: большую и нужную. Многие алгоритмы в программе можно сделать разными способами. При этом у нас два программера: вы и ваш начальник, опытнейший программист, помнящий еще машину «Стрела». Составьте сетевой план-график работ.
no subject
Date: Saturday, 12 September 2009 07:55 (UTC)no subject
Date: Saturday, 12 September 2009 08:11 (UTC)no subject
Date: Saturday, 12 September 2009 09:40 (UTC)а) мы хотим быстро выпустить хоть что-то
б) мы хотим быстрый код
в) мы хотим поддерживаемый код
Соответственно, оптимальности будут разными.
1а - чуток проверить и забить
1б - разбить это дикое уёжище на пачку независимых форм, отпрофилировать. как-то декларативно (make-образно) описать зависимости мелких кусочков кода.
1в - опять же отрефакторить, чтоб не было такого монстра. Например, сделать визард с логически сгруппированными зависимыми подгруппами.
2а - тупо реагировать на любое отклонение попытками его минимизации.
2б,в - уточнить зависимости этих параметров. Если они вполне независимы и нет нехороших лагов по времени, то держать каждый параметр, например, в пределах половины допустимого отклонения.
2б - необходимо ортогонализировать задачу. То есть, выбрать некий базис независимых управляющих операций и по каждому вектору отклонений выдавать ровно одну линейную комбинацию воздействий.
3 - пропущен вариант 'подсказать тестерам как именно проверить именно эту часть кода'. Скорее всего, там будут низкоприоритетные баги. Если мы хотим быстро выпустить проукт -- то на них забить, если мы хотим вылизанный продукт, то, пока контекст в голове, надо заняться именно этими багами.
4 - в случае 'в' надо делать очереди запросов и отдельные 'сервера' на диск, базу, консоль итп.
Иначе при малом шевелении алгоритмов этих тредов мы скатимся до внезапных и трудноуловимых взаимоблокировок, особенно в случае 4б.
ответ 5а - это джоуэльсофтваре, 5б - обычный виндоус.
тут, кстати, надо написать подробное техописание, как вся этаа система должна работать и почему. Потом разбить на независимые черные ящечки, потом написать быстрогрязно, потом долго профилировать.
no subject
Date: Saturday, 12 September 2009 07:39 (UTC)no subject
Date: Saturday, 12 September 2009 07:56 (UTC)no subject
Date: Saturday, 12 September 2009 08:07 (UTC)1. Насколько независимы поля формы? Что будет с уже введенными правильно юзерскими данными, если что-то отвалится? Достаточно ли удобен юзеру такой громоздкий интерфейс? Не стоит ли нафиг порезать форму на несколько? Кто юзер? Есть ли там значения по умолчанию? Насколько тяжеловесны обработки? Что самое тяжелое? Кто, блин, проектировщик этого убожества? Очевидно же, что заполнение формы когаздо более медленный и череповатый процесс по сравнению с проверками?
2. Как соотносятся время опроса датчиков и время обслуживания одного отклонения?
3. Сколько юзеров и насколько они вменяемы? Чем заняты тестеры? В каких условиях могут вылететь аналогичные баги?
4. Какой маньяк проектировал это чудо-дерево? Как устроено характерное использование?
5. КТО ЭТО ПРОЕКТИРОВАЛ, БЛИН?
no subject
Date: Saturday, 12 September 2009 08:09 (UTC)no subject
Date: Saturday, 12 September 2009 08:19 (UTC)no subject
Date: Saturday, 12 September 2009 08:43 (UTC)no subject
Date: Saturday, 12 September 2009 10:24 (UTC)no subject
Date: Saturday, 12 September 2009 11:30 (UTC)Обычно мне приходится решать задачи "как сделать, чтобы ЭТО на самом деле работало" и "как узнать, что на самом деле нужно энд-юзеру". И "как сделать, чтобы юзеру не приходилось читать инструкцию, которую он все равно не будет читать" А при обсуждении с программистами их задач - "где ЕЩЕ лежат грабли". Очевидные-то они найдут...
no subject
Date: Saturday, 12 September 2009 12:27 (UTC)Тогда понятно, почему вопросы вызвали такую реакцию. Подобные задачи - это обычно результат твоей работы, а не начальные условия.
no subject
Date: Saturday, 12 September 2009 16:54 (UTC)И кроме того - регулярно встречаюсь с поделками от самых разных контор, где настройка проводится исключительно методом реверс-инжиниринга. А реверс-инжиниринг требует зачастую именно того, а чего мы собственно хотим.
Мнение о работе админа у тебя несколько оторванное от реальности. Админ вполне может быть прокси от юзера до хотя бы того же аналитика - потому как с точки зрения юзеров за все отвечает он.
no subject
Date: Saturday, 12 September 2009 17:23 (UTC)no subject
Date: Saturday, 12 September 2009 11:33 (UTC)no subject
Date: Saturday, 12 September 2009 08:40 (UTC)1. в среднем случае -- одну большую, иначе будет сложно уследить, какая мелкая процедура что меняет. Если же имеем гарантии того, что мелкие процедуры обращаются точно к разным элементам (например, не показывают/скрывают один и тот же блок гуи), то можно и их использовать. А в идеале -- строгая разбивка на три секции: 1. взять свойства элементов, влияющих на поведение формы, 2. из них посредством простейших и очевиднейших средств получить результаты, влияющие на свойства подконтрольных элементов, 3. на основании значений из п.2 изменить свойства подконтрольных элементов.
2. зависит от кучи других условий. Например, насколько страшен выход из зоны допуска, насколько быстро он возвращается в зону допуска и насколько хорошо, если реактор точно в оптимуме.
Если когда выход из зоны допуска не страшен, возврат оттуда быстрый и гарантированный, и оптимальные условия по качеству не отличаются от условий в зоне допуска, только тогда можно допускать вариант "б", и он тогда будет гораздо лучше кучи мелких шевелений по варианту "а".
3. если спешки точно нет -- разобраться, отрефакторить нафиг. Но это сферический случай в вакууме. В среднем случае -- комбинация всех вариантов: посмотреть, к чему максимально плохому приведёт баг, если к серьёзным вещам -- разобраться и ниипёт, если нет -- записать подозрительное место, возможные симптомы проявления бага и жить дальше, обращая внимание на свежие баги. Если осмысленно и приемлемо, поставить отладочную печать при входе в подозрительный кусок, чтобы по ней судить о том, мог ли баг быть вызван им.
4. зависит от сложности алгоритмов. К сожалению, блокировки не композиционируются, из-за чего бывают дедлоки. Если очевидно, что с композиционируемостью проблем не будет, лучше делать "одна блокировка на один ресурс". Если вероятны проблемы -- "одна блокировка на все случаи жизни" (лучше, если пару тредов подождут подольше, нежели всё зависнет нафиг). Если есть возможность и удобные средства для работы с message passing, то использовать именно их вместо дебильных блокировок.
5. выбирать модульную архитектуру. А в ней сначала реализовать тупейшие и очевиднейшие алгоритмы (вплоть до возвращения константы в качестве хеша значения), а затем, когда профайлер скажет, переделывать нужные куски. Впрочем, если программистов и времени хватает, то обучить всех модульной архитектуре, и пусть себе пишут хорошие чёрные ящики с хорошими юнит-тестами. Но в идеале -- комбинацию этих подходов, чтобы программисты и пользователи видели результат (хоть и не оптимальный), и чтобы процесс улучшения модулей реально улучшал программу в целом.
no subject
Date: Saturday, 12 September 2009 10:03 (UTC)no subject
Date: Saturday, 12 September 2009 11:48 (UTC)no subject
Date: Saturday, 12 September 2009 10:08 (UTC)1а
2б
3а
4а
5а
Мне кажется, что ответы излишне наводящие.
no subject
Date: Saturday, 12 September 2009 10:22 (UTC)no subject
Date: Saturday, 12 September 2009 10:24 (UTC)no subject
Date: Saturday, 12 September 2009 10:26 (UTC)no subject
Date: Saturday, 12 September 2009 11:16 (UTC)no subject
Date: Saturday, 12 September 2009 11:21 (UTC)no subject
Date: Saturday, 12 September 2009 13:54 (UTC)no subject
Date: Saturday, 12 September 2009 13:52 (UTC)no subject
Date: Saturday, 12 September 2009 17:35 (UTC)ждал каких-нибудь клевых программистских задачек, которые можно было бы дать детям, нашел некие довольно понятные (не считая того, что надо догадываться о критерии оптимизации), но не завлекающие вопросы скорее из области менеджмента, чем программирования.
no subject
Date: Saturday, 12 September 2009 19:06 (UTC)Но это не совсем менеджмент. Менеджмент - это о людях, об общении с заказчиками, принуждении подчинённых, балансировке недостаточных ресурсов... Ещё менее интересно.
no subject
Date: Saturday, 12 September 2009 21:21 (UTC)no subject
Date: Monday, 14 September 2009 13:58 (UTC)- Сколько на земле точек из которой можно пройти километр на север, километр на восток, километр на юг - и вернуться в исходную.
- Почему в зеркале право и лево меняются местами а верх и низ нет.
- У вас есть шесть бильярдных шариков и весы с двумя чашками. Один шарик легче других. Как найти его за два взвешивания.
Вот таких простых вопросов лично мне достаточно для отбора кандидата на собеседовании (ну, конечно, с разговором и задачами по программированию)
no subject
Date: Saturday, 12 September 2009 19:18 (UTC)2. На первый взгляд - б)
3. б). А лучше - послать задачу тестерам проверить эти места.
4. б), чтобы не возникло дедлоков - один процесс ждет клавиатуру, которая занята вторым процессом, который ждет диск, залоченный первым.
5. Я считаю, что б). Меньше вероятность ошибки, проще в дальнейшей поддержке и развитии.