Pull to refresh
68
Karma
0.1
Rating
Zaur Nasibov @BasicWolf

Software Engineer

  • Followers 20
  • Following 4

Как тимлиду обучить распределенную команду работать с Git

Доставкой изменений на бой занимается тимлид на проекте или его старший программист проекта. Также неплохо было бы настроить CI/СD

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

Печаль. 2021й год на дворе, а вы вручную "доставляете" изменения. И для этого ещё и отдельные ветки "staging" и "main". И каким же образом достигается Continuous Delivery, если между коммитом и деплоем в продакшн столько "вахтёров"?

Введение в Git за 5 минут

Там в том то и суть, что человек который начинается заниматься разработкой ПО, очень скоро сталкивается с вопросом "Как это всё хранить" и "Как этим управлять". И тут на сцену выходят системы контроля версий, в том числе и Git. И в интернете полно качественнейшего материала на эту тему.
Aвтор пишет статью для людей, вроде бы не знакомых с понятием "Системы контроля версий", но при этом пытается уместить всё в формат универской методички, на которую пожалели бумаги.
Автор не раскрывает ни "Что такое распределённые системы контроля версий", ни "Что такое Гит?", ни "Почему Гит, а не XYZ?", ни "Как им пользоваться?".
Вот и летят минусы, чтобы это поскорее исчезло и не добавляло лишней энтропии Вселенной.

Предметно-ориентированное проектирование (DDD) | Эванс Эрик — обзор книги и рекомендации

А вы сделайте скидку на то, что эта книга была издана ещё в 2004м году! Эта книга и её идеи лежат в основе современного ДДД.

Больше механических клавиатур хороших и разных: новые модели, на которые стоит обратить внимание

Когда-то удалось поработать на оригинальной Model M - с тех пор я влюбился в buckling spring. Хотя по просьбе окружающих пришлось перейти на что-то потише :D

Hello world! Или «англоязычный» Хабр

Спасибо! Приведу тогда перевод Яндекса:

— Нас знакомят с Винни-Пухом и Некоторыми Пчелами, и начинаются истории.

— Пух отправляется в гости и попадает в трудное положение.

— Пух и Пятачок отправляются на охоту и чуть не ловят Вуз.

— Иа-Иа теряет хвост, а Пух его находит.

Hello world! Или «англоязычный» Хабр

Это относилось к переводу "Винни Пуха". Если перевести названия глав "в лоб" получится... что получится. И для сравнения приводится текст Заходера в спойлере.
Перевод "в лоб" виден невооружённым глазом в статьях которые публикуются сразу на английском и русском языке. В других статьях, которые публикуются только на английском, часто налицо построение предложения на русском языке (пусть и в голове автора) и мысленный гугл-транслейт его на английский.

Как я пробовал внедрять DDD. Агитация и пропаганда

Очень интересная аналогия. И по сути она близка к тому, что происходит во многих компаниях, в которых разработчики "пилят фичи", а не ищут решение проблем клиента (и вместе с клиентом!).

В начале пути архиважна фигура лидера, который поведёт за собой команду. Ему придётся внедрять новые привычки и плавно искоренять старые, менять культуру с "лидер-подчинённый" на "лидер-лидер", бодаться с упёртыми продукт менеджерами и вышестоящим начальством, для которого "поставить кнопочку вот сюда, как просит старый клиент, приносящий 1 килодоллар в год" важнее всех долгосрочных начинаний и перемен.

И это только культурная составляющая, а сколько сил приходится тратить на техническую сторону дела! Товарищи переходящие с монолита на распределённые системы просыпаются через пол-года со словами "I know kung-fu". "Кружки" программистов тянущих друг-друга вверх становятся необходимыми. Работе в паре или "толпой" становится не роскошью, а необходимостью. Помимо улучшений в качестве, мы получаем моментальное распространение знаний.

Я очень советую вам прочесть книгу "Turn the ship around" (L. David Marquet). Возможно именно она станет катализатором, который поможет преодолеть все перепоны и укоренить практики DDD.

Steam Deck будет работать на Arch Linux, а не Debian

Как-то несправедливо погнали на Арч для десктопа. Он в принципе ориентирован на другую категорию пользователей, по сравнению с Дебианом или Убунтой. Представьте, что неподготовленного человека, вместо круизного мотоцикла от именитого производителя посадили на спортивный болид собранный по чертежам. Мало не покажется :)

Из своего опыта 3 года на Убунте, 2 года на Дебиане и уже 9 лет на Арче. И если были минорные проблемы, то быстро решались благодаря отличной вики-документации.

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

Не обязательно, если включить десять посредством i <= 10 то можно начинать от 1 :)
Но проблема раздута сверх всякой меры. В школе много лет программировал на бейсике, а когда перешёл на C, нижняя граница массива от 0 стала просто аксиомой.

Domain-driven design, Hexagonal architecture of ports and adapters, Dependency injection и Python

Полностью с вами согласен по всем пунктам. Использование Protocol в данном случае вообще не о structural subtyping и это вводит в заблуждение. Здесь больше моя интерпретация и её ноги растут скорее из классической Java (до версии 8).

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

Protocol же я рассматриваю как чистый интерфейс, в котором есть лишь абстрактные методы.

NotImplementedError - нужно убрать, оно тут совсем не к месту :)

Domain-driven design, Hexagonal architecture of ports and adapters, Dependency injection и Python

Вы имеете ввиду наследование от Protocol, например в

class CastArticleVoteUseCase(Protocol):
    def cast_article_vote(self, command: CastArticleVoteCommand) -> CastArticleVoteResult:
        raise NotImplementedError()

или наследование в сервисах/адаптерах, например

class ArticleVoteRepository(
    SaveArticleVotePort,
):

?

В первом случае - явным образом объявляется интерфейс. Технически можно было бы использовать и абстрактный класс и метод, но протоко мне показался более уместным.

Во втором случае - безусловно можно было бы обойтись без "наследования" и статический анализатор даже бы не заикнулся на чём-то вроде save_article_vote_port: SaveArticleVotePort = ArticleVoteRepository(). Но здесь и зарыта собака - т.к. этот протокол - "голый" интерфейс, нас не интересует наследование. Мы хотим явным образом показать в коде, что ArticleVoteRepository реализует этот интерфейс.

Из-за дефицита видеокарт MSI перевыпускает Nvidia GT 730

С ума сойти, в финских магазинах — от 80 (!) Евро. Печаль.

Domain-driven design, Hexagonal architecture of ports and adapters, Dependency injection и Python

Спасибо pantafive, который указал на ошибку в дизайне с точки зрения DDD:


VotingUser является агрегатом, поэтому он должен инкапсулировать ArticleVote и репозиторий должен быть только у него. При вызове метода repository.save() должен обновляться (при необходимости) пользователей и добавляться новый голос.

Таким образом VotingUser.vote(...) лишь изменит своё внутренее состояние. Ещё лучше — выделить "Голосующего Пользователя" и "Проголосовашего Пользователя" в разные модели. Тогда метод VotingUser.vote() вернёт проголосовавшего пользователя у которого можно "спросить", как он проголосовал:


class VotingUser:
    def vote(...) -> VotedUser:
        ...

class VotedUser:
    @property  
    def article_vote(self) -> ArticleVote:
        ...

В Петербурге пришли с обысками в крупные компании по аренде самокатов

Эх, вам повезло пока не встречаться с народом на велосипедах с электроподдержкой. Нет, я ничего против них не имею, но мозг банально не воспринимает картину, где человек очень лениво крутит педали и при этом летит километров 20-25 в час :(

Domain-driven design, Hexagonal architecture of ports and adapters, Dependency injection и Python

Спасибо большое за ваш комментарий! А то было совсем грустно, что статья не нашла отклика. Но если она пригодилась хотя бы одному читателю, значит время потрачено не зря!

Гайд по сертификациям. Часть 1. Agile

Рыдаю. Несчастный Agile Manifesto, как только над ним не издеваются! Какие только шаманские ритуалы не придумывают. С курсами и сертификатами.

Сугубо личное мнение, но вместо этих курсов потратив время на лекции Мартина, Бэка, Фаулера, Кокбёрна, Холуба ... по теме, читатель вынесет гораздо больше.

Человек может пройти все эти курсы, знать как устроен Канбан, Скрам, СЕЙФ и т.п. только вот проблема в том, что "scrum != agile". Практически невозможно навесить процесс на группу, команду, целую компанию, которая не стремиться изменить свою культуру. А если эта культура есть - ей не нужны сертифицированные процессы, так так группы сами вырабатывают и подстраивают нужные процессы под свою работу.

Функция property() в Python

Однозначно, как сказал @masai - вы же выбираете, что переводить! Человек, выбирающий подобный материал для перевода, мягко говоря профнепригоден. Он тратит время переводчика и время читателя впустую. Что хуже, в следующий раз увидев OTUS в тегах, читатель даже не станет заглядывать в статью. Пожалуйста, берите качеством, а не количеством.

Функция property() в Python

ОТУС, ну зачем? Чем эта статья лучше краткого и лаконичного объяснения из docs.python.org?

Ну уж если писать статью, почему бы не раскрыть откуда и для чего в языке не ограничивающем доступ к полям класса появился этот функционал? Пример с __name ужасен по той простой причине, что в Питоне не принято обрамлять "_поле" или "__поле" в property просто так. Хотя этим любят заниматься товарищи пришедшие из Java и C#.

Стоило бы отметить пару обыденных сценариев пользования property в Питоне:

1. read-only property, которые возвращают фиксированное либо просчитанное значение. Например:

class Circle:
    def __init__(self, radius):
        self._radius = radius
        
    @property
    def area(self):
        return 2 * self.radius * math.pi
        
    @property
    def radius(self):
        return self._radius

2. property in place of field - свойство ставится на месте обычного поля с сохранением имени. Таким образом сохраняется интерфейс класса, но при этом можно навесить дополнительную логику на операции чтении / записи поля.

Чем меня не устраивает гексагональная архитектура. Моя имплементация DDD – многоуровневая блочная архитектура

@kolkoni, мне кажется что вы нарисовали гексагональную архитектуру "в профиль". Ведь Гексагональная архитектура - это ни что иное, как "Архитектура портов и адаптеров". Алистар Кокбёрн ввёл туда многогарнник лишь для того, чтобы упростить визуализацию. А конкретнее:

The hexagon is not a hexagon because the number six is important, but rather to allow the people doing the drawing to have room to insert ports and adapters as they need, not being constrained by a one-dimensional layered drawing.

Palm OS — как она выглядит сегодня?

Эх ностальгия! Помню NT у меня даже на первом пне в 120Mhz и гигабайтным HDD бегала вполне себе бегала. Оперативки - да, было 64 мб.

Information

Rating
3,242-nd
Location
Азербайджан
Registered
Activity