На днях написал небольшой текст для своих ( не очень пока опытных ) команд по организации командной работы.
И решил выложить его сюда, чтобы послушать критику, дополнения и уточнения.
Кто хочет почитать, пожалуйте под кат.
1. Начало контеста. Все читают задачи. Через некоторое время один человек находит задачу, которую он 100% быстро сделает(быстро - не более получаса ), и садится за нее.
2. Если нет. Продолжаем чтение. С периодом в 5-10 минут обновляется монитор. Если видите, что сдана за 5-10 минут задача - значит нужно читать в первую очередь ее. Если прочитали, но вы не знаете, как ее решать - попросите прочитать ее других членов команды. Часто бывает, что кого-то клинит на простой задаче. Но всех троих вряд ли заклинит. Ни в коем случае не пересказывайте друг другу условия!!! Важнейшее правило - каждый должен сам прочитать условия всех задач!!! Клинит на простых задачах в 90% случаев из-за неправильного понимания условия.
1. Задачи, которые пока никто из других команд не сдал, не рассматриваются даже как вариант! Рекомендую вам ближайшие полгода придерживаться этого правила. Если вам кажется, что задача, которую никто не сдал - простая, то значительно более вероятно, что вы что-то не поняли, чем то, что все вокруг тупят. Пока не наберетесь опыта, давайте примем это за строгое правило. В свое время нам это помогло.
2. Рекомендую выделить чистый листок на команду. На нем выписать стобиком буквы задач. Вычеркивать на нем сданные задачи, отмечать недобитые, те, которые кто-то делает в данный момент за компьютером, те, по которым есть идеи. Это убережет вас от того, что кто-то думает над задачей, которую вы уже сдали, или которую делает кто-то еще. В любой момент любой участник должен видеть текущее состояние команды, кто над чем работает и ее перспективы, и этот листок этому поможет.
Отмечайте задачи, которые сдало много народу, вычеркивайте те, которые никто не сдал после нескольких часов.
Все задачи, начиная со второй, должны быть переписаны с листочка. Т.е. пока кто-то сидит за компьютером тот, у кого созрела 100% идея по задаче, не сидит, обсасывая ее, а пишет код на листочке. Именно код, со всеми объявлениями переменных, циклами и т.д. Сложно оценить, как это полезно, если ты этого не делал, но поверьте - это действительно ускоряет последующую работу. И не только. В 30% случаях в процессе написания вы поймете, что этот алгоритм не работает. В 30% поймете, что нужны совсем другие структуры данных. Лучше понять это еще не садясь за компьютер!
Если есть формулы - то написание кода заставит их продумать.
Если есть тонкие моменты - типа цикл до i, или i-1 - продумаете это, не тратя компьютерное время.
Если у вас будет вопрос по синтаксису языка - спросите у сокомандника опять же не тратя компьютерное время.
Потом, когда вы будете перепечатывать код, вам не придется перематывать экран туда-сюда, "о, здесь же переменную забыл объявить! о, нужно функцию вначале дописать!", что увеличит концентрацию, а, следовательно, уменьшит количество ошибок. Кроме того, в процессе перепечатки, вы посмотрите на ваш код еще раз, как бы со стороны, что
еще уменьшит количество ошибок.
Еще раз - практика показывает, что в коде, переписанном с бумажки на порядок меньше ошибок.
Единственный минус этого подхода - нужно хорошо знать язык, который вы используете.
Любой контест в идеале выглядит так - человек садится за компьютер, перепечатывает с бумажки код, исправляет пару багов, запускает проверку на "стандартном наборе" тестов, отправляет, встает из-за компа. Садится следующий, перепечатывает с бумажки код и т.д.
Предположим члену вашей команды нужно час, чтобы прочитать условие, придумать решение и написать его на бумажке, и полчаса чтобы его перепечатать с бумажки, отладить и отправить. Нетрудно заметить, что такая команда за контест сдаст 10 задач и займет в итоге первое место. Заманчиво?
Возьмем более реалистичный график. Два часа, чтобы прочитать условие, придумать решение и написать его на бумажке (согласитесь, целый вагон времени!), и час чтобы перепечатать с бумажки и отладить (учитывая размер стандартного решения, на перепечатку нужно 15 минут, т.е. 45 минут на отладку! ). Такая команда сдаст 5 задач, это то, к чему мы сейчас стремимся.
На практике, чаще бывает так - человек написал задачу, отправил, WA18, и что делать? Дать ему отладить, или посадить следующего, который уже написал решение на бумажке и ждет возможности сесть за компьютер?
В каких случаях нужно сажать следующего по очереди за компьютер, а в каких нужно дать человеку отладить задачу?
Сажать другого человека нужно при соблюдении одного из следующих условий:
a) человек в процессе кодинга понял, что этот алгоритм не работает
b) человек отправлял задачу, чтобы проверить - уложится этот алгоритм в TL, оказалось, нет. ( хотя это нештатная ситуация, надо уметь без компа определять )
c) человек не знает где у него ошибка в коде. И у него нет теста на котором его задача не работает. И он уже проверил весь джентльменский набор тестов
В этом случае человек распечатывает свой код, и идет читать его, а также условие за стол. А за комп садится другой. В остальных случаях человек остается за компьютером добивать задачу. Надо верить сокомандникам!
Если, глядя на распечатку, человек понял где ошибка, и знает что нужно исправить пару строк - надо дать ему такую возможность, т.е. посадить обратно!
- Тесты из условия. Их проверить обязательно!!!
- Тесты крайние снизу. Если (0<=N<=50), обязательно первым делом проверяется N=0. Дальше проверяется N=1,2,3,4 и пока не надоест. Если в тесте - строка, нужно проверить строку нулевой длиной, длиной 1, 2, 3 и т.д. Для строк длины 2 - когда они одинаковые в строке, когда разные. Если могут быть пробельные символы - обязательно проверить. Если граф – то проверить и полный, и пустой, а так же линейный, с нулем вершин, одной вершиной или двумя. Могут быть петли – проверить с ними. Мультиребра - то же самое. И т.д. Если есть возможность быстро проверить с десяток тестов - не пренебрегайте.
- Тесты крайние сверху. Если N<=10^9, обязательно проверить 10^9. Даже если вы не знаете ответ для таких значений. Знали бы вы, как часто на таких тестах программы выдают заведомо неправдоподобный ответ или вылетают.
В 90% случаях этого набора достаточно, но наблюдая за первой лигой, я вижу, что даже этот простой набор тестов не соблюдается.
За час до конца капитан определяет, сколько и какие задачи вы планируете досдать, причем реалистично! Т.е. это
- одна в большинстве случаев
- две, если по одной уже что-то весомое написано
- три может быть, только если у вас две недобитых и третья почти написана.
С этого момента все работы над другими задачами прекращаются! Если цель - "одна задача", то это означает что все делают одну! Т.е. один пишет, другой контролирует за монитором, что он пишет, третий пишет тесты, и читает-перечитывает условие. Периодически спрашивая "а вы учитываете, что ...", "а вы рассматриваете такой вариант ...". Да это нудно, но это командная работа, и в момент контеста нужно работать КОМАНДОЙ на достижение максимального результата.
И решил выложить его сюда, чтобы послушать критику, дополнения и уточнения.
Кто хочет почитать, пожалуйте под кат.
На первый час
2. Если нет. Продолжаем чтение. С периодом в 5-10 минут обновляется монитор. Если видите, что сдана за 5-10 минут задача - значит нужно читать в первую очередь ее. Если прочитали, но вы не знаете, как ее решать - попросите прочитать ее других членов команды. Часто бывает, что кого-то клинит на простой задаче. Но всех троих вряд ли заклинит. Ни в коем случае не пересказывайте друг другу условия!!! Важнейшее правило - каждый должен сам прочитать условия всех задач!!! Клинит на простых задачах в 90% случаев из-за неправильного понимания условия.
Середина контеста
2. Рекомендую выделить чистый листок на команду. На нем выписать стобиком буквы задач. Вычеркивать на нем сданные задачи, отмечать недобитые, те, которые кто-то делает в данный момент за компьютером, те, по которым есть идеи. Это убережет вас от того, что кто-то думает над задачей, которую вы уже сдали, или которую делает кто-то еще. В любой момент любой участник должен видеть текущее состояние команды, кто над чем работает и ее перспективы, и этот листок этому поможет.
Отмечайте задачи, которые сдало много народу, вычеркивайте те, которые никто не сдал после нескольких часов.
Идеал, к которому нужно стремиться на каждой тренировке
Если есть формулы - то написание кода заставит их продумать.
Если есть тонкие моменты - типа цикл до i, или i-1 - продумаете это, не тратя компьютерное время.
Если у вас будет вопрос по синтаксису языка - спросите у сокомандника опять же не тратя компьютерное время.
Потом, когда вы будете перепечатывать код, вам не придется перематывать экран туда-сюда, "о, здесь же переменную забыл объявить! о, нужно функцию вначале дописать!", что увеличит концентрацию, а, следовательно, уменьшит количество ошибок. Кроме того, в процессе перепечатки, вы посмотрите на ваш код еще раз, как бы со стороны, что
еще уменьшит количество ошибок.
Еще раз - практика показывает, что в коде, переписанном с бумажки на порядок меньше ошибок.
Единственный минус этого подхода - нужно хорошо знать язык, который вы используете.
Идеальный контест
Предположим члену вашей команды нужно час, чтобы прочитать условие, придумать решение и написать его на бумажке, и полчаса чтобы его перепечатать с бумажки, отладить и отправить. Нетрудно заметить, что такая команда за контест сдаст 10 задач и займет в итоге первое место. Заманчиво?
Возьмем более реалистичный график. Два часа, чтобы прочитать условие, придумать решение и написать его на бумажке (согласитесь, целый вагон времени!), и час чтобы перепечатать с бумажки и отладить (учитывая размер стандартного решения, на перепечатку нужно 15 минут, т.е. 45 минут на отладку! ). Такая команда сдаст 5 задач, это то, к чему мы сейчас стремимся.
Смена караула
В каких случаях нужно сажать следующего по очереди за компьютер, а в каких нужно дать человеку отладить задачу?
Сажать другого человека нужно при соблюдении одного из следующих условий:
a) человек в процессе кодинга понял, что этот алгоритм не работает
b) человек отправлял задачу, чтобы проверить - уложится этот алгоритм в TL, оказалось, нет. ( хотя это нештатная ситуация, надо уметь без компа определять )
c) человек не знает где у него ошибка в коде. И у него нет теста на котором его задача не работает. И он уже проверил весь джентльменский набор тестов
В этом случае человек распечатывает свой код, и идет читать его, а также условие за стол. А за комп садится другой. В остальных случаях человек остается за компьютером добивать задачу. Надо верить сокомандникам!
Если, глядя на распечатку, человек понял где ошибка, и знает что нужно исправить пару строк - надо дать ему такую возможность, т.е. посадить обратно!
Стандартный набор тестов
- Тесты крайние снизу. Если (0<=N<=50), обязательно первым делом проверяется N=0. Дальше проверяется N=1,2,3,4 и пока не надоест. Если в тесте - строка, нужно проверить строку нулевой длиной, длиной 1, 2, 3 и т.д. Для строк длины 2 - когда они одинаковые в строке, когда разные. Если могут быть пробельные символы - обязательно проверить. Если граф – то проверить и полный, и пустой, а так же линейный, с нулем вершин, одной вершиной или двумя. Могут быть петли – проверить с ними. Мультиребра - то же самое. И т.д. Если есть возможность быстро проверить с десяток тестов - не пренебрегайте.
- Тесты крайние сверху. Если N<=10^9, обязательно проверить 10^9. Даже если вы не знаете ответ для таких значений. Знали бы вы, как часто на таких тестах программы выдают заведомо неправдоподобный ответ или вылетают.
В 90% случаях этого набора достаточно, но наблюдая за первой лигой, я вижу, что даже этот простой набор тестов не соблюдается.
Конец контеста
- одна в большинстве случаев
- две, если по одной уже что-то весомое написано
- три может быть, только если у вас две недобитых и третья почти написана.
С этого момента все работы над другими задачами прекращаются! Если цель - "одна задача", то это означает что все делают одну! Т.е. один пишет, другой контролирует за монитором, что он пишет, третий пишет тесты, и читает-перечитывает условие. Периодически спрашивая "а вы учитываете, что ...", "а вы рассматриваете такой вариант ...". Да это нудно, но это командная работа, и в момент контеста нужно работать КОМАНДОЙ на достижение максимального результата.