С стек: Руководство C# | Стек: классы Stack и Stack

Содержание

Основные принципы программирования: стек и куча

Рассказывает Аарон Краус 


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

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

Стек

Стек — это область оперативной памяти, которая создаётся для каждого потока. Он работает в порядке LIFO (Last In, First Out),  то есть последний добавленный в стек кусок памяти будет первым в очереди на вывод из стека. Каждый раз, когда функция объявляет новую переменную, она добавляется в стек, а когда эта переменная пропадает из области видимости (например, когда функция заканчивается), она автоматически удаляется из стека. Когда стековая переменная освобождается, эта область памяти становится доступной для других стековых переменных.

Из-за такой природы стека управление памятью оказывается весьма логичным и простым для выполнения на ЦП; это приводит к высокой скорости, в особенности потому, что время цикла обновления байта стека очень мало, т.е. этот байт скорее всего привязан к кэшу процессора. Тем не менее, у такой строгой формы управления есть и недостатки. Размер стека — это фиксированная величина, и превышение лимита выделенной на стеке памяти приведёт к переполнению стека. Размер задаётся при создании потока, и у каждой переменной есть максимальный размер, зависящий от типа данных. Это позволяет ограничивать размер некоторых переменных (например, целочисленных), и вынуждает заранее объявлять размер более сложных типов данных (например, массивов), поскольку стек не позволит им изменить его. Кроме того, переменные, расположенные на стеке, всегда являются локальными.

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

Куча

Куча — это хранилище памяти, также расположенное в ОЗУ, которое допускает динамическое выделение памяти и не работает по принципу стека: это просто склад для ваших переменных. Когда вы выделяете в куче участок памяти для хранения переменной, к ней можно обратиться не только в потоке, но и во всем приложении. Именно так определяются глобальные переменные. По завершении приложения все выделенные участки памяти освобождаются. Размер кучи задаётся при запуске приложения, но, в отличие от стека, он ограничен лишь физически, и это позволяет создавать динамические переменные.

Вы взаимодействуете с кучей посредством ссылок, обычно называемых указателями — это переменные, чьи значения являются адресами других переменных. Создавая указатель, вы указываете на местоположение памяти в куче, что задаёт начальное значение переменной и говорит программе, где получить доступ к этому значению. Из-за динамической природы кучи ЦП не принимает участия в контроле над ней; в языках без сборщика мусора (C, C++) разработчику нужно вручную освобождать участки памяти, которые больше не нужны. Если этого не делать, могут возникнуть утечки и фрагментация памяти, что существенно замедлит работу кучи.

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

Заключение

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

Перевод статьи «Programming Concepts: The Stack and the Heap»

Call stack — Глоссарий | MDN

Стек вызовов (call stack) — это механизм для интерпретаторов (таких как интерпретатор JavaScript в веб-браузере) для отслеживания текущего местонахождения интерпретатора в скрипте, который вызывает несколько функций, — какая из функций выполняется на данный момент, какие функции вызываются изнутри этой (выполняемой) функции, какая будет вызвана следующей и т. д.

  • Когда скрипт вызывает функцию, интерпретатор добавляет её в стек вызовов и потом начинает её обработку.
  • Любые функции, вызванные этой функцией, добавляются в  стек вызовов и выполняются, как только происходит их вызов. 
  • Когда выполнение основной функции завершено, интерпретатор снимает её со стека вызовов и возобновляет выполнение кода в списке основного кода с той точки, где остановился до этого.
  • Если стек занимает больше места, чем ему было присвоено, это приводит к ошибке переполнения стека («stack overflow» error).
function greeting() {
   
   sayHi();
   
}
function sayHi() {
   return "Hi!";
}


greeting();

Код выше будет выполнен следующим образом:

  1. Игнорирование всех функций, пока не будет достигнуто место вызова функции greeting().
  2. Вызывается функция greeting().
  3. Функция «greeting» помещается в очередь стека вызовов.

Очередь стека вызовов:

— greeting

 

  1. Выполняется код внутри функции `greeting`.
  2. Вызывается функция sayHi().
  3. Функция sayHi() помещается в очередь стека вызовов.

Очередь стека вызовов:
— greeting
— sayHi

  1. Выполняется весь код внутри функции sayHi() до самого конца.
  2. Возврат выполнения кода  с места вызова функции sayHi() и продолжение выполнения оставшегося кода функции greeting().
  3. Выполненная функция sayHi() удаляется из очереди стека вызовов.

    Очередь стека вызовов:
    — greeting

  4. Когда весь код внутри функции greeting() выполнен, происходит возврат выполнения оставшейся части основного скрипта JS с места вызова функции greeting().
  5. Выполненная функция greeting() удаляется из очереди стека вызовов.

    Очередь стека вызовов:
    ПУСТО

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

Общие знания

Что такое стек — Журнал «Код» программирование без снобизма

Постепенно осваиваем способы организации и хранения данных. Уже было про деревья, попробуем про стеки. Это для тех, кто хочет в будущем серьёзно работать в ИТ: одна из фундаментальных концепций, которая влияет на качество вашего кода, но не касается какого-то конкретного языка программирования. 

👉 Стек — это одна из структур данных. Структура данных — это то, как хранятся данные: например, связанные списки, деревья, очереди, множества, хеш-таблицы, карты и даже кучи (heap). 

Как устроен стек

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

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

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

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

🤔 Есть структура данных, похожая на стек, — называется очередь, или queue. Если в стеке кто последний пришёл, того первым заберут, то в очереди наоборот: кто раньше пришёл, тот раньше ушёл. Можно представить очередь в магазине: кто раньше её занял, тот первый дошёл до кассы. Очередь — это тоже линейный набор данных, но обрабатывается по-другому. 

Стек вызовов

В программировании есть два вида стека — стек вызовов и стек данных. 

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

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

