Pull to refresh
-22
0
Мурадов Артем @tym32167

Программист

Send message
Карты с магнитной лентой хотя бы можно использовать не вводя пинкод. Покупаю недавно лекарства в аптеке. Продавщица берет карту с чипом, протягивает мне аппарат для ввода пинкода и отворачивается. Отлично, она мой пинкод не видела, а вот пять человек в очереди за мной…
Ещё был прикол, там в файлах-сохранялках можно было найти имя солдата и изменить. Только нужно было, чтобы в итоге количество символов не изменилось. Мы так и делали, пока не открыли для себя, что можно было просто мышкой на имени солдата щелкнуть и изменить :)
Да, я начинал с пистолетов, пока количество денег не хватало на лазерный танк. Помню, что они по деньгам самые выгодные были (произвести вроде 6 тыр, а продать — 36). Но вот по времени производства, затрачиваемым ресурсам и количеству доступного склада вроде танки были самые выгодные. Боюсь ошибаться, подробностей просто не помню, столько лет прошло :)
Там, кстати, баг был не только в характеристиках, но и в деньгах. Помнится, занимался продажей лазерных танков — производство обходилось дешевле продажи раза в 2. Так вот после определенного порога деньги уходили в глубокий минус. Переполнение целого. А рекорды ставили не только за минимальный срок, но и с минимумом потерь (или вообще без потерь)
1. Вся логика отрисовки поля находится в одном классе, в 2х функциях. Согласен, что можно написать проще. Можно даже написать проще, используя ООП. Но говорить, что этот код сложный я бы не стал. Что профессиональный программист не разберется в 5ти класах, решающих задачу, которую он сам и придумал — тоже вопрос. Учитывая, что какие то вообще вычисления происходят только в одном методе. В общем, пункт этот спорный.
2. Автору было все равно, как реализуется задача. К тому же, MVVM отделяет логику от представления. То есть просматривать задачу должно быть проще, чем если бы я использовал тот же GDI, или консоль. На самом деле, код не будет досконально понятен человеку, который не знает C#. Так что этот пункт также надуманный. В крайнем случае можно обратиться к автору и спросить, поймет он что написано в моем коде или нет.
3. От WPF там только это:
— Разметка формы и приложения
— Классы страницы и приложения
— Конвертер.
Рефлексия используется, да. Косвенно. В одном аттрибуте, в одной строчке одного класса, в котором и логики то нет. Команды с WPF нет так сильно связаны. Это больше архитектурный приём.
Но, я согласен с Вами, что можно было бы и без этого обойтись. Но, если Вы будете выводить в консоль, то Вам придется писать код для консоли, верно? Или код для битмапа и его рендера? Просто, я сделал это красиво (цветные квадратики и все такое :)), а Вы можете сделать понятно. Вот и вся разница.
4. Я просто не понял, о чем речь. В моем коде просто при изменении цвета ячейки перерисовывается эта ячейка. Для этого я использую стандартный интерфейс. Потому не совсем понял, что именно Вы имеете ввиду.
5. Ну, я вообще в грудь себя не бью. Вся информация, что я даю, есть в википедии и МСДНе. И, я рад, что Вы заметили прямое обращение к контролам в коде формы, Вы верно подметили, я это сделал, чтобы было проще понять суть и не отвлекаться на ненужные вещи. Никаких дополнительных абстракций я не делал. Мало того, основная моя деятельность связана с вебом, и WPF я сам знаю постольку-поскольку.

Я ни разу не называл свой код каноническим. Я даже писал, что его можно улучшить. Всё, что я хотел показать — это допустимое решение. Рад, что мы с Вами в этом согласны.

Теперь по поводу Вашего решения. Я тоже использую матрицу. А волны я храню отдельно только ради скорости работы. Сдвиг столбцов матрицы отлично подходит, когда скорость у всех волн одинаковая и не превышает количество столбцов. Тут я с Вами абсолютно согласен.
По поводу клеточного автомата. Я просто не понял, как это решит задачу, если скорость у всех волн будет больше единицы и разная. Окей, пусть будет одинаковая. Равная 2. И проверять нужно уже не 4 клетки, а больше (на бумажке это выглядит как 12 клеток, но могу ошибаться). И чем больше скорость волны, тем больше клеток надо проверять. А теперь возьмем скорость волны 0,99 от ширины матрицы. А Сколько клеток нужно проверить? (я думаю, где то (2P+1)(2P+1)*0.5, где P — скорость волны) Какова сложность этого алгоритма? Что то около O(M*N*P*P). Минималистичнее? Да. Проще? Да. Оптимальнее? Не думаю. Ещё возьмем скорость волны 1,5 от ширины матрицы. Как этот вариант отработает в клеточном автомате? Я, право, немного сомневаюсь в корректности такого решения. Конечно, это можно проверить только на практике.

«Это не god object, а структурным/процедурным программированием вообще-то называется.» Да, это я зря написал :)

Как бы там ни было, не думайте, что я какой то ярый фанат этих паттернов и ООП, или чего то другого. Это все равно, что сказать, что я фанат гвоздей или молотка. Всё это лишь инструменты для постоения программы. Я хотел построить программу с использованием ООП. Я это и сделал. Я написал именно так, как если бы я был соискателем. И если работодатель скажет мне потом, что их программист не разобрался в 5 классах, или не понял суть MVVM, или ещё чт то вроде того — то я скажу, что пусть его увольняют и берут меня.

Ещё как лирическое отступление. Год назад я устраивался на работу. Java программистом. Я Java не знал вообще. Мне дали тестовое задание и неделю времени. Задание состояло в написании клиент-серверного приложения и синхронизации, когда один сервер и много клиентов. Интерфейс консольный. Я всё сделал в стиле ООП, разбил на классы, закрыл что нужно интерфейсами, использовал паттерны, SOLID и много чего ещё (у меня было достаточно времени). Знаете, что мне сказал программист, который это проверял (и он же мой будущий начальник)? Что ему понравилось, как я применил ООП в решении. И я думаю, что это было одним из решающих факторов, по которым меня приняли на работу.

Ещё один пример. Года 3 назад мне дали тестовое задание — реализовать калькулятор выражений. Пользователь вводит выражение в консоль — и получает результат. Можно было вводить числа, скобки и простые операции, типа +-*/. Но было два условия.
— Чтобы добавление нового функционала занимало минимум времени и сил программиста
— Чтобы можно было легко изменить логику работы любой операции. Сделать плюс минусом, к примеру.
Я также решил все с использованием ООП. А работодатель, поглядев результат, сказал, что не хватает IoC, логирования и учета культуры.

Резюмируя, хочу сказать, что в тестовом задании главное не просто решить задачу, а показать работодателю, что ты обладаешь какими то ещё способностями. Главное — не переусердствовать. И пусть наши прения закончятся на том, что мое решение — допустимо. Также допустимо, как и Ваши с выводом в консоль или битмап. И везде есть свои плюсы и минусы.
У меня сложилось впечатление, что вы судите мой код, хотя сами в него и не заглядывали. Ок, давайте говорить предметно. Во первых, утверждение, что WPF и MVVM создавались для индустриальных нужд — весьма спорное утверждение. Как минимум потому, что
1. MVVM это не технология, это патерн. Он может использоваться не только в WPF, а везде, где есть возможность двустороннего связывания данных. Я его использую, чтобы вручную не перерисовывать UI. Потому что так проще, и быстрее. Благодаря грамотному использованию этого паттерна, мне не нужно перерисовывать каждый раз все поле, обновляются только измененные ячейки. И чтобы этого достичь, от меня практически ничего не потребовалось. По моему, это упрощает решение, а не усложняет.
2. Вы говорите, что преимущества WPF не используются в данном примере. А какие основные преимущества WPF?
— Поддержка MVVM из коробки, что, как я уже писал, упрощает решение
— Аппаратный рендеринг, что ускоряет работу с графикой, по сравнению, например, с GDI или GDI+
— Декларативная разметка интерфейса. Что означает, что я не написал ни строчки кода, чтобы вывести меню, контролы и ячейки. Это тоже упрощает решение.
В моем приложении 7 классов. И 5 из них связаны с решением задачи. От остальных двух никуда не деться. Да, я мог бы те 5 классов сделать и в одном. Но был бы он в 5 раз больше, работал бы медленне, был бы сложен для понимания и изменения. И нарушил бы кучу ООП принципов. Вы думаете, это надо показывать работодателю? Я так не думаю.
Теперь про антипаттерны. Как известно, они представляют из себя плохое решение проблемы, которое в будущем, при развитии системы, может стать источником ещё больших проблем. Не смотря на то, что тестовое задание навряд ли будет развиваться в нечто большее (хотя у меня такое было), Вы должны со мной согласться, что применение антипаттернов в коде крайне нежелательно. Ещё, раз Вы «свой», то знаете, что в C# любая программа содержит, как минимум, хотя бы 1 класс. Поскольку в задаче нам нужно производить, как минимум, 3 действия (хранение состояния, отображение в UI и логику), то поместив всё это в один класс, мы получим классический антипаттерн GOD object.
Таким образом, я считаю, что
— применение ООП задачу упрощает и делает более гибкой к изменениям
— применение MVVM позволяет писать меньше кода и больше фокусироваться на решении задачи
— применение WPF позволяет ускорить время разработки и скорость работы программы
Да, я видел, что многие решают эту задачу на javascript. И, хотя я не видел тут решения с волнами разной скорости (кроме моего), весь этот javascript вполне себе работает. Но если взглянуть на код этих решений, то везде есть изъяны. Какие-то тянут с собой дополнительные скрипты. Некоторые даже не обернуты в анонимную функцию и представляют собой просто смесь глобальных переменных и функций. Представьте, что Вы нанимаете javascript программиста. Если задача будет решена, но архитектура совсем никакая, то вы доверите ему самому принимать решения при разработе вашего веб проекта?
В дополнение, помимо критики, я прошу Вас предложить своё решение задачи или ещё лучше реализацию.
Мне показалось, что автор негативно отнесся к применению ООП в решении задачи. Я применил ООП и паттерны, решил задачу, и спросил, отчего ООП — это плохо. Автор ответил на мой вопрос. То есть MVVM и ООП я использовал именно для того, чтобы показать, что задача вполне себе спокойно решается и с ними. Сам я могу решить задачу и без ООП, и на Javascript, хоть на C++. Выбранный метод решения просто был в контексте вопроса.
Не понял сути Вашего комментария. А если бы на HTML+CSS+Javascript написал, было бы HTML+CSS+Javascript головного мозга? У нас 100500 вариантов, как решить задачу и чем пользоваться при этом. Если WPF решает задачу, почему нет?
Даешь граф ячеек ICell, соединенных связями IRelation, чтобы пускать по ним IWave! :)
Я, если честно, не сильно понял, чем ООП это плохо. Потратил пару часов, набросал программу на WPF + MVVM, с командами и всем прочими ООПэшными вещами. Исходник кинул на яндекс диск. У меня ООП головного мозга?
По сути вся логика сводится к тому, чтобы определить цвет ячейки в любой момент времени.
1. Для варианта с постоянной скоростью волн, достаточно найти ближайшую волну, которая «накрывает» ячейку. Но это для первых V столбцов, где V-скорость волн. Для остальных столбцов можно тупо брать значения предыдущих ячеек в этой же строке. То есть для ячейки Cell[I][J] можно взять цвет ячейки Cell[I][J-V]
2. Если у каждой волны своя скорость, то нужно искать последнюю добавленную волну, которая накрывает ячейку. Она необязательно самая близкая.
Время работы алгоритма, как в первом, так и во втором случае, будет примерно O(M*N*P), где P — количество активных волн. Ну, это в худшем случае. Если понапрягать мозг, то я думаю, можно найти решение и побыстрее.
1. Тест у вас какой то странный. Сравнение результата неустойчивой сортировки с компаратором, который в данных условиях возвращает всегда 0. Конечно, тест когда то, да должен упасть.
2. Я думаю, что в МСДНе имелось ввиду, что метод внутри, кроме всего прочего, использует быструю сортировку как основной метод сортировки. Это предостережение скорее всего связано с неустойчивостью метода. К тому же, судя по коду, в асмиптотике количество сравнений должно сходиться. Я не спец по алгоритмам, но вот что натестил.
кол-во элементов / 4 фремворк / 4.5 фреймворк / отношение кол-ва сравнений 4 и 4.5 фреймворков
1000000 / 20715517 /16898758 / 0,815753621
10000000 / 248621693 / 208306444 / 0,837845007
100000000 / 2737859069 / 2388941074 / 0,872558088
3. Я тоже писал реализации быстрой сортировки, сортировки слиянием, и много других сортировок, но на рандомных данных мои реализации по времени уступали Array.Sort. Возможно, это связано с данными оптимизациями, которые в Вашем конкретном случае, выдают большое количество сравнений.

За что мне минусы то? Я ж не просто так спросил, я и погуглил, и на википедию зашел, не понял почему эти видеоролики назвали скринкастами, спросил и получил ответ.
А причем тут скринкаст? Я думал, скринкаст — это просто запись с рабочего стола, нет?
а значит, что быть честным или нет — вопрос только совести. Как оно потом обернется, что получишь в итоге — нельзя предсказать. У тебя не будет свободы и всего такого только потому, что ты хороший. А может и будет. А может, ты подставишь кого то крупно и тебе повезет, получишь много профита, денег, власти и никакая совесть мучить не будет.
Ты добрый, открытый, трудолюбивый программист. Работаешь в команде. Работаешь лучше всех. Попросил повысить должность. Стал тимлидом (или менеджером). Коллеги стали завидвать (ведь, если он лучше, значит, ты хуже), перестали общаться и шушукаются между собой. И им не важно, был ты открытый с ними или закрытый, уважал ты их или нет. Станешь спорить с ними о реализации какой либо фичи — будут тебя переубеждать, ибо им не комфортно думать, что ты умнее\сообразительнее, им больше по душе думать, что они умнее тебя, что они лучше знают, как и что надо делать, а ты выбился наверх только потому, что повезло. В итоге — не важно, как ты себя вел с ними, они все равно убеждены, что их подсидели, что ты выбился нечестным путем и каждый был бы рад заложить тебя боссу, даже если он не прав, его коллеги поддержут, а несведущий в программировании босс поверит большинству. Думаешь, что раз ты умнее, то ты сможешь обосновать свою точку зрения и переубедить коллег по любому вопросу? Как бы не так. Тебе будут доказывать, что паттерны — зло, что море зависимостей в коде — к добру, что статические переменные спасут мир, да какого бреда только не услышишь! И не мудрено, что они друг с другом соглашаются, они ведь не читали банду четырех, они не знают кто такой Мартин Фаулер! А проект? А он и так будет написан. Ну не за год, так за 5 лет, но будет. Почему сроки срываются? Ну, так ошибок в коде много, да и ты всех достал со своими митингами и ликбезами. Ты отвлекаешь программистов от дела, ты и виноват. И что теперь делать? Пойти и сказать боссу, что твои бывшие коллеги никуда не годятся? И что дальше? Всех уволить? А где ещё взять кадров в таких условиях нехватки программистов? Так что босс отказывает таких репрессиях, но секретарша слышала, как ты говорил о коллегах, а значит, слышала вся контора — держи новую волну негодования и ненависти. И вот однажды босс вызывает тебя на ковер. Он показывает пухлую пачку жалоб на тебя от коллег, говорит о работе командой и командном духе, назначает нового человека на твое место и дает тебе 2 недели, чтобы собрать вещи. Проблем с поиском новой работы то и не было, ты же честный, свободный и умный. Ты успешно прошел все собеседования в новую компанию. Но, так как рекомендаций с прошлой работы у тебя не оказалось, тебя снова взяли простым программистом. Ты знакомишься с новыми коллегами и понимаешь, что тут у тебя есть также перспективы карьерного роста…
Интересно, а если на странице будет много некешируемой информации (логин юзера, корзина, последние статьи/форумы/комментарии), и для каждого такого контрола делать ajax запрос на сервер, это будет быстрее, чем просто за раз все собрать на сервере (вместе с кешируемым контентом) и вернуть одной страницей? Думаю, тут надо в каждом случае делать тесты и выбирать один из вариантов.
Я специально не слежу за вашими новинками, я просто люблю читать хорошие книги :)
Кстати, а почему тогда везде, на сайте и в книге, для «Сила CSS3» указан 2012 год?
На мой взгляд, по вебу есть книжки и поинтересней.
1. Изучаем jQuery мне понравилась гораздо больше, чем head first — тут тема раскрыта более полно, как мне кажется.
2. По html5 есть отличная книга Изучаем HTML5. Библиотека специалиста, ту, что Вы привели, к сожалению, не читал
3. По CSS есть вот такая Сила CSS3. Освой новейший стандарт веб-разработок!. Очень, очень полезная.
БОльшая часть книг будет полезна программистам и на других языках.

Information

Rating
Does not participate
Location
Toronto, Ontario, Канада
Date of birth
Registered
Activity