Code review

Jun. 8th, 2017 04:27 am
stdray: (Default)
Регулярно читаю в твитттуре, что мол парни, чей код просматривают, неадекватно реагируют на критику. Ну или не только парни, может и девушки, но этот нюанс не раскрыт. И все эти росказни сводятся к тому, что люди типо реально начинают переживать. Дальше идет пояснение, что не надо воспринимать критику своего кода на свой счет. Дескать, ты не тупой мудак, просто код твой - говно. А затем разворачивается не сильно большая, не особо маленька, а такая, прямо в меру, дискуссия, как же правильно ревьюить чужой код. Набегают профессионалы самых разных высот квалификации, высказывают авторитетные мнения, которые начинают интерферировать. Ну это же понятно, что анскилед лелкам в твитторг путь заказан, потому там только ревьюверы сидят, а не ревьювируемые. И какбэ все хорошие ревьюверы хороши одинаково, а вот ревьювируемые мудаки - мудаки по своему.

ревью - это просто праздник какой-то )

REPL LEL

Mar. 15th, 2016 06:04 am
stdray: (Default)



Достаточно занятная тема, которую я обычно избегаю, ибо синдром утёнка, начинал сразу с C в IDE (тогда в borland c++ 3.1). Но вот вчера внезапно выслушал монолог о том, как REPL ускоряет разработку. Знакомо, ведь я тоже радовался так когда-то. А потом всё встает на свои места.

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

Read more... )

Про api

Mar. 10th, 2016 01:17 am
stdray: (Default)



Регулярно всплывает тема запиливания хорошего годного интерфейса к ентим нашим оперденям. И все глубокомысленно отвечают, что вопрос давно решен, и REST API - наше все. А потом все столь же глубокомысленно кивают, мол всё так, всё так. Хотя по факту имеем набор нечетких рекомендаций вида:
- http в качестве транспорта
- json в качестве данных
- url в качестве идентификаторов сущностей
- http verbs в качестве действий.

Это ответ на вопрос? Я считаю, что это лел. Это как в известной песне: "Думайте сами, решайте сами". Если у вас нет обещаний, то и некому их нарушать.

Read more... )
stdray: (pic#896193)
Написал, точнее переписал (процесс продолжается) весь слой загрузки данных из внешних стрёмных источников. Переписал не из чувства прекрасного, а по следующим причинам:
1. целиком и полностью изменилось внутренне представление данных
2. невозможно поддерживать существующий код
3. невозможно анализировать работу существующих процессов загрузки

Я с некоторых пор не любитель писать с нуля, но здесь вынужденно во все тяжкие. И если с первым пунктом все понятно, то про два других подробней. Это про то, почему «написал», а не «переписал». )
stdray: (Default)
Читал пост про книги по дизайну ООП приложений, и внезапно осознал, что прочитал большую часть приведенных книг.

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

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

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

С этим бекграундом я с интересом прочитал статью, которая навязывает некоторый высокоуровневый дизайн в условиях убогого однопроходного компилятора F#. Занятно, что ограничения компилятора ведут к совершенно конкретному дизайну, к которому я приходил, занимаясь разработкой на эфсярпе. Но я никогда не смотрел на это в таком ключе, мол у вас просто и выбора нет. У вас есть единственно верный anemic подход, конпелятор, который иное не переварит и профит.

Понятно, что любому ограничению можно найти оправдвание (например системам типов), как можно и не делить приложение на слои. Мне просто понравилась трактовка убогости конпелятора, как некоторой статической валидации дизайна на высоком уровне.
stdray: (Default)
Во-первых, стала падать какая-то ерунда, мол "хотим разместить рекламу в вашем блоге" или там "заработайте на вашем блоге". Ох уж мне эти блоггеры. У меня днявка полумертвая, но, видимо, как цель для спамера не лишняя.