Допустим, у нас есть программа, внутри которой есть три функции, причём одна из них внутри вызывает другую. Нарисуем, чтобы было понятнее:

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

А вот как стек помогает это реализовать на практике:

Программа дошла до синей функции, сохранила точку, куда ей вернуться после того, как закончится функция, и если функция вернёт какие-то данные, то программа тоже их получит. Когда синяя функция закончится и программа получит верхний элемент стека, он автоматически исчезнет. Стек снова пустой.

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

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

Переполнение стека

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

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

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

Стек данных

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

Стек данных работает по такому же принципу, как и стек вызовов — элемент, который добавили последним, должен использоваться первым.

Что дальше

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

Текст и иллюстрации

Миша Полянин


Редактор

Максим Ильяхов


Корректор

Ира Михеева


Иллюстратор

Даня Берковский


Вёрстка

Маша Дронова


Доставка

Олег Вешкурцев

Что такое стек технологий. Объясняем простыми словами: Энциклопедия — Секрет фирмы

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

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

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

  • операционная система Ubuntu Server;
  • веб-сервер Apache;
  • система управления базами данных Oracle или MySQL;
  • язык программирования PHP;
  • фреймворк Yii.

Примеры употребления на «Секрете»

«ИТ-специалисты должны чётко представлять, что ключевое в EdTech — открытость API, возможность интегрироваться с другими платформами, а также использование современного стека технологий».

(Основательница Smart School Pro Елена Игнатьева — о типичных ошибках образовательных стартапов.)

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

(CEO Realweb Partners Эмин Аветисян — об ошибках офлайновых компаний при выходе в онлайн.)

Нюансы

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

Важнейшие элементы технологического стека в клиентской части:

  • язык разметки веб-страниц HTML, который отвечает за отображение содержимого в браузере;
  • язык описания внешнего вида документа CSS, который стилизует контент;
  • язык для доступа к объектам приложений Javascript — отвечает за интерактивную часть веб-приложения.

Серверная часть приложения готовит данные для клиентской части. Здесь придётся выбрать:

  • язык бэкенд-программирования (отвечает за функционирование внутренней части сервиса), такой как PHP, Java или C++;
  • фреймворки, например, Spring или .NET;
  • система управления базами данных — PostgreSQL или MongoDB;
  • веб-сервер, к примеру, Apache или Nginx.

Факт

Выбранные технологии будут определять функционал продукта и то, можно ли будет его масштабировать в будущем. Также от выбранного стека будут зависеть оплата специалистов и время на разработку.

Если клиент планирует продавать одежду через небольшой онлайн-магазин, ему не понадобятся параллельная обработка больших объёмов данных (noSQL) и механизм распределения нагрузки (load balancing), заточенный на одновременную поддержку 1 млн пользователей. В то же время клиенту, который планирует продавать тысячи товаров в день, не подойдёт решение на базе бесплатного движка сайта (CMS) с дешёвым хостингом.

Статью проверила:

Применяемый стек технологий

Что такое стек технологий и почему это важно?

Стек (англ. stack – стопка) технологий — это набор инструментов, применяющийся при работе в проектах и включающий языки программирования, фрэймворки, системы управления базами данных, компиляторы и т. д.

От выбранного разработчиком стека технологий зависят производительность работы, требования к аппаратным ресурсам, надежность работы программного обеспечения (ПО). В итоге для сложных процессов и высоконагруженных систем им определяется насколько финансово доступно будет развернуть систему и эксплуатировать ее, а также насколько она будет соответствовать требованиям, предъявляемым заказчиком. 

 

При разработке ПО наша компания использует такие языки программирования как Go (Golang), PHP, PowerScript, C/C++, JavaScript, Python. В новых проектах PHP, PowerScript, C/C++ не используются, основным языком программирования является Go. Go — компилируемый многопоточный язык программирования, разработанный компанией Google. Go имеет обширную стандартную библиотеку и большое количество пакетов разработанных golang-сообществом. Он отлично подходит для создания высоконагруженных backend приложений. Мы используем GO с MVC фреймворком revel. На стороне frontend мы используем кроссбраузерный js-фреймворк Webix, который позволяет быстро создавать мобильные и настольные веб-приложения. Также во frontend используется JQuery, нативные html и js. Наши приложения используют такие СУБД как PostgreSQL, Oracle, MySQL и SQLite. Внутренние процессы автоматизируются скриптами на Python и Perl. Для создания инсталляторов под Windows используем InnoSetup. Приложения, разработанные нашей компанией создаются с поддержкой Windows и Linux.

 

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

Проектные группы работают с системой контроля версий Git в связке с Gerrit. Для учета задач используется система учета задач и проектов RedMine. Разработка ПО ведется в соответствии с методологией SCRUM

 

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

Эрнесту Резерфорду, «отцу» ядерной физики, приписывается высказывание — «Если учёный не может объяснить уборщице, которая убирается у него в лаборатории, смысл своей работы, то он сам не понимает, что он делает.». Следуя этому утверждению, мы постараемся рассказать, чем занимается отдел разработки в RBS таким образом, чтобы рассказ был достаточно точным технически, но в то же время понятен даже далеким от разработки программного обеспечения людям. Надеемся, что после прочтения статьи ни у кого, а особенно у кандидатов на должность инженера-разработчика, не останется вопросов «чем вы занимаетесь», «какие инструменты применяете» и «почему именно их».

 

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

 

Эти программы представляют собой информационные системы с удобным для пользователя графическим интерфейсом, базами данных для хранения информации, и серверами, которые обрабатывают, вычисляют, сохраняют и анализируют данные. В общем-то, они делают то же самое, что и рядовые сотрудники различных компаний, ГИБДД, МРЭО, Гостехнадзора и Автошкол, только автоматически, быстро и точно. 

 

