Опасности обучения на Java

http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
  • Перевод
«Вы счастливчики. Мы по три месяца жили в мешках из дерюги в грязных сараях. Мы вставали в шесть утра, стирали мешки, съедали по корке чёрствого хлеба и шли работать на мельницу, по 14 часов в день, с понедельника и до воскресенья, и когда мы возвращались домой, наш папа порол нас своим ремнем»
— Летающий цирк Монти Пайтона, Четыре йоркширца


Ленивая молодёжь.

Что может быть хорошего в тяжёлой работе?

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


Когда я был молод, я учился программировать на перфокартах. Если вы случайно делали ошибку, у вас не было такой «современной возможности», как нажать клавишу backspace и ввести заново то, что нужно. Вам приходилось выкидывать карту и начинать ввод заново.

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

В наши дни они обычно выбирают Java.

Не поймите меня неправильно: нет ничего неправильного в использовании Java в качестве рабочего языка.

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

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

Это может звучать немного резковато, это просто моё скромное мнение, но есть две вещи, которым традиционно учат в университетах в курсе компьютерных наук (Computer Science, CS) и которые многие люди никогда полностью по-настоящему так и не понимают: указатели и рекурсия.

В самом начале обучения в колледже вы проходите курс структур данных, со связанными списками, хеш-таблицами и прочими мелочами, с широким использованием указателей. Такие курсы довольно часто используются как курсы для отсева: они так сложны, что все, кто не обладает мыслительными способностями, необходимыми для CS, бросают, и это очень хорошо, потому что если вы думаете, что указатели сложны, то подождите пока вам не придётся доказывать факты теории неподвижной точки.

Все те юные гении, которые в старших классах школы писали на Бейсике пинг-понг для Apple II, поступают в колледжи, выбирают CompSci 101, курс по структурам данных, и когда сталкиваются с работой с указателями, их мозги просто взрываются, и они решают перевестись на политологию, потому что теперь правовая школа кажется им лучшим выбором. Я много раз видел графики отсеивания студентов с курсов CS, и обычно процент выбывших составляет от 40% до 70%. В университетах склонны считать это разбазариванием; я думаю, что это просто необходимая естественная отбраковка людей, которые просто не смогут быть счастливы или успешны в карьере программиста.

