LINUX.ORG.RU

Как не говнокодить?

 ,


0

1

Приветствую!

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


Ответ на: комментарий от wandrien

POSIX.1-compatible Shell

Плавали — знаем.

Где плавали-то? В Linux уже давно Bash везде, где только можно (разве что в каком-нибудь маргинальном Alpine всё ещё ash).

Не вопрос, напишем. Цена вопроса?

Мне-то оно зачем?
Хотя… могу на поиграться дать одну функцию на 60 строк. Устранишь баг за сутки — заплачу $20, если нет — ты мне $20, идёт? ☺ Не буду рассказывать предысторию, пусть это будет сюрпризом. xD

mord0d ★★★★★ ()
Ответ на: комментарий от mord0d

Где плавали-то? В Linux уже давно Bash везде, где только можно (разве что в каком-нибудь маргинальном Alpine всё ещё ash).

Приходилось. Или ты думаешь, только BSD-бояре остались?

Мне-то оно зачем?

Ты же говоришь: нужно. Кому еще?

Например, лично мне не нужно: писать на чистом sh я из любви к искусству буду разве что сильно пьяным. За деньги — другое дело.

Хотя… могу на поиграться дать одну функцию на 60 строк. Устранишь баг за сутки — заплачу $20, если нет — ты мне $20, идёт? ☺ Не буду рассказывать предысторию, пусть это будет сюрпризом. xD

Выкладывай так на форум, бесплатно обсудим. :D

wandrien ()
Ответ на: комментарий от dsxl

Ну ок, как ты определяешь, что человек не программист?

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

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от wandrien

Приходилось. Или ты думаешь, только BSD-бояре остались?

Просто слишком часто натыкаюсь на специализдов, которые в итоге обмазываются башизмами, и начинают отмазываться типа «ну работает же!»

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

У меня есть машины (количество постепенно растёт) на FreeBSD, их надо обслуживать не устанавливая кучу шлака из портов/пакетов. То есть либо писать на сишке и компилять под каждую архитектуру, либо писать универсальный шеллскрипт. Очевидно, что я выбрал последнее, так как мультилиба во фре нет. ☺

Собственно, баг в этом скрипте.

Выкладывай так на форум, бесплатно обсудим. :D

Я три недели долблюсь над этим куском кода. Знаю какие конкретно условия не срабатывают, но не могу понять почему. Но выкладывать не буду — это не попенсорц! :3

mord0d ★★★★★ ()
Ответ на: комментарий от peregrine

слишком далёкую от реальности штуку

То есть когда 5 человек, которые за неделю не могу локализовать баг в пандасе, названы говнокодерами и дата-саентистами, то это очень далёко от реальности?

Хорошим примером является борьба с багом. Локализовать его мало.

Это никак не отменяет факта, что 5 человек за неделю не смогли даже локализовать баг, не то что исправить его.

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

Другими словами, потому что весь проект написан говнокодерами и нужно всё за ними переписывать.

Кстати, я посмотрел твой тред про пандас. Применяешь оператор для булевых векторов к какой-то колонке из csv, предварительно не сконвертировав её в бул, применяешь индексатор, хотя в доках рекомендуют использовать loc/iloc и т.п. Ну это же типичный говнокод. Скорее всего ваш «баг» в пандасе заключается в том, что вы не читали документацию, а бездумно копировали обрывки со стек оверфлоу.

dsxl ()
Ответ на: комментарий от mord0d

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

А у меня как-то раз был баг, который мне голову сломал. Смотрю под отладчиком. перед вызовом функции значения правильные, а сразу внутри - неправильные! Уже думал, что нашёл баг в виртуальной машине, а оказалось аргументы в неправльном порядке передавались просто. С тех пор я параметры одного типа стараюсь не ставить рядом, а если ставлю, то во всех функциях в одном порядке; если язык позволяет указывать имена агрументов – указываю.

dsxl ()
Ответ на: комментарий от dsxl

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

Но перепутанные аргументы и разыменование NULL – это ернуда по сравнению с отладкой многопоточного кода.

Особенно когда при сборке с -O0 -g всё начинает работать.

wandrien ()
Ответ на: комментарий от dsxl

Это никак не отменяет факта, что 5 человек за неделю не смогли даже локализовать баг

Наверное потому что у них не один таск на неделю? И есть ещё дурное руководство, которое хочет чтобы всё работало ещё вчера.

ЗЫ

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

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 4)
Ответ на: комментарий от wandrien

ернуда по сравнению с отладкой многопоточного кода.
Особенно когда при сборке с -O0 -g всё начинает работать.

Многопоточный код в си (да и джавах/сишарпах) это адок, да. Сочувствую что приходится этим заниматься.

dsxl ()
Ответ на: комментарий от dsxl

Да был бы это сишный или хотя бы питоний код, я бы с такой проблемой просто не столкнулся, а тут шеллскрипт, который в принципе не дебажится.