Каждой задаче требуется свой инструмент, и когда перед нами встала задача автоматизации бизнес-процессов вышеупомянутых организаций, мы выбрали инструментарий, обычно используемый при разработке web-приложений. Это клиент-серверные технологии, когда часть программы выполняется на централизованном сервере, а часть — на компьютере пользователя. Такая архитектура позволяет очень четко отделить пользовательский интерфейс от сложных вычислительных процессов над данными. Обычно данные обрабатываются и хранятся на сервере, это называется «backend», а выводятся у пользователя, на «клиенте», и это называется «frontend». Это очень похоже на работу типичного сайта — пользователь читает новости в своем браузере, не задумываясь, каким образом эти новости были получены, а получены они были от сервера, где хранились в базе данных, и были извлечены из нее серверным приложением («backend’ом»). Как и у сайта из примера, у нас применяются базы данных для хранения огромных массивов информации, и именно им будет посвящен следующий абзац. 

 

Одна из задач, которую мы решаем, это обработка данных о нарушениях правил ПДД, поступающих с огромного количества камер фотовидеофиксации, со всего города. Это очень большой объем данных, и мало эти данные обработать, их необходимо где-то хранить. Для хранения мы применяем системы управления базами данных, такие как PostgreSQL, Oracle. Причем, все новые проекты, как правило, разрабатываются с использованием именно PostgreSQL, так как, во-первых, она достаточно функциональна для работы с большим объемом данных, а, во-вторых, не ограничивается коммерческими лицензиями, и это дает уверенность в свободе этой системы от политических или деловых решений владельцев СУБД. В ранних проектах компании RBS для работы с данными применялась СУБД Oracle, и это означает, что разработчик должен уметь работать с ней, чтобы мы могли поддерживать всех наших клиентов. О необходимости владения языком запросов SQL говорить молодому разработчику нет смысла, это должно быть очевидно.

 

Для того, чтобы данные, задействованные в некотором бизнес-процессе, сохранить в базу данных после предварительной обработки и некоторых вычислений, необходимо серверное приложение, которое должно отвечать перечисленным далее требованиям. Во-первых, оно должно быть очень быстрым. Во-вторых, оно должно поддерживать параллельную обработку данных, ведь их так много. В-третьих, оно должно быть надежным. И, наконец, оно должно быть достаточно простым, чтобы множество разработчиков разного уровня компетенции и опыта, смогли работать над новым функционалом. В поисках языка программирования, соответствующего этим требованиям, мы нашли Golang. Это многопоточный (параллельность обработки данных), компилируемый (скорость и надежность) язык программирования общего назначения (подходит для разных задач), разработанный в недрах компании Google, и свободно распространяемый среди разработчиков, в том числе для коммерческого использования. У этого языка достаточно низкий порог вхождения, чтобы даже junior-программисты, после краткой практики, смогли полноценно работать над созданием серверных приложений.

 

Ранее в статье мы рассказали, что наши информационные системы — это клиент-серверные web-приложения, и раз мы уже разобрали базы данных и серверы, значит пришло время клиентской части приложения — frontend. Frontend, он же «клиентское приложение», это та часть программы, которая работает на стороне пользователя, и, как правило, отвечает за отрисовку графического интерфейса, ввод данных в формы, а также за взаимодействие с сервером (по протоколу HTTP, асинхронно, если кому-либо интересно). В этой области де-факто стандартом является связка JavaScript + HTML + CSS. Первый — это язык программирования, выполняемый прямо в браузере — он отвечает за всю логику клиентского приложения и отправку данных на сервер или обработку данных с сервера. Два последних — это типичные для сайтостроения средства верстки графического интерфейса. Стажеру, едва только устроившемуся в наш отдел разработки, следует особое внимание уделить именно этим технологиям — с них начнется его путь к должности старшего разработчика. И пусть он не обманывается низким порогом вхождения в JavaScript – он легок в самом начале, и значительно усложняется пропорционально увеличению опыта, когда стажер переходит от простеньких скриптов, и приступает к разработке клиентского приложения для большой информационной системы.

 

Каждый программист может подтвердить, что разработчики — «ленивые» люди. Они всеми силами стараются избежать выполнения одной и той же работы, автоматизируя ее и используя уже готовые решения, образно говоря, «не изобретая велосипед». Это в том числе означает, что, начиная разработку новой информационной системы, мы ищем библиотеки и фреймворки, которые решают типовые задачи, возникающие в процессе создания клиент-серверных программ. Например, для создания HTTP-сервера, и в качестве каркаса серверного приложения с RESTful интерфейсом, мы используем MVC фреймворк Revel, написанный на Golang, а для создания графического интерфейса — виджетный фреймворк Webix, написанный на JavaScript. Список можно продолжить библиотеками JQuery, JQueryUI, Angular, Bootstrap, Yii (это для поддержки ранних проектов на PHP), и многими другими.

 

А еще, отчасти из-за нежелания заниматься рутинными задачами, но главное, для создания надежных программ, мы применяем средства автоматизированного тестирования приложений, то есть юнит-тесты и функциональные тесты. Кроме того, каждая строчка кода, написанная разработчиками, проверяется более опытными товарищами с помощью системы контроля версий Git и системой review Gerrit

 

Кстати, раз уж пошла речь о надежности программ и проверке результатов, стоит упомянуть о том, как проектируется и разрабатывается приложение. Обычно некий старший разработчик, тимлид или архитектор, после постановки задачи от системного аналитика, описывает будущую программу на понятном специалистам техническом языке — в виде моделей и диаграмм. Мы применяем реляционные модели баз данных, диаграммы в нотации UML и модели процессов в нотации BPMN. После этого задача разработки программы дробится на небольшие подзадачи, которые назначаются исполнителям. Для каждой функциональной возможности сначала создается автоматизированный тест, а уже после программный код, который должен «пройти» этот тест. Это называется «разработка через тестирование», а в англоязычной литературе «TDD». Такой подход кажется странным, но его легко понять с помощью аналогии: представьте, что вы создаете новый автомобиль. У автомобиля есть определенные требования по безопасности, и зная их, вы с самого начала строите тестовую площадку для краш-тестов в соответствие с этими требованиями, и будете проводить на ней испытания для каждой новой версии автомобиля, пока не убедитесь, что он готов к массовой продаже. Так и мы, зная требования клиентов, строим полигоны для «краш-тестов» функционала, и пишем код до тех пор, пока он не будет соответствовать этим требованиям. И уже убедившись, что программа готова к выпуску «в свет», мы передаем ее в отдел тестирования, который проверяет программу «глазами пользователя».

 

 

Рассказав о применяемых в отделе разработки технологиях и подходах, мы надеемся, что ответили на вопросы, поставленные в начале статьи, и в заключение кратко перечислим, что должен уметь разработчик, чтобы работать программистом в нашей компании:
  1. Работать с базами данных, владея SQL, и имея знания о специфике PostgreSQL и Oracle.
  2. Создавать высоконагруженные серверные MVC-приложения на языке Golang, используя в качестве каркаса фреймворк Revel.
  3. Создавать клиентские приложения, с помощью JavaScript. Здесь же верстка графического интерфейса на HTML и CSS, применяя фреймворк Webix и другие необходимые библиотеки.
  4. Проектировать программное обеспечение, описывая будущее приложение на UML и BPMN, применяя аналитику, системный подход и воображение.
  5. Создавать автоматические тесты.
  6. Работать в команде, обмениваясь кодом через систему контроля версий, и применяя коммуникативные навыки.
  7. Составлять техническую и пользовательскую документацию.
  8. Трудолюбиво и ответственно работать на благо общества. 

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

 

Удачи вам, и спасибо за внимание!!!

Соответствует фразе: применяемые технологии разработки

Stack and heap. Структуры данных в .NET

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

Разделение памяти

По умолчанию, как только .NET приложение запускается и определяется виртуальный адрес текущего процесса, создаются следующие «кучи»:

Куча для кода — JIT-компилируемый нативный код

Малая объектная куча — объекты до 85 кб

Большая объектная куча — объекты свыше 85 кб*

Куча для обработки данных

*примечание: в случае массивов для данных типа double существует исключение, согласно которому они хранятся в большой объектной куче задолго до достижения размера в 85 кб (double[] считается системой  «большим» объектом при достижении размера в 1000 элементов). По отношению к оптимизации 32-битного кода это, конечно, не очень хорошо.

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

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

Впрочем, куча — это не единственная структура данных, которой может похвалиться вселенная .NET. К примеру, есть еще и стек, который крайне полезен для хранения «специфических» типов данных. Сейчас мы рассмотрим в деталях, как устроены эти структуры данных в деталях.

 

Стек

Стек — это структура данных, организованная по принципу LIFO (последний вошел — первый вышел). Если вдуматься, это идеальное решение для хранения данных, к которым вскоре предстоит обратиться (легко извлекаются с вершины стека). Де-факто природа области стека заключается в двух постулатах: «помнить» порядок выполнения и хранить значимые типы данных.

 

Запоминание порядка выполнения — обращение к стеку

Большая часть кода, который мы пишем, инкапсулирован в классы и методы, которые вызывают другие методы, и так далее. .NET Framework обязан всегда «помнить» порядок вызовов участков кода. Более того, так же нужно хранить данные о состоянии переменных и значениях параметров, передаваемых при вызове методов (дабы суметь восстановить состояние вызывающего метода после завершения работы вызываемого).

При каждом вызове метода .NET инициализирует стек-фрейм (что-то вроде контейнера), где и хранится вся необходимая информация для выполнения методов: параметры, локальные переменные, адреса вызываемых строчек кода. Стек-фреймы создаются в стеке друг на друге. Все это прекрасно проиллюстрировано ниже:

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

Давайте взглянем на следующий участок кода:

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

Также вы можете увидеть, что происходит, когда Method3 завершает свое выполнение (стек-фрейм покидает стек вызова).

 

Хранение значимых типов

Также стек используется для хранения переменных любых значимых типов .NET — включая: bool, decimal, int и так далее.

Ссылочные типы — это типы, которые хранят данные и ссылку на эти данные в рамках одной области памяти. Что так же интересно, так это то, что все локальные переменные значимых типов при завершении выполнения метода очищаются. Это происходит по той причине, что при завершении работы метода его стек-фрейм становится недоступным — стек имеет указатель на начало стек-фрейма на вершине стека вызова (текущий указатель стек-фрейма), который просто перемещается на следующий стек-фрейм после окончания работы текущего (физически данные все еще находятся в стеке вызова, но на практике получить доступ к ним через стандартный .NET-механизм невозможно).

Видео курсы по схожей тематике:

 

Куча

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

 

Хранение ссылочных типов

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

Рассмотрим следующий код:

Фигура ниже иллюстрирует, как выглядит стек и куча в плане хранения данных:

OBJREF, хранимый в стеке, на самом деле является ссылкой на объект MyClass, хранимый в куче.

Заметка: выражение MyClass myObj совершенно не занимает места в куче переменной myObj. Здесь всего лишь создается переменная OBJREF в стеке, после чего она инициализируется значением null. Как только выполняется команда new, куча получает действительное место памяти объекта, а сам ссылочный объект получает по адресу свое значение.

 

Значимые типы против ссылочных типов (стек против кучи)

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

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

Бесплатные вебинары по схожей тематике:

Конечно, хранение одного вида информации в стеке, другого в куче, имеет свои причины, которые мы рассмотрим в грядущих статьях. 🙂

 

Заключение

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

До новых встреч!

Автор перевода: Евгений Лукашук

Источник

что это такое и как использовать?

С каждым годом мы применяем для программирования всё более продвинутые языки, позволяющие писать меньше кода, но получать нужные нам результаты. Однако всё это не проходит даром для разработчиков. Так как программисты всё реже занимаются низкоуровневыми вещами, уже никого не удивляет ситуация, когда разработчик не вполне понимает, что означают такие понятия, как куча и стек. Что это такое, как происходит компиляция на самом деле, в чём разница между динамической и статической типизацией…

К сожалению, некоторые программисты, даже будучи «джуниорами» и работая на реальных проектах, не совсем чётко ориентируются в таких, казалось бы, олдскульных вещах. Именно поэтому в нашей сегодняшней статье мы вспомним, что же это такое — стек и куча, для чего они нужны и где применяются. Несмотря на то, что и стек, и куча связаны с управлением памятью, стратегия и принципы управления кардинально различаются.

Стек — что это такое?

Большое число задач, связанных с обработкой информации, поддаются типизированному решению. В результате совсем неудивительно, что многие из них решаются с помощью специально придуманных методов, терминов и описаний. Среди них нередко можно услышать и такое слово, как стек (стэк). Хоть и звучит этот термин, на первый взгляд, странно и даже сложно, всё намного проще, чем кажется.

Итак, стек — это метод представления однотипных данных в порядке LIFO (Last In — First Out, то бишь, «первый вошел — последний вышел»). Некоторые ассоциируют стек с оружейным магазином для патронов, так как принцип работы схож, и первый вставленный в магазин патрон будет использоваться в последнюю очередь (у термина стек бывают и другие значения, поэтому, если речь идёт не об информационных технологиях, то смысл лучше уточнить).

Стек и простой жизненный пример

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

Стек и особенности его работы

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

Благодаря природе, которую имеет стек, управление памятью становится весьма простым и логичным для выполнения на центральном процессоре. Это повышает скорость и быстродействие ЦП, и в особенности такое происходит потому, что время цикла обновления байта весьма незначительно (данный байт, скорее всего, привязан к кэшу центрального процессора).

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

Кроме того, это вынуждает объявлять размер более сложных типов данных (к примеру, массивов) заранее, так как стек не позволит потом изменить его. Вдобавок ко всему, переменные, которые расположены на стеке, являются всегда локальными.

Для чего нужен стек?

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

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

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

Стеки и операции стека

Если говорить об основных операциях, то стек имеет таковых две: 1. Push — ни что иное, как добавление элемента непосредственно в вершину стека. 2. Pop — извлечение из стека верхнего элемента.

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

Как организуется стек?

Когда программисты организуют или реализуют стек, они применяют два варианта: 1. Используя массив и переменную, указывающую на ячейку вершины стека. 2. Используя связанные списки.

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

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

Стек и куча

Куча — хранилище памяти, расположенное в ОЗУ. Оно допускает динамическое выделение памяти и работает не так, как стек. По сути, речь идёт о простом складе для ваших переменных. Когда вы выделяете здесь участок памяти для хранения, к ней можно обращаться как в потоке, так и во всём приложении в целом (именно так и определяются переменные глобального типа). По завершении работы приложения все выделенные участки освобождаются.

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

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

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

EDB Docs — Использование Stack Builder

Утилита Stack Builder предоставляет графический интерфейс, упрощающий процесс загрузки и установки модулей, дополняющих вашу установку PostgreSQL. Когда вы устанавливаете модуль с помощью Stack Builder, Stack Builder автоматически разрешает любые программные зависимости.

Stack Builder требует доступа в Интернет; если ваша установка PostgreSQL находится за брандмауэром (с ограниченным доступом в Интернет), Stack Builder может загружать установщики программ через прокси-сервер.Поставщик модуля определяет, можно ли получить доступ к модулю через прокси-сервер HTTP или прокси-сервер FTP; в настоящее время все обновления передаются через прокси-сервер HTTP, и информация прокси-сервера FTP не используется.

Вы можете вызвать Stack Builder в любое время после завершения установки, выбрав пункт меню Application Stack Builder из меню PostgreSQL 13 . Введите системный пароль (если потребуется), и откроется окно приветствия Stack Builder.

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

Рис. 1: Окно приветствия Stack Builder

Если для выбранной установки PostgreSQL ограничен доступ в Интернет, используйте кнопку Прокси-серверы в окне Добро пожаловать , чтобы открыть диалоговое окно Прокси-серверы.

Введите IP-адрес и номер порта прокси-сервера в поля HTTP-прокси или FTP-прокси в диалоговом окне Прокси-серверы. В настоящее время все модули Stack Builder распространяются через HTTP-прокси (информация о FTP-прокси игнорируется).Нажмите OK , чтобы продолжить.

Рис. 2: Диалоговое окно «Прокси-серверы»

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

Рис. 3: Окно выбора модуля Stack Builder

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

  • Если модуль установлен, вы увидите слово ( установлено ) справа от имени модуля.
  • Флажки рядом с модулями, которые уже установлены, но подлежат обновлению, автоматически проверяются.
  • Чтобы добавить новые модули в выбранную установку PostgreSQL, установите флажок слева от имени модуля и нажмите Далее .

Рис. 4: Установите флажок, чтобы добавить новый модуль

Окно Выбранные пакеты подтверждает выбранные пакеты.

Рис. 5: В сводном окне отображается список выбранных пакетов

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

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

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

Рис. 6: Подтверждение завершения процесса загрузки

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

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

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

Время от времени вы можете столкнуться с тем, что пакеты не могут быть успешно установлены. Если пакет не удается установить, Stack Builder предупредит вас об ошибке установки во всплывающем диалоговом окне и запишет сообщение в файл журнала, хранящийся в %TEMP% .

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

Примечание

Модули, поддерживаемые Stack Builder, могут изменяться и зависят от платформы.

Stack Overflow — где разработчики учатся, делятся и строят карьеру

Stack Overflow — где разработчики учатся, делятся и строят карьеру

Хотите безопасное личное пространство для своих технических знаний?

Начать

100+ миллионов

ежемесячных посетителя Stack Overflow и Stack Exchange

45.1+ миллиард

раза, когда разработчик получал помощь с 2008 года

179% ROI

от компаний, использующих Stack Overflow для Teams

5000+

Stack Overflow для экземпляров Teams активны каждый день

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

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

Присоединяйтесь к сообществу

или поиск контента

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

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

Начать

Тысячи организаций по всему миру используют Stack Overflow для Teams

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

Обзор Teams

Повышение производительности

Если у кого-то где-то есть правильный ответ, вдруг он появится и у вас.Сотрудничайте лучше в удаленном мире.

Ускорение выхода на рынок

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

Защита институциональных знаний

Люди приходят и уходят, но если вы собираете их вклад в одном месте, этот опыт остается.

Убедитесь, что ваша компания не сбивается с курса

Вот лишь несколько типов технологов, которым мы помогаем.

DevOps-инженеры

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

Исследователи данных

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

Инженеры-программисты

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

Группы поддержки

Повысьте уровень своей поддержки, предоставляя информацию своим клиентам с помощью естественного интерфейса: вопросы и ответы.

Инженерные руководители

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

Бесплатно

Бесплатно

Кредитная карта не требуется

Интеграция ChatOps — Slack и Microsoft Teams

Ваше личное пространство, размещенное в stackoverflow.ком

Структурированная база знаний с возможностью поиска

Всегда бесплатно до 50 товарищей по команде

Базовый

6 долларов США 7 долларов США

на товарища по команде / месяц

Единый вход (SSO) с интеграцией SAML + Okta

Интеграция ChatOps — Slack и Microsoft Teams

Ваше личное пространство, размещенное в stackoverflow.ком

Структурированная база знаний с возможностью поиска

До 250 товарищей по команде

Бизнес

12 долларов США 14 долларов США

на товарища по команде / месяц

Все функции Basic plus…

Подробные знания со статьями

Дополнительные интеграции — ChatOps, Jira, GitHub и Okta

Группировать контент в коллекции

Показатели использования и внедрения

Приоритетная поддержка клиентов

Неограниченное количество товарищей по команде

Предприятие

Индивидуальные цены

Давайте поговорим о том, что вам нужно

Премиум-функции Business plus…

Неограниченное количество команд в вашем экземпляре

Гибкие варианты размещения — в облаке или локально

Надежный API для чтения и записи

Ваш собственный представитель по работе с клиентами и построению сообщества

99.5% SLA безотказной работы и приоритетная поддержка

Неограниченное количество товарищей по команде

Исследование Forrester Consulting показывает 179% возврат инвестиций с помощью Stack Overflow для Teams.

Благодаря нашей централизованной базе знаний крупнейшая в мире телекоммуникационная компания сэкономила 10 млн долларов на отклоненных обращениях в службу поддержки.

У профильных экспертов программной платформы Unqork появилось на 27 % больше времени для работы над проектами после использования Teams.

Некоторые из премиальных функций, доступных на платных уровнях

Надежный API для чтения и записи Единый вход с AD или SAML Ваш собственный представитель по работе с клиентами 99.5% SLA безотказной работы и приоритетная поддержка

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

Директор по управлению продуктами
Майкрософт

Инженеры должны помочь решить самые сложные вопросы, неизвестные, где важно знать, как был создан продукт.Но мы не хотим снова и снова отвечать на решенные проблемы. Вот где Stack Overflow для Teams действительно помогает.

Технический директор
Эластичное облако

Когда мы начали использовать [Stack Overflow for Teams] и увидели, как приятно иметь хранилище информации, мы начали замечать, что оно распространяется на другие команды. Наша команда поддержки клиентов начала использовать его, наша команда по работе с персоналом начала использовать его, и следующее, что мы узнали, это то, что у нас повсюду была интеграция [Slack].

Машиностроение
Затраты

Что нам нравится в Stack Overflow for Teams, так это то, что это очень динамичный инструмент… существует так много способов использовать его в качестве связующего звена между разными командами и разными базами знаний.

Инженер-программист
Коробка

Дополнительные продукты, привлекающие разработчиков и технологов…

О компании
Хотите здесь работать? Текущие вакансии

Исследуйте технические темы и другие дисциплины в более чем 170 сообществах вопросов и ответов

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

Исследуйте сеть

Создайте частное сообщество для обмена техническими и нетехническими знаниями.

Создать бесплатную команду Развернуть селектор тем

Новый Представляем фильтры для переполнения стека

Фильтры больше не только для селфи.Представляем фильтры для Stack Overflow — лучший способ украсить сайт, на котором вы проводите 10 часов в день.

По умолчанию по переполнению стека Bookface от Тома Стенд с хот-догами от The Delicious One Фриза Лэнк, ребенок 90-х MariOverflow Луиджи Луиджи Терминал от Нео Совершенно секретно от агентов J & K Виндовс 3.1 от г-жи Дос 3D-очки от Digital Dimension Designers

Stack Overflow лучше всего работает с включенным JavaScript

Ваша конфиденциальность

Нажимая «Принять все файлы cookie», вы соглашаетесь с тем, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой использования файлов cookie.

Принять все файлы cookie Настроить параметры

 

Стек | Массачусетский технологический институт Press

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

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

В The Stack Бенджамин Брэттон предполагает, что эти разные жанры вычислений — интеллектуальные сети, облачные платформы, мобильные приложения, умные города, Интернет вещей, автоматизация — можно рассматривать не как множество видов, развивающихся сами по себе, но как образующее связное целое: случайную мегаструктуру под названием Стек, которая одновременно является вычислительным аппаратом и новой управляющей архитектурой.Мы внутри Стека, и он внутри нас.

В отчете, одновременно теоретическом и техническом, опирающемся на политическую философию, теорию архитектуры и исследования программного обеспечения, Брэттон исследует шесть уровней стека: Земля , Облако , Город , Адрес , Интерфейс , Пользователь . Каждая отображается на своих собственных условиях и понимается как компонент большего целого, построенного из переплетения жестких и мягких систем — не только вычислительных форм, но и социальных, человеческих и физических сил.Эта модель, основанная на логике многоуровневой структуры «стеков» протоколов, в которой сетевые технологии работают в рамках модульного и вертикального порядка, предлагает исчерпывающую картину нашей новой инфраструктуры и платформу для ее постоянного переосмысления.

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

thestack.org

страданий от переполнения стека. и как наше техническое сообщество может исцелиться | by April Wensel

И как наше техническое сообщество может вылечиться

См. обновления внизу сообщения

значительные страдания.

Как основатель Compassionate Coding, компании, чья миссия состоит в том, чтобы излечить страдания в технологической индустрии и вокруг нее, я не могу молчать о страданиях на Stack Overflow.

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

Другие годами говорят о проблемах с переполнением стека. Я пишу в Твиттере и публично пишу о проблемах с Stack Overflow с тех пор, как два года назад основал свою компанию.

Из всех моих твитов на эту тему эта мини-ветка привлекла наибольшее внимание в Твиттере.Я привожу несколько примеров слегка снисходительного поведения в Stack Overflow, а также представляю более добрые альтернативы:

Однако именно этот другой твит, похоже, оказал наибольшее влияние на более широкое сообщество за пределами Twitter:

Хотя я бы не стал. Я не назову этот твит примером «гадости» или «купоросства», и я не считаю его «истеричным и клеветническим», я признаю, что это не самый сострадательный мой твит.

Это сострадание к людям, пострадавшим от Stack Overflow, но, поскольку оно написано с сарказмом, оно не очень сострадательно к Джоэлу, Джеффу, команде Stack Overflow и часто доброжелательным людям в сообществе Stack Overflow.

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

Я отвечал на сообщение Джоэла Спольски, одного из соучредителей Stack Overflow, об истории сайта. Этот пост был опубликован через несколько недель после того, как его компания опубликовала опрос, в котором более 90% респондентов были мужчинами, а более 74% — белыми.

https://insights.stackoverflow.com/survey/2018/#demographics

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

В треде помощник Джоэла Анил Дэш ответил, что Джоэл решил некоторые из этих проблем. Поэтому, когда я увидел, что Джоэл разместил ретроспективу , я сразу подумал: «Отлично! Джоэл признает, что его элитарность навредила многим людям, и расскажет о том, как он собирается исправить культуру Stack Overflow. Все технические братья, которые поклоняются ему, последуют его примеру. У технологической индустрии еще есть надежда!»

Итак… я был очень разочарован, когда сообщение Джоэла не только не упомянул опрос, но и оказалось в основном самовосхвалением:

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

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

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

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

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

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

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

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

Я использовал « токсический » для обозначения вредного, и я знаю много людей, которые пострадали от сайта, так что это точно.

Я использовал «бесчеловечный», чтобы обозначить отсутствие сострадания, и опять же, учитывая всех людей, пострадавших от сайта, это кажется уместным.Я специально добавил это слово, потому что знаю, что другая компания Джоэла, Fog Creek, утверждает, что делает технологии более гуманными, поэтому кажется, что есть некоторое лицемерие в том факте, что он не возьмет на себя ответственность за бесчеловечность, происходящую на Stack Overflow.

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

Другие люди описывают этот сайт как «яму огня», «DMV сайтов помощи», а мой личный фаворит — «игровую площадку для киберзапугивания взрослых».

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

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

Полагаю¹ Я находил Stack Overflow в результатах поиска с момента запуска сайта в 2008 году, когда я закончил курс информатики и начал работать инженером-программистом.

В качестве ресурса он помогал мне на протяжении всей моей карьеры. В компаниях я также встречал ссылки на Stack Overflow в наших комментариях к коду и на внутренних вики-сайтах компании.

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

Благодаря наставничеству, которое я провожу с женщинами, недостаточно представленными группами и выпускниками буткемпов, я лучше понимаю, что значит участвовать в Stack Overflow, когда чувствуешь себя «аутсайдером».

Stack Overflow известен тем, что заставляет людей чувствовать себя плохо.

Вот обзор негативных чувств, которые люди испытывают при взаимодействии с Stack Overflow.

  1. Позор после того, как услышал «Это легко, и ты идиот, раз не понял».

Пока я писал в Твиттере о проблемах с Stack Overflow, кто-то поделился со мной этой публикацией на reddit²: другими членами сообщества, которые подразумевают, что они идиоты, потому что не знают «простого» ответа.

Женщина опубликовала это в группе Facebook, в которой я состою:

«У меня действительно были проблемы… на этой неделе.Я был в слезах на протяжении большей части этого, и теперь я только что получил язвительный ответ на Stackoverflow, говорящий мне, насколько просто решение и что мне нужно научиться отлаживать свой собственный код. Я готов бросить полотенце».

Что, если неудачный опыт на Stack Overflow действительно заставит эту женщину «бросить полотенце»?

Другая женщина поделилась этим сообщением, которое она получила на Stack Overflow после обращения за помощью в вопросе о полях FlexBox:

«если вы этого не понимаете… вам нечего делать портфолио в качестве веб-разработчика»

Что обескураживающую вещь слышать, когда вы строите свое портфолио.

2. Замешательство после наказания без объяснений

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

3. Печаль после того, как увидел страдания других

Даже люди, которые только читают Stack Overflow, чувствуют боль, видя, как обращаются с другими. Поскольку с годами я открыл свое сердце, чтобы развить больше сочувствия, я довольно глубоко чувствую боль других.

