Бляди тоже ок, ага. Войти !bnw Сегодня Клубы
Самая охуительнейшая штука в программировании которую мне доводилось для себя открыть - это TDD. Никакие модные языки программирования, продуманные фреймворки, прикольные библиотеки или списки дизайн-паттернов не дали мне столько дополнительной продуктивности и не сэкономили такого количества времени. Эта волшебная палочка лишила меня радости момента, когда ты, окрыленный вдохновением, через несколько часов кодинга внезапно выгораешь, голова начинает гудеть от одной лишь мысли о только что возбуждавшем проекте, а руки уже чешутся выкинуть написанный код на помойку и переписать с чистого листа. Как оказалось этот момент лишь означал, что проект дошел до той стадии, когда переставал помещаться в голове со всеми своими деталями и нюансами и включался внутренний оптимизатор, считавший, что затрачивать кучу сил и ресурсов на дальнейшее усложнение проекта просто невыгодно, лучше давай накуримся, подрочим и позалипаем в мультики. TDD великолепно организует. У меня никогда не хватало усидчивости делать хотя бы банальные todo-списки. Я до сих пор не понимаю как их делать, до какой степени нужно формализовывать задачу и насколько мелкими должны они быть. С тестами все проще - ты пишешь на строгом и ясном кумпутерном языке, нужно лишь описать API методов: что должны принимать, а что отдавать. Покрываешь пограничные случаи, собственно, самое главное: как код должен вести себя в хуевых кейсах. Когда тест написан, написать код его проходящий оказывается неимоверно просто, это можно делать даже с бодуна или на выходе из мексовых звездолетов. Врожденная дисорганизованность и шило в жопе всегда заставляли меня браться за задачу со всех концов. Я просто скакал по табам редактора, пописывая код то тут, то там. В итоге всегда получалась лапша и хуета, потому как все великие идеи рушатся при первом столкновении с реальностью: какими бы охуительными не были компоненты, они должны быть хорошо между собой интегрированны. Великолепный код быстро покрывался костылями и подпорками, в итоге все же начинал работать, но стабильную эрекцию вызывать переставал. TDD заставляет тебя реализовывать компонент за компонентом и переходить к следующей задаче тогда, когда закончена предыдущая и самое главное, даря тебе ощущение, что задача на самом деле закончена. Просто охуеть сколько времени я раньше сливал в унитаз тестирования. Запустить код после мелкой правки и посмотреть что он выдаст - это тестирование. Пишешь вроде бы простую штуку, но уже час дрочишь ее внося постоянно правки, перезапуская ее на тестовых данных и парся глазами выхлоп - это очень быстро утомляет. Пока не начнешь писать тесты не осознаешь, что ты пишешь код лишь в короткие промежутки времени между тестированиями. Сначала напряженно вносишь изменения, вертя в уме структуру проекта - не сломается ли от этого где-нибудь "тама"? Потом, ежась от страха, все же запускаешь и старательно высматриваешь все ли отработало корректно. Тесты снимают головную боль - ебашь что угодно, господь разберется. Где-то что-то отвалилось? Тесты расскажут. И самое главное: у кода, написанного по TDD нет душка. Нет больше желания сразу же все переделать. А даже если неожиданно нагрянет - тратишь минуту на перечитывание тестов и сразу же отпускает. Ну и вообще, тесты это просто красиво.
Рекомендовали: @anarchy @ninesigns @anoos @mugiseyebrows @dulo_t-34
#RE43YT / @krkm / 3320 дней назад

tfw набираешь персонал с использованием tdd

#RE43YT/3OZ / @anonymous / 3320 дней назад

хуита

#RE43YT/NM6 / @hirthwork / 3320 дней назад
@hirthwork В джаваскриптах по-другому никак.
#RE43YT/A5S / @plhk --> #RE43YT/NM6 / 3320 дней назад
слишком тонкая ирония
#RE43YT/XUD / @anonymous / 3320 дней назад
етот ОПУС исполнен в ИРОНИЧНЫХ тонах или нет? Не понятно.
#RE43YT/J12 / @anoos / 3320 дней назад

@anoos > Не понятно.

