Изучите, насколько хорошо программист может понимать код на незнакомых языках? [закрыто]

15

Проводятся ли серьезные исследования того, насколько хорошо опытный программист, знающий язык X, может понимать код, написанный компетентным программистом на языке Y, для широкого спектра широко используемых языков, таких как X и Y?

Конечно, реальный мир не так прост, поскольку программисты знают только один язык. Что мы хотели бы знать: если мы сделаем наш проект, скажем, на C #, и когда-нибудь некоторые старые физики, которые знают только Fortran и Algol, посмотрят на него, в какой степени это имело бы смысл для них? Математические части этого могут показаться им понятными, если они проигнорируют то, что для них является какими-то случайными знаками препинания. Или же эксперт по Python сможет найти недостатки в моем умном Ruby-скрипте?

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

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

DarenW
источник
1
Я не знаю, есть ли какие-либо исследования, но из своего личного опыта я говорю Да, мне удалось понять программу, не зная языка.
СуперМ
2
Это будет зависеть от пары языков: выберите C # против Java - и вы получите почти мгновенное знакомство; выберите Algol vs. C - и вы получите знакомство с одной страницей. Удачи в выборе С против Пролога или Пробелов против Ады - это будет неприятно. Кстати, язык - не единственное, что играет в понимании программы: специалист по Си, специализирующийся на встраиваемых разработках, пытающийся понять код MFC, написанный на Си, - довольно прискорбное зрелище (это из первых рук).
dasblinkenlight
Насколько легко для тех, кто понимает алгебру, для них подобрать тригонометрию против кого-то, кто понимает исчисление? Это зависит от языка и парадигмы. Выявить и изолировать различия между языками достаточно сложно, тем более что языки постоянно развиваются. Я серьезно сомневаюсь, что кто-либо может оценить понимание с любой разумной степенью точности.
Эван Плейс

Ответы:

9

Очевидно, это зависит от того, насколько языки связаны друг с другом. Например, если у вас есть опыт работы на C или C ++ и вы уже занимались программированием на C # или Java, вам будет легко читать и понимать другой из этих двух языков (Java или C #). Если вы хорошо знаете Лисп, Схема не должна быть большой проблемой. Однажды я отлаживал PHP-программу, не имея никаких знаний о PHP, только с моими знаниями из C, C ++ и Perl. Я совершенно уверен, что когда эта программа была бы написана на Haskell или Smalltalk, это было бы намного сложнее, чем невозможно для меня.

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

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

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

Док Браун
источник
6

Не уверен насчет академического исследования, однако самоочевидное именование методов, классов и функций в языках C # / C ++ / Java / Python и т. Д. Должно облегчить понимание кодовой базы, а также потока бизнес-процессов.

Соглашение об именовании в проекте и в целом при разработке программного обеспечения является очень важным аспектом. Тем не менее, its importanceи актуальность для создания качественного программного обеспечения часто упускается из виду или игнорируется все вместе.

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

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

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

Лично я нахожу связанный вопрос более интересным: когда в коде есть ошибка (то есть программист X думал, что он написал, someFunction(x, y)но он действительно написал что-то еще), насколько трудно второму разработчику определить ошибку. Хороший программист X сделал бы совершенно очевидным, что он ХОЧЕТ делать с компьютером, и это будет легко прочитать. Однако, если он допустил ошибку, это может иметь большое значение. Такие вещи, как следующая ошибка C ++:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

Может быть ОБЯЗАТЕЛЬНО трудно обнаружить, если вы не знаете язык.

Корт Аммон - Восстановить Монику
источник
1

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

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

Например, если вы изучили C, я думаю, что было бы разумно ожидать, что вы сможете получить поток управления из C #, Java или C ++ и т. Д. Было бы немного сложнее расшифровать VB из-за разницы в синтаксисе, или JavaScript из-за замыканий, слабой типизации и функций более высокого порядка (я знаю, что вы можете сделать это в C, но это немного шатко). Однако я не ожидал бы, что вы сможете отлаживать Lisp, F #, R или, не дай бог, сборку, потому что они используют совершенно другую парадигму программирования.

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

Nimnam1
источник