Pull to refresh
53
0.2
Дмитрий @bogolt

User

Send message

При должном уровне мотивации научиться можно всему

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

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

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

Есть еще хороший рецепт. Не читать фейсбук. Не читать ВК. Не читать весь остальной треш тоже.

Разве ?

A xor B = C

C xor B = A

C xor A = B

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

Вообще, в современном мире линукса, X нужен только на Unix / Linux рабочих машинах, ибо не на андройде, не на хромбуках иксы никому не нужны.

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

Чтобы исправить надо написать "ни на андройде, ни на хромбуках"

База не защищает полностью от ошибок с состоянием гонки.

Приведу пример.

Апи1. Поиск объектов. Передаем список желаемых ключей, возвращает подходящие объекты

Апи2. Создание нового объекта.

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

Что оказалось. Запрос на поиск объекта не учитывал один из ключей, то есть фактически запрос был

`select item from items limit 1;`

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

А как же тестировать тогда race-condition и другие проблемы синхронизации разных потоков? Тут нам как раз нужна общая база и единственный инстантс бэкенда. И тогда ужу тестировать так в многопоточном режиме, чтобы эти проблемы вылезали в тестах.

Зато если фронт отошлет на бэк операцию "удалить мой аккаунт" вместо "просмотри мою почту" то цена ошибки фронта оказывается не менее велика.

Да уж, после такого никакие игры уже не нужны. Посмотреть красными глазами на восход солнца и пойти досыпать последние часы перед работой.

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

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

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

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

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

И чем этот скрипт лучше экслея ?

почему читаемость мнимая?

по вашему код

y := make([]int, 0, len(something))

читается также легко как и:

x := []int{}

Потому что для меня например это приведет к тому что я пойду проверять что там за массив something то есть эта строка кода меня пусть немного но отвлечет

Но самое ужасное что что у ноута нет ни одного разъема слева. Ужас просто!!!

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

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

make([]T, 0, n)

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

Зато легко пропустить ошибку в стиле

newarr := make([]int, len(arr), 0) // кто-то перепутал параметры местами

newarr = append(newarr, 1) // теперь у нас в начале неожиданные нули

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

В чем развод? Когда вышла AMD версия для первой модели то появилась возможность заказать себе материнку и поменять внутренности ноута оставив все остальное. Кроме того всегда можно купить запчасти, или новые порты в usb-c. А тут вышла модель 16'' ( до этого были только 13'' ).

Так и представляю ситуацию: "хочу распространить информацию у вас на компьютере. Информация хранится в файле danger.exe чтобы ее правильно распространить обязательно запустите файл. Иначе вы нарушаете мои конституционные права!"

Information

Rating
2,025-th
Registered
Activity