Ответы пользователя по тегу Программирование
  • Как вы организуете разработку сложного продукта?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Проект развивается итерациями и фичи нагромождаются и код, естественно, не самый изящный и простой для понимания и анализа.


    Тесты, TDD, рефакторинг, SOLID. И тогда нет боли. Но это увы далеко не на каждом проекте встретишь.

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

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

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


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

    Так же рекомедную вам ознакомитсья с практиками экстримального программирования, там много внимания удиляется обратной связи от момента когда разработчик что-то сломал до момента обнаружения проблемы (парное программирование, TDD).
    Ответ написан
    3 комментария
  • Для чего программисту математика?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В каких сферах программирования активно используется математика?
    Зачем программисту дискретная математика?

    ну и там еще есть куча подобных вопросов.

    Для чего задают вопросы из области математики на собеседованиях?

    зависит от того что у вас спросили. Могли по комбинаторике погонять, могли про лагорифмическую сложность алгоритмов, могли просто по работе с матрицами... больше конкретики.
    Ответ написан
    1 комментарий
  • Как стать крутым Java EE разработчиком?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Читаем дядю Боба (Боб Мартин), Фаулера, Эванса... ну и пишем паралельно код.
    Ответ написан
    Комментировать
  • Развитие в веб программировании. Какой путь?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Какой путь?

    Прямо и немного на лево.

    проект планирую долго поддерживать хочу попробовать перейти на что-то новое

    Node.js + MongoDB


    Может не стоит? Оцените профит, риски... хорошенько подумайте. Монга как основное хранилище данных вообще весьма сомнительный выбор. Лучше храните все в mysql/postgresql и агрегируйте в монгу, используйте read model, cqrs...
    Ответ написан
    Комментировать
  • Сидячий образ жизни кодера на самом деле ухудшает здоровье?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Да, чисто сидячий образ жизни ухудшает здоровье.
    Ответ написан
    Комментировать
  • На чём написать анализатор текущего звука windows?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Снятие звука со стереомикшера не подходит, так как его аудио поток зависит от общей громкости системы.


    Тогда никак, ибо иначе придется собирать все потоки самостоятельно либо придется писать свой микшер.
    Ответ написан
    Комментировать
  • Как вести логирование запросов, действий в отдельную таблицу?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    CQRS + Event Sourcing
    Ответ написан
    Комментировать
  • Справочник по python 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Википедия, все что не понятно там - гуглиться отдельно.
    Ответ написан
    Комментировать
  • Сложный проект на node.js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Подойдёт ли node.js для сложных проектов ?

    Смотря что для вас сложные проекты.

    всё-таки не мечтать и писать на php

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

    есть ли социальные сети написаны на ноде ?

    Помню пару лет назад мелькало что-то эдакое. Но мой вам совет - не надо. Нода хуже скейлится, для чего-то сложного с ней нужно реально нормально быть знакомым и хорошо так знать js...
    Ответ написан
    9 комментариев
  • Что такое stack и heap в языке программирования?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Структура данных - Stack(LIFO), и Stack в Java - это ведь разные вещи совсем.

    Нет. Одно и то же, реализация LIFO и только. Что именно вас смущает? То что стэк на базе списка сделан?
    Ответ написан
    3 комментария
  • Как правильно запускать долгий php-скрипт?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вообще более-менее правильный подход:

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

    По поводу отслеживания прогресса все чуть интереснее. Есть как минимум 4 варианта реализации:
    - пулинг - когда периодически мы шлем ajax запрос на сервер и спрашиваем сколько там сделано
    - лонг-пулинг - оптимизация первого варианта, при которой запрос не сразу отваливается, а отваливается либо по таймауту (скажем прошло 10 секунд) или же изменилось состояние и нам нужно об этом уведомить пользователя. Как только соединение отвалилось мы обрабатываем что там нам пришло или не пришло и повторяем запрос. Профит - реалтайм нотификация, то есть как-только у нас появилась свежая информация мы можем ее получить.
    - Server-sent events, когда запрос отдается нам по кускам с разделителями. Каждый кусок отдается тогда, когда что-то на сервере поменялось. Профит тот же что и в варианте с лонг полингом только не надо разрывать соединение. Но есть куча нюансов (скажем с Apache это не прокатит) и мало кто так делает.
    - web sockets - реалтайм, полнодуплексный, удобный вариант, но нужно заводить отдельный демон.

    Самый простой вариант - простой пулинг, в вашем случае реалтайм вам не нужен, достаточно раз в 10 секунд спрашивать сервер что там как. В этом случае обработчик очереди (или дочерний процесс или еще кто) может записывать в кэш текущий статус джобы, и вы можете получать ее по идентификатору. в качестве хранилища можно использовать redis или memcache, в этом плане они идеальны.
    Ответ написан
    5 комментариев
  • Какой язык выбрать для автоматизации тестирования?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Все зависит от того что вы будете тестить. Если вы будете писать E2E тесты то лучше взять простенький динамический язык, и не PHP, хотя конечно можно и его.

    Я бы рекомендовал вам посмотреть в сторону python или javascript (ruby тоже можно, с капибарой какой, просто python универсальнее).

    Так же немаловажно учитывать на чем написан проект который вы собираетесь покрывать тестами. Если у вас есть люди в команде которые помогут вам с программированием то это несомненнно будет плюсом.
    Ответ написан
    Комментировать
  • Как реализованно это меню хабрахабра?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это называется navigation drawer
    Ответ написан
    Комментировать
  • С чего начать изучение написания TDD - тестов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нужно писать TDD тесты.

    Нет, нет такой вещи как "TDD тесты". TDD это одна из методик экстремального программирования (XP). Вам уже привели ссылку на книгу Кента Бэка на эту тему (к слову крайне рекомендую)

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

    - Красный - перед тем как написать код, мы должны написать тест который ломается (обычно в консоли сломанные тесты подсвечиваются красным). Согласно этой методологии писать код вы должны строго тогда, когда у вас есть сломанные тесты. Если сломанных тестов нет, то и код писать не нужно.
    - Зеленый - когда вы получили красные тесты, вы должны максимально быстро дописать код так. что бы тесты были зелеными. Скажем если вы написали тест который ожидает от функции, что она вернет строку "foo" то в коде у вас должно быть не больше чем сама функция и вывод строки "foo". Как только мы этого добились мы либо рефакторим, либо добавляем еще красных тестов что бы потом дописать код. Конечно настолько примитивные вещи делать по такому циклу избыточно, и у Кента Бэка описывается понятие "длины шага", то есть сколько работы мы можем делать на каждом этапе. Вы всегда должны подключать здравый смысл словом.
    - Рефакторинг - на предыдущих фазах мы не загонялись о том насколько наш код красив, насколько мы соблюдали принципы DRY и т.д. так что это фаза отчистки кода. Мы можем делать ее на каждой итерации, а можем раз в пару часов, но важно делать это как можно чаще. На этом этапе мы устраняем дублирование как в коде приложения так и в тестах. Важно отметить что хорошей мыслью будет не рефакторить одновременно и код и тесты, ибо у нас должен быть источник правды. Если мы почистили тесты и при этом они начали фэйлиться, то значит мы что-то сломали пока числити. И наоборот. А если менять и то и то между запусками тестов то не понятно кто виноват.

    Обычно TDD практикуют используя unit-тесты (что логично, ибо они выполняются достаточно быстро что бы выполнение тестов не заставляло нас заваривать чай), что подразумевает собой то, что мы тестируем один юнит (один класс или объект), а все его зависимости должны подменяться на моки (фэйковые объекты, которые нужны что бы проверить как наш объект взаимодействует с другими, об этом тоже много написано). Но никто не запрещает использовать интеграционные/функциональные тесты и при этом практиковать TDD (так например делают чуваки практикующие BDD), а Кент Бэк это дело называет ATDD.

    Собственно TDD дает нам следующие преимущества:
    - вы не тратите время на проектирование системы в микроскопических масштабах, это эволюционный подход, архитектура приложения постоянно меняется и эволюционирует вместе с требованиями. Все требования формализуются в виде тестов.
    - код всегда покрыт тестами (пусть и не на 100%, обычно хватает и 20% что бы можно было жить, все зависит от сроков жизни проекта и требуемого уровня надежности)
    - если вам становится трудно писать тесты (например много зависимостей, сложно мокать) - то это должно навести вас на мысль о не правильной архитектуре и инициировать более глубокий рефакторинг. А при наличии тестов это не так уж и страшно.
    - необходимость покрывать тесты увеличивает потребность в соблюдении всяких принципов типа SOLID и т.д. так как иначе мы начинаем писать тесты очень не эффективно и опять же возвращаемся к тому что с архитектурой что-то не так.

    updated

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

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

    По поводу области применения... Тут есть несколько точек зрения. Как минимум TDD решает вопрос проектирования архитектуры, а не разработки алгоритмов. Этого мы достигаем тестами. Но опять же через юнит тестирование довольно не удобно разрабатывать определенные типы проектов: комиляторы, трансляторы, различные решения основанные на сложных алгоритмах (например алгоритмы сжатия, шифрования и т.д.), штуки завязанные на сетевом взаимодействии, например клиенты для протоколов. Для этих вещей больше подходят функциональные тесты или же их вовсе сложно покрыть тестами.
    Ответ написан
    5 комментариев
  • Какие группы или исполнители поют о программировании или о языках программирования?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Бросьте дурное, слушайте эмбиэнт, построк, прогрессив, блэк и прочие штуки.
    Ответ написан
    Комментировать
  • Как реализовать звездную карту в расширенной реальности(Android)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) карта взездного неба не проблема
    2) для определения что сейчас доступно вам нужно:
    - координаты пользователя
    - направления взгляда
    - время
    3) для того что бы сделать все совсем клево нужно научиться искать уровень горизонта, тогда можно будет относительно него уже все делать. То есть придется опять же работать с акселерометром и компасом.

    А про вариант с анализом звезд с камеры можно смело забыть.
    Ответ написан
    Комментировать