PHP разработчик
3,2
рейтинг
25 июня 2011 в 02:21

Разработка → Опасности обучения на Java перевод

Java*
«Вы счастливчики. Мы по три месяца жили в мешках из дерюги в грязных сараях. Мы вставали в шесть утра, стирали мешки, съедали по корке чёрствого хлеба и шли работать на мельницу, по 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
В комментариях многие просили озвучить собственное мнение, а не тупой копипаст статьи. Ответил
Перевод: Joel Spolsky
Колосов Никита @Anexroid
карма
5,0
рейтинг 3,2
PHP разработчик
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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
              А как должны мыслить люди владеющими обоими языками?

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

              Ну, то есть, Хаскель даст им силы написать красивый комбинаторный парсер, а Си — написать сортировку слиянием в условиях серьёзно ограниченной памяти.
    • +2
      Если кто-то не умеет программировать, он будет «не уметь» на любом языке. На некоторых языках «не уметь» гораздо проще. Так появляются чудо-программисты на Яве.
      Вообще, про пишу — довольно частое оправдание, когда программист хочет выбрать язык, где можно делать ошибки, и при этом не переживать. Это плохо.
      • 0
        s/про пишу/про нишу/
  • +1
    С первых строк почувствовал знакомый стиль изложения… Ну точно, Джоэл! Только вот хорошо бы было упомянуть, что это глава из книги Джоэл. И снова о программировании, а именно — Часть II. Советы будущим программистам, Глава 8. Опасности обучения на Java.
    • 0
      Мне кажется, что в первую очередь это запись из блога. Все же книга вышла уже потом.
  • 0
    Это ерунда. Я собеседовал программистов, которые несколько лет разрабатывают сайты и не могу узнать синтаксис протокола HTTP.
    • +2
      Это фигня. Я собеседовал программистов, которые несколько лет разрабатывают сайты, и не знают ни css, ни html.
      Да, зато они знают joomla. Нет, php они не знают. Хотят от килобакса в месяц.
      • +5
        Это фигня. Я живьём видел программиста, который 10 лет пишет на C и не понимает разницы между &foo и *foo.
        • +1
          У меня был один такой: zigmar.livejournal.com/115357.html
        • 0
          И что же он пишет? Страшно даже представить…
          • 0
            Я даже не знаю как ответить, чтобы и NDA не нарушить, и любопытство удовлетворить.
            • 0
              А вы про какого-нибудь другого программиста расскажите, со схожими примерами.
              • 0
                Скажем так, продукт работает на режимном объекте, получает данные с датчиков и отправляет другим железякам.
    • –1
      Сейчас заминусуют, но вот интересно? Зачем web-программисту знать протокол?
      • +2
        Чтобы представлять передачу куков, чтобы понимать, почему в файле написано — UTF-8, а Опера «не слушается» и кодит в windows-1251 и т.д.
        • 0
          Ясно, спасибо.
          • 0
            А вы сейчас курсе на 2?
            • 0
              Ну, первый заканчиваю. Просто Web-программированием давно занимаюсь, но вот конкретно протоколом не интересовался как то
  • +8
    Я искренне не понимаю, почему понятие указателя и их использование считается чем-то сложным/непонятным.
    • 0
      Знаете, здесь просто в статье говорится о том, что теперь люди с гумманитарным складом ума могут программировать.

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

  • +1
    и здесь вспомнили Microsoft и обвинили в недостаточной компетенции. Ощущение, словно туда берут на работу только ламеров и все вокруг это знают и потому потешаются. Пользуются их решениями и потешаются дальше. Причём каждый раз укоряют MS, если их продукт кому-то показался не достаточно идеальным, по сравнению с продуктом конкурента. Напоминает попытки найти идеальную девушку корпорацию, которая всё умеет лучше всех, да ещё и даром.
  • 0
    а представьте что основным языком будет… PHP !? кранты нашей сфере
    • +3
      echo "PHP is great language!";
      echo "Wanna see some PHP magic?"; 
      echo ("one plus two minus three"==0); //1
      • 0
        Строка кастуется в число?
        Вообще где-то на пхп была сравнительная таблица проверок, новичкам полезно.
      • 0
        О_о

        Я в шоке, не знал, что эта строка преобразуется в 0…
        • 0
          Правда, по-видимому, только эта. Т.к «one plus two minus three plus two» != 2
          • 0
            Любая строка кастуется в ноль (если она не начинается с числа).
            • 0
              Странно, я всегда думал, что в 1…
              • 0
                но кастуется в true при преобразовании к лог. типу
                • 0
                  А, вот оно что… Просто я как бы в курсе, что при преобразовании к integer — вырежутся все символы и останутся только цифры. Но думал, что при сравнении с 0 не пустой строки будет false.

                  Опыт, опыт. Когда ни разу не сталкивался с подобными вещами — действительно многому удивляешься.
    • 0
      в школе разве что. Хотя у нас в универе отдельно кусы уже читают.
  • 0
    что он тогда о питонистах скажет?
    • 0
      А что питон? Хуже чем джава?
    • 0
      Питон наоборот своими указателями новичкам мозги выносит после Pasczl.
      a=[1, 2]
      b=a
      b.append(3)
      print a, b 
      #[1, 2, 3] [1, 2, 3]
      • +3
        Ну в java вообще-то тоже самое:
        List<Integer> a = new ArrayList<Integer>();
        a.add(1);
        a.add(2);
        List<Integer> b = a;
        b.add(3);
        System.out.println(a);
        System.out.println(b);
        // [1, 2, 3]
        // [1, 2, 3]
        
        • +3
          Вот то он и скажет о питонистах, что живут в своем маленьком мирке, что творится в других языках не ведают =)
        • –2
          Ну и? Боюсь-боюсь.
      • +3
        ссылки точно также работают и в джаве, и в шарпе, и в раби.
        если не понимать механизм работы ссылок, как вообще можно программировать на языках, где концепция ссылочных типов лежит практически в основе их работы?
        • +1
          fix: «в основе их работы» — т.е. языков
        • +3
          рУби
      • 0
        Ссылками, конечно же. Об указателях задумался.
  • +1
    С удовольствием посмотрел бы на диалог Спольски с Грэмом: один за усиление курсов CS, другой за отказ от CS для программистов в принципе
    • 0
      Ссылка больше не работает.
      • 0
        Я откровенно не помню, что там было, но о вреде CS Грэм писал много.
  • +15
    Читал в свое время. Статья очень хорошая, и Джоэл мужик бесконечно умный, но согласиться не могу :(. Опыта коммерческого программирования у меня поменьше, лет пятнадцать максимум если считать оффсорс западным компаниям на первом курсе института. Но что я сейчас могу сказать основываясь на этом опыте:

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


    Это типичный пример исскуства риторики. «Я прожил тридцать лет — и еще триста проживу». Из первого совершенно не следует второе. Я лично обучал работе с указателями восемнадцатилетних студентов без опыта программирования вообще. Там дел на день если умеюче. И я знал программистов с опытом, превосходящим мой, которые замечательно знали C, C++ и тем не менее писали чудовищный код. Для того чтобы писать программы не нужны указатели — нужно уметь писать программы. Указатели нужны в специфичных вещах — операционные системы, драйвера, кодеки, backend. Эти специфические знания достаточно просто и быстро получить.

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


    Большинству программистов не нужен map/reduce. Это области специализации. То же самое что и выше — передергивание причины и следствия, выделение одних фактов и сокрытие других :(. Областей специализации — бесчетное множество. Знаете map/reduce? Да вы просто молодцы! А как насчет TCP стэка? Что, и нагл можете написать? Да вы просто лапочка! А как насчет ограничений, накладываемых ядром Windows NT на драйвера? Что, никогда не писали драйвера? Ну и какой вы после этого программист! :). Работа с функциональной математикой — это специализация. Ее осваивают те программисты, у которых к этому «душа лежит». Вот я средне владею функциональным программированием — и да, это может сделать мой код на C, C++, C#, Objective-C или Java чуть лучше. Но именно что «чуть». Это не то, что нужно для написания программ, увы.

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


    Ну а вот это уже просто ложь. Может, конечно, 20 лет опыта Джоэла это «омфг» а мои 15 это ковыряние совочком в песочнице, но весь плохой код который я видел в своей жизни был плох не потому, что кто-то использовал односвязный список вместо двухсвязного. И не потому, что не применяли функциональное программирование. И даже не потому что применяли богомерзкие паттерны где не следует. Убивало код то, что люди не знали как правильно бороться с основной и единственной проблемой программирования — проблемой сложности. И, соответственно, не знали что ООП предназначено как раз для этого. Как, впрочем, и еще ряд техник, включая функциональное программирование. Их учили квадратно-гнездовой сортировке — но почему-то забыли рассказать, что сортровка уже есть в stl и cli, а вот композиция, декомпозицию и агрегацию придется делать ручками каждый раз.

    У кого что есть возразить старику? А то как то даже стыдно лапу на авторитета поднимать ^_^.
    • +3
      Та ничего не возразить, собственно. Поддались на Joel-овский троллинг только вот :) Да и какой-же он авторитет-то? Развлекательное чтиво для молодых программистов. Когда я о нем впервые узнал, лет 10 назад, впечатления были восторженные. Но сейчас — увы… Слишком много в его статьях безапелляционности, придумывания проблем на пустом месте, передергивания фактов и эмоциональных аргументов вида «они не делают XXX (как вариант — не знают YYY), да они идиоты!»

      А уж как он изящно наехал на всю Java целиком… Вы программист на Java — извините, вы пишите на недостаточно сложном языке… Можно ответить, что он пишет на английском, а это недостаточно сложный, язык. Вот русский — это да.
      • +2
        Аналогия «английский-русский» и «Java-SomeLangJoelLikes» — клево.
    • 0
      Ну у меня опыта всего пара лет, а в продакшене вообще близко к нулю, но все же позволю себе возразить.
      По-моему, Джоел наезжал не на Java, а на деградацию высшего образования. И то же функциональное программирование, мало того что тренирует мозг, по-моему как-раз сейчас очень актуально, хотя-бы в связи с проблемой параллелизации. И выкидывать курс по нему в угоду Java, по-моему глупо. Если хочешь стать специалистом по Java/C#, к примеру, то имеет смысл идти в колледж, там за год-полтора вполне научат решать типовые задачи. Академическая степень имхо подразумевает более широкое образование, и курсы по таким важным парадигмам, как ООП и фунциональное программирование (в контексте конкретных языков) уж точно можно пройти параллельно, если готовишься на программиста. Даже если потом драйвера на С будешь писать.
      • 0
        И то же функциональное программирование, мало того что тренирует мозг, по-моему как-раз сейчас очень актуально, хотя-бы в связи с проблемой параллелизации


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

        И выкидывать курс по нему в угоду Java, по-моему глупо


        Вот смотрите. Есть технология которая активно используйется в мейнстриме. На ее основе хорошо показывать сложные, академические вещи — проблему сложности, ООП, метапрограммирование. И есть LISP, который на практике используется намного меньше чем джава и сильно устарел. Да и еще курс по нему — про функциональное программирование — вещь сложную и сугубо специфическую. К которой, по моему скромному мнению, лучше идти уже после того, как есть опыт разработки с использованием более простых парадигм. Так что глупого в том, что от второго отказываются в пользу первого? То, что студентам рекурсию покажут не как (foo (- num 1)) а как foo( num — 1 )? :)

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


        Боюсь, наука с вами не согласна :(. На данном уровне развития мы себе очень слабо представляем как и чему надобно обучать чтобы получить нужный результат. Это все от того, что очень плохо разбираемся в работе человеческого мозга. Так что «один курс углубленно», «два паралельно», «десять поверхностно» — это дело вкуса, как обучать правильно, боюсь, не знает никто. А если кто и знает — то никому об этом не рассказывает ^_^.
        • +1
          > Боюсь, наука с вами не согласна :(. На данном уровне развития мы себе очень слабо представляем как и чему надобно обучать чтобы получить нужный результат

          Ну это софистика, особенно как вы ловко поставили науку на свою сторону. Вообще речь не идет о том как учить правильно, а о том что подразумевает академический подход обучения. Можно согласится что обучение по индускому стилю яве в колледжах по специальности CS не вполне соответствует тому что называется академическим образованием.
          • 0
            Да, я очень люблю софистику и риторику — есть такая слабость ^_^. А утверждение у меня очень простое — ХЗ как правильно учить программистов :(. У меня как-то получается, но у меня собственная программа обучения и она очень далека от «академического образования» :(. Вообще, если уползать в оффтопик — не уверен, что «академическое образование» и «классическая наука» хорошо коррелируют с умением программировать O_O. Это наполовину ремесленная дисциплина, ИМХО. В некоторой части даже исскуство, хотя вопрос спорный. Я знаю много хороших программистов, образование которых оставляет желать лучшего и которые, тем не менее, умудряются писать код лучше, чем я. Опять же, не вижу как мои профильные шесть лет образования и еще пара лет аспирантуры отразились на моем умении программировать. Все вещи, которые я считаю действительно важными и нужными никто не рассказывал — их пришлось выцеживать по крупице в процессе работы :(. И все эти вещи очень мало общего имеют с наукой — гораздо больше они коррелируют с такими «приземленными» вещами как опыт слесаря «как по феншую делать вот ЭТО на токарном и фрезерном станке» :(. Наверное, этому можно было бы научить в ПТУ. Но у нас ведь нет ПТУ, где учат программистов?

            Да, конечно, забавно собрать в кучку могучие теоретические знания, систематизировать, провести анализ и вывести истинно правильный способ применения венгерской натации. Но по внутренним ощущениям — это не основное, что нужно от софтостроения. От софтостроения нужно чтобы софт писался в сроки, надлежащего качества, с заданными характеристиками по поддержке и расширяемости. И научный подход тут очень мало помогает — тут нужны исключительно ремесленные навыки «как правильно и как неправильно». А не чем compound expression от compound statement отличается и зачем в C++ sequence points :(.
            • 0
              Если задаться целью выпускать много хороших программеров задешево (маленькое время обучения), то наверное можно придумать какой-то подход который бы работал в каких-то условиях. Но кроме кодеров/программеров нужны также люди которые бы могли анализировать требования, организовывать тестирование, разбираться в архитектуре, оценивать трудоемкость проектов, и многих других более специфичных областях связанных с ИТ. Из Computer Science студента может вырасти много разных специалистов, не обязательно это будет практик-программист. На мой взгляд было бы не очень здорово просто так отменить такой подход заменив его на более ПТУшный.
  • +2
    Забавно, но Спольски в постановке своей же проблемы практически на нее ответил. Если знание Java не позволяет отсеивать посредственных программистов от сильных, то и не надо вообще спрашивать на собеседовании о языке. Есть куча задачек, способных выявить мозговую активность и при этом не завязанную на языке.
  • 0
    У нас к подобным языкам можно отнести Delphi, теперь в вузах переходят на C#. Немного по другим причинам, но так же сюда попадает и PHP.

    Что касается Java — то её очень редко преподают в университетах, по ней мало литературы на русском(есть разве что по основам языка и стандартой библиотеки), она требует широкого кругозора в плане применяемых библиотек, а работа в России это обычно большие сложные системы: банки, телекомы, системные интеграторы, аутсорсинг/западные компании + редко интернет-проекты.
  • +1
    Что-то мне подсказывает, что Пол не Грэхэм, а Грэм.
  • 0
    Чет не догоняю. А что вообще может быть сложного в указателях? Что то постоянно вижу как из элементарной шняги раздувают какой то жупел страшней которого только сопромат и матан.
    • 0
      Я тоже не знал, пока мне институтский учебник по C++ не показали. Там лысина дыбом встает — авторы довольно слабо понимают как вообще устроен язык программирования и пытаются рассказать про указатели «как они это сами поняли», с какими-то чудовищными аналогиями и иносказаниями. Вообщем пытаются стенами из слов оградить истину, дабы читающий ее там увидел. Получается очень плохо :(. Как указатели преподаю я на внутренних курсах в компании — понимают все за один день. Там просто правильно рассказать надо.
      • 0
        Эм… а показать на ассемблерном примере работы коссвенной адресации религия не позволяет чтоль? Для этого не надо даже курс ассемблера проходить.

        Показать, что есть память в ячейках, есть регистр с адресом и регистр приемник.
        • +1
          Нет, у них же там C++. Все на уровне «вот эта хренька, а потом вот эта хренька, а потом получается вот такая хреновина» O_O.
          • +1
            Гы, LOL
            А потом они говорят, что программистам нет смысла изучать ассемблер :)
  • –1
    Редкостная хуита ИМХО. Ни в рекурсии, ни в тем более указателях ничего особенно сложного нету. А не учат потому что это не нужно в мейнстриме. Как факультатив желательно конечно, но кто захочет — есть интернет.

    Вероятно это просто верхняя планка автора. А еще он мазохист и тащится от segfaultов. )
    • +1
      В мейнстриме не нужны указатели и рекурсия?!
      • 0
        Да так и есть. Они опасны и без них в болшинстве случаев можно прекрасно обойтись.
        • 0
          Что то мне не сильно в это верится…
          • 0
            Во что именно:
            1. Да, так и есть.
            2. Они опасны.
            3. Без них в большинстве случаев можно прекрасно обойтись.

            1. Где они используются сейчас? Веб, десктоп, мобильные? Немного рекурсии в веб. Немного больше указателей в десктопе. И все. Программист может выполнить любую задачу не прибегая к ним. И в большинстве случев так и делает. Это я и имел ввиду под словом «мейнстрим».
            2. Тут я думаю без комментариев. Автор сам все прекрасно рассказал про segfault.
            3. см. 1
            • 0
              Одно дело — не уметь пользоваться, другое — опасно.

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

                Это софистика. Указатели никогда не делают код красивее. Быстрее да. Рекурсия же наоборот. При чем ни то ни то не делает код понятнее.
    • +1
      Если чувак получает специальность CS, то наверное он должен представлять что это такое. Без указателей и рекурсий на его компьютере ничего не работает, а одной явой тяжело конкурировать с индусами и китайцами.

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

        Спросить у ява программистов можно очень много. Когда этим занимается гугл вдруг оказывается и что у явы порядок байтов в некоторых случаях на маках другой, и что есть абсолютно невообразимые параметры среды и виртуальной машины, и что иногда она себя ведет оооочень странно.
        А Спольски просто евангелист микрософт поэтому ява ему не торт.
        • 0
          > Что значит «одной явой тяжело конкурировать с индусами и китайцами.
          Опасность того что если готовить одних ява-практиков, то у них не будет работы из-за более дешевых китайцев и индусов с точно таким-же образованием.

          Рекурсия — фундаментальное свойство некоторых структур данных и используется много где. Наверника на уровне райнтайма как минимум какой-нибудь qsort сделан рекурсивным. Как вообще можно изучать алгоритмы без рекрусии?
          • 0
            Полностью подготовить в институте программмиста вообще невозможно.

            Как раз на уровне рантайма ее скорее всего нет. Потому что она опасна и потому что она медленнее чем цикл. Рекурсию всегда можно заменить стеком.
            • 0
              Рекурсия это и есть использование стека вызовов, далеко не всегда имеет смысл тащить свой собственный стек и усложнять код из-за непонятных религиозных соображений. На вскидку поискал исходники qsort freebsd.active-venture.com/FreeBSD-srctree/newsrc/libkern/qsort.c.html — используется там рекурсия без всяких проблем. Вообще не понятно зачем ее боятся.
              • 0
                Вы преувеличиваете: «без всяких проблем». Вы невнимательно читали код.
                Код как раз усложнен тем что в части случаев происходит не рекурсия, а итерация. Автор это мотивировал: "/* Iterate rather than recurse to save stack space */". Так что без проблем тут не обошлось. )
                Этот пример показывает как осторожно и дозированно ее надо использовать в реальной жизни. Даже в тех алгоритмах которые без нее сложно представить. (Типа qsort).
  • +1
    А нельзя было обойтись без копипаста 2005 года, указать ссылку на оригинал и изложить свои собственные мысли?

    В российской специфике, чтобы хорошо знать яву нужно знать английский. Так как в россии слабое сообщество, то на русскоязычных форумах мало кто ответит новичкам. А на западе запросто… Но как преподаватель заявляю, что сам факт знания студентом английского языка поднимает уровень его интеллекта на голову, над забротами, которые бездумно учат мышкакликательное программирование и привязываются к супер удобным средам программирования, без которых потом ничего вообще не могут сделать. Учить студентов нужно в блокноте хоть с подсветкой синтаксиса и неважно какому языку. Главное что бы они руками научились делать то, что потом за них буде делать среда программирования.
    • 0
      4 года пишу, использую только блокнот, привык. Все эти IDE только раздражают своей громоздкостью.
      gedit + gcc + gdb творят удивительные вещи…
      • 0
        gedit слишком громоздкий. Лучше vim.
  • 0
    Залей копипаст на хабру и получи инвайт… Смотрю человек за за свой «труд» получил справедливую награду :) Не то что бы жаба задавила (все таки жаба в статье главная героиня), но как-то хочется справедливости. Приходится думать, а зачем писать статью две недели, когда можно найти статью со старого забытого блога, и получить профит.
  • +1
    Выше не однократно просили изложить собственное мнение. Что ж…

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

    Более того, та же рекурсия — основа очень многих алгоритмах. Например, Quick Sort. Да, я понимаю, что рекурсия выполняется дольше, что её можно заменить стеком и т.д. Но скажите, зачем так извращаться ради крохотного выигрыша в процессорном времени?

    Более того, скажу пару слов о слов об образовании. Есть два пути: готовить «кодеров» и готовить специалистов. Кодер должен знать конструкции языка и иметь навыки работы с Google.
    Специалист — человек, который не привязан к конкретному языку. Он знает алгоритмы работы с различными структурами данных, сортировки, методы динамического программирования, математические алгоритмы. И зная эту базу он способен освоить любой язык

    Я за то, чтобы готовить специалистов, но, к сожалению, многие по-крайней мере российские ВУЗы пошли первым путём. И я против этого.

    Моё мнение не претендует на звание правильного, я сам многое еще не знаю. Но, мой какой-никакой опыт говорит мне, что так оно должно быть.
    • +1
      Хочу сказать, что индустрии нужны и инженеры-программисты и кодеры. При чем в пропорции 1:10, на одного инженера нужно 10 кодеров. Создавать алгоритмы намного сложнее и сегодня такая должность как системный архитектор вообще не предполагает кодирование, но однако это самая отечественная и сложная специальность в программировании. Чтобы закодировать работу одного архитектора может понадобится десять кодеров. У него самого на это уйдет много времени, но время архитектора очень дорого. Поэтому дешевле нанять десять индусов, которые выполнят эту работу не хуже, потому что по закодить алгоритм по подробной спецификации это механическая работа. И для бизнеса нужны и кодеры и специалисты. Заставлять специалиста кодить и выбрасывать на верет деньги, но платить всем кодерам как специалистам то же не выгодно.

      Так что если вы хотите быть кодерами вас этому научат в ВУЗе, а если вы хотите стать специалистами, то вам придется этому обучаться самомусами.
      • –1
        Вы мыслите как-то по энтерпрайзному. Архитекторы, инженеры, кодеры — очень много бюрократии. В конце концов архитекторы делают что-то оторванное от реальности, кодеры кодят какой-то полный отстой (вроде копипасты вместо цикла), а инженеры прозревают от того, что на них легло в 5 раз больше работы, чем если быони все это делали сами.
        На самом деле нужны просто программисты. Программист за день пишет как 5 кодеров, а за это время успешно обдумывает архитектуру.
        • +1
          По энтерпрайзному значит эффективно? Представьте себе что инженер по разработке самолетов, бедет спускаться в ангар и самостоятельно вытачивать и собирать детали для самолет… тогда бы имели бы один самолет в 10 лет. Когда техника была простой то инженеры с удовольствием собирали свои устройства. Но когда дело доходит до сверхгигантских стоек, то нужна жесткая иерархия и коллективное участие тысяч людей, где каждый занимается конкретным делом.

          Инженеры не должны кодить или стоять за станком, они должны разрабатывать архитектуру, а рабочие и кодеры должны воплощать архитектуру в реальном железе или коде. Рабочие бывают разные, один выпиливает сотню деталей, а другой еле еле с десятью справится. Но нужно понять что образование заказывает бизнес. И безнесу нужно чуть-чуть инженеров и много очень много рабочих. Поэтому 90% ВУЗов у нас готовят рабочих-кодеров, и лишь элитные ВУЗы готовят инженеров. То что и тем и другим выдают диплом инженера-программиста просто фикция. Бизнес хорошо знает цену таким бумагам.
          • +1
            По энтерпрайзному это значит устеревше.
            Представте себе что информационные технологии это не самолеты и не станки. Это информационные технологии.
            Энтерпрайзная модель это модель водопада. Архитектора все предусматривают и все рисуют. Инженеры все это анализируют. Кодеры все это кодят.
            В информационных технологиях все проще. Цена ошибки тут намного ниже и исправить ее можно намного проще. Не нужно все предусматривать и даже больше — это вредно. Небольшие команды, итеративная разработка с гибкой архитектурой — оптимальный вариант. Кодеры которые кодят и не понимают что, в эту модель не вписываются.
            • +1
              Поэтому ява и популярна в энрепрайзе, потому что ява консервативна и предсказуема. Для малых коллективов это конечно не принципиально. Но для бизнеса жизненно необходимо правильно рассчитать бюджет проекта и точно знать сколько бете стоить тысяча строк кода тысячи индусов, вне зависимости от их квалификации. И тут риски возрастают до небес. Ошибка в смете это смерть для компании. В малых проектах один талантливый инженер может вытянуть всю команду, но в крупных проектах это уже не работает. Каким бы ты ни был специалистом ты не сможешь выполнить работу за тысячу людей. И ява позволяет быть уверенным что даже тупой индус не убьет проект тем, что ему вдруг захотелось перегрузить операторы класса в неподходящем месте.

              Низкая квалификация одного не может убить проект, но и при специалист высокой квалификации не сможет спасли его если он изначально спроектирован неверно.
              • 0
                В реальной жизни немного по другому.
                1. Проекты в которых тысячи людей очень малоуспешные. Тысячи кодеров — это малоэффективный менеджемент. (Как например в Нокиа).
                2. Большинство ентерпрайз проектов заканчиваются неудачей.
                3. Ошибка в смете — всегда!
                4. В большой компании ошибка в смете не приведет к смерти компании. И скорее всего даже не приблизит ее. И если IT это не основное направление работы компании, этого скорее всего даже никто не заметит.
          • 0
            Прочитайте, пожалуйста, вот это:

            offline.computerra.ru/2005/589/38835/
            www.maxkir.com/sd/newmethRUS.html

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

            А тем временем… Как-то на конференции видел доклад от компании Luxoft. Там человек рассказывал, что они делали в течении 5 лет проект командой в 150 человек без предварительного детального проектирования и без архитекторов. Проект успешно внедрен. Доклад назывался «Enterprise-scale Agile».

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

              Из преимуществ явы для промышленности это принудительное ООП и возможность приблизительной оценки разрешимости алгоритма. Полнойоценки как в паскале/обероне нет, но для бизнеса и это хорошо. То что некоторые команды могут работать без ТЗ говорит о том что команда это единое целое, живой организм и практически семья. Где вы видели такие отношения между сотрудниками в корпоративном секторе?
              • 0
                Основными преимуществами Java я могу назвать автоматическое управление памятью и жесткая спецификация на компилятор. Например нельзя передать в анонимный класс не final ссылку и правильно — нечего шарить состояние.

                Что касается доказательного программирования, которым занимался Вирт, то в паскаль это никак не заложено. Автоматическое доказательство есть в таких языках, как например SPARK (расширение Ada).

                > Где вы видели такие отношения между сотрудниками в корпоративном секторе?

                Умные заказчики уже поняли как нужно работать с исполнителями. Исполнители не могут требовать от заказчика подробного ТЗ, а заказчик не должен требовать точных сроков.
      • 0
        >Создавать алгоритмы намного сложнее
        >cистемный архитектор

        У вас какой-то очень специфический взгляд на мир :) Алгоритмы обычно разрабатывают математики. Системные архитекторы разрабатывают… системы. А еще прививают команде хорошие практики.

        > Чтобы закодировать работу одного архитектора может понадобится десять кодеров

        Сейчас не 75-й год и кодировать нужно не в машинных кодах на перфокартах. Кодеры не нужны. Алгоритм можно разработать, скажем, на matlab, или python. Запрограммировать это в конечной реализации — дело на пол дня. Нет ничего проще, чем реализовать готовый алгоритм, тем более имея перед собой прототип. Почему это не может сделать сам разработчик алгоритма, ведь это 10% всей работы?
    • 0
      Отечественное образование не способно выучить кодера — потому что программы быстро устаревают, но это никого не волнует. С выучиванием программиста немного лучше, ведь фундаментальные знания не устаревают так быстро, но все равно нужно очень сильно хотеть и самому следить за текущим состоянием отрасли.
      • 0
        Сильно ли изменился С++ за последнее десятилетие или паскаль? В том что появляются новые языки нет ничего принципиально нового, алгоритмирование и кибернетика от этого не претерпели никаких изменений. Вообще обучение зависит только от квалификации преподавателей, а не от технологии. В некоторых ВУЗах до сих пор преподают С++ Builder 6, потому что так проще преподавателям. И вообще java это очень большая редкость именно потому, что изучение сред программирования под java намного сложнее, чем c++ builder или Visual Studio.
        • 0
          1. Паскаль никому не нужен.
          2. В реальной жизни решают не языки, а технологии. вот они изменяются очень быстро. И программирование на С++98 уже давно не такое как было в 1998м.
          3. Другие языки помимо С++ бурно развиваются, да и С++ в этом году станет совсем другим.

          На Яве в институте можно кодить и в блокноте с подсветкой синтасиса. Компилятор достаточно хорошо разбирается в ошибках (в отличие от С++) и жесткая структура каталогов этому способствуют.
        • 0
          Кстати у того же Джоэла есть интересная мысль: в университете научат многому и полезному, но программировать ВУЗ не научит никогда. Просто нужно принять это как данность. Даже знание алгоритмов и структур данных не поможет. Это нужно и полезно, но в реальной разработке нужно прежде всего наработать чутье, что бы знать — вот это заработает, а вот это — нет. Словами описать это сложно.
    • 0
      В Санкт-Петербургском государственном университете на Физ. Факе раньше была кафедра — вычислительной физики, раньше у нас готовили монстров, настоящих монстров с великолепным математическим образованием, идеально физичным пониманием мира, с живым интересом к тому как же оно там все утроено… На днях я посетил свою кафедру… я слышал только об одном человеке, который пишет на Хаскеле, я был на защите и видел только одну защиту, про которую было сказано, что она «лучшая» и мне стало обидно. Я знаю, что теперь никто не делает лабораторных на MatLab сложенее чем «УАУ, я премножил матрицы и посчитал детерминант», не знают, как это просто написать свой сервер на С, не рисует в тетратках алгоритмы обхода и оптимизации деревьев, не пишут на MPI (вы знаете что такое HiLoad и паралельное программирование — дайте прочитать ваши программы на MPI). Я могу только надеяться, что мои колеги и учетеля смогут вернуть ситуацию к лучшему.
      Сейчас когда меня спрашивают куда идти учиться, я говорю: на физфак (матфизика) или на матмех.

      Но я плохой критик ситуации и знате почему? потому что я 2 раза пробовал стартовать бизнес, основанный на программировании микроконтролеров, но сейчас у меня выжить смогла только вебстудия и интернет проекты.
  • +1
    > многие люди никогда полностью по-настоящему так и не понимают: указатели и рекурсия.

    И тут Джоэл говоря про яву прав — я в них смог нормально разобраться только когда на 3-м курсе сам выучил С

    PS На сейте Джоэла перевод этой статьи висит уже несколько лет
    local.joelonsoftware.com/wiki/Опасности_обучения_на_Java

  • +1
    мда, интересно где бы щас был гугл если бы до сих программировал на перфокартах
    • +1
      Или если бы динозавры выжили.
  • +3
    Фух… Эта статья успокоила мою совесть! Я заставляю студентов знать все до мелочей, понимать, уметь применять, что право и приводит к тому, что к настоящему моменту только 4 человека сдали зимний зачет.

    Я уже начал думать, что я какой-то ненормальный препод. Думал, что моя основная работа в качестве программиста просто начинает жестоко сказываться на моих учениках. А нет, не один я так думаю о тенденциях в образовании.
  • 0
    Хм, видимо в штатах с поточной подготовкой кадров совсем плохо.

    Мне отвечественный кодер все таки видится разбирающимя в указателях и рекурсии.

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

    Хотя и у нас не мешало бы загнать многих свежих выпускников покодить на асме с использованием DOS PMI, просто для осознания степени несложности задач, которые их обучали решать.
  • 0
    Для опытных Java программистов есть предложение по вакансии: habrahabr.ru/job/5689/
  • 0
    Появление всевозможных конструкторов, фреймворков и тп, произведенных и поддерживаемых классными спецами делает возможным быстрое развитие автоматизации и ИКТ и тп. Слава богу Вы, гражданин, не правы. Если бы все думали только о том, чтобы сам программист был счастлив (отбирая для программирования только самым мозгоупорных), а не другие люди от продуктов его труда, то программы были бы нужны только этому сумашедшему гению и горстке подобных :) Но программы нужны всем. Потому, что Вы не правы, гражданин.
  • 0
    Не согласен во всем:
    Рекурсия в Jav'e есть.
    Указатели: на объекты в куче есть.
    На элементы массивов можно легко смоделировать парой (массив, индекс).
    На поля объектов можно смоделировать через reflection. И хорошо, что это непросто.
    Указатели на локальные переменные смоделировать нельзя, и это очень хорошо.
    И, наконец, испорченную перфокарту необязательно выбрасывать. Можно недостающие дырки прорезать бритвочкой, а лишние заклеить (без клея, просто вставить прямоугольничек и разгладить ногтем). Прямоугольничек берется из контейнера перфоратора.
    • 0
      Просто если этому программисту придется писать на си с++ или ассемблере, ох как тяжело будет этому программисту. Скорей он скажет как и все, ай, ну его, еще заморачиваться.

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