Блог им. mirus3000

Программисты, как вы там?

По мотивам smart-lab.ru/blog/1128671.php

Еще не все уволены? 

687
30 комментариев
Выживут ли программисты? Да, но в новом качестве:
— Архитекторы, DevOps, security-спецы – их работа сложна для ИИ.
— ИИ-инженеры и промпт-специалисты – те, кто управляет ИИ, а не пишет код вручную.
— Узкие эксперты в нишах (квантовые вычисления, embedded, криптография).

Ит компании уже сейчас могут снизить свой ФОТ на 50%, снизить зарплаты даже сеньорам. Но не делают этого по политическим причинам:
Риск ухода к конкурентам (особенно в госсектор/банки).
ИИ пока нестабилен – есть риск что после ухода спеца устранить сбой будет дорого, страхуются.
Моральный фактор – резкое снижение убивает мотивацию оставщихся.

Вывод, рынок ИТ держится на политике, резкий крах сделает больно всем, буквально экономика всех развитых стран рухнет на 10% в силу большой занятости населения в ит, молодых и много покупающих. Не на квалификации и незаменимости, только политическая рациональность. Этот период будет длиться несколько лет, посадка рынка труда в ит отрасли всё равно выталкнет всех лишних
Eugen Invest Malina, Да, реалистичный прогноз.
avatar
Eugen Invest Malina, Ещё мне кажется, набор скиллов в условной модели, определяющей уровень оплаты человека изменится. Ну т.е. раньше, выпячивались одни скиллы, и на них смотрели, были и другие важные, но они были как бы в тени за этими выпяченными. Щас эти выпяченные закроет ИИ, и те теневые выйдут на свет и станут более значимыми. Ну не знаю, нестандартное мышление при решении проблем, способность выйти за рамки шаблонов, умение экспериментировать, рисковать, раз щас не надо упарываться реализацией — может какие-то подобные скиллы станут больше цениться и их обладатели, соответственно.
avatar
Eugen Invest Malina, ну попробуйте, ага. Мы прямо сейчас пилим проект бюджетирования в одной федеральной компании, собственно кодирование занимает максимум 10% от объёма затрат, скорее меньше. Анализ бизнес-процессов, документирование, архитектура, согласования, конфигурирование типовых модулей, итерации тестирования с представителями заказчика и постоянными доработками по пожеланиям, интеграционные взаимодействия с десятком смежных систем, в рамках каждой из которых тоже надо провести кучу совещаний и согласовать состав потоков… Типовая для 'кровавого энтерпрайза' картина.
avatar
Лет через 5 можно вернуться у этой теме, пока рано
Клетчатый, через 5 лет непонятно что будет. А пока зп проггеров летят вниз как газпром в начале СВО. 
avatar

E L, Вы можете это сделать самостоятельно, например, через этот сервис. replit.com/

 

avatar
У программистов всё хорошо не переживайте. Конструкторы сайтов есть давно, заменили ли они программистов? Только если нужно сделать что то примитивные и быстро. Так же и ИИ, что-то более сложно чем партер сайтов или телеграм бот и будет нужен программист.
Александр Плеханов, на днях писал для микросервисов кое-какую фичу. Главное найти редактор который видит весь контекст микросервисов. Ну и ручками поправить кое-какие шероховатости.

avatar
Ну если всё так классно берите задачи на фрилансе и гребите деньги лопатой с помощью ИИ выполняя задания за секунды.
Александр Плеханов, предположу что многие так и делают. 
avatar
Александр Плеханов, дек цены автоматом падают на труд в этом прикол
ИИ щас пишет только простые вещи, он не понимает какой он фреймворк использует старый или новый, на выход выдает портянку спагети кода с гитхаба, который нужно проверять фиксить и править, и не факт что это будет то что нужно.
Иван Котиков, пишет сложные весчиии
Иван Котиков, все он понимает. Как минимум Spring. И пишет как сеньер с 25 годами опыта. 
avatar
Неолиберальный тоталитаризм, Perplexity простые вещи смог, сложные с фремворками пупетр налажал, методы часть от старых либ использовал, часть вызовов от новых, ну и куча всего по мелочи.
Иван Котиков, не полльзовался, не могу прокомментировать. Попробуйте www.cursor.com/
avatar
Думаю это будет как с компьютерами, про которые экономисты говорят так — мы видим компьютеры везде, кроме как в экономической с статистике — адаптация AI технологий будет идти крайне медленно

1. Сейчас ассистенты работают крайне херово и непредсказуемо. Я его в тестах использую — иногда напишет тесты на файл слету, на соседней по сути такой же какую-то херь и заставить его не получается. Реальные проблемы, которые мне нужно решить не решает

2. Большинство реальных системе имеют кучу всего по мимо кода — куча микросервисов без хорошо описанных контрактов, инфра, вспомогательные системы, сети и т.д. Тут есть определенное движение в виде IaC и формальной спецификации контрактов, но даже в теории пока до полной описания всего кроме кода очень далеко

3. Написание ТЗ — его не возможно написать полностью, одна из задач программиста постоянно уточнять и дорабатывать ТЗ по мере реализации, тут у AI совсем все туго
avatar
Михаил, попробуйте изменить сеть. Например на Cloude Sonet 3.7
avatar
Неолиберальный тоталитаризм, у меня есть доступ ко всех основным моделям (в том числе Cloude Sonet 3.7) + несколько вариантов агентских настроек над ними
avatar
Неолиберальный тоталитаризм, я тебе могу задачку подкинуть — решишь, я поверю в скорую победу AI. В этом коде течет память на MPS бекэнде — как починить

github.com/WLM1ke/poptimizer/blob/master/poptimizer/use_cases/dl/trainer.py
avatar

Михаил, дак мне и в предыдущем посте кидали такие задачи — мол вот тут ошибка, реши. 

Вот как Grok предлагает исправить ваш код. 

import asyncio
import collections
import itertools
import logging
import time
from typing import Literal, cast

import torch
import tqdm
from pydantic import BaseModel
from torch import optim

from poptimizer import consts, errors
from poptimizer.domain.dl import data_loaders, datasets, ledoit_wolf, risk
from poptimizer.domain.dl.wave_net import backbone, wave_net
from poptimizer.domain.evolve import evolve
from poptimizer.use_cases import handler
from poptimizer.use_cases.dl import builder


class Optimizer(BaseModel):
lr: float
beta1: float
beta2: float
eps: float
weight_decay: float
momentum_decay: float
decoupled_weight_decay: bool


class Scheduler(BaseModel):
max_lr: float
epochs: float
pct_start: float
anneal_strategy: Literal[«linear», «cos»]
cycle_momentum: bool
base_momentum: float
max_momentum: float
div_factor: float
final_div_factor: float
three_phase: bool


class Cfg(BaseModel):
batch: builder.Batch
net: backbone.Cfg
optimizer: Optimizer
scheduler: Scheduler
risk: risk.Cfg


class RunningMean:
def __init__(self, window_size: int) -> None:
self._sum: float = 0
self._que: collections.deque[float] = collections.deque([0], maxlen=window_size)

def append(self, num: float) -> None:
self._sum += num — self._que[0]
self._que.append(num)

def running_avg(self) -> float:
return self._sum / len(self._que)


def _get_device() -> Literal[«cpu», «cuda», «mps»]:
if torch.cuda.is_available():
return «cuda»
if torch.backends.mps.is_available():
return «mps»
return «cpu»


class Trainer:
def __init__(self, builder: builder.Builder) -> None:
self._lgr = logging.getLogger()
self._builder = builder
self._device = _get_device()
self._stopping = False

async def update_model_metrics(
self,
ctx: handler.Ctx,
model: evolve.Model,
test_days: int,
) -> None:
start = time.monotonic()

cfg = Cfg.model_validate(model.phenotype)
days = datasets.Days(
history=cfg.batch.history_days,
forecast=model.forecast_days,
test=test_days,
)
data, emb_size, emb_seq_size = await self._builder.build(
ctx,
model.day,
model.tickers,
days,
cfg.batch,
)

try:
await asyncio.to_thread(
self._run,
model,
data,
emb_size,
emb_seq_size,
cfg,
model.forecast_days,
)
except asyncio.CancelledError:
self._stopping = True
if self._device == «cuda»:
torch.cuda.empty_cache()
raise
finally:
# Освобождаем данные
del data
if self._device == «cuda»:
torch.cuda.empty_cache()

model.risk_tolerance = cfg.risk.risk_tolerance
model.duration = time.monotonic() — start

def _run(
self,
model: evolve.Model,
data: list[datasets.TickerData],
emb_size: list[int],
emb_seq_size: list[int],
cfg: Cfg,
forecast_days: int,
) -> None:
net = self._prepare_net(cfg, emb_size, emb_seq_size)
try:
self._train(net, cfg.optimizer, cfg.scheduler, data, cfg.batch.size)
model.alfa, model.llh = self._test(net, cfg, forecast_days, data)
model.mean, model.cov = self._forecast(net, forecast_days, data)
finally:
del net
if self._device == «cuda»:
torch.cuda.empty_cache()

def _train(
self,
net: wave_net.Net,
optimizer: Optimizer,
scheduler: Scheduler,
data: list[datasets.TickerData],
batch_size: int,
) -> None:
train_dl = data_loaders.train(data, batch_size)
opt = optim.NAdam(
net.parameters(),
lr=optimizer.lr,
betas=(optimizer.beta1, optimizer.beta2),
eps=optimizer.eps,
weight_decay=optimizer.weight_decay,
momentum_decay=optimizer.momentum_decay,
decoupled_weight_decay=optimizer.decoupled_weight_decay,
)

steps_per_epoch = len(train_dl)
total_steps = int(steps_per_epoch * scheduler.epochs)

sch = optim.lr_scheduler.OneCycleLR(
opt,
max_lr=scheduler.max_lr,
total_steps=total_steps,
pct_start=scheduler.pct_start,
anneal_strategy=scheduler.anneal_strategy,
cycle_momentum=scheduler.cycle_momentum,
base_momentum=scheduler.base_momentum,
max_momentum=scheduler.max_momentum,
div_factor=scheduler.div_factor,
final_div_factor=scheduler.final_div_factor,
three_phase=scheduler.three_phase,
)

self._log_net_stats(net, scheduler.epochs, len(train_dl.dataset))

avg_llh = RunningMean(steps_per_epoch)
net.train()

try:
with tqdm.tqdm(total=total_steps, desc=«Train») as progress_bar:
for epoch in range(int(scheduler.epochs)):
for batch in train_dl:
if self._stopping:
return

opt.zero_grad()

loss = -net.llh(
batch.num_feat.to(self._device),
batch.emb_feat.to(self._device),
batch.emb_seq_feat.to(self._device),
batch.labels.to(self._device),
)
loss.backward()
opt.step()
sch.step()

avg_llh.append(-loss.item())
progress_bar.set_postfix_str(f"{avg_llh.running_avg():.5f}")
progress_bar.update(1)

loss = None # Освобождаем тензор
if self._device == «cuda»:
torch.cuda.empty_cache()
# self._lgr.debug(
# «Memory allocated: %.2f MB»,
# torch.cuda.memory_allocated() / 1024**2,
# )
finally:
del train_dl
del opt
del sch
del avg_llh
if self._device == «cuda»:
torch.cuda.empty_cache()

def _test(
self,
net: wave_net.Net,
cfg: Cfg,
forecast_days: int,
data: list[datasets.TickerData],
) -> tuple[list[float], list[float]]:
with torch.inference_mode():
net.eval()
test_dl = data_loaders.test(data)
alfa_sum = 0.0
llh_sum = 0.0
count = 0

try:
for batch in test_dl:
if self._stopping:
break

loss, mean, std = net.loss_and_forecast_mean_and_std(
batch.num_feat.to(self._device),
batch.emb_feat.to(self._device),
batch.emb_seq_feat.to(self._device),
batch.labels.to(self._device),
)
rez = risk.optimize(
mean,
std,
batch.labels.numpy() — 1,
batch.returns.numpy(),
cfg.risk,
forecast_days,
)

self._lgr.info(«Return: %.4f, LLH: %.4f», rez.ret — rez.avr, loss)

alfa_sum += rez.ret — rez.avr
llh_sum += loss
count += 1

if self._device == «cuda»:
torch.cuda.empty_cache()
finally:
del test_dl
if self._device == «cuda»:
torch.cuda.empty_cache()

if count == 0:
raise errors.UseCasesError(«No test batches processed»)

return [alfa_sum / count], [llh_sum / count]

def _forecast(
self,
net: wave_net.Net,
forecast_days: int,
data: list[datasets.TickerData],
) -> tuple[list[list[float]], list[list[float]]]:
with torch.inference_mode():
net.eval()
forecast_dl = data_loaders.forecast(data)
try:
if len(forecast_dl) != 1:
raise errors.UseCasesError(«Invalid forecast dataloader»)

batch = next(iter(forecast_dl))
mean, std = net.forecast_mean_and_std(
batch.num_feat.to(self._device),
batch.emb_feat.to(self._device),
batch.emb_seq_feat.to(self._device),
)

year_multiplier = consts.YEAR_IN_TRADING_DAYS / forecast_days
mean *= year_multiplier
std *= year_multiplier**0.5

total_ret = batch.returns.numpy()
cov = std.T * ledoit_wolf.ledoit_wolf_cor(total_ret)[0] * std

