Как я собираюсь месяц обучать всех желающих программированию #3

Я рад что так много людей решили, что программирование - это их выбор. Спасибо всем. :)

Прошлые пост вы можете почитать у меня в профиле. А пока вкратце напомню, что я собрался провести 11 лекций по программированию для всех желающих. И этот пост напоминание о том, что сегодня в 20:30 по МСК начнётся трансляция первого занятия!

https://www.youtube.com/watch?v=VwdLlrmV6OQ - Ссылка для тех, кто боится плееров.


Сейчас в плеере будет трансляция, сразу после того, как она закончится, там будет запись.


А ещё, помните, что 11 лекция у меня дома? Так вот, при поддержки ВШБИ образовательной программы подготовки кадров для игровой индустрии "Менеджмент игровых интернет-проектов" (http://game.hsbi.ru/), я смогу её провести в Москве! :)

Как я собираюсь месяц обучать всех желающих программированию #3 Gamedev, Csharp, Программирование, Обучение, Видео

Записаться на эту лекцию можно отдельно так, как аудитория довольно не большая. https://new.vk.com/sakutin_july_2016


Жду всех на сегодняшней лекции! :)

Лига Разработчиков Видеоигр

6.7K постов22.1K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

Я дико извиняюсь, но у меня всего два вопроса:

1. Какой твой уровень знаний программирования в общем, и шарпа в частности?

2. Чему вразумительному можно научиться за 11 лекций? Уж не игроделу ли?.. Не лучше ли было основы программирования преподавать не в контексте Юнити?

раскрыть ветку (82)
2
Автор поста оценил этот комментарий

1. В общем около 5 лет опыта. 3-4 из которых C# проф. разработка в коммерческих проектах.
2. Зависит от обучающегося. Вполне можно понять основы (не только синтаксиса но и программирования в целом). Я и так преподаю основы в отрыве от Unity, но большая часть примеров именно "жизненых" из мира GameDev.

раскрыть ветку (81)
Автор поста оценил этот комментарий

О, здорово, опытный программист. А помоги мне, пожалуйста, решить проблему...

Есть постоянное клиент-серверное TCP соединение, клиент с сервером обмениваются пакетными данными. Все пакеты стандартизированы (имеют четкую структуру, зависящую от его идентификатора), но имеют неопределенную длину - могут содержать (и содержат) массивы структур. Пакеты байтовые, целое число передается 4/8 байтами, строка - по 2 байта на символ и всё в том же духе. Первым в пакете передается его идентификатор, от которого уже и определяется его структура.

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


Как бы ты решил такую проблему (не опираясь на конкретный язык, суть в алгоритме), как бы вычленял пакеты из буфера, либо понимал, что надо дождаться окончания передачи всего пакета?


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

раскрыть ветку (60)
Автор поста оценил этот комментарий

ну так сделай просто выдели 1 - 2 байта контрольными, чтобы они задавали цепочку, к примеру пускай первый байт указывает номер кортежа второй байт будет сигнальным с допустим указанием достигнут ли конец ? остальное можешь отдать на контрольную сумму,

данные складываешь до тех пор пока байт флаг и один индекс пакета, индекс может быть по кругу. Вроде все. Если кто знает еще проще пишите :)

раскрыть ветку (14)
Автор поста оценил этот комментарий

Ну, вопрос был задан не тебе, а учителю, у тебя, верно, свербит ответить :)

Но, раз уж срач закончился, а ТС молчит, отвечу и тебе...


К чему эти сложности с кортежами/токенами/метками/прочимиИзвращениями?

Посылаем ПЕРЕД каждым пакетом фиксированные 2 или 4 байта (в зависимости от максимальной длины пакета) с целым числом - длиной ожидаемого пакета.


Есть в буфере сокета 2 (или 4/8, если решили, что 64кб в качестве максимальной длины пакета для нас мало) байта?

Если есть - читаем их (допустим, там int=256) и сверям, есть ли в буфере сокета нужное количество байт(256).

Если нет - ждем, пока не появятся 256 байт или больше.

Если есть - определяем буфер пакета (опять же байт[256]) и вычитываем в него (в один проход и без медленного перебора) сразу весь пакет (в большинстве ЯП это произойдет нативным memcopy) и вываливаем его в очередь обработки.

