Как я нашел лучший язык

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

Тем кто изначально отнесся скептически, хочу сказать, что я не собирался и не собираюсь агитировать кого-либо за тот или иной язык. Написал же я просто с одной искренней целью: поделится радостью открытия. Когда прёт (а с возрастом прёт все реже и реже, тем более от такой, вроде, мелочи по жизни, как язык программирования) хочется поделится. Вот такое вот редкое и детское желание: ребята, смотрите как круто! Тем более что я действительно ждал, искал, и переживал из-за вопроса долгие годы, и ответ от него не был мне очевиден, хоть я и не раз проходил мимо.

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

Язык программирования — зачем?

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

Множество языков общего назначения одинаково применимо к большинству задач (поэтому из и называют общего назначения), и я не буду рассматривать случаи когда язык однозначно заточен на решение поставленной задачи. В этих случаях все более менее понятно, а если и возникают споры, то они более предметны. Интересен же наиболее частый случай — когда задача вполне нормально решается на десятках языков (а это как раз обычная ситуация). Ну вот например в вопросе: что выбрать для сервера из списка Java, Go, или JavaScript — срач обеспечен.

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

Кроме того в дискуссиях о языках мы разбиваем языки на классы (динамическая типизация, managed runtime, и так далее), разбиваем задачи на классы, но вот почему-то практически никогда не разбиваем “программистов” на классы. Иногда, конечно, мы это делаем, но чаще всего разбивая на программистов на “новичков” и остальных «программистов», и это обычно происходит только тогда когда “новичок” сам относит себя к этому классу. Впрочем эта классификация тут же теряется, потому что даже самый махровый ламер, в ответ может начать вещать с позиции гуру, совершенно не задумываясь о том к каком классу относится он сам. Если, помимо языков и задач, начать классифицировать еще и участников дискуссии (а это надо делать), то зоопарк рисуется еще тот.

Тема, классификации программистов — отдельная и безусловно интереснейшая история на грани с психологией (или психиатрией), которой можно заняться на досуге. Сейчас же я приведу пару примеров, которые уже говорят о том, что влияние субъекта и его мотивов в вопросах оценки языка не менее велико (а скорее более), чем сам язык или задачи под которые он выбирается. Ну например:

Мудак

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

Я конечно сказал что это дурдом, и что они сам себя раком поставил, да и забыл эту историю, пока не встретил знакомца в очередной раз, где-то полгода назад. Знакомец рассказал что едет в Бразилию, в командировку. Помогать бразильцам делать очень навроченную систему чего-то там на Scala. Едет он к сожалению один, поскольку для написания столь хитромудрого кода у его соратников не нашлось достаточно интеллекта, но ничего он и один справится. И в конце добавил что очень рад работать с такими умными бразильцами и восхищен их планом. План был простой: писать все на Scala обязательно, и архитектура должна быть такой, чтобы обычному человеку в голову не влезла. Что позволит им захватить маленький, но денежный нишевый рынок в Северной Америке, и жить долго и счастливо, получая ежемесячно чеки за саппорт сложнейшего продукта.

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

Микроблоггер

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

Есть, например, популярные в узких кругах микроблоггеры которые многие годы рассказывают о крутости всего того, что я считаю слишком умным для меня, и даже не лезу эти истории, микроблоггер же чморит всех “лохов” направо и налево, даже если вы пишете на Haskell, но не успели оценить красоту Idris (или чего-то там). Беда в том, что микроблоггера слушает молодежь, кивает и рисует в голове картину успешного программиста, который занимается умными вещами, а не бытовухой, как они и, наверное, хочет стать таким же умным. И не знают, что в реальной жизни “звезда функционального программирования”, например, копается в миллионах строк на Perl в команде из 100 человек, и практики применения всего о чем рассказывает не имеет никакой. Звезде идет четвертый десяток лет, и ни на одном месте работы его не держали более трех, да и не смог он оставить следа в жизни. Во всем интернете нет ни строчки его кода, разве что портированные чужие либы с чего-нибудь на Haskell, или с PHP на Perl.

Микроблоггер тоже ищет в языке волшебную палочку, которая наконец даст ему возможность хоть что-нибудь создать самому, но не находит, и прыгает с одного языка на другой, с надеждой, что вот он: тот самый язык который ляжет на его ментальную модель, и он сможет творить, но нет, и нет, и нет. И он опять на унылой работе наедине с Perl… Сейчас я заплачу… Но микроблоггер не плачет! Он выходит в социальные сети, и вот уже миру видится гуру функционального программирования, гигант мысли, вершина профессиональной карьеры. И десятки вдохновленных юношей бросают программировать и начинают изучать Haskell (или то, что микроблоггер в данный момент рассматривает как палочку), в надежде стать таким же как он.

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

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

Прочие заболевания

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

Пораженный таким вирусом юноша ведет себя, примерно, следующим образом: был у нас такой кадр, которого мы только взяли и дали отдельную задачу. Ну кадр что-то поделал пару недель и приходит посоветоваться, мол вот я тут напридумывал так и так, на доску схема не влазит, но вроде все хорошо, только вот еще пара use cases никак одновременно не получается, типа давайте выберем только один (CAP-теоретик, блин). Ну ему говорят, а давай все это твое нахер выкинем, и сделаем две такие штуки. Чувак зависает на пять минут в деадлоке, потом начинает выдавать какие-то звуки: «ну», «ну»… — «что ну?» — «ну это же слишком просто». Вирус отрубающий способность думать просто вообще распространен как простуда. Студент приходит в какую нибудь контору, там уже построен монстр который рассыпается и нужно через разные места этого монстра поддерживать, а не дай бог еще и развивать. Гавно, палки, костыли, дырки, десять человек вместо двух, и все давно заражены одним из мозговых вирусов программистов. Кстати, большинство юношей все же приходит здоровыми, поэтому мы часто слышим что «неопытные программисты стремятся переписать весь код». Но ему это сделать никто не дает, он привыкает, расслабляется, и пипец, заболел. Через пару лет у него никогда не возникнет мысли что так не должно быть. Программный продукт это сложная вещь. Программисты получают много денег за то, что эти сложные вещи делают, и по-другому не бывает.

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

Язык программирования — почему?

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

Как бы не так. Цели создателей языков тоже на удивление разнообразны. Вот c какой целью Odersky создавал Scala? Может быть это были сугубо академические (исследовательские) цели, и ему, как исследователю, было интересно сделать что-то новое вокруг идеи связки функционального и объектно-ориентированного программирования. Из презентации: в создании Scala он был мотивирован двумя гипотезами. Причем большинство других языков не мотивированы одной или обоими из этих гипотез. А если гипотезы не верны, то где будет Скала? А если верны то где будут другие языки? А может эти гипотезы вообще фуфло для “красоты”. Может быть он просто выполнял некий университетский “план” и типа вот вам как просите: гипотезы и брюки для птиц. А может быть Sun его чем то обидел, пока он c ними работал:

Sun hired Martin Odersky to design Generics for Java, and the GenericJava compiler actually became the standard javac compiler shipped with the SDK as early as Java 1.2 (with the bits about generics disabled). Later on, a modified design of generics (with wildcards being the main new addition) was released with Java 1.5. Odersky, of course, went on to first design Funnel, then Scala, but his compiler still ships with Java 8.

Почему нет? Вот представьте Мартин такой толкает Сану идеи, вот так говорит надо, а они его заворачивают. В результате вообще его работа в свет не выходит ни в 1.2 ни в 1.3. А в 1.5 выходит нечто не совсем то, что он считал правильным (у меня нет никакой информации просто вот прямо сейчас родившаяся теория заговора). Ну и он такой обозлился и типа “щас я вам, [синонимы] штопаные, покажу язык, перед которым вы будете тем что вы есть — [синоним]” и понеслось… И язык создавался совсем не для того, для чего вы думаете, а чтобы уделать кого-то, и показать кто тут главный по языкам.

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

Вот замечательная Clojure. Родилась она изначально из замечательных идей Rich Hickey о “state, identity, value, time, types”, чувак задумался о том какие новые конструкции нужны для решения текущих и будущих проблем канкаренси и параллелизма. Изначально была проблема, идея, и решение, которое было в области Persistent Data Structures, STM, и так далее. Я абсолютно уверен что сначала появился Persistent Vector а потом язык Clojure. И то что горячо любимая некоторыми Clojure выглядит как Лисп и диалектом чего является, может быть лишь стечением обстоятельств. Вероятнее всего Лисп — был тем языком который Rich был готов реализовать максимально быстро, и который в принципе его устраивал. Сложись звезды по-другому, он мог взять или придумать другой язык. Я к тому что язык тут вообще вторичен.

Мне хочется обозначить важность целей создателей. Вот кто-то говорит Clojure это круто потому что я могу элегантно управлять стейтом, канкаренси там бла-бля. Нет! Это не язык программирования (Clojure как диалект Лиспа) позволяет вам делать это, а идеи Рича. Язык был добавлен к этим идеям как средство использования идей. Эти концепции, будучи реализованными в других языках, а для них не нужен особый “специальный” язык, программист получит все те же радости, за которые многие любят Clojure. Нужно четко осознавать что вам нравится в языке: концепции, которые легко переносятся в другие языки, как например те же PDS во всю тащат в JavaScript или вы претесь от самого языка (диалекта Лиспа в данном случае).

Я хочу сказать что создатели языков очень редко задаются целью создать язык с помощью которого программист будет более продуктивен. Зачастую они решают какие-то другие задачи и язык появляется как результат решения этих задач. Хороший пример JavaScript. Никто же не думает, что JavaScript сделали для того, чтобы вы повысили свою продуктивность и писали код мощнее, быстрее, качественнее. Или кто-то думает? (улыбаюсь).

От создателя: brendaneich.com/2008/04/popularity. Вообще Brebdan Eich был приглашен в Mozilla, чтобы написать Scheme для браузера, и если бы этот изначальный план не был скорректирован то писали бы вы сейчас все на Scheme и рассказывали как это круто, можно, молодежно (простите, чуть не подавился). Почему вы сейчас пишете не на Scheme а на JavaScript — тоже никак не связанно с желанием сделать вас более продуктивными. Начиная с того, что Scheme не проканала потому что менеджмент хотел язык с синтаксисом похожим на выходящий в то же время из Sun язык Java. По массе причин вообще никак не связанным с программированием и продуктивностью вам на лопате вывалили язык сделанный в рекордно короткие сроки и сам автор даже в 2010 не понимает популярен ли он и как к этому относится, и причины популярности языка уж точно не связаны с тем что он прекрасно выполняет свое главное предназначение (в моем понимании) — увеличение производительности программиста.

Главная и единственная цель

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

Язык можно адекватно оценить только с одной лишь целью — производство.

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

Правда в том (и возможно одна из причин столь разнообразных мнений о языках), что большинство из нас проявляет интерес к языкам с разнообразными целями (обучение, любопытство, увеличение ЧСВ), но не для повышения продуктивности на производстве. Зачастую мы просто не имеем производственной возможности поменять язык. Поэтому большую часть нашего времени самый важный — производственный интерес к языкам у нас отсутствует. Он в лучшем случае либо образовательный либо просто любопытство. Либо ты дизайнишь язык — но это тоже редкость.

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

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

В 1999 я работал в довольно большой конторе и тогда были популярны две холиворные темы, поскольку тем было всего две, а не как сейчас десятки, то рубились не на жизнь а насмерть. Темы эти естественно Windows vs Linux и C++ vs Java. Так вот пока люди срались в курилки за Java или против я стоял в стороне и тихо ржал (а иногда громко). Причина была проста: был у меня тогда проектик, ну скажем поисковик в Intranet, или типа того. И собрался я его писать сдуру на C по причинам которые молодежь сейчас приводит как аргумент (экосистема). Так вот следуя этому аргументу, на Java писать тогда было никак нельзя (ибо 1.2 по моему была еще только в бете) а экосистема вообще никакая. А на плюсах были какие-то типа полезные либы и фреймворки.

В мире Java даже Lucene тогда еще не было, появилась чуть позже и была в моменте никакая. Ну да ладно, вот и я как бы повелся, что надо бы писать на плюсах, наелся гавна (в том смысле что вместо того, чтобы программировать — думал за компилятор, скрещал библиотеки, и так далее). Слава богу у меня была производственная возможность плюнуть на все и переписать на Java. Чуваки сначала конечно покрутили у виска, сказали что скорости не хватит, пришлось им показать что мы только и делаем что файлуху читаем, а это вообще ни к Java ни к плюсам отношения не имеет.

На творческую переработку того, что успелось сделать плюсами на Java у меня ушло в 10 раз меньше времени чем на оригинал (да я был конечно уже в теме, но во время написания оригинальной версии ресерча не было — благо были документы описывающие алгоритмы индексации и crawling от пары чуваков из Стенфорда — Сергей и Ларри их по-моему звали, все было просто и понятно, а их патентованый алгоритм ранжирования результатов поиска при наших объемах был не нужен, да и бесполезен. Те чуваки, кстати, как раз тогда только открыли компанию занимающуюся поиском в интернете).

Ну и вот стою я, значит в курилке, слушаю треп за темплейты, перегрузку и переопределение чего только можно, макросы-шмакросы, аллокаторы, производительность и множественное наследование (!). Гуру C++ нападают на маленьких студентов и вываливают на них всю мощь этого языка. Типа вы тут на своей Java и так не сможете, и вот так не сможете, и вот так неполучится (как в том анекдоте, сделай меня раком). А я чо то про себя ржу, и довольно улыбаюсь. Вертел я все эти ваши аллокаторы с темплейтами на своем множественном наследовании. Какая мне разница что вы там можете, и как вы можете, если я могу писать код в 10 раз быстрее вас, ну хорошо, опытный С++ программист у которого уже всё в крови и других частях тела будет писать быстрее, значит я буду быстрее его в 5 раз. Да хотя бы в 2-3 раза. Если я буду делать то же самое в 2 раза быстрее какое мне дело что у него там за темплейты. А ограничения? Да их нет — скорости нам хватало, памяти тоже, а ядра операционок мы писать не собирались.

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

Таких ярких вспышек, когда ты вроде бы программировал как обычно, тяжело, как на стройке кирпичи таскают, а потом вдруг получил в руки чудесный инструмент, волшебную палочку, и кирпичи начали сами летать туда, куда ты хочешь, я испытал всего лишь пару за вот уже двадцать с лишним лет программирования за деньги. Про переход с С++ на Java я уже сказал. Примерно так же было, когда мы программировали десктопные аппликухи на Visual C++ 1.0, 1.5 или около того. Тогда сделать какой-нить диалог с тремя кнопками (которые еще не скоро начнут работать как надо) была большая задача, на денек так. Все эти макросы, и прочая хрень, которую я к счастью не помню. Чтобы, если что, понять как на самом деле твой код общается с виндой надо было с ума сойти продравшись через горы плюсовых библиотек.

И тут появляется Delphi. Кто то может посмеяться, но это была реальная революция (ну а тем кто опять не верит скажу, что архитектора Delphi, Anders Hejlsberg обалдевший Microsoft почти сразу переманил, и в том же Microsoft Anders был ведущим архитектором C#). Так вот, ты садишься за Delphi и делаешь что хочешь, хочешь пользовательский интерфейс, хочешь низкий уровень, все flow понятны, вызовы в операционку, можешь дописать сам чего хочешь (например поддержку новых контролов от Microsoft, не дожидаясь выхода новой версии Dephi). Понятно, и на расстоянии вытянутой руки ты видишь все вплоть до лайаута таблиц виртуальных методов в памяти (ну если вдруг надо), и самое главное, ты пишешь такой же софт, что писал раньше в 10, а то и больше раз быстрее. Ограничения? Да нет их. Вообще нет, ломануться куда нибудь в недра операционки проще чем раньше.

Из этих двух рассказов можно сделать вывод, что я за простоту. Нет это не так и с самой простотой не все так просто :) Загнул так, что вспомнил толк замечательного Rich Hickey, скажем просто “про простоту” — очень хорошая вещь. В контексте языков программирования я не за сложность или простоту языка, а за мощь компилятора и простоту его использования. Чем лучше он меня понимает (выразительность) и чем больше за меня делает — тем лучше, при исполнении того же самого, и единственного условия: любое усложнение языка/компилятора, должно увеличивать мою производительность а не уменьшать.

В JVM мире есть хорошие примеры. Да и сама Java — такой пример, если сравнивать Java с C++ скажем так пофичечно — Java проиграет, ну прям с разгромным счетом. Но есть внутри JVM сложная штука, которой нет в плюсах — Garbage Collector. Java без GC (хотя это было бы совсем не Java) не дала бы мне возможность писать код в разы быстрее. Как ты не упрощай дальше или не усложняй опять. Продуктивность программиста выросла в разы по большому счету благодаря сборке мусора (это когда компилятор и рантайм думают за вас, причем постоянно), а помех она не создает (разве что последнее время, в связи с дешевизной памяти и трендом писать на Java вообще всё, GC в некоторых случаях опять становится проблемой).

Генерики в 1.5, ничуть не усложнили использование Java, а лишь увеличили продуктивность. То же самое видимо с лямбдами (но честно скажу, что уже не застал). Ровно эта причина — увеличение продуктивности, заставила меня задуматься о более продуктивном языке чем Java в 2008, и поэтому я надеялся на Fantom. Его я хочу привести как пример языка, основной идеей которого была и есть увеличение продуктивности програмииста. Ребята которые сделали Fantom главной целью ставили продуктивность, сдесь и сейчас, в нашей реальной работе:

Fantom is designed as a practical programming language to make it easy and fun to get real work done. It is not an academic language to explore bleeding edge theories, but based on solid real world experience. During its design we set out to solve what we perceived were some real problems with Java and C#. Our background is heavily Java, but many of Java’s problems are shared by C# and .NET also.

