Вроде бы цифры в статье убеждают меня в том, что софт с большим количеством фич зарабатывает больше чем софт с меньшим количеством, даже не смотря на баги. Но когда мне надоело мириться с очередным багом Lastpass, Я перенёс свои данные в 1Password и был несказанно рад. Пусть в 1Password нельзя создать вложение к записи, нет простого шаринга с другими пользователями и генератор паролей не такой продвинутый. Зато работает стабильно во всех браузерах, на десктопе, телефоне и iPad.
Мне кажется, на конкурентном рынке отсутствие багов может перевесить обилие фич.
По поводу проблемного кода, когда вместо полного имени программист может вызывать функцию, передав только имя или только фамилию:
function get_user(name) {
db_load_user_or_die(name)
}
Здесь как раз система типов может помочь подстелить соломку. Пример на Scala:
//Класс с 4 полями, 3 из которых имеют тип String
case class User(id:Long,
firstName: String,
lastName: String,
email: String)
//Функция, которая принимает то ли имя, то ли фамилию, то ли всё сразу
def findUserByName(name: String) = ???
Чтобы отличать firstName от lastName и от email введём специальные классы, которые под капотом представляют из себя обычный String:
//Вспомогательные классы
case class FirstName(firstName: String)
case class LastName(lastName: String)
case class EmailAddress(emailAddress: String)
case class FullName(fullName: String)
case class UserEnhanced(id: Long,
firstName: FirstName,
lastName: LastName,
email: EmailAddress)
def findUserByName(name: FullName) = ???
//Пример использования
val x: FirstName = FirstName("Mike")
val y: FullName = FullName("Mike Smith")
findUserByName(x) //Ошибка компиляции
findUserByName(y) //Нет ошибки компиляции
В Scala 3 появятся Opaque Type Aliases, которые упростят синтаксис. Это пример, когда проверка типов не даёт 100% гарантии, но однозначно помогает отлавливать логические ошибки.
Мне кажется, byko3y, вы неправильно позиционируете язык Python. Вы критикуете фичи языка, которые лежат в основе Python. Нельзя ругать динамически типизированный язык за то, что он динамически типизированный.
Однако же, по логике вещей, x[0].append(0) должно было бы создать новый или взять уникальный список из нулевого элемента и добавить в него нуль
Откуда такая логика? Потому что каком-то другом языке так? Не стоит по умолчанию тянуть концепции из других языков в Python.
Оператор присвоения и статическая типизация… Ожидается вывод
С чего вы это решили? Если меняете значение переменной, то поменяется результат вычислений. Это работает во всех языках.
Стоит помнить, что смысл питона был в том, чтобы избавить пользователя от мороки явного описания структуры объектов.
Наверное, это самое странное утверждение в статье. Смысл Python зафиксирован в The Zen of Python. Всё остальное — ваши домыслы.
Julia — интересный язык с понятным синтаксисом и удобной многопоточностью (привет пайтоновскому GIL). Позле ознакомления с туториалом возник вопрос: что они натворили со строками?
julia> s = "\u2200 x \u2203 y"
"∀ x ∃ y"
julia> s[1]
'∀': Unicode U+2200 (category Sm: Symbol, math)
julia> s[2]
ERROR: StringIndexError("∀ x ∃ y", 2)
[...]
julia> s[3]
ERROR: StringIndexError("∀ x ∃ y", 3)
Stacktrace:
[...]
julia> s[4]
' ': ASCII/Unicode U+0020 (category Zs: Separator, space)
Почему операция s[i] возвращает ошибку для индексов 2 и 3? Почему программисту нужно помнить внутреннюю кодироку строки и количество байт в каждом символе? В Python 3 эту проблему давно решили раз и на всегда.
В Bitcount для ассиметрической криптографии (приватные ключи, публичные ключи, наложение ЭЦП) используется эллиптическая криптография, а именно кривая Secp256k1.
Как здесь пригодится разложение суммы кубов — не знаю. Но математика взаимосвязана, и прорыв в одной области может привести к результатам в соседней. Например гипотеза Таниямы-Симуры позволила доказать Великую теорему ферма.
Если бы процент продаж игр на MacOS был не 4%, а существенно больше, чтобы окупить устройства Apple и время на разработку, то, думаю, программисты лучше поддерживали бы MacOS. Ведь на iOS и на PS4 такие же строгие правила публикации: обязательная премодерация игр, подпись софра платным сертификатом, принудительное устаревание API.
Спасибо за полезные советы. Опытным программистам они должны быть в большинстве своём очевидными.
По поводу совета «Не используйте булевы значения в качестве параметров» мне вспомнилось правило «Язык определяет сознание». В Java код
getUserMessage(userId, true)
действительно выглядит неинформативно, но в Python можно писать:
getUserMessage(userId, includeBody=True)
A в Smalltalk синтаксис предполагает многословное имя метода:
getUserMessage: userId. //Метод с один аргументом
getUserMessage: userId includeBody: True. //Метод с двумя аргументами
Билеты на поезд/самолёт/кинотеатр, чтобы всегда знать где они лежат и не рыться в сумках;
Отслеживание почтовых посылок;
Копии всех документов в виде JPG сканов на телефоне, если вдруг понадобится ИНН или номер загранпаспорта;
Но есть вещи, которые без телефона делать очень трудно — 2FA через Google Authenticator (или Lastpass Authenticator). Можно заменить на SMS — но это небезопасно и требует роуминга при путешествии заграницу.
Если взглянуть на статью «11 лучших шрифтов для программирования» (плюс комментарии), то выбор моноширный шрифтов не такой уж маленький. Интересно, чем Майкрософтовский шрифт сможет удивить?
О каком новом шрифте идёт речь в статье? Это шрифт из первого видео? По-моему в мире и так слишком много различных моноширных шрифтов. Какую задачу Microsoft решает, создавая ещё один? Больше эмодзи?
Мне интересно, как типографический UI решает стандартные задачу «объясни пользователю как пользоваться программой»? Как отличить кнопку от простого заголовка? Куда кликнуть, чтобы лайкнуть пост? Как показать, что элемент можно перетягивать влево-вправо? Как изобразить два состояния checkbox-а?
За что Я люблю скефоморфизм (незаслуженно забытый), так это за очевидность элементов управления. Выпуклая кнопка — можно нажать, ползунок — можно тащить, круговой регулятор громкости — можно крутить. А как без инструкции понять принципы работы с типографским UI?
Всегда будет компромисс между безопасностью и удобством. Кому-то нужно быстро передавать фотки родственникам, а кому-то — секретные чаты с самоуничтожающимися сообщениями. Я для себя открыл проект Keybase. Номер телефона не требуют, сквозное шифрование, мобильный, десктопный и консольный клиенты под BSD лицензией. Врядли ваши близкие захотять им пользоваться, ведь там нет голосовых звонков, стикеров, каналов с прикольными видосами. Но авторы концентрируются на безопасности, заказывают сторонние аудиты и позиционируют себя как замену Slack.
По сути, так сейчас работает Keybase.io. Новое устройство можно добавить только просканировав QR код с подключенного устройства или введя код, с экрана компьютера. Команда Keybase.io решила множество проблем с отзывом устройств без потери всей истории переписки, с подтверждением личности на других сайтах (twitter, github, др.), со сквозным шифрованием в командных чатах. При этом протоколы организованы таким образом, что клиент не обязан доверять серверу, а сервер — клиенту.
Например на странице keybase.io/max/sigchain можно увидеть, как менялись устройства и обновлялись ключи пользователя «max» (основатель компании).
Мне кажется, на конкурентном рынке отсутствие багов может перевесить обилие фич.
case classes
в Scala, то они всегда иммутабельные. Records в Java таким свойством не обладают. А в остальном похожий подход.Здесь как раз система типов может помочь подстелить соломку. Пример на Scala:
Чтобы отличать
firstName
отlastName
и отemail
введём специальные классы, которые под капотом представляют из себя обычный String:В Scala 3 появятся Opaque Type Aliases, которые упростят синтаксис. Это пример, когда проверка типов не даёт 100% гарантии, но однозначно помогает отлавливать логические ошибки.
Откуда такая логика? Потому что каком-то другом языке так? Не стоит по умолчанию тянуть концепции из других языков в Python.
С чего вы это решили? Если меняете значение переменной, то поменяется результат вычислений. Это работает во всех языках.
Наверное, это самое странное утверждение в статье. Смысл Python зафиксирован в The Zen of Python. Всё остальное — ваши домыслы.
Почему операция s[i] возвращает ошибку для индексов 2 и 3? Почему программисту нужно помнить внутреннюю кодироку строки и количество байт в каждом символе? В Python 3 эту проблему давно решили раз и на всегда.
Как здесь пригодится разложение суммы кубов — не знаю. Но математика взаимосвязана, и прорыв в одной области может привести к результатам в соседней. Например гипотеза Таниямы-Симуры позволила доказать Великую теорему ферма.
По поводу совета «Не используйте булевы значения в качестве параметров» мне вспомнилось правило «Язык определяет сознание». В Java код
действительно выглядит неинформативно, но в Python можно писать:
A в Smalltalk синтаксис предполагает многословное имя метода:
"var"
можно делать пересечения типов:Но есть вещи, которые без телефона делать очень трудно — 2FA через Google Authenticator (или Lastpass Authenticator). Можно заменить на SMS — но это небезопасно и требует роуминга при путешествии заграницу.
За что Я люблю скефоморфизм (незаслуженно забытый), так это за очевидность элементов управления. Выпуклая кнопка — можно нажать, ползунок — можно тащить, круговой регулятор громкости — можно крутить. А как без инструкции понять принципы работы с типографским UI?
Например на странице keybase.io/max/sigchain можно увидеть, как менялись устройства и обновлялись ключи пользователя «max» (основатель компании).