Не становитесь программистом-теоретиком


28

Я нашел эту статью в нескольких сообщениях на SO. Я попадаю в 6-й архетип; «Теоретик».

Он определяет «Теоретика» как:

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

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

Даже работая над тем, что должно быть простым проектом, я склонен увязать в попытках перестроить все с нуля (это, вероятно, объясняет, почему я потратил около 2 лет, пытаясь создать операционную систему с нуля. Но даже я видел, что это было бессмысленно в конце концов).

Что может помочь мне избежать этого? И придерживаться принципов KISS?

Благодарность


3
Ну, тот факт, что вы признаете тенденцию, является хорошим началом!
Майкл К

13
Мне не нравится, как в статье переопределяются такие слова, как «теоретик» и «элегантный», что означает «плохой».
Рейн Хенрикс

2
Как только вы поймете, что самая интеллектуально сложная задача - написать действительно сложный, извилистый код, настолько простой и читабельный, насколько это возможно, вы преодолеете все остальные связанные проблемы.
SK-logic

15
Истинная элегантность определяется простотой. Если другие не могут понять код, то, возможно, он не такой элегантный, как вы думаете.
Берин Лорич

1
«Если вы поместите двух ковбоев Code в один и тот же проект, он гарантированно потерпит неудачу, поскольку они попирают изменения друг друга и стреляют друг другу в ноги». - это блестящий :)
P Швед

Ответы:


21

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

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


Да! Наличие другого программиста для противодействия теоретическим тенденциям работает очень хорошо.
Майкл К

Я пытался применить концепции Agile, чтобы работать как одинокий программист, и это работает довольно хорошо.
Боб Мерфи

10
  1. Иметь цели для того, что вы должны развивать.

  2. Сузьте эти цели до чего-то поставляемого в ближайшем будущем.

  3. Затем сфокусируйтесь на этих целях, исключив все остальные соображения. Без фона. Нет истории. Нет расширений. Ничего общего или абстрактного.

  4. Затем сузьте их дальше до минимума, который вы можете сделать, который будет результативным. Не хорошо. Не гибкий Не ремонтопригоден. Просто приемлемо.

  5. Затем расставьте приоритеты в абсолютном минимуме, необходимом для достижения минимума, который вы можете сделать. Суть в том, чтобы выбрать дату примерно через неделю и приблизиться к ней. Если вы не можете доставить что-то в течение недели. Ограниченный. Фокус. Отделка. Reduce.

  6. Тогда устраните пух. У тебя есть только неделя. Продолжай резать.

  7. Затем сфокусируйтесь на сокращенной реализации, которая будет сделана как можно раньше. В идеале меньше недели, поэтому у вас есть время на написание документации.


Я работал с теоретиками. Я считаю «дополнения» оправданием, чтобы не делать что-то, что может быть названо провалом.

Делать - и терпеть неудачу - сложно. Говорить о чем-то проще, чем что-то делать. Много исследований и размышлений - это способ избежать неправильных действий, а затем переработать их, узнав, что пользователи лгут.

Просто поместите код перед ними. Они назовут код неудачей. Бывает. Но в процессе неудачи вы узнаете, каковы реальные требования. И вы узнаете, что они лгали.


2
Вместо -1 (что было бы морально сомнительно для коллег-ответчика), позвольте мне сказать: (а) "Трудно ли?" В прошлом я старался изо всех сил писать ночные кодировки, чтобы закончить свои проекты пуповины, и некоторые из них (хотя, действительно, не все) фактически принесли пользу организациям, в которых я работал. Теоретики не (или, по крайней мере, не все) ленивые люди. (б) "Ничего общего или абстрактного?" В самом деле? Вы не сторонник абстракции в разработке программного обеспечения? Это кажется чертовски серьезным. (в) "Не подлежит ремонту?" ДЕЙСТВИТЕЛЬНО???
Jollymorphic

@Jollymorphic: Когда я сказал, что ленивый? Я делаю слишком тонкое различие между «Делать» и «Размышлять о Делании», которое может включать в себя кодирование ограниченной ценности. Вы подразумевали, что "теоретик" был плохой привычкой. Я защищаю "Абстракцию вообще нет" как способ избавиться от привычки. Я защищаю «Unmaintainable» как способ избавиться от привычки. То, что вы на самом деле делаете, это ваша проблема. Большинство людей, которые слишком много думают, продолжают много думать, перенаправлять и абстрагироваться, даже если они явно направлены не на это. Это привычка. Сломайте это, фактически делая активные шаги, чтобы сломать это.
S.Lott

1
Да, я воспринимал «делать так же тяжело», чтобы не иметь в виду «делать это тяжелая работа, а теоретики слишком ленивы, чтобы делать это», а скорее «делать это психологически сложно» - что безопаснее и удобнее бесконечно работать (тяжело!) Над что-то, чем на самом деле прибить его и закончить.
Carson63000

6

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

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

Чтобы обеспечить вашу продуктивность, потратив время на написание MVC-фреймворка в Эрланге (или что вы считаете интересным), вам, возможно, следует распределить время по своей эссотерической работе, скажем, по часу в день. Для остальной части дня просто сосредоточиться на тяжелой работе и сделать работу. Когда вы видите что-то интересное, что отвлекает вас, добавьте его в закладки или сделайте заметку, но двигайтесь дальше, а затем вернитесь к ней в выделенном временном интервале.

Лично у меня есть множество URL-адресов, они выглядят интересно, и куча библиотечных книг тоже. Я, возможно, получаю около 10% этих URL-адресов в конце и, возможно, читаю 50% книг в конце, но я все еще получаю работу дня.


5

У меня была эта проблема сама. Помогли две техники:

  1. Используйте технику Pomodoro или другую технику управления временем, где вы устанавливаете последовательность очень краткосрочных целей. Когда вам нужно выяснить, что вы можете сделать в течение следующих 25 минут, это поможет вам сосредоточиться на полезной работе.
  2. Разработка через тестирование. Если вам нужно написать конкретный тест, прежде чем писать какой-либо код, это сводит к минимуму мечтательность. (Невозможно написать тест для «элегантного».) После того, как вы что-то заработаете, вы можете потратить больше времени, чем на рефакторинг, но, по крайней мере, вы будете работать над реальным кодом, а не над воображаемым идеалом.

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


4

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

Кроме того, избегайте статей, подобных той, на которую вы ссылались. Вы действительно верите, что есть десять типов программистов? Или тот, кого вы знаете, полностью вписывается в одну из описанных категорий? Такие статьи имеют определенную привлекательность, потому что содержат немного правды - вы можете увидеть себя и / или некоторых из ваших коллег в некоторых стереотипах. Но категории содержат столько же воды, сколько астрологические знаки. Попробуйте это в следующий раз, когда будете в микшере после конференции: «Привет, я Ковбой по Кодам! Какой у вас тип?»

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


2

Существует одно простое руководство, которое при полной распаковке полностью объясняет, как избежать этого сценария.

Сделайте самое простое, что может сработать.

- Кент Бек


Или, как сказал Эйнштейн: «Сделай все как можно проще, но не проще».
Ян

Проблема в том, что для теоретика «простой» имеет много разных значений. Переписав ядро ​​ОС в Haskell с использованием монад, теоретик может оказаться предельным в «простоте».
Кристофер Джонсон

1

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

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


1

Просто :

  1. Будьте прагматичны .

Противоположная сторона Theorician (которая имеет свои преимущества в области информации / знаний в области программирования) - это Pragmatic.

Применять KISS, DRY, SOC и другие способы мышления, как описано в этом ответе , означает быть прагматичным.

Вы также можете научиться быть прагматичным, прочитав эту книгу:

http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&qid=1302893763&sr=8-1

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

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

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


0

Хм ... Возможно, возможно, попытаться получить работу в бизнесе, который требует от вас писать приложения в сроки. Я бы сказал для себя, что я, вероятно, настолько далеко от теоретика, насколько вы можете, по крайней мере, на работе. Выполнение этого вида работы имеет свое место и время и важно для развития себя. Однако, хотя я ценю такие способности, им нет места в мире бизнеса, особенно там, где я работаю. Быстро развивающаяся среда разработки, где вы пишете приложения несколько недель, а клиент хочет их вчера! Я был благословлен удивительными разработчиками, и потребовалось время, чтобы заставить всех работать в команде.

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


0

Нет ничего плохого в том, чтобы быть «теоретиком» в обычном смысле этого слова. Знание базовых знаний и способность понимать последние исследования в области КС - это отличная возможность, так как это золотая жила хороших и оригинальных идей.

«Настоящий вопрос» здесь более очевиден во второй половине поста. Знайте конкретную цель проекта и работайте для достижения этой цели, а не для достижения какой-либо другой цели. Это действительно просто вопрос самодисциплины в этом случае. Смотрите ответ С. Лотта, чтобы узнать больше об этом :).


0

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

Как этого добиться - другая история. Лучший способ - создать какой-то проект и пройти все этапы, чтобы запустить его в производство. После этого у вас будет другое мышление, чем раньше.


0

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

Поэтому я начинаю задавать вопросы и даже больше вопросов, пока не узнаю, КАК и ГДЕ это действительно построено. И позвольте мне сказать вам - это работает. Чем больше вопросов возникает, тем менее важно сохранить первоначальную архитектуру и, наконец, вернуться к основам

if (weWantToMakeChangesToCodeLaterOnAndProbablyBySomeOtherProgrammer)
{
    Console.Writeline("We need to keep the code readable and simple enough ");
    Console.Wrietline("to make it easy for him/her to understand it!");
}

0

Попросите своего босса найти наставника, а затем сделайте так, как говорит наставник.

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

Также попросите, чтобы наставник проверил ВСЕ ваши проекты до кодирования, и реальный код после кодирования. Это поможет вам сосредоточиться на том, что необходимо сделать.


0

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

  1. При запуске отдельного задания потратьте несколько минут на размышления о том, что действительно требуется в отношении функциональности, качества, даты поставки и т. Д.
  2. Потратьте еще немного времени, чтобы спланировать, как это сделать , разбив его на подзадачи, подзадачи и т. Д., Помня цели клиента кода.
  3. Оцените время для каждого элемента , добавив до 50% для неизвестных. Если предмет займет более четырех часов, сломайте его еще немного. (Если бы я занимался проектами в колледже, я бы использовал электронную таблицу, но в качестве консультанта с несколькими клиентами я использую систему отслеживания проблем под названием Redmine.)
  4. Самое главное: делать только те вещи, которые я придумал .

Конечно, вещи случаются. Иногда я обнаруживаю, что мне нужно делать больше вещей, поэтому я начинаю с № 1. Иногда я обнаруживаю, что задача займет гораздо больше времени, чем я думала - начните сначала с № 1. Иногда я заранее знаю, что мой дизайн потребует больше деталей, поэтому я планирую подзадачу переоценки, где я начинаю сначала с # 1.

Чем больше я это делаю, тем лучше у меня получается. Самодисциплина - это умственная мышца, которая усиливается с помощью упражнений, и я также лучше оцениваю, как много времени потребуется, и делаю технические компромиссы. И мне полезно вспомнить цитату генерала Паттона: «Хороший план, который насильственно исполняется сейчас, лучше, чем идеальный план, исполняемый на следующей неделе».

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

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

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