• Какой язык выбрать для автоматизированного тестирования?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Я бы спросил у самих разработчиков, хотят они помогать или это им не надо. С моей точки зрения команда должна быть тесно интегрирована и разработчики сами должны быть заинтересованы в качественных тестах и в их читаемости. И тут язык имеет значение. Разработчики должны понимать тест и в некоторых случаях даже советовать как его улучшить, потому что им всяко виднее как их код работает и где может зафэйлиться. Если же разработчики говорят "отстань со своими тестами" или "У нас некому работать 'обезъяной', поэтому нам важнее что бы ты дальше тыкал руками", то это очевидные организационные проблемы и их нужно решать не выбором языка, а поднятием этого вопроса на уровень руководства.
    Ответ написан
    Комментировать
  • Для каких примерно целей программисту нужен computer science?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Для любой задачи которую без CS не решить. В предыдущих ответах часть задач уже перечислили. Но это всё касается специализированных задач. Никто не гарантирует вам, что в какой то момент у вас подобных задач не встретится на рядовом до сего времени проекте. Обычно это происходит когда проект вырастает за рамки какого-либо фреймворка, который до того покрывал все 100% таких задач. Банальный пример: было однопоточное приложение. Оно перестало справляться с нагрузкой. По совету с Хабр QA (ну или стэковерфлоу - не важно )) приняли решение переписать на параллельные вычисления. А не у кого нет даже базовых знаний какие существуют "грабли" (опять банальный пример - "состояние гонки" может и маститого профессора CS свести с ума, а, как в том анекдоте про каплю никотина, лошадь и хомяка, "голову вайтишника разрывает на куски") Поэтому пока у вас в команде есть кто-то со знаниями может пусть не всего CS, а хотя бы каких то базовых вещей, а вы просто кодите, то вам оно и не нужно. (как выше замечено - на "галерах" это не актуально. Хотя даже там вообще то такие люди обычно есть и получают они вдвое больше. Иначе какой им смысл там оставаться)
    Ответ написан
    Комментировать
  • Как повысить свои навыки в построении архитектуры сложных приложений?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    1. Хорошо помогает начать изучение с простых паттернов проектирования. Прежде всего это простые и понятные паттерны типа "стратегия", "команда", "итератор", "шаблонный метод", "посредник", "цепочка обязанностей". Изучив и поняв эти паттерны вы посмотрите на ООП по новому: не как просто структурированный код плюс данные в одном объекте, а именно как задумывалось его создателем - объект самостоятельная единица взаимодействующая с другими такими же посредством сообщений. Причём она является first class также как в функциональном программировании функция. К тому же на указанных паттернах строятся и остальные. Например, фабричный метод - это частный случай шаблонного метода. Так постепенно придет понимание куда и зачем применять различные паттерны.
    2. Когда решаете какую-либо задачу, думайте о нескольких вариантах архитектуры для её решения. Далее старайтесь выбирать
    вариант не на основе личных предпочтений или предыдущего опыта (не важно, положительного или отрицательного), а на основе анализа, какой из вариантов здесь реально потребуется с точки зрения дальнейшего развития проекта. Предыдущий опыт также надо учитывать, но все проекты разные, требования разные, и каждая ситуация может отличаться. Надо смотреть как могут изменяться или расшириться системные и функциональные требования (разумеется, для этого надо быть в контексте этих требований - т е знать их самих, манеру работы с проектом заказчика и т д) Во многих случаях, когда вы не сможете выбрать из-за недостатка информации, это логически подведёт вас задавать заказчику дополнительные вопросы. И через этот итеративный процесс приходит понимание, где и как применять паттерны.
    3. Обратите внимание на паттерны ERP систем (для примера книга "Шаблоны корпоративных приложений" Мартин Фаулер) Особенное внимание надо уделить такому шаблону как инверсия зависимостей. Данный шаблон лично мне помог совершенно по другому взглянуть на ООП (во второй раз, уже после того как я стал применять другие паттерны ООП) Вот здесь https://blog.byndyu.ru/2009/12/blog-post.html очень понятно на мой взгляд описано (язык C# но всё тоже самое будет для любого ОО языка) Кроме того в этом блоге много всего по проектированию и рефакторингу.
    4. Обратите внимание на книгу "Growing Object-Oriented Software, Guided by Tests" Стив Фриман Перевод на русский не гуглится, возможно его и нету. Но книга полезна тем, что в отличие от многих других книг по TDD в ней разбирается не только методика тестирования и написания тестов, но и принцип тест -> код -> рефакторинг. И разбирается на достаточно длинном примере. Из неё вы можете подчерпнуть привычку рефакторить, а не переписывать заново. Причём даже если у вас на проекте цикл другой - например тесты пишутся после функционала, всё равно образ мысли изменится и масштабный рефакторинг не будет вызывать непреодолимого желания выбросить и переписать с нуля.
    5. По рефакторингу могу порекомендовать книгу "Работа с унаследованным кодом" Майкл Физерс. Кроме того об этом много статей в уже упомянутом блоге Александра Бындю. Грубо говоря я бы назвал ту подборку статей "как не переписывать и начать жить"
    6. Ещё один блог где собрано большое количество полезных материалов по ООП, рефакторингу, проектированию, это блог Сергея Теплякова Вот ссылка на его подборку книг по теме: sergeyteplyakov.blogspot.com/2013/08/blog-post.html
    7. Изучайте материалы постепенно. Не стоит сразу пытаться воткнуть только что полученные знания в первый попавшийся проект. Обсуждайте возможные решения с коллегами. Со временем они также станут поддерживать эту практику. Если есть возможность, попрактикуйте парное программирование. Причём не обязательно с более опытным коллегой. Иногда вопросы задаваемые наивным человеком заставляют задуматься гораздо крепче, чем ответы получаемые от мудрецов.
    Ответ написан
    1 комментарий
  • Как реализовать асихронность в telegram боте?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Я не знаком с интерфейсом телеграмма, но думаю что вам нужно создавать поток всякий раз, когда бот получает обращение от нового пользователя. И уже этот поток должен ему отвечать. По окончанию ответа поток должен сам завершаться. В это же время главный поток может продолжать принимать новые обращения.
    Это наиболее простая схема асинхронной обработки, но в ней имеются недостатки. Если одновременно обращаются много пользователей, для каждого будет создан поток. Это может привести к серьёзной деградации производительности ОС или даже исчерпанию ресурсов. Эту проблему можно решить разными способами. Например, так как указал Dmitry Roo - через так называемые Future или асинхронные задачи. Но можно также использовать пул потоков и очереди. На мой взгляд решение с очередями будет более контролируемым, но и более трудоёмким и требующим опыта. Для первого шага можно использовать простую схему с созданием нового потока для каждого нового пользователя.
    Ответ написан
    Комментировать
  • Почему я не могу инициализировать переменную экземпляра после ее объявления?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Вы пытаетесь не переменную инициализировать, а поле класса. Его можно инициализировать либо внутри метода, либо при объявлении. Но у вас инициализация лежит внутри определения класса. А так нельзя.
    Ответ написан
    Комментировать
  • В каком виде лучше хранить Entity заказ - количество закзаанного?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    В вопросе подробностей маловато. Какая база предполагается будет реально хранить этот entity ? Если это классическая реляционка, то на мой взгляд лучше хранить как List или Set. Потенциально Map мог бы дать возможность получать доступ к элементу заказа по его номеру (или какому то ключу) за O(1) время (т е за константное время) Это давало бы выигрыш в случае очень больших заказов с большим количеством элементов. Но поскольку реально значение хранит база, то, если необходимо выполнить поиск одного элемента, не подтягивая весь список в память, это можно сделать выборкой по индексу. (например id заказа + id элемента или же просто "сквозной" id элемента) Если же заказы не будут превышать 10-50 элементов, то и вообще нет смысла заморачиваться и надо выбирать наиболее простой способ, т е List. Уже в самом коде можно организовать доступ к этому полю как угодно. Из-за малого размера списка проблем с производительностью быть не должно.
    Ответ написан
    2 комментария
  • Как организовать работу микросервисов в kafka?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Мне видится, что правильнее информацию о остатке товара хранить в отдельном сервисе. Пусть это будет сервис 2 А кошелёк и оплату вместе-сервис 3 Так схема будет такой:
    1. Сервис 1 получает запрос
    2. Сервис 1 идет к сервису 2 за информацией есть ли запрошенный товар и если он есть то "резервирует" его.
    3. Сервис 1 отправляет сервису 3 информацию для оформления оплаты.
    4. Если оплата успешна (у пользователя достаточно средств и платёжная система отработала без ошибок) то сервис 1 "подтверждает резерв" товара через сервис 2. В противном случае сервис 1 "возвращает резерв" сервису 2. Резервированый товар не показывается при показе остатков другим пользователям.
    Такая схема напоминает паттерн распределённой транзакции с двух-разным комитом. Поситайте про него. В данном случае использовать Кафку или нет большого значения не имеет, т к кафка-это только канал связи. Все те же самые манипуляции придётся проводить и при использовании обычного рест апи.
    Если же делать синхронно, то в сервисе 1 операции станут последовательными, и микросервисная организация теряет смысл, т к это будет медленнее чем монолит и не масштабируемо. Но для такого усложнения должны быть объективные причины - высокая нагрузка. Если же еë нет то монолит проще и дешевле.
    Ответ написан
    4 комментария