Турбокодер
337 subscribers
68 photos
1 video
9 links
Блог инди-разработчика Болсуна Михаила.

Автор проектов TurboConf, FastCode 1С, Нетленка 1С и т.д.

Админ каналов @FastCodeIM, @TurboConf и других.

Дневник разработчика, идеи, мысли, маркетинг, монетизация, ИИ, GPT, нейросети
1С, C#, Telegaram, Web...
Download Telegram
Нужен ли рефакторинг бизнесу?

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

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

Рефакторинг не принесет денег в моменте. Скорее всего добавит новых ошибок, что приведет к потерям в доходах. За это время не появится новых функций в продукте и т.д.

Да, через какое-то время это возможно окупится. А может и нет. Может продукт вообще устареет и проще написать новую версию или другой проект. В общем затея рискованная.

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

А вы что думаете. Нужен рефакторинг с точки зрения бизнеса или можно обойтись без него? 😉
🔥3👍2
Как, на первый взгляд, простая задача превращается в сложную.

Пришлось поменять сервис SMTP рассылки, которым я пользовался уже долгое время.
Простая задача: создать учетную запись в новом сервисе, подтвердить домен, добавить записи DKIM/SPF/DMARC в DNS и заменить несколько параметров в конфиг-файле (логин, пароль, порт, хост). Все - ну пусть максимум час-два на все.

Но не тут-то было...

После всех вышеуказанных действий все заработало, но письма стали приходить с неправильной кодировкой темы письма, типа ??????? ?????????? или Восстановление пароля

Странно, все вроде работало до этого. Начинаем ковыряться в C# SmtpClient, штатный класс для отправки писем. Пробуем менять кодировки туда-сюда. Ничего не помогает.

Смотрим заголовки письма. Почему-то тема приходит в PlainText:

Subject: Восстановление пароля

а не как должно быть:
Subject: =?utf-8?B?0JLQvtGB0YHRgtCw0L3QvtCy0LvQtdC90LjQtSDQv9Cw0YDQ?=

Гуглим и находим, что это баг в асинхронном методе SendMailAsync. Он известен, но Microsoft почему-то не исправляет его уже долгие годы. Видимо предыдущий сервис как-то исправлял кодировку сам. Пробуем на всякий случай обновить .NET до последней версии, но не помогает.
Пробуем несколько обходных путей, которые предлагаются. Тоже.
В общем, беру синхронный метод Send и оборачиваю его в асинхронный и все работает. Понятно, что костыль но т.к. отправка на сайте нормально не работает, нужно что-то срочно делать.

Итого, задача усложнилась в несколько раз и потребовала почти день, вместо одного часа и то не решена до конца . А у вас часто бывает такое?😉
🔥6👍1
Кто-нибудь вообще читает Помощь в программах?

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

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

Но и сам я тоже не могу себя заставить сесть и детально ознакомится со всем инструментарием который я использую. Максимум могу просмотреть какой-нибудь обучающий ролик на YouTube. Если что-то не работает или не знаю как воспользоваться функцией лезу в Гугл.

В древние времена, когда не было интернета - мануал был единственным источником информации. Поэтому да, тогда читал.

Но мне также попадались пользователи, которые внимательно читают Помощь от А до Я. Но сейчас это большая редкость. Видимо времена сейчас такие.

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

Писать и поддерживать документацию в актуальном состоянии достаточно трудозатратная задача. Может ну ее тогда совсем? ))

А вы сами читаете мануалы? 😉
👍1
Решил провести кое-какой рефакторинг на сайтах, обновить версии .NET Framework, перевести методы на асинхронные где еще не было сделано до этого.

В результате потом три дня разбирался с исключениями и периодическими падениями IIS. Зато разобрался как определять причину падения w3wp.exe.

Если коротко, то нужно снять дамп во время падения и проанализировать его.

Для снятия дампа нужно:
1. установить на сервер Debug Diagnostic Tool от Microsoft.
2. запустить DebugDiag Connection и настроить к какому процессу сайту цеплять отладчик и какой дамп снимать. Я выбрал полный. Все это занимает буквально несколько кликов.
3. Ждать падения, в окне будет увеличиваться счетчик ошибок.

Для анализа:
1. Запустить DebugDiag Analysis
2. Загрузить дампы, которые насобирал DebugDiag
3. Выбрать нужный отчет, в моем случае Default (Crash report) и нажать Анализ
4. В отчете ищем текст исключения и трассировку.

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

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

Но опыт получен 😉
👏2
Начал заполнять на сайте раздел о клиентах. Все руки не доходили, хотя понимал что это очень важно.

Добавил карусель с логотипами на лендинг и в раздел Купить.

Буду постепенно добавлять, список длинный 😏

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

Как говорится, лучше позже чем никогда.
👍4🔥1
Решил наконец-то окончательно победить неправильное отображение форм, при использовании масштабирования в системе.

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

Проблема в том, что для WinForms масштабирование в Windows настоящий ад. На разных системах и разных версиях .NET все реализовано по своему. А если еще у вас несколько разных мониторов...
Даже в пределах Windows 10 масштабирование может вести себя по разному, в зависимости от установленного обновления Creators Update и .NET 4.7.2
По тестам, лучше всего программа отображалась на Windows 11, но зная неповоротливость энтерпрайза, рассчитывать на это пока не стоит.

Еще из бонусов. Смену масштаба при переносе с монитора на монитор можно отследить только в последних версиях .NET и ОС.

В общем решил писать свою реализацию.

Разрабатывать формы нужно обязательно на 100% DPI, а тестировать уже при другом. При чем нужно перелогиниваться, что бы было все корректно. Либо проверять на другой машине.

Замерил размер шрифта 8.25 на своей системе, с масштабированием 100%. Затем в программе, при создании формы, добавил вычисление строки с таким шрифтом на текущей форме и поделив эти значения получил точный коэффициент. Далее корректирую размеры элементов формы.

Проверил на разных системах, с разным масштабированием. Работает как часы. 😉
🔥4👏3
Решил преобразовать канал FastTalk 1C в TurboConf 1C

Решение было не просто принять, но взвесив все за и против я это сделал.
Преимуществ несколько:
1. Канал FastTalk 1C не особо взлетел. Предполагалось что в нем будут публиковаться разные авторы, в различных рубриках. Как думаете сколько за год авторов, кроме меня, добавило статьи? Правильно, 0.
2. Создавать с нуля еще один канал, процедура не простая. А т.к. аудитория на канале уже была и большинство публикаций в последнее время были как раз посвящены ТурбоКонф, то решение логичное.
3. У меня и так много каналов и вести еще один просто нет возможности.

Отдельный канал TurboConf я давно хотел сделать. Группа была, но не все любят участвовать в чатах. Да и информации там слишком много, нужные новости можно случайно пропустить.

Планирую публиковать не только информацию посвященную TurboConf, но и о других инструментах, продуктивной разработке и администрировании.

Понятно, сейчас происходят отписки, но и новые пользователи тоже прибавляются. Со временем думаю все устаканится и будет ОК 😉
Как там дела с ботом вакансий?

Подключил несколько партнеров - админов крупных телеграм каналов по 1С. Они разместили у себя ссылку на бота и будут получать комиссию, если будет прибыль 🙂.
Копится база пользователей и работодателей. Пользователей бота уже более 800.
Начал тестировать монетизацию. Ввел два типа размещения Бесплатное и Премиум.
Бесплатное - размещение в боте без уведомлений и публикация в телеграм канале.
Премиум - рассылка пользователям бота с уведомлением, публикация в канале, закрепление в топе в боте и канала. Стоимость тестирую от 1р. за отправку одному пользователю и выше. Стоимость рассчитывается перед публикацией, с учетом оборов пользователей.

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

Пока это все еще MVP и нужно как следует над ним поработать. Но тем не менее кое-какие успехи уже есть 😉
🔥1
Какие только баги не встречаются на свете!

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

Например:
C:\Users\s.stepanov\AppData\Roaming\1c\1cv8\1cv8cmn.pfl ))
Программа думает что C:\Users\s.st - это файл шаблона и пытается его загрузить.

Обнаружил случайно при анализе лога пользователя, на предмет другой ошибки.
Чего только не бывает 😀
😁4
Бывает у вас такое?
Исправил небольшую ошибку, надо выпускать в релиз и решаешь сразу закрыть еще одну. А тут тоже можно улучшить, тут подправить, тут добавить... В результате 3 дня разработки и релиз на 20 изменений 😉
👍10
Добавить новую фичу не сложно, сложно довести ее до рабочего состояния.

В точности по правилу Парето, 20% времени занимает создать прототип который работает у самого разработчика. А потом начинается 80% доведения до ума, чтобы фича работала везде (самая скучная часть).
Начинают всплывать нюансы, в других функциях появились баги (да, далеко не все можно выявить Юнит тестами).
А руки чешутся добавить еще новый функционал, а не копаться в исправлениях и доработках.

Но что делать, таков Путь разработчика 😉
🔥1
Хотел перейти на более короткий цикл выпуска релизов. Т.е. одна большая фича - новый релиз.
Но опять сделал монстра. И новый API, и поднятие версии .NET и OneScript, куча нового функционала и улучшенные механизмы взаимодействия.

В общем уже почти тянет на новую мажорную версию TurboConf 6, а не TurboConf 5.18 🙂
🔥92
Что-то почтовые рассылки совсем перестали работать.

Делал прошлую рассылку 3 месяца назад, отклика почти не было, зря потратил 1000 руб.

Сегодня еще раз попробовал рассылку о новом большом релизе. Опять бесполезно. 1% переходов. В предыдущей было 4%. До этого было 8% и выше.
Просмотров 12% вместо 33% у прошлой.
Видимо от рассылок на почту придется отказаться.

ВК тоже глухо. 41 просмотр из 270 подписчиков. 1 лайк и то мой 😀 Зачем я веду эту группу 🤔

Но зато Телеграм радует.
Видимо все окончательно перешли в Телеграм и почту уже не смотрят.
Пользователи стали жаловаться что залипают клавиши в текущем релизе TurboConf. Начал разбираться и нашел изменение, которое все сломало.

И там был такой комментарий, к чему бы это? 😀
😁2
Когда я работал наемным программистом, мне всегда нравился вопрос от руководства, "Сколько точно нужно времени чтобы добавить такой-то функционал"?
Как по мне для алгоритма расчета времени на выполнение новой задачи лучше всего подходит этот отрывок из Р. Шекли.

Вальдец удрученно вздохнул, извлек из пояса клочок бумаги и огрызок карандаша и спросил:
– Сколько монет у вас в кармане?
Порывшись в кармане, Марвин сказал:
– Восемь.
Вальдец записал эту цифру, потом выяснил год и день рождения Марвина, номер его удостоверения личности, размер обуви и рост в сантиметрах. Над этими данными он произвел какие-то математические выкладки. Затем попросил Марвина назвать наудачу любое число от 1 до 14. К названному числу он прибавил несколько своих, после чего несколько минут выводил какие-то каракули и что-то подсчитывал.
– Ну? – поторопил его Марвин.
– Помните, результат представляет собой всего-навсего статистическую вероятность, – сказал Вальдец, – и заслуживает доверия лишь как таковой.
Марвин кивнул. Вальдец продолжал:
– В вашем конкретном случае период раскрытия системы истекает ровно через одну минуту сорок восемь секунд плюс-минус пять минимикросекунд.
👍5
Никогда не думал, что буду номинироваться на звание Легенды 1С 😀

Оказывается тут голосовалка и за меня даже голосует часть сообщества, что конечно приятно. Значит усилия потрачены не зря 🙂

https://t.iss.one/JuniorOneS/579
👍3🔥3
Всем хорошо известно, релиз в пятницу часто приводит к незабываемым выходным.

Но меня вот как обычно что-то тянет нажать заветную кнопку именно в пятницу вечером 😀

Может таким образом хочется закрыть гештальт? 😉

А у вас часто бывают релизы по пятницам?
Пятница, вечер. Факультатив.

Делаем темную тему для подсказки T9, чтобы у бедных пользователей темных тем глаза не выпадали от появления светлого окна.
🔥5
32 гигабайта ОЗУ стало маловато на десктопе. Сходил прикупил еще 32 гига 🙂
Надеюсь 64ГБ теперь будет достаточно для одновременной работы в нескольких IDE, парочке 1С, Chrome и проигрывателя музыки

P.S. установил. Rider на радостях сожрал 30Гб оперативки 😧 Но потом опомнился и упал до 6 Гб, сейчас в рабочей среде потребление памяти в районе 50% 😀
👍9
Пример использования ChatGPT в работе

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

https://fastcode.im/Templates/8638

А вы уже используете нейросети для повседневной работы? 😉
🔥3
Как известно админы делятся на 2 типа. Те кто еще не делают бэкапы и те кто уже делает бэкапы.

Сегодня внезапно один из жестких дисков на 1.5 ТБ перестал работать, с признаками короткого замыкания.

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

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

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

Из облачного хранилища были восстановлены самые важные фото и видео и некоторые важные бэкапы данных.

Затем с другого резервного винта была восстановлена оставшаяся часть фото и видео.

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

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

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

Кстати еще один жесткий диск на 2ТБ, сегодня подозрительно щелкнул 😀
👍4🫡2