Может ли знание C повредить код, который вы пишете на языках более высокого уровня? - PullRequest
35 голосов
/ 21 мая 2010

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

Или ты?

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

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

Тогда меня поразило: C это просто еще одна абстракция , как и все остальные. Даже сам процессор - это только абстракция! Я просто никогда не видел, чтобы это сломалось, потому что у меня нет инструментов для его измерения.

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

Подводя итог: есть ли смысл знать больше, чем говорят мне документы API?

РЕДАКТИРОВАТЬ: Сделано CW. Конечно, это также означает, что теперь вы должны публиковать примеры оптимизации интерпретатора / среды выполнения лучше, чем мы:)

Ответы [ 19 ]

38 голосов
/ 21 мая 2010

Ни знание C, ни знание деталей реализации более низкого уровня не навредят вам самим. Что может и будет вам больно, если вы будете постоянно думать и работать с деталями низкого уровня, даже если это неуместно.

Старая поговорка гласила, что «настоящие программисты могут писать на ФОРТРАНЕ на любом языке». Если вы делаете то же самое с помощью C, это не улучшение. Если ты пишешь Лисп, пиши Лисп. Если вы пишете Python, напишите Python. То, что подходит и разумно для C, не подходит ни для одного из них (или для многих других).

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

Знание уровня абстракции C не повредит. Незнание альтернатив может (и будет).

20 голосов
/ 21 мая 2010

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

12 голосов
/ 21 мая 2010

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

Для хорошего разработчика любой тип знаний является преимуществом.

7 голосов
/ 21 мая 2010

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

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

6 голосов
/ 21 мая 2010

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

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

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

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

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

4 голосов
/ 21 мая 2010

Чтобы расширить комментарии других ... Хотя я не уверен, что верю в гипотезу http://en.wikipedia.org/wiki/Whorfian_hypothesis">Whorfian, когда речь идет о естественных языках, это довольно ясно, когда дело доходит до программирования. Языки, которые вы знаете, влияют на то, как вы решаете проблему. Два примера:

1) От профессора, которого я имел много-много лет назад: он пытался выяснить, есть ли какие-нибудь дубликаты в его массиве строк. Это в 70-х годах, поэтому он писал это на Фортране. Его реализация грубой силы n ^ 2 заняла слишком много времени. Так он говорил с другом. Его друг знал PL1 (думаю, возможно, это был APL), у которого есть оператор сортировки. Итак, на этом языке вы учитесь сортировать вещи, и насколько это может быть полезно, потому что это легко. Друг сначала придумал очевидную сортировку, а затем взглянул на алгоритм смежных элементов. Намного быстрее, и это не пришло бы в голову моему профессору, пишущему на Фортране, даже несмотря на то, что это прекрасно реализовывалось в Фортране.

2) Когда я учился в аспирантуре, у меня был сосед по физике для соседа по комнате. Он пошел в Массачусетский технологический институт, и только взял один класс программирования, который был, конечно, в Scheme. Однажды я зашел к его офису, и он сказал: «Эй, Брайан, можешь взглянуть на этот код и сказать мне, должен ли он работать?» Это была процедура сортировки. Я взглянул на него и сказал, что это не может сработать, потому что это была явно пузырчатая сортировка, и все же у нее был только один цикл (и нет, это был не тот странный цикл, с которым можно написать пузырчатую сортировку, если вы больны скрученные). Итак, я это сказал. Он ответил: «О, но у него рекурсивный вызов внизу!» Мне никогда бы не пришло в голову написать рекурсивную сортировку пузырей. Но что более важно, HIM никогда бы не подумал написать нерекурсивную функцию!

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

3 голосов
/ 21 мая 2010

Знание C не повлияет на качество вашего кода, но знание "только C" наверняка

3 голосов
/ 21 мая 2010

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

Я согласен с этим.

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

2 голосов
/ 21 мая 2010

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

В моем университете мы взяли курс «Языки программирования», на котором мы изучали LISP, SNOBOL и ADA. Эти языки открывают ваш разум для различного концептуального мышления при решении задач программирования. В итоге нужно было выбрать язык, который лучше всего подходит для данной проблемы.

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

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

2 голосов
/ 21 мая 2010

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

...