Блог им. Igr

Вопрос тем кто пишет роботов

    • 06 марта 2019, 14:40
    • |
    • Igr
  • Еще

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

 

примеру из вашей практики буду благодарен 

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

Пока рисуешь блок схему,  сразу вылезает много подводных камней, которые на бумаге сразу и решаются.
avatar
Андрей К, блок схему в ручную на листочке или в проге какой? 
avatar
Igr, в проге. Использую Microsoft Visio, либо Microsoft Publiser. Сейчас если найду что из не секретного, покажу
avatar

Igr, 
вот в Visio я подобные отчеты себе рисую с блок схемами (там одна есть)

https://cloud.mail.ru/public/t68c/moEkBWbp9

avatar
Igr, можно на ватмане, если схема большая, так нагляднее.
avatar
Апостол Андрей, 
, можно на ватмане, ес
у меня недавно озарение пришло, я подскочил, под рукой не было листка, стал вообще рисовать мелками на детской доске из Икеи у дочки =))
avatar
Андрей К, да шучу я)
avatar
Практически — схемку на листе бумаги, потом побольше комментариев в код. Чем больше тем лучше. У меня иногда на 1 строчку кода 5-6 строк комментариев — что там и зачем.
avatar

Это вопрос прямо отсылающий к архитектуре.

Универсальных решений здесь нет.

Но имеются относительно стандартные подходы.

Чтобы грамотно декомпозировать программу нужно иметь представление как минимум о базовых паттернах.

На эту тему рекомендую https://www.ozon.ru/context/detail/id/2457392/

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

Но должен предупредить, что прочитать книгу, понять и освоить — это 3 разные вещи.

Между которыми может пройти не один год.

 

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

Документация и комментарии сами собой разумеются.

Я перешёл на модель отдельная логика (блок) — отдельный файл. И побольше комментариев.
Каждый файл отвечает за свою задачу.
avatar
Даже скажу больше по поводу комментариев.
Иногда, если алгоритм сложен, я пишу огромную простыню развернутого текста — что, как, куда писать, откуда брать. Фактически, пишу программу, но на русском языке. Потом вычитываю.
Потом начинаю писать код прямо между абзацами этого текста, а текст превращаю в комментарии.
Вот так иногда и получается, что в файле из 500 строк — кода только строк 20-30. Зато он предельно понятен, даже если поднять его через 5 лет.

p.s.
Помнится, какбэгоботу я этого всего объяснить так и не смог — этот рукожоп предпочитал присылать код без единой строчки комментариев.
avatar
Turbo Pascal,  ну он же за бабки пишет, может не хочет что б заказчик мог разобраться) вдруг сам начнёт писать или его код исправлять, или ошибки сам быстрее и кучу найдёт… мало ли какие у него соображения
avatar
Igr, 
может не хочет что б заказчик мог разобраться
оставлять комменты — это культура программирования. Если не оставляет комменты, как он потом через год менять код будет по запросу заказчика
avatar

Андрей К, ну может у него и есть экземпляр с коментами 

 

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

avatar
Вы затронули большую-большую проблему!
Пишу комментарии, чем больше тем лучше. Плохой коммент лучше никакого. Пишу и долго обдумываю название функций и объектов.  

Названия получаются длинные, выглядят неэстетично, но потому легче вспомнить.

Использую рефакторинг и агрессивно выношу куски кода в отдельные модули-файлы.

avatar
Serg Prismotrov, рефакторинг — это что, можно пример? 
avatar
Igr, это изменение кода с помощью IDE (редактора) в несколько кликов. Например переименовываете функцию — а она везде в коде меняет название, даже в модулях. Или одним кликом функцию можно вынести в отдельный файл-модуль. 
avatar
Serg Prismotrov, длинные как раз нормально выглядят.
Короткие названия приживаются из-за закомплексованности адептов. Они в своем стремлении показать мнимую лаконичность экономят на каждой букве.
На самом деле это обезьяний стиль. Он больше всего у нас заметен в перле и хаскеле, к слову. Причем, если перл действительно сахарнолаконичный, то в хаскеле каждую такую лаконичность кучей свистоперделок еще надо снабдить.

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

Eugene Logunov, спасибо

я один, самоучка 

