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

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

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

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

Что касается линукса. Мне нравится линукс, но я не считаю, что каждый начинающий программист должен прочитать про него две книги в 1800 страниц в сумме ради «изучения конкретной операционной системы».

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

Труды Кнута не стоит читать сразу после получения базовых знаний по С. Это очень сложныеи объемные работы, с большим количеством математики и теории. Эти книги должен прочитать каждый программист, но, на мой взгляд только после того, как у него появится хоть небольшой опыт. Есть огромное количество книг, в которых можно получить знания об основных алгоритмах в гораздо более доступной форме и с примерами на С.

Ваша подборка как-то очень уж фундаментальна, на мой взгляд. Хотя сама по себе литература хорошая.
Спасибо за подробную обратную связь. Учту ваши советы.
Практически каждый раз в похожих темах я настоятельно рекомендую читать книгу Макконнелл, «Совершенный код». Прочитав ее, получите очень хорошую базу «как надо писать код».

А вообще, на хабре была подборка TOP-5 книг, которые обязан прочитать программист. Их можно даже читать в той последовательности, что представлены в топике.
А сама подборка взята с известного сайта stackoverflow, где было голосование за лучшие айтишные книги. Очень советую изучить этот список.
Хитрый план. Вот только в результате, через 2-2.5 года вы так и не сможете написать что-то нормальное ни на одном из мейнстримовых ЯП. Хотя будет знать идеологические различия между ATA и SCSI.

Единственный способ научиться программировать — это сесть за клавиатуру и начать программировать. Возьмите какой-нибудь Visual C# Express, пройдитесь по разделу «для начинающих», купите книгу типа Троелсона. И через пару недель вы сможете написать хоть что-то рабочее «для себя».
Да; спасибо. Я тоже уже поняла, что чтение всей этой литературы должно совмещаться с «сесть за клавиатуру и начать программировать».
Но, возможно, если идти параллельно (практика — и чтение фундаментальных трудов), будет как раз самое то?
Боюсь, если идти параллельно, то лопнет мозг и в памяти останется бесполезная каша…
Половину из фундаментальных трудов вашего списка можно вообще не читать. В процессе обучения сами определитесь что читать, а что — нет.
когда начать программировать?
«Когда плавать научитесь, тогда и воду в бассейн зальём»
Если человек полный 0 в компьютерной сфере то можно почитать какие-то базисы, но читать про архитектуру процессора?? Зачем?.. И дальше — Таненбаум? Нет, правда? В начале освоения программирования читать Таненбаума?.. Предлагаю еще не допускать до программирования людей, которые не выучили наизусть «Искусство программирования» Кнута. Впрочем, как я вижу, оно у вас дальше тоже упоминается в программе )

Ну и начинать изучение собственно программирования с С… Это жестоко.

Вобщем суммируя — вам посоветовали хорошую литературу. Очень полезную литературу. Особенно если вы ходите бросить идею заниматься программированием как можно быстрее.
Это не литература для начинающих. Большая часть этих книжек только отобьют желание вообще что-то изучать.

Крайне рекомендую набор лекций от MIT ocw.mit.edu/courses/#electrical-engineering-and-computer-science
Ничего лучше этого для начинающих, да и не только для начинающих, я не видел.
И да, современный тренд во всех серьезных ВУЗах на изучение программирования на основе питона возник не спроста.
>Это не литература для начинающих. Большая часть этих книжек только отобьют желание вообще что-то изучать.

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

Вот еще кстати очень очень советую для начинающих просто замечательный курс www.youtube.com/watch?v=tKTZoB2Vjuk
Это небольшой курс гугловских лекций о питоне. Там дают самые-самые азы.
Кстати, Таненбаум очень доступно и интересно пишет. Почему бы и не почитать его? А начинать с Си нормально. Какая альтернатива? Паскаль? Можно и с него, конечно, но зачем учить практически мертвый язык?
Про Паскаль скажите это нашим вузам )) Хотя по большому счету пофиг… Те же самые структуры данных и базовые алгоритмы пофиг на чем реализовывать, главное понять идею и алгоритмические способы реализации…

Просто если начинать сразу с С — то нужно поглубже залезть в принципы работы компа, реализацию различных типов, адресацию и тд… Иначе можно завязнуть на тех же указателях… (у самого так было N-ое кол-во лет назад)
Ну да… Очень жалею, что пытался хорошо учиться в универе — потеря времени. Только процентов 10 предметов оказались полезными :)
А указатели — не самое страшное во что можно залезть, изучая Си :) Но сам по себе язык очень простой. А главное — во многих языках потом будет узнаваться его синтаксис, что ускорит изучение :)
Ну видимо на вкус и цвет… Я в свое время очень долго пытался понять что такое указатели на примере Паскаля. Пока не увидел Си. Работа с памятью с Си после Паскаля для меня стала просто сказкой, все логично и понятно.
Конечно же кому как — кому и Си мало, кому и Питона достаточно
Да я ж ничего против Таненбаума не имею, хорошие, полезные книжки. Просто читать их в начале изучения программирования… излишне.

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

