LINUX.ORG.RU

Сколько зарабатывает Pascal программист?

 , , ,


6

6

Здравствуйте. Я хочу узнать сколько можно заработать в 2022 году, зная Object Pascal и почему он не стал мейнстримным языком программирования. Почему он только изучается в школах и почему именно Pascal

Ответ на: комментарий от soomrack

А все потому что count внутри цикла это новая переменная.

Нет не новая.

count = range(4)
for k in count:
    count = [0]
print(count)
[0]

Просто значение переменной в цикле for читается один раз при запуске цикла. И как раз в этом примере от замены на list(range(4)) ничего не меняется.

Можно трактовать for k in count как

for(ik=count.begin(); ik; ik.next())
{
  k = *ik;
  ...
  // здесь может быть count = ...;
}

и здесь тоже абсолютно не важно, как count меняется внутри цикла.

monk ★★★★★
()
Ответ на: комментарий от byko3y

Да хотя бы производные ML.

Лисп — c 1958 по 1984

ML — 1974, первый компилятор в 1980

Они практически не пересекались. Там скорее Си убил ML.

monk ★★★★★
()
Ответ на: комментарий от monk

Зато расширяемо в любую сторону

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

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

т.к. базу например нельзя сменить никак, она встроенная

А потом заказчик говорит, что хочет её хранить не в формате libdb, а в формате libsqlite. И всё равно всё переписывать.

monk ★★★★★
()
Ответ на: комментарий от slackwarrior

А неквалифицированный никогда не нужен :)

Если бы было так, то все всё писали бы на APL и Си++. Но почти везде выгоднее нанять неквалифицированного за гораздо меньшие деньги и посадить писать на Java/VB/Python.

monk ★★★★★
()
Ответ на: комментарий от monk

выгоднее нанять неквалифицированного

Ты спроси чуваков, которые этим руководят :) узнаешь много внезапного про «миссию делания мира лудшэ», много ахинеи про процессы и стандарты качества (которые ок, но... не бьются с тем что обнаруживается на проде), неуклонное соблюдение бестпрактисов (то что выхлоп говно — никто не объяснит, пока им не покажет чувак в теме и докажет что их код не ок, а это легко сделать, когда им надо новый функционал, а они уперлись в лимиты платформы, о которых... их архитекторы с бэкграундом в жабе и дотнете, авторы того что на проде, тупо не очень в курсе) и кто создает велью (программисты его не создают, его создают ПМы :) Наличие одних жуниаров за опыт на проекте предполагает «в идеальном мире» что за выхлоп отвечают курирующие их квалифицированные чуваки (желание ссыкономить нигде не упоминается, жуниаров могут даже не светить заказчикам, а ПМы могут «хотеть сосредоточиться на управлении», а не мозолить глаза об код нубов, «работает и ладно»). Т.е. неквалифицированные набиратели текстов — это типа «щупальца» менеджеров проектами. То что это хуцпа и у них тупо нет времени на то чтоб делать нормально они тебе никогда не скажут :) ну а на выходе как правило будет стыдобушка, которую раньше называли «сырой альфой», потом «POC» (пруф концепта), теперь — MVP (минимально жизнеспособный продукт). Это тупо наживка для клиента, которую в нормальном процессе раньше писали под песни «это прототип, непременно выкинем в помойку и сделаем как надо». Теперь «как надо» понимают после выхода в прод, поэтому переписывание неизбежно, а этим занимаются уже не нубы :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от monk

Или не пришлось, т.к. платформа — лидер волшебного квадранта Gartner для CRM :) и в Северной Америкашке она тупо у всех. И даже в Еврашке у многих, и даже наши, когда заходили на ихний рыночек покупали эту же платформу, чтоб бесшовно интегрироваться, а не пилили какой-то лютый самопал.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

Или не пришлось, т.к. платформа — лидер волшебного квадранта Gartner для CRM :) и в Северной Америкашке она тупо у всех.

Всякое бывает. Вдруг в штаб-квартиру владельца платформы метеорит упадёт. Или просто обанкротится.

monk ★★★★★
()
Ответ на: комментарий от slackwarrior

Это тупо наживка для клиента, которую в нормальном процессе раньше писали под песни «это прототип, непременно выкинем в помойку и сделаем как надо». Теперь «как надо» понимают после выхода в прод, поэтому переписывание неизбежно, а этим занимаются уже не нубы

И вот эти ритуалы про ООП, бест-практисы и прочее из-за того, что хотят сэкономить и не выкидывать прототип, а «расширить».

monk ★★★★★
()
Ответ на: комментарий от monk

Проблема в том, что он не перебирает элементы списка, он идет по ИНДЕКСУ списка, т.е. делает то самое for(k=0;k<max;k++) в итоге получается обман программиста с этим «for in»:

    count = [0, 1, 2, 3]
    for k in count:
        count.pop(0)  # удаляем данные, которые обработали и которые больше не нужны
        print(f"{k} {k in count}")

И внезапно получаем не четыре строчки вывода, а две:

    0 False
    2 True

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

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 6)
Ответ на: комментарий от soomrack

Проблема в том, что он не перебирает элементы списка

Перебирает. Только не списка, а массива.

int main()
{
        std::vector count = {0, 1, 2, 3};
        for(auto i = count.begin(); i!= count.end(); i++) {
                auto k = *i;
                count.erase(count.begin());
                cout << k << endl;
        }
}

Те же 0 и 2.

monk ★★★★★
()
Ответ на: комментарий от monk

О чем и речь. А формально в питоне это называют список. Список!

И если в С++ для std::vector программисту понятно, что он работает с массивом и перебирает его индекс, то в питоне, программист ожидает перебор по списку. Сделай так же в С++ с std::list и будет то, что нужно, а не вот это вот все.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от soomrack

О чем и речь. А формально в питоне это называют список. Список!

Это на самом деле https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html .

Так как там есть отдельно https://docs.python.org/3/library/array.html , то этот назвали списком.

monk ★★★★★
()
Ответ на: комментарий от monk

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

Потому что список элементов — математическое понятие, а не реализация.

monk ★★★★★
()
Ответ на: комментарий от monk

Ну вот потому, что они называют вещи не тем, чем они являются, поэтому и невозможно учить хорошему программированию на питоне.

Согласись, мой пример же вполне нормальный, в цикле хотим обработать данные и в процессе обработки выкидывать, те, которые уже не нужны. По смыслу синтаксиса вроде все правильно написано, а по факту оно работает не так, как должно, потому что список это не список.

soomrack ★★★★★
()
Ответ на: комментарий от monk

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

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

в цикле хотим обработать данные и в процессе обработки выкидывать, те, которые уже не нужны

Нет. Изменять объект, от которого взят итератор, нельзя — это неопределённое поведение.

monk ★★★★★
()
Ответ на: комментарий от monk

Нет. Изменять объект, от которого взят итератор, нельзя — это неопределённое поведение.

А где тут итератор в записи? Он скрыт, его не видно. Тут тупо написано, что для элементов из count делать то-то. И из-за этого синтаксиса различие между while и for размывается.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Список это вполне себе четко определенная структура данных.

Какая именно? В лиспе это односвязный список, в Си++ двусвязный список, в питоне список на основе массива.

На каком основании считаешь вариант Си++ единственно верным? А ассоциативный массив обязан быть красно-чёрным деревом и никак иначе?

monk ★★★★★
()
Ответ на: комментарий от soomrack

А где тут итератор в записи? Он скрыт, его не видно.

Также как в аналогичной for(i : count). Там, кстати, спецэффекты веселее:

int main()
{
        int var[10];
        std::vector count = {0, 1, 2, 3};
        for(auto i : count) {
                count.erase(count.begin());
                cout << i << endl;
        }
}
0
2
3
3
monk ★★★★★
()
Ответ на: комментарий от monk

На основе терминологии теории алгоритмов.

Если нет уточнения, то под списком обычно подразумевают односвязный список. Непустой список имеет начальный элемент, каждый элемент списка имеет ссылку на следующий элемент, если он не является последним. Для этой структуры определены операции доступа к элементами: get_head(), get_next(), операции добавления и удаления: pop() – удаление головы, push(item) – добавление новой головы, item.push() – добавление после item, item.del_next() – удаление после item. Названия методов не фиксированы, но pop и push являются клише.

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

soomrack ★★★★★
()
Ответ на: комментарий от monk

Укорачивание кода подобно этому for(auto i : count) { я рекомендую не использовать, т.к. оно делает код сильно менее ясным. И в отличие от питона, это дополнительная функциональность с++, а не базовая, чтобы начать ее использовать нужно доучиться до STL, соотв. к этому времени ребята уже имеют довольно много знаний, чтобы разбираться с такими штуками. В питон с его for in это фактически первое занятие по программированию.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

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

А в Си++ std::list двусвязный. Тогда это тоже негодный язык. Преподавай Лисп.

monk ★★★★★
()
Ответ на: комментарий от monk

А в Си++ std::list двусвязный. Тогда это тоже негодный язык. Преподавай Лисп.

В С std:list это список, двусвязный список, не массив. Соотв. если про него рассказываю, то так и говорю, это двусвязный список, вот его методы. Все нормально, все понятно.

А в питоне нам говорят, вот это список. А это не список, и не какая-то модификация списка, это какая-то хрень, которая ведет себя то как список, то как массив.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

это дополнительная функциональность с++, а не базовая

Для C++20 это скорее базовая. Также как STL и умные указатели.

В питон с его for in это фактически первое занятие по программированию.

Так сборщик мусора и REPL в Си++ прикрутить – это вообще доп.занятия. А в питоне тоже сразу.

monk ★★★★★
()
Ответ на: комментарий от soomrack

А это не список, и не какая-то модификация списка

Я же ссылку дал: «In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list

monk ★★★★★
()
Ответ на: комментарий от monk

Для C++20 это скорее базовая. Также как STL и умные указатели.

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

В питоне игнорировать не получается, т.к. for in это базовая конструкция, которую начинают использовать с первых занятий, для основных типов данных.

soomrack ★★★★★
()
Ответ на: комментарий от monk

Я же ссылку дал

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

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 2)
Ответ на: комментарий от soomrack

это изменить его базовое поведение, продолжая называть это списком

спи́сок (англ. list) — это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза

Термином список также называется несколько конкретных структур данных, применяющихся при реализации абстрактных списков.

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

monk ★★★★★
()
Ответ на: комментарий от soomrack

Всё аналогично сборке мусора. В Си++ начинаем с ручного delete, потом умные указатели, потом сборка мусора. В питоне первые два шага невозможны. С другой стороны, для программиста не всегда надо знать, как именно сборка мусора или перебор элементов итератора устроен. В SQL вообще базовая операция «отобрать по условию и объединить таблицы».

monk ★★★★★
()
Ответ на: комментарий от monk

спи́сок (англ. list) — это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза

Ты это определение в каком-то странном месте взял. То же самое можно сказать и про массив, и про дерево, и про кучу других структур. Открой Кнута, например, его энциклопедию часто используют за основу или другие фундаментальные книги по теории алгоритмов.

soomrack ★★★★★
()
Ответ на: комментарий от monk

Причем тут сборка мусора? Я тебе говорю о неожиданном поведении конструкции языка, которую учащиеся видят на первом занятии. Я тебе говорю о том, что в питоне используют названия типов, которые не соответствуют сложившейся терминологии в фундаментальной и инженерной науке, информатике, теории алгоритмов, computer science, которые не соответствуют терминологии наиболее уважаемых учебников по программированию, используемых во всем мире уже не один десяток лет.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

А в питоне нам говорят, вот это список. А это не список, и не какая-то модификация списка, это какая-то хрень, которая ведет себя то как список, то как массив.

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

bread
()
Ответ на: комментарий от bread

Эта хрень является объектом, к которому есть разные интерфейсы.

Которые хрен пойми как и когда неявно используются.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Википедия же. В том числе англоязычная.

То же самое можно сказать и про массив, и про дерево, и про кучу других структур.

Массив является реализацией списка. Дерево не является упорядоченным списком элементов: порядок задаётся алгоритмом обхода.

monk ★★★★★
()
Ответ на: комментарий от bread

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

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

Так и учившиеся на Питоне привыкнут, что в других языках список называют где-то массивом, где-то вектором, а списком называют деку.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от soomrack

Довольно не просто используются. Обьект может быть иттерирумым или нет. Если иттерирумый то в определенной ситуации (for x in thing) обьект thing возвращает нечто(иттератор так понимаю, но иногда и генератор). Вот - ты про это говоришь. И это не очень сходу так понятно что и как оно там возвращает.

nionio35
()
Ответ на: комментарий от monk

Википедия тут выглядит печально. Впрочем, в ней правильно смотреть на «linked list» https://en.wikipedia.org/wiki/Linked_list то определение, которое ты привел, это не математическое определение, соотв. к информатике отношения не имеет.

Массив не является реализацией списка. Массив это структура данных в которой все элементы последовательно пронумерованы целыми числами (без пропусков) и есть доступ по номеру. Соотв. операции добавления, удаления, доступа к элементам осуществляются по этому номеру, т.е. по индексу.

Список можно реализовать на массиве, массив можно реализовать на списке.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Если хочется подводить общую базу, то лучше использовать математический термин «множество». Тогда можно определить и список, и массив, как множество, на котором заданы конкретные операции, и каждый элемент имеет конкретный вид (в случае связанного списка это [данные, ссылка на след. элемент], в случае массива это [данные, уникальный номер элемента])…

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

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от soomrack

Которые хрен пойми как и когда неявно используются.

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

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от soomrack

Тогда можно определить и список, и массив, как множество, на котором заданы конкретные операции

Абстрактные типы данных так и определяются.

monk ★★★★★
()
Ответ на: комментарий от monk

https://xlinux.nist.gov/dads/HTML/list.html

LIST: A collection of items accessible one after another beginning at the head and ending at the tail.

Как определения АТД list это звучит гораздо лучше, хотя не учитывает вариант закольцевания.

https://xlinux.nist.gov/dads/HTML/linkedList.html

LINKED LIST: A list implemented by each item having a link to the next item.

В сумме получается очень неплохое определение. Можно его давать, если математической строгости не нужно.

То определение из википедии, ничего не определяет, оно не позволяет отличить список от массива или от упорядоченного множества, оно не говорит о методах доступа к данных. Оно также не является и строгим математическим определением, от которого можно было бы выстраивать теорию и практику. Это просто словоблудие характерное для любителей давать максимально общие (и потому абсолютно бессмысленные) определения, тем самым потешая свое честолюбие от кажущейся всеобъемлющей широты мысли. Извини, просто это реально поперек горла стоит.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.