avatar
Об ошибках: Мне этот способ не прижился, но некоторым нравится: Unit tests. Вы создаёте много проверочных тестов, простых и сложных для своих подпрограмм, объектов, функций, модулей. Ну вот считаете RSI, а он же в диапазоне 0.100 должен быть. Unit test такой — случайная выборка (искусственные цены) отдаётся вашей subroutine, выход должен быть в диапазоне 0..100, если нет — unit test не пройден. 

У вас получается много-много unit tests, которые в хорошей IDE запускается пакетом. Если вы модифицировали код, запустили тесты, а они не прошли — значит ваши изменения (коммит) с багами.  
Для серьёзных проектов помогает.
Мне не подошло, много исследовательской работы на тяп ляп и в ней не до серьёзных подходов.
avatar

Serg Prismotrov, прога для теста прог?  не, это слишком для меня

 

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

avatar
Блок-схема алгоритма это для линейного программирования, канувшего в лету. Ну или если очень простенькая прога. А так ООП. Там немного все иначе.
avatar
Karim, блок схемы есть разного характера. Как глобальные с описанием общей логики, так и частного характера, например алгоритм сдвигания заявок в стакане.
avatar
Я хоть и не программист, но даже пользуясь простыми (так говорят, хех) языками типа AFL, я начал понимать, что такое вовремя оставить комментарий к коду. Иной раз достаешь что-то старое, затестил, возможно даже плюсует, а что именно оно делает и зачем уже не вспомнить без разборок с кодом. Теперь краткую логику можно описать в названии, двумя-тремя сокращенными словами, уже будет запоминаться ассоциация глядя на список файлов или каталогов, потом в начале кода можно описать подробную логику, ход разработки и теста, и правки по очередности (патчи, типа))
avatar
Friendly Deep Space, на самом деле, зачастую, комментарии порождают такой же ад, проще код прочитать, чем комментарии. При сопровождении, любое изменение нужно отражать, кто-то на это ложит, в итоге это все превращается в помойку и не работает, коментарии не соответствуют.
Даже свои собственные комментарии не так просто понять через годик-второй.
Вместо того чтобы на логике концентрироваться, будешь голову ломать как все лучше описать.
Это все ложная религия
avatar
Friendly Deep Space, А в конечном счете все превращается в нечто такое

push(myElement, myArray)// Here we pushed myElement to MyArray

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

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

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

Если нужно что-то писать на быстром многословном, невыразительном языке, то можно взять язык прототипирования, который позволяет емко выражать логику. Подойдет пистон например.
Еще лучше самопис или DSL.
Идеально спроектировать язык под задачу, и решать эту задачу на этом специальном языке, а уже потом, либо шлифовать узкие места, либо переписать.
Это позволяет сконцентрироваться на логике и забыть о нюансах
Но это уже высший пилотаж. Это то, как должно было бы быть вообще в IT-инженерии, но не сбылось
avatar
Я просто на бумажке расписываю логику по пунктам, ну это в принципе та же блок схема. Рисую график и сделки, как должно быть по логике. Ленюсь только комментарии в коде делать, а надо бы
avatar
можно проще сделать. Я летом 2018 г. стукнул компьютер, отчего полетел жесткий диск, с концом. Полгода восстанавливал все алгоритмы и заново писал код. Поэтому теперь очень не плохо его помню на память.
avatar

Max, ) я на флешечку копирую) 

но надо бы винт запасной иметь .... 

avatar
Igr, Облако Вам в помощь…
Igr, поддерживаю всё, что выше написано. От себя добавлю (может и есть уже выше):
0. Логику робота действительно важно строго сформулировать и зафиксировать на бумаге или файле.
1. на начальном этапе лучше И стол для бумаг, И стена для ватмана(-ов) и листков
2. обязательно папки «архив» и «идеи» как в бумажном, так и в компьютерно-облачном виде. Так сказать Ваше «детище» будет связано и с прошлым и с будущим. В Microsoft Visio или Microsoft Publiser обязательно вкладки с предыдущими блок-схемы логики проги. Диалектически, предыдущие версии могут быть лучше.
3. поддерживаю полное комментирование кода
4. поддерживаю блочность кода. Итоговая прога — сборка модулей-программ
5. проверка идей по очереди. Не вноси в блок-схемы и в код сразу несколько идей сразу. Одну внес-проверил-всё работает и работает как планировал, то делаем копию и только потом вносим изменения по другой идее.
avatar
FullCup, Ну извините. Я не думал что кого-то могут задевать плюсы и минусы к комментариям. Сам то я на эту тему «толстокож», все эти лайки-дизлайки мне глубоко фиолетовы.

P.S. Ну вот! Хотел наплюсовать ваш комментарий, чтобы вы так не расстраивались, а вы меня уже в бан отправили.  
avatar
Igr, 2019 год на дворе. В интернете полно бесплатных сервисов для управления постоянно изменяющимися файлами — github.com, bitbucket.org, gitlab.com. Миллионы программистов и непрограммистов пользуются ими. Хранят там исходный код, статьи, книги, переводы.
avatar
бабочка

Для разворотных алгоритмов использую схемы в виде бабочек таких.
Идёт поток данных, используются состояния нахождения «робота».
Вначале состояние 0, нет позиций. 
Основной цикл 0, 11, 12.
Предположим, имеется хороший признак, позволяющий ходить от 11 к 12 и обратно в среднем с прибылью. На рисунке наступление его обозначено e+.

Часто добавление трейлинг-стопа результаты ещё улучшает. На схеме состояния 13 и 14. То есть если прошли достаточно в нужную сторону (от 11 к 13), то дальнейшие события: разворот по признаку e+ (от 13 к 12) или стоп (небольшой выигрыш, от 13 к 0).

Вопрос в нахождении такого e+ и удостоверении в его надёжности.
avatar
Лично у меня, блок-схема в голове...
Написал в коде первый блок — запустил — проверил как работает;
Написал в коде второй блок — запустил — проверил как работает;
И так далее...
Ошибки устраняются при тестировании каждого блока...
Затем система в целом…
Андрей Кольцов, Есть два основных вида ошибок:
1.ошибка логики (например определил контртренд а ошибочно перенаправил на трендовые входы)
2.ошибка в коде (опечатки или пропуски каких-то строк например)
Ошибка логики как раз и находится по блок-схеме.
То есть можно получить на выходе работающую программу и даже не заметить что она делает не совсем то, что хотел разработчик. И не факт что ошибка логики вылезет быстро, если не будет ошибок в коде то ошибка логики может и через год только выявиться или даже позже.
Хотя если вести логи операций программы, то ошибка логики может быть выявлена довольно быстро.
Сергей Сергаев, Блок-схема одним помогает, а другим — мешает. Например, мне — только мешает. В относительно сложных программах нужны и комменты, и локальные тесты и логи. И осмысленные имена, и модульность, и этапность разработки. А еще контроль входных данных «на вшивость». Если человек работает в команде, должны быть какие-то общие правила. А если один — можно исходить из личного опыта. 
avatar
SergeyJu, Соглашусь. Правда и когда работаешь один — со временем создаешь сам себе какие-то правила чтобы работать в команде «я сегодняшний» + «я завтрашний» + «я послезавтрашний» 
Eugene Logunov, 
«я такой опытный строитель, что строю дома без проекта»

Не смешите.
На коленке можно делать только собачьи будки, а не дома.
Ну, есть и гении среди нас — эти могут всё.
avatar
Комментарии, рисунки с блок схемами — все хрень. Я всегда сначала пишу автоматические тесты, потом пишу код. Тесты запускаются много раз в день во время разработки. И никогда не врут. Если тесты упали, значит они рассинхронизировались с кодом.
avatar
 Сложные алгоритмы я разбиваю на много-много маленьких классов и методов, для каждого из которых всегда сначала пишу тест, потом реализацию. Прежде чем из множества методов собрать сложный алгоритм, я пишу интеграционный тест и затем делаю реализацию. Для управления состоянием сложной обработки можно использовать «контейнер состояния» вроде Redux-а.
avatar
 Пример теста для алгоритма, который из заявок сводит сделки.
avatar
Я до блок-схем не дорос еще, видимо. Комментарии писать лень, да и потребности их читать за собой не замечаю. Зато для каждого нового куска кода пишу тестирующую функцию, которая на выходе обычно выдает текстовый файл размером в десятки мегабайт. При этом нужно добиться того, чтобы получаемый файл полностью совпадал с аналогичным полученным совершенно другим способом — условно говоря, предыдущей версией кода. При таком подходе отлавливаются все ошибки и остаются для истории примеры корректного использования кода.
avatar

теги блога Igr

....все тэги



UPDONW
Новый дизайн