Альтернатива — высокоуровневый язык с простым и понятным синтаксисом. Обычно это Питон.
НЛО прилетело и опубликовало эту надпись здесь
Даже не все дети с их незагруженным знаниями мозгом, динамичным и пластичным мышлением могут научиться программировать. При том, что их не мучают сложными фундаментальными книжками. В статье же для взрослых сформировавшихся людей предлагается список из книг, которые не все программисты-то, даже достаточно опытные, в состоянии прочитать. Ну куда бывшему liberal art major предлагать Кнута? Вместо этого намного лучше пошел бы Н.Вирт, а за ним Кормен. Не совсем ясно почему в разделе про ОС предлагается книга Таненбаума об архитектуре — у него есть две замечательные книги про операционные системы (одна из них тоже начинающему будет не по зубам).
плюсую Вирта вместо Кнута
C — да в начале?:) python для этого подходит куда лучше, или C# с его богатыми возможностями для формостроительства. И в списке нету «Совершенного кода»
Как раз Whitebook в начале самое то. Даже если прочитать ее как художественную литературу. По крайней мере должно появиться некое понятие о том, как данные располагаются в памяти и что такое указатели.
Учить сразу с Питона наверное неправильно — у большинства мейнстримовых языков всё же С-подобный синтаксис, да и слишком «высоко» находятся скриптовые языки — потом могут возникнуть сложности с решением неординарных ситуаций типа «почему скорость запись на диск такая низкая» или «почему вычисления забивают всю оперативную память».
А Совершенный код это уже для программистов которые знают как писать код, но ещё не знают как его писать хорошо.
Питон для начала замечателен, не зря сейчас все ВУЗы на него перешли. Это все равно как обучение математике. Детей сначала учать считать, таблицу умножения, простенькие задачки, потом переходят к алгебре и только потом мат-анализ, дифуры и аналитическая геометрия.

Начинать изучать программирование с С это все равно как взять людей не знакомых со счетом, нарисовать им на доске интеграл и сказать «а сейчас на основе этого примера мы будем учится складывать и умножать!»
Питон для начала замечателен, не зря сейчас все ВУЗы на него перешли.

Раскроете тему?
Возможно, не вполне верно выразился: вопрос относится к части «сейчас все ВУЗы на него перешли».
Многие европейские, штатовские, тот же MIT например, а его программы в многих вузах преподают. «Все» это преувеличение конечно, где-то базовым остался Паскаль, где-то это вообще Ява…
Вообще у них немного другой подход, по сравнению с преподаванием в наших вузах. У нас обычно изучают язык, типа вот курс С, потом курс фортрана и т.д.
У них обычно изучают computer science и показывают методики и подходы на примере языков, причем вполне могут смешивать несколько, объясняя базовые принципы на питоне, менеджмент памяти на С, функциональную парадигму на Лиспе и догоняя это всё азами энтерпразных подходов на Яве.
Я не знаю, в моё время был Турбо Паскаль 6.0. :)
Я бы всё делал не так. Совсем не так.
Сначала выучить какой нибудь бейсик/паскаль — пописать на нем простейшие программки, почувствовать что это.
Потом несложный юзер интерфейс или веб не важно на чем.

Только потом начинать читать какие то основы.

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

На каждом этапе развития как программиста — следующую порцию основ.

Тененбаум — после Кернигана и Ритчи. Кормана алгоритмы — изредка почитывать когда уже умеете что то реальное делать…

Или вот что — посмотрите как построены реальные наборы курсов (и в каком порядке) изучаются на компьютерных специальностях нормальных вузов
>Я бы всё делал не так. Совсем не так. Сначала выучить какой нибудь бейсик/паскаль — пописать на нем простейшие программки, почувствовать что это.

Спасибо. Как я поняла, это ключевой момент.
Для начала:
SICP
там все области программирования затронуты и ее можно просто читать
и делать задания. Есть русский перевод.
Не советовал бы начинать с архитектур процессоров.

Спасибо. Хорошо, что есть русский перевод — на данном этапе для меня это важно.

Вообще, комментарии хабровчан в целом оказались ценнее поста)
Вообще, комментарии хабровчан в целом оказались ценнее поста)
На хабре это распространённое явление.
Ну да. На это и была надежда.
НЛО прилетело и опубликовало эту надпись здесь
SICP это тоже сильно круто
Прочитать книжку "%language% для дебилов", выполнить все примеры и устроиться на вакансию ученик\стажер.
Лихо вы «для начала» посоветовали три тома Кнута целиком. Ну да, если осилишь — станешь крутым программистом, тут вопросов нет. Но куда больше вероятности, что неподготовленного человека это навсегда отпугнет.
>Ну да, если осилишь — станешь крутым программистом, тут вопросов нет. Но куда больше вероятности, что неподготовленного человека это навсегда отпугнет.

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

Хороший человек (с ваших слов) посоветовал вам список, но как тут многие уже написали сами по себе в отдельности книги хорошие, но прочитать и тем более понять хотя бы их часть новичку — невозможно, если он ни супер-гик и вундеркинд какой-нибудь.
Не получится заочно определить, какая именно специализация нравится, не попробовав.
Чем-то похоже на курс специальностей типа «математик-программист» наших ВУЗов.
И это, уж извините, далеко не комплимент.
Раздел программирования не заполнен вообще как на мой взгляд.
Добавил бы:
1. Курс лекций «основы программирования» из наших вузов — нужно чтобы определиться что такое циклы, массивы, ветвления. Что такое переменная, чем отличается от константы.
2. Старый добрый Гради Буч
3. Выбираем язык (я бы выбрал сейчас что-то аля Java или C#). Берем книги фор дамиес и вперед. В случае с Си шарп неплохо можно почитать книги издательства самого MS.

+ сюда же я бы на свой вкус добавил еще дискретную математику и прикладную теорию цифровых автоматов.

Дальше, уже имея понимание, выбираем специализацию и качаем узкие скилзы.
Лучше не Java/C# а сразу Scala :-)
А мне кажется, что идея начинать с С — не так уж и плоха, как кажется многим. В свое время книга «Язык программирования С» на меня очень повлияла, идеологией или духом, наверное.

Если вы честно проделаете все ДЗ в «Язык программирования С», то это уже будет неплохое начало. Причем лучше всего, чтобы кто-то покритиковал то, что вы написали, разобрал с вами хотя бы часть ошибок.

Паскаль, Бейсики — с этого тоже можно начать, но вас очень долго не будет покидать ощущение «учебности». С Питоном получше, но он не приучает к такой строгости как С. Если вы потом решите писать что-то более сложное, то все равно придется учить «промышленный» язык вместо учебного. А после С это будет сделать несколько проще.
По моему начинать нужно с классической книги «Алгоритмы + Структуры данных = программы» Вирта. Доступно на мой взгляд даже старшекласснику и в то-же время все фундаментальные идеи раскрыты. А уж потом языки, системы и все остальное…
В комментариях священная война сродни «каскад» vs Agile.

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

Можно убить 3 года на Кнута и сотоварищи. А потом выяснить что в Python/Ruby/C# уже реализована православно верная сортировка. И ее можно просто использовать. А в SciPy отлично и мега быстро реализованы кластеры, деревья и многое другое. И их тоже можно использовать. А думать надо о другом, на что товарищи внимания-то и не уделили, считая что это ниже их достоинства. И да здравствуют еще 3 года обучения.
Да и зачем писать программы вообще, когда есть уже куча написанных.

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

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

На 1ом занятии в автошколе преподаватель рисует изотермы и каллиграфическим почерком выводит на доске «Цикл Карно». Затем углубленный курс «сопромата», решение задач «автомобилист выехал из пункта А в пункт Б», психология (ну мало ли решать конфликтные ситуации на дороге), этика автомобилиста, практически занятия (сбор/разбор/ремонт) и т.д.

В итоге когда корс закончится удивленные ученики обнаружат, что весь мир ездит на электромобилях (c Google Auto вместо водителя).
Не очень удачная аналогия. Секретаршам, чтобы пользоваться вордом и пасьянсом ( = ездить на автомобиле) тоже не нужно знать основ алгоритмизации. А тем, кто собирается писать программы самостоятельно ( = ремонтировать или строить автомобили) это рано или поздно понадобится.

Все упирается лишь в уровень претензий обучающегося. Если он собирается основательно застрять в IT, то намного лучше привить себе понимание основ с самого начала (без отрыва от практики, разумеется). Если же просто сайтиками и простенькими программками баловаться, то мануал+IDE в руки и вперед.
естественно, все аналогии фальшивы, и на аналогию всегда найдется другая аналогия (простите за тавтологию).

но мне все же кажется ремонтируют и строят немного другие люди (которые разрабатывают IDE, компиляторы и т.д.)

P.S. сайтики тоже разные бывают ) от простых статических «хомяков» до сложных инженерных и архитектурных решений.
+1 я тоже конечно читал Кормена, почитывал Кнута, но до сих пор практически ничего из этих книжек не пригодилось, все алгоритмы которые там описаны так или иначе давно реализованы и находятся если не в стандартлибах ЯП то в отдельных библиотеках — бери и пользуйся.

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

Поддерживаю подход «просто сесть и начать программировать». Чтобы чему-то научиться нужно что-то делать.
НЛО прилетело и опубликовало эту надпись здесь
Да, действительно, если понимаешь основы, то писать становится проще на всех языках.
Начав с однострочных скриптов на bash, я с легкостью перешел на powershell и C# — на уровне пользовательских утилит — вполне себе, для чего-то системного — разбираться глубже приходится только тогда, когда упираешься в ограничения платформы…
Книги – это хорошо, но практика тоже важна. Чтобы научиться программировать нужно программировать, быть в среде коллег, с которыми можно обсудить возникающие вопросы, которые зачастую описаны в книге на 20 страниц, а делов на 5 минут.

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

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

Кроме книг важно научиться читать сам код, он должен говорить сам за себя. Самый доступный в моем понимании источник хорошего кода – это опенсорс. Открывайте библиотеки, смотрите реализацию конкретных методов, классов и черпайте идеи оттуда — там столько всего интересного! Самый простой способ — заведите аккаунт на github.com, добавьте в watch-list интересующие проекты и следите за коммитами, читайте сурцы, Вы будете всегда в курсе самых последних изменений.

Практиковать программирование нужно на реальных задачах. Существуют системы автоматической проверки решений на разных языках, например codeforces.ru/ или projecteuler.net, там Вы найдете много интересных алгоритмических задач.

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

Удачи в Вашем начинании!
Можно начать с C++ за 21 день, затем начать изучать C# и паттерны программирования.
Если вообще с нуля, то можно сначала почитать IBM PC Фигурнова.
Консультация перед экзаменом по С++ (ведет один мой друг)

— Времени осталось немного, кто еще ничего не знает, возьмите «С++ за 21 день» почитайте, что ли.
— Так у нас экзамен завтра! — Дергается одна студентка, — А можно С++ за одну ночь?

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

ЗЫ с тем же действующим лицом:
Его совершенно невинная фраза была вывешена на студ.форуме/цитатнике:
— Ну что, девочки, раздевайтесь и начнем экзамен.
… дело было зимой…
надеюсь, вы не про этот C++ за 21 день =)
image
НЛО прилетело и опубликовало эту надпись здесь
Если вы хотите стать системным программистом или заниматься наукой, то сборка хороша. Однако если вам в скором времени захочется(а скорее всего очень захочется) писать полезные программы с хорошим функционалом и удобным интерфейсом, то всё-таки вам потребуется что-то другое.
Плюс мотивации обычно добавляют какие-то конкретные успехи(то есть пусть маленькая, но программа). А зубрить книги по алгоритмам довольно скучно, по-моему…
И да, тут люди уже писали, что как бы это плохо не было, но по факту вам вряд ли придется писать свой метод сортировки.
Ну что могу сказать с такой подборкой? только удачи, кстати добавьте туда еще несколько книг по теории вероятности, мат. статистике, высшей математике, мат. логике. А, чуть не забыл в продолжении раскручивания аппаратной темы добавьте еще книги по схеметехнике, если уж бить в основы так прямо в самые что ни на есть. И вы будете рубить фишку в фундаментальных вещах, сможете теоретически делать умопомрачительные выкладки, просто расширите свой кругозор, программировать не научитесь.
Подборка по собственно программированию умопомрачительна просто для начинающего. Без понимания базовых аспектов программирования, вы на ссылках в Си потеряетесь просто. Начните с Java или с того же Pascal, хоть вы и говорите что это не круто. Языки для начинающего значительно проще, уберут кучу нервов.

Книжки по устройству компьютера, операционки Linux можете не читать (Этапы 1,2,3), потом возникнет профессиональная необходимость, возьметесь за них, а сейчас можно не умея собирать компьютер с закрытыми глазами и работая в винде попробовать именно программирование, чем тратить время на книги о вещах, которые для обычного пользователя представляются абстрактными чуть более чем полностью. И кстати потратив время на них (немаленькое между прочим), читая разбираясь внимательно в этом всем новом, многие вещи так и останутся для вас абстрактными и непонятным. К их прочтению надо подойди внутренне и иметь четкое понимание зачем читается эта книга, а с нуля многие книги что здесь приведены просто могу быть тратой времени впустую.

В общем скажите спасибо составителю списка, но он то ли издевается над вами, то ли сам слабо понимает как научится программировать с нуля.
Не совсем согласен по поводу языков для начинающих. На самом деле некоторые вещи в Си гораздо проще осваивать «на свежую голову», чем меньше опыта до этого — тем лучше. После Паскаля или Питона разбираться в указателях совершенно не будет желания. «Зачем? Ведь и без них можно!» скажет вам такой человек. Хотя в этом нет ничего невозможного, это же основы.
Странное рассуждение. На свежую голову как вы говорите, мозг закипит от указателей и их разименования. У человека у которого нет опыта, чаще будет возникать вопрос «зачем такое делать, ведь можно просто так сложить два числа».
Простите, но, видимо каждый должен пройти свой путь.
я 3 раза пытался начать писать на С и читать «С» Ричи и Кернигана, но дальше Hello World дело не пошло.
пол года назад начал писать на bash, PowerShell и сейчас активно изучаю C#, прочитав Троелсена.
для пользовательских утилит не пригодилось ни отличие шин, ни архитектура процессора…
Причем я не спорю, что где-то это критично важно
Да, у меня образование — менеджмент, но с 1996 года занимаюсь администрированием ПК — dos/Win, c 2005 unix.
Выкиньте Троелсена куда подальше :)

Если нужен именно чисто Сшарп — Шилдт либо Альбахари (самое то)
Если нужна какая-то конкретная технология (ASP.NET, WPF, WCF и тд) — то книги именно по этим технологиям, желательно из серии IN a Nutshell… И по ходу изучения освоите особенности шарпа (дотнет это позволяет :) )

Просто у меня была такая же байда: нужна была веб-разработка под дотнет… Тоже заказал книги Троелсена, Нейгела и тд… Чуть не бросил в итоге… Потом взял Альбахари и Сандерсона и за пару недель на достаточном уровне освоил MVC + многое нужное и полезное из Сшарпа…
ну выкидывать зачем? я получил основы WF, WPF, еще что-то, не помню уже.
одну утилиту написал, вторую пишу, сейчас переключился на #wp — имею в голове проект, но сам его точно не потяну — думаю, где искать команду и инвесторов…
Мне кажется название топика надо переделать в «Как ПЕРЕУБЕДИТЬ человека заниматься программированием» :)

1) Архитектура компа и тд для начала можно просто прочитать какую-нибудь обзорную литературу только чтобы понять как представляются числа в компьютере, двоичную и шестнадцатеричную системы ну и совсем базовые понятия о регистрах и тд… Для этого в принципе хватит первых несколько глав из любого учебника ассемблера
2) Кнут и иже с ним… нах-нах-нах )) Эти книги освоили считанные единицы программистов… Их вплотную и серьезно можно изучать только если решили серьезно уйти в CS
3) Язык С на данный момент не так уж распространён, единственное зачем на начальных порах можно выборочно его поизучать — для понятия работы указателей и вроде все…
4) Линукс тоже спорно… Думаю человек который хочет начать программировать хоть какие-то цели уже имеет и может определиться нужен ли ему Линукс или все таки Виндоуз… К тому же на уровне системного админа он ему тоже на стартовом этапе не нужен, хватит книжки-шпаргалки по основным консольным командам…

В целом, если бы вы сказали как вы видите себя в будущем, вам бы более точно посоветовали с чего начать. Ведь вы же не просто так проснулись с утра и решили стать программистом. Вам же захотелось писать крутые веб-проекты, либо писать драйвера и системное ПО под Линь/Вин, либо писать крутые десктопные приложения, либо работать с БД и обрабатывать огромные кол-ва информации и тд и тп…
Скажите что именно вы хотите на данный момент, а то как то слишком абстрактно: «хочу стать программистом»

ПыСы: зато теперь знаю какой план предложить жене для изучения, если вдруг она захочет стать программистом (двух прогеров семья не выдержит :) )

Ну вот насчет нераспространенности языка С зря. Недавно же была на хабре статистика популярности языков, и он был весьма популярен. Кроме того, компилятор для С или С-подобного языка сейчас есть практически для всего, даже для чайника. А на начальных порах, на мой взгляд, его стоит изучать, т.к. 1) он относится к группе структурных языков, на начальном уровне их проще изучать. 2) у многих языков С-подобный синтаксис, будет легче читать программы на других языках. 3) программы на С, как я считаю, сбалансированы в плане понимания — с одной стороны, каждую конкретную строку просто понимать человеку, с другой стороны — каждая строка относительно близко к железу и просто понять, как все работает. Не совсем корректно выразился, наверно, но не получается яснее выразить свои мысли.
Весьма странный список.

Чтобы научиться программировать — нужно садиться и программировать, а не читать книжки по архитектуре процессора и тонкостях linux.

попробуйте почитать про разные мейнстримные языки программирования, их синтаксис, области применения, который больше понравится — за практическое изучение того и беритесь!

Я бы включил в начальный список для ознакомления следующие: java, c#, php, ruby, python, haskell, lisp.

Если же хотите все же более системного подхода — изучите основы C и pascal, т.к. литература по алгоритмам и структурам данных до сих пор вроде к этим языкам тяготеет.
> Я бы включил в начальный список для ознакомления следующие: java, c#, php, ruby, python, haskell, lisp.
Не стоит с этих языков начинать. Первые 2 — вызовут кучу вопросов о том, что такое ООП и как с ним жить. А человек еще даже не знает что такое переменная. Следующие 3 — слишком упростят жизнь динамической типизацией. Опять же, человек не поймет суть переменных. Ну а последние 2 взорвут мозг. Разные парадигмы программирования полезно знать, но не начальном этапе :)
Программирование — такая штука, что тут нужно четко определить для себя сферу, потому что быть спецом в каждой не получится. Если вы собираетесь программировать микроконтроллеры, то план вполне неплохой. Но если хотите делать сайты или разрабатывать мобильные/десктопные приложения, то кучу книжек по архитектуре процессора можно не читать. Минусом не будет, но потеряете уйму времени, за которое можно получить нужные ПРАКТИЧЕСКИЕ навыки.
Я бы такой план сделал:
1. Какой-нибудь учебник по информатике. Где будут основы кодирования данных в памяти, системы счисления и т.д.
2. Небольшой гайд по архитектуре — любой учебник по ассемблеру. Чтобы понять как все это работает на низком уровне (узнаете что такое стеки, регистры и т.д.). Все можно не читать, ваш «сенсей» подскажет где остановиться.
3. Потом брать учебник по Си и, допустим, кнута с его структурами данных. И параллельно учить синтаксис и пытаться на нем реализовывать все эти структуры.
А далее уже выбирать сферу деятельности и читать более подробную литературу.
Имхо, это самый быстрый старт, если под правильным руководством его выполнять.
Еще бы посоветовал Таненбаума «Компьютерные сети». Читается легко и дает понимание как работает современный интернет. Раз уж теперь он — часть нашей жизни, то неплохо бы знать как эта сеть работает :)
И еще замечание: не стоит даже начинать, если нет особой тяги к этому. Толк будет только если это станет вашим хобби.
Тут названа лишь одна годная книга для начинающих.

«Язык программирования Си».

Прочитав ее можно сразу писать программы.

Некоторые комментаторы тут советуют начинать с более высокоуровневых языков вроде питона или C#.
Но это ошибка.
Чтобы писать на этих языках — нужно обладать большим объемом знаний.

Откуда новичку знать какой паттерн в какой ситуации применить? (наверное он вообще о них знать не будет).
В Си же можно брать пример со стандартной библиотеки. И уже будет выходить неплохой код.

А как записать бинарное дерево в файл на С#?
Наверное нужно изучить что такое сериализация.
В Си же все очевидно.

Куда в С# девается память, после того, как она становится ненужна?
А почему так странно работают переменные в C#?
А зачем каждый раз создавать новый класс?

Для ответов на эти вопросы нужно прочитать много умных книжек.

Для Си же достаточно одной книги в 200 страниц.
Есть любые API и библиотеки.

А еще писать можно как хочешь, а не как правильно.
Например в C# нельзя написать if(a1 = a2)
Это может привести к психотравме...
НЛО прилетело и опубликовало эту надпись здесь
Откуда новичку знать какой паттерн в какой ситуации применить?

Мы тут говорим о начальном обучении или о умении проектировать архитектуру? Паттерны и прочее это уже следующие шаги.

В Си же можно брать пример со стандартной библиотеки. И уже будет выходить неплохой код.

Что вы оттуда хотите брать, реализации маллока и fopen, как это связано с паттернами и почему будет получаться неплохой код?

А как записать бинарное дерево в файл на С#?

В случае любого языка это будет делаться новичком так: вбить в гугл «как записать бинарное дерево в файл на [название языка], скопировать код себе в программу.

В Си же все очевидно.

Не то слово. Например как получить размер массива интов? Само собой
int len=sizeof(array)/sizeof(int);

Это вам не какой-нибудь array.Lenght на C#. А почему стоит деление, а не умножение, ответит даже ребенок.

Для ответов на эти вопросы нужно прочитать много умных книжек.

Если вы живете в 1980м. А в 2012 на частные вопросы по мере начала обучения вам ответит гугл.

Для Си же достаточно одной книги в 200 страниц.

Это как посмотреть, для изучения синтаксиса и 200 не надо, а для понимание почему писать if(a1 = a2) нельзя и в С надо прочитать и больше.

А еще писать можно как хочешь, а не как правильно.
Например в C# нельзя написать if(a1 = a2)
Это может привести к психотравме...

Ну да, лучше вместо обучения тратить часы на отлов идиотских граблей из-за опечатки. Это только закалит психику.
Например как получить размер массива интов? Само собой
int len=sizeof(array)/sizeof(int);
Это вам не какой-нибудь array.Lenght на C#. А почему стоит деление, а не умножение, ответит даже ребенок.

Скажите, вот реально где это пригодится? В С размер массива задается при объявлении/выделении памяти под него и размер будет где-нибудь рядом. На ум мне приходит обработка массива функцией. Но что тогда делать, если мне нужно обработать не весь массив, а только его часть? ООП в моем представлении предложил бы такой путь: создать отдельный объекта массива и передать в функцию его. Поправьте меня, если я ошибаюсь. В С логично передавать с указателем на массив и его длину, и тогда обработка части массива свелась бы к указанию «от сих до сих». Без лишних сущностей.
Что до деления/умножения: совсем-то мозги отключать нельзя. Петя купил на рынке яблоки. За них он заплатил 40 рублей. Каждое яблоко стоит 5 рублей. Сколько яблок купил Петя? Не правда ли, задача класса для пятого, если не меньше? И тут есть два подхода — спросить Петю (хотя по логике ООП, как я себе еще представляю, Петя спросит мешок с яблоками, а мешок уже даст ответ) или посчитать самому, потому что Петя может быть тугодумом, говорить только на китайском, а нам вообще могут понадобиться только красные яблоки, а Петя вообще брал, какие попались.
Я считаю, что не стоит все забивать одним молотком ООП, а использовать там, где необходимо.
Я привел вам просто пример того, что в С не «все очевидно.» а есть свои подводные камни, даже в таких казалось бы простых вещах. ООП тут вообще не причем, в том же питоне получения размера сделано функцией len(array), что опять же очевидней и удобней, чем пример на С.

Что до деления/умножения: совсем-то мозги отключать нельзя. Петя купил на рынке яблоки. За них он заплатил 40 рублей. Каждое яблоко стоит 5 рублей. Сколько яблок купил Петя? Не правда ли, задача класса для пятого, если не меньше? И тут есть два подхода — спросить Петю (хотя по логике ООП, как я себе еще представляю, Петя спросит мешок с яблоками, а мешок уже даст ответ) или посчитать самому, потому что Петя может быть тугодумом, говорить только на китайском, а нам вообще могут понадобиться только красные яблоки, а Петя вообще брал, какие попались.

