Как НЕ надо начинать изучать программирование

Приветствую, Хабровцы!

Решил поделиться своим опытом «успешного» изучения языка(ов) программирования.

Не сказать, что в IT-индустрии я полный профан, однако мой план обучения «стать IT developer-ом» — с треском пошел по швам.

Немного предыстории.

Сразу скажу, что целенаправленного обучения по компьютерным наукам я не проходил. Да и специализация в образовании у меня далеко не техническая. Работал с 2005г. по 2012г. в различных компаниях, и мелких и крупных, непосредственно связанных с IT-индустрией. Научился всему понемногу: сис. администрированию Windows (даже MCP, MCSA успел получить), немного поюзал VMware (VCP тоже в копилке), дополнительно изучил разную кучу программ, которые сис. админы как правило используют в своей ежедневной работе.
Попробовал себя в корпоративных продажах, кстати, неплохо получалось. Успел поработать немного и у дистрибьютора ПО, а также в компаниях-интеграторах, неплохо разобрался в политиках лицензирования ПО. Планировал стать Project manager-ом, даже начал изучать PMBOK, тайм-менеджмент, различные международные стандарты, типа ISO, Tier, и даже замахнулся на PCI DSS.

Но в определенный момент перегорел, и все бросил. Ушел так сказать в отпуск на 8 лет.
После долгого анализа, все-таки созрел и осознал, что пора валить на запад, и желательно поближе к кремниевой долине, т.к. с английским более менее нормально, можно подтянуться до необходимого уровня.

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

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

Тем более, как-то давно я хотел обучиться программированию и специализироваться по SAP направлению. Был выбран путь самостоятельного изучения основ, языка ABAP, но как-то забросил это дело. Не помню уже по какой причине, кажется из-за сложности в понимании.

Теперь сама история, поехали…

Так вот, спустя 8 лет отдыха от IT в целом, принялся изучать заокеанский рынок труда и решил для начала специализироваться в мобильной разработке. Погуглив языки программирования для мобильных приложений и вдохновившись, что Google официально анонсировала язык Kotlin как приоритетный язык для android-приложении, твердо решил максимум за 1 год самостоятельно выучить Kotlin и строить планы по иммиграции на ПМЖ в США.

Пару недель просмотра тренингов и чтения мануалов мне хватило, чтобы убедиться, что без знаний Java в Kotlin делать нечего. Хотя на просторах интернета многие твердят что можно выучить с нуля. А после регистрации на GitHub-е, установки IntelliJ IDEA, JDK и попытки разобраться в коде я уже начал осознавать что придется учиться очень-очень долго и упорно.
Было принято решение отложить Kotlin пока что в сторону, и углубиться в язык java. Так и сделал. Эх, помнится в мое время java был еще SUN-овским детищем.

Быстро переключился на Java без сожаления, т.к. и мануалов больше для самостоятельного изучения и вакансии для Java-разработчиков намного больше. Правда не определился с чего стартануть будет лучше: с Java, либо все-таки переключаться на JS, ну да ладно, думал походу разберусь. На форумах где-то читал, что с JS войти в мир разработки намного легче и быстрее.
Приступил к изучению Java стандартно, прочитав гору статей и просмотрев кучу видео «Как стать Java программистом». Скачал книгу Брюса Эккеля «Философия Java», по рекомендациям многих на форумах, как самый правильный старт изучения языка новичкам.

Так вот скажу вам честно, она нисколько не для новичков.

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

Что-ж, выбора нет. Опять читаю кучу информации, сотни просмотров видео разной тематики о языке С. Качаю книгу Кернигана и Ричи «Язык С», приступаю к изучению, усвояемость уже получше чем в Java, так сказать около 50-60%, что вовсе не радует меня.

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

Однако такие заголовки в книге как:
«Настоящая книга не является вводным курсом в программирование; она предполагает определенное знакомство с основными понятиями программирования такими как переменные, операторы присваивания, циклы, функции»
или:
«предполагается рабочее владение основными элементами программирования; здесь не объясняется, что такое ЭВМ или компилятор, не поясняется смысл выражений типа N=N+1»
а также такие фразы как:
Символические константы.
и т.д.
постепенно подводили меня к тому, что без изучения Computer Science мне не обойтись.
Параллельно начинаю вникать в Computer Sciense, качаю опять-таки тонны книг. Регистрируюсь на Гарвардский курс CS50, приступаю к изучению основ программирования, внимательно читаю книгу Владстона Феррейра Фило «Теоретический минимум по Computer Science».

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

И если в двоичном коде, переменных, функциях, циклах, компиляторе, интерпретаторе, простых уравнениях и т.д. я еще более менее разобрался, то выражение типа N=N+1 и более сложные уравнения меня загоняли в легкий ступор.

Я долго вникал почему 0 в степени 0 равен 1, и у меня ощущение что я до конца так и не понял всей сути.

А вот эта задача меня вообще заставила остановиться на чтении книги по CS, т.к. чем дальше читал, тем сложнее уже шли уравнения и задачи:



Пришлось гуглить про квадратные уравнения, как написано в книге и вникать в дискриминанты. Ну забыл, подумал я, алгебру, с кем не бывает. Однако я так и не смог решить самостоятельно задачу, пришлось обращаться за помощью к школьному преподавателю ребенка по математике.

Решение то получил, однако понять, как преподаватель решила не смог:





На мой вопрос: «как решаются такие уравнения?», ответ был очень прост:
«учи исследование функции, начало анализа и задачи на оптимизацию. Алгебра 10-11 класс».
Ну думаю, ок, посмотрю пару видео-примеров для школьников в youtube, пойму как решать их, и дальше буду «глокать» изучение по CS.

И вот после просмотра подобных роликов по алгебре меня осенило…

www.youtube.com/watch?v=RbX_QHxu7Lg
www.youtube.com/watch?v=FVSG7Neopuo

Я не то что не помню, как решаются такие задачи, — я элементарно, как выяснилось, попросту не знаю Алгебру за 10-11 класс!

Такие выражения как: пределы, математическое мышление, экстремум, производные, многочлены и т.д. для меня оказались как речь на языке племени Майя.

Наверное, мои познания математики остались на уровне уроков математики 5-6 классов.

Начинаю осознавать, что для полной картины понимания Computer Science, мне необходимо будет заново учить алгебру, а затем и ВысшМат. Не исключаю, что походу скорее всего, появится необходимость и повторения уроков физики и еще чего-то из школьной программы. И до реального изучения Java и JS мне понадобится лет 5 изучения алгебры и высшей математики.
До Марса и обратно быстрее долететь, всего то 1,5 года, как утверждают ученые…

Так вот, проанализировав прошедший месяц-полтора самостоятельного обучения, для меня стало очевидно, что я как «хомяк в колесе», вроде как бы и бегу (учусь), а по факту стою на месте. Знаний в программировании не прибавилось, разве что программку на С языке («Hello, world») смогу запустить.
Да еще и после свалившейся тонны новой информации в мой маленький мозг, он кажется вообще ушел в «shut down», и категорически отказывается воспринимать новую информацию.
Алгоритм, построенный мной для изучения программирования, дал сбой практически в самом начале.
Стало понятно что надо пересмотреть свой план обучения и подход к нему.
Однако пока не до конца ясно представляю себе картину, и с какой стороны вообще теперь подходить к обретению профессии «Java-developer», ибо стандартный пусть обучения, с основ алгебры и высшмата, будет очень долгим и не подходит в моем случае.

И вот тут-то мне стало уже совсем как-то грустно.

Неужели чтобы стать программистом без технической базы, требуется так много времени?
Меня конечно вдохновляют статьи в интернете, где люди пишут, что за 1,5 года стали Java developer-ом и уехали в Германию, Канаду, США, однако оценивая свои печальный опыт я не уверен что такое возможно.

Или все-таки это не моё? И профессия «разработчик» — это для элиты, «касты особенных людей»?

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

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

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

Заранее благодарю!
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 827

    +12
    В список самых высокооплачиваемых профессий, для тех кто не любит математику, программирование не входит:
    www.businessinsider.com/high-paying-jobs-for-people-who-hate-math-2014-11
      +46
      Чтоб формошлёпить на мобилках последнее что нужно — это математика. Автор слишком увлёкся археологией.
        +4

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

          +14

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


          выражение типа N=N+1 и более сложные уравнения меня загоняли в легкий ступор

          Это не уравнение. Это команда машине увеличить переменную N на единицу. То есть конкретно этот пример может работать как счетчик.


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

            –7
            зачем ему бейсик и паскаль?
            нужно решать задачки на java или котлин, хотя котлин без java все же сложноват. Математику(leetcode) можно делать после освоения языка. Язык осваивается в виде сделаных 5-10 проектов. В большинстве случаев достаточно изучения web сервисов. Ну либо смотреть проекты на андроиде. Для начала написать hello world, потом добавить логику потом бд дальше сходить на собеседование(устроитья не цель, но если возьмут это круто) — узнать что спрашивают и двигаться в этом направлении.
            Не плохой вариант javarush как-раз чтобы голова не болела, что делать. Но полностью к собеседованию не готовит. Как варик можно курсы от jetbrains, правда только присматривался, вроде не плохие, но лично не пробовал.
              +1

              Основы программирования на паскале изучаются в школе. Думаю, обычный школьный репетитор по информатике не сможет помочь с решением задачек на java.
              По моим школьным воспоминаниям, в паскале более или менее легко разобраться. Соответственно, можно быстрее попробовать себя в более осознанном программировании, чем "Hello, World!"

                +1
                Сейчас в школе или паскаль, или питон обычно.
                Учить java первым языком — глупая затея. С одной стороны это слишком низкоуровнево, с другой стороны много концепций приходится объяснять сразу. У меня был буквально один урок, когда школьница попросила её обучить джаве. И на том моменте, когда для чтения числа с клавиатуры нужно сделать обёртку из буфферизованного потока, а потом из ридера, я понял, что затея провальная.
                И это мы ещё опускаем заклинания public static void main (но они не только в джаве, конечно). Даже на плюсах проще стартовать, имхо.
                  0

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

                  0
                  сейчас паскаль на питон заменили
                    0

                    Да, сам недавно узнал. В мое-то время учились основам программирования на черепашке и паскале

                      0
                      А черепашка тоже в python переехала. (:
                        0

                        Ну, это все тот же вперед-влево-вправо. Разве что на английском

                        0

                        Видел у К.Ю.Полякова робота для браузера с возможностью выбора языка из Python, JS, PHP, Dart, Lua. Ну и там еще прикручен редактор blockly для визуального конструирования.

                  +7

                  Школьная алгебра нужна для того чтобы научить:
                  1) Точно выражать свои мысли (чтобы задача вообще была решена)
                  2) Оформлять их в строгой нотации (чтобы код скомпилировался)
                  3) Преобразовывать выражения из одной формы в другую без потери смысла (чтобы рефакторить)


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

                +6
                Даже «формошлепить» математика нужна будет. Иногда весьма интесивная… И статистика и методы оптимизации и алгебра всяческая. А ещё неплохо бы изучить физиологию восприятия и промышленный дизайн(для качественного формошлепства). Конечно дорогу осилит идущий и полюбить можно и после свадьбы, но лучше все таки по любви.

                  +9
                  Конечно дорогу осилит идущий и полюбить можно после свадьбы...

                  — Знаешь, как называется любовь за деньги?
                  — Продакшен, как же ещё! :)

                    +1
                    Интенсивная, но не вся. Стереометрия вам не понадобится пока вы не займётесь 3D. Интегралы/Дифференциалы же я живьём в рабочих проектах не видел.
                      +3
                      Ну а мне встречались. И всем кто занимается графикой тоже. Ну например:
                      en.m.wikipedia.org/wiki/Summed-area_table
                      Фильтры всякие, антиалиасинг…
                      Всегда можно обойтись без чего либо или выучить когда понадобится, но лучше все таки знать, чтобы хорошо делать работу
                        –2
                        К слову, summed area table не содержит Интегралов/Дифференциалов нигде, кроме 2го названия: «Integral Image»
                          +5
                          К слову это дискретный аналог интеграла или просто — дискретный интеграл.
                          И допускает обратную операцию дифференцирования. А еще у него есть много интересных свойств:

                          www.sfu.ca/math-coursenotes/Math%20158%20Course%20Notes/sec_VolumeAvgHeight.html
                          Добавлю еще. Метод позволяет быстро посчитать среднее значение на интервалах, что равносильно свертке с прямоугольной функцией, которая в свою очередь позволяет быстро найти приближение к свертке с гауссианом любой ширины(согласно предельной теореме) :)
                        +4
                        как примеры:
                        Smoothed particles hydrodynamics- гидродинамика сглаженных частиц. применяется в GameDev-е для визуализации потоков жидкости и физики. Там диф-уры в частных производных в интегральной форме записи решаются.
                        Твердотельное моделирование (Компас-3D, SolidWorks, T-Flex etc.)- всякие огибающие и поиск точек касания- дифференциалов хоть отбавляй.
                        ЧПУ- если управлять «рукой» типа Куки- то там тоже дифференциальной геометрии с полярными координатами по самые помидоры. Гексапод без этой ерунды тоже ногами ровно дергать не сможет.
                          +12
                          Не все разработчики работают с 3D (по-моему, вообще — меньшая часть). Я, как iOS разработчик, и из чистой математики за пределами алгебры ничего не встречал. Самый же полезный навык — понимание алгоритмической сложности.

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

                          В общем не хотите учить математику — идите в iOS разработку, тут вам ничего кроме геометрии не понадобится…
                          +1
                          > Дифференциалы
                          Вообще любая динамика, не обязательно в играх — тупо нормальная модель динамики спроса (но в итоге её всё равно к линейной приводят)…
                          +3
                          Угу и всего этого не знает почти никто судя по интерфейсам и рынку труда.
                            –1

                            А где там статистика может быть нужна?

                              +1

                              Навскидку — для A/B тестирования

                            +5

                            Мне тоже так казалось до того как я попробовал обучить программированию своего брата. Выяснилось, что кроме умения читать книжки (о программировании) нужно ещё уметь мыслить как программист. А это навык, типа умения быстро бегать или боксировать, просто так, из воздуха не берётся. Несмотря на все наши попытки понять что такое массив и как его обрабатывать не получилось. Проблемы была в том, что братишка не мог в голове собрать как из мелких шагов на каждом этапе возникает целое решение.

                              0
                              Несмотря на все наши попытки понять что такое массив и как его обрабатывать не получилось.

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

                                  Математика один из путей, допускаю, что работа историка по исследованию документов, поиску противоречий и построению непротиворечивой картины событий тоже тренирует нужный навык. У гипотетического двоечника проблемы могут возникнуть не с реактом и не с тем, чтобы прочитать кучу документации и туториалов. Ему может быть сложно понять что делает цикл for, как составить даже тривиальный алгоритм типа «переверни список», как соотносится между собой тело цикла и конечный результат работы.

                                    0
                                    Практически на все эти вопросы легко ответит хождение по коду дебагером + чтение соответствующей теории по алгоритмам. Только опять же, в 80% современной типовой работе даже на такой уровень закапываться обычно не приходится. Понятно, что с таким подходом сениором не стать, но автор вон и на путь джуна даже стать не может из-за любви к археологии.
                                      +1
                                      Когда-то, будучи совершенно практическим двоечником по математике (и не только), совершая свои самые первые шаги в программировании столкнулся с тем, что на единственном доступном компьютере оператор FOR в Бейсике просто не работал (битое ПЗУ, компьютер сбрасывался при выполнении оператора). Ни знающих людей, у кого можно было бы спросить совета, ни хоть сколько-то адекватной литературы под рукой не было. Как-то не сильно остановило и не помешало ни в написании своих первых программ, ни в выборе жизненного пути. Бывают разные люди и разные истории, и со своей колокольни мне кажется, что мотивация гораздо важнее таланта и знаний.
                                  0
                                  Ну, формошлепить в долине — таки на собеседованиях это все нужно будет.
                                    0
                                    Сделать красивую анимацию на форме — математика как раз таки нужна
                                    +2
                                    Этот список актуален для США.
                                    Там на втором месте врач-педиатр, а еще есть медсестра.
                                    Точно не для РФ и СНГ, у нас какой-нибудь педиатр — нищий.
                                    Так что не совсем актуально в принципе.
                                      +3
                                      Ой, тут смотря какая математика! Про графы все же программисты знают?! А это часть дискретной математики. Мат.логику тоже все знают. Умение определять сложность алгоритма — тоже математика. Работаешь с float — должен знать часть вычислительной математики.
                                      Если поставить вопрос так: насколько нужен «чистый матан» (мат.анализ) программисту, то получили бы интересное исследование. Критерии сходимости рядов, разрывы функции, множества Парето, Слейтера и т.д.
                                        –1

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

                                        +24
                                        >Неужели чтобы стать программистом без технической базы, требуется так много времени?

                                        Да уж. Когда въедливость и желание разобраться до сути во зло. Всё что требуется на начальном этапе — понять тот уровень абстракции, где надо просто верить в магию нижних уровней и жить с ней и продолжать разбираться с верхним уровнем.
                                          +2

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

                                            +6
                                            а потом уже потихоньку начинаешь понимать почему на ноль делить нельзя.

                                            А потом тебе говорят что можно.
                                            А иногда даже и нужно.
                                            И ты понимаешь, что тебе несколько лет врали :))
                                              +1

                                              До сих пор жил с уверенностью что нельзя, вот это поворот.

                                                0
                                                «А теперь забудьте всё, чему вас там в этом вашем учебном заведении учили. Добро пожаловать в реальную жизнь на производство!» © не помню кто из начальства цеха, нам, свежевыпущенным синемордым краснодипломникам.
                                                  +15
                                                  — Забудьте все, чему вас учили в ВУЗе, здесь это не пригодится. Простите, но не учился в ВУЗе…
                                                  — Извините, тогда вы нам не подходите, нам нужны только люди с высшим образованием.
                                                  +2
                                                  Да, корень из отрицательных чисел тоже можно брать
                                                    0

                                                    Это другое, по крайней мере число в отличие от результата деления на ноль.

                                                    –3
                                                    Ну на 0 можно делить только 0.
                                                    Неопределенности вида «0 делить на 0» учат разрешать в стандартном курсе анализа.
                                                      0
                                                      А что вам мешает 5 на 0 поделить, получив вполне законную +∞?
                                                        0

                                                        а почему не -∞?

                                                          0
                                                          это получится если на -0 делить. А если на +0, то таки +∞.
                                                            0
                                                            Ну про числитель-то давайте тоже не забывать. :)
                                                              0
                                                              А что числитель?
                                                              Число 5 в любом случае число чисто положительное, и даже если рассматривать его как предел — с любой стороны от него значения положительны.
                                                                0
                                                                Если я не ошибаюсь, то при -5 / 0 будет -∞.
                                                                А, понял, мы с вами к вопросу с разных сторон подошли :)
                                                                  +1
                                                                  -5 / +0 = -∞, да. Но -5 / -0 = +∞.
                                                                  То есть, я про то, что предел функции с/х таки меняет знак в зависимости от того, с какой стороны X стремится к нулю.
                                                          +1
                                                          Тот факт, что деление на ноль — в большинстве случаев неопределенная операция (за исключением некоторых специфичных областей математики). Если очень хочется, то можно взять предел — тогда будет бесконечность:
                                                          lim_(x->0) 1/x = ∞
                                                            +1
                                                            Предел деления на число стремящееся к нулю может и сходиться к числу.
                                                            image
                                                              –1
                                                                +1

                                                                Будет не «бесконечность», будет «предел стремится к бесконечности» (или как-то так, точную терминологию матанализа я давно не помню), а вот этот вот значок — это такой шорткат для записи соответствующей логической формулы.

                                                                +1

                                                                Такого числа не существует.

                                                                  +1
                                                                  потому что выполняя операцию деления определенную на неком множестве чисел хочется что бы результат остался в множестве этих чисел(поле комплексных/действительных чисел). Если что это следует из словосочетания «определенную на множестве». Бесконечность не входит в это поле.
                                                                  С таким же успехом можно делить 5 на апельсин и получить законное ведро гвоздей.
                                                                  0
                                                                  А это и не ноль, а символ бесконечно малого числа.
                                                                  А на ноль делить нельзя.
                                                                +1

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


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

                                                                  0
                                                                  А кое у кого очень даже пересекаются


                                                                  А у кого-то их даже нет. Зависит, с какой стороны глобуса живёшь :)
                                                                    +2
                                                                    А кое у кого очень даже пересекаются, но это уже совсем не евклидова геометрия.

                                                                    Нет же, параллельные прямые не пересекаются по определению. Ни в какой из геометрий.

                                                                      0
                                                                      Нет же, параллельные прямые не пересекаются по определению. Ни в какой из геометрий.


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

                                                                        Дополнительно, не пересекаются скрещивающиеся, но это не отменяет того, что параллельные не пересекаются по определению.
                                                                      +2
                                                                      В неэвклидовой геометрии обычно ломается пятый постулат «Через любую точку, не лежащую на прямой, можно провести прямую, параллельную данной, и притом только одну». Параллельность при этом остается синонимом непересекаемости.

                                                                      Или вообще параллельные прямые становятся невозможными (в сферической геометрии).
                                                                        0

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


                                                                        Кстати, еще немного о делении на ноль.
                                                                        За пределами арифметики не везде можно делить на ноль.
                                                                        Более того, кое-где в математике вообще деление не предусмотрено как класс.


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

                                                                        0
                                                                        Параллельность при этом остается синонимом непересекаемости.

                                                                        Не обязательно. Скажем, параллельность по Лобачевскому — это частный случай непересекаемости. Через точку, не лежащую на прямой, можно провести бесконечно много прямых, не пересекающих данную, две из которых будут параллельными данной по Лобачевскому.
                                                                        Причём, если пространство Лобачевского "распрямить" — то всё это множество непересекающих данную прямых "схлопнется" в одну прямую, параллельную данной и по Евклиду и по Лобачевскому.

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

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

                                                                      –1
                                                                      А кстати, про приведённую задачу. Геометрия учит нас, что наилучшее соотношение площадь\периметр имеет квадрат, после круга, естественно. А я там квадратов пока не просматриваю.
                                                                        +2
                                                                        Забор посередине все портит
                                                                          0

                                                                          там интересно получается


                                                                          пусть у нас 2 продольных и n поперечных заборов. при любом n максимум площади будет при длине продольного забора равной 25. при n=2, это будет квадрат, но в задаче n=3

                                                                            +3
                                                                            наилучшее соотношение площадь\периметр имеет квадрат, после круга, естественно

                                                                            Ложное утверждение. Например, правильный шестиугольник лучше квадрата.

                                                                              +1
                                                                              Если по условию задачи оба загона должны быть прямоугольные и одинаковой площади, то
                                                                              100 = 3x + 2y, где x и у — стороны совокупной конструкции.
                                                                              Отсюда у = 50 — 1,5 х.
                                                                              Дальше надо максимизировать величину х*(50 — 1,5*х), она же 50*х — 1,5 *х^2.
                                                                              И здесь действительно надо взять от этого выражения производную. И приравнять ее к нулю. Это, насколько помню, учат в 11 классе.
                                                                              Получится 50 — 3х = 0, т.е. х = 50/3.
                                                                              y = 50 — 1,5x = 50 — 1,5*(50/3) = 25.
                                                                              Итак, х = 16,667 и y = 25.
                                                                                0
                                                                                Дальше надо максимизировать величину х*(50 — 1,5*х), она же 50*х — 1,5 *х^2.

                                                                                Если не сложно с этого момента можно подробнее. Не совсем понятно что Вы делаете. Все понятно до момента 50-1,5х=y
                                                                                  +2
                                                                                  х*(50 — 1,5*х) — это то же самое, что x*y, просто у мы выразили через х. Произведение x*y — это площадь загона, она должна быть максимальной.

                                                                                  Чтобы найти максимальное или минимальное значение функции f(x), надо от этой функции «взять производную». Полученное выражение обозначают f`(x). И потом надо решить уравнение f`(x) = 0, тогда получим х, при котором экстремального значения достигает исходная функция f(x).

                                                                                  А чтобы взять производную от 50*х — 1,5 *х^2, надо знать формулу, по которой производная от a*x^b равна a*b*x^(b-1). Получается, что производная от 50*х — это 50, а производная от 1,5 *х^2 — это 3*х. А производная от всего выражения это как раз 50 — 3*х.

                                                                                  Дальше остается решить уравнение 50 — 3*х = 0.
                                                                          +5
                                                                          для полной картины понимания Computer Science, мне необходимо будет заново учить алгебру, а затем и ВысшМат

                                                                          Для полной картины даже этого не хватит… Я учился на ВМК, работаю в целом по специальности, и все равно — чем дальше, тем больше IT-направлений мне становятся непонятны и прямо-таки тяжелы для освоения.

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

                                                                          PS: Я вот занимаюсь ИИ, так мне пришлось осваивать психологию и лингвистику. Тоже не фунт изюму…
                                                                            +1

                                                                            Не вижу связи между современным ИИ и психологией

                                                                              +1
                                                                              современная психология — это много-много матстатистики, например…
                                                                            +1
                                                                            Неужели чтобы стать программистом без технической базы, требуется так много времени?
                                                                            Меня конечно вдохновляют статьи в интернете, где люди пишут, что за 1,5 года стали Java developer-ом и уехали в Германию, Канаду, США, однако оценивая свои печальный опыт я не уверен что такое возможно.


                                                                            Ну, без описания начального уровня тут особо говорить не о чем. У меня был коллега, который имел опыта java разработки меньше, чем вы описываете (только курсы, де факто). Но придя на наш проект, он вполне вписался в работу, и примерно год вполне справлялся, в том числе писал например на скале. Но при этом у него, надо заметить, было примерно 10 лет опыта в другой области — 1С, т.е. скажем базы данных и SQL он знал вполне прилично. То есть, отсутствие опыта в самой разработке и языке/инструменте должно чем-то компенсироваться, как правило. Отсутствие знания математики — обычно тоже.

                                                                            Германия тут кстати может упрощать дело — потому что дефицит программистов там вполне может быть больше, чем где-то в глубинке России, например, и если вы по остальным показателям проходите…
                                                                              0
                                                                              10 лет в 1с означают 10 лет опыта в написании кода в процедурном стиле, возможно написание внешних компонент на плюсах. Возможно еще что то полезное. Так что по сути ему нужно было освоить только ООП и конкретный инструментарий. Ну может еще какие хорошие практики. Не так много.
                                                                                0

                                                                                1С это ведь по сути VisualBasic с русским синтаксисом. Так что вполне язык программирования и навык качает. Пересесть с процедурного программированмя на ООП, не так и сложно. Особенно если практика ООП была в универе.

                                                                                  0
                                                                                  Собственно я об этом и написал. Там конечно нужно еще учитывать распространенность плохих практик программирования и еще некоторые нюансы, но в целом да, опыт 1с вполне можно, пусть и с понижающим коэффициэнтом, считать за опыт продакшен программирования. Та же работа в команде, то же умение декомпозиции задач и выделения абстракций.
                                                                                  Я в общем то на своем опыте такое провернул. Спустя года 3 в 1с, может чуть раньше начал изучать не привязанные к языкам вещи, читал дядюшку боба, макконела, хабр, смотрел записи конференций, читал про ООП и паттерны. А потом, после еще полутора-двух лет перешел на котлин достаточно спокойно, даже с учетом что менторить некому меня было. Оценить трудно самому себя, но где то через месяц ушел от программирования в процедурном стиле, через месяцев 4-5 пошло более менее идиоматичное ООП, с элементами ФП. При наличии более опытных товарищей думаю быстрее бы прошла адаптация.
                                                                                    0
                                                                                    Вообще то там есть ООП, просто объекты фиксированы)
                                                                                    А так когда работал с 1С, то это было: собственно само 1С, написание и оптимизация хранимых процедур MSSQL (не 1Сных, но работающих с 1Сными данными), внешние компоненты на C#, обмен данными с различными системами самыми различными вариантами…
                                                                                      0
                                                                                      Да нет там ООП. Там одни обрывки от него не дающие никаких знаний ООП и навыков практического использования этой парадигмы.
                                                                                        0
                                                                                        Вообще то там есть ООП, просто объекты фиксированы)

                                                                                        ООП это всякий там полиморфизм, наследование и т.п. там этого нет от слова совсем, то что там некоторые системные объекты «какбы» работают по принципам ООП, это не означает что оно там есть… этим же нельзя пользоваться
                                                                                          0
                                                                                          Да, оно очень обрезано, но немного похоже)
                                                                                          Любой документ создается от базового документа (ручками в конфигураторе, тут же добавляются поля), как и все прикладные объекты создаются от какого-то базового типа.
                                                                                          Потом нужные функции переопределяются путем написания кода.
                                                                                            +1
                                                                                            Вот когда можно будет сделать платежку, а потом унаследовать от неё входящую и исходящую — тогда будет наследование. А до того — год обжекты в процедурном языке + кастомные обработчики событий событий.
                                                                                              0
                                                                                              Да и тогда не будет наследования нормального.
                                                                                    0
                                                                                    Это все примерно так и было, только у нас нет ООП :) И освоить нужно было не так мало — еще одну СУБД MS SQL, еще два языка — груви и скалу, Apache Spark, Hive, Oozie, Hadoop. Ну таки да, опыт написания какого-то кода был, а главное был опыт SQL, который и пригодился полностью.
                                                                                  +8
                                                                                  Такие выражения как: пределы, математическое мышление, экстремум, производные, многочлены и т.д. для меня оказались как речь на языке племени Майя.

                                                                                  Для 99% программ это не нужно.
                                                                                  Я сам не люблю и слабо понимаю математику, хотя и занимаюсь 3D графикой =)

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

                                                                                  А вот эта задача меня вообще заставила остановиться на чтении книги по CS
                                                                                  Какое отношение эта задача имеет к программированию? Никакого.

                                                                                  Качаю книгу Кернигана и Ричи «Язык С»
                                                                                  Вместо всяких курсов по CS и древних книг лучше обратите внимание на такую серию:
                                                                                  stolyarov.info/books/programming_intro

                                                                                  У меня, и многих моих коллег был путь снизу-вверх: от электроники к программированию.
                                                                                  Когда знаешь как работает железо, просто не может быть проблем с пониманием всех нюансов использования переменных/циклов/указателей.
                                                                                    +3
                                                                                    И как Вы учили электронику без математики???
                                                                                    .Для 99% программ это не нужно.

                                                                                    И вот на оставшийся процент и придется потратить 99% времени
                                                                                      +1
                                                                                      Чтобы собирать любительские схемы из книжек и проектировать свои из готовых блоков и по готовым шаблонам расчётов, никакой особой математики не нужно. Нужен калькулятор.
                                                                                        0
                                                                                        Ну да, у меня был как раз. Б3-34. (1983 год) Первое что я на нем написал — это численное интегрирование дифф. уравнения методом рунге кутта 4 порядка. По странному совпадению как раз для расчета схемы.
                                                                                        Ни в одном учебном заведении электронику без математики не преподают.
                                                                                        Сначала просто математика. А потом уже электроника.
                                                                                      –4
                                                                                      Извините, но Паскаль в 2020 году это за гранью разумного.

                                                                                      Керниган-Ритчи — великолепны. Не знаю как для взрослых, а для школьников отлично заходит для обучения азам.
                                                                                        +10
                                                                                        .Паскаль в 2020 году это за гранью разумного

                                                                                        Почему? Вполне симпатичный язык для обучения. И полный по Тьюрингу естественно.
                                                                                          –12
                                                                                          Почему? Вполне симпатичный язык для обучения.

                                                                                          Он депрекейтед.
                                                                                          У него плохой синтаксис.
                                                                                          Мы же не хотим чтобы школьники считали что их учат языку динозавров? Да и просто новичков не хотим учить вымершему языку.

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

                                                                                          И полный по Тьюрингу естественно.

                                                                                          Баш тоже Тьюринг полный. Но это же не повод его изучать первым?
                                                                                          Да и CSS Тьюринг полный. Это же не повод на нем писать программы?

                                                                                            +5
                                                                                            Не знаю, мне нравится
                                                                                            en.m.wikipedia.org/wiki/Free_Pascal
                                                                                            Stable release 2 months ago
                                                                                            У него компактный компилятор, который легко спортировать на маленькую платформу
                                                                                              –5
                                                                                              Не знаю, мне нравится
                                                                                              github.com/Clozure/ccl/releases
                                                                                              released this on 20 Apr
                                                                                              У него компактный компилятор, который легко спортировать на маленькую платформу

                                                                                              PS: Дельфисты атакуют. Вы хотя бы пишите что не так. Чем вам Керниган-Ритчи и Си как первый язык для обучения основам не угодил. Уже минимум пара поколений разрабочиков на них выросли.
                                                                                                +18
                                                                                                Да меня вполне язык С устраивает, на нем и пишу, он хороший и удобный.Но Паскаль специально был написан для обучения, в нем есть некое изящество. Лично я начинал с Алгола, Фортран, APL потом Паскаль, Пролог, Лисп.
                                                                                                Переход с Паскаля на Си без проблем, они весьма близки идеологически. Бейсик, тот да, ужасен. Сейчас я развлекаюсь с разным ретро, вот там Паскаль иногда заходит удобнее чем Си.
                                                                                                Ну а на работе конечно с++ only.
                                                                                                PS Паскаль это эпоха, это священная корова, наезжать на неё нельзя
                                                                                                  –2
                                                                                                  Ну да был написан для обучения. В итоге оказалось что когда теоретик делает язык для обучения получается не очень.

                                                                                                  Учить второй очень похожий язык вторым это потеря времени. Это для нас пара недель с синтаксисом ознакомится и можно писать. Все же одинаковое у них. Для начинающих это все сложно и требует кучу времени. Я бы вторым предложил учить Питон. И уже на нем преподавать весь остальной cs.
                                                                                                  Так совсем хорошо выйдет и с парой Си/Питон уже любой язык будет знаком и похож на что-то уже выученное. (Любители Идриса проходите мимо, не про вас речь)

                                                                                                  с я развлекаюсь с разным ретро, вот там Паскаль

                                                                                                  Ключевое слово ретро. Не надо ретро учить первым. Потом как хобби да не вопрос. Но первым что-то живое нужно.
                                                                                                    +8
                                                                                                    Все таки Си не очень хорош как первый язык. Он слишком свободный и имеет много вариантов и стиля и собственно самого языка. Легко написать нечитаемую кашу. До сих пор нет единогласия о хорошем стиле программ на Си.
                                                                                                    Более опытным программистам он очевидно удобней Паскаля, как минимум меньше букв в программе, но это достоинство на момент написания. Во многих областях до сих пор предпочитают весьма многословную АДА(у)
                                                                                                      0
                                                                                                      Да какие варианты? Я про классику, совсем классику. И совсем азы.
                                                                                                      Переменные, циклы, структуры, указатели как самое сложное. И алгоритмы того же уровня. Пузырек и около того. 100 строк — предельный размер для программы. Их с любым стилем понять просто.

                                                                                                      Свобода наоборот дает возможность поговорить с обучающимся. Почему он так сделал, а как еще можно сделать, а в чем разница? Красота же. Даже не углубляясь в тонкости в правильно написанной программе есть о чем поговорить.

                                                                                                      Стиль это все потом. Тут что IDE сделает то и хорошо. Какой-нибудь MSVC вполне прилично все делает.
                                                                                                        +11
                                                                                                        Извинит, но Си в качестве первого языка — это как учится кататься на велосипеде, используя для этого его одноколёсный вариант.

                                                                                                        Для чего нужен первый язык — для связи бумажной алгоритмики с реальным программированием. В первом языке не должно быть свободы — он ДОЛЖЕН быть дубовым. Чтобы не отвлекаться на синтаксис, а заниматься непосредственно творчеством.

                                                                                                        Какая радость для начинающего от возможности обратится к массиву пятью различными способами? Или написать инкрементацию тремя?

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

                                                                                                          Какая радость для начинающего от возможности обратится к массиву пятью различными способами? Или написать инкрементацию тремя?

                                                                                                          Вы тех же Керниган-Ритчи читали? Сначала рассказывается про один способ. Лабы, практика, вперед.
                                                                                                          Все остальное в разделе указатели. Понимание что такое указатель приходит очень долго и очень тяжело. И чем больше примеров и того что можно пощупать в этом месте тем лучше.
                                                                                                            +5
                                                                                                            С Сями можно потратить полчасика на рассказ про git

                                                                                                            Если речь про обучение программированию с нуля в школе, то никак вы за полчасика с гит не разберётесь.

                                                                                                              0
                                                                                                              Ветки, пуш, пулл, мердж в полчаса укладываются. Если что не так действуем по инструкции.
                                                                                                              image

                                                                                                              Тут важно что это Си. Живой, массовый и сложный проект. Учим не мертвому языку дедов, а живому на котором пишут живые проекты.
                                                                                                                +3
                                                                                                                У вас как-то через все сообщения проскальзывает вот этот «язык дедов», «времен динозавров». Хотя, казалось бы, оперировать понятиями «модно» / «не модно» — так себе аргумент.
                                                                                                                Quicksort, например, из 1960-х. Я так понимаю, вы его тоже будете рекомендовать не использовать? :)
                                                                                                                  +1
                                                                                                                  Я не о дате изобретения, а об использовании сегодня.

                                                                                                                  Квиксорт живой. Им пользуются в продакшене.
                                                                                                                  Си, несмотря на возраст, живой.
                                                                                                                  А вот Паскаль мертвый. Им в продакшене не пользуются.
                                                                                                                    +1
                                                                                                                    А вот Паскаль мертвый. Им в продакшене не пользуются.

                                                                                                                    DRL(ранее известный как DoomRL) поглядывает с некоторым недоумением.

                                                                                                                      0

                                                                                                                      В каких-нибудь отдельных уголках можно даже Фокал найти.
                                                                                                                      А так даже Бейсик (в виде VBA) чаще используется в десятки раз.

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

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

                                                                                                                    0
                                                                                                                    Изобретай — не изобретай, но если твоих, подписанных твоим GPG ключом, коммитов не будет в учебной репе…
                                                                                                                      0
                                                                                                                      Элементарно, доработки приносятся на флешке, вместе с ключом, а кто то за тебя их вносит в гит.
                                                                                                                        0
                                                                                                                        От этого люди не перестают использовать контроль версий.
                                                                                                                    +3

                                                                                                                    Вы переоцениваете возможности обычных учеников. Я раньше на курсах всегда уделял час, чтобы рассказать основные команды гита. Более того, я даже сделал методичку с картинками, чтобы можно было с ее помощью дома все повторить.
                                                                                                                    Но так у меня сбежало 2 ученика. В обратной связи оставили "я даже не могу понять как сохранять проект, куда мне изучать программирование?".
                                                                                                                    Поэтому я гит даю только тем, кто умненький и не раньше второго занятия.

                                                                                                                  +1
                                                                                                                  Понимаете, какая штука, все, о чем вы говорите — правильно. И всё это будет — но позже.
                                                                                                                  Вы мешаете в кучу язык для обучения и язык для разработки.

                                                                                                                  Язык для обучения должен быть неудобен. Он должен постоянно заставлять выкручивать мозги. Он обязан содержать минимум инструкций. Он должен научить человека программировать что угодно при помощи говна и палок.
                                                                                                                  Тут как в армии, на курсе молодого бойца: -«Любой дурак выкопает окоп лопатой. А ты сумей ножом и руками. Сумел? Потом выкопаешь чем угодно»

                                                                                                                  Не помню кто сказал что люди делятся на тех, кто программирует и тех кто нет. Те, кто программируют, могут программировать что угодно — от древней релейной логики до трассировки лучей на новейших видеокартах.

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

                                                                                                                  С точки зрения продакшена язык для обучения ужасен.
                                                                                                                  Но язык обучения не предназначен для разработки, хотя такое тоже встречается.

                                                                                                                    +1
                                                                                                                    Тогда лучший язык для обучения — Brainfuck.
                                                                                                                    Впрочем, машина Тьюринга тоже сойдет.
                                                                                                                      0
                                                                                                                      У нас (МАИ, не школа) были таки машины тьюринга, потом их связки, потом паскаль как основа курса алгоритмов, си++ как основа курса ООП, пролог, Оракловый вариант скуля как основа курса РБД.
                                                                                                                      Без глубоких заходов в IDE и библиотеки. С учтом того, что на С++ писали в Борланд билдере — правильно что без заходов.
                                                                                                                        0
                                                                                                                        Ассемблер-же!
                                                                                                                          0
                                                                                                                          Ассемблер — очень широкое понятие.
                                                                                                                          В общем случае — это просто замена кодов машинных команд некими символьными обозначениями для облегчения запоминания.

                                                                                                                          Соответственно, все упирается в умения «процессора» (то есть исполнителя команд), его набор команд. Если это исполнитель умеет делать 100500 различных действий, закодированных каждое в свою команду (например, одной командой посчитать факториал, интеграл, переместить/скопировать целый блок памяти и т.п.) — то программирование на его ассемблере получается весьма высокоуровневым.

                                                                                                                          Машина Тьюринга — это абстрактная штука, чтоб говорить о ней предметно, нужно задаться какой-то конкретной реализацией. Так что рассмотрим очень похожую машину Поста. У нее всего 6 команд и унарная система счисления. Уже банальное сложение и вычитание двух чисел на ней — небольшая головоломка, в то время как почти любой процессор, программируемый на ассемблере, умеет это делать аппаратно.
                                                                                                                        +1
                                                                                                                        Язык для обучения должен быть неудобен. Он должен постоянно заставлять выкручивать мозги. Он обязан содержать минимум инструкций. Он должен научить человека программировать что угодно при помощи говна и палок.

                                                                                                                        Вы принципиально путаете
                                                                                                                        1) обучение на профессионального хакера (в реймондовском смысле),
                                                                                                                        2) обучение на программиста вообще,
                                                                                                                        3) обучение на не-программиста с навыком автоматизации с помощью компьютера.


                                                                                                                        Ваш подход годится для (1) и изредка для (2), в то время как на них вообще статистически не нужно тратить усилия — сами обучатся — а основные методики надо нарабатывать для (3), потому что критична массовая компьютерная неграмотность.

                                                                                                                          +2
                                                                                                                          Язык для обучения должен быть неудобен. Он должен постоянно заставлять выкручивать мозги. Он обязан содержать минимум инструкций. Он должен научить человека программировать что угодно при помощи говна и палок.

                                                                                                                          Это уже продвинутый уровень обучения, никак не начальный. Обучение борьбе начинается с простейших примитивных бросков, а не со сложных приёмов, которые даже не каждый КМС успешно выполнит.
                                                                                                                            +1
                                                                                                                            Вы не учитываете одну важную вещь. Большинство людей, которые начинают изучать программирование (это обычно 5/7/9 класс обычной средней школы) не планируют становится программистами. И совершенно не готовы погрузиться в изучение нюансов. Поэтому главный признак, которым должен обладать первый язык — он должен давать возможность быстро сделать что-то содержательное, чтобы хоть пробудить интерес. Я по этой причине топлю за питон: простой и позволяет в 5 строк сделать очень многое: хоть график построить, хоть сервачок написать. И наличие REPL-а позволяет очень быстро проверять гипотезы, когда не знаешь, как правильно.
                                                                                                                            Да, явная типизация может помочь в обучении, но жить без неё вполне можно (тем более, что в современном питоне есть опциональные аннотации типов). А вот без быстрого старта язык непригоден для большинства.
                                                                                                                            +1
                                                                                                                            У си в качестве первого языка есть очень большой минус — это запредельное количество синтаксических конструкций на старте, смысл которых невозможно объяснить человеку, который только-только начинает изучать язык. Все эти #include <stdio>, printf/scanf, их первый параметр и амперсанд перед вторым параметром в scanf (в плане ввода-вывода, C++ немного проще). Сравните write/writeln/read/readln, доступными из коробки в паскале.

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

                                                                                                                            На кружке по изучению ардуинки можно использовать си, т.к. там программирование не является единственным направлением изучения (да и с вводом-выводом не приходится сталкиваться). Но для изучение именно основ программирования школьниками, си не очень подходит, т.к. способен отбить интерес прямо на старте.
                                                                                                                              +1
                                                                                                                              Сравните write/writeln/read/readln, доступными из коробки в паскале.

                                                                                                                              Сравнил.


                                                                                                                              Почему write(a, b, c), где a, b, c типа real, и в то же время write(out, a, b, c), где a, b, c типа file? Как мне различить эти конструкции? Что будет, если я вызову write(a, b, c, out)?


                                                                                                                              В C было сразу понятно — есть printf с stdout, а есть fprintf с конкретным файлом (и можно тоже указать stdout).


                                                                                                                              Почему надо было писать write(a:15:3), что это за конструкция? Почему тут особый случай и почему я не могу сделать свою функцию с таким же? (Реально хотелось, как раз как переходник для вывода результатов.)


                                                                                                                              Почему в конце программы "end.", а не "end;"?


                                                                                                                              Почему перед else нельзя ставить точку с запятой, а перед end — можно, но она ни на что не влияет?


                                                                                                                              Почему var перед программой (процедурой, функцией) и почему один на все переменные?


                                                                                                                              Почему в списке формальных параметров var вдруг начинает значить передачу по указателю (или in-out, не помню точно)? Почему не отдельное слово?


                                                                                                                              Почему такое резкое отличие между procedure и function?


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


                                                                                                                              И ещё два десятка подобных недоумённых вопросов, но, думаю, уже достаточно.


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

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


                                                                                                                              Сам же принцип "надо добавить определённые заклинания" был понятен с первого упоминания. Люди же здороваются и прощаются, так и тут...

                                                                                                                                0

                                                                                                                                Вы просто натягиваете опыт C на Паскаль, из-за чего и возникает недопонимание. Забудьте C, и тогда Паскаль станет простым и логичным языком.


                                                                                                                                Почему write(a, b, c), где a, b, c типа real, и в то же время write(out, a, b, c), где a, b, c типа file? Как мне различить эти конструкции? Что будет, если я вызову write(a, b, c, out)?

                                                                                                                                Только в отличие от C, где вы в printf можете запихнуть вообще всё, что угодно, выстрелив себе в ногу, в Паскале всё строго типизировано. Вы никак не сможете передать аргументы типа file в качестве параметров, кроме первого.


                                                                                                                                Почему надо было писать write(a:15:3), что это за конструкция? Почему тут особый случай и почему я не могу сделать свою функцию с таким же?

                                                                                                                                Потому что Write в Паскале — это compile-time конструкция. Так решили авторы языка. И если бы в Паскале был C-style printf, то он бы тоже был compile-time с проверкой типов аргументов при компиляции и без возможности генерации строки форматирования в рантайме.


                                                                                                                                Почему в конце программы "end.", а не "end;"? Почему перед else нельзя ставить точку с запятой, а перед end — можно, но она ни на что не влияет?

                                                                                                                                Потому что ; в C — это признак конца выражения, а в Паскале — разделитель между выражениями в блоке. Оба подхода имеют право на жизнь.


                                                                                                                                Почему var перед программой (процедурой, функцией) и почему один на все переменные?

                                                                                                                                Не забывайте, что Паскаль — язык для обучения азам. В С можно себе выстрелить в ногу, объявив scoped-based переменную с тем же именем, что и внешняя переменная. А ещё в C можно случайно перепутать вызов функции, объявление функции и объявление переменной.


                                                                                                                                Почему в списке формальных параметров var вдруг начинает значить передачу по указателю (или in-out, не помню точно)? Почему не отдельное слово?

                                                                                                                                А хрен его знает. Видимо, чтобы не плодить ключевые слова.


                                                                                                                                Почему такое резкое отличие между procedure и function?

                                                                                                                                Скорее, больше бесит, что функция не может вернуть record. И вызов без скобок тоже бесит, да.

                                                                                                                                  0
                                                                                                                                  Забудьте C, и тогда Паскаль станет простым и логичным языком.

                                                                                                                                  Сколько ещё и каких нормальных языков я должен забыть, чтобы кривости Паскаля стали "простыми и логичными"?


                                                                                                                                  Большинство языков таких тараканов не держат. Хотя можно сравнить этот write/writeln, например, с C++, где на шаблонах ещё и не такое можно построить (например, у парсеров на Spirit несколько разнотипных аргументов шаблонов в любом порядке)… но там юзер уже заранее готов к подобным шуткам, в отличие от тех, кто вообще впервые учится Паскалю.


                                                                                                                                  (Заметьте, я сказал и про плюсы Паскаля. Но они не сыграли в его пользу, чтобы он выжил.)


                                                                                                                                  Вы никак не сможете передать аргументы типа file в качестве параметров, кроме первого.

                                                                                                                                  Почему собственно? Может, я хочу, чтобы напечатало тип аргумента и основные свойства как файла (имя, режим открытия и т.п.)?


                                                                                                                                  Но главное таки не это, а то, что:


                                                                                                                                  1) Эти якобы функции на самом деле не функции, а похожий механизм, но разбираемый компилятором,


                                                                                                                                  2) Я не могу сделать такое же своими средствами, это нерасширяемый хак компилятора.


                                                                                                                                  Если бы их не оформляли в виде "типа функций", это было бы честнее. Если бы дали аналогичное средство самим, это было бы полезнее и для учёбы, и для продуктина.


                                                                                                                                  Потому что Write в Паскале — это compile-time конструкция. Так решили авторы языка. И если бы в Паскале был C-style printf, то он бы тоже был compile-time с проверкой типов аргументов при компиляции и без возможности генерации строки форматирования в рантайме.

                                                                                                                                  Ну так где оно? Почему недоступно? Почему я не могу сделать свой write?


                                                                                                                                  Ах, "язык для обучения"… ну так язык, который пригоден только для обучения, не будет в итоге вообще использоваться для обучения.


                                                                                                                                  Видимо, поэтому в Delphi в итоге сделали впараллель C-подобный подход.


                                                                                                                                  Потому что; в C — это признак конца выражения, а в Паскале — разделитель между выражениями в блоке. Оба подхода имеют право на жизнь.

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


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


                                                                                                                                  То же самое относится к необязательности блоковых скобок.


                                                                                                                                  Скорее, больше бесит, что функция не может вернуть record. И вызов без скобок тоже бесит, да.

                                                                                                                                  Тип возврата — да, проблема (в C это тоже полу-костыль).

                                                                                                                                    0
                                                                                                                                    Что б Вы понимали в извращениях :-)

                                                                                                                                    Вот с таким кодом поработать и Паскаль за счастье будет

                                                                                                                                    image

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

                                                                                                                                      Ну судя по строке 37 (3700, если по разметке) и дальше, не всё так жёстко? Или тут две разные разметки?


                                                                                                                                      Я писал на стандартном (фиксированного формата) Фортране, и не сказал бы, что это какой-то существенный ужас. В RPG меня больше напрягает сама логика языка — что и как делается — а не его конкретное представление. Не хочу выворачивать мышление на эту логику, для моих задач не окупится :)

                                                                                                                                        0
                                                                                                                                        Это другая разметка — там уже O начинается. А код — C
                                                                                                                                        Я плоховато fixed знаю (ну так скажем, на уровне чтения немного) и не помню уже что такое O-секция. Что-то связанное с выводом. Судя по всему — внешний источник для вывода с расписанными полями.

                                                                                                                                        Не помню чтобы в наших старых такое встречалось.

                                                                                                                                        Сама логика, особенно во FREE особо не напрягает — язык и язык. Она несколько отличается от общепринятой, но вся AS-ка отличается от привычного :-)

                                                                                                                                        Что неудобно на RPG — пишу на С/С++.

                                                                                                                                        У меня вот сейчас в задаче один из PGM объектов собирается и 15-ти модулей. Из которых пара SQLRPG, штуки три CPP остальные RPG
                                                                                                                                        0
                                                                                                                                        Я из АС-ки только QSEQOFR помню, под которым мы базу на ленточки бэкапили. Для бэкапов отдельный экран был.
                                                                                                                                        +1

                                                                                                                                        Давайте начнём хотя бы с того, что Паскаль появился на пару лет раньше С. И для языка, которому исполнилось уже 50 лет и который дошёл до наших дней практически в неизменном виде — это отличный результат.


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

                                                                                                                                          0
                                                                                                                                          И для языка, которому исполнилось уже 50 лет и который дошёл до наших дней практически в неизменном виде — это отличный результат.

                                                                                                                                          В практическом применении (которое надо с микроскопом искать) остался разве что Delphi, который очень изменился по сравнению с Паскалем 1970-го года. Поэтому нету ни "неизменного вида", ни "отличного результата": результат ужасный — язык вымер, причём завалив всю цепочку потомков (разве что Ada выжила на госзаказах).


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

                                                                                                                                          По сравнению с языком, который для этого уже не менее 20 лет не подходит, они все относительно неплохи. Python в этой роли разве что ленивый не предлагал. Я вот ещё смотрю на Swift.

                                                                                                                                            0
                                                                                                                                            язык вымер, причём завалив всю цепочку потомков (разве что Ada выжила на госзаказах)

                                                                                                                                            Ада жива в PL/SQL
                                                                                                                                            В практическом применении (которое надо с микроскопом искать) остался разве что Delphi, который очень изменился по сравнению с Паскалем 1970-го года

                                                                                                                                            Дельфи также примерно обратно совместим с Паскалем, как С++ с обычным C.

                                                                                                                                            PS цепочка начинается ещё с Алгола! habr.com/ru/post/317010
                                                                                                                                            image
                                                                                                                          +1
                                                                                                                          Так совсем хорошо выйдет и с парой Си/Питон уже любой язык будет знаком и похож на что-то уже выученное.

                                                                                                                          Да они ведь во многом похожи как языки, на базовом уровне. Те же переменные, if/for/etc, функции, etc — разница в чуть другом стиле синтаксиса и явном указании типа в Си. Паскаль и иже с ним туда же.


                                                                                                                          Если говорить о разнообразии, то есть множество используемых языков, которые намного сильнее отличаются — из относительно популярных например скала/f#/лиспы/хаскель.


                                                                                                                          А вот нужно ли разнообразие при обучении программированию — зависит, думаю, от уровня. Не вижу особой проблемы начинать с паскаля в школе, кто заинтересуется изучит и другие.

                                                                                                                            +2
                                                                                                                            Да они же во многом похожи как языки, на базовом уровне. Те же переменные, if/for/etc, функции, etc — разница в чуть другом стиле синтаксиса и явном указании типа в Си. Паскаль и иже с ним туда же.

                                                                                                                            Это приходит через годы регулярного написания кода. До этого все сложно. Питон удобнее всего чтобы обучать именно CS.

                                                                                                                            Си быстро придут к плюсам при попытках учить на них. А плюсы сложны сами по себе, даже без всего остального. Люди будут одновременно мучаться с пониманием принципа работы хешмапы и с тем как это написать.
                                                                                                                            Не надо вываливать на человека сразу все. Пусть учит все по отдельности.

                                                                                                                            из относительно популярных например скала/f#/лиспы/хаскель.

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

                                                                                                                            Мы тут про азы. На чем рассказывать про циклы с переменными и на чем первый пузырек писать.
                                                                                                                              +1
                                                                                                                              Хотя бы полгода Коммон Лиспа курсе на четвертом это хорошо и полезно. Но не раньше. Человек перед изучение должен уметь код писать. Обычный и простой код.

                                                                                                                              Мы тут про азы. На чем рассказывать про циклы с переменными и на чем первый пузырек писать.

                                                                                                                              Есть какие-то исследования, что условный питон эффективнее для начального обучения программированию, чем условный лисп? По-моему это совершенно неочевидно. Конечно, если речь не идёт о курсах типа "дата саенс за 21 день".

                                                                                                                                +2
                                                                                                                                Я бы с радостью посмотрел за таким А/Б экспериментом.
                                                                                                                                Берем 2 группы студентов технарей.
                                                                                                                                Считаем что они обучены простейшим вещам и ничего кроме них. Одну группу учим Хаскелю и cs на нем. Вторую Питону и cs на нем. Через год и через два года подбиваем результаты.
                                                                                                                                Вылетел 1 балл.
                                                                                                                                Попытка самоубийства 100 баллов.
                                                                                                                                  +1
                                                                                                                                  Ну а как вы себе это представляете? Берём студентов и начинаем экспериментировать с их жизнью, а если провал — ну ничего, новые через год придут?

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

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

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

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

                                                                                                                                      Если же продвигать идею «а давайте обучать на языке X; пусть он непопулярен, зато проще для обучения», то надо сперва доказать, что он и вправду проще, потому что иначе в этой идее совсем смысла нет.
                                                                                                                                        +2
                                                                                                                                        Если же продвигать идею «а давайте обучать на языке X; пусть он непопулярен, зато проще для обучения», то надо сперва доказать, что он и вправду проще, потому что иначе в этой идее совсем смысла нет.

                                                                                                                                        хм, я бы говорил не про «проще для изучения», а про «лучше для обучения».


                                                                                                                                        При выборе языка программирования в школе/университете самый простой критерий — это смотреть, какие языки по факту востребованы на рынке, а из них уже выбирать объективно наименее навороченные.

                                                                                                                                        в раннем возрасте — не вижу ничего плохого в специальных языках для обучения.
                                                                                                                                        читать дети тоже не по «Войне и миру» учатся, для этого придумали азбуки и красочные книжки с минимумом текста.
                                                                                                                                        в университете — наверное, да, тут подразумевается, что начальные навыки программирования уже есть, можно выбирать из востребованных на рынке (и почему менее навороченные?).
                                                                                                                                        впрочем, не вижу ничего плохого в изучении какого-то академического языка в университете (разумеется, знакомство с «реальными» языками при этом обязательно). впрочем, многие проекты, начинавшиеся как академические, со временем находят себе применение и в «гражданской жизни».

                                                                                                                                          0
                                                                                                                                          про «лучше для обучения».

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

                                                                                                                                          Я тоже. К сожалению, они по факту все вымерли, ну вот разве что Scratch есть, но это всё-таки немного другая лига.
                                                                                                                                            0
                                                                                                                                            Осталось выяснить, как понять, какой же лучше.
                                                                                                                                            Если брать «программирование вообще», то максимально отвязанный от железа: лисп, тикль, питон или ещё что-то выразительное, но очень медленное.
                                                                                                                                              +2
                                                                                                                                              Ну вот я лично думаю, что Питон, потому что он объективно ненамного хуже «любого другого языка», и при этом очень популярен на практике. Т.е. ценой небольших гипотетических неудобств по сравнению с «языком X» студент получает бонусом готовый практический навык для работы.

                                                                                                                                              Вот условно 30 лет назад такой опции не было: либо чисто учебный Бейсик, либо «туда-сюда» Паскаль, либо уже по хардкору с головой в C/С++ и иже с ними.
                                                                                                                                                0
                                                                                                                                                ненамного хуже «любого другого языка», и при этом очень популярен на практике.
                                                                                                                                                Это да. Но именно как учебный мне больше нравится лисп, просто потому, что на нём в силу единства данных и кода можно сделать вообще всё, и это будет достаточно лаконично. Своя система типов? Своё ООП с плюшками? ФП? Рекомендательные системы? Логическое программирование? Всё это можно реализовать в сотни-тысячи строк поверх ванильного лиспа. Тикль, внебрачный сын плюсов и лиспа, кстати, всё это же поддерживает, просто там синтаксис ещё более мутный. А вот как в питоне, например, перейти от ООП на классах к ООП на прототипах я вообще не пойму.

                                                                                                                                                EDIT Правда, если учить студентов ближе к индустрии, то принцип «Если на текущем ЯП тебе приходится вывихивать мозг над задачей, а на другом ЯП это три строчки, пиши на другом плюс биндинг» придётся внушать. Питон изначально разрабатывался как язык — универсальный клей, так что тут он в самую тему.
                                                                                                                                                  0
                                                                                                                                                  Питон, потому что он объективно ненамного хуже «любого другого языка», и при этом очень популярен на практике.

                                                                                                                                                  Типов нет же.

                                                                                                                                                    +1
                                                                                                                                                    Типов нет же.

                                                                                                                                                    Что, сегодня отменили? Вчера ещё были.


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

                                                                                                                                                      0

                                                                                                                                                      Типы — статические метки, а в питоне они не очень статические. Могу в качестве пруфов (необходимости статичности) скинуть соответствующую цитату.

                                                                                                                                                        0

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

                                                                                                                                                          0

                                                                                                                                                          B. Pierce. Types and Programming Languages:


                                                                                                                                                          [...]



                                                                                                                                                          Я не американец, так что вместо обтекаемой формы «arguably», «should» и так далее просто беру и пропагандирую идею о статичности.

                                                                                                                                                            0

                                                                                                                                                            Даже в вашей цитате последней фразой написано, что использование термина "динамическая типизация" является стандартом :) И по факту непонимания (почти?) никогда не создаёт.


                                                                                                                                                            Привязывание более строгой терминологии, чтобы она покрывала все имеющиеся случаи, кажется весьма затруднительным. Например, по приведённой цитате не особо понятно, что означает "tractable syntactic method" или "static approximation [of behaviour]". Как к этому относиться в случае языка, который позволяет тьюринг-полные вычисления на уровне типов/во время компиляции? А если язык типа C# вроде бы статически типизированный (кроме "dynamic"), но с помощью reflection во время выполнения можно много чего нагородить?

                                                                                                                                                              0
                                                                                                                                                              Даже в вашей цитате последней фразой написано, что использование термина "динамическая типизация" является стандартом :)

                                                                                                                                                              Делайте скидку на американскую культуру. Там достаточно слов «misnomer» и «should be replaced». «But the usage is standard» — это «но использование устоялось».


                                                                                                                                                              Это как сказать, что, конечно, правильно писать «ться»/«тся» так, как в словаре, но практика устоялась, поэтому будет использоватся неправильное написание, даже там, где текст корректируеться редактором в профильных изданиях, например.


                                                                                                                                                              "tractable syntactic method"

                                                                                                                                                              ИМХО это вот как раз стандартные термины. Tractable — эффективно реализуемый на машине. Прямой перебор, например, intractable.


                                                                                                                                                              Как к этому относиться в случае языка, который позволяет тьюринг-полные вычисления на уровне типов/во время компиляции?

                                                                                                                                                              Intractable, и, хуже того, undecidable.


                                                                                                                                                              Поэтому, например, все практические зависимо типизированные языки во время компиляции допускают только доказуемо завершаемые вычисления, и если функция не доказуемо завершима, то они её вообще не пытаются нормализовать и относятся к ней как к uninterpreted function (по крайней мере, так точно делает идрис и, кажется, так делает агда).


                                                                                                                                                              Например, если я напишу заведомо нетотальную функцию


                                                                                                                                                              whatever : Nat -> Nat
                                                                                                                                                              whatever x = if x < 10 then 1 + x else whatever (1 + x)

                                                                                                                                                              То я всё равно смогу доказать теоремы типа такой:


                                                                                                                                                              wCong : x = y -> whatever x = whatever y
                                                                                                                                                              wCong Refl = Refl

                                                                                                                                                              Тут поведение функции неважно, ведь если x = y, то f x = f y для любой f.


                                                                                                                                                              А вот такую теорему я доказать уже не смогу:


                                                                                                                                                              wBad : whatever 2 = 3

                                                                                                                                                              потому что для этого надо смотреть на поведение функции, а она нетотальная, нельзя туда смотреть.


                                                                                                                                                              А если язык типа C# вроде бы статически типизированный (кроме "dynamic"), но с помощью reflection во время выполнения можно много чего нагородить?

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

                                                                                                                                                      0
                                                                                                                                                      Во-первых, есть, как же нет. А во-вторых, не вижу трагедии. Это тоже был один из пунктов спора Basic vs. Pascal. Я на Бейсике учился, и ничего.
                                                                                                                                                        0

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

                                                                                                                                                          0
                                                                                                                                                          Типы, конечно, мышление дисциплинируют, но я даже не знаю, какой язык здесь бы подошёл хорошо. В языках типа C/Java/etc. ведь это всё равно «ненастоящие» типы, а точнее, это типы процессора, а не предметной области. В идеале тогда надо, чтобы язык требовал от юзера определения типов именно в рамках задачи.
                                                                                                                                                            0

                                                                                                                                                            Да тот же несчастный хаскель.


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

                                                                                                                                                              0
                                                                                                                                                              Что значит «а не»? У них только один язык за весь вузовский курс дают?

                                                                                                                                                              Так-то хаскель читать полезно, кто б спорил. Но в качестве первого языка, на мой взгляд, идея так себе.
                                                                                                                                                                +2
                                                                                                                                                                Что значит «а не»? У них только один язык за весь вузовский курс дают?

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


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

                                                                                                                                                                Фиг знает. Я наблюдал несколько разных людей, пытавшихся войти в айти, включая пару, что называется, гуманитариев до мозга костей, и записи вида n = n + 1 ломали им мозг, а equational reasoning был вполне близок.

                                                                                                                                                                  0
                                                                                                                                                                  записи вида n = n + 1 ломали им мозг

                                                                                                                                                                  А что тут мозголомного?
                                                                                                                                                                  Есть коробочка на которой написано «n», и мы кладём туда +1 предмет.
                                                                                                                                                                    +3

                                                                                                                                                                    Потому что тут нет никакого «положить», знак равенства ещё со школы означает равенство, а не «положить», так что для неподготовленного читателя тут написано «n равно n + 1».

                                                                                                                                                                      0
                                                                                                                                                                      так что для неподготовленного читателя тут написано «n равно n + 1».

                                                                                                                                                                      так если человек учит программирование, особенно на нормальном языке, там в самом начале проходят операторы, и что бывают логические (типа ==) и операторы присваивания (пресловутое =)

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

                                                                                                                                                                      p.s. не помню кстати у себя проблем с такими выражениями
                                                                                                                                                                        0
                                                                                                                                                                        В стародавние времена для присваивания («положить») использовался знак :=
                                                                                                                                                                        n := n + 1

                                                                                                                                                                        Но потом решили, что и просто '=' понятно.
                                                                                                                                                                        :)
                                                                                                                                                                          +1
                                                                                                                                                                          Ну, во-первых, := до сих пор применяется — в Дельфи.

                                                                                                                                                                          Во-вторых, := хоть и применялось еще в Алголе, но Фортран (где =) был раньше.
                                                                                                                                                                        0

                                                                                                                                                                        Добавлю, что частое заблуждение в связи с присваиванием в виде "a = b + c" что "a" это нечто, что вы бы называли функцией. Это нечто не хранит значение, а вычисляется в момент использования, используя значения из "b" и "c". Думаю это заблуждение как раз идет из школьной алгебры или физики.
                                                                                                                                                                        Поэтому "a = a + 1" — конструкция, которая всегда вызывает вопросы "а так разве можно?".
                                                                                                                                                                        Это заблуждение возникает поголовно у всех, с кем я занимался с "честного" нуля.

                                                                                                                                                                          0

                                                                                                                                                                          Ага. Вот что делает следующая конструкция?


                                                                                                                                                                          if (n = n + 1) { ... }

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

                                                                                                                                                          0
                                                                                                                                                          Выразительно и медленно совершенно не обязательно сочетается в одном языке.
                                                                                                                                                            0
                                                                                                                                                            Я не могу вспомнить быстрый выразительный язык.
                                                                                                                                                              0
                                                                                                                                                              Я не могу вспомнить быстрый выразительный язык.

                                                                                                                                                              А как же ванильный C?
                                                                                                                                                                +2
                                                                                                                                                                Он невыразительный и очень многословный. Не за это мы его любим :)
                                                                                                                                                                0

                                                                                                                                                                Какие критерии?
                                                                                                                                                                Можно начать рассматривать со Swift или Go.

                                                                                                                                                                  0
                                                                                                                                                                  В первую очередь краткость, читаемость и возможность реализовать произвольную идею из CS. Го, имхо, заточенный под индустрию язык: что в него заложено, то делается просто, а о чем не подумали авторы — то поразительно многословно.
                                                                                                                                                                    0

                                                                                                                                                                    OK. Против Swift есть претензии?
                                                                                                                                                                    Я ещё смотрю на старых зверей типа Java и на всякие Julia.

                                                                                                                                                                      0
                                                                                                                                                                      На Свифте и на Джулии и строчки не написал, честно говоря, так что высказывать что-либо не стану. Джава язык очень многословный, с вкраплениями магии. Я её помню с версии 1,5, с тех пор она стала лучше, но некоторый вещи туда всунуты с самого начала, и даже массивное переосмысление в 1,4 не до конца помогло. Собсна, это описано в лирической части книжки Эккерта.
                                                                                                                                                                        0
                                                                                                                                                                        с вкраплениями магии

                                                                                                                                                                        а где там магия?
                                                                                                                                                                          0
                                                                                                                                                                          Ну моё самое любимое:
                                                                                                                                                                          1. Отсутствие беззнаковых целых. С 1.8 шаманство для их реализации проще, но всё-таки шаманство
                                                                                                                                                                          2. Древнее развесистое дерево наследования, часть из которого deprecated, а в остальном можно запутаться. Как итог — введение стирания типов. Очень долго бегали от void* и каста к Object, а в итоге пришлось-таки сделать нечто подобное. Ну и единственный корень у дерева наследования мне не нравится, но это уже вкусовщина.
                                                                                                                                                                          3. Невозможность просто сделать неизменяемый массив-член класса. Слово const зарезервировано, но использовать его нельзя :)