Эффективно ли просматривать код на языке, которого я не знаю?

108

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

Есть ли смысл пересматривать код на языке, которого я не знаю?

Хизер Смит
источник
62
Тангенциально, подумайте о том, чтобы перейти к CodeReview.SE и взглянуть на тег python. Глядя только на вопрос, подумайте, какой совет вы бы дали коду, а затем посмотрите, представлен ли он в ответах.
14
Звучит как отличный способ узнать больше о Python. Задавайте вопросы о том, что выглядит забавно - некоторые из них будут означать, что вы не понимаете язык, а другие будут законными элементами проверки кода.
Дэн Пичелман
9
@RobbieDee Абсолютно! Объяснение вашего кода кому-то часто стоит, даже если это просто мишка .
Килиан Фот
34
Вы говорите, что вас просят об этом. Человек, спрашивающий вас, думает, что вы выполняете эту задачу, что увеличит ценность вашей организации. Если вы хотите узнать, какова эта ценность, спросите этого человека , а не незнакомцев в Интернете! Мы не знаем, что происходит в голове этого человека. Возможно, код такого низкого качества, что даже новички могут найти проблемы. Возможно, код такого высокого качества, что вы выучите у него хорошие привычки. Кто может сказать? Кто-то думает, что это ценно; спросите этого человека, какова ценность.
Эрик Липперт

Ответы:

120

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

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

Килиан Фот
источник
50
Несколько обзоров кода - отличный способ познакомиться с модулем, фреймворком или даже языком, так что в любом случае это может стоить вашего времени (и, возможно, вам на это намекают ...). Я бы не стал подписывать такой обзор, если бы не заставил кого-то, кто знаком с языком и кодом, взглянуть на него.
Орден
8
Кроме того, если вы хорошо разбираетесь в предметной области, а код достаточно хорошо назван / прокомментирован, вы все равно можете обнаружить неправильную / неправильно понятую / отсутствующую функциональность на высоком уровне (хотя вы можете не обнаружить ошибки из-за синтаксических проблем)
Дан
4
Как посторонний человек, вы даже можете с большей вероятностью обнаружить ошибки в заборе или ошибки в применении правильного количества знаков равенства и тому подобное.
KlaymenDK
2
@KlaymenDK Назначения в логическом контексте - это (по крайней мере, обычно) синтаксические ошибки в Python. Ошибки Fencepost менее вероятны, так как хорошо написанный Python почти никогда не заставляет вас работать непосредственно с индексами массива / списка. (Даже когда вы это делаете, обычно это так enumerate.) Я думаю, что ваш комментарий является отличным примером того, почему попытка пересмотра языка, с которым вы не знакомы, в большинстве случаев должна быть для вас познавательной.
jpmc26
1
@ Mawg - я бы сказал, что для этого нужно автоматическое тестирование. Даже с экспертным знанием языка трудно сказать, действительно ли код будет соответствовать спецификации проекта , просто взглянув на нее / не выполняя ее и наблюдая за результатом (если ваша спецификация проекта не настолько подробна, что она по сути является кодом сама по себе) , Аспекты, перечисленные в ответе, охватывают множество (хотя и не все) веских причин для проверки кода. Проверка кода обычно не включает в себя выполнение проверяемого кода.
aroth
59

Как постоянный участник в Code Review Stack Exchange , я сталкиваюсь с множеством вопросов, страдающих от не зависящих от языка проблем, например:

  • Форматирование, отступ
  • Объем
  • Loops
  • Операции типа

И список продолжается. Тем не менее, хотя мне не нужно знать язык, я все же могу рассмотреть эти вопросы / моменты.

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

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

полый вал
источник
2
Я даже написал ответ на программу PHP. Это не самый лучший ответ, но я все еще утверждаю, что первоначальное объявление цикла выглядит ужасно.
Hosch250
4
Я изучил C # благодаря комбинации его обзора, написания и проверки того, что я написал.
RubberDuck
5
Если вы не знаете Python, вы вряд ли поймете важность отступов в языке ...
Floris
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.

jpmc26
источник
1
В вашем последнем примере, если бы я увидел окончательный код, у меня, вероятно, было бы некоторое представление о том, что он мог бы делать (не зная Python), и я мог бы задаться вопросом, могу ли я сделать что-то подобное на моем любимом языке, который я никогда раньше не рассматривал.
gnasher729
1
@ gnasher729 «Действительно, я думаю, что то, что подчеркивает Python, сделало мой код лучше на других языках, а не наоборот». =) Единственное, что я знаю в других языках, которые даже отдаленно похожи, - это LINQ .NET и Stream 8 в Java 8 . У Ruby может быть что-то, и я уверен, что функциональные языки близки с чем-то. Суть примера в том, что вы, возможно, даже не знаете, как это сделать, если вы не знакомы с Python, поэтому вы даже не знаете, как бросить вызов «плохой» версии.
jpmc26
@x = 1 .. 10; @y = map {$ _ + 50} @x;
труба
2
Обзор кода больше касается логических ошибок, чем реализации некоторого (для сторонних программистов) неясного синтаксиса на определенном языке. Речь идет о поиске логических ошибок, таких как реализация алгоритма совершенно неправильно (например, использование деления, когда оно должно быть сложением). Так что код не будет точно соответствовать спецификациям. Это не важно, если полученный результат верен. По крайней мере, если вы беспокоитесь о таких оптимизациях, как эта, обзор кода команды будет еще лучше.
phyrfox
3
@phyrfox Это просто неправда. Могут быть обнаружены логические ошибки, но проверка кода также (или в первую очередь) посвящена передовым методам, безопасности, производительности, надежности, удобочитаемости / удобству обслуживания и т. Д. Прежде чем что-то анализировать, его действительно следует проверить. Определение кода в StackExchange довольно неплохо , imo. В Python примеры, которые я упомянул, не являются «небольшими оптимизациями». Разработчик Python, который не использует эти шаблоны, очень неопытен, отстал или некомпетентен. Это основные элементы языка.
jpmc26
21

