
Стыдно признаться: 7 вещей в программировании, которые вы зря пытаетесь понять
Большинство из нас просто кивает и делает вид, что во всем разобрался. А на самом деле — нет.
Основные идеи
Мнение автора
Эта статья — отличное напоминание, что никто не знает всего. Вместо того чтобы имитировать понимание Kubernetes или регулярок, лучше сосредоточиться на основах и не бояться задавать вопросы. Признание того, что вы чего-то не знаете, — первый шаг к тому, чтобы действительно в этом разобраться.
Каждый из нас хочет казаться компетентным в глазах коллег, чтобы они думали, будто мы точно знаем, что делаем. И по большей части так оно и есть, верно?
Но давайте будем честны. Есть несколько тем, от которых у нас просто взрывается мозг. Это те вещи, которые мы старательно обходим стороной и делаем вид, что прекрасно в них разбираемся, хотя на самом деле в голове у нас полная каша. Мы очень хотим их понять. Мы покупаем и читаем книги, чтобы в них разобраться, но в итоге просто начинаем искусно притворяться.
Конечно, мы уверены, что вы-то во всем этом разбираетесь, а вот люди вокруг вас — это те, кто притворяется. Правда? Ну ведь правда же?
Ладно, не стоит стыдиться. Мы все в одной лодке. Возможно, вы действительно понимаете одну-две загадочные темы из мира программирования. Но если вы подойдете и скажете, что понимаете их все… Ну да, конечно, мы вам поверили.
В общем, мы составили список тем, в которых большинство разработчиков на самом деле плавают, хотя никогда в этом не признаются.
Сложные булевы выражения
Я знаю, что постоянно об этом говорю, но мало что так выносит мне мозг и вгоняет в ступор, как код, который выглядит следующим образом:
function shouldApplyFreeShipping(order: Order): boolean {
return ((order.total >= 100 && order.itemCount > 0)
&& (order.isVIP ||
(!order.isVIP && order.paymentMethod === "credit"))
&& !(order.hasBackorder && order.shipping === "express"));
}
От такого хочется биться головой о стену. Да, это работает. Да, в этом коде собраны все правильные правила. Но если вы скажете мне, что можете прочитать это, удержать все условия в голове и действительно понять, что здесь происходит, я посмотрю на вас с большим подозрением. Именно из-за такого кода я всегда говорю: «Не бойтесь объясняющих переменных».
Кстати, когда этот код показали ChatGPT и попросили объяснить его в одном предложении, нейросеть выдала вот такой (правильный) ответ:
Оно возвращает true только тогда, когда заказ стоит не менее 100 долларов и содержит хотя бы один товар, клиент является VIP-персоной или не-VIP, который платит кредитной картой, и это не экспресс-доставка, которая содержит товар с отложенным заказом.
М-да.
Многопоточность и проблемы параллелизма
Поскольку у современных процессоров, кажется, бесконечный запас ядер, потоки стали неотъемлемой частью нашей программистской жизни. И, конечно же, они порождают чудовищные проблемы. Я уверен, что каждый из нас сталкивался с ужасной ошибкой в многопоточном коде. Она воспроизводится время от времени и имеет стек вызовов, который менее полезен, чем кроссворд без единой подсказки. Это просто неизбежно.
Конечно, вы можете писать многопоточный код. Вы понимаете основы того, как работают потоки. Но в глубине души вы никогда не знаете наверняка, что именно делают эти четыре потока, которые борются за блокировку ресурсов, верно? Нет, не знаете.
Математика с плавающей запятой
Новичку требуется время, чтобы смириться с тем (и уж тем более понять, почему), что числа вроде 0.7 и 0.1 нельзя точно представить в виде числа с плавающей запятой на компьютере. Это кажется странным и необычным, но в конце концов мы это принимаем. Но вы действительно понимаете, почему так происходит? Возможно. Но даже если и так, это не значит, что у вас получится свести тот отчет по расходам до копейки, верно? Не получится.
Все, что связано с Kubernetes
Ладно, кто-то там точно понимает, как работает Kubernetes, потому что он все-таки существует и используется. Но давайте посмотрим правде в глаза: лишь небольшая каста преданных гуру действительно знает, как настроить топологию кластера, сеть, контроль доступа на основе ролей, пользовательские определения ресурсов, контроллеры ingress, классы хранения, бюджеты на прерывание подов, правила близости и весь остальной цирк из 47 колец.
Большинство из нас знают самые основы YAML и собирают что-то, что вроде бы работает, а потом молятся, чтобы оно не сломалось. Признайтесь, 90% вашей конфигурации Kubernetes было скопировано из чужого рабочего сетапа, который вы и сами понимаете лишь наполовину.
Unicode и кодировки символов
Многие из нас выросли на старых добрых наборах символов ASCII и ANSI. Затем появился Unicode и открыл цифровой мир для эмодзи, бесконечных Wingdings и нелатинских символов. Unicode — это здорово, но понять его практически невозможно. Например, кажется, что символы Unicode должны занимать два байта… вот только это не всегда так. Но это только мне так кажется. Я не сомневаюсь, что все остальные могут с легкостью описать различия между UTF-8, ISO-8859-1 и Windows-1252. Конечно, могут.
Часовые пояса и летнее время
Я думаю, что на всей планете есть всего около четырех человек, которые действительно понимают все правила часовых поясов. И вы почти наверняка не один из них. Спорим, вы даже не знали, что Непал — одно из трех мест на земле, где смещение времени составляет 45 минут. Можете ли вы правильно отсортировать временные метки с учетом правил перехода на летнее время? Который час сейчас в городе Нокс, штат Индиана? Вы уверены? Поверьте мне, вы не уверены.
Скажу так… Даже такие гуру, как Джон Скит, человек с абсурдно высокой репутацией на Stack Overflow, который написал библиотеку для работы с датой/временем для .NET, с трудом отслеживает все эти нюансы.
Регулярные выражения
Сложные булевы выражения выносят мне мозг, но их хотя бы можно довольно легко расписать. Нет ничего сложнее для чтения и написания, чем сложное регулярное выражение. Правила эзотеричны и запутанны. Символы имеют неясные, относительные значения. Я предполагаю, что регулярные выражения создали инопланетяне и подкинули нам в качестве злой шутки.
Конечно, вы, вероятно, можете написать простое выражение для поиска совпадений. Но что-то сложнее? Если вы похожи на меня, вы почти наверняка скопировали его из ответа на Stack Overflow.
Зацените вот это:
/^(?:\+?\d{1,3}[-.\s]?)?(?:\(?\d{1,4}\)?[-.\s]?)?(?:\d[-.\s]?){6,14}\d$/
Вы же с первого взгляда поняли, что это регулярное выражение для проверки международных телефонных номеров, да? Очевидно же! (Или, по крайней мере, так утверждал комментарий, когда кто-то вставил его из поста в блоге).
Окей, хватит. Теперь у меня и правда болит голова. Я мог бы продолжать. (Вы действительно понимаете свой сборочный скрипт? И даже не заикайтесь об инвалидации кеша…). Факт в том, что разработка программного обеспечения — это сложный, полный вызовов и очень трудных концепций бизнес. Тот факт, что мы вообще умудряемся что-то создавать, — это настоящее свидетельство нашего упорства и трудолюбия.
Ваш любимый Python для ИИ — большая ошибка. Пора переходить на JavaScript

