Всё.


        while(!isTerminated){
// пока не поступила команда останова - крутим читатель сокета:
while (socket.buffer.available < 2){Thread.sleep(10);} // Пока нет 2 байт - просто спим
int pckLength = 0; // инициализируем переменную длины пакета
socket.buffer.read(pckLength*, 0, 2); // читаем 2 байта с 0 оффесета в переменную длины пакета
while(socket.buffer.available < pckLength){Thread.sleep(10);} // пока в буфере недостаточно байт - спим
byte[] pckBuffer = new byte[pckLength]; // инициализируем буфер пакета
int readed = socket.buffer.read(pckBuffer*, 0, pckLength); // читаем нужную длину в буфер пакета
if (readed == pckLength){

// если количество прочитанных байт совпадает с длиной пакета - всё ок, добавляем в очередь пакетного процессора
networkManager.instance.processPacket(pckBuffer);
} else {
// если прочитали меньше/больше (на всякий случай) - что-то пошло не так и всё пропало
throw new Exception("something wrong");
}
}
раскрыть ветку (13)
Автор поста оценил этот комментарий

Чуть-чуть псевдокода. 15 строк. А все эти пляски с токенами и кортежами - лишнее процессорное время на сравнение и перебор, плюс портянка, в которой поди разберись еще... Keep it simple, ***.

Я не пытаюсь открыть всем глаза, мне просто интересно, повторюсь, с каким багажом ребята учат других. Я вот сколько ни перебирал чужого сетевого кода - везде либо велосипеды, либо готовые решения (и хорошо, если это просто Netty, скажем, а не Photon к юнити).

раскрыть ветку (7)
Автор поста оценил этот комментарий
Комментарий удален. Причина: оскорбление пользователей.
раскрыть ветку (6)
Автор поста оценил этот комментарий

@moderator, этот пятиминутный клоун мне уже поднадоел. Примите меры, пожалуйста.

раскрыть ветку (5)
Автор поста оценил этот комментарий

@moderator, ты за Петрика или за Науку?

Автор поста оценил этот комментарий

Скинь телефонный номер своего босса. Я узнаю, что делает человек без ВО на должности Инженера в госкомпании.

раскрыть ветку (3)
Автор поста оценил этот комментарий

+7(495) 952-9161 Тебе будут рады.

раскрыть ветку (2)
Автор поста оценил этот комментарий

Ахахаха! Я знал что ты оттуда ))) Да... Оттуда тебя не уволят, конечно )))

раскрыть ветку (1)
Автор поста оценил этот комментарий

У меня ничего не свербит, а вот у вас походу :)


Это слишком простой вариант.


Автор тоже не очень. Но он сам поставил над собой гору дерьма.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Про "Бритву Оккама" почитайте. Если не усложнять, она гласит: зачастую самый простой вариант является самым правильным.

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

Его можно оптимизировать еще сильнее.

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


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

Можете кидать какашками, но это моя позиция, устойчивая и годами проверенная.

Автор поста оценил этот комментарий

Поток чтения упал, стек с длиной похерили. Буффер размером несколько террабайт надо дообрабатывать. И что в таком случае, умник?

раскрыть ветку (2)
Автор поста оценил этот комментарий

Это каким же раком надо быть, чтобы допустить падение потока чтения?.. Мои 5000 пакетов в минуту ни разу этого не сделали.

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

Да хоть бы и рубильником, неуч. А буффер может быть и на raid. Ты задал обобщенные условия, а требуешь решения под твой кейс. Так делают школопеты.

1
Автор поста оценил этот комментарий

Боюсь ударить в грязь лицом перед @Semafor1234 по этому предложу ему ответить на этот вопрос.

раскрыть ветку (10)
Автор поста оценил этот комментарий

Господа, не опускайтесь до забулдыг...

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

А вот люди с нужным складом ума уже программируют или изучают программирование сами. Вот ведь парадокс...

1
Автор поста оценил этот комментарий

Ты же гуру местный. Тебе и флаг в руки. Или слился?

раскрыть ветку (8)
1
Автор поста оценил этот комментарий

Гуру не назывался. Сетью у меня занимается Антон (мой любимый сеньёр). В данном вопросе не компетентен, и перед лицом более опытных товарищей (по крайней мере с их слов) с радостью уступлю им дорогу. Но если никто не хочет, могу и я попробовать ответить.

раскрыть ветку (7)
Автор поста оценил этот комментарий

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

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


К слову спросить, а твой любимый сеньор использует готовый  сетевой движок или самописный? Предположу, что если это Unity, то сеть через Photon?

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Много проектов и много подходов. Мы раньше с ним любили Photon, но на одном проекте меня перевели в тех. дира и я дал добро ему на разработку своего ядра. Проект был весьма специфичный и нам это от части нужно было, хоть и раздули слегка сроки из-за этого. Я сейчас иногда использую Unet, но реалтайм сеть давно не делал, по этому обхожусь обычными http запросами без каких-либо надстроек.

Я не совсем понимаю проблему. Если нам нужно читать по пакетно, то мы просто достаём из буфера информацию от идентификатора до идентификатора. Если есть какая-то доп информация в буфере, которая не относится к пакетам, то мы добавляем к верху информацию о его размере. Это близко к задачи сериализации и представление данных, почти везде с чем я работал, это уже было адекватно сделано на должном уровне и я пользовался только интерфейсом.

P.S: Место тех. дир. получил не за навыки, а просто потому, что оказался единственным, кто умеет общаться с инвесторами и не нагнетать обстановку.

раскрыть ветку (2)
Автор поста оценил этот комментарий
от идентификатора до идентификатора

А вся проблема как раз в определении начала следующего идентификатора.


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

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


кто умеет общаться с инвесторами и не нагнетать обстановку.

Судя по тому, как вы отвечаете (точнее потому, что отвечаете) на стёб и троллинг в соседней ветке - это не совсем правда. Вы, простите уж, немного переоцениваете свои силы.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Стресс и ангина берут своё. Извиняюсь за это. :)

ещё комментарии
Автор поста оценил этот комментарий

А почему длину вначале нельзя проставить? А придумать спец метки для синхронизации?

раскрыть ветку (33)
Автор поста оценил этот комментарий

Отличные варианты! А какой из них наиболее оптимален? И почему?

раскрыть ветку (32)
Автор поста оценил этот комментарий

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

раскрыть ветку (29)
Автор поста оценил этот комментарий

А как ты будешь определять эту метку? Побайтовым перемусоливанием всего прочитанного? Сверкой хвоста прочитанного буфера с меткой?

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


Да и, опять же, пакеты приходят одним потоком данных (даже если клиентов у сервера много, таков уж TCP), какой смысл читать их в несколько потоков исполнения?..

раскрыть ветку (28)
Автор поста оценил этот комментарий

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


А в чём проблема с параллельным перебором?

раскрыть ветку (16)
Автор поста оценил этот комментарий
Поток схватил свой кусок кода из буффера и отчалил работать, затем следующий и т.д.

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


А в чём проблема с параллельным перебором?

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

раскрыть ветку (15)
Автор поста оценил этот комментарий
А не лучше ли читать буфер в одном потоке, а исполнять в другом

Ну нет же идеального решения на все случаи жизни. Всякие изъебоны встречаются.


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

А что ты в этом переборе делаешь? Уж не поднимаешь ли соединение с СУБД и делаешь запрос? Или вычисляешь какой-нибудь ряд? Уж распараллеливание само по себе напрашивается. Стримы по-моему через стандартный пул молотят.

раскрыть ветку (14)
Автор поста оценил этот комментарий
Всякие изъебоны встречаются.

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


А что ты в этом переборе делаешь? Уж не поднимаешь ли соединение с СУБД и делаешь запрос? Или вычисляешь какой-нибудь ряд? Уж распараллеливание само по себе напрашивается. Стримы по-моему через стандартный пул молотят.

Да что угодно... В приведенном мной случае парень просто в этой распараллеленке клепал DTO и складывал их в другой лист... Да и коннекты к СУБД - нахрена им поточность, если твоё приложение имеет частые обращение к СУБД и не имеет пула соединений - это уже франкенштейн.

раскрыть ветку (13)
Автор поста оценил этот комментарий

Зачем перемусоливать??? Хвостик глянул и откинул кусок в нужную структуру. Можно впихнуть контрольную сумму (хотя бы на заголовочную часть блока).

раскрыть ветку (10)
Автор поста оценил этот комментарий

А как часто вы этот хвост смотреть будете?

Допустим, метка имеет длину 8 байт.

Как часто придется глядеть этот хвостик, чтобы понять, куда откинуть ненужное, и есть ли вообще ненужное?


Допустим, пакет имеет (для круглого счета) 65536 байт. В текущей итерации цикла чтения в буфере сокета лежит 32768 байт. Вы их прочитали. Дальше что?


Или второй равноценный вариант. В буфере лежит 65536 байт, но первый пакет в очереди буфера сокета имеет длину 256 байт (но программа-то этого не знает!). Что именно необходимо сделать, чтобы вычленить эти 256 байт? Посмотреть хвост у прочитанного буфера в 32768 Б?

раскрыть ветку (9)
Автор поста оценил этот комментарий

Тебе достаточно одного прохода, чтобы откинуть кусок в нужную структуру. Размер буффера перед "откидыванием" можно делать не больше максимально возможного варианта. Не вижу проблем с перекидыванием в этот буффер из буффера сокета. Всё делается в ОДИН проход. Не больше одной операции read на каждый отдельный байт.


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

