Умение находить интересные задачи
12 февраля 2014
Суровая действительность такова, что, начиная с какого-то момента, программист не может так просто взять и покинуть некогда выбранную им нишу. Дело тут не в том, что веб-разработчика ни за что не возьмут в геймдев. Взять-то возьмут, но, за неимением соответсвующего опыта, платить будут ощутимо меньше. Даже разница в 10к рублей — это не так уж и мало, если умножить на 12 месяцев. И вот, бедный программист вынужден всю жизнь заниматься примерно одними и теми же задачами. Не удивительно, что рано или поздно к нему в гости приходят тоска и безысходность, типа «я занимаюсь всякой рутиной, а настоящие пацаны где-то пишут игровые движки и ПО для управления шаттлами».
Нет, можно, конечно, выбросить на помойку годами накопленный опыт, покинуть зону комфорта, и пойти работать в совершенно другую нишу. Касательно потерянных денег можно утешать себя тем, что это окупится в долгосрочной перспективе.
Но для этого нужно быть, скажем так, довольно азартным человеком. Вы уверены, что разработчику игровых движков не кажется, что он занимается всякий рутиной, типа борьбы с утечками памяти, а настоящие пацаны где-то пишут на нормальных языках программирования и деплоят высоконагруженные веб-проекты на сотни серверов? Уверены, что не попадете из уютненького стартапчика в кровавый энтерпрайз, где будете поддерживать тонны легаси говнокода, написанного студентами первого курса в лихие девяностые? Уверены, что этот же геймдев вам точно так же не надоест через пол года?
По моим представлениям, куда лучшее решение заключается в осознании того, что тоска и безысходность пришли не потому, что вы действительно занимаетесь скучными задачами, а потому что вы в них достаточно хорошо разобрались, чтобы они перестали казаться интересными. Но это вовсе не означает, что интересные задачи в вашей жизни закончились и нужно срочно идти в менеджеры. Едва ли вы пишите код без ошибок с первого раза, в продакшене ничего не взрывается и вообще, типа дзен достигнут, правда же? А значит, вам еще есть куда расти, главное — суметь это «куда» увидеть.
Ниже я приведу некоторые соображения и советы, предназначенные в первую очередь для программистов. Но подозреваю, что многое будет также справедливо и для тестировщиков, верстальщиков, админов и представителей других профессий.
Разберитесь, как это работает. Вот прямо берете первое, что попадается на глаза, и разбираетесь, как это работает. Я уже неоднократно отмечал, что знать внутреннее устройство того, с чем вы работаете, очень полезно.
Если вы сидите под Windows, попробуйте пописать что-нибудь на Си и WinAPI. Если работаете с Linux, попишите драйверы под него. Возьмите любой контейнер, идущий в стандартной библиотеке языка, на котором вы пишите, и разберитесь, какие алгоритмы и структуры данных используются в его реализации. Напишите простое приложение для вашего мобильного телефона или игровой приставки. Попробуйте написать свой простенький компилятор или интерпретатор.
Разберитесь в тонкостях работы используемой вами СУБД. Научитесь писать для нее быстрые запросы. Узнайте, если вы этого еще не сделали, какие бывают уровни изоляции и в чем заключаются различия между ними. Разберитесь, как работает электронная почта. Сможете ли вы написать свой SMTP-сервер? Доводилось ли вам настраивать Nginx или за вас это всегда делали админы?
В вашем приложении используются алгоритмы шифрования (например, SSL) или сжатия (например, gzip)? Знаете ли вы, как работают эти алгоритмы? Разберитесь! Напишите парочку собственных архиваторов и программ для хранения паролей. Может ли ваша система подвергнутся хакерской атаке? Узнайте, как совершаются такие атаки. Разберитесь, как работают трояны, черви, эксплоиты и вирусы. Попробуйте написать кряк для своей программы. Узнайте, как организовать DDoS атаку. Теперь, когда вы все знаете о нападении, разработайте меры защиты!
Креативно подходите к решению проблем. Даже в вебдеве частенько можно столкнутся с не самыми простыми задачами типа «посоветовать товары, которые заинтересуют данного конкретного покупателя», «сделать саджестелку к полю ввода» или «выбрать из базы товары по произвольному запросу типа (a >= 1 or (b == c and d != 3))». Напишите нормальный валидатор таких вот запросов (не на регулярных выражениях!). Подумайте, можно ли эффективно выполнять такие запросы, не создавая все возможные составные индексы по десяти полям? Даже если перед вами еще не стоит таких задач, это не повод не подумать заранее над тем, как бы вы их решали.
Разработайте нормальную методику, которая позволит найти самые тормозные куски системы, и оптимизируйте эти куски так, чтобы они вот прямо летали. Найдите в вашей системе шаблонные куски кода. Если вы пишите некий RESTful сервис, можно ли написать DSL, который за вас будет генерировать схему базы данных, CRUD и код валидации входных данных на серверной и клиентской стороне? Если ваша СУБД не умеет делать UPSERT, можно ли написать генератор хранимых процедур, делающих UPSERT в заданные таблицы? Если в проекте используется NoSQL база данных, не поддерживающая транзакции, как их можно добавить? Можно ли автоматически заполнять поле описания товара, если уже известны основные его характеристики?
Пишите для себя. Подумайте, какие вещи постоянно отвлекают вас от работы или занимают много времени. Если это составление каких-то отчетов, почему бы не генерировать их автоматически? Если это разгребание Twitter или RSS-читалки, почему бы не написать свою читалку, скажем, умеющую фильтровать контент по стоп-словам? Если вам приходит много спама, можно ли написать для вашего почтового клиента более удачный спам-фильтр? Может быть, высылать в ответ на все письма от неизвестных отправителей капчу?
Если вы нашли неприятный баг в используемой вами программе, попробуйте написать для нее патч. Примите участие в разработке вашего любимого оконного менеджера или IDE, добавьте в них фичи, которых вам не хватает. Не знаете, как? Тем лучше, разберитесь!
Попробуйте что-нибудь новое. Если у вас на всех серверах используется Linux, попробуйте какую-нибудь другую операционную систему, скажем, FreeBSD. Чем FreeBSD лучше Linux, а чем хуже? Есть ли в Linux портированные версии или достойные аналоги ZFS, jails и dtrace? Что вам больше нравится — ipfw или iptables? В какой ОС поддерживается больше железа, где предлагаются более свежие пакеты? Как вы считаете, какая ОС более безопасна и почему?
Независимо от того, понравится ли вам FreeBSD, попробовав эту ОС, вы только выиграете. Либо вы станете еще больше уверены в том, что на серверах должен стоять только Linux, либо вы поймете, что для некоторых ваших задач имеет смысл попробовать FreeBSD. Возможно, изучая FreeBSD, вы узнаете что-то, что позволит более эффективно использовать Linux.
Аналогично вы можете попробовать новые языки программирования (советую попробовать Haskell, Erlang, Clojure, Prolog) и новые СУБД (Redis, MongoDB, Riak, Neo4j, да и RabbitMQ в какой-то степени тоже СУБД). Возможно, после этого вам захочется писать системные тесты на Erlang и заменить Memcached на Riak. Попробуйте поработать с альтернативной системой контроля версий, интерактивной средой разработки или системой непрерывной интеграции. Напишите по TDD какое-нибудь небольшое приложение типа сокращалки ссылок. Нынче все говорят о каких-то там облачных хостингах, вы их пробовали?
Вспомните что-нибудь старое. Никогда не знаешь, что и когда пригодится. Сидишь себе на работе, никого не трогаешь, пишешь спокойно GUI на крестах. Тут врывается начальник, и начинает уговаривать слепить приложеньку под iOS, нагенерить отчетов в BIRT или сваять какой-нибудь несложный фронтенд на AngularJS. Так что, если вам когда-то давно доводилось с чем-то работать, вы это так просто не забрасывайте. Например, я в свое время работал с Perl, и до сих пор периодически пописываю на нем различной сложности однострочники. Очень помогает в работе. Знание Си почему-то пригождается мне намного реже, но все равно, я стараюсь его не забывать.
Почувствуйте себя инженером. Ну там архитектором, тимлидом или еще кем-то. Думайте об архитектуре отдельного приложения, архитектуре целой системы, рабочих процессах. Ваше приложение не масштабируется горизонтально? Как это можно исправить? Все ли вас устраивает в вашем воркфлоу? Автоматизировано ли тестирование приложения, выкатка билдов, апгрейд и даунгрейд схемы базы данных? Знаете ли вы, как поведет себя приложение, если другое приложение, с которым оно работает, начнет отдавать данные со скоростью один байт в секунду? Почему бы не сделать приложение-заглушку и не написать тест на этот случай?
Знаете ли вы, с какой скоростью выполняются все используемые SQL-запросы? Почему бы не поднять Graphite и не начать собирать метрики? Найдите неудачные архитектурные решения и подумайте, как их можно устранить. Покройте тестами написанную запутанным образом часть системы. Обязательно убедитесь, что покрыли хотя бы каждую строку кода, а желательно — каждый оператор. Затем произведите рефакторинг. Имеет ли смысл разбить вашу систему на множество более мелких систем? Как это сделать?
Жизнь — это не только программирование. Знаю, для вас это может быть шоком, но это действительно так. Раз работа стала казаться вам скучной, можно предположить, что вы хорошо с ней справляетесь. Ну так воспользуйтесь спокойной обстановкой! Сдайте на права, если вы все еще этого не сделали, займитесь спортом, женитесь, заведите ребенка, научитесь играть на гитаре, получите еще одно образование. Читайте побольше книг, пройдите пару-тройку курсов на Сoursera, выучите как следует английский. Подпишитесь на журнал по какой-нибудь психологии, в жизни пригодится.
Заведите блог о путешествиях и раскрутите его до посещаемости хотя бы 1000 человек в день. Заодно узнайте как можно больше о дизайнах, юзабилити, поисковых оптимизациях, контекстных рекламах, монетизациях и так далее. Или начните записывать подкаст. Прокачайте ораторский скил, избавьтесь от всяких слов-паразитов, добейтесь уверенного и приятного звучания своего голоса. Научитесь работать со звуком, узнайте, зачем нужны компрессия, лимитер, экспандер и нормализация. Чем меньше будет связь с вашей профессиональной деятельностью, тем интереснее.
Напоследок, резюмирую все вышесказанное.
Программирование — это слишком большая область, чтобы узнать в ней все обо всем. Вместо того, чтобы постоянно менять нишу, не лучше ли стать Настоящим Специалистом в своей области? И заодно — неплохо осведомленным человеком в паре соседних. Мир полон интереснейших вещей, на изучение которых не хватит и нескольких жизней. Возможно ли, что вы слишком сосредоточены на жалости к себе, чтобы заметить их?
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.