Исследуя GitHub
В функциональном программировании есть удобная концепция
Было:
Стало:
Теперь представьте, что таких преобразований не одно, а много.
Надавно нашел бибилиотеку для JavaScript/TypeScript, реализующую эту
https://github.com/bcherny/tsoption
#js #ts #fp
В функциональном программировании есть удобная концепция
Option. Это абстракция над переменной, которой может и не быть (null, undefined, etc.). Она позволяет работать с такими значениями как с коллекцией (пустой, или из одного элемента).Было:
const parsedInput = !!nullableVar
? parseInt(nullableVar) + 12
: 1
calculate(parsedInput)Стало:
const parsedInput = optionInput
.map(v => parseInt(v))
.map(v => v + 12)
.getOrElse(1)
calculate(parsedInput)Теперь представьте, что таких преобразований не одно, а много.
Надавно нашел бибилиотеку для JavaScript/TypeScript, реализующую эту
Option.https://github.com/bcherny/tsoption
#js #ts #fp
Проектирование
Относительно функций все сказанное о инверсии зависимостей не слишком часто используется в реальной практике.
Основная область применения этого принципа — объектно-ориентированное программирование.
Если один из ваших классом занимается отправкой уведомлений и для этого ему нужно куда-то послать HTTP запрос, лучше не создавать HTTP-клиент внутри.
Плохо:
Хорошо:
Почему?
+ Для тестов легко передать фейковый клиент.
+ Заменить реализацию HTTP-клиента можно не трогая
+ Можно сделать один клиент, раздать его всем желающим и сэкономить на создании.
+ Циклические зависимости разрешать легко.
#проектирование
Относительно функций все сказанное о инверсии зависимостей не слишком часто используется в реальной практике.
Основная область применения этого принципа — объектно-ориентированное программирование.
Если один из ваших классом занимается отправкой уведомлений и для этого ему нужно куда-то послать HTTP запрос, лучше не создавать HTTP-клиент внутри.
Плохо:
class Notificator {
constructor() {
this.httpClient = new HttpClient()
}
notify() {
// do something with this.httpClient
}
}Хорошо:
class Notificator {
constructor(httpClient) {
this.httpClient = httpClient
}
notify() {
// do something with this.httpClient
}
}Почему?
+ Для тестов легко передать фейковый клиент.
+ Заменить реализацию HTTP-клиента можно не трогая
Notificator.+ Можно сделать один клиент, раздать его всем желающим и сэкономить на создании.
+ Циклические зависимости разрешать легко.
#проектирование
Онлайн-курс
Часто встречаю разработчиков, которые даже близко не представляют как работает компьютер.
Уверен, что это знание сильно помогает писать приложения без удивления.
Отличный бесплатный курс на Stepik. Рассказывают как работает компьютер, немного про ассемблер, как устроены операционные системы.
Наверно, глубокие знания в этих областях нужны очень небольшому количеству программистов. Но иметь общее представление важно всем.
#общие_знания
Часто встречаю разработчиков, которые даже близко не представляют как работает компьютер.
Уверен, что это знание сильно помогает писать приложения без удивления.
Отличный бесплатный курс на Stepik. Рассказывают как работает компьютер, немного про ассемблер, как устроены операционные системы.
Наверно, глубокие знания в этих областях нужны очень небольшому количеству программистов. Но иметь общее представление важно всем.
#общие_знания
Проектирование
Итак, мы написали весь код передавая зависимости через конструктор. И получили такой клиентский код:
Как этим пользоваться? Никак.
Вместо создания сервисов руками в клиентском коде следует делегировать эту работу кому-нибудь. Например, DI-контейнеру. Эта штука создает все нужные сервисы (на основании какой-то конфигурации) и позволяет получить уже подготовленный сервис в клиентском коде.
#проектирование
Итак, мы написали весь код передавая зависимости через конструктор. И получили такой клиентский код:
const notificator = new Notificator(
new SmsAdapter(
new HttpClient(),
new Logger(),
),
)Как этим пользоваться? Никак.
Вместо создания сервисов руками в клиентском коде следует делегировать эту работу кому-нибудь. Например, DI-контейнеру. Эта штука создает все нужные сервисы (на основании какой-то конфигурации) и позволяет получить уже подготовленный сервис в клиентском коде.
const notificator = Container.get(Notifier)#проектирование
Нужная книга
Две недели назад закончил читать "Программиста-фанатика" и готов порекомендовать ее.
Книга совсем не о фанатизме. Оригинальное название "The Passionate Programmer" куда точнее отражает содержание. Она о том, как быть выдающимся программистом. И какую пользу это приносит.
В ней совсем мало про конструирование программ. Большая часть посвящена построению карьеры.
#программист_фанатик
Две недели назад закончил читать "Программиста-фанатика" и готов порекомендовать ее.
Книга совсем не о фанатизме. Оригинальное название "The Passionate Programmer" куда точнее отражает содержание. Она о том, как быть выдающимся программистом. И какую пользу это приносит.
В ней совсем мало про конструирование программ. Большая часть посвящена построению карьеры.
#программист_фанатик
Проектирование
Полезно понимать, что такое паттерны проектирования.
Паттерн проектирования — это часто встречающееся решение определённой проблемы при проектировании программ. Важно понимать, что это не кусок кода, не библиотека. Это подход к решению проблемы. Реализация одного и того же паттерна в двух разных приложения может сильно отличаться.
Возникает логичный вопрос, зачем изучать паттерны? Три причины:
+ Проверенные решения. Если кто-то уже решил проблему, то не нужно городить свой велосипед.
+ Стандартизация кода. Другим людям, знающим паттерны, сразу понятно, что написано.
+ Общий программистский словарь. Быстрее сказать коллеге: "Да зафигач сюда адаптер и не парь мозг!", чем "Ну ты сделай класс, который будет превращать интерфейс вот этой штуки в такой, который подходит вот этой штуке."
Ну и последнее. Не нужно бездумно использовать весь перечень паттернов проектирование. Лучше прочитать, осознать и отложить. Потом начать подмечать в коде места, где один из шаблонов смотрелся бы хорошо. И только спустя время начать их применять. Вдумчиво и осторожно.
#проектирование
Полезно понимать, что такое паттерны проектирования.
Паттерн проектирования — это часто встречающееся решение определённой проблемы при проектировании программ. Важно понимать, что это не кусок кода, не библиотека. Это подход к решению проблемы. Реализация одного и того же паттерна в двух разных приложения может сильно отличаться.
Возникает логичный вопрос, зачем изучать паттерны? Три причины:
+ Проверенные решения. Если кто-то уже решил проблему, то не нужно городить свой велосипед.
+ Стандартизация кода. Другим людям, знающим паттерны, сразу понятно, что написано.
+ Общий программистский словарь. Быстрее сказать коллеге: "Да зафигач сюда адаптер и не парь мозг!", чем "Ну ты сделай класс, который будет превращать интерфейс вот этой штуки в такой, который подходит вот этой штуке."
Ну и последнее. Не нужно бездумно использовать весь перечень паттернов проектирование. Лучше прочитать, осознать и отложить. Потом начать подмечать в коде места, где один из шаблонов смотрелся бы хорошо. И только спустя время начать их применять. Вдумчиво и осторожно.
#проектирование
Мудрость из книги
У созданного прототипа есть три ценности:
+ Клиент посмотрит на какое-то подобие системы и даст обратную связь.
+ Программисты, которым предстоит писать настоящую систему познакомятся с проблемой. Поймут ее на более глубоком уровне.
+ Программисты, которые пишут другие части системы (интерфейс, например) смогут начинать разработку, постепенно переходя от взаимодействия с прототипом к работе с настоящей системой.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
У созданного прототипа есть три ценности:
+ Клиент посмотрит на какое-то подобие системы и даст обратную связь.
+ Программисты, которым предстоит писать настоящую систему познакомятся с проблемой. Поймут ее на более глубоком уровне.
+ Программисты, которые пишут другие части системы (интерфейс, например) смогут начинать разработку, постепенно переходя от взаимодействия с прототипом к работе с настоящей системой.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Проектирование
Для удобства высоколобые мужи разделили паттерны проектирования на три типа:
1. Порождающие. Они заведуют созданием объектов хитрыми способами. Помогают избегать лишних зависимостей.
2. Структурные. Существуют для построения хитрых связей между объектами.
3. Поведенческие. Помогают объектам общаться между собой, не создавая дополнительных связей.
Наверное, это классификация — не самое полезное, что нужно знать о проектировании ПО. Но для упорядочивания в голове информации о шаблонах проектирования сгодится.
#проектирование
Для удобства высоколобые мужи разделили паттерны проектирования на три типа:
1. Порождающие. Они заведуют созданием объектов хитрыми способами. Помогают избегать лишних зависимостей.
2. Структурные. Существуют для построения хитрых связей между объектами.
3. Поведенческие. Помогают объектам общаться между собой, не создавая дополнительных связей.
Наверное, это классификация — не самое полезное, что нужно знать о проектировании ПО. Но для упорядочивания в голове информации о шаблонах проектирования сгодится.
#проектирование
Нужная книга
Программисты часто не слишком думают о чем-то кроме работы. Это не здорово.
"Soft Skills: The Software Developer's Life Manual" концентрируется как раз на этом. Как прожить жизнь и не облажаться.
Не уверен, что это будет полезно абсолютно всем. Но попробовать стоит.
Джон Сонмез рассказывает о кучи интересных штук: от востребованности на рынке труда до раннего выхода на пенсию.
#softskills
Программисты часто не слишком думают о чем-то кроме работы. Это не здорово.
"Soft Skills: The Software Developer's Life Manual" концентрируется как раз на этом. Как прожить жизнь и не облажаться.
Не уверен, что это будет полезно абсолютно всем. Но попробовать стоит.
Джон Сонмез рассказывает о кучи интересных штук: от востребованности на рынке труда до раннего выхода на пенсию.
#softskills
Мудрость из книги
Любой публичный интерфейс должен быть информативен. Если это интерфейс класса, то любой метод должен своим именем выражать, что он делает. Причем не как, а что.
Никогда не следует раскрывать детали реализации в интерфейсе.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Любой публичный интерфейс должен быть информативен. Если это интерфейс класса, то любой метод должен своим именем выражать, что он делает. Причем не как, а что.
Никогда не следует раскрывать детали реализации в интерфейсе.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Онлайн-курс и Нужная книга
Программист, которые не имеет базовых знаний алгоритмов — странный программист. И уж точно такой разработчик стоит сильно меньше, чем его начитанный коллега.
Где научиться? Три варианта разной степени сложности.
1. Книга "Грокаем алгоритмы". Она простая, дружелюбная к читателю и даёт хорошие базовые знания.
2. Англоязычный платный курс Algorithmic Toolbox от Coursera. Качественный, с крутыми задачами и хорошими лекциями. Кстати, учащиеся могут написать письмо и получить курс бесплатно.
3. Русскоязычный бесплатный курс на Stepik. Не хуже, чем аналогичные от Coursera, даже преподавательский состав похож. Но задач меньше.
#обшие_знания
Программист, которые не имеет базовых знаний алгоритмов — странный программист. И уж точно такой разработчик стоит сильно меньше, чем его начитанный коллега.
Где научиться? Три варианта разной степени сложности.
1. Книга "Грокаем алгоритмы". Она простая, дружелюбная к читателю и даёт хорошие базовые знания.
2. Англоязычный платный курс Algorithmic Toolbox от Coursera. Качественный, с крутыми задачами и хорошими лекциями. Кстати, учащиеся могут написать письмо и получить курс бесплатно.
3. Русскоязычный бесплатный курс на Stepik. Не хуже, чем аналогичные от Coursera, даже преподавательский состав похож. Но задач меньше.
#обшие_знания
Исследуя GitHub
Часто хочу кому-нибудь отправить кусок кода картинкой. И это так заморочено. Нужно же с подсветкой, красивым форматированием и вот этим всем.
Утилита, которая сама все это делает — https://github.com/dawnlabs/carbon
Часто хочу кому-нибудь отправить кусок кода картинкой. И это так заморочено. Нужно же с подсветкой, красивым форматированием и вот этим всем.
Утилита, которая сама все это делает — https://github.com/dawnlabs/carbon
Мудрость из книги
Все действия лучше разделить на "команды" и "запросы".
Запросы не могут изменить состояние приложения. Они только возвращают данные по каким-то критериям. Никаких побочных эффектов!
Команды изменяют состояние приложения. Но ничего не возвращают (иначе будет соблазн использовать их как запросы).
Это помогает контролировать сложность приложения.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Все действия лучше разделить на "команды" и "запросы".
Запросы не могут изменить состояние приложения. Они только возвращают данные по каким-то критериям. Никаких побочных эффектов!
Команды изменяют состояние приложения. Но ничего не возвращают (иначе будет соблазн использовать их как запросы).
Это помогает контролировать сложность приложения.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Нужная книга
Этим летом прочел "Чистый код" Роберта Мартина. Пожалуйста, это одна из самых полезных книг по программированию, что я читал.
Всем причастным очень рекомендую. Это не книга о конкретном языке программирования, а о конструировании программ в целом. О способах сделать работу хорошо, так чтобы пришедшие на проект после вас не страдали, а были благодарны.
Кстати, стоит помнить, что этими "пришедшими" может быть и автор кода, но через несколько месяцев, когда проект стерся из памяти и нужно изучать код заново.
#чистый_код
Этим летом прочел "Чистый код" Роберта Мартина. Пожалуйста, это одна из самых полезных книг по программированию, что я читал.
Всем причастным очень рекомендую. Это не книга о конкретном языке программирования, а о конструировании программ в целом. О способах сделать работу хорошо, так чтобы пришедшие на проект после вас не страдали, а были благодарны.
Кстати, стоит помнить, что этими "пришедшими" может быть и автор кода, но через несколько месяцев, когда проект стерся из памяти и нужно изучать код заново.
#чистый_код
Проектирование
Меня с неделю назад спросили, можно ли использовать какие-нибудь паттерны проектирования в функциональном программировании.
Тут важно понять, что сейчас мы не пишем программы в чисто объектном стиле, или чисто функциональном стиле. Это чаще всего синергия подходов.
Но все же, некоторые системы ближе к ФП. В них можно использовать часть паттернов из ООП-мира, и часть специфических.
Пример — инверсия зависимости через компоненты высшего порядка в React. Такие компоненты дополняют пропсы оригинального компонента какими-то новыми, в которых могут содержаться функции выполняющие определенные действия. Например, запросы к API. При этом, конечный компонент не беспокоится о том, какая реализация API клиента к нему попала и откуда она взялась.
#проектирование
Меня с неделю назад спросили, можно ли использовать какие-нибудь паттерны проектирования в функциональном программировании.
Тут важно понять, что сейчас мы не пишем программы в чисто объектном стиле, или чисто функциональном стиле. Это чаще всего синергия подходов.
Но все же, некоторые системы ближе к ФП. В них можно использовать часть паттернов из ООП-мира, и часть специфических.
Пример — инверсия зависимости через компоненты высшего порядка в React. Такие компоненты дополняют пропсы оригинального компонента какими-то новыми, в которых могут содержаться функции выполняющие определенные действия. Например, запросы к API. При этом, конечный компонент не беспокоится о том, какая реализация API клиента к нему попала и откуда она взялась.
#проектирование
Мудрость из книги
Нельзя допускать, чтобы код у разных членов команды сильно отличался. На страже этого стоит непрерывная интеграция. Речь идёт не только, и не столько, о тестах и линтерах на CI-сервере. Куда важнее постоянно интегрировать модель предметной области. Искоренять дубликаты понятий, изучать домен глубже.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Нельзя допускать, чтобы код у разных членов команды сильно отличался. На страже этого стоит непрерывная интеграция. Речь идёт не только, и не столько, о тестах и линтерах на CI-сервере. Куда важнее постоянно интегрировать модель предметной области. Искоренять дубликаты понятий, изучать домен глубже.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Мудрость из книги
Последние главы были о сосуществовании новой системы с крутой моделью и какой-то другой.
Если вторая система очень старая и "грязная" можно ввести предохранительный уровень. Это место, в котором сконцентрировано общение новой и старой модели. Грязь не может проползти в новую систему, а старая система не вынуждена подстраиваться под новую.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Последние главы были о сосуществовании новой системы с крутой моделью и какой-то другой.
Если вторая система очень старая и "грязная" можно ввести предохранительный уровень. Это место, в котором сконцентрировано общение новой и старой модели. Грязь не может проползти в новую систему, а старая система не вынуждена подстраиваться под новую.
Конспект книги Эрика Эванса "Предметро-ориентированное проектирование".
#ddd
Нужная книга
Дочитал "Предметро-ориентированное проектирование" Эрика Эванса.
Думаю, через год следует перечитать и посмеяться над собой.
Книга монументальна. В ней изложен совершенно непривычный для меня способ построения приложений. В нем следует концентрироваться на бизнес-области заказчика, много работать со специалистами и думать головой.
Читать стоит, причем несколько раз, с некоторыми интервалами.
#ddd
Дочитал "Предметро-ориентированное проектирование" Эрика Эванса.
Думаю, через год следует перечитать и посмеяться над собой.
Книга монументальна. В ней изложен совершенно непривычный для меня способ построения приложений. В нем следует концентрироваться на бизнес-области заказчика, много работать со специалистами и думать головой.
Читать стоит, причем несколько раз, с некоторыми интервалами.
#ddd
Ссылка
Хекслет — крутые. Недавно они выложили список хороших практик для разработки.
Стоит ознакомиться.
#общие_знания
Хекслет — крутые. Недавно они выложили список хороших практик для разработки.
Стоит ознакомиться.
#общие_знания