Ага, N=1 и M=1 — вполне себе интересные граничные условия. На это посмотрят обязательно. Об этом в задании и говорилось.
Придираться к тактам процессора и отрисовке — это особенности конкретного задания. Я не берусь говорить, прав был работодатель или нет, что придирался в том конкретном задании. Это нужно конкретный случай смотреть.
А как должны себя вести хорошие менеджеры и хорошие заказчики? Они тоже до конца не знают требования. Это просто жизнь так устроена. Поэтому проблемы советуют решать по мере поступления.
Именно это и есть проблема. Разжевать разработчику все (совсем все) условия очень много времени занимает. Очень — это действительно очень. Быстрее самому всё напрограммить, чем ТЗ писать. Программист должен получать только вводные данные — место его модуля в общей системе, и как он будет использоваться. На выходе должно получиться минимальное решение, которое работает ровно так, как просили. Если чего-то не просили, и программист сам не догадался, что это точно понадобится, то делать этого не надо.
Так точно. По умолчанию, если ничего не сказано, надо делать максимальное простое и понятное решение. Если оно без ООП простое и понятное, значит ок. Если без ООП получается запутанное, а с ООП простое, значит надо было использовать ООП.
Это не типичнейшая проблема заданий. Если в задании сказано «посчитать 2*2», не надо додумывать за автора условия и абстрагироваться, до x*y, до считывания примеров из файлов, до создания грамматик и т.д. Расширять можно бесконечно. Самое простое решение — print 2*2. Всё, что сверху — это overengineering.
Нет, не напрашивается. Напрашивается аккуратное отношение к граничным условиям. А если понимать условие буквально и заставлять дурака расшибать лоб, то при M=N=1e10 вам надо будет делать большой кластер и запускать какой-нибудь двумерный map-reduce. Очевидно, что задача не про это.
Использование клеточного автомата — хорошее решение. В комментах выше есть сомнения, что оно решает задачу полностью, но даже если решает, это алгоритмический трюк. Обычное решение, по моему мнению, чтобы было простым, должно использовать класс волны.
Если он заложил лишние абстракции в тех местах, где они понадобились, это хороший архитектор. Если где попало, то плохой. Писать тестовое задание из топика с потоками — это просто программист жонглировал потоками без всякого конкретного смысла.
Количество минусов у моего коммента наглядно демонстрирует, что вред от оверинжиниринга понимают далеко не все.
Если в спецификации не сказано, что вы должны выжать максимум производительности, не надо этого делать. Если не сказано, что надо использовать минимум памяти, то не выжимать байты. Если не сказано, что вы должны учитывать риск случайной порчи битов памяти, значит не надо этого делать. Требования могут задаваться и неявно. Если вы знаете, что делаете высоконагруженный проект, или что у вас матрица может быть 1000000x1000000, или что решение надо отобразить в Full Screen с 60 FPS, то да — делаете какие-то оптимизации. Пока это не требуется условием задачи, вы пишете самую простую реализацию, достаточную, чтобы решить задачу.
Свободная переменная, по которой необходимо оптимизировать по умолчанию — это читаемость и поддерживаемость кода. Это всегда напрямую влияет на надёжность кода и на качество продукта.
И при этом заложил мину замедленного действия в виде сложного кода, который потом кто-то будет поддерживать и дорабатывать. Например, вы уверены, что любой джуниор сможет изменить алгоритм и при этом не накосячить с многопоточными блокировками? Или это значит, что код этого разработчика смогут поддерживать только программисты его же уровня? Дорого, блин.
Есть ли смысл тратить время на оптимизацию, потенциально добавляя багов в реализацию, если для решения задачи достаточно и неоптимального решения? Это называется premature optimization. Она, как известно, the root of all evil.
Спасибо за статью. Люблю, когда мысли ясно и красиво изложены.
Когда меня посещают такие мысли, я рисую в голове утопично-коммунистическую картинку того, каким должен быть идеальный мир: единое государство без внутренних границ, единый язык, все современные свободы, автоматизация всех процессов управления обществом, свобода доступа ко всей информации человечества (кроме, пожалуй, личной зоны каждого человека и семьи — и то, в силу традиций), возможность заниматься только любимым делом, возможность не заниматься никаким делом, автоматическая добыча и переработка ресурсов для жизнеобеспечения людей. То есть люди, кто хочет развивать мир, делают это. Кто не хочет, не надо их заставлять — пусть живут себе и не отсвечивают.
В принципе, ничего теоретически недостижимого в этом перечне нет. С каждым этапом развития человечества затраты на жизнеобеспечение неуклонно снижаются. Сначала это было разделение труда, затем автоматизация сельского хозяйства, строительства, добычи ресурсов. В статье правильно отмечен тренд 3D-печати. Это революция, которая уже скоро снизит стоимость средств производства до нуля. Останется найти источник дешёвой энергии и развить кибернетику до уровня, когда постройка и эксплуатация ферм и систем жизнеобеспечения сможет быть полностью автоматической, и всё. Это не так уж нереалистично, если смотреть с технологической точки зрения.
Но проблема в том, что эти идеалистические прогнозы исходят из ложного предположения, что все люди будут вести себя так, как задумано. У людей есть множество пороков — стремление к власти, животная агрессия, постановка личных интересов выше общественных, нонконформизм наконец. Управлять людьми куда сложнее, чем техникой.
В самом деле, будущее уже действительно пришло, а войны всё продолжаются. Люди до сих пор расправляются друг с другом, отбирают друг у друга ресурсы. Уже сейчас еды, жилья и энергии на планете хватит на всех. Сейчас есть возможность не грызться с соседом, а заняться чем-то по-настоящему прикольным. Сейчас можно заниматься таким невероятным количеством интересных вещей, что уснуть тяжело, а потом через 5 часов подскакиваешь с постели отдохнувшим в предвкушении нового интересного дня. А большинство людей на Земле до сих пор предпочитает смотреть в телевизор по вечерам, ходить на отупляющую работу, тусоваться по магазинам и выпивать по пятницам.
Даже правители (я верю, что в большинстве своём это люди, обладающие достаточным IQ) больше озабочены спорами, кто кому больше денег за газ должен, и кто кому оружие будет поставлять, чем направлением человечества в сторону общего благополучия. Расходы на образование 0.9% бюждета — это нормально? Про науку я вообще молчу.
Построить коммунизм в отдельно взятой стране тоже уже пытались. Человеческий менталитет на корню загубил всю идею. В общем, я не был бы столь оптимистичен. По крайней мере, время глобальных преобразований ещё не пришло. Но в остальном — полностью согласен с автором. Начать с себя — понять, в каком мире хочешь жить, и действовать.
Заметьте, что вам ставят минусы, но вы не теряете при этом право голоса. За то, что вы пришли выступить на Хабре, а не отсиживаться в кабинете, уже спасибо. Не принимайте минусы близко к сердцу. И я понимаю, что вы занимаетесь только технической стороной вопроса, и за решения законодателей отвечать не можете. Но я уверен, что хотя бы попробовать убедить их в абсурдности такого подхода к решению проблем детской наркомании вы можете. Может к вашему мнению прислушаются.
Теперь конструктивно. Понятно, что есть неутешительная статистика по наркотикам. Но ведь причина этого — не в сайтах. Проблема в том, что поколение детей заброшено родителями. И если повлиять на родителей сложно (хотя именно они и ответственны за то, что с их детьми происходит), возможное решение может лежать в плоскости реформы образования. Дети должны с удовольствием идти в школу. Им там должно быть интереснее, чем постоять в подъезде пивка попить и чего-нибудь попробовать. Понятно, что добиться этого сложно, надо менять многие устои образовательной системы (позволить изучать только то, что интересно, не заставлять заучивать всю программу по всем предметам), но это хотя бы попытка лечить болезнь. А отключать сайты — это борьба с симптомами.
Проблема с «чёрным списком» (уж извините, я его так называть буду) — что даже если бы были на 100% достоверные данные, что это спасёт страну от наркомании, де-факто у нас появились люди, которым даровано право решать, о чём можно говорить, а о чём нет. Пока эти люди честны и благородны, проблемы нет. Но вы много таких людей знаете? Кто будет контролировать контролёров?
Придираться к тактам процессора и отрисовке — это особенности конкретного задания. Я не берусь говорить, прав был работодатель или нет, что придирался в том конкретном задании. Это нужно конкретный случай смотреть.
Это не типичнейшая проблема заданий. Если в задании сказано «посчитать 2*2», не надо додумывать за автора условия и абстрагироваться, до x*y, до считывания примеров из файлов, до создания грамматик и т.д. Расширять можно бесконечно. Самое простое решение — print 2*2. Всё, что сверху — это overengineering.
Если в спецификации не сказано, что вы должны выжать максимум производительности, не надо этого делать. Если не сказано, что надо использовать минимум памяти, то не выжимать байты. Если не сказано, что вы должны учитывать риск случайной порчи битов памяти, значит не надо этого делать. Требования могут задаваться и неявно. Если вы знаете, что делаете высоконагруженный проект, или что у вас матрица может быть 1000000x1000000, или что решение надо отобразить в Full Screen с 60 FPS, то да — делаете какие-то оптимизации. Пока это не требуется условием задачи, вы пишете самую простую реализацию, достаточную, чтобы решить задачу.
Свободная переменная, по которой необходимо оптимизировать по умолчанию — это читаемость и поддерживаемость кода. Это всегда напрямую влияет на надёжность кода и на качество продукта.
Когда меня посещают такие мысли, я рисую в голове утопично-коммунистическую картинку того, каким должен быть идеальный мир: единое государство без внутренних границ, единый язык, все современные свободы, автоматизация всех процессов управления обществом, свобода доступа ко всей информации человечества (кроме, пожалуй, личной зоны каждого человека и семьи — и то, в силу традиций), возможность заниматься только любимым делом, возможность не заниматься никаким делом, автоматическая добыча и переработка ресурсов для жизнеобеспечения людей. То есть люди, кто хочет развивать мир, делают это. Кто не хочет, не надо их заставлять — пусть живут себе и не отсвечивают.
В принципе, ничего теоретически недостижимого в этом перечне нет. С каждым этапом развития человечества затраты на жизнеобеспечение неуклонно снижаются. Сначала это было разделение труда, затем автоматизация сельского хозяйства, строительства, добычи ресурсов. В статье правильно отмечен тренд 3D-печати. Это революция, которая уже скоро снизит стоимость средств производства до нуля. Останется найти источник дешёвой энергии и развить кибернетику до уровня, когда постройка и эксплуатация ферм и систем жизнеобеспечения сможет быть полностью автоматической, и всё. Это не так уж нереалистично, если смотреть с технологической точки зрения.
Но проблема в том, что эти идеалистические прогнозы исходят из ложного предположения, что все люди будут вести себя так, как задумано. У людей есть множество пороков — стремление к власти, животная агрессия, постановка личных интересов выше общественных, нонконформизм наконец. Управлять людьми куда сложнее, чем техникой.
В самом деле, будущее уже действительно пришло, а войны всё продолжаются. Люди до сих пор расправляются друг с другом, отбирают друг у друга ресурсы. Уже сейчас еды, жилья и энергии на планете хватит на всех. Сейчас есть возможность не грызться с соседом, а заняться чем-то по-настоящему прикольным. Сейчас можно заниматься таким невероятным количеством интересных вещей, что уснуть тяжело, а потом через 5 часов подскакиваешь с постели отдохнувшим в предвкушении нового интересного дня. А большинство людей на Земле до сих пор предпочитает смотреть в телевизор по вечерам, ходить на отупляющую работу, тусоваться по магазинам и выпивать по пятницам.
Даже правители (я верю, что в большинстве своём это люди, обладающие достаточным IQ) больше озабочены спорами, кто кому больше денег за газ должен, и кто кому оружие будет поставлять, чем направлением человечества в сторону общего благополучия. Расходы на образование 0.9% бюждета — это нормально? Про науку я вообще молчу.
Построить коммунизм в отдельно взятой стране тоже уже пытались. Человеческий менталитет на корню загубил всю идею. В общем, я не был бы столь оптимистичен. По крайней мере, время глобальных преобразований ещё не пришло. Но в остальном — полностью согласен с автором. Начать с себя — понять, в каком мире хочешь жить, и действовать.
Теперь конструктивно. Понятно, что есть неутешительная статистика по наркотикам. Но ведь причина этого — не в сайтах. Проблема в том, что поколение детей заброшено родителями. И если повлиять на родителей сложно (хотя именно они и ответственны за то, что с их детьми происходит), возможное решение может лежать в плоскости реформы образования. Дети должны с удовольствием идти в школу. Им там должно быть интереснее, чем постоять в подъезде пивка попить и чего-нибудь попробовать. Понятно, что добиться этого сложно, надо менять многие устои образовательной системы (позволить изучать только то, что интересно, не заставлять заучивать всю программу по всем предметам), но это хотя бы попытка лечить болезнь. А отключать сайты — это борьба с симптомами.
Проблема с «чёрным списком» (уж извините, я его так называть буду) — что даже если бы были на 100% достоверные данные, что это спасёт страну от наркомании, де-факто у нас появились люди, которым даровано право решать, о чём можно говорить, а о чём нет. Пока эти люди честны и благородны, проблемы нет. Но вы много таких людей знаете? Кто будет контролировать контролёров?
Пакет C тоже зависит от пакета B, но версии 2.