Как управлять случайное сложности в программных проектах

Когда Мюррей Гелл-Манна спросили, как Ричард Фейнман удалось решить так много проблем Гелл-Манн ответил, что Фейнман был такой алгоритм:

  1. Запишите проблему.
  2. Думаю, очень трудно.
  3. Запишите решение.

Гелл-Манн пытался объяснить, что Фейнман был другой вид решает проблемы и не было выводы полученные из изучения его методов. Я чувствую то же самое о управление сложностью в средних/крупных программных проектов. Люди, которые хороши просто по своей природе добры и каким-то образом умудряются слой и укладывают различных абстракций, чтобы сделать все управляемым без внедрения каких-либо посторонних хлама.

Поэтому алгоритм Фейнмана единственный способ управлять случайное сложности или есть фактические методы, которые разработчики программного обеспечения могут последовательно применять приручить случайное сложности?

Комментарии к вопросу (14)
Решение

когда вы видите хороший ход, поищите получше.<БР/> —не Эмануила Ласкера, 27-летнему чемпиону мира по шахматам

По моему опыту, самый большой водитель случайное сложность программистов придерживаться первого варианта, просто потому что это происходит на работе. Это то, что мы можем узнать из нашего английского состава. Они строят во времени, чтобы пройти несколько законопроектов для их заданий, включающих обратную связь учителю. Уроки по программированию, почему, Дон'т.

Есть книги, полные конкретные и объективные возможности осознавать, формулировать и исправить неоптимальный код: Код, эффективно работать с унаследованным кодом, и многие другие. Многие программисты знакомы с этими методами, но Дон'т всегда взять время, чтобы их применить. Они вполне способны уменьшить случайное сложности, они просто не'т сделали это привычкой, чтобы попробовать.

Часть проблемы заключается в мы не'т часто вижу промежуточными сложности других людей's код, если он прошел рецензирование на ранней стадии. Чистый код выглядит, как это было легко писать, когда на самом деле это, как правило, включает в себя несколько проектов. Вы пишите лучший способ, который приходит в голову сначала, обратите внимание лишних сложностей, он вводит, потом "искать лучше двигаться" и рефакторинг, чтобы удалить эти сложности. Затем вы держите на "ищет лучше перейти на" пока вы не можете найти один.

Однако, вы не'т поставить код на проверку, пока все, маслобойки, так что внешне это выглядит как это может быть Фейнмана-как процесс. У вас есть тенденция думать, что вы можете'т сделать это все в один кусок, так что вы Дон'т пытайтесь, но правда автор этой удивительно простой код вы только что прочитали, как правило, может'т писать все в один кусок, как что либо, или если они могут, это's только потому, что у них есть опыт написание подобного кода много раз, и теперь можете видеть рисунок, без промежуточных этапов. В любом случае, вы можете'т избежать сквозняков.

Комментарии (3)

на "архитектура программного обеспечения навык не может быть учили" это широко распространенное заблуждение.

