За три десятилетия программистской деятельности, я усвоил пару-тройку уроков. Ниже несколько самых лакомых.
-
Клиенты знают, чего хотят, только после того, как это увидят это. Я усвоил это на моей первой работе. Клиенты не осознают, что, собственно, необходимо, пока вы им это не покажете. Функциональное прототипирование всегда выигрывает у набора слов.
-
При достаточном количестве времени, вся защита может быть взломана. В сегодняшнем мире невероятно сложно правильно построить защиту. Вы должны все время быть совершенны, но хакеру нужно всего один раз преуспеть, чтоб победить.
-
Учитывая, что ваша защита упадет, результат падения зависит от того, каким оно запланировано заблаговременно. Если предположить, что злоумышленник пройдет вашу защиту, то вам нужно иметь план действий на этот случай. Если он проникнет внутрь, но не сможет использовать то, что ворует, потому что вы используете правильные принципы защиты, такие, как неразборчивое соединение с базой или изолирование одного сервера от другого, вы уменьшите вероятность того, что попадете на национальные новости. Глубокая защита всегда выигрывает от поверхносной.
-
Хорошая защита - это не расход, а актив, плохая защита - дорогостоящий удар по активам. На протяжении всей моей карьеры, я слышал, как люди жалуются о том, как сложно или дорого сделать хорошую защиту, но когда она падает - миллиарды долларов идут на ветер. Сохранить несколько баксов, чтоб потерять компанию - глупо.
-
Сложно сделать что-нибудь сложное, чтоб оно выглядело простым, но легко сделать что-нибудь сложное, чтоб выглядело еще более сложным. Это справедливо для программирования, конструирования и практически любой созидательной деятельности. Я всегда старался написать код простым, насколько это было возможным для меня (и любого другого). Если вы будете делать код слишком сложным или слишком умным, то вероятность того, что он правильно работает - низкая. Конечно, я видел код, где программисты прилагали огромные усилия, чтоб сделать его непонятным.
-
Успех приходит с уроками от ошибок, неудача приходит от мыслей, что ошибки - это нормально и с ними можно мириться. Я слышал, как многие люди утверждают, что программирование - это сложно, делать ошибки - это нормально и дерьмовое ПО неизбежно. Так же люди учатся мириться с этим дерьмом потому, что слышат это постоянно. Тем не менее, вы, как программист, не должны принимать эту мысль и стараться делать ошибку только один раз. Есть надежда на то, что вы сделаете их однажды все и теперь вероятно будете делать только хорошее ПО. Никто и никогда не будет идеальным, но вы должны как минимум стремиться к этому.
-
Постоянны только изменения, и вы не можете это изменить. Планируя завтрашний день и думая, что он будет таким, как сегодня - довольно тупо. Особенно в мире программирования - ничто не длиться вечно. Луддитовое отношение, думая, что вы можете сохранить изменения под контролем, никогда не сработает.
-
Никогда не переставайте учиться, технологический "каток" прямо за вами и ждет, когда вы остановитесь. Моя любимая метафора - "большой каток пытающийся вас раздавить, уже почти догнал вашу жопу". Единственный способ быть программистом длительное время - это постоянно двигаться вперед. Если однажды остановитесь отдохнуть, то на дороге от вас останется только плоское пятно.
-
Вся индустрия ПО построена методом научного тыка. Всю мою карьеру люди настаивали на оценке, о том, сколько займет времени, неважно мало или много, и всю мою карьеру все всегда всегда ошибались. Когда-то давным-давно пророков, которые неправильно предсказывали будущее забрасывали камнями, сегодня же можно просто перекинуть на новый спринт.
-
Если что то работает для вас, не значит, что оно заработает для меня или того программиста, что за тем деревом. Существует бесконечное количество решений, которые вы должны принять в любом проекте. Некоторые из них будут превосходные, некоторые приемлемые и совсем ужасные. Но то, что применимо для вас в вашей ситуации и вашим набором решений, может быть совсем не применимо для других. Всегда хорошо слышать, как другие решают проблемы, но мне всегда не нравилось, когда люди настаивают на том, что только их путь самый правильный.
-
Самый важный навык в постоянно меняющемся мире - оценка. Не для всех очевидно, но возможность видеть что-нибудь новое, видеть, что делают другие или сравнить множество вариантов решения и потом выбрать наилучший для вас, вашей команды, вашего проекта или даже компании - невероятно ценно. Множество людей, которых я видел, не очень хороши в этом. Большинство руководителей реально не умеют оценивать. Легко просто делать то, что вам говорят, то, что прочитал в блоге, или просто что все говорят так делать. Намного сложнее посмотреть на вещь со всех сторон сквозь ваши потребности, и выбрать то, что кажется наилучшим на ваш взгляд. Конечно, вам придется принимать решения: людей часто парализует необходимость в оценке и часто приводит к выбору чего-нить случайного или следовать стаду.
-
Существует множество путей решить одну и ту же задачу. Клиентов не интересует ваши проблемы, они только хотят, чтобы ваше ПО сделало то, что им надо. Если ваша система падет, случаются исключения, железо ломается, ваши программисты ужасны, хакеры взламывают... в действительности, это не интересно пользователям. Хорошо быть честным, когда дела идут неважно (а иногда они будут идти неважно), но лучше убедиться в том, что все дерьмо убрано задолго до того, как пользователь увидит вашу работу.
-
Качество лучше всего измеряется у заказчика. Не важно насколько много у вас метрик, сколько контрольных списков вы отметили, качество вашего код ревю, сколько тестов вы написали - ничто не имеет значения, пока заказчик не увидит, что ваше ПО делает все то, что должно, и никогда не делает то, чего не должно. Единственное, что определяет ваше качество кода - производительность, дизайн и юзабилити - это мнение заказчика.
-
То, что вы не знаете, убьет вас, потому, что вы не в состоянии что-либо логировать. Даже сегодня я постоянно поражаюсь: люди все еще не собирают достаточное количество логов, отчетов о сбоях и информацию о использовании, для того, чтоб знать, что по факту ваше ПО делает. Люди, которые не собирают подобную информацию, всегда переоценивают качество. Вы не знаете, если не измеряете и не записываете. Клиент конечно будет. Я всегда настаивал на детальных и полезных логах, слежении за сбоями, чтения отзывов и комментариев, и всего того, до чего смог дотянуться, для того, чтоб знать о проблемах как можно скорее. Тем не менее, я знаю людей, которые думают, что такие вещи не имеют ничего общего с программированием.
- Всегда есть лучший вариант сделать что-нибудь, но время идет. Самое сложное в поиске путей решения задач - вовремя остановиться. Вы можете пропустить наилучший путь, но если это займет слишком много времени, то вероятно уже не будет смысла что-нибудь делать вообще. Это трудно сделать, но иногда наихудший выбор сегодня побеждает наилучший выбор в следующем году.
(Последние две цитаты от продавцов, с которыми я давно работал. Не то, чтобы я полностью с ними согласен, но это своего рода урок).
-
Всегда ищите тупых клиентов с деньгами. Моя любимая цитата от продавца, которого я знал в консалтинговой компании. С его точки зрения, найти людей, которые не разбираются в технологии, но имеют много денег, были основной жилой. Умные люди задают слишком много вопросов, бедные люди не могут позволить себе платить вам. Я рад, что я программист!
- Моя работа - лгать клиентам, твоя работа - преподнести меня в хорошем свете. Моя вторая излюбленная цитата, от того же продавца. Он любил обещать невозможное, а потом пожинать плоды, когда мы сделали работу. Круто делать сложные задачи, но делать невозможное все время - это слишком. Моя рекомендация - найти лучшего продавца!