Байден: а шахтеры пусть идут в программисты

Аватар пользователя кухарка

В понедельник на выступлении в Нью-Гэмпшире в ходе предвыборной кампании Джо Байден заявил, что «любой, кто может спуститься в шахту на глубину до 900 метров, уж точно сможет научиться программировать.»

Ниже численность работников угледобывающей промышленности, в тысячах:

Авторство: 
Авторская работа / переводика

Комментарии

Аватар пользователя Itanium
Itanium(6 лет 6 месяцев)

Подтвержу, поскольку у меня была похожая история, но с оговорками. Все это справедливо для возраста 25-35 лет. Потом способности к переобучению с каждым годом падают сильно. Для 45-55 лет это уже почти не реально.

Аватар пользователя Ya
Ya(8 лет 9 месяцев)

Один мой знакомый гуманитарий из преподавателя переквалифицировался в сисадмины. Так он вовремя понял, что без хобби прожить можно, а без денег нет. Но с математикой у него плохо и программистом ему не быть. Так он хотя бы в гуманитарных науках мозг напрягал. А какие скилы качал шахтер? К тому же тем безработным шахтерам наверняка не 27, а за 40.

Аватар пользователя Vereck
Vereck(6 лет 6 месяцев)

Феерично!!!

Это ещё раз доказывает, что не эти выбираемые клоуны правят америкой.

"Пьяный - проспится, а дурак - никогда"

"Но позвольте, как же он служил в очистке?" (с)

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Любителей "китайского" кода неплохо бы в шахтеры переквалифицировать

Аватар пользователя Хмурый ослик
Хмурый ослик(8 лет 7 месяцев)

Китайский код - тоже разный.
Пока не слышал ни об одной аварии по причине сбоев кода в системах управления у них в ракетно-космической отрасли. ДА и - в авиации, кстати, - тоже.
Хотя, по доходящим слухам, там - очень своеобразные языки и подходы к проектированию используются. Я даже произносить боюсь, что услышал. Мейнстрим - просто не поймёт. :)

Комментарий администрации:  
*** отключен (систематические манипуляции и набросы) ***
Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Китайский код - это мем, видимо не на пустом месте возникший, у китайцев все-таки специфический склад ума, из-за иероглифов ихних. А вот откуда берутся наши доморощенные "китайцы"? возможно это не состоявшиеся шахтеры. Выдают, понимаешь, в закрома Родины тысячи тонн словесной руды.

Аватар пользователя monk
monk(12 лет 2 месяца)

Китайский код от европейского отличается только не выполнением требования писать процедуры для повторяющегося кода. Причина, действительно, в китайском языке. Если в русском тексте повторяющиеся слова считаются неприемлемыми (необходимо заменять местоимениями, синонимами, перефразировать), то в инструкции на китайском языке, если написано «левая верхняя кнопка панели управления», значит она так и будет называться во всём тексте, а не превращаться в «левая верхняя кнопка», «та кнопка», «кнопка», «она». И этот же подход используется в программировании. Если кусок кода меньше 5 строк, то он не будет вынесен в функцию, а будет аккуратно скопирован во всех точках вызова. И я даже не могу сказать, что это плохо: каждый кусок программы читается проще, так как нет необходимости через строку ходить в определение функций.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

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

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

макры в таких случаях рулят

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

int main()
{
  int r = 0;
  for(int i = 0; i<=100; i++) r += i;
  printf("%d", r);
}

имеет идентичный код с программой

int main()
{
  printf("%d", 5050);
}

Аватар пользователя Bruno
Bruno(8 лет 9 месяцев)

Идентичный - не код, а результат работы программы.

Функционально идентичным будет матфункция:

r = (100+1)*100/2 

Аватар пользователя monk
monk(12 лет 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

Потому что компилятор вправе вычислить и подставить результат.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

я хз чо там у вас за сайт, я вам реальный objdump реального компиляния выложил

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

Тот сайт тоже компилятор запускает.

Укажите версию своего компилятора и флаги компиляции. Если gcc, то хотя бы -O3 не забыл написать?

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

"-O3 известен также тем, что ломает несколько пакетов. Использование -O3 не рекомендуется"

sapienti sat!

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

Хорошо. Пишите -O2.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

нафейхоа?

ты уже обделался с тем, что якобы компилятор завсегда сделает один код как в твоём примере.

 

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

Я не говорил что всегда, я говорил, что компилятор вправе их сделать идентичными. И при включенной оптимизации современный компилятор сделает.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

два чая этому господину!

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя Bruno
Bruno(8 лет 9 месяцев)

Как гласит легенда, этим господином был Гаусс, когда ещё учился в школе. 

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

у вас ошибка в программе!

--- 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)

 

 

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