Я не единственный:

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

В качестве еще одного признака своей бесчеловечности Stack Overflow не поощряет приветствия и благодарности.

Как поделился другой человек,

«Пользователь с репутацией всего 4000 отредактировал теги в моем первом вопросе и воспользовался возможностью удалить меня, сказав «спасибо»… Некоторым людям это может показаться мелочью, но я Меня очень огорчило, что незнакомца настолько обеспокоили два слова обычной вежливости, что он молча убрал их с моего поста.”

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

5. Отказ от того, что вы чувствуете себя нежеланным

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

Как поделилась Джессамин Уэст,

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

6. Страх после того, как увидел, как обращаются с другими

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

Одна женщина в Твиттере поделилась:

: «Когда я только начинала, я была слишком напугана, чтобы писать о переполнении стека».

Другие женщины поделились похожим опытом:

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

На Stack Overflow люди испытывают целый ряд негативных эмоций. Общей чертой является отсутствие сочувствия со стороны других членов сообщества.

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

Токсичная элитарность является источником многих проблем, которые мы наблюдаем в Stack Overflow и в технологиях в целом.

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

Элитаризм, снисходительность, стыд и контроль над входом

В культуре программирования существует одержимость делением людей на элиту и не-элиту, ниндзя-гуру-рок-звезд и посредственных программистов, 10-кратных инженеров и 1-кратных инженеров, 20%-ые и 80%-ые (из блога Джеффа Этвуда), или «великие разработчики» и «средние разработчики» (из блога Джоэла Спольски).

Постоянное давление на нас, чтобы доказать, что мы самые умные, не создает самую здоровую культуру, как пишет Анджела Дакворт в Grit :

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

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

Вот пример снисходительности, которая происходит на сайте:

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

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

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

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

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

Это проявляется в таких постыдных комментариях, как «Если вы не можете X, у вас нет бизнес-кодирования.

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

Выгорание

Ранее я обсуждал формы страданий, которые испытывают люди, которые чувствуют себя на сайте «чужаками», но как насчет инсайдеров, или «опытных пользователей»?

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

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

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

Однако мое сострадание к ним не оправдывает грубого поведения.

Вы можете подумать, что это всего лишь один веб-сайт, какое вообще это имеет значение?

Как написал один человек в Твиттере,

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

Запугивание людей, не разбирающихся в технологиях

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

«…мужчины в предметных областях STEM переоценивают свой интеллект и полномочия, недооценивают способности коллег-женщин, и это как В результате сами женщины сомневаются в своих способностях — даже когда факты говорят об обратном».

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

Ограничение доступа к вакансиям

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

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

Вводящие в заблуждение обобщения о технологической отрасли

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

Конечно, разработчики Stack Overflow не заботятся о разнообразии; если бы они это сделали, они, вероятно, не захотели бы участвовать в Stack Overflow.

Проблема в том, что Stack Overflow любит создавать впечатление, что они представляют сообщество разработчиков в целом. Пока они отказываются исправлять свои проблемы с включением, это не так.

Проблемы с психическим здоровьем

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

Контент более низкого качества на сайте

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

Например, рассмотрим этот пример вопроса о сохранении пола в базе данных. Stack Overflow, сообщество, в котором доминируют мужчины, может предложить следующее:

Ответы также бесчувственны.

Сравните это с похожим вопросом на новом и инклюзивном технологическом (хотя, возможно, сейчас неактивном) сайте вопросов и ответов AskQuestions.tech:

Если у вас более разнообразные точки зрения, вы получите лучшие вопросы и ответы.

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

Этот ответ был в силе почти 10 лет, прежде чем он был удален после того, как я написал об этом в Твиттере.

Самоусиливающиеся структуры токсичной власти

Люди иногда размещают сообщения на meta.stackoverflow.com, чтобы предложить изменения, чтобы сделать сайт более инклюзивным, но, поскольку люди с наибольшей репутацией и властью на сайте часто наименее чуткие, эти предложения забрасываются, что мешает сайту двигаться вперед осмысленно.

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

Продукты более низкого качества

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

По всем этим причинам отчуждение людей на Stack Overflow затрагивает людей на сайте, людей в сообществе разработчиков и человечество в целом.

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

Stack Overflow

Столкнувшись с проблемами включения, основатель Джефф Этвуд, который больше не является сотрудником Stack Overflow, но остается влиятельным членом сообщества, заявил: «Я не понимаю, почему у всех есть для использования. Переполнение стека.

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

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

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

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

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

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

Пока Stack Overflow не решит эту проблему, нам нужно продолжать говорить об этом, потому что люди, пострадавшие от этого, думают, что это их вина (и это не так):

Альтернативы

Я согласен с Джеффом по крайней мере в одном пункте хотя: есть альтернативы переполнению стека.

Существуют также небольшие частные сообщества, которые обеспечивают гораздо более безопасное пространство — например, группы в Slack и Facebook. Многие из них приветствуют людей с любым уровнем опыта, с инклюзивностью и добротой, запеченными прямо в нем, точно так же, как в Stack Overflow присутствует ядовитый элитаризм и конкуренция.

Сообщество

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

Спрашивающие могут думать о том, через что проходят отвечающие.Отвечающие могут подумать о том, через что проходят спрашивающие.

Возможно, я смогу больше думать о том, через что проходят люди из Stack Overflow.

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

Сострадание к себе

Наконец, пожалей себя! Если вы устали отвечать на технические вопросы бесплатно, помните, что вы можете перестать это делать.Вы также можете делать перерывы — столько, сколько вам нужно на самом деле. Вы также можете установить четкие границы. Может быть, вы отвечаете на вопросы только один день в неделю или не отвечаете на вопросы новых пользователей. Установление границ является важным компонентом заботы о себе.

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

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

Как реализовать стек Python — настоящий Python