Если кто-нибудь заморочится почитать их форум, то четко это поймет. Именно эта ориентированность на продуктивность инженера привлекла меня в языке, и духовный опыт вовлечения в язык был хоть и не так силён, но похож на опыт перехода с плюсов на Java, когда код льется из под пальцев и ты понимаешь что Java не дала бы тебе делать то же самое с такой скоростью, когда ты чувствуешь больше свободы (а Fantom ничем не ограничивает Java программиста предоставляя удобный FFI и native classes, но дает еще и браузер как платформу), и ты понимаешь — вот она, та самая доза продуктивности, которую ты ищешь, находишь, но со временем тебе ее снова перестает хватать.

Fantom я хотел привести в пример потому что в нем нет генериков, и продуктивность, которую фантом дает программисту по сравнению с Java не связана с наличием или отсутствием генериков. Про отсутствие генериков в Фантоме я хочу сказать тому подавляющему классу программистов, которые ищут в языках фичи а не продуктивность. Неужели вы думаете, что авторы языка не смогли бы добавить в язык и генерики и черта лысого? Тем более что фантом прекрасный пример языка, который люди просто написали для себя, даже не так, для своего бизнеса. Для собственной продуктивности и продуктивности бизнеса в целом.

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

Это я к тому, что сравнивать языки пофичечно — большая глупость. Имеет значение только _вся картинка_ целиком. Присматриваться к фичам — это как выбирать девку по фотографиям частей тела, посмотреть там ухи отдельно, глаза, поставить требование чтобы были сиськи, а не их подобие, а в результате получить такое, что врагу не пожелаешь. В то же время рядом могла быть обалденная девка вообще без сисек (простите, генериков — это из словаря синонимов).

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

В свое время я испытал шок. Будучи фанатом объектно-ориентированного программирования с 90-х годов, я всегда стремился писать максимально абстрактный (но все же достаточно разумный чтобы работал) код. Вообще писать объектно-ориентированный код в 90-х — это было бунтарство. Объектно-ориентированых программистов было не больше чем тех кто пишет исключительно в функциональном стиле.

Так вот, эти мои склонности к абстракциям были облиты холодным душем, когда в 2002 году я “нашел” (улыбнулся, поскольку перекликается с данной статьей) eclipse. Eclipse меня очаровал своей архитектурой и дизайном. Сейчас про eclipse к сожалению услышишь мало что хорошего, но это от тех кто никогда ее не видел внутри, а если и заглядывал, то не достачно чтобы рассмотреть.

Я же в жизни видел единицы столь качественно задизайненых платформ, но это и не удивительно — один из архитекторов Eclipse Platform — Erich Gamma. Он же один из банды четырех — авторов популярной в те времена книжки под названием Design Patterns. Не знаю на сколько она популярна сейчас, но на рубеже 2000 годов во всех конторах как правило гоняли по дизайн паттернам на собесах.

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

Любой факт (пере)использования чего либо, явно или неявно рожает зависимость на эту штуку. И там где для меня благо (эффективное переиспользование) и, как следствие, увеличение продуктивности, то для людей создающих платформу, на которой предполагается одновременный запуск сотен плагинов, различных версий и от десятка не знающих друг о друге вендоров любая лишняя зависимость — зло. Собственно это все добавило мне адекватности, напомнив об инь и янь, и о том что в нашей профессии ты всегда за что-либо платишь. И когда кто-нибудь показывает очередную решающую все проблемы фичу, или говорит про новый язык программирования с высокоуровневыми абстракциями, первый адекватный вопрос в ответ должен быть: “а что мы за это должны заплатить?”, если ответ “бесплатно”, тогда запишите себе вопрос: “хорошо, а когда мы за это будем платить?”

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

Подводя итог

Пара слов про экосистему. Экосистема безусловно важна, но аппелировать к экосистеме — это переводить вопрос в другую плоскость. С новыми технологиями и языками — это как на бирже, обыватель сливает депозит в 90% случаев. Ну не так жестоко как на бирже, но суть та-же. Когда толпа ломится покупать актив — весь рост там уже закончен и сливки (продуктивности в том числе) давно собраны. Я взял «акции» Java в 1999 (далеко не в первых рядах), в то время когда экосистемы была мягко скажем неразвита. Но тот рост продуктивности для себя и команд, и безумный рост акций Java в следующие десять лет позволяет мне скромно улыбаться когда программисты начинают аппелировать к экосистеме. Это то же самое когда вы начинаете говорить что покупать акции Apple не стоит — потому что они очень дешевы.

Ха-ха. Вот как раз покупать акции когда они дороги не стоит, поскольку потенциал роста там уже исчерпан. Все что вы можете купить — это относительно долгую или не долгую стабильность. Хотя для того чтобы купить правильный актив — нужно действительно понимать его ценность (несмотря на низкую цену), и быть уверенным в том, что покупка начнет приносить вам дивиденды сразу, а не в далеком будущем. Точно так же мы выросли на «акциях» eclipse с 2002 года, когда у eclipse был сумасшедший потенциал к росту, и которые подросли до максимума году к 2008. С того времени я и пытался выйти из акций Java и eclipse в другие технологии, ибо потенциал роста исчерпан, а раз так — надо выходить. Языки и технологии дают вам конкурентное преимущество, а если вы сидите на тех же самых языках и технологиях, что и половина программистов вокруг — о каком технологическом преимуществе может идти речь?

Возвращаясь к выбору правильного языка. Мне не важны фичи языка, их может быть сколь угодно много или сколь угодно мало. Мне интересно насколько язык увеличит продуктивность меня и команды, сейчас и в будущем, для известных и неизвестных задач. Вот и все. Все остальное не важно. Как часть продуктивности, язык должен разгрузить мне голову. Я не должен думать про язык, как мне приходится на Scala или Rust. Я не хочу держать в голове кучу вещей которые можно не держать как в языках с динамической типизацией. Увидев чужой код я должен сразу понимать что тут делается а не заниматься долгими исследованиями всего, что есть вокруг, как в примере со Scala из части 2. Не потому что не могу, а потому что я не вижу в этом смысла, я не вижу как все это сделает меня более продуктивным, и соответственно не верю.

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

Вам знакомо чувство, когда вы выходите из унылого Reno Logan, на котором таксист вез вас до стоянки, долго втапливая педаль в пол чтобы кого-то обогнать, и садитесь за руль современного автомобиля с тремя-четырьмя сотнями кобыл под капотом, который вас разгоняет до той же сотни за 5 секунд? Это прекрасно — чувствовать всю мощь железных технологий под капотом, мощь, которой вы управляете по собственному желанию, и вся эта мощь делает то, что вы хотите, и так как вы хотите. А еще это называется свобода.

Пока,
Платов

Всем привет, я полиглот ! То есть человек, знающий много языков. Как же я пришел к этому ?
Мне всегда говорили, что у меня есть какой-то дар в изучении языков и мне правда все давалось поразительно легко. Еще в начальной школе мне покупали какие-то книжки с английским языком, и мне было очень интересно искать слова, находить значения. Это просто было увлекательно и прикольно.
В школе, я учился в классе, где помимо английского языка (с 5-го класса), я учил немецкий (язык по выбору) и основы латыни.

Несмотря на казалось бы интересный школьный бэкграунд — особых навыков нам не давали, учителя были слабые. Да и вообще школьная система образования не мотивирует учить что-либо, поэтому например немецкий я не знаю совсем. Что-то вынести от фриковатых нулевых уроков по латыни на которые никто не ходил — я тоже не смог. Английский язык в школе был разный. Какие-то годы были почти обезумевшие слабые преподаватели. На уроках можно было не заниматься ничем, а учитель ставит оценки просто от уровня «респекта» к ученику. В какие-то годы преподаватели были сильные, однако со своими любимчиками. Зная английский в числе лучших учеников класса, но не находясь в статусе «ботаник», я ну не мог получить 5 в четверти, причем все те, кто получал эти пятерки просто катали слово в слово мои ДЗ.

Все поменялось в университете, самая жуткая и строгая учительница кафедры английского поняла, что мой уровень гораздо выше чем у остальных в группе, мне удавалось получать автоматом 5, в то время как мои сокурсники вымучивали тройку. В этот момент я и подумал, если у меня это идет это просто без особых усилий, то что будет если приложить усилия ? Я стал учить английский язык каждый день. Мотивация — не встречать незнакомых слов в учебных книгах, от слова вообще. Ежедневные занятия по прокачке вокабуляра, по грамматике, крылатые выражения и тд. Я стал смотреть сериалы, только в отличии от одногруппников я стал это делать в оригинале, сначала с субтитрами, потом без. Если я встречал незнакомые слова в каком-либо сериале или видео на YouTube — брал и записывал это. Никогда не брал никаких платных курсов, уроков и репетиторов. Даже наоборот в какой-то момент сам учил английскому взрослых людей, которые хотели прокачать свои базовые навыки. Я разработал такую схему с ассоциациями в виде предложений, ежедневные пополнения словами и грамматическими конструкциями.

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

Испанский похож на английский. Схема, которая использовалась на английском — работает и для испанского. Как хорошая новость — много словарного запаса из английского пригодится для всех испанских- конструкций, например английские слова с -tion (constitution, prostitution) будут такие же на испанском но с -cion (constitucion, prostutucion) и тд. Совпадений много, а вот из сложностей другой порядок слов в предложении Yo no lo tengo это что-то типа «I don’t it have» вместо логичного в английском «I don’t have it». Это часто путает по началу. Однако прогресс при регулярных занятиях — обеспечен.

С китайским все гораздо-гораздо сложнее. Наверное напишу пост отдельно, как учить китайский язык. Моя система давала большие сбои. Китайский имеет иероглифы, к каждому из них есть латинская транскрипция (pin yin), и если ты встречаешь иероглиф, который ты не знаешь — то нельзя его ни прочитать ни написать вбив слово в клавиатуре. Да, это сейчас, я могу догадаться о примерном звучании (иероглифы на самом деле содержат ключи, в которых один из ключей часто отвечает за звук этого иероглифа), но сама структура языка очень сложная. Плюсом ко всему — китайский это тональный язык. То есть каждый звук может звучать по разному и менять свое значение в зависимости от тона. У них есть стихотворение из 127 вроде слов shi, которые произносятся в разной тональности. И казалось бы что может быть проще сто раз прочитать «ши ши ши шишшишиши», но это стихотворение даже сами китайцы часто не могут правильно прочитать. Плюс всякие моменты когда они называют черный чай — hong cha, то есть красным и прочие штуки, которые очень нелогичны для нас. Из веселого, на слэнге называть свою девушку лошадью в Китае это окей. Потому что лошадь это полезное животное и красивое. В России же лучше так не делать… лягнет. А еще чай унун это wu long на пиньине и означает «темный дракон». Пишу просто потому что, в статье про китайский не может быть без драконов. Если честно, сейчас часто работаю и общаюсь с китайцами, однако чувствую, что мой китайский еще не очень крутой, как английский или испанский. Но китайцы меня понимают, а это главное.

Во время пандемии в прошлом году я решил коротать время изучая еще один язык ООН — французский. Прошло уже больше года, ожидаемо мой французский хуже чем остальные языки, произношение — что-то жуткое (зачем вам столько букв в слове если вы читаете первые две!?), и неожиданности типа 70 как шестьдесят-десять. Но французский летит очень легко — 80% либо с испанским, либо с английским похожи, еще 10% вошли в русский, как родные (все эти пляж, этаж, магазин).

На сентябрь 2021 года я говорю на 5 языках — русский, английский, испанский, китайский, французский. Я понимаю и говорю на украинском (прочитал пару книг), но это происходит как-то магическим путем, я просто все понимаю, поэтому включать этот язык не очень корректно наверное. Периодически подучиваю латынь.

Наверное я могу быть каким-то амбассадором изучения языков, подумал я этим летом и решил сделать своего бота в Telegram для изучения английского. На данный момент бот уже закончен и тестируется в ограниченных кругах. Пока что, людям нравится идея, стоящая за ботом, но не все так гладко, надеюсь исправить и выйти на рынок разорвав все существующие методы. Берегись *название компании* !

Какой язык учить – какие иностранные языки сейчас наиболее востребованы

–Ду ю спик Инглиш?
– Ноу, сорри.

1 011

Какой язык учить

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

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

Как выбрать язык для изучения

У вас 100% есть знакомые, которые начинали учить английский. А потом бросили. Почему?

Ответ простой. Они его учили не потому, что «надо». А потому, что «надо БЫ». Вот надо бы выучить английский – он же вон какой распространенный, всего его знают…

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

К чему я это говорю. Глупо сначала учить язык, а потом подстраивать под него свою жизнь. Вот возьму-ка я сейчас и выучу арабский. Зачем? Ну, в эмираты уеду, буду там нефть качать.

Это же абсурд, согласны?

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

Например, вы решаете переехать в Германию. Вы скопили 10 000 евро, которые нужны для поступления в вуз и решили: «Я поеду в Германию, я выучусь там в вузе на программиста, буду в Германии всю жизнь жить и программистом работать».

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

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

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

Вот так языки и выбирают. Сначала решили, как меняем жизнь, потом начинаем учить язык.

А если планов нет, но есть время

Допустим, что спланировать свое будущее вы пока ну никак не можете. Однако у вас есть время, в которое можно было бы начать учить язык. И вы знаете, что хотите жить за рубежом. То есть вот в этом хотя бы вы определились. Как тогда быть?

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

Например, когда я летел на самолете компании Lufthansa на свой волонтерский год в Германию, там обо всем говорили сначала на немецком, а потом на английском языке. Когда сударыня на вокзале поняла, что я пока еще плохо говорю по-немецки, она сразу спросила: «Ду ю спик инглиш?»

Так что знание английского минусом при переезде в любом случае не будет.

Можно ли учить только английский язык

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

Например, я сейчас работаю в Берлине, воспитателем в русско-немецком детском саду (вот моя статья про это – как найти работу в Германии), занимаюсь там с подготовительной группой. Так вот в Берлине и вообще в Германии, шансов найти работу с одним английским – практически ноль.

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

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

Какой язык проще

Все языки трудные.

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

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

Но не надо забывать, что грамматика – это не все. Есть еще слова. Очень много слов, которые вам надо выучить, чтобы овладеть языком на высоком уровне. И учить слова в любом языке одинаково тяжело.

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

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

Друзья мои, мы не знаем, каким будет будущее. И что именно в этом будущем будет востребовано.

Ну окей, выучили вы китайский, дальше что? Вы поедете туда жить? Что вы будете делать с вашими знаниями?

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

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

Но без конкретного плана и ради каких-то там непонятных перспектив – пустая трата времени.

Почему плохо учить язык «заранее»

Потому что язык забывается. Не будет такого, что вы его выучите – и вот навсегда. Если вы не будете на нем говорить, то вы его однозначно начнете забывать. Это касается, кстати, не только иностранного, но и вашего родного языка.

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

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

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

Потом я подписал договор о волонтерстве в Германии в организации Spohns Haus и начал спешно учить немецкий, английский вообще на паузу поставил.

Результат – когда я через полгода приехал в Германию, я не мог вообще ничего сказать на английском. У меня сразу в предложение подставлялись немецкие слова. А немецким я овладел тоже не прямо вот супер как, получилось ни то ни сё. Я еще некоторым коллегам говорил – «говорю лучше по немецки, понимаю на слух лучше по английски». Такая вот забавная ситуация. Причем не у меня одного – когда я на семинарах встречался с другими волонтерами, у них все было то же самое.

Какой язык лучше учить ребенку в школе

Если учесть, как дети учат язык в школе – разницы вообще нет никакой. Что они будут английский учить и ничего не понимать, что немецкий/французский/испанский – все едино.

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

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

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

И значения не имеет, на каком языке ребенок будет эти нейронные цепочки формировать.

Но.

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

Хотя, я начинал учить немецкий вот абсолютно с чистого листа. Ну и что? Поехал в Германию, сдал без проблем B1 на «отлично», потом еще B2 на «хорошо». То есть уровень у меня сейчас – «выше среднего», хотя начинал я с полного нуля.

Стоит ли учить язык для общего развития

Общее развитие, тренировка мозга, спасение от болезни Альцгеймера в старости – это очень слабая мотивация. Вам ее хватит на пару недель. От силы месяцев. А потом вы все бросите.

Для общего развития есть много более полезных штук кроме языков. Например, вы можете изучать программирование. Создание сайтов. Тестирование компьютерных программ. Это вам и мозги разовьет, и поможет деньги начать зарабатывать в онлайне. Может, и в другую страну сможете потом переехать, если хорошо выучите какой-нибудь язык программирования, освоите сайтостроение, тестирование или еще что-нибудь в этом роде.

А чтобы «выпендриться»?

Да, есть такие люди. Они учат иностранный, чтобы парочкой словечек «козырнуть» и всем показать – вот, смотрите, какой я крутой, обалдевайте.

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

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

Можно ли прожить без иностранного языка

Легко.

Да, можно думать: «Вон все английский знают, а я не знаю. Какие все умные. Какой я тупой».

Но это очевидный признак низкой самооценки. Допустим, что случайный сорокалетний мужик на улице не знает английского. Но он при этом хирург великолепный. А женщина рядом с ним тоже знает только русский или украинский, и при этом она – профессиональный юрист с огромным опытом.

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

Если определился с языком, то как его учить

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

Так что для начала сами изучайте все то бесплатное, что сможете найти.

Например, на канале «Культура» несколько лет шла передача «Полиглот». Там Дмитрий Петров в течение одной или двух недель объяснял основы какого-нибудь языка. Я с удовольствием посмотрел все занятия по английскому, вот первое из них:

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

А вот офигительные просто уроки по грамматике немецкого языка от Беккера. Скорее всего, они будут недоступны при вставке видео на наш сайт, но перейдите на Ютуб, и они там у вас откроются. Все уроки тоже бесплатные.

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

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

  1. Приложения для изучения английского языка.
  2. Как учить английские слова.
  3. Как учить английский.
  4. Как выучить немецкий.
  5. Экзамен IELTS – что это такое, как он устроен.
  6. Экзамен TELC по немецкому языку (статья пишется, скоро опубликуем и поставим ссылку).
  7. Лучшие курсы китайского языка – сначала описываем бесплатные, только потом платные.
  8. Лучшие курсы французского языка – аналогично.

Обращение к читателям

В каждой своей статье я пишу в конце «Заключение», в этот раз решил написать что-то новое – «Обращение к читателям».

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

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

До встречи!

ЕЖЕНЕДЕЛЬНАЯ РАССЫЛКА

Получайте самые интересные статьи по почте и подписывайтесь на наши социальные сети

ПОДПИСАТЬСЯ

Время на прочтение
6 мин

Количество просмотров 103K

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

Прочитали? Дальше будет про лучший в мире язык программирования, который я назову ближе к концу. Да, да, еще три дня назад я и не думал что единороги существуют — ведь каждый язык так или иначе сосет, и каждый сосет по-своему (хотя нет, есть и такие которые сосут всегда и везде, но о них не будем). Как инженер, я прекрасно понимал что в вопросе языка не возможно без разнообразных trade offs, начиная с garbage collected vs manual memory management, хотя Rust пытается съесть рыбку не присев на палку в этом вопросе, и так далее. Хоть мы и говорим о языках общего назначения, все они так или иначе позиционируют себя, фокусируясь на каких-то идеях, принципах, и целях, в которых они хороши, оставляя все не согласованное с такими принципами в лучшем случае возможными, но не эффективными и/или не удобными. Одним словом нецелесообразными. Однако язык, сочетающий в себе несочетаемое, есть.

Как я уже писал в прошлом, проблема выбора языка программирования в моей жизни появилась только в зрелом возрасте, лет так 7 назад, когда я понял что Java уже не торт. Тогда же, в поисках продуктивности и наивном желании сделать Scala основным конторским языком на следующие 10 лет, мы купили early access (некоторые главы) еще не вышедшей книжки Odersky et al. Так что и Scala я для себя открыл, за годы до того как она появилась в резюмах и головах кандидатов приходящих на собеседование, а некоторые из вас еще в школе учились. Опять же будучи в компании, которая более 10 лет делает IDE на заказ, я видел столько языкового гумна и жемчужин среди него, что прошу капитанов очевидность немного подумать, прежде чем отсылать автора к какой-нибудь языковой истории — неужели вы думаете, что чувак который 7 лет ищет и не может найти язык не знает про вашу капитанскую историю.

В последние годы проблема выбора языка только обострилась: нам надо начинать новый технологический виток в Xored, и есть некоторые идеи “изысканных” технологий, позволяющих делать всяческий Magic, но я не был готов стартовать что-либо очень долгое время. Ответ, на вопрос почему, меня до сих пор удивляет, так как если бы я получил подобный ответ на собеседовании — сразу бы записал чуваку минус в пацанскую книжку. Ответ действительно звучит глупо и по-детски: я не знал на каком языке программирования мне бы хотелось видеть стек наших восхитительных технологий. Единственное оправдание: я действительно нацелен на длинный путь — и это не один отдельно взятый проект, это то, во что хочется вложить лучшие годы жизни, и цена вопроса для меня очень велика.

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

Требования

Я хочу высокопроизводительный код в браузере, и я хочу возможность затолкать свой код в unikernel/cloud os. Я хочу высокопроизводительный сервер-сайд с большими объемами обрабатываемой информации. Я хочу iOS и Android (естественно тоже высокопроизводительный). И я хочу все это программировать без геморроя. Не парится с кодогенрацией, не работать с памятью напрямую через узкую калитку sun.misc.Unsafe, и не програмиировать большие массивы как математик на Фортране.

Я хочу писать очень low-level код (close to bare metal), и иметь производительность сравнимую с нативным C/C++. Я хочу GC когда надо, и не хочу GC когда не надо. Я хочу писать в OO стиле, и в функциональном. Я хочу переопределения операций, HOF и замыкания. Я хочу generics, возможно я хочу темплейты и/или макросы, для релизации каких то будущих концепций. Я хочу понимать как все это реализовано в языке, начиная с memory и concurrency models, и иметь возможность управлять этими вещами так, как я хочу.

Я хочу всего на низком уровне, и хочу всей мощи на высоком уровне сравнимой со Scala. Я хочу писать код быстро и просто, спинным мозгом (я хочу чтобы компилятор думал за меня), а не я за компилятор (как это происходит при программировании на Scala или С++). Я хочу быть продуктивным как программист и писать программы в разы быстрее чем, например, на Java или JavaScript.

Это такой быстрый дамп хотелок из головы (специально я никогда их не записывал). Но понятно что, хочется всего и сразу, и я первый кто бы сказал что все сразу: такого языка нет — идите с пляжа. Но он есть.

Кросс-платформенность и Close to Bare Metal

Я хочу кросс-платформенность с обязательной компиляцией в JavaScript. И не просто компиляции в JavaScript, а высокопроизводительный код в браузере. Помимо всех фич языка дающих мне возможность программировать UI и и клиент-серверное взаимодействие, мне нужен серьезный number crunching на клиенте, и перемолачивать миллион-другой кортежей за доли секунды — очень желательное требование. Возможно, что клиентский код будет в том числе полноценной P2P сети, и так далее. Короче требований к коду на стороне браузера, не меньше, чем к решениям на стороне серверов.

Писать что-то высокопроизводительное над большим количеством данных, что на Java что на JavaScript можно. Такие вещи более-менее решаются активным использованием off-heap data structures, что предполагает либо кучу сгенерированного (со всем вытекающим из этого геморроем) кода, либо жалкое подобие программирования — технически вы программируете на Java, но это уже не Java вашей мамы, а жалкий subset языка. В мире браузеров — та же самая история с typed arrays и asm.js (оставьте при себе всякие NaCl/PNaCl и прочее — не интересует).

Теоретически я могу взять для своих задач много чего: scala — scalajs, go — gopherjs, да и большинство JVM-based вещей (горячо любимый мной Fantom, Kotlin, Ceylon) с компиляцией в JavaScript, при условии что я могу элегантно использовать off-heap данные в случае компиляции в байткод, и, соответственно, typed arrays в случае компиляции в JavaScript.

Собственно я и шел по этому пути, но, возвращаясь к теме статьи — это путь против языка. Я программировал против языка, вернее платформы JVM, которая по сути ортогональна решаемой задаче и для решения моих задач мне нужно все то же, что дает платформа, но по-другому и сделай-сам. Мне нужен off-heap менеджемент памяти, собственная система value типов, и, кроме того чтобы все это работало эффективно мне нужна генерация кода (compile-time и/или run-time). Короче возникает вопрос — зачем мне все эти языки и платформы (JVM, браузер), если они мне не помогают, а только мешают?

JVM Off-Heap Data Structures

Конечно же, в мире есть много достойных проектов идущих “против платформы”, тем кто интересуется в контексте Java могу порекомендовать разные источники, но можно начать с блога Mechanical Sympathy. Вообще эти ребята сделали и делают множество интересных вещей с JVM. Что же касается производительности — в последнем посте показывают как они уделывают ProtoBuf в 15-35 раз, что же касается Off-Heap data structures, вот в этом посте показан пример показывающий рост производительности в 40 раз по сравнению с использованием языка (Java) как говорится as designed.

Пользуясь случаем хочу отметить очень понравившийся мне малоизвестный (я бы сказал совсем неизвестный проект): landz. В котором автор фактически предлагает новую платформу поверх JVM c lock-free/garbage-free off-heap memory allocator, lock-free collections, async-await, channels, off-heap collections и тому подобное. Очень круто… Можно упомянуть objectlayout.org и много еще чего, но все это очень неудобно, и делается вопреки, а не благодаря дизайну платформы.

Браузеры, asm.js и emscripten

В браузерах emscripten делает чудеса. Для тех, кто не в курсе emscripten — можете сыграть в например в Quake3, список портированных игр (и пр.) тут. Насколько я понимаю, Unity и high-end игровые движки как раз сейчас занимаются тем что тащат себя в браузер именно этим способом. Unity вообще компилирует всю свою заморочку включая .NET (Mono) рантайм в JavaScript (asm.js) с помощью emscripten, но конечно это не тот JavaScript который вы пишете руками — такой JavaScript — может быть только результатом компиляции. У меня есть серьезные сомнения что программа на JavaScript (as designed) будет где то рядом по сравнению с asm.js (имеется в виду number crunching и большие объемы данных), а если так, то я хочу генерации asm.js (и, соответственно, другую memory model) там где надо.

Более подходящий язык? (low level)

Думающий читатель предположит, что для комфортного решения подобных низкоуровневых задач нужны совершенно другие языки (а от себя я добавлю: и платформы), и будет прав. Я тоже так думал, и даже порывался написать свой язычок — подобие LLJS, который бы компилировался и в JavaScript и JVM байткод, гоняя байты туда-сюда по off-heap memory / typed arrays. К слову, если бы такой язык существовал (а LLJS требует еще много работы), то скорее всего я бы его взял и закрыл вопрос. Но тогда бы не было данной статьи, и, возможно, я бы так и не нашел лучший в мире язык программирования.

В дополнение к более подходящим под задачу языкам, большие надежды я возлагал на go, который pass by value в отличии от JVM-based, да и memory model в нем попроще и попрозрачнее. Но вот когда мы начинаем компилировать в “традиционный” JavaScript (gopherjs), который как бы недалеко от JVM в частично интересующих меня низкоуровневых вопросах — производительность проседает раз в 20 (ради интереса можно глянуть на печаль наивного чувака из конторы, которая решила что сделает аналог React.js только очень быстрый, потому что go, и будет писать классный UI)…

Что-то я уже начал сливать горячо любимый мной JVM, а пока рано. Сначала нужно разобраться высоким уровнем: Scala и прочими друзьями, но это уже в следущей части.

Этот текст написан в Сообществе, в нем сохранены авторский стиль и орфография

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

Изучение любого языка — это погружение в новую культуру, расширение кругозора, новые образы и новые, часто неожиданные связки в голове.
Любой язык интересен. В одном 40 слов для обозначения снега, в другом — 10 для дождя. Китайский или арабский вообще перевернет ваше представление о том, каким может быть язык. В каждом вы найдете и что-то знакомое, что каким-то образом перекочевало и в родной язык.
Я много путешествовал. Не знаю, смогу ли продолжить, но знание языков выводит ваши путешествия на совершенно новый уровень. Даже базовые знания языка страны, где вы находитесь, дают кучу возможностей, делают вас ближе к жителям страны.

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

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

Общение вживую с носителями языка поможет оживить вашу речь. Все это не так сложно, как может показаться.

Есть куча интернет-сервисов, которые готовы обучить вас основам почти любого языка. Это может стоить каких-то денег, например сервис DuoLingo, которым я пользуюсь, стоит порядка 100 евро в год. Российские аналоги дешевле, но качество материалов будет другое. Если параллельно с ними ещё читать, смотреть новости на новом языке — все получится быстро. Главное — погрузить себя в новую языковую среду. А ещё, например, можно изменить язык вашего смартфона на тот, который вы изучаете. За неделю пополните словарный запас несколькими сотнями слов. Или выберите новый язык в ОС вашего компьютера — никуда не денетесь, все придется выучить. Изучение языков — это весело и не даёт впадать в уныние. Что очень важно в наше время. Учите и сила придет к вам!

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

По моему опыту, школа может дать только основы. Без практики все точно быстро забудется. Даже если было что забывать. У меня никогда не было никаких планов изучения. Интернет-сервис плюс какой-нибудь учебник и тетрадь — все что вам нужно. Ну и желание, конечно. Живые курсы и репетиторы желательны, но если у вас нет на них времени или денег — то это не может стать настоящим препятствием. Все в ваших силах.

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

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

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

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

Если заставить себя хотя бы 15 минут в день заниматься, каждый день, то шансы на успех сильно возрастают. Если у вас при этом есть конкретная цель — найти работу или поехать в конкретную страну, шансы ещё выше.

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

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как исправить поломку звука
  • Найти древний свиток как записать словарь
  • Как составить позиционирование продукта
  • Как найти отношения автора к герою
  • Как найти среднее количество по диаграмме

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии