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

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

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

Предметная область


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

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

Что такое предметная область в рамках данной статьи? Я бы разделил ее на две основные части: натуральная и производная. «Натуральной» предметной областью будем считать некую систему, которая существует в природе или является научным знанием. К примеру, коммерческая организация или физика, как наука. «Производной» предметной областью будем считать некую систему, которая существует в рамках программного обеспечения, основывается на натуральной и создает ее уникальную производную.

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

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

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

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

Технологии


Многие начинающие программисты задают один и тот же популярный вопрос: «Какой язык программирования учить?». Суть проблемы в неправильности вопроса, потому что язык программирования является лишь средством выражения.

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

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

Технология «Операционная система»

Windows, Linux, MacOS, Android и т.д. Почему важно знать окружение в котором выполняется ваше ПО? Потому что во многих случаях это определяет то, как вы можете решить ту или иную задачу. Почему ОС это технология? ОС является технологией, потому что различные реализации ОС, позволяют решать одни и те же задачи, причем схожим образом.

Изначально я, как и многие молодые специалисты познакомился именно с Windows. В дальнейшем, читая в интернете о том, что Linux это круто, Linux это совсем другой мир, я так и не осмелился с ним познакомиться, просто не надо было. Но время шло, и появились задачи, в рамках которых нужно было настроить VDS, на которой стоял Debian.

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

Ну, командная строка это самый минимум, на самом деле в операционных системах вообще мало чего уникального. Есть такие технологии как «Файловая система», «Разграничение прав доступа», «Работа с устройствами», «Взаимодействие с другими ПК» и многие другие. Реализация разная, но суть одна. Поэтому давайте становимся лишь на одном совете начинающим: изучите как минимум две операционные системы, скорее всего это будет Windows и один из многочисленных дистрибутивов Linux. Это значительно расширит и укрепит ваши знания.

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

Технология «Платформа»

Помимо понятия платформа как определенная ОС, часто слово платформа используют для определения вида приложений: Desktop, Web и Mobile. Это довольно важное разделение, так как для каждой из этих платформ характерны подходящие только для нее технологии. Язык программирования, а точнее технологии с которыми он позволяет работать, напрямую связаны с платформой.

Часто можно услышать словосочетание web-разработчик или mobile-разработчик, это определяет платформу и технологии, с которыми лучше всего знаком программист. К примеру, для web-разработчика основными технологиями будут: протокол HTTP, язык разметки HTML, язык стилей CSS, язык для динамического изменения разметки JavaScript и т.п.

Технология «Хранение данных»

Основные реализации: базы данных, файлы. Основные СУБД: MySql, Oracle, SQL Server, PostgreSQL, SQLite и д.р. Отдельно стоит сказать о языке запросов к БД, который называется SQL. Помимо стандарта этого языка, который, как мне кажется, полностью не реализован ни в одной СУБД, существует множество диалектов, которые часто зависят от самой СУБД.

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

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

Технология «Передача данных»

Здесь конечно пойдет речь о протоколах. Самый распространенный протокол HTTP/S в основном использовался для передачи контента интернет страниц, на данный момент широко используется в web сервисах. Далее стоит упомянуть протоколы TCP/IP и UDP, которые широко используются для передачи информации между двумя ПК.

Здесь очень важно понимать, что протоколы имеют уровни. К примеру, IP, TCP и HTTP являются протоколами трех разных уровней. Задача одних уровней организовывать передачу данных на уровне ПК-ПК, задача других передавать определенные запросы и формировать на них ответы. Лучше это объяснено в модели OSI и на картинке, а от себя лишь добавлю, что чаще всего программисты используют протоколы прикладного уровня.



Технология «Язык программирования»

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



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

Следующим важным свойством языка является то, с какими «платформами» он может работать. Есть языки, которые работают на нескольких «платформах», есть которые только с одной. К примеру, на языке C# можно создавать Desktop приложения, а так же можно писать Web-сайты и создавать приложения для Mobile. А к примеру PHP подходит только для создания Web-сайтов.

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

Более высокого уровня понимания языков можно добиться изучением языков со схожими или различными парадигмами. А лучшего понимания «платформы» можно добиться изучением разных языков в рамках одной «платформы».

Технология «Основные фреймворки и библиотеки»

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

Фреймворки отличаются от библиотек, тем, что фреймворк выступает как основа приложения, а библиотека, как часть приложения.



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

Для примера, если вы планируете разрабатывать приложения для Desktop на языке C#, то вам придется ознакомиться с технологией реализации пользовательского интерфейса. На данный момент существуют две основные ее реализации это WinForms и более современная WPF, обе эти реализации являются часть .NET Framework.

Если же вы планируете создавать сайты для Web на языке C#, то существует две основных альтернативы, первая это WebForms, а вторая это MVC.

При необходимости вести логи в языке C# часто используют библиотеку log4net. А при создании сайтов и использовании языка JavaScript довольно часто используют библиотеку jQuery. Для языка C++ часто упоминается библиотека Boost.

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

Инструменты


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

Инструмент «Система управления версиями»

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

Инструмент «Виртуальная машина»

VMware, VirtualBox и другие системы управления виртуальными машинами позволяют вам создать виртуальный ПК и установить на него ОС. Эта система является очень удобной, так как на одном физическом ПК у вас может быть установлено несколько виртуальных машин. Это позволяет вам иметь несколько ОС на одном ПК. Позволяет испортить ОС на виртуальной машине и вам не придется долго переустанавливать ее. Ведь часто системы управления виртуальными машинами имеют возможность «зафиксировать» состояние виртуальной машины и вернуться к нему в любое удобное для вас время.

Инструмент «Среда разработки»

Среда разработки является самым основным инструментов, с которым ежедневно работает программист. Для языков относящихся к .NET Framework и для С++ под Windows это скорее всего будет Visual Studio. Для Java это будет IDEA, NetBeans или Eclipse. Так же большинство сред разработки поддерживают расширения и некоторые из них очень широко распространены. К примеру, для Visual Studio очень популярен Resharper.

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

Выводы о технологиях и инструментах

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

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

Комментарии (14)


  1. rsi
    18.05.2015 13:34
    +7

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


    1. alllie Автор
      18.05.2015 13:51

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


      1. ragequit
        18.05.2015 14:26

        Раздражающая КДПВ. Шлюхи не нужны.


        1. alllie Автор
          18.05.2015 14:33

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


      1. OlegTar
        18.05.2015 15:35

        Мне кажется минусовали за «капитанскую» статью (типа чем больше знаешь, тем лучше). Но с новым названием статья смотрится уже нормально, и «капитанство» в тему!


        1. alllie Автор
          18.05.2015 15:56

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


  1. nightvich
    18.05.2015 15:02
    +3

    На мой взгляд, тема не раскрыта даже в минимальном объёме. Как введение в «терминологию программиста» из статьи можно выдернуть ~10 предложений, остальное — «вода».


    1. alllie Автор
      18.05.2015 15:22

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


      1. egorsmkv
        18.05.2015 15:55
        +2

        По-моему, название «Ликбез — как стать программистом» неправильно отражает содержание статьи, более подходящее, например, «С чем познакомится программист в своей работе».


  1. Zibx
    18.05.2015 18:28
    +1

    На php можно писать десктопные приложения, уже 10 лет назад когда я ещё использовал этот язык были соответствующие средства, а сейчас вообще есть qt биндинги. Это не целевое использование, но язык которые знает много народу обычно быстро начинает становиться языком общего назначения.


    1. alllie Автор
      18.05.2015 18:39
      +3

      С одной стороны я этого не знал. С другой стороны, это не меняет сути дела. Один из главных посылов статьи — использовать более подходящие технологии в определенных местах. К примеру на C++ можно писать много чего, даже сайты, но я не стал бы этого делать, просто потому что это очень неэффективно. Вот лично я считаю, что начинающим программистам нужно держаться как можно дальше от таких вот нецелевых использований. Знание различных технологий и различных языков программирования дает возможность сделать более правильный выбор. А если человек знает только одну реализацию какой либо технологии, то и выбора у него нет.


      1. stychos
        25.05.2015 18:55

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


        1. alllie Автор
          25.05.2015 20:15

          То есть вы хотите сказать, что C++ используется как один из мейнстримовых языков для разработки веб-сайтов?

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

          Почему виртуальные машины, по вашему мнению, не являются инструментом для большинства проограммистов?

          Если вы конкретно про заголовок, то соглашусь. Если же мы говорим про суть статьи, то суть статьи состоит из 2 частей.
          1. Разбить понятие «программирование» на более, конкретные части. Дать новичкам представление о том, что программирование это не просто язык программирования, а еще большое кол-во других технологий и инструментов.
          2. Ввести понятие «технология» и акцентироваться на нем. Без этого Git, Subversion, Tfs выглядят просто отдельными программами. Когда мы вводим понятие технология или категория программных продуктов, то мы автоматически объединаем данные программы. Но понятие «технология» дает описание сути этих программ. Именно поэтому в данной статьи даны описания технологий, а не просто их перечисление.

          Давайте больше конкретики по поводу «курица-яйцо-цыплёнок», как вы считаете это должно выглядеть?


          1. stychos
            25.05.2015 23:28

            Попробую как и Вы, по порядку. Только для начала оговорюсь, что программист я весьма так себе, самоучка без образования и серьёзного стажа, и всё выше- и нижеизложенное является my humble opinion'ом (тот же пресловутый С++ я, честно, не знаю).

            Про С++ и веб — конечно, С++ не является мейнстримом в вебе. Но. Если человек хочет стать действительно серьёзным программистом, он должен знать, что мир вертится не только вокруг «веб-ориентированных» языков и технологий, а также то, что в серьёзных высоконагруженных системах ему придётся иметь дело с С++ в вебе, что ему придётся в угоду производительности/отказоустойчивости/доступности/нужное_подчеркнуть размазывать его стройненький фреймворк не только различными частями по различным аппаратным составляющим, но и применять при необходимости low-level технологии, в том числе и С/С++. Но до этого он должен узнать, что есть там всякие веб-технологии, есть всякие языки, паттерны и фреймворки к ним, что есть высоконагруженные и высокотребовательные по всяким безопасностям и прочему системы, со временем понять, что те же базы данных могут жить фрагментарно на кластерах, что они могут быть не только транзакционные, но и всякие key-value, и что это вообще большая и больная тема, а также то, что узкое горло частенько возникает в том числе и по причинам чисто техническим, которые решаются множеством путей, с виду вообще никак с веб-ориентацией не связанных.

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

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

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

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