Програміст Початківець: Не Кодом Єдиним або Що Ще Варта Знати Початківцю?

    В попередніх постах ми з вами вже розібралиcь з тим, що програмісту потрібно вміти програмувати 😉 , а також володіти, хоча б на початковому рівні, англійською. А тепер давайте, перед тим як переходити до тем інтерв’ю та резюме, ще оглянемо кілька додаткових навичок та вмінь, що можуть стати в пригоді як професіоналам так і початківцям.

    Extra Skills for Programmer

    @www.flickr.com/photos/ministry/6194522077/

    Ця стаття є більше оглядовою і основною метою її є показати, що ж чекає на початківців протягом їхньої подальшої кар’єри. Думаю буде цікаво що ж такого вміють професіонали та що їм допомагає краще та ефективніше працювати.

    Погрупуємо усі додаткові “скіли” в кілька категорій. Отже:

    Основа – Програмування

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

    Наприклад:

    • веб програміст вчить HTML, CSS, Javascript, ну і звичайно серверну мову (напр. Python, Php, Ruby, Java)
    • програміст під десктоп вчить API його операційної системи та фреймворки, що полегшать йому розробку під його конкретну систему, будь-то Windows, Linux чи Macintosh
    • програміст мобільних додатків вивчає фреймворки для розробки під Androi, iOS чи Windows Phone
    • і так далі

    Кожен програміст – це впершу чергу людина, що знає як розв’язувати ту чи іншу поставлену задачу з допомогою складеного нею Алгоритму.

    В більшості випадках програміст також знає як працювати хоча б з однією з Баз Даних, розбирається в Патернах Програмування, Структурах Даних і знає що таке ООП, та Юніт Тести і Continuous Integration. Хух, багато? 🙂

    Але це ще не все.

    Навіть початківцю варта знати ази хоча б одного з найпопулярніших репозиторіїв коду. Репозиторій коду – це інструмент, який дозволяє програмісту зберігати код, легко працювати над ним в команді та, при потребі, відкотити останні зміни. Для початку рекомендую ознайомитися з репозиторієм коду Git. Буде гарним плюсом у вашому резюме!

    Адміністрування

    Навіть на рівні початківця вам просто необхідно вміти заінсталювати та налаштувати вашу операційну систему. Ту, де ви будете самі програмувати. Отже, як мінімум, рівень досвідченого користувача у вашій операційній системі, будь-то Windows, Linux чи Macintosh – також є обов’язковою вимогою.

    Взалежності від обраного вами напрямку ваша операційна система буде або Windows (напр. якщо обрали .Net фреймворк від Microsoft), Linux (нарп. якщо працюєте з опенсорсом, напр. Python) чи Macintosh (якщо програмуєте аплікації під дану систему чи під iOS).

    У нас на фірмі більшість працює на Лінуксі (а саме Ubuntu). Сервера власні та й і клієнтські ми крутимо також на Ubuntu. Верстальщик працює за Віндовсом. Я останнім часом локальне середовище маю на Macintosh. А взагалі Python найбільше любить Linux 🙂

    Програмісту спеціалісту адміністрування потрібне також і для інших цілей:

    • встановити робочу систему на продакшин сервер
    • відтестити проблеми алпікації напряму на продакшин сервері
    • допомогти адміну із кодуванням скриптів

    Тому хороше знання хоча б однієї із операційних систем початківцю також необхідне. Цю інформацію також варта внести у своє резюме.

    Продуктивність та Тайм Менеджмент

    Відійдемо трохи від техніки, і розглянемо кілька корисних вмінь щодо продуктивності програміста.

    Спитай Гугла або “Загугли” – це вміння швидко знайти необхідну інформацію в інтернеті. Адже чим швидше знайдеш відповідь – тим швидше вирішиш проблему. Лише з практикою прийде вміння. Перед тим як питати старшого за порадою – заставте себе трохи “погуглити”, і аж тоді звертайтесь по допомогу. Вміння самому швидко вирішувати неочікувані проблеми свідчить про рівень програміста.

    Методології Розробки. Взалежності від специфіки проекту, його розмірів, команди, та часу на проект, обирається та чи інша методологія розробки програмного забезпечення. Зараз одними із популярних слів при організації процесів розробки є:

    • Agile – підхід, цілий клас методологій гнучкої розробки програмного забезпечення
    • Scrum – як одна із методологій гнучкої розробки
    • XP Programming – екстремальне програмування, ще одна методологія гнучкої розробки. До речі до нього входить писати тести ще до написання самого коду, а також парне програмування.

    Є ще дуже багато напрямків та підходів щодо організації команди та роботи над проектом. Але навіть дослідження двох вище наведених слів Agile i Scrum дасть вам хороше уявлення про усі ці техніки. Зазвичай в проекті використовують мікс різноманітник методологій.

    На останок в секції Продуктивності маємо – швидкісне друкування. Я, наприклад, освоїв 10-пальцевий сліпий метод набору ще в універі, коли працював адміном в комп’ютерному клубі (освоював його з допомогою програми Соло на Клавіатурі якщо комусь цікаво). Дозволяє не дивитися на клавіатуру та достатньо швидко набирати текст. Думаю для програміста це не критично вміти, але, як мінімум, класно “повимахуватись” перед колегами :-))

    Fast Typing

    @loneplacebo.com

    Комунікація

    Якщо вмієш програмувати, але не вмієш комунікувати правильно та ефективно, тоді кар’єрний ріст значно сповільнюється.

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

    Чули про таке словосполучення як Командний Гравець? В нього входить:

    • вміння висловити власну думку
    • вміння зрозуміти іншу людину у власній команді
    • вміння допомогти та попросити допомоги
    • вміння уникати та вирішувати конфліктні ситуації з іншими учасниками в команді

    У деяких великих фірмах навіть є спеціальні тренінги, на кшталт – Conflict Resolution Training. Якщо ви геній-програміст, але не йдете на компроміси і вас не “переварює” уся ваша команда, тоді зрозуміло, що толку від вас багато не буде в проекті.

    Досить важливим також є вміння висловлювати власні думки на папері. Це і потреба писати документацію і спілкування текстом (емейли, чати, форуми). Я навіть придумав давати як завдання Написати Односторінковий Твір На Вільну Тему джунікам у себе на інтерв’ю. Таке завдання показує на скільки легко мені буде з людиною в майбутньому спілкуватись текстом, отримувати від неї якісну документацію. Та й загалом я зауважив таку тенденцію: той хто гарно викладає власну думку на папері, також гарно пише код.

    Рівень Сенсея 🙂

    Ну і на завершення оглянемо кілька вмінь та навичок, якими зазвичай володіють супер досвідчені програмери, сеньйори, сенсеї 🙂 Це вже трохи більше, ніж програмування…

    Хороший спеціаліст зазвичай по-трохи розбирається і в суміжних областях та напрямках. Тобто, при потребі, може грати роль широкопрофільного спеціаліста.  Наприклад, сеньйор веб Python програміст, при необхідності, може зробити і весь фронт-енд (html, css, javascript), і задеплоїти аплікацію на продакшин, і навіть підказати дизайнеру, що краще працюватиме на даній сторінці при даному типові користувача.

    Таким чином знаючи ази інших спеціальностей, досвідчений програміст краще розуміє інших членів команди на проекті. Також може дати пораду поза своїм основним напрямком.

    Другим скілом, який часто зустрінеш серед профіків є вміння менеджити не лише свій код, але і свій час та час інших. Такий програміст зазвичай може Проестімейтити (визначити необхідний час на задачу), Розпланувати та Делегувати (передати іншим на виконання) завдання для всієї команди (звісно тим, в спеціальностях яких він розбирається). Навіть робота напряму з клієнтом, також часто на їхніх плечах!

    Mentoring

    @daveblackonline.com

    І ще одним критичним скілом, яким на мою думку, повинен володіти кожен сеньйор програміст – це менторство початківців. Все, що стосується програмування, організації проекту, продуктивності та менеджменту часу – усіх цих речей досвідчений програміст навчає програмістів джуніків. Ось чому в команді Джуніки завжди прогресують значно швидше, ніж самі.

    Надіюсь я не залякав вас ци довжелезним списком? 🙂 Звичайно це все освоюється протягом років роботи, ну і взалежності від бажання програміста. Але загальну картину різноманітних речей та навичків, думаю, вдалося донести. Цим і цікава професія програміста – маса шляхів для вибору, взалежності від персональних уподобань та пріоритетів.

    А які ще додаткові навики, на вашу думку, є корисними для програміста? Коментуйте – будемо добивати статтю кількома новими параграфами 😉

    В наступних статтях розберемо детально процес складання свого резюме та проходження інтервю.

    Хочете першими дізнаватися про наступні статті у серії “Програміст Початківець”? Тоді підписуйтесь на розсилку.

    Коментарі:

    1. Добрий день Віталій записана на ваш Емейл Курс Програміст Початківець
      зара його ще проходжу також дуже інтересні описи і все як для новачка дивлюсь відео читаю коментарітакож наткнулася наткнулася на блог
      http://spivachuk.com
      https://www.upwork.com на блозі і в вдео курсі радять ці сайти для працювання не підкажете чи варто на них звертати увагу по словах там не обовязково вивчати програмування від нуля

      Відповісти
      • upwork – біржа праці для знаходження клієнтів. там бажано вже щось вміти щоб отримати оплачуване замовлення

    2. Я в своїй роботі використовую тільки функціональне програмування (розробка прошивок для Embedded систем) на мові С. ООП ніколи не пробував, хоча компілятори дозволяють писати код на С++.

      Відповісти
      • Мабуть все-таки – процедурне 🙂
        Функціональне трішки інше 🙂

    3. О… ну тут ще така штука, Я особисто не радив би першою мовою вибирати Рубі. Хоч вона реально Дуже крута(і як друга-третя-четверта мова радив би її підівчити) і я від неї в захваті і останнім часом пет-проджекти саме на рубі і ще вона просто вау для швидкого прототипіювання, але – люди котрі привикають то скафолдів та конструкторів часом на реальних продуктах не можуть потім закодити щось, чого нема в джемах.

      Не одним ООП життя програмера єдине 😉 Часом буває треба підключити знання функціонального програмування або аспекто-орієнтованого програмінгу – файно було б хоч поверхнево розбиратись в парадигмах. І з якими парадигмами вміє працювати обрана мова.

      Я десь пропустив таку штуку як TDD? 🙂
      Пробіжався по попередніх статтейках по діагоналі – ти згадував про пет-проджекти?

      Відповісти
      • Так, TDD пропустив. Згадав тести та continuous integration.

      • Щодо Рубі погоджуюсь. Самі рубісти також не рекомендують з рубі починати.

    4. Класна стаття! А ще б цікаво було почитати як відбувається планування та розробка архітектури проекту та бізнес логіки.

      Відповісти
      • дякую!

        А це вже зовсім друга історія 🙂 Цікава тема. Можливо запрошу якогось архітектора серйозного поділитися досвідом і підготуємо гостьовий пост. Малі та середні проекти у вебі (принаймні у нас) йдуть на рівні спринтів та Юзер Сторіс. А вже складні великі системи думаю обмізковуються спеціалістами по архітектурі. Сам досвіду участі в такому складному проекті, де треба планувати все одразу із самого початку, немаю.

      • Мммм…. тут все не так просто, але й не так складно, як здається на перший погляд.

        Щодо бізнес-логіки – то тут суто і повністью залежить від того, що ваш продукт буде робити. Зрозумійте – програмка будильника – проста стейт-машина, а програма котра відповідає за роботу з сенсетів даними наприклад даними пацієнта – це вже геть інша історія 🙂

        Щодо архітектури проекту, то тут трішки простіше:
        1) Треба визначитись що ви очікуєте від сервісу і виділити ключові Елементи, e.g на прикладі аутентифікації: (Реєстрація) далі (Авторизація, Автентифікація і при потребі Ідентифікація) – Логін, (Роль користувача – адмін, клієнт) – від цього залежить подальша обєктна модель того які ресурси відображати і на яких правах це робити, (Логаут) – закінчення сесії і що робити далі(що показати).
        2) За кожен модуль відповідає своя модель – важливо не змішувати в одному модулі реєстрацію і наприклад адмінку користувача.
        3) Важливо продумати звязки з БД – таблиці, валідації, сторд процедури. Тут все просто – не треба писати код, треба словами описати: “На вхід приходить хеш стрічка закодована в SHA256, закодована в Base64(хоч це й тупо). Ми повинні перевірити що вона співпадає з відповідними даними в БД.” – якось так.
        4) Прописати стани переходів – тут зручно користуватись UML наприклад. Де чітко показати – що за чим має відобразитись перед тим отримавши дані з БД наприклад чи від клієнта.
        5) На даному етапі важливо враховувати ризики(в даному випадку – секюрність передачі даних) а також продумати API при наявності такого.
        6) Подальше планування проводиться ітеративно з врахуванням бізнес-логіки.

        Звичайно – чим гнучкіше(модульніше) написана система тим її легше масштабувати, супортити, розширювати, добавляти новий функціонал.

        До початку планування треба чітко визначитись – Що ви хочете щоб робила програмка чи сервіс. Це мабуть найважливіший пункт 🙂

      • Давно, одного разу, коли проходив інтерв’ю в Epam, вони також шукали сішного архітектора. Гугл замовив у них переписку усієї серверної сторони сервісу Google Analytics. Звучало це все зовсім не просто 😉

    Опублікувати коментар

    Ваша e-mail адреса не оприлюднюватиметься.

    Ви не робот? ;) *