Речь не про осмысленность проги, а про то, что не надо заниматься микрооптимизациями, так как компилятор на них всё равно положит и сделает по-своему.

а вот как выглядит реальная программа:

Похоже, её с -O0 собирали... 

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

вообще без -O, намеренно ;-)

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

Вот она и выдала ассемблерный код без оптимизации. Если надо не быстро, а понятно, то подойдёт.

Аватар пользователя monk
monk(12 лет 2 месяца)

Реальный вопрос в том, как программа меняется при изменении требований. И если для европейца неприятен код

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);
}

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

мне тоже неприятен 3 вариант. это как раз case для case ;-)

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

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, читается сложнее.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

огада!

хуа фанфа бу нань!

даже при шести параметрах уже выглядит мягко говоря не очень.

а если учесть, что многие случаи могут совпадать (switch один и тот же для 3 и 5, скажем), то и if и китайский способ идут лесом!

 

и это не говоря уже про гораздо худшую читаемость обоих этих способов против case.

 

знаете, у меня большой опыт с нечитаемыми, write-only ЯП, так что не будем спорить об очевидном.;-)

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

и это не говоря уже про гораздо худшую читаемость обоих этих способов против case.

Вот, собственно, причина, почему есть «китайский код». Почти для любого китайца шесть похожих строчек гораздо легче читаются/понимаются/модифицируются, чем for/switch/case. Для почти любого европейца, наоборот. Если объективно измерять в секундах на прочтение всего алгоритма/внесение изменений при каких-то условиях, то китайский код требует меньше времени. Но требует больше времени, если необходимо исправить ошибку в общем (скопированном) куске.

знаете, у меня большой опыт с нечитаемыми, write-only ЯП 

Читаемость/нечитаемость от ЯП мало зависит. На любом языке можно написать как читаемо, так и нечитаемо.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

> Читаемость/нечитаемость от ЯП мало зависит.

да ладно? ;) расскажите это любителям перловки )))))

 

ну или вот (прога реальная):

 

Q N R,Q,C,D,E,W,B,G,H,S,T,U,V,F,L,P,N,J,A S N=$G(N),Q='N,F=Q+Q,P=F+F,W=$L($T(Q))
 S W=$E(W,Q),S='N_+N,W=W-F*S,L=$G(L),R=$C(Q_F_P),R(F)=$C(F+Q_F),R(P)=$C(W-F) W #
 S T=$E($T(Q+F),F,W\S)_$C(W+S+F) X T S B=$P(T,$C(P_P),F),C=B\(W*W),D=B-(C*W*W)\W
 F G=S-Q:F:S+F+Q S E=B-(C*W*W+(D*W)),H=$E($T(Q),G),@H=$S(@H<S:'Q,Q:N)_@H,T=C_D_E
 F A=Q:Q:W\S S J=$E(T,A),C(F)=$S(J>(F+Q)&(J<(S-F)):Q,Q:+N),C(P)=$S(J#F:Q,Q:+N) D
 .S C(Q)=$S(J<(S-F):+N,Q:Q),C(F+Q)=$S(J>Q&(J<(S-F))&(J'=(P+'L))&(J'=(P)):Q,Q:+N)
 .S H('L)=L F  S H(N?.E)=$O(C(H('$G(N)))) Q:H('+L)=L  S F(A,H('L))=C(H(W[(W\S)))
 F U=Q:Q:P W !,R F V=Q:Q:P+F W $S(F(V,U):'Q,Q:$C(P_(W\S))) W:'(V#F) $C('N_F_F+F)
 W !!,R(F)_C_R(P)_D_R(P)_E_R(F) X $RE($E($T(Q),Q+F,P+Q))_R(P)_'N W # G:N=L Q+F Q
Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

Нечитаемый код можно написать на любом языке. В JS такое получается почти автоматически после минимизации.

(function(t,e,i){function n(i,n,o){var r=e.createElement(i);return n&&(r.id=Z+n),o&&(r.style.cssText=o),t(r)}function o(){return i.innerHeight?i.innerHeight:t(i).height()}function r(e,i){i!==Object(i)&&(i={}),this.cache={},this.el=e,this.value=function(e){var n;return void 0===this.cache[e]&&(n=t(this.el).attr("data-cbox-"+e),void 0!==n?this.cache[e]=n:void 0!==i[e]?this.cache[e]=i[e]:void 0!==X[e]&&(this.cache[e]=X[e])),this.cache[e]},this.get=function(e){var i=this.value(e);return t.isFunction(i)?i.call(this.el,this):i}}function h(t){var e=W.length,i=(A+t)%e;return 0>i?e+i:i}function a(t,e){return Math.round((/%/.test(t)?("x"===e?E.width():o())/100:1)*parseInt(t,10))}function s(t,e){return t.get("photo")||t.get("photoRegex").test(e)}function l(t,e){return t.get("retinaUrl")&&i.devicePixelRatio>1?e.replace(t.get("photoRegex"),t.get("retinaSuffix")):e}function d(t){"contains"in y[0]&&!y[0].contains(t.target)&&t.target!==v[0]&&(t.stopPropagation(),y.focus())}function c(t){c.str!==t&&(y.add(v).removeClass(c.str).addClass(t),c.str=t)}function g(e){A=0,e&&e!==!1&&"nofollow"!==e?(W=t("."+te).filter(function(){var i=t.data(this,Y),n=new r(this,i);return n.get("rel")===e}),A=W.index(_.el),-1===A&&(W=W.add(_.el),A=W.length-1)):W=t(_.el)}function u(i){t(e).trigger(i),ae.triggerHandler(i)}function f(i){var o;if(!G){if(o=t(i).data(Y),_=new r(i,o),g(_.get("rel")),!$){$=q=!0,c(_.get("className")),y.css({visibility:"hidden",display:"block",opacity:""}),I=n(se,"LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden"),b.css({width:"",height:""}).append(I),j=T.height()+k.height()+b.outerHeight(!0)- ...

© https://aftershock.news/sites/default/files/js/js_sf38WSmj7V9dv_tsE9DbX-syh42lsOfTffsj7DV7ZYA.js

 А на MUMPS тоже читабельный код существует: https://github.com/lparenteau/DataBallet/blob/master/r/databallet.m

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

1) после реального мампса ваш якобы нечитаемый жабаскрипт глаз легко разбивает на лексемы и т.п. там надо релаьный obfuscator натравливать чтобы нечитаемо было

2) ваш супер-код нетипичен для практики MUMPS ;-)

3) надо же, GT.M ещё живое и шевелится! :-)

 

кстати, контрольный вопрос - "{" на той же строке что и  командное слово или на следующей? ;-)

if {

или

if

{

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя monk
monk(12 лет 2 месяца)

кстати, контрольный вопрос - "{" на той же строке что и  командное слово или на следующей? ;-)

В Си? Я пишу на той же.

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

я попробую китайцев спросить про это. но это не быстро.

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя Хмурый ослик
Хмурый ослик(8 лет 7 месяцев)

Не ожидайте правдивого ответа.

Комментарий администрации:  
*** отключен (систематические манипуляции и набросы) ***
Аватар пользователя oblomingov
oblomingov(10 лет 8 месяцев)

inline функции

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Имхо, это очень плохо, когда программист не способен (или ленится) обобщить повторяющуюся ситуацию. Потом тяжело с этим месивом разбираться и править. К чему это в структурном программстве? Если хочется хардкора - можно программировать на ассемблере.

Аватар пользователя monk
monk(12 лет 2 месяца)

Не ленятся. Я же пример привёл, почему китайцы так пишут.

Или вот ещё пример: 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 . Зато всё обобщено, да.

Аватар пользователя oblomingov
oblomingov(10 лет 8 месяцев)

если только им зарплату за количество строк платят )

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Это все простенькие какие-то примерчики. Я на практике совершенно с другими вещами сталкиваюсь, когда многократно копипастятся не пять, а все 25-строк, причем явно описывающих компактную операцию, которой можно дать содержательное название. И это делается в нескольких однотипных классах, раскиданных по проекту. А потом варяг, слепивший эту лабудень, исчезает в тумане и приходится в этом разбираться.

Аватар пользователя monk
monk(12 лет 2 месяца)

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

Теперь программистов у 1С стало больше и код они переписали под новую моду. И теперь вместо куска в 25 строк, открывающем форму подбора (с параметрами) стоит

ПодборНоменклатурыВДокументахКлиент.ОткрытьПодбор(ЭтотОбъект, ИмяТабличнойЧасти, ПараметрыОткрытияПодбора[ИмяТабличнойЧасти]);

В этой функции содержимое типа

    ЗаполнитьВидОперацииДокумента(ФормаВладелец, ПараметрыПодбора);
    ЗаполнитьПараметрыВидимостиНаборовКомплектов(ФормаВладелец, ПолноеИмяФормыПодбора, ПараметрыПодбора);
    ЗаполнитьПараметрВалютаДокумента(ФормаВладелец, ПараметрыПодбора);
    ЗаполнитьПараметрСтруктурнаяЕдиница(ФормаВладелец, ПараметрыПодбора);
    ЗаполнитьПараметрыНалогооблаженияДокумента(ФормаВладелец, ПараметрыПодбора);
    ЗаполнитьТипыНоменклатуры(ФормаВладелец, ИмяТабличнойЧасти, ПараметрыПодбора);
    ЗаполнитьВидыЦен(ФормаВладелец, ПолноеИмяФормыПодбора, ПараметрыПодбора);
    ЗаполнитьВидСкидкиНаценки(ФормаВладелец, ПолноеИмяФормыПодбора, ПараметрыПодбора);
    ЗаполнитьДополнительныеПараметры(ФормаВладелец, ПараметрыПодбора);
    ЗаполнитьДисконтнуюКарту(ФормаВладелец, ПолноеИмяФормыПодбора, ПараметрыПодбора);

А в каждой из них куча кусков типа

    Если ФормаВладелец.ИмяФормы = "Документ.ЧекККМ.Форма.ФормаДокумента" 
        ИЛИ ФормаВладелец.ИмяФормы = "Документ.ЧекККМ.Форма.ФормаДокумента_РМК" Тогда
        
        ПараметрыПодбора.Вставить("ЭтоЧекККМ", Истина);
        
    ИначеЕсли (ФормаВладелец.ИмяФормы = "Документ.ПриходнаяНакладная.Форма.ФормаДокумента"
        И ФормаВладелец.Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПриходнаяНакладная.ВозвратОтПокупателя"))
        ИЛИ (ФормаВладелец.ИмяФормы = "Документ.РасходнаяНакладная.Форма.ФормаДокумента"
        И ФормаВладелец.Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийРасходнаяНакладная.ВозвратПоставщику")) Тогда
        
        ПараметрыПодбора.Вставить("ЭтоВозврат", Истина);
        
    ИначеЕсли (ФормаВладелец.ИмяФормы = "Документ.ПересортицаЗапасов.Форма.ФормаДокумента") Тогда
        
        ПараметрыПодбора.Вставить("ПоказыватьНаборыКомплекты", Ложь);
        
    КонецЕсли;
 

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

Поэтому, если нет строгой гарантии, что «все 25-строк, причем явно описывающих компактную операцию, которой можно дать содержательное название» гарантированно будут всегда идентичными во всех точках вызова, то может оказаться лучше сделать копипасту. Некоторые осознают проблему: https://habr.com/ru/post/280099/

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Я считаю, что при правильном структурировании размер кода должен уменьшаться, а читаемость и последующая сопровождаемость повышаться. Бывают исключения, но в моей практике такое происходит редко. Тут как с нормализацией таблиц: нормализуй, но в меру - это все интуитивно понятно. Допускаю, что у китайцев и у нас интуиция по разному работает. Но я писал в общем то не про них, а про отечественных говнокодеров. А у 1с куцый язык и вообще проблема с модульностью - трудно там делать расширения и новые подсистемы, все пихается в одну громоздкую конфигурацию. Тут можно понять и простить.

Аватар пользователя monk
monk(12 лет 2 месяца)

 Тут как с нормализацией таблиц: нормализуй, но в меру - это все интуитивно понятно. Допускаю, что у китайцев и у нас интуиция по разному работает.

У нас с китайцами чувство красоты разное. Когда нормализация/структуризация происходит по объективным причинам, то национальность программиста неважна. А вот когда выбор определяется  только вкусом, то нам неприятно повторение кода, китайцу неприятны лишние (не обусловленные ТЗ) унификации.

Но я писал в общем то не про них, а про отечественных говнокодеров.

Тут согласен. Если нет контроля за качеством кода и сопровождать будет не тот человек, который пишет, то оптимизироваться работа будет под объём закрытых заявок. Впрочем, это не только у отечественных, а везде, где одноразовый код за деньги.

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

Давно не так. В том-то и проблема. Пока каждый документ жил своей жизнью, код в нём никак не зависел от других документов. Делаешь новый вид документа — копируешь максимально похожий и редактируешь. А теперь (в цитированном примере) есть модуль ПодборНоменклатурыВДокументахКлиент. И все документы, где есть подбор номенклатуры, должны его использовать. Делаешь новый документ с чуть-чуть другим подбором? Либо полный копипаст всего модуля и вычищение мёртвых веток (и повторить этот сизифов труда после каждого обновления), либо в модуле появится ещё дюжина ИначеЕсли в тех местах, где твой документ отличается от предыдущих.

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

Если НайтиПараметр(ТаблицаПараметров, ЭтаФорма, "ЭтоВозврат") Тогда
   ....
КонецЕсли

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

И «громоздкая конфигурация» ничем не отличается от «громоздкого бинарника» в других языках. При желании и аналог плагинов есть: https://infostart.ru/public/442003/ . Расширение конфигурации — это отдельный файл, модифицирующий выполняемую конфигурацию. Внешние отчёты и обработки ещё в 1С 7.7 были.

К слову, 1С единственная сделала нормальный клиент-сервер для Web с одним языком для backend'а и frontend'а и прозрачным вызовом серверных процедур.

Аватар пользователя monk
monk(12 лет 2 месяца)

у 1с куцый язык

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

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

P.S. Shell, PL/SQL и ABAP ещё более куцые, чем 1С. Это им не мешает.

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

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

Аватар пользователя monk
monk(12 лет 2 месяца)

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

Угу. Микроядерная архитектура. Hurd уже третий десяток лет допилить не могут.

С набором плагинов есть ОГРОМНАЯ проблема: необходим стабильный API между плагинами. В 1С внутренняя структура достаточно радикально переделывается в среднем два раза в год. При этом отваливаются внешние отчёты и обработки, зато не приходится делать многослойный пирог из костылей, как у Микрософт. А разработчика внешних отчётов 1С ничего не обещал: внутренняя структура конфигураций 1С недокументирована и используется на свой страх и риск. Недавно выделили условно стабильное подмножество, назвали Библиотека Стандартных Подсистем. Но там тоже при переходе между любой версией что-то ломается (https://downloads.v8.1c.ru/content/SSL/2_3_5_44/change.htm).

Но расширяемость у них специфическая.

Такая же, как у MacOS Classic, например. Или Smalltalk. Не везде используется подход UNIX.

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Я сам занимаюсь доморощенной ORM системой (фактически сделанный на коленке гибрид 1с и Entity Framework). Вроде проблемы с модульностью решили. Ну у нас достаточно хлипкая конструкция для малых и средних предприятий.

Аватар пользователя monk
monk(12 лет 2 месяца)

Если OpenSource, могу помочь.

Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Нет, не опен. Написал в личку

Аватар пользователя mumpster
mumpster(5 лет 4 месяца)

вы так говорите как будто "программировать на ассемблере" - это что-то плохое!?
кстати, как раз хорошим погромистам на асме  в первую очередь проводятся работы по обобщению, либо выделением в функцию/call/ret,

либо в макросы

PS: на спектруме загнал таки драйвер ESC/P принтера в буфер ZX-принтера иначе игры не влазили, слава CB/ED!.:-)

Комментарий администрации:  
*** Уличен в пустословии и клевете ***
Аватар пользователя CatOwner
CatOwner(6 лет 8 месяцев)

Да, хороший программист и на ассемблере структурирует программство и это правильно

Страницы