Как просмотреть код, который вы не понимаете?

25

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

В нашей компании 3 программиста. Я веб-программист, мои известные языки в основном PHP, ActionScript и JavaScript. Два других разработчика пишут внутренние приложения на VB.net

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

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

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

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

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

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

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

Что бы вы порекомендовали мне сделать в этой ситуации.

JD Исаакс
источник
6
Вам трудно понять код VB? вы уверены? позвольте мне спросить это снова вы уверены! :)
Darknight
4
Вы не заинтересованы в изучении VB? Тогда вам, вероятно, следует отказаться от выполнения анализа кода VB-кода!
JacquesB

Ответы:

22

Ваши личные желания изучать другие вещи должны отойти на второй план, чтобы узнать, что вам действительно нужно для вашей работы прямо сейчас. Узнайте VB.net. Вы можете эффективно кодировать код, который вы не понимаете, когда вы знаете язык, на котором он написан, задавая много вопросов (обычно это признак того, что код плохо написан, если вы знаете язык и не можете понять, что он делает, и Зачем). Но, не понимая код, лучшее, что вы можете сделать, это заставить их объяснить вам и надеяться, что они обнаружат любые ошибки в процессе объяснения. Не то чтобы я не нашел ошибок в своем собственном коде в обзоре, просто делая это, но это не самый эффективный способ проверки кода. Проверка кода теперь является частью вашей работы, разберитесь с ней и узнайте, что вам нужно, чтобы научиться делать это эффективно.

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

HLGEM
источник
5
+1 Для того, чтобы узнать, что вам нужно учиться, а не то, что вы хотите учиться. Желательно, чтобы выучить оба - изучение языков это быстро.
Orbling
1
+1: Относительно «заставить их показать вам», более мягкий способ - спросить, есть ли у них какие-то книги или около того, где объясняются эти принципы, чтобы вы могли учиться. То же самое, только меньше атакующих. И люди не любят, когда на них нападают.
Йорис Мейс
@Joris Meys, да, вы можете и должны делать это вежливо, но их нужно подтолкнуть, чтобы ответить вам, прежде чем вы сможете подтвердить проходы кода, если они ответят «потому что я так сказал».
HLGEM
1
@ Джефф О: Я не считаю вежливость всегда привилегией. В рабочей среде это также важный инструмент, чтобы получить то, что вы хотите. Или чтобы передать сообщение таким способом, который трудно противостоять. Никто не может называть вас именами за вежливость ...
Джорис Мейс
1
@ Джефф О, быть вежливым не значит быть половиком. Это означает, что спросить на профессиональном уровне нейтральным тоном. Вы можете настаивать на ответ, не будучи грубым. Грубость никогда не уместна на рабочем месте. Вам всегда придется работать с людьми, которые вам не нравятся или которые вас злят, но никогда не стоит вести себя плохо по отношению к ним. Когда вы это делаете, основной человек, которому вы причиняете боль, - это вы сами, потому что другие потеряют к вам уважение.
HLGEM
13

На самом деле, я не согласен со всем вышесказанным. С JS / PHP / ActiopnScript у вас есть фундаментальное понимание того, что есть язык программирования и как он работает. На самом деле, я бы сказал, что между VB и JS много общего. Однако это не моя точка зрения. Даже если вы очень хорошо разбираетесь в языке, вы легко можете что-то упустить из виду, пытаясь проследить за чьими-то чужими мыслительными процессами, поэтому обзор должен дать возможность программисту объяснить, что он (а) сделал и почему.

Однажды моя подруга описала это как «Теорию Дворника»: объясняя детали кому-то, кому-либо, даже уборщику, программист раскрывает для себя любые слабые места в коде, что, конечно, является конечной целью обзора. процесс. Тем не менее, требуется, чтобы код был подробно и открыто объяснен (обзоры не работают, когда разработчики защищаются).

fishywiki
источник
4
+1 Для Теории Дворника - то, что я обычно называю «звучащей доской», любой, кто может слушать и задавать вопросы, хорош, даже если он просто стоит там, это помогает.
Orbling
1
Ключ в том, чтобы все говорили и работали вместе. Не ставьте свою команду в оборону - ничто не остановит производительность быстрее, чем все, работающие на себя.
IAbstract
7

Короткая версия

  1. Помните, что рецензии кода - это шанс для рецензента и рецензента узнать.
  2. Фраза обратной связи как вопрос.
  3. Не позволяйте недостатку знаний помешать вам предоставить обратную связь (пока вы занимаетесь # 2).
  4. Избегайте «обзоров предпочтений» или, по крайней мере, попытайтесь дать понять, что это ваши личные предпочтения, и с ними не обязательно соглашаться.
  5. Попробуйте представить патчи вместо того, чтобы быть «рецензентом кода кресла».

Длинная версия

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

Имея это в виду, есть один совет по проверке кода, который я всегда находил полезным в целом, но он особенно уместен в вашей позиции. Напишите свой отзыв в форме вопроса, а не в виде утверждения. Другими словами, вместо того, чтобы сказать «Этот код - отстой!», Вы можете сказать: «Почему вы написали код таким образом, вместо того, чтобы делать ...» Это делает процесс проверки кода более приятным и позволяет также учиться.

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

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

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

Джейсон Бейкер
источник
По поводу «предпочтений»: представьте, что я написал код, вы его просмотрели, и мне пришлось изменить его из-за ваших предпочтений. Теперь вы вносите небольшое изменение, я проверяю это и заставляю вас все это изменить обратно из-за моих предпочтений. Должно быть очевидно, что это крайняя ерунда.
gnasher729
7

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

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

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

Фокус на дизайне (это было упомянуто). Если им трудно поддерживать текущий код, посмотрите некоторые инструменты рефакторинга для VB. Многие из основных практик одинаковы.

JeffO
источник
5

Вы можете «прочесть» материал, который вы на самом деле не знаете, но вы не можете адекватно просмотреть его. Я очень компетентен в C, знаю C ++ достаточно хорошо, но я бы не мечтал о рассмотрении чего-либо в C #.

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

Тем не менее, это будет зависеть от конкретного разработчика, который знает язык, чтобы интерпретировать результат. Например, если рецензент кода отказался от использования возвращаемого значения printf(), я бы посмотрел на них странно и поставил под сомнение их трезвость, а затем спросил: «Хорошо, отлично, что я могу сделать, если на консоль не может быть выведено ничего, что могло бы быть полезным?"

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

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

Тим Пост
источник
4

Предоставление руководства по тому, чего вы не понимаете, похоже на то, как слепой ведет слепого, поскольку вы хорошо осведомлены.

Один из подходов состоит в том, чтобы использовать такие инструменты lint, как FxCop и StyleCop, которые будут работать с фронтом статического анализа базы кода. Это даст вам отправную точку для обсуждения отчетов, которые генерируются из инструментов.

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

Аарон Макивер
источник
4

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

Хорошей новостью является то, что после того, как вы это сделаете, часть того, что вы узнали, все равно будет полезна, когда вы перейдете на C #.

Ларри Коулман
источник
9
Чтение VB - это не то же самое, что Знание VB. Я достаточно хорошо прочитал VB, чтобы переписать старый код VB на Java. Я не (и не могу) писать VB. Я думаю, что есть середина изучения достаточно VB.
S.Lott
1
@ S.Lott - хорошо сформулирован и вполне применим к любым двум случайным языкам.
Тим Пост
2
@ С. Лотт: Если вы можете прочитать VB достаточно хорошо , чтобы переписать его в Java, то вы действительно знаете , VB, и может писать. Возможно, вам придется искать вещи по ходу дела, но это продлится всего пару недель.
Ларри Коулман
@ Ларри Коулман: Я думаю, вы хорошо знаете VB. Я не мог написать это. В самом деле. Я программист на Python / Java, и ограничения и странности VB меня смущают. Много. Я бы не стал просто искать синтаксис. Я был бы довольно неспособен писать правильные программы, потому что я просто так не думаю.
S.Lott
@ S.Lott: Я знаю VB довольно хорошо, несмотря на все мои старания забыть. Если странности / ограничения VB сбивают вас с толку, разве это не вызовет проблем при переносе кода на другой язык?
Ларри Коулман
3

Мысль о том, что вам следует всегда придерживаться при проведении экспертной оценки:

«Я следующий, чтобы поддерживать этот код!»

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

Если вы не можете программировать на VB, вы не можете поддерживать код, и вы не имеете права быть рецензентом.


источник
1

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

Что вы можете сделать, выбрать / определить правила кодирования и сравнить код с этими правилами. Если что-то не соответствует рекомендациям, вы можете обратиться к разработчику за разъяснениями.

Я бы начал с выбора существующих руководств (я не знаю никаких стандартов кодирования VB.net, но Google дал мне:

Используйте stylecop как инструменты для VB .net

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

Сделав это, вы можете сказать, что код соответствует выбранным стандартам, он ничего не говорит о корректной функциональности или коде, использующем надлежащие принципы ООП. Но, по крайней мере, это что-то.

KeesDijk
источник
1

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

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

Конечно, между ними есть совпадение. Знание VB.NET позволит вам дать совет о том, почему определенный шаблон проектирования не является хорошим выбором, например, в конкретной ситуации.

Прежде всего, будьте скромны на этом этапе. Изменять процесс сложно. Даже если бы вы были гуру VB.NET, изменение, вероятно, было бы нелегким. Людям, которые не использовали рецензирование кода, сначала это не нравится. Заставить других смотреть на твой код - сложный опыт. Требуется время, чтобы увидеть ценность и терпение вокруг. Это отличный процесс, когда вы получаете бай-ин, но это займет время.

Уэйн Джонстон
источник
0

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

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

JB King
источник
0

Даже если вы изучите основы VB, выполнение обзора кода, не зная всех возможностей языка, не позволит вам обнаружить использование небезопасных функций в языке.

Предположим, что вы не знали, что функция input () в Python 2 действительно оценивала ввод перед его возвратом, чтобы упростить анализ нестроковых типов ввода. Тогда код будет уязвим для выполнения произвольного кода, что позволит пользователю ввести что-то похожее __import__('os').execl('/bin/sh', '/bin/sh')на систему Linux, чтобы превратить процесс Python в оболочку. Вместо этого следует использовать raw_input () для получения необработанных входных данных.

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

тайна
источник