tower of weaking (tribute)
Mar. 19th, 2024 02:39 pmЕсли при чтении кода какого-то ПО человеком, который это ПО только использовал, ему всё понятно, значит, это ПО не прячет сложность.
Хорошее ПО прячет сложность от пользователя. Это означает, что исходный код ПО содержит в себе сложность, о которой потребитель ПО не знает. Наоборот, если потребитель очень хорошо знает эту сложность, ПО плохо её прячет.
Из этого можно сделать вывод, что большая часть хорошего ПО очень сложна. Можно даже довести до максимы, чем более в использовании простое ПО, тем оно сложнее для чтения.
Хорошее ПО прячет сложность от пользователя. Это означает, что исходный код ПО содержит в себе сложность, о которой потребитель ПО не знает. Наоборот, если потребитель очень хорошо знает эту сложность, ПО плохо её прячет.
Из этого можно сделать вывод, что большая часть хорошего ПО очень сложна. Можно даже довести до максимы, чем более в использовании простое ПО, тем оно сложнее для чтения.
no subject
Date: 2024-03-20 10:19 am (UTC)Я все больше перестаю понимать. Можно на примерах, для простого народу? Вот
xargs, илиgrep, илиcurl, илиncdu- они входят в этот узкий круг загадочных утилит?no subject
Date: 2024-03-20 11:36 am (UTC)xargs - хороший пример. Все умеют пользоваться xargs, и он работает волшебно просто.
Открываем сырцы:
...
...
...
ifdef SIGUSR1
ifdef SIGUSR2
/* Accept signals to increase or decrease the number of running child processes. Do this as early as possible after setting proc_max. */ sigact.sa_handler = increment_proc_max; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; if (0 != sigaction (SIGUSR1, &sigact, (struct sigaction *)NULL)) error (0, errno, _("Cannot set SIGUSR1 signal handler"));
sigact.sa_handler = decrement_proc_max; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; if (0 != sigaction (SIGUSR2, &sigact, (struct sigaction *)NULL)) error (0, errno, _("Cannot set SIGUSR2 signal handler"));
endif /* SIGUSR2 */
endif /* SIGUSR1 */
...
/* Failures here are undesirable but not fatal, since we can still guarantee that this child does not have a duplicate value of the indicated environment variable set (since the parent unset it on startup). If the user doesn't want us to set the variable, there is nothing to do. However, we defer the bail-out until this point in order to get better test coverage. */ ...
... /* we know the child is about to exit, so wait for that. * We have to do this so that wait_for_proc () does not * change the value of child_error on the basis of the * return value -- since in this case we did not launch * the utility. * * We do the wait before deciding if we failed in order to * avoid creating a zombie, even briefly. */ ...
И это только малое подмножество нюансов внутри. Там ещё отдельно работа с системами с локалью и без, правильное поведение в нескольких edge-case'ах.
Я увидел больше, чем хотел знать. xargs - чертовски хорошая утилита, скрывающая огромный пласт сложности по правильному запуску процессов.
Про curl я даже говорить не буду - с той стороны бездна с миллионом разных шифроалгоритмов, поддержкой антиквариата и bleeding edge. Оба - очень хорошие утилиты, скрывающие бездну внутри себя.
no subject
Date: 2024-03-20 12:09 pm (UTC)О да; но разве кто-то считает xargs простой штучкой? Да и много ли народу ее знает? Я каждый раз, когда меня спрашивают, что подучить, советую изучать xargs. И да, заглянув в эту бездну, начинаешь ещё больше ужасаться, конечно.
no subject
Date: 2024-03-20 12:10 pm (UTC)