Это легко понять, почему многие люди верят (те, кто хорошо его хотят верить, что они'вновь мистически специальные, и те, кто не'т хочется верить, что это's не их вина, что они'вновь не'т.) Тем не менее, не так; навык просто немного больше практики интенсивно, чем другие навыки программного обеспечения (например, понимание циклов, работа с указателями и т. д.)

Я твердо верю, что построение больших систем подвержена повторяется практика и опыт таким же образом, что стать великим музыкантом или общественным диктором-это: минимальное количество талантов является необходимым условием, но это's не удручающе огромный минимум, который находится вне досягаемости большинства практиков.

Решении сложных вопросов-это навык, который вы приобретаете в основном пытались и проваливались несколько раз. Это's просто, что многие общие рекомендации, которые сообщество открыли для программирования в большом (использовать слои, бороться с дублированием где он поднимает свою голову, придерживаться религиозно 0/1/бесконечность...) не столь очевидно, правильная и нужная для начинающих, пока они на самом деле не то, что большой. Пока у тебя на самом деле укусила дублирования, которое вызывает проблемы через несколько месяцев спустя, вы просто не 'вам' важность таких принципов.

Комментарии (8)

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

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

когда специалисты делают свое дело, это кажется почти волшебным для всех нас—странные заклинания, понимание того, что, кажется, появляются из ниоткуда, и, казалось бы, сверхъестественную способность знать правильный ответ, когда остальные даже не все, что знаете о вопросе. Это не волшебство, конечно, но то, что эксперты воспринимают мир, как они проблему решают, ментальные модели они используют, и так далее, все заметно отличается от nonexperts.

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

Этот вопрос с места работы является актуальной и ИМХО было бы интересно читать в этом контексте.

Комментарии (6)

Ты не произнес это вслух, но “случайное сложность” определяется как сложность, которая не присуща проблема, по сравнению с “основным” сложности. Методы requireed по"приручить &quot и; будет зависеть от того, где вы начали. Нижеследующее относится в основном к системам, которые уже приобрели ненужные сложности.

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

На самом деле, алгоритм Фейнмана применяется к некоторой степени, но это не значит, что “подумали” означает только магии, которые не могут быть кодифицированы.

Я нахожу, что есть два подхода, которые должны быть приняты. Взять их обоих – они не являются альтернативами. Один-решать ее по частям и сделать серьезные переделки. Так, конечно, “запиши задачу”. Это может принять форму проверки системы код модулей, их состояние (запах, уровень автоматизированного тестирования, как многие сотрудники утверждают, чтобы понять это), общая архитектура (есть один, даже если это “проблемы”), государственных требований и т. д. и т. д.

Это природа “случайное” сложность в том, что нет ни одной проблемы, которую просто необходимо решать. Поэтому нужно сортировать. Где болит – с точки зрения способности поддерживать систему и прогресс в его развитии? Может быть, какой-то код действительно вонючий, но это не главный приоритет и крепления могут быть сделаны, чтобы ждать. С другой стороны, там может быть некоторый код, который будет быстро вернуть потраченные время рефакторинга.

Определить план за то, что будет лучше архитектура и попробовать, чтобы убедиться, что новой работы отвечает, что план – это поэтапный подход.

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

Крупных доработок не в “подумай” категории – вы должны получить это право. Это где-то "Фейнман и" (Ну, ничтожная доля будет хорошо) окупится чрезвычайно. Крупных доработок, которые не приводят в лучшем архитектура может быть катастрофой. Система полностью перезаписывает как известно, для этого.

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

Сказав Все это, главное для меня-это автоматизированное тестирование. Если у вас есть достаточно, ваша система находится под контролем. Если вы Don'т . . .

Комментарии (2)

и"Все должно быть сделано как можно более простым, но не проще.&и"<БР/> — не приписывается Альберту Эйнштейну

Дайте мне эскиз мой личный алгоритм общения со случайными сложности.

  1. Написать рассказ пользователя или вариант использования. Комментарий с владельцем продукта.
  2. Написать интеграционный тест, который не выполняется, так как функция не существует. Комментарий с ОК, или ведущий инженер, если есть такая вещь в вашей команде.
  3. Написание unit-тестов для некоторых классов, которые смогли пройти тест по интеграции.
  4. Написать минимальный внедрение для этих классов, который проходит модульные тесты.
  5. Обзор модульных тестов и реализации с коллегой-разработчиком. Перейдите к шагу 3.

Весь дизайн Magic будет на Шаг 3: Как вы настроили эти классы? Это оказывается один и тот же вопрос: как Вы себе представляете, что у вас есть решение для вашей проблемы До у вас есть решение вашей проблемы?

Примечательно, что просто мерещится, у вас есть решение кажется, одна из основных рекомендаций людей, которые пишут о решении проблем (называемый "желаемое за действительное" и по Абельсон и Сассман в Структура и интерпретация компьютерных программ и "обратных" в поля'ы как решить)

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

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

Комментарии (0)

Случайное Сложности

Оригинальный вопрос (перефразированный) был:

как архитекторы управлять случайное сложности в программных проектах?

Случайное сложность возникает, когда те, с руководством над проектом выбрать технологии, которые состоят из одной, и что общая стратегия проекта's первоначально архитекторы не намерены привнести в проект. По этой причине важно учитывать мотивы выбора в стратегии.

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

Избегая Ненужных Сложностей

Основываясь на теле вопрос, я бы перефразировал это так:

как архитекторы управление сложностью в проектах разработки программного обеспечения?

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

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

Я представляю вам, что это приходит к нему из-за его подготовки. У эксперта'ы гештальт требует знакомства с все ваши варианты, и дальновидность, чтобы обеспечить простое решение, которое позволяет предвидеть будущие потребности, которая определяется проектом должны предусматриваться, а также гибкость для адаптации к меняющимся потребностям проекта. Фейнман'ы на подготовку было, что он имел глубокое понимание различных подходов в теоретической и прикладной математике и физике. Он был по природе любопытен, и достаточно, чтобы осмыслить то, что он узнал о природном мире вокруг него яркий.

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

Построение решения

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

Вернуться к конкретным окончательные вопросы:

Специфические методы для укрощения случайное сложность может быть найдена по следующим видам источников.

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

Комментарии (2)

Это может быть сложный вопрос, несколько лет назад, но это Имо не сложно устранить случайное сложности.

Что Кент Becksaid о себе, в какой-то момент: "Я'м не великий программист, Я'м просто хороший программист с большим привычек&.и"

Две вещи заслуживают внимания, ИМО: он считает себя programmer, не архитектор, и его внимание на привычки, а не знания.

Фейнман'ы способ решения сложных задач-это единственный способ сделать это. Описание Это'т должен очень легко понять, поэтому я'МР препарировать. Фейнман's голова не просто знания, это также умение применять эти знания. Когда у вас есть и знания и навыки, чтобы использовать его, решая нелегкую проблему-это ни тяжело, ни легко. Это'с единственным возможным исходом.

Там'ы совершенно немагическим способом писать чистый код, который не содержит случайное сложности, и это's в основном похоже на то, что Фейнман сделал: приобрести все необходимые знания, чтобы привыкнуть к положить его работать, а не просто иметь его припрятал в каком-нибудь уголке вашего мозга, а затем писать чистый код.

Сейчас многие программисты не'т даже осознавая все знания, необходимые, чтобы написать чистый код. Молодые программисты склонны отбросить знания об алгоритмах и структурах данных, и большинство пожилых программисты забывают это. Или Биг-О'нотации и анализа сложности. Старые программисты склонны отклонять моделей или пахнет кода - или даже не знаю, что они существуют. Большинство программистов любого поколения, даже если они знают о шаблонах, не помню точно, когда использовать и части водителей. Несколько программистов любого поколения постоянно оценивать свой код на твердые принципы. Многие программисты смесь всех возможных уровнях абстракции повсюду. Я'м не в курсе один паренек-программист, на данный момент, чтобы постоянно оценивать свой код на вонь описано Фаулер в своей книге рефакторинг. Хотя некоторые проекты используют инструментальные показатели, наиболее часто используемые метрики сложности того или иного рода, в то время как две другие метрики - соединение и сцепление - в значительной степени игнорируются, даже если они очень важны для чистого кода. Еще один аспект, почти все игнорирует-это когнитивную нагрузку. Несколько программистов лечить модульных тестов как документации, и еще меньше знают, что трудно написать или назвать юнит-тесты-это еще одна вонь код, что обычно свидетельствует о плохой факторинга. Ничтожное меньшинство осознает домен управляемая конструкция'ы мантру, чтобы сохранить код модели и предметной области модель как близко друг к другу, насколько это возможно, поскольку расхождения обязаны создать проблемы на дороге. Все это нужно учитывать, все время, если вы хотите, чтобы ваш код чистым. И многое другое, что я могу'т помню сейчас.

Вы хотите писать чистый код? Там's никакой магии не требуется. Просто пойти узнать все, что's требовало, затем используйте его, чтобы оценить ваш код'чистота, и рефакторинг, пока вы'вновь счастливым. И продолжать учиться - программное обеспечение еще молодая область, и новые идеи и знания приобретаются в быстром темпе.

Комментарии (0)