Другим сложным для многих студентов был курс, в котором изучалось функциональное программирование, в том числе рекурсивное программирование. В Массачусетском Технологическом Институте была очень высоко поставлена планка по этим курсам, разработан обязательный курс (6.001) и учебник ( Абельсон и Сассман, Структуры и Интерпретация Компьютерных Программ (Abelson & Sussman's Structure and Interpretation of Computer Programs)) которые используются десятками или даже сотнями лучших школ CS как стандарт де факто для курсов введения в CS.

Сложность этих курсов просто ошеломляющая. На первой лекции вы целиком изучаете Scheme, и теперь вы можете быть посвящены в работу функций, работающих с неподвижной точкой, которые используют другие функции на входе. Когда я смог побороть такой курс, CSE121 в Университете Пенсильвании, я увидел, как много, если не большинство, студентов так и не смогли это сделать. Материал был слишком сложным. Я послал по электронной почте профессору длинное письмо, полное рыданий, говорящее о том, что Это Просто Нечестно. Кто-то в университете, должно быть, услышал меня (или одного из других жалобщиков), потому что теперь на этом курсе изучают Java.

Теперь я бы предпочёл, чтобы меня не услышали.
Думаете, что вы знаете, что это такое? Проверьте Себя Здесь!

Об этом и ведутся споры. Годы скуления ленивых студентов, подобных мне, в сочетании с жалобами индустрии программного обеспечения на то, как мало американские университеты выпускают специалистов по CS, сделали своё дело, и за последнее десятилетие множество безупречных в остальном школ на 100% перешли на Java. И это приветствовалось: рекрутёрам, которые используют «grep» для оценки резюме (прим.: grep — это программа в Unix, позволяющая выбирать строки, в которых есть нужное слово), это, кажется, нравится, и, что лучше всего, в Java нет ничего достаточно сложного, чтобы реально отсеять программистов без той части мозга, которая отвечает за указатели или рекурсии, соответственно уровень отсеивания в университетах понижается, факультеты CS выпускают больше студентов, за это получают больше денег, и всем становится хорошо.

Счастливые ученики Java-школ никогда не столкнутся с ужасными segfault (прим.: Segmentation Fault — типичная ошибка при обращении по некорректному адресу) при попытках реализовать основанные на указателях хеш-таблицы. Они никогда не будут делать безумных, сумасшедших попыток упаковать что-то в биты. Они никогда не будут загружать свои головы мыслями о том, как в полностью функциональных программах значение переменной никогда не изменяется, и все-таки оно постоянно изменяется! Парадокс!

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

Неужели я всего лишь один из тех старомодных ворчунов, вроде Четырёх Йоркширцев, которые хвастаются тем, как тяжело было жить в суровые старые времена?

Эй, в 1900 г. латынь и греческий были обязательными предметами в колледже, не потому, что они были как-то необходимы в жизни, но потому, что их знание было одним из обязательных признаков образованного человека. В некотором смысле мои аргументы не отличаются от тех аргументов, которые приводили сторонники латыни (все четыре). «[Латынь] тренирует ваш ум. Тренирует вашу память. Распутывание предложений на латыни — это отличное упражнение для ума, настоящая интеллектуальная головоломка, и хорошее введение в логическое мышление», писал Скотт Баркер (Scott Barker). Но я не смог найти ни одного университета, который до сих пор преподаёт латынь в обязательном порядке. Неужели указатели и рекурсия — это латынь и греческий компьютерных наук?

Итак, я легко соглашусь с тем, что программирование указателями сегодня не является необходимым в 90% разработки кода, и даже представляет опасность в промышленном коде. Да. Прекрасно. И функциональное программирование не так уж часто используется на практике. Согласен.

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

Без понимания функционального программирования вы не сможете придумать MapReduce — алгоритма, который делает Google столь хорошо масштабируемым. Термины Map и Reduce пришли из Lisp и функционального программирования. MapReduce понятен любому, кто помнит из своего курса, эквивалентного 6.001, что истинно функциональные программы не имеют побочных эффектов и поэтому легко распараллеливаемы. Очень показателен тот факт, что в Google изобрели MapReduce, а в Microsoft нет, и это говорит кое-что о том, почему Microsoft до сих пор играет в догонялки, пытаясь заставить работать основные функции поисковой машины, в то время как в Google перешли к следующей проблеме: построению Skynet величайшего в мире параллельного суперкомпьютера. Я не думаю, что Microsoft действительно понимает, насколько они отстали на этом пути.

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

Ничто в образовании, построенном полностью на Java, не отсеивает студентов из-за недостаточной гибкости их мозгов для понимания этих концепций. Как работодатель, я вижу, что 100%-Java школы начали штамповать выпускников курсов CS, некоторые из которых просто недостаточно умны для того, чтобы работать программистами с чем-то более замысловатым, чем Ещё Одно Бухгалтерское Приложение На Java, хотя они и управились со скрипом с «современной-упрощённой-для-тупиц» курсовой работой. Эти студенты никогда не справились бы с курсом 6.001 в Массачусетском Технологическом, или с CS 323 в Йеле, и, честно говоря, это и есть причина, почему, с точки зрения работодателя, диплом Массачусетского Технологического или Йеля имеет больший вес, чем диплом Дюка, который недавно стал Полностью-На-Java, или Penn University, который заменил Scheme и ML на Java, пытаясь преподавать на ней курс, который когда-то почти убил меня и моих друзей, CSE121. Дело не в том, что я не хочу нанимать умных ребят из Duke или Penn — я нанимаю их — просто мне гораздо сложнее понять, кто они. Раньше я мог сказать, что парень действительно умён, если он за несколько секунд может разобраться в рекурсивном алгоритме, или реализует функции, манипулирующие связными списками на основе указателей, с такой скоростью, с которой он может писать на листе бумаги. Но в случае выпускников школ Java я не могу сказать, имеет ли претендент проблемы с этими задачами, потому что у него просто не хватает соответствующего образования, или потому, что у него нет соответствующей части мозгов, необходимой для отличной работы в качестве программиста. Пол Грэхэм называет их Горе-Программистами.

Достаточно плохо уже то, что Школы-на-Java не отсеивают тех, кто никогда не сможет стать великими программистами, но на это школы вполне обоснованно могут сказать, что это не их проблема. Индустрия, или, по крайней мере, «рекрутёры-использующие-grep», действительно требуют, чтобы школы преподавали Java.

Но «школы-только-на-Java» также перестали тренировать мозги студентов для того, чтобы они стали знающими, проворными, и гибкими достаточно, чтобы могли хорошо проектировать программы (и я не имею в виду объектно-ориентированное «проектирование», когда вы тратите несчётное количество часов, переписывая собственный код при перестройке вашей объектной иерархии, или мучаетесь такими фальшивыми «проблемами», как выбор «содержит» или «является» (прим.: has-a vs. is-a, выбор между наследованием и композицией классов)). Необходимы тренировки, чтобы научиться думать на нескольких уровнях абстракции одновременно, что является абсолютно необходимым для проектирования отличной архитектуры программного обеспечения.

Вам может быть интересно, может ли обучение объектно-ориентированному программированию (ООП) быть хорошим заменителем указателей и рекурсии как вычищающих курсов. Короткий ответ — нет. Не обсуждая достоинства ООП, можно просто сказать, что оно недостаточно сложно для отсеивания посредственных программистов. Преподавание ООП состоит в основном в запоминании нескольких словарных терминов, таких как «инкапсуляция» и «наследование» и заучивании ответов на множество вопросов о разнице между полиморфизмом и перегрузкой операций. Не сложнее заучивания знаменательных дат и имён на уроках истории, ООП ставит неадекватно простую задачу для того, чтобы отпугнуть первокурсников. Когда у вас проблемы с ООП, ваша программа все-таки работает, она просто становится сложной для поддержки. Якобы. Но когда у вас проблемы с указателями, ваша программа выдаёт Segmentation Fault, и вы понятия не имеете, что происходит, до тех пор пока вы не остановитесь, не сделаете глубокий вдох и не попытаетесь на самом деле заставить свой ум работать на двух уровнях абстракции одновременно.

Рекрутёры-использующие-grep, кстати, высмеиваются здесь, и для этого есть веские доводы. Я никогда не был знаком с человеком, который бы понимал Scheme, Haskell и указатели С, и не мог бы освоить Java за пару дней, и после этого писать код на Java лучше, чем люди, имеющие пятилетний опыт работы с Java, но попробуйте объяснить это среднему HR-биороботу.

А что насчёт миссии CS-факультетов? Это не ПТУ! Их работа не состоит в том, чтобы подготовить людей к работе в промышленности. Это только для общинных колледжей, скажут вам, (прим.: в США двухгодичный колледж, готовящий специалистов средней квалификации для работы на территории местного сообщества) и государственных программ переобучения для уволенных рабочих. Предполагается, что они дают студентам фундаментальные инструменты для того, чтобы те жили своей жизни, а не готовят их к первым дням работы. Правильно?

Всё же. CS это доказательства (рекурсия), алгоритмы (рекурсия), языки (лямбда-исчисление), операционные системы (указатели), компиляторы (лямбда-исчисление) — и в результате получаем, что школы-на-Java, которые не учат С и не учат Scheme, в действительности не учат компьютерной науке. Насколько бесполезно в реальном мире понимание концепции каррирования (прим.: в функциональном программировании порождения из одной функции другой функции с меньшим числом аргументов; например из f(x,y) = x*y получение функции f3(x) = f(x,3) = 3*x), настолько же это необходимая предпосылка для высшего образования в области CS. Я не понимаю, почему профессора в комитетах, утверждающих программы обучения в колледжах, позволяют их программам тупеть до такой степени, что они не только не могут готовить программистов, готовых к работе, они даже не могут подготовить выпускников, которые могли бы получить степень PhD (прим.: аналог кандидата наук) и соперничать с ними за рабочие места. Хотя нет, подождите. Забудьте. Может быть я всё-таки понимаю.

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

«Боже мой», — подумал я, — «они пытались отупить курс ещё сильнее!» Почему бы не кормить всех студентов с ложечки? Почему бы преподавателям самим не делать и тесты за них — тогда точно никто не будет переходить на гуманитарные специальности! Как предполагается научить кого-то чему-то, если курс обучения заботливо сконструирован так, чтобы стать ещё проще, чем он есть сейчас? Кажется, ставится задача приложить усилия (PDF) по разработке простого подмножества Java, предназначенного для изучения студентами, выпуск упрощённой документации, которая заботливо прячет весь этот EJB/J2EE-мусор от их нежных мозгов так, чтобы они не беспокоили свои крохотные головки какими-то другими классами кроме тех, которые необходимы для того, чтобы решать стандартный простейший набор заданий по курсу.

Наиболее сочувственное объяснение, почему факультеты CS с таким энтузиазмом отупляют свои курсы, это то, что у них будет значительно больше времени для обучения актуальным концепциям CS, если только они не будут вынуждены тратить две лекции на то, чтобы объяснить разницу между, скажем, int и Integer в Java. Хорошо, если дело только в этом, 6.001 будет для вас отличным ответом: учебный язык Scheme так прост, что весь язык может быть рассказан смышлёным студентам примерно за десять минут; после этого вы можете потратить остаток семестра на неподвижные точки.

Фух.

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

(У вас есть единицы? Везучий ублюдок! Всё, что было у нас — это нули.)

Конец
Переводчик: Илья Болодурин

Cтатья давнишняя, но «зацепило».

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

Подробнее
Реклама
Комментарии 257
  • +14
    А еще есть проблема, когда преподаватели требуют лишь зазубривания теории, без понимания сути вопроса. Сужу по своим одногруппникам, многие из которых сдали экзамен по структурам данных, алгоритмизации и программированию, так и не поняв, что такое указатели. Печально.
    • 0
      У меня завтра экзамен. Динамическую память нас заставили понять еще к зачету))
      • 0
        Аналогично сдается курс по функциональному программированию без понимания рекурсии…
        • +1
          Согласен, бесит, что на экзамене уделяют большое внимание теории (списал, показал, иди 5). Задачи же даются, если у тебя спорная оценка…
          • 0
            У меня в институте математик был, у которого сдача теории на экзамене — это базовая часть и за неё ставилось только 3, и те кому тройки было достаточно могли сразу после этого уходить, на 4 надо было решить ещё пару задач, на 5 — 5..6 практических задач.
            Причём ответы на них он не проверял, а смотрел только порядок решения, и при правильном направлении решения засчитывал их, даже если ответ был неверен.

            Жаль что он такой был единственным на все время учёбы.
            • +1
              По матану у нас примерно так же, я имел ввиду программирование. Просто допуск до экзамен по программированию это сдача всех лабораторных. Но ведь их можно заказать :)
          • 0
            Такие преподы надеются, что количество материала в головах перейдёт в качество и студента озарит прозрение, если ему придётся работать в схожей области.
            • +2
              Спасибо за статью-перевод, она позволила мне почувствовать что я не одинок в своих взглядах на современную IT индустрию и подготовку специалистов.
              • 0
                Согласен! Я тоже считаю как автор.
            • +14
              Читал долго. Каждую строчку думал «Как я мог пропустить в блогосфере имя человека, написавшего такой замечательный текст?» Дошел до имени автора. Joel Spolsky. Конечно же.

              Два слова: в favourites.
              • +6
                Как только пошла фраза про студентов, указатели и отсев я стал уверен, что это Джоэл.
                • +4
                  Советую читать его только в оригинале, на английском ^_^ У него очень живой язык и весьма милый юмор.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +4
                      >порог вхождения в ряды программистов заметно понизился <...> писать много хорошего ПО и быстро
                      Делаем дешево, быстро, качественно! Выбирайте любые два параметра.

                      >5 не очень умных человек в программировании бывает лучше, чем 1 умный <...>
                      Вы хотели сказать, «в кодинге». Никто ж не спорит, что для разработки очередной бухгалтерской системы достаточно и пяти ПТУшников. Только вот незадача: далеко не все проблемы в мире относятся к разработке бухгалтерских систем.
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • +3
                          Да, во многом вы правы. Проблема на мой взгляд лежит немного в другом: ту меньшую часть задач, которые сложнее, чем бухгалтерские системы, тоже надо решать. И зачастую именно они являются ключевыми (ну, например, поисковый движок Google писали уж точно не птушники).

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

                          Возможно, я просто чересчур идеалистично думаю об университетах.
                          • 0
                            Спасибо за аналогию. Вы чертовски правы
                          • 0
                            >Делаем дешево, быстро, качественно! Выбирайте любые два параметра.
                            Абсолютно верная аналогия. Какие бы гениальные не были проектировщики программной системы — они как генералы штабов, которые разрабатывают план действий. Программисты всегда работают в полевых условиях и должны решать самые разные проблемы по мере их появления. Они не просто занимаются набором текста. И даже не выстраивают «программы» из готового набора алгоритмов, придуманных умными дядьками в белых халатах.Работа хорошего программиста — творческая работа, и для ее выполнения недостаточно выучить ряд определений и решить две-три стандартные задачи для детского мозга.
                            Не сочтите за грубость, но люди, следующие Вашему подходу, не разделяют людей, реализующих алгоритм решения простой задачи с три страницы, и реализующих его же в три строчки. А какая разница? Работает же.
                            • 0
                              >С кодированием по полной и подробной UML-модели справится и ПТУшник.

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

                              Да и UML кто-то должен рисовать. Одного умного дядьки на толпу кодеров не хватит. И дядька может ошибиться.

                              Как писал Фаулер, в программировании невозможно поделить работу на непредсказуемую творческую, выполняемую одним умным типом и предсказуемую рутинную реализацию, выполняемую толпой дешевой раб силы. Весь процесс разработки является творческим, и отсылаясь к Джеку Ривзу — конструкторским.

                              Схема умный дядько с UML и пять ПТУ-шников в конечном счете экономически проигрывает ситуации, когда умный дядька берет и реализовывает все сам, без UML и недалеких кодеров. Проблемой поиска таких умников и озадачен Спольски, я его прекрасно понимаю.
                          • 0
                            Джоэл на Ваши возражения давно ответил :)
                            local.joelonsoftware.com/wiki/Достигая_тех_высот
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • 0
                                Вообще-то он там много про свою фирму пишет и отбор студентов.

                                Но с дизайнерами тоже самое — даже 100 посредсвенностей не смогут заменить одного хорошего, доказательством чего служит, например, iPad и его конкуренты, как крупные фирмы, так и сотни разных безликих китайских клонов, что-то интересное смогла сделать только ASUS — eee pad transformer, но это фактически другое устройство
                            • 0
                              Перевод статьи давно доступен в печатном издании, кстати.
                              Только сегодня отправил письмо Джоэлю с описанием бага на его сайте: отписаться от получения email-рассылок можно перейдя по самой обыкновенной ссылке. Заодно можно отписать соседа Васю, а если плохое настроение — прогнать весь лист адресов. Не думаю что в данном случае разработчиков подвело знание (или незнание) функциональных яп.

                              Мысль Джоэля, по-моему, такова, что сотрудник который знает больше лучше сотрудника, который знает меньше. Но это не может считаться решающим фактором, имхо, способность к обучению важнее.
                          • +26
                            «Больше всего удивило меня при ознакомлении с Java то, что его создатели из Sun, похоже, наряду с другими целями хотели по возможности облегчить работу программиста. Они словно говорили: „Мы хотим, чтобы вы могли быстрее и проще написать надежный код“.
                            — Брюс Эккель, „Thinking in Java“
                            • 0
                              А еще это надо умножить на российскую действительность по набору персонала и получим совсем грустную картину…
                              • +2
                                И заодно умножить на российскую действительность по обучению персонала, особенно в небольших городах где выбор университета не велик.
                                • +22
                                  В российской действительности программисты, которые знают Java, обычно довольно неплохие. Просто потому, что у нас это не учебный язык, и его нужно учить самостоятельно.
                                  • +2
                                    Ну, где-то может и не учебный…
                                    • 0
                                      Видимо, я отстал от жизни. Тогда высказывание выше верно лишь для программистов, знающих Java, но старше определённого возраста.
                                      • 0
                                        Нет-нет, вы не отстали, на том уровне на каком Java преподаеться (Украина, КПИ ФИВТ — считаеться самым «крутым» в стране) он совсем не учебный.
                                        • 0
                                          Нормально он там преподается — и основы, и паттерны и многопоточность и энтерпрайз. 80% моего потока делало все лабы на все предметы на Java. ВТ конечно же, все остальные мучают дельфи и сиришотку.
                                      • 0
                                        На постсоветском пространстве в ВУЗах повально используют делфи+билдер либо вижуалстудия, ява крайне редко встречается. Сам преподаю в вузе знаю, как преподаватели и студенты любят мышкокликательное программирование.
                                        • 0
                                          У нас на 1м курсе преподавался Pascal, на 2м Delphi в Borland Developer Studio, С/С++ в том же Борланде, Javaв Eclipse. «Инструментальные средства визуального программирования» — программирование в Visual Basic. Что будет после 2го курса точно не помню. Из того что помню будет Haskell, Prolog.
                                      • +4
                                        Не знаю как у вас, а в моей ВШЭ на программной инженерии на первом курсе проходят лишь C#. Плюсы у меня были на втором курсе, и указатели на должном уровне на потоке (около 50 человек) понимали только 4-5 человек. Java — самый любимый и основной язык в нашем вузе, даже у некоторых моих сокомандников по ACM ICPC (что я считаю крайне губительным для программиста-олимпиадника). На четвертом году бегло прошли F# (который вел shwars), который опять-таки мало кто толком понимал (про комбинаторы и неподвижные точки вообще молчу). Кстати, одногруппники говорят, что Дмитрий Валерьевич был очень удивлен, когда ему рассказали про SICP и соответствующий видеокурс. Жутко завидую своим одноклассникам в МАИ, у которых он же преподавал Пролог.
                                        • 0
                                          Имхо для олимпиадного программирования java — как раз самый подходящий язык из доступных.
                                          • 0
                                            хм. Может быть С++?
                                            • +1
                                              В свое время я писал и на C++ и на Паскале. В C++ много подводных камней и тонкостей, на которые легко напороться в условиях контеста, в java их на порядки меньше.
                                              • 0
                                                «на порядки меньше» — это значит более чем на порядок, т.е. в 100 и более раз. Простите но это глупости которые любят повторять фанатики.
                                                На Java как и на C++ можно писать достаточно плохо чтобы решение было хрупким и никто не мог понять что же происходит.
                                                • +2
                                                  Вполне может быть. Лично я своих лучших результатов добился используя Java и после перехода с C++ на Java я субъективно стал делать меньше ошибок по невнимательности.
                                                  • 0
                                                    А на олимпиаде не надо, чтобы не хрупко и понятно, что происходит. Там write-once и лишь бы на входных данных работало.
                                              • 0
                                                С таким крупным чемпионом спорить не буду) Пользуясь случаем, выражаю отдельное спасибо за ваши заслуги, благодаря которым Россия еще может гордиться светлыми умами и прямыми руками. Я имею в виду, что программист-олимпиадник должен уметь обращаться с плюсами в такой же степени свободно, как и с Java, да и вообще быть разносторонней личностью. А в техническом плане на Java писать конечно же удобнее и быстрее.
                                            • 0
                                              Разве я где-то сказал. что у нас плохие джаверы?
                                              К тому же понятие «обычно довольно неплохие» не равнозначно «хорошие» или «отличные»…
                                              Середнячков просто тянущих свою лямку в любой стране достаточно…
                                              У чат самостоятельно тоже по разному… я например предпочту систематические знания… хотя это дело лично каждого.

                                              Эх… так и тянет накатать статью про наши реалии…
                                            • +10
                                              В российской действительности часто нужно понимать не указатели, а что-то типа этого: pastebin.com/1jE1XeHg, причем не скажу, что указатели сложнее :)
                                              • +4
                                                Вместо указателей — показатели.
                                                • +7
                                                  Гори оно в аду!)
                                                  • 0
                                                    А теперь представьте что почти так же воспринимает любой код написанный на английском англодумающий человек.
                                                • +5
                                                  Замечания по переводу, кстати говоря:

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

                                                  Замечания переводчика, кстати, стоит либо выделить курсивом, либо лучше вынести сносками под текст.
                                                  • +1
                                                    Поправил.
                                                    • –3
                                                      — что истинно функциональные программы не имеют побочных эффектов
                                                      тут, верояно, side effect. считаю тоже довольно устоявшимся. возможно, стоит взять в скобки?..
                                                  • +3
                                                    Хехе, у меня уже давно в запасниках валяется пдфка, автор которой высказывается резко против Си на первых курсах: dl.dropbox.com/u/459039/anti_c.pdf
                                                    И оглядываясь на поток, в котором учусь, я полностью согласен с автором.
                                                    Хоть и учусь не на CS, но Автоматизированные Системы Обработки Информации и Управления на физтехе какое-никакое отношение к программированию имеют.
                                                    • +1
                                                      Согласен со Столяровым, но, позвольте заметить, речь идет о Паскале. Указатели в нем есть, а Turbo Pascal я вообще считаю идеальным инструментом для первых игр начинающего хакера с железом напрямую. Мне не знакомы курсы Java, которые затрагивают «железные» аспекты. В моем же вузе преподавание Java сводится к ООП и MVC.
                                                      • +2
                                                        то что си можно «хакать» (как выразился автор) ещё не значит что он чем то отличается от паскаля
                                                        соль в том что хоть паскаль «хакать» нельзя, никто не заставляет это делать с си
                                                        разница между си и паскалём — в синтаксисе и паре конструкций паскаля не реализованных в си ключевым словом (однако легко повторяемые средствами языка) и в другой стандартной библиотеке

                                                        поэтому если бы меня спросили что я думаю о замене паскаля на СИ на первом курсе я бы ответил «не, не надо, но 2й курс нужно читать только на СИ, причём так как будто они уже его знают»
                                                        • 0
                                                          Когда я на первом курсе учил паскаль, то не смог разобраться там именно в указателях.
                                                          Зато когда на 3м взялся за С, то удивлялся как такую простую вещь как указатили в паскале так запутали. И за паскаль я больше не брался — на С всё делалось или проще, или хотя бы не сложнее.
                                                        • 0
                                                          По окончанию ВУЗ-а выпускники вашей кафедры скорее всего будут встречать код разве что в виде vbscript для экселя :)
                                                        • +19
                                                          Прошло 5.5 лет, все эти люди закончили обучение и работают в ИТ сфере. Но апокалипсис не наступил, врата не разверзлись, nasdaq не обвалился, вомгла маячит на горизонте но существенно не приблизилась, так же как и сам горизонт…
                                                          Некоторые старые вещи лучше оставить там где они лежали.
                                                          • +4
                                                            Но есть вещи — которые актуальны всегда.

                                                            Имхо, статья актуальна не только для Java. Она актуальна для всех программистов. Просто заставляет кое о чём задуматься…
                                                            • +7
                                                              Прошло 20 лет с развала Союза, в нашей стране науку так и не финансируют должным образом, но нефть еще не закончилась, живем, братцы!

                                                              Конечно, ничего не обвалилось, ибо энтерпрайзу не нужно копаться в таких мелочах, как внутреннее устройство хэш-таблиц. Да, Java упрощает разработку нужных вещей, но одновременно она снижает порог входимости в специальность. Может, это и хорошо, но только в проектах, где не требуется рабочая сила высокой квалификации. А так вузы и правда превращаются в ПТУ. Из моих одногруппников только 4-5 могут объяснить, что такое стабильная сортировка. Зато позавчера нам всем выдали дипломы бакалавров.
                                                              • +1
                                                                Интересно, есть ли в ИТ вузы, остающиеся вузами с этой точки зрения? Выпускающие понимающих системщиков?
                                                                • 0
                                                                  Не знаю как в России, а в Украине, судя по ICFPC и новостям, остался только Харьковский политех. :( И то, не факт что на 100%.
                                                                  • 0
                                                                    При чем тут ICFPC? Тут на ACM ICPC смотреть надо.
                                                                    КНУ, ХПИ, ЛНУ, ДонНУ, ТНУ, КПИ. Вот, вроде толковые закончились.
                                                                    • 0
                                                                      Как «при чём»? Ну, мы тут вроде как статью обсуждаем, где основной акцент стоит на незнании CS, а конкретнее — функционального программирования. Да и говорю о том, что знаю, а в ACM ICPC участия не брал, не следил, по-этому ничего сказать не могу. Смотрю, последних 2 года выдались удачными для наших университетов. Не может не радовать, раньше их даже в 10 не было, не то, что в 5-ке.
                                                                      • 0
                                                                        ICFPC — контест, в зависимости от задания предполагающий кучу специфических навыков, не обязательно в ФП. Собственно говоря, впервые задание, явно использующее ФП, появилось на ICFPC лишь в этом году.
                                                                        По успехам в ICFPC трудно оценивать что-либо, кроме креативности команды.
                                                                  • 0
                                                                    Ну не знаю, имхо, у нас достатоно неплохо учат. И глядя на выпускников могу сказать тоже самое
                                                                  • 0
                                                                    Я закончил экономический и программирую на JS, но знаю, что такое устойчивая сортировка.
                                                                    Образование не поможет, если человек не хочет. А если хочет, то образование и не обязательно.
                                                                    Вот Вы ведь знаете, что такое устойчивая сортировка ;)
                                                                    • 0
                                                                      Классические алгоритмы и структуры данных — это мелочь по сравнению с тем, что нужно знать при построении хороших интерпрайз-приложений.
                                                                  • +3
                                                                    Рад что кто-то обратил внимание на Джоеля… Умные вещи пишет дядька…
                                                                    • +5
                                                                      Да. Просто думаю, что всё-таки, Хабр не место для того, чтобы его засорять переводам его статей. Раз в месяц, для «подумать» еще можно публиковать
                                                                      • +1
                                                                        Ну во первых на его сайте есть переводы статей, или на «зеркале».
                                                                        Во-вторых две книги в бумаге. Поэтому недостатка джоэла на русском нет и кто хотел прочитал. Но в целом Ваш перевод зачтется как пиар для тех, кто не читал.

                                                                        Мораль: товарищи, на дворе лето, по дороге куда-нибудь захватите Джоэла Спольски, насладитесь стилем речи, тонкостью мысли и просто забавными фактами.
                                                                        • +1
                                                                          А я вот его ещё не читал: всего год назад мне рассказали про указатели и рекурсию. Пожалуй пойду в магазин, посмотрю, продаются ли его книги) Автору спасибо за наводку)
                                                                          • 0
                                                                            А там программирования нет вообще в плане теории. Там о процессе: начиная со стульев, на котором должен сидеть пограммист, заканчивая временным планированием и конкуренцией.
                                                                            • +1
                                                                              Я понял. Именно этим меня собственно и заинтересовало. Жаль нету у нас сейчас в магазине, придётся качать(
                                                                              • 0
                                                                                Я бы подождал и купил бумагу. Это далеко не самая важная книга, но просто очень приятная. Хотя может вам электронка удобнее.
                                                                                • 0
                                                                                  Электронка не то, чтобы удобнее… Просто если её сейчас нет, то боюсь себе представить, сколько она буде стоить когда появится. Просто у нас в Беларуси не лучшие времена для книг. Особенно на околокомпьютерные темы. Например книга по C# подорожала почти в 4 раза всего за 3 недели=(
                                                                                • 0
                                                                                  Много написанное в его статьях у него на сейте в книгах не появилось, поэтому можете спокойно читать у него на сайте :)
                                                                                  local.joelonsoftware.com/wiki/Russian

                                                                                  Или, если нормально читаете по английски, то лучше тут joelonsoftware.com/
                                                                                  Его тексты в оригинале хорошо читаются
                                                                                  • 0
                                                                                    О, спасибо! Про русскую версию сайта не знал
                                                                      • +36
                                                                        Честно говоря, я считаю это нытьём. Да, программирование поставлено на поток. Да, программировать стало легче. Это и называется прогресс. Его двигают единицы, а пользуются им массы. Просто надо принять как данность, что по проторенной дороге идти намного легче, и незачем из чистой вредности оставлять за собой капканы и растяжки чтобы последователям было сложнее.

                                                                        Пусть появилось множество посредственностей — специалисты высшего класса были, есть и будут. И их было, есть и будет мало.
                                                                        • +3
                                                                          Ну вы же не будете отрицать, что указатели и рекурсия (и ещё десяток вещей) относятся к базисам программирования? Да, они не так просты для понимания, но программирование без знания основ — это такая вёрстка кодом, не больше.
                                                                          И как только возникает задача сложнее «Hello, %username%!», то такой «программист» либо тупит, либо решает проблему с помощью костылей. И вот он, тот самый говнокод.

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

                                                                          PS: Тут мог быть комментарий о том, как же можно не понимать таких простых вещей, но я вдруг вспомнил, как изучал указатели, и понял, что это в первый раз действительно вызывает затруднения.
                                                                          • 0
                                                                            В настоящее время наши вузы не могут себе позволить выпускать единицы хорошо подготовленных специалистов, вот и приходится упрощать программу. В моем вузе нередка такая практика, как «нормализация» оценки — человеку, написавшему тест/зачет/экзамен лучше всех, ставится высший балл (даже если он ответил правильно меньше, чем на половину вопросов из теста), а оценки остальных линейно интерполируются. У нас был курс по C++, оценки за экзамен по нему выставлялись таким же образом, причем единственным алгоритмом, который дотягивал до базисной сложности, был алгоритм Дейкстры. Нашим выпускникам это, конечно, вряд ли понадобится на практике, ибо промышленное программирование сейчас концентрируется на других вещах, для которых хватает знания ООП (до первых багов, конечно же).
                                                                            • 0
                                                                              С++ и дейкстра в одном курсе??!
                                                                              • 0
                                                                                Базовые алгоритмы, которые должен знать любой уважающий себя программист, ну никак к языку не привязаны.
                                                                                • 0
                                                                                  О чем и речь, зачем в курсе с++ изучать еще и алгоритмы, это 2 разных курса, семестра по 2 каждый.
                                                                                  • 0
                                                                                    Ну, у нас параллельно шел курс «Информатика» где нам рассказывали алгоритмы, «Программирование» — где нам эти же алгоритмы, но уже не в псевдокоде, а на Си, и «Программирование на ЯВУ» где нам рассказывали про фичи конкретно Си.
                                                                            • +3
                                                                              Знаете без указателей и рекурсии жить очень даже можно. Что рекурсия, что указатели, во многих языках программирования уже не актуальны. Т.е. обычному программисту-практику они и не нужны. Если возникает сложная задча — пусть передает её «умному» программисту, знающему, что такое латынь указатели.
                                                                              • +2
                                                                                Читайте, пжлст, комментарии целиком. Я процитирую релевантный отрывок:

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

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

                                                                                Но тут, как верно заметил автор, всё упирается в бабло, которого всем вечно нехватает. Поэтому выпускать кодеров, знающих ровно столько сколько нужно чтобы кодить в фирме на дядю продолжат так называемые “университеты”.
                                                                              • 0
                                                                                Вы хотите, чтобы людей, не полностью знающих курс лекций, выгоняли из института?
                                                                                Давайте действительно абстрагируемся от программирования и признаем: почти у каждого в институте был предмет, в котором он выучил полбилета.
                                                                                С таким же успехом можно выгонять с последних курсов людей, которые так и не научились приводить дифференциальные уравнения к однородным.
                                                                                • +3
                                                                                  >С таким же успехом можно выгонять с последних курсов людей, которые так и не научились приводить дифференциальные уравнения к однородным.

                                                                                  Мы, кстати, заметили, что к окончанию учебы (на 4-м и 5-м курсах) из программы практически исчезли действительно сложные предметы. Все, кто уделял учебе хоть капельку внимания, стали практически отличниками. Люди на полном серьезе называли самыми сложными предметы военной кафедры :-)
                                                                                  • +1
                                                                                    Да именно так.
                                                                                    • 0
                                                                                      В идеале — да, но при условии что там не будет совершенно левых предметов, которые пихают в расписание по принципу «у нас как раз есть свободный преподаватель».
                                                                                      • +2
                                                                                        Знаете, у меня сложные и долгие отношения с российской системой высшего образования, и я сильно иначе представляю себе, как она должна выглядеть в совершенном виде.

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

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

                                                                                        Но это фантастика. А пока да, я хочу, чтобы тех, кто не знает профильные курсы, выгоняли.
                                                                                      • +3
                                                                                        А что, в яве не может быть рекурсии? Кстати ее там использовать надо аккуратно, а то можно переполнение стека словить — лучше оформить как цикл, формой какового рекурсия и является. Кстати это обычно бывает сложнее, чем сделать рекурсией. А вы знаете, что все переменные-объекты явы по сути своей указатели, и разница между скалярными типами и объектами для новичков не менее сложна чем указатели в своем исходном виде? Классическая ошибка новичка — сравнивать Integer или String используя == а потом удивляться что new Integer(100500) не равно new Integer(100500). А боксинг/анбоксинг? А куча хитростей касающихся расхода памяти? А правильный выбор коллекций под задачу?

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

                                                                                        Так что проблема всё же не в языке, быдлокодить можно и на С, и на ассемблере.
                                                                                      • +2
                                                                                        Поддерживаю. Нытье чистой воды :) Стиль изложения интересный, но здравого вижу мало. Автор рассуждает в таком ключе, будто произошла катастрофа, заключающаяся в том, что образование безнадежно испортилось. Мир уже не тот, небо не такое голубое, как все плохо, бла-бла-бла… А на самом деле образование просто изменилось в соответствии со спросом. Рынку требуется большее количество кодеров, и ВУЗы эту потребность удовлетворяют. Единственное, в чем можно понять автора — это в невозможности более отсеивать программистов по пониманию указателей. Но и это не глобальная проблема, можно придумать задачу и для тех, кто не знает указателей.
                                                                                        • +3
                                                                                          Рынку требуется большее количество кодеров, и ВУЗы эту потребность удовлетворяют.

                                                                                          А вузы ли должны её удовлетворять?
                                                                                          • –1
                                                                                            А должны ли вузы быть должными?
                                                                                      • +7
                                                                                        Статья напомнила фразу «Классику надо знать».
                                                                                        • +11
                                                                                          Приведу своё наблюдение об образовании и рынке труда в России и США:
                                                                                          Я работаю в Калифорнии, не в самом крупном городе, и у меня сложилось следущая картина:
                                                                                          — программистов не хватает, спрос большой
                                                                                          — пользуясь повышенным спросом в индустрию лезут все подряд, даже те, кто образования не имеет вовсе. И их берут на соотвествующие задачи (и с соответствующей оплатой)
                                                                                          — Это приводит к тому, что порог вхождения в професиию значительно снизился, о чём автор и пишет в статье
                                                                                          — И самый интересный вывод: одна из причин, почему работадатели зачастую охотно берут зарубежных программистов (я работал с русскими и израильтянами, индусов у нас что-то не было) — потому что ещё есть страны (Россия в том числе), где чтобы стать программистом — действительно требуется интеллект и фундаментальное развитие.

                                                                                          В Америке, закончив колледж по специальности Computer Science, можно смутно представлять себе многие аспекты описанные в статье, и при всём этом найти достойную работу. В России ещё существует определённый порог, не перейдя который, человеку нереально закончить университетский курс. За что здесь и ценят русских программистов.
                                                                                          • +12
                                                                                            В России уже давно всё также. Просто в Америку и аутсорс попадают лучшие, а остальные идут эникеить или вообще уходят из ИТ сразу после диплома (
                                                                                            • 0
                                                                                              Россия к сожалению катится примерно к тому же
                                                                                            • +5
                                                                                              Следующий виток «отупления»: это когда студенты при изучении Java и самых начал J2EE (сервлеты+JSP) жалуются, что это сложно и лучше бы они изучали PHP.

                                                                                              Если увеличивать порог вхождения в CS, то придется закрывать большую часть специальностей или сокращать набор, потому что не наберется столько студентов, которые смогут осилить на хорошем уровне системное и функциональное программирование. Да и преподавателей толковых найти не так просто за наши зарплаты в вузах.
                                                                                              • 0
                                                                                                Спасибо за перевод, но с точкой зрения автора по большей части не согласен.
                                                                                                Бред какой-то, чел перевернул факты с ног на голову. Да, JAVA уделяют больше внимания, потому что он востребован рынком, но из программ обучения не убрали вовсе фунциональные языки, асм, рекурсию, алгоритмизацию. А из текста складывается именно такое впечатление.

                                                                                                Те, кто хочет доверять его авторитету, оглянитесь вокруг.
                                                                                                Статья датирована 2005-м, а нынешнее время доказало, что он ошибается. Сейчас начал возрастать интерес к функциональному программированию, потому что оно стало востребованным, microsoft выпустило F#, да и их поисковик Bing мало чем уступает Google. Map reduce (Mongo, Hadoop, CouchDB) спокойно используется даже захудалыми веб разработчиками вроде меня, которые не получали даже профильного SC образования.

                                                                                                • +3
                                                                                                  Да причем тут джава и ФП-то?
                                                                                                  Речь просто о пороге вхождения.
                                                                                                  Суть статьи в том, что в начале развития технологии в ней занимаются единицы, но лучшие. А по мере набирания оборотов в нее вливается огромое количество «среднячков»-муравьев. И от этих среднячков автору и обидно/страшно.
                                                                                                  • –1
                                                                                                    для начала приведу его же фразу
                                                                                                    >>Простейший способ быть занимательным — это быть конкретным, когда этого не требуется.
                                                                                                    товарищ с вполне определёнными инсинуациями наезжал на java и ms, противопоставляя им ФП языки и map reduce. противопоставляет мат. модель нужному нынче ооп. прошёлся по нелюбимому языку и бывшему работодателю, обещал ещё статью где напишет что java плохой выбор.

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

                                                                                                    самое смешное, что автор сам не особо пользовался этими технологиями в своё время. джоль нынче писатель и подбрасывал дровишек для холивара.
                                                                                                    • 0
                                                                                                      Паскаль тоже ругали за низки порог вхождения, а до этого с++ ругали за то что он намного проще Си… Эта статья троллинг крупного масштаба. Проблема в падении уровня образовании но из статьи получается, что в этом виновата ява!
                                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                    • +23
                                                                                                      • –13
                                                                                                        Как то статья из одной ссылки глупо смотрелась бы, если не топик-ссылка
                                                                                                        • +22
                                                                                                          Ну да, за чужой (а кто знает, что Илья это не Вы) перевод поставят плюсов значительно больше, чем за топ-ссылку.
                                                                                                      • +6
                                                                                                        Дорогие переводчики, давайте перестанем писать «наш папа порол нас своим ремнем», это некрасивая калька с английского.
                                                                                                        • 0
                                                                                                          Автор, согласен с Вами, что для обучения программированию Java никуда не годится.

                                                                                                          Может я, конечно, слегка помешан, но моя точка зрения такова — Qt как ничто иное подходит для обучения студентов. Там и библиотека классов, своя многопоточность, коллекции — и постоянная работа с С++, указателями и памятью в той мере, в которой она необходима обучающемуся и растущему специалисту, и я очень рад, что в свое время выбрал её и поставил таким образом свои мозги на место!
                                                                                                          • +1
                                                                                                            Идеально подходит для обучения Pascal. Остальное, после паскаля (delphi, c++, java), студент уже сам в состоянии выучить.
                                                                                                            • 0
                                                                                                              А я думаю, что начинать можно и с Си. В школах кстати на ЕГЭ по информатике он стал доступен в качестве языка на выбор!
                                                                                                              • 0
                                                                                                                На ЕГЭ в последнем задании, где написать программу, школьник имеет право на чем угодно писать. Я вот вообще на PHP писал, правда пришлось ехать на аппеляцию, объяснять что этот код делает. Но тем не менее, регламентом разрешено писать на любом.

                                                                                                                А вот в остальных заданиях, где приводится листинги кода, всю жизнь было Pascal, QBASIC и Си
                                                                                                                • 0
                                                                                                                  Черд. Жаль у меня такого ЕГЭ не было. Написал бы ради лулзов на асме :)
                                                                                                                  • 0
                                                                                                                    Тогда уж на brainfuck )
                                                                                                                    • 0
                                                                                                                      на brainfuck, что бы зкодить предложенную задачу, егэшного листа не хватит)))
                                                                                                                      • 0
                                                                                                                        на whitespace, а потом на апелляцию и доказывать там :)
                                                                                                                  • +1
                                                                                                                    Выше была ссылка про то, что начинать с си — плохо. Я согласен.
                                                                                                                    Паскаль (в мое время бейсик) — для понимания сути массивов/циклов/условий.
                                                                                                                    Ассемблер — для понимания сути работы машины. Причем зачастую связь с паскалем еще не так улавливается.
                                                                                                                    Си — для понимания связи между первыми двуми.
                                                                                                                    Все — теперь можно любой язык — вы понимаете как оно работает на всех уровнях.
                                                                                                                    • +4
                                                                                                                      А потом попадаецо Хаскелл/LISP/etc и все… привет разрыв шаблона ;)
                                                                                                                      • 0
                                                                                                                        Ну языки функционального программирования отдельный курсом обычно изучаются.
                                                                                                                        Как и ассемблер собственно.
                                                                                                                        • 0
                                                                                                                          Да, именно так. Хотя разрыв шаблона был, но не такой, как от ассемблера, от которого до сих пор разрывает (не в теории, а именно при практическом использовании)
                                                                                                              • +5
                                                                                                                То что я яве нет указателей — несомненно факт. Но рекурсия то чем провинилась.
                                                                                                                • 0
                                                                                                                  Ох чувствую, сейчас вам кто-нибудь про JNI залечит :)
                                                                                                                  • 0
                                                                                                                    Зачем через байткод есть прямой доступ к указателям. А так же через sun.misc.Unsafe, для прямого контроля памяти… но воспользоваться этими библиотеками будет не так просто, они намеренно недокументированы и у этих классов приватный(!) конструктор, и добраться до них можно только через Reflection предварительно указав бутлоадеру загрузить UnsafeUtil в ключе Xbootclasspath и вызывать getUnsafe(). И тогда можно получить доступ к allocateMemory, freeMemory и прочему арсеналу камикадзе.
                                                                                                                    • 0
                                                                                                                      Хах, а где-т омне попадалась статья, в которой описывалось, как от String наследоватья %)
                                                                                                                      • 0
                                                                                                                        Это для тех кто считает недостатком явы, тот факт, что в ней отсутствует возможности отстрелить себе ногу :) Есть и еще как есть… просто чтобы это сделать нужно очень постараться :) Скажем так — нужно очень хотеть отстрелить себе ногу, чтобы это сделать в ява :)
                                                                                                                  • +1
                                                                                                                    В джаве рекурсия даже лучше, чем в Си — StackOverflowException рулит и можно ничего не бояться.
                                                                                                                    • 0
                                                                                                                      В Си современные компиляторы умеют оптимизировать хвостовую рекурсию.
                                                                                                                      В JVM ее оптимизировать практически невозможно, следовательно и оптимизировать нечего. Так что никак не лучше.
                                                                                                                      • +1
                                                                                                                        Зато на джаве я могу спокойно писать парсер методом рекурсивного спуска, не переживая за стек. А если вылетит StackOverflowException просто выдать ошибку.
                                                                                                                        • 0
                                                                                                                          Ну вот неужели нельзя один раз посмотреть мануал и запомнить?
                                                                                                                          msdn.microsoft.com/ru-ru/library/tdkhxaks.aspx, если под вижуалку пишете, например.
                                                                                                                          Любой нормальный компилятор поддерживает кучу опций, которые даже из уютной IDEшечки (про командную строку вообще молчу) при желании можно отрегулировать.
                                                                                                                          • +2
                                                                                                                            Ну вот неужели нельзя один раз подумать и запомнить?

                                                                                                                            /F — СТАТИЧЕСКИЙ параметр. Размер стека задается ОДИН раз.
                                                                                                                            А входная программа (на примере парсера) — ДИНАМИЧЕСКИЙ параметр, и его можно сделать сколь угодно большим что порушит стек c++, но не порушит Java, C#, Python который выкинут StackOverflowException.
                                                                                                                        • +2
                                                                                                                          Use Scala, Luke. Кстати далеко не единственный JVM-язык с поддержкой хвоствой рекурсии. Здесь привожу его как наиболее близкий к самой джаве.
                                                                                                                          • 0
                                                                                                                            В Java оптимизацию на себя берет JVM самостоятельно.
                                                                                                                      • +3
                                                                                                                        Я никогда не был знаком с человеком, который бы понимал Scheme, Haskell и указатели С, и не мог бы освоить Java за пару дней, и после этого писать код на Java лучше, чем люди, имеющие пятилетний опыт работы с Java…

                                                                                                                        А тем временем, когда Эккель заявил, что за пару месяцев изучения C# ничего хорошего в нем не нашел. Спольски сказал, что за такой срок изучить язык не возможно. Да и в Горький вкус Java есть глава про этих людей с Scheme, Haskell и указатели С, указывающая на то, что Спольски не знает о чем говорит.
                                                                                                                        • 0
                                                                                                                          А можно пруф, на слова Эккеля?
                                                                                                                          • 0
                                                                                                                            В данный момент нашел только его интервью, где он говорит, что раньше относился к C# скептически goo.gl/p0qOY
                                                                                                                            • 0
                                                                                                                              Мнение Эккеля сводится к тому что в яве программистам запрещено перегружать операторы, а в С# и то, что за счет синтаксического сахара в C# можно программировать в стиле С++… эТо тема для бесконечных холиваров. Ява консервативная и принципиальна по многим вопросам, и поэтому в яве нет и никогда не появится вещей, которые принципиально решено не включать в язык. Так же он сказал, что на яву накладывает ограничение требование к кроссплатформности… ну это без комментария. А вообще он фанат питона :)
                                                                                                                              • 0
                                                                                                                                Это все так, я привел его в пример противоречивости слов Спольски.
                                                                                                                              • 0
                                                                                                                                Спасибо!
                                                                                                                            • 0
                                                                                                                              >>освоить Java за пару дней

                                                                                                                              написать Hello World? Взял так БЛЯДЬ и освоил за ПАРУ ДНЕЙ!
                                                                                                                              • +2
                                                                                                                                Ну на зная немного другие процедуральные/ООП языки на Jave (или любом другом аналогичном языке) можно сесть и начать писать, разбираясь с синтаксисом уже на ходу. Я сам так когда-то сделал. Первая итерация кода выглядела весьма похабно (как в общем-то бывает даже с новым фреймворком или библиотекой на уже знакомом языке), но через пару недель уже разобравшись полностью, в два счета все причесывается.
                                                                                                                                И Спольски прав, что наоборот — это практически не работает. Зная только высокоуровневый язык, что начать писать на более низкоуровневом — надо учить дополнительную теорию. Так-же сложно «пересесть» на язык с другой парадигмой, скажем на декларативный или функциональный язык, если ты знаком только с процедуральными.
                                                                                                                            • +25
                                                                                                                              Есть и обратная сторона. Я сейчас наблюдаю команду из таких программистов, которые решили изучить java за два дня и писать на ней хороший код. В их проекте свой DB connection pool, свой клиент HTTP, свой логгер и так далее. И это ужас, а не проект.

                                                                                                                              И ещё, у них Senior программист не понимает Dependency Injection. Вот так, вообще не понимает. Его путь C -> C++ -> C# -> Java, возможно начинал на перфокартах, но вот не приспособлен его мозг оказался к абстракции IoC. И оцените что сейчас больше массово нужно — понимание DI или арифметика указателей?

                                                                                                                              P.S. ИМХО, учить программированию вообще бесполезно. Можно отвечать на вопросы, публиковать статьи, но выучить программиста невозможно. Программист должен учиться сам. Причём всё время, а не только получая свою степень CS.
                                                                                                                              • +2
                                                                                                                                Джоэл наступил на больную мозоль: с одной стороны он прав, с другой стороны и нет.
                                                                                                                                Он прав, когда говорит, что квалификация программистов стала ниже. Да, в народе программистом считают каждого, который умеет ставить винду, некоторые веб-девелоперы не имеют базовой математической подготовки, не знают даже теории графов, «потому что я пишу, используя фичи asp.net/zend framwork/etc, где все сделано за меня». А когда они сталкиваются с нестандартной, но легкой задачей, их мозг, обросший мохом, приходит в тупик. Вот тогда становится обидно за программирование.

                                                                                                                                С другой стороны, он в корне не прав про джаву. Да, на джаве просто писать. Он создан для этого!
                                                                                                                                Вчера был на гугловской конференции, где Джош Блох рассказывал пару паззлов, связанные с джава. После конференции мы начали задавать вопросы, спрашивали про будущее джавы, фп и т.п. На что был получен примерно следующий ответ: «Да, сейчас существует много технологий, но не надо сломя голову добавлять каждую фичу, наша цель — сделать жизнь программистов проще». Разве не круто получить решение проблемы минимальными затратами?

                                                                                                                                Про универы он вообще холливарно ответил :)

                                                                                                                                • +5
                                                                                                                                  Ох уж это «стремление к интеллектуальному иллитизму». И ведь падкие до авторитета люди начнут бездумно всё это за ним повторять.

                                                                                                                                  Кто-нибудь кстати может сказать о каком таком тайном «знании указателей» (кроме очевидного), которого никто не знает, он говорит?

                                                                                                                                  Ну и непонятно почему он не страдает из-за того что весь мир ушёл от «основ» (ассемблера) к «богомерзким» языкам выского уровня.
                                                                                                                                  • +1
                                                                                                                                    Ну честно признаю, что первые недели 2 указатели на паскале я в корень не понимал. Односвязный список был чем-то непостижимым.

                                                                                                                                    В конце концов я взялся за ум, разобрался с этими дурацкими крышками (да, в паскале не "*", а "^") и вот через 7 лет я работаю с++-разработчиком =)
                                                                                                                                  • 0
                                                                                                                                    Какая разница при помощи какого языка программировать?

                                                                                                                                    Для каждого своя ниша: я не вижу ничего зазорного, если человек программирует, скажем, на PHP и хорошо справляется с поставленной задачей. Или на Python, или на том же Java.

                                                                                                                                    Мое мнение — программировать нужно не на языке, а при помощи языка, и тогда многое станет проще. Паттерны идеально вписываются в эту идеологию.
                                                                                                                                    • +1
                                                                                                                                      по-моему, он вообще не язык имел в виду, а то, что программисты не понимают, как работают их программы
                                                                                                                                      • 0
                                                                                                                                        Как вы тут всех уели.
                                                                                                                                        Но статья не об этом. Выражаясь в вашей терминологии — те, кого ругает Джоэль, не могут выбрать этот самый язык ибо ограничены.
                                                                                                                                        • 0
                                                                                                                                          Вы правы! Только вот Джоэль пишет совсем о другом.
                                                                                                                                          • +4
                                                                                                                                            Избавляя разум от ненужной работы, хорошая нотация позволяет сосредоточиться на более сложных проблемах и в конечном счете повышает интеллект человечества. До появления арабской нотации умножение было весьма сложным, а деление даже целых чисел требовало усилий ведущих математиков. Возможно, ничего в современном мире не смогло бы удивить греческого математика сильнее, чем то, что большинство современнных европейцев умеют делить крупные числа. Это показалось бы ему абсолютно невозможным… Легкость выполнения операций над десятичными дробями – почти что сверъестественный результат постепенного обнаружения отличной нотации.

                                                                                                                                            «Совершенный код», Макконнелл

                                                                                                                                            Я полностью поддерживаю автора. Всему свое время.
                                                                                                                                            • +1
                                                                                                                                              Какая разница при помощи какого языка программировать?

                                                                                                                                              Большая.
                                                                                                                                              Прямо таки огромная.
                                                                                                                                              Вам знакома гипотеза Сепира-Уорфа?
                                                                                                                                              • 0
                                                                                                                                                Нет, не знакома. Ознакомился — спасибо. Но ведь это всего лишь гипотеза, которая все еще обсуждается.
                                                                                                                                                • +3
                                                                                                                                                  В своё время на википедии была великолепная статья на эту тему: Sapir-Whorf and programming languages. Потом куда-то делась. Даже с учётом того, что это только гипотеза, эта статья сводила воедино буквально все возможные аргументы обсуждений важности языков программирования.

                                                                                                                                                  Вот прямо буквально экономила время. Прочитаешь статью — и можно не листать пятнадцать страниц флейма на форуме или хабре :)
                                                                                                                                                  • 0
                                                                                                                                                    Именно поэтому и важно первым языком дать что-то типа паскаля. Или Scheme. Хорошая статья по ссылке, спасибо.
                                                                                                                                                • 0
                                                                                                                                                  Язык влияет на формирование нейронных связей. Но однако мышление без использования языковых форм возможно а значит язык на процесс мышления оказывает лишь косвенное. Язык влияет на возможность межличностной коммуникации, и может ограничивать передачу опыта в социуме. Что оказывает влияние на социум, но на внутренне абстрактное и образное мышление это не оказывает никакого влияние.

                                                                                                                                                  И что интересно по этой гипотезе происходит у людей владеющих несколькими языками? Они по идее должны стать сверхчеловеками.
                                                                                                                                                  • 0
                                                                                                                                                    И что интересно по этой гипотезе происходит у людей владеющих несколькими языками? Они по идее должны стать сверхчеловеками.


                                                                                                                                                    Вы не прочитали статью? Эта гипотеза не говорит, что «человек, владеющий ещё одним языком, лучше мыслит». Скорее, «то, каким языком владеет человек, влияет на его образ мыслей». Японцы мыслят иначе, чем русские, и чем американцы.

                                                                                                                                                    Точно так же Хаскелисты мыслят иначе, чем C-шники и чем APL-щики.
                                                                                                                                                    • 0
                                                                                                                                                      А как должны мыслить люди владеющими обоими языками? Как сишники, хаскелисты или что-то третье? Вообще я всегда думал, что программисты должны думать алгоритмами, а не кодами. Правильный алгоритм кодится на автопилоте, а вот начинать кодить на ходу не всегда приводит продукт к работоспособному состоянию. Язык это посредник между мыслью и железом. Если мысль зависит от языка, то это накладывает на мыслящего ограничения языка. Я думаю, что гипотеза лишь частично верна, но она не универсальна. Эта гипотеза не будет работать для тех людей, которые знают более одного языка.
                                                                                                                                                      • 0
                                                                                                                                                        А как должны мыслить люди владеющими обоими языками?

                                                                                                                                                        Вполне очевидно — «суперпозиционно». От Хаскеля они, вероятно, будут спокойно мыслить функциями высшег