Атлант расправил плечи
С радостью дочитываю «Атлант расправил плечи».
Это очень хорошая книга, написанная в Америке лет 50 назад (1957) русской эмигранткой еврейского происхождения.
«Несколько» затянутая, «...является одним из самых длинных романов, написанных на европейских языках», — говорит нам Википедия. «Я научила женщин говорить, но как теперь их замолчать заставить?», — как раз про это.
Роман приятно сочетает в себе русскую классическую многословность и американскую привычку долбить читателя повторяющимися примерами в качестве «аргументов» (характерную для не художественной литературы больше всего): если мы 10 раз повторим одно и то же в разных выражениях и рассказав историю 10 разных людей, значит, это универсальное правило!
Книга рассказывает о том, как борется честный Предприниматель против государственного блата. Описывается, разумеется, Россия, под видом «альтернативной» Америки, в которой к власти пришли «социалисты» и устроили, натурально, рейдерские захваты.
Роман в последнее время стал популярен у нас, и очевидно, почему: он наглядно показывает, что за 50 лет в сраной Рашке не изменилось нихуя. Тогда был «совок» и правящие партийцы, которые прикрывались нуждой народа, сейчас — совок и правящие менты, которые уже ничем не прикрываются.
Как призыв «надо ехать», «Атлант» — самое то.
Книга написана такими резкими мазками, что о них можно порезаться. Кругом — как минимум титаны и богоборцы, ницшеане и прометеи.
Как и вся фантастика духа, книга «заряжает» и «не оставляет равнодушным». Ну, если где-то есть такие Атланты (пусть даже просто у автора в голове), значит, и я могу!
Все в книге хорошо и правильно, кроме одного маленького изъяна: по совершенно непонятной для меня причине книга борется за звание «философской», а позиция героев — за право называться «философией разумного эгоизма», новой, никому до этого не известной и великой.
Это не так.
Ничего нового автор нам не сказала, в качестве идеала описывается банальный анархо-капитализм, причем с анархической половиной я готов мириться, ибо сам анархист (скорее всего с социалистическим уклоном), но капиталистическая часть описана на наивном уровне «Америка — страна равных возможностей».
Тут всё в куче: и протестантская мораль, и культ золотого тельца, и даже «только в Америке могло родиться замечательное выражение „делать деньги“» — это почти дословно, и «благо конкуренции», и «свободный рынок», и все-все-все.
При этом капитализм такой дикий, что нарушает один из принципов анархизма — взаимопомощь, заменяя его «конкуренцией», от которой якобы только одна польза.
Понятно, что за 50 лет это даже не «устарело», а, скорее, «показало истинное лицо».
В романе описаны Великие Промышленники, но «делать деньги» теперь можно, не производя вообще ничего, кроме дополнительных денег. Конкуренция за пользователя оказалась дешевле, чем конкуренция за качество. Конкуренция вообще приводит к перерасходу ресурсов и перепроизводству благ. Ну и так далее.
Получился такой детско-идеальный мир, в котором Промышленники стараются быть лучше — например, главный герой изобретает чудо-металл — а общество понимает это своим «разумом» и награждает их деньгами.
«Мораль» при этом как-то особо не нужна, «разума» достаточно.
В современном же мире «разум» оказался довольно хитрой штукой: например, владельцам железной дороги выгодно, чтобы пассажиры пользовались ей регулярно и часто, предпочитая ее. Выход простой: надо снижать цены (опять-таки, в великой конкурентной борьбе), повышать качество, использовать нанотехнологии.
Выигрывают все, особенно пользователи.
С другой стороны, какой-нибудь фармацевтической компании выгодно — ну, не знаю, давайте проведем аналогию — чтобы пользовались ее продуктами регулярно и часто, предпочитая их. То есть — чтобы люди постоянно болели и постоянно лечились. Ну, с точки зрения банального разума.
В современном мире корпорации — это новые государства, как по уровню влияния, так и по уровню паразитизма и принуждения.
Это все мелочи, ода «правильному» капитализму, созданная в 1957 году, вполне имеет право на существование, особенно как исторически-художественная книга. Тем более, что термин «анархо-капиталлизм» как раз в 60-ых и появился. Но никто же не будет читать экономистов, а тетеньку, которая описала это в красочной форме — вполне.
Роман написан «титанами для титанов», и каждый легко сможет поставить себя на место главных героев, потому что каждый — лучше среднего.
Если все-таки задуматься, что не все могут быть титанами, и задать себе вопрос — какова роль «маленького человека», то легко можно понять, что автор уготовила ему традиционную роль разумного винтика.
А это уже по-настоящему смешно, потому что именно в этом месте разбиваются все утопии.
Хорошей DB должно быть монго
Много-много лет назад, великий гений, коим я, несомненно, являюсь, осознавал неуместность использования реляционных баз данных в веб-программировании и регулярно травил пхп-программистов, которые любили писать, например, логи в базы.
И действительно, даже при разработке «типа CMS» для того, чтобы по адресу /about выводился какой-нибудь текст, в 99% случаев достаточно сделать файл about.txt и пихать все туда, если надо запихать больше одного значения («текст и заголовок») — то serialize и вперед (нет, не xml и прочее гавно).
Да и вообще, CMS никому не нужны.
У меня был движок блога, «написанный на файлах» и была даже специальная кнопочка, на которой значилось «no sql». У Болка движок блога, кстати, до сих пор на файлах работает, а ведь уже 21 век на дворе.
С тех пор прошло много времени, остальное отсталое человечество дозрело и движение nosql действительно завелось и стало трендом, похуже mysql.
Я же совершенно случайно и безотносительно ко всяким трендам попробовал mongodb и полюбил.
Пользоваться mongodb надо не из-за производительности, масштабируемости, nosql (забудьте все, что я говорил выше), а только хотя бы потому, что после ее использования внутри остается теплое приятное чувство, что Сделал Всё Правильно.
В mongo можно пихать «документы», при этом документ — это массив. Поднимите руки, что любит массивы так же, как люблю их я? Ага, молодцы, возьмите с полки пирожки.
Что самое смешное — на предыдущем проекте я написал простенькую «оболочку» для mysql, которая позволяет работать с «документом», как с «массивом» (ну, чисто формально оно и сейчас позволяет, после запроса возвращается же массив? А теперь попробуйте изменить в нем одно значение и запихать его обратно, ага).
Документы не обязаны иметь строгую структуру, это называется «schema-less». Не, ну я любил заниматься анальными извращениями и решать, где для столбика в mysql хватит tinyint, а где и вовсе bit(4), но всему есть предел, к тому же после второго раза это уже не так интересно.
Тем те менее, несмотря на то, что нет «обязательных» полей, строить по ним индексы мы все равно можем. А потом искать по ним (впрочем, искать можно и вовсе без индексов, причем иногда более оптимально, чем с ними — когда требуется перебор всей таблицы, например).
Таким образом, «коллекция» в mongo представляет собой просто набор массивов, куда можно свободно писать, свободно модифицировать и свободно делать любые выборки по любому количеству полей, не хуже, чем в mysql.
Кстати, запросы для выборок — тоже массивы. Очень удобно генерировать их автоматически, не надо подставлять «SELECT .... FROM» в нужных местах, просто создал массив — и вперед. То есть, если документ-массив целиком же кинуть в выборку в качестве запроса, то он найдет и вернет самого себя (что логично), если часть документа, напимер, массив user => acerbial, то оно вернет все документы, где user => acerbial.
«Но без join-ов».
В этом — прелесть номер два. Так как пихать можно любые массивы (это называется «Document Store»), половина join-ов отпадает естественным образом.
Например, заметка и комментарии к ней — это один документ, а не 1+N запись в базе данных (где N — количество комментариев).
Учитывая, что максимальный размер документа — 4 мегабайта, и ты не обязан работать с ним целиком, не только нет причин не хранить комментарии отдельно, но это является единственным логичным и правильным способом.
Сразу решается «проблема» удаления текста и удаления комментариев к нему.
Очень просто решаются задачи, типа «закладки пользователя» — они принадлежат, натурально, пользователю.
Ну давайте уже признаем, что в вебе хранятся и выводятся документы — сразу станет легче жить.
Многие мелочи заботливо сделаны «для веба», да и просто — заботливо сделаны. У каждого документа есть автоматически создаваемый уникальный id («аналог» int autoincrement в mysql), о котором не надо заботиться — он просто есть и работает. Более того, когда ты запишешь новый документ в коллекцию, mongo вернет этот id сам, mysql же придется об этом просить отдельно.
Есть capped collection — коллекция, которая обрезает себя сама («хранить 100 последних документов»), идеально для ведения логоподобной ерунды. Есть upsert — «если документ не существует, то создать», это позволяет писать один и тот же код для создания и редактирования. (Что тоже меня всегда бесило в MYSQL — там update и insert это две разные команды).
Можно не только указать, какие поля возвращать («как в mysql»), но и обратное — указать, какие не возвращать.
В результате всех этих мелочей код у меня выходит раза в два меньше (и раза в два медленней, смакую удовольствие) и пока что нет никакой необходимости создавать обертки вокруг mongodb, все стандартные классы делают ровно то, что нужно.
Инъекций, как легко догадаться, тоже не существует в принципе, как можно сделать инъекцию в массив?
Mongo просто очень приятный и покрывает все потребности «домашних веб-движков блогов» лучше, чем это делает mysql.
Скорее всего, он более подходит и для «серьезных, масштабируемых проектов», но в эти дебри мне углубляться не хочется, потому что там все сводится к аргументу «99.99% стартапов никогда не умрут от излишней посещаемости, поэтому не выебывайтесь, и делайте на mysql+php».
Проблема в том, что на mysql просто физически неприятно после того, как попробовал mongo.
Главный минус — Монго пока что мало где стоит, и уж явно не стоит на хостингах за 5 баксов.
Собственно, поэтому и я агитирую — ставьте, пробуйте, требуйте в магазинах города. Так победим.
Остальные «минусы» Монго вытекают из плюсов — ну, знаете, как с девушками: «страшная, но ебливая», и являются не минусами, а «архитектурными решениями».
Например, по умолчанию Монго пишет на диск когда захочет (Mongo writes when it pleases, ага). За счет этого достигается феноменальная скорость работы (проще просто сказать «ага, записал» на очередной запрос, а записать как-нибудь потом) и феноменальное умение проебывать данные за последнюю минуту и портить всю базу, если отрубилось питание (поправимо с помощью --repair, но осадочек остается).
С одной стороны, это все поправимо, никто не запрещает делать запросы с опцией принудительной записи, с другой — в этом и прелесть, за супермегапроизводительность надо чем-то платить.
(Рекомендуемая книга — MongoDB: The Definitive Guide, хотя для начала мануала на сайте хватает «за глаза»).
Civ5.resources
Меня тут просили разобрать Civ5 «по ресурсам», но конкретно с ней надо делать по-другому, повторюсь: нарисовать табличку по каждой фиче, вида «было — стало — почему».
Мне «Цивилизация» никогда не нравилась с точки зрения ресурсов (потому что там одновременно все примитивно и запутанно), как место для исследований (exploration) и как игра-медитация — да, нравилось.
С ресурсами же все просто: есть время и пространство, как два архетипических ресурса, вместе они образуют вселенную.
Ходы — это время, все остальные ресурсы легко пересчитываются на ходы, их прирост — это функция от времени. Пространство — это механики, начиная с «инвентарного тетриса» в городах, где тебе надо выбрать оптимальные клетки с ресурсами и заканчивая картой.
(«Инвентарным тетрисом» я называю механику, подобную инвентарю в LoL, где у тебя всего 6 клеток и в них надо уместить оптимальные предметы. На больших инвентарях механика не работает, а все остальные инвентарные механики (типа веса предметов) ужасные и поэтому ненужны).
В Civ5 всего-то стали лучше использовать ресурс «пространство» на карте, сделав юнитам объем и непроходимость.
Остальные базовые ресурсы (технология, производство, деньги, культура) являются производным от времени, конкурируют друг с другом (ты увеличиваешь производство, но у уменьшаешь технологию) и обеспечивают разные способы победы. Есть еще второстепенные ресурсы, которые ограничены пространством карты и которые хорошо бы иметь (это, собственно, то, что называется «ресурсами» в самой игре типа лошадей или нефти).
Проблема была в том, что в ресурсы (было) напихано много ограничителей, которые пользователь обязан все знать и помнить, чтобы эффективно играть.
Ну, например, деньги.
Они ограничивали размеры империи и ее эффективность через налоги на содержание (войск), и если ты играл «неправильно», деньги уходили в минус. Это первая механика, не самая приятная и понятная.
Вторая механика — это возможность за деньги купить время (то есть поторопить производство), которая появлялась неизвестно когда (что было огромным минусом) и не имела никакого отношения к предыдущей механике.
В Civ5 из денег сделали более «правильный» ресурс: то есть, натурально, деньги.
Механику трат сделали официальной, и теперь торопить производство можно с первых ходов, подняли общий уровень количества денег. Если предполагается, что деньги теперь тратятся на покупку часто, то их и должно быть больше. Так как их больше, в случае неэффективной игры они не уходят в минус, как раньше, а просто покупки делаются реже. Точка равновесия денег не находится больше на нуле. Если вы играете эффективно, то у вам дают +1000 денег в ход, если не эффективно — то «всего» +500.
Деньги всегда прибывают. Это и понятней, и приятней психологически.
Ну и вообще, ограничивать игрока надо по-другому: например, войска можно ограничивать просто тем фактом, что они они теперь имеют объем, а не брать за содержание одного солдатика 1 монетку.
Первое великое достижение Civ5: они определились с главными ресурсами и сделали красивую панель наверху:
Теперь игроку понятно, что в игре есть 5 главных ресурсов и можно одним взглядом оценить эффективность их добычи. Разобрать эти ресурсы вы можете теперь сами. Можете же?
Исследования, деньги и культура — это валюты. Механики у них чисто валютные: заработал — потратил.
Механика happines теперь стала глобальной и распространяется на всю империю, что правильно, индивидуально нянчится с каждым городом не нужно. Это даже не ресурс, а, скорее, индикатор.
Эта механика меряет общую эффективность, у нее есть плюс (happines) и минус (unhappines). В эту механику можно складывать все бонусы и штрафы, вплоть до того, что убрать расходы из денег вообще, а штрафовать все «несчастьем».
Механика «Golden Age» как и happines связана с эффективностью, но не меряет ее, а просто поощряет регулярными бонусами, регулярность которых и зависит от эффективности.
Вот и разобрали.
Итого: в Civ5 есть три валюты, измеритель эффективности, время (ходы) и пространство (пространство вокруг городов + правило «один солдат на одной клетке» + ресурсы на карте).
Все остальные мини-ресурсы — производные, участвуют в мини-играх и самодостаточны в них. Ну, например, количество жителей — это функция от времени, прирост его можно увеличить с помощью механики «инвентарный тетрис» в городе, после чего это количество жителей используется все в той же механике «инвентарный тетрис».
При таком подходе в игру можно запихать много других мини-игр — ну, например, какой-нибудь «шпионаж» — без заметного ущерба для «баланса».
Это второе великое достижение Civ5 — осознание того факта, что микроменеджемент должен быть опциональным: мы определяем, что в игре главное, после чего принимаем решение «результат мини-игры не может влиять „на главное“ больше, чем на 5%» и пихаем все в мини-игры.
(Попробуйте сыграть в Civ5 сначала с микроменеджементом городов, а потом без него и сравните).
Ну то есть все «обкажуаливание» Civ5 состоит в том, что там улучшили интерфейс, но сделали недостаточное количество мини-игр для задротов. Когда эти мини-игры добавят в аддонах — все будет хорошо.