Уходя — уходи? Ночной разговор об увольнениях


За время своей карьеры я поработал с разными legacy-проектами, каждый из которых страдал от тех или иных изъянов.
Разумеется, часто главной проблемой было низкое качество программного обеспечения (отсутствие модульных тестов, отказ от использования принципов чистого кода…), но были также и трудности, чьим источником являлись архитектурные решения, принятые в начале работы над проектом или даже в период зарождения корпоративной системы. На мой взгляд, этот класс проблем является причиной наибольшей боли для многих проектов.
В сущности, улучшение кода — дело довольно простое, особенно сейчас, когда движение за мастерство разработки ПО (software craftsmanship) продвигает хорошие практики в командах. Однако изменение стержневых частей систем, ограничений, введенных в самом начале их жизненного цикла, является чрезвычайно сложной задачей.
Расскажу о нескольких типах встречавшихся мне архитектурных решений, которые могут стать реальным бременем для команд, занимающихся поддержкой подобных систем.
https://m.vk.com/mp3/audio_api_unavailable.mp3?extra=AeL2rMfFyZzlD3HkyvfnvNvLx1KOqw5UDfuXCOTvttm4ts1OBJnYELvHyxvODI9fnM9YztD5A3iOyI14sxv2mNiXt3iTzdLInduXzvG9C2uVr3b5mezinfj2lJbpDhGYC25rDxbwsOPQmg1eu2Pbyxr3ntPowNLhDMrrDs8XnKu2sOuOyO8XzMf1otDmBtL6BNvllNjZx3aZuLHpq3aOBvvhzenJnZKTzKnMuwfKBI4TquffrtzKv2nymMyVDu1LzJnuwMLxwMm/BeTcserWlun3ExLVBG#AqSZntu
От переводчика:ffmpeg -i video.avi
ffmpeg -f image2 -i image%d.jpg video.mpg
ffmpeg -r 12 -y -i "image_%010d.png" output.mpg


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


Проект был продан ООО «Престиж Медиа». Мы обновляем серверное оборудование. С 1 октября 2018 года проект продолжит полноценную работу и развитие. Всё будет хорошо :) Всем мир! :)
В 2013 году сотрудники Европейской организации по ядерным исследованиям (ЦЕРН) с участием коллег из Гарвардского университета и Массачусетского технологического университета разработали ProtonMail — почтовый сервис с шифрованием. Он находится в Швейцарии. По мнению разработчиков, сервис защищён от действия американских и европейских законов, в первую очередь, от контроля АНБ. Главная цель — обеспечить безопасность и уважение к частной жизни пользователей. В каком-то смысле ProtonMail стал ответом на закрытие криптопочты Lavabit после атаки американских спецслужб на её создателя Ладара Левисона. Швейцарская компания Proton Technologies AG не попадает под действие американских законов, что сводит к минимуму вероятность подобного сценария.
Работа со временем как с безразмерной величиной может приводить к недоразумениям и ошибкам конвертации временных единиц измерения:
– Слушай, ты не помнишь, мы в sleep передаем секунды или миллисекунды?
– Блин, оказывается у меня в часе 360 секунд, ноль пропустил.
Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах. Теперь все логично:
using namespace std::chrono;
int find_answer_to_the_ultimate_question_of_life()
{
//Поиск ответа
std::this_thread::sleep_for(5s); //5 секунд
return 42;
}
std::future<int> f = std::async(find_answer_to_the_ultimate_question_of_life);
//Ждем максимум 2.5 секунд
if (f.wait_for(2500ms) == std::future_status::ready)
std::cout << "Answer is: " << f.get() << "\n";
else
std::cout << "Can't wait anymore\n";Библиотека реализует следующие концепции:
duration;time_point;clock.


