Разное

Простое программирование: «Простое» программирование на python / Хабр

Содержание

«Простое» программирование на python / Хабр


functools (это такая свалка для всяких ненужных мне вещей :-).
— Гвидо ван Россум

Может показаться, что статья о ФП, но я не собираюсь обсуждать парадигму. Речь пойдет о переиспользовании и упрощении кода — я попытаюсь доказать, что вы пишете слишком много кода, поэтому он сложный и тяжело тестируется, но самое главное: его долго читать и менять.

В статье заимствуются примеры и/или концепции из библиотеки funcy. Во-первых, она клевая, во-вторых, вы сразу же сможете начать ее использовать. И да, нам понадобится ФП.


Кратко о ФП


  • чистые функции
  • функции высшего порядка
  • чувство собственного превосходства над теми, кто пишет не функционально (необязательно)

ФП также присущи следующие приемы:

  • частичное применение
  • композирование (в python еще есть декораторы)
  • ленивые вычисления

Если вам все это уже знакомо, переходите сразу к примерам.


Чистые функции

Чистые функции зависят только от своих параметров и возвращают только свой результат. Следующая функция вызванная несколько раз с одним и тем же аргументом выдаст разный результат (хоть и один и тот же объект, в данном случае %).

Напишем функцию-фильтр, которая возвращает список элементов с тру-значениями.

pred = bool
result = []
def filter_bool(seq):
    for x in seq:
        if pred(x):
            result.append(x)
    return result

Сделаем ее чистой:

pred = bool
def filter_bool(seq):
    result = []
    for x in seq:
        if pred(x):
            result.append(x)
    return result

Теперь можно вызвать ее лярд раз подряд и результат будет тот же.


Функции высшего порядка

Это такие функции, которые принимают в качестве аргументов другие функции или возвращают другую функцию в качестве результата.

def my_filter(pred, seq):
    result = []
    for x in seq:
        if pred(x):
            result.
append(x) return result

Мне пришлось переименовать функцию, потому что она теперь куда полезнее:

above_zero = my_filter(bool, seq)
only_odd = my_filter(is_odd, seq)
only_even = my_filter(is_even, seq)

Заметьте, одна функция и делает уже много чего. Вообще-то, она должна быть ленивой, делаем:

def my_filter(pred, seq):
    for x in seq:
        if pred(x):
            yield x

Вы заметили, что мы удалили код, а стало только лучше? Это лишь начало, скоро мы будем писать функции только по праздникам. Вот смотрите:

my_filter = filter

Встроенных возможностей python почти хватает для полноценной жизни, нужно лишь их грамотно компоновать.


Частичное применение

Это процесс фиксации части аргументов функции, который создает другую функцию, меньшей арности. В переводе на наш это

functools.partial.

filter_bool = partial(filter, bool)
filter_odd = partial(filter, is_odd)
filter_even = partial(filter, is_even)

Я понимаю, что это все азы ФП, но хочу отметить, что мы не написали ничего нового: мы взяли уже готовые функции и сделали другие. Основа новых — очень маленькие, простые, легкотестируемые функции, мы можем без опаски использовать их для создания более сложных.


Композирование

Такой простой, крутой и нужной штуки в python нет. Ее можно написать самостоятельно, но хотелось бы вменяемой сишной имплементации 🙁

def compose(*fns):
    init, *rest = reversed(fns)
    return lambda *a, **kw: reduce(lambda a, b: b(a), rest, init(*a, **kw))

Теперь мы можем делать всякие штуки (выполнение идет справа налево):

mapv = compose(list, map)
filterv = compose(list, filter)

Это прежние версии

map и filter из второй версии python. Теперь, если вам понадобится неленивый map, вы можете вызвать mapv. Или по старинке писать чуть больше кода. Каждый раз.

Функции compose и partial прекрасны тем, что позволяют переиспользовать уже готовые, оттестированные функции. Но самое главное, если вы понимаете преимущество данного подхода, то со временем станете сразу писать их готовыми к композиции.

Это очень важный момент — функция должна решать одну простую задачу, тогда:


  • она будет маленькой
  • ее будет проще тестировать
  • легко композировать
  • просто читать и менять
  • тяжело сломать

