Портфель знаний

Инвестиции в знания окупаются лучше всего. Бенджамин Франклин

В одной умной книге вычитал отличную метафору для определения опыта программистов -- портфель знаний. Сравнение знаний и опыта профессионала с инвестиционным портфелем однозначно цепляет.

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

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

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

  1. Инвестируй регулярно — должно стать привычкой
    • читай каждый квартал по технической книге
    • изучай что-то новое
    • посещай конференции
  2. Диверсификация — залог успеха
    • нельзя зацикливаться на одной технологии
    • нужно изучать новые языки, методологии и подходы
  3. Портфель должен быть сбалансирован
    • если умеешь делать Web приложение, попробуй сделать GUI
    • попробуй пописать приложения на других ЯП
    • займись front частью
  4. Покупай дешевле — продавай подороже
    • изучай новые технологии, когда они не на слуху, 9 из 10 ты не угадаешь будущий мейнстрим, но одного раза хватит, чтобы выпрыгнуть очень высоко
  5. Нужен периодический пересмотр портфеля
    • остановись и осмотрись, что сейчас популярно на рынке
    • старайся предвидеть переходы и лови тренд заранее

Следование этим простым 5 принципам сделает вашу карьеру успешной!

Прочитать

Processes & Threads #2

Поскольку основные определения и понятия уже введены перейду сразу к сути.

Взаимное исключение

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

Это именно то, что происходит с тредами при попытке доступа к общему ресурсу. Когда один тред захватывает его, то ставит на него блок(закрывает ванную изнутри на щеколду).

Это способ синхронизации, который использует объект mutex (от MUTual EXclusion — взаимное исключение). В этом примере это щеколда, которая блокирует доступ всем остальным участникам, когда кто-то помылся и вышел, т.е. снял защитный барьер, следующий тред начинает использовать ресурс и ставит на него защиту.

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

Приоритеты

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

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

Например можно решить это двумя факторами: приоритетом исполнения и временем ожидания.

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

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

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

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

Прочитать

Processes & Threads #1

Основы

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

Процесс это дом

Представим, что процесс это дом, просто некий контейнер с определенными заданными атрибутами( как например размел пола, высота стен, наличие лестницы).

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

Треды это жители

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

Single Threaded

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

MultiThreaded

В лучшем случае к вам приехал друг на погостить, и это значит, что встав однажды утром с постели можно не попасть в ванную, потому что она будет закрыта. Ситуация пожестче это если вы съехались с вашей подругой и теперь везде типо порядок и раскиданы баночки с гелями и мазями, лаком для ногтей и всякой такой ерундой, носки в стирке, а по телевизору идет Animal Planet вместо крепкого орешка. В ванную попасть сложно как никогда, а зависнуть там на книжку почитать невозможно по причине постоянных воплей: "ты там заснул что ли"?

Но самая хорошая в данном случае аналогия(читай понимание ситуации) - это хостел. Представьте себе очередь в ванную из тапочек и полотенец в один туалет на 10 жильцов.

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

Процессы и треды

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

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

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

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

На этом закончу вводную часть, в следующей расскажу о вариантах синхронизации и выделения прав тредам( семафоры, мютексы и т.д.)

Прочитать