Речь идет о том, что для начального обучения С подходит хуже, потому заставляет расфокусировать внимание. Расфокусировку можно показать на вашем примере: вы готовите пирог и послали сына в магазин за яблоками. По его возвращению, вы спрашиваете «сынок, сколько яблок ты купил, мне надо определиться сколько положить муки», а он вам в ответ «папа, заплатил я всего 105р, а одно яблоко стоит 7р, вот и давай, включай мозги и считай».
Знаете, во всем есть неочевидное, и подводные камни есть в любом языке. И мне кажется нет «универсальной» «удобности».
Насчет расфокусировки — все зависит опять же от мышления. Я бы послал сына сразу за пятью яблоками, потому что столько было написано в рецепте пирога. А надо будет еще яблок — пошлю еще раз, сынок молодой, ему полезно бегать:)
Лично я изучал сначала Basic, потом Pacsal, потом delphi, и только потом C. Чем больше я программирую на С, тем больше понимаю, что он продуман. Да, не всегда он удобен. Но в нем есть логика. А программист, как я считаю, прежде всего должен мыслить логически. Тот же питон построен из соображений удобства. Это очень клевая вещь, но если не научится мыслить логично, то программы будут… творческие. В конце концов, чтобы стать отцом, готовящим пироги, я должен сначала побыть неопытным сынулей, которого гоняют за яблоками. И я буду знать, хотя бы приблизительно, как сын ходит за яблоками. И не буду требовать от него купить там же гвоздей, потому что я так хочу.
Тот же питон построен из соображений удобства. Это очень клевая вещь, но если не научится мыслить логично, то программы будут… творческие.

Тоже самое можно сказать и про С — не научишься мыслить логически, программы будут «творческие». Речь же идет о том, с чего начинать и в данном плане мое мнение заключается в том, что низкоуровневые языки не сделают мышление более логическим, но зато сильно увеличат время и сложность вхождения. А дальше можно менять языки и платформы по мере развития и интересов.
Речь же идет о том, с чего начинать и в данном плане мое мнение заключается в том, что низкоуровневые языки не сделают мышление более логическим, но зато сильно увеличат время и сложность вхождения.

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

В С точно так же есть atoi, pow и т.д. Повторюсь, сейчас не 1980й и для С достаточно библиотек и функция, чтобы так же, как на питоне, не писать базовые вещи, если не хочешь и есть гугл, позволяющий эти функции и библиотеки найти. Просто это будет более громоздко и будет больше шансов ошибиться при использовании. Не один язык сам по себе вам ничему не научит. Если человек захочет разобраться как строка переводится в число — он сядет и напишет эту функцию на любом удобном ему языке. Тут вопрос только начального старта — понять что такое программирование вообще, разобраться с основными понятиями(функция, переменная, условие, цикл), написать «hello world». Для этого питон подходит лучше. Потому идет тренировка логического мышления, изучения алгоритмом и структур данных. И тут уже язык особо не важен, алгоритм быстрой сортировки на С и на питоне остается алгоритмом быстрой сортировки.
Пожалуй, вы все-таки переспорили меня. Спасибо, дискуссия изменила мои взгляды на языки.
>> Скажите, вот реально где это пригодится? В С размер массива задается при объявлении/выделении памяти под него и размер будет где-нибудь рядом.

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

Си какбэ говорит программисту: «Чувааааак, забей, это тебе не нужно. Зачем тебе знать размер массива интов? Он и так где-то тут лежит. Зачем тебе строковый тип? Есть же char со звездочкой. и т. д.» Дисклеймер: это мое личное эмоциональное впечатление, я понимаю, что у кого-то оно может оказаться совершенно другим. Кроме того я знаю, что языки программирования не разговаривают.

Ну, давайте, например, определим, «непофигистичный язык» как язык, который заботится о программисте до такой степени, что в нем даже можно узнать размер массива интов.
Идеальный язык тогда получается тот, у которого один оператор «Сделай мне <...>» (по аналогии с известной кнопкой) :)
Си, на мой взгляд, просто предполагает, что вы лучше продумаете программу. Он дает хороший набор базовых инструментов, из которых можно построить весьма многое.
И я правда все еще не могу придумать хороший пример, где реально нужно определять размер массива. Я везде передаю указатель с длиной.
P. S. И что же такое строка, как не набор (массив) символов?
P. S. И что же такое строка, как не набор (массив) символов?

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

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

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

Можно. Но вы просили пример, я его привел.
Стек у него маленький, а место для отдельной подпрограммы для определения длины, или для хранения этой длины в объекте массива или для какого-то обозначения конца массива есть?

Зачем подпрограмма? Макрос. И если длину мы вычисляем динамически, нам не надо ее хранить.
(Вы когда-нибудь программировали что-нибудь для нашего Тесея или микроконтроллеров с малым числом памяти?).

