image

{"__typename":"PageLikeAction","action_type":"LIKE","label":{"text":"Like"}


В 2009 году Facebook добавила в интерфейс своей социальной сети код, изменивший мир — кнопку «Like». «Лайк» был детищем нескольких программистов и дизайнеров — Лии Перлман и Джастина Розенштейна. Они предположили, что пользователи Facebook часто бывают слишком заняты, чтобы оставлять комментарии к постам своих друзей, и что поэтому им нужна простая кнопка, нажав которую можно было бы дать понять друзьям, что их пост вам понравился. Так оценивать и поощрять друг друга пользователям стало бы легче, а значит и делали бы они это чаще.

Это сработало — и даже слишком хорошо. К 2012 году пользователи прожали «лайк» триллион раз. У этого оказались и побочные эффекты. Многие стали публиковать фото/видео, чтобы потом сидеть и с тревогой обновлять страницу, ожидая, когда же число лайков возрастёт. Все стали гадать, почему кто-то другой получает больше лайков. Люди подсели на иглу одобрения (вместо того, чтобы сесть на чьё-то лицо), что отразилось на их повседневной онлайн-активности: старались публиковать как можно больше постов, чтобы казаться смешнее, умнее, красивее, спортивнее.

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

Бинарные перфокарты (первый код)



Двоичное кодирование появилось задолго до компьютеров. Базиль Бушон считается первым, кто проделал отверстия в бумаге и использовал её для управления машиной: в 1725 году он изобрел ткацкий станок, который ткал узоры на основе инструкций, содержащихся в перфорированной бумаге. Отверстие — это «единица», а отсутствие отверстия — это «ноль». Как бы многое ни изменилось с тех пор, основной «строительный блок» кода остался прежним.

Первый современный код



ENIAC был первым программируемым электронным компьютером. Завершённый в 1945 году, он настраивался для каждой новой задачи путём прокладки соединений между его многочисленными компонентами. Несколько лет спустя Клара Дан фон Нейман и Николас Метрополис подключили ENIAC к первому запуску кода современного вида: сотни числовых инструкций, выполняемых из постоянной памяти (переключатели таблицы функций ENIAC). Они смоделировали взрыв нескольких атомных бомб, оцениваемых в Лос-Аламосской национальной лаборатории в Нью-Мексико, с использованием метода Монте-Карло, когда сложная система моделируется шаг за шагом, чтобы многократно отобразить распределение вероятностей возможных результатов. Дальние потомки этого кода до сих пор используются в Лос-Аламосе.

Компилятор Грейс Хоппер



Обнаруженный Грейс Хоппер первый компьютерный «баг» — мотылёк, залетевший в компьютер Mark II и вызвавший замыкание

Грейс Хоппер программировала один из первых компьютеров и решила упростить это, внедрив в него человеческий язык, так как большинство людей с трудом понимают двоичный код. Она подумала, что если бы языки программирования могли основываться на английском языке, работа была бы менее подвержена ошибкам и была бы более доступной для тех, у кого нет докторской степени в математике.

Некоторые насмехались над этой идеей, но к началу 1950-х годов она разработала компилятор — набор инструкций, который преобразует код, состоящий из слов, в код более низкого уровня, непосредственно обрабатываемый машиной. С помощью этого инструмента она и её лаборатория разработали FLOW-MATIC, первый язык программирования, включающий английские слова на основе этого процесса.

(0) INPUT INVENTORY FILE-A PRICE FILE-B ; OUTPUT PRICED-INV FILE-C UNPRICED-INV
FILE-D ; HSP D .
(1) COMPARE PRODUCT-NO (A) WITH PRODUCT-NO (B) ; IF GREATER GO TO OPERATION 10 ;
IF EQUAL GO TO OPERATION 5 ; OTHERWISE GO TO OPERATION 2 .
(2) TRANSFER A TO D .
(3) WRITE-ITEM D .
(4) JUMP TO OPERATION 8 .
(5) TRANSFER A TO C .
(6) MOVE UNIT-PRICE (B) TO UNIT-PRICE (C) .
(7) WRITE-ITEM C .
(8) READ-ITEM A ; IF END OF DATA GO TO OPERATION 14 .
(9) JUMP TO OPERATION 1 .
(10) READ-ITEM B ; IF END OF DATA GO TO OPERATION 12 .
(11) JUMP TO OPERATION 1 .
(12) SET OPERATION 9 TO GO TO OPERATION 2 .
(13) JUMP TO OPERATION 2 .
(14) TEST PRODUCT-NO (B) AGAINST ; IF EQUAL GO TO OPERATION 16 ;
OTHERWISE GO TO OPERATION 15 .
(15) REWIND B .
(16) CLOSE-OUT FILES C ; D .
(17) STOP . (END)


Сэмпл программы FLOW-MATIC

Spacewar!


hp1, dap hp2
count i ma1, hp2
law hp3 / next step
dac i ml1
law 7
dac i mb1
random
scr 9s
sir 9s
xct hr1
add i mx1
dac i mx1
swap
add i my1
dac i my1
random
scr 9s
sir 9s
xct hr2
dac i mdy
dio i mdx
setup .hpt,3
lac ran
dac i mth
hp4, lac i mth
sma
sub (311040
spa
add (311040
dac i mth
count .hpt,hp4
xct hd2
dac i ma1
hp2, jmp .


Эта процедура позволяет в игре Spacewar! кораблям не сталкиваться друг с другом.

В конце 1961 года группа молодых сотрудников MIT получила доступ к компьютеру DEC PDP-1, который имел 18-битную длину слова и использовал бумажную ленту для хранения программ. В течение пяти месяцев эти программисты создали игру, где два игрока управляют космическими кораблями, которые сражаются в космической битве один на один.


Spacewar! быстро распространилась среди раннего «хакерского» сообщества. Позже DEC распространяла его с каждым PDP-1, предварительно загружая в основную память. Программа значительно повлияла на небольшое сообщество программистов 1960-х годов и вдохновила поколения создателей видеоигр. Игра продолжает жить в эмуляциях и регулярно демонстрируется в Музее компьютерной истории на последнем действующем PDP-1, которому более 50 лет (Жалоб от пользователей нет. Отчетов о сбоях нет. И поддержка по-прежнему доступна).

Электронная почта


WHENEVER A(1).E.FENCE.OR.A(2).E.FENCE.OR.A(3).E.FENCE
PRFULL.($'R'1INSTRUCTIONS:$)
PRFULL.($ '4MAIL NAME1 NAME2 PROB1 PROG1 PROB2 PROG2 ...$)
PRFULL.($ WHERE '=NAME1 NAME2'= IS THE FILE TO BE MAILED,$)
PRFULL.($ AND '=PROBN PROGN'= ARE DIRECTORIES TO WHICH '8$,
1 $IT IS TO BE SENT.'B$)
CHNCOM.(0)
END OF CONDITIONAL


В том же 1961 году программисты того же MIT создали систему, позволяющую нескольким пользователям входить в один и тот же компьютер, и они начали оставлять друг другу небольшие сообщения. В 1965 году группа программистов решила создать формальную систему команд для отправки, получения и отображения этих маленьких цифровых посланий. Высшее руководство поначалу сопротивлялось команде MAIL, думая, что это немного легкомысленно, но её использование стало настолько популярным, что к 1971 году Массачусетский технологический институт даже увидел первый спам: сообщение против войны во Вьетнаме.

Код спасения лунного модуля «Аполлон-11»


POODOO INHINT
CA Q
TS ALMCADR

TC BANKCALL
CADR VAC5STOR # STORE ERASABLES FOR DEBUGGING PURPOSES.

INDEX ALMCADR
CAF 0
ABORT2 TC BORTENT

OCT77770 OCT 77770 # DONT MOVE
CA V37FLBIT # IS AVERAGE G ON
MASK FLAGWRD7
CCS A
TC WHIMPER -1 # YES. DONT DO POODOO. DO BAILOUT.

TC DOWNFLAG
ADRES STATEFLG

TC DOWNFLAG
ADRES REINTFLG

TC DOWNFLAG
ADRES NODOFLAG

TC BANKCALL
CADR MR.KLEAN
TC WHIMPER


У управляющего компьютера «Аполлона» (AGC) было меньше вычислительной мощности, чем у сегодняшних поздравительных открыток, и всё же он работал. Эта ограниченная мощность и объём памяти означали, что задачи должны были тщательно продуманы. Команда разработчиков программного обеспечения AGC знала, что всегда существуют непредвиденные обстоятельства. Поэтому они создали BAILOUT. Когда на компьютере возникал риск нехватки места, AGC запускал BAILOUT, чтобы «запаузить» менее важные операции, чтобы поддерживать работу жизненно важных.

Когда посадочный модуль Eagle опускался на поверхность Луны, на высоте 15 000 метров AGC высветил сигнал тревоги «1202», который ни Нил Армстронг, ни диспетчер полётов в Хьюстоне сразу не распознали. Но менее чем через 30 секунд компьютерные эксперты из Центра управления полётами сообщили, что программное обеспечение AGC делает именно то, что и должно: откладывает менее приоритетные задачи и запускает важные (так быстро, что это незаметно для экипажа). Армстронг и Базз Олдрин продолжали получать то, что им было необходимо от AGC, чтобы не сбиться с пути.

Hello, world!


main( ) { printf("hello, world\n"); }

Когда вы садитесь изучать новый язык программирования, первое, что вам нужно сделать, — заставить компьютер отобразить фразу «Hello, world!». Самый известный ранний пример взят из меморандума Bell Laboratories под названием «Programming in C — A Tutorial», написанного в 1974 году.

«Hello, world!» это хороший пример педагогики. Это небольшая достижимая задача, которая быстро даёт чувство выполненной работы. Это стандарт, поэтому он помогает проиллюстрировать различия между разными языками программирования. Это также быстрый и простой способ для программистов убедиться, что всё работает правильно после установки новой среды.

Строка с завершающим нулём


char yellow[26] = {'y', 'e', 'l', 'l', 'o', 'w', '\0'};

Самая катастрофическая ошибка проектирования в истории вычислительной техники

В 1972 году Деннис Ритчи принял судьбоносное решение: представить текст на своём новом языке с помощью чего-то, что называется строкой с нулем в конце. Эта концепция существовала и раньше, но он закрепил её в своем новом языке, который назвал C, и с тех пор наследие этого решения остаётся с нами.

Чрезвычайно распространённая ошибка в коде C — копирование длинной строки в более короткую, что означает переполнение строки и уничтожение других данных. Помимо простого нарушения работы программы, такие ошибки можно использовать для изменения поведения программы. Почти все эксплойты безопасности, о которых вы когда-либо слышали, берут свои истоки отсюда, начиная с червя Морриса в 1988 году.

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

IRC


/join #cats
Internet Relay Chat (IRC), появился ещё до того, как большинство людей смогли бы рассказать, что такое Интернет. Это был первый популярный способ общаться в режиме реального времени с другими людьми в групповом канале. Первые пользователи входили в систему, чтобы делиться новостями. Сам чат требовал своего рода код: чтобы присоединиться к каналу, нужно было ввести /join #[название канала]. Если вы хотели сообщить что-то о себе, надо было набрать /me так устал, и ваше имя отмечалось звездочкой со словами «так устал». Не смотря на кажущуюся простоту, для многих это была первая проба пера с использованием команды на компьютере.



Червь Морриса


/join #cats
checkother() /* 0x57d0 */
{
int s, l8, l12, l16, optval;
struct sockaddr_in sin; /* 16 bytes */

optval = 1;
if ((random() % 7) == 3)
return; /* 612 */

s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0)
return;


Это выдержка из ключевой функции в коде червя Морриса.

И Роберт Моррис, и сам Интернет были молоды, когда 23-летний аспирант Корнелла, выпустил «червя Морриса», запустив то, что было названо «первой крупной атакой в Интернете». Приблизительно 10 % из 60 000 компьютеров, подключённых к Интернету, были повреждены. Был нанесён ущерб на миллионы долларов, что вынудило New York Times впервые напечатать слово «Интернет». Даже технически подкованные люди были удивлены, увидев, насколько обширен охват действия червя. Моррис, который говорил, что никогда не собирался причинять такой большой ущерб, стал первым человеком, которому было предъявлено обвинение в соответствии с Законом о компьютерном мошенничестве и злоупотреблениях. После того, как его приговорили к трём годам условно, он стал соучредителем знаменитого инкубатора стартапов Y Combinator и доцентом компьютерных наук в MIT (и снова MIT).



HTML-гиперссылка


<a href = "https://habr.com/">Habr</a>


Тим Бернерс-Ли изменил мир, когда представил гиперссылку, фрагмент кода, который позволяет любому сёрфить по Всемирной паутине. Концепция связывания информации не была особенно новой. Что было в новинку, так это знаки препинания, которые были собраны вместе из различных соглашений компьютерных систем, чтобы получить формат «URL-адреса двоеточие-слэш-слэш». Концепция гиперссылки на что угодно сделала эту идею перспективной. Гиперссылка Бернерса-Ли могла бесплатно стать кнопкой «Купить сейчас», «Like», «ретвитом» и многим другим.

JPEG


double *NaiveDct_transform(double vector[], size_t len) {
  if (SIZE_MAX / sizeof(double) < len)
    return NULL;
  double *result = malloc(len * sizeof(double));
  if (result == NULL)
    return NULL;
  
  double factor = M_PI / len;
  for (size_t i = 0; i < len; i++) {
    double sum = 0;
    for (size_t j = 0; j < len; j++)
      sum += vector[j] * cos((j + 0.5) * i * factor);
    result[i] = sum;
  }
  return result;
}


Дискретное косинусное преобразование, лежащее в основе JPEG.

Сегодня стало само собой разумеющимся, что можно заполнять память смартфонов огромным количеством фотографий. Но раньше изображения требовали огромных объёмов данных. В 1992 году Объединённая группа экспертов по фотографии опубликовала спецификации стандарта JPEG, чтобы уменьшить размер файлов. Хотя в то время были доступны и другие форматы сжатия, JPEG стал мировым стандартом, отчасти потому, что он был бесплатным. Файлы JPEG используют сжатие с потерями — процесс, который удаляет аспекты изображения, невидимые для человеческого глаза, такие как небольшие различия в цвете. Сжатие с потерями было также важно для изобретения кое-чего ещё, представленного в 1992 году: MP3, формата аудиофайлов, который стал возможен благодаря отбрасыванию битов данных, неразличимых человеческим ухом.

Браузер Mosaic


MakeImage(dsp, data, width, height, depth, img_info, clip)
  Display *dsp;
  unsigned char *data;
  int width, height;
  int depth;
  ImageInfo *img_info;
  int clip;
{
  int linepad, shiftnum;
  int shiftstart, shiftstop, shiftinc;
  int bytesperline,bpp;
  int temp;
  int w, h;
  XImage *newimage;
  unsigned char *bit_data, *bitp, *datap;
  Visual *theVisual;
  int bmap_order;
  unsigned long c;
  int rshift, gshift, bshift;

#ifdef NEW
  switch(bpp=bits_per_pixel(dsp,depth))
#else
  switch(depth)


Рождение Интернета, каким мы его видим.

Предыдущие браузеры были неуклюжими, хоть и отображали текст хорошо, но вынуждали просматривать изображения в отдельном окне. В 1993 году разработчикам во главе с Марком Андриссеном потребовался браузер, в котором изображения и текст располагались бы рядом. И они создали Mosaic. Благодаря им сеть стала выглядеть так, как если бы это был классный цифровой журнал или газета. Это также подтолкнуло стандарты HTML к ускоренному развитию, поскольку веб-мастера по всему миру начали требовать всё больше тегов, чтобы сайты выглядели круче.



Пиксель отслеживания


<img height="1" width="1" style="display:none"src="https://www.facebook.com/tr?id=166975463695820&ev=PageView&noscript=1"/>


Пиксель отслеживания просмотра страниц Facebook.

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

Именно успех отслеживания пикселей привел к появлению кнопки «Like» в Facebook, которая отслеживает вас на каждом веб-сайте, где она встроена. Этот массивный сбор данных позволил реализовать гипертаргетинг, который сделал рекламу в Facebook такой успешной, уведя миллиарды доходов от медиакомпаний. Это привело к процветанию целенаправленной дезинформации и распространению бизнес-моделей, основанных на слежке.

Wiki


Начало для Википедии.

sub AsLink {
   local($num) = (@_);
   local($ref) = $old{"r$num"};
   defined $ref
        ? ($ref =~ /\.(?:gif|jpg|jpeg|png)$/i 
            ? "<img src=\"$ref\">" 
            : "<a href=\"$ref\">[$num]<\/a>")
        : "[$num]";
}


WikiBase от WikiWikiWeb, последний раз редактировалось 13 июня 2000 г.

Уорд Каннингем впервые разработал Wiki на своём сайте WikiWikiWeb, который он представлял как простейший способ обмена информацией. Он использовал базовый язык разметки, который включает в себя скобки, объединение слов без пробелов и апострофы вокруг текста, чтобы редакторы могли обновлять и упорядочивать информацию, связанную между страницами, — система, которая до сих пор широко используется в Википедии, запущенной в 2001 году.



Первая всплывающая реклама


window.open('https://timeweb.cloud/')


Базовый код для открытия нового окна с заданным URL-адресом.

Всплывающая реклама была разработана для решения реальной проблемы: компания Tripod позволяла людям размещать любой контент, который они хотели, на бесплатной домашней странице. Чтобы субсидировать сервис, владельцы компании продавали рекламу. Но рекламодателям не всегда нравился контент страницы, на которой они размещались, поэтому было принято решение отделить рекламу от пользовательского контента. Так появился этот бич Интернета.



Алгоритм PageRank от Google


import numpy as np

def pagerank(M, num_iterations=100, d=0.85):
    N = M.shape[1]
    v = np.random.rand(N, 1)
    v = v / np.linalg.norm(v, 1)
    iteration = 0
    while iteration < num_iterations:
        iteration += 1
        v = d * np.matmul(M, v) + (1 - d) / N
    return v


До PageRank поисковые системы пытались найти информацию, основываясь на том, соответствуют ли слова запроса словам на сайтах. Но у Ларри Пейджа и Сергея Брина возникла блестящая идея: они создали алгоритм, который ранжирует известность страницы в зависимости от того, сколько других страниц в Интернете ссылаются на неё. Именно это отвечает за доминирование среди браузеров, которым сегодня пользуется Google.



Пропорциональное справедливое планирование для беспроводных сетей


[~, b_user] = max(drc(i, :)/_avg_thruput(i, :));
avg_thruput(i+1, :) = (i/(i+1))*avg_thruput(i, :);
avg_thruput(i+1, b_user) = (i/(i+1))*avg_thruput(i, b_user)+drc(i, b_user)/(i+1);


«Управляемая передатчиком система с несколькими приёмниками, использующая разнесение путей для справедливого увеличения пропускной способности», Патент США № 6449490, 10 сентября 2002 г.

Всего три строки кода, которые заставляют работать все сотовые сети 3G и 4G по всему миру.

Часто в каком-либо населённом пункте имеется намного больше мобильных телефонов, чем могут обслуживать вышки базовых станций. Это может препятствовать надежной передаче данных. Таким образом, вышкам необходимо решить проблему расстановки приоритетов: убедиться, что все пользователи могут завершить свои звонки, принимая во внимание тот факт, что пользователям в более «шумных» местах необходимо предоставить больше ресурсов для получения того же качества обслуживания. Решение? Компромисс между потребностями отдельных пользователей и общей производительностью всей сети. Пропорциональное справедливое планирование гарантирует, что все пользователи имеют хотя бы минимальный уровень обслуживания при максимальной общей пропускной способности сети. Это делается путём предоставления более низкого приоритета пользователям, которым, как ожидается, потребуется больше ресурсов.

Биткоин


double AttackerSuccessProbability(double q, int z)
{
    double p = 1.0 - q;
    double lambda = z * (q / p);
    double sum = 1.0;
    int i, k;
    for (k = 0; k <= z; k++)
    {
        double poisson = exp(-lambda);
        for (i = 1; i <= k; i++)
            poisson *= lambda / i;
        sum -= poisson * (1 - pow(q / p, z - k));
    }
    return sum;
}


Код, без которого не существовал бы Биткоин.

Являетесь ли вы сторонником биткоина, скептиком или не совсем уверены, что это такое, вы, вероятно, знаете, что это хайповая тема. Сам Биткоин привлёк сотни миллиардов долларов прямых инвестиций, но более важно то, что лежащий в основе технологический принцип, блокчейн, был исследован для бесконечных приложений, от обеспечения демократических выборов до прекращения сексуальных контактов без согласия.

Все началось в 2008 году, когда Сатоши Накамото опубликовал официальный документ, в котором объявил о запуске Биткоин. Документ включал в себя эти строки кода, которые вычисляют бесконечно малую вероятность того, что злоумышленник сможет захватить блокчейн Биткоина. Математика убедила мир в том, что системе, созданной ненадёжными людьми, тем не менее, можно доверять. Это проложило путь к созданию как минимум около 3000 других криптовалют.


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

Комментарии (35)


  1. TimsTims
    09.12.2022 17:21
    +2

    А как же posgre, postgre и язык SQL? Уж точно поважнее MiRC'a и всплывающей рекламы.


    1. lorc
      10.12.2022 01:13
      +12

      MiRC - как программа, действительно, не самое лучшее.

      Но вот сам по себе IRC - это очень большой пласт интернет-культуры. Не все его застали конечно (равно как и news-группы), но тем не менее.


    1. rrrad
      10.12.2022 13:01
      +1

      postgre - это какое-то непонятное слово, применяемое вместо признанного сокращенного названия одной популярной СУБД, видимо, от недостатка уважения к разработчикам этой СУБД.

      Что касается PostgreSQL, скорее всего, значительный период разработки прошел благодаря общению разработчиков в IRC-чатах. Так что принижать значимость IRC не стоит.

      А вот по всплывающей рекламе соглашусь - нечем гордиться.


      1. Uporka
        10.12.2022 17:46
        +1

        По-моему статья не про гордость, а про влияние.


  1. codecity
    09.12.2022 18:40
    +13

    В 2009 году Facebook добавила в интерфейс своей социальной сети код, изменивший мир — кнопку «Like».

    Это о чем? Хотите сказать что до этого не было системы оценок сообщений? Да хоть на том же Хабре, чтобы далеко не ходить. Или что такого нового?


    1. Gumanoid
      10.12.2022 12:27
      +2

      Новизна в том что нет варианта dislike, а на других сайтах можно было ставить как +, так и -.


      1. rrrad
        10.12.2022 13:27
        +8

        Вы так пишите, как будто отсутствие дизлайков - это что-то хорошее. Вон youtube начали скрывать дизлайки, похоже, под давлением больших компаний, которым не нравилось большое количество дизлайков под их пупбликациями.


        1. Alexrook
          10.12.2022 21:12
          +5

          пупбликациями

          точно, poop-ликациями )


  1. ermolalex
    09.12.2022 21:06
    +11

    1. Pochemuk
      10.12.2022 18:21
      +1

      Тоже по стилистическим корявостям и неточностям показалось, что это должен быть перевод. Посмотрел — плашка «Перевод» в начале статьи не выставлена. Но местами — дичь несусветная.


  1. kurgan-kotlovan
    09.12.2022 21:06
    +14

    А как же быстрое вычисление корня из Doom???


    1. blueboar2
      09.12.2022 22:24
      +8

      Разве не Quake?


      1. kurgan-kotlovan
        09.12.2022 22:31
        +5

        действительно Quake 3. Видимо ID ассоциируется больше с думом


        1. TimsTims
          10.12.2022 08:52
          +8

          И не с Quake 3, а c первым Quake)


    1. F0iL
      10.12.2022 02:58
      +7

      Этот алгоритм был придуман задолго до появления Doom Quake.


  1. vlad4kr7
    10.12.2022 02:17

    Строка с завершающим нулём

    char yellow[26] = {'y', 'e', 'l', 'l', 'o', 'w', '\0'};

    Самая катастрофическая ошибка проектирования в истории вычислительной техники

    Может nil он-же null, будет не менее катастрофичным?

    К тому-же null, после С, успел отметиться в других языках.


    1. F0iL
      10.12.2022 02:59
      +4

      Это не про null pointer, а про null-terminated strings. Совершенно другой пласт багов.


      1. vlad4kr7
        10.12.2022 03:37

        1. Gordon01
          10.12.2022 14:25
          +7

          Это не про null pointer, а про null-terminated strings. Совершенно другой пласт багов. (2)


          1. vlad4kr7
            10.12.2022 19:58

            Может nil он-же null, будет не менее катастрофичным?

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

            Почему-то "null-terminated strings" не называют The-Billion-Dollar-Mistake.


            1. Medeyko
              11.12.2022 08:44
              +1

              Разумеется, не называют! Потому это слишком мелко для null-terminated strings, для них и эпитет The-Trillion-Dollar-Mistake - слишком слабый. Эта ошибка гораздо серьёзнее, т. к. приводит к уязвимостям, а не просто к прекращению работы.

              А так-то, скорее всего, просто у Тони Хоара (с самокритического высказывания которого и пошёл такой эпитет) с рефлексией лучше, чем у Денниса Ритчи.


  1. mbait
    10.12.2022 09:03
    +5

    Самая катастрофическая ошибка проектирования в истории вычислительной техники

    Ну-да, ну-да. Высказывание от авторов "введение null стало ошибкой на миллион долларов" и "проверяемые исключение в Java это фундаментальная ошибка проектирования". И ещё с дюжину подобных набрать можно. Программировать нормально надо, а не рукожопить. Си был придуман как платформонезависимая замена языкам ассемблера, потому что в то время был зоопарк архитектур, и с переносимостью было всё плохо. И авторы отлично справились со своей задачей, не перегрузив язык ненужной семантикой (чего нельзя сказать о С++ с его ложным don't pay for what you not use). После развития оптимизирующих компиляторов стало почти невозможно написать на голом ассемблере лучше чем на Си. И я вот не припомню, чтобы ANSI C запрещал создавать свои структуры хранения строк аля Pascal-style или что-то посложнее, но нет же - всем плохим танцорам вечно мешает этот нуль-терминатор.


    1. DungeonLords
      10.12.2022 09:18
      -1

      Добавлю, используйте snprintf(), а не snprintf() и будет вам счастье!


      1. Maxim-8
        10.12.2022 17:46
        +5

        А чем snprintf() отличается от snprintf()?..


        1. DungeonLords
          10.12.2022 19:01

          А вы внимательный!

          Конечно я описался, имелось ввиду: используйте snprintf (), а не sprintf (). Пока набирал сообщение, понял, что не я описался, а телефон меня "исправил"...


          1. Medeyko
            11.12.2022 09:04

            Отличная демонстрация того, что человеку свойственно ошибаться, проявлять невнимательность. В том числе и тому, кто патетически называет других "рукожопами" и "плохими танцорами". :)

            Именно поэтому на безошибочность людей закладываться нельзя.


    1. rrrad
      10.12.2022 13:11
      +3

      Проблема не только в небезопасности, а в том, что некоторые операции с ними - медленные.

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

      А вот то, что позже сишные строки не объявили deprecated и не ввели нормальные строки в стандарт языка (понятно, что полностью избавиться от старых строк не получилось бы) - вот это, как мне кажется, было ошибкой.


      1. mbait
        10.12.2022 13:41

        Си-строки это отличный вариант для межинтерфейсного взаимодействия, отчасти поэтому в std::string всё ещё есть метод data(). Всё остальное можно реализовать на уровне приложения любым доступным способом.


    1. 0xd34df00d
      11.12.2022 08:44
      +5

      Программировать нормально надо, а не рукожопить.

      Надо, но, оказывается, на С это очень сложно. Даже ping без багов не напишешь.

      После развития оптимизирующих компиляторов стало почти невозможно написать на голом ассемблере лучше чем на Си.

      Голый ассемблер — да, но чистый С очень часто в вычислительных задачах сливает интринсикам (которые почти ассемблер).

      чего нельзя сказать о С++ с его ложным don't pay for what you not use

      Не хочу платить за лишние индирекшоны, почему qsort меня заставляет?


      1. mbait
        12.12.2022 02:10

        И как ненультерминированные строки помогают решать вышеперечисленные проблемы? Мой первоначальный тезил был о том, что Си-строки пинают на тему безопасности, хотя никто не мешает придумать свою структуру для хранения строк и использовать её.


        1. 0xd34df00d
          12.12.2022 05:04
          +1

          Не мешает, но строки — это как раз один из тех словарных типов, которые неплохо бы иметь одинаковым между разными библиотеками.


  1. zkutch
    10.12.2022 11:40
    +5

    Немного странный подбор, но, как обычно, дело вкуса. Для меня, например, код бинарного поиска сравним с изобретением колеса. Перейти с линейной сложности на логарифмическую - потрясающее достижение.


    1. shark14
      10.12.2022 14:14
      +6

      А что тут такого революционного? Этот алгоритм в целом самоочевиден, он был известен задолго до возникновения IT и использовался в тех же библиотеках, картотеках и прочих хранилищах, где все лежит по порядку.

      Да и простыми обывателями тоже применялся, кто стремится как-то оптимизировать свои усилия в бытовых и рабочих вопросах.


    1. TimsTims
      10.12.2022 20:18
      +1

      У нас в 3 классе была задача, в стиле:

      Есть плёнка, в ней 90 минут аудиозаписи. Маша ищет на этой плёнке любимую песню. Ей надо 5-10 секунд чтобы понять, где песня - раньше или позже.

      Вопрос: как ей быстрее всего найти эту песню?

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


  1. Throwable
    12.12.2022 10:39

    module.exports = leftpad;
    function leftpad (str, len, ch) {
      str = String(str);
      var i = -1;
      if (!ch && ch !== 0) ch = ' ';
      len = len - str.length;
      while (++i < len) {
        str = ch + str;
      }
      return str;
    }

    2016: left-pad npm package