Обновить
7.38

Проектирование и рефакторинг *

Реорганизация кода

Сначала показывать
Порог рейтинга
Уровень сложности

Оптимизация SQL запросов

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров43K

Оптимизация SQL-запросов является одной из ключевых задач при работе с реляционными базами данных. Эффективные SQL-запросы позволяют значительно улучшить производительность приложений и обеспечить более быстрый доступ к данным. В данной статье мы рассмотрим как переписать запрос, чтобы выполнялся быстрее. В статье пойдет речь о PostgreSQL, хотя применять данные советы к любой базе данных SQL Ниже будут представлены термины и операторы, о которых пойдет в данной статье.

Читать про оптимизацию

Анализ AST и рефакторинг кода в Clang

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров3K


В продолжение темы кастомизации компилятора С++ публикую перевод еще одной интересной статьи от Eli Bendersky AST matchers and Clang refactoring tools.

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


Прекрасным результатом этого быстрого темпа разработки является то, что постоянно появляются новые API и инструменты.


Например, некоторое время назад разработчики инструментария Clang выяснили, что людям, выполняющим обходы AST, приходится писать много повторяющегося кода, чтобы найти нужные им узлы AST, поэтому они придумали отличный новый API под названием AST matchers.

Читать дальше →

Изобретаем polimer — фреймворк на Python для ускорения разработки научных прототипов

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров2.1K

Python — удобный инструмент для быстрого прототипирования и проверки гипотез. Он позволяет превратить оригинальную идею в рабочий MVP за считанные дни, но в условиях такой скорости разработчикам не всегда удается посвятить достаточное время тщательной проработке кода, что создает барьер на пути дальнейшего превращения прототипа в завершенный продукт.

Осознавая эти ограничения, авторы Python заложили в него специальные конструкции, позволяющие развивать язык под требования времени. Одна из таких конструкций — это аннотации типов, которые уверенно прижились в сообществе «питонистов». Сегодня мы рассмотрим новый подход к использованию аннотаций для ускорения разработки прототипов и попробуем применить его для демо‑задачи в области финтеха. Итак, поехали!

Читать далее

Архитектура фронтенд-приложений на React. (Нам не нужен FSD)

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров25K

Всем привет, меня зовут Павел Рожков, я lead фронтенда в компании Doubletapp. Мы занимаемся заказной разработкой, и в нашей работе над React-проектами важную роль играет наш архитектурный гайдлайн, который мы постоянно совершенствуем. Это свод договоренностей о том, каким образом будет организован код в нашем проекте.

Гайдлайн помогает нам:

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

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

Поддерживать старые проекты, т.к. они написаны по тем же принципам. 

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

Онбордить новых членов команды благодаря готовой документации.

Содержание:

Почему бы нам просто не взять FSD?
Шаблон проекта с архитектурой
Структура кода приложения
Заключение

Читать далее

Контракт REST API: Пригладим названия

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров4.8K

А сколько у вас в компании во внутренних системах используется наименований одного и того же поля в API? А сколько способов назвать поле, которое перечисляет список id?

Я часто сталкиваюсь с тем, что при проектировании и разработке HTTP REST API команды (чаще неосознанно) собирают целый семантический и лексический зоопарк наименований. Потом бывает сложно разобраться, что нужно записать в определенное поле, или какое название поля выбрать для перечисления списка ID из уже существующих.

Поэтому я однажды собрала для себя и коллег гайд–чек-лист под названием “Приглаживаем названия в API” и теперь публикую его для широкой аудитории. Уверена, что он кому-то да пригодится.

Читать далее

Книга: «Рецепты чистого кода»

Время на прочтение6 мин
Количество просмотров8K
image «Неуместная близость»? «Оргия объектов»? «Принцип KISS»? А мы точно о программировании?

Привет, Хаброжители! Если ваша первая и единственная реакция на эти словосочетания — смех, то вполне вероятно, что от вашего кода «пахнет». Запах кода (code smell) — термин, который был введен разработчиком Кентом Беком и популяризирован Мартином Фаулером. По сути, запах кода — это симптом, признак проблемы; он указывает на такой фрагмент кода, который можно (и нужно) улучшить.

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

Как хранить деревья или как мы меняли инструмент «Структура компании»

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров3.3K

Привет, меня зовут Степан Золотухин, я разработчик в Битрикс24. Моя команда работает над такими продуктами, как Почта, Маркетинг, Структура компании, Подписание, CRM-Формы.

Мы делаем очень много клевых и интересных фич, но в этой статье я расскажу о том, как мы работаем с «деревьями» на примере нашего продукта «Структура компании».

Читать далее

Сложное — просто: архитектуры ПО на жизненных примерах

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров21K

Я недавно решила углубленно разобраться, какие архитектуры бывают в разработке ПО, и написать об этом простую статью. Это моя первая попытка поделиться своими мыслями и объяснить сложные вещи на понятном языке, поэтому буду рада вашей обратной связи

Здесь я рассказываю про монолиты, микросервисы и микрофронтенды без сложных терминов и технических деталей, чтобы те, кто только начинает разбираться в теме, могли понять, что к чему. Надеюсь, вам будет полезно и интересно. Поехали! 🚀

Читать далее

Business Process Notation как подход к организации кода в проекте по разработке мобильного iOS приложения

Время на прочтение12 мин
Количество просмотров1.5K

Постановка проблемы

На сегодняшний день наиболее известны такие архитектурные паттерны как MVC, MVVM, MVP, Viper, Clean Code.

Все они в той или иной мере работают с тремя основными сущностями - Модель, Вью, Контроллер, добавляя время от времени некоторые дополнительные, например, Presenter.

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

Но эти характеристики не отражают сущности приложения в целом. Это как если бы мы разделили воду на водород и кислород и пытались бы из их особенностей понять сущность воды.

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

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

Именно в такие моменты приходится переосмысливать общую архитектуру проекта и отвечать на вопросы “Зачем нужен тот или иной код, какую задачу он решает?”, “Где расположен код, реализующий ту или иную функциональность и как он работает?”. И т.д.

Продолжая пример с изучением воды следует сказать, что единицей её анализа является молекула воды. Это мельчайшая частица воды, которая тем не менее содержит в себе все её свойства.

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

Отсюда, возникла идея использовать в качестве отправного пункта для организации кода именно те задачи, которые этот код решает.

При этом, задача понимается как бизнес-процесс.

Читать далее

Что я понял о жителях России, пока изучал гватемальцев. Опыт UX-исследования с другой стороны планеты

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров4.3K

Привет! Меня зовут Данила Тарасов, я UX-исследователь в AGIMA. Недавно мы провели большое исследование для крупной латиноамериканской компании с головным офисом в Гватемале. Компания занимается развитием элитного района в столице страны. Этот район славится хорошими магазинами, красивыми домами и приятными ресторанами.

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

Читать далее

Записки архитектора. Управление масштабными проектами, в которых не создаётся нового функционала

Время на прочтение15 мин
Количество просмотров4.7K

Думаю, все любят разрабатывать новый функционал приложений, сервисов, микросервисов и пр. И наверное, мало кто любит заниматься инфраструктурными работами. Например, портировать код на другую операционную систему или портировать код на другую микропроцессорную архитектуру, или же «отвязывать» вычислительную логику от графических интерфейсов (если вдруг приложение долгое время развивалось так, что отделение вычислений от графики никого не заботило)…

Тем не менее, инфраструктурные проекты тоже важны, и время от времени их приходится делать.

Мне довелось поработать над несколькими такими проектами в разных компаниях. И это был приятный опыт, ибо все эти проекты прошли довольно гладко и завершились успешно.

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

В этой статье мы, во-первых, разберём клинический пример, а во-вторых, поговорим про эффективные практики реализации масштабных инфраструктурных проектов.

Поехали!

Что нужно знать при написании алгоритмов на .NET

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров8.9K

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

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

Краткое содержание:

1. Нотация О большое для оценки сложности алгоритмов

2. Структуры данных и их применение в алгоритмах

3. Некоторые рекомендации для разработки на .NET

Читать далее

Призываю переименовать Layers в Feature-Sliced Design методологии

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2.1K

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

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

Читать далее

Ближайшие события

Domain-Driven Design: чистая архитектура снизу доверху

Уровень сложностиСредний
Время на прочтение18 мин
Количество просмотров48K

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

Если Вы - мидл, и Вас стали мучать такие вопросы — поздравляю, Вы на верном пути. Ведь профессиональный рост не происходит с переводом на должность - новый сениор должен родиться, и это как раз муки такого рождения.

Да, мы уже знаем самые популярные практики: KISS, DRY, YAGNI, SOLID, что там ещё... Мы умеем их применять. Но нас не покидает чувство, что все эти практики объединяет общая научная основа. Знаете, это как с Менделеевым, который на основе закономерностей практически по наитию составил периодическую систему, а потом открыли электроны и всё встало на свои места.

У меня для вас хорошие новости: научная основа есть. Это предметно-ориентированное проектирование.

Но есть и плохая новость: тема настолько новая и непростая в изучении, что какая-никакая популярность к ней пришла лет 5 назад, и до сих пор совсем небольшое число разработчиков достаточно хорошо в ней разбирается.

Но есть ещё одна хорошая новость: в статье ниже я постараюсь дать максимально понятный ответ, что же такое предметно-ориентированное проектирование.

Начнём.

Читать далее

Из легаси в конфетку: история трансформации

Уровень сложностиСредний
Время на прочтение22 мин
Количество просмотров1.7K

Каждый разработчик рано или поздно сталкивается с легаси-код — тем самым старым, не всегда понятным и, порой, пугающим набором строк, в которых легко заблудиться. Легаси может вызывать смешанные чувства: с одной стороны, это результат чьей-то работы и часть истории компании, с другой — постоянный вызов, требующий не просто поддержки, но и регулярных улучшений. Переделать такой код в "конфетку" — задача не из лёгких, но вполне выполнимая. 

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

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

Читать далее

Разработка и управление едиными контрактами API

Уровень сложностиПростой
Время на прочтение15 мин
Количество просмотров7.4K

Привет, Хабр! Пол года назад на AnalystDays #18 я рассказывал про API-контракты, и доклад вызвал большой интерес у аудитории. Пока видео не опубликовали, решил адаптировать материал в формат статьи.

Читать далее

Как рефакторить большие системы

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров5.8K

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

Читать далее

Структурный дизайн. Древний секрет простого и быстрого кода

Уровень сложностиСредний
Время на прочтение30 мин
Количество просмотров14K

Я пишу коммерческий код с 2005 года и с 2014 года ищу способ систематически писать хороший код.

В рамках этих поисков я изучил всю популярную литературу о хорошем коде и его дизайне — от «Чистого кода» Анкл Боба до «DDD» Эрика Эванса. Однако все популярные подходы в значительной степени субъективны: они не дают объективного и последовательного судьи, который бы решал, какой код лучше.

Например, в чистом коде я до сих пор не знаю способа за конечное время дать ответ на вопрос «Сколько уровней абстракции в этой функции?». А если взять DDD — то я до сих пор не знаю способа, который бы позволял стабильно и за конечное время находить границы между ограниченными контекстами (прошу прощения за каламбур) или агрегатами.

Эта неопределённость ведёт к длительным дискуссиям на ревью и в голове разработчика о том, какой из способов является наилучшим для решения задачи. А после этих дискуссий, каждый из участников (включая того дилетанта в собственной голове) остаётся при своём мнении.

Отчаявшись научиться писать стабильно хороший объектно‑ориентированный код, в 2016 году я пошёл в сторону функционального программирования и архитектуры. Там с детерминированностью было получше: если в коде нет побочных эффектов (ввода‑вывода, оператора присваивания и чтения глобальных переменных) — то код хороший, если есть — плохой. Однако как затащить в коммерческий проект и, главное, собственную голову свободные монады и их интерпретаторы — я так и не понял.

Поэтому в 2020 году поиски своего Святого Грааля я продолжил в «эзотерических» и древних книгах. Одной из таких книг стал «Структурный дизайн» Ларри Константина. И в этой книге я, наконец, нашёл простой и понятный принцип, который лёг в основу моего текущего подхода к проектированию и кодированию, и для которого можно быстро и однозначно дать ответ, соответствует ли тот или иной кусочек кода этому принципу или нет.

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

Читать далее

Практический опыт реверс-инжиниринга печатной платы: зачем, как и когда это нужно?

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров11K

Привет, Хабр! Меня зовут Андрей, и я работаю разработчиком программно-аппаратных решений в компании FPLUS, которая занимается выпуском электроники для корпоративного и государственного сектора. По сути моя статья дает старт публикациям в недавно запущенном блоге FPLUS, где я и мои коллеги будем делиться опытом о своей работе и новых проектах, создающихся в партнёрстве с НТЦ «Модуль» и другими игроками на рынке. В этом первом материале я решил поговорить об импортозамещении – явлении, ставшем в последние годы довольно актуальным, — и расскажу о собственных наработках в этом направлении.

Реалии нашего времени требуют активно использовать в производстве опыт, полученный при изучении импортных узлов и деталей – то, что называют обратным проектированием или реверс-инжинирингом. Почему-то эти понятия считаются чем-то модным и суперсовременным, однако такой подход к решению внезапно и остро встающих технических вопросов применяется уже довольно давно. Например, в 60-х годах прошлого века на основе швейцарского оригинала компании Gebrüder Sulzer Aktiengesellschaft советскими специалистами был создан бесчелночный ткацкий станок СТБ, а в самом начале 90-х годов в массовом порядке стихийно импортозамещались детали оборудования, ввезённого из стран, ранее входивших в Совет экономической взаимопомощи (СЭВ).

Но…, от лирики к делу: в этой публикации я поделюсь собственным опытом создания аналога имеющегося у меня образца печатной платы с использованием реверс-инжиниринга. Я покажу на примерах, как разобраться в работе устройства, составить его принципиальную электрическую схему и воспроизвести в материале. Для примера я использую разветвитель питания материнской платы серверного компьютера.

Читать далее

Кроссплатформенная архитектура ядра приложения. Простая. Линейная. Масштабируемая

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров3.4K

Другие статьи из серии:
1. Почему MVx архитектуры всегда получаются плохо
2. Как поправить 3 проблемы MVx архитектур
3. Кроссплатформенная архитектура ядра приложения. Простая. Линейная. Масштабируемая
4. Т-функция: подключаем логику к UI как к БД


Описание проблемы


Задача


Я — андроид разработчик. Обычно ко мне приходят с фразой вроде “вот мы тут придумали фичу, сделаешь?” и с макетом дизайна, вроде такого.



Я смотрю на это всё и вижу: вот экраны, эти данные на них — статические, а вот эти динамические, значит их надо откуда-то взять; вот тут интерактивные компоненты: при взаимодействии с ними надо что-то сделать. Иногда просто открыть другой экран или виджет, иногда выполнить логику. Исходя из этого я проектирую то, как будет выглядеть логика фичи. Описываю ее в компонентах архитектуры, разбиваю на задачи, узнаю где и как взаимодействовать с сервером, и прочее.


Скрытые кейсы


Но потом я обнаруживаю, что далеко не все переходы такие простые, как нарисовано на дизайне, например, как в случае с авторизацией. Не все явно присутствуют, как, например, переходы назад. А в некоторых случаях не хватает всевозможных экранов ожидания, экранов “пустых” состояний и экранов ошибок.


Знакомо?

Читать дальше →

Вклад авторов