mord0d ★★★★★ ()
Ответ на: комментарий от dsxl

Многопоточный код в си (да и джавах/сишарпах) это адок, да. Сочувствую что приходится этим заниматься.

Смешно. В С/С++ довольно простая отладка многопоточного кода, потому что есть санитайзеры. Лучше только в Rust.

fsb4000 ★★★★★ ()
Ответ на: комментарий от fsb4000

Спасибо, буду знать. Но в джаваскрипте всё равно проще.

dsxl ()
Ответ на: комментарий от olelookoe

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

mord0d ★★★★★ ()
Ответ на: комментарий от mord0d

либо писать на сишке и компилять под каждую архитектуру, либо писать универсальный шеллскрипт

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

Nervous ★★★★★ ()
Ответ на: комментарий от mord0d

$cat test.sh

#!/bin/sh

LOG_FILE=testme.log
exec 3>&1 1>>${LOG_FILE} 2>&1

set -xv
# debug enabled

cd /var/log/
for i in "*.log"; do
 du -sh $i
done

set +xv
#debug disabled


$cat testme.log

cd /var/log/
+ cd /var/log/
for i in "*.log"; do
 du -sh $i
done
+ du -sh alternatives.log apport.log auth.log boot.log bootstrap.log dpkg.log fontconfig.log gpu-manager-switch.log gpu-manager.log kern.log mail.log ubuntu-advantage.log
0	alternatives.log
4,0K	apport.log
196K	auth.log
0	boot.log
104K	bootstrap.log
32K	dpkg.log
16K	fontconfig.log
4,0K	gpu-manager-switch.log
4,0K	gpu-manager.log
764K	kern.log
8,0K	mail.log
0	ubuntu-advantage.log

set +xv
+ set +xv


olelookoe ()
Ответ на: комментарий от Nervous

Ларри дал ему перл

Дять, перл из базовой системы во фряхе выпилили уже, с разморозкой!

Конечно, на некоторых машинах он ставится зависимостью из пакетов, но ставить его специально для своей скриптоты я могу не везде, да и не хочу (а не хочу не в последнюю очередь потому что Perl всегда дереференсит симлинки!).

он хочет кушать кактус

Альтернативы ничуть не лучше.

---

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

А когда надо ехать, инструмент выбирается из доступных.

mord0d ★★★★★ ()
Ответ на: комментарий от olelookoe

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

"*.log"

В POSIX Shell в двойных кавычках глоббинг не работает.

du -sh $i

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

mord0d ★★★★★ ()
Ответ на: комментарий от mord0d

В POSIX Shell в двойных кавычках

суть не в том, что там между # debug enabled и # debug disabled, суть в том что ты можешь сдампить в лог всю дебажную инфу, после чего распарсить выхлоп глазками и найти проблему.

olelookoe ()
Последнее исправление: olelookoe (всего исправлений: 1)
Ответ на: комментарий от olelookoe

Как будто я этого уже не сделал. ☺

Я ведь уже писал что локализовал проблему.

---

Потыкал этот shellcheck. Отчасти оно, конечно, хорошо, но очень часто порет чушь. Например срёт SC2046 на заведомые int: в строках типа [ $somevar -gt 0 ] предлагает обернуть в двойные кавычки $somevar; да если там будет !int, test пошлёт нахер, потому что -gt.

mord0d ★★★★★ ()
Последнее исправление: mord0d (всего исправлений: 1)

Говнокод - это стандарт кровавого энтерпрайза. Хуяк-хуяк и продали.

AUX ★★★ ()
Последнее исправление: AUX (всего исправлений: 2)

Вывожу рандомные строчки из файла:

shuf -n 5 file.txt | awk -F ' ' '{ print $1 }'

Вывод:

2C4401
4482E5
C88D83
7CB15D
74A722

Из скрипта:

echo $(shuf -n 5 file.txt | awk -F ' ' '{ print $1 }')
F4559C 00219E 283152 3CBBFD 9852B1

Почему во втором случае вывод идет в виде строки, а не столбика?

D3306 ()

Как не говнокодить?

Не писать сколь-нибудь сложных программ на shell.

X512 ★★ ()

рекомендации

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

  • Есть код, который должен выпоняться как можно быстрее.
  • Есть код, который должен занимать минимум памяти.
  • Есть код, который должен легко читаться.
  • Есть код, который должен легко читаться новичком/учеником.
  • Есть код, который должен легко читаться человеком без знания английского.
  • Есть код, который должен легко отлаживаться.
  • Есть код, который должен легко модифицироваться.
  • Есть код, который должен просто ожидаемо отработать один раз, и тогда все остальные пункты не имеют значения, а единственным критерием качества является отсутствие багов.
kogoth ()
Ответ на: комментарий от kogoth

Качество кода — это то, насколько хорошо код выполняет свою задачу

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

Nervous ★★★★★ ()
Ответ на: комментарий от Nervous

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

D3306 ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей