Это 76-я оригинальная статья без воды.Если вы хотите получить больше оригинальных статей, выполните поиск в официальном аккаунте и подпишитесь на нас~ Эта статья была впервые опубликована в блоге Zhengcaiyun:Говоря о моем понимании FaaS с Alibaba Cloud FC
Прежде чем перейти к теме, давайте кратко опишем недавнее горячее слово Serverless в мире фронтенда из предыстории.На самом деле концепция Serverless уже давно предлагается в других областях.
Serverless
концепция
Serverless буквально переводится как serverless, представляя собойБессерверная архитектура(также называется "бессерверные вычисления»), это не означает, что физический сервер не требуется, но это означает, что нет необходимости уделять внимание серверу и управлять им, а услугу можно использовать напрямую. По сути, это своего родасервисный аутсорсингИлиУслуги хостинга, эти услуги предоставляются сторонними поставщиками.
В частности, серверу означает, что логика Server-Side реализуется разработчиками и работает в контейнере нестандартного вычислительного контейнера.управляемый событиями,полностьюуправляется третьей стороной, а статус бизнес-уровня записывается вбаза данных или ресурс хранениясередина.
В настоящее время некоторые крупные отечественные компании, такие как Ali, Tencent и Didi, постепенно внедряют бессерверные технологии в свой бизнес (обмен примерами:2020.06.19 ServerlessDays · China Online).
Связь между Serverless и FaaS
Serverless = FaaS+BaaS, что является более общепринятым определением в отрасли:
-
FaaS (функция как услуга): функция как услуга
- Быть ответственным заСценарий бизнес-логики на стороне сервера, должны быть реализованы самими разработчиками, гранулярность сервисов меньше, чем у микросервисов, такая же маленькая, как единица функции
- управляемый событиямиБессерверный сервис с эластичным масштабированием на уровне миллисекунд
- Невозможно совместное использование памяти или данных, далица без гражданства
- Не требует эксплуатации и обслуживания, развертывание, эксплуатация и обслуживание обеспечиваются облачной платформой
-
BaaS (серверная часть как услуга): внутренняя часть как услуга
-
Быть ответственным заСценарий общего обслуживания, не требует от разработчиков разработки собственных, предоставляемых облачными вендорами, таких как база данных, аутентификация, очередь сообщений, объектное хранилище и другие сервисы
-
дасостояниеиз
-
Автор считает, что, просто взглянув на FaaS или BaaS, это своего рода бессерверное решение, но, как правило, наше полное приложение требует комбинации этих двух для достижения.
Ну, следующее является официальным введением в ФААС.
FaaS
В качестве внешнего интерфейса мы обычно труднее достичь серверов, аспектов эксплуатации и обслуживания операции. Предположим, теперь дайте вам задачу, позвольте себе разработать приложение до и после окончания взаимодействия, и развернуто с 0-1, именно не в том, что они просто не могут обрабатывать в одиночку, эта задача несколько сложная.
Для развертывания традиционных приложений нам нужно проделать большую работу: подготовить сервер, настроить среду, приобрести доменное имя, настроить nginx и так далее. После того, как приложение выпущено, нам также необходимо рассмотреть вопросы эксплуатации и обслуживания, онлайн-мониторинга, расширения и сокращения, аварийного восстановления и так далее.
Теперь, если мы используем FaaS для разработки и развертывания, нам не нужно учитывать вышеизложенное, нам нужно сосредоточиться только на разработке бизнес-логики, потому чтоВсе остальное размещается на платформе FaaS.помог нам с этим справиться.
концепция
FaaS — это форма бессерверных вычислений. С помощью FaaS можно быстро создавать приложения и услуги любого типа.Он обладает характеристиками гибкой разработки, автоматического эластичного масштабирования, бесплатной эксплуатации и обслуживания, а также полными средствами мониторинга. следовательно:
-
Разработчики нужно только сосредоточиться на разработке бизнес-логики, без необходимости управлять серверами, операционной средой и другой ИТ-инфраструктурой
-
Платформа FaaS подготовит для нас вычислительные ресурсы для гибкого и надежного запуска нашего кода на миллисекундном уровне.Эластичное масштабирование, легко справляется с пиковыми нагрузками
-
Пользователю нужно только использовать фактическое время выполнения функцииплати как сможешь
Таким образом, по сравнению с традиционной моделью разработки, FaaS значительно повышает эффективность разработки и доставки, что является общей тенденцией будущего развития облачных сервисов. С 2014 года, после AWS Lambda, отечественные и зарубежные поставщики облачных услуг, такие как Google, IBM, Microsoft, Alibaba, Tencent и Huawei, последовательно запускали платформу облачных вычислений FaaS.
Быстро создавайте приложения FaaS
Существует много способов разработки функциональных вычислений, таких как: забавный инструмент, платформа функциональных вычислений FC, бессерверный VScode, платформа облачной разработки. Эта статья опирается наПлатформа облачных вычислений Alibaba, быстро создать и развернуть веб-приложение с помощью предоставленного им шаблона и более наглядно показать всем, что такое FaaS.
Эта статья создана непосредственно на основе шаблона, и пользователи также могут загрузить код приложения для непосредственного развертывания веб-приложения.
Мы выбираем взаимодействие с интерфейсом и сервером, добавление данных, удаление, изменение и другие действия.Приложение со списком дел,этоИнтеграция с интерфейсом и сервером(Внешний и внутренний коды разрабатываются, отлаживаются и развертываются в одном проекте, что эффективно и экономит ресурсы) Приложение FaaS.
услуга/функция
Служить
Приложение может быть разделено на несколько сервисов. С точки зрения использования ресурсов служба может состоять из нескольких функций. Сначала создайте службу, затем создайте функцию.
Вы можете увидеть сервис, созданный после успешного развертывания приложения TodoList, мы можем настраивать, удалять, просматривать индикаторы и другие операции на сервисе, а также настраивать и удалять функции под ним.
функция
Функция — это единица планирования и работы системы. Функции должны принадлежать службам. В рамках одной службы может быть несколько функций. Все функции в рамках одной службы имеют одни и те же настройки, такие как авторизация службы и конфигурация журнала, но они независимы друг от друга и не влияют друг на друга.
код функции
Пара FaaSмногоязычныйВсе они имеют хорошую поддержку, например, Alibaba Cloud поддерживает Node.js, Python, PHP, Java и т. д., и разработчики могут использовать знакомые им языки для написания кода в соответствии с функциональным интерфейсом, предоставляемым платформой. Это также означает, что при совместной работе команды вы можете разрабатывать сложные приложения на нескольких языках.
Нажмите на выполнение кода, вы увидите, что здесь есть онлайн-редактор, который представляет собой код, сгенерированный шаблоном, который можно запустить и отладить здесь. Интерфейсная страница приложения реализована с помощью React, а серверная служба основана на платформе Node Express.
запись функции
template.yml
это нашФайл конфигурации информации о функциях, который сообщает поставщику облачных услуг нашу функцию ввода кода, тип триггера и другие операции.
Запись функцииsrc/index.handler
,Прямо сейчасsrc/index.js
Метод обработчика в файле кода сервера, код файла выглядит следующим образом:
const { Server } = require('@webserverless/fc-express')
const express = require('express');
const fs = require('fs');
const path = require('path');
const bodyParser = require('body-parser');
// initial todo list
let todos = [
{
id: '123',
text: 'Go shopping',
isCompleted: false,
},
{
id: '213',
text: 'Clean room',
isCompleted: true,
},
];
const staticBasePath = path.join('public', 'build');
const app = express();
// index.html
app.all("/", (req, resp) => {
resp.setHeader('Content-Type', 'text/html');
resp.send(fs.readFileSync('./public/build/index.html', 'utf8'));
});
// 静态资源文件:js、css、图片
// static js resources
app.all('/*.js', (req, resp) => {
const filePath = path.join(staticBasePath, req.path);
resp.setHeader('Content-Type', 'text/javascript');
resp.send(fs.readFileSync(filePath, 'utf8'));
});
// static css resources
app.all('/*.css', (req, resp) => {
const filePath = path.join(staticBasePath, req.path);
resp.setHeader('Content-Type', 'text/css');
resp.send(fs.readFileSync(filePath, 'utf8'));
});
// static svg resources
app.all('/*.svg', (req, resp) => {
const filePath = path.join(staticBasePath, req.path);
resp.setHeader('Content-Type', 'image/svg+xml');
resp.send(fs.readFileSync(filePath, 'utf8'));
});
// static png resources
app.all('/*.png', (req, resp) => {
const filePath = path.join(staticBasePath, req.path);
resp.setHeader('Content-Type', 'image/png');
resp.send(fs.readFileSync(filePath, 'utf8'));
});
app.all('/manifest.json', (req, resp) => {
const filePath = path.join(staticBasePath, req.path);
resp.setHeader('Content-Type', 'application/json');
resp.send(fs.readFileSync(filePath, 'utf8'));
});
// 增删改查对应的api接口
// list api
app.get('/api/listTodos', (req, resp) => {
resp.send(JSON.stringify(todos));
});
// create api
app.get('/api/createTodo', (req, resp) => {
const { todo: todoStr } = req.query;
const todo = JSON.parse(todoStr);
todos.push({
id: todo.id,
text: todo.text,
isCompleted: todo.isCompleted,
});
resp.send(JSON.stringify(todos));
});
// update api
app.get('/api/updateTodo', (req, resp) => {
const { todo: todoStr } = req.query;
const targetTodo = JSON.parse(todoStr);
const todo = todos.find((todo) => todo.id === targetTodo.id);
if (todo) {
todo.isCompleted = targetTodo.isCompleted;
todo.text = targetTodo.text;
}
resp.send(JSON.stringify(todos));
});
// remove api
app.get('/api/removeTodo', (req, resp) => {
const { id } = req.query
// TODO: Implement methods to filter todos, filtering out item with the same id
// todos = todos.filter();
const todosIndex = todos.findIndex((todo) => todo.id === id);
if (todosIndex !== -1) {
todos.splice(todosIndex, 1);
}
resp.send(JSON.stringify(todos));
});
const server = new Server(app);
// 向外暴露了 http触发器入口
// http trigger entry
module.exports.handler = function(req, res, context) {
server.httpProxy(req, res, context);
};
Как видите, нам не нужно запускать сервис самим, FaaS-платформа сделает это за нас. Этот файл состоит из двух важных частей:
- 1. Обработчик записи функции также является записью триггера HTTP, которая будет подробно описана ниже.
// http trigger entry
module.exports.handler = function(req, res, context) {
server.httpProxy(req, res, context);
};
- 2. Веб-сервис и API, вызов соответствующего сервиса через маршрутизацию, например, при пути запроса "/" будет возвращена html-страница веб-приложения, при запросе "/api/*" - вызывающий интерфейс вернет данные
вызывать
Как упоминалось ранее, FaaS — этоуправляемый событиямиВычислительная модель функции, то есть выполнение функции управляется событиями, и функция не запускается без триггера события. В отличие от традиционного режима разработки, функция не требует запуска службы для прослушивания данных, а привязывает один (или несколько) триггеров.
вызыватьЭто способ инициировать выполнение функции, нам нужно создать указанный триггер для функции.
Существуют различные триггеры для приложений FaaS (триггеры разных поставщиков облачных услуг будут разными), но в основном все поддерживают такие триггеры, как HTTP, хранилище объектов, запланированные задачи и очереди сообщений, среди которых наиболее распространены триггеры HTTP.
На примере Alibaba Cloud Function Compute представлено несколько репрезентативных типов:
тип триггера
имя | описывать |
---|---|
HTTP-триггер | 1. HTTP-триггер запускает выполнение функции путем отправки HTTP-запроса, что в основном подходит для быстрого создания веб-сервисов и других полей. 2. Триггер HTTP поддерживает методы HEAD, POST, PUT, GET и DELETE для запуска функций. 3. Вы можете сопоставить различные пути доступа HTTP с функциями HTTP, привязав собственное доменное имя. 4. Разработчики могут быстро создавать веб-сервисы и API с помощью триггеров HTTP. |
Триггеры OSS (хранилище объектов) | 1. События OSS могут инициировать выполнение связанных функций для реализации пользовательской обработки данных в OSS. |
Триггеры службы журналов | 1. Когда служба журнала регулярно получает обновленные данные, функция запускается для использования добавочных данных журнала с помощью триггера службы журнала, и пользовательская обработка данных завершается. |
синхронизированный триггер | 1. Автоматически запускать выполнение функции в указанный момент времени |
Триггеры шлюза API | 1. Шлюз API выступает в качестве источника события.Когда запрос поступает на шлюз API, внутренняя служба которого настроена на вычисление функций, шлюз API инициирует выполнение функции. Вычисление функции возвращает результат выполнения в шлюз API. 2. Подобно триггерам HTTP, его можно использовать для создания веб-приложений. По сравнению с триггерами HTTP вы можете использовать API Gateway для расширенных операций, таких как добавление IP-адресов в белый или черный список. |
Когда разработчики отлаживают, если они не настраивают триггеры, они также могут использовать консоль, инструменты командной строки или SDK для прямого вызова выполнения функции.
Открываем триггерную точку TodoList, можно увидеть созданиеHTTP-триггер, веб-пользователи могут инициировать выполнение функций с помощью HTTP-запросов.
Обратите внимание на подсказку здесь: открываем ссылку, скачается html-вложение, далее открываем, так как файл статического ресурса не может быть найден, приложение не может нормально работать.
можно нажатьпользовательское доменное имяиспользовать то, что платформа создала для насвременное доменное имяОткрыть:
Как видите, страница и функции в норме. Мы просматриваем, добавляем, обновляем, удаляем и в консоли видим инициированный запрос и возвращенный результат
HTTP-триггер
приложениеФункция входа для триггера HTTPФорма выглядит следующим образом:
// http trigger entry
module.exports.handler = function(req, res, context) {
server.httpProxy(req, res, context);
};
Функции, настроенные с помощью триггеров HTTP, могут запускаться и выполняться с помощью HTTP-запросов. На этом этапе функцию можно рассматривать как веб-сервер, который обрабатывает HTTP-запрос и возвращает результат обработки вызывающей стороне..
Доступ к html-страницам, запрос к статическим файлам ресурсов, а также к интерфейсу запросов, это запуск выполнения соответствующей функции через http-запросы.
Отладку можно сделать здесь:
Платформа FaaS
В настоящее время на рынке есть несколько зрелых платформ FaaS с открытым исходным кодом, таких как OpenFaaS, funktion, Kubeless, Fission и т. д. Эта статья познакомит вас с официальным выпуском Alibaba Cloud в этом году.Платформа Midway FaaS, который представляет собой бессерверную платформу для создания облачных функций Node.js, которая обеспечивает собственныйРазвитие, звонок, чтобы проверить всю ссылку. Он может разрабатывать новые безсерверные приложения, а также предоставлять решения для миграции традиционных приложений в облачные функции различных поставщиков облачных услуг. Али использует его внутренне больше года.
мы можем использовать строительные леса@midwayjs/faas-cli
возможность предоставитьБыстро создавайте, отлаживайте, имитируйте и развертывайте локальноПриложение FaaS. Бессерверная версия имеет отличныйнедостатки,то естьСильная привязка к платформе поставщика облачных услуг, но Midway Serverles защищены от блокировки платформы и могутНабор кода может работать на разных платформах и средах выполнения., развертывание Midway faas может бытьОблачные поставщики, развернутый в Alibaba Cloud FC по умолчанию, мы также можем изменить и развернуть его на других платформах, таких как Tencent Cloud SCF, AWS Lambda.
Система Midway FaaS также сочетается с облачной рабочей средой, используя те же возможности, что и локальная, здесь выберите входПлатформа облачной разработки Alibaba, используйте пример шаблона библиотеки, чтобы снова создать приложение TodoList для демонстрации, но это приложение создано с помощью Midway FaaS.
Структура каталогов кодаЕго можно просто извлечь как:
|-- src
| |-- apis //函数代码
| |-- config //针对不同环境创建配置文件
| |-- configuration.ts //扩展能力配置
| |-- index.ts // 函数代码入口文件,里面包括多个函数
| |-- components // 前端组件
| |-- index.tsx // 前端页面入口文件(该应用前端基于React,若是Vue,则是App.vue)
|-- f.yml // 函数信息配置文件
файл конфигурации f.yml
service: serverless-hello-world
// 服务提供商
provider:
name: aliyun
runtime: nodejs10 //运行时环境及版本信息
// 函数具体信息(包括函数入口、触发器等等)
functions:
render:
handler: render.handler
events:
- apigw:
path: /*
list:
handler: todo.list
events:
- apigw:
path: /api/list
update:
handler: todo.update
events:
- apigw:
path: /api/update
remove:
handler: todo.remove
events:
- apigw:
path: /api/remove
add:
handler: todo.add
events:
- apigw:
path: /api/add
// 构建的配置信息
package:
include:
- build //打包目录
artifact: code.zip //打包名称
Функция в коде функции соответствует API-интерфейсу:
После установки зависимостей мыnpm run dev
Ali Cloud создал временное доменное имя для отладки:
Вы можете увидеть запрошенные ресурсы и данные интерфейса:
Развертывание в один клик очень удобно.
Сборы
В традиционных приложениях наши сервисы всегда занимают ресурсы, в то время как FaaS не взимает плату, когда ресурсы простаивают.плати как сможешь, можно сэкономить много денег.
Сборы:
- Количество обращений к функции
- время выполнения функции
Поскольку каждый месяц предоставляется бесплатная квота, практически нет необходимости платить за личное ежедневное использование.
(PS: Но все же нужно обратить особое внимание. Развернутые приложения должны находиться в автономном режиме в то время, когда они не используются. В противном случае может взиматься плата. Также необходимо обратить внимание на стандарты тарификации активированных услуг и функций. Для например, вы можете захотеть решить проблему холодного запуска. , функция зарезервированного экземпляра будет открыта. Если мы ее не используем, мы должны обратить внимание на ручное освобождение, иначе, даже если он не выполнит какой-либо запрос, он будет продолжают заряжаться со старта, а стоимость не маленькая)
Холодный запуск
Поговорим о проблеме, на которую в настоящее время обращает внимание FaaS —Холодный запуск.
Функции в FaaSпервый звонок,Обновите функцию или повторно вызовите функцию, если она не вызывалась в течение длительного времени., платформа инициализирует экземпляр функции, этот процессХолодный запуск, среднее время составляет сотни миллисекунд.
проблема с задержкой
Из-за холодного запуска FaaS функция не может быть вызвана немедленно, а задержка вызова повлияет на производительность приложения.Из-за задержки холодного запуска крупные поставщики облачных услуг очень обеспокоены этим и пытаются постоянно его оптимизировать.
Холодному старту соответствует теплый старт,Горячий стартЭто означает, что когда функция вызывается, ей не нужно воссоздавать новый экземпляр функции, а напрямую повторно используется предыдущий экземпляр функции. Поскольку, если функция FaaS не запускается событием в течение определенного периода времени, поставщик облачных услуг повторно использует ресурсы контейнера работающей функции и уничтожает экземпляр функции.Поэтому повторный вызов функции в течение этого периода времени не был переработан — это горячий старт, воссоздание — это холодный старт.
Причина задержки
Что именно делает холодный пуск? Взяв в качестве примера Alibaba Cloud, он примерно включает в себя планирование экземпляров, загрузку и распаковку кода, запуск контейнера и запуск среды выполнения.После завершения этого процесса функция начинает выполняться. Поэтому на время запуска холодного пуска влияет множество факторов:
-
Язык программирования
Есть специальные исследования и сравнения, и время холодного старта разных языков разное
-
размер кода
Этот процесс занимает относительно много времени в процессе холодного запуска, который может составлять десятки миллисекунд или несколько секунд, в зависимости от размера кода.
-
создание контейнера
Длительность этого процесса зависит от поставщика облачных услуг.
-
конфигурация и т. д.
Как оптимизировать
У крупных поставщиков облачных услуг уже есть несколько передовых практик по оптимизации решений, которые требуют совместных усилий разработчиков и поставщиков облачных услуг:
- Уменьшить размер кода:
- Разработчики могут упростить код и удалить бесполезные зависимости, чтобы ускорить процесс загрузки кода функции.
- Например, Tencent Cloud кэширует код на двух уровнях, что позволяет эффективно сократить время загрузки кода.
- Повторное использование ресурсов для сокращения времени выполнения функции
- Выберите язык с меньшим временем холодного запуска
- Выберите правильную память: чем больше функциональная память, тем лучше производительность холодного запуска.
- Избегайте ненужной конфигурации
- Уменьшить частоту холодного пуска
- Используйте триггеры времени для регулярного доступа к функциям, что может предотвратить уничтожение экземпляров функций, если они не используются в течение определенного периода времени.
- Используя запись функции инициализации, Function Compute будет асинхронно вызывать интерфейс инициализации, устраняя время на инициализацию пользовательского кода.
- Зарезервированные экземпляры
время исполнения
Еще одним ограничением FaaS является то, что платформа будет ограничивать время выполнения функций, а процесс выполнения кода будет принудительно уничтожен после превышения времени, поэтому FaaS не подходит для долго работающих приложений. Например, функции AWS Lambda не могут выполняться более 15 минут (ранее — только 5 минут), и в этом случае они сломаются. При его использовании вы должны установить значение тайм-аута в соответствии с вашим ожидаемым временем выполнения, чтобы функция не работала дольше, чем ожидалось.Рекомендуется, чтобы тайм-аут на стороне клиента вызывающей функции был немного больше, чем тайм-аут, установленный функцию, чтобы предотвратить непредвиденный выход из среды выполнения.
Рабочий процесс FaaS
Я считаю, что после прочтения этого вы почти сможете понять рабочий процесс FaaS.Подведем итоги:
- написано разработчикамикод функции, который можно редактировать онлайн или загрузить локально.После завершения платформа FaaS развернет для нас приложение, создастФункция обслуживания
- По настройке клиентавызывать,уведомлятьФункция обслуживания
- если существуетЭкземпляр функции, то функция вызывается непосредственно в среде исполнения, если нет, то функция сначала проходит черезХолодный запуск(Планирование экземпляров, загрузка кода, запуск экземпляров, запуск среды выполнения), а затем выполнение функций
- Функция динамически расширяет запрос ответа в соответствии с объемом запроса пользователя и возвращает содержимое пользователю. После выполнения функции, если в течение определенного периода времени не происходит никаких событий, экземпляр функции будет уничтожен, а приложение FaaS быстро сократится до 0.
Воздействие на переднюю часть
Serverless сейчас так популярен, какое влияние он оказывает на внешний интерфейс?
В целом практика показала, что FaaS помогает нам расширить границы возможностей клиентской части.В качестве фронтенда мы можем быстро выполнить фронтальную и внутреннюю разработку и развертывание самостоятельно, и мы не нужно заботиться о сервере, а также об аспектах эксплуатации и обслуживания, в которых мы не очень хороши. Внешний интерфейс также имеет возможность участвовать в разработке бизнес-логики на стороне сервера, углубляться в бизнес и создавать большую ценность.
Эпилог
В этой статье сочетается практика быстрого создания приложений FaaS с помощью Alibaba Cloud FC и платформы Midway FaaS, а также показано, что такое FaaS, рабочий процесс FaaS, его преимущества и недостатки, а также очарование FaaS в подрыве традиционной модели разработки. В настоящее время сценарии применения FaaS очень широки, например, мобильные приложения, такие как веб-приложения и небольшие программы, искусственный интеллект и машинное обучение, Интернет вещей, обработка данных в реальном времени и т. д. В бессерверную эпоху эффективность производства значительно повышается, и у каждого появляется больше возможностей для создания бесконечных возможностей. Давайте вместе радоваться будущему!
Справочная статья
Справочник по бессерверным технологиям — практическое руководство по бессерверной архитектуре
Документация по облачным функциям Alibaba
Документация по использованию Midway Serverless
Практика оптимизации холодного запуска Tencent Cloud Function Computing
Бессерверные архитектуры (перевод) — (Мартин Фаулер)
Рекомендуемое чтение
Анализ исходного кода vue-router и назначение разрешений динамической маршрутизации
Написание качественного поддерживаемого кода: обзор комментариев
Карьера
ZooTeam, молодая, увлеченная и творческая команда, связанная с отделом исследований и разработок продукции Zhengcaiyun, базируется в живописном Ханчжоу. В настоящее время в команде более 40 фронтенд-партнеров, средний возраст которых составляет 27 лет, и почти 30% из них — инженеры полного стека, настоящая молодежная штурмовая группа. В состав членов входят «ветераны» солдат из Ali и NetEase, а также первокурсники из Чжэцзянского университета, Университета науки и технологий Китая, Университета Хандянь и других школ. В дополнение к ежедневным деловым связям, команда также проводит технические исследования и фактические боевые действия в области системы материалов, инженерной платформы, строительной платформы, производительности, облачных приложений, анализа и визуализации данных, а также продвигает и внедряет ряд внутренних технологий. Откройте для себя новые горизонты передовых технологических систем.
Если вы хотите измениться, вас забрасывают вещами, и вы надеетесь начать их бросать; если вы хотите измениться, вам сказали, что вам нужно больше идей, но вы не можете сломать игру; если вы хотите изменить , у вас есть возможность добиться этого результата, но вы не нужны; если вы хотите изменить то, чего хотите достичь, вам нужна команда для поддержки, но вам некуда вести людей; если вы хотите изменить установившийся ритм, это будет "5 лет рабочего времени и 3 года стажа работы"; если вы хотите изменить исходный Понимание хорошее, но всегда есть размытие того слоя оконной бумаги.. , Если вы верите в силу веры, верьте, что обычные люди могут достичь необыкновенных вещей, и верьте, что они могут встретить лучшего себя. Если вы хотите участвовать в процессе становления бизнеса и лично способствовать росту фронтенд-команды с глубоким пониманием бизнеса, надежной технической системой, технологиями, создающими ценность, и побочным влиянием, я думаю, что мы должны говорить. В любое время, ожидая, пока вы что-нибудь напишете, отправьте это наZooTeam@cai-inc.com