В промышленном плане нет.
Может, вы приведете еще и пример, для чего на микроконтроллере обрабатывать строки?

Ну один знакомый товарищ делал коробку с микроконтроллером, в котором крутился веб-сервис, который отдавал рестом информацию о текущей температуре в серверной и позволял подать сигнал на выключение стойки. И таки там обрабатывались строки.
Вам не кажется, что МК понятия не имеет о массивах и в любом случае надо будет хранить длину или какую-нибудь метку о конце массива?
Сомневаюсь, что ваш товарищ обрабатывал строки не как набор байт.
Ну на самом деле не обязательно. Если у вас последовательно находятся две структуры(массива) в памяти и вы знаете адреса обоих(выравнивание выключено), то размер получается простым вычитанием адресов. А вообще мы уже ушли в какой-то совершено жуткий оффтоп =)
Да, согласен. Все равно все зависит от конкретного случая.
>> В Си же можно брать пример со стандартной библиотеки. И уже будет выходить неплохой код.

Представил себе: наивный новичок решил взять пример со стандартной библиотеки и посмотреть как же все-таки работает этот printf. А тааааам:
default:
if ((args_type[cnt] & PA_FLAG_PTR) != 0)
args_value[cnt].pa_pointer = va_arg (ap_save, void *);
else if (__builtin_expect (__printf_va_arg_table != NULL, 0)
&& __printf_va_arg_table[args_type[cnt] - PA_LAST] != NULL)
{
args_value[cnt].pa_user = alloca (args_size[cnt]);
(*__printf_va_arg_table[args_type[cnt] - PA_LAST])
(args_value[cnt].pa_user, &ap_save);
}
else
args_value[cnt].pa_long_double = 0.0;
break;
case -1:
/* Error case. Not all parameters appear in N$ format
strings. We have no way to determine their type. */
assert (s->_flags2 & _IO_FLAGS2_FORTIFY);
__libc_fatal ("*** invalid %N$ use detected ***\n");
}


На самом деле, конечно, мировой опыт показывает, что позиция «Си в всем в зубы, а иначе ничего не поймете» она экстремистская. Полно народу изучают питон с нуля за несколько месяцев и начинают реальное практическое программирование. Предположим, я биолог. Или я хочу самостоятельно сделать свой сайт. Зачем мне знать про __builtin_expect.
«Код» Чарльза Петцольда очень рекомендую для начала.
Я бы добавил в список книг для прочтения «Искусство программирования для Unix» Реймонда. Всю ее осилить сложно, но можно прочесть оттуда отдельные главы после овладения базовыми навыками в программировании. Несмотря на название, в книге описываются хорошие принципы unix-программирования, а не программирования _для_ unix.
А еще советую в самом начале обучения пытаться все простые программы выполнять в голове. Расписывать, например, циклы по каждому значению счетчика, записывать, как меняются переменные и т.п. Это кажется бессмысленным и ненужным, но я рад, что мой учитель заставлял это меня делать, т.к. благодаря этому я стал лучше понимать, как работают программы и, как следствие, лучше писать свои.
И, напоследок, как тут уже советовали, лучше больше практикуйтесь, но совсем забивать на основы не стоит. Стыдно признаться, но из-за незнания основ я когда-то в школе для битовых операций переводил число в строку из нулей единиц и обратно.
Кнут? Для начинающих? Да вы сами-то его читали? Это очень суровый академический труд, который читали уже даже больше не программисты, а аспиранты/кандидаты/доктора/ученые, но уж точно не новички.
Прочитайте статью Питера Норвига, о том как научиться программировать за 21 день 10 лет.
norvig.com/21-days.html
А по мне так читать вообще вначале минимально надо. Решите для себя — а оно вам надо? Если надо, то спросите себя зачем? Когда ответите приходите вам расскажут как это сделать. И тогда начнете становится программистом.
Раньше Basic помогал отсеивать мальчиков от мужей.
А сейчас его уже в школе не преподают?
если у вас нет проблем с английским языком, то могу посоветовать просмотреть курс стэнфорда cs106a,
там для первокурсников ( вроде :) ) дается введение в программирование, на примере java,
при том довольно грамотно построен курс, так что бы не окунать слушателя сразу во все ненужные ему пока тонкости

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

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

Настоятельно рекомендую изучить basic и pascal перед С. Вам впарили книжки про старое железо — неплохо и «старые» языки изучить тогда. Их легко изучать на практике, дадут практическое представление о такой вещи как алгоритм (само понятие, это надо изучить первым делом, обычно этому учат в школе, не знаю как щас с этим обстоит), дадут испробовать программирование на вкус — крайне полезно перед тем как садится читать тяжелые книжки в течение нескольких лет.
Зачётный тролинг от вашего знакомого.
> Этап III. Операционные системы
> Шаг 1
> Таненбаум «Архитектура компьютера»
> Шаг 2
> Колисниченко, Аллен «Linux: полное руководство»
> От общей теории переходим к изучению конкретной операционной системы – на примере Linux.
> Немет, Снайдер, Хейн «Руководство администратора Linux»

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

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

Публикации