Yury Lavrukhin Personal BlogThoughts on life, personal notes, events. Feel free to contact me at y@yurylavrukhin.com2024-03-19T22:45:12Zhttps://yurylavrukhin.com/Yury Lavrukhiny@yurylavrukhin.com2019-10-09T00:00:00Zhttps://yurylavrukhin.com/articles/promises-asyncronous-js/<h1>Asynchronous JS. Promises By Example. Part 1</h1>
<h2>👋 Introduction</h2>
<p>Hi! In this article, you'll learn how promises works, main concepts, syntax, how to use it to <a href="https://yurylavrukhin.com/articles/promises-asyncronous-js/#fetch-data">fetch data</a>, <a href="https://yurylavrukhin.com/articles/promises-asyncronous-js/#error-handling">handle errors</a>, nuances, and tricks of working with them. <strong>(with examples!)</strong></p>
<!--
Interesting fact: in computer science term `promise` was proposed in 1976, and early implementations of promises began to appear in languages
such as MultiLisp sometime in the 1980s. -->
<p>In JavaScript native promises appeared in 2015 with <code>ES6</code> (or <code>ECMAScript2015</code>) standard and become one of the most important building blocks for asynchronous operations.</p>
<p>Promise's purpose — is to let us write asynchronous code conveniently.</p>
<p><em>Before we dive in. If you are not familiar with promises I recommend you to open the browser's console and execute code examples in the article while reading to get a better understanding and feel the code.</em></p>
<h2>📝 Main Concepts</h2>
<p>Asynchronous operations — is a JavaScript instructions that executes asynchronously, in other words — it takes some time for them to be completed and return a <strong>value</strong>, or failed and return an <strong>error</strong> <em>(they fail often)</em>.</p>
<p>Promise can help us to handle these operations. It's a special JavaScript object, that <strong>has state</strong> and <strong>stores value</strong>.</p>
<p>The promise can be returned synchronously from the asynchronous function.</p>
<p>For example: ↓</p>
<pre><code class="language-js">// fetch function returns a promise
const promiseResponse = fetch('https://jsonplaceholder.typicode.com/posts/1')
console.log(promiseResponse) // Pending Promise (why pending → below)
</code></pre>
<p><img src="https://yurylavrukhin.com/articles/promises-asyncronous-js/assets/pending-promise-in-console.jpg" alt="Pending promise in the console" title="Pending promise in the console" /></p>
<p class="signature">Pending promise in the console</p>
<h2>🤞 3 Possible Promise States</h2>
<p>A bit theory for further more productive practice.</p>
<p>As I said before, the promise is a special JavaScript object, and this object <strong>has the state</strong>.</p>
<p><img src="https://yurylavrukhin.com/articles/promises-asyncronous-js/assets/promise-states.jpg" alt="3 possible promise's states" title="3 possible promise's states" /></p>
<p class="signature">Promise's possible states</p>
<ul>
<li>before the result is ready — the promise's state is <code>pending</code> <em>(we already saw this)</em></li>
<li>when the result is available — the promise's state is <code>fulfilled</code></li>
<li>when an error happened — the promise's state is <code>rejected</code></li>
</ul>
<p>Once the promise is no longer <code>pending</code> (e.g. <code>fulfilled</code> or <code>rejected</code>), we say that promise has been <code>settled</code>.</p>
<p><em>So, <code>settled</code> is not a special state, it's just a word to say that promise has settled with some state — <code>fulfilled</code> or <code>rejected</code></em></p>
<p><strong>Once the promise <code>settled</code>, it can no longer change its state</strong>.</p>
<p><em>There are new states we've learned — <code>fulfilled</code> and <code>rejected</code>. Let's take a look at them in the next section.</em></p>
<h2>👉 <code>then</code> Method</h2>
<p>When our promise <code>fulfilled</code> or <code>rejected</code> — we can access the value from async operation.</p>
<p>But we can't do it synchronously 😐</p>
<p>There is where the <code>then</code> method comes in.</p>
<pre><code class="language-ts">promise.then(
onFulfilled?: Function,
onRejected?: Function
) => Promise
</code></pre>
<p class="signature"><code>then</code> signature</p><p>
</p><p><code>then</code> sets <code>onFulfilled</code> and <code>onRejected</code> functions as handlers for our promise.</p>
<p class="highlight">These functions receive a value from async operation as a first argument.</p>
<p>When async operation done — promise becomes <code>fulfilled</code> and first function will call.</p>
<pre><code class="language-js">const promiseResponse = fetch('https://jsonplaceholder.typicode.com/posts/1')
promiseResponse.then(
(value) => console.log(value, promiseResponse),
(errorValue) => console.log(errorValue, promiseResponse)
)
</code></pre>
<p><img src="https://yurylavrukhin.com/articles/promises-asyncronous-js/assets/promise-fulfilled.jpg" alt="Promise fulfilled" title="Promise fulfilled" /></p>
<p class="signature">Promise fulfilled in console</p>
<p><em>You might notice that browser call our <code>fulfilled</code> promise's state — <code>resolved</code>. You can think of it as <code>fulfilled</code></em></p>
<p>But if we made a typo in our address...</p>
<p>Promise will become <code>rejected</code> and second function will call.</p>
<pre><code class="language-js">const promiseResponse = fetch('https://HTMLplaceholder.typicode.com/posts/1')
promiseResponse.then(
(value) => console.log(value, promiseResponse),
(errorValue) => console.log(errorValue, promiseResponse)
)
</code></pre>
<p><img src="https://yurylavrukhin.com/articles/promises-asyncronous-js/assets/promise-rejected.jpg" alt="Promise rejected" title="Promise rejected" /></p>
<p class="signature">Promise rejected in console</p>
<p>Note:</p>
<p class="highlight"><code>then</code> returns the value that we returned from <code>onFulfilled</code> or <code>onRejected</code> function wrapepped into fulfilled promise.</p>
<p class="highlight">But if we return the promise — <code>then</code> returns this promise.</p>
<p class="highlight">If there is no handler for some promise state in <code>then</code> — <code>then</code> just will return promise on which this <code>then</code> method was called. For example: an error happened and there's no <code>onRejected</code> handler. In this case — <code>then</code> returns this rejected promise as it is.</p>
<h2 id="fetch-data">📦 Getting Data With <code>fetch</code></h2>
<p>We want to get the response's body, so we need to parse it using the <code>json</code> method. This is also an async function that returns a promise.</p>
<pre><code class="language-js">const promiseResponse = fetch('https://jsonplaceholder.typicode.com/posts/1')
promiseResponse.then(response => console.log(response.json())) // log pending promise
</code></pre>
<p>We already know how to deal with pending promises. Just add <code>then</code> to it</p>
<pre><code class="language-js">const promiseResponse = fetch('https://jsonplaceholder.typicode.com/posts/1')
const promiseData = promiseResponse.then((response) => response.json())
promiseData.then((data) => console.log(data))
</code></pre>
<p><img src="https://yurylavrukhin.com/articles/promises-asyncronous-js/assets/get-data.jpg" alt="Get async data" title="Get async data" /></p>
<p class="signature">Get async data</p>
<p>Finally got the actual data in the console. 🥳</p>
<p>We can replace the last line to ↓ <em>(try it yourself!)</em></p>
<pre><code class="language-js">promiseData.then(console.log)
</code></pre>
<p>because <code>console.log</code> is a regular JavaScript function (like the ones we write in our code) that gets infinite number of arguments and log them to the console. In our case there is only one argument and works nicely.</p>
<h2 id="error-handling">⚠️ Error Handling</h2>
<p>Because asynchronous operations fail all the time.</p>
<p>We already handled an error in <em><code>then</code> method</em> section</p>
<p>We can handle errors with <code>then(null, onRejected)</code> and <code>catch(onRejected)</code>.</p>
<p class="highlight"><code>catch(onRejected)</code> is equivalent and shorthand for <code>then(null, onRejected)</code>.</p>
<pre><code class="language-js">const promiseResponse = fetch('https://HTMLplaceholder.typicode.com/posts/1') // TYPO!
const promiseData = promiseResponse.then((response) => response.json())
const data = promiseData.then(console.log)
data.then(null, (errorValue) => console.log(errorValue, 'catched here!'))
</code></pre>
<p class="signature">catched error in promise</p>
<p>Try to replace <code>then(null, onRejected)</code> with <code>catch(onRejected)</code>.</p>
<p><em>Note: we write <code>onRejected</code> handler on the last promise to handle all possible errors that can happened from the first promise to the last.</em></p>
<p>All right! Let's talk about fetching data as most common async operation case. What if our operation done successfully, but server responded with error? In promise terms, our async operation done well and promise will be fulfilled. Let's learn how we can handle this!</p>
<pre><code class="language-js">const promiseResponse = fetch('https://jsonplaceholder.typicode.com/posts/99999999')
// server responds with 404 error
const promiseData = promiseResponse
.then((response) => {
if (!response.ok) throw Error('whoops!')
response.json()
})
const data = promiseData.then(console.log)
data.then(null, (errorValue) => console.log(errorValue, 'catched here!'))
// ... rewrite last line with catch
</code></pre>
<p>Here we check <code>ok</code> flag. As we already know, <code>then</code> returns what we return from handler function</p>
<p class="highlight">Throwing something <em>synchronously</em> (in this case — Error) is the same as if we would returned a rejected promise.</p>
<p>By the way, we can create one already rejected with <code>Promise.reject()</code>. Behaviour will be the same. <em>Try this! And don't forget to return it!</em></p>
<h2>⛓ Promise Chain With <code>then</code> Method</h2>
<p>Take a look at the code we've got on the previous step:</p>
<pre><code class="language-js">const promiseResponse = fetch('https://jsonplaceholder.typicode.com/posts/99999999')
const promiseData = promiseResponse
.then((response) => {
if (!response.ok) return Promise.reject('whoops!')
response.json()
})
const data = promiseData.then(console.log)
data.catch((errorValue) => console.log(errorValue, 'catched here!'))
</code></pre>
<p>Let's get rid of temporary variables. We can just add <code>then</code>s to the <code>fetch</code> and other <code>then</code>s because both them return the promise.</p>
<pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/posts/99999999')
.then((response) => {
if (!response.ok) return Promise.reject('whoops!')
response.json()
})
.then(console.log)
.catch((errorValue) => console.log(errorValue, 'catched here!'))
</code></pre>
<p>Note how our promises «chains» one to another, this thing called <strong>promise chain</strong>! 🎉</p>
<p class="highlight">In the second <code>then</code> there is no <code>onRejected</code> handler, so <code>then</code> just returns rejected promise as it is. That's why we successfully handle promise in the next <code>catch</code>.</p>
<h2>🧱 Promise creation</h2>
<p>Previously, we used the built-in browser function <code>fetch</code> to get a promise, that will be <code>fulfilled</code> or <code>rejected</code> after some time. We can create our own using Promise Constructor!</p>
<p>Take a look at its signature ↓</p>
<pre><code class="language-ts">new Promise((resolve?: Function, reject?: Function) => any)
</code></pre>
<p class="signature">promise constructor signature</p>
<p>We provide a function to the constructor, this function receives two arguments (the name is up to you), both — functions. We can call them with only one argument — promise value, it will be the value we will get in our handlers <code>onFulfilled</code> and <code>onRejected</code>. We can call them to make our promise <code>settled</code>. <code>resolve</code> — to make the promise <code>fulfilled</code>, <code>reject</code> — to make the promise <code>rejected</code>.</p>
<p>Try to write promise that will be <code>fulfilled</code> after 1 second</p>
<pre><code class="language-js">const myPromise = new Promise((resolve, reject) => setTimeout(() => resolve('wee, success! :)'), 1000))
myPromise.then(alert)
</code></pre>
<p>Try the same with reject and <code>catch</code></p>
<p>We can also create already fulfilled promises — <code>Promise.resolve()</code>, and rejected — <code>Promise.reject()</code> with optional value.</p>
<!-- ## 🏁`finally` Method Use Case
As `then` and `catch` we can use the `finally` method with promises.
`promise.finally(Function)`
finally signature
The function we passed into `finally` will be executed once the promise is settled (`fulfilled` or `rejected`).
It can be used to remove the loading state in our app when loading some data: ↓
```js
fetch('https://heavy.data')
.then(response => response.json())
.then(data => displayOurData)
.catch(error => showErrorToUser(error))
.finally(removeLoadingStateForExampleSpinner)
```
Check out real example on <a target="_blank" href="https://jsfiddle.net/ajmdag/xpmnc1k7/30/">jsfiddle</a> -->
<p><img src="https://yurylavrukhin.com/articles/promises-asyncronous-js/assets/to-be-continued.jpg" alt="To be continued" title="To be continued" /></p>
<h2>Topics not covered</h2>
<ol>
<li><code>finally</code> method example</li>
<li>Promises with <code>async/await</code></li>
<li>Work with multiple promises (<code>Promise.race</code>, <code>Promise.all</code>)</li>
<li>Exciting code tasks, more examples</li>
<li>Your proposals, improvements, and comments are appreciated!🎉 → <a href="https://t.me/ajmdag/" title="Telegram">Telegram</a> <a href="mailto:yurka7321@gmail.com" title="E-mail">yurka7321@gmail.com</a></li>
</ol>
2020-01-01T00:00:00Zhttps://yurylavrukhin.com/articles/2019-year-results/<h1>2019</h1>
<h2>Цели</h2>
<p>В начале года я записал то, что хочу сделать за этот год. Мало что из этого списка я сделал, поэтому просто напишу что сделал:</p>
<ul>
<li>
<p>Посмотрел <a href="https://yurylavrukhin.com/movies/">28 фильмов</a> в оригинале на английском с субтитрами на английском, думаю стал лучше понимать речь на слух, но в сложных фразах и речи с акцентом все еще смотрю в субтитры и переводчик.</p>
</li>
<li>
<p><a href="https://yurylavrukhin.com/books/">Книги</a>: прочел 2, прослушал 1.</p>
</li>
<li>
<p>Хотел записывать скринкасты по программированию, чтобы самому лучше разобраться в темах и кому-то помочь, но в итоге написал только одну <a href="https://yurylavrukhin.com/articles/promises-asyncronous-js/">статью про промисы в JS.</a></p>
</li>
</ul>
<hr />
<h2>Мой 2019 год</h2>
<h3>Неопределенное и крутое время [начало года — 5 февраля]</h3>
<p>28 декабря 2018 г. я вернулся из ШРИ Яндекса к семье в Бузулук.</p>
<p>Был очень рад встретиться с друзьями, которых давно не видел и встретить с ними новый год.</p>
<p>В это время я еще числился в колледже в Омске который не посещал с конца сентября, и до этого еще 5 месяцев почти не ходил.</p>
<p>После новогодних каникул мне пришлось вернуться в Омск. Это было неопределенное время для меня. Мне нужно было принять решение. С одной стороны осталось учиться 1.5 года, казалось бы немного, с другой стороны я не понимал зачем.</p>
<p>Я пару недель походил в колледж, и решил перестать туда ходить, это было нелегко. Но об этом решении я не жалею.</p>
<p>18 января я прошел финальное интервью в Яндекс по скайпу и меня позвали. :)</p>
<p><img src="https://yurylavrukhin.com/articles/2019-year-results/assets/plane-sun.jpeg" alt="Вид из самолета" title="Вид из самолета" /></p>
<p class="signature">5 февраля. Вылетаю в Москву</p>
<h3>Яндекс. Москва [5 февраля — 19 мая]</h3>
<p>Стажировка длилась 3 месяца, за это короткое время я круто прокачался в разработке, получил представление о том как выстроенны процессы в крупной компании, пообщался с крутыми ребятами.</p>
<p>Но из-за того что во время стажировки я распылялся на другую деятельность: ходил на тренинги, встречался с разными людьми (я хочу стать предпринимателем, меня привлекает возможность создавать что-то свое), я медленно решал рабочие задачи и меня не позвали работать дальше.</p>
<h3>Неопределенное время [май — август]</h3>
<p>Я вернулся в Бузулук, жил с родителями и работал на фрилансе, не так просто было сосредоточится на работе в такой обстановке: рабочего места у меня не было, как и своей комнаты в которой можно закрыть дверь, через какое-то время я обустроил себе комнату, но это было так себе.</p>
<p>На фрилансе я переписывал сервис по поиску работы в сфере кафе и ресторанов на новые технологии. Я хорошо систематезировал свои навыки, получил опыт разработки проекта в одиночку почти с нуля. Мне очень повезло с человеком, который делал его вместе со мной, смотрел мой код, подсказывал. Спасибо, Паша.</p>
<h3>Прекрасное время [август — октябрь]</h3>
<p>После этого я мгновенно уехал в Омск к своей девушке отдохнуть. Мы поехали в Казахстан и жили там неделю.</p>
<p><img src="https://yurylavrukhin.com/articles/2019-year-results/assets/kz.jpg" alt="Озеро Боровое" title="Озеро Боровое" /></p>
<p class="signature">Озеро Боровое</p>
<p>Во время этих переездов [Сочи → Самара → Бузулук → Оренбург → Омск → Боровое] я умудрился сделать тестовое задание в Aviasales. :) Спасибо моей девушке за терпение и понимание. Я тратил на него то время, когда мы могли гулять, отдыхать и наслаждаться жизнью.</p>
<p><img src="https://yurylavrukhin.com/articles/2019-year-results/assets/kz-laptop.jpg" alt="Ноутбук" title="Ноутбук" /></p>
<p>В это время я был почти «на мели», и меня приютил к себе мой друг, где я и жил до конца октября.</p>
<h3>Aviasales [конец года]</h3>
<p>Впервые в Авиасейлс я написал еще в марте, когда работал в Яндексе. Тестовое получил только в августе. После того как сделал тестовое, выяснилось что меня не могут взять по юридическим причинам. Больше месяца я ждал решения этого вопроса. И он решился, я прошел собеседование и уже 20 октября я прилетел на Пхукет.</p>
<p><img src="https://yurylavrukhin.com/articles/2019-year-results/assets/sunset2.jpg" alt="Закат" title="Закат" /></p>
<p class="signature">Закат у моря</p>
<p>Мне нравится в Авиасейлс, здесь свободная атмосфера, сильная команда, ребята помогают друг-другу в решении рабочих и личных вопросов, есть куча интересных и амбициозных задач, которые предстоит решить и многому научиться. :)</p>
<h3>Разные события года</h3>
<ul>
<li>Через 1.5 месяца после прилета на Пхукет попал в небольшую аварию на байке. Отделался царапинами.</li>
</ul>
<p><img src="https://yurylavrukhin.com/articles/2019-year-results/assets/bike-at-police.jpeg" alt="" /></p>
<p class="signature">Мой байк у полиции</p>
<ul>
<li>Побывал в Малайзии (Куала-Лумпур) и Бангкоке на дне рождения Aviasales.</li>
</ul>
<p><img src="https://yurylavrukhin.com/articles/2019-year-results/assets/birthday.jpeg" alt="Aviasales 12" title="Aviasales 12" /></p>
<p class="signature">Aviasales 12 лет</p>
<ul>
<li>Посмотрел на солнечное затмение 26 декабря</li>
</ul>
<h3>Заключение</h3>
<p>В новом году хочу заняться снова музыкой; сделать что-то большое и крутое в своей работе; побывать в нескольких странах, подумать какие больше нравится и почему, ну и просто посмотреть на мир; стабильно заниматься физкультурой (бегать хотя бы через день), проверить полностью здоровье, и быть счастливым. :)</p>
2020-10-26T04:00:00Zhttps://yurylavrukhin.com/articles/year-in-aviasales/<h1>Year in Aviasales</h1>
<p>It's been a year since I moved to Thailand🇹🇭 and started a new job at <a target="_blank" href="https://aviasales.com/">Aviasales</a>. We live in Phuket and have an office here.</p>
<p>It's been a good year. I've learned about life in another country, it was a completely new experience for me. People are not as different from country to country as they might seem. The company and people from there gave me a lot. It's cool to be surrounded by smart people. During the year I've done a several things for the company that I'm proud of.</p>
<p>I like to live in Thailand.</p>
<p>I discovered surfing as a very exciting sport.</p>
<p><img src="https://yurylavrukhin.com/articles/year-in-aviasales/assets/falling.jpeg" alt="Me surfing 🤙🏼" title="Me surfing 🤙🏼" /></p>
<p class="signature">Surfing is cool! 🤙🏼</p>
Since we live on the island surrounded by the sea, I have an opportunity to surf almost every day 🙃.
<h2>Notes for Myself</h2>
<p>When you are bored: remember the feeling of doing something glorious and remarkable, something that changes your life. Focus on finding those actions — effective actions you can tackle.</p>
<p>Do not rely on others opinions much, learn things by yourself.</p>
<p>Only you decide what your future will look like. It's your decision. <em>(<a href="https://en.wikipedia.org/wiki/Stoicism" target="_blank">Stoicism</a>)</em></p>
<p>Do not be afraid of changes and uncertainty. These are integral parts of life. Take care of yourself, breathe easily, focus, act.</p>
<h2>Pictures at the End</h2>
<p><img src="https://yurylavrukhin.com/articles/year-in-aviasales/assets/sunset.jpeg" alt="Sunset" title="Sunset" /></p>
<p><img src="https://yurylavrukhin.com/articles/year-in-aviasales/assets/road_sunset.jpeg" alt="Road sunset" title="Road sunset" /></p>
2021-10-04T15:40:00Zhttps://yurylavrukhin.com/articles/the-creators-mindset/<h1>The Creator's Mindset</h1>
<p>I made this note to remind my future self how to maintain a creative mindset and motivate myself to create.
Reflected on my fears and obstacles that prevent me from creating.</p>
<h2>👨🎨 Stay Conscious</h2>
<p>A person's current life is just a set of decisions made over time (significantly affected by randomness).
We make decisions based on what's in our minds.</p>
<p class="highlight">Pay close attention to what comes to your mind and strive to consciously consume information.</p>
Nourish your mind with quality information on topics you're interested in, and your life, everything that surrounds you, will change the same way.
<br />
<br />
<h3>🌐 Especially on the Internet</h3>
<p>In today's world, it's easy to slip up and start consuming more information than you need.
Information consumption in huge portions kills your individuality, your unique life path.</p>
<p class="highlight">Internet is just a tool.</p>
<p>And it is worth using it in the same way as any other tool — as needed.</p>
<p>Once you'll start using the internet consciously as a tool with the intention in mind — there will be more room for creativity in your brain and you will find peace of mind.
In my experience, this is a tremendous life upgrade.</p>
<h2>👀 Keep Your Eyes Wide Open</h2>
<p>Most people live in their informational ghetto and do not realize it.
That's why different cultures evolved across the planet and how some people control and manipulate others, but that's the other story…</p>
<p>Always keep your eyes and mind open: learn other's experiences, take time to research different sources of information to get the most full-fledged and objective picture of the topic of your interest.</p>
<p class="highlight">Don't let yourself get stuck into your informational ghetto.</p>
<h2>📜 A Few Rules</h2>
<p>That help support the creator's mindset:</p>
<ul>
<li><strong>⚰️ Remember about death.</strong>
<br />
This is your last life. Soon you’ll die, your body will be eaten and… you'll never exist again.</li>
<li><strong>⌛ Now is the best time to create.</strong>
<br />
You are young, your brain works faster than ever + you have time.</li>
<li><strong>🌉 Put yourself into a position where you have to move.</strong>
<br />
It might be hard, you can try to: upgrade the level of your life, gather more responsibility, fill up your schedule, change city, …</li>
<li><strong>⚡️ Make decisions fast.</strong>
<br />
The quicker you make decisions and the more important they are — the stronger you become as a person</li>
<li><strong>💪 Challenge yourself.</strong>
<br />
All the greatest breakthroughs, accomplishments, and remarkable moments I've had were when I committed to do something, usually for some time.</li>
<li><strong>😎🤓🥸 Surround yourself with greatest people.</strong>
<br />
Learn from them, ask questions to them, and work.</li>
</ul>
<p>Don't forget to rest 🙌🏻</p>
<h2>😨 😵💫 My Fears and Obstacles</h2>
<ol>
<li>
<p>«People will see what I've done. Some of them won't like it and will think that I'm dumb or will make fun of me»
<br /><br />
— While you care about it, other people are just creating things. Let's cure it quickly and get your hands dirty.
<br />
<br />
<strong>You are not the center of the world.</strong> Don't take too seriously what you do. The world won't stop if you will deliver a low-quality product at your beginning. You will get experience, you will learn from it, after a few iterations this process will go smoother.
<br />
<br />
Don't be shy of things that you are fond of, your passions and desires. Learn and know yourself (you can change something if you discovered something unwanted), own your strengths and weaknesses and move from this point, know why you're creating, and create.
<br />
Some of the people will see what you did and pass by, others will be interested. It's impossible to be liked by everybody. In fact, many people will like what you did and will support you. In any case — nobody will hurt you and nothing bad will happen.
<br />
<br /></p>
</li>
<li>
<p>«Other creators are better professionals than me, they know how to do it, but I don't»
<br /><br />
— <strong>Creators are not specially prepared people</strong>, they are just brave/dare enough to create and share results with others.
<br />
<br />
We all start somewhere. Start with your current skill set, pick a thing you wanna do, make a rough draft of what you're trying to achieve and how. Then go for it! Other creators around the world do exactly this.
<br />
Do not think too much about what your close friends will think about what you've done or that you're not skilled enough. Just do what your passion tells you to do.
<br />
What you'll create will be different from what's exists in the world now. And it's OK, it's cool.
<br />
Create, discover great things, make mistakes, evolve, enjoy.</p>
</li>
<li>
<p>«Nobody will be interested in what I've done»
<br />
<br />
— You'll never know if you'll never do.
<br />
<br />
Do your best, show it to the world and develop. Don't be afraid and don't hesitate to prove yourself.</p>
</li>
</ol>
<h2>🌌 Ending</h2>
<p>Creation is the way to learn about yourself, your limits, a way to express yourself.
<br />
After all, this is what you will be left with on your deathbed — memories of the things you've done.</p>
<p><strong><em>Do something today for what you will be proud of tomorrow</em></strong></p>