Вопросы на сообразительность
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.: Добавил правильные ответы.