Pull to refresh
-1
Karma
0
Rating
  • Followers 5
  • Following 3

Становлюсь ли я лучше?

По-моему, это уже какой-то Скрам Головного Мозга. В норме у человека не должно возникать вопроса о том, стал ли он лучше/хуже. Ему всё должно быть понятно на уровне стандартной саморефлексии… без какой-либо формальной методологии. Так что сам этот вопрос, явным образом адресованный себе, — это уже тревожный звоночек. А тут вообще какая-то жесть. Это уже явно какая-то форма обсессии. Вопрос к самому себе… о себе же… имеет форму навязчивой мысли. Не просто интересно, стал ли ты лучше или хуже, а хочется иметь какие-то количественные показатели… рассчитать, сколько пунктов составил твой прогресс по результатам последнего спринта. Это что-то из той же области, когда люди считают шаги, сделанные по дороге на работу, и всё время пытаются оптимизировать маршрут, чтобы уменьшить количество шагов.

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

Не волнуйтесь. Откажут не с формулировкой "вы нам не подходите из-за возраста", а с формулировкой "вы нам просто не подходите". А возраст в вакансии пишут чисто для информации. Ну, чтобы вы сразу понимали, что вам откажут, если у вас неподходящий возраст. Откажут, конечно, не из-за возраста, а просто так… без объяснения причин.

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

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

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

Во сне. А вы не согласны с тем, что нельзя без обмана отчаянно экономить на всём и одновременно делать вид, что ты стоишь очень дорого?

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

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


Но я ещё раз повторяю: не об этом речь. Представьте, что у вас такая вводная. Нужно решить данную задачу в рамках заданных ограничений. Я не говорю о том, что вам нужно обязательно так делать в жизни. Просто представьте себя на месте того, кто так делает. А такие люди есть. И как раз среди стартаперов их, видимо, большинство. Ну, просто так стартапы устроены объективно. Живых денег мало, поэтому расходы на зарплату требуется минимизировать. А продаться инвестору хочется за дорого, для чего требуется создать о себе ложное впечатление а-ля haute technologie. Понятно, что без какой-то формы обмана тут никак не обойдётся. И люди, которые не приемлют обман в принципе, заниматься стартапами не могут. Но ведь стартапы существуют. Это факт. Значит кто-то этим занимается. Вот и представьте себя на их месте.

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

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

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

Увольняться тоже нельзя. Нужно решить задачу. Представьте, что тот, кому поручено её решить, не уволился, а всё-таки решил её.

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

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


А вы бы как сделали? Вот представьте, что перед вами поставлена такая HR-задача. Нужно взять человека на зарплату 30-40 тыс. в Москве. Указывать зарплату в вакансии вы не можете. Также нельзя указывать то, что в идеале вам вообще требуется студент. Ведь все потенциальные заказчики изучают вашу активность на рынке труда, чтобы лучше себе представлять, какие у вас издержки. Да и при заключении договоров вы сами им рассказываете, что у вас работают самые лучшие специалисты. Все, кто лучше них, уже давно уехали и работают в Майкрософте или в Гугле. Формулируя своё коммерческое предложение, заказчик должен исходить из того, что над его проектом будут работать люди с зарплатой от 150 тыс., их будет много, и работа займёт приличное время. В общем, нельзя указывать зарплату в вакансии. И при этом у вас нет отдела кадров из 10 человек, который мог бы отсеивать тех, кто рассчитывает на хорошую зарплату. Вам нужно сделать так, чтобы они отпадали сами собой. Как вы это сделаете?

Пять причин, чтобы не создавать стартап, а остаться наёмным сотрудником

Это тоже миф. Точнее, правда, но смысл совершенно другой. Когда компания сильно ограничивает возраст сверху, сам по себе возраст никого не волнует. Ограничение по возрасту — это способ ограничить сверху опыт работы. Вакансия с ограничением по возрасту подразумевает, что в действительности компания (часто это как раз стартап) не может себе позволить опытного специалиста. Не может же она открыто заявить о том, что ей требуются специалисты с опытом работы не более 3 лет. Ограничить опыт работы снизу можно. Это выглядит солидно. А вот ограничение на опыт сверху выглядело бы смехотворно. И тут на помощь приходит возраст. Ведь его можно ограничить сверху, и это не будет выглядеть позорно. А опыт ограничится неявно. У человека, которому 25 лет, не может быть 20-летнего опыта работы. А если ещё выкатить в качестве требования наличие законченного высшего образования, то как раз так и получится не более 3-х лет.

Обертываем алгоритмы в итераторы

Мой наезд на автора вызван тем, что он неверно расставил акценты. Сделав генерирующий итератор, он назвал его итератором. Как будто, итераторность — это главное свойство. В то время как в итераторной части нет абсолютно ничего интересного, а вся суть заключается в генераторном аспекте.


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

Обертываем алгоритмы в итераторы

Тогда я немного уточню свою позицию. Чистый итератор — это когда вообще нет генерации. Только итерация по готовым значениям. (I have a pen.) Чистый генератор — это когда никакой итерации нет вообще. Подаём на вход аргумент и получаем на выходе соответствующее ему значение. (I have an apple.) Соединяем их вместе и получаем генерирующий итератор (apple-pen).


И, по-хорошему, для итераторов по шифрованным последовательностям нужно отдельное название — трансформирующий итератор. Ведь, по сути, они трансформируют значения из шифрованной формы в расшифрованную. Формула, которая в них содержится, работает исключительно с формой значений, а не с их содержанием. И такой трансформирующий итератор аналогичным образом состоит из двух частей — чистого трансформатора (pineapple) и чистого итератора (pen).


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

Обертываем алгоритмы в итераторы

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


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


Итератор по шифрованной последовательности я бы отнёс к итераторам. Процесс расшифровки в большей степени относится к обходу, чем к хранению.

Обертываем алгоритмы в итераторы

Ещё как важно. Когда последовательность представлена контейнером, и вы итерируете непосредственно по элементам этой последовательности — это простой итератор. А когда последовательность задана функцией, и вы итерируете по значениям аргумента, генерируя сами элементы на лету — это генерирующий итератор (т.е. генератор).

Обертываем алгоритмы в итераторы

Наконец-то! Удивительно, что потребовалось столько времени, чтобы понять, что на таком фуфле меня не развести. В том, что генераторы генерируют значения, я абсолютно уверен.

Обертываем алгоритмы в итераторы

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

Обертываем алгоритмы в итераторы

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

Идеальный программист. Часть 2

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

Обертываем алгоритмы в итераторы

Ну да, логично. Зная два соседних числа, можно продвигаться назад точно так же, как и вперёд. Об этом я не подумал. Но тогда возникает другой вопрос. Почему чувак из статьи сделал только forward-итератор? Почему не сделал bidirectional? Или хотя бы ещё и reverse отдельно… и функции перехода от forward к reverse и обратно? Ведь если это не генератор, а итератор, то все эти вещи, как бы, тоже не помешают...

Обертываем алгоритмы в итераторы

Сопрограммы — это просто один из способов реализации генераторов. Причём характерный только для питона. В других языках сопрограмм либо до сих пор нет, либо они появились недавно, а ведь генераторы и раньше как-то делали. Более того, лично я считаю, что сопрограммы вообще не являются ничем, кроме синтаксического сахара. Ничего принципиального нового они не привносят. Промежуточное состояние приостановленной функции я без труда могу хранить в отдельной структуре и передавать его в каждый следующий вызов функции. Я имею в виду то, что я могу сделать это непринуждённо… т.е. вообще не напрягаясь. Это не то же самое, что эмулировать таблицу виртуальных методов в Си. Последнее представляет собой определённый геморрой. А вот сопрограммы — "это изи" (как говорит современная молодёжь).


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

Обертываем алгоритмы в итераторы

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


На самом деле, мне, конечно, понятно, из-за чего у вас (и не только) возникает путаница. Описанный автором генератор одновременно является и итератором по неявно существующей последовательности натуральных чисел (номеров чисел Фибоначчи). И только в этой его итераторной части его имеет смысл сравнивать с другим итератором. Та же часть, которая отвечает непосредственно за числа Фибоначчи, безусловно, является генератором. И сравнивать её с чем-либо не имеет смысла. Причём даже сам автор это понимает. В его ограничительном итераторе предыдущие числа равны нулю. Полноценным генератором он не является. Вы не можете получить из него соответствующее число Фибоначчи. Хотя можете двигать его как вперёд, так и назад, меняя тем самым границу диапазона.

Information

Rating
Does not participate
Registered
Activity