Пример

Задача: дропнуть None из последовательности.
Решение по старинке (чаще всего даже не пишется в виде функции):

no_none = (x for x in seq if x is not None)

Обратите внимание: без разницы как называется переменная в выражении. Это настолько неважно, что большинство программистов тупо пишут x, чтобы не заморачиваться. Все пишут этот бессмысленный код раз за разом. Каждый цензура раз: for, in, if и несколько раз x — потому что для компрехеншена нужен scope и у него есть свой синтаксис. Мы пишем: на каждую итерацию цикла присвоить переменной значение. И оно присваивается, и проверяется условие.

Мы каждый раз пишем этот бойлерплейт и пишем тесты на этот бойлерплейт. Зачем?

Давайте перепишем:

from operator import is_
from itertools import filterfalse
from functools import partial
is_none = partial(is_, None)
filter_none = partial(filterfalse, is_none) 
# Использование
no_none = filter_none(seq)
# Переиспользование
all_none = compose(all, partial(map, is_none))

Все. Никакого лишнего кода. Мне приятно такое читать, потому что этот код (no_none = filter_none(seq)) очень простой. То, как работает это функция, мне нужно прочитать ровно один раз за все время в проекте. Компрехеншен вам придется читать каждый раз, чтобы точно понять что оно делает. Ну или засуньте ее в функцию, без разницы, но не забудьте про тесты.


Пример 2

Довольно частая задача получить значения по ключу из массива словарей.

names = (x['name'] for x in users)

Кстати, работает очень быстро, но мы снова написали кучу ненужной фигни. Перепишем, чтобы работало еще быстрее:

from operator import itemgetter
def pluck(key, seq):
    return map(itemgetter(key), seq)
# Использование
names = pluck('name', users)

А как часто мы это будем делать?

get_names = partial(pluck, 'name')
get_ages = partial(pluck, 'age')
# Сложнее
get_names_ages = partial(pluck, ('name', 'age'))
users_by_age = compose(dict, get_names_ages)
ages = users_by_ages(users)  # {x['name']: x['age'] for x in users}

А если у нас объекты? Пф, параметризируй это:

from operator import itemgetter, attrgetter
def plucker(getter, key, seq):
    return map(getter(key), seq)
pluck = partial(plucker, itemgetter)
apluck = partial(plucker, attrgetter)
# Использование
names = pluck('name', users)  # (x['name'] for x in users)
object_names = apluck('name', users)  # (x.name for x in users)
# Геттеры умеют сразу таплы данных
object_data = apluck(('name', 'age', 'gender'), users)  # ((x.name, x.age, x.gender) for x in users)

Пример 3

Представим себе простой генератор:

def dumb_gen(seq):
    result = []
    for x in seq:
        # здесь что-то проиcходит
        result.
append(x) return result

Тут полно бойлерплейта: мы создаем пустой список, затем пишем цикл, добавляем элемент в список, отдаем его. Кажется, я буквально перечислил все тело функции 🙁

Правильным решением будут использование filter(pred, seq) или map(func, seq), но иногда нужно сделать что-то сложнее, т.е. генератор написать действительно нужно. А если результат всегда нужен в виде списка или тапла? Да легко:

@post_processing(list)
def dumb_gen(seq):
    for x in seq:
        ...
        yield x

Это параметрический декоратор, работает он так:

result = post_processing(list)(dumb_gen)(seq)

Т.е. результатом первого вызова будет новая функция, которая примет функцию в качестве аргумента и вернет другую функцию. Звучит сложнее, чем есть:

def post_processing(post):
    return lambda func: compose(post, func)

Обратите внимание, я использовал уже существующую compose. Результат — новая функция, которую никто не писал.
А теперь стихи:

post_list = post_processing(list)
post_tuple = post_processing(tuple)
post_set = post_processing(set)
post_dict = post_processing(dict)
join_comma = post_processing(', '.join)
@post_list
def dumb_gen(pred, seq):
    for x in seq:
        ...
        yield x

Куча новых функций по цене одной! И я убрал бойлерплейт, функция стала меньше и намного симпатичнее.


Итог

Перебирая данные железобетонными функциями (чистыми, высшими), мы сохраняем простоту реализации и обеспечиваем стабильность программы, которую проще тестировать:


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

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


С чего начать?


  • обязательно ознакомьтесь с itertools, functools, operator, collections, в особенности с примерами в конце
  • загляните в документацию funcy или другой фпшной либы, почитайте исходный код
  • напишите свой funcy, весь он сразу вам не нужен, но опыт очень пригодится

Credits

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

Clojure как-то так устроен, что вам приходится писать проще, без привычных нам вещей: без переменных, без любимого стиля «романа», где сначала мы раскрываем личность героя, потом пускаемся в его сердечные проблемы. В clojure вам приходится думать %) В нем только базовые типы данных и «отсутствие синтаксиса» (с). И эту «простую» концепцию, оказывается, можно портировать в python.


UPD

Похоже, у читателей сложилось впечатление, будто я пишу сплошным ФП. Хочу всех успокоить: функциональный подход я использую исключительно в местах, где пишется код, который я уже писал. На мой взгляд, повторять «рабочие» приемы всякий раз глупо и бессмысленно, поэтому перевожу подобные куски в функции и использую их повторно. Рабочий пример можно посмотреть в комментарии.

Python 3 для начинающих и чайников

Язык программирования Python 3 — это мощный инструмент для создания программ самого разнообразного назначения, доступный даже для новичков. С его помощью можно решать задачи различных типов.

Этот сайт призван помочь начинающим и чайникам научиться программировать на python 3. Также здесь можно подробнее узнать об особенностях функционирования этого языка.

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

  1. Python — интерпретируемый язык программирования. С одной стороны, это позволяет значительно упростить отладку программ, с другой — обуславливает сравнительно низкую скорость выполнения.
  2. Динамическая типизация. В python не надо заранее объявлять тип переменной, что очень удобно при разработке.
  3. Хорошая поддержка модульности. Вы можете легко написать свой модуль и использовать его в других программах.
  4. Встроенная поддержка Unicode в строках. В Python необязательно писать всё на английском языке, в программах вполне может использоваться ваш родной язык.
  5. Поддержка объектно-ориентированного программирования. При этом его реализация в python является одной из самых понятных.
  6. Автоматическая сборка мусора, отсутствие утечек памяти.
  7. Интеграция с C/C++, если возможностей python недостаточно.
  8. Понятный и лаконичный синтаксис, способствующий ясному отображению кода. Удобная система функций позволяет при грамотном подходе создавать код, в котором будет легко разобраться другому человеку в случае необходимости. Также вы сможете научиться читать программы и модули, написанные другими людьми.
  9. Огромное количество модулей, как входящих в стандартную поставку Python 3, так и сторонних. В некоторых случаях для написания программы достаточно лишь найти подходящие модули и правильно их скомбинировать. Таким образом, вы можете думать о составлении программы на более высоком уровне, работая с уже готовыми элементами, выполняющими различные действия.
  10. Кроссплатформенность. Программа, написанная на Python, будет функционировать совершенно одинаково вне зависимости от того, в какой операционной системе она запущена. Отличия возникают лишь в редких случаях, и их легко заранее предусмотреть благодаря наличию подробной документации.

Изучение языка программирования python — это просто и понятно даже для чайников. Уже сейчас вы можете скачать python и написать свою первую программу!

Также у нас появился самоучитель Python, собранный из материалов данного сайта. Удачного изучения Python!

Свежее

  • Модуль csv — чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ

Категории

  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов

Полезные материалы

  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Мы в соцсетях

О Simple Programmer — Simple Programmer

Привет, я Джон Сонмез, основатель Simple Programmer и автор «Soft Skills: Life Manual Developer’s Life Manual»

и «Полного руководства по карьере разработчика программного обеспечения».

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

Изначально я запустил Simple Programmer в 2009 году как личный блог, в котором я пытался преобразовать то, что я изучал, в простой и понятный контент.

Но сегодня Simple Programmer — это больше, чем просто блог и больше, чем я.

Сегодня Simple Programmer помогает разработчикам программного обеспечения, программистам и другим ИТ-специалистам улучшить свою карьеру и жить лучше.

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

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

Вы обнаружите, что контент Simple Programmer носит целостный характер.

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

Моя цель в Simple Programmer — не только помочь вам найти лучшую работу и заработать больше денег — хотя я, безусловно, хочу этого, — но и помочь вам совершенствоваться во всех сферах вашей жизни.

Чтобы помочь вам обрести уверенность в себе, стать более продуктивным, найти и достичь своих целей и даже исследовать удивительный мир предпринимательства.

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

Если вас это интересует, зарегистрируйтесь здесь, чтобы получать бесплатные обновления и стать частью сообщества Simple Programmer, где вы найдете единомышленников-разработчиков программного обеспечения, которые также стремятся улучшить свою жизнь и свою карьеру.

Все еще не уверены, что Simple Programmer вам подходит? Посмотрите наш трейлер на YouTube:

О Джоне

Я начал писать код, когда мне было около 10 лет, когда я создал свою первую игру на Q-Basic.

Я действительно заинтересовался программированием, когда сам выучил C, чтобы создать свой MUD. Я до сих пор шучу, что когда-нибудь, когда я вырасту,

, я стану программистом видеоигр. (Это еще может случиться!)

14 февраля 2013 года я официально уволился с основной работы в возрасте 33 лет…

Но я не совсем ушел на пенсию. Вместо этого я решил сосредоточить все свои усилия на развитии Simple Programmer и сделать его лучшим местом в Интернете для разработчиков программного обеспечения. (Вы можете прочитать все о моем пути к досрочному выходу на пенсию в главе 55 «Мягких навыков», если вам нужны подробности.)

Сейчас я живу в прекрасном Пасифик-Бич, Сан-Диего.

Книги Джона

Полное руководство по карьере разработчика программного обеспечения

Моя самая продаваемая книга всех времен, бестселлер №1 в магазине Amazon, посвященный компьютерам и технологиям. Около 800 страниц лучших советов по карьере, которые я когда-либо давал.

Навыки межличностного общения: жизненное руководство разработчика программного обеспечения

Это моя книга-бестселлер. Я даже записал аудиоверсию с дополнительным контентом.

См. также: Все ссылки из Soft Skills

Полное руководство по карьере разработчика программного обеспечения заняло 5-е место в списке бестселлеров Wall Street Journal, а также набрало в среднем 4,8/5 звезд на Amazon.com и попало в список бестселлеров Amazon.

Бесплатный курс ведения блога

Как создать блог, чтобы повысить свою карьеру: бесплатный курс ведения блога

Прежде всего, вы можете подписаться на мой 100% бесплатный курс ведения блога.

Создание блога было самой полезной и прибыльной вещью, которую я сделал в своей карьере разработчика программного обеспечения.

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

Просто зарегистрируйтесь здесь, чтобы начать:

Pluralsight

Я автор более 50 курсов для компании по обучению разработчиков Pluralsight.

Компания FastCompany взяла у меня интервью о том, что я онлайн-разработчик, обучающий миллионеров, создавая свои курсы Pluralsight.

Выступления

Я люблю выступать перед толпой, особенно на волнующую меня тему.

Я не просто выступаю по теме, я вовлекаю аудиторию!

Консультации и коучинг

Я по-прежнему предлагаю некоторые ограниченные консультационные услуги, так как мой график обычно очень плотный.

Для чего меня нанять:

  • Помощь в создании среды автоматизированного тестирования или что-либо, связанное с автоматизацией тестирования (Selenium и т. д.)
  • Командный коучинг / Agile-коучинг
  • Консультации по архитектуре / дизайн
  • Персональный карьерный коучинг и наставничество
  • Говорение / обучение
  • Что-то еще? Просто спросите

Я предлагаю некоторые ежедневные, еженедельные и ежемесячные авансовые ставки.

Вы можете связаться со мной по адресу [email protected], чтобы получить дополнительную информацию или заказать меня.

Я также предлагаю индивидуальные тренировки один на один. Более подробную информацию вы можете узнать здесь.

Интервью и подкасты, на которых я был

Вы можете найти довольно актуальный список моих интервью в подкастах здесь.

Вот несколько подкастов, которые вы не захотите пропустить:

Джон Сонмез на CodeNewbie

Спустя годы после того, как Джон Сонмез начал программировать, он узнал кое-что очень важное: хотя его навыки программирования были важны, создание контента было его секрет. Своими постами в блоге, последующими книгами и выступлениями он привлекал и расширял аудиторию, а вместе с ней и возможности трудоустройства и карьерный рост. Он делится тем, чему научился на этом пути, и рассказывает о том, как новички во всем мире могут использовать рассказывание историй, чтобы построить свою карьеру в сфере технологий.

Джон Сонмез о .NET Rocks

Джон Сонмез вернулся и рассказывает о своей карьере! Карл и Ричард беседуют с Джоном о его последней книге Soft Skills. Разговор начинается со списка книг, которые повлияли на ваши размышления о том, как вы работаете с другими. Джон говорит о том, чтобы вкладывать энергию в руководство своей карьерой, а не просто в управление ею — куда вы хотите пойти? Легко увязнуть в повседневных делах, но если у вас есть большая цель, вам будет легче встать и приступить к работе!

Джон Сонмез о Ruby Rogues

The Rogues рассказывают о том, как рекламировать себя как разработчика программного обеспечения.

John Sonmez on Hanselman Minutes: Service Stack

Скотт беседует с инструктором Джоном Сонмезом о платформе .NET и Mono REST Web Services с открытым исходным кодом под названием Service Stack.

Джон Сонмез о Предприниматель в огне

Джон учит разработчиков программного обеспечения быть «крутыми». Он тренер по личному развитию, призванный помогать профессионалам жить лучше, более полноценной жизнью и максимально раскрывать свой потенциал.

Джон Сонмез о Hanselman Minutes: Getting Fit

Скотт беседует с тренером Pluralsight и любителем фитнеса Джоном Сонмезом о том, как привести себя в форму. Скотт пытается похудеть и набрать мышечную массу, а Джон дает несколько советов и предложений о том, как программисту начать вырабатывать хорошие привычки в питании и фитнесе.

Не пропустите эти сообщения

Полный список блогов разработчиков программного обеспечения

Как стать программистом-самоучкой?

Как начать успешный побочный проект

Как получить работу по разработке программного обеспечения без опыта

Как стать программистом-самоучкой?

Окончательный список подкастов разработчиков

Решения. 0001

TABLE OF CONTENTS

CAREER TOOLS

BLOGGING & HOSTING

HARDWARE

PROGRAMMER GIFTS

PROGRAMMER BLOGS & PODCASTS

TRIPLEBYTE

Triplebyte — это платформа для найма , которая помогает инженерам-программистам находить работу в ведущих технологических компаниях. У них на платформе более 400 компаний, включая Apple, Box и сотни компаний среднего и раннего уровня, которые ищут талантливых инженеров-программистов.

2X ПРОИЗВОДИТЕЛЬНОСТЬ

Хотели ли вы когда-нибудь увеличить свою производительность до уровня, о котором вы и не подозревали?

Видеорезюме 50 величайших книг по тайм-менеджменту, продуктивности, постановке целей, системам, исполнению, стратегии и кредитному плечу шаблонов резюме и руководств , которые имеют стратегический формат, дружественны к ATS и впечатляют рекрутеров.

Скачайте шаблоны резюме, которые помогут вашей карьере в сфере технологий взлететь до небес!

ТОРТ ДЛЯ ИНТЕРВЬЮ

Нам всем в тот или иной момент приходилось бороться с собеседованиями. Собеседования разработчиков программного обеспечения, как известно, сложны.

Но… P программирование интервью  являются выигрышной игрой . Научитесь приемам быстрого решения проблем, с которыми вы раньше не сталкивались.

И.Т. ОБСЛУЖИВАНИЕ РЕЗЮМЕ

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

Дженнифер Хей в IT Resume Service — один из лучших составителей резюме. Она поможет вам составить нужное вам резюме.

ПРИБЫЛЬНЫЙ ПРОГРАММИСТ

Этот курс является исчерпывающим руководством, которое поможет вам станет Python Django Web Developer . Он покажет вам, как создавать приложения и запускать свой первый клиент с помощью Python в менее чем за 90 дней … Даже если вы никогда не писали ни строчки кода .

EDABIT

Лучший способ описать Edabit — это «как Duolingo для обучения программированию». Пользователи получают XP, разблокируют достижения и повышают уровень.

У них есть более 10 000 небольших задач по программированию, которые позволяют пользователям быстро развивать свои навыки, обучаясь в веселой и захватывающей среде!

ACCESS EDABIT

BLUEHOST

Один из лучших сайтов для хостинга блогов для начала работы. Поднимите и создайте блог примерно за 5 минут .

У них действительно хорошая поддержка, цена также очень дешево и очень легко начать вести блог с Bluehost. Я всегда рекомендую Bluehost.

КАПЕЛЬНЫЙ

Что я использую для управление моим списком адресов электронной почты .

Широкие возможности настройки. Работает отлично. Я очень рекомендую это.

DEPOSITPHOTOS

Это просто лучший веб-сайт для поиска бесплатных изображений .

Я пользуюсь этой услугой с тех пор, как начал вести этот блог, и с тех пор не прекращал.

Если вам нужны изображения для ваших статей или видео, вам сюда .

ПОПРОБУЙТЕ ДЕПОЗИТФОТО

ТЕМЫ THRIVE

Супер быстрые темы WordPress, которые легко настраиваются и выглядят хорошо .

За эти годы я приобрел несколько разных тем для Simple Programmer и, наконец, остановился на этой.

 Он делает все, что я хочу, и выглядит хорошо .

99 ДИЗАЙН

Наш логотип, обложки книг, визитки, некоторые из наших целевых страниц были сделаны с помощью 99 дизайнов. ЛЮБЛЮ ИХ .

Всегда получать ПОТРЯСАЮЩУЮ работу. Не могу рекомендовать их достаточно. Легко, легко стоит цена. Если вы ищете сильный бренд , это место для начала.

PODIA

Podia — это универсальное решение для размещения курсов , которые вы создаете.

Он позволяет размещать курсы, создавать целевую страницу и даже принимать платежи с помощью их платформы.

И самое лучшее… очень дешево!

LENOVO THINKPAD X1 EXTREME

Этот ноутбук очень мощный . Он оснащен процессором Intel Core i7-9750H 9-го поколения и твердотельным накопителем на 512 ГБ.

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

МОНИТОР ASUS DESIGNO MX279HS

Написание кода означает МНОГО работы. И чем больше ваш монитор, тем лучше он становится.

Этот монитор ASUS является одним из лучших мониторов, которые я использовал за всю свою жизнь, и он определенно поднимет ваши навыки кодирования на новый уровень.

APPLE MACBOOK PRO 15»

Apple, безусловно, является эталоном, когда дело касается ноутбуков.

Этот 15-дюймовый Macbook Pro обладает всеми характеристиками, позволяющими превратить его в мощную машину для кодирования, максимально используя стабильную операционную систему и мощное и легкое компьютерное решение.

ПОЛНОЕ РУКОВОДСТВО ДЛЯ РАЗРАБОТЧИКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Моя самая продаваемая книга всех времен , бестселлер № 1 в магазине Amazon для компьютерных и технических книг.

О 800 страницах из лучших советов по карьере , которые я когда-либо давал.

МЯГКИЕ НАВЫКИ: ЖИЗНЕННОЕ РУКОВОДСТВО РАЗРАБОТЧИКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Это мой бестселлер .

Я даже записал аудиоверсию с дополнительным контентом.

См. также: Все ссылки на Soft Skills

ПРОЧИТАЙТЕ SOFT SKILLS

ЛУЧШИЕ КНИГИ ДЛЯ ПРОГРАММИСТОВ (ОБНОВЛЕНО 2020 г.)

Это мой полный список рекомендуемых книг.

Он содержит практически все книги, которые я когда-либо читал, и рекомендаций

от лучших разработчиков , с которыми я сталкивался за свою карьеру.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *