Pull to refresh
2
0
Вячеслав @xxxphilinxxx

Веб-разработчик

Send message

Поддерживаю, мы же не медициной занимаемся, их термины не должны нас путать. Но слово "пациент" уж слишком намекает на медицину, лучше что-то более нейтральное. У нас же паттерны и объекты? Возьмем, например, меридиан - начало отчета, а тут это тоже как бы отправная точка в паттерне. Null все так же переведем как "нулевой" - итого предлагаю "нулевой меридиан", хороший запоминающийся термин. Если не нравится меридиан, ну можно взять, например, стакан - в него ж можно объекты складывать. Такой термин даже на финансовых биржах есть для совокупности позиций - похоже на хранилище, как и тут. А null переведем как "пустой" - итого будет "пустой стакан", тоже неплохо.

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

Словы вроде русски, но смысл идею ускользать.

А что сейчас для веб-клипинга используете? Тоже ищу решение получше. Сейчас пробую связку из браузерного плагина для SingleFile, который подсмотрел среди экспортеров в Archivebox, и Obsidian-плагинов HTML Reader и Importer. Действий, конечно, получается больше, чем хотелось бы - "сохранить страницу", "перенести в папку", опционально "конвертнуть html -> md", зато надежно. Еще, если руки дойдут, попробую накрутить хуки на Archivebox и включить его экспорт в синхронизацию; мб даже закидывание на скачивание сделаю через watch папки обсидиана как альтернативу браузерному плагину

Вообще интересная тема, редко с таким сталкиваешься - вот нагуглилась работа, где авторы утверждают, что разработали алгоритм внешней сортировки с O(n log n) по времени, константной RAM-памятью и, похоже, вообще без дополнительного места на диске: надо будет потом попристальнее изучить.

Я тоже засомневался, поэтому полез проверить: можно O(n log n) с константной памятью, просто придется пожертвовать устойчивостью и, возможно, лучшим временем, но, кажется, здесь ни первое не пригодится, ни на втором все равно не выиграть.

Ммм а почему вы игнорируете последнее решение из статьи с двумя указателями? В нем данные предварительно отсортированы по пользователю и странице, поэтому для устранения дубликатов в ответе достаточно при обходе каждого из двух списков пропускать идущие подряд одинаковые записи, а при перекрестном поиске не нужно искать по всему второму файлу, а достаточно просто двигать второй указатель, пока не найдется элемент с userID равным искомому или больше. Сложность получается O(n log n) на предварительную сортировку и всего лишь O(n) на обработку, т.к. каждый из двух списков обходится однократно; итоговая будет O(n log n + n) = O(n log n) при константной памяти.

Какие IO операции? Какие другие машины? Опять что-то выдумываете. Это может быть обход генератора или чтение канала данных в том же процессе, просто другим модулем. Вы сами придумали это ограничение, что список должен быть передан полностью законченным, и теперь пытаетесь всех убедить, что автор сам себя не понял и вообще профнепригоден.
С точки зрения ABI задача вообще не описана, поэтому отвечать на рассуждения о компиляторах и теории типов не стану.
Мне кажется вполне реальной ситуация, когда я реализовал этот механизм, собирающий полный список, а в памяти не помещается даже готовый список-ответ, поэтому пришлось, например, потратиться на вертикальное масштабирование. Затем приходит заказчик этой ерунды и спрашивает, почему так долго и дорого, и нельзя ли по частям, мол, ему так было бы проще. А единственным оправданием будет "вы же сказали список, а я это понял так".

Хочу пару цитат из статьи привести:

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

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

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

Не разделяю опасения.

В Go ввели шаблоны и он потерял одно из своих основных преимуществ: легкую читаемость.

Читаемость можно ухудшить множеством способов. Как вам, например, описание цепочки функций высшего порядка?

func MyfuncA(param1, param2 string) (func (param3 string, param4 func (param5 *interface{}, param6 int64) func () int64) func (param5 *interface{}) int64, error)

Что бы сделать например обобщённую функцию для sqlx нужно описать портянку из параметров шаблонов [...] Но ведь в Go например есть GORM, который без всяких шаблонов делает это.

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

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

Дженерики в go не полные по Тьюрингу, так что творить на них какую-то чудовищую магию, как это возможно, например, в плюсах, попросту не получится. Их введение прошло с очень длительными и обстоятельными обсуждениями, главный мотив в которых был "не переусложнить язык". На мой взгляд, получилось неплохо: все дженерики, которые я писал или видел, были очень простыми и всего лишь способствовали универсальности функций или контейнеров при сохранении типизации, так что область их применения невелика; никакого SFINAE тут нет, к счастью. К тому же, экосистема уже достаточно крупная и устоявшаяся, чтобы появление дженериков не перевернуло все с ног на голову. Собственно, такого и не происходит, хотя дженерикам уже полтора года.

Как же обходились без шаблонов в Go 13 лет?

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

Раз теперь код в Go будет выглядеть как в Rust, то зачем продолжать использовать Go?

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

Интерпретация ответов тоже важна: исследователь все-таки не машина, которая просто проверяет галочки в тесте, на составлении опросника умственная работа не заканчивается. Вопрос "выберите лишний предмет из списка [x, y, z, &]" без критерия объединения имеет смысл, т.к. оставляет подопытному возможность придумать несколько собственных вариантов с разными критериями и таки лучше продемонстрировать способности, хотя некоторым и будет сложнее с таким справиться, нежели с прямолинейным вопросом. Не все так просто.
А конкретно описанный случай выглядит некорректно проведенным, т.к. подопытные явно зафиксировались на формулировке "лишний", а исследователь будто этого не заметил и продолжал настаивать, в итоге из-за этого тест "найди что-то общее ровно для 3 из 4 объектов" был воспринят как вызов "докажи, что лишнего нет и исследователь неправ, найдя применимость всех 4 объектов и связи между ними", с которым подопытные в итоге блестяще справились.

tl;dr «Низкая производительность» — это когда выполняется мало задач. Проблемы - это плохо. Что с этим делать - пока неизвестно, надо искать. Надо сделать так, чтобы было хорошо.

Проблема «Низкая ПИТ» — это, когда делается мало задач в интеллектуальной сфере в заданные сроки имеющимися ресурсами.
Когда делается мало задач, то получаются скудные результаты
Отсюда, проблема «Низкая ПИТ» — это, когда выполняется мало интеллектуальных задач.
сделано маленькое количество работы в интеллектуальной сфере – это значит выполнено мало интеллектуальных задач
Проблема «Низкая ПИТ» имеет негативный (отрицательный) характер
«Низкая ПИТ» вызывает у нас недовольство (дискомфорт).
Мы пока не знаем, что нужно сделать, чтобы преодолеть проблему «Низкая ПИТ».
у нас есть лишь потребность в преодолении этой проблемы
отсутствует понимание, на что воздействовать
Пока мы не знаем, на что воздействовать.
нужно искать причины появления проблемы «Низкой ПИТ»
Надо так настроить её [системы] работу, чтобы все интеллектуальные задачи выполнялись своевременно, ритмично и воспроизводимо.
проблема будет считаться преодолённой, если все интеллектуальные задачи в организации начнут выполняться воспроизводимо

Умножение двух чисел x и y имеет линейную сложность, так как требуется выполнить x умножений

Что, простите? Даже если вы имели в виду "умножение на N = N сложений", то это все равно далеко от реальности, иначе перемножение/деление больших чисел занимало бы вечность. Деление, кстати, более сложная для процессора операция, чем умножение.

У нас есть запись вида x = y % z , которая будет эквивалентна x = x - y * (x / y)

А у вас спина белая переменные перепутались.

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

Так может быть, расскажете, как на практике, а не как у вас в голове на основе мат. модели уровня 5 класса? Ведь задан контекст: браузерный JS, а иначе в этой информации не просто нет смысла, а она еще и вредит, т.к. создает ложные представления.

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

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

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

Ежедневно по тысячам вопросов? Ок, поставим защиту: пусть только какой-то процент охвата будет. Голосуем: помимо прочих, 1млн шахтеров проголосовали, что шахтеры должны получать больше писателей. 1тысяча писателей прогосоловали, что писатели должны получать больше шахтеров. Выплаты писателям, видимо, снизились, часть писателей перешла в шахтеры. Новый цикл: 1млн+500 шахтеров и 500 писателей прогосовали. Ок, поставим защиту: за себя голосовать нельзя. Включаем в цепочку промежуточный узел: скажем, 10тыс поваров, которые сейчас получают больше писателей. 1млн+500 шахтеров проголосовало, что шахтеры должны получать больше поваров. Ок, поставим защиту...

Самое главное: прежде, чем спорить, неплохо бы договориться о терминах: что понимать под "конечной целью" и целью кого: заказчика, потребителя, программиста, мирового сообщества или кого-то еще. Цель - осознать, где и когда остановиться? Дойти до этой точки? А кто принимает решение? Или каким должен быть идеальный продукт в каждом конкретном случае? Разработка плана, как создавать идеальный продукт? Как перейти от зафиксированного продукта к процессу? Каким должен быть идеальный процесс разработки?

Конечная цель программирования - сам текст программы. Это настолько очевидно, что перестаёт восприниматься как конечная цель

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

Сначала по пирамидке: как у вас Business не оказался основанием? Уровень должен быть самодостаточным, т.е. иметь ценность без верхних, иначе это просто цепочка промежуточных этапов. Нельзя ведь начинать писать код, если не сформулированы хоть какие-то требования? Значит, ниже надо положить постановку задачи. Постановка задачи тоже в свою очередь чем-то будет заблокирована: например, бюджетом и подбором персонала, и так далее. А просто написанный, но неиспользуемый код сам по себе не имеет ценности, только потенциал.

Теперь по сути: имхо в вашей пирамидке не хватает настоящего основания: цели создания конкретной программы. Не универсальной цели, а конкретной для отдельно взятого случая. Посмотрим на примерах.

Для первого варианта положим в основу банальную практику. Хочу, скажем, IDE-шку получше изучить, библиотеку или язык. Для такого проекта у меня будет только Write в ваших терминах: мне даже критические ошибки в этом коде необязательно исправлять, это просто черновик. Никаких compile, run, bisuness, test, modify тут не будет. Да, write тут станет ценным уровнем, хотя выше я утверждал обратное, но только из-за специальной цели всего действа.

Возьмем прикладную утилитку личного пользования, а то и одноразовую. Ее уже надо собрать, запустить, но test, modify, business не будет. Возьмем инди-игрушку: тесты могут быть, могут нет, зато появляются производительность и бизнес. Построитель отчетов для внутренннего пользователя компании: тесты обязательны, это важная информация, зато производительность может быть выкинута, как и легкая модификация. Фреймворк: тесты, производительность, читаемость, документация, но может не быть business и легкой модификации. Ключевой сервис компании: тесты, легкая модификация, производительность. Открытое ПО - необходим выстроенный и поддерживаемый процесс коллективного принятия решений и внесения изменений; кстати, тут появляется "процесс" помимо продукта и исходника.

Возьмем любой программный компонент: при наличии доступного уже готового софта выкидываем (!) write, compile, даже run в случае стороннего сервиса. Можно утратить исходники и остаться с бережно отныне хранимым бинарником, который будет годами успешно работать, процеденты такие есть. А то и вовсе все сделают другим способом - механикой, электрикой вместо электроники или еще как-то. Задача решается без написания единой строчки кода, почти что идеал; круче только удалением.

Для специальных случаев добавим всякие интересные условия типа работы в масштабе миллиардов пользователей, в realtime, в жестких ограничениях по CPU/RAM/IO или обязательного использования особенностей конкретного железа, без которых все опять-таки не будет иметь никакого смысла.

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

P.S. есть интересные эксперименты (например, Вселенная-25), косвенно связанные с пирамидой Маслоу, показывающие-таки наличие ее верхней границы.

Ну, фулстек - это все еще разработчик ПО, цельное понятие, и его обязанности мало отличаются от обязанностей более узких специалистов; а вот с аналитикой, контролем качества, менеджментом и т.д. уже скрестить сложнее. Вообще по ТК за совмещение должностей даже без увеличения рабочих часов полагается доплата, если, конечно, должность не прописана как "делать всё и вся" и работник на это согласился.

А теперь воплотим абстракции в реальность, но пойдем не идеальным, а ИМХО более вероятным путем.
Раз инженеры получают право голоса, этот голос должен стать частью процесса, а не хватанием за руку в последний момент, следовательно, у инженера появляются новые обязанности, при этом навыки управленца+PO+архитектора в комплекте не идут. Добавим эффективное самоуправление на уровне команды - уже минимум три роли с тимлидом и получаем требования как минимум на ведущего специалиста. Опционально добавим девопс без системных администраторов, работу линией техподдержки, дежурства, прочие процессуальные события, так что в итоге на работу собственно исходным инженером остается один-два дня в неделю. Добавим плоскую структуру компании, так что эти требования автоматически применяются абсолютно ко всем инженерам. Разумеется, бизнесу очень выгодно, когда в проекте есть люди "и швец, и жнец, и на дуде игрец", да еще и инициативные, но где набрать столько универсальных пассионариев, что делать с остальными и можно ли все еще называть такую позицию просто инженером?
Ну и пара очевидностей. Первая: если менеджер не интересуется мнением специалистов, допускает тупики, игнорирует смежные проекты, не имеет долгосрочных планов, то это некомпетентный менеджер. Вторая: стиль КД даже в тексте статьи очень часто соседствует со словом "стартап", а в стартапах так-то традиционный уклад с несколькими уровнями менеджеров встречается все же нечасто.

Инфляцию доллара, думается, еще надо учесть. Доллар в рублях стал дороже (курс вырос), при этом еще и его покупательная способность заметно упала: за 4 года набежало около 20%, так что долларов 4-летней давности в пересчете будет всего $1686 / 1.2 = $1405. Отрицательный рост, как нынче говорят.

Information

Rating
Does not participate
Location
Санкт-Петербург и область, Россия
Registered
Activity