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

13

В порядке важности, если это возможно, а может и не быть, каковы наиболее важные основы умения программировать. Алгоритмы, итерации, рекурсии и т. Д.?

Обратите внимание, что мой вопрос лежит там, где я ставлю. Недавно я прочитал сообщение в Интернете, в котором говорится, что 9 из 10 программистов не могут задыхаться !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

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

Kewigro
источник
3
Пост Джеффа Этвуда на самом деле не о глубоких познаниях в программировании ... Речь идет о реальности того, что многим людям не хватает базовых, фундаментальных представлений о программировании и того, как отсутствие этих фундаментальных представлений мешает им развить значительные навыки программирования.
Роберт Харви
2
Я не понимаю, почему этот вопрос был закрыт. Это вопрос, который был отмечен 5 раз и имеет много полезных ответов. Это та информация, с которой я хочу познакомиться - просто потому, что нет простого ответа, не означает, что эта информация не очень полезна, возможно, programmers.stackexchange.com нуждается в переоценке своих критериев для закрытия вопросов.
Роклан
@LachlanB Я проголосовал за открытие ... нужно еще 4 голоса, чтобы добиться успеха
Майкл Браун
Я думаю, что это хороший вопрос, но любой разумный ответ будет слишком длинным для формата этого сайта. Любая хорошая университетская учебная программа будет охватывать эти концепции, и тот факт, что такая учебная программа занимает несколько лет самообучения и практики, а затем дополнительные годы работы над реальными проектами, должно прояснить, почему ответ не может здесь вписаться.
Джорджио

Ответы:

18

Этот список является началом ... вы задаете большой вопрос!

  • Как уточнить и записать, что хотят клиенты («требования»). Это искусство само по себе. Если вы можете сделать это, ваша работа по программированию будет намного лучше.
  • Как оценить и составить план проекта. Люди попросят вас оценить, будьте готовы.
  • Как конструктивно пересмотреть чужой код.
  • Шаблоны проектирования. Это большой. Но не переусердствуйте в использовании их ради этого.
  • Узнайте разницу между ошибкой, проблемой и запросами функций
  • Будьте в курсе фреймворков / библиотек. Вам не нужно их использовать, но вы должны знать, что они делают, и их плюсы / минусы. Если что-то кажется слишком сложным, то, вероятно, (надеюсь) гораздо более простой способ сделать что-то.
  • Как документировать сложные алгоритмы в блок-схеме или просто написать на английском. Не ожидайте, что кто-то потратит 2 дня, пытаясь реконструировать ваш код.
  • Как организовать структуру кода так, чтобы кто-нибудь еще мог ее понять
  • Как прокомментировать ваш код
  • Как написать модульные тесты
  • Знай, что происходит под капотом. Например, вызывая веб-сервис - что он на самом деле делает?
  • Как абстрагировать логику в классы.
  • Как изменить код
  • Изучите суть довольно многих языков программирования. Вы будете удивлены тем, что вы можете узнать из других областей
  • Как сказать другим программистам, что писать.
  • Как объяснить руководству, что вы делаете и почему.
  • Как сказал Петр, как отлаживать. Я согласен со всем, что он говорит, настоящие программисты отлаживают, а не просто догадываются.
  • Как работать с маньяками. Там их много.
  • КАК ПОЛУЧИТЬ СДЕЛАНО. Вся теория в мире не поможет вам, если вы не сможете что-то сделать.

Я ответил на другой вопрос в том же духе (с похожим содержанием) здесь:

советы, рекомендации, моменты, которые нужно помнить для рендеринга профессионального кода

Rocklan
источник
1
+1: ПОЛУЧИТЕ ПЕРСОНАЛ СДЕЛАНО! Пару лет назад я опубликовал напыщенную речь, в которой говорилось, что это отличительная черта инженера - они делают вещи. Иногда это не красиво, а иногда вам придется вернуться и переделать это, но в конце дня они делают вещи!
Питер Роуэлл
@PeterRowell: вы можете найти это интересное чтение: brandonsavage.net/when-to-write-bad-code
Марьян Венема
К сожалению, вопрос не совсем соответствует философии вопросов и формата сайта, но это не сводит к минимуму ценность вашего ответа. Если вы захотите расширить его и добавить немного пояснений к каждому пункту, это станет отличным постом для блога нашего сообщества .
Яннис
@MarjanVenema: Да, я полностью согласен с ним. Еще в 80-х мне поручили написать спецификацию для нового редактора, которая должна была быть утверждена до того, как я начал писать код. Я больше недели смотрел на этот чертов пустой экран, пытаясь понять, как описать то, чего я не понял. Мой менеджер выразил свое недовольство моим отсутствием прогресса. После трехдневных выходных у него на столе лежал сквозняк. Он спросил, что случилось, и я сказал, что написал редактор в выходные, а затем просто написал спецификацию того, что у меня было. Я переписал часть кода, но это был в основном рефакторинг / очистка.
Питер Роуэлл
1
@YannisRizos - мне было бы интересно написать блог об этом. Вы хотите отправить мне электронное письмо с инструкциями или мне просто написать что-нибудь?
Роклан
22

Под заголовком « и т. Д. » Понимается то, что может занять 50% и более вашего времени.

Узнайте, как отлаживать.

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

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

Многие ошибки тривиальны, но их трудно увидеть, потому что вы «знаете», каким должен быть код ... кроме того, что это не так. Найти друга, чтобы объяснить это. Попросите их стать «опытным идиотом»: кем-то, кто не знает ваш код, но кого вы знаете, вы не можете пройти мимо БС. Не удивляйтесь, если во время описания им вы вдруг остановитесь и скажете: «И поэтому вы можете ... увидеть ... увидеть это ... дерьмо. Спасибо."

Нетривиальные ошибки требуют арсенала приемов. Классик, который может быстро выделить большинство ошибок, не связанных со временем, - Wolf Fence на Аляске. Где-то на Аляске есть волк; построить забор, разрезая государство пополам. На чьей стороне волк? Разрежьте эту сторону пополам. Вспенить, промыть, повторить. Выполнение этого в 20 раз в хорошо выбранных местах в коде уменьшает область, где ошибка (волк) может быть до 1/1048576. Убей этого волка.

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

Я не знаю ни одной школы, которая бы преподавала отладку как предмет сам по себе. IMNSHO, это может быть самым ярким доказательством того, что они (университеты / профессора) не учат вас быть программистом, а вместо этого учат вас быть ... как они? Суровые? Может быть. Правда? Решайся сам. Теперь докажи это.

Питер Роуэлл
источник
Возможно, вас заинтересует метод Saff Squeeze , описанный Кентом Беком, который использует тесты и рефакторинг для отладки: Hit 'em High, Hit' em Low : регрессионное тестирование и Saff Squeeze от Kent Beck, Three Rivers Institute (Аннотация: Кому эффективно изолировать дефект, начать с теста на системном уровне и постепенно наращивать его и обрезать до тех пор, пока не будет получен наименьший возможный тест, демонстрирующий дефект.) Он очень похож на ваш Wolf Fence, используя тесты и возможности рефакторинга IDE.
Йорг Миттаг
1
Отличный ответ - любой может написать код, отладить настоящие программисты.
Роклан
@ JörgWMittag: я большой поклонник автоматизированного регрессионного тестирования. Я впервые использовал его в проекте поисковой системы еще в середине 80-х, и я был шокирован (шокирован!) Вещами, которые выпадут после того, что казалось «незначительным» изменением в невинной части кода. (Примечание: это было 200 000+ SLOC на C, а проблемы с управлением памятью были проклятием нашего существования.)
Питер Роуэлл
3

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

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

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

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

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

Русланд
источник
2

ЯГНИ : «Всегда реализуй вещи, когда они тебе действительно нужны, никогда, когда ты просто предвидишь, что они тебе нужны».

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

Луис Рис
источник
1

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

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

РЕДАКТИРОВАТЬ:

Если вы не верите в это и вы отвергли меня, я полагаю, что вы не знаете, решите ли вы сделать это в течение 20 лет. Я знаю, что я делаю, потому что я принимаю это. ;)

Натан Треш
источник
0

Недавний вопрос, каким-то образом связанный с этим, и « Ответ» содержали ссылку на этот блог, в которой обсуждается та же проблема с другой стороны.

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

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

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