Во-вторых, что гораздо хуже, кто-то таки додумался купить большую пачку смс-сообщений у оператора, купить пользовательские базы и начать торговать спамом в смс. Ну и понеслась: такси, распродажи, пиццерии, скидки и прочее. А смс не почта, никто пока фильтрацией не заморачивался, по крайней мере в России. А теперь вот спамят. Может бы и прибить этот странный старый протокол обмена сообщениями, чтобы не уходить на второй круг. Так нет, даже компания, выбрасывающая под радостные аплодисменты хипстоты на свалку истории такие бородатые штуки как RJ-45, тащит в тачфон эти самые смс. Как представлю папку "Спам" с смсками... А ничего не сделать. Большая инерция.
stdray: (Default)
Часто слышу от своих знакомых, программирующих на C# и использующих ReSharper, что едва ли не самой полезной возможностью решарпера является проверка стиля кодирования. То есть решарпер проверяет правильность именования переменных, всякие там Pascal Casing для имен типов, Camel Casing для переменных и прочее такое. В этом есть смысл, поскольку многие программисты style guide не читают, а я читал, но почти ничего не помню. И тоже полагаюсь на ReSharper, хоть и регулярно возникают с ним разногласия.

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

[MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Assembly)] \

macro CapitalTypeNames(alertType : string)

NameConventionImpl.CapitalTypeNames(Macros.Manager(), alertType)


А при его вызове, собрать типы, объявленные в сборке, отфильтровать имеющие некорректные названия и вывести информацию указанным образом. Read more... )
stdray: (Default)
В комментариях к энторпрайз БАЙСИКУ proofit404 дал линк на свой пост, где рассказывает, про негативный опыт со средами разработки для Haskell, ну и предлагает выпилить люк, создав хитрющую прослойку между редакторами и конпелятором.

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

При этом "проектировался" означает не только умение принимать / возвращать какие-то данные, но и работать в разных режимах. Потому как шевелиться все это должно достаточно быстро, а если какой-нибудь компилятор Haskell сначала начнет типизировать 100500 файлов проекта, потом займется оптимизацией, позвав на помощь LLVM-бекенд, то ничего хорошего из этого точно не получиться. Выходит, что в режиме IDE ему нужно лишь распарсить и типизировать AST, опуская непосредственную компиляцию, или компилируя без оптимизаций, если редактируемый проект у кого-то в зависимостях и есть потребность в метаинформации сборки (для языков по типу C#). Если язык имеет макроподсистему, то информацию о режиме работы компилятора надо пихать и туда. Также не считаю, что возможно реализовать какой-то stateless протокол обмена между компилятором и IDE, сделав компилятор сервисом или вроде того, поскольку работы у него действительно много. И если при каждом изменение текста гнать ему все файлы проекта для обработки - все будет весьма печально. Потому компилятору нужен стейт, чтобы иметь возможность кешировать результаты своей работы.
Read more... )
stdray: (Default)
Декларативность – стиль оформления устных или письменных текстов, при котором заявленные цели и ценности не соответствуют реальным действиям и реальным возможностям автора этих текстов.

src
stdray: (Default)
Когда читаешь в интернете разные программистские дискуссии, постоянно натыкаешься на некоторые шаблонные суждения. Например,
- когда говорят про high load, ведут речь за хорошую горизонтальную масштабируемость;
- когда говорят про embedded, обсуждают, как станцевать вальс на площадке размером с пятирублевую монету;
- когда говорят про enterprise, имеют в виду либо оскорбление, либо CRUD.

Хотя в последнем случае разница довольно условна. То есть «энторпрайз» - это такие сферические неудобные медленные приложения в вакууме, а круды — это продукт деятельности макак, школьников и индусов. Это значит, например, что индийцы не индуисты круды писать не могут. То есть круды — это что-то плохое и простое.

Хотя, конечно, только от того, что какую-то деятельность заклеймили как простую и бесполезную, проще от этого она точно становится. Чем дальше, тем важнее становится информация. И все, кому не лень (и кому лень тоже) занимаются её накоплением, структурированием и анализом. При этом мой опыт таков, что данные — вещь удивительно не гибкая. Поскольку есть информация сама по себе, а есть ее представление, выбранное для решения конкретной задачи. Эти представления являются первой сложностью. Первой, в том смысле, что все начинается c выбора представления: как данные разделить на маленькие кусочки, как выразить эти кусочки в терминах своего инструментария (модель данных приложения, модель постоянного хранилища), как обеспечить их согласованность и определенную сложность доступа к ним. Хотя по этому поводу написано достаточно много, от нормальных форм реляционной базы данных до паттернов Фаулера, эта задача все же не является тривиальной. Слепое следование рекомендациям ни к чему хорошему не приводит, потому приходится постоянно оценивать свои решения, насколько они кажутся удачными, начиная с момента разработки и заканчивая текущим моментом (если апликуха до него дожила). И тут большую роль играет опыт, поскольку он позволяет учесть значительно больше вариантов использования и сложных граничных случаев.
Read more... )
stdray: (Default)
Ломающие новости! Срочно в номер первой полосой! В Москве выпал снег! И продолжает падать! Москвичи все в снегу! На крышах домов снег тоже!

Сейчас прямое включение нашего корреспондента!
- Борис!
- Да, спасибо! Вот я стою, вот падает снег, вот москвичи, вот снегоуборочная техника, вот машины под снегом! Константин!
- Борис, какие прогнозы?
- Спасибо! Снег пока продолжает падать, вот москвичи идут по снегу, вот снег падает на москвичей...
- Спасибо, Борис! Это было прямое включение нашего корреспондента.


Снег. Ну ахуеть теперь. Время идет, а некоторые вещи все не меняются. Я почему-то раньше думал, что если живешь в Москве, то подобные репортажи не выглядят столь тупо, ан нет - тупо. Ещё как тупо. Летом возвращался домой, откуда уже не помню, а тут дождь внезапный, ну я встал у подъезда ближайшего дома. Дождь сильный и очень косой идет, что планшет не достанешь - долетают капли, а телефон норм. Так и стою читают твиттерок и срачи срачелятора и тут ВНЕЗАПНО звонок от матери, мол как ты там, в новостях передали, что в Москве дождь с ураганом, что москвичи опасаются повторения трагедии Крымска в столице. Ну, конечно, в Москве же дождь, почему бы чему-нибудь не повториться. Ну или те же пожары десятого года, ну как вопили то. "В Москве дым, вот москвич в марлевой повязке, вот еще в марлевой повязке, вот в шлеме стоит москвич" и так далее. А ко мне на прошлой неделе знакомый мой из Хабаровска заезжал чаю попить, так говорит, пожары как горели каждое лето в бытность мою хабаровчанином, так горят. Ну а кому какое дело? Вот и я о том же. Вспоминаю, как где-то на рубеже тысячелетий нас травили шок-контентом в телевизоре: "В Москве холодно! Вот ваш корреспондент! Вот москвичи, вот мороз, вот даже в валенках стоят москвичи, да чего дошло! Вот из-за угла выглядывает ОБМОРОЖЕНИЕ, вот Дед Мороз зубоскалит". Ну такое веселье, в самом деле. Потеха на всю страну. Хотя про страну тоже все понятно. Я же почему пишу такое? Потому что городок Б и все такое, потому что ближайший подмосквич.
stdray: (Default)
[personal profile] xeno_by написал, что макры для скалы почти вот-вот будут готовы. А люди как-то не очень радуются. Я почитал комментарии, мне что-то не понравилось такое обсуждение.


Макросы - это признание поражения. "Наш язык оказался недостаточно хорошо, нам придется генерировать программы на нём, чтобы продолжать притворяться, что мы пишем на нём".

Во-первых, тут явно подразумевается, что кодогенерация является чем-то плохим и доказывает несостоятельность языка, как средства для написания программ. Из моего ежедневного: редактировать форму мне удобней в графическом дизайнере, просматривать схему базы данных и редактировать связи между таблицами опять же удобней в графическом представлении. По-моему, очевидно, что если существуют разные способы выполнить одну работу, то надо выбирать самый удобный. И либо у нас есть серебряная пуля, либо для каждой задачи существует свой самый удобный инструмент. А чтобы это все как-то между собой взаимодействовало о совмещалось, надо приводить к одному знаменателю. Например, к текстовому представлению в виде кода на определенном языке программирования. Этот способ не единственный, но, на мой взгляд, достаточно практичный и удобный.
Read more... )
stdray: (Default)
Я про себя не могу сказать, что разбираюсь, но могу рассказать, что мне нравится. В основном я пью китайские чаи и больше всего в них меня привлекает разнообразие вкусов. При этом, иногда бывает так, что определенный чай ничем не впечатляет и вообще кажется никаким, а потом в нем различаются нотки, которых нет больше нигде и он становится одним из любимых. Потому первое время стоит покупать разный чай. И, если есть какие-то предубеждения вроде нелюбви к зеленому или там черному чаю, то лучше о них забыть. Те же зеленые чаи очень сильно между собой разнятся.

Лунцзин - зеленый чай с бодрым не приедающимся вкусом. Его я пью больше всего, потому считаю, что с ним обязательно стоит познакомится. чай-чай-чай )
stdray: (Default)

Мышь: - Хипстер?! Кто такой?
Акула: НОВЫЙ ПЕРСОНАЖ.


можно не читать )
stdray: (Default)
Вот такую статью подбросили, где рассказывается про отмирание русского языка. Только мне непонятно, как можно было провести подобное исследование.
... заканчивается словообразование на основе родных корней.
Новые термины и понятия являются заимствованными. Понятия, пришедшие извне, вытесняют родные аналоги, из двух синонимов выживает заимствованный.
Как пример ученые Тарту приводят широко распространенный в России «рунглиш».

Как они про термины решили? Они последнее издание словаря с предпоследним сличали? Например, в ентом нашем функциональном программировании есть такая страничка, хотя, казалось бы, зачем? Я думаю, что некоторые составители английским на уровне native владеть могут, да и русский в этой профессии без надобности, но внезапно идет словообразование. Мне коллега говорит, чтоб я не обобщал функциональщиков с ВО на всю страну, но я лишь привожу контрпример, а обобщениями где-то в Тарту промышляют. Про "рунглишь" совсем непонятно, население же не может в английский. Про недавнюю конференцию Яндекса речь что ли? (Сам не видел, но побывавшие осуждают, лол)

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

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

В-третьих, государственные структуры не используют в своей деятельности официальный язык страны. Патриархальная Православная Церковь проводит богослужения на церковнославянском, МВД использует упрощенный служебный диалект, МИД оперирует французским, немецким и английским.

Это вообще ПУШЕЧНЫЙ абзац. Мало того, что ненавязчиво записали РПЦ в гос.структуры (хотя может быть во время исследования #хамстыд уже набирал популярность), так еще и МИД осуждают за владение иностранными языками, хотя казалось бы.


В итоге, 3/10 ентому мониторингу и институту лингвистики в Тарту. Какой-то тухлый наброс, пробивающий границы разумного.
Конечно, встречаются люди вставляющие английские слова в свою речь. Енто комично, когда человек путает профессиональную терминологию и транслитерацию случайных английских слов. Кроме того, позиция "чукча не писатель" нормально воспринимается в большинстве случаев.
А совок был самым читающим государством (был ведь?). Теперь непонятные люди русскому языку "нинужно" засчитывают. То есть в определенный момент что-то сломалось. Интересно, что именно? Как от такого читающего населения СССР произошел этот "ВК, где люди не могут без ошибок имя переписать из паспорта, там Никалаи погоняют Лидей"? Было бы интересно что-то посмотреть на эту тему.
stdray: (Default)
Во-первых, зачем они делают асфальтированные подходы к дорогам в местах где нет перехода? Вот тротуар идет параллельно дороге на некотором расстоянии (до нескольких метров может доходить), между ними газон (иногда даже заборчик есть) и... внезапно пошел поворот прямо к дороге. А оно зачем, если там все равно перейти нельзя? Провокация, я щитаю.

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

В-третьих, разные умные книги как читать? Читаю я по-немногу этот TAPL, там суть описываемых вещей ясна. Никаких проблем. А как начну делать упражнения, так либо времени очень много потрачу, либо вообще сделать не смогу. Ну и о чем это говорит? Дальше-то читать, или сидеть и делать? Если второе, то "книжки читать" - для меня весьма дорогое занятие. И как у других дела обстоят тоже интересно.
stdray: (Default)
Меня преследуют странные мысли о полиморфизме высших порядков (rank-2 и rank-n) и тайпклассах. Мне привиделось, что можназделоть что-то такое на макросах в Nemerle и теперь голова этим забита. То есть какой-то синтаксис, например poly

        def t1 = poly T[_];         // T1 [ T2 ] 
        def t2 = poly T[_  , _];   // T1 [ T2, T3 ] 
        def t3 = poly T[int, _];   // T1 [int, T2] 

по ентой записи делает представление . Примерно как дотнеты хранят как-то информация о generic-параметрах

        WriteLine(typeof(Dictionary.[_,_]));
       //System.Collections.Generic.Dictionary`2[TKey,TValue]
        WriteLine(typeof(Dictionary.[string,int]));
       //System.Collections.Generic.Dictionary`2[System.String,System.Int32]

Так и мне надо изобразить что-то такое. То есть сохранить информацию о типах-параметрах в какую-нибудь свой класс PolyType, а потом применять

        def с1 = t1 apply [List]; // List[T2]
        def r1 = с1 apply [int];  // List[int]

И у apply должен быть тип PolyType -> YobaType, где YobaType - это тип-вариант из PolyType (если у нас все еще слишком неконкретные для дотнета типы) и System.Type (когда тип стал конкретным, надо бы его прямо в код поставить).

И надо сделать такие вот тайпклассы

    typeclass Functor [ poly C[_] ] {
         abstract fmap[a,b](f: a->b, c: C[a]) : C[b];
    }
 

И все это дело будет превращаться в контейнер с квази-циатами. Будут хранится типы-параметры в виде YobaType, будут хранится сигнатуры методов, а также тела методов, если они не объявлены как abstract. И затем можна будет использовать все это дело каким-то макро аттрибутом вроде

    [ instance Functor[List] ]
    module ListF {    }
 

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

И вот пытаюсь сделать что-то такое и до [profile] wizzard0 докопался и до чатика. Пока еще даже не определился, как должны PolyType и YobaType выглядеть. Также мучает вопрос "а не поехал ли я", но тут без разницы, если действительно можназделоть.
stdray: (Default)
Пришло время написать макрос. Макрос сам себя не напишет.

Я тут некоторое время писал кое-какую мелочевку на Nemerle, и, можно сказать, язык пришелся мне по нраву. Очень похоже на F# хотя и своими особенностями. У меня пару раз возникало желание написать макрос, который будет заниматься небольшой кодогенерацией по месту, но, после небольшого размышления, я отказывался от этой затеи. Отчасти из-за неприязни к особым формам и неявному поведению (странно, что при этом я обожаю всяческий синтаксический сахар), отчасти из-за сложности написания самих макросов. Чтобы выяснить, что же меня больше смущает, я решил научиться их писать. В этом посте, я старался систематизировать то, что узнал о синтаксических макросах Nemerle.

макросы такие макросы )

В один пост все не влезает. Остальное можно прочитать вот здесь.
stdray: (Default)
Пришло время написать макрос. Макрос сам себя не напишет.

Я тут некоторое время писал кое-какую мелочевку на Nemerle, и, можно сказать, язык пришелся мне по нраву. Очень похоже на F# хотя и своими особенностями. У меня пару раз возникало желание написать макрос, который будет заниматься небольшой кодогенерацией по месту, но, после небольшого размышления, я отказывался от этой затеи. Отчасти из-за неприязни к особым формам и неявному поведению (странно, что при этом я обожаю всяческий синтаксический сахар), отчасти из-за сложности написания самих макросов. Чтобы выяснить, что же меня больше смущает, я решил научиться их писать. В этом посте, я старался систематизировать то, что узнал о синтаксических макросах Nemerle.
макросы такие макросы )

August 2017

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930 31  

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags