Где вы проводите черту за свой перфекционизм? [закрыто]


37

Перфекционизм может быть хорошим и плохим при программировании.

  • Когда и где вы проводите черту, когда решаете проблемы?
  • Когда вы решаете, когда решение является излишним, слишком общим или просто слишком футуристическим?

Пожалуйста, прокомментируйте, если вопрос неясен.


7
Хороший вопрос - я всегда с этим борюсь.
Никто не

Ответы:


40

ПОЦЕЛУЙ и ЯГНИ , особенно ЯГНИ.

Только спроектируйте решение для вещей, которые, как вы знаете, скоро понадобятся. Не создавайте его для вещей, которые могут понадобиться через два года, потому что, скорее всего, вам понадобятся совершенно разные вещи, и вам все равно придется его переделывать.

В тот момент, когда вы начинаете говорить о «с этим дизайном в какой-то момент в будущем, мы могли бы сделать X или даже Y» вместо «этот дизайн позволяет нам выполнять требования клиента Z в следующем выпуске», вот когда вы получаете в архитектуру астрономии.

В ответ на комментарии:

  • KISS = Keep It Simple, Глупо = притворяться, что ты дебил и должен понимать дизайн
  • YAGNI = Тебе это не нужно = перестань притворяться, что ты можешь предсказать будущее в своем дизайне

5
+1 - достаточно сложно решить проблемы, которые мы знаем, у нас есть, и при этом не пытаться решать проблемы, которые, как мы думаем, могут возникнуть.
Джон Хопкинс

6
Мне это нравится, но четкое определение сокращений было бы полезно. Я никогда не слышал YAGNIдо сегодняшнего дня.
Филипп Реган

+1 за Филиппа, который сегодня чему-то научился! +1 за поцелуй.

Ну, ответ хороший. Хотя очевидно, что любой интерфейс (будь то постоянное хранилище (файлы), сеть или IPC) должен, по крайней мере, быть версионным, или вы знаете, что ваш редизайн сделает невозможным бэк-совместимость.
Дедупликатор

7

Используйте итеративный подход, и эта проблема в основном исчезнет. Ваш код должен выполняться в первый день и почти каждый день после этого. Сначала соблюдайте минимальные требования и добавляйте больше, когда у вас есть время. Никогда не забывайте о больших изменениях, когда вы не можете запустить свой код в течение длительного времени.


6

Решение является излишним, когда дополнительное время, затрачиваемое на его завершение, стоит больше, чем потенциальное негативное влияние с момента, когда более простое решение будет закончено, до того момента, когда оно будет в дальнейшем естественно обновлено / дополнено.

В основном вы торгуете временем сейчас со временем позже. Если вы проводите больше времени сейчас, вы сэкономите позже, вы делаете это неправильно. Если вы действительно разбираетесь в технике, вы тратите время сейчас, которое не влияет на то, сколько времени (или даже больше) вы тратите позже.

Вы становитесь лучше в работе с этим, тем больше у вас опыта. Наилучший способ сделать что-то (исходя из моего опыта) - это делать то, что вам нужно сейчас, но таким способом, который легче всего дополнить, если этого потребуют более поздние требования. Выяснить, как это сделать, довольно сложно.


6

Раньше я был очень перфекционистом (тратил время на создание рамок, а не решений).

Но вещью, которая действительно помогла мне ускорить мое производство, было обучение и следование принципам BDD / TDD, в том числе и внешнему принципу (который мне особенно трудно было освоить).

Это действительно научило меня не писать ни одной строчки кода до того, как для него появится тест. Но модульных тестов также не существует до того, как для него существует приемочный тест. А приемочные испытания основаны на реальных потребностях пользователей.

Таким образом, все строки кода происходят из реальной потребности пользователя.

Если вы в принципе не знакомы с внешним миром, то он требует, чтобы вы начали писать тесты для самого внешнего уровня в вашем приложении (т. Е. С графическим интерфейсом практически во всех случаях), используя удвоение теста для имитации поведения нижних уровней. Тогда вы реализуете достаточно для прохождения тестов. Эта реализация верхнего уровня затем диктует тесты, которые нужно написать для следующего слоя и т. Д., Пока вы не достигнете нижнего уровня своего приложения.


5

Я замечаю, что становлюсь лучше в этом опыте.

Когда я был (очень) молод, я всегда искал самое совершенное решение, без компромиссов. Теперь я лучше помню такие вещи, как бюджет и время.


1
+1 За опыт заставлю вас пойти на компромисс больше.
Амир Резаи

4

Сроки показывают эту черту довольно ясно.


1
Хороший вопрос, но плохое решение может потребовать больше времени для исправления в будущем.
Амир Резаи

Я думаю, что вы должны судить о том, что такое «достаточно хорошее» программное обеспечение. Линия должна быть определена спецификацией и вашим здравым смыслом.
Никто не

3

Мой босс на самом деле :)

Я должен признать, что мне становится лучше, но я все еще не очень много для компромисса. К счастью, у меня есть босс, чтобы обуздать меня;)

Я хотел бы поднять еще одну проблему, чем переобучение, хотя переобучение довольно легко обнаружить.

Моя главная проблема с рефакторингом. Проблема в том, что в большинстве случаев, хотя я пытался написать код настолько хорошо, насколько мог, я тогда не знал, что я знаю сейчас (видел больше кодов, больше шаблонов, новые идиомы, новые проблемы, новые растворы). И так, хотя это работает, теперь я знаю лучшие способы сделать это:

  • Способы, которые улучшат юзабилити и уменьшат вероятность получения ошибки в
  • Пути, которые уменьшают зависимости, улучшая время компиляции

Тем не менее, он работает так, как есть, и поэтому рефакторинг не является приоритетом, и правда в том, что это надоедает мне; Я понимаю экономические причины и понимаю ожидания клиентов (они не видят код и предпочитают новые функции и исправления ошибок), но мне жаль, что у меня еще не было времени поработать над этим.

На данный момент я просто следую указаниям моего босса, но должен признать, что мне неловко, зная, что код, поставляемый в производство, - не лучшее, что я мог придумать сейчас. Перфекционизм, наверное.


Я делюсь с вами нытьем. Я считаю, что программирование - это некое искусство, в котором нет совершенства.
Амир Резаи

2

Как в профессиональном, так и в личном плане стандарт, который я пытаюсь применить к себе:

Будьте довольны победой.

Если мой код решает проблему, которую он должен решить, и не создает никаких новых проблем *, то, скорее всего, пора двигаться дальше. Когда вы научитесь устанавливать планку настолько высоко, насколько это необходимо, «достаточно хорошо» становится, ну, в общем, достаточно хорошо.

Совершенство подобно скорости света: вы никогда не достигнете этого, но нет предела энергии, которую вы можете потратить, пытаясь.

(* - Обратите внимание, что «ошибка» и «сложность в обслуживании» оба жестко подпадают под заголовок «Новые проблемы». Поэтому я не называю его завершенным до тех пор, пока код не будет протестирован, не обрезаны лишние биты и не комментарии / API документация обновлены.)


0

Имея опыт, я понял, что перфекционизм невозможен, пока я не проработаю хотя бы несколько лет в каком-либо конкретном контексте (язык, структура, платформа, стандарт). Будучи новичком, будут все виды идиосинкразий, о которых вы не будете знать (экранирование, приоритет, зарезервированные слова, синтаксический сахар, тайм-ауты, асинхронные вызовы, недокументированные функции и ошибки), поэтому я просто пытаюсь найти хорошее решение, все учась как можно больше. Важно отметить, что я всегда стараюсь упростить рефакторинг результата - модульная архитектура, комментарии, где это необходимо, и никаких хитрых уловок .


Перфекционизм невозможен даже после МНОГО лет опыта; то есть, если вы когда-нибудь захотите на самом деле что-либо доставить. Самое ценное, чему учит опыт, - это когда узнаешь «достаточно хорошо».
Джефф Кнехт

0

У меня, как и у многих других программистов, есть много устаревшего кода для поддержки. Соблазн повторить все это всегда будет, но я по сути сводил это к одному принципу:

Я (или кто-то еще) собираюсь выяснить это снова ?

Это обычно заботится о большом количестве кода спагетти в несколько более управляемом коде спагетти. Абстрагируйте некоторые куски, добавьте свои тесты, и теперь они не выглядят так сильно нуждающимися в совершенстве.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.