Кто-то, начитавшись сайтов и блогов крупнейших компьютерных компаний, рассуждает так: «В Кремниевой долине что ни слово – то Java. Думаю, это – то, что мне нужно». Бывает и так: «Haskell. Он ведь на пике популярности. Страшно подумать, что будет дальше. Определённо – Haskell». И даже так: «Этот суслик на логотипе Go – такая няшка. Хочу знать Go».
Некоторые, движимые стремлением научиться программировать, ищут вот что: «Какой язык программирования выучить первым?».
Бывают вопросы, которые задают так часто, что, для ответа на них создают целые схемы. Вот, например, одна из них, посвящённая выбору первого языка программирования, подготовленная командой этого сайта.
Кликабельно:
Если рассмотреть эту схему, окажется, например, что Ruby подходит тем, кто ребёнком любил лепить из пластилина.
Выбор первого языка программирования может стать увлекательным занятием, как полусерьёзные опросники, вроде: «Кто вы из героев Квентина Тарантино?».
Но, прежде чем вы уйдёте с головой в изучение Ruby, причём, только потому, что в детстве жить не могли без пластилина, позвольте обратить ваше внимание на то, что первый язык программирования – это очень и очень важно. Слишком многое от него зависит.
Для того, чтобы хотя бы в общих чертах разобраться с выбранным языком, понадобятся сотни часов практики. Поэтому симпатичные логотипы и хитроумные схемы не должны сбивать вас с толку.
Выбирая первый язык стоит трезво оценить следующие факторы:
- Рынок труда.
- Долгосрочные перспективы языка.
- Сложность изучения языка.
- Что именно вы сможете создать в процессе изучения, и, показав окружающим, поддержать мотивацию.
Новые языки программирования появляются несколько раз в год. О них пишут статьи в научные журналы, им посвящают комиксы, которые можно найти в Сети.
Когда дело касается выбора первого языка программирования, вам придётся столкнуться с целой лавиной вариантов. Для того, чтобы немного сузить поиск, вот анализ поисковых запросов в Google за последние 12 лет, касающихся изучения программирования.
Из анализа поисковых запросов можно выяснить, что у Java были взлёты и падения. А, например, рейтинг Python постепенно рос, он стал чуть ли не самым популярным языком программирования. Есть здесь и один язык, простой, но обладающий замечательными возможностями, график интереса к которому год от года медленно растёт, хотя и находится в самом низу. Это – JavaScript.
Прежде чем говорить об этих языках программирования, позвольте кое-что уточнить.
- Я не берусь спорить о том, что некий язык объективно лучше любого другого.
- Я согласен с тем, что разработчики, в конечном счёте, изучают больше одного языка.
- Я за то, что в самом начале пути программисту следует хорошо изучить какой-то один язык. И, как вы скорее всего догадались, прочтя хитро замаскированную подсказку в заголовке, я полагаю, что этим первым языком должен быть JavaScript.
Начнём наш разговор о первом языке с рассмотрения того, как сегодня учат программировать.
Основы информационных технологий и обучение программированию
В вузах обычно учат программировать в рамках предметов по информационным технологиям, которые часто выглядят как дополнения к математическим курсам, либо привязаны к некоей основной специальности, скажем, к электротехнике.
Наверняка вы знакомы с этим высказыванием Эрика Рэймонда: «Образование в сфере компьютерных технологий точно так же не сделает из вас отличного программиста, как изучение кистей и красок не сделает вас прекрасным художником».
Сегодня, так же, как и раньше, большинство учебных заведений ставят знак равенства между программированием и информационными технологиями, а информационные технологии приравнивают к математике.
В результате множество вводных курсов по программированию построено вокруг достаточно низкоуровневых абстракций таких языков, как C, или языков, используемых в математических пакетах вроде MATLAB.
И те, кто принимают решения о том, чему учить на курсах по программированию, обычно придерживаются всяческих официальных источников, регулярно публикующих отчёты с рейтингами языков. Среди таких отчётов, например, TIOBE Index. А вот — таблица лидеров по версии IEEE.
Такие вот «таблицы лидеров» выглядят практически точно так же, как десять лет назад. Однако, всё меняется, даже в академических кругах.
Так, в 2014-м году Python обошёл Java, став самым популярным языком программирования в ведущих курсах по информационным технологиям в США.
И я уверен, что ещё одно изменение обязательно произойдёт, да что там говорить – это уже происходит.
Посмотрев на языки, которыми пользуются программисты, выполняющие реальные проекты, мы увидим совсем другую картину.
Вот результат опроса, который проводился на Stack Overflow в 2016-м году. В нём участвовало 49397 разработчиков. Более половины из них используют JavaScript.
Без JavaScript невозможна разработка веб-интерфейсов, а в последнее время, благодаря Node.js, растёт актуальность JavaScript в серверном коде. Этот язык стремительно распространяется и в другие области, такие, как разработка игр и интернет вещей.
Среди программистских вакансий JavaScript упоминается чаще, чем другие языки, если не брать в расчёт Java. Вот данные с крупнейшего агрегатора вакансий Indeed.com.
Неслучайно и то, что мы, на freecodecamp.com, собрали сообщество разработчиков, занятых проектами на JavaScript с открытым исходным кодом. За прошедшие два года более 5000 человек воспользовались Free Code Camp для того, чтобы найти свою первую работу в роли программиста.
Я, кстати, не ратую за JavaScript только потому, что обучаю на нём программировать. Всё, как раз, наоборот. Я обучаю этому языку именно потому что знание JavaScript – это верная дорога к первой работе программиста.
Но подходит ли JavaScript именно вам? Стоит ли ему становиться вашим первым языком программирования? Рассмотрим подробнее те факторы выбора языка, о которых я говорил выше.
Фактор №1: рынок труда
Если вы учитесь программировать из чистого любопытства и любви к интеллектуальным развлечениям, можете этот раздел пропустить. Но если вы, как и огромное количество других людей, изучаете программирование для того, чтобы с помощью приобретённых знаний и навыков найти работу, вам стоит обратить внимание на то, о чём здесь пойдёт речь.
Как я уже говорил, в объявлениях о вакансиях чаще всего упоминается Java. На втором же месте стоит JavaScript.
Но в случае с JavaScript надо учесть одну важную вещь. Хотя язык существует уже два десятка лет, лишь сравнительно недавно он превратился в серьёзный инструмент, с помощью которого гиганты вроде Netflix, Walmart и PayPal создают полноценные приложения.
В результате множество компаний нанимают JavaScript-разработчиков, но разработчиков этих не так уж и много.
Вот данные с Indeed.com, здесь показано соотношение вакансий и соискателей.
Итак, что мы видим. На одно место Java-разработчика приходится 2.7 программиста. В сфере вакансий, где требуется знание PHP, а также в среде iOS-разработки, складывается похожая ситуация.
Если же взглянуть на данные по JavaScript, то окажется, что на одну вакансию приходится всего 0.6 программиста. Для JavaScript-разработчиков это, определённо, рынок продавца.
Фактор №2: долгосрочные перспективы
JavaScript-проекты на GitHub получают, в среднем, в два раза больше pull-запросов, чем проекты на Java, Python или Ruby. И, кроме этого, JavaScript растёт быстрее, чем любой другой популярный язык.
Вот соответствующие данные GitHub Octoverse:
На экосистему JavaScript, кроме того, благотворно влияют серьёзные инвестиции, как финансовые, так и выражающиеся в человеческом капитале талантливых инженеров, от таких компаний, как Google, Microsoft, Facebook и Netflix.
Например, вклад в язык программирования с открытым исходным кодом TypeScript (расширенная версия JavaScript со статической типизацией) внесли более 100 разработчиков. Многие из них – сотрудники Microsoft и Google, которые получают зарплату за эту работу.
Подобную форму совместной работы компаний в среде Java найти сложнее. Например, Oracle, которая фактически владеет Java, поглотив Sun Microsystems, часто судится с компаниями, которые пытаются работать над этим языком.
Фактор №3: сложность изучения языка
Вот карикатура о сложности языков программирования от XKCD.
Большинство программистов согласится с тем, что высокоуровневые скриптовые языки сравнительно легки в изучении. JavaScript подпадает под эту категорию, вместе с Python и Ruby.
И даже, хотя в учебных заведениях языками, с которых начинают учить программировать, всё ещё являются такие, как Java и C++, разобраться в них значительно сложнее.
Фактор №4: проекты, которые можно создать, используя полученные знания
Вот здесь JavaScript нет равных. Он может работать на любом устройстве, на котором имеется браузер. Да вот хотя бы прямо здесь, где вы это читаете. В принципе, с помощью JavaScript можно создать практически всё, что угодно и распространить это по всему миру с уверенностью в том, что работать это будет практически на всём, что напоминает компьютер или мобильный телефон.
Повсеместное распространение JavaScript привело к такому знаменитому высказыванию Джефа Этвуда, сооснователя Stack Overflow: «Любое приложение, которое можно написать на JavaScript, будет в итоге написано на JavaScript».
С течением времени это высказывание, которое ещё называют «Законом Этвуда», не утрачивает актуальности.
В среде других языков можно наблюдать несколько иные тенденции. Например, однажды обещали, что Java будет работать буквально везде. Помните Java-апплеты? В начале этого года Oracle официально от них отказалась.
Python страдает от похожих проблем. Вот что по этому поводу написал Джеймс Хэг в статье о том, что пришла пора отказаться от Python, как от основного языка, используемого при обучении программированию. Ученик спрашивает: «Как мне дать эту вот игру, которую я написал, друзьям? Или, это будет даже лучше, можно ли как-нибудь записать её на мой телефон, чтобы я мог показать её всем в школе, а им не пришлось бы её устанавливать?». Учителю же, если речь идёт о Python, остаётся лишь хмыкнуть. В двух словах тут и не ответишь.
Если же говорить о JavaScript, то вот живые ответы на вышеупомянутый вопрос. Это – приложения, которые написали члены сообщества Free Code Camp в CodePen, пользуясь браузером.
Вот игра «Simon», созданная в стиле 1970-х.
Вот – реализация математической игры Джона Конвея «Жизнь».
Вот – страница поиска для Wikipedia, стилизованная под «Звёздные войны».
А вот – игра-«рогалик» с традиционным подземельем.
Первый язык: пройтись по верхам, или копнуть поглубже?
Сначала как следует изучите один язык. Затем принимайтесь за следующий.
Если вы будете прыгать от одного языка к другому, нигде толком не задерживаясь, далеко вам не уйти. Для того, чтобы продвинуться заметно дальше «Hello World», нужно как следует изучить ваш первый язык. После этого со вторым и последующим языками будет разобраться гораздо проще.
Хорошо освоив первый язык, вы сможете расширять познания, изучая другие языки и развиваясь как программист. Вот пара слов о языках, которые стоит рассмотреть после достойного освоения JavaScript.
- Изучение C – это отличный способ разобраться с тем, как, на самом деле, работают компьютеры, в частности, в плане управления памятью. C особенно хорош в высокопроизводительных вычислениях.
- C++ отлично подходит для разработки игр.
- Python нет равных в научных и статистических расчётах.
- Java пригодится тем, кто видит себя программистом в крупной компании.
Но сначала, повторюсь, стоит изучить JavaScript.
Так, а теперь хочу сделать невозможное. Собираюсь попытаться представить себе возражения некоторых читателей, критику JavaScript и моих идей, которая может появиться в комментариях, и на эту критику ответить.
Возражение №1. JavaScript – язык медленный
JavaScript, для большинства практических целей, так же быстр, как языки, которые традиционно считают высокопроизводительными.
JavaScript (речь идёт о Node.js) на порядки быстрее, чем Python, Ruby и PHP. Его быстродействие приближается к C++, Java и Go. Вот результаты одного весьма серьёзного теста производительности для различных языков программирования.
Возражение №2. В JavaScript нет статической типизации
Как Python и Ruby, JavaScript – это язык с динамической типизацией. И это, с одной стороны, удобно, а с другой – способно завести разработчика в лабиринт ошибок. Вот, например, здесь мне хочется, чтобы переменная exampleArray была массивом. Я записываю в массив значения, проверяю его длину, то есть – количество содержащихся в массиве элементов. Выглядит это так:
exampleArray = [1, 2]
-> [1, 2]
exampleArray.length
-> 2
Затем я случайно записываю в переменную строку, при этом, что ещё хуже, благодаря особенностям строкового типа данных в JavaScript, я вполне могу получить длину того, что считаю массивом, обратившись к свойству length:
exampleArray = "text"
-> "text"
exampleArray.length
-> 4
Ошибка на ошибке, одним словом. Подобные вещи постоянно возникают в языках с динамической типизацией. Большинство разработчиков справляются с ними, выполняя проверки в опасных местах и создавая тесты для своего кода.
Если же вам, в первом языке программирования, совершенно необходима статическая типизация, я всё равно рекомендую начать с JavaScript. После этого вы сможете быстро освоить TypeScript. Вот что говорит на эту тему Алекс Эверлоф: «Для того, чтобы освоить TypeScript, нужно время, но, если вы уже знаете JavaScript, всё будет гораздо быстрее и проще».
Возражение №3. Я очень хочу создавать мобильные приложения, поэтому JavaScript не для меня
Даже если так, я всё равно советую сначала изучить JavaScript. И, кстати, он вполне подходит для разработки мобильных приложений, причём, как их клиентской, так и серверной частей. А именно:
- В экосистеме JavaScript имеются несколько инструментов для разработки полноценных мобильных приложений. Например, это Angular Cordova и React Native.
- Для того, чтобы ваше мобильное приложение делало что-нибудь по-настоящему интересное, вероятно, ему понадобится серверная часть, построенная на некоей подходящей платформе, вроде Node.js + Express.js.
Кроме того, стоит отметить, что золотой век мобильных приложений уходит.
Для начала, хотя мобильными приложениями пользуются буквально все, по данным опроса Stack Overflow, в котором приняли участие 49525 программистов, практически половина из них занята в сфере веб-разработки. И лишь немногим более восьми процентов занимаются мобильными приложениями.
Мечты о том, что мобильные пользователи будут охотно работать с великим множеством специализированных приложений, не сбылись. Вместо этого владельцы смартфонов перестали загружать новые приложения.
Безусловно, программами они пользуются. В основном это Facebook, Google Maps и некоторые другие. Их не так уж и много. В результате основной спрос на разработчиков мобильных приложений сконцентрирован в нескольких крупных компаниях.
Сложно предвидеть перспективы развития рабочих мест для мобильных программистов. При этом многие задачи, касающиеся разработки, поддержки и распространения приложений для смартфонов и планшетов легче всего решаются с помощью JavaScript. В результате компании, вроде Facebook и Google, обеспечивают мощную поддержку лучшим JavaScript-инструментам для мобильной разработки.
По состоянию на 2016-й год, практически вся работа программистов сосредоточена на веб-проектах. Всё так или иначе связано с этой огромной платформой, со «Всемирной паутиной». И грядущее поколение бытовых приборов, с которыми можно будет разговаривать, и автомобили, которые будут сами забирать детей из школы – всё это тоже будет частью веба.
Из вышесказанного следует простой вывод: учите JavaScript.
Возражение №4: Разве JavaScript это не игрушечный язык, который был создан за десять дней?
Когда слышу подобное, сразу на ум приходит этот твит. А вообще, у JavaScript, конечно, необычная история. Это провоцирует. Наверняка вам доводилось читать и слышать, как кто-то отпускает шутки об этом языке.
Кстати, некоторым невероятно нравится критиковать C++. Но, как и JavaScript, C++ преуспел несмотря ни на что. Теперь он, точно так же, практически повсюду.
JavaScript – это ни разу не игрушка.
Удачной учёбы!
В итоге хочу сказать вот что. Если кто-нибудь станет вас доставать только потому, что вы изучаете JavaScript, а не «хит сезона», просто вспомните знаменитые слова Бьёрна Страуструпа, человека, который создал C++: «Существует лишь два вида языков программирования: те, которые постоянно ругают, и те, которыми никто не пользуется».
Удачи в изучении вашего первого языка программирования!
Комментарии (433)
Nagg
18.11.2016 13:24+73JS как первый язык?
Как-то так:kvaps
18.11.2016 14:27Вы заставили меня гуглить, как сделать сложение на js вместо конкатенации :)
6649166
18.11.2016 17:02Привести первый операнд к числу.
jetexe
18.11.2016 17:04+3Вот с этим вся и проблема. Причем JS не скажет тебе: «Чуваак, ты тут что-то странное сделать пытаешься, может не стоит, а?».
Первый язык не должен позволять стрелять по ногам из гранатомётов.DenimTornado
18.11.2016 20:11Это заставляет быть более внимательным… Если ты делаешь что-то вроде:
{} + []
То тут изначально что-то не то!
Singaporian
21.11.2016 11:10Да не надо гуглить. Все равно с его асинхронностью даже не узнаете, что у вас там. Ушло в глубины памяти и там где-то что-то случилось )))) Самое то для новичка — дебажить изначально асинхронный язык.
quantum
18.11.2016 13:27+3Вот результаты одного весьма серьёзного теста производительности для различных языков программирования.
А можно ссылочку?anmipo
18.11.2016 15:01+9Нашёл: Performance of several languages.
Подозрительно низкая производительность ассемблера объясняется дубовой прямолинейностью asm-кода (например, счётчики вложенных циклов постоянно перекидываются из регистра в регистр, хотя вполне можно было выделить каждому счётчику по регистру).
ASM-исходник%include "io.inc"
section .text
global CMAIN
CMAIN:
;mov rbp, rsp; for correct debugging
; Set to 0, the faster way
xor esi, esi
DO_LOOP1:
mov ecx, 10
LOOP1:
mov ebx, ecx
jmp DO_LOOP2
LOOP1_CONTINUE:
mov ecx, ebx
loop LOOP1
jmp QUIT
DO_LOOP2:
mov ecx, 32000
LOOP2:
mov eax, ecx
;call DO_LOOP3
jmp DO_LOOP3
LOOP2_CONTINUE:
mov ecx, eax
loop LOOP2
jmp LOOP1_CONTINUE
DO_LOOP3:
; Set to 32000 loops
MOV ecx, 32000
LOOP3:
inc esi
cmp esi, 50
jg COUNTER_TO_0
LOOP3_CONTINUE:
loop LOOP3
;ret
jmp LOOP2_CONTINUE
COUNTER_TO_0:
; Set to 0
xor esi, esi
jmp LOOP3_CONTINUE
; jmp QUIT
QUIT:
xor eax, eax
ret
am-amotion-city
18.11.2016 16:29+6Кроме того, performance of nested loops, даже если написана аккуратно на всех испытуемых языках, никаким образом не является «одним весьма серьёзным тестом производительности», а является всего лишь тестом производительности _вложенных циклов_. Экстраполировать даже и верные результаты такого теста на производительности _языков_ — довольно странно.
Для приложения, которому нужно открыть миллион сокетов / запустить миллион потоков / обработать миллион строковых файлов / перемножить миллион чисел с точностью до восьмисотого знака — этот тест не скажет вообще ничего.
А в реальной жизни задачи обычно именно такие, узкие и острые.zapolnoch
18.11.2016 20:39Вот здесь гораздо больше тестов. Результаты такие же. JS — самый быстрый интерпретируемый язык в мире. Он в 5-10 раз быстрее Питона и Руби на всех алгоритмах, которые измеряли в benchmarksgame. А измеряли они много всего разного.
am-amotion-city
21.11.2016 11:09Да, красивые картинки. Совершенно безотносительно сравнения производительности языков: вы же, надеюсь, понимаете, что из «А быстрее А1» и «Б быстрее Б1» никак не следует, что хитросплетенный «А и Б» — быстрее «А1 и Б1», правда? Иначе оптимизация мапредьюса была бы бессмысленной задачей: мап и редьюс по отдельности оптимизировали — и в путь.
Кроме того, понятие «быстрее» — очень эфемерное. Я вообще не люблю вот такие академические сравнения производительности. Это приятно, что твой родной язык в топе, но на большее они не годятся. Батлнек *никогда* не бывает в производительности самого языка. Ни-ког-да.
s-kozlov
21.11.2016 11:33Батлнек *никогда* не бывает в производительности самого языка. Ни-ког-да.
https://habrahabr.ru/post/187214/am-amotion-city
21.11.2016 12:31И что это доказывает? Что исполнение скомпилированного кода обычно быстрее, чем интерпретация? Сенсация!
Батлнек и оптимизация — разные вещи. Я имел в виду, что добиться выигрыша в производительности путем перехода с DFD на KJY (буквы случайны), увидев, что последний показывает лучшие результаты на синтетических тестах — невозможно.s-kozlov
21.11.2016 14:00Я имел в виду, что добиться выигрыша в производительности путем перехода с DFD на KJY (буквы случайны), увидев, что последний показывает лучшие результаты на синтетических тестах — невозможно.
Это еще почему?
1) Пишем код на PHP.
2) Смотрим результаты синтетических тестов для PHP и Java.
3) Переписываем код на Java.
4) ???
5) Profit!am-amotion-city
21.11.2016 14:24Если вы перепишете код на Java «в парадигме PHP» (просто переведете синтаксис), он может с равной вероятностью оказаться быстрее, медленнее, таким же.
Я не отрицаю потенциальную вероятность починить все переходом на другой язык, ок, хорошо :)
Просто обычно там, где переход с DFD на KJY в пределах одной команды даст, например, 10% прироста производительности — грамотный архитектор, смена команды, выделение какого-нибудь узкого места в микросервис на хаскеле, юнеймит — даст 50%. Я об этом.
s-kozlov
21.11.2016 14:43Если вы перепишете код на Java «в парадигме PHP» (просто переведете синтаксис), он может с равной вероятностью оказаться быстрее, медленнее, таким же.
Ну если считать вероятности как в анекдоте про вероятность встретить динозавра…am-amotion-city
21.11.2016 15:08Нет, это не «если считать вероятности как в анекдоте про вероятность встретить динозавра», это «если понимать, чем PHP и Java отличаются друг от друга».
Пример: померяйте рендеринг динамической странички 404 без кэша (помните, мы переписываем как есть, не меняя парадигмы) на голом PHP и на Java.
Постарайтесь понять, о чем я говорю, пожалуйста. Это не сложно.
s-kozlov
21.11.2016 17:07Постарайтесь понять, о чем я говорю, пожалуйста. Это не сложно.
Я не владею двоемыслием, поэтому никак не могу понять, как может быть одновременно «исполнение скомпилированного кода обычно быстрее, чем интерпретация» и «добиться выигрыша в производительности путем перехода с DFD на KJY (буквы случайны), увидев, что последний показывает лучшие результаты на синтетических тестах — невозможно».
Пример: померяйте рендеринг динамической странички 404 без кэша (помните, мы переписываем как есть, не меняя парадигмы) на голом PHP и на Java.
Возможно, я ошибаюсь, но что-то мне подсказывает, что Java отдаст 100500 страничек быстрее, чем PHP будет 100500 раз запускать процесс и умирать.
webkumo
22.11.2016 13:13На java переходят не столько для ускорения работы, сколько для получения хоть каких-то гарантий надёжности. ИМХО.
PS видел такииих монстров на java… LifeRay, например… а ведь пользуются же!
Regis
18.11.2016 18:38Посмотрел на тесты — там Java-вский JIT вполне мог повыкидывать циклы (по крайней мере частично).
Поэтому не удивительно, что у Java лучший резлуьтат. Но этот результат относится только к данному тесту и очень мало что говорит о производительности в реальных задачах.
PS: 6 секунд у Java в этом теста — это фактически время на «прогрев». Наверняка если размер одного из циклов увеличить в 10 раз, то не получится 60 секунд, а много меньше.
ideatum
19.11.2016 20:54Про asm все ясно, на нем нужно уметь писать. Особенно для интеловских процессоров, Optimization Guide — 700 страниц убористого текста. А вот тест этот запустил на своей машине и результаты несколько отличаются от приведенных выше. Самым быстрым у меня оказался С/С++, по мне так очень ожидаемо. Больше всего удивил результат с JavaScript. Было бы интересно посмотреть на другие результаты
Я приведу относительные значения:
C/C++ MSVC/Windows - 1.00
C/C++ GCC/Ubuntu - 1.00
C# (.Net 4.61/Windows) - 1.22
C# (.Net Core/Ubuntu) - 1.50
Java 8 (Oracle/Windows) - 1.56
Java 8 (Oracle/Ubuntu) - 1.56
JavaScript (Edge 14.14393/Windows) - 1.27
JavaScript (Chrome 54/Windows) - 4.60
Код JavaScript<button onclick="javascript: benchmark();">Run</button> <div id="output"></div> <script type="text/javascript"> function benchmark() { const t0 = new Date(); let i_counter = 0; let i_loop1 = 0; let i_loop2 = 0; let i_loop3 = 0; for (i_loop1 = 0; i_loop1 < 10; i_loop1++) { for (i_loop2 = 0; i_loop2 < 32000; i_loop2++) { for (i_loop3 = 0; i_loop3 < 32000; i_loop3++) { i_counter++; if (i_counter > 50) { i_counter = 0; } } // If you want to test how the compiler optimizes that, remove the comment //i_counter = 0; } } const t1 = new Date(); // This is another trick to avoid compiler's optimization. To use the var somewhere println("Counter: " + i_counter); println("Elapsed time: " + (t1.valueOf() - t0.valueOf()) + " ms"); } function println(s) { const element = document.getElementById("output"); var para = document.createElement("div"); para.textContent = s; element.appendChild(para); } </script>
ivsol
18.11.2016 13:35+1Всем добр(ый|ая) (день, ночь, утро, вечер)!
Серебряной пули не существует, по простой причине что люди — разные, как и ЯП.
Поэтому какой яп изучать первым это уже личное предпочтение, новичка только можно ознакомить с возможностями определенных яп области, в которую он хочет погрузиться.
dimack
18.11.2016 13:35+15Не согласен с автором.
Первый язык, который стоит выучить, это, однозначно, C/C++.
Зная С++ вы не только за недельку другую освоите JavsScript, но и сможете покопаться в его движке и узнать все его секреты.
Зная С++ вы так же довольно легко сможете изучить любой другой язык, который там сейчас в моде, и при этом будете специалистом более высокого класса.
Не тратьте свое время на JavaScript, начинайте с базовых языков.bigfatbrowncat
18.11.2016 14:19+25Как человек, который не только пишет на C++, но и, о ужас, любит его (как и Java), скажу, что начинать изучение программирования с C++ — самый верный способ навсегда отвадить себя от этого занятия.
Я учился на Pascal. Синтаксис C казался непонятным, потому что там мало слов и много хитрых скобочек. Если бы мне в тот момент кто-то показал C++, я бы испугался, подумал, что это ужас-ужас-как-сложно и сбежал бы из этой темы. Возможно, навсегда.
У JS есть одно неоспоримое преимущество: она имеет мощнейший среди всех UI, установленный абсолютно на ккаждом компьютере. Остальные плюсы-минусы для новичка малозначительны.
TargetSan
18.11.2016 14:23+4Как С++-ник с некоторым стажем, категорически с вами не согласен. С++ — просто рассадник костылей и всяческих неочевидностей. Половина его 1600-страничного (на данный момент) стандарта — либо Undefined Behavior, либо Implementation Defined. Утрирую конечно, но впечатление иногда именно такое. А с инструментарием "из коробки" вообще печаль-беда.
michael_vostrikov
18.11.2016 14:55+4В универе 5 лет писал лабы на C++ и не знал ни про какие undefined behaviors) А потом когда узнал, решил, что ну его нафиг все это изучать, и занялся веб-программированием.
Это я к тому, что для обучения необязательно лезть в дебри промышленного применения языка. Int/float, строки, управление памятью, классы с наследованием — этого достаточно для получения уверенных навыков. Потом можно переходить на что-то другое. Так что считаю C++ нормальным вариантом для первого языка.TargetSan
18.11.2016 15:44Увы, никогда не знаешь из какой норы вылезет хорёк и грызанёт за пятку.
Я бесспорно уважаю С++. Но он становится всё более и более монструозен. Причём бестолково монструозен. В 17-м стандарте вы сможете использовать зета-функцию Римана и другой матан. Но по-прежнему будете выписывать типы итераторов руками — потому что все ждут Благословенных Рейнджей. Пренебрежительность тут не к самому предложению, которое считаю отличным, а к тому, что если его примут к 20-му — я ооочень сильно удивлюсь. Или втянете Буст, который размером со среднего слонопотама — и практически не подлежит декомпозиции.
В общем давайте закончим. Не хочу разводить очередной холивар.Randl
18.11.2016 20:33+2А кто то до сих пор пишет типы итераторов руками вместо
auto
, пользуясь 17-ым стандартом?TargetSan
18.11.2016 20:43+1При чём auto к итераторам для кастомных коллекций или любым трансформациям последовательностей?
bigfatbrowncat
18.11.2016 23:10Я пишу. Не всегда, но часто. Просто чтобы явно обозначить тип.
Чем больше перекладываешь на компилятор, тем больше вероятность, что он тебя неверно поймет, а потом выкинет страшную длинную ошибку с несовместимостью придуманных им же типов.
Уж лучше я напишуvector::const_iterator руками.
khim
18.11.2016 18:02+1В универе 5 лет писал лабы на C++ и не знал ни про какие undefined behaviors)
Лабы можно вообще писать на чём угодно, хоть на FORTRANе. А вот как только начинаешь писать что-то мало-мальски серьёзное — так UB и начинает «кусаться». А поскольку список UB — это не то, про что должен знать разработчик компилятора, а то, что должен знать каждый программист (иначе он не сможет их избегать), то да — для обучения C++ не очень-то годится…michael_vostrikov
18.11.2016 20:23+2Речь идет о языке для обучения, а не для написания чего-то мало-мальски серьезного. При обучении нет программ, которые идут в продакшн. Лаба либо работает, либо нет, это заметно сразу. Тем более что с оптимизацией никто не заморачивается, и программа разрабатывается и компилируется в debug-режиме. Для обучения условиям, циклам и целочисленным вычислениям C++ вполне подходит.
В каждом языке есть свои особенности, которые должен знать каждый программист, и которые новичок не знает. Это не значит, что новичкам ни один язык не подходит.
khim
18.11.2016 22:30+1Речь идет о языке для обучения, а не для написания чего-то мало-мальски серьезного.
Погодите — а в какой момент «обученный» таким образом программист сможет писать что-то серьёзное?
Если вы используете для обучения «обучающий язык» (неважно — Pascal или Logo), то всё просто: пока вы обучаетесь — вам неважно что там с UB происходит, начнёте работать — изучите всё, что нужно в рамках изучения C++.
А если вы сразу на C++ ваши лабы пишите — то как и в какой момент вы научитесь не использовать «по ошибке» UB?
В каждом языке есть свои особенности, которые должен знать каждый программист, и которые новичок не знает. Это не значит, что новичкам ни один язык не подходит.
Почему же. Им подходит любой язык в котором подобные особенности встречаются достаточно редко при написании реальных программ. C++ к ним, увы, не относится.michael_vostrikov
19.11.2016 07:49Погодите — а в какой момент «обученный» таким образом программист сможет писать что-то серьёзное?
Переход к серьезным проектам начнется в тот момент, когда он "обучится" и начнет пробовать писать что-то сам.
Если вы используете для обучения «обучающий язык» (неважно — Pascal или Logo), то всё просто: пока вы обучаетесь — вам неважно что там с UB происходит, начнёте работать — изучите всё, что нужно в рамках изучения C++.
То есть, учился он на Паскале, потом приходит к работодателю и говорит "Я на C++ не писал, что такое UB не знаю, возьмите меня на работу, я все изучу честно-честно".
А если вы сразу на C++ ваши лабы пишите — то как и в какой момент вы научитесь не использовать «по ошибке» UB?
Когда освоюсь с основами составления программ и начну писать более серьезные проекты, искать информацию о том, как что-то сделать самому, пытаться устроиться на работу в коллектив к другим программистам и т.д. Вариантов много, но для каждого надо уже уметь написать что-то на языке.
Undefined behavior конкретного языка это не то, что нужно знать при обучении основам программирования, которые от языка не зависят.
s-kozlov
19.11.2016 09:14Человек, выучивший 1 ЯП, идет устраиваться на работу? И где-то таких берут?
poxu
19.11.2016 10:45Таких — отрывают с руками. Как правило на работу идёт человек, который и одного языка толком не знает, но знает достаточно, чтобы приносить какую-то пользу.
michael_vostrikov
19.11.2016 11:32Если десктопное приложение, то почему бы и нет. Да если даже Pascal, SQL, Prolog и Lisp. Без знания C++ его на работу с C++ никто не возьмет. Значит он должен изучить его при обучении. А чтобы устранять UB в конструкциях языка, надо сначала научиться их составлять. И здесь нет большой разницы, писать
Function f(a: integer, b: integer): integer; f := a + b; End;
или
int f(int a, int b) { return a + b; }
Tairesh
18.11.2016 15:18+10Зная С++ вы не только за недельку другую освоите JavaScript, но и сможете покопаться в его движке и узнать все его секреты.
Умея управлять космическим кораблём вы не только за недельку-другую освоите радиоуправляемый вертолёт, но и сможете покопаться в его движке и узнать все его секреты. Вперёд, на симулятор Союза ТМА!boldyrev_gene
18.11.2016 16:36Ну такое… Радиоуправляемый вертолет реально можно спокойно за неделю освоить… )
RealFLYNN
18.11.2016 17:26-1Никогда не забуду лицо своего товарища, изучавшего С++ в универе, когда я впервые показал ему функцию высшего порядка.
JS хорош для образования тем, что он мультипарадигмален — на нем можно изучить и ООП и функциональщину.ToSHiC
18.11.2016 21:13В C++ это называется метапрограммирование. Шаблон принимает одну функцию, а возвращает другую, сплошь и рядом встречается.
dkozh
18.11.2016 22:56+2Никогда не забуду лицо своего товарища, изучавшего С++ в универе, когда я впервые показал ему функцию высшего порядка.
template<typename In> auto twice(In x, int arg) { return [=] { x(arg); x(arg); }; }
— Не-не-не, Дэвид Блейн, это же шаблоны, как я это в библиотеку скомпилирую?
std::function<void()> twice(std::function<void(int)> x, int arg) { return [=] { x(arg); x(arg); }; }
Много чего плохо в C++, но с функциями высшего порядка вроде ОК :)
Skull
18.11.2016 13:36+12В экосистеме JavaScript имеются несколько инструментов для разработки полноценных мобильных приложений
С морем костылей и велосипедов изнутри
MonkAlex
18.11.2016 13:44+2Я, кстати, не ратую за JavaScript только потому, что обучаю на нём программировать. Всё, как раз, наоборот. Я обучаю этому языку именно потому что знание JavaScript – это верная дорога к первой работе программиста.
И больше ничего, кроме JS, после этого заявления, в статье не оказалось. Слишком сильный упор на JS, я бы не хотел начинать с него, когда вижу, что на нём частенько пишут…
alexkunin
18.11.2016 13:45+6Если новичок желает ознакомиться программированием как таковым, ему нужно — я убежден в этом — что-то простое, консольное, абстрагированное от операционки и железа, императивное, однопоточное. Какой-нибудь ТурбоПаскаль. А то ведь яваскрипт, пхп и все остальное тянет за собой целый стек технологий, и поток знаний может смыть весь энтузиазм (или превысить когнитивные способности).
Правда, чем старше новичок, тем больше ему хочется получить что-то практически значимое. А ведь перед его глазами эксель, гугл поиск, шазам, игры, автоматические переводчики… Так что может быть — если новичок примерно в курсе современного зоопарка технологий — сразу его на что-то интегрирующее подсадить? Что-то вроде яху пайпс (уже почивших). Может что-то еще такое есть?
Если же у новичка уже задача есть, то она в большой степени диктует язык и технологии. Лучше поговорить со специалистами и на основании их мнения что-то выбрать. Для веба посоветуют питон или пхп, ноду уже врядли (для новичка-то!), и уж точно никто не будет рассказывать про хаскель в контексте веба (разве что тролль какой-то).stokker
18.11.2016 15:43-2Если человек только учится программировать, то вопрос ни в коем случае не должен стоять про используемость этого ЯП на практике. Поэтому только Паскаль!
boldyrev_gene
18.11.2016 16:59+1Что Вам мешает открыть консоль в браузере и начать писать на js? :)
alexkunin
18.11.2016 17:33+4Как я уже сказал, яваскрипт не сам по себе — это целый стек технологий в браузере и вне его. А конкретно вот эти задачи решаются в нем так, что кривая обучения как-то сразу круче эвереста:
* спросить у человека его возраст (ReadLn в паскале, в браузере — диаложек)
* задержка (Delay в паскале, в браузере — концепция колбеков, возможно сразу с замыканиями, и вообще всякая асинхрощина — из понятного императивного программирования вы переходите в чертичто, в чем новичок сразу потеряется)
* вывести что-то по координатам (GotoXY в паскале, в браузере — ну тут конкретно нужно в дом лезть, парой строк не обойдешься)
* отреагировать на нажатие клавиш в реальном времени (в паскале это ReadKey в цикле, можно с Delay, а в браузере вы вываливаете на новичка концепцию событий и обработчиков, которые нужно вешать на дом)
Попробуйте запрограммировать в браузере крестики-нолики, змейку или теннис (классические игры), и попробуйте в паскале или другом консоль-ориентированном окружении. Небо и земля, и не в пользу яваскрипта.boldyrev_gene
18.11.2016 17:40Ну если брать задачи из книжек, написанных когда веб только развиватся начал, то пожалуйста, проблем хватает. Но так-то и программа обучения должна технологии соответствовать…
Я не в коем не агитирую брать JS как единственный подходящий для обучения язык, но вот если меня спросят, что учить, чтобы попасть в it, то я скажу веб, т.к. за другие сферы я не могу судить и сказать человеку что-то вроде: «когда начнет получатся, то работа найдеться.».
О всяких языках не имеющих практического применения в наше время я вообще говорить не буду, т.к. только если ты студент, то можешь себе позволить потратить время на изучение «мертвого» языка для крепкого освоения основ, а у студента как бы и выбора не будет между языками, ему что сказут учить, то он и будет учить.alexkunin
18.11.2016 17:54+6Я занимался обучением студентов языкам программирования, а также занимался этим в частном порядке с представителями разных возрастных групп. У людей с первых минут трудности с формализацией задачи на естественном языке, с понятием «переменная», с линейностью программы (ну, как так получается, что раньше исполняется то, что выше? почему так?). Госспаде, да они больше тушуются, пытаясь английские буквы на клавиатуре найти, а уж Home, End и Enter при них нажмешь — и ступор. И среда разработки, которая что-то там подсказывает (исходя из исходного кода с опечатками и ошибками), и это ни в какие ворота не лезет.
Так что даже паскаль — довольно круто для начала. Но уже ничего так, укладывается во многие концепции среднего здравомыслящего человека. И на этих концепиях можно постепенно выстроить понимание колбеков, промисов, асинхронщины, многопоточности. Ну, разве что целью является говнокодер, непонимающий толком что он делает.
В общем, метафоричеки, если человек задался целью изучить высшую математику с нуля, то ему лучше начать с арифметики и алгебры, а не с диффуров и линейного программирования.fuCtor
19.11.2016 08:44У людей с первых минут трудности с формализацией задачи на естественном языке, с понятием «переменная», с линейностью программы (ну, как так получается, что раньше исполняется то, что выше? почему так?). Госспаде, да они больше тушуются, пытаясь английские буквы на клавиатуре найти, а уж Home, End и Enter при них нажмешь — и ступор. И среда разработки, которая что-то там подсказывает (исходя из исходного кода с опечатками и ошибками), и это ни в какие ворота не лезет.
Веду лабы по программированию уже лет 5, в качестве языка С. Такой же опыт. В 80% перехожить собственно к написанию программы рано, т.к. не могут решить задачу в голове и формализовать ее.
Из последнего: самые первая лаба, нужно просто написать линейную программу, разлочить сумму на наминал + кол-во. Что может быть проще, но студент впадает в ступор. Спрашиваю его самого, сколько и чего надо, отвечает. На вопрос как он это посчитал, ступор.
В принципе стараюсь донести до них не знание конкретного языка, а в целом понимание того как составлять программу, т.к. язык как уже 100500 раз писали учится за пару месяцев. Читать его можно после беглого прочтения документации и усвоения базовых конструкций.
s-kozlov
19.11.2016 09:17+6когда начнет получатся, то работа найдеться
Оффтоп: эту фразу надо на русском языке разбирать как отличный пример того, как можно в одном предложении перепутать «тся» и «ться» в обе стороны.
evocatus
18.11.2016 19:03-2JS сам по себе даже файл с диска не в состоянии открыть.
boldyrev_gene
18.11.2016 19:05-1Вы предлагаете разрешить непонятным скриптам с любого сайта ковырятся на пользовательских компьютерах? :)
ildarz
18.11.2016 13:45+12Сам подход вообще очень забавен. «Хочу заниматься физическим трудом, какой инструмент лучше освоить — лопату, кирку или пилу?» Стать программистом — это вообще как понимать? «Хочу фигачить пальцами по клавиатуре, набивая на экране буковки, чтобы потом нажать на кнопочку, и буковки превратились в красивую картинку?» Что конкретно интересно? Предметная область какая? Именно ей инструменты определяются. Обучение программированию ребенка — одно, игрушки писать — другое, веб-сайты — третье, системное программирование — четвертое, суровый мир энтерпрайз-приложений — пятое, если интересна собственно computer science — шестое…
evocatus
18.11.2016 19:06+2И ещё этот жуткий подход — не хочу изучать ничего, кроме того, что немедленно позволит получить высокооплачиваемую работу. Это подход карьериста, а не программиста.
На эту тему хорошо говорит один из авторов Agile манифеста «Uncle» Bob Martin. Рекомендую его лекцию «The Future of Programming».
bogolt
18.11.2016 20:45+1Полностью согласен.
Одно дело показать человеку который не планирует зарабатывать на жизнь программированием как облечать себе жизнь простыми скриптами, или как настроить свою веб-страницу ( тут любой питон или js подойдут ), и совсем другое учить будущих программистов. Во втором случае я уверен, что необходимо начинать с языка который не прячет управление памятью, а напротив дает программисту полный контроль над программой. Черные ящики конечно штуки хорошие, но я считаю что человек должен разбираться в инструментах которыми он пользуется.
Vilyx
18.11.2016 13:45+30Сложно придумать хуже язык для изучения первым чем JS. Особенно, если заниматься самообучением. Вот я ввожу в гугле JavaScript для чайников и мне предлагают написать HTML страничку чтобы запустить мой первый код. Допустим это не так сложно, и я немного освоился, опустим сложности с this, === и наследованием. Теперь я хочу написать что-то минимально полезное с интерфейсом, мне опять нужно либо лезть в Node.js, либо в HTML/css, чтобы получить консольный или нормальный интерфейс.
А теперь сравните этот старт с C#, Microsoft предлагает бесплатное IDE, идеальное для разработки. Понятное и простое поведение this, сложность может возникнуть разве что с пониманием ссылочных и значимых типов. Если нужен интерфейс, то в той же IDE есть визуальный инструмент для его создания.
У меня создалось такое впечатление, что автор статьи ни разу не пытался никого научить программированию и из-за этого оторван от реальности. Сразу вспоминается смешная картинка с кривой обучения. Если хотите кого-то отговорить изучать программирование, то лучше JavaScript'a будет, наверное, только Lisp или Brainfuck.seryh
18.11.2016 14:59+9Определенные диалекты Lisp получше JavaScript будут. Совершенно несправедливо записали вы его в один ряд с Brainfuck.
Vilyx
18.11.2016 15:38-5Lisp, возможно, хороший язык, не зря же он жив до сих пор. Но как первый язык программирования я бы всё-равно его советовал на уровне с Brainfuck.
AnutaU
18.11.2016 17:08+10Тем не менее, его долгое время изучали именно как первый (см SICP), и вполне успешно, похоже.
Vilyx
18.11.2016 17:57-4Для кого-то и ассемблер был первым и успешно, но это не значит, что это хороший вариант для старта сегодня.
seryh
18.11.2016 18:38+2Вы совершенно неверно ассоциируете Lisp с чем то древним. Возьмем диалект Clojure, современный и активно развивающийся диалект lisp под JVM, за него могу сказать что он намного проще чем JavaScript и стартануть с него в современную фронтенд веб-разработку на ClojureScript намного проще чем скажем с ворохом js либ в виде react+redux+babel+webpack+lodash+npm+nodejs
Vilyx
18.11.2016 18:52-4От вас это читаю впервые. Последний раз сталкивался с Lisp в университете и исхожу из собственного опыта. Я не говорю, что Lisp плохой язык, я говорю, что для первого языка он не подходит на мой взгляд.
AnutaU
18.11.2016 19:44+3Я после университета потом долго боялась даже смотреть на Lisp, настолько отбили всё желание. Понадобилось почти 10 лет, чтобы распробовать. Насчёт первого языка не знаю, личного опыта нет, поэтому и ссылаюсь на SICP (это всё-таки опыт преподавателей лучших вузов, проверенный на тысячах студентов). Но последнее время я иногда балуюсь теорией языков программирования и вижу, что Lisp потрясающе хорош для понимания того, как работают другие языки.
RUQ
18.11.2016 15:11+2Хм, позвольте не согласиться с вашей логикой.
Теперь я хочу написать что-то минимально полезное с интерфейсом
в HTML/css, чтобы получить консольный или нормальный интерфейс.
Так вы хотите или не хотите написать что-то с интерфейсом?
А теперь сравните этот старт с C#, Microsoft предлагает бесплатное IDE
Класс, то есть написать пару строчек в любом текстовом редакторе, сложнее чем установить всю эту громадину от MS? Не говоря уже, о разработке на любой операционной системе кроме Windows.Vilyx
18.11.2016 15:51Можете соглашаться, можете нет, но есть сухие факты:
1) Мало кому нравится писать консольные программы и радоваться их исполнению, особенно на старте изучения программирования, и стоит отметить, что радость очень хороший мотиватор. Но ознакомление с синтаксисом лучше начинать с консольного hello world в четыре строки, чем с целой мешанины html и js.
2) Судя по данным Net Applications доля linux 2%, доля Macos 10%, т.е. в 88% случаев windows уже стоит. А установить Visual Studio гораздо проще, чем пытаться понять почему страничка написанная в блокноте работает, но подключить библиотеку из js файла не получается. Ах да, надо установить IDE для разработки, ой, в случае с JS ещё надо найти бесплатную, а ещё надо её настроить, если вдруг всё не настроено по умолчанию.
В общем хотел бы я посмотреть на таких самоучек, которые решать начать с JS.RUQ
18.11.2016 16:15Судя по данным Net Applications доля linux 2%, доля Macos 10%
Да, только эти 10% + 2% как раз и есть программисты.)
А установить Visual Studio гораздо проще, чем пытаться понять почему страничка написанная в блокноте работает, но подключить библиотеку из js файла не получается.
Серьёзно? Установить VIsual Studio + разобраться в синтаксисе C#, построить UI (а мы же говорим именно про него) легче чем подключить js файл к html?
Ах да, надо установить IDE для разработки, ой, в случае с JS ещё надо найти бесплатную, а ещё надо её настроить, если вдруг всё не настроено по умолчанию.
Ну Вы или намеренно лукавите, или не знаю. В отличии от C#, для JS никакая IDE ненужна. Как раз это я и написал вам. Я честно говоря только одну платную IDE для JS — WebStorm, да и 90% людей используют Sublime/Vim/Notepad++Vilyx
18.11.2016 16:22-2Да, только эти 10% + 2% как раз и есть программисты.)
Т.е. я уже не программист? И тот, кто хочет стать программистом, сразу устанавливает себе Linux или бежит покупать Mac, только потом начинает изучение?
Серьёзно? Установить VIsual Studio + разобраться в синтаксисе C#, построить UI (а мы же говорим именно про него) легче чем подключить js файл к html?
т.е. при изучении JS в синтаксисе разбираться не надо? И да, в Visual Studio легче построить интерфейс и навесить на него обработчики нажатий, чем сделать то же самое в JS+HTML.
В отличии от C#, для JS никакая IDE ненужна.
Да что вы говорите? Откройте в хроме index.html с подключенной js. Что вы увидите? Что JS не загрузился из-за ограничений безопасности, оказывается нужно запускать хотя бы на локальном сервере, который в Webstorm работает сам по себе, а в перечисленных вами редакторах надо настраивать, о чем я и написал.tautomer
18.11.2016 20:52+1Подключаемый js можно скачать в папку к html и не будет никаких ограничений безопасности.
Vilyx
18.11.2016 21:36-2Ну конечно же, всякий начинающий знает все эти нюансы. Вот каждый раз сталкиваясь с новой задачей я мечтаю о том с какими новыми трудностями столкнусь, а не о том как решится моя проблема, пфф, жалкие людишки, им лишь бы всё по проще.
tautomer
19.11.2016 11:56+1Это вовсе не нюанс. На сайте любой js библиотеки есть ссылка скачать. И только как альтернатива ссылка на какой-нибудь cdn. А если начинающий делает по уроку, то тем более никто не скажет подключай ссылкой. Урок же для начинающих. Вот когда я делал Three.js, то да, могли бы и написать, что локально модель в .obj файле не подключишь.
Alexsandr_SE
18.11.2016 15:56Устанавливать все равно нужно что-то. Даже джава стоит далеко не на всех машинах.
boldyrev_gene
18.11.2016 17:02+4Microsoft предлагает бесплатное IDE, идеальное для разработки.
Ни в коем случае не критикую ничьи программные продукты, но так перехвалить ни один не могу )Vilyx
18.11.2016 18:08+1Я бы так не сказал, если бы не перепробовал вагон и маленькую тележку разных IDE для разных языков. И на мой взгляд Visual Studio одна из лучших наряду с продуктами JetBrains.
Bringoff
18.11.2016 17:03+3Я бы наоборот наверное, сейчас бы пробовал первым учить как раз Lisp (Scheme, почему бы и нет?), хотя бы до уровня "умею решать алгоритмические задачки".
Vilyx
18.11.2016 18:05Попробуйте, будет интересно узнать о результатах.
Bringoff
18.11.2016 18:49Я пробую, но это уже не первый язык получается :) Просто если бы я осознавал все то, что я понимаю на данный момент, возможно, Lisp стоил бы того, чтобы начать с него. Но это мне сейчас так кажется, может быть и такое, что я ничего бы не понял.
lagranzh
20.11.2016 09:07Не знаю как сейчас, но когда мы учились, у нас курс "введение в програмирование" был на паскале, а вот в MIT на scheme. А это диалект лиспа.
impwx
18.11.2016 13:47+16Будь Эдсгер Дейкстра сейчас жив, он бы назвал JS и PHP Бэйсиком нового поколения. Если начинать программировать с них, то крепко привыкаешь к магии и костылям, а переучиться потом стоит немалых усилий.
Наиболее подходящими для обучения программированию языками считаю Python и C#.marfenkov
18.11.2016 15:22Мне кажется, люди слишком серьёзно относятся к этому высказыванию Дейкстры о бэйсике. Не так-то много навыков приобретается в начале пути, чтобы потом «переучиваться». Верю, что можно начать на PHP и стать, на пример, хадкорным сишником… Но первый язык не должен отвлекать от самого программирования, поэтому ИМХО в C# слишком много того, что не нужно на начальном этапе, я имею в виду и фишки в самом языке и IDE. Python — практически идеальный вариант, разве что он не статически типизированный да и той самой магии там тоже хватает.
impwx
18.11.2016 15:55Сужу по себе — начинал как раз с С, но быстро попал под развращающее влияние PHP. Наиболее вкусными возможностями казались как раз те, которые считаются «плохим тоном» —
register_globals
, словаремассивы, написание кода прямо внутри верстки.
Как в восточных боевых искусствах, путь к совершенству в программировании начинается со смирения. У начинающего кодера много гордости и энтузиазма. Ради свободы самовыражения он готов за сигнатурой каждого метода лезть в интернет, тратя время и полагаясь на не всегда актуальные мануалы. И только когда человек признает, что поддерживаемость кода важнее количества сэкономленных символов, что компилятор умнее его и все ограничения взяты не с потолка, начинается его становление как профессионала.
Для обучения C# лучше всего использовать в связке с LINQPad, а не с Visual Studio. Там можно сразу запускать простые примеры, не загружая новичку голову структурой проекта, классами и пространствами имён.boldyrev_gene
18.11.2016 17:16То что в языке с давних времен остались вещи, которые, не стоит использовать — не означает, что вы обязаны их использовать. Не надо говорить, что язык плохой, если вы не можете прити к хорошему решению задачи.
impwx
18.11.2016 17:41Я вам обратное скажу — если на языке возможно прийти к хорошему решению задачи, это еще не значит, что сам язык хороший. В руках мастера любой инструмент хорош, но мы же говорим об обучении новичков, которые не знают тонкостей, а тут — чем проще сделать ошибку, тем хуже.
boldyrev_gene
18.11.2016 17:46Просто надо изучать не по учебмным материалам, которым больше десяти лет. По php есть хорошие ресурсы, и если изучать язык следуя им, Вы можете даже не узнать, о возможности написать такую «каку»
impwx
18.11.2016 18:34Опять же, это доказывает только то, что php возможно выучить, если знать, что именно читать. Но новичок не знает, а в магазинах до сих пор продаются книги про PHP 5/6 (sic!) и «джентельменский набор веб-мастера».
Я полностью согласен, что при наличии знаний\опыта\таланта можно достигать впечатляющих результатов с помощью любого инструмента. Точно так же я не спорю с тем, что в любой технологии есть свои недостатки. Но оба этих утверждения — чистой воды демагогия, потому что всегда можно сравнить два инструмента и определить, какой из них для конкретной задачи подходит больше. В данном же случае PHP, при всех его плюсах и возможностях, объективно проигрывает Питону и Шарпу по пригодности для обучения.boldyrev_gene
18.11.2016 18:38В питоне есть полноценное ООП? (это не в честь спора)
Можете несколько доводов в его сторону, может будет мне причина хотябы поверхностно его изучить для расширения кругозора.Source
18.11.2016 18:56+1Если Вы хотите ознакомиться с полноценным ООП, посмотрите Smalltalk/Pharo.
boldyrev_gene
18.11.2016 19:00Я уже 4 как зарабатываю разработкой. Мне просто интересно как питон выбился в кандидаты одного из лучших языков для обучения без наличия (на сколько мне известно) ООП, по крайней мере в своем полноценном виде.
Source
18.11.2016 22:10Да вроде наличие полноценного ООП никогда не было критерием популярности языка… Когда прочитаете "Pharo by example" поймёте, что ООП в полноценном виде ни в одном мейнстрим языке нет в наличии. Чаще всего мы имеем банальное процедурное программирование с классами, ну и, благодаря исторической роли C++, это принято ассоциировать с ООП.
boldyrev_gene
18.11.2016 22:26Вы правы, но ООП, на сколько мне известно, все еще одна из самых востребованных парадигм, так что, по идее, при изучении программирования очень важно освоить эти принципы и научится их применять. Обязательно прочту, спасибо.
svboobnov
18.11.2016 23:21Ну, в Javascript и в Lua (кстати, автор статьи упустил замечательный язык!!) есть настоящее ООП: Мы создаём именованные сущности (объекты), которые содержат в себе данные (поля объектов) и методы, и эти объекты могут обмениваться сообщениями, порождать другие объекты… В общем, по заветам Алана Кэя.
Source
19.11.2016 01:05В JavaScript действительно не самая плохая поддержка ООП, но есть существенные минусы:
- нет сокрытия данных (можно напрямую обращаться к полям объекта без посылки сообщений)
- в прототипный подход активно внедряют классы, что приводит к дикой мешанине
Так же его нельзя назвать объектно-ориентированным языком, т.к.
- не всё является объектами
- не все действия возможно выполнить через посылку сообщений объектам (из тривиального: операторы не являются методами)
poxu
19.11.2016 10:53нет сокрытия данных (можно напрямую обращаться к полям объекта без посылки сообщений)
Сокрытие данных есть.
function makeObject() { var b; var self = {}; self.getB = function() { return b;}; return self; } var obj = makeObject(); var newB = obj.getB();
Вот так как-то.
Source
19.11.2016 11:20Можно сделать != есть.
Можно сделать в любом языке, но по умолчанию и повсеместно — не везде есть.poxu
19.11.2016 11:27Во-первых не в любом языке можно это сделать.
Во-вторых, равно можно сделать фактическому наличию фичи или нет — определяется усилиями, которые нужно предпринять, чтобы использовать фичу. Тут усилия, как несложно убедиться — минимальны. Их нужно не больше,
чем для того, чтобы написать private в какой-нибудь Джаве.Source
19.11.2016 12:13Во-первых не в любом языке можно это сделать.
А в каком нельзя?
Тут усилия, как несложно убедиться — минимальны.
Ага, всего лишь переключиться с объектного подхода на функциональный и использовать замыкание вместо метода.
Если это считать минимальными усилиями для поддержки сокрытия данных, то можно и чистый С назвать объектно-ориентированным :-)poxu
19.11.2016 13:04А в каком нельзя?
В php третьем нельзя было, насколько я помню.
Ага, всего лишь переключиться с объектного подхода на функциональный и использовать замыкание вместо метода.
Нет тут никакого переключения подходов. Есть объект, у него есть методы, с их помощью можно попросить объект что-то сделать. Сборка объекта только происходит немного не так, как вы привыкли, вот и всё.
Если это считать минимальными усилиями для поддержки сокрытия данных, то можно и чистый С назвать объектно-ориентированным :-)
Объектно ориентированное программирование можно осуществлять на разных языках, только с разными усилиями. В случае с javascript — усилия для сокрытия переменных — минимальны. Насчёт Си — не знаю, не пробовал.
Source
19.11.2016 14:03В php третьем нельзя было, насколько я помню.
Не знаю, не застал эту версию… но думаю, что варианты были даже там.
Нет тут никакого переключения подходов.
Ну как же нет… Вы даже не замечаете, что замыкание использовали?
poxu
19.11.2016 14:29Если вдруг встретите способ сделать закрытые переменне в третьем php напишите — я в своё время так и не понял как. Но, думаю, то примеров языков, где это сделать нельзя ещё не один и не два.
Что касается замыкания — да, использовано замыкание, для того, чтобы реализовать определённый аспект ООП. Подход как был объектно ориентированным, так и остался.
Source
19.11.2016 18:59Не думаю, что я буду заниматься археологическими исследованиями PHP )))
Просто ещё раз подчеркну, на мой взгляд, принципиальный момент — чтобы назвать язык объектно-ориентированным мало иметь возможность обеспечить сокрытие данных в объекте, нужна невозможность создания объекта без такого сокрытия.
Ну а подход, его можно и в чисто функциональных языках спокойно применять, но там хоть есть чёткое осознание что и зачем. В JS же такая смесь парадигм, которая не позволяет их как-то разграничить.merlin-vrn
19.11.2016 19:35Просто ещё раз подчеркну, на мой взгляд, принципиальный момент — чтобы назвать язык объектно-ориентированным мало иметь возможность обеспечить сокрытие данных в объекте, нужна невозможность создания объекта без такого сокрытия.
Покажите, какая конкретно часть парадигмы ООП вообще требует возможность скрывать поля? Инкапсуляция вообще не про это, она про то, что методы взаимодействия с данными идут рядом с самими данными, но вовсе не требует ограничения доступа.
Насколько мне известно, никакая. Язык вообще не обязан скрывать данные, чтобы назваться полноценным ООП. Возможно, наоборот: чтобы быть ООП в первоначальном смысле этого слова, язык не должен скрывать никакие поля. ООП пытается моделировать реальный мир, и расскажите, пожалуйста, например, какие поля у объекта класса "трактор" "скрыты разработчиком" для прочтения "методами" объекта класса "человек"?
Source
19.11.2016 20:43Покажите, какая конкретно часть парадигмы ООП вообще требует возможность скрывать поля?
Ну смотрите, объект по определению может иметь состояние и может отвечать на сообщения и всё, больше ничего он не может.
An object can do exactly three things:
- Hold state (references to other objects).
- Receive a message from itself or another object.
- In the course of processing a message, send messages to itself or another object.
Соответственно, доступ к состоянию возможен исключительно через посылку сообщения.
Если мы вводим какой-то иной способ доступа к состоянию мимо сообщений, то это что-то что к ООП уже не относится.
poxu
19.11.2016 19:40принципиальный момент — чтобы назвать язык объектно-ориентированным мало иметь возможность обеспечить сокрытие данных в объекте, нужна невозможность создания объекта без такого сокрытия.
Вы только что сказали, что java, c#, c++ и многие другие языки — не объектно ориентированны :).
Но напоминаю, что я просто хотел сказать, что на javascript можно делать закрытые поля.
merlin-vrn
19.11.2016 19:48Вы только что сказали, что java, c#, c++ и многие другие языки — не объектно ориентированны :).
Ну, почти. Не совсем объектно-ориентированы, или не объектно-ориентированы в первоначальном смысле. Парадигме свойственно эволюционировать. Тем не менее, требования обязательного ограничения доступа в ООП нет и в современном понимании.
Source
19.11.2016 20:49Вы только что сказали, что java, c#, c++ и многие другие языки — не объектно ориентированны :).
Да это давно уже не новость. Большая часть мейнстрима — процедурные языки с элементами ООП.
poxu
19.11.2016 23:17-1Большая часть мейнстрима — процедурные языки с элементами ООП.
И, собственно, если исходить из вашего определения — нету большой разницы между поддержкой ООП в javascript и в java, C++ и php.
merlin-vrn
20.11.2016 08:27Неверное понимание. И то, и другое является ООП. Никто не говорил, что это может быть сделано только одним способом, и то, что мы видим javascript, java, python и tcloop с совершенно разными подходами — иллюстрация того, насколько разными могут быть разные подходы.
poxu
20.11.2016 11:30-1Неверное понимание. И то, и другое является ООП
Собственно я и хотел сказать, что Source неверно понимает тему. И особенно хорошо это понятно, если продемонстрировать что следует из его рассуждений.
Source
20.11.2016 21:15Хорошо, что теперь и Вам понятно, что в Java нет нормального ООП :-)
poxu
20.11.2016 23:52-1Скажите пожалуйста, как можно было из моих слов
Собственно я и хотел сказать, что Source неверно понимает тему.
Можно было сделать вывод, что мне понятно, что в Java нет нормального ООП?
Но вообще интересно, в каком языке нормальное ООП есть?
Source
21.11.2016 00:18+1Это была ответная шутка :-)
Но вообще интересно, в каком языке нормальное ООП есть?
ООП на базе классов — Smalltalk
ООП на базе прототипов — Self
А вообще дело, конечно, не в "нормальности"… а в чистоте парадигмы.
Концепция обязана быть сформулирована предельно конкретно и настолько коротко, насколько возможно… иначе Вы просто будете растекаться мыслью по древу на каждом шагу, подгоняя под неё что угодно.
Двумя комментариями ниже я привёл определение ООП в 3-х коротких предложениях. А теперь попробуйте сформулировать определение ООП так, чтобы оно в полной мере описывало то, что понимается в C++, Java, C# под этой аббревиатурой. Скорее всего, Вы с удивлением поймаете себя на использовании терминов, которые относятся к программированию в целом, а не конкретно к ООП, типа абстракция, полиморфизм и т.д..poxu
21.11.2016 12:34-1У нас с вами получается, что ООП это одно, а поддержка ООП это другое, что в общем, логично.
Я считаю, что, если язык позволяет писать программы, которые позволяют без существенных усилий следовать принципам ООП, но не энфорсит их, то его можно считать объектно ориентированным.
С этой точки зрения большинство мейнстрима всякого — объектно ориентировано.Source
21.11.2016 13:37У нас с вами получается, что ООП это одно, а поддержка ООП это другое, что в общем, логично.
В целом да. Нет ничего плохого в частичной поддержке какой бы то ни было парадигмы в языке. Плохо, что сами парадигмы замыливаются и начинают неверно пониматься. Так мы и скатываемся до понимания в стиле "если есть классы — то это ООП". Гораздо лучше, когда программист осознаёт где границы конкретной парадигмы и какие фичи его любимого языка выходят за эти границы.
VolCh
20.11.2016 11:50+2чтобы назвать язык объектно-ориентированным мало иметь возможность обеспечить сокрытие данных в объекте, нужна невозможность создания объекта без такого сокрытия.
Нет такого в определениях ООП, нет запрета на получение состояния объекта извне.Source
20.11.2016 21:13Приведите определение ООП, из которого не следует такой запрет.
Из классического определения он явно вытекает:
- Everything is an object.
- Objects communicate by sending and receiving messages (in terms of objects).
- Objects have their own memory (in terms of objects).
merlin-vrn
21.11.2016 11:59Я не вижу ни 4. Objects own memory could be set to be inaccessible to other objects, ни в явном виде, ни в виде следствий из 1,2,3. Возможно, я что-то не понимаю, приведите, пожалуйста, логическую цепочку, как из трёх пунктов следует ограничение.
Source
21.11.2016 12:20Из третьего пункта следует, что у объектов есть состояние. Из первого пункта — что кроме объектов в программе ничего нет, а из второго — что объекты общаются только через сообщения.
А теперь вопрос: как можно получить доступ к состоянию одного объекта из другого объекта, если они могут взаимодействовать исключительно через сообщения?merlin-vrn
21.11.2016 12:59Возможно, посылая сообщение "получить значение поля такого-то"?
Это сообщение запрещено?
Сразу отмечу, нигде не сказано, что "реакция на сообщение должна быть непременно методом". В определении парадигмы нет слова "метод" и конкретизации, что такое "сообщение". Под сообщением вполне можно понимать и запрос или запись значения поля.
Source
21.11.2016 13:42Возможно, посылая сообщение "получить значение поля такого-то"?
Именно. Фишка в том, что механизм посылки/приёмки сообщений должен быть един в рамках конкретного языка (иначе это уже будет N разных понятий, а не одно — сообщения). Как Вы правильно заметили, это необязательно вызов метода и для полной поддержки ООП наличие методов не требуется. Но в большинстве мейнстрим-языков отправка сообщения — это именно вызов метода.
merlin-vrn
21.11.2016 13:46+1Итак, парадимга ООП не требует наличия запрета доступа к полям или методам, а реализация такого запрета — это уже воля разработчиков конкретного ЯП, продиктованная их желанием сохранить язык "последовательным" или "единообразным", конкретным выбором реализации понятий "сообщение" и "собственная память объекта" и так далее. Ограничения в такой реализации появляются икусственно — как следствие конкретного дизайна языка.
И вполне возможно, кто-то мог оказаться способен сделать это достаточно удобно и без искусственных ограничений.Source
21.11.2016 14:59-1Итак, парадимга ООП не требует наличия запрета доступа к полям или методам
Вы опять потеряли мысль… Доступ к полям через посылку сообщений и прямой доступ к полям — это принципиально разные вещи. И прямого доступа к полям в рамках ООП быть не может.
pingping
19.11.2016 00:30Pharo by example
Занятно, конечно.
И иерархия стандартных классов да, увесистая и куда более подробная, чем у прочего множества ЯП.
SmallTalk/Pharo — по сути такой себе конструктор языков.
Однако, на практике не так много тех, кто захотел бы унаследовать от Magnitude и создать конкурента Integer'у (и Boolean то!).
Оттого, множество ЯП (созданных позже SmallTalk'а) начинает иерархию классов с уже «готовых» «привычных» типов данных. Их оказалось достаточно для абсолютно подавляющего числа задач.Source
19.11.2016 01:09Там куда более занятно, что отсутствуют выделение операторов и синтаксических конструкций, управляющих потоком выполнения, в отдельные сущности. Тот же
if
является всего лишь сообщением для Boolean-объекта.pingping
19.11.2016 16:30Да, это свежо в мире современных языков.
Видать, мировоззрение у Кэя несколько ближе к реальности, чем у большинства.
EqualsZero
19.11.2016 11:02А можно уточнить, что имеется в виду под полноценным ООП?
Инкапсуляции в python нет в принципе — но есть соглашение, как следует называть методы и атрибуты, которые разаработчик считает приватными, соответственно, нарушение приватности будет намеренным и на совести нарушающего
Python поддерживает множественное наследование, используя стандартную библиотеку, можно создавать абстрактные классы.
Полиморфизм можно реализовать внутри одного и того же метода в зависимости от типа аргумента.
impwx
18.11.2016 19:10Я не писал ничего осмысленного на Питоне, поэтому про ООП ничего не скажу — боюсь ошибиться. Судя по мануалу, реализация там проигрывает Java или тому же PHP — например, инкапсуляцию относительно просто обойти. Если в треде есть профессиональные питонисты — объясните ситуацию!
А вот насчет доводов — почитайте Python Zen, лучше чем там — не скажешь. Если вкратце, то дизайн языка способствует написанию кода, который читается легко и понимается однозначно.merlin-vrn
18.11.2016 19:29Что имеется ввиду под "обойти инкапсуляцию"? Как подход "данные и подпрограммы для их обработки всегда вместе" можно "обойти"?
Если вы имели ввиду доступ к полям, то да: в Пайтоне нет ограничения доступа. Т.е. есть в джаве приватные методы и поля, есть публичные, так вот приватные кто угодно дёргать не имеет права. В Пайтоне нет: все члены класса публичные, и это не "можно обойти" защиту, это так сознательно сделано.
Если уж на то пошло, как раз в джаве это "можно обойти", если постараться: пишем паблик морозов и вот вам приватный метод доступен извне, хоть и под другим именем.
fireSparrow
19.11.2016 07:29Инкапсуляция не имеет ничего общего с ограничением доступа.
Это всего лишь распространённое заблуждение.impwx
19.11.2016 23:00-1Если вы узнали «заблуждении» из русской википедии, то почитайте лучше английскую:
Encapsulation is used to refer to one of two related but distinct notions, and sometimes to the combination thereof:
- A language mechanism for restricting direct access to some of the object's components.
- A language construct that facilitates the bundling of data with the methods (or other functions) operating on that data.
s-kozlov
19.11.2016 09:25+2С каких пор ООП надо изучать зеленому студенту, который обычное императивное программирование еще толком не освоил? Каково это — объяснять такому новичку основные принципы ООП: абстракцию, инкапсуляцию, наследование, полиморфизм? Зачем это всё вообще? Это невозможно понять с ходу, не набив шишек в условном Си.
lightman
18.11.2016 15:51+1Наиболее подходящими для обучения программированию языками считаю Python и C#.
Полностью согласен.
Хотя одним из моих первых языков был Pascal и я до сих пор считаю его замечательным выбором для, кхм, академического изучения, рекомендовать бы его всем и каждому по умолчанию я бы не стал.
Всё-таки в 2016 огромную ценность имеет:
1. Количество актуальных материалов, библиотек, вопросов на stackoverflow наконец
2. Возможность из коробки или с быстрой установкой пары либ сделать что-то клёвое (игру/графическую визуализацию/сайт). Python standart library/.NET с pip/nuget для этого идеальны
3. Продуманность, стабильность языков и экосистемы. Тут у py/c# всё в порядке, в отличие от… (не будем показывать пальцем).
Я бы добавил что эти две технологии равноценны во всём, кроме, пожалуй, структур данных. Их лучше изучать на C#. Алгоритмы же можно изучать и там и там.
ideatum
18.11.2016 13:47+3javascript несомненно прекрасен, но мне кажется перспективы у него не очень богатые, в связи с появлением WebAssembly, а это дело недалекого будущего. Конечно есть проблемы с унаследованным кодом, но веб очень подвижная среда. И наверное многие и неоднократно задавали вопрос, почему программирование для веб фактически возможно только на javascript при огромном количестве языков программирования, при этом вне веб-а первенство совсем не за javascript. Несомненно есть множество «языков» компилирующихся в javascript, но о большинстве из них мало кто слышал и наверное один из наиболее популярных это TypeScript (упомянут выше). Предварительная версия WebAssembly спецификации уже реализована во всех современных браузерах и это даст импульс разработке и созданию новых технологий разработке в веб. Я за многообразие.
Sirion
18.11.2016 13:54+7Да, все ненавидят js и пользуются им только от безысходности и отсутствия альтернатив. А node.js, electron и т.п. запилили, чтоб было ещё больше безысходности.
evocatus
18.11.2016 19:26Потому что хочется красивый GUI, а вся эта армия JS-хипстеров написать что-то хотя бы подобное Kivy или Qt неспособна.
Sirion
18.11.2016 13:49+12Как первый язык для обучения? Пресвятой Ктулху, ни в коем случае. Слишком много в нём неочевидной херни, пардон май френч. Замыкания, асинхронность, прототипное наследование, неявное приведение типов…
Как первый язык, чтобы сделать что-то относительно полезное? Думаю, это вполне разумно.
UPD: Когда я начал писать комментарий, я думал, что он окажется третьим.boldyrev_gene
18.11.2016 17:20-3Замыкания, асинхронность, прототипное наследование, неявное приведение типов…
Видимо нарушает ваше эталонное мировосприятие навязанное другими языками?
raidhon
18.11.2016 17:29-1Неочевидная херня была в ES5(видимо с чем вы и работали в последний раз) теперь есть ES6, есть классы, есть наследование, есть блочные переменные и константы и много другой очевидной на этот раз херни.
С асинхронностью удобно работать с промисами, а если хотеть ещё больше удобства с контролем управления всегда есть async.
Сейчас практически все свои веб проекты пишу на node.js ( лишь иногда приправляя микросервисом на Go), а Python c Ruby лежат скромно на полочке и ждут специфического заказа именно под них.jetexe
18.11.2016 17:46Я конечно всё понимаю но в клиентской части ES6 выглядит вот так
jetexe
18.11.2016 17:58парсер скушал линк: http://caniuse.com/#search=es6
raidhon
18.11.2016 20:55-2Что вам ответить, вы не в курсе технологий ни фронтенда ни бекенда js.
Так как вы бы знали про существование транспайлера babel.js фактически стандарта сборки на фронтенд.
И думаю вряд ли вы собираете фронтенд через gulp, grunt или webpack.franzose
20.11.2016 07:22А вы забыли, что тред о новичках, у которых от всего перечисленного мозг взорвётся.
Sirion
19.11.2016 01:16+1В ES6 добавили ещё кучу вещей, от которых у юного падавана поседеют мудя. Деструктуризация, прокси, символы, генераторы… Нет-с, для начала какой-нибудь Паскаль — самое оно.
raidhon
19.11.2016 14:32+1Я начинал с C++ 15 лет назад и не поседел.
JS скриптовый язык программирования с динамической типизацией вы серьезно полагаете что он сложнее чем Паскаль компилируемый язык со статической типизацией и ручным управление памятью?
Если уж начинать с простого языка надо брать Python прост как мотыга, но свое дело знает.
Хотя там тоже есть генераторы супер сложная штука, наверно нельзя.merlin-vrn
19.11.2016 16:55Про генераторы в Python можно не рассказывать и всё будет хорошо. А вот не рассказывать про сложные приведения типов и вообще особенности композитных типов JS не получится.
AnutaU
19.11.2016 21:10JS — язык программирования с нестрогой типизацией, и это по-моему много хуже, чем Паскаль со строгой (для первого языка, естественно).
Sirion
20.11.2016 00:25Ну, ручное управление памятью — это тоже достаточно грустная для новичка штука. Вчера тебе рассказывают про ветвления и циклы, а сегодня ты херачишь какой-то непонятный маллок (забыл, как оно в паскале называется), чтобы сделать массив переменного размера.
Source
20.11.2016 06:48херачишь какой-то непонятный маллок (забыл, как оно в паскале называется), чтобы сделать массив переменного размера.
всё гораздо проще
merlin-vrn
20.11.2016 08:31+1GetMem оно называется.
Тут есть ещё одно соображение: перед тем, как что-то автоматизировать, стоит разобраться, как это делать руками. Перед тем, как использовать калькулятор, научись складывать и умножать вручную, и хотя бы разберись, что же это такое — квадратный корень.
Sirion
20.11.2016 13:22+1Вообще да, но в данный момент нет (с).
Нужно какое-то ограничение на глубину кроличьей норы. Не уверен, что начинать обучение программированию с принципов работы транзистора будет продуктивно.
cb_ein
18.11.2016 13:53Если же взглянуть на данные по JavaScript, то окажется, что на одну вакансию приходится всего 0.6 программиста.
Я вижу на картинке 1.6.
aamonster
18.11.2016 14:00+1Есть серьёзный довод против изучения JS в качестве первого языка: он устроен не так, как кажется на первый взгляд (и не так, как большинство других языков).
Да, он устроен просто — но prototype-based наследование легко понять, когда у тебя уже есть изрядный опыт, а в начале обучения это может сломать мозг. То же — насчёт областей видимости и замыканий в JS.
По мне, так лучше бы начинать с какого-то языка, где всё устроено именно так, как кажется на первый взгляд. Правда, в голову приходит только покойный Паскаль…Source
18.11.2016 14:30лучше бы начинать с какого-то языка, где всё устроено именно так, как кажется на первый взгляд.
А знаете, тут вот шутят насчёт Haskell, и я тоже раньше думал, что это очень сложный язык. Но когда начал изучать, оказалось, что он весьма простой (основной косяк, что про него любят писать заумно, но это не вина языка). После освоения нескольких базовых концепций, всё остальное выстраивается на их основе, настолько естественно, что иногда диву даёшься… Чуть ли не любую библиотечную функцию можно переписать в пару строк, потом открыть код GHC и с удивлением обнаружить, что именно так она и реализована. Я более-менее знаю больше 10 языков, но ощущение "всё устроено именно так, как кажется на первый взгляд" у меня возникло впервые именно при изучении Haskell.
Не берусь пока его советовать в качестве первого языка, но в качестве одного из первых 5 ЯП однозначно рекомендую.
dusty_arrow
18.11.2016 14:00+1Наконец-то, всё встало на свои местаSource
18.11.2016 14:05+1Вот результат опроса, который проводился на Stack Overflow в 2016-м году. В нём участвовало 49397 разработчиков. Более половины из них используют JavaScript.
В результате множество компаний нанимают JavaScript-разработчиков, но разработчиков этих не так уж и много.Это 5. Я понимаю, что Вы всё подгоняете, чтобы каждый пункт был в пользу JavaScript, но можно же хоть как-то согласовано это было сделать.
P.S. Если по существу, то с JavaScript имеет смысл начинать тем, кто хочет заниматься разработкой фронтенда для веб-проектов в ближайшие 5 лет. Для остальных это не лучший выбор первого языка.
uniqm
18.11.2016 14:05+4Сплю и вижу, что можно писать логику на клиенте на любимом языке. Ну хотя бы на каком то другом, не заканчивающимся на *Script.
nwalker
22.11.2016 19:12+1А чем вам, скажем, Clojurescript не угодил? Вот уж что точно не JS.
Еще вроде Scala и Kotlin компилируются в JS.
svboobnov
26.11.2016 23:35+1А ещё Ocaml умеет в JS компилироваться.
Я вот всё облизываюсь на этот интересный язык, да времени мало. А жаль.
ionicman
18.11.2016 14:14+11Давайте абстрагируемся от ЯП.
Вот Вы хотите, чтобы ребенок научился кататься на велосипеде, скорее всего Вы ему купите вот это:
Ну или это:
А в качестве первого ЯП выбирать JavaScript, это:
Т.е. когда ты на таком умеешь — ты можешь ездить на любом другом, но начинать учиться надо точно не с него :)hatari90
18.11.2016 14:20+15У последнего точно должно быть круглое колесо?
merlin-vrn
18.11.2016 14:25+6да, если мы про джаваскрипт, то на последнем между педалями и колесом там стоит передача, разворачивающая направление вращения
ionicman
18.11.2016 14:29Боже мой! Какой Вы зануда — это просто картинка для понимания концепции.
И нет там никаких передач, вот пруф.ionicman
18.11.2016 14:42Или это шутка юмора была, про то, что JS еще сложней? Тогда каюсь — не понял :)
Но в юницикле (велосипеде-моноколесе) точно никаких передач нет и колесо там — круглое — знаю, катался, падал :)))merlin-vrn
18.11.2016 15:59Или это шутка юмора была, про то, что JS еще сложней? Тогда каюсь — не понял :)
именно так
Как известно, сложность системы измеряется в wtf, так вот в велосипеде-моноколесе слишком мало wtf, чтобы его можно было сравнивать с js. Нужно было хоть что-то добавить :)
Серьёзно. Моноколесо я бы с C сравнил. Всё возможно, но и следить нужно за всем самому: память и указатели, строки и массивы, и так далее.
А JS — http://www.besportier.com/archives/world%E2%80%99s-largest-bike-didi-senft.jpg
bigfatbrowncat
18.11.2016 14:29-4А чем сложен JS?
И поехали…<script> document.write("Hello, world!" + (3+5)); </script>
ionicman
18.11.2016 14:34Он не сложен, он сложен как первый ЯП.
Замыканиями, прототипами, нестандартным и не явным приведением и много еще чем.bigfatbrowncat
18.11.2016 18:30+2Вы не поняли моего намека. Видимо, не вы один.
Поясню.
Замыкания, прототипы, вот эти все умные слова, которые вы (и не только вы) тут написали, появятся, когдашкольникначинающий программист напишет пару простых «больше-меньше», а потом пару тетрисов, графика в которых основана на квадратных div-ах с абсолютным позиционированием.
Что до приведения типов, соглашусь — оно создает много проблем новичкам. Но, слава богу, всегда есть решение, которые многие мои знакомые физики до сих пор испольуют: «сомневаешься — приводи явно».
А к моменту, когда человек начнет хоть чуть-чуть понимать, что он вообще пишет и как оно работает, можно будет выбрать второй язык. Осознанно. И вот вторым JS будет далеко не для всех.
vlreshet
18.11.2016 14:45Тогда уж
console.log("Hello, world!" + (3+5));
Так ещё проще и понятнее. И правильнее.bigfatbrowncat
18.11.2016 18:31+1Кому правильнее?
Я — школьник, который умеет открывать блокнот и браузер. Что в браузере есть такая штука, как DevTools, я пока не знаю — этого гришка из 6 «Б» — известный в моих кругах эксперт в области IT — не показал.
Где прикажете читать ваше «Hello, world»?vlreshet
18.11.2016 19:49Значит гришка из 6 «Б» вас обманул, и не всё рассказал. И при первой же проблеме вы получите чистый экран. Или куда должны посыпаться JS ошибки? В консоль, то-то же. Так что без девтула вы и так не обойдётесь А ещё васька с 9 «А» класса может рассказать о том что можно поставить node.js, и запускать скрипты прям из консоли, без браузера.
bigfatbrowncat
18.11.2016 23:07+1Да не интересна пацану ваша консоль, не интересна.
Я даже в QBasic-е на IBM PC XT с видеоадаптером Hercules и монохромным режимом искал графический режим. И находил-таки!
Неужели, вы считаете, что ребенок, который сможет замутить клон «злых птиц» в браузере, станет изучать более сложный (и неочевидный) Node.js? До него еще дорасти надо!
Что касается консоли, то, конечно, ее умный ребенок быстро найдет. Но использовать станет разве что для логов.
Мне бы и в детстве браузер… эх…
SomebodyElse
18.11.2016 15:29+7document.write(prompt() + 1);
Ой, а почему это тут 11 написано, а я хотел 2?
Приехали.bigfatbrowncat
18.11.2016 18:39+1Вот это — приведение типов — и будет первой проблемой для новичка. Проблемой, с которой он столкнется в любом языке, а не только в JS. Но она ему вполне по зубам, не так ли?
Если человек не сможет написать «Number» и скобочки, спросив у более опытного товарища, вряд ли ему суждено программировать.merlin-vrn
18.11.2016 19:35Она даже мне, не новичку, не по зубам. Да, признаюсь, я время от времени наталкиваюсь на дебильное поведение, при котором, например, [ ] + [ ], [ ] + { }, { } + [ ] и { } + { } — все выдают разные результаты и даже различного типа.
А в примере со сложением проблема решается просто и элементарно: писать Number (или String) должно быть обязательно всегда, во всех случаях, если имеем конструкцию вида строка + число. То есть, вместо сложного приведения типов и неожиданного результата язык должен был выкинуть исключение. Соединяешь число со строкой — будь добр явно укажи, что ты и во что преобразовываешь.
bigfatbrowncat
18.11.2016 20:04Знаете, конструкция вида Строка+Объект разрешена даже в Java, где вообще почти ничего неявного нет. Так что исключение там, где явно надо просто привести объект к строке — слишком сурово. Попахивает старым добрым Си, где любая работа со строками — боль.
А вот что действительно следовало бы запретить — это обратное неявное приведение. Строка не должна становиться числом, незаметно для программиста. Тогда и программист будет понимать разницу между 1+1 и '1'+'1'. И глупостей делать не будет.Source
19.11.2016 00:37-1Использовать
+
для конкатенации строк или массивов — это само по себе глупость, правда зачастую от создателей языка. В данном случае мономорфность операторов — благо даже для сильной типизации, а для слабой типизации — сущая необходимость.bigfatbrowncat
19.11.2016 01:03+1Давайте пройдемся по языкам:
Pascal — использует +
C — не использует, но в нем со строками вообще беда
Java — единственный в языке оператор, переопределенный для единственного класса — "+" для класса String. Ради него сломали стройный синтаксис.
C# — операторы переопределяются, "+" для строк включен
C++ — аналогично
Basic — по-разному, не помню уже… Кажется, там можно "+" или "."
JS — "+"
Python — "+"
Теперь скажите мне, какой мейнстримовый язык я пропустил.
А еще предложите свой, более очевидный способ конкатенации строк.Source
19.11.2016 01:24+1Мейнстрим-решения не всегда лучшие, зачастую что-то исторически сложилось, а потом все годами жуют кактус во имя обратной совместимости..
Есть вполне себе хорошие варианты:
"++" — Haskell, Erlang
"<>" — Elixir
".." — Lua
"." — Perl, PHP
Точки для конкатенации мне тоже не нравятся, т.к. вызывают лишние ассоциации с другими вещами, но всяко лучше, чем +.
Ну а++
или<>
вообще идеально. К сожалению, исторически сложилось, что++
в С-семействе языков зарезервирован под инкремент.bigfatbrowncat
19.11.2016 02:38+2Чем вам плюс-то не угодил? Сложить две строки — вполне очевидная метафора. Я даже не знаю, чем она может быть плоха.
Source
19.11.2016 11:28Сложить две строки — вполне очевидная метафора
Очевидная для кого? Для людей, которые годами этой метафорой пользуются — да.
Но даже мы используем слово "конкатенация", а не "сложение", дабы не вносить путаницу. Если отбросить привычки, Вам не кажется странным, что понятия разные, а оператор — один?
svboobnov
19.11.2016 22:38+1"~" — D. Визуально на верёвку или проволоку похоже, коей привязали один массив к другому (а строка в D — просто массив символов).
webkumo
23.11.2016 18:11. — это вообще убийственная конкатенация для объектных языков. Чем разыменовывать-то указатели? Стрелочками? Два символа вместо одного для самого популярного оператора?
Source
24.11.2016 00:24Два символа вместо одного для самого популярного оператора?
Это конкатенация то самый популярный оператор? Для того, чтобы что-то вставить в строку в 90% случаев интерполяция используется… Теперь она даже в JS есть под названием "String Substitution".
webkumo
24.11.2016 08:44Вы внимательно читали? Может ещё раз перечитаете? На всякий случай процитирую дополнительно, вдруг поможет:
> Чем разыменовывать-то указатели? Стрелочками? Два символа вместо одного для самого популярного оператора?
PS ну а касательно самой конкатенации — в той же java используется не то, чтобы реже других способов формирования строк.am-amotion-city
24.11.2016 11:50Что напрямую, кстати, противоречит гайдлайнам про стрингбуфферы. В любой нагруженной на строковые операции системе (хадупы всякие, и прочие мапредьюсы по анализу текста) тимлиды убивают за конкатенацию, порождающую два лишних объекта.
Но в нормальном мире, конечно, да, никто не заморачивается, и правильно делает.
Source
24.11.2016 13:02Да, неправильно Вас понял… Насчёт точка vs стрелочка для вызова методов, согласен, что точка удобнее.
fuCtor
19.11.2016 08:26+1Ruby — String + String допустимо как конкатенация, String + что-то еще не допустимо
irb(main):001:0> '1' + 1 TypeError: no implicit conversion of Fixnum into String
Неявные преобразования в строку запрещены. А это Ruby, где магии вагон и маленькая тележка.bigfatbrowncat
19.11.2016 11:00Вообще, чем больше слышу о Руби, тем сильнее он мне нравится. Жаль, он далек от моей работы сейчас, не досуг выучить…
Преобразования а строку можно запрещать, если есть простой и удобный toString для любого объекта. Как в Java. Думаю, в Ruby он есть.fuCtor
19.11.2016 11:25Да, вы правы, у любого класса есть метод to_s (определен в Object, отправная точка всего), в базовом виде он просто имя класса + id объекта внутренний выведет.
am-amotion-city
21.11.2016 12:25+1Это только пока ваш коллега не
String.prepend(Module.new do define_method :+ do |other| case other when Integer then self << other.to_s else super(other) end end end)
:)fuCtor
21.11.2016 13:20Это та самая запретная маленькая тележка черной магии )
am-amotion-city
21.11.2016 14:36+1Да ну, бросьте, это абсолютно легитимный и прозрачный способ для толстолобых :)
Черная магия — это
class Integer def to_str; to_s; end end
Имплицитные касты — вот настоящее зло™, неведомое даже DHH, а никак не манкипатчинг.fuCtor
21.11.2016 16:46Тогда бы уж через alias, все православней )
Злостность манкипатчинга сложный вопрос, ActiveSupport, сплошной манкипатчинг по сути своей. Но народ не сильно жалуется, жалуется когда например какой-нибудь gem начинает неистово потихому расширять ActiveRecord, потом ищи концы из-за чего пошло не так.
Манкипатчинг пытались отрегулировать, добавили допонительную функциональность под это (не помню как называется), но так никто почти и не пользовался ей, поговаривают что поитогу выпилят обратно, вместе с continuation.
PS хотя в продакшене видел расширение NilClass, добавление к нему операций индексирования и еще пары часто употребимых. Видать надоело городить проверки, try является частью Rails, но в последних версиях добавили эквивалентную замену в std.am-amotion-city
21.11.2016 17:30После того, как в 2.3 сломали `__callee__` в `alias`ed, и чинить не собираются, я на автомате ими перестал пользоваться. Кроме того, известно, что `alias` ведет себя не всегда предсказуемо в сложных контекстах, чтобы с гарантией избежать граблей лучше использовать `alias_method`.
`refinements` они назывались, и не взлетели по очень понятной причине: они ничем не лучше манкипатчинга eigenclass’а, а во многих случаях — гораздо хуже. Я даже пытался это объяснять в списке рассылки, но меня закидали тапками как ретрограда.
За использование `try` в продакшене я бы лично ссылал во фронтенд на неделю :) Страшное зло.
Scf
18.11.2016 14:17+6В корне не согласен со статьей… Ну зато у меня конкуренация на рынке труда будет меньше!
По моему мнению, язык программирования для детей должен уметь разговаривать и рисовать, а для этого нужно:
- работающую программу в одну строчку
- ввод и вывод текста
- графические примитивы — точка, линия, окружность, заливка контуров
А подросткам обязательно надо изучать основные алгоритмы и структуры данных, для чего надо дополнительно:
- строгую типизацию
- ООП
И я, право, не знаю, что подходит лучше, чем древний бейсик и древний паскаль. На каком современном языке программирования можно в 10 строчек нарисовать синее небо, зеленую землю и желтое солнце? Или звездную ночь? А я такие программы набивал с тетрадки в 3 классе, а в 5 писал сам.
TargetSan
18.11.2016 14:27+1Source
18.11.2016 14:47+1Поддержу! Stratch, Logo и Racket для начального обучения самое то.
Кстати, Stratch в том числе хорошо решает проблему "поделиться результатом с друзьями".
Ещё очень круто выглядит Project Spark.bigfatbrowncat
18.11.2016 18:42-1У Scratch, Logo и Racket при всех их неоспоримых достоинствах, есть один общий фатальный недостаток.
Они не имеют ничего общего с промышленными ЯП.
А значит — проблемы, которые будут возникать у «разработчиков» на этих языках, будут разительно отличаться от тех, которые возникают у настоящих разработчиков.
Рискуем получить целую когорту детей, которым нравится связывать блоки, но которым не охота (медленно, тупо, некрасиво, стопятсот причин) натыкивать буквами команды. И читать они их не умеют.
То есть вы поднимаете квалификацию ребенка (он уже может запрограммировать простую игру в Scratch), давая ему совершенно бесполезную технологию и, попутно, забивая ему голову ньюансами этой технологии.
Хотя, это всё требует осмысления, конечно…Source
18.11.2016 19:15+2Ну, если для Вас вся суть промышленного программирования сводится к "натыкивать буквами команды", тогда конечно )))
Во-первых, блоки только у Scratch. Во-вторых, это всяко веселее, чем блок-схемы на бумажке, которые мы в школе рисовали. В-третьих, вспомните, что было 10 лет назад, что есть сейчас и Вы поймёте, что никто не знает как будет выглядеть промышленное программирование ещё через 10 лет.
давая ему совершенно бесполезную технологию
Ох, я чувствую дай Вам волю, Вы и цветные карандаши у детей отберёте..
bigfatbrowncat
18.11.2016 19:23>Во-вторых, это всяко веселее, чем блок-схемы на бумажке, которые мы в школе рисовали.
Школьная программа по информатике — кошмар. Была и остается. Я, слава богу, учился программировать не в классе информатики. И, кстати, мы изучали Паскаль. Просто, я всю программу по нему знал на момент начала курса, что мне абсолютно ничего не стоило.
>В-третьих, вспомните, что было 10 лет назад, что есть сейчас и Вы поймёте, что никто не знает как будет выглядеть промышленное программирование ещё через 10 лет.
10 лет назад я начал изучать C++. В данный момент я пишу на C++. Думаю, что он никуда не денется еще лет 10.
Javascript, кстати, тоже вряд ли куда-то исчезнет в ближайшее время. Просто, будет продолжать обрастать всякой пеной, но так мы же десь не о фреймворках спорим — их и для C++ вышла куча за 10 лет, и для Java…
>Ох, я чувствую дай Вам волю, Вы и цветные карандаши у детей отберёте…
Знаете, я полагаю, что если школьник начинает рисовать всерьез, то есть не просто учится срисовывать мультяшек с телевизора, но и хочет стать настоящим художником, ему нужно немедленно купить приличный графический планшет типа Wacom (разумеется, если седства позволяют).
Или, если ему нравится рисовать карандшами, то, как минимум, сканер — чтобы он мог своим творчеством делиться.
Хотя, сейчас чем раньше юный художник освоил планшет, тем раньше он начнет зарабатывать деньги любимым делом.
Хороший пример привели ;)Source
19.11.2016 01:3210 лет назад я начал изучать C++. В данный момент я пишу на C++. Думаю, что он никуда не денется еще лет 10.
Рад за Вас и даже могу допустить, что Вы всё на том же подмножестве C++ программируете, игнорируя вышедшие стандарты. Но если посмотреть на web, mobile, робототехнику, там произошли изменения гораздо масштабнее, чем в С++.
bigfatbrowncat
19.11.2016 11:08Нет, не игнорирую, хотя и использую далеко не все.
Ради web-разработки я вынужден был в свое время изучить Java, которая, в смысле парадигм и синтаксиса, ушла от C++ не сильно далеко. Android отличается от Windows в плане идеологии куда сильнее. Например, меня в свое время шокировало, что любое неактивное окошко в нем система может безжалостно прихлопнуть. Неделю ходил — восхищался таким уровнем оптимизации.
За робототехнику не скажу. Уже выше писал, что ЧПУ не занимался. А других роботов и вовсе не встречал.
А дикие скачки с JS-фреймворками, которые растут как грибы после дождя и так же быстро выходят из моды, я развитием не считаю, простите. Это — пена вокруг мейнстрима. Я только с год назад признал существование Node.js в принципе и немного начал в нем ковыряться. И сейчас, спустя несколько лет после его создания, он всё равно выглядит сырым, увы. Надеюсь, скоро и JS-сообщество успокоится и выработает уже парадигму для UI, люди решат, что хватит клепать фреймворки, а в Node.js доработают те досадные недоразумения, которые там случаются. Но будет это, думаю, не через год.Source
19.11.2016 11:33+1А дикие скачки с JS-фреймворками, которые растут как грибы после дождя и так же быстро выходят из моды, я развитием не считаю, простите.
С этим я полностью согласен. Но есть ещё и бекэнд и там есть не только Java :-)
В целом идёт неторопливая адаптация мейнстримом концепций из менее популярных ЯП.
AnutaU
18.11.2016 19:17+2На Racket всё же существует какая-никакая промышленная разработка. А в научной среде он и подавно используется по-взрослому.
P.S. Или есть ещё какой-то Racket? 0_obigfatbrowncat
18.11.2016 19:26+1Пардон, по части Racket я слился :)
Я понятия не имел, что это такое — и просто решил, что что-то типа Scratch.Source
19.11.2016 01:35Racket я указал в том ряду как раз в качестве граф.планшета, уже не игрушечный, но всё ещё логичный и простой для понимания, с хорошей библиотекой, позволяющей детям не заскучать.
bigfatbrowncat
19.11.2016 11:10Посмотрел на его синтаксис… Меня бы он в свое время напугал. Не слабее, чем C++
Но это — уже вкусовщина.Source
19.11.2016 11:39Это вопрос привычек. В принципе, чем меньше базовых концепций, тем проще язык.
В концепции единообразия типа:
- "Всё есть объект" (Smalltalk/Pharo)
- "Всё есть список" (Lisp/Scheme/Racket)
довольно легко въехать и легко ими пользоваться (если язык сам не нарушает свою концепцию на каждом шагу)
bigfatbrowncat
22.11.2016 23:13-2чем меньше базовых концепций, тем проще язык.
Проще для математика, но не для практика. Новичку изучать язык интересно не потому, что он красив внутри — там внутри любое ПэХаПэ может быть. Новичку инересно сразу получить работающий результат.Source
23.11.2016 01:03Сейчас по-моему уже для любого языка есть либо REPL, либо Playground, либо и то и то. Так что проблем с быстротой старта в первый результат никаких нет.
Bringoff
23.11.2016 10:58Для Java не подскажете?
Source
23.11.2016 11:40Java Playground, Java REPL. Далеко не самые удобные, но хоть что-то…
В качестве первого языка, я бы Java не советовал.
svboobnov
26.11.2016 23:44С 2000 года существует, а с 2005 встроен был в NetBeans скриптовый язык BeanShell. Там можно писать либо на самом BeanShell (иногда не указывая типов, а так синтаксис и значение 1:1), либо на Java. Таким образом, его можно как REPL для Java использовать, а можно подключить в качестве скриптового движка к Ant'у.
AnutaU
19.11.2016 14:19+1Скажите, а это ваш личный опыт? Или может быть можете посоветовать что-нибудь, что можно почитать на тему Racket для детей? Заинтересовалась, но сходу нагуглила только книгу Realm of Racket.
Source
19.11.2016 19:32Нет, личного опыта на эту тему пока нет. Но из всех production-ready языков я только у Racket видел такую заботу о детях… Она по-моему красной нитью проходит через все обучающие материалы… Например, "How to Design Programs" начинается с написания программы управления ракетой, да и в целом просто замечальные библиотеки Teachpacks идут в составе стандартного дистрибутива. Помимо этого в него включен набор классических игр и руководство как написать свою.
Ну и "Realm of Racket" тоже конечно отличное дополнение.AnutaU
19.11.2016 21:16Большое спасибо! Я детей не учу, но всё равно смогу что-то полезное для себя найти.
merlin-vrn
18.11.2016 19:37Вот мы видим человека, который явно ЧПУ никогда в глаза не видел.
Это ваш JS не имеет ничего общего с промышленным программированием, в отличие от Лого.
bigfatbrowncat
18.11.2016 20:08В каком месте JS — мой? Я люблю и использую в работе C++, Java, а JS считаю неизбежным злом индустрии, злой монополией и… отличной игрушкой для детей. Именно так.
Понятие «промышленное программирование» весьма многогранно, спорить о нем, сидя в разных концах — непродуктивно. Только зачем грубить?
Что до ЧПУ — тут вы меня подбили насмерть. Из «ЧПУ» я программировал только Ардуино. В планах было начать освоение ПЛИС-микросхем (это близко к моей теперешней теме), но пока я о них почти ничего не знаю. Разве только то, что даже там большинство людей предпочитают не тыкать блоки мышкой, а, всё же, писать команды.
Но мы же с вами тут обсуждаем человека, который до сих пор о программировании не слышал вообще, то есть, очевидно, ребенка или почти ребенка.
Вы уверены, что его обучение следует начинать с ЧПУ? Мозг не сломаете? Спрашиваю без подколки, на полном серьезе — я ответ не знаю.merlin-vrn
18.11.2016 20:25+1Под ЧПУ я имел ввиду станок с компьютерным управлением. Конечно, не детская игрушка, а напротив очень опасная штука…
Ардуино, пожалуй, ближе, но тоже далеко.
Но вот Лого похож на вытачивание объекта на токарном станке, и я ни разу не слышал, чтобы эта черепашка, которая рисует линии на экране кому-то сломала мозг. Это язык простой и без лишнего, минимум абстракций. Научиться понятию аглоритм, последовательность, циклам — ну просто идеальный вариант. Во-вторых, результат не абстрактный, он нагляден, поскольку это картинка. Хорошо видно, где цикл недокрутили или перекрутили — это же просто кладезь багов, а тут вот оно, на картинке лишний поворот. Можно наблюдать процесс выполнения в "замедленном варианте" или пошагово и этот замедленный вариант тоже очень нагляден, поскольку чётко видно (именно видно) что за команда выполнилась и к чему это привело.
bigfatbrowncat
18.11.2016 23:26Спасибо, я знаю, что такое ЧПУ.
Ардуино ничуть к нему не близок. Си как Си — ничго особенного. Только памяти мало и адские лаги, если не оптимальный код написать.
Главная проблема всех «учителей программирования» (как с кавычками, так и без), как правило, состоит в том, что они пытаются преподавать программирование академически.
Они ставят последовательные задачи, цель которых — не получение результата, а оттачивание навыков само по себе.
А ребенку не интересно решать задачи. Ему интересно творить. Создавать продукт, черт возьми! В младших классах — впечатлять друга саморучно написанной игрушкой, в старшем — поразить девчонку фрактальной розочкой на день рождения.
Если бы меня в детстве учили программировать, я бы программистом не стал. Просто из вредности.
Ребенку надо дать инструмент, из которого ему по силам сварганить рабочий продукт в разумные сроки.
Поэтому, на мой взгляд, единственный вопрос, который имеет смысл поставить к языку программирования при выборе его в качестве академического — "за какое время на нем можно написать Сапер, Тетрис, или нарисовать фрактал Мандельброта?"
И, самое главное, — сколько строк кода для этого придется написать и насколько они будут сложны.Source
19.11.2016 01:45Для игрушек точно Scratch и Project Spark. Там можно гораздо интереснее вещи создавать, чем сапёр и тетрис. Для фракталов — Logo и Racket. И там и там, первый вариант — для маленьких, второй — для тех, кто повзрослее и хочет покруче.
bigfatbrowncat
19.11.2016 11:13А вам знакомо чистолюбие вида «хочу всё сделать сам»?
Я вот, например, никогда не хотел брать чужие движки и наработки. Это же не программирование, а просто настройка чьей-то чужой сложной штуки. Это — не круто. Куда круче самому инициализировать графический режим (или создать OpenGL-окошко), самому на нем что-нибудь нарисовать…
А Scratch, как я уже сказал, в плане навыков настолько далек от обычного написания кода, что мне, разработчику с 10-летним стажем, приходится с ним разбираться дольше 15 минут.Source
19.11.2016 11:49Ну Вас не поймёшь, то Вы говорите, что для детей важно как можно скорее видеть результат, то предлагаете дать им голый OpenGL, где на рисование простенького треугольника можно пару дней угробить, если Вы через плечо диктовать не будете.
P.S. Современным детям нравится Minecraft, достаточно дать им удобную возможность автоматизировать тыкание в экран, чтобы привить тягу к программированию.
chesterset
19.11.2016 16:46+1>Я вот, например, никогда не хотел брать чужие движки и наработки. Это же не программирование, а просто настройка чьей-то чужой сложной штуки.
И вы предлагаете детям в самом начале пути подобное наставлять? Мол, не надо использовать наработки, сделанные до тебя, пиши велосипед по поводу и без. Не плохо было бы конкретизировать «детей» — есть разница между условным первоклассником и условным шестнадцатилетним ребёнком. Первому глубоко наплевать, как оно работает, лишь бы работало и было всё интерактивно, просто и легко. Второму уже следует объяснять, что программирование — это не те кулцхакеры из телевизора, которые усердно пингуют localhost, делая вид, что работают. Хороший программист, ИМХО, это не тот, который пишет движки по поводу и без, а тот, кто умеет использовать наработки (при этом различая плохие наработки от хороших), создавая из различных модулей, дополнений и расширений что-то уникальное. Естественно, если нет наработок — нужно самому делать, но в 99% случаев наработка будет или её нужно будет несильно доработать. Представьте себе веб-разработчика, который под каждый сайт (интернет-магазин, корпоративный сайт, витрина, блог) будет бабахать по движку собственного производства — мало того, что он потратит в сотни раз больше времени, чем оно того на самом деле стоило, так ещё и максимально усложнит поддержку продукта. Я уже молчу про то, что в плане безопасности это будет решето.
Младших, так сказать, детей, совершенно необязательно обучать промышленным ЯП, иначе учите ребёнка сразу управлять самолетом, а то чего он с велика своего начинает. Когда ребёнок растёт и если он проявляет интерес к программированию (даже «детскому»), тогда можно вводить его в «реальное» программирование. Не зря ведь есть детские велосипеды — дети немного отличаются от взрослых, и хоть ребёнка можно научить кататься на взрослом велосипеде (если он физически сможет его осилить), это вовсе не значит, что так оно и должно быть.
merlin-vrn
18.11.2016 16:03scratch, logo — вот это вот
Wedmer
20.11.2016 04:38LOGO очень хорош для детей в качестве первого языка. Чуть позже можно перейти на QBASIC или еще что подобное.
s-kozlov
18.11.2016 16:25Давать ООП начинающему? Это шутка такая?
VolCh
20.11.2016 14:38Объект с состоянием и методами более понятная штука для начинающих, чем глобальные переменные и функции с ними работающие.
dimykus
20.11.2016 14:58+1Не всегда, вспоминаю свое обучение, по началу достаточно много времени ушло на осознание массивов и записей в паскале (структур). Не думаю, что объекты я бы легко усвоил. Причем до сих пор не могу понять в чем была проблема, просто не понимал зачем мне это надо.
VolCh
21.11.2016 13:06Наверное сначала начинали с переменных, научились проводить декомпозицию основной задачи до элементарных, а потом не понимали зачем останавливаться на полдороге :)
dimykus
21.11.2016 14:57Я не вспомню подробностей, но почему то ощущение, что про циклы не знал, ну и не было под рукой адекватной задачи на массивы. (учился по руководству в doc файле, не думаю что там было что то качественное), насчет структур, я просто мог сделать все тоже самое и без них. Потом(когда примеры стали больше) понял что с ними удобней :)
s-kozlov
20.11.2016 18:13А что непонятного в глобальных переменных? Новичку непонятно, что в них плохого.
merlin-vrn
21.11.2016 12:06Тут по-моему есть дилемма: императивному программированию проще обучать (с позиции преподавателя), а объектно-ориентированное проще понимать (когда ты чистый лист и никогда не программировал).
ООП в моём личном опыте — как велосипед: не получалось, не получалось, потом щёлк — получилось. Поехал. И прогу с ходу сразу запроектировал ООП, и потом несколько раз убеждался, что вышло по канонам.
s-kozlov
21.11.2016 14:09императивному программированию проще обучать (с позиции преподавателя), а объектно-ориентированное проще понимать (когда ты чистый лист и никогда не программировал)
Цель преподавателя (заинтересованного) — научить программировать, цель студента (заинтересованного) — научиться программировать. Я не вижу тут конфликта интересов.
ООП — это не ключевые слова языка, а набор принципов и паттернов, на понимание которых уходят годы. Можно не понять ООП совершенно, но использовать классы и методы (обычно — статические), при этом твои программы работают, а ты считаешь, что понял ООП. Об этом еще Джоел писал:
Когда у вас проблемы с ООП, ваша программа все-таки работает, она просто становится сложной для поддержки. Якобы. Но когда у вас проблемы с указателями, ваша программа выдаёт Segmentation Fault, и вы понятия не имеете, что происходит, до тех пор пока вы не остановитесь, не сделаете глубокий вдох и не попытаетесь на самом деле заставить свой ум работать на двух уровнях абстракции одновременно
(http://local.joelonsoftware.com/wiki/%D0%9E%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Java)
fireSparrow
18.11.2016 17:09На каком современном языке программирования можно в 10 строчек нарисовать синее небо, зеленую землю и желтое солнце? Или звездную ночь? А я такие программы набивал с тетрадки в 3 классе, а в 5 писал сам.
Повезло вам, у нас в школе мониторы были монохромные, так что мы могли нарисовать только зимнюю ночь.merlin-vrn
18.11.2016 20:29Интересно, как же живёт такая отрасль визуальных технологий, как гравюра? Там же, обожемой, только цвет подложки (обычно белый) и краски (обычно чёрный)? А создают шедевры, и почему-то не только зимнюю ночь...
Да и фотография и кино не сразу стало цветным.
commanderxo
19.11.2016 23:04По моему мнению, язык программирования для детей должен уметь разговаривать и рисовать, а для этого нужно:
работающую программу в одну строчку
ввод и вывод текста
графические примитивы — точка, линия, окружность, заливка контуров
В точку! Давно ищу что-то такое чтоб сделать программирование интересным для сына.
Scratch мы уже выучили и переросли. Хочется что-то более ориентированное на вычисления и работу с массивами, чтоб изучать программирование на реальных задачах из школьной программы. Думаю зайти со стороны геометрии, например чтоб ребёнок понял что такое синусы/косинусы. Не сухое определение про отношение длины катета к гипотенузе, а именно чтоб почувствовал что это такое. Например нарисовать с ним модель солнечной системы, чтоб вокруг Солнца крутилась Земля, а вокруг неё — Луна. Так школьник сам почувствует что тригонометрические функции повторяются с периодом 360 градусов, что |sin| <= 1, и т.д.
Python вроде хорош, но пока не нашёл подходящую библиотеку для рисования. Turtle-графика слишком примитивна и подходит только для узкого класса задач. Сам я Python не знаю, думал заодно выучить его вместе с ребёнком. Гугль выдал ссылки на Pygame, но как-то он мне не нравится. Последняя версия 2009 года, программа должна содержать цикл обработки сообщений, буферизация вывода на экран вызовами flip… как-то слишком сложно для первого языка. Хочется сразу рисовать по координатам линии и окружности, заливать цветом. Без необходимости писать ещё 10 малопонятных строчек потому что «тут так надо делать».
Смотрел и в сторону JavaScript. Из плюсов — web и возможность показать своё творение одноклассникам или учителю. Большой минус (для обучения) — асинхронность. Когда в других языках скорость анимации регулируется расстановкой delay — просто и понятно, в JavaScript приходится паковать код в функции и вызывать их по определённым правилам. Для ребёнка среднего школьного возраста это неоправданная сложность.
В общем я пока в поиске, надеюсь на «помощь зала» в этом топике.Source
20.11.2016 07:24Посмотрите Racket. Там есть и заготовки графики для игр, возможность вставить картинку в код и работать с ней как с константой, и рисование графическими примитивами.
А когда с рисованием наиграется, можно будет и примеры из SICP поразбирать.
Barafu
20.11.2016 15:45Для простейшей графики в Питоне народ пользует библиотеку `graphics.py`.
Вот сама библиотека: http://mcsp.wartburg.edu/zelle/python/graphics.py
Вот документация: http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/graphics.html
Shamov
18.11.2016 14:40+2Первым языком большей части современной программерской элиты был Ассемблер. Так что только про этот выбор можно сказать, что он подтвержден реальной практикой в мировом масштабе. Всё остальное — домыслы и теории.
bigfatbrowncat
18.11.2016 18:46В каком возрасте?
Я, например, в 7 лет писал в DOS-овских bat-файлах последовательность вывода на экран чего-то, отдаленно напоминающего интерфейс (очень крутой и красивый!) программы-антивируса AIDSTEST. Дело было в 1993 году, я сидел за списанной IBM PC XT.
Ассемблер я, увы, так и не осилил. QBasic -> Pascal -> Delphi -> C++ -> C# -> Java ->…
Я, конечно, не элита, но, думаю, если бы у меня был ассемблер, знакомство с программированием пришлось бы отложить на несколько лет. По причинам, связанным с интеллектуальным развитием.Landgraph
18.11.2016 21:05Блин, я чуть позже начал, но учил как-то так:
QBasic -> Pascal -> Delphi -> C/C++ -> Asm -> HTML+JS…
Ну т.е. от простого к сложному и пониманию как работает ПК, а потом снова в упрощение. Ну и параллельно «опускался» до схемотехники =)
Shamov
18.11.2016 21:07Я тоже начинал с Бейсика, но чуть-чуть попозже… в 4-м классе. И вообще не на PC. У нас в школе были советские машины, которые назывались УКНЦ. Когда же, в 90-е, у меня дома появился PC, это был сразу 286-й… с сопроцессором. Жесткий диск — 40 мегабайт, ОЗУ — 1 мегабайт. Это был просто космос. Сразу появилась возможность запускать Turbo Pascal.
Мы с вами, разумеется, никакая не элита. Элита начинала с ассемблера, потому что ничего другого не было. А самый топ элиты вообще обходился без транслятора и начинал программирование непосредственно с машинных кодов.Landgraph
18.11.2016 21:11Я в детстве пытался понять что за фигня написана в журнале «Радио», потом узнал про то, что это были машинные коды =)
Shamov
18.11.2016 22:23+1Мы со школьным приятелем однажды попробовали эти коды на его домашнем компьютере. Я диктовал, а он вбивал. Всего за один день получили работающий интерпретатор Бейсика. Правда развлекались с ним только три дня. Потом выключили свет, а магнитофона, чтобы сохранить, у него не было. Он жил в деревенском доме, и у него часто были перебои со светом.
fuCtor
19.11.2016 08:30Первая программа на нем была, ну как программа. В «Энциколопедия профессора Фортрана» на одной странице на мониторе был изображен код программы в пару строк, складывающий числа. Запустить его был первый квест )
ZoomLS
18.11.2016 14:48-1>>Какой язык программирования стоит выучить первым?
Правильнее будет выбрать направление/нишу и использовать нужный инструмент(язык). А то получается, что выбирается язык программирования, ради языка программирования, а не достижения определённых целей сего мероприятия.
Т.е. если человек хочет работать с вебом, а ему говорят — первым языком должен быт C/C++, ты должен знать основы аппаратной части, работа с процессором и т.д. В итоге, человек тратит год, а то и несколько лет на всё это, а к цели никак не приближается. А потом наконец берёт, изучает JS и получает сразу первые результаты.
IT технологии и так быстро развиваются, нужно сразу брать и изучать нужный инструмент, а не не язык программирования в вакууме. А то это будет, как обучение программированию в вузе(90% вузов такие), пройдёт несколько лет, а толку почти никакого. Даже на джуниора тянуть не будешь.s-kozlov
18.11.2016 16:32+2IT технологии и так быстро развиваются, нужно сразу брать и изучать нужный инструмент, а не не язык программирования в вакууме.
Ваш новый хипстерский фреймворк устареет через год, а базовые принципы программирования живут десятки лет. А еще такие «гонщики» за сиюминутной популярностью (себя они называют практиками, хотя на самом деле — «с говна пенок нахватались») задают тупейшие вопросы на форумах, потому что совершенно не понимают, как работают их инструменты.ZoomLS
18.11.2016 17:10Меня совсем не так поняли. Понятно, что основы это главное.
Например, собираешься делать сайты на JS, то и надо изучать сразу JS, а не C/C++. Вот к чему я клоню. Нужно выбирать язык для достижения целей. А то вчера был популярен Python, сегодня JS, завтра ещё что-то. Не значит, что нужно браться именно за какой-то из них.
Глупые на форумах — обычно по тому, что не изучают теорию и/или сам язык, а сразу начинают работать с фрамеворком.jetexe
18.11.2016 17:40+3никто не идет в программирование с целью делать сайты.
игру, ос, приложение которое помогает тебе делать что-то, сделать открыточку (пару раз видел) — это да. А вот делать сайты люди не хотят, в особенности дети.ZoomLS
18.11.2016 17:46Это просто пример. Зачем изучать инструмент, который не понадобится? Я считаю это лишней тратой времени, которого и так мало.
jetexe
18.11.2016 17:53+3А я знаю с десяток примеров, когда не имея базы человек упирается в потолок, а сломать парадигму которую он сам себе придумал не мог.
Я, как и многие из присутствующих, начал с дедушки паскаля, и, несмотря на то, что это мертвый язык, ни капли не жалею о времени на него потраченном.
Там проще всего понять именно суть программирования, не костылянство основанное на копипасте, а именно создании приложения.
Сейчас если человек хочет писать сайты, он идет и качает вордпресс и видео курс к нему. Через неделю у него есть сайт и уверенность в том, что человек теперь веб-программист
poxu
19.11.2016 11:05+1никто не идет в программирование с целью делать сайты.
А я вот много таких знаю. Сайты делать это нынче реально круто.
А вот делать сайты люди не хотят, в особенности дети.
Ещё как хотят.
s-kozlov
18.11.2016 21:18+3Основы — это и культура программирования, для формирования которой трудно придумать что-то хуже JS.
RafaelRS
18.11.2016 15:19Первый язык должен быть согласно классике жанра — Паскаль
lightman
18.11.2016 16:01Он отличен если время не поджимает и вы можете себе позволить упоенно в одиночестве или в команде таких же новичков поаутировать несколько месяцев за ламповой синей консолькой, программируя списки, деревья и сортировки. Например в ходе изучения в университете. Или по вечерам от основной работы.
Если же задача как можно быстрее войти в индустрию, присоединиться к интересным общественным проектам или даже деньгам (и не растерять по дороге энтузиазм), увы, желательно остановить выбор на чём-то менее академичном.jetexe
18.11.2016 16:34-1Чутка позже появилась среда PascalABC, для обучения самое оно. В программировании важно научить мыслить алгоритмами а не образами. Дать понять что только ТЫ виноват в том что тут что-то работает не так. Язык должен обязательно быть компилируемым, чтобы на стадии сборки давать понять что тут не так.
Если не хочется тыкать палкой в мертвяков, то есть Go. Там всё так строго, что можно научить обезьянку
s-kozlov
18.11.2016 16:35Если же задача как можно быстрее войти в индустрию, присоединиться к интересным общественным проектам или даже деньгам (и не растерять по дороге энтузиазм), увы, желательно остановить выбор на чём-то менее академичном.
Когда человек хочет стать программистом за условные полгода, так и хочется спросить: «А че не хирургом?»boldyrev_gene
18.11.2016 17:29Ну нет, хочешь попасть в актуальную сферу, с высоким уровнем заработка — будь добр отучись пять лет в университете, иначе без шансов…
Barafu
20.11.2016 15:50Обычно, отучившись 5 лет, узнаёшь, что с этими полученными знаниями 5 лет назад можно было круто устроиться.
s-kozlov
20.11.2016 18:16Это когда при обучении гонишься за модными новинками, а не «вечными» технологиями и принципами. Знание SQL, Си, ООП и т.д. не устаревает за 5 лет.
Barafu
20.11.2016 18:41Основы Си у нас были. Как раз как модная новинка — всего-то 30 лет…
s-kozlov
20.11.2016 18:52Освоить практически любой мейнстримный язык после Си — как два пальца об асфальт.
Barafu
20.11.2016 19:16Да, а потом я читаю на Питоне
for i in range (0, len(data)):
sum = sum + sqrt(data[i])
Потому что человек освоил C и теперь ему море по колено. Но главная моя мысль — оно точно надо 5 лет учить Си, чтобы потом быстро выучивать «практически любой мейнстримный язык» и этот Си больше не вспоминать? Может быть есть более эффективные методы?
VolCh
21.11.2016 13:08А если эти пять лет работать, обучаясь без отрыва от производства, как говорилось?
boldyrev_gene
21.11.2016 13:22Ну если человек только школу окончил, то я не призываю его забивать на универ. Но если человек уже прошел этот этап и хочет попасть в IT, то второе высшее образование, но уже в этой сфере — лишняя трара денег и времени. Пусть выбирает сферу, в которой хочет работать и уделяет время на изучение только того, что ему нужно будет в этой сфере.
yarric
18.11.2016 18:13А почему вы вообще сравниваете программирование с медициной? Чтобы стать хирургом — надо долго учиться, а программирование многие осваивают сами за год-два на достаточном уровне.
khim
18.11.2016 18:21+2А потом нам приходится тратить кучу времени чтобы этих «самоосвоивших» отсеять на собеседованиях.
Понимаете — медициной тоже можно «на разных уровнях» заниматься. Можно травки заваривать и к больному месту прикладывать (и неплохо зарабатывать на этом, кстати), а можно — реально лечить.
С программированием — та же фигня: умение «что-то такое изобразить» — это один навык, умение программировать и работать над большими системами в большой команде — другой.yarric
18.11.2016 20:23+4Вас так послушаешь, так программирование — это сплошная rocket science, а как посмотришь вакансии — большая часть 1С, Java-энтерпрайз, сайты-визитки, мобильные игры…
Впрочем если подходить формально, то, к примеру в США, хирургу нужно учиться 8 лет, а потом ещё от 3-х до 8-ми лет проходить практику, прежде чем он сможет оперировать.
В тоже время студенты-третьекурсники и всякие undergraduate уже вполне нормально находят работу в области программирования и работают в командах. Кстати и соответствующие опросы на хабре показывают, что большинство людей в этой отрасли не смотрит на образование, а смотрит на результаты собеседования — ничего, работают.
С другой стороны, сплошь и рядом поделия крайне профессиональных контор, к которым выходят патчи сразу после релизов. Представьте себе такого хирурга, м?
Я, конечно, понимаю, что хочется свою профессию и себя ставить поближе к чему-то вроде квантовой физики, а не к чему-то вроде автослесарного дела, но читать это чрезмерное возвеличивание программерского дела немного раздражает. Особенно при сегодняшних очень скромных успехах в области обеспечения надёжности и безопасности программных продуктов, причём у крупнейших контор — лидеров рынка.
khim
18.11.2016 23:59+2Проблема не в «возвеличивании». Проблема в том, что люди мешают в кучу разные вещи. А студент третьекурсник — он, как бы, третьекурсник потому что он три года учился, не? Так что у него уж всяко больше багаж знаний, чем у «специалиста» изучившего программирование по книжке «XXX за 21 день»!
А «опросы на Хабре» показывают больше «хотелки» людей, чем реальное состояние рынка труда.
А насчёт «надёжности и безопасности»… Посмотрим на какую-нибудь новость про безопасность ПО. Если скормить проигрывателю «специальным образом сконструированный файл» — то у него случится «бяда». О как. Ужос. А что будет если скормить даже не «специальным образом сконструированную грампластинку», а всего-навсего арбазивный круг любому проигрывателю грампластинок?
В ПО действительно куча уязвимостей и дыр — но безопасность ПО не хуже, а на порядок лучше, чем в любом другом оборудовании. Если ваш холодильник сгорит из-за того, что на него сильно и резко неправильное напряжение подадут — то это даже не будет считаться проблемой в его конструкции! А в ПО подобное же — повод для экстренного выпуска «патчей сразу после релизов».
Не столько завышать оценку людей, которые занимаются программированием, но и занижать её тоже не стоит — если бы каждый второй мог этому «с полпинка» научиться, то не было бы столько незакрытых вакансий предлагающих (как по меркам некомпьютерных областей) очень хорошие деньги.yarric
19.11.2016 20:29+1Я и не говорю, что программирование — это неквалифицированная работа. Но и с работой, требующей высокой квалификации (как хирурга), оно не сравнимо.
безопасность ПО не хуже, а на порядок лучше, чем в любом другом оборудовании
Поймал радиоприёмник специальным образом сформированный радиосигнал — превратился в подслушивающее устройство, проехала машина по специальным образом сформированной дороге — руль начали крутить за вас злоумышленники, положили в холодильник специальным образом сформированный продукт — он перестал охлаждать и начал портить продукты, занесли в лифт специальным образом сформированный свёрток — лифт превратился в ловушку, отправьте SMS, чтобы выбраться. Знакомо?
При этом способы формальной верификации разумеется, существуют — ещё Дейкстра об этом писал, но все эти крутые фирмы почему-то продолжают пользоваться странными подходами вроде юнит-тестирования, которое, как пишут в любой книжке по тестированию, "не может на 100% верифицировать корректность работы программы".
s-kozlov
20.11.2016 09:15Но и с работой, требующей высокой квалификации (как хирурга), оно не сравнимо.
Смотря где. Клепание однотипных сайтиков на популярной CMS сравнимо с выносом уток санитаркой. Разработка и поддержка системы 24/7 — уже «хирургия». Сервер упал — пациент умер. И доверять самоучке с 1 годом опыта лабания на JS разработку такой системы — такая же глупость, как доверить санитарке пересадку сердца.yarric
24.11.2016 19:44Сервер упал — сервер подняли или включился резервный. С пациентом так не получится.
s-kozlov
25.11.2016 06:10Клиническая смерть длится несколько минут, в течение которых есть шанс вернуть пациента с того света.
И вообще, о чем мы спорим? Я утверждаю, что в программировании, как и в медицине, существуют разные уровни сложности, требующие, соответственно, разных уровней подготовки. Что высококлассного спеца не заменят десять Вась-самоучек. Так же, как в медицине.yarric
25.11.2016 21:00В программном коде написал что-то не то, скомпилировал, не работает — нажал Ctrl-Z. Если попало в релиз — накатал патч. В хирургии резанул что-то не то — нажать Ctrl-Z уже не получится.
Например даже в такой "банальной" области, как радиоизмерения, цена случайной ошибки гораздо выше, чем в программировании — можно легко сжечь дорогостоящий прибор, например. Функции Undo нет.
s-kozlov
26.11.2016 13:01У меня такое ощущение, что у вас программирование — это какая-то узкая область, где можно релизиться по принципу «чик-чик — и в продакшен», не боясь, что начальство/заказчик/клиенты/партнеры оторвут тебе яйца за потерю реальных денег / репутации / клиентов / марсохода / гибель людей, которые — сюрприз-сюрприз — могут произойти из-за баги в коде.
yarric
27.11.2016 20:45Есть программисты, которым приходится писать код с первого раза без единой ошибки? Seriously?
s-kozlov
28.11.2016 08:07Представьте себе, программы бывают всякие: от бортовых систем марсоходов до автопилотов и прошивок роутеров. И пишут их — внезапно — программисты. Да, они могут ошибаться, как и все люди, но цена ошибки… мм… Предложить простому юзеру обновлять прошивку роутера — серьезно? Это чтобы в народе бренд назвали «не покупай, это говно»?
poxu
25.11.2016 10:08Сервер упал — сервер подняли или включился резервный. С пациентом так не получится.
А если речь идёт о программировании инструментов для хирурга? Или если водитель нажал тормоз, а тут как раз JVM решила сборщик мусора запустить?
webkumo
25.11.2016 11:08Я так подозреваю, что на авто ставить JVM со сборщиком мусора — не самая лучшая идея… Если же ну очень хочется (например для автопилота), то необходимо дублировать управляющие цепи железяками реального времени с прямым пробросом управления пользователю.
poxu
25.11.2016 11:48+1Я так подозреваю, что на авто ставить JVM со сборщиком мусора — не самая лучшая идея…
Вот именно!
К любому программному обеспечению для автомобилей или для сердечных стимуляторов — очень жёсткие требования.
merlin-vrn
25.11.2016 16:39Помните историю с Therac 25 (аппарат лучевой терапии)? В его предшественнике были такие аппаратные цепи, в 25 это убрали "за ненужностью". А код-то оказался с гнильцой, и выяснилось, что та предыдущая модель не убивала людей только благодаря аппаратным блокировкам.
И это вовсе не про джаву речь, а про культуру программирования, ассемблер тут и там, где он неуместен и трюки в коде…
svboobnov
26.11.2016 23:53Есть же Ada, на ней буковок много печатать приходится, но контроль жёсткий, и в платном компиляторе аж много анализаторов кода.
Wedmer
28.11.2016 09:31Не знаю почему, но мне сразу вспомнилась шутка про диалог разработчика на си и разработчика на Ада.
RafaelRS
18.11.2016 17:23+1Ну, если говорят об обучении, то я это понимаю как начальную выработку навыков. Паскаль в этом плане самое то: учит структурному программированию, строжайшая типизация, базовый набор всего того, что используется полностью или частично практически в любом ЯП, классический последовательных порядок выполнения программы с нулевой точкой входа, вместо асинхронного порядка в фреймворках с точкой входа, где уже под капотом выполнена куча подготовительных операций — что может сбивать с толку затруднять объяснение «как же все работает». Выучив Паскаль ты выработаешь в себе правильные привычки и изучая боевой язык вместо них не привьешь себе неправильные. Да, это требует времени, но по большому счету любое серьезное программирование требует времени.
Мне странно, что здесь некоторые проголосовали за Си или C++ — Си еще куда не шло, но даже там лишние заморочки с указателями и другая специфика, которая будет только мешать усвоить базовые навыки программирования и сбивать с толку. Ну а С++ вообще тот еще лес для новичка.
Если же время поджимает и есть конкретная задача, то ты выбираешь тот язык, который требуется для задачи и изучаешь усиленно именно его.
newpy
18.11.2016 15:22Фантасмагория:
— Что выбрать Ауди, Мерсдес, БМВ, Порше или Феррари?
— Да что тут думать?! У меня Феррари, Феррари лучшая первая машина!
— Спасибо за совет, да феррари супер машина! Но мне как-то больше нравится БМВ, хоть я на ней и не ездил…
— БМВ? Да ты что?! Как можно сравнивать Феррари и БМВ?!
— Ну ты знаешь… просто вот нравится и все… внешний вид, салон, приборная панель, ангельские глазки…
— Привет парни, о чем говорите? Ооо… о первой машине? Так я вам скажу, лучшая первая машина это Мерседес!
— Фууу… Феррари зэ бэст!
— Я как бы хочу первую БМВ, феррари может потом когда-нибудь…
— Нееее… если уж потом, так Мерседес! На крайняк Ауди купи, она хоть тоже немецкая!
— О! Привет мужики! Я тут вчера Порше купил… Тачка огонь! О чем болтаете?
— …merlin-vrn
18.11.2016 16:04+8и тут выползают они: ВАЗ! Начинать нужно с ВАЗа! Это конструктор! Ты потом сможешь разобраться и починить любой автомобиль!
jusiter
18.11.2016 16:25не уверен что даже если научишься разбирать и собирать ВАЗ с закрытыми глазами сможешь хоть что то сделать с бмв/мерседес/ауди, которые без корректных показаний датчиков и прочей гирлянды электрики — нивжисть никуда не поедут.
merlin-vrn
18.11.2016 16:53Так в (относительно, так-то лет двадцать пять уже) современных ВАЗах двигателем управляет такая же электроника: собирает данные с гирлянд датчиков, управляет форсунками инжектора… Часто не просто такая же, а та же самая электроника.
Но даже и без этого, при желании, знания вполне переносимы. У меня тут перед глазами пример такого тазовода, водителя 2106 (которая старше него самого), он недавно пересел на Октавию, и теперь копается ещё и в ней, причём довольно свободно, хотя шестёрка как раз ещё без этой самой современной электроники.
newpy
18.11.2016 16:59Речь шла о выборе первой машины и простом использовании в идеальном мире где я дарю вам 100 млрд долларов на все названные машины, и о выборе первой из них.
Машина — ЯП. Вы же скорей проводите аналогию между копанием в исходном коде ЯП и разборкой авто любой марки. Зачем вам копаться в феррари каждый день? Вы ездить на ней будете. А ремонтировать ее будут другие ))). У вас же 99,5 млрд долларов. В моей пятничной фантасмагории не проводится такой аналогии )) короче, и ВАЗа тоже не было.newpy
18.11.2016 17:01да и поверьте, как автомобилисту с опытом, залазившему под капот ВАЗа, и владевшему бмв/мерседес/ауди, что ничего нового я, в упомянутых трех, под капотом не нашел ). А опытный механик так тем более.
GLPavel
18.11.2016 15:25Уже на протяжение 4 лет выбираю язык для себя, начиная и бросая в связи с тем что не могу подобрать «мой язык», питон, ява, пхп, да тот же js, что к сожаления не воспринимаю вообще как язык, и остановившись на С++ могу сказать, огромный потенциал с первых получены знаний, огромные возможности языка, изучая язык изучаете и то с чем работаете, широчайшая область применения.
Snakecatcher
18.11.2016 15:25+7В институте (МИРЭА), имел глупость спросить у преподавательницы (Дина Эммануиловна, может кто знает :) ), какой язык программирования лучше.
На меня посмотрели, как на первокласника, и сказали «Основы, надо знать основы, молодой человек. А язык изучается за два-три месяца». :)Fenix_x_com
18.11.2016 15:46У Федотовой ты спросил??? ПАРЕНЬ, ТЫ ЧТО :O
Извините, я из МИРЭА (в прошлом) :)
Но основы то знать, конечно, стоит. Вообще спрос на программистов с крепким базовым образованием всегда выше.Snakecatcher
18.11.2016 15:54Ну да у неё. Знаю, за вредный характер нелюбима студентами. :)
Но по отзывам, специалист она хороший.
boldyrev_gene
18.11.2016 17:32-14 года в сфере работаю (начал до поступления в универ). Ни разу за образование не спросили :)
ZoomLS
18.11.2016 17:52-1Так и есть. Эта утка про спрос на программистов с каким-то там базовым образованием в вакууме, ходит уже какой год. Всем нужны только знания, умения и опыт. Образование никому не интересно. А если спрашивают, либо это гос контора, где делать нечего, либо какая-то странная компания, которую наверное, лучше обойти стороной.
Shamov
18.11.2016 18:20Этот спрос выражен неявно. Никто не спрашивает про образование в таком ключе, чтобы можно было подумать, что это имеет значение. Боятся отпугнуть тех, у кого его нет. Но зато когда оно у тебя есть, это работает как ксива-вездеход. Имея профильное программерское образование (в России оно называется «прикладная математика»), ты просто приходишь в любую компанию и при желании получаешь там работу. Конечно, при условии, что на собеседовании были такие вопросы, которые позволили это образование продемонстрировать. Часто предложение получаешь сразу на месте. Но даже если нет, покидая собеседование, всё равно уже точно знаешь, что оно последует. Некоторым работодателям требуется время. Должен пройти шок. Они не могут поверить в то, что это всё взаправду.
am-amotion-city
21.11.2016 12:37Либо любая европейская / американская компания, которая по закону не сможет вам визу выправить, если у вас образования нет.
vlivyur
23.11.2016 16:54А им разве только стажа работы не достаточно?
am-amotion-city
23.11.2016 17:02Вам рабочую визу будет не получить. Это на уровне государственной бюрократии. Компании диплом может быть не так важен, на «стаж работы» (по моему опыту) они даже не смотрят.
Меня сами отыскивают по профилям на SO/GH, но вопрос про образование всегда идет первым, из-за визы. Фрилансерам можно без него, но приличную интересную работу в Европе на фрилансе не получить, только всякие формочки клепать.
vlivyur
24.11.2016 12:55Я просто не раз натыкался что нужно либо совместимый диплом, либо стаж работы по такой же должности не менее 3-5 лет. Вроде в Австралии и Канаде именно так.
am-amotion-city
24.11.2016 13:04Я говорю про то, что знаю: в Европе и Америке это не так. В Канаде, кстати, тоже, но тут информация из одного источника и менее проверенная.
Как они, по вашему, ваш стаж будут проверять? Ну я напишу, к примеру, что я на Байконуре уже 70 лет программирую нанороботов — и? Даже совместимость диплома — весьма тонкая штука, например в Испании для получения рабочей визы необходимо окончить один из 12 российских вузов.
В принципе, компания может вывернуться, если вы прямо ваще ценный сотрудник. Но с улицы — все очень протокольно обычно.
webkumo
24.11.2016 15:56Про Германию: для визы blue card на должность программиста необходим IT-образование или n (кажется 6) лет работы по специальности. Это по их законам, легко ли получить визу по стажу — я не знаю, отзывов ни за, ни против не встречал.
Подтверждается ваш стаж в РФ вашей трудовой книжкой (на основании которой составляется юридически значимый документ и юридически значимый перевод к нему).
Kenya-West
Реквестирую бугурт от хабровчан. Как раз пятница, давайте развеемся!