Чи ефективно переглянути код мовою, яку я не знаю?


108

Я досвідчений розробник, але не робив багато оглядів коду. Мене просять переглянути код, написаний на Python, але я не знаю Python.

Чи має сенс взагалі переглянути код мовою, яку я не знаю?


62
Дотично, розгляньте можливість перейти до CodeReview.SE і подивитися на тег python. Дивлячись лише на запитання, подумайте, яку пораду ви дали б у коді, а потім подивіться, чи це представлено у відповідях.


14
Звучить відмінним способом дізнатися більше про Python. Запитуйте що-небудь, що виглядає смішно - дещо це ви не зрозумієте мову, а деякі - законні пункти перегляду коду.
Ден Пішельман

9
@RobbieDee абсолютно! Пояснення коду комусь часто варто, навіть якщо це просто плюшевий ведмедик .
Кіліан Фот

34
Ви кажете, що вас просять зробити це. Людина, яка запитує вас, думає, що ви виконуюте це завдання, додасть цінності вашій організації. Якщо ви хочете знати, яка природа цієї цінності, запитайте цю людину , а не сторонніх людей в Інтернеті! Ми не знаємо, що відбувається всередині голови цієї людини. Можливо, код настільки низької якості, що навіть новачки можуть знайти проблеми. Можливо, код настільки високої якості, що ви навчитеся з нього хорошим звичкам. Хто може сказати? Хтось вважає, що це цінно; запитайте у цієї людини, яка цінність.
Ерік Ліпперт

Відповіді:


120

Якийсь сенс? Так. Навіть якщо ви нічого не знаєте про семантику мови програмування, ви все одно можете читати символи та помічати непослідовне форматування, відсутні коментарі, неправильно вибрані ідентифікатори, очевидне дублювання тощо.

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


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

8
Крім того, якщо у вас є хороші знання про домен, і код досить добре названий / прокоментований, ви все ще можете помітити неправильну / неправильно зрозумілу / відсутню функціональність на високому рівні (ви можете не помітити помилок через проблеми з синтаксисом)
Dan

4
Як стороння людина, ви можете навіть з більшою ймовірністю помітити помилки на огорожі або помилки в застосуванні правильної кількості рівних знаків і подібних речей.
KlaymenDK

2
@KlaymenDK Призначення в булевих контекстах - це (принаймні, як правило) синтаксичні помилки в Python. Помилки Fencepost менш ймовірні, оскільки добре написаний Python майже ніколи не працює з індексами масиву / списку. (Навіть коли ви це робите, зазвичай це стосується enumerate.) Я вважаю, що ваш коментар є чудовим прикладом того, чому спроба переглянути мову, з якою ви не знайомі, має бути, максимум, навчальною для себе.
jpmc26

1
@Mawg - Я схильний би сказати, що для цього призначене автоматичне тестування. Навіть маючи експертні знання мови, важко сказати, чи дійсно код буде відповідати проектній специфікації , просто подивившись його / не виконуючи його і не спостерігаючи за результатом (якщо тільки ваш дизайн-специфікація не є настільки детальною, що по суті це код сам по собі) . Визначені у відповіді аспекти охоплюють багато (хоча і не всі) вагомих причин для перевірки коду. Огляд коду, як правило, не включає виконання коду, який переглядається.
aroth

59

Як постійний довідник на Exchange Code Stack Exchange , я стикаюся з багатьма питаннями, які страждають на мовно-агностичних питаннях, наприклад:

  • Форматування, відступ
  • Область застосування
  • Петлі
  • Введіть операції

і список продовжується. Однак, хоча мені не потрібно знати мову, я все ще можу переглянути ці питання / моменти.

Кілька наших кращих користувачів мають найвищі відповіді мовами, якими вони або активно не користуються, або не знають. Навіть два з моїх перших десяти мов, які я не знаю і не можу скласти / запустити на своїй машині.

Я б навіть сказав, що це буде те саме, що переглядати чийсь псевдо-код. Поки ви зможете спостерігати та коментувати речі, що стосуються речей, які ви розумієте, ви будете добре, і це буде доречно.


2
Я навіть написав відповідь на програму PHP. Це не найбільша відповідь, але я все ще стверджую, що оригінальна заява циклу некрасива.
Hosch250

4
Я навчився C # за допомогою комбінації перегляду, написання та перегляду того, що я написав.
RubberDuck

5
Якщо ви не знаєте Python, ви навряд чи оціните значення відступу в мові ...
Флоріс

2
Що стосується 2/10 ваших найкращих відповідей на мовах, яких ви не знаєте. Хто може сказати, що виборці також про них щось знають?
Мартін Сміт

Поки я не знаю мов, я все-таки перевіряю свої твердження, і якщо я заплутався ... Повірте, я почув би про це
Quill

44

Загальна порада

Ось підсумок, на мій погляд:

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

Конкретні міркування та приклади Python

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

Давайте розглянемо простий приклад. Візьміть цей код:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

Бачите проблему з цим кодом? Якщо ви ще не працювали з Python, ви, мабуть, не так. Проблема полягає в тому, що існує багато кращого стилю в Python , що робить рівно те ж саме:

with open('/home/me/something.txt') as f:
    content = f.read()

Це контекстний менеджер. Ви знаєте, для чого вони гарні? Чи знаєте ви, коли було б доречно використовувати його? Чи знаєте ви, коли було б доречно створити свій власний? Немає? Тоді ви, мабуть, не готові переглянути Python.

Давайте подивимось на інший приклад.

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

Бачите проблему? Проблема в тому, що цей метод зовсім непотрібний . Вам, мабуть, слід просто використовувати розуміння на місці, коли операція така проста:

x = range(10)
y = [i + 50 for i in x]

Якщо ви цього не бачили, ви не знайомі з особливостями та ідіомами Python.


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

1
@ gnasher729 "Дійсно, я думаю, що речі, на які підкреслює Пітон, зробили мій код кращим на інших мовах, а не навпаки." =) Єдине, що я знаю в інших мовах, яке було б навіть віддалено схожим - це LINQ .NET і Java 8's Stream s. У Ruby може бути щось, і я впевнений, що функціональні мови з чимось близькими. Моя думка з прикладом - ви можете навіть не знати, що робити, якщо ви не знайомі з Python, тому ви навіть не знаєте оскаржувати "погану" версію.
jpmc26

@x = 1 .. 10; @y = карта {$ _ + 50} @x;
труба

2
Огляд коду стосується більше логічних помилок, ніж впровадження деяких (для сторонніх програмістів) незрозумілих синтаксисів певною мовою. Йдеться про пошук логічних помилок, як реалізація алгоритму абсолютно неправильно (наприклад, використання поділу, коли воно має бути доповненням). Таким чином, код не буде точно до специфікацій. Це не важливо, якщо отриманий результат правильний. Принаймні, якщо ви турбуєтесь про такі оптимізації, як ця, огляд коду команди був би ще кращим.
фірфокс

3
@phyrfox Це просто неправда. Логічні помилки можуть бути знайдені, але огляд коду також стосується (або в першу чергу) щодо найкращих практик, безпеки, продуктивності, надійності, читабельності / ремонтопридатності та ін. Визначення коду StackExchange є досить помітним , imo. У Python приклади, про які я згадував, не є "невеликими оптимізаціями". Розробник Python, який не використовує ці зразки, є дуже недосвідченим за часом, або некомпетентним. Це основні елементи мови.
jpmc26

21

Можливо, вони попросили вас переглянути код Python саме тому, що ви не знаєте Python . Існує теорія управління, що корисно мати «дурня» в команді. Я не називаю вас поганим іменем :) Ідея полягає в тому, що команда може постраждати від групового мислення та розвитку тунельного бачення. Один із способів вирішити це - включити когось із команди, кого інші члени команди вважатимуть "дурнем", тобто того, хто не знає предмета. Ви будете задавати питання, щоб повідомити себе, і запитання будуть надходити з точки зору, який інші члени команди, ймовірно, ніколи не розглядали.

Ви не знаєте Python, тому те, що може здатися звичайним для кодерів Python, може здатися вам дивним. Ви можете запропонувати покращення, про яке команда ніколи не розглядала.


1
Це мала бути моєю відповіддю. Я просто додам, що в будь-який день з будь-якою заданою програмою Python та будь-якою групою гуру Python ... цей код є GARBAGE.
dwoz

І часто сам факт пояснення чогось "дурню" викличе "До!" момент від "експерта", коли вони раптом усвідомлюють, що код не робить те, що йому призначено, або пропускає якийсь ключовий край крайнього регістру. Це також гідний спосіб розпочати поширення знань.
TripeHound

21

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

Огляд коду - це вдосконалення дизайну та виявлення поширених помилок початківців програмістів.

Оскільки я програмую на C ++ і не знаю Python досить добре, я б не наважився переглянути код Python. Однак я можу допомогти з оглядом коду Java.

Ви не сказали, на якій мові ви програмуєте, але я не бачу, що ви могли б внести в огляд коду, якщо ви не знаєте мови, на якій запрограмовано.


23
Дійсно, у вас є інструмент, який може відрізнити погано названі змінні від хороших? Мені було б цікаво побачити його.
Давор Ждрало

1
@ DavorŽdralo Off bat, я знаю, у Java є Checkstyle. Більш офіційні інструменти статичного аналізу є загальними для багатьох мов, і їх застосування для стандарту кодування, як правило, є найменшим їхнім обов'язком.
Шаз

9
У мене є відчуття, що тут є дещо різниця між визначеннями Code Review, начебто нагадує мені це питання щодо CR Meta: Що таке огляд коду? . Я б не виключав чогось конкретного і сказав "Перегляд коду НЕ про XYZ". Також звучить так, що ви говорите, що досвідченим програмістам не потрібен перегляд їх коду, що я дуже не згоден.
Саймон Форсберг

3
@SimonForsberg Це не те, що я говорю. Навіть старші програмісти можуть чомусь навчитися в хорошому огляді коду. Але якщо єдиними коментарями є "ви згадали тут змінну" - різновид коментарів, вони витрачають свій час.
BЈоviћ

2
@ BЈовић Ні, це не найгірше, що можна знайти, але він досить близький до "найменшої знайденої речі, яка все-таки варта".
Ватін

11

Огляди коду (крім того, що насправді шукають недоліки) - це гарне введення від одного члена команди до іншого для додавання чи зміни коду. Якщо ви досвідчений розробник , ви повинні мати можливість прочитати достатньо, щоб здебільшого зрозуміти, що відбувається.

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


7

Ви точно не повинні бути єдиним рецензентом, але є багато вагомих причин, щоб ви були одним із рецензентів. Незнання мови не є великою перешкодою для багатьох питань, на які потрібно відповісти в огляді коду. Як приклад, я є одним із 20 найкращих відповідників у тезі C # на цьому сайті, і я не так сильно склав привіт світ у C #.

Деякі знання, якими ви можете поділитися, не знаючи мови:

  • Знання домену.
  • Загальний об'єктно-орієнтований дизайн.
  • Загальні практики програмування: іменування, чіткість тощо.

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

У вашому випадку це буде хорошим способом дізнатися ідіоми нової мови, як ви бачите коментарі, які залишають інші рецензенти. Це такі речі, які дуже важко засвоїти будь-яким іншим способом, тому що ваш перекладач не хвилює, чи ваш код є пітонічним чи ні.


5

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

Подумайте про це так: якщо код достатньо зрозумілий, що навіть діва Python може це зрозуміти, він повинен бути хорошим кодом. Частини, які у вас виникають проблеми з розумінням, можуть бути кандидатами на переробку чи кращі коментарі.

Очевидно, це також було б корисно для вас, адже ви б підбирали нову мову, як підете. (Сподіваємось, код, який вам подають, є хорошим прикладом, з якого слід дізнатися.) Ця домовленість повинна особливо добре працювати для Python, мови, яка має репутацію "виконуваного псевдокоду". Якщо ви досвідчений розробник, у вас не повинно виникнути особливих труднощів з розумінням суті програми Python.

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


2

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


1

Кілька спостережень:

1) Якщо ви досвідчений розробник, ви підберете Python (або принаймні стільки, скільки вам потрібно знати), просто працюючи з ним. Це буде випадок "навчання ділом". Спочатку буде важко, але стане легше, коли ви підберете мову. Подумайте про це як про можливість вивчення іншої мови (люди часто вивчають "іноземні" мови через "занурення").

2) На сайтах SE є ряд цінних людей, які "нетехнічні", але вміють граматику, комунікації та логіку. Такі люди підносять «свіже око» до предметів і роблять ряд виправлень «без мозків», які пропускають інші, бо вони занадто «зав'язані» у матеріалі. Ви, мабуть, консультуєтесь щодо своїх не "технічних" (тобто не Python) навичок, таких як логіка та загальна кмітливість у програмуванні.

І якщо ви ще не зробили багато перегляду коду, практично будь-який досвід перегляду коду допоможе вам як розробнику. Це виглядає як гарна відповідність між вашими вміннями та потребами та командою.


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

@EsotericScreenName - я думаю, це залежить від того, скільки зворотних зв'язків ви отримаєте від того, хто написав чи знає код. Також більше шансів на те, що ви знаходитесь в області домену, з якою ви працюєте іншою мовою, що робить його більш релевантним, ніж типовий приклад коду. Більшість прикладів кодування просто показують, як робити невеликі фрагменти тата і їх рідко показують як частину великого проекту.
JeffO

0

Це залежить від того, яка мета огляду; тобто те, що ви маєте на увазі під ефективним .

Ви все одно зможете виявити деякі проблеми. Якщо ви все, що їм доводиться переглядати, і вони просто сподіваються, що якщо ви переглянете це, то це допоможе дещо і, можливо, щось схопить, то впевнені. Багато понять будови схожі між мовами. Особливо можна переглядати коментарі. Слід прокоментувати досить добре, що програміст, який не є цією мовою, все-таки повинен мати можливість добре відчути те, що відбувається. Якщо ні ... то ви можете сказати їм, де бракує їх коментарів. Якщо це так добре прокоментовано ... тоді ви повинні мати можливість переглянути трохи їх структуру за допомогою анотацій того, що відбувається, а не насправді читати код того, що відбувається.

Але ви, швидше за все, не виявите багатьох інших проблем. Тож якщо вони мають намір для вашого огляду вичерпне визначення того, чи це добре зроблена / дієва програма, вони будуть розчаровані.

Від того, чи варто цей результат вартий часу, коли ви це зробите, багато в чому залежить від проекту.

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