Как бы вы объяснили, что разработка программного обеспечения более специализирована, чем другие области разработки? [закрыто]

9

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

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

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

Спенсер Кормос
источник
7
Если вы собираетесь понизить голос, не могли бы вы прокомментировать, почему? Тем более что ваш вклад может помочь перефразировать / перефокусировать вопрос.
Спенсер Кормос
11
во-первых, это напыщенная речь, а не вопрос, а во-вторых, ошибочная посылка предположения, за которую нужно проголосовать и закрыть.
6
@JarrodRoberson Я думаю, здесь есть законный вопрос. Требуется хорошее объяснение, которое требует объяснения того, почему некоторые считают разработку программного обеспечения более или менее специализированной, чем другие области разработки.
maple_shaft
7
@SpencerK У вас вопрос: «какой-то случайный чувак провел плохую аналогию, как мне ответить», и, ну, на самом деле это не вопрос. Просто попросите убедительные доказательства и / или ссылки, которые поддерживают его позицию, вы не тот, кто должен проявить себя здесь.
Яннис
5
-1 потому что я не согласен с твоей посылкой. Программная инженерия не более специализирована, чем другие инженерные области. Они могут быть как узкоспециализированными, так и обобщенными. Хороший инженер-электромеханик не может быть хорошим инженером-медиком. С другой стороны, хороший электрик может работать как дома, так и на автомобилях.
zzzzBov

Ответы:

23

но в некотором смысле это также упрощает профессию, как в «Codemonkey, go sling code».

Я бы сказал, совсем наоборот. Хороший инженер-программист будет способен разрабатывать, проектировать и разрабатывать программное обеспечение независимо от технологии. Противоположным концом этого спектра является «кодовая обезьяна» только для .NET, Java или PHP, которая хороша в заданных направлениях или спецификациях и использует инструмент для реализации программного обеспечения.

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

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

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

maple_shaft
источник
8
Я также подчеркнул бы важность понимания концепций и принципов над языками и инструментами.
Одед
+1 Одной из моих любимых мозолей являются люди, которые говорят: «Я разработчик на C # ...». А потом просто выпейте коул-хелп и примите что-нибудь от MS как Евангелие За 10 лет программирования я выучил более 11 языков программирования, и каждый из них значительно улучшил методы программирования на других языках. Учитесь программной инженерии! Не платформы, которые исчезнут через 2 года.
Тимоти Болдридж
+1 для справки Ford Engineer. Я не думал о программистах против программистов раньше.
Dalin Seivewright
Программист - это подмножество инженера, а не наоборот.
Спенсер Рэтбун
11

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

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

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

JeremyP
источник
«Хороший инженер-программист имеет дело с общими принципами проектирования и производства программного обеспечения». Производство встроенных систем управления и веб-приложений практически одинаково , верно?
Марчин
@ Марчин: Некоторые из принципов, да. Идея, которую я делал, заключается в том, что (например) при разработке встроенной системы на C или ассемблере используются одни и те же принципы, даже если инструменты разные.
JeremyP
Эти инструменты ничем не отличаются, и они решают очень похожие проблемные области. Вот почему это совершенно бесполезно.
Марчин
1
@Marcin: вы, очевидно, либо не запрограммированы на ассемблере, либо не запрограммированы на C. Я уверяю вас, что, несмотря на распространенный миф, C не является ассемблером, и программирование в этих инструментах так же отличается, как, скажем, программирование на C и Ruby.
JeremyP
1
@ Марчин, конечно, и боулинг - это просто сбивание всех кеглей. Кусок пирога действительно. В то время как веб-программирование и встроенное программирование могут иметь общие принципы и лучшие практики высокого уровня, то, что действительно управляет повседневной работой, - это ограничения, которые управляют реализацией этих практик. В то время как вы можете в конечном итоге иметь возможность переквалифицироваться веб - программиста , как и встраиваимого и наоборот, они не являются взаимозаменяемыми.
Чарльз И. Грант
5

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

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

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

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

Майкл Браун
источник
5

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

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

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

Томас Оуэнс
источник
Основные принципы могут сильно различаться.
Марчин
1
@ Марчин Нет, нет. Информатика не меняется, если технологии меняются. Математика не меняется. Статистика не меняется. Также не проводится анализ требований, проектирование системы, методы управления конфигурацией, стратегии проверки и валидации, принципы качества ...
Томас Оуэнс
Фактически, «анализ требований, проектирование системы, методы управления конфигурацией, стратегии проверки и валидации, принципы качества» все изменяются между проблемными областями. Если вы этого не признаете, то, скорее всего, вы будете выполнять очень, очень плохую работу, работая в области, которую вы не знаете, потому что вы слишком высокомерны, чтобы понять, чего вы не знаете. Кроме того, применимая математика довольно сильно меняется, но держу пари, вы представляете, что знаете о математике тоже все.
Марчин
@ Марчин Я работал во всем, от встроенных систем до веб-приложений. Они не так сильно меняются. Качества хорошего требования не меняются в зависимости от домена. Инструменты, используемые для проектирования системы, не меняются. То, как вы измеряете и достигаете высококачественных систем, не меняется.
Томас Оуэнс
1
Да, вы правы, каждый программный проект в мире одинаков, и вы выяснили, как управлять каждым проектом. Вам, вероятно, следует написать книгу, объясняющую Единый истинный способ написания и управления всем программным обеспечением.
Марчин
4

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

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

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

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

Marcin
источник
1
Конструкция программного обеспечения на одном уровне одинакова независимо от программного продукта. Мы просто называем их методологиями, а не сборочными линиями , но концептуально это одно и то же.
1
@JarrodRoberson Нет. Сборочные линии не одинаковы, а методологии обычно не применяются.
Марчин
2
Я согласен с Марсином: вам нужно знать продукт, чтобы собрать сборочную линию для продукта. Вы должны быть в состоянии точно выбрать инструменты, которые будут использоваться для получения правильного конечного результата. В программном обеспечении методология будет конкретным инструментом или задачей. Если ваша единственная задача - выполнить определенную задачу, вам может не потребоваться знание целого. Но тогда вы оператор, а не инженер. Выбор правильного набора методологий для формирования сборочной линии делает вас инженером, как и другие инженеры. Не более специализированный или другой.
RJay75
2

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

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

Atif
источник
1

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

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

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

Я думаю, что он на самом деле имеет в виду, что тот факт, что разработчик имеет 2-летний опыт работы с C #, не означает, что лучший инженер-программист с Java-опытом, который никогда раньше не занимался C #, не мог прийти, изучить C # и быстро стать лучшим разработчиком C #, чем первый парень.

Другими словами, вы не обязательно должны сбрасывать со счетов парня из Java за работу, просто потому, что он «сделал время» в C #.

Ozz
источник
Я думаю, что это данность, но это действительно о рентабельности. Я бы не стал нанимать инженера с основным опытом работы с Java, если бы я хотел получить проект C ++ за 6 месяцев. Тем не менее, если у вас есть проект Swing, который должен выйти в 6 мес, первичный инженер на стороне сервера все еще может подойти.
Спенсер Кормос
@SpencerK абсолютно согласен. Это зависит от того, насколько быстро вам нужен ваш ROI. Если у вас есть более длительный период ожидания, лучший разработчик программного обеспечения должен «победить».
Оз
Также суровый минус, если это был ты!
Оз
1
Нет, не я. Я не понижаю голос без комментариев относительно того, почему. У меня есть манеры лучше, чем это!
Спенсер Кормос
1

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

Карл Билефельдт
источник
2
В самом деле? Я полагаю, что вы ожидаете, что инженер по безопасности начнет создавать игры через 6 месяцев и будет неотличим от опытного специалиста.
Marcin
Я согласен с Марсином, это не только знание языка программирования или платформы. Я работал в двух разных областях и провел несколько лет в каждой из них: требуется некоторое время, пока вы не станете достаточно знакомыми, чтобы быть действительно профессиональными и продуктивными в одной области. Конечно, опыт опытного специалиста по программному обеспечению ускоряет процесс, но я бы посчитал 2, 3 года, а не 6 месяцев.
Джорджио
1

Я работаю в вертолетной компании, и авиационные инженеры здесь специализируются на типах самолетов, с которыми они могут работать. Они должны быть «оценены по типу». Технически они могли работать на чем угодно, от Robinson R22 до Jumbo Jet, но не без подготовки к переоборудованию.

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

Jaydee
источник
1

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

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

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

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

Резюме и примеры:

«Искусство» включает в себя скульптуры, романы, комиксы и картины. Навыки перекрытия включают в себя:

  • Форма тела и теория цвета: скульптуры, комиксы и картины
  • Текстовое общение: романы и комиксы

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

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

  • Алгоритмы: ОС / интегрированные системы, игры и другие места, которые вам часто нужно оптимизировать для скорости или памяти. Редко большое дело в веб-разработке
  • Дизайн: везде в веб-разработке, но не очень важно в интегрированных системах без пользовательского интерфейса.
  • Клиент-серверное программное обеспечение: менталитет «не доверяй клиенту», который не обязательно существует в некоторых доменах (игры для одного игрока и другое автономное программное обеспечение для настольных компьютеров, которое, как я признаю, в наши дни встречается реже).
Izkata
источник
Я всегда утверждал, что программирование и разработка программного обеспечения - это столько же искусство, сколько наука или инженерия. Я думаю, это еще один пример того, как они похожи.
Иската
Да, и прежде чем кто-то укусит меня за это "Алгоритмами", я говорю о высокоуровневых CS-y. Куча Фибоначчи и Тимсорт два, которые приходят на ум. (Я почти никогда не работаю на таком уровне алгоритмической сложности, поэтому вообще мало знаю об этой теме)
Изката,
0

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

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

Колин Д
источник
2
Это плохая аналогия, они говорят о инженерии, а не о строителях, хотя они смешивают метафоры в вопросе. Для этого ожидается, что все инженеры-строители, которые строят дороги, смогут построить любую дорогу! Так же, как любой водитель самосвала, доставляющий асфальт на указанную строительную площадку, должен иметь возможность управлять любым видом самосвала.
1
@JarrodRoberson Я согласен, что это плохая аналогия, но я не уверен, что ваше утверждение инженера-строителя лучше. Конечно, любой инженер-строитель должен уметь читать планы на любую дорогу. Но если вы строите взлетно-посадочную полосу или ледяную дорогу, хотите ли вы нанять кого-то, кто потратил годы на строительство шоссейных дорог, или вам нужен человек, имеющий определенный опыт работы с взлетно-посадочными полосами или ледяными дорогами?
Калеб
0

Такого рода вещи часто случаются там, где я работаю.

Мне нравится сравнивать с профессией дяди моей жены - автомехаником.

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

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

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

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

Рувим Маллаби
источник