Igr
Igr личный блог
06 марта 2019, 14:40

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

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

 

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

48 Комментариев
  • Андрей К
    06 марта 2019, 14:41
    Если профессионально к делу подходить, то конечно надо с блок схемы. По ней потом писать код. Если такой метод приживется, разработки будут качественней со временем.

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

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

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

      • T-800
        06 марта 2019, 15:13
        Igr, можно на ватмане, если схема большая, так нагляднее.
        • Андрей К
          06 марта 2019, 15:56
          Апостол Андрей, 
          , можно на ватмане, ес
          у меня недавно озарение пришло, я подскочил, под рукой не было листка, стал вообще рисовать мелками на детской доске из Икеи у дочки =))
          • T-800
            07 марта 2019, 10:24
            Андрей К, да шучу я)
  • Turbo Pascal
    06 марта 2019, 14:47
    Практически — схемку на листе бумаги, потом побольше комментариев в код. Чем больше тем лучше. У меня иногда на 1 строчку кода 5-6 строк комментариев — что там и зачем.
  • Тарас Громницкий
    06 марта 2019, 14:48

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

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

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

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

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

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

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

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

     

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

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

  • Eldar Shaymardanov
    06 марта 2019, 14:56
    Я перешёл на модель отдельная логика (блок) — отдельный файл. И побольше комментариев.
    Каждый файл отвечает за свою задачу.
  • Turbo Pascal
    06 марта 2019, 15:04
    Даже скажу больше по поводу комментариев.
    Иногда, если алгоритм сложен, я пишу огромную простыню развернутого текста — что, как, куда писать, откуда брать. Фактически, пишу программу, но на русском языке. Потом вычитываю.
    Потом начинаю писать код прямо между абзацами этого текста, а текст превращаю в комментарии.
    Вот так иногда и получается, что в файле из 500 строк — кода только строк 20-30. Зато он предельно понятен, даже если поднять его через 5 лет.

    p.s.
    Помнится, какбэгоботу я этого всего объяснить так и не смог — этот рукожоп предпочитал присылать код без единой строчки комментариев.
      • Андрей К
        06 марта 2019, 15:26
        Igr, 
        может не хочет что б заказчик мог разобраться
        оставлять комменты — это культура программирования. Если не оставляет комменты, как он потом через год менять код будет по запросу заказчика
  • Serg Prismotrov
    06 марта 2019, 15:13
    Вы затронули большую-большую проблему!
    Пишу комментарии, чем больше тем лучше. Плохой коммент лучше никакого. Пишу и долго обдумываю название функций и объектов.  

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

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

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

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

    У вас получается много-много unit tests, которые в хорошей IDE запускается пакетом. Если вы модифицировали код, запустили тесты, а они не прошли — значит ваши изменения (коммит) с багами.  
    Для серьёзных проектов помогает.
    Мне не подошло, много исследовательской работы на тяп ляп и в ней не до серьёзных подходов.
  • Karim
    06 марта 2019, 15:41
    Блок-схема алгоритма это для линейного программирования, канувшего в лету. Ну или если очень простенькая прога. А так ООП. Там немного все иначе.
    • Андрей К
      06 марта 2019, 15:43
      Karim, блок схемы есть разного характера. Как глобальные с описанием общей логики, так и частного характера, например алгоритм сдвигания заявок в стакане.
  • Friendly Deep Space
    06 марта 2019, 15:52
    Я хоть и не программист, но даже пользуясь простыми (так говорят, хех) языками типа AFL, я начал понимать, что такое вовремя оставить комментарий к коду. Иной раз достаешь что-то старое, затестил, возможно даже плюсует, а что именно оно делает и зачем уже не вспомнить без разборок с кодом. Теперь краткую логику можно описать в названии, двумя-тремя сокращенными словами, уже будет запоминаться ассоциация глядя на список файлов или каталогов, потом в начале кода можно описать подробную логику, ход разработки и теста, и правки по очередности (патчи, типа))
    • sortarray sortarray
      06 марта 2019, 17:41
      Friendly Deep Space, на самом деле, зачастую, комментарии порождают такой же ад, проще код прочитать, чем комментарии. При сопровождении, любое изменение нужно отражать, кто-то на это ложит, в итоге это все превращается в помойку и не работает, коментарии не соответствуют.
      Даже свои собственные комментарии не так просто понять через годик-второй.
      Вместо того чтобы на логике концентрироваться, будешь голову ломать как все лучше описать.
      Это все ложная религия
    • sortarray sortarray
      06 марта 2019, 17:49
      Friendly Deep Space, А в конечном счете все превращается в нечто такое

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

      сильно помогает
  • Сергей Сергаев
    06 марта 2019, 16:25
    Блок-схема обязательно, хоть на ватмане хоть на Visio хоть в Паинте или еще где.
    Комментарии обязательно, лучше один раз подробно закоментить чем потом часами ломать голову вспоминая что-то.
    Имена переменных и констант придумываю так, чтобы по тексту программы было понятнее откуда ветер дует и от какого модуля переменная или глобальная, эти пометки в именах переменных зашиты в виде сокращения.
  • sortarray sortarray
    06 марта 2019, 17:08
    Что-то я сомневаюсь, что блок-схемы могут реально помочь выстаривать логику.
    Иногда что-то рисуешь на бумажке, но не более того.

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

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

    Если нужно что-то писать на быстром многословном, невыразительном языке, то можно взять язык прототипирования, который позволяет емко выражать логику. Подойдет пистон например.
    Еще лучше самопис или DSL.
    Идеально спроектировать язык под задачу, и решать эту задачу на этом специальном языке, а уже потом, либо шлифовать узкие места, либо переписать.
    Это позволяет сконцентрироваться на логике и забыть о нюансах
    Но это уже высший пилотаж. Это то, как должно было бы быть вообще в IT-инженерии, но не сбылось
  • Чужой
    06 марта 2019, 18:26
    Я просто на бумажке расписываю логику по пунктам, ну это в принципе та же блок схема. Рисую график и сделки, как должно быть по логике. Ленюсь только комментарии в коде делать, а надо бы
  • tores
    06 марта 2019, 19:19
    можно проще сделать. Я летом 2018 г. стукнул компьютер, отчего полетел жесткий диск, с концом. Полгода восстанавливал все алгоритмы и заново писал код. Поэтому теперь очень не плохо его помню на память.
      • Андрей Кольцов
        06 марта 2019, 20:10
        Igr, Облако Вам в помощь…
      • FullCup
        06 марта 2019, 20:27
        Igr, поддерживаю всё, что выше написано. От себя добавлю (может и есть уже выше):
        0. Логику робота действительно важно строго сформулировать и зафиксировать на бумаге или файле.
        1. на начальном этапе лучше И стол для бумаг, И стена для ватмана(-ов) и листков
        2. обязательно папки «архив» и «идеи» как в бумажном, так и в компьютерно-облачном виде. Так сказать Ваше «детище» будет связано и с прошлым и с будущим. В Microsoft Visio или Microsoft Publiser обязательно вкладки с предыдущими блок-схемы логики проги. Диалектически, предыдущие версии могут быть лучше.
        3. поддерживаю полное комментирование кода
        4. поддерживаю блочность кода. Итоговая прога — сборка модулей-программ
        5. проверка идей по очереди. Не вноси в блок-схемы и в код сразу несколько идей сразу. Одну внес-проверил-всё работает и работает как планировал, то делаем копию и только потом вносим изменения по другой идее.
        • SergeyEgorov
          08 марта 2019, 17:39
          FullCup, Ну извините. Я не думал что кого-то могут задевать плюсы и минусы к комментариям. Сам то я на эту тему «толстокож», все эти лайки-дизлайки мне глубоко фиолетовы.

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

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

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

    Вопрос в нахождении такого e+ и удостоверении в его надёжности.
  • Андрей Кольцов
    06 марта 2019, 20:17
    Лично у меня, блок-схема в голове...
    Написал в коде первый блок — запустил — проверил как работает;
    Написал в коде второй блок — запустил — проверил как работает;
    И так далее...
    Ошибки устраняются при тестировании каждого блока...
    Затем система в целом…
    • Сергей Сергаев
      06 марта 2019, 21:24
      Андрей Кольцов, Есть два основных вида ошибок:
      1.ошибка логики (например определил контртренд а ошибочно перенаправил на трендовые входы)
      2.ошибка в коде (опечатки или пропуски каких-то строк например)
      Ошибка логики как раз и находится по блок-схеме.
      То есть можно получить на выходе работающую программу и даже не заметить что она делает не совсем то, что хотел разработчик. И не факт что ошибка логики вылезет быстро, если не будет ошибок в коде то ошибка логики может и через год только выявиться или даже позже.
      Хотя если вести логи операций программы, то ошибка логики может быть выявлена довольно быстро.
      • SergeyJu
        06 марта 2019, 21:39
        Сергей Сергаев, Блок-схема одним помогает, а другим — мешает. Например, мне — только мешает. В относительно сложных программах нужны и комменты, и локальные тесты и логи. И осмысленные имена, и модульность, и этапность разработки. А еще контроль входных данных «на вшивость». Если человек работает в команде, должны быть какие-то общие правила. А если один — можно исходить из личного опыта. 
        • Сергей Сергаев
          06 марта 2019, 21:43
          SergeyJu, Соглашусь. Правда и когда работаешь один — со временем создаешь сам себе какие-то правила чтобы работать в команде «я сегодняшний» + «я завтрашний» + «я послезавтрашний» 
  • SergeyEgorov
    07 марта 2019, 11:55
    Комментарии, рисунки с блок схемами — все хрень. Я всегда сначала пишу автоматические тесты, потом пишу код. Тесты запускаются много раз в день во время разработки. И никогда не врут. Если тесты упали, значит они рассинхронизировались с кодом.
  • SergeyEgorov
    07 марта 2019, 11:58
     Сложные алгоритмы я разбиваю на много-много маленьких классов и методов, для каждого из которых всегда сначала пишу тест, потом реализацию. Прежде чем из множества методов собрать сложный алгоритм, я пишу интеграционный тест и затем делаю реализацию. Для управления состоянием сложной обработки можно использовать «контейнер состояния» вроде Redux-а.
  • SergeyEgorov
    07 марта 2019, 12:00
     Пример теста для алгоритма, который из заявок сводит сделки.
  • tranquility
    07 марта 2019, 13:35
    Я до блок-схем не дорос еще, видимо. Комментарии писать лень, да и потребности их читать за собой не замечаю. Зато для каждого нового куска кода пишу тестирующую функцию, которая на выходе обычно выдает текстовый файл размером в десятки мегабайт. При этом нужно добиться того, чтобы получаемый файл полностью совпадал с аналогичным полученным совершенно другим способом — условно говоря, предыдущей версией кода. При таком подходе отлавливаются все ошибки и остаются для истории примеры корректного использования кода.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн