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


15

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

Звичайно, реальний світ не такий простий, як програмісти знають лише одну мову. Що ми хотіли б знати: якщо ми робимо наш проект у, скажімо, C #, і коли-небудь деякі старі фізики, які знають лише Фортран і Алгол, на це дивляться, наскільки це було б для них сенсом? Математичні його частини можуть добре читати їх, якщо вони ігнорують, що для них є випадковими розділовими знаками. Або, чи зможе експерт Python знайти недоліки в моєму розумному сценарії Ruby?

Можуть виникнути питання від рівня поверхневого синтаксису до рівня грандіозних понять, таких як об'єкти, метапрограмування шаблонів, функціонал тощо. Я не сподіваюся, що один програміст повністю зрозуміє кожну деталь синтаксису коду на "іноземній мові" або дотримується релігії якоїсь великої концепції, але цікаво, наскільки вони отримають основний потік контролю, знайдіть місце де щось намальовано на екрані і що визначає його колір або розмір, переконайтеся, що робот, запрограмований на керування автомобілем, вимкне двигун, коли це буде зроблено, такі речі.

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


1
Я не знаю, чи є якісь дослідження, але з мого особистого досвіду я кажу: так, мені вдалося зрозуміти програму, не знаючи мови.
superM

2
Це залежатиме від пари мов: виберіть C # проти Java - і ви отримаєте майже миттєве знайомство; виберіть Algol vs. C - і ви знайдете знайомство з односторінковою шпаргалкою. Удачі, вибираючи C проти Prolog або Whitespace vs. Ada - це засмутить. До речі, мова - це не єдине, що грає на розумінні програми: експерт із C, що спеціалізується на вбудованих конструкціях, які намагаються зрозуміти код MFC, написаний на C, - досить жалюгідний вигляд (це досвід з перших рук).
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 Не тільки важливо вміти розпізнавати синтаксис, а також час, коли ви можете розшифрувати декларацію або виклик методу, але вміння зрозуміти причину, чому програма певним чином написана, - суть розуміння та читання коду .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.