В понедельник на выступлении в Нью-Гэмпшире в ходе предвыборной кампании Джо Байден заявил, что «любой, кто может спуститься в шахту на глубину до 900 метров, уж точно сможет научиться программировать.»
Ниже численность работников угледобывающей промышленности, в тысячах:
Использованные источники:
Комментарии
Подтвержу, поскольку у меня была похожая история, но с оговорками. Все это справедливо для возраста 25-35 лет. Потом способности к переобучению с каждым годом падают сильно. Для 45-55 лет это уже почти не реально.
Один мой знакомый гуманитарий из преподавателя переквалифицировался в сисадмины. Так он вовремя понял, что без хобби прожить можно, а без денег нет. Но с математикой у него плохо и программистом ему не быть. Так он хотя бы в гуманитарных науках мозг напрягал. А какие скилы качал шахтер? К тому же тем безработным шахтерам наверняка не 27, а за 40.
Феерично!!!
Это ещё раз доказывает, что не эти выбираемые клоуны правят америкой.
"Пьяный - проспится, а дурак - никогда"
"Но позвольте, как же он служил в очистке?" (с)
Любителей "китайского" кода неплохо бы в шахтеры переквалифицировать
Китайский код - тоже разный.
Пока не слышал ни об одной аварии по причине сбоев кода в системах управления у них в ракетно-космической отрасли. ДА и - в авиации, кстати, - тоже.
Хотя, по доходящим слухам, там - очень своеобразные языки и подходы к проектированию используются. Я даже произносить боюсь, что услышал. Мейнстрим - просто не поймёт. :)
Китайский код - это мем, видимо не на пустом месте возникший, у китайцев все-таки специфический склад ума, из-за иероглифов ихних. А вот откуда берутся наши доморощенные "китайцы"? возможно это не состоявшиеся шахтеры. Выдают, понимаешь, в закрома Родины тысячи тонн словесной руды.
Китайский код от европейского отличается только не выполнением требования писать процедуры для повторяющегося кода. Причина, действительно, в китайском языке. Если в русском тексте повторяющиеся слова считаются неприемлемыми (необходимо заменять местоимениями, синонимами, перефразировать), то в инструкции на китайском языке, если написано «левая верхняя кнопка панели управления», значит она так и будет называться во всём тексте, а не превращаться в «левая верхняя кнопка», «та кнопка», «кнопка», «она». И этот же подход используется в программировании. Если кусок кода меньше 5 строк, то он не будет вынесен в функцию, а будет аккуратно скопирован во всех точках вызова. И я даже не могу сказать, что это плохо: каждый кусок программы читается проще, так как нет необходимости через строку ходить в определение функций.
и да - если кусок кода меньше 5 строк, то с большой вероятностью накладные расходы на функцию (CALL/RET, помещение в стек, удаление из него адреса возврата и воможных параметров) будут существенно больше якобы поулченных плюсцов. макры в таких случаях рулят!
С макрами свои проблемы есть. Вообще-то, во всех языках программирования, где скорость считается важной, компилятор сам определяет, сделать ли вызов функции или подставить её тело. Более того
int main()
{
int r = 0;
for(int i = 0; i<=100; i++) r += i;
printf("%d", r);
}
имеет идентичный код с программой
int main()
{
printf("%d", 5050);
}
Идентичный - не код, а результат работы программы.
Функционально идентичным будет матфункция:
r = (100+1)*100/2
Я же ссылку дал. Код идентичен.
.LC0:
.string "%d"
main:
sub rsp, 8
mov esi, 5050
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
xor eax, eax
add rsp, 8
ret
Потому что компилятор вправе вычислить и подставить результат.
я хз чо там у вас за сайт, я вам реальный objdump реального компиляния выложил
Тот сайт тоже компилятор запускает.
Укажите версию своего компилятора и флаги компиляции. Если gcc, то хотя бы -O3 не забыл написать?
"-O3 известен также тем, что ломает несколько пакетов. Использование -O3 не рекомендуется"
sapienti sat!
Хорошо. Пишите -O2.
нафейхоа?
ты уже обделался с тем, что якобы компилятор завсегда сделает один код как в твоём примере.
Я не говорил что всегда, я говорил, что компилятор вправе их сделать идентичными. И при включенной оптимизации современный компилятор сделает.
два чая этому господину!
Как гласит легенда, этим господином был Гаусс, когда ещё учился в школе.
у вас ошибка в программе!
--- test1.c 2020-01-02 18:20:36.636053734 +0700
+++ test1a.c 2020-01-02 18:19:38.217497311 +0700
@@ -1,6 +1,10 @@
+#include <stdio.h>
+#include <string.h>
+
int main()
{
int r = 0;
for(int i = 0; i<=100; i++) r += i;
- printf("%d", r)
+ printf("%d", r);
}
+
и если честно - прога - бессмысленная! я что-то подобное видел в примере MSDN в начале 2000-х, что-то вида:
A=(C*3)/3
))))))))))))))))))))))))))))))))))
а вот как выглядит реальная программа:
0000000000001135 <main>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 48 83 ec 10 sub $0x10,%rsp
113d: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
1144: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp)
114b: eb 0a jmp 1157 <main+0x22>
114d: 8b 45 f8 mov -0x8(%rbp),%eax
1150: 01 45 fc add %eax,-0x4(%rbp)
1153: 83 45 f8 01 addl $0x1,-0x8(%rbp)
1157: 83 7d f8 64 cmpl $0x64,-0x8(%rbp)
115b: 7e f0 jle 114d <main+0x18>
115d: 8b 45 fc mov -0x4(%rbp),%eax
1160: 89 c6 mov %eax,%esi
1162: 48 8d 3d 9b 0e 00 00 lea 0xe9b(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
1169: b8 00 00 00 00 mov $0x0,%eax
116e: e8 bd fe ff ff callq 1030 <printf@plt>
1173: b8 00 00 00 00 mov $0x0,%eax
1178: c9 leaveq
1179: c3 retq
117a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
Речь не про осмысленность проги, а про то, что не надо заниматься микрооптимизациями, так как компилятор на них всё равно положит и сделает по-своему.
Похоже, её с -O0 собирали...
вообще без -O, намеренно ;-)
Вот она и выдала ассемблерный код без оптимизации. Если надо не быстро, а понятно, то подойдёт.
Реальный вопрос в том, как программа меняется при изменении требований. И если для европейца неприятен код
a[0] = read_data(0);
a[1] = read_data(1);
a[2] = read_data(2);
a[3] = read_data(3);
a[4] = read_data(4);
a[5] = read_data(5);
и он его переписывает в
for(int i =0; i<6; i++) {
a[i] = read_data(i);
}
то для китайца крайне неприятен код, который получается из второго после нескольких итераций уточнения особых случаев:
for(int i =0; i<6; i++) {
if(i == 3) { a[i] = read_data3(); continue; }
if(i == 5) { a[i] = read_data5(); continue; }
a[i] = read_data(i);
}
мне тоже неприятен 3 вариант. это как раз case для case ;-)
for(int i =0; i<6; i++) {
switch(i)
{
case 3: a[i] = read_data3(); break;
case 5: a[i] = read_data5(); break;
default: a[i] = read_data(i);
}
}
По-моему хрен редьки не слаще. На фоне
a[0] = read_data(0);
a[1] = read_data(1);
a[2] = read_data(2);
a[3] = read_data3();
a[4] = read_data(4);
a[5] = read_data5();
8 строк против 6, читается сложнее.
огада!
хуа фанфа бу нань!
даже при шести параметрах уже выглядит мягко говоря не очень.
а если учесть, что многие случаи могут совпадать (switch один и тот же для 3 и 5, скажем), то и if и китайский способ идут лесом!
и это не говоря уже про гораздо худшую читаемость обоих этих способов против case.
знаете, у меня большой опыт с нечитаемыми, write-only ЯП, так что не будем спорить об очевидном.;-)
Вот, собственно, причина, почему есть «китайский код». Почти для любого китайца шесть похожих строчек гораздо легче читаются/понимаются/модифицируются, чем for/switch/case. Для почти любого европейца, наоборот. Если объективно измерять в секундах на прочтение всего алгоритма/внесение изменений при каких-то условиях, то китайский код требует меньше времени. Но требует больше времени, если необходимо исправить ошибку в общем (скопированном) куске.
Читаемость/нечитаемость от ЯП мало зависит. На любом языке можно написать как читаемо, так и нечитаемо.
> Читаемость/нечитаемость от ЯП мало зависит.
да ладно? ;) расскажите это любителям перловки )))))
ну или вот (прога реальная):
Нечитаемый код можно написать на любом языке. В JS такое получается почти автоматически после минимизации.
А на MUMPS тоже читабельный код существует: https://github.com/lparenteau/DataBallet/blob/master/r/databallet.m
1) после реального мампса ваш якобы нечитаемый жабаскрипт глаз легко разбивает на лексемы и т.п. там надо релаьный obfuscator натравливать чтобы нечитаемо было
2) ваш супер-код нетипичен для практики MUMPS ;-)
3) надо же, GT.M ещё живое и шевелится! :-)
кстати, контрольный вопрос - "{" на той же строке что и командное слово или на следующей? ;-)
if {
или
if
{
В Си? Я пишу на той же.
я попробую китайцев спросить про это. но это не быстро.
Не ожидайте правдивого ответа.
inline функции
Имхо, это очень плохо, когда программист не способен (или ленится) обобщить повторяющуюся ситуацию. Потом тяжело с этим месивом разбираться и править. К чему это в структурном программстве? Если хочется хардкора - можно программировать на ассемблере.
Не ленятся. Я же пример привёл, почему китайцы так пишут.
Или вот ещё пример: https://github.com/DeforaOS/libc/blob/master/src/libgen.c#L37 . Даже не вынесены в отдельные функции повторяющиеся куски в строках 41/56 и 43/50.
И аналог с умением «обобщить повторяющуюся ситуацию» (использовать strrchr/memrchr): https://code.woboq.org/userspace/glibc/misc/dirname.c.html#25
Хотите сказать, что с вторым примером легче разбираться и править? В Java это вообще приводит к маразму в стиле https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition . Зато всё обобщено, да.
если только им зарплату за количество строк платят )
Это все простенькие какие-то примерчики. Я на практике совершенно с другими вещами сталкиваюсь, когда многократно копипастятся не пять, а все 25-строк, причем явно описывающих компактную операцию, которой можно дать содержательное название. И это делается в нескольких однотипных классах, раскиданных по проекту. А потом варяг, слепивший эту лабудень, исчезает в тумане и приходится в этом разбираться.
Вот в 1С когда-то в эпоху 1С 7.7 в начале 2000-х был принят китайский код. В том смысле, что в каждом виде документов полностью описывалась логика его работы. Например, алгоритм списания партий товаров повторялся в реализации, перемещении, списании, ... В отдельные функции выносились только куски, которые точно никогда не могли поменяться независимо.
Теперь программистов у 1С стало больше и код они переписали под новую моду. И теперь вместо куска в 25 строк, открывающем форму подбора (с параметрами) стоит
В этой функции содержимое типа
А в каждой из них куча кусков типа
И самым простым способом выяснить, что именно происходит при запуске из конкретной формы, является пошаговая отладка.
Поэтому, если нет строгой гарантии, что «все 25-строк, причем явно описывающих компактную операцию, которой можно дать содержательное название» гарантированно будут всегда идентичными во всех точках вызова, то может оказаться лучше сделать копипасту. Некоторые осознают проблему: https://habr.com/ru/post/280099/
Я считаю, что при правильном структурировании размер кода должен уменьшаться, а читаемость и последующая сопровождаемость повышаться. Бывают исключения, но в моей практике такое происходит редко. Тут как с нормализацией таблиц: нормализуй, но в меру - это все интуитивно понятно. Допускаю, что у китайцев и у нас интуиция по разному работает. Но я писал в общем то не про них, а про отечественных говнокодеров. А у 1с куцый язык и вообще проблема с модульностью - трудно там делать расширения и новые подсистемы, все пихается в одну громоздкую конфигурацию. Тут можно понять и простить.
У нас с китайцами чувство красоты разное. Когда нормализация/структуризация происходит по объективным причинам, то национальность программиста неважна. А вот когда выбор определяется только вкусом, то нам неприятно повторение кода, китайцу неприятны лишние (не обусловленные ТЗ) унификации.
Тут согласен. Если нет контроля за качеством кода и сопровождать будет не тот человек, который пишет, то оптимизироваться работа будет под объём закрытых заявок. Впрочем, это не только у отечественных, а везде, где одноразовый код за деньги.
Давно не так. В том-то и проблема. Пока каждый документ жил своей жизнью, код в нём никак не зависел от других документов. Делаешь новый вид документа — копируешь максимально похожий и редактируешь. А теперь (в цитированном примере) есть модуль ПодборНоменклатурыВДокументахКлиент. И все документы, где есть подбор номенклатуры, должны его использовать. Делаешь новый документ с чуть-чуть другим подбором? Либо полный копипаст всего модуля и вычищение мёртвых веток (и повторить этот сизифов труда после каждого обновления), либо в модуле появится ещё дюжина ИначеЕсли в тех местах, где твой документ отличается от предыдущих.
В особо продвинутых местах уже полнофункциональная табличная диспетчеризация, когда заполняется таблица решений по параметрам вызова, а потом проверяется по чему-то типа
Если НайтиПараметр(ТаблицаПараметров, ЭтаФорма, "ЭтоВозврат") Тогда
....
КонецЕсли
А заполнение таблицы решений тоже через дюжину функций. Хорошо, хоть функции не являются первоклассными (куцый язык, да), иначе даже пошаговая отладка бы не спасала.
И «громоздкая конфигурация» ничем не отличается от «громоздкого бинарника» в других языках. При желании и аналог плагинов есть: https://infostart.ru/public/442003/ . Расширение конфигурации — это отдельный файл, модифицирующий выполняемую конфигурацию. Внешние отчёты и обработки ещё в 1С 7.7 были.
К слову, 1С единственная сделала нормальный клиент-сервер для Web с одним языком для backend'а и frontend'а и прозрачным вызовом серверных процедур.
Кстати, есть ещё один момент. Каждый язык программирования должен выполнять свою функцию. И пока у 1С был действительно куцый язык (в 1С 7.7) он отлично выполнял свою функцию: что происходит при проведении любого документа или в любой форме можно было понять в течение 5 минут. А ещё в течение 5 минут добавить то, что просит бухгалтер (новую проводку, исправить проводку, окошко с остатком чего-нибудь, ...).
Современный 1С стал языком общего назначения на уровне Go или Swift. С многопоточностью, клиент-серверной архитектурой, расширенным SQL и полностью динамическими формами. Но отлаживать и модифицировать код стало существенно тяжелее (норматив в часах на одинаковое задание примерно удвоился).
P.S. Shell, PL/SQL и ABAP ещё более куцые, чем 1С. Это им не мешает.
Я 1с не ругаю, у них своя специфика, они молодцы, развивают свой подход. Но расширяемость у них специфическая. Имхо, правильный подход - изначально компоновать систему в виде набора плагинов.
Угу. Микроядерная архитектура. Hurd уже третий десяток лет допилить не могут.
С набором плагинов есть ОГРОМНАЯ проблема: необходим стабильный API между плагинами. В 1С внутренняя структура достаточно радикально переделывается в среднем два раза в год. При этом отваливаются внешние отчёты и обработки, зато не приходится делать многослойный пирог из костылей, как у Микрософт. А разработчика внешних отчётов 1С ничего не обещал: внутренняя структура конфигураций 1С недокументирована и используется на свой страх и риск. Недавно выделили условно стабильное подмножество, назвали Библиотека Стандартных Подсистем. Но там тоже при переходе между любой версией что-то ломается (https://downloads.v8.1c.ru/content/SSL/2_3_5_44/change.htm).
Такая же, как у MacOS Classic, например. Или Smalltalk. Не везде используется подход UNIX.
Я сам занимаюсь доморощенной ORM системой (фактически сделанный на коленке гибрид 1с и Entity Framework). Вроде проблемы с модульностью решили. Ну у нас достаточно хлипкая конструкция для малых и средних предприятий.
Если OpenSource, могу помочь.
Нет, не опен. Написал в личку
вы так говорите как будто "программировать на ассемблере" - это что-то плохое!?
кстати, как раз хорошим погромистам на асме в первую очередь проводятся работы по обобщению, либо выделением в функцию/call/ret,
либо в макросы
PS: на спектруме загнал таки драйвер ESC/P принтера в буфер ZX-принтера иначе игры не влазили, слава CB/ED!.:-)
Да, хороший программист и на ассемблере структурирует программство и это правильно
Страницы