#RE43YT/KBS / @hirthwork --> #RE43YT/J12 / 3320 дней назад
попробуй статически-типизированые языки, еще больше поможет
#RE43YT/GNX / @anonymous / 3320 дней назад
#RE43YT/2A7 / @anoos --> #RE43YT/KBS / 3320 дней назад
@anonymous прочитал как "сатирически-типизированые языки"
#RE43YT/BS5 / @anonymous --> #RE43YT/GNX / 3320 дней назад
@anonymous Обернул значение в монаду иронии, как теперь достать обратно?
#RE43YT/MVY / @anonymous --> #RE43YT/BS5 / 3320 дней назад
@anonymous не доставай, просто лифтани лямбду знания
#RE43YT/5RO / @anonymous --> #RE43YT/MVY / 3320 дней назад
>TDD >тестирование поссал в лицо кодеробляди
#RE43YT/JVS / @vostrik / 3320 дней назад
Хочу попробовать TDD но каждый раз вспоминаю что мне за это не платят.
#RE43YT/YEU / @windowsadmin / 3320 дней назад

@romme Хочу попробовать секс с женщиной но каждый раз вспоминаю что мне за это не платят.

#RE43YT/TB9 / @hirthwork --> #RE43YT/YEU / 3320 дней назад
@anonymous зачем нужны статически-типизированные языки когда есть is-my-json-valid?
#RE43YT/JXB / @krkm --> #RE43YT/GNX / 3320 дней назад
@romme Тебе за это будут платить когда ты попробуешь, разберешься, добавишь ачивку в резюмеху и сменишь, наконец, рабство на более адекватное.
#RE43YT/39J / @krkm --> #RE43YT/YEU / 3320 дней назад
@krkm Если не шутишь, то это ад и то и другое, только тдд это ад с вентилятором.
#RE43YT/VZ1 / @sanovach --> #RE43YT/JXB / 3318 дней назад
@sanovach хули ад?
#RE43YT/K3S / @krkm --> #RE43YT/VZ1 / 3318 дней назад

@anonymous костыли для языков, где нет программироваемого синтаксиса.

#RE43YT/BNH / @ninesigns --> #RE43YT/GNX / 3318 дней назад
@krkm Что код, которой сам превращается в костыли, что тдд, когда ты занят только формальным костылем, а программированием в свободное время... Тебе уже советовали взять нормальный язык, ты вообще хоть раз пробовал основательно?
#RE43YT/KRX / @sanovach --> #RE43YT/K3S / 3318 дней назад

@sanovach как определить что язык нормальный?
только на нормальном языке можно написать работающий софт?

#RE43YT/9SG / @ninesigns --> #RE43YT/KRX / 3318 дней назад
@sanovach чо за нормальный язык?
#RE43YT/8QH / @krkm --> #RE43YT/KRX / 3318 дней назад
@krkm В разрезе тдд любой нормальный язык - это язык который уменьшает количество необходимых тестов при сохранении того же качества кода. Я мог (неправильно?) понять что ты пишешь на динамически типизируемом, и следовательно исходя из этого любой статически типизируемый язык принесёт тебе немедленное облегчение. Если ты уже его используешь, тогда, конечно, моё предложение неприменимо.
#RE43YT/J44 / @sanovach --> #RE43YT/8QH / 3318 дней назад
@sanovach я крудошлепаю и верчу фронтенды. какой язык настолько нормальный, чтобы я выкинул is-my-json-valid, но при этом я мог бы писать так же быстро как на жс?
#RE43YT/TAI / @krkm --> #RE43YT/J44 / 3318 дней назад

@krkm кожурскрипт