return cast(«list[list[float]]», mean.tolist()), cov.tolist()
finally:
del forecast_dl
del batch
if self._device == «cuda»:
torch.cuda.empty_cache()

def _log_net_stats(self, net: wave_net.Net, epochs: float, steps_per_epoch: int) -> None:
self._lgr.info(«Epochs: %.2f, Train size: %s», epochs, steps_per_epoch)
modules = sum(1 for _ in net.modules())
model_params = sum(tensor.numel() for tensor in net.parameters())
self._lgr.info(«Layers: %d, Parameters: %d», modules, model_params)

def _prepare_net(self, cfg: Cfg, emb_size: list[int], emb_seq_size: list[int]) -> wave_net.Net:
net = wave_net.Net(
cfg=cfg.net,
history_days=cfg.batch.history_days,
num_feat_count=cfg.batch.num_feat_count,
emb_size=emb_size,
emb_seq_size=emb_seq_size,
).to(self._device)
return net

 

Если проблемы сохраняются

  • Поделитесь логами профилирования памяти (tracemalloc или torch.cuda.memory_allocated).
  • Укажите, возникает ли утечка при конкретном методе (_train, _test, _forecast).
  • Предоставьте реализацию data_loaders или wave_net.Net, если они могут быть источником проблемы.

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

avatar
Неолиберальный тоталитаризм, примерно такую фигню мне и писали с разными вариациями — только это не работает:) Причем тут видно, что он совсем чушь пишет — решает проблему для другого (CUDA) бекенда
avatar
Михаил, ваш проект нужно открывать в Cursore чтобы скормить весь проект полностью. К сожалению у меня такой возможности нет. Но вы можете попробовать сделать это самостоятельно. www.cursor.com/
avatar
Неолиберальный тоталитаризм, ну откройте и решите, если это так просто. Блок если проблемы сохраняются бесполезен — так как вопрос про MPS, а не CUDA. CUDA у меня просто нет на компьютере, чтобы какую-то инфу про него выводить. В этом весь современный AI

PS: Пробовал я курсор и не только — ничего путно нет, а частенько абсолютно дурацкие предложения, что поменять. Естественно AI немного полезен:
1. Набросать начальную заготовку проекта — типа garaceful shutdown + ручка Ping, вполне может
2. Интеллектуальное автодополнение — работает лучше чем классическое автодополннение кода, но частенько пихает чушь. В целом немного ускоряет процесс
3. Написать небольшой изолированный блок кода с понятной ограниченной функциональностью
4. Написать консольную командочку, которую сам исполняешь раз в пол года и точно не помнишь нужные ключики
5. Поресечить неизвестную тебе тему — понять хотя бы в первом приближении, что вообще есть, позадавать интерактивно вопросы, чтобы потом самому более детально погрузиться
avatar

Напоминает детский стишок из начала нулевых:

«Маленький мальчик нашел Фидонет - 
Больше в сети веб-дизайнеров нет...»

 

 

avatar
посмотрим
20 лет назад в вузы нашего региона максимальная плата за обучение была на юридический и медицинский факультеты. С небольшим отрывом шли экономические специальности.
Сейчас все хотят быть дизайнёрами и информационными безопасниками. А экономические специальности «упали ниже плинтуса» (плата в два раза ниже, чем на дизайн и инфобезопасность).
Пограмисты болтаются где-то по серёдке
avatar
Попросил ваш cursor написать потоковый парсер тиков (csv в gzip) на c++, потому что я его сто лет не использовал. Результат такой себе — файл читается частично, много ошибок, исправление ошибок ломает потоковое чтение, исправление этих ошибок опять ломает количество спаршенных строк. Поначалу прикольно, но отлаживать эти ошибки ужас какой-то, так и не доделал
avatar

Читайте на SMART-LAB:
Фото
📈 Кластеры 2025: изменения в структуре Группы в уходящем году
Продолжаем тему трансформации и рассказываем о кластерах, входящих в Группу Софтлайн $SOFL . В этом году мы окончательно сформировали первые два...
Открыли 4000-й магазин по франшизе «ОКОЛО»
🟩 Он расположился в селе Успенское Ливенского района Орловской области. На площади 105 кв. м представлено более 2000 позиций, которые выбраны с...
Фото
"При низкой ставке наш главный конкурент не депозит, а Iphone" - вышло интервью CEO «Ренессанс жизнь» Олега Киселева изданию Forbes
«При низкой ставке наш главный конкурент не депозит, а Iphone» — вышло интервью CEO «Ренессанс жизнь» Олега Киселева изданию Forbes По данным...

теги блога Himno a la paz

....все тэги



UPDONW
Новый дизайн