Как стать автором
Обновить

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

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

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

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

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

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

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

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

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

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

Схема умный дядько с UML и пять ПТУ-шников в конечном счете экономически проигрывает ситуации, когда умный дядька берет и реализовывает все сам, без UML и недалеких кодеров. Проблемой поиска таких умников и озадачен Спольски, я его прекрасно понимаю.
НЛО прилетело и опубликовало эту надпись здесь
Вообще-то он там много про свою фирму пишет и отбор студентов.

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

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

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

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

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

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

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

Мораль: товарищи, на дворе лето, по дороге куда-нибудь захватите Джоэла Спольски, насладитесь стилем речи, тонкостью мысли и просто забавными фактами.
НЛО прилетело и опубликовало эту надпись здесь
А там программирования нет вообще в плане теории. Там о процессе: начиная со стульев, на котором должен сидеть пограммист, заканчивая временным планированием и конкуренцией.
НЛО прилетело и опубликовало эту надпись здесь
Я бы подождал и купил бумагу. Это далеко не самая важная книга, но просто очень приятная. Хотя может вам электронка удобнее.
НЛО прилетело и опубликовало эту надпись здесь
Много написанное в его статьях у него на сейте в книгах не появилось, поэтому можете спокойно читать у него на сайте :)
local.joelonsoftware.com/wiki/Russian

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

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

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

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

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

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

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

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

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

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

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

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

Так что проблема всё же не в языке, быдлокодить можно и на С, и на ассемблере.
НЛО прилетело и опубликовало эту надпись здесь
Рынку требуется большее количество кодеров, и ВУЗы эту потребность удовлетворяют.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

Опыт, опыт. Когда ни разу не сталкивался с подобными вещами — действительно многому удивляешься.
в школе разве что. Хотя у нас в универе отдельно кусы уже читают.
что он тогда о питонистах скажет?
НЛО прилетело и опубликовало эту надпись здесь
Питон наоборот своими указателями новичкам мозги выносит после Pasczl.
a=[1, 2]
b=a
b.append(3)
print a, b 
#[1, 2, 3] [1, 2, 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]
Вот то он и скажет о питонистах, что живут в своем маленьком мирке, что творится в других языках не ведают =)
Ну и? Боюсь-боюсь.
ссылки точно также работают и в джаве, и в шарпе, и в раби.
если не понимать механизм работы ссылок, как вообще можно программировать на языках, где концепция ссылочных типов лежит практически в основе их работы?
fix: «в основе их работы» — т.е. языков
рУби
Ссылками, конечно же. Об указателях задумался.
Ссылка больше не работает.
Я откровенно не помню, что там было, но о вреде CS Грэм писал много.
Читал в свое время. Статья очень хорошая, и Джоэл мужик бесконечно умный, но согласиться не могу :(. Опыта коммерческого программирования у меня поменьше, лет пятнадцать максимум если считать оффсорс западным компаниям на первом курсе института. Но что я сейчас могу сказать основываясь на этом опыте:

Но это все ещё важно для некоторых из самых восхитительных программных разработок. Например, без указателей вы никогда не сможете работать над ядром 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, а вот композиция, декомпозицию и агрегацию придется делать ручками каждый раз.

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

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


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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Публикации