Перфекционизм может быть хорошим и плохим при программировании.
- Когда и где вы проводите черту, когда решаете проблемы?
- Когда вы решаете, когда решение является излишним, слишком общим или просто слишком футуристическим?
Пожалуйста, прокомментируйте, если вопрос неясен.
methodology
time-management
problem-solving
decisions
Амир Резаи
источник
источник
Ответы:
ПОЦЕЛУЙ и ЯГНИ , особенно ЯГНИ.
Только спроектируйте решение для вещей, которые, как вы знаете, скоро понадобятся. Не создавайте его для вещей, которые могут понадобиться через два года, потому что, скорее всего, вам понадобятся совершенно разные вещи, и вам все равно придется его переделывать.
В тот момент, когда вы начинаете говорить о «с этим дизайном в какой-то момент в будущем, мы могли бы сделать X или даже Y» вместо «этот дизайн позволяет нам выполнять требования клиента Z в следующем выпуске», вот когда вы получаете в архитектуру астрономии.
В ответ на комментарии:
источник
YAGNI
до сегодняшнего дня.Используйте итеративный подход, и эта проблема в основном исчезнет. Ваш код должен выполняться в первый день и почти каждый день после этого. Сначала соблюдайте минимальные требования и добавляйте больше, когда у вас есть время. Никогда не забывайте о больших изменениях, когда вы не можете запустить свой код в течение длительного времени.
источник
Решение является излишним, когда дополнительное время, затрачиваемое на его завершение, стоит больше, чем потенциальное негативное влияние с момента, когда более простое решение будет закончено, до того момента, когда оно будет в дальнейшем естественно обновлено / дополнено.
В основном вы торгуете временем сейчас со временем позже. Если вы проводите больше времени сейчас, вы сэкономите позже, вы делаете это неправильно. Если вы действительно разбираетесь в технике, вы тратите время сейчас, которое не влияет на то, сколько времени (или даже больше) вы тратите позже.
Вы становитесь лучше в работе с этим, тем больше у вас опыта. Наилучший способ сделать что-то (исходя из моего опыта) - это делать то, что вам нужно сейчас, но таким способом, который легче всего дополнить, если этого потребуют более поздние требования. Выяснить, как это сделать, довольно сложно.
источник
Раньше я был очень перфекционистом (тратил время на создание рамок, а не решений).
Но вещью, которая действительно помогла мне ускорить мое производство, было обучение и следование принципам BDD / TDD, в том числе и внешнему принципу (который мне особенно трудно было освоить).
Это действительно научило меня не писать ни одной строчки кода до того, как для него появится тест. Но модульных тестов также не существует до того, как для него существует приемочный тест. А приемочные испытания основаны на реальных потребностях пользователей.
Таким образом, все строки кода происходят из реальной потребности пользователя.
Если вы в принципе не знакомы с внешним миром, то он требует, чтобы вы начали писать тесты для самого внешнего уровня в вашем приложении (т. Е. С графическим интерфейсом практически во всех случаях), используя удвоение теста для имитации поведения нижних уровней. Тогда вы реализуете достаточно для прохождения тестов. Эта реализация верхнего уровня затем диктует тесты, которые нужно написать для следующего слоя и т. Д., Пока вы не достигнете нижнего уровня своего приложения.
источник
Я замечаю, что становлюсь лучше в этом опыте.
Когда я был (очень) молод, я всегда искал самое совершенное решение, без компромиссов. Теперь я лучше помню такие вещи, как бюджет и время.
источник
Сроки показывают эту черту довольно ясно.
источник
Мой босс на самом деле :)
Я должен признать, что мне становится лучше, но я все еще не очень много для компромисса. К счастью, у меня есть босс, чтобы обуздать меня;)
Я хотел бы поднять еще одну проблему, чем переобучение, хотя переобучение довольно легко обнаружить.
Моя главная проблема с рефакторингом. Проблема в том, что в большинстве случаев, хотя я пытался написать код настолько хорошо, насколько мог, я тогда не знал, что я знаю сейчас (видел больше кодов, больше шаблонов, новые идиомы, новые проблемы, новые растворы). И так, хотя это работает, теперь я знаю лучшие способы сделать это:
Тем не менее, он работает так, как есть, и поэтому рефакторинг не является приоритетом, и правда в том, что это надоедает мне; Я понимаю экономические причины и понимаю ожидания клиентов (они не видят код и предпочитают новые функции и исправления ошибок), но мне жаль, что у меня еще не было времени поработать над этим.
На данный момент я просто следую указаниям моего босса, но должен признать, что мне неловко, зная, что код, поставляемый в производство, - не лучшее, что я мог придумать сейчас. Перфекционизм, наверное.
источник
Как в профессиональном, так и в личном плане стандарт, который я пытаюсь применить к себе:
Будьте довольны победой.
Если мой код решает проблему, которую он должен решить, и не создает никаких новых проблем *, то, скорее всего, пора двигаться дальше. Когда вы научитесь устанавливать планку настолько высоко, насколько это необходимо, «достаточно хорошо» становится, ну, в общем, достаточно хорошо.
Совершенство подобно скорости света: вы никогда не достигнете этого, но нет предела энергии, которую вы можете потратить, пытаясь.
(* - Обратите внимание, что «ошибка» и «сложность в обслуживании» оба жестко подпадают под заголовок «Новые проблемы». Поэтому я не называю его завершенным до тех пор, пока код не будет протестирован, не обрезаны лишние биты и не комментарии / API документация обновлены.)
источник
Имея опыт, я понял, что перфекционизм невозможен, пока я не проработаю хотя бы несколько лет в каком-либо конкретном контексте (язык, структура, платформа, стандарт). Будучи новичком, будут все виды идиосинкразий, о которых вы не будете знать (экранирование, приоритет, зарезервированные слова, синтаксический сахар, тайм-ауты, асинхронные вызовы, недокументированные функции и ошибки), поэтому я просто пытаюсь найти хорошее решение, все учась как можно больше. Важно отметить, что я всегда стараюсь упростить рефакторинг результата - модульная архитектура, комментарии, где это необходимо, и никаких хитрых уловок .
источник
У меня, как и у многих других программистов, есть много устаревшего кода для поддержки. Соблазн повторить все это всегда будет, но я по сути сводил это к одному принципу:
Это обычно заботится о большом количестве кода спагетти в несколько более управляемом коде спагетти. Абстрагируйте некоторые куски, добавьте свои тесты, и теперь они не выглядят так сильно нуждающимися в совершенстве.
источник