#RE43YT/MF5 / @ninesigns --> #RE43YT/TAI / 3318 дней назад
@ninesigns чото я не видел чтобы на нем кто-то писал, только пиздеж вокруг. очередное мертворожденное говно типа хацкеля походу
#RE43YT/V7C / @krkm --> #RE43YT/MF5 / 3318 дней назад
@krkm Писать быстро на жс это шо?. По клавишам быстро, или 5 проектов в неделю, или написал и тут же зарефрешил? Далее, писать фронтенды понятие широкое, люди и на пхп пишут фронтенды. А кто-то говорит что писать фронтенды это токмо на языках, выполняющихся в бровзере. Поэтому не стесняйся как девочка, расскажи что именно ты пишешь: какая текущая технология у тебя, какой динамичности вебморда (про неё же речь?), каковы объёмы работ, и какова твоя скорость (количество строк? Строк чего? А строк тестов?). Крудошлепать - это писать формочки, инсертить в базку, показывать оттудова таблички и чекбоксиками выбирать строчки для удаления, а кликом для редактирования? Ведь гмыло тоже апп, и тоже в какой-то мере крудошлепанье. Пишу это не столько чтобы потыкать тебе статической типизацией в лицо, столько чтобы узнать, какие жизненные обстоятельства толкают людей на тдд. А также, вдруг я что-то значительное прозевал в жизни, нынче столько интересного вокруг.
#RE43YT/TQQ / @sanovach --> #RE43YT/TAI / 3318 дней назад
@krkm А зачем тебе is-my-json-valid? Что ты им проверяешь?
#RE43YT/WEZ / @sanovach --> #RE43YT/TAI / 3318 дней назад
@sanovach Пока тебя не отправили съебаться, палю - is-my-json-valid значит js
#RE43YT/5UL / @anarchy --> #RE43YT/WEZ / 3318 дней назад
@anarchy Я уже посмотрел, потому и спросил.
#RE43YT/DP5 / @sanovach --> #RE43YT/5UL / 3318 дней назад
Не понимаю, зачем афтору is-my-json-valid? Если он формирует json для общения между бровзером и своим собственным бакендом, и использует тдд для проверки "правильно ли он сформировал запрос или ответ", или, что еще хуже, в рантайме - то это полное баловство, и абсолютно дурная работа. Если он формирует json для запроса на левый бакенд (хотя как, Карл? xss ограничения не совсем отменили) и хочет его проверить, то, в основном, тоже напрасно страдает, хотя и не настолько. С этой целью спрашивал. В принципе, конечно, не только с этой.
#RE43YT/IJS / @sanovach / 3318 дней назад
@sanovach Быстро - это чтобы я мог как на жс за вечер на спидовых отходах накрудошлепать себе REST-сервер мессенджера с вебсокетами. Фронтенд - это, очевидно, SPA. Остальное хуета из нулевых, а не фронтенд.
#RE43YT/BU1 / @krkm --> #RE43YT/TQQ / 3317 дней назад
@sanovach Валидность хуеты, приходящей мне в жсоне. Чтобы парсер напарсил все правильно. Или что с фронтенда пришли нужные данные. Что там нет лишних полей (фетиш), что заполнены нужные поля, что поля нужного формата, регулярочки тама, все такое. В прошлом рабстве жсон-схемами еще умудрялся и пермишены разруливать просто доставая нужную схемку под роль запрашивающего.
#RE43YT/UX1 / @krkm --> #RE43YT/WEZ / 3317 дней назад
@sanovach > полное баловство, и абсолютно дурная работа. хули? > хотя как, Карл? xss ограничения не совсем отменили man CORS. https://meow.bnw.im по-твоему как работает?
#RE43YT/9EU / @krkm --> #RE43YT/IJS / 3317 дней назад
@krkm prismatic пишут на нём
#RE43YT/WA0 / @anonymous --> #RE43YT/V7C / 3317 дней назад
@ninesigns сорь // казалось бы при чём тут синтаксис
#RE43YT/88Y / @anonymous --> #RE43YT/BNH / 3317 дней назад
@krkm потому что тестируешь не логику, а обёрнутые данные
#RE43YT/L1L / @anonymous --> #RE43YT/9EU / 3317 дней назад

@anonymous ну так вся писека статикопетухов в том, чтобы программка имела well-typed свойство и часть ошибок отбрасывалась. с программируемым синтаксисом ты сможешь сделать то же самое (и даже больше, так как системка типов енфорсит свою (и часто непрограммируемую (не как в shen/qi))) модель.

#RE43YT/4QV / @ninesigns --> #RE43YT/88Y / 3317 дней назад
@ninesigns >программироваемого синтаксиса. возможно, вы имели ввиду: "мондады".
#RE43YT/RQB / @anonymous --> #RE43YT/BNH / 3317 дней назад
@krkm Если ты пишешь сам и бакенд и фронтенд (я полагаю у тебя этот случай), то зачем ты используешь json? Совсем недавно я задал себе этот вопрос, после того, как понял, что json в моем статически типизированном мире это унылое нетипизированное гуано, где мне приходится постоянно проверять, не потерял ли я чего, не гомно ли сформировал, и которое невозможно рефакторить (т.е., например, легко вынести группу полей в отдельный объект с целью реюзания). Я провел исследования, и понял, что то со времен CORBA ситуация стала более sane, и как раз то что мне надо - это Protocol Buffers, есть генераторы и для жабы и для жабоскрипта и пхп навеное тоже 8). Вопрос решился просто в ноль. Я теперь не думаю про json, и никаких валидаторов мне вообще не надо, кроме обычной логики с optional полями. Вот почему я спросил. Далее, чтобы наклепать совершенно простой чат сервер с вебсокетом, для сервер-сайда, мы понимаем, что нужен, на вскидку, jetty, в котором прикручена точка входа для websocket (5-6 функций входа: onreceive, onclose, onopen, итд), точка входа для http запросов if any (1 ф-я), и инициализация: это 5-6 строк создания/настройки хендлеров и start() для запуска всего аэроплана. Все строки кроме этих - это работа собственно с данными в виде готовых объектов + 1 send в сокеты клиентов (в цикле потому что). На клиенте single-page application достигается с помощью GWT, где клиентская сетевая часть чуть меньше серверной (все те же 5 точек входа для сокета, и вызов с коллбеком для аякса (если надо)), отсутствует всякая валидация json, есть только MyCoolMessage msg = MyCoolMessage.fromBytes(recvPacket.getBytes()). Собсвтенно же гуй делается так (имена могут отличаться): bc = new BoxContainer(VERTICAL); bc.add(chatlog = new TextArea(80,25)); bc.add(input = new TextField()); bc.add(sendButton = new Button("Send")) И ноль HTML и ноль CSS, для базовой страницы. Чат сервер делается за 30-45 минут. Валидация делается на гуе, для красивых сообщений об ошибках, и в базе (number format? шо еще регекспом валидировать? html? ;)), а на бакенде если шо летит generic exception (internal error), потому что нехер человеку посередине ломать протоколы которые не он писал. Что теряет программист при переходе с json на protobuffers или приобретает, меняя наоборот наоборот? Что теряет программист при переходе с javascript на java или приобретает меняя наоборот? Кроме привычек, конечно.
#RE43YT/C2D / @sanovach --> #RE43YT/UX1 / 3316 дней назад
@sanovach У меня может быть несколько жсон-схем как для входных данных, так и для выходных. В прошлом стартапе пермишены у групп юзеров вообще чисто схемами решались - охуительно. > 5-6 функций входа: onreceive, onclose, onopen, итд Слишком лоулвл, socket.io намного удобнее, искоробки миддлвари, неймспейсы и комнаты. Может ты еще и логику реконнектов руками пишешь и полифилы руками подгружаешь в древних браузерах? > потому что нехер человеку посередине ломать протоколы которые не он писал. То есть сам себе REST API, неюзабельно для третьих лиц. Мне такое не подходит. API должно объяснять почему запрос мудацкий. > И ноль HTML и ноль CSS, для базовой страницы. Ну сорь, я хочу не мордочки для крудов, а приятные интерфейсы. Чтобы бесконечная лента истории сообщений, которая бы рендерила только видимый кусок сообщений и подгружала остальные при необходимости. То есть инструмент мне тут должен помогать пердолиться в HTML, CSS, DOM API и ни в коем случае не скрывать от меня его (уже насосался пытаясь в ангуляре делать модненько и хитровыебано). И я не понял где тут мне не нужно писать тесты. Добавив какой-то эндпоинт в апи или внеся изменения в него, ты все равно берешь браузер или курл, руками делаешь запрос и парсишь глазами выхлоп, убеждаясь что все работает именно так как ты задумывал. Никакая типизация не спасет тебя от ошибок в логике или того, что рефакторя метод ты банально забудешь про какой-нибудь кейс и он перестанет работать. Тесты это решают. Написать 1(один) раз тест на superagent для метода (на самом деле несколько тестов, так как почти везде есть несколько кейсов) быстрее чем открыть соснольку, вбить туда curl с параметрами и распарсить глазами выхлоп. Только в отличии от ручной проверки я получаю реюзабельный инструмент: я один раз написал тесты и потом сколько угодно могу их гонять, избавляя себя от необходимости напрягать голову, составляя параметры для запроса и парся выхлоп. > Что теряет программист при переходе с json на protobuffers или приобретает, меняя наоборот наоборот? Я не вижу какие преимущества я получу после того как затрачу время на этот переход, особенно учитывая, что мое апи станет менее юзабельным для третьих сторон (все умеют в жсон). > Что теряет программист при переходе с javascript на java или приобретает меняя наоборот? Не вижу никаких преимуществ тратить кучу времени на переход на другой язык, другую платформу и другие подводные камни. Тем более, что платформа эта медленно, но верно загинается и однажды я могу оказаться в мире, где у моих скиллов не будет никакой востребованности.
#RE43YT/WE0 / @krkm --> #RE43YT/C2D / 3315 дней назад
@krkm > пермишены у групп юзеров вообще чисто схемами решались Мне кажется, что это архитектурно неправильное решение. Пермишны должны проверятся непосредственно перед чтением-записью данных, в каждом конкретном месте свои. > socket.io намного удобнее, искоробки миддлвари, неймспейсы и комнаты Ты мне сейчас рассказываешь о преимуществах какого-то отдельно-взятого фреймворка в привычном тебе скриптовом языке. Это не аргумент за язык, это аргумент за "я так привык", о чем собственно и весь этот коммент. > инструмент мне тут должен помогать пердолиться в HTML, CSS, DOM API В GWT это всё открыто, там на любом уровне пиши, никто не скрывает, потому что не боится что "юзеры испугаются и не будут использовать". > Написать 1(один) раз тест на superagent для метода (на самом деле несколько тестов, так как почти везде есть несколько кейсов) Вот у меня смешанные чувства, и я не подкалываю. Я не понимаю кое-чего. Если это функциональное тестирование, то я понимаю. А тесты на методы это настолько искуственно, настолько утяжеляет процесс, в моем понимании. Тут либо хипстота компенсирует ими свои родовые скриптовые травмы (потому что тесты суть гарантия покрытия кода, и проранив тесты и не вылетев по undefined или object cannot be cast to integer, ты получаешь какую-то уверенность, что добавил-убавил аргумент в определении и не прозевал где-то в вызове), либо есть какой-то профит, который от меня ускользает. Функциональное тестирование pure methods (в хаскельском значении) - я тоже понимаю, это нормально сравнить требуемый вход с требуемым выходом. Но жабоскрипт, тестировать "новый api entry", карл. Когда я читаю все это mocking, эти затычки, мне так жаль программистов которые этим занимаются. Возможно это сочувствие и мешает мне понять бенефит. > все умеют в жсон Раньше все умели в кобол, а потом в corba, в XML. Открой клиентам, например, protocol buffers, им станет в 100 раз удобнее, никаких нафиг json схем (или альтернативной валидации написанной каждым клиентом с нуля для твоей схемы!!), все на понятном языке (см пример https://developers.google.com/protocol-buffers/docs/javatutorial там синтаксис файлов описания. Согласись, что json scheme читается значительно хуже ). Я видел как люди программируют на друпале. Там "декларативно" делается дофига вещей. На нетипизированном языке, карл! Декларативность суть DSL. Json Schema это также DSL. Но DSL на низкоуровневом языке хорошо бы енфорсить хоть как-то, хоть тайп чекером, иначе это получается вилами по воде. > медленно, но верно загинается и однажды я могу оказаться в мире, где у моих скиллов не будет никакой востребованности Я уверен, ты не доживешь, образно говоря 8). А ты уверен, что доживешь. Так что уперлись в вопрос веры. Summing up: мой коммент начался с недоумения про is-my-json-valid, потому что он не нужен, и указывает на неоптимальный формат данных (json). Потом мы коснулись статически типизируемых языков вообще, и плавно перешли к тдд (с которого ты начал /0), и по поводу которого у меня предубеждение (не путать с функциональным тестированием), Если про стат.тип. языки у тебя привычка+вера, то фиг с тобой: рожденного скриптером не сделать жабером, но про тдд пришли _пожалуйста_ мне немного пасты кода с реальными примерами, от которых ты приходишь в восторг (и от которых не очень, но тоже пишешь), потому что если ты пришлешь что-то, что makes sence, то обретешь заслугу в этой жизни 8), а если пришлешь хипстерское ненужно, то я, честно, и критиковать не буду, т.к. уже всё сказал.
#RE43YT/KKW / @sanovach --> #RE43YT/WE0 / 3312 дней назад
@krkm Погуглил CORS. Спасибо, я пропустил, что это уже стало стандартом с какого-то момента.
#RE43YT/MLR / @sanovach --> #RE43YT/9EU / 3312 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.