Возможно, они попросили вас пересмотреть код Python именно потому, что вы не знаете Python . Есть теория управления, что полезно иметь «дурака» в команде. Я не называю вас плохим именем :) Идея в том, что команда может страдать от группового мышления и развития туннельного видения. Один из способов избежать этого - включить в команду кого-то, кого другие члены команды сочли бы «дураком», то есть того, кто не знает предмета. Вы будете задавать вопросы, чтобы информировать себя, и вопросы будут исходить из точки зрения, которую другие члены команды, вероятно, никогда не рассматривали.

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

user2023861
источник
1
Это должен был быть мой ответ. Я бы просто добавил, что в любой данный день с любой данной подпрограммой Python и любой заданной группой гуру Python ... этот код - GARBAGE.
Dwoz
И часто, простой акт объяснения чего-то «дураку» вызывает «Дох!» момент от «эксперта», когда они внезапно осознают, что код не выполняет то, для чего он предназначен, или пропускает какой-то ключевой крайний случай. Это также достойный способ начать распространение знаний.
TripeHound
21

Обзор кода не касается поиска переменных с неправильным написанием и неправильным форматированием. Если вы используете проверку кода, чтобы найти такие вещи, то прекратите тратить свое время и пользуйтесь инструментом.

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

Поскольку я программирую на C ++ , и я недостаточно хорошо знаю Python, я бы не посмел пересмотреть код Python. Однако я мог бы помочь с обзором кода Java.

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

BЈовић
источник
23
В самом деле, у вас есть инструмент, который может отличить плохо названные переменные от хороших? Я был бы очень заинтересован в том, чтобы увидеть его.
Давор Адрало
1
@ DavorŽdralo Я знаю, что в Java есть Checkstyle. Более формальные инструменты статического анализа являются общими для многих языков, и обеспечение их соблюдения стандарта кодирования обычно является наименьшей из их обязанностей.
Shaz
9
У меня есть ощущение, что между определениями Code Review есть небольшая разница, напоминает мне этот вопрос о CR Meta: Что такое Code Review? , Я бы не стал исключать что-то конкретное и сказать: «Code Review - это НЕ XYZ» Похоже, вы говорите, что опытным программистам не требуется пересматривать свой код, с чем я очень не согласен.
Саймон Форсберг
3
@SimonForsberg Это не то, что я говорю. Даже старшие программисты могут чему-то научиться в хорошем обзоре кода. Но если единственными комментариями являются «вы неправильно указали здесь переменную» - то есть комментарии, то они напрасно тратят свое время.
BЈовић
2
@ BЈовић Нет, это не худшее, что вы можете найти, но оно довольно близко к "самой маленькой найденной вещи, которая все еще стоит".
Ватин
11

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

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

Адам Цукерман
источник
7

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

Некоторый опыт, которым вы можете поделиться, не зная языка:

  • Базовые знания.
  • Общий объектно-ориентированный дизайн.
  • Общие практики программирования: наименование, ясность и т. Д.

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

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

Карл Билефельдт
источник
5

Это может быть беспроигрышная ситуация. Я бы даже сказал, что вы можете быть особенно ценным рецензентом, потому что вы - девственница Python, которая не была испорчена Проклятием Знаний .

Подумайте об этом так: если код достаточно ясен, чтобы даже Python-девственница могла его понять, то это должен быть хороший код. Части, которые у вас есть проблемы с пониманием, могут быть кандидатами на доработку или лучшее комментирование.

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

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

200_success
источник
2

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

Майкл Кей
источник
1

Несколько замечаний:

1) Если вы опытный разработчик, вы приобретете Python (или хотя бы столько, сколько вам нужно знать), просто работая с ним. Это будет случай «учиться на практике». Поначалу это будет сложно, но с выбором языка вам станет легче. Думайте об этом как о возможности выучить другой язык (люди часто изучают «иностранные» языки через «погружение»).

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

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

Том Ау
источник
1
Я сомневаюсь, что рассмотрение кода представляет собой «обучение на практике» в значительной степени. Возможно, мой опыт рецензирования отличается от вашего, но там очень редко бывают содержательные или содержательные записи кода, и почти никогда не выполняется.
Эзотерическое псевдоним
@EsotericScreenName - я думаю, это зависит от того, сколько обратной связи вы получите от того, кто написал или знает код. Это также более вероятно в области домена, в которой вы работаете с другим языком, что делает его более релевантным, чем типичный пример кода. Большинство примеров кодирования просто показывают, как делать небольшие фрагменты такта, и редко показываются как часть большого проекта.
JeffO
0

Это зависит от того, какова цель обзора; т.е. что вы подразумеваете под эффективным .

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

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

Стоит ли этот результат того времени, которое вы потратили на это, во многом зависит от проекта.

Джимбо Джонни
источник