Как программисты, мы ежедневно решаем различные задачи. Некоторые скучные, некоторые увлекательные. Тем не менее есть несколько общих проблем, с которыми каждый в какой-то момент сталкивается. Эти проблемы часто возникают, когда реальный домен соответствует технологическим ограничениям. Давайте рассмотрим их поближе и попытаемся проанализировать проблему и найти решения как с технической точки зрения, так и с точки зрения навыков межличностного общения.

Время и дата

Хранение меток времени и операций с датами является источником множества проблем. Представьте, что ваше приложение каждую секунду получает данные с внешнего устройства. Ваша задача - просто посчитать суточную сумму. Простой? Да… Однако, раз в год вы получаете на час меньше показаний и еще раз на час больше (летнее время). Кроме того, иногда в одной минуте может быть 61 (!?) Секунда (секунда координации).

Это только начало проблем. Допустим, вам нужно хранить даты с часовыми поясами. Это означает, что вам нужно сохранить два значения - одно для информации о часовом поясе. Как это изобразить? Может быть, целое число для смещения? Нет, знаете ли вы, что Австралия находится в UTC + 08: 45? Какие еще страны меняют свои переходы на летнее время и смещения. Часто это просто политические решения, но взгляните на список Версий данных часовых поясов в различных выпусках JRE. Эти изменения появляются довольно часто, иногда даже при каждом обновлении JRE, об этом стоит знать. К счастью, на практике в большинстве случаев достаточно хранить эпохи Unix.

После более длительного проекта, связанного с большим количеством дат, вы начинаете задумываться, может быть, идея Международного фиксированного календаря верна.

Чтобы найти больше информации о различных странных фактах о времени и часовых поясах, посмотрите сообщение в блоге Ложь, в которую верят программисты о времени и часовых поясах.

Деньги

Как изобразить в коде денежную сумму? Сначала это может показаться простым, но на самом деле это не так. Поплавки и удвоения обычно не подходят, так как они могут не отражать точные суммы. Кроме того, существует десятичная дробь (в Java BigDecimal), однако ее нелегко передать через REST API. Некоторые люди предпочитают вместо этого передавать строки и сохранять в коде десятичные дроби. Другие решают представлять суммы в виде целых чисел, как и количество центов. Однако вы должны быть осторожны, потому что не каждая валюта делится на 100 центов, например Бахрейнский динар делится на 1000 филсов.

Соответствующие библиотеки могут помочь вам с денежным представлением, например в Java есть JSR 354 Money and Currency, который может быть большим подспорьем.

Кодирование

И в моем имени, и в фамилии есть польский диакритический знак - ł. С годами я понял, что обычно не стоит рисковать размещать это в виде иностранных сайтов, но все же каждый раз я пытаюсь это сделать. Результаты разные. Чаще всего персонаж нигде не отображается, как будто его никогда не было. Иногда вместо этого появляются какие-то странные персонажи. На одной конференции просто не было напечатано полное название. У меня не было идентификатора, плюс мои выступления были единственными без имени докладчика. Бывают и более неприятные ситуации. A может принимать диакритические знаки при вводе, но позже мобильное приложение выдает исключение, поскольку оно не может отобразить страницу профиля из-за недопустимых символов. У меня было больше подобных случаев, поэтому я могу лично заявить, что многие разработчики просто игнорируют кодировку неанглийских символов.

Самый важный урок для программистов - использовать UTF-8 везде, где это возможно. Он подойдет для большинства случаев.

Если вы хотите узнать больше о кодировании, прочтите следующую статью: Что абсолютно необходимо знать каждому программисту о кодировках и наборах символов для работы с текстом.

Сверхинженерия

Люди склонны к чрезмерному усложнению. Мы часто думаем, что более сложное решение лучше. Мы проектируем вещи, которые, как мы прогнозируем, могут быть полезны в будущем для других еще не определенных функций. Вы когда-нибудь слышали о ком-нибудь, кто решил начать развертывание приложения Java EE на разных серверах приложений? Или о ком-то, кто на самом деле изменил Spring XML, изменив инъекции, не перестраивая весь проект? Вероятно, не. Мы находим некоторые из этих вещей потрясающими, потому что они часто впечатляют с технической точки зрения, но в то же время сложны и понятны.

При работе с кодом мы часто создаем сложные иерархии или пытаемся использовать в проекте новые модные библиотеки только потому, что они в тренде. Мы изобретаем сложные решения тривиальных задач, чтобы сделать нашу работу интереснее.

Как это ограничить? Подумайте дважды, прежде чем выбирать любую незрелую библиотеку. Также попробуйте TDD, который заставляет задуматься о сценариях использования разработанного кода. Вы также можете попробовать использовать TDD as if you Meant It, который позволяет писать производственный код только тогда, когда для реализации теста необходимо продублировать логику.

Оценки

Правда суровая. Никто не совершенен в оценке. Вы когда-нибудь пробовали достроить дом? Оценки - не только слабое место программиста. В зависимости от удачи, «простой дом» может задержаться на месяцы. Люди всегда надеются, что им удастся закончить дела быстрее, не ожидая неожиданного.

Как с этим справиться? Планирование покера, оценка сюжетных очков вместо дней. Позже вы сможете рассчитать скорость команды. Часто стоит просто удвоить каждую оценку, просто чтобы смягчить будущие проблемы.

Встречи

Работа программиста касается не только кода и машин, но и других людей - членов команды, клиентов, менеджеров. (К сожалению;)) встречи требуются. Многие люди просто ненавидят их, потому что они заставляют их перестать писать код. Однако во многих случаях они необходимы. Единственное, что мы можем сделать, - это сделать их максимально полезными и быстрыми. Двояко подумайте, кто должен участвовать, не приглашайте людей на всякий случай и всегда ставьте повестку дня, упоминая, что нужно решить во время ограниченного по времени собрания.

Выводы

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