Саме таким питанням я задався сьогодні вранці, прийшовши на роботу. Начебто всі ознаки програміста є: код пишу вже не перший рік, за плечима не один проект (як провальні так і успішні), розбираюся в структурах даних, алгоритмах і їх оцінці, знаю, як працюють мережі і сам комп'ютер аж до залізного рівня, знаю і використовував скрам, канбан та іже з ними. Чесно ходив на конференції послухати, а так само чесно виступити. З вогником в очах читав лекції студентам і розповідав як це бути програмістом. Багато з них пішли на роботу програмістами, найбільш толкових я забирав собі в команду. Читав тренінги з патерів, JavaScript і .NET, проводив хакатон, брав участь у хакатоні, і радів як дитина від цих самих хакатонів.
Моя перша мова, ви будете сміятися, була JavaScript - на дворі 2002 рік, IE 6 процвітає, і тут мені в руки потрапляє, абсолютно випадково, книга по HTML. У ній є деякі згадки про JavaScript, які привертають мою увагу, що змушує мене з'їздити на книжкову виставку і придбати більшу книгу за JS. Я пам'ятаю свою першу «корисну» програму - на сторінці з чорним фоном, було зображення вимикача світла з написом «off» і напис: «Увімкніть світло». При натисканні на вимикач його стан змінювався на «on». Фон сторінки ставав жовтим, напис зникав. З цієї програми я ще «угорав» кілька днів. Ну і потім понеслося все цікавіше і складніше. Тоді я ще нічого не знав ні про оптимізації, ні про те, що в програмуванні повинна бути хоч якась логіка, коли ти пишеш цикл або сортування. Все робилося «на аби», і часом працювало досить повільно, але мене це зовсім не зупиняло. Слідом за вимикачем понеслися випадаючі менюшки, кострубаті анімації і так далі.
А потом я узнал про С - за ним я мог сидеть ночами и программировать бесполезные программы - от них не было, по-первости, никакого толка, но осознание, что ты можешь что-то создать меня очень подкупала. Робота з файлами, робота з сокетами (без взагалі будь-якого розуміючи принципів їх роботи). А далі я вичитав, як на екран можна вивести лінію або інші фігури. Перше, що я зробив - це вирішив створити свій 3д куб, який буде обертатися з прискоренням. На той момент моя голова вже мала уявлення про синуси і косинуси. Так що придумати, як крутити точку по колу, особливих проблем не викликало.
А потім, на першому курсі університету, мені показали таку річ як C++ Builder. На той момент він ще не був забутий, і про боже, коли я побачив цю пишність готових компонентів, кнопок-менюшок-таблиць (гридів), я думав мій мозок зійде з розуму від щастя, пишноти і шаленої кількості варіантів, що можна з цими кнопочками зробити. І я робив - пам'ятаю свої «віджети» для Windows XP, маленькі програмки, які напівпрозорі завжди висіли на робочому столі і відображали поточну завантаженість дисків, якісь замітки, погоду, а так само нагадування у вигляді календаря. На той момент я це писав для себе - тільки щоб написати. Це зараз у нас є все це разом з системою і загальною синхронізацією. А раніше цього софту не було, і не стільки доводилося, скільки хотілося його написати. Взагалі всі два роки мій дружби з «білдером» і взагалі програмуванням ідеально описує наступна картинка:
І ось тут настав своєрідний переломний момент - програмувати красиві анімації, використовуючи готові компоненти, стало набридати. Мені не вистачало розуміння того, що відбувається під капотом у цих самих компонентів, як вони створені і на основі чого відмальовуються. А так само почали виникати питання продуктивності - часом програми працювали повільно, і я не завжди розумів чому.
За порадою дуже хорошої людини мені в руки потрапила книга Ріхтера "Windows для професіоналів. Створення ефективних WIN32-програм з урахуванням специфіки 64-розрядної версії Windows ". Чесно - до цього я поглядав на Windows з підозрою і вважав, що це «ламерська» система. Пам'ятаю, ще коли мені було шістнадцять, людина, яка збирала мені мій другий комп'ютер поставила питання: «Ти взагалі Windows вмієш користуватися»? На що я засміявся і відповів: «Звичайно». Даремно сміявся - насправді це зовсім не Windows був винен, що він падав від вірусів або пам'ять закінчувалася від антивірусів. Просто руки у мене були криві, не знав я як все влаштовано в системі, не знав, як зробити так, щоб система встановлена одного разу, ніколи не переставлялася до виходу нової Windows.
Після прочитання книги багато чого стало на свої місця - тепер я з вогнем в очах кинувся розбиратися в WinAPI, а слідом за ним (вже не пам'ятаю, як) я дізнався про драйвера і почав намагатися з остервенінням їх писати: віртуальна машина, на неї Windows XP і встановлення драйверів. Через раз, правда, система злітала з BSOD'ом, але це не було проблемою. Як же я тягнувся від написання драйверів. Тягнувся, поки мені це не наскучило - в якийсь момент часу це просто стало нудно, бавитися з низьким рівнем доступу в системі.
Наступне, що я дізнався (це сталося одночасно) - це було шифрування і мережі. За кілька днів я вичитав від кірки до кірки книгу Оліфера «Комп'ютерні мережі». Це було дуже цікаво розібратися аж до фізичного рівня, як це працює, зрозуміти принцип функціонування моделей масового обслуговування, розібрати по кісточках протоколи, а слідом за ними запрограмувати свій якийсь http-сервер, а за ним ftp. Розібратися з основними протоколами пошти і «потикати» в gmail командами прямо з коду.
Слідом за цим послідували структури даних, оцінка складності алгоритмів і безпосередньо самі алгоритми. Пам'ятаю, як я іржав, немов дурень з фрази: «у цьому розділі ми будемо розбиратися, як зберігати дані в дереві». А через кілька років, під час походу, на фразу: «Дивись, яке дерево» я секунд 15 тупив, намагаючись зрозуміти, де друг побачив бінарне дерево в цьому лісі.
Взагалі навчання програмуванню йшло якимись уривками і зовсім не так, як повинно було б йти, що б все давалося поступово, правильно і просто. До багато чого доводилося доходити самому, тому що не вистачало «Бази» - часом математичної, часом алгоритмічної. Але потім все стало на свої місця, а потім я поринув у світ .NET.
Потім я пішов на роботу - це було на другому курсі: я приходив, дивився на код проекту, як зараз пам'ятаю свій перший проект: 223 мегабайти коду, без картинок та іншого лушпиння. У перші дні я був упевнений, що зійду з розуму, намагаючись це зрозуміти, а потім нічого, втягнувся - все стало просто і зрозуміло.
Мені було цікаво розібрати по кісточках як працює CLR, як функціонує збирач сміття і як виконується зберігання об'єктів в пам'яті, як працюють індекси синхронізації, які проблеми можуть бути при багатопоточному програмуванні. Я сиділи і читав вихідці open-source проектів, просто так, від нудьги. А потім все це розповідав студентам - тим це подобалося, та й мені було приємно ділитися знаннями. За .NET пішов світ фронтенд розробки, я з упоєнням слухав лекції Крокфорда, читав стандарт JavaScript'a розбирався з патернами, читав книги з CSS і вивчав нюанси роботи браузерів і читав вихідці jQuery. І знову ж таки все це розповідав студентам і намагався застосовувати на роботі - дізнаючись якусь нову «фішку» мені тут же хотілося впихнути її кудись в проект, якщо це мало хоч якийсь сенс. Часом сидіти без сну дві доби і програмувати, підживлюючись солодким чаєм і цукерками - було нормою, організм нормально реагував на це і зовсім не скаржився. При цьому я працював зайвий час не за гроші - мозок затьмарювала ідея, яку терміново потрібно було реалізувати, інакше мозок просто не міг заснути, а продовжував думати і прокручувати раз за разом в уяві нову «модель».
Загалом, я робив все, чим повинен, як мені здається, займатися вболіваючий за свою справу програміст.
У серпні цього року якось в один момент мені все це набридло - стало нестерпно нудно. У мене було шість проектів і кожен був цікавий чимось своїм, нові технології, нові знання, нові процеси. А тепер цього не стало - фрази на кшталт: «у нас дуже сек'юрна система» більше не викликають трепету. Як я зараз бачу чергову пропозицію від HR'ів:
Сек'юрна система говорите? Що ви можете запропонувати - шифрувати куки, трафік і використовувати якусь децентралізовану мережу?
Нудьга.
Високонавантажений фінансовий проект? Що? Не чую. А, ви говорите, що у вас багато лоад балансерів, свій бінарний протокол спілкування між фермами, мільйони користувачів і святий скрам?
Нудьга.
Високозавантажений проект з геолокацією, пошуком, використання дерева квадрантів. Node.js + HTML5 + CSS3 + новітні бібліотеки JS?
Нудьга.
І так далі.
Просто набридло все це - з першого мого рядка коду в 2002 році, до сьогоднішнього моменту я не зробив нічого корисного цьому світу. Нічого не змінив і не виправив, не полегшив нікому життя. Нові технології не приносять задоволення, хоча я продовжую стежити за цим усім «городом». Все перетворилося на буденність: будь-який код - це просто код, в ньому немає чогось незвичайного і, якщо дозволите, «чарівного», як це було раніше.
Все частіше мене відвідує думка, що програмування - це не моє, адже не може бути так, щоб людині наскучила до остогидіння улюблена справа. Один з моїх колег після десяти років заняття програмуванням, все кинув і поїхав кудись до Єгипту вчитися, а потім і працювати мисливцем на акул.
І ось сьогодні вранці, повторюся, я задумався програміст я?
Післямова
Що можна сказати наостанок? Попереду чекає переїзд в Гугл, можливо, там моя пристрасть до програмування розгориться знову, але вже точно сказати не можу - час покаже.
Якщо хтось дасть пораду, що з цим робити - заздалегідь спасибі. Не знаю, навіщо все це написав, можливо, тому що нікому більше розповісти, а виговоритися хочеться. А можливо тому, що за вікном просто погана погода - у нас зараз в Мінську барабанить великий дощ.
Дякую за увагу.
