Какую литературу читать начинающему программисту?
===================================================

 Всем добрый день.   

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

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

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

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

  

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

 Прочитайте «Код» Петцольда, его как раз недавно переиздали. 

 1. Ну наконец-то, хоть один среди сотни потоковых вопросов от начинающего с самоанализом, мотивацией и пояснением проблем, на которых ХОЧЕТСЯ ответить.   

Значит - человек действительно заинтересован в теме.  

2. "Кажется, что я мало знаю и упускаю время," - извините, но "быстро только кошки родятся". Я понимаю, под шквалом книг по типу "От азов до вершин мастерства за 7 дней" или курсов "Сделаем из новичка профессионала за полтора месяца" такие мысли вас будут "доставать". Плюньте и забудьте. Быстро можно только нахвататься и так же быстро забыть. Реальные знания быстро не приобретаются, хотя-бы потому, что учеба - это в первую очередь работа, умственная и весьма тяжелая. А не легкая забава, как кажется из анонсов сотен видеокурсов. Поэтому - настройтесь на работу. Не важно, что вам кажется - вы с каждой прочитанной и обдуманной страницей книги приближаетесь к цели - стать профессиональным разработчиком. Ну, и правила 10000 часов никто не отменял, хотя многие думают, что они-то - гениальны и могут обмануть психологию.  

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

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

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

6. Еще я бы посоветовал хотя-бы первичное знакомство с организацией Баз данных и SQL. Любая книга подойдет для начального ознакомления. От Дейта до Нестерова.  

7. Современному программисту, чем-бы он не занимался, необходимо понимание сетевых технологий и архитектур. Тут тоже можно начать с того-же Таненбаума или Олиферов, но более доходчивой книги, чем Куроуз и Росс - я не встречал.  

  

Вот, примерно такой Roadmap для новичка, который хочет (в будущем!) стать профи на время летних каникул. 

[Какую книгу можете посоветовать?](https://qna.habr.com/q/536506) 

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

  

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

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

То что вы берете такие серьезные книжки, это хорошо но задайте себе вопрос оно вам надо? Если вы не собираетесь работать в этих направлениях оно вам надо? Не слушайте всех этих умников которые говорят: "Без знания С/С++ нельзя изучать С#", или еще мое любимое "Без знания как устроена архитектура или как работает компьютер вы никто", тут просто надо брать и слать их куда подальше, из этих всех умников учеными(или те кто реально добьется результата) станут от силы 3-5%, остальные будут обычными задротами как принято их называть, и этих задротов очень легко эксплуатировать за меньшую ЗП(в какой-нибудь захудалой конторке, где они будут тешить свое ЭГО при приеме на работу, и выносить мозги этим). Конечно я могу утрировать но факт есть факт.  

В подкрепление моего абзаца скину вам видео от позитивных парней на эту тему.  

<https://www.youtube.com/watch?v=ip66mO6sdf8> 

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

  

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

  

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

  

> В связи с этим я начала искать литературу для изучения в свободное время

  

Для начинающего важнее больше писать, чем читать.  

  

> и поняла для себя, что нет смысла читать книги по типу Кнута о самой парадигме программирования

  

Есть такое.  

  

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

  

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

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

  

> Я знаю, как решить задачу - но как сам компьютер делает то, что я пишу в коде? Для меня это просто магия: скомпилировала и вот, держи результат. А как это все прошло внутри компьютера, для меня большая загадка. 

  

Это не так важно для начинающего.  

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

  

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

  

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

  

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

  

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

Как работать с библиотеками, как написать свою и пользоваться ею.  

Как работать с сетевыми технологиями - банальные запросы по http, можно и сокет позже копнуть.  

  

>  и также, возможно, на что ещё стоит обратить внимание начинающему программисту и изучить именно с точки зрения теории, а не "искусства программирования". 

  

Теории особо нет смысла. Нужна практика.  

  

На каком-то простом уровне необходимо освоить следующие вещи:  

  

Работа с базами данных - в любой программе чуть больше helloworld есть куча данных. Чаще всего их хранят в какой-то базе данных. Следовательно что-то простенькое надо осилить - sql (например sqlite или mysql), как с этим работать готовыми клиентами, как с этим работать из вашей программы.  

  

Как работать с JSON  

  

git - сейчас это требуется вообще везде.  

  

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

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