Программирование
Языки, концепции и приёмы на понятном языке
Здесь — статьи о программировании для тех, кто учится: как работают языки и инструменты, что значат базовые понятия и как писать код, который не стыдно показать. Без воды и академизма — с примерами, которые можно запустить.
Git и командная строка для начинающих: как перестать бояться терминала
Git кажется магией из непонятных команд. На деле в повседневной работе их всего несколько.
HTML для начинающих: с чего начать вёрстку сайтов
HTML — самый дружелюбный вход в веб. Первую страницу можно собрать за вечер.
SQL с нуля: с чего начать и как быстро научиться писать запросы
SQL учится быстрее, чем языки программирования, — если браться за темы в правильном порядке.
Как выучить Python с нуля: понятный план для новичка
Без воды: что учить в первую очередь, сколько это занимает и как не бросить на второй неделе.
Как ChatGPT угадывает следующее слово
ChatGPT не «понимает» вопрос и не лезет в базу знаний за ответом. Он делает кое-что куда более странное: снова и снова угадывает, какое слово идёт следующим. Разбираемся, как из этой простой игры рождается то, что кажется разумом — и почему оно иногда так уверенно врёт.
Сделай своего Telegram-бота за вечер
Бот в Telegram — это не магия и не работа на год. За один вечер ты можешь собрать программу, которая отвечает на сообщения, и показать её друзьям прямо в их телефонах.
Как работает отладчик: машина времени для вашего кода
Отладчик умеет то, что кажется магией: останавливать живую программу в любой точке, заглядывать внутрь её переменных и выполнять код по одной строчке. Под капотом — хитрый сговор с операционной системой и процессором.
JavaScript: язык, который написали за 10 дней и не смогли остановить
Спешка, маркетинговая хитрость с именем и десять дней на разработку — а в итоге язык, без которого не работает почти ни один сайт в мире. История о том, как несовершенство покорило интернет.
Open source: как бесплатный код незаметно держит весь интернет
Открытый исходный код — это не благотворительность чудаков, а фундамент, на котором стоят банки, телефоны и сам интернет. Рассказываем, как код, который можно бесплатно прочитать и изменить, стал основой цифрового мира.
Что такое переменная: объясняем на коробках и стикерах
Переменная — это не «ячейка памяти», как пишут в учебниках, а скорее подписанный стикер на коробке. Разбираемся, почему такая аналогия точнее и где она ломается.
Как пишут код большие команды: код-ревью, тесты и страховка от хаоса
Один программист в гараже может писать как угодно. Но когда над продуктом работают сотни людей, нужны правила, иначе всё рухнет. Заглянем за кулисы: что такое код-ревью, зачем нужны автотесты и как из этого складывается дисциплина больших команд.
Почему языков программирования так много и зачем нам тысячи диалектов
Их насчитывают сотни активно используемых и тысячи забытых. Разберёмся, почему никто не сделал один-единственный «правильный» язык и почему это не баг, а фундаментальное свойство инженерии.
Технический долг: почему «быстро сегодня» оборачивается «дорого завтра»
Каждый раз, когда программист пишет код наспех «лишь бы работало», он берёт в долг у будущего. Этот долг копит проценты — и однажды команда обнаруживает, что любая мелкая правка занимает недели. Разбираемся с одной из самых важных метафор в разработке.
Что такое функциональное программирование и почему оно похоже на математику
Программа без присваиваний, без изменяемых переменных и почти без побочных эффектов — звучит как ересь? Это функциональный подход. Он странный на первый взгляд, но именно поэтому надёжен и любим там, где важна предсказуемость.
Что на самом деле делает компилятор: путь от текста до машинного кода
Вы пишете осмысленные слова, а процессор понимает только числа. Между ними стоит компилятор — программа, которая разбирает ваш код на буквы, строит из него дерево и переписывает на язык железа.
Зачем нужны типы: статическая и динамическая типизация без занудства
Число, строка, список — почему язык вообще должен знать, что лежит в переменной? И почему одни языки требуют объявлять это заранее, а другие догадываются на ходу? Разбираем главный спор о надёжности и свободе.
Пробелы против табов: священная война программистов длиной в полвека
Чем отступать строки кода — пробелами или табуляцией? Вопрос звучит ничтожно, но программисты спорят о нём десятилетиями, всерьёз и с пеной у рта. За шуточным конфликтом скрывается настоящая инженерная суть — и кое-что о психологии людей, которые пишут код.
Что такое сборщик мусора и почему память не убирается сама собой
Каждая программа берёт память у компьютера — но кто возвращает её обратно? В одних языках это делает невидимый уборщик, в других приходится следить вручную. Заглянем, как работает эта незаметная магия.
CI/CD простыми словами: конвейер, который сам собирает и выкатывает код
Раньше выпуск новой версии программы был стрессом на целую ночь с риском всё сломать. Сегодня код попадает к пользователям десятки раз в день почти без участия человека. Разбираемся, что такое CI/CD и как автоматический конвейер изменил разработку.
Стек и куча: где программа хранит свои данные и почему это важно
У каждой работающей программы есть два склада для данных. Один — быстрый и аккуратный, как стопка тарелок. Другой — огромный и свободный, но требует ручного учёта. От того, куда попадают ваши данные, зависит скорость и надёжность программы.
Как программа общается с операционной системой: вежливые просьбы вместо команд железу
Программа не может сама открыть файл, выйти в сеть или нарисовать окно — ей это запрещено. Всё это она выполняет через посредника, операционную систему, отправляя ей особые просьбы. Разберёмся, как и почему устроена эта граница.
Рекурсия и стек вызовов: почему функция, что зовёт сама себя, может уронить программу
Рекурсия — изящный приём, где функция решает задачу, вызывая саму себя для задачи поменьше. Но у красоты есть предел: каждый вызов занимает место на стеке, и если не остановиться вовремя, программа падает с переполнением.
«Работает — не трогай»: почему этот завет программистов опасен
Есть священное правило, которое шёпотом передают новичкам: если код работает, не прикасайся к нему. В нём есть мудрость, но и ловушка. Разберёмся, откуда взялся этот страх и почему слепое следование ему медленно убивает проекты.
Left-pad: как 11 строчек кода обрушили половину интернета
В 2016 году один разработчик в обиде удалил крошечную библиотеку из одиннадцати строк — и по всему миру посыпались сборки тысяч проектов, включая гигантов индустрии. История о хрупкости современной разработки, держащейся на чужих кубиках.
Почему программы «утекают» памятью и куда она девается
Иногда программа работает день, неделю — и постепенно съедает всю память, пока не зависнет или не упадёт. Это утечка: программа берёт память и забывает вернуть. Разберёмся, как такое возможно даже в языках со сборщиком мусора.
Почему Rust полюбили: безопасность памяти без сборщика мусора
Целый класс самых опасных ошибок в программах связан с неправильной работой с памятью. Rust обещает невозможное — убрать их ещё до запуска, не теряя в скорости. Секрет в необычной идее владения.
Парадигмы программирования: четыре разных способа думать о коде
Императивный, объектно-ориентированный, функциональный, декларативный — это не названия языков, а способы мышления. Один и тот же результат можно описать совершенно по-разному, и выбор стиля меняет всё.
Что такое API простыми словами: меню ресторана для программ
Слово API звучит технично, но идея за ним домашняя: это список того, о чём одна программа может попросить другую, и в каком виде. Без него современный интернет — карты, оплаты, чат-боты, погода в телефоне — просто не существовал бы.
Высоко и низко: чем языки «близко к железу» отличаются от человеческих
Одни языки говорят почти на языке процессора, другие — почти на человеческом. Эта «высота» определяет, насколько вам удобно и насколько вы близки к настоящему железу. Прокатимся по лестнице абстракций сверху донизу.
Компилируемые против интерпретируемых: что на самом деле происходит с вашим кодом
Один язык переводят целиком и заранее, другой — построчно на лету. Эта разница определяет, почему одни программы летают, а другие удобны для экспериментов. Разбираемся без жаргона.
Баг деления Pentium: как процессор ошибался в арифметике на полмиллиарда долларов
В 1994 году выяснилось, что новейший процессор Intel неправильно делит некоторые числа. Сама ошибка была крошечной и почти никого не касалась — но реакция компании превратила её в скандал, изменивший индустрию. История о том, как технический пустяк стал уроком о доверии.
Машинный код и ассемблер: на каком языке думает процессор
В самой глубине любой программы лежат числа — команды, которые процессор выполняет напрямую. Ассемблер — это тонкий слой человеческих слов поверх этих чисел, последняя ступень перед чистым железом.
Переменные и указатели: что на самом деле лежит за именем в коде
Переменная кажется простой: дал имя — храни значение. Но под капотом это адрес в памяти, ярлык на коробку. А указатель — это коробка, в которой лежит адрес другой коробки. Разберёмся, почему это не усложнение, а ключ к пониманию программ.
Библиотека и фреймворк: в чём разница и кто кого вызывает
Эти два слова звучат похоже, и их вечно путают. Но между ними принципиальная разница в том, кто главный. Библиотеку зовёте вы. А фреймворк зовёт вас. Понять это — значит понять половину устройства любого современного проекта.
Когда ошибка в коде стоит ракеты: Ariane 5, Therac-25 и Y2K
Программные ошибки обычно стоят нам пары минут раздражения. Но иногда одна строчка кода взрывает ракету за полмиллиарда долларов или убивает пациента. Три легендарные истории о том, как мелкий баг превращается в катастрофу.
Git: машина времени для кода, которую боятся освоить
Каждый день миллионы разработчиков нажимают git commit, не задумываясь, что под капотом лежит изящная структура данных. Разберёмся, как Git помнит каждую версию проекта и почему он не теряет ваши правки.
История Python: при чём тут «Летающий цирк Монти Пайтона»
Один человек на рождественских каникулах решил сделать язык поудобнее — а назвал его в честь британской комик-группы. Сегодня на нём говорят учёные, нейросети и миллионы новичков. Как так вышло?