суббота, 2 августа 2008 г.

Багаж знаний. Часть 1.

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

Ладно, это все мысли вслух. В моем гугловском блокноте записана тема для новой статьи. Записана давно, и кратко мысли набросаны, но я все тяну с написанием, т.к. тема очень обширна, и в "один присест" ее не освоить. Вот, разминаюсь потихоньку легкими статьями про отдых (http://www.alvosoft.com/itlife/2008/07/blog-post.html), организацию рабочего места (http://www.alvosoft.com/itlife/2008/03/blog-post.html) и т.п.

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

  1. какие книги надо прочитать, а какие лучше или не читать, или отложить "на потом";
  2. какие форумы и телеконференции читать;
  3. какая ОС лучше;
  4. какой язык программирования лучший;
  5. рабочий инструментарий программиста;
  6. специализированные знания в определенной предметной области;
  7. знания и опыт, инженерная культура, командная работа.

Ну вот, сами видите: тема ужасна, как я и говорил. Приступаем к погружению в пучины "священных войн"!

Прежде всего, скажу сразу, что я не могу говорить за все специализации: 1С или PHP, ГИС или VoIP- это вещи кардинально разные. Но тем не менее единую "точку опоры", так сказать, "поле боя", выделить можно. Это- молодой специалист (собственно весь блог для этой категории и задумывался). Каков его типичный портрет? Ну все мы в школе, институте проходили уроки информатики. Нам преподавали системы счисления, машинную арифметику, базовые алгоритмы (помните, сортировка "пузырьком", операции с матрицами?). Программирование ведется и поныне на таких языках как Фортран, Бейсик, Паскаль. Те, кто решает сделать своей профессией программирование, обычно на "программистских" специальностях изучают C, C++, и, более углубленно,- алгоритмы. В итоге, "на выходе", мы имеем пылкого молодого человека (или даму), который хочет и "горы своротить" и получить за это кучу денег. Но, при этом, его опыт удручающе мал, и к реальным проектам его нельзя подпускать "на пушечный выстрел".

В итоге, получается активный (желающий сделать карьеру) специалист с нулевым опытом, чисто теоретическим знанием алгоритмов (что это такое знает, а правильно применить пока не умеет), программирующий на C, C++. Попав в реальный мир, он это осознает, и тут же перед ним встают вопросы:

  1. Какие книги прочесть, чтобы набраться практических знаний?
  2. Какую специализацию выбрать: остаться C++ программистом или пойти в 1С, уйти в область программирования банковского ПО или писать драйвера?

Старожилы программистских форумов, узнаете эти вопросы? Не проходит и недели, чтобы кто-то не задал один из этих вопросов в каком-либо форуме или телеконференции для программистов. И часто те же молодые специалисты затевают в форумах очередные "священные войны". Вот их, молодых и сомневающихся, активно впитывающих любую информацию, и еще не определившихся, я и выбрал как площадку для "священных войн".

Книги

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

Сначала надо прочесть Страуструпа "Язык программирования C++. Специальное издание": http://www.books.ru/shop/books/84700. Эту книгу надо прочесть любому программисту: 1С, web-программисту, программисту баз данных и программистам других специализаций. Будьте готовы к порой весьма занудным философским отступлениями. Не пропускайте их и не забрасывайте чтение. Помните: Страуструп не только создатель C++, он преподаватель с многолетним опытом. Стиль изложения материала в книге выверен годами преподавания, все философские отступления делаются не зря: значит эти занудные места важны, и автор, видимо, не раз сталкивался в непониманием сути того, что он пытается объяснить. Уделите внимание разбору приводимых примеров: отменная подборка материала! Многие опытные программисты нередко обзывают книгу "художественным чтением на ночь", призывая читать стандарт. Однако, они забывают, для кого написана эта книга (см. ее введение). Книга полезна не только для программистов C++, но и вообще для всех программистов, т.к. в большинстве современных языков программирования реализованы и ООП, и шаблоны, и перегрузка операторов, и т.д. А похожий синтаксис у C++, Java, C# делает понятными приводимые на C++ примеры в книге большинству программистов. В общем, моя рекомендация- начинать укреплять свои знания с этой книги. После изучения этой книги вы научитесь подходить к решению задачи с правильной стороны, и уж точно избежите участи стать "кнопочкокидателем на формочки".

Для подковывания знаний в области алгоритмов: Дональд Кнут, "Искусство программирования": http://www.books.ru/shop/books/7231. Несколько томов исчерпывающего материала по различным алгоритмам. Выберите на свое усмотрение тот том, который, как вам кажется, наиболее полезен будет для вас, как в смысле применения почерпнутых знаний на работе, так и для ликвидации пробелов в ваших знаниях. А далее вы уже решите сами, надо ли вам читать остальные тома.

И все- этого уже будет достаточно, чтобы стать конкурентоспособным на рынке труда, но еще недостаточно, чтобы стать хорошим программистом. А для этого нужен еще и опыт. Опыт получается только постоянным трудом и никакие книги тут не помогут. Именно поэтому я не рекомендую к прочтению достаточно популярные книги:

  1. "Рефакторинг: улучшение существующего кода": http://www.books.ru/shop/books/30436;
  2. "Архитектура корпоративных программных приложений": http://www.books.ru/shop/books/156126;
  3. "Приемы объектно-ориентированного проектирования. Паттерны проектирования": http://www.books.ru/shop/books/8451.

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

Для тех, кому понравился C++, советую обратить внимание и на другие рекомендации: http://alenacpp.blogspot.com/2006/09/blog-post_19.html.

(Продолжение следует...)