в поисках Силы

Сила — это отчасти магическое понятие, как секс, деньги или религия. Она очень ценится, она очень желанна — и при этом её побаиваются, и о ней трудно говорить. Но Сила присутствует в жизни повсюду, она[…]

Читать дальше …

Твоё оптимальное состояние

Многие десятки лет не прекращаются поиски т.н. оптимального (или высокопродуктивного) состояния, в котором человек чувствует себя очень комфортно и при этом показывает удивительные результаты производительности. Наиболее яркий и самый известный пример тут, наверное — это[…]

Читать дальше …

25 характеристик мастерства

В 2018-м году я решил изменить содержание разделов Фонда. Всё, связанное с программированием, полностью переезжает в раздел Математика. Разделы Технократия и Обучение будут, соответственно, посвящены тематикам саморазвития и выработки сильного системного рационального мышления, которое особо[…]

Читать дальше …

Си: жёсткий разбор

Язык Си отличается богатым набором средств, которые способны сломать программу в самых разных местах и самым неочевидным способом. Это всевозможные побитовые операции и неочевидные реализации некоторых типов (например, процессор не умеет работать с 32-разрядными целыми,[…]

Читать дальше …

Python: жёсткий разбор

В качестве, пожалуй, абсолютной противоположности Haskell-у возьмём Python. Критика в его адрес довольно поверхностна, потому что и порог вхождения в язык небольшой. Когда разработчик с одним годом практики начинает выискивать в нём блох, с точки[…]

Читать дальше …

Haskell: жёсткий разбор

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

Читать дальше …

Безупречное программирование

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

Читать дальше …

Живите, динамические языки!

По большинству статей этого сайта можно решить, что я абсолютный фанат тренда статической типизации ™. Но это не совсем так. Не поймите меня неправильно. Действительно, существует выраженная тенденция использовать по максимуму функциональность, предоставляемую статическими/компилируемыми языкам,[…]

Читать дальше …

Моделируем id Software

Давайте помоделируем хороший пример успешных организационно-разработческих практик легендарной id Software (Wolfenstein, Doom, Quake, …). Их продукты всегда отличались отличным качеством в сочетании с прорывными технологиями. John Romero в этом году подробно рассказал, как его совсем[…]

Читать дальше …

Модель сверхэффективного программиста (4)

предыдущая часть Третья ключевая микра — отладка. Универсальный принцип здесь такой: если вам понадобилось что-то отладить, вы уже на ошибочном пути. Конечно, мы не создаём программы в полной изоляции. Мы взаимодействуем с кодом, написанным другими[…]

Читать дальше …

Модель сверхэффективного программиста (3)

предыдущая часть Вторая обязательная прокаченная микро-стратегия — это мастерство обеспечения быстрого фидбека. На этом построена вся культура agile-движения, а также немало методологий разработки наподобие Test Driven Development или Continuous Integration. Однако все эти мэйнстримовские понятия[…]

Читать дальше …

Модель сверхэффективного программиста (2)

начало Итак, первая «микра» — обучение. Программирование — это процесс непрерывного обучения. Технологии, платформы, языки, проекты, кодовая база, все они постоянно меняются, и соответственно надо всё время быть в курсе новинок (учиться, учиться и учиться[…]

Читать дальше …

Модель сверхэффективного программиста

Когда эйчары хантят программистов, то акцент делают, во-вторых, на некоем минималистичном наборе позитивных личностных качеств, а во-первых, на технологиях. Нужны «знания» конкретных технологий, языков, фреймворков. При этом опыт упоминается совсем кратко (типа, от трёх лет)[…]

Читать дальше …

Рендеринг логики в No Man’s Sky

Игра No Man’s Sky позиционируется как бесконечный процедурно генерируемый универсум, в котором на ленивую генерацию завязана даже каждая, условно говоря, травинка. Реализуется это достаточно очевидным способом: каждая планета представлена 64-битным ключом, который используется для генерации[…]

Читать дальше …

Комбинаторы рефакторинга

первая часть Но можно ли считать перечисленные проблемы действительно «проблемами»? Скорее, это забавные маленькие задачки-вызовы, напрашивающиеся на элегантное решение. И при этом семантический редактор получается, при небольшой практике, куда приятнее для пользователя, а главное, гораздо[…]

Читать дальше …

Семантический редактор

Почему мы в 21-м веке программируем как в эпоху перфокарт? Следующий сценарий знаком наверное большинству программистов: после внесения незначительных правок кода в вашем текстовом редакторе или любимом фреймворке компилятор внезапно выдаёт десятки или даже сотни[…]

Читать дальше …

Главная фишка универсального паттерна

предыдущая серия Завершаем наш сериал по мотивам серии постов Steve Yegge про паттерн прототипов. Он, возможно, выглядит несколько унылым — обычно Стив пишет хардкорные вещи, а тут классический инженерный набор. Однако самая мощная фишка этого[…]

Читать дальше …

Дополнительная механика паттерна свойств

предыдущая серия Сохранение списков свойств Стив предсказуемо рекомендует сохранять наборы свойств в XML или JSON, благо сериализация в эти форматы поддерживается уже давно практически повсеместно, а нативный текстовый формат дополнительно удобен, так как прозрачен для[…]

Читать дальше …

Как разморозить сломанное заклинание

предыдущая серия Наследование В прототипном наследовании при обращении к свойству сперва смотрится наличие этого свойства в «локальном» объекте, и если оно в нем отсутствует, тогда проверяется родительский объект, и так далее выше по цепочке. Если[…]

Читать дальше …

Имплементация паттерна прототипа

предыдущая серия На высшем уровне абстракции имплементация паттерна свойств задается минималистичным API. Это базовый API для любой структуры, которая раскладывает имена/ключи на значения. get(name) put(name, value) has(name) remove(name) В идеале, объекты, поддерживающие такой API (Стив[…]

Читать дальше …