Как расшифровывается аббревиатура принципа проектирования KISS?
Anonymous Quiz
7%
Keep intensive system solution
30%
Key interaction system solution
13%
Kind intelligence support system
50%
Keep it simple, stupid!
Как расшифровывается аббревиатура принципа проектирования DRY?
Anonymous Quiz
75%
Don't repeat yourself
4%
Don't read yourself
14%
Don't reply yes
7%
Don't rest yearly
Как расшифровывается аббревиатура принципа проектирования YAGNI?
Anonymous Quiz
14%
You able grant null indicator
21%
You able get null indicator
21%
Your architecture gives nothing interesting
43%
You ain’t gonna need it
В этот раз у нас серия из трех тестов! Аббревиатуры!
Я даже устал придумывать неправильные варианты) Вот здесь бы наверно нейросетка помогла. Или нет?
🔥 - если на все ответили правильно
🤓 - если попали в 1 - 2
🤷♂️ - если все мимо
Я даже устал придумывать неправильные варианты) Вот здесь бы наверно нейросетка помогла. Или нет?
🔥 - если на все ответили правильно
🤓 - если попали в 1 - 2
🤷♂️ - если все мимо
🔥7🤓6🤷♂4
Troubleshooting. Логирование
Если коротко: никогда не пренебрегайте логированием. Чем адекватнее логи, тем проще заниматься траблшутингом.
Что значит "адекватные логи"? Вообще термин "адекватность" относится к моделированию и означает совпадение свойств модели и моделируемого объекта. Так вот если принять процесс работы программы за моделируемый объект, а его логи за модель, то все становится понятно.
Как распознать неадекватные логи? Здесь надо исходить из основной функциональности или бизнес-логики программы. Если выполнение основной функциональности не попало в логи, то считаем адекватность логов слабой. Например, в случае с текстовым редактором основной функциональностью может быть открытие документа, и отсутствие записи об этом в логах осложнит восстановление общей картины процесса.
Отдельное внимание стоит уделить логированию ошибок. Здесь часто присутствует скудное описание, недосказанность. И если некоторые технологии обеспечивают нас трассировкой стека, что очень выручает, то в том же C++ о выводе подробностей ошибки надо заботиться самостоятельно. Ну встречали же такое: "File open error". И думай, что за файл, какой такой "error"? Никуда не годится. Хотя вся нужная информация есть, просто нам её не показали.
Ещё во время траблшутинга используют избыточное логирование. Это когда логируется чуть ли не каждая строка кода, что помогает разобраться с проблемой. Потом эти логи убираются. Хотя с этим лучше не спешить, а подумать, какие именно записи помогли нам, и, возможно, оставить их в логах навсегда. Некоторые ошибки имеют свойство повторяться со временем.
Логи - это "черный ящик", который мы получаем от пользователя в случае "аварии". От их качества нередко зависит успех операции)
Какие еще знаете и используете практики логирования?
Делитесь 👇
#Troubleshooting
Если коротко: никогда не пренебрегайте логированием. Чем адекватнее логи, тем проще заниматься траблшутингом.
Что значит "адекватные логи"? Вообще термин "адекватность" относится к моделированию и означает совпадение свойств модели и моделируемого объекта. Так вот если принять процесс работы программы за моделируемый объект, а его логи за модель, то все становится понятно.
Как распознать неадекватные логи? Здесь надо исходить из основной функциональности или бизнес-логики программы. Если выполнение основной функциональности не попало в логи, то считаем адекватность логов слабой. Например, в случае с текстовым редактором основной функциональностью может быть открытие документа, и отсутствие записи об этом в логах осложнит восстановление общей картины процесса.
Отдельное внимание стоит уделить логированию ошибок. Здесь часто присутствует скудное описание, недосказанность. И если некоторые технологии обеспечивают нас трассировкой стека, что очень выручает, то в том же C++ о выводе подробностей ошибки надо заботиться самостоятельно. Ну встречали же такое: "File open error". И думай, что за файл, какой такой "error"? Никуда не годится. Хотя вся нужная информация есть, просто нам её не показали.
Ещё во время траблшутинга используют избыточное логирование. Это когда логируется чуть ли не каждая строка кода, что помогает разобраться с проблемой. Потом эти логи убираются. Хотя с этим лучше не спешить, а подумать, какие именно записи помогли нам, и, возможно, оставить их в логах навсегда. Некоторые ошибки имеют свойство повторяться со временем.
Логи - это "черный ящик", который мы получаем от пользователя в случае "аварии". От их качества нередко зависит успех операции)
Какие еще знаете и используете практики логирования?
Делитесь 👇
#Troubleshooting
🔥3
Как исследовать exe-файлы с Cutter. Практика обратной разработки
Раз был проявлен интерес к обратной разработке, публикую небольшую статью ⬇️, которая рассказывает на практическом примере как исследуются и патчатся exe-файлы. Подходит для новичков.
Знания по обратной разработке необходимы разработчику для развития навыков построения относительно устойчивого ко взлому софта. Понимание таких практик позволит не допускать элементарных ошибок.
https://mediocre-developer.ru/kak-issledovat-exe-fajly-s-cutter-praktika-obratnoj-razrabotki
Раз был проявлен интерес к обратной разработке, публикую небольшую статью ⬇️, которая рассказывает на практическом примере как исследуются и патчатся exe-файлы. Подходит для новичков.
Знания по обратной разработке необходимы разработчику для развития навыков построения относительно устойчивого ко взлому софта. Понимание таких практик позволит не допускать элементарных ошибок.
https://mediocre-developer.ru/kak-issledovat-exe-fajly-s-cutter-praktika-obratnoj-razrabotki
🔥3
Выше дан код на C++. Что такое argc и argv?
Anonymous Quiz
85%
argc - количество аргументов командной строки, argv - массив этих аргументов
0%
argc - PID процесса, argv - имя файла программы
6%
argc - количество аргументов командной строки, argv - имя файла программы
9%
argc - PID процесса, argv - полный путь к файлу программы
Предлагаю отметить лишний рабочий день расслабляющей угадайкой! 🎉
Знаете, что это на картинке?
Определённо что-то из прошлого.
Ответ под спойлером:
Это перфокарты для электровикторины на знания правил дорожного движения. Фото прибора для считывания перфокарт скину в комменты.
🔥 - угадали
🤷♂️ - не угадали
Знаете, что это на картинке?
Определённо что-то из прошлого.
Ответ под спойлером:
🔥 - угадали
🤷♂️ - не угадали
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🤷♂2
Законы оптимизации по Фленову
Фленов М.Е. в своей книге "Программирование на C++ глазами хакера" выделил 9 законов оптимизации программ. И хоть сами законы определены немного размыто и многословно, из них можно выделить короткие правила.
1. Оптимизировать можно всё. Даже если вам кажется, что уже нельзя.
2. Первое, с чего нужно начинать, — это поиск самых слабых и медленных мест.
3. Следующим шагом нужно выявить повторяющиеся операции. Начинаем оптимизацию именно с них.
4. Оптимизировать одноразовые операции — это только потеря времени.
5. Старайтесь поменьше использовать вычисления с плавающей запятой. Любые операции с целыми числами выполняются в несколько раз быстрее.
6. При создании функций не обременяйте их большим количеством входных параметров. Перед каждым вызовом функции ее параметры прячутся в стек, а после выхода извлекаются оттуда. Чем больше параметров, тем значительнее расходы на общение со стеком.
7. Лучше передать адрес ячейки памяти, где хранятся данные, а внутри функции работать с этим адресом.
8. В самых критических ситуациях можно воспользоваться вставками кода на языке ассемблера. Но увлекаться этим не стоит.
9. Не используйте длинных указателей вроде:
10. Для сложных расчетов можно подготовить таблицы с заранее определенными результатами и потом использовать эти таблицы в реальном режиме времени.
11. Лишних проверок не бывает. Если вы думаете, что какая-то нестандартная ситуация может и не возникнуть, то она не возникнет только у вас.
12. Обязательно делайте проверки всего того, что вводит пользователь. Делайте это сразу же и не ждите, когда введенные данные понадобятся.
13. Внутри циклических операций не должно выполняться ничего лишнего, ведь это будет повторено много раз. Например, любые лишние операторы
14. Не переусердствуйте с оптимизацией. Слишком большие затраты на ускорение выполнения кода могут свести на нет приложенные усилия.
От себя отмечу важность последнего пункта. Не нужно заниматься оптимизацией, пока в этом не назрела необходимость. Причины могут быть разные: явные неадекватные тормоза, жалобы пользователей, несоответствие требованиям и т.п.
При этом преждевременно пессимизировать тоже не стоит.
📍 Фленов МЕ - Программирование на С++ глазами хакера (2009)
Фленов М.Е. в своей книге "Программирование на C++ глазами хакера" выделил 9 законов оптимизации программ. И хоть сами законы определены немного размыто и многословно, из них можно выделить короткие правила.
1. Оптимизировать можно всё. Даже если вам кажется, что уже нельзя.
2. Первое, с чего нужно начинать, — это поиск самых слабых и медленных мест.
3. Следующим шагом нужно выявить повторяющиеся операции. Начинаем оптимизацию именно с них.
4. Оптимизировать одноразовые операции — это только потеря времени.
5. Старайтесь поменьше использовать вычисления с плавающей запятой. Любые операции с целыми числами выполняются в несколько раз быстрее.
6. При создании функций не обременяйте их большим количеством входных параметров. Перед каждым вызовом функции ее параметры прячутся в стек, а после выхода извлекаются оттуда. Чем больше параметров, тем значительнее расходы на общение со стеком.
7. Лучше передать адрес ячейки памяти, где хранятся данные, а внутри функции работать с этим адресом.
8. В самых критических ситуациях можно воспользоваться вставками кода на языке ассемблера. Но увлекаться этим не стоит.
9. Не используйте длинных указателей вроде:
ClassName->SubClass->SubSubClass->Property. Если в функции происходит несколько обращений к такому свойству, то это будет неэффективно. Каждый раз компилятор должен развертывать эту длинную цепочку для получения адреса переменной. Намного эффективнее будет завести локальную переменную в начале функции, присвоить ей значение и использовать локальную переменную.10. Для сложных расчетов можно подготовить таблицы с заранее определенными результатами и потом использовать эти таблицы в реальном режиме времени.
11. Лишних проверок не бывает. Если вы думаете, что какая-то нестандартная ситуация может и не возникнуть, то она не возникнет только у вас.
12. Обязательно делайте проверки всего того, что вводит пользователь. Делайте это сразу же и не ждите, когда введенные данные понадобятся.
13. Внутри циклических операций не должно выполняться ничего лишнего, ведь это будет повторено много раз. Например, любые лишние операторы
if внутри цикла очень сильно влияют на производительность. Если возможно, их надо выносить за пределы цикла.14. Не переусердствуйте с оптимизацией. Слишком большие затраты на ускорение выполнения кода могут свести на нет приложенные усилия.
От себя отмечу важность последнего пункта. Не нужно заниматься оптимизацией, пока в этом не назрела необходимость. Причины могут быть разные: явные неадекватные тормоза, жалобы пользователей, несоответствие требованиям и т.п.
При этом преждевременно пессимизировать тоже не стоит.
📍 Фленов МЕ - Программирование на С++ глазами хакера (2009)
👍4
Чем отличается префиксный инкремент ++i от постфиксного инкремента i++ в языке C++?
Anonymous Quiz
9%
Ничем не отличается
6%
Префиксный инкремент не принят в C++
74%
Префиксный инкремент вернет инкрементированное значение, а постфиксный - значение до инкремента
11%
Префиксный инкремент добавляет биты в начало участка памяти, а постфиксный - в конец
Метрики исходного кода
Прогнал проект EduCad, который мы разрабатываем вместе со студентами, через анализатор метрик кода SourceMonitor. Метрик там много: подсчитываются строки, классы, методы, выражения, уровни вложенности, относительные величины и т.д.
По результатам анализа можно сказать, что мы ударно поработали! За 2023/2024 учебный год исходный код проекта неплохо "поправился":
🔜 количество файлов выросло со 123 до 350,
🔜 количество строк выросло с 3446 до 23103,
🔜 увеличилась и доля комментариев с 0,4% до 16,4% (задокументировали API).
Но тут интересно не только посчитать строки, но и выявить потенциально проблемные места в коде. Как правило, я обращаю внимание на:
🔜 Классы с большим количеством строк или методов. Здесь иногда оказывается, что класс определяет более одной сущности.
🔜 Методы с высоким уровнем вложенности. Большие "лесенки" из кода сложно читать и обсуживать. Лучше это не запускать.
🔜 Методы с высоким индексом сложности. Индекс сложности рассчитывается по специальной формуле. Чем выше индекс сложности, тем тоже сложнее читать и обслуживать код.
Относительно пунктов выше, нашему проекту слегка поплохело. Будем над этим работать.
Вообще, для анализа метрик я давно использую SourceMonitor. Это довольно старый проект, который после 2015 года не развивался. Но с недавних пор энтузиасты пытаются его оживить как опенсорс. Как-нибудь попробую собрать их версию.
А вы используете анализаторы метрик кода? Может знаете что-то получше SourceMonitor?
Прогнал проект EduCad, который мы разрабатываем вместе со студентами, через анализатор метрик кода SourceMonitor. Метрик там много: подсчитываются строки, классы, методы, выражения, уровни вложенности, относительные величины и т.д.
По результатам анализа можно сказать, что мы ударно поработали! За 2023/2024 учебный год исходный код проекта неплохо "поправился":
Но тут интересно не только посчитать строки, но и выявить потенциально проблемные места в коде. Как правило, я обращаю внимание на:
Относительно пунктов выше, нашему проекту слегка поплохело. Будем над этим работать.
Вообще, для анализа метрик я давно использую SourceMonitor. Это довольно старый проект, который после 2015 года не развивался. Но с недавних пор энтузиасты пытаются его оживить как опенсорс. Как-нибудь попробую собрать их версию.
А вы используете анализаторы метрик кода? Может знаете что-то получше SourceMonitor?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
YouTube Analyzer 4.0
Выпустили новую версию YouTube Analyzer - анализатора поисковой выдачи YouTube.
Из интересного в коде по сравнению с предыдущей версией:
🔜 Добавлена инфографика для упрощения аналитики: круговые диаграммы и гистограммы. Реализовано на QtCharts.
🔜 Добавлен выпадающий список автозаполнения поискового запроса. Работает как и на самом ютубе: начинаешь вводить запрос, а снизу выпадает "предложка". Реализовано прямо на QLineEdit, у которого из коробки есть возможность установить QCompleter.
YouTube Analyzer - это классическое desktop-приложение, написанное на Python / PySide(Qt).
Его решения можно использовать как шаблон для своих приложений на Python / PySide или на C++ / Qt (API там идентичное).
Выпустили новую версию YouTube Analyzer - анализатора поисковой выдачи YouTube.
Из интересного в коде по сравнению с предыдущей версией:
YouTube Analyzer - это классическое desktop-приложение, написанное на Python / PySide(Qt).
Его решения можно использовать как шаблон для своих приложений на Python / PySide или на C++ / Qt (API там идентичное).
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Подсчет точек принятия решения
В посте по метрикам я упомянул некий индекс сложности, с помощью которого анализатор SourceMonitor характеризует сложность кода. Этот индекс основан на формуле, подсчитывающей точки принятия решения, описанной в книге Макконнелла "Совершенный код".
Способ подсчета примерно такой:
1. Начните считать с 1 на некотором участке кода.
2. Добавляйте 1 для каждого из следующих ключевых слов или их эквивалентов:
3. Добавляйте 1 для каждого варианта в операторе
Попробуйте этим способом посчитать количество точек принятия решения для этого кода. Ответ дайте в опросе ниже.
В посте по метрикам я упомянул некий индекс сложности, с помощью которого анализатор SourceMonitor характеризует сложность кода. Этот индекс основан на формуле, подсчитывающей точки принятия решения, описанной в книге Макконнелла "Совершенный код".
Способ подсчета примерно такой:
1. Начните считать с 1 на некотором участке кода.
2. Добавляйте 1 для каждого из следующих ключевых слов или их эквивалентов:
if, while, repeat, for, and, or.3. Добавляйте 1 для каждого варианта в операторе
case.Попробуйте этим способом посчитать количество точек принятия решения для этого кода. Ответ дайте в опросе ниже.
if ( ( status = Success ) and done ) or
( not done and ( numLines >= maxLines ) ) ) then ...
Циклы против алгоритмов в C++
Есть мнение, что нам нужно избегать использования обычных циклов в угоду стандартным алгоритмам C++. Причина простая: семантика (смысл). То есть код, построенный на стандартных алгоритмах, проще читать, а значит проще поддерживать, а значит меньше будет багов. Звучит здорово, но всегда ли это так?
Попробуем на конкретном примере сравнить обычный цикл и алгоритм.
Пусть у нас есть задача найти в списке объект и активировать его.
Вариант с циклом выглядит так:
А теперь то же самое, но через алгоритм:
Что скажете, какой вариант проще читать? На мой взгляд вариант с циклом выглядит полегче. Хотя вариант с алгоритмом
Но всё это я веду к тому, что этот вопрос все таки дискуссионный, а лучший вариант будет зависеть от контекста. Рекомендую пробежаться по статье ниже, там рассмотрены разные случаи.
📍Don’t use raw loops
Есть мнение, что нам нужно избегать использования обычных циклов в угоду стандартным алгоритмам C++. Причина простая: семантика (смысл). То есть код, построенный на стандартных алгоритмах, проще читать, а значит проще поддерживать, а значит меньше будет багов. Звучит здорово, но всегда ли это так?
Попробуем на конкретном примере сравнить обычный цикл и алгоритм.
Пусть у нас есть задача найти в списке объект и активировать его.
Вариант с циклом выглядит так:
for ( Object* obj : list )
{
if ( obj == target )
{
obj->activate();
return;
}
}
А теперь то же самое, но через алгоритм:
auto it = std::find_if( list.begin(), list.end(), [target]( Object* obj )
{
return obj == target;
} );
if ( it != list.end() )
( *it )->activate();
Что скажете, какой вариант проще читать? На мой взгляд вариант с циклом выглядит полегче. Хотя вариант с алгоритмом
std::find_if лучше демонстрирует намерение программиста ...наверное 😒Но всё это я веду к тому, что этот вопрос все таки дискуссионный, а лучший вариант будет зависеть от контекста. Рекомендую пробежаться по статье ниже, там рассмотрены разные случаи.
📍Don’t use raw loops
👍3
Белое проклятие
"Белое проклятие" - так называется повесть Владимира Санина о работе лавинщиков. Тех, кто изучает лавины и обеспечивает безопасность на горных склонах ⛷
Вообще, мне нравится читать о людях из разных профессий. Особенно экстремальных. После таких историй "шатающийся" прод кажется вполне себе решаемой проблемой 😀
Сюжет разворачивается на популярном горнолыжном курорте, на который обрушивается мощный циклон с обильными осадками. Спящие лавины стремительно набирают силу и готовятся сорваться на курортный городок. Лавинщикам же предстоит его спасать, борясь не столько со стихией, сколько с бизнесом, который не хочет закрывать трассы...
В повести непривычно много "технических" моментов по предмету. Я, например, не знал, что лавина толкает перед собой мощную воздушную волну, которая иногда бывает разрушительнее самой снежной массы. Также описана целая инструкция по выживанию при попадании в лавину. Спойлер:шансов мало .
Мастрид, короче)
Я же под впечатлением от прочитанного сообразил вам тест на оценку. Скролим вниз⬇️
Хотя погодите! Я напомню, что иногда мы здесь практикуем навык оценки. Он нам пригодится для оценки объемов работ и трудозатрат в задачах на разработку. Задачи бывают разные и нам приходится оценивать то, о чем мы имеем слабое представление. Но всегда можно найти факторы, за которые можно зацепиться и, плюс-минус, приблизиться к истине.
#КнижнаяПолка
"Белое проклятие" - так называется повесть Владимира Санина о работе лавинщиков. Тех, кто изучает лавины и обеспечивает безопасность на горных склонах ⛷
Вообще, мне нравится читать о людях из разных профессий. Особенно экстремальных. После таких историй "шатающийся" прод кажется вполне себе решаемой проблемой 😀
Сюжет разворачивается на популярном горнолыжном курорте, на который обрушивается мощный циклон с обильными осадками. Спящие лавины стремительно набирают силу и готовятся сорваться на курортный городок. Лавинщикам же предстоит его спасать, борясь не столько со стихией, сколько с бизнесом, который не хочет закрывать трассы...
В повести непривычно много "технических" моментов по предмету. Я, например, не знал, что лавина толкает перед собой мощную воздушную волну, которая иногда бывает разрушительнее самой снежной массы. Также описана целая инструкция по выживанию при попадании в лавину. Спойлер:
Мастрид, короче)
Я же под впечатлением от прочитанного сообразил вам тест на оценку. Скролим вниз
Хотя погодите! Я напомню, что иногда мы здесь практикуем навык оценки. Он нам пригодится для оценки объемов работ и трудозатрат в задачах на разработку. Задачи бывают разные и нам приходится оценивать то, о чем мы имеем слабое представление. Но всегда можно найти факторы, за которые можно зацепиться и, плюс-минус, приблизиться к истине.
#КнижнаяПолка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Дайте оценку, какую часть суши Земли составляют лавиноопасные регионы?
Anonymous Quiz
21%
0.5% - 2.9%
52%
4% - 11%
18%
16% - 27%
9%
28% - 37%
🤩1