Как стать автором
Обновить
91.21

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

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

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

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

Время на прочтение 4 мин
Количество просмотров 8.2K
Вопрос ограничения доступа к данным встает при разработке многопользовательских систем почти всегда. Основные сценарии следующие:

  1. ограничение доступа к данным для пользователей не прошедших аутентификацию
  2. ограничение доступа к данным для аутентифицированных, но не обладающих необходимыми привелегиями пользователей
  3. предотвращение несанкционированного доступа с помощью прямых обращений к API
  4. фильтрация данных в поисковых запросах и списковых элементах UI (таблицы, списки)
  5. предотвращение изменения данных, принадлежащих одному пользователю другими пользователями

Сценарии 1-3 хорошо описаны и обычно решаются с помощью встроенных средств фреймворков, например role-based или claim-based авторизации. А вот ситуации, когда авторизованный пользователь может по прямому url получить доступ к данным «соседа» или совершить действие в его аккаунте случаются сплошь и рядом. Происходит это чаще всего из-за того что программист забывает добавить необходимую проверку. Можно понадеяться на код-ревью, а можно предотвратить такие ситуации применив глобальные правила фильтрации данных. О них и пойдет речь в статье.
Читать дальше →
Всего голосов 19: ↑17 и ↓2 +15
Комментарии 16

25 ошибок начинающего программиста

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

Научитесь выявлять их. Выработайте привычки избегать их.


Цель этой статьи не загнобить новичков за типичные ошибки, а научить выявлять их и избегать. Порядок перечисления – случайный.

От переводчика


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

Как бы это смешно не звучало, я работал над этим текстом с середины марта, стараясь подобрать подходящие формулировки и упростить для восприятия. Ещё пару дней воевал с хабра-редактором. Поэтому, если вы найдёте недочёты, прошу не винить меня в нерадении, а оповестить, я их сразу же исправлю. Я думал украсить статью картинками, но решил, что это только раздует её до совсем неприличных размеров. Приятного чтения.
Читать дальше →
Всего голосов 78: ↑69 и ↓9 +60
Комментарии 231

Consulo UI API от идеи до прототипа

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

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


Consulo — это форк IntelliJ IDEA Community Edition, который имеет поддержку .NET(C#), Java
Читать дальше →
Всего голосов 13: ↑13 и ↓0 +13
Комментарии 5

Запатентованная мечта программиста — часть II

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

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


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


Разумеется, статья вызвала большое количество вопросов, которые необходимо осветить отдельно: отличие от существующих решений и сравнительный анализ производительности и планов построения запросов к базе данных. А также ответить на вопрос: что это вообще такое и зачем?



Читать дальше →
Всего голосов 18: ↑10 и ↓8 +2
Комментарии 158

Истории

Как и почему мы написали свой ECS

Время на прочтение 13 мин
Количество просмотров 37K
В прошлой статье я описал технологии и подходы, которые мы используем при разработке нового мобильного fast paced шутера. Т.к. это была обзорная и даже поверхностная статья — сегодня я копну глубже и подробно расскажу, почему мы решили написать собственный ECS-фреймворк и не стали использовать существующие. Будут примеры кода и небольшой бонус в конце.

Читать дальше →
Всего голосов 37: ↑36 и ↓1 +35
Комментарии 48

Неполнотекстовый поиск: специфичные возможности Elasticsearch для сложных задач

Время на прочтение 10 мин
Количество просмотров 17K
image

Привет всем, меня зовут Андрей, и я разработчик. Давным-давно — кажется, в прошлую пятницу — у нашей команды был проект, где понадобился поиск по ингредиентам, входящим в состав продуктов. Допустим, в состав колбасы. В самом начале проекта от поиска требовалось не много: показать все рецепты, в которых нужный ингредиент содержится в определенном количестве; повторить для N ингредиентов.
Читать дальше →
Всего голосов 16: ↑15 и ↓1 +14
Комментарии 36

Запатентованная мечта программистов 80-90-х

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

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


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


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



Ещё на 3 минуты текста
Всего голосов 27: ↑12 и ↓15 -3
Комментарии 193

Создаем калькулятор с единицами измерений

Время на прочтение 21 мин
Количество просмотров 14K
Как-то раз мне нужно было реализовать калькулятор для складывания и конвертации физических величин. У меня тогда не было ограничений по времени, поэтому я решил проблему на высоком уровне абстракции и, соответственно, под широкий спектр задач. Предлагаю на ваш суд мое решение.

image

Представьте, что вам нужно написать калькулятор, который умеет не просто считать цифры, а оперировать физическими (измеряемыми) величинами – складывать длину, конвертировать количество чего-то из одной единицы измерения в другую, и т.п. Первым делом, давайте обозначим чуть конкретнее задачу. У нас будут вот такие фичи:
Читать дальше →
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 29

Magic link или история о том, как мы упростили жизнь пользователю

Время на прочтение 4 мин
Количество просмотров 9.6K
В статье я поделюсь личным опытом разработки и реализации “волшебных ссылок”. Расскажу зачем они нужны в нашем проекте, как функционируют и в конце даже всплакну над тем, что отсутствие такого функционала в больших системах используемых мною заставляет меня гневно рвать на себе волосы.

Код будет только в одном месте, т.к. основная цель статьи — рассказать про саму идею, а не показать то, насколько красив код.


Вжууух читать
Всего голосов 18: ↑14 и ↓4 +10
Комментарии 13

Как обновление Rust 1.26 ускорило мой код в три с лишним раза

Время на прочтение 13 мин
Количество просмотров 21K
Хочу поделиться небольшой историей о мощи LLVM и преимуществах языков высокого уровня над ассемблером.

Я работаю в компании Parity Technologies, которая поддерживает клиент Parity Ethereum. В этом клиенте нам нужна быстрая 256-битная арифметика, которую приходится эмулировать на программном уровне, потому что никакое оборудование не поддерживает её аппаратно.

Долгое время мы параллельно делаем две реализации арифметики: одну на Rust для стабильных сборок и одну со встроенным ассемблерным кодом (который автоматически используется nightly-версией компилятора). Мы так поступаем, потому что храним 256-битные числа как массивы 64-битных чисел, а в Rust нет никакого способа умножить два 64-битных числа, чтобы получить результат более 64 бит (так как целочисленные типы Rust только доходят до u64). Это несмотря на то, что x86_64 (наша основная целевая платформа) нативно поддерживает 128-битные результаты вычислений с 64-битными числами. Так что мы разделяем каждое 64-битное число на два 32-битных (потому что можно умножить два 32-битных числа и получить 64-битный результат).
Читать дальше →
Всего голосов 52: ↑49 и ↓3 +46
Комментарии 33

Комментирование кода: хороший, плохой, злой

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


Вы наверняка это слышали: «Хороший код является самодокументированным».

Я больше 20 лет зарабатываю написанием кода, и слышал эту фразу чаще всего. Это клише.

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

Она истинна? Да.

Означает ли она, что вы никогда не должны комментировать код? Нет.

В этой статье мы рассмотрим разные аспекты комментирования кода.
Читать дальше →
Всего голосов 75: ↑67 и ↓8 +59
Комментарии 25

DevConf: из шаурмы в Symfony или миграция legacy

Время на прочтение 4 мин
Количество просмотров 5.5K
Под занавес прошлогоднего DevConf Артем Дегтярь и Павел Степанец рассказали как они мигрировали ERP-систему написанную на «голом» PHP5.3, работающую на винде, в Symfony + PHP7, и построили на его основе облачный сервис в сфере b2b. Видео доступно по ссылке доклада. А я представлю текстовый, немного сжатый, вариант.


Мы работали над большой системой, которая позволяла создавать заявки и менять статусы, плюс биллинг, учет ТМЦ и много всего. Сегодня мы расскажем как рефакторили эту систему, мигрировали ее в Symfony. Первоначально система была написана на чистом PHP, и имела много «особенностей». Например, этот пятиуровневый тернарник на слайде весьма оригинально работал с датой, пришедшей от юзера.
Читать дальше →
Всего голосов 13: ↑13 и ↓0 +13
Комментарии 18

История про хранилище изображений. Или как велосипед спас от костыля

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


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

В статье расскажу, как мы разработали сервис, способный хранить миллионы фотографий и обслуживать тысячи запросов в секунду.
Поехали
Всего голосов 36: ↑36 и ↓0 +36
Комментарии 10

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

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн

Изобретения для контрабандистов и фармацевтов + тренировка вашего НИИ

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

Если вы начинаете или уже давно ведете технический проект, проверьте: может быть все можно сделать намного проще и эффективнее?


Это вторая статья из серии НИИ (Не Искусственный Интеллект), в которой я рассказываю о некоторых приемах изобретательства (читай, о приемах решения технических проблем при управлении проектом).

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

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

Но подробности о проекте и первая его задачка в конце статьи, а пока первая история:



История №1


Одна фармацевтическая фирма разработала новое лекарство для глаз, лекарство крайне эффективное, но на практике использовать его было нельзя. Проблема заключалась в том, что капли для глаз имеют свою специфику применения, а именно неравномерность действия. Изначально закапывается излишнее количество лекарства, т.к. оно быстро вымывается слезной жидкостью, то в определенный (очень короткий) момент времени дозировка лекарства становится оптимальной, далее она уменьшается.

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

Собственными силами огромная фармкомпания не справилась с решением этой задачей, а вот один человек смог. Он предложил…
Читать дальше →
Всего голосов 12: ↑9 и ↓3 +6
Комментарии 71

Архитектура кода

Время на прочтение 15 мин
Количество просмотров 61K
В этой статье я хочу поделиться своим личным опытом, связанным с правильной организацией кода (архитектурой). Правильная архитектура существенно упрощает долгосрочную поддержку.
Это очень философская тема, поэтому я не могу предложить ничего более, чем мой субъективный анализ и опыт.

Проблемы, симптомы


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

Но я сменил работу, и пришлось разрабатывать один единственный вебсайт в течение 4-х лет. Естественно, сложность этого кода была несопоставима с визитками из моей прошлой работы. В какой-то момент проблемы просто посыпались на меня – количество регрессии зашкаливало. Было ощущение, что я просто хожу по кругу – пока чинил “здесь”, сломал что-то “там”. И поэтом это “здесь” и “там” банально менялось местами и круг повторялся.

У меня исчезла уверенность в том, что я контролирую ситуацию – при всем моем желании недопустить баги, они проскакивали. Все эти 4 года проект активно разрабатывался – мы улучшали уже существующий функционал, расширяли, достраивали его. Я видел и чувствовал, как удельная стоимость каждого нового рефакторинга/доработки растет – увеличивался общий объем кода, и соответственно увеличивались затраты на любую его правку. Банально, я вышел на порог, через который уже не мог переступить, продолжая писать код “в строчку”, без использования архитектуры. Но в тот момент, я этого еще не понимал.
Читать дальше →
Всего голосов 44: ↑41 и ↓3 +38
Комментарии 25

Мясорубка, супер-роботы и НИИ (Не Искусственный Интеллект)

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

Если вы уже не первый год ведете какой-то проект, поверьте не похож ли он на нож мясорубки из истории №1 или на тарелку из истории №2


Это поможет вам оптимизировать свой проект выкинув из него все лишнее, что только тормозит его.

История №1


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

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

В 1987 году отдел роботизации и автоматизации завода «Электросила» разработал безумно дорогого супер-робота, который точно повторял движение рук рабочего (напоминаю, что это было 30 лет назад (!)), но его производительность оказалась столь малой, что рабочего вернули на заточку, чуть ли не на следующий день.

Для решения проблемы, был вызван внешний консультант из одного НИИ. Консультант начал свою работу, естественно с анализа….
Читать дальше →
Всего голосов 34: ↑30 и ↓4 +26
Комментарии 25

Знакомство с реактивными потоками – для Java-разработчиков

Время на прочтение 12 мин
Количество просмотров 22K
Привет, Хабр!

Сегодня мы вернемся к одной из тем, затрагиваемых в нашей замечательной книге "Реактивные шаблоны проектирования". Речь пойдет об Akka Streams и потоковой передаче данных в целом — в книге Роланда Куна этим вопросам посвящены главы 10 и 15-17.
Читать дальше →
Всего голосов 12: ↑12 и ↓0 +12
Комментарии 4

Три истории микросервисов, или MSA для Enterprise

Время на прочтение 21 мин
Количество просмотров 7.9K
Идея микросервиса заключается в том, чтобы строить приложение как набор небольших сервисов с выделенной функциональностью, каждый из которых работает в собственном процессе. Такой подход имеет ряд преимуществ, но не это тема сегодняшнего рассказа, а то, как идея микросервисной архитектуры выглядит с точки зрения российского корпоративного бизнеса и управленцев IT на предприятиях.


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

Микросервисы — одна из самых важных и значимых составляющих Web-scale архитектуры, имеющая наибольшие последствия для переделки устройства техник и паттернов в Enterprise. Трудно сейчас сказать, на каком участке сейчас находится сама технология — может быть, на самом верхнем пике, и нам предстоит еще десять раз разочароваться. Но, тем не менее, это не повод не изучать её прямо сейчас.
Всего голосов 24: ↑23 и ↓1 +22
Комментарии 1

Держим дизайн системы под контролем, используя изолированное юнит-тестирование

Время на прочтение 17 мин
Количество просмотров 8.1K
Согласитесь, ситуация, когда мы хотим выкинуть кучу готового кода, сильно раздражает. В этой статье вместе с Андреем Коломенским попробуем разобраться, какие для этого могут быть причины, и как узнать, как должна выглядеть наша система в точке максимально высокой продуктивности. Разберем, какой подход затянет нас в замкнутый круг недостаточно тщательного проектирования, а какой позволит получить тестопригодную систему, что в конечном счете приводит к качественному дизайну системы и уменьшает риск возникновения дефектов.



Сегодня мы поговорим о том,

  • Как делать тестирование сложными зависимостями?
  • Как добиться большого тестового покрытия?
  • Как тесты влияют на дизайн?
  • Что делать, когда много логики в базе?
  • Как соблюсти компромисс между дизайном и «не дизайном».


Всего голосов 41: ↑40 и ↓1 +39
Комментарии 114

О декораторах, сквозной функциональности, CQRS и слоеной архитектуре

Время на прочтение 5 мин
Количество просмотров 29K
Разработчик SimpleInjector очень любит «декораторы», особенно в сочетании с дженериками вида
QueryHandler<TIn, TOut>, CommandHanler<TIn, TOut>.

Такой подход позволяет «навешивать» на обработчики то, что принято называть cross-cutting concerns без регистрации и смс interception и особой уличной магии вроде Fody или PostSharp.

CQRS не top level architecture, поэтому хочется иметь такие-же декораторы и для классических Application Service. Под катом я расскажу как это сделать.
Читать дальше →
Всего голосов 12: ↑11 и ↓1 +10
Комментарии 21

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