Програмерія, або що потрібно знати програмісту

Програмерія, або що потрібно знати програмісту

  • 1 червня, 2016
  • читати 5 хв

Як стати програмістом? Що потрібно вивчити? Відповідь ніби то проста: піти в університет, і там тебе навчать. Але якщо ви запитаєте будь-якого програміста він скаже, що те, чому там навчають, хоч іноді навіть і буває цікаво, але майже марно і зовсім мало має спільного з реальною роботою.

Програмування — це щось на зразок грамоти

Наша професія — одна з найскладніших, але найсмішніше, що саме програмування вивчити досить просто. Його навіть спокійно вивчають в школі. Щоб написати простеньку програму у Паскалі, школяру досить знати штук десять операторів (а їх всього п'ятнадцять) і кілька функцій введення / виводу, математичних і роботи з рядками.

Ці оператори — букви алфавіту, а функції введення / виводу Read () і Write () — перші слова, «мама» і «тато», з яких дитина починає осягати світ.

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

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

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

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

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

Тому навчитися програмувати — відносно легко, але щоб цим займатися професійно, потрібно проробити титанічну працю. Письменники починають з маленьких новел, поступово осягаючи всі стилістичні прийоми, збагачують свою промову, самі багато читають. Точно так само і програмістам доводиться багато програмувати і відточувати свою майстерність. І чорт забирай, це дуже складно! І постійно — роками, десятиріччами — доводиться вдосконалюватися. Це довгий марафон, повний як терня, так і радості. Ні грошова, ні якась інша мотивація не допоможуть тобі — тільки твій власний інтерес до справи.

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

Поступово у програмістів склалася своя професійна лексика. Сам процес написання програми вони називають кодуванням (Coding), а людей, які так-сяк освоїли тільки це, принизливо називають кодерами. Вони можуть щось вам написати, щоб запрацювало, але потім поліпшити, вдосконалити таку програму буде вкрай складно і неприємно, звичайно її легше переписати. Самі кодери називають себе розробниками (Developers), а коли набираються досвіду, багато хто починає іменувати себе інженерами ПО (Software Engineer).

Оk, якщо програмування — це «як грамота», то що тоді ще потрібно знати і вміти, щоб стати «письменником»?

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

Сьогодні вже досить успішно можна справлятися з роботою без цих знань, і я навіть був в шоці, коли одного разу познайомився з Senior-розробником, який дуже смутно розуміє, як працює процесор. Але зате за ці тридцять років з'явився інтернет, а програми стали величезними за розмірами і дуже складними. І додалося безліч інших навичок і знань, без яких сьогодні ну прямо ніяк: гнучкі процеси розробки, об'єктно-орієнтована і функціональна парадигми програмування, побудова масштабованих високонавантажених і відмовостійких систем, а ще необхідно вміти читати старий код і працювати з ним, використовувати системи управління версіями. Не обійтися і без такої обов'язкової навички, як уміння шукати в інтернеті, якого раніше просто не було.

Все це виходить за рамки самого програмування і, по-хорошому, потребує якогось свого, окремого терміну. Особисто я для більшої ясності називаю «програмер» - це як Програмна інженерія, але більш широкий термін, що охоплює важливе для нас: процеси розробки; вміння програмувати свій мозок, щоб, наприклад, «входити у потік»; вміння працювати в команді або складати резюме — загалом, все, чим ми займаємося.

Основи програмерії

Мені дуже пощастило, тому що я майже відразу, як тільки захопився програмуванням, прочитав приголомшливу книгу — «Досконалий Код». Вона мене вразила тим, що це була не книга про якомусь мову програмування або про технології, як все те, що мені траплялося раніше, а книга про саме програмування як таке. Це, напевно, перша книга, яка спробувала заповнити прогалини, що залишаються після прочитання підручників по алгоритмам, технічні керівництва і документації.

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

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

Не випадково вона перемогла, в опитуванні «Якби ви могли повернутися в минуле, коли були ще початківцем девелопером, то яку книгу з програмування ви порадили б собі прочитати?».

Потім з'явилися інші хороші книги про програмерію:

  • Ремесло програміста
  • Програміст-прагматик. Шлях від підмайстра до майстра
  • The Clean Coder

І безліч інших гідних, але в цілому вони охоплюють глибше певні області.

По суті, вся ця алхімія програмування насправді складається з таких речей з якими ми працюємо постійно і потрібно розуміти:

  • Основи комп'ютерної техніки: основи Булевой алгебри, двійкової і шестнадцатірядної системи числення.
  • Пристрій комп'ютера: процесор, оперативна пам'ять, стек, жорсткий диск, графічна карта, шина, периферія (тобто клавіатура, миша).
  • Асемблер процесора і С — їх теж потрібно знати хоча б трохи.
  • Власне базова грамота: синтаксис, як оголошувати змінну, функцію, як писати умовний оператор if, пріоритет операторів, як організувати цикл, як отримати введення від користувача і як його вивести.
  • Структурне програмування — як писати без goto, використовуючи цикли і рекурсію. Це легкотня насправді, п'ятнадцять операторів вивчаються швидко. Майже всі використовувані сьогодні мови програмування успадковуються від С (C ++, Java, C #, PHP, JavaScript), так що переучувати їх не доведеться. Тому, до речі, не особливо важливо, з якої з цих мов ви почнете навчання.
  • Алгоритмізація: лінійний пошук перебором, бінарний пошук, бульбашкове сортування, швидке сортування і т. д. Оцінка складності алгоритмів.
  • Структури даних: рядки, черга, стек, одно- і двузв'язний список, масиви і т. д.
  • Декомпозиція, абстракція і проектування програми: об'єктно-орієнтоване програмування, SOLID, шаблони проектування, UML-діаграми.
  • Основи функціонального програмування: як писати без деструктивного присвоювання і циклів, робота з колекціями у функціональному стилі.
  • Знання платформи, бібліотек, технологій: Java Core, робота з файлами, робота з мережею, робота з масивами, рядками і колекціями, робота з пам'яттю і прибирання сміття. Про все це є товсті книги від самих творців технології (наприклад, «Ефективна Java»).
  • Стандарти і протоколи мережі: TCP, UDP, HTTP, HTML, XML, JSON, MIME, RFC.
  • Уміння писати чистий код: як правильно називати змінні і класи, як форматувати код, як правильно писати коментарі (точніше, як їх не писати :-)). Розуміння приходить після прочитання книги Clean Code.
  • Уміння працювати з кодом: рефакторинг (книга Фаулера), хоткеі IDE для рефакторинга, вміння читати і супроводжувати старий код.
  • Інженерні практики: юніт-тести, екстремальне програмування (XP), безперервна інтеграція, системи управління версіями (Git, SVN).
  • Управління проектом і організація процесу: Waterfall, Agile, SCRUM, Kanban, баг-трекер, оцінка часу на завдання.
  • Soft skills: вміння спілкуватися з замовником і знаходити спільну мову в команді, побороти відсутність мотивації, вибрати пріоритети.
  • Бази даних: SQL, реляційні, документо- і граф-орієнтовані БД, ACID, теорема CAP, оптимізація запитів.
  • Операційні системи: Linux, установка та налаштування програм на ньому, командний рядок.
  • Масштабування і високі навантаження, моніторинг, логінг, відмовостійкість.
  • Криптографія, захист від атак.
  • Юзабіліті, збір вимог.
  • Знання англійської мови, вміння чітко і лаконічно писати документацію.
  • Уміння правильно формулювати питання і самостійно знаходити відповіді на них.
  • Уміння вчитися і при цьому постійно самовдосконалюватися.
  • Уміння навчати інших, зрозуміло пояснювати і навіть виступати перед публікою на конференціях ...
  • і при цьому не злітати з котушок.

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