раскрыть ветку (8)
Автор поста оценил этот комментарий
на каждый отдельный байт

В этом вся соль. Тут ты немного запутался (это нормально для подхода с меткой, справедливости ради)... 1 цикл чтения на один пакет.

Ты начал перебор байт, от начала буфера до нахождения метки (а не глянул кончик, к слову). Ок, ты нашел первый пакет. Скопировал из буфера данные в другой буфер, отдал на исполнение (в лучшем случае, а в худшем еще и сам исполнил, пока буфер сокета всё растёт), откусил голову твоего первого буфера.

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

И так с каждым пакетом, а данные с другого конца провода всё прибывают...


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


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

раскрыть ветку (7)
Автор поста оценил этот комментарий

Смеешься? Это очевидные варианты которые приходят в первые 10 секунд. В чём подвох то?

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

1
Автор поста оценил этот комментарий
А теорию числел, алгоитмы, мл, фп? Или что ТЫ подразумеваешь под программированием?
раскрыть ветку (19)
1
Автор поста оценил этот комментарий

немного сложновато для самого начала, не думаешь?

раскрыть ветку (9)
1
Автор поста оценил этот комментарий

Для начала - алгоритмы. А начинать с говнокода - wrong way.

раскрыть ветку (8)
Автор поста оценил этот комментарий

что ты называешь говнокодом?

раскрыть ветку (7)
1
Автор поста оценил этот комментарий

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


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

раскрыть ветку (6)
1
Автор поста оценил этот комментарий

программирование намного легче, чем медицина, да и ответственности там тоже меньше

раскрыть ветку (5)
1
Автор поста оценил этот комментарий

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


Это в каком ПО меньше ответственности - которые в авто (недавний инцидент с Тесла), Или может в тамографах или в приборе коррекции зрения или самолетах, спутниках?

раскрыть ветку (4)
3
Автор поста оценил этот комментарий

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


Можешь написать мне в ЛС и мы совместными усилиями улучшим мой материал.

раскрыть ветку (3)
4
Автор поста оценил этот комментарий

А чем же оно ограничивается? Заучиванием названием классов и методов? Или пониманием байткода?

Программирование - наука о составлении программ. И ни чего более. Если ты понимаешь суть составления программ - писать можно на чем угодно, даже без основательного знания конкретного языка.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Да ладно))), млм не интересуюсь. Боюсь, тебе ещё учиться и учиться до моего уровня. А геймдев я еще на 3 курсе (8 лет назад) из интереса изгрыз весь.

1
Автор поста оценил этот комментарий

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

Под программирование я подразумеваю комплекс работ производимых человеком, и математика - это один из аспектов. Хороший математик != хороший программист. Твои доводы очень рациональны, но всё же, ограничены первыми курсами технического вуза. Я бы хотел укрепить свои лекции сильными блоками математической базы, но не могу. А также не переживаю по этому поводу, всё-таки лекция хорошая - это не когда в неё нечего добавить. А когда из неё нечего убрать.

раскрыть ветку (8)
1
Автор поста оценил этот комментарий

Мои доводы исключительно в пользу того чтобы не тащить в индустрию code monkeys. Они профанируют профессию - именно из за code monkeys на программистов навешали неприятный стереотип. Они портят рынок - демпингуют цены, зарплаты и отпугивают нормальных инвесторов. В конце концов, они говнокодят, и без профильного образования никогда не смогут произвести нормальный продукт. А называют себя при этом программистами.

раскрыть ветку (7)
2
Автор поста оценил этот комментарий

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

Я уже неоднократно описывал себя на пикабу, описывал отсутствие моего образования как класса, повторяться надоело. Вкратце - я, что называется, "школяр", человек, окончивший только 9 классов школы, но это не мешает мне довольно успешно программировать и разрабатывать электронику, в том числе заниматься и ревью коллег на работе.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Да сколько угодно. Просто тут шайка коучеров хочет поживиться на неокрепших умах.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Как будто это что то плохое

2
Автор поста оценил этот комментарий

Давайте ещё этическую комиссию заведём.  
Вы вообще меня "ёбаным коучем" назвали. Я не думаю, что это хороший способ поднять авторитет программистов в глазах. Как говорится начните с себя. Да и за рынок лучше говорят крупные игроки, которые сами пытаются обучить как можно больше мяса.

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Так если ёбаный коуч и есть. Не считаю чем то не этичным зачмырить подонков, которые портят профессию. Это яндекс ШАД мясо готовит? Или Технострим?

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Реши для начала вопрос сложно ли быть тебе богом.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В принципе, я не в силах тебе помешать, могу только насрать в комментах.. По-твоему это божественно?

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку