Разработчик с – Разработчик C#: Microsoft developer — .NET разработчик | GeekBrains — образовательный портал | GeekBrains

Содержание

Курс Профессия разработчик на С++ с нуля. Обучение на разработчика на С++ онлайн

  • Я никогда не программировал. У меня получится?

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

  • Какой график обучения? Получится ли совмещать его с работой?

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

  • Сколько часов в неделю мне нужно будет уделять учёбе?

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

  • Я могу общаться с преподавателем?

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

  • Действуют ли какие-нибудь программы рассрочки?

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

  • А я точно смогу трудоустроиться?

    Да, мы помогаем выпускникам с подбором вакансий и готовим к собеседованиям.

  • Требуется «Разработчик драйверов C/С++» — Хабр Карьера

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

    Мы ищем опытного программиста для усиления нашей дружной команды! 

    Обязанности:

    1. Разработка драйверов для устройств аудио и видео захвата.
    2. Сопровождение написанного кода.

    Требования:

    • Опыт низкоуровнего программирования на C/С++ от 3-х лет (OS Windows, Linux).
    • Уверенное знание OS kernel API, моделей WDM,  AVStream, KMDF/UMDF, V4L.
    • Понимание устройства шины PCI/PCIe
    • Умение писать качественный и аккуратный код, работающий 24/7
    • Умение профилировать и оптимизировать
    • Умение пользоваться отладчиком!!! (WinDBG, GDB)
    • Умение работать в команде
    • Умение разбираться в чужом коде.
    • Умение работать в команде (svn, jira).
    • Технический английский.

    Плюсом будет:

    • Знание сетевых технологий, в частности – стека TCP/IP, будет плюсом также знание протоколов (SNMP, IGMP, и т.д.)
    • Опыт разработки драйверов сетевых адаптеров под OS Windows  (в т.ч. знание модели NDIS, подсистемы winsock kernel)
    • Опыт разработки системных приложений под Linux
    • Опыт настройки и запуска ядра Linux на аппаратных платформах x86 и ARM (##IVS## ???)
    • Знание стандартных интерфейсов SDI, HDMI, DP, VME, UART, SPI, I2C, USB.

    Условия работы:

    • Достойная заработная плата.
    • Удобное рабочее место в уютном новом офисе, обеспеченное всем необходимым для работы (2 монитора, производительное железо, коммерческое ПО).
    • Гибкий график работы (начало рабочего дня в период с 8.00 до 11.00).
    • Опытный коллектив, широкие возможности профессионального роста.

    Бонусы

    Премии по результатам окончания этапов/проектов.

    Требуется «Разработчик С++» — Хабр Карьера

    Компания «Такском» — лидер рынка по разработке и внедрению программ защищенного электронного документооборота для бизнеса.

    Мы специализируемся на создании современных IT-сервисов, обеспечивающих обработку, хранение и предоставление цифровых данных

    В связи с активным развитием проектов, в рамках новых продуктовых направлений, в нашей компании открыта вакансия Разработчик C/C++ под OC Windows и Linux

    Особенности проекта: возможность хранить данные в облаке, высокая нагрузка, надежность 24/7, расширяемость и криптографическая защита информации

    Вас ждет:

    • Разработка программного обеспечения на языках C/C++ под ОС Windows и Linux, работающего в режиме 24/7 в условиях высоких нагрузок
    • Контроль качества кода, сроков проекта
    • Участие в проектировании и развертывании тестовой среды
    • Участие в доработке различных модулей существующего решения в соответствии с поступающими системными требованиями
    • Исправление ошибок, выявление и анализ узких мест производительности, поддержка существующего кода
    • Участие в проектировании и развёртывании тестовых сред и стендов, оптимизация процессов и инструментов разработки, поддержка практик и инструментов Continuous Integration

    Для нас важно:

    • Хорошие знание языка C++ 11 (или более высоких стандартов)
    • Умение разбираться в чужом коде
    • Опыт проектирования многопоточных многоуровневых систем
    • Умение писать быстрый, надежный, поддерживаемый код
    • Навыки самостоятельного построения архитектуры приложения в рамках концепта архитектуры
    • Опыт командной разработки
    • Опыт работы с реляционными СУБД
    • Понимание JSON и XML (преимущества и недостатки)
    • Опыт работы с stl, boost, WinAPI, Posix, MS SQL Server

    Будет плюсом:

    • Желание освоить C# или Java
    • Опыт разработки кроссплатформенного ПО

    Мы предлагаем:

    Профессиональное развитие в крупной IT-компании

    Поставленные процессы:

    • налаженный цикл разработки ПО
    • Agile (Scrum, Kanban)
    • хорошее техническое оснащение (мощное железо, дополнительные мониторы и все, что нужно для работы)

    Комфортные условия работы:

    • кабинетная планировка офиса
    • гибкое начало рабочего дня
    • креативные зоны для обсуждений
    • современные оборудованные кухни, свежемолотый кофе

    Заботу о Вашем здоровье и досуге:

    • ДМС для сотрудников и членов семьи (включая стоматологию)
    • страхование жизни
    • врач-терапевт в офисе
    • корпоративный спорт (футбольная и волейбольная команды)

    Официальное оформление:

    • соблюдение ТК РФ
    • белая заработная плата (определяется по результатам технического собеседования)

    Удобное расположение офиса:

    • м. Нагатинская (3 мин. от метро)
    • Наличие бесплатной парковки

    Дополнительные инструкции

    С уважением,

    Кочеткова Елена,

    Ведущий менеджер по персоналу

    Группы подбора и адаптации персонала

    ООО «Такском»

    Тел.: +7 (495) 730-11-97 доб. 2177
    e-mail: [email protected]

    https://hr.taxcom.ru

    www.taxcom.ru

    Требуется «Разработчик С++» — Хабр Карьера

    НТЦ ПРОТЕЙ — российская IT-компания, более 15 лет работающая в сфере телекоммуникаций. Мы занимаемся разработкой и производством собственных программно-аппаратных продуктов и решений, которые используются операторами мобильной и фиксированной связи (в России и за рубежом), в общественной безопасности, силовыми структурами.

    В связи с увеличением объёма работ у нас открыт ряд вакансий в разработке ПО — в направлениях 

    СОРМ и DPI (глубокий анализ трафика в сетях связи).

    Ваши задачи:

    • Разработка серверного ПО (backend) для телекоммуникационного оборудования
    • Реализация нового функционала + поддержка и развитие имеющегося
    • Взаимодействие в команде (3-5 человек) и с другими отделами разработки, QA, технической поддержкой

    Разработка на C++ под Linux. IDE — удобная Вам, мы предпочитаем Qt Creator.

    От Вас ожидаем:

    • Уверенное знание C++ и принципов ООП, цикла разработки ПО, основных характеристик качества кода
    • Опыт разработки приложений на С++ от 1 года
    • Готовность разбираться в чужом коде, навыки рефакторинга кода
    • Опыт использования одной или более VCS/DVCS (SVN, Git, Mercurial)
    • Опыт работы с Linux
    • Английский язык — технический

    Вашим плюсом будут:

    • Опыт сетевого программирования
    • Опыт многопоточного программирования
    • Опыт разработки приложений под Linux
    • Опыт модульного тестирования ПО (xUnit, GoogleTest, GoogleMock)
    • Опыт профилирования ПО (gperftools, gprof, valgrind)
    • Знание работы протокола сигнализации SIP, передачи голоса в IP-сетях

    Мы предлагаем:

    • Официальное оформление по ТК РФ с первого рабочего дня
    • Гибкий график
    • Возможность совмещения с учёбой (неполной занятости)
    • Современный, просторный офис в 10 минутах ходьбы от ст. метро Выборгская (чай, кофе, родниковая вода и оборудованная кухня; кондиционеры во всех помещениях). Для удобства работы большинство рабочих мест оборудовано двумя жидкокристаллическими мониторами
    • Заработная плата обсуждается индивидуально с успешными кандидатами + пересматривается не реже одного раза в год с учетом изменений на рынке труда в Санкт-Петербурге
    • ДМС, компенсация питания, корпоративные мероприятия

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

    Если Вы хотите работать в команде профессионалов, участвовать в разработке систем национального масштаба с использованием самых передовых технологий — откликайтесь на вакансию, пройдите отбор и приходите в нашу дружную команду!

    Дополнительные инструкции

    Оставить свой отклик можно написав в личные сообщения или на нашу почту [email protected]

    Предприятие / 1С corporate blog / Habr

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

    Если коротко ищем тех, кто:

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

    Чтобы показать детальнее, каких разработчиков мы ищем и как, мы взяли короткие интервью у нанимающих менеджеров нашей компании. Вопросы в ходе интервью задавались такие:
    • Какие вам нужны разработчики?
    • Что спрашиваете на интервью?
    • Какие вопросы предпочитаете на интервью – теоретические или практические?
    • Должен ли программист писать тесты?
    • Задаете ли вопросы не из профессиональной сферы деятельности?
    • Задаете ли логические задачи на сообразительность, не связанные непосредственно с программированием? Типа задачи про шарик с гелием в машине:


    В каких областях у нас могут работать программисты в разработке платформы? Ну например:


    Группа интернет-разработки


    Группа пишет онлайн-сервисы, которыми пользуются, наверное, миллионы конечных пользователей продуктов 1С. Сервисы, например, позволяют по ИНН получить информацию о контрагенте, проверить надежность контрагента, и т.д. Область деятельности очень ответственная, сервисы работают под большой нагрузкой, простои в работе сервисов крайне нежелательны, поэтому стараемся создавать максимально надежный продукт. А еще делаем продукт под названием Система Взаимодействия. Это механизм, передающий информацию между клиентскими приложениями и серверами 1С:Предприятия; с его помощью, в частности, реализован встроенный в приложения 1С мессенджер.

    От разработчика хочется, чтобы он разрабатывал продукт в целом — анализировал потребности пользователей, продумывал архитектуру, писал код. Потому что часто приходят на интервью люди и говорят – мне неинтересно анализировать предметную область, я хочу, чтобы аналитик написал мне ТЗ, по которому я запрограммирую функциональность. То есть человеку интересны только технические моменты программирования. Мы таких людей стараемся не нанимать, т.к. команда у нас небольшая, заниматься приходится большим количеством смежных областей. Поэтому основные требования, не связанные с профессиональными навыками – это умение красиво и аккуратно оформить требования к продукту, продумать реализацию, разработать продукт и отвечать за конечный результат. Важна личная заинтересованность человека в качестве конечного продукта, чтобы человек делал продукт, которым сам хотел бы гордиться.

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

    Как проходит собеседование? У нас есть анкета, около 10 вопросов, которые мы задаем соискателям. Вопросы в анкете не теоретические, а практические, например – код вызвал исключение с таким-то стек-трейсом, объясните, что вы будете делать. Или – у вас есть запрос в базу данных, который выполняется медленно (текст запроса дается), есть план запроса, оцените – что в плане запроса плохо, надо объяснить, как ускорить запрос. Нет смысла спрашивать человека, какие есть типы JOIN-ов — разумеется, он знает эти типы, если хоть немного готовился к собеседованию. Интересен практический опыт использования этих JOIN-ов. Если человек имеет опыт анализа планов запросов – для него не составит труда рассказать про пути решения проблемы, если нет такого опыта – книжка тут не поможет. Как раз тут проходит грань, отличающая разработчика, который просто читал про функциональность, от разработчика, который эту функциональность действительно использовал. Иметь дело со вторым типом разработчика нам более интересно, хочется, чтобы человек сразу «включился в игру».

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

    Еще мы хотим, чтобы разработчики грамотно писали тесты; например, чтобы в сигнатуре теста описывался контракт, которому должна удовлетворять система. Это можно делать, например, на Java в стиле, рекомендованном Роем Ошеров, когда название контракт-метода делится на три части – «дано», «что ожидаем», «какой результат». А можно делать на Groovy, используя Spock. Важно, понимает ли кандидат, что именно надо тестировать, надо ли тестировать граничные значения, знает ли он про пирамиду тестирования и т.п.

    Еще спрашиваем о проектах, которыми человек занимался, особенно если в них использовались релевантные нам технологии. Например, мы используем Hazelcast, его пока мало кто использует в production (из недавних крупных внедрений – в Яндекс.Деньгах), и нам очень интересны люди с опытом использования Hazelcast. Более того, кандидат может раскрыть нам неожиданные и полезные стороны новой технологии, про которые мы пока не знаем.

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

    Должен ли программист писать тесты? Должен, но не все. Юнит-тесты программист должен писать безусловно. Кстати, мы в команде не настаиваем на обязательном применении каких-либо методик, например, TDD; некоторые разработчики используют TDD по собственной инициативе, им так нравится. Также пишем интеграционные тесты. Разработчики делают также нагрузочное тестирование, пишут планы тестирования для JMeter.


    Хотя мы и разрабатываем веб-клиент на JavaScript, предпочитаем, чтобы у кандидата помимо опыта веб-разработки на JavaScript был опыт разработки на «классических» ООП языках – С++ или Java или C#. Это связано со спецификой проекта; веб-клиент 1С, написан на JavaScript, но больше по идеологии напоминает приложение, написанное на ООП языке. Код на JavaScript мы покрываем аннотациями JSDoc, благодаря этому при сборке происходит статическая проверка типов. Этот подход был выбран потому, что мы используем Google Closure Compiler, помогающий нам, в частности, увеличивать быстродействие нашего кода и снижать объем потребляемой им памяти. Таким образом, ООП-опыт будет большим подспорьем для кандидата.

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

    Есть пул задач на специфические знания по верстке, по JavaScript. Например, рисуем на листке бумаги структуру HTML страницы (структура может быть динамической, меняться во времени по определенному алгоритму) и просим написать код, который создаст такую структуру и реализует ее в динамике.

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

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

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

    Группа повышения масштабируемости приложений


    Кто мы

    Наша команда – эксперты в области построения высоконагруженных систем на платформе 1С:Предприятие. Эти инженеры решают задачи обеспечения надежности и масштабируемости. Такие задачи часто находятся на стыке вопросов администрирования и разработки. Результатом решения таких задач является действительно классно работающая система. Примеры таких задач:
    • развернуть отказоустойчивую инфраструктуру в двух ЦОД и провести моделирование отказов,
    • обеспечить неухудшение производительности системы с увеличением числа пользователей в 10 раз, ускорить многочасовой расчет себестоимости в 3 раза,
    • расследовать и устранить возникающие взаимоблокировки,
    • обеспечить согласованное восстановление более десятка распределенных информационных баз на момент времени с учетом обменов между этими базами.

    И это далеко не полный список задач. Особенно приятно, что многие из задач попадают к нам с формулировкой: «Это вообще возможно сделать?» Т.е. люди сначала не верят. Мы не спорим и всегда стараемся убедить попробовать проверить на практике, сделать. К этому нужно прибавить готовность подключиться посреди ночи к системе крупного клиента, потому что у местных инженеров что-то сломалось, и никто не знает что делать. Не один раз приходилось восстанавливать разрушенную базу при отсутствии бэкапов или выяснять, почему нагрузка на систему выросла на 5%. При желании можно даже почитать отзывы о нашей работе.
    Кого мы ищем

    Мы ищем инженеров, которые страстно хотят делать невозможное. Одно из самых важных требований к кандидату – горящие глаза, желание и умение быстро разбираться в том, с чем раньше не сталкивался, используя уже имеющиеся знания. Это инженеры по надежности и разработчики в одном лице. Представьте, что вам обращается клиент с несколькими тысячами пользователей и рассказывает, что пытается запустить в работу сложный механизм, который разрабатывали его инженеры в течение года. И кстати:
    • ещё не успели закончить разработку в условиях постоянно изменяющихся требований от бизнеса клиента;
    • пока разработка ключевых механизмов на внедрении в самом разгаре, инженеры ещё не добрались до тестирования механизма с тысячами пользователей;
    • даже сейчас никто понятия не имеет, почему с увеличением числа пользователей на этом внедрении ровно в этом механизме резко падает производительность;
    • разработку вели в Windows и с СУБД MS SQL Server, а на финальном этапе было принято политическое решение внедрять в CentOS и с СУБД PostgreSQL, чтобы оказаться в центре течения импортозамещения;
    • а ещё вы случайно выясняете, что возникают таймауты при работе даже 10 пользователей;
    • вам нужно посчитать оборудование для этого механизма, потому что клиенту его надо было закупить в прошлом месяце;
    • вы понимаете, что вам нужно проработать параллельную реализацию алгоритмов в этом механизме, согласовать их с коллегами и вместе решить, как вы успеете в срок, не привнеся новых ошибок.

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

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

    Проблема многих кандидатов в том, что они не умеют применять имеющиеся у них знания и не могут объяснить их шестилетнему ребенку. Именно поэтому на собеседовании периодически просим научить нас чему-нибудь, в чем кандидат лучше всего разбирается. Естественно очень хочется набирать людей, у которых многому можно научиться. В таких обсуждениях очень важна глубина знаний и очень хорошее понимание. Был опыт, когда в 7 утра собеседовали кандидата, пришли к обсуждению компонентов управления памятью в MS SQL Server и в итоге остановились на понимании страниц и экстентов. Тут вмешался HR, мол: “Что мы его мучаем?! Кто это вообще знает!?“, и мы вышли из комнаты поговорить. По коридору случайно проходил сонный и зевающий коллега в направлении кофе. Коллеге были заданы те же самые вопросы, он ответил четко, правильно, по существу, не открывая один глаз и продолжая зевать.

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

    Ещё один способ – попросить кандидата представить себя на месте разработчика 1С и попросить его реализовать какую-то прикладную задачу. В условиях собеседования и стресса кандидата такая задача позволяет увидеть, как кандидат думает. Смотрим на решение кандидата, помогаем кандидату увидеть существенную технологическую проблему в его решении, затем смотрим, как кандидат изменит решение, не допустив ещё одной технологической проблемы. Иногда так делаем 6-7 итераций, ищем и оцениваем слабые стороны решения. При этом сразу появляется возможность не только обсудить и понять, что знает человек, например, о взаимоблокировках, но и понимает ли, как в своем коде свести вероятность их возникновения к нулю.

    Знание конкретного языка программирования не является супер важным фактором. Важнее, когда человек думает в терминах программирования с использованием языка, а не ограничивается конструкциями языка.

    Что используется в работе

    Первый и самый часто используемый инструмент – технологическая платформа 1С:Предприятие. Знание платформы требуется на уровне администратора и разработчика. Т.е. нужно понимать, как реализовать конкретное решение и запустить его в системе на тысячи пользователей.

    Очень часто требуется анализировать работу СУБД MS SQL Server и PostgreSQL, поэтому использование инструментов профилирования, динамических представлений, журналов входит в багаж активных навыков. И тут важно умение работать с большими объемами. Стандартный блокнот Windows не очень удобен при работе с 1 Тб текстовых журналов с машинно-генерируемыми запросами и их планами. Сразу возникает необходимость знания регулярных выражений, а также целого набора инструментов и языков, их поддерживающих. Для анализа планов запросов нужно понимать, что такое индексы, и чем merge join отличается от hash join.

    Системы на корпоративном рынке часто работают в ОС Linux. Там на серверах нет никакой графической среды. Навыки работы в консоли оказываются достаточно важными.

    Представьте, что нужно найти, почему нагрузка на CPU на серверах c PostgreSQL в CentOS процессами Postgre выросла на 5%. Попробуйте написать на бумажке алгоритм вашего расследования. И сразу возникает понимание, что нужно

    • уметь применять не только uptime, vmstat, sar, atop, perf,
    • знать, как воспользоваться pgbadger, psql и настроить сбор журналов в postgresql.conf,
    • уметь найти один нужный запрос,
    • воспользоваться analyze, проанализировать его план,
    • переписать запрос и проверить, что нагрузка спала.

    Что для нас важно

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

    Группа разработки платформы 1С:Предприятие


    Главное, что в нашей команде требуется от кандидатов – это умение аналитически мыслить, тщательно анализировать задачу и умение взвешивать способы решения. У платформы 1С:Предприятие довольно долгий цикл разработки (месяцы), поэтому нельзя, как в веб-разработке, реализовывать функциональность по частям, шаг за шагом. Это требует способности глубоко мыслить при продумывании деталей реализации, нужно стараться сделать «все и сразу». Т.е. не использовать для решения проблемы первый попавшийся способ, про который вчера прочел на Хабре, а тщательно взвесить все плюсы и минусы различных путей решения.

    Понять на собеседовании, есть ли такие качества у кандидата, не так просто. Наиболее релевантный способ – беседа о предыдущем опыте кандидата. Когда человек рассказывает, какое клевое решение он придумал, спрашиваем – а какая задача, собственно, решалась? Почему было выбрано именно это решение, а не другое? А если бы условия задачи немного изменились, как изменилось бы решение? Задав несколько подобных вопросов, можно понять, насколько человек глубоко погружался в тему.

    Есть и другой аспект, иллюстрируемый фразой: «Нанимаем тех, кто умеет работать, а потом почему-то хотим, чтобы они хотели работать». Поэтому на собеседовании хочется понять, чем для человека является работа. Если для него это приятное времяпрепровождение, которое позволяет зарабатывать деньги, то с высокой долей вероятности у нас с кандидатом ничего путного не выйдет. Для большинства профессиональных разработчиков их работа – это самое интересное, чем им когда-либо приходилось заниматься, исследовательская деятельность, желание и умение создавать что-то новое. Человек, приходя к нам, должен быть готов учиться, учиться и учиться. Нам не нужны просто исполнители, нам нужны люди, которым никогда не надоест учиться, на нашей работе учиться приходится очень много и постоянно.

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

    Требуемое знание языков программирования зависит от области разработки платформы, для которой ищется кандидат. Ядро платформы – С++ и Java, веб-клиент – JavaScript и желательно знать основы C++, для некоторых проектов нужно знание 1С, но при этом крайне желательно знание и других языков и технологий. Нам приходится создавать много нового для мира 1С, хочется, чтобы кругозор и эрудиция разработчиков позволяли им оперировать идеями и понятиями, придуманными в других языках и технологиях, и понимать, как их хорошо и правильно применить в нужных местах при разработке решений на 1С. Например, для разработки нашего облачного продукта 1cFresh мы пишем различные инструменты, в основном для администрирования, на 1С (на 1С их быстрее разрабатывать, чем на традиционных языках). Если разработчик понимает паттерны технологий и языков, используемых системными администраторами (bash, Python, Perl), это поможет ему создать удобный в использовании инструмент.

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

    Если перед нами системный администратор – можем спросить, например, об особенностях манипуляций с оперативной памятью в Linux. Если человек работает с СУБД – спрашиваем, например, какие уровни изоляции транзакций бывают, каким кандидат предпочитает пользоваться и почему. Если, например, человек работал над синхронизацией нескольких баз данных – обсудим с ним, как быть, если одна из синхронизируемых баз внезапно была восстановлена из бэкапа. Типичная архитектурная проблема, которую можно решать разными способами.

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

    Должен ли программист писать тесты? Программист должен выдавать продукт, который работает. Если это взрослый программист, никого не должно волновать, как он это делает. Если это начинающий программист – ему рекомендуется писать тесты. Серьезный разработчик со временем начинает понимать, какие тесты следует писать для создаваемого им кода, где находятся слабые участки кода, которые лучше покрыть тестами. Мы против бездумного глобального покрытия тестами. Программа работает корректно не потому, что ее стопроцентно покрыли тестами, а потому, что разработчик включил голову. Тесты – это вспомогательный инструмент для того, чтобы в наиболее сложных местах программы защититься от ошибок. И надо помнить, что тесты – это не панацея от архитектурных проблем. Самое главное – человек должен включать голову.

    Из не-ИТшных вопросов иногда задаем вот такой вопрос – а кем человек себя видит через 3-5 лет? Считаем, что сработаемся с человеком, если его стремления по развитию совпадают с тем, как видит его развитие компания.

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

    Разработка платформы 1С:Предприятие – еще один взгляд


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

    Далее интересует, приходилось ли человеку оптимизировать производительность программ, как он это делал.

    Спрашиваем, какие методики тестирования кандидат использовал на своих проектах, как он выстраивает стратегию тестирования проекта, можем спросить – у нас есть система с вот такой заявленной функциональностью, как будем ее тестировать?

    Если интервью на разработчика на Java – спрашиваем про работу сборщика мусора; человек, разрабатывающий более-менее сложные программы, должен быть в курсе нюансов его работы, и как писать код, за которым сборщик мусора эффективно убирает мусор.

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

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

    Обязательно рассказываем про то, чем мы занимаемся, а именно – делаем платформу 1С:Предприятие. Рассказываем о том, что у нас можно работать над высокотехнологичными вещами, например, над кластером серверов или над мобильной платформой.

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

    Знание конкретных языков не является критичным. Бывает, человек приходит в компанию на позицию разработчика C++, будучи C# разработчиком, и учит C++ довольно быстро. И вокруг много примеров коллег, в ходе работы выучивших новые языки. Если есть желание и знание одного из языков, то выучить новый язык – не проблема.

    Еще спрашиваем, что человек читает, только ли Хабр и stackoverflow, или еще и книжки по специальности, и какие именно. Иногда находим для себя таким образом полезные книги.


    Нам нужны хардкорные разработчики на C++. Наша команда занимается механизмами отчетности, а значит – наш код много работает с большими объемами данных, и нужно хорошее знание контейнеров и алгоритмов.

    На собеседовании спрашиваем – какие библиотеки кандидат использовал в работе, какие алгоритмы. Мы много используем STL, поэтому активно спрашиваем про эту библиотеку, какие контейнеры из нее разработчик использовал, для каких задач. Например, просим написать код, помещающий определенный класс в map, и еще пару аналогичных задач. По таким задачам сразу видно, какого уровня программист перед нами.

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

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

    Довольно важный критерий для нас – готовность разбираться в чужом коде. Платформа 1С:Предприятие – большой продукт, более 10 миллионов строк кода, столкновение с этим кодом в повседневной работе неизбежно, как минимум на уровне встраивания в него своего собственного кода.

    Спрашиваем, как кандидат предпочитает, чтобы ему ставили задачи – в виде детально расписанной спецификации, или достаточно постановки в виде «сделай такой-то механизм». Мы понимаем и принимаем оба подхода, не будем отказывать хорошему программисту только из-за того, что ему нужно разжевывать постановку задачи; нам просто важно сразу понять – как работать с человеком. Но хочется, чтобы в дальнейшем сотрудник развивался в сторону большей самостоятельности, смог взять на себя ответственность за отдельное направление. Как примеры направлений могу привести динамический список или диаграммы. И хочется, чтобы сотрудник развивал это направление – выяснял потребности пользователей этого механизма, общаясь с пользователями на форумах и конференциях, составлял списки новых фич, расставлял им приоритеты, понимал проблемы механизма, предлагал пути решения. Если человеку интересно, он может развиваться как тимлид, начав с курирования студентов-стажеров из нашего Центра Молодых Специалистов, а позже возглавив свою команду. Ну а если человек по натуре «чистый» разработчик, который предпочитает работу по ТЗ и ему не очень интересно разбираться в потребностях пользователей – что ж, и такие люди нам нужны.

    Должен ли программист тестировать? Безусловно! Программист, не делающий тестов – как повар, не пробующий то, что приготовил. От программиста нельзя, конечно, требовать полных тестов на всех поддерживаемых средах (Windows, Linux, macOS, веб- и мобильном клиенте), но на текущей операционке проверить базовую функциональность он обязан. Ну а еще лучше, если напишет автоматический тест. Это будет уже готовый регрессионный тест, который ляжет в библиотеку тестов и будет регулярно прогоняться при изменении в соответствующей области кода.


    1C:Enterprise Development Tools написан на Java, и мы ищем разработчиков и тестировщиков со знанием Java. Мы ищем людей с горящими глазами, как уже состоявшихся профессионалов, так и новичков с потенциалом. Знание Java для нас обязательно, равно как и знание алгоритмов и структур данных, многопоточного программирования; в нашей команде мы, к сожалению, не можем позволить себе ждать, пока новый разработчик выучит эти вещи. А вот знание конкретных фреймворков, которые мы используем (EMF, Xtext, GEF, Lucene, Handly, …) — дело наживное. Если видно, что человек хорошо соображает и с ним комфортно общаться – значит, в команду он впишется и необходимые знания быстро получит.

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

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

    Ну а для тестировщика умение широко мыслить еще более ценно! Есть известная шутка, как тестировщик тестировал бар: заказал одну кружку пива, 2 кружки пива, 0 кружек пива, 999999999 кружек пива, –8 кружек пива, qwertyuip кружек пива, а после сдачи проекта в продакшн в бар зашел клиент и спросил – а где туалет? Главное умение тестера – придумать нестандартные (и в то же время реалистичные) сценарии; стандартные сценарии, как правило, разработчик и сам протестирует.

    Заключение


    Как не привести тут ссылку на открытые вакансии 🙂

    А еще можно просто прислать резюме на [email protected].

    Классификация разработчиков по рангам боевых искусств / Habr


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

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

    Толкование значений


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

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

    Трёхсторонний подход


    Для ясности каждый термин получит три характеристики:

    1. Уровень мастерства


    Описание уровня квалификации для этого термина, в моей интерпретации.

    2. Параллель с рангами боевых искусств


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

    3. Пример кода


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

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

    Я буду использовать Ruby для тривиальных примеров реализации. Код достаточно прост: он понятен, даже если вы не знаете Ruby.

    3. Список


    Обсуждаемые существительные:
    • Новичок
    • Кодер
    • (Хакер)
    • Программист
    • Исследователь (computer scientist)
    • Разработчик программного обеспечения
    • Инженер программного обеспечения
    • Архитектор программного обеспечения

    Итак, начнём.

    Когда я жил в Италии в юности — около 20 килограммов назад — то несколько лет практиковал дзюдо и кунг-фу. Тогда я узнал, что во многих боевых искусствах уровню мастерства соответствует цвет пояса. Обычно цвет изменяется от белого к чёрному, где уровень опыта соответствует темноте пояса.

    Новичок носит белый пояс, потому что у него нет опыта. Белый цвет означает «новый и чистый». По мере тренировки пояс темнеет, демонстрируя прогресс. Цвет олицетворяет грязь, накопленную с тяжёлой работой и потом. Мастер боевых искусств с многолетним опытом в конечном итоге достигает чёрного пояса, который означает высокий уровень знаний и навыков.

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

    Почему мы говорим о боевых искусствах?


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

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

    Уровень профессионала Уровень боевых искусств (цвет пояса) Пример должности
    Новичок Белый
    Хакер Уличный боец (без пояса)
    Кодер Жёлтый Джуниор-разработчик (Jr.Dev)
    Программист Оранжевый Разработчик ПО
    Исследователь (Computer Scientist) Зелёный Разработчик ПО (Software Developer)
    Разработчик ПО Синий Старший разработчик ПО (Sr. Software Dev)
    Инженер-программист (Software Engineer) Коричневый Ведущий разработчик (Principal Dev)
    Архитектор ПО (Software Architect) Чёрный Архитектор ПО

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

    Новичок: белый пояс


    С чего-то нужно начинать, и обычно это уровень «вообще нет опыта». Новичок в разработке программного обеспечения — это тот, кто только что познакомился с программированием и находится на ранних этапах обучения. Новички ещё не могут уверенно программировать и не понимают простых программ, не сверившись с книгами, учебниками или не спросив совета у опытного товарища.

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

    Мощные инструменты — это не то, что надёжные навыки


    Чтобы ещё больше всё запутать, многие «современные» языки и фреймворки позволяют кому угодно генерировать структуру и некоторые реализации сложных программ без понимания, что происходит за кулисами. Например, запуск простого приложения Ruby on Rails и приём HTTP-запросов можно организовать с помощью нескольких команд из командной строки.

    Вот как это делается под *nix:

    $ gem install rails

    $ rails new website

    $ cd website
    $ bin/rails server
    ...

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

    Не поймите меня неправильно. Инструменты вроде Ruby on Rails позволяют быстро выполнить работу, и они великолепны. На самом деле я считаю фантастикой возможность сократить время на написание начального стандартного кода. Это отличное начало проекта, но здесь достаточно лишь белого пояса.

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

    Пример


    Если новичок захочет написать программу, которая суммирует набор чисел с помощью Ruby, то может загуглить вопрос и найти такую страницу. Это первый результат в выдаче Google на момент написания этой статьи. На странице StackOverflow самый заплюсованный ответ с 524 голосами:
    array.inject(0){|sum,x| sum + x }

    Конечно, это работает. Вот пример:
    $ irb
    2.4.2 :001 > array=[1,2,3]
     => [1, 2, 3] 
    2.4.2 :002 > array.inject (0){|sum, x| sum + x }
     => 6

    Это может работать у новичка, но он не понимает особенностей этого кода. Насколько он читаем? Насколько быстро выполняется по сравнению с другими вариантами? Легко ли его поддерживать? Почему он работает? Что именно произойдёт при выполнении этой строки? Сколько используется процессорного времени? Определены ли переменные sum и x после выполнения этой строки?

    Начинающий разработчик на Ruby не знает ответов на большинство из этих вопросов.

    Кодер: жёлтый пояс


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

    Первый необходимый шаг


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

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

    В отрасли кодеру обычно присваивают должность вроде «младшего разработчика» (jr. developer) или стажёра (developer in training).

    Пример


    Я думаю, что «Ruby-кодер» сможет придумать большинство нижеперечисленных методов вычисления суммы массива целых чисел и понять разницу между ними:
    $ irb
    2.4.2 :001 > array=[1,2,3]
     => [1,2,3]
    2.4.2 :002 > array.inject (0){|sum, x| sum + x }
     => 6
    2.4.2 :003 > sum=0;array.each { |x| sum+= x }
     => 6
    2.4.2 :004 > array. sum
     => 6
    2.4.2 :005 > array.inject(0, :+)
     => 6
    2.4.2 :006 > array.reduce(0, :+)
     => 6
    2.4.2 :007 > eval array.join '+'
     => 6

    Если вам интересно, некоторые из этих методов ужасны, но они работают.

    Хакер: джинсы без пояса


    Я включил в список «хакера», потому что меня попросили об этом. Но он не слишком хорошо подходит для нашей дискуссии.

    Не главный навык


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

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

    Некоторые из них злые головорезы, другие пытаются выжить, третьи — хорошие ребята, которые защищают остальных, но большинство где-то посередине.

    Много видов «хакеров»


    Есть много типов хакеров. Некоторые умеют программировать, другие нет. Значение слова зависит от контекста и от того, кто его использует. Некоторые общие определения:
    1. Компьютерный эксперт, который придерживается субкультуры технологий и программирования.
    2. Человек, который может поставить под угрозу компьютерную безопасность из вредоносных (black-hat) или исследовательских (white-hat) целей.
    3. Разработчик, который выполняет работу самым быстрым и грязным способом.
    4. Человек, который изучает, экспериментирует или исследует телекоммуникационные системы, оборудование и системы, подключенные к телефонным сетям. Таких хакеров также называют фрикерами (phreaker).
    5. Квалифицированный инженер, работающий очень близко к железу, чтобы получить лучший контроль над системой ради хорошего дела (т.е. чтобы выжать больше производительности из оборудования) или для вредоносных целей (т.е. чтобы использовать дыры в безопасности и найти способ обойти защиту операционной системы).

    Некоторые примеры


    Тип 3

    Хакер типа 3 может выбрать такой вариант суммирования массива целых чисел:
    $ irb
    2.4.2 :001 > ‘echo «1 2 3» / bc’.to_i
    => 6

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

    Хакеры типа 5 работают на очень низком уровне. Такие навыки нелегко приобрести и они могут быть очень ценными, если вы пытаетесь настроить защиту программного обеспечения или создать чрезвычайно высокопроизводительные приложения. Я никогда не был «хакером», но я программировал на низком уровне (C и ассемблер) и по-прежнему в глубине души считаю себя специалистом по низкоуровневому программированию.

    Хакеры 5-го типа могут быть фантастическими уличными бойцами, с безумными навыками, которые утрут нос многим профессиональным программистам на некоторых специализированных задачах. Такие «хакеры» могли бы суммировать массив целых чисел с помощью ассемблера примерно так.

    Программист: оранжевый пояс


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

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

    С точки зрения должности, программистов часто именуют «разработчиками программного обеспечения» (Software Developer) или «инженерами-программистами» (Software Engineer).

    В простом примере суммы массива целых чисел программист может написать код таким образом:

    #!/usr/bin/env ruby
     
    if ARGV.size==0
      puts "Usage: "
      puts "   sum [список целых чисел, разделённых пробелами]"
    else
      puts ARGV.sum{|x| x.to_i}
    end

    Этот код реализует полезную команду командной строки для суммирования списка чисел. Если вызвать её без параметров, она отображает полезное сообщение об использовании. В противном случае печатает стандартную выдачу. Вот пример использования:

    $./sum
    Usage:
    sum [список целых чисел, разделённых пробелами]
    $ sum 1 2 3
    6

    Это «комплексное решение», самодокументируемое и несколько абстрактное, поскольку программу можно вызвать из командной строки.

    Исследователь: зелёный пояс


    Исследователь (computer scientist) изучал информатику или в школе, или на работе. Он имеет хорошее понимание таких понятий:

    • Основание Base-N (N = 2, 10, 16)
    • Бинарные операции
    • Булева логика
    • Алгоритмическая сложность и нотация big-O
    • Структуры данных (массивы, связанные списки, B-деревья, красно-чёрные деревья, очереди, стеки, хэш-таблицы, кучи, наборы, графы)
    • Алгоритмы сортировки и когда их использовать
      • Базовое понимание NP-полноты
    • Основные многопоточные алгоритмы
    • Управление памятью и сборка мусора (только то, что ваш язык программирования сам заботится об управлении памятью, не значит, что можно пропустить эту тему)
    • Указатели (нужно хотя бы понять концепцию, даже если вы не кодируете на C) и разницу между передачей параметров по значению или ссылке.
    • Концепции ООП (интерфейсы, наследование, конструкторы, деструкторы, классы, объекты, абстракции, инкапсуляция, полиморфизм и т.д…)
    • Объектно-ориентированный дизайн и шаблоны
    • Рекурсия
    • Некоторые основные понятия о динамическом программировании, жадных алгоритмах и амортизационном анализе, алгоритмах сравнения строк и аппроксимации

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

    Один только статус «компьютерного учёного» не делает вас отличным программистом. Здесь как будто нарушается аналогия с цветами поясов. Но это не так. Подумайте с такой стороны: даже в мире боевых искусств есть специализации. Некоторые зелёные пояса лучше других делают некоторые вещи. Прогрессия нелинейная. Цвет пояса часто представляет собой уровень опыта и количество труда, затраченного на овладение боевым искусством, а не обязательный уровень мастерства в каждом аспекте.

    Учёный, вероятно, напишет такой же код для суммы чисел, как и программист. Разница в том, что учёный может сразу сказать, что сложность этого алгоритма O(n) времени. Как уже упоминалось, это элементарный пример, но вы уловили мысль.

    Разработчик программного обеспечения: синий пояс


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

    • Пишет более чистый, структурированный, поддерживаемый, документированный и читаемый код.
    • Допускает меньше ошибок.
    • Работает быстрее.
    • Лучше работает в команде и понимает ценность процессов разработки.
    • Лучше находит и оптимизирует узкие места кода и программных систем.
    • Имеет больше опыта.

    Пример


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

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

    На Ruby основное приложение с использованием Sinatra может выглядеть примерно так:

    require 'sinatra'
    require "sinatra/config_file"
     
    # Load the server configuration from config.yml:
    config_file 'config.yml'
     
    #
    # EndPoints:
    #
    # /sum/n1 n2 n3 n4 ...
    # Return:
    #     {result: [sum of n1,n2,n3,n4,...]}
    #
    # Example:
    #    $ curl http://localhost:8080/sum/1 2 3 4
    #    {"result":"10"}
    #
    get '/sum/:numbers' do |numbers|
        {result: numbers.split(" ").collect{ |x| x.to_i}.sum}.to_json
    end

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

    Инженер-программист: коричневый пояс


    Разница между разработчиком (software developer) и инженером-программистом (software engineer) тонкая; я это полностью признаю. Эти термины обычно используются как синонимы. Тем не менее, я предполагают, что инженер-программист — специалист, имеющий знания в области информатики и большой опыт в качестве разработчика программного обеспечения. Основные отличия:

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

    В компаниях у таких разработчиков могут быть должности «старший разработчик» (senior developer) или «ведущий разработчик» (principal developer).

    Пример


    Инженер-программист может написать приложение как разработчик, создав службу и предоставив API, чтобы взять набор целых чисел. Но я считаю, что решение инженера будет включать в себя некоторые улучшения:
    • Кэширование результатов.
    • Абстрагирование концепции от суммы к любому математическому выражению в запросе.
    • Ведение журнала, аутентификация, отслеживание хуков и т. д.

    Пример становится глупым


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

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

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

    Критическая часть


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

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

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

    Архитектор программного обеспечения: чёрный пояс


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

    Пример


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

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

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

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


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

    Разработчик С++ Бьёрн Страуструп / Habr

    Бьёрн Страуструп — родился 11 июня 1950 в датском городе Орхус.
    После окончания школы поступил в Университет Ааргус на отделение компьютерных технологий. В 1975 году окончил его и получил степень магистра.
    В дальнейшем продолжил свое образование в Кембриджском университете Англии.
    В Кембридже, в Вычислительной лаборатории, он занимался проектированием распределенных систем, и в 1979 году ему была присуждена степень доктора философии.
    В этом же году Страуструп вместе с семьей переехал в Нью-Джерси (США), где стал работать в Центре компьютерных исследований фирмы Bell Labs. Когда он занимался исследованиями в фирме, Бьёрну Страуструпу потребовалось написать несколько имитационных программ. SIMULA-67 — первый объектно-ориентированный язык для моделирования мог бы быть идеальным для подобных задач, если бы не его сравнительно низкая скорость выполнения программ.
    В Нью-Джерси у него рождаестя сын и он начинает больше времени уделять семье.
    SIMULA-67 и BCPL(Basic Combined Programming Language) не устраивал Бьёрна и он начинает свою работу над «Си» дополнив его классами.
    Первоначально название так и было «Си с классами» (С with classes)
    В 1983 году язык подвергся значительным изменениям и получил название С++. Название придумал Рик Мэсчитти. Термин С++ — это оператор инкремента в С, который как бы намекает на то, что язык С++, нечто больше, чем просто «Си».
    Страуструп разработал свой язык таким образом, чтобы он препроцессировался в С, а не компилировался в машинный язык, что открывало к нему доступ сотням тысяч пользователей С, имевших соответствующий компилятор.
    В 1984 году фирма Bell Labs была реорганизована и получила название AT & Т Bell Labs. Первыми, кому фирма предложила С++, причем практически безо всякой оплаты, стали университеты. Это произошло в 1985 году. Для того чтобы смягчить положение, Страуструп одновременно опубликовал одну из самых широко известных книг «Язык программирования С++», которая выдержала четыре издания(1985, 1991, 1997, 2000), и была переведена на 19 языков.
    Язык быстро нашел свою аудиторию. В 1987 году на конференции по С++ собралось 200 человек. На следующий год, по словам Кенига, число участников возросло до 600, а в начале 90-х годов число пользователей, по его же оценкам, приближалось к полумиллиону. Это сделало данный язык мировым лидером по скорости распространения.

    В 1990 году выходит его очередная книга «Справочное руководство по языку программирования С++ с комментариями» («The Annotated C++ Reference Manual»)
    Которая в дальнейшем была удостоена награды за непревзойдённое мастерство в области технической документации по мнению журнала «Dr. Dobb’s Journal».
    Кроме того по версии журнала «Fortune magazine»Страуструп один из «двенадцати лучших молодых американских учёных»
    В 1993 году его награждают премией имени Грейс Мюррей Хоппер.
    В 1995 году журналом BYTE он признан — «одним из 20 самых значительных личностей в компьютерной индустрии за последние 20 лет».

    Страуструп тем временем продолжал работать в AT & Т Bell Labs, где возглавлял подразделение широкомасштабных программных исследований и активно занимался совершенствованием своего языка и созданием его стандарта. Стандарт ANSI/ISO С++ был выпущен в 1999 году.

    Вплоть до 2002 года Страуструп был главой отдела исследований программирования в Bell Labs.
    В данное время является профессором техасского университета А&М.

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *