Написание программного обеспечения легче, чем чтение и понимание с нуля? [закрыто]

12

Я и мой друг обсуждали вчера различие между написанием большого программного обеспечения на C ++ и пониманием его как новобранца.

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

Сначала это звучит странно, но после того, как мы немного подумали, это показалось разумным

Макане Эльхай
источник
1
Краткое объяснение закрытия: Хотя это отличный вопрос, на него просто невозможно ответить, только обсудить (подробно). Слишком много факторов, которые нужно учитывать, качество и стиль кода, навыки обучения и знание читателем проекта и языка, размер проекта и так далее. Если вы заинтересованы в дальнейшем обсуждении закрытия, на нашем сайте Meta уже есть вопрос .
Яннис
Книга «Образцы ученичества» рассказывает о путешествии от начинающего мастера до мастера. Он отвечает на многие вопросы начинающих, учеников, программистов уровня подмастерья в их карьерном росте. Для использования многих шаблонов требуется некоторое время, но это часть путешествия. Одним из шаблонов является написание «Сломанных игрушек» или «Прототипов», которые помогают понять и сравнить с производственными системами. Есть еще много полезных шаблонов.
GuruM

Ответы:

41

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

  1. Чтение хорошего кода
  2. Написание плохого кода
  3. Написание хорошего кода
  4. Чтение плохого кода

Приведенный выше рейтинг приводит к 2 выводам

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

Конечно, хороший код и плохой код - это широкие обобщения. Я рекомендую Code Complete и Clean Code для более подробной информации о хорошем коде.

Аарон Куртжалс
источник
Многие другие вещи могут привести к «плохому коду» - отсутствие внутренней согласованности, объединяющего видения или планирования. Общее отсутствие планирования или правильной модульности кода. Я видел хороший код, который был бессмысленным, потому что он не использовал встроенные функции языка, которые работали бы так же хорошо.
Бен ДеМотт
Кроме того, как написать хороший код: cdn.thenextweb.com/files/2011/01/65987_700b.jpg
CurtisHx
2
В моем масштабе, чтение плохого кода остается проще, чем написание хорошего кода. В худшем случае вы можете запустить отладчик плохого кода, который вы пытаетесь прочитать, или отредактировать его с помощью инструмента рефакторинга.
mouviciel
2
Написание плохого кода легко до такой степени, что он должен интегрироваться и работать, или изменяться в соответствии с изменяющимися требованиями. Если вы «запрограммируете себя в угол», то это уже не просто.
Каз
@mouviciel Чтение плохого кода, написанного очень умными программистами, которые не должны писать плохой код, может быть трудным. Читать плохой код, написанный наивными программистами, легко. Просто наденьте свою «наивную шляпу», и станет очевидным, чего не удается достичь в коде. :)
Каз
13

Этот вопрос обращается к ложному консенсусу. http://en.wikipedia.org/wiki/False-consensus_effect

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

mawcsco
источник
1
Конечно, задавать вопрос и убеждать мнение гораздо лучше, чем просто полагать, что эта (или любая другая) гипотеза автоматически верна. Признание того, как разные люди подходят к одной и той же проблеме, часто может оказать положительное влияние на эффективность работы команд, а также на улучшение социальных взаимодействий.
Робби Ди
7
Вы абсолютно правы. Запрашиваемая это начало. И понимание того, что существует ложный консенсус, полезно для понимания. Вот почему я «ответил» на вопрос, а не просто проигнорировал его.
mawcsco
7

Различия между написанием большого программного обеспечения на C ++ и пониманием его как новобранца

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

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

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

Калеб
источник
Понимание «контекста» широты / глубины системы и базового API с опытом. Каковы логические компоненты системы? Как эти компоненты взаимодействуют друг с другом? Какие механизмы они используют базовые строительные блоки? Как базовые строительные блоки ведут себя по-разному? Каковы ограничения / цели системы? Почему определенные пути были выбраны по сравнению с другими кандидатами? Если вам нужно добавить новый компонент, что вы можете использовать повторно и что нужно добавить заново? Вы видите изнутри системы? Супер книга, чтобы увидеть прагматическое мышление и обучение.
GuruM
Создание «Прототипа» или «Сломанной игрушки» (с известными недостатками и только для изучения альтернатив) поможет «заставить» себя продумать вышеизложенные вопросы. Добавление компонентов и добавление функций с последующим рефакторингом поможет «почувствовать» имеющиеся проблемы и возможные варианты решения (возможно, с помощью поиска по форуму).
GuruM
4

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

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

Если вы новичок в программировании, то «вы не знаете, чего не знаете», и поэтому вам придется изобретать / изучать все мелочи, и, скорее всего, у вас будут некоторые недостатки в код. Тем не менее, вы, вероятно, будете лучше понимать язык.

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

JohnP
источник
2

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

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

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

Карл Билефельдт
источник
Вы можете написать код и не понять его? Скопировать возможно.
Джеффо
@JeffO Все время - лол ...
Робби Ди
1

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

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

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

StMotorSpark
источник
1

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

Это приводит к вопросу: имеет ли это значение?

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

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

Робби Ди
источник
1

Я нахожусь в ответе StMotorSpark, просто добавив: «
Это зависит от многих факторов, это не может быть вопрос« да »или« нет », например:

  • Хорошо ли задокументирован и хорошо написан существующий код или он выглядит как спагетти без какого-либо смысла или комментариев?
  • Это крошечное приложение с очень редкими ситуациями, которое стоит бесконечного времени, чтобы найти решение, или более крупное, но простое приложение?
  • и т.п.
JoseTeixeira
источник
1
Очень хорошие очки; Однако я бы сказал, что это больше зависит от человека. Например, даже если есть некоторый код, который почти не имеет документации, он все равно может предоставить понимание в виде «Это странно, мне интересно, что это такое». Если кто-то действительно хочет учиться, он найдет что-нибудь полезное, независимо от размера программы или документации. Имея это в виду, хотя, хорошая документация и код, который не слишком велик по размеру, существенно помогают.
StMotorSpark
1
Полностью согласен, это также зависит от человека. Просто обратите внимание, что из-за наших требований к работе некоторые из нас занимаются разработкой с нуля, а другие занимаются техническим обслуживанием. Это неизбежно улучшит два разных опыта, независимо от того, начнут ли они оба с одинаково хорошо организованного мышления, с одинаковым уровнем логики и понимания специфики языка, ...
JoseTeixeira