<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Charli Bregnballe</title>
    <description>The latest articles on DEV Community by Charli Bregnballe (@charlibregnballe).</description>
    <link>https://dev.to/charlibregnballe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F147365%2F78835e75-e3e0-481f-9b5d-b0fc6ed537f4.jpeg</url>
      <title>DEV Community: Charli Bregnballe</title>
      <link>https://dev.to/charlibregnballe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charlibregnballe"/>
    <language>en</language>
    <item>
      <title>The benefits of a development plan at work</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Mon, 30 Oct 2023 22:48:00 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/the-benefits-of-a-development-plan-at-work-3alb</link>
      <guid>https://dev.to/charlibregnballe/the-benefits-of-a-development-plan-at-work-3alb</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;The reason why most people change jobs is because they either want to try something new or feel stuck in their current job.&lt;br&gt;
Without saying a development plan can solve all problems, it does have a lot of benefits that can address this exact problem.&lt;br&gt;
When a trained employee quits, it costs the company 200% of their annual salary.  (Source zavvy.io)&lt;/p&gt;

&lt;p&gt;Add to that that providing e-learning training increases the retention rate by 60%. (Source zavvy.io)&lt;/p&gt;

&lt;p&gt;Those are 2 very good reasons to look into why people quit and what to do about it.&lt;br&gt;
One of the things we do in my job is to make sure that everyone has a development plan.  In my opinion, it should be a set part of each tech professional's life. &lt;br&gt;
The plan contributes to staying focused and moving towards shared goals in an organized way.&lt;br&gt;
It is perfectly combined with having a blog or portfolio, but where the portfolio is a personal project, the development plan involves the company.&lt;br&gt;
And I think it is equally important for both companies and employees to prioritize it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a development plan
&lt;/h2&gt;

&lt;p&gt;A development plan is a structured document or process that outlines an employee's goals and objectives for personal and professional growth.&lt;br&gt;&lt;br&gt;
It is a plan the manager and employee make together.&lt;br&gt;
The purpose of the plan is to select and agree on a few key areas of focus for further development throughout the year or a longer period. &lt;/p&gt;

&lt;p&gt;An example:&lt;/p&gt;

&lt;p&gt;Name: John Doe&lt;br&gt;
Position: Software Developer&lt;br&gt;
Current Skill Level: Mid-level&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Master a new programming language:  Learn PHP and become proficient in it within the next year.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find and take an online course&lt;/li&gt;
&lt;li&gt;Spend 1 hour each day coding in PHP&lt;/li&gt;
&lt;li&gt;Team up with a senior when facing challenges&lt;/li&gt;
&lt;li&gt;Get onboarded on a client PHP project&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve understanding and implementation of technical SEO:  Get a deep understanding of the underlying best practices of technical SEO within the next year.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get an overview of available tools and select a few key tools&lt;/li&gt;
&lt;li&gt;Practice on your own website/company website&lt;/li&gt;
&lt;li&gt;1-hour weekly meeting with the company's SEO expert to share knowledge&lt;/li&gt;
&lt;li&gt;Make an analysis of the technical SEO on 3 clients and present your findings to the client.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Timeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly check-in with manager showcasing findings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above is a very superficial example of a development plan but serves an illustrative purpose.  It would usually contain more details in each step, follow-ups, and subgoals. &lt;br&gt;
It is even better if it is possible to convert it into concrete tasks that can be checked off when done.&lt;/p&gt;

&lt;p&gt;The whole idea is that it is a shared responsibility, where the manager's role is to support and facilitate the plan, while the employee executes it.  Identifying goals together and planning it also serves the purpose of a shared platform and understanding, where both parties will hold each other accountable.&lt;br&gt;&lt;br&gt;
It will give structure to the plan and make it possible to execute the relevant activities to help further growth.&lt;/p&gt;

&lt;p&gt;An ideal plan is as concrete as possible, where it is very clear when a goal or subgoal is obtained.  The easier it is to measure, the easier it is to document the progress.  The clear expectations also make it easier for both parties to identify actions and plan the steps to reach the goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it is important
&lt;/h2&gt;

&lt;p&gt;Creating and following these plans is something I consider a very high priority.&lt;br&gt;&lt;br&gt;
I find it very motivating to follow the growth of colleagues and share their passion.&lt;br&gt;
Also, it is essential to keep people motivated and happy in their professional lives.&lt;/p&gt;

&lt;p&gt;Here are some of the key benefits from my perspective.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill Enhancement&lt;/strong&gt;&lt;br&gt;
This might be obvious, but a development plan provides a structured way to improve existing skills or learn new relevant things.&lt;br&gt;
In most jobs, it also contributes to ensuring that they stay updated with the latest technologies and best practices in their field.&lt;br&gt;
Most jobs and people do have a lot of growth potential and adding a structured plan will make it easier to execute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motivation&lt;/strong&gt;&lt;br&gt;
Making and following a development plan also contributes to daily motivation and helps drive growth and fuel progress.&lt;br&gt;
Reaching goals and improving skill sets also provide a sense of purpose and accomplishment in the job.&lt;br&gt;
Lack of motivation often leads to unhappy employees and bad results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Career Growth&lt;/strong&gt;&lt;br&gt;
Combining the 2 above will lead to career growth, where each individual will get a better and more satisfying job, with relevant tasks of the right level of difficulty and maybe promotion opportunities. &lt;br&gt;
Also, it is possible to steer the career in the desired direction, whether it is diving deep into an expert role or transitioning into a managing role.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retain Employees&lt;/strong&gt;&lt;br&gt;
Creating and following a development plan can also contribute to employees staying at the company longer because they do not feel stuck.  Being stuck can in some cases lead to changing jobs.  The most used explanation for changing jobs is that employees want to try something new or different.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More Interesting Jobs&lt;/strong&gt;&lt;br&gt;
Discovering growth potential together and creating shared goals creates engagement which is very valuable for both the employee and the company.&lt;br&gt;&lt;br&gt;
It will improve job satisfaction while being more productive or valuable for the company.&lt;br&gt;
Furthermore, it helps both the company and the employee to prepare for the future.&lt;br&gt;
People tend to get more invested in their job when it has relevant future perspectives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attractive Workplace&lt;/strong&gt;&lt;br&gt;
For the company, the development plan and the investment in the employees make it a more attractive place to work. &lt;br&gt;
Clarity and emphasis on individual professional development strengthen the connection between the company and its employees, fostering greater loyalty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jen0LwZM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzzwd7bhn3ce6ea8qmeg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jen0LwZM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzzwd7bhn3ce6ea8qmeg.jpeg" alt="meme" width="403" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(image is from X) &lt;/p&gt;

&lt;p&gt;The plan is important because it can help people get better at their current job, or even prepare them for the next job or promotion.  Creating it and following it together with the manager has benefits compared to doing it alone.&lt;br&gt;
Often the manager's experience contributes positively, both in terms of picking the right areas of focus, but also to avoid potential pitfalls.  And if made together it is possible for both parties to hold each other accountable to the agreements and motivate each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfect combination with blog or portfolio
&lt;/h2&gt;

&lt;p&gt;I've previously written an article about why I think every tech professional should have a blog or portfolio.  You can read it &lt;a href="https://confidentcode.com/blog/why-you-should-have-a-blog-or-portfolio"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This aligns perfectly with a development plan.  While the blog and portfolio aim to document the growth in the past, the development plan will serve the purpose of planning the future.&lt;br&gt;
The combination enables the option to document the journey as well.&lt;br&gt;
While selecting topics for further development, the blog or portfolio can be the platform where the progress and acquired skills are documented and showcased.&lt;/p&gt;

&lt;p&gt;Furthermore, the portfolio can be an inspiration to which topics to dive deeper into and help keep the motivation up, while looking back on the goals reached in the past.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;I do believe that having a development plan is pretty common, especially in tech.&lt;br&gt;
But if you find yourself in a position where you feel stuck or without a plan for the future, I would strongly recommend reaching out to your manager and presenting the idea.&lt;/p&gt;

&lt;p&gt;Above you have all the mutual benefits that should resonate well with most managers and companies.&lt;br&gt;&lt;br&gt;
I mean, who wouldn't support a colleague who wants to become better at his job, learn new skills, and provide more value?&lt;/p&gt;

</description>
      <category>developmentplan</category>
      <category>growth</category>
      <category>management</category>
      <category>developers</category>
    </item>
    <item>
      <title>6 Common Pitfalls In Multicultural Teams - and how to deal with them</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Wed, 04 Oct 2023 21:46:13 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/the-benefits-of-a-development-plan-at-work-4glo</link>
      <guid>https://dev.to/charlibregnballe/the-benefits-of-a-development-plan-at-work-4glo</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;A shared vision and shared set of values is the key to success in managing multicultural teams.  Combine that with a high level of trust and embrace different perspectives and you have a very solid foundation.&lt;/p&gt;

&lt;p&gt;The following writeup contains reflections from a management perspective on working in a multicultural team, which I see as both a big challenge, but also a huge advantage.&lt;br&gt;&lt;br&gt;
Combining diverse skill sets with cultural diversity is an advantage if done with success containing a shared vision and shared set of values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing multicultural teams
&lt;/h2&gt;

&lt;p&gt;The manager plays a central role and holds a lot of responsibility when it comes to turning diversity into an advantage.  Both in terms of the cultural and skill diversity.&lt;/p&gt;

&lt;p&gt;An environment with a high level of trust is key.  In order to succeed in creating such an environment the need to facilitate a shared understanding of the strengths of different backgrounds cannot be underestimated.  &lt;/p&gt;

&lt;p&gt;Bridging the cultural gaps and fostering understanding so that it is viewed as a strength, by focusing on the positive things, where the team's collective intelligence is the focus.  Highlighting the individual's strengths and weaknesses in a positive manner.&lt;br&gt;
Showcasing the strengths in the diverse team and diverse skills-set, so not everything thinks they have to fit into the same box.&lt;/p&gt;

&lt;p&gt;To get people to be at their natural best, they need to be in an environment that makes them dare to take chances.  That requires a high degree of trust.  &lt;/p&gt;

&lt;p&gt;The leader needs to work hard to get to a place where every single team member feels safe enough to offer their ideas, take risks, solve complicated problems, work together, and complement each other.&lt;/p&gt;

&lt;h4&gt;
  
  
  Embrace diversity
&lt;/h4&gt;

&lt;p&gt;Diversity and differences can be the reason for a lot of conflict in the workplace.  Often conflicts are rooted in different perspectives or understandings, maybe even knowledge.&lt;br&gt;
Having a dialogue about a topic within one's profession is supposed to highlight and enlighten the different views and more often than not people work towards a shared goal.&lt;br&gt;&lt;br&gt;
It is less about being right, and more about finding the right solution.&lt;br&gt;
Usually, I preach that we should focus on providing knowledge, not proving knowledge.&lt;br&gt;
Articulating viewpoints is always a good exercise.  &lt;/p&gt;

&lt;p&gt;The different perspectives should be regarded as a learning opportunity, where creativity, innovation, and problem-solving thrive.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Communication is key
&lt;/h4&gt;

&lt;p&gt;In my experience, the majority of the issues and conflicts at work can be traced back to communication issues.  In a multicultural team, miscommunication is often related to language barriers, cultural references, assumptions, and so on. &lt;/p&gt;

&lt;p&gt;Cultural nuances influence our communication and with different backgrounds and perspectives, it can be hard to follow when it gets complicated.  Being aware of this combined with a curious and explorative mindset, usually enables the options for deeper and more detailed communication which leads to a better understanding in the end.&lt;/p&gt;

&lt;p&gt;When working in tech, where communication can be flawed, discussing a relevant work-related topic can as a bare minimum help each person involved understand where they stand in the discussion and even more help with providing a framework of argument to support the opinion being held.  It is about exchanging knowledge.&lt;/p&gt;

&lt;p&gt;So, when we communicate with colleagues, we need to be aware and question our assumptions and beliefs.  It requires that we pay attention to detail because our assumptions can seem invisible to us.&lt;/p&gt;

&lt;p&gt;My friend's favorite quote says it all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumptions is the mother of all fuckups.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Common pitfalls
&lt;/h2&gt;

&lt;p&gt;Throughout countless encounters with multicultural teams, I've started to see a pattern of repeated mistakes.&lt;br&gt;
They are often centered around a lack of understanding and knowledge about how cultures and people differ.  It is key to stay informed, research, and learn about cultural differences especially how they are expressed in a professional environment.&lt;br&gt;
So, that is usually where I start.&lt;/p&gt;

&lt;p&gt;Another key area of focus, when working with people from other cultures than my own, I to try to keep a laser-sharp focus on accurate and precise communication.  Being extremely clear, and explicit, avoiding cultural biases, and being very careful about assumptions.  &lt;/p&gt;

&lt;p&gt;Here are the 6 most common pitfalls from my point of view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perceptions of Authority&lt;/strong&gt; can vary across different cultures.  It primarily revolves around the concept of belief in authority and how individuals interact with a person of authority.  In some cultures, the hierarchy seems rather flat, whereas in other cultures the opposite is true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback Culture&lt;/strong&gt; is also something that I experience differently.  In some cultures, negative feedback is rarely expressed, while in others the feedback can be very direct.&lt;br&gt;
Of course, personality type does play a huge role in this too, and the level of trust.&lt;br&gt;
As a leader, creating a culture of feedback is important.&lt;br&gt;&lt;br&gt;
Being able to receive feedback is extremely important and will contribute to a higher level of trust and shared understanding.&lt;br&gt;
Listening and encouraging it will lead to more while being defensive or responding negatively will make people stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asking for help&lt;/strong&gt; can in some cultures or environments be a sign of weakness, lack of skill or not being good enough at one's job.  You do not want silent members in the team, who struggle on their own and feel that they cannot raise their voice and ask for help.&lt;br&gt;
This again requires a high level of trust within the team, but the opposite can lead to bad results, lack of growth, and low job satisfaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Job security&lt;/strong&gt; is also one of the key elements of the leader's communication.  I think it is important to make it very clear where people stand in terms of the situation, termination, and so on.  Some people need a lot more safety than others and often more than the leader thinks.  Just overcommunicate.&lt;br&gt;&lt;br&gt;
But remember, transparency is not about giving all the information, it is about giving enough information to understand the context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision-making process&lt;/strong&gt; is somewhat related to authority.  Some cultures tend to look towards the leader for decisions to be made, while others expect to be included in the decision-making process.&lt;br&gt;&lt;br&gt;
With a low level of trust, involving people in decision-making processes can sometimes create an uncomfortable situation, because the expectations are different.  Also, making a lot of decisions without involving the team can lead to a lack of trust, depending on the situation and the culture.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language barrier&lt;/strong&gt; is an issue no matter how good we are at speaking other languages.  Sometimes less than others, but speaking and writing in our native language will always be more precise and easier.  Especially with all the assumptions and cultural common understanding that comes with it.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;For this to be actually applied in a team setting, it is an absolute must that there is a shared vision and the values align.  This is where I consider the leader to be the main facilitator of inspiration and culture.&lt;/p&gt;

&lt;p&gt;I am in a lucky situation where I've had the chance to connect with people where we could openly talk about the differences in leadership between the Danish culture and where they come from.&lt;br&gt;
The chance to discuss these topics and understand different perspectives does without a doubt make me a better leader.&lt;br&gt;
And based on that I keep my unshakeable belief that the difference between people's personalities, cultural backgrounds, experiences, and so on, WILL be used as an advantage.&lt;br&gt;&lt;br&gt;
It is my unwavering vision and I am keen on creating a culture where these values thrive.&lt;br&gt;
Turning it into a superpower, where the collective intelligence can grow with the team, to create a place where it is fun to work, and how different perspectives are welcomed and contribute to personal growth and great innovative solutions.&lt;/p&gt;

&lt;p&gt;I will end by encouraging you to reflect on how you deal with the different personalities, whether it is rooted in cultural differences skill-set, or personality.&lt;/p&gt;

</description>
      <category>multiculturalteams</category>
      <category>diversity</category>
      <category>developers</category>
      <category>management</category>
    </item>
    <item>
      <title>Dealing with imposter syndrome collectively</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Wed, 27 Sep 2023 20:21:58 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/dealing-with-imposter-syndrome-collectively-44i0</link>
      <guid>https://dev.to/charlibregnballe/dealing-with-imposter-syndrome-collectively-44i0</guid>
      <description>&lt;p&gt;Imposter Syndrome is very real in the modern world.  Dealing with it collectively is one of its strongest antidotes.&lt;br&gt;
One way to normalize these feelings is to share experiences and collectively deal with them, whether in the role of a coworker, friend, or when you're personally affected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I have previously written about the need to talk about imposter syndrome. &lt;br&gt;
(You can read that article &lt;a href="https://confidentcode.com/blog/we-need-to-talk-about-the-imposter-syndrome/" rel="noopener noreferrer"&gt;here&lt;/a&gt;)&lt;br&gt;
This is somewhat a follow-up to my reflections and discussing why dealing with it collectively can be a really strong antidote.&lt;br&gt;&lt;br&gt;
These experiences might not fit everyone, but they can still be relevant.  For those who are not dealing with this themselves, it can give some understanding, insights, and even ways to start a dialogue.  A shared understanding is key.&lt;br&gt;
Those who are affected by this might be able to recognize some of the examples and thought processes and hopefully help to further normalize the feeling and start dealing with it. &lt;/p&gt;

&lt;h2&gt;
  
  
  What you think they know
&lt;/h2&gt;

&lt;p&gt;I often meet the misperception of what one person knows and what someone else knows.  These thoughts or impressions can often lead to a feeling of not being good enough.&lt;/p&gt;

&lt;p&gt;Here is a common thought pattern of unequal or misunderstood comparison.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrgz4979m57lautxt36k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrgz4979m57lautxt36k.png" alt="What I think others know illustration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This can be how one person compares himself to someone else.  This belief is made under a false premise.  Obviously, we don't know how much someone else knows.  And how is that even determined or measured?&lt;br&gt;
Maybe some people have the same thoughts about the person who has these thoughts.&lt;br&gt;
When this happens, it is almost always a matter of perspective.&lt;br&gt;&lt;br&gt;
You can ask yourself, do people around you share these views?  Do they experience it the same way as you do?&lt;/p&gt;

&lt;p&gt;This drawing is properly closer to reality. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ww1u9jcxbdmss0xpsry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ww1u9jcxbdmss0xpsry.png" alt="Illustration of what I know compared to others"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, it varies, depending on this crazy idea that we can measure knowledge like that.&lt;br&gt;
A better illustration would likely look something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0ya7uh0q6p5xvjp5rj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0ya7uh0q6p5xvjp5rj5.png" alt="More accurate illustration of what I know compared to others"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So who do you measure yourself against?  And on what?&lt;br&gt;
There will always be someone who is better at this particular thing you are measuring right now.  But there will also be 1000 people who are worse or know less.&lt;/p&gt;

&lt;p&gt;Without talking to anyone about it, this perspective becomes very 1-sided.  And the person you are talking to might share these thoughts or something similar.  But who breaks the silence?&lt;/p&gt;

&lt;h2&gt;
  
  
  Paralyze or motivate
&lt;/h2&gt;

&lt;p&gt;Some people who are under the influence of imposter syndrome, tend to split into 2 categories.  Paralyzed vs. motivated.&lt;br&gt;&lt;br&gt;
It is not necessarily one or the other, people can jump between the two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paralyse&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defensive pessimisme&lt;/li&gt;
&lt;li&gt;Fear of failing&lt;/li&gt;
&lt;li&gt;Stop you from trying&lt;/li&gt;
&lt;li&gt;Not giving your best&lt;/li&gt;
&lt;li&gt;Do not dare to invest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Motivate&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strategic optimisme&lt;/li&gt;
&lt;li&gt;Full speed on development&lt;/li&gt;
&lt;li&gt;Constant improvement&lt;/li&gt;
&lt;li&gt;Stress and pressure&lt;/li&gt;
&lt;li&gt;Threat-based performance is the direct path to misery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When paralyzed, it has a huge impact on the lack of risk that is being taken.  Without risk, a lot of opportunities and missed improvements will stagnate.  The fear of failing alone will prevent people from trying and not giving their best.  What happens if we give our best and still fail?  It can be hard to deal with.&lt;/p&gt;

&lt;p&gt;It is important to recognize that imposter syndrome can serve as a motivator, often fueling personal growth.&lt;br&gt;&lt;br&gt;
The continuous drive for self-improvement is a powerful force, but it should be approached with caution. It can transform into unhealthy pressure often due to a lack of perspectives.&lt;br&gt;&lt;br&gt;
Neglecting to celebrate one's successes often signals the presence of an unhealthy motivator.&lt;/p&gt;

&lt;p&gt;Insecureness by itself is not a problem.  A humble approach is often very valuable and well-regarded.&lt;br&gt;&lt;br&gt;
It is our reaction and how we deal with these feelings that determines the outcome.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;p&gt;With the internet, our world suddenly became a lot bigger.  Before the internet, we did not have that many people to compare ourselves to.&lt;br&gt;&lt;br&gt;
Now we are exposed to the entire world and it is available instantly through the internet on our phones, which we carry with us every day.&lt;br&gt;
Social media made us even more exposed. &lt;/p&gt;

&lt;p&gt;The thing is, these comparisons are on very unequal terms.&lt;br&gt;
We compare our inner thoughts, with all the knowledge we have about our strengths and weaknesses, successes and failures, and our entire history.&lt;br&gt;&lt;br&gt;
That is compared to a carefully selected and often well-crafted and manipulated image of a person on social media.&lt;br&gt;&lt;br&gt;
The comparison is unequal, simply because of the lack of knowledge about the person we compare ourselves to.&lt;br&gt;
Often we zoom in on a highly skilled specialist's niche, on a successful moment, carefully selected and posted on social media, but...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You do not know their background&lt;/li&gt;
&lt;li&gt;You do not know their journey&lt;/li&gt;
&lt;li&gt;You do not know their sacrifice &lt;/li&gt;
&lt;li&gt;You do not know their feelings&lt;/li&gt;
&lt;li&gt;You do not know their weaknesses&lt;/li&gt;
&lt;li&gt;You do not know their insecurities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The comparison is not only unequal, it is also wrong.&lt;br&gt;&lt;br&gt;
If you compare yourself to one person, he will be better at a lot of things than you are.  But the reverse is also true.&lt;br&gt;
If you compare yourself to 1000 people and compare their strengths to your weaknesses, the outcome will never be in your favor.&lt;br&gt;
I advocate for self-comparison instead.  It is within our circle of control.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb70cyz5zxf707w570brc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb70cyz5zxf707w570brc.png" alt="Illustration of self comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expose yourself
&lt;/h2&gt;

&lt;p&gt;The section above often triggers insecurity.  Do you know someone who makes you insecure?&lt;br&gt;&lt;br&gt;
It is interesting to dive into this and investigate what triggers the insecurity.  And even more interesting to get that person's perspective.&lt;br&gt;
I would advise you to open up and talk openly about it.  &lt;/p&gt;

&lt;p&gt;Imposter syndrome isn't a disease.  It's a normal response to internalizing impossible high standards. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Doubting yourself doesn't mean you're going to fail.  It usually means you're facing a new challenge and you're going to learn.  Feeling uncertainty is a precursor to growth. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Adam Grant&lt;/p&gt;

&lt;p&gt;Dealing with it collectively can give some perspective on the insecurities.  Some shared understanding and the first step to addressing it.&lt;br&gt;
We all have our strengths and weaknesses.  A personality test will expose you.&lt;br&gt;
In a team, a diverse skillset is a superpower.  It needs to be utilized, by being vocal and clear about strengths and weaknesses within each individual in the team.&lt;br&gt;
No one is expected to be the best at everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;We need to kill the myth of effortless success. &lt;br&gt;
In my opinion, we should shift our focus and pay tribute to the journey and the hard work that led to success.&lt;/p&gt;

&lt;p&gt;While doing that, we should remember to stop reflect, and celebrate successes and achievements.  Both our own and others. &lt;br&gt;
Dismissing these has a dual negative impact that affects both the sender and receiver.&lt;br&gt;&lt;br&gt;
Pretending an achievement wasn't that big of a deal, or it was easy, or moving on to the next thing quickly seems to be somewhat common.  I wish we could spend more time and energy talking about and analyzing what makes us impressed.  I wish we could hold on to that wow feeling, maybe even recall it when touching the topic.&lt;/p&gt;

&lt;p&gt;If someone comes up to you impressed by something you did, and you neglect it.  This will make it a small thing, but will also kill the wow feeling from the other person.  &lt;/p&gt;

&lt;p&gt;Imposter Syndrome is lurking in the shadows and it is based on false assumptions. &lt;br&gt;
Instead of trying hard to prove your competencies, you should focus on improving them.&lt;/p&gt;

&lt;p&gt;Embrace diverse skill sets, it is a superpower.  Let's talk openly about it.  And not behind each other's backs.&lt;br&gt;
Let's make sure that each individual feels valuable and let's make people's contributions clear and highlight the successes&lt;br&gt;
Pluralistic Ignorance is poison, the collective doubt in silence is one of the key factors to fuel this phenomenon.&lt;/p&gt;

&lt;p&gt;We cannot make these feelings go away, but we can start dealing with them.&lt;br&gt;
So please, don't focus on &lt;strong&gt;proving&lt;/strong&gt; knowledge, but focus on &lt;strong&gt;providing&lt;/strong&gt; it.&lt;br&gt;
And don’t bring the social media circus to the real world.&lt;/p&gt;

</description>
      <category>impostersyndrome</category>
      <category>growth</category>
      <category>developers</category>
      <category>management</category>
    </item>
    <item>
      <title>We need to talk about the imposter syndrome</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Tue, 19 Sep 2023 20:56:05 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/we-need-to-talk-about-the-imposter-syndrome-10kd</link>
      <guid>https://dev.to/charlibregnballe/we-need-to-talk-about-the-imposter-syndrome-10kd</guid>
      <description>&lt;p&gt;We need to talk about the imposter syndrome.  The rising prevalence of this condition of persistent doubt and anxiety has become a growing concern that requires our attention and understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I am not sure if the Imposter Syndrome is a product of the modern world, but it seems to me that it is becoming more and more common.&lt;br&gt;&lt;br&gt;
During my job as a manager for developers, I get to meet a wide range of tech professionals on different levels and with different experiences and backgrounds.  Imposter Syndrome seems to be present at all levels, ages, experiences, and throughout different backgrounds among individuals.&lt;/p&gt;

&lt;p&gt;Understanding and addressing imposter syndrome is crucial for fostering self-confidence and promoting a healthy sense of accomplishment in individuals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imposter Syndrome
&lt;/h2&gt;

&lt;p&gt;It is a phenomenon where individuals doubt their abilities and competencies, despite education, skill, achievements, and successes.&lt;br&gt;&lt;br&gt;
Oddly enough, it is more common among well-educated successful people.&lt;br&gt;
It is estimated that ~70% will face it one way or the other during life.&lt;/p&gt;

&lt;p&gt;The definition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Persistent doubt concerning one’s abilities or accomplishments accompanied by the fear of being exposed as a fraud despite evidence of one’s ongoing success&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The definition is pretty good, but I want to highlight the essentials.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Persistent doubt&lt;/strong&gt; concerning one’s abilities or accomplishments accompanied by the fear of being exposed as a fraud &lt;strong&gt;despite evidence of&lt;/strong&gt; one’s ongoing &lt;strong&gt;success&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The persistent doubt.  It is highly individual but it can come in various shapes and formats and is not necessarily constant.  I've seen cases where the feeling of self-confidence works as a metronome, where it constantly switches between insecureness and disbelief, and confidence and secureness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YfQM4NnP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3tqqtyv0tsz6tj8e5ze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YfQM4NnP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3tqqtyv0tsz6tj8e5ze.png" alt="Imposter metronome" width="640" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can occur relating to tasks, feedback, or accomplishments, but at times it also seems to have a mind of its own and shift unpredictably. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why is it
&lt;/h2&gt;

&lt;p&gt;I highly doubt that we can find a single course or reason behind this feeling.  It can be related to a wide range of things and experiences throughout life.&lt;/p&gt;

&lt;p&gt;There are some factors though, that I see repeatedly in the context of imposter syndrome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Toxic Culture&lt;/strong&gt;&lt;br&gt;
I've seen cases where the environment's toxicity triggers insecureness and imposter syndrome.&lt;br&gt;
It can be related to fear of failing or a very competitive environment. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perfectionism&lt;/strong&gt;&lt;br&gt;
Perfectionism does not necessarily equal imposter syndrome, but when perfectionism works against the individual and creates a pressure of high performance and expectations it can lead to a feeling of not being good enough.&lt;br&gt;
The high standards that some perfectionists can hold themselves to can trigger this feeling, especially during adversity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Past experiences&lt;/strong&gt;&lt;br&gt;
When looking back in time, we often find answers to questions regarding mentality and personality traits.&lt;br&gt;&lt;br&gt;
Bad experiences can lead to an intensified feeling of not being good enough. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparison to others&lt;/strong&gt;&lt;br&gt;
When you go to social media everyone is showcasing their achievements.  We are exposed to people who are always happy, always out eating, and always on holiday.&lt;br&gt;
If we compare ourselves to others we have to make sure we do it on equal terms.  And that is not through carefully selected, set-up images and posts on social media.  They do by no means represent real life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transition and change&lt;/strong&gt;&lt;br&gt;
Starting a new job, or learning a new technology, a little self-doubt is natural.  The nervousness and tension can become overwhelming and become a disadvantage if it is not controlled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internalized criticism&lt;/strong&gt;&lt;br&gt;
And worst of them all, the internalized criticism.&lt;br&gt;&lt;br&gt;
How people are towards themselves says a lot about how they feel.&lt;br&gt;&lt;br&gt;
I've seen a lot of cases where people are very hard on themselves and talk to themselves in a way they would never dream of talking to a friend or colleague.&lt;br&gt;
They hold themselves to standards that are bound to fail.  Standards they never would expect colleagues or friends to redeem.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to deal with it
&lt;/h2&gt;

&lt;p&gt;The first step is to talk about it.  Normalize it.&lt;br&gt;
We need to acknowledge this feeling, and whenever it appears, dive into it, figure out what triggers it, and try to understand the underlying cause. &lt;br&gt;
Coping with imposter syndrome on your own can be quite challenging, and for many, these thoughts are considered off-limits even though they are widespread.&lt;br&gt;
Hiding them can reinforce the feeling in both the individual and the surrounding people.&lt;/p&gt;

&lt;p&gt;We need to stop the constant comparison.  It is poison.&lt;br&gt;
This often happens on social media, where we are exposed to other people's successes, achievements, and shareable moments in life. &lt;br&gt;
The thing is, when we look at other people's achievements and compare them to our own, we do it on unequal terms.  We have no idea about what is actually behind these posts, and the sacrifice for the success.&lt;br&gt;
Most of the time we do not get exposed to the insecureness that can rest in the person behind the post.&lt;/p&gt;

&lt;p&gt;The worst part of it is we compare our inner to people's outer.  Meaning that our feelings, mind, and the state where we know everything, are compared to these carefully selected moments of success.  And we do not only compare ourselves to 1 person, but to a lot.  Often we are competing with the entire world.  Getting overwhelmed by the bombardment of other people's success can trigger a feeling of not feeling good enough.&lt;/p&gt;

&lt;p&gt;Before the internet, you would know people in your town.  Classmates, people from sports, etc.  Each person had the opportunity to excel in a particular area.  And most people were.  Simply because the talent pool was smaller.  Fewer people = smaller talent pool.&lt;br&gt;
But that was OK.  We were not exposed to not being good enough in the same way. &lt;br&gt;
We didn't compare ourselves to the entire world, just the people around us.  There's always someone in the world who excels more than we do, but within a single class or sports team, it's not always the case.&lt;/p&gt;

&lt;p&gt;There is no good reason to constantly compare yourself to others.  Everyone is different.  They have different backgrounds, skill sets, and minds, and thereby prerequisites to excel.&lt;br&gt;
We need to compare ourselves today with ourselves last year instead.  Make self-improvement the thing we measure. &lt;/p&gt;

&lt;h2&gt;
  
  
  Positive aspects of imposter syndrome
&lt;/h2&gt;

&lt;p&gt;The imposter syndrome does have a few positive sides that are worth mentioning. &lt;/p&gt;

&lt;p&gt;Imposter syndrome can frequently foster humility, which has its advantages, it prevents taking things for granted and promotes a mindset that doesn't elevate oneself above others.  This humility often leads to more compassionate and empathetic interactions, facilitating attentive listening skills. &lt;/p&gt;

&lt;p&gt;Another advantage is that it can be a driver for progress, in a healthy way.  It can drive individuals to continually improve and often this improvement can be a good antidote to the feeling.&lt;br&gt;
I've seen cases both where it stalls individuals, but also the other extreme where it drives them to stress and anxiety because they are so focused on improvement that it is damaging.&lt;br&gt;&lt;br&gt;
Somewhere in between those two lies a good and healthy driver which can fuel progress, without sacrificing mental health. &lt;br&gt;
The self-doubt itself is very common.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;One way to spot a potential imposter syndrome can be to notice how they receive compliments.  Sometimes those who find discomfort in a compliment or discard it can be victims of imposter syndrome.&lt;/p&gt;

&lt;p&gt;Helping friends and colleagues tackle or deal with imposter syndrome can help them gain perspective and confidence in their abilities, ultimately leading to great personal and professional growth.&lt;br&gt;&lt;br&gt;
And simply a higher quality of life.&lt;/p&gt;

&lt;p&gt;So, next time you sense insecureness in a friend or a colleague, PLEASE make sure to tell them that &lt;strong&gt;you&lt;/strong&gt; think they are doing great!  No one ever was convicted for being too nice to other people, nor did it ever give a bad result complimenting someone.  In general, we should complement and elevate each other more.&lt;/p&gt;

&lt;p&gt;I am by no means pretending that I hold the key to dealing with this, but I do think it is very important to learn how to deal with negative emotions.&lt;br&gt;
Because how we deal with these emotions is certainly the key to success.&lt;/p&gt;

</description>
      <category>impostersyndrome</category>
      <category>growth</category>
      <category>developers</category>
      <category>management</category>
    </item>
    <item>
      <title>Why you should have a blog or portfolio</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Tue, 12 Sep 2023 21:37:31 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/why-you-should-have-a-blog-or-portfolio-22p2</link>
      <guid>https://dev.to/charlibregnballe/why-you-should-have-a-blog-or-portfolio-22p2</guid>
      <description>&lt;p&gt;Exploring the multiple benefits of having a portfolio or blog.  A source of inspiration to kickstart your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Tech professionals are on endless learning journeys.  We are constantly improving, skilling up, and learning new things.  But it often happens in small steps that make it hard to track.&lt;br&gt;
Documenting your progress and journey is very relevant and useful, especially for new developers and other tech professionals.&lt;br&gt;&lt;br&gt;
I've got mine and even though it is a source of endless guilt for not keeping it updated, it is &lt;strong&gt;something&lt;/strong&gt; and I believe it is good enough.&lt;br&gt;
I also encourage my colleagues to follow my example and beat me in terms of both quality and quantity.  &lt;/p&gt;

&lt;p&gt;I found that the key to doing this consistently is to do it while it is still fresh in my mind and I haven't lost the wow of my discoveries.   Tech moves so fast, so the amazing thing we discovered last week does not seem that amazing the week after.&lt;br&gt;
We simply forget the wow.  Therefore, I recommend preserving that sense of wonder by documenting your experiences in writing when you experience them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;p&gt;There is a wide range of benefits to having a portfolio.  I will briefly list a few of the most obvious ones, but one stands out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice and improve writing.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Writing is truly a superpower in the modern world of tech, where remote work is very common and the majority of the communication is in the written format.&lt;br&gt;
Therefore I believe it is the most important benefit and side effect.&lt;br&gt;
Practice writing is never wasted and can always be improved.&lt;br&gt;
Most IT issues are related to communication.  It is often due to bad writing or lack of time to sit down and craft a well-thought-through piece of communication that others can use.&lt;br&gt;
Becoming better at writing clearly, and understandably, while getting the reader's attention is truly an underestimated skill in the modern world.  And it is often overlooked by developers, even though it is so widely used. &lt;/p&gt;

&lt;h3&gt;
  
  
  Double learning
&lt;/h3&gt;

&lt;p&gt;This is one of the free benefits of documenting your progress, projects, and newly acquired skills.&lt;br&gt;&lt;br&gt;
If you learn or discover something new or cool, sitting down, reflecting and writing will add an extra dimension to your understanding of the thing you learned.&lt;br&gt;&lt;br&gt;
We all know that teaching something to others is one of the most efficient ways to learn new things.&lt;br&gt;&lt;br&gt;
Consider this as an extra round of practice while finishing up what you just learned. &lt;/p&gt;

&lt;h3&gt;
  
  
  Gain clarity
&lt;/h3&gt;

&lt;p&gt;During the research and actual writing, you will gain some extra insights and improve your understanding of the subject.&lt;br&gt;
It will give you clarity and make sure you have a deeper understanding.&lt;br&gt;
The gained clarity can also have the extra benefit of clearing your thoughts while reflecting on a topic and forming an opinion or arguing why you stand where you stand in a discussion. &lt;br&gt;
It is a good way to develop opinions on complicated topics.&lt;/p&gt;

&lt;p&gt;The extra clarity also serves the purpose of problem-solving.  If you find yourself going in circles with an issue, writing, and the gained clarity can help solve the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Document your journey
&lt;/h3&gt;

&lt;p&gt;Imagine yourself having a blog or portfolio where you document your greatest achievements each month, then after 1-2 years you can look back and you will see how far you have come, and it will be very clear the steps you have taken and the progress you have made. &lt;br&gt;
Even though it can be painful to read something you wrote 1-2-3 years ago, it showcases the gained experience and knowledge very clearly.&lt;br&gt;
Actually, the worse it seems the better, because it will outline the progress and make it very visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Share knowledge
&lt;/h3&gt;

&lt;p&gt;If you learn something that you find amazing or discover something interesting then it is worth sharing.&lt;br&gt;&lt;br&gt;
Some people might know these things already, but there will be 1000 times as many people who don't know this.  Properly more.&lt;br&gt;
And if you asked a question or discovered something, then you are not alone with this exact problem. &lt;br&gt;
Imagine if your post would be found by someone who was asking the same question and you then provide the answer.  He might battle the same issue or might just be earlier in his journey than you.&lt;br&gt;
Everyone is doing the same thing when they are in doubt.  Google has the answer, but only because so many brilliant people decided to share their knowledge and experiences.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Profile and CV
&lt;/h3&gt;

&lt;p&gt;If you manage to do this consistently, then you will eventually have a very detailed CV which will make it a lot easier to hire you.&lt;br&gt;
If you ever find yourself in a situation where you want to change jobs, you can easily create a CV based on your portfolio.&lt;/p&gt;

&lt;p&gt;And it is never a bad thing to display some kind of mid-way-reflections during your progress and work life.  It does give the employer a sense of the person and the mindset behind the profile. &lt;br&gt;
And a clear illustration of the skillset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Battle the imposter syndrome
&lt;/h2&gt;

&lt;p&gt;It is a double-edged sword because the imposter will tell you that you are not good enough to publish anything.  That your findings gained knowledge is basic and not interesting to anyone.&lt;/p&gt;

&lt;p&gt;Remember this:  When you learn something, 0.01% of people have this knowledge and 99.99% don't.  There are way more developers on a journey who could benefit from this.  Of course, some will already know it, but everyone has been on a long learning journey, and most are still traveling! &lt;/p&gt;

&lt;p&gt;The articles, projects, or whatever the portfolio contains, will also serve the purpose of showcasing the progress you have made to yourself.&lt;br&gt;&lt;br&gt;
And that is one of the great antidotes against the imposter syndrome.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Above are just some of the obvious benefits of having a portfolio or blog.&lt;br&gt;&lt;br&gt;
Nevertheless, it is often a struggle to get started and to keep going.&lt;br&gt;
Even though the intentions are good and everything is clear, it is hard to do this.&lt;/p&gt;

&lt;p&gt;To succeed discipline is key.  You need to make it a habit to document these things and write about your experiences.&lt;br&gt;
Also, try to make it as easy as possible for you to write it down.  Remove all obstacles, mainly technical ones and those related to perfectionism.&lt;br&gt;&lt;br&gt;
Don't expect it to be perfect, less will do!&lt;br&gt;
Take feedback positively, someone sees what you are doing, spends time reading it, and gets an idea of how you can do even better.  They value your contribution and see the options and opportunities to make it even better.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_P9gmwWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uef5jwrjhz39jlwgfelw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_P9gmwWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uef5jwrjhz39jlwgfelw.png" alt="motivation vs discipline" width="574" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember to write while it is still fresh in your mind, if not you will lose both the wow effect and joy, but also the important details.&lt;br&gt;
Often the longer you wait the greater the struggle it is to get started or finish it. &lt;br&gt;
It is also easier to write right after your discoveries since it is fresh and you don't need to re-research.&lt;/p&gt;

&lt;p&gt;Lastly, see if you somehow can set yourself up for success by creating a space where you can enjoy the process of writing.&lt;br&gt;&lt;br&gt;
It should feel good to publish something, but the process of crafting this piece of content is actually what matters! &lt;/p&gt;

</description>
      <category>growth</category>
      <category>productivity</category>
      <category>developers</category>
      <category>management</category>
    </item>
    <item>
      <title>Combine GTD and Deep Work</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Tue, 05 Sep 2023 21:38:23 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/combine-gtd-and-deep-work-39ei</link>
      <guid>https://dev.to/charlibregnballe/combine-gtd-and-deep-work-39ei</guid>
      <description>&lt;p&gt;Modern work life seems to be pushing knowledge workers more and more towards an endless streak of jumping between tasks, meetings, and emails. An always-available mentality and constant communication.  All while busyness is mistaken for productivity and context switches prevent us from doing focused work.&lt;br&gt;
The Get Things Done methodology combined with Deep Work can be the key to being productive in a world full of distractions.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;While the amount of knowledge workers in the modern world keeps raising the requirements, office, and work settings seem to make it impossible to create a good environment for the mind to thrive.  The modern workplace often fosters an unhealthy culture of constant notifications, context switching, and multitasking.&lt;/p&gt;

&lt;p&gt;In order to get the full benefit and potential out of these people, a paradigm shift is needed.  We need to direct our attention toward the environment we work in and see if it actually promotes productivity.&lt;br&gt;
To me, it seems like a lot of responsibility is left to each individual to manage time and tasks to be efficient and productive.&lt;/p&gt;

&lt;p&gt;How can we do hard things with our brain when it is constantly shifting focus and context?  And is rarely set up to focus on a single task, but is always forced to multitask.  And we even applaud it and celebrate this ability. &lt;/p&gt;

&lt;p&gt;While Deep Work seems to be the key to handling the difficult single-focused deep tasks, we still need to handle the insane amount of small,  lightweight, and shallow tasks where we are expected to have an opinion and make choices with little to no preparation. &lt;br&gt;
This alone can be a full-time job and more.  And it gets even worse if you are part of a family, have friends, and even worse than that if you have kids.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hjCXGiTk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ic9445jz1v7uzih35ar9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hjCXGiTk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ic9445jz1v7uzih35ar9.png" alt="focus vs multitasking" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am using a very simple system heavily inspired by the Get Things Done methodology from David Allen's book by the same name.&lt;br&gt;
It had to be adjusted a little bit to fit my job, but that is also one of his key takeaways from the book.  Make it your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Things Done - GTD
&lt;/h2&gt;

&lt;p&gt;This article is not supposed to give you a full and in-depth understanding of the idea and methodology, but just scratching the surface.&lt;br&gt;
If you are interested, I would suggest you read the book.  You can purchase it &lt;a href="https://www.saxo.com/dk/getting-things-done_david-allen_paperback_9780349423142"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The way I use GTD in my work life is very simple.&lt;br&gt;&lt;br&gt;
I have a range of to-do lists that are either for work or for personal things.&lt;br&gt;&lt;br&gt;
When a task is coming my way I quickly scan it and if it takes less than 5 minutes to do, I do it instantly, if I can.&lt;br&gt;
If it takes more than that, I either add it to my Deep Work to-do list or my shallow work to-do list.&lt;br&gt;&lt;br&gt;
I keep the lists in prioritized order, so I know the most important ones are always on top.&lt;/p&gt;

&lt;p&gt;If there is a task with an important deadline, I add it to my calendar.  I book a session to do this task.  Booking this session takes less than 5 minutes.&lt;/p&gt;

&lt;p&gt;By doing this I get everything out of my head and that enables me to focus on the single tasks that take more time and concentration.&lt;/p&gt;

&lt;h2&gt;
  
  
  GTD + Deep Work
&lt;/h2&gt;

&lt;p&gt;Utilizing the system described above leaves me with lists divided into different types of work sessions, deep work, and shallow work.&lt;/p&gt;

&lt;p&gt;I then use the shallow work list to add events of research and planning that will create the space needed for me to do deep work later.&lt;br&gt;
Usually, I defragment my calendar so I try to get a lot of the shallow work done before I do a deep work session.&lt;/p&gt;

&lt;p&gt;Once I am ready for a deep work session, I start my routine and dive into the tasks on the list.&lt;br&gt;&lt;br&gt;
I wrote a short article about my routine that you can read &lt;a href="https://dev.to/charlibregnballe/3-steps-to-the-flow-state-and-deep-work-5b5o"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;p&gt;The single biggest benefit for me using this system is it makes it a lot easier to deal with stress and free up space in my mind to do focused time.&lt;br&gt;&lt;br&gt;
I do not trust my brain to remember everything, and even if I do it will take up so much space that my very limited capacity will take a loss.  I will not be able to do the same amount of deep work of the same quality and I will run out of stamina faster.  &lt;/p&gt;

&lt;p&gt;It also helps me not forget things, because my lists will work as my plan for the day, week, month, and so on.  All the while I make sure to always work on the most important things first.&lt;/p&gt;

&lt;p&gt;Unfinished or incomplete tasks take up a lot of space and a large chunk of our energy. &lt;br&gt;
They tend to remain in our consciousness.  If we complete a task, it is erased from the memory.  The brain is good at forgetting things it thinks we don't need anymore.&lt;/p&gt;

&lt;p&gt;This is called the Zeigarnik effect.&lt;br&gt;&lt;br&gt;
It is not necessary to complete tasks to erase them from memory though. &lt;br&gt;
Simply adding them to a list to get them out of your consciousness will leave the mind at rest, if you trust your system.&lt;/p&gt;

&lt;p&gt;Another benefit is the feeling of checking things off your to-do list.  It makes you realize that you completed things, made progress, and moved forward.  Finishing a day's work with a lot of completed tasks will also let you leave work with this satisfied feeling of productivity that is so important.   &lt;/p&gt;

&lt;h2&gt;
  
  
  Nothing is perfect
&lt;/h2&gt;

&lt;p&gt;There is no flawless system of course, but this one helps me reduce a lot of stress and be extremely efficient.&lt;br&gt;&lt;br&gt;
My job does have many crucial shallow work tasks, but I also see a lot of value in availability, since I am in a managing position. &lt;br&gt;
Being available to spare, help, and fix unexpected problems is a top priority, but it is this constant availability that makes it so hard to have longer streaks of uninterrupted focus time. &lt;/p&gt;

&lt;p&gt;I trust the system, which is key to really taking tasks out of the head and down to the paper or list.  Without trusting it, they will linger in the mind, create disturbance, and take up space that could be used for something else.&lt;br&gt;
It takes a lot of energy, and the constant worry about forgetting something often leads to a fragmented focus and disturbance that can break concentration. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;One issue is that I often feel fatigued when trying to reach the flow state, simply drained from the context switches during the day.&lt;br&gt;&lt;br&gt;
The cognitive cost of those can be a problem, but it is not always possible to do it differently, it is a part of a job and a part of being alive, social, and so on.&lt;/p&gt;

&lt;p&gt;So therefore I accept that I do less deep work now than I did in my previous job.  I then changed my focus to make sure people around me can do deep work.  Then I block the team for a lot of shallow work and interruptions so they can have long streaks of focus time which is so crucial for developers.  Both for their productivity and developer happiness.&lt;br&gt;&lt;br&gt;
I've written more about Deep Work at the workplace &lt;a href="https://dev.to/charlibregnballe/unleash-the-power-of-deep-work-in-the-modern-workplace-on3"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is not a system that works for everyone, but I highly encourage everyone to start investigating and experimenting with similar methods.&lt;br&gt;
The benefits and value is enormous and while I become extremely efficient and productive, it also relieves a lot of stress and pressure.&lt;/p&gt;

&lt;p&gt;With that said, I am still fighting the ridiculous idea that everyone has to be available to anyone during the workday.&lt;br&gt;
In the department I manage, we praise deep work, encourage it, and create the space needed for each individual to get a productive and fulfilling working day, free from constant communication and distractions that do not create any value. &lt;br&gt;
It is not perfect, but it is a work in progress.&lt;/p&gt;

&lt;p&gt;Honestly, it all comes down to:&lt;br&gt;
Don't read an email if you are not going to respond to it.  It will take up space in your mind.&lt;/p&gt;

</description>
      <category>deepwork</category>
      <category>productivity</category>
      <category>getthingsdone</category>
      <category>gtd</category>
    </item>
    <item>
      <title>3 steps to the flow state and deep work</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Tue, 29 Aug 2023 21:53:41 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/3-steps-to-the-flow-state-and-deep-work-5b5o</link>
      <guid>https://dev.to/charlibregnballe/3-steps-to-the-flow-state-and-deep-work-5b5o</guid>
      <description>&lt;p&gt;The following post is about my experiences and my take on building a strong routine and utilizing deep work.&lt;br&gt;
My routine to reach the flow state consists of 3 simple steps; Prepare, create space, and Immersion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Reaching the flow state is becoming increasingly harder in the modern world full of distractions.  The amount of notifications, constant communication, availability, and things that are trying to get our attention is only increasing, and combined with the fear of missing out is a huge threat to our ability to focus and do deep work.&lt;br&gt;
The battle for our attention is a constant struggle that requires both strong discipline and practice to even stand a chance.&lt;/p&gt;

&lt;p&gt;Deep work is one of my areas of focus both personally and during my job as a manager of developers in a consultancy company. &lt;br&gt;
I wrote an article about deep work that you can read &lt;a href="https://confidentcode.com/blog/unleash-the-power-of-deep-work-in-the-modern-workplace/"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I am a strong believer in asynchronous communication and utilizing the tools available.  Every day I  see how they are misused and how the always-available idea drives people to stress and towards a fragmented workday.&lt;br&gt;
The main feature of written digital communication is that you don't have to reply instantly, the biggest asset of this type of communication is that it can asynchronize.&lt;br&gt;
You actually don't have to check your emails every 10 minutes.&lt;br&gt;
You don't have to be instantly answering on Slack or chats.&lt;/p&gt;

&lt;p&gt;If you are a knowledge worker and want to be a top performer, you &lt;strong&gt;HAVE&lt;/strong&gt; prioritize focus time.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Routine
&lt;/h2&gt;

&lt;p&gt;The brain is a muscle, you can train it and you do so by using it, and the same thing applies to deep work.  You practice, and you get better.  Training this muscle and practicing locking into the focus mode is something that you increasingly will become better at the more you do it.&lt;br&gt;&lt;br&gt;
Following the same routine will make it easier and easier to dive into focus mode.&lt;br&gt;
But it does require a combination of strong willpower and endless repetition to succeed.&lt;br&gt;
Creating a routine you believe in and sticking to will give you the results over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cKjz6Ipu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yob1e32valvz4sqpmvzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cKjz6Ipu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yob1e32valvz4sqpmvzl.png" alt="illustration of multitasking vs focus" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can even go one step further and create some routine triggers.&lt;br&gt;
It could be a particular playlist or a track you listen to when you focus.&lt;br&gt;
It can also be the routine of closing all tabs in the browser or starting on a new desktop.&lt;br&gt;
Another trigger can be a special setting or physical space, like a room, a cafe, or wherever you prefer to dive deep into the task or project.&lt;br&gt;
Often preparing (step 1 in the next session) can work as a trigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 steps
&lt;/h2&gt;

&lt;p&gt;These can and should vary a lot depending on who, what, and how.  These are just my take and the routine I usually follow.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preparation and research.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start out by planning what you want to do and how to do it.  Having a clear goal and removing all obstacles is the key part of this step. &lt;br&gt;
Do the research and get everything ready.&lt;/p&gt;

&lt;p&gt;Block time in your calendar, so everyone knows that you are in the flow state and you hold yourself accountable to dive into a deep work session. &lt;br&gt;
Maybe set a status of deep working.  Even saying it out loud works well if you are working in an open office.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create space and establish an optimal environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Get the shallow work out of the way.  Either make a to-do list or finish the shallow work tasks or whatever is taking space in your mind.&lt;/p&gt;

&lt;p&gt;Close Slack, your email, and notifications off and turn your phone upside down (and on silent mode). So you are reachable through phone calls only.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Immersion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where you start and immerse into the zone.&lt;br&gt;
Music often helps, so put on headphones and start your preferred playlist for deep work.  I personally prefer some without vocals.&lt;/p&gt;

&lt;p&gt;And start your task...&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting and finishing
&lt;/h2&gt;

&lt;p&gt;On a side note, but still relevant; Another great piece of advice is to look at how you start and finish these sessions.&lt;br&gt;
If you find yourself in a situation where you work on a bigger project over several sessions, make sure you finish in a way, where it will be easy to start the next session.&lt;br&gt;
It is a bit similar to step 1 with the research, but if you work on the same project for more sessions, you can actually let step 1 be very lightweight.  If you stop somewhere, where the next step is very clear and write snapshots of your current state of mind as notes or todos, it can enable you to slide right back into a similar thought spree and start where you left it after the last session.&lt;/p&gt;

&lt;p&gt;I often make sure to end the session by writing my current idea of what the next step should be. &lt;/p&gt;

&lt;p&gt;Depending on what you do, the situation, the time of day, and so on, the length of the deep work session can vary.  It is very individual and hard to generalize.&lt;/p&gt;

&lt;p&gt;Personally, I like to have no ending and just let my cognitive fitness decide.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Practice is the key.  And while doing so create your own routine.&lt;br&gt;
Practice the process and adjust it to fit your needs and the situation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mA0fpf9X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/na117xdhhm36mn4k13me.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mA0fpf9X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/na117xdhhm36mn4k13me.png" alt="illustration of motivation vs discipline" width="574" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While it is important to get into the flow state to focus, it is equally important to battle the constant distractions and the urge to break the focus.  Practice staying focused for longer and longer streaks of time.&lt;br&gt;
This battle is constant and this is where practicing really matters and pays off.&lt;br&gt;&lt;br&gt;
Do not give in.  The notifications, reels, posts, and so on will be there in 1 hour as well!  Take advantage of it, it does not have to be real-time.  You do not miss anything! &lt;/p&gt;

&lt;p&gt;When you succeed with this, you will over time notice increased performance both in the quality you produce, but also in the quantity.&lt;br&gt;&lt;br&gt;
This can help bring you to the next step in your career or to execute ideas and passion projects with efficiency.&lt;/p&gt;

&lt;p&gt;Furthermore, this provides an additional benefit and added advantage by fostering a sense of fulfillment, meaningfulness, and continuous progress in your job.&lt;/p&gt;

&lt;p&gt;So my final advice: Schedule time for deep work, make it recurring, and start practicing.  &lt;/p&gt;

</description>
      <category>deepwork</category>
      <category>productivity</category>
      <category>managers</category>
      <category>flowstate</category>
    </item>
    <item>
      <title>Unleash the power of Deep Work in the modern workplace</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Mon, 26 Jun 2023 08:58:14 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/unleash-the-power-of-deep-work-in-the-modern-workplace-on3</link>
      <guid>https://dev.to/charlibregnballe/unleash-the-power-of-deep-work-in-the-modern-workplace-on3</guid>
      <description>&lt;p&gt;Deep work is a superpower in the modern world.&lt;br&gt;&lt;br&gt;
Mastering the ability is essential in the modern world, where notifications and distractions constantly threaten your concentration and productivity.&lt;br&gt;&lt;br&gt;
The following is my take on how to create a culture of growth, productivity, and skill development while increasing fulfillment and well-being.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;A few months after I started as a manager at Novicell, I sent out a survey to everyone in the department.  I had my personal goals and I was also hired to improve and change a range of things, but everything came from the management level.&lt;br&gt;
But I also wanted to understand my key focus areas, based on the team's insights.  &lt;/p&gt;

&lt;p&gt;One thing that stood out very clearly to me was that people couldn't concentrate at work.  It was a very clear result from the survey and I started to analyze the office environment to see what and how we could implement change and start doing more Deep Work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Deep Work and Flow State
&lt;/h2&gt;

&lt;p&gt;The term Deep Work was coined by author Cal Newport in his book with the same title.   &lt;/p&gt;

&lt;p&gt;As he describes in his book, Deep Work is nothing new and it is not something he "invented".  It is a mental state where one is fully immersed in an activity so he forgets time and place.   &lt;/p&gt;

&lt;p&gt;It is also known as the flow state, which is a term from 1970 by Mihály Csíkszentmihályi. &lt;/p&gt;

&lt;p&gt;Some also refer to it as being "in the zone" or hyperfocus.&lt;br&gt;&lt;br&gt;
Even though the concepts differ a bit, they do share a lot of similarities.   &lt;/p&gt;

&lt;h3&gt;
  
  
  Definition of Deep Work
&lt;/h3&gt;

&lt;p&gt;Cal Newport defines Deep Work as:&lt;br&gt;&lt;br&gt;
“Professional activity performed in a state of distraction-free concentration that pushes your cognitive capabilities to their limit. These efforts create new value, improve your skill, and are hard to replicate.” &lt;/p&gt;

&lt;p&gt;This is familiar for most people, but maybe not always something they experience during work, maybe through movies, playing music, computer games, or similar activities.  &lt;/p&gt;

&lt;p&gt;I remember practicing this a lot during my studies at university.  I always had a hard time getting started on tasks or assignments, but once I climbed the hill of pulling myself together and actually starting, I usually ended up enjoying it. &lt;/p&gt;

&lt;p&gt;The joy of being fully immersed and productive gives this addictive feeling of satisfaction. &lt;/p&gt;

&lt;p&gt;Recalling this feeling when motivation is missing and practicing deep work activities and routines had a huge impact on my performance and how enjoyable it was. &lt;/p&gt;

&lt;h3&gt;
  
  
  Differentiating between shallow work and deep work
&lt;/h3&gt;

&lt;p&gt;We can't always be in the flow state and we can't only do deep work.  We often go back and forth between deep work and shallow work.   &lt;/p&gt;

&lt;p&gt;Shallow work is all your tasks that do not necessarily take a long time or a lot of effort.  It could be answering an email, booking a meeting, or some of those daily lightweight tasks we execute during a normal day at work. &lt;/p&gt;

&lt;p&gt;Cal Newport defines shallow work: &lt;/p&gt;

&lt;p&gt;“Non-cognitively demanding, logistical-style tasks, often performed while distracted. These efforts tend to not create new value in the world and are easy to replicate.” &lt;/p&gt;

&lt;p&gt;I would argue that we need both to function, but the key here is understanding the difference between the two and utilizing this understanding and benefiting from it.  &lt;/p&gt;

&lt;p&gt;There are several ways to do this, which I will discuss later, but understanding and identifying the two is the first step.   &lt;/p&gt;

&lt;p&gt;The modern world pushes us more toward shallow work and this can lead to dissatisfaction and lack of fulfillment in your (work) life.   &lt;/p&gt;

&lt;p&gt;But that is another blog post.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of deep work and flow state for developers and their skill development
&lt;/h3&gt;

&lt;p&gt;When we are in the zone, fully immersed in the task we are doing, forgetting time and space, this is where the mind thrives.  It is in this mental state that the magic happens. &lt;/p&gt;

&lt;p&gt;We push our cognitive capabilities to their limit while being creative and efficient; this is where we improve our skills, maximize our potential and learn new things.   &lt;/p&gt;

&lt;p&gt;Mastering this ability in the modern world is absolutly key.  We are constantly distracted and always available, so this skill is slowly disappearing, while the need for it is increasing.     &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QmGFGrnK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54xtcdru29tvqo8jw2ym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QmGFGrnK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54xtcdru29tvqo8jw2ym.png" alt="Learn Do Grow" width="785" height="556"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Well-being tends to increase when you are productive.  Up to a point of course. &lt;/p&gt;

&lt;p&gt;So, the idea is not only to maximize productivity but also to increase general well-being, satisfaction, and fulfillment.   &lt;/p&gt;

&lt;h2&gt;
  
  
  Creating an Environment for Deep Work
&lt;/h2&gt;

&lt;p&gt;During the covid lockdown, a lot of companies experienced one of the benefits of remote work.  Increased productivity and focus while working from the home office.  And it created a lot of debate regarding the office environment.  &lt;/p&gt;

&lt;p&gt;The open office is very common and is by no means anything that fosters deep work. &lt;/p&gt;

&lt;p&gt;The constant auditive and visible disturbances will make it almost impossible to do deep work. &lt;/p&gt;

&lt;p&gt;There are some upsides to the open office that we need to take into account.  It does foster communication, collaboration, and socialization, which are also key elements for a good working environment. &lt;/p&gt;

&lt;p&gt;The question is how to get the right mix of socializing at work while providing the option to do deep work sessions. &lt;/p&gt;

&lt;h3&gt;
  
  
  Minimize distractions and interruptions
&lt;/h3&gt;

&lt;p&gt;I have started a few different initiatives and experiments with the office at Novicell. &lt;br&gt;
As a manager, I see it as my responsibility to make sure the office is a place where everyone likes to be both for work and socializing. &lt;/p&gt;

&lt;p&gt;I am a strong believer in and advocate for remote work.  It is important to me that working from home or remotely is a free choice, a tool you use, an option you got, and not something you are forced to do in order to do your job. &lt;/p&gt;

&lt;p&gt;If employees don't go to the office, then the manager should look into the reasons behind this and see what needs to be changed. &lt;br&gt;
Nothing good comes out of forcing behavior on people.   &lt;/p&gt;

&lt;p&gt;I've asked around and one of the things that brings the joy of work down is having too many interruptions and distractions.  Pointless meetings or bad-timed meetings are one of the worst. &lt;br&gt;
Some key factors in developer happiness. &lt;/p&gt;

&lt;h3&gt;
  
  
  Foster a culture of deep work
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Establish dedicated deep work periods &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encourage effective time management techniques &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set boundaries and encourage respect for focused work &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One of the initiatives was to encourage developers and help them block time in their calendars for deep work.  This made it visible to everyone that they were in the zone and shouldn't be disturbed by status updates or anything like that. &lt;/p&gt;

&lt;p&gt;It actually also held them accountable for their "promise" to themselves regarding a productive deep work session. &lt;/p&gt;

&lt;p&gt;For some developers, I set up dedicated deep work periods, mainly to get them into a routine, but also to practice it collectively. &lt;/p&gt;

&lt;p&gt;Another initiative was that I asked everyone to fill out a schedule of deep work and shallow work hours, and I made sure they were only booked for meetings outside their deep work hours or focus hours. &lt;/p&gt;

&lt;p&gt;Usually book meetings around a time when they are not doing deep work.  That could be right after lunch.   &lt;/p&gt;

&lt;p&gt;It is very important to defragment the calendars.  If we have fragmented calendars we do not foster longer streaks of deep work, but mainly just jump between shallow work tasks. &lt;/p&gt;

&lt;h3&gt;
  
  
  Support the physical workspace
&lt;/h3&gt;

&lt;p&gt;I have seen a lot of different versions of the open office, but haven't yet seen a perfect setup. &lt;/p&gt;

&lt;p&gt;That might be because what we want is contradictory.  &lt;/p&gt;

&lt;p&gt;On one side we want a calm, quiet, and slow office, where people are doing deep work, and on the other side we want the office to be a space buzzing with collective idea-sharing, dialogue, and collaboration.   &lt;/p&gt;

&lt;p&gt;After some time spent observing, I decided to change the office setup.  I divided it into 3.   &lt;/p&gt;

&lt;p&gt;The first part is where I sit with the other managers.  It is the entrance to the office and also works as the socializing and collaboration area.  We have sofas, a fridge, and high tables where you can sit and talk or work. &lt;/p&gt;

&lt;p&gt;The next room is where the project managers are sitting.  Their job requires a bit shallower work and meetings.  They often do meetings at the desk.  This disturbed everyone in the past.   &lt;/p&gt;

&lt;p&gt;In the end, we have the room where the developers are sitting.  This is a quiet room, with a few free desks, so others can come and work from there. &lt;/p&gt;

&lt;p&gt;In this room we do not talk on the phone, do meetings at the desk, and so on.  We do talk, but we often move out of the room if it is not just quick questions.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vUZmM6hB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmuypk7u06vmwot2jlng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vUZmM6hB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmuypk7u06vmwot2jlng.png" alt="Rough sketch of the office setup" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone is free to move between the rooms, depending on what they want or what they are currently doing.  Everyone's also got their own spot, but there is always a free desk in each room that can be used by anyone. &lt;/p&gt;

&lt;p&gt;I do not believe in completely free seating.  We are habitual people, so usually people will just always sit at the same desk, or at least prefer to.   &lt;/p&gt;

&lt;h3&gt;
  
  
  Implement effective communication strategies
&lt;/h3&gt;

&lt;p&gt;Another key component in fostering and applying deep work at the office is communication.  How it is done, when, why, and on the prerequisites. &lt;/p&gt;

&lt;p&gt;A shared mindset and understanding can make this way more efficient and, in the end, provide the option for longer streaks of uninterrupted deep work time.   &lt;/p&gt;

&lt;p&gt;From my perspective, asynchronous communication is one of the most important tools when it comes to deep work.   &lt;/p&gt;

&lt;p&gt;The interesting thing about the always-on concept of constant availability is the hidden paradox.  You have the option to constantly communicate, but you also have the option to do it asynchronously.  Unless it is a real-time verbal conversation, you have all the options in the world to consume or respond to whatever communication is going your way, when it suits you.  &lt;/p&gt;

&lt;p&gt;The option to do it asynchronously is maybe one of the greatest strengths of digitalization.   &lt;/p&gt;

&lt;p&gt;In a healthy culture, there is a shared understanding that not everyone has to or can be available to everyone all the time.   &lt;/p&gt;

&lt;p&gt;It is simply too much to ask, completely unreasonable.   &lt;/p&gt;

&lt;p&gt;As a manager I can't stress enough that we don't &lt;strong&gt;HAVE&lt;/strong&gt; to always answer instantly.   &lt;/p&gt;

&lt;p&gt;And the constant communication is bad for you. &lt;/p&gt;

&lt;p&gt;Take advantage of that you can be displaced by time and place and still communicate effectively.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xVwnWLqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/778t4dym6lj998qz4g11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xVwnWLqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/778t4dym6lj998qz4g11.png" alt="focus illustration" width="760" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This applies even more when people are working remotely. &lt;/p&gt;

&lt;p&gt;In an unhealthy culture, they would feel the pressure or need to constantly answer quickly, just to justify that he is actually working. &lt;/p&gt;

&lt;p&gt;I have seen several examples where the lack of trust makes it extremely stressful to work remotely, so stressful that the benefits disappear completely.   &lt;/p&gt;

&lt;p&gt;We should take full advantage of the opportunities that written or asynchronous communication provides.  The flexibility is truly unique in so many ways that it should be its own blog post.    &lt;/p&gt;

&lt;p&gt;By communicating asynchronously, you are actually provided with the time and option to sit down and put some real thoughts into your response and produce a high-quality, well-thought-out piece of communication that your colleague can actually use! &lt;/p&gt;

&lt;h2&gt;
  
  
  Developing a Shared Vocabulary and understanding
&lt;/h2&gt;

&lt;p&gt;The first thing I did when introducing Deep Work and my ideas was to gather everyone from the team and presented my findings, thoughts, and ideas in an open forum.   &lt;/p&gt;

&lt;p&gt;With everyone in the room, everyone got the same information and thereby hopefully a somewhat shared understanding of deep work and its benefits.   &lt;/p&gt;

&lt;p&gt;In the presentation, I made sure to glorify Deep Work, so it is a state we all achieve to reach during our work day.   &lt;/p&gt;

&lt;p&gt;This had a double effect. &lt;/p&gt;

&lt;p&gt;On one hand, it makes the team members try to reach it. &lt;/p&gt;

&lt;p&gt;On the other hand, it makes them respect when others are doing deep work. &lt;/p&gt;

&lt;p&gt;Creating a shared vocabulary and understanding makes it a lot easier to implement and use in our everyday life.   &lt;/p&gt;

&lt;p&gt;The little notification, flag, or indication that someone is doing deep work is respected, encouraged, and something that we strive for.  &lt;/p&gt;

&lt;p&gt;And suddenly dismissing activities due to deep work is actually well-regarded!   &lt;/p&gt;

&lt;h3&gt;
  
  
  Educate the team on deep work and flow state concepts
&lt;/h3&gt;

&lt;p&gt;By collectively implementing a change that fosters deep work, I've noticed that it makes it easier to talk about concentration and the work environment.  We made it a lot easier for everyone on the team to use this mutual understanding to both utilize asynchronous communication, but also to protect one's own time.   &lt;/p&gt;

&lt;p&gt;Not making it 100% distraction-free, but at least understanding the cognitive cost of going in and out of deep work sessions.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i6wWjzYZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf9cxz4yjejlaipal88f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i6wWjzYZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf9cxz4yjejlaipal88f.png" alt="habits" width="754" height="756"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This deeper understanding can also help each individual team member to plan his day and by understanding these concepts, make sure to get the full benefit of the deep work sessions, without having to worry if it is acceptable or if he misses out on something. &lt;/p&gt;

&lt;h3&gt;
  
  
  Discuss the benefits of deep work for individual and team success
&lt;/h3&gt;

&lt;p&gt;Changes like this cannot be implemented by force. It needs to come from within the team.   &lt;/p&gt;

&lt;p&gt;I try to inspire, encourage and make sure that the environment is set up for deep work.  But as a team, we have to implement our own rules or versions of them, which will be altered over time. &lt;/p&gt;

&lt;p&gt;One of the things I've actively done to foster this cultural change was to lead by example. I interrupt when I've noticed unbefitting behavior and made sure to always move away from those who are doing deep work when I talk.  For instance, to the zone for conversations and collaboration.  &lt;/p&gt;

&lt;p&gt;And of course, made it clear when I was doing deep work myself.     &lt;/p&gt;

&lt;h2&gt;
  
  
  Nurturing Growth and Skill Development
&lt;/h2&gt;

&lt;p&gt;The last section is about one of the great side effects of deep work.  When we are in the zone, we are both producing high quality, but this is also where we develop our skills really fast. &lt;/p&gt;

&lt;p&gt;Improving our skills and solving hard problems is a strong motivational force for most people. &lt;/p&gt;

&lt;p&gt;To become good at something, you need to practice.  Deep Work makes this practice time both immersive, but also very efficient.  &lt;/p&gt;

&lt;p&gt;Some believe that skill is something you gain from spending a certain time practicing it, which is partly true.   &lt;/p&gt;

&lt;p&gt;That equation looks something like this: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;High-Quality Work Produced = Time Spend&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But as Cal Newport argues, we are missing one factor: intensity and focus. &lt;/p&gt;

&lt;p&gt;So, the equation is actually more like this: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;High-Quality Work Produced = Time Spend * intensity and Focus!&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous improvement and celebrating achievements
&lt;/h3&gt;

&lt;p&gt;We merely have to touch the surface of basic motivational theory to understand that progress is a huge factor that drives motivation.  The satisfaction of progress provides meaningfulness in the work and makes you move forward both with your tasks and your skill.  &lt;/p&gt;

&lt;p&gt;There is a reason that every computer game is very good at visualizing progress. Making your progress visible and your next steps clear gives you the feeling of moving forward or progressing.   &lt;/p&gt;

&lt;p&gt;Staying with the computer game metaphor, we should stop and celebrate achievements, like we level up! &lt;/p&gt;

&lt;p&gt;Sometimes we forget to do this.  Reflecting on the journey and achievements by looking back does add extra fuel to the motivation. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0x5Iykpn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70gjs6kvbmi40atcp2pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0x5Iykpn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70gjs6kvbmi40atcp2pw.png" alt="sucess" width="770" height="838"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is important for a manager to facilitate these concepts, by setting clear goals, and actively celebrating success and achievements. &lt;/p&gt;

&lt;p&gt;Embrace the continuous improvement and learning journey.  Cognitive fitness is something that is trained and maintained.  &lt;/p&gt;

&lt;p&gt;The brain is a muscle you can actually train it and become better. &lt;/p&gt;

&lt;p&gt;This is so extremely important to knowledge workers, to stay on top of the game, but also enjoy both being there and getting there. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We have reached the end.  This article became way longer than planned, so it actually serves as a perfect example of deep work by itself.  Not only writing it but also reading it requires a good deep work session! &lt;/p&gt;

&lt;p&gt;Congratulations if you made it this far, then you must have been in the zone. :) &lt;/p&gt;

&lt;p&gt;My advice is to prioritize deep work in the workplace.  Encourage open discussions about concentration and foster a culture that values deep work and respects individual focus time. &lt;/p&gt;

&lt;p&gt;By doing so, we can unlock this superpower of deep work, and maximize productivity, skill development, and the overall well-being of the team. &lt;/p&gt;

&lt;p&gt;It will stay as one of my areas of focus in my never-ending quest of raising developer happiness at work, enforcing growth, and getting professional fulfillment through work.   &lt;/p&gt;

&lt;p&gt;Since implementing this, an increase in productivity and skill was very noticeable, and believe it or not, the number of people at the office increased too!   &lt;/p&gt;

&lt;p&gt;So, we are already benefitting from it and the team managed to turn itself into a well-oiled machine, with increased general well-being, efficiency in communication, joy, skill development, achievements, and collaboration, all while the stress level decreases. &lt;/p&gt;

&lt;p&gt;The first step is to turn off notifications. &lt;/p&gt;

&lt;p&gt;The notifications will be there after your deep work session, I promise!  Take control and actively select when you want to check social media, mail, or whatever time-consuming shallow work activity you see yourself wasting hours on every day. &lt;/p&gt;

</description>
      <category>deepwork</category>
      <category>productivity</category>
      <category>managers</category>
      <category>work</category>
    </item>
    <item>
      <title>Collecting personal data while being GDPR compliant</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Mon, 22 May 2023 22:41:25 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/collecting-personal-data-while-being-gdpr-compliant-f45</link>
      <guid>https://dev.to/charlibregnballe/collecting-personal-data-while-being-gdpr-compliant-f45</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The General Data Protection Regulation (GDPR) is a framework for data protection and privacy for individuals within the European Union (EU). It applies to the processing of the personal data of individuals in the EU, regardless of whether the processing takes place within the EU or not. The GDPR replaces the 1995 EU Data Protection Directive and has been in effect since May 25, 2018.&lt;/p&gt;

&lt;p&gt;The GDPR sets out specific rights for individuals with regard to their personal data and imposes stringent requirements on businesses and organizations that collect, process, and store personal data. It also applies to organizations outside the EU that offer goods or services to individuals in the EU, or that monitor the behavior of individuals within the EU.&lt;/p&gt;

&lt;p&gt;The main goals of the GDPR are to give individuals greater control over their personal data and to harmonize data protection regulations across the EU. It applies to a wide range of personal data, including names, addresses, and financial information, as well as sensitive data such as racial or ethnic origin, health data, and data related to criminal offenses.&lt;/p&gt;

&lt;p&gt;One thing that may not be widely known about GDPR is that it applies not only to companies based in the EU but also to companies based outside of the EU if they process the personal data of EU individuals. This means that even if a company is based in the United States, for example, it must still comply with GDPR if it collects and processes the personal data of individuals in the EU.&lt;/p&gt;

&lt;p&gt;Finally, GDPR includes provisions on data protection by design and by default, which requires companies to consider data protection at every stage of their operations and to implement appropriate measures to ensure the protection of personal data. This can include designing products and services with data protection in mind and setting default settings in a way that minimizes the collection and processing of personal data.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is personal data in GDPR
&lt;/h2&gt;

&lt;p&gt;Under the General Data Protection Regulation (GDPR), personal data is defined as any information relating to an identified or identifiable natural person. This includes information that can be used to directly or indirectly identify an individual, such as their name, address, and phone number. Personal data also includes any information that can be linked to an individual, such as their IP address, cookie data, and location data.&lt;/p&gt;

&lt;p&gt;The GDPR applies to a wide range of personal data, including both personal and sensitive personal data. Sensitive personal data is a special category of personal data that requires additional protection under the GDPR. It includes information about an individual's racial or ethnic origin, political opinions, religious or philosophical beliefs, trade union membership, health data, and data related to criminal offenses.&lt;/p&gt;

&lt;p&gt;The GDPR applies to the processing of personal data by businesses and organizations that are based in the European Union (EU) or that offer goods or services to individuals in the EU, or that monitor the behavior of individuals within the EU. It also applies to the processing of personal data by businesses and organizations outside the EU if the personal data is related to the offering of goods or services to individuals in the EU or the monitoring of their behavior within the EU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the users' rights under GDPR
&lt;/h2&gt;

&lt;p&gt;Under the GDPR, individuals have the right to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be informed about the collection and use of their personal data&lt;/li&gt;
&lt;li&gt;Access their personal data and request copies&lt;/li&gt;
&lt;li&gt;Have their personal data corrected or erased&lt;/li&gt;
&lt;li&gt;Object to the processing of their personal data&lt;/li&gt;
&lt;li&gt;Restrict the processing of their personal data&lt;/li&gt;
&lt;li&gt;Have their personal data transferred to another organization (also known as the right to data portability)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Businesses and organizations that collect, process, and store personal data are required to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obtain explicit consent from individuals for the collection and processing of their personal data&lt;/li&gt;
&lt;li&gt;Provide clear and concise information about how personal data will be used&lt;/li&gt;
&lt;li&gt;Implement appropriate technical and organizational measures to protect personal data from unauthorized access, use, or disclosure&lt;/li&gt;
&lt;li&gt;Notify individuals and authorities of data breaches within 72 hours of becoming aware of the breach&lt;/li&gt;
&lt;li&gt;Appoint a data protection officer (DPO) if they carry out large-scale processing of sensitive personal data or process personal data on a large scale&lt;/li&gt;
&lt;li&gt;Violations of the GDPR can result in fines of up to 4% of a company's annual global revenue or €20 million (whichever is greater).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conditions for collecting personal data
&lt;/h2&gt;

&lt;p&gt;Under the General Data Protection Regulation (GDPR), there are specific conditions that businesses and organizations must meet in order to collect personal data from individuals.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Legal basis: The GDPR requires businesses and organizations to have a legal basis for collecting personal data. There are several legal bases that businesses and organizations can rely on, including consent, legitimate interest, and the performance of a contract. It is important to determine the appropriate legal basis for collecting personal data in a given context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consent: If the legal basis for collecting personal data is consent, businesses and organizations must obtain explicit, freely given, specific, informed, and unambiguous consent from individuals. This means that individuals must be provided with clear and concise information about how their personal data will be used and must have the ability to withdraw their consent at any time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Necessity: Personal data must be collected for a specific, explicit, and legitimate purpose, and must not be collected in a way that is unnecessarily intrusive or excessive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transparency: Businesses and organizations must provide individuals with clear and concise information about how their personal data will be collected, used, and shared. This includes information about the legal basis for the collection and processing of personal data, the purposes for which the personal data will be used, and the rights of individuals with regard to their personal data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data minimization: Businesses and organizations must only collect the minimum amount of personal data necessary to achieve the specific purpose for which it is being collected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data accuracy: Businesses and organizations must take reasonable steps to ensure that personal data is accurate and up-to-date.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data storage: Personal data must be stored in a secure manner, using appropriate technical and organizational measures to protect against unauthorized access, use, or disclosure.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;These are just a few of the things to keep in mind when dealing with GDPR compliance.&lt;br&gt;
You do come a long way with a combination of common sense and privacy by design.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obtain explicit consent from users before collecting their data&lt;/li&gt;
&lt;li&gt;Provide clear and concise information about how their data will be used&lt;/li&gt;
&lt;li&gt;Allow users to access, correct, or delete their data&lt;/li&gt;
&lt;li&gt;Securely store and protect user data&lt;/li&gt;
&lt;li&gt;Only collect the minimum amount of data necessary&lt;/li&gt;
&lt;li&gt;Regularly review, update, and delete unnecessary data&lt;/li&gt;
&lt;li&gt;Use privacy by design and default &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gdpr</category>
      <category>webanalytics</category>
      <category>gdprcompliance</category>
      <category>datacollection</category>
    </item>
    <item>
      <title>We should start looking for google analytics alternatives</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Fri, 22 Apr 2022 07:44:37 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/we-should-start-looking-for-google-analytics-alternatives-1dhn</link>
      <guid>https://dev.to/charlibregnballe/we-should-start-looking-for-google-analytics-alternatives-1dhn</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;In this blog post, I will discuss why I believe we need to start looking for google analytics alternatives.&lt;br&gt;&lt;br&gt;
It is increasingly relevant both in terms of changes in technology, laws like GDPR, and the ePrivacy Directive.&lt;br&gt;
With the Schrems II case and the attention, it has gotten it clear to me that we need to look elsewhere for web analytics.&lt;br&gt;&lt;br&gt;
If you live in a country that is bound by GDPR Google Analytics &lt;strong&gt;MAY&lt;/strong&gt; be illegal due to transmitting personal data outside of the EU. &lt;br&gt;
Furthermore, reflect on if we the website owners are getting enough out of their web analytics data or if the alternatives could provide an increased value and benefits by taking more control and ownership of the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Briefly about google analytics and cookie-based tracking
&lt;/h2&gt;

&lt;p&gt;The most important takeaway from this post:  In 2022 and beyond I strongly believe that it is key to own the data yourself.  Not being married to a system or a service, but having full control of what you collect, where you store it, who has access to it, and what you do with it.  This is relevant both in terms of being GDPR compliant and getting the most out of your data in a responsible way.&lt;br&gt;
The goal is to get rid of the data-handling middleman and reach a higher level of transparency and control.&lt;/p&gt;

&lt;p&gt;Google analytics has been the go-to method for tracking traffic on websites for years.  Google analytics has been implemented on ~28 million websites and 87% of the most popular 10.000 are using it.  (source: &lt;br&gt;
&lt;a href="https://trends.builtwith.com/analytics/Google-Analytics"&gt;https://trends.builtwith.com/analytics/Google-Analytics&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Those numbers are crazy.  But if you look at the product, it makes sense.  It's very easy to implement, it's free, and just works.  It might not be 100% accurate, but it has been good enough for a lot of website owners for decades.  You do get a lot of insights completely free of charge and without any effort.&lt;/p&gt;

&lt;p&gt;The big question is;  Is it still good enough? - I don't think so.&lt;/p&gt;

&lt;p&gt;It is no longer good enough, and that is for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you get something for free, you should ask yourself; "What's the catch?"&lt;/li&gt;
&lt;li&gt;With the new cookie law, you need consent from the users before you can track them with cookies.  (Google analytics is cookie-based tracking)&lt;/li&gt;
&lt;li&gt;Even though google analytics is a 1st party tracking cookie, some would argue that it is a marketing cookie.&lt;/li&gt;
&lt;li&gt;Personal data is potentially transferred to "insecure" third countries.&lt;/li&gt;
&lt;li&gt;Adblockers can block the tracking.&lt;/li&gt;
&lt;li&gt;You might lack control over the data, what's collected, where it's stored, who it's distributed to, and so on if you don't own the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get the most out of your data, you need to have more control.  You need to be able to select which data points you collect, where you store them, and how to access them.&lt;br&gt;
It is important to be able to pull the data out of the analytics tool and utilize it elsewhere in the business.  Being able to do that, will open up a wide range of possibilities, where you can combine data from different sources and channels.&lt;/p&gt;

&lt;p&gt;So the 2 big problems with Google Analytics:&lt;br&gt;
1) GDPR compliance&lt;br&gt;
2) Data quality and control&lt;/p&gt;

&lt;h3&gt;
  
  
  New Cookie law (or ePrivacy Directive)
&lt;/h3&gt;

&lt;p&gt;With the rollout of GDPR, a new cookie law or ePrivacy directive followed.  It made the marketing life harder because it is no longer possible to follow the user around on the internet like it was before.&lt;/p&gt;

&lt;p&gt;The rule of thumb for cookie consent is; If your website uses cookies, which are not strictly necessary for online communication, but serve another purpose like gathering statistics, you are obligated to inform your users about the cookies and collect their cookie consent.&lt;br&gt;
It is required to collect consent from the user before setting cookies in the user's browser.&lt;br&gt;
That's why you see the popup boxes with different options to select which cookies you allow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O5oiNmYs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8x4w11sg8ue2l0x3xeln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O5oiNmYs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8x4w11sg8ue2l0x3xeln.png" alt="Cookie consent popup" width="580" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So suddenly the users have a choice.  Before this change websites usually had a popup saying it was using cookies and your only option would be to click "ok".&lt;br&gt;&lt;br&gt;
The rules have been there for a long time, but it's only until recently that they started to enforce the rules.&lt;br&gt;
The Google Analytics cookie is a statistic cookie, so some users would say ok, but it's not a necessary cookie.&lt;br&gt;
The thing is that a lot of users will block it, so the number of trackable users for Google Analytics will drop significantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  GDPR
&lt;/h3&gt;

&lt;p&gt;Another issue that is not directly related to cookie-based tracking, but is still relevant, is the rules of General Data Protecting Regulations (GDPR).&lt;br&gt;
For Google Analytics, there's an option to track users anonymously.  It helps, but the website owner still depends on a 3rd party system.&lt;br&gt;
To reach GDPR compliance you need to be able to give the users the right to be informed, they need the right of access, the right to rectification, and insurance.&lt;br&gt;&lt;br&gt;
This means that you need to be able to send and/or delete the data you store.&lt;br&gt;
So before you depend on a 3rd party system, you need to make sure that these features are supported.&lt;/p&gt;

&lt;p&gt;With 3rd party tracking systems, like Google Analytics, you do not know for sure what is being tracked and you cannot retrieve it or delete it for singular users.&lt;br&gt;
Remember an IP address is person attributable data.&lt;/p&gt;

&lt;p&gt;If you choose Google Analytics and set it up to only track users anonymously, then you might be GDPR compliant, but you can't know for sure.&lt;/p&gt;

&lt;p&gt;That is due to another small twist;  Data that do not seem like personal attributable data can turn out to be personal data if mixed with other data.  An example could be if you collect unique IDs on users, but without any reference to their email, IP, or whatever.  You might collect this to distingue between unique visitors and returning visitors.&lt;br&gt;
If this data is mixed with other data, where you can match the ID to an email, then this unique ID will in fact become persona attributable data.&lt;/p&gt;

&lt;h2&gt;
  
  
  What options do we have?
&lt;/h2&gt;

&lt;p&gt;All the above points us in the direction that we need to look for alternatives.  Google Analytics is no longer a viable option.&lt;/p&gt;

&lt;p&gt;There are a few technical alternatives we should look into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracking on the server-side &lt;/li&gt;
&lt;li&gt;Manual tracking&lt;/li&gt;
&lt;li&gt;GDPR compliant cookie-based tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One option I see is to move the collection of pageviews from the client-side to the server-side.&lt;br&gt;
The traditional tracking is collected through the user's browsers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QVUmvyo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j135rutbf0h2ka4ooz4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QVUmvyo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j135rutbf0h2ka4ooz4z.png" alt="An illustration of cookie-based tracking" width="600" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While with server-side tracking you do not depend on the client's browser but can track requests on your webserver.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--abyt8rsT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7aewumvd59d05qnm9oc3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--abyt8rsT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7aewumvd59d05qnm9oc3.png" alt="An illustration of server-side tracking" width="600" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you track on the server side you will get a more accurate dataset, compared to the cookies.  Simply because you do not rely on the user's settings in the browser, adblockers, cookie consent, and so on.&lt;br&gt;&lt;br&gt;
One issue with the server-side tracking is that you do not have the same data points available as you do on the clientside.&lt;br&gt;
So your data might be accurate but not as detailed.&lt;/p&gt;

&lt;p&gt;When a client hits the web server, the request log on the webserver will contain information about the client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP&lt;/li&gt;
&lt;li&gt;UserAgent&lt;/li&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;li&gt;URL / path&lt;/li&gt;
&lt;li&gt;Ref&lt;/li&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above is actually enough to track page views with different sub-values like device and location.  So a very basic tracking is available by using server-side tracking alone.&lt;br&gt;
With the basic serverside tracking it is hard to distinguish between unique visitors and returning visitors.&lt;br&gt;
A solution could be to generate a unique ID based on the data above and use this ID to determine if it's a new or returning visitor.&lt;/p&gt;

&lt;p&gt;Using cookies to track events in the frontend, gives us a few more options for what to track.  We can create events that will track certain behavior.&lt;br&gt;&lt;br&gt;
It is also possible to do with manual tracking, where you fire an API call with the relevant data from the frontend on an event.  (That could be pressing a button, watching a video, etc)&lt;br&gt;
We do have to be aware of the performance hit our site potentially can take by implementing this.&lt;/p&gt;

&lt;p&gt;So a combination of 1st part cookies or manual tracking and server-side tracking could be the way to go.&lt;br&gt;
You can store the data at the same place, and control what is being collected, and how and where it is stored.&lt;/p&gt;

&lt;p&gt;An example of the combination could be on a webshop where a user login or places an order, then with a cookie in the browser or some manual tracking, we would be able to see the pages that a particular user has browsed.&lt;br&gt;
This could also be achieved by paring analytics data with data from the CRM.&lt;br&gt;
But it does require that we attach some kind of unique ID to each pageview that will determine if it's a new or returning user.&lt;/p&gt;

&lt;p&gt;One thing that is very important though;  Every time to collect a piece of data to store you need to ask yourself the following questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this personal data?&lt;/li&gt;
&lt;li&gt;If I mix the data with other data, is the person identifiable then?&lt;/li&gt;
&lt;li&gt;If it is and it's ok, then ask yourself, why do I store this?  Do I have a legit reason to do so?  And where do I store it?  Can I retrieve it easily?&lt;/li&gt;
&lt;li&gt;What kind of consent did your user give?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So how do we implement server-side tracking?  And combine it with 1st part of cookie tracking?&lt;/p&gt;

&lt;h2&gt;
  
  
  A closer look at server-side tracking and alternatives
&lt;/h2&gt;

&lt;p&gt;There are quite a few ways to achieve this.  I do not have experience with all of them, but I did try out a few different ones.&lt;/p&gt;

&lt;p&gt;I will briefly go through the ones I 'v tried, but this is by no means an exhaustive list, but a few cheap or open-source tools I've stumbled across. &lt;/p&gt;

&lt;p&gt;One thing to keep in mind when looking into tools like this is if there is an option to do self-hosting and if they are GDPR compliant. &lt;/p&gt;

&lt;h3&gt;
  
  
  Snowplow analytics, google big query, and data studio
&lt;/h3&gt;

&lt;p&gt;I added &lt;a href="https://snowplowanalytics.com/"&gt;Snowplow Analytics&lt;/a&gt; to a site with a lot of traffic.  It was a very basic implementation, where data is collected with Snowplow, stored in google big query, and visualized in google data studio.&lt;br&gt;
The data is collected from the caching/web server combined with a client-side tracker.&lt;/p&gt;

&lt;p&gt;It is pretty manual.  You do get some stuff out-of-the-box, but it is very flexible and you can choose to store it wherever you like.  They also have a cloud service where you can store it.&lt;br&gt;
The options for what to store and how to build your data models seem endless.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing:
&lt;/h4&gt;

&lt;p&gt;Snowplow is open source and free.  You do have to pay for storage no matter if you select their cloud solution or store it elsewhere.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Initial implementation went pretty smooth&lt;/li&gt;
&lt;li&gt;Very customizable &lt;/li&gt;
&lt;li&gt;You can use whatever visualization tool you want since you have the raw data in the big query database.&lt;/li&gt;
&lt;li&gt;Can combine client-side and server-side tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Storing the data can be a bit expensive if you have a lot of traffic (and store a lot of data)&lt;/li&gt;
&lt;li&gt;Visualising the data in google data studio seems to work fine, but with limited options.&lt;/li&gt;
&lt;li&gt;The great flexibility has a cost in manual work and implementation complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Matomo
&lt;/h3&gt;

&lt;p&gt;I tested Matomo on another site with a fair amount of traffic.&lt;br&gt;&lt;br&gt;
Unfortunately, I didn't have the chance to help or do the implementation, but it didn't take a long time to add to the site.&lt;br&gt;
Matomo can also combine server-side tracking with client-side tracking through a javascript tracker.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing:
&lt;/h4&gt;

&lt;p&gt;It is free if you host it yourself.  There is a cloud hosting option at Matomo for those who would like that.&lt;br&gt;
And they have added extra things you can purchase, like Activity Log, WooCommerce Analytics, Search Engine Keywords Performance, Funnels, Users Flow, Whitelabel, Heatmap &amp;amp; Session Recording, and so on.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Seems very feature-rich&lt;/li&gt;
&lt;li&gt;Free to use&lt;/li&gt;
&lt;li&gt;Initial implementation seemed easy&lt;/li&gt;
&lt;li&gt;Great initial dashboard/visualization&lt;/li&gt;
&lt;li&gt;Combines client-side and server-side tracking&lt;/li&gt;
&lt;li&gt;You can access the raw data through their live reporting API&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I can't seem to figure out if it's as flexible as Snowplow&lt;/li&gt;
&lt;li&gt;Building a detailed and useful tracking setup takes time&lt;/li&gt;
&lt;li&gt;Does require a lot of manual work to get the utilize it fully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Manual tracking in rails with ahoy and blazer
&lt;/h3&gt;

&lt;p&gt;I did a server-side tracking test in a Ruby on Rails app, where I implemented a tracking gem called &lt;a href="https://github.com/ankane/ahoy"&gt;ahoy&lt;/a&gt; and &lt;a href="https://github.com/ankane/blazer"&gt;blazer&lt;/a&gt; for visualization.&lt;br&gt;
It is very easy to set up, but a bit hard to use.&lt;br&gt;
Blazer can do a very basic visualization of the data if you know your SQL queries.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing:
&lt;/h4&gt;

&lt;p&gt;It is free and open-source.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;li&gt;Easy to setup&lt;/li&gt;
&lt;li&gt;Very flexible&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Very manual&lt;/li&gt;
&lt;li&gt;Not a lot of extra features/options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Besides the ones above, I've briefly looked into a few others, which I, unfortunately, haven't had the time to try out on real websites with traffic.&lt;/p&gt;

&lt;h4&gt;
  
  
  Woopra
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.woopra.com/"&gt;woopra&lt;/a&gt; is interesting too.  They combine client and server-side tracking if you implement their SDK.&lt;br&gt;&lt;br&gt;
I did notice that their tracking cookie gets caught by adblocker though.&lt;br&gt;
It has a very nice interface and visualization is pretty customizable. &lt;br&gt;
They do also have a lot of integration options for different apps, like Facebook, ActiveCampaign, BigQuery, MailChimp, Salesforce, Slack, and so on.&lt;/p&gt;

&lt;p&gt;It seems like you can get the data out of Woopra, but it is unclear where it is stored by default.&lt;br&gt;
Before choosing Woopra, I would make sure I have full control of the data.  I would check if I can access the raw data and if I can choose to store it in my database or at a cloud service where I am the only one who has access.&lt;/p&gt;

&lt;h4&gt;
  
  
  FairAnalytics
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://www.fairanalytics.de/"&gt;fair Analytics &lt;/a&gt; is a very lightweight tracking tool with a heavy focus on privacy and GDPR.&lt;br&gt;
It's very easy to implement and is very similar to a lightweight version of google analytics.&lt;br&gt;
And it is not using cookies!&lt;/p&gt;

&lt;p&gt;They do store the data for you, so you have to be aware.  But the servers are hosted in Germany, on green electricity, and certified according to ISO 27001.&lt;/p&gt;

&lt;p&gt;This would be a good choice for websites that needs a GDPR and privacy by default alternative to google analytics, which is easy to implement.&lt;/p&gt;

&lt;p&gt;This is a very lightweight solution.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cloudflare Analytics
&lt;/h4&gt;

&lt;p&gt;I am biased in terms of this one because I simply love Cloudflare.  It's just an awesome product!&lt;br&gt;
Their analytics tool &lt;a href="https://dash.cloudflare.com/sign-up/web-analytics"&gt;cloudflare web analytics&lt;/a&gt; is a privacy-first service that is very easy to set up even if you are not using Cloudflare already.&lt;br&gt;
Their tracker did get caught by my adblocker though, but it is not setting a cookie in the browser.&lt;br&gt;
Cloudflare is measuring traffic on your website at the edge, so it is supposed to be very accurate.&lt;/p&gt;

&lt;p&gt;I did not see an option to access the raw data or choose where to store it.&lt;br&gt;
It is privacy first, but your options are limited.&lt;/p&gt;

&lt;h4&gt;
  
  
  Honorable mentions
&lt;/h4&gt;

&lt;p&gt;An even shorter list of tools that I want to try out.&lt;/p&gt;

&lt;p&gt;Plausible : &lt;a href="https://plausible.io/"&gt;https://plausible.io/ &lt;/a&gt; - I heard about them in the, &lt;a href="https://flagsmith.com/podcast/"&gt;the craft of open source podcast&lt;/a&gt; epsiode #2.&lt;br&gt;
As a privacy-first google analytics alternative, this seems like a very good option.&lt;br&gt;
Netlify analytics for my jam stack sites: &lt;a href="https://www.netlify.com/products/analytics/"&gt;https://www.netlify.com/products/analytics/&lt;/a&gt; - I love Netlify, it's awesome.  So far I 'v only used it for small hobby project sites, but I want to take a deeper dive where I investigate their analytics too.&lt;br&gt;
Poeticmetric : &lt;a href="https://www.poeticmetric.com/"&gt;https://www.poeticmetric.com/&lt;/a&gt; a privacy-first, no cookie, and no personal data tracking tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to choose
&lt;/h2&gt;

&lt;p&gt;The answer is of course;  It depends ...&lt;br&gt;
The list above only touches the surface of a few of the options out there.  It is a field in progress with new tools popping up every day.&lt;/p&gt;

&lt;p&gt;The fairAnalytics solution is an easy-to-implement lightweight solution for those who are just interested in the very basic data.  You can see page views, devices, and so on.  There are not a lot of integration options, but the basic features are enough to cover the most basic needs.&lt;/p&gt;

&lt;p&gt;Matomo and Snowplow fall into the category of more heavy alternatives.  I would advise you to look into it, but only implement this if you have a plan and a data strategy that supports the extra complexity this adds.&lt;br&gt;
It is possible to do a lightweight implementation of the two though, where you just utilize the features that work out of the box.&lt;/p&gt;

&lt;p&gt;Manual tracking does also fit some use cases.  If you are using one of the bigger CMS for your site, they might provide data collection as a module or extension.  It is also a viable option in some use cases.&lt;/p&gt;

&lt;p&gt;Plausible.io seems to be the one that fits in between categories as a flexible lightweight solution.  It is open-source, so you are free to inspect the code.  You can self-host the solution, so you do have the option of complete ownership of the data. &lt;br&gt;
It does also seem very flexible and is getting a lot of attention.   &lt;/p&gt;

&lt;p&gt;No matter what, I would advise everyone to do some research in terms of needs and afterward look at the options, before selecting a tool for tracking.&lt;br&gt;
It is important to have some clear goals defined before selecting your analytics tool.&lt;br&gt;
Make sure you understand the needs and do not overengineer.&lt;br&gt;&lt;br&gt;
It can be very costly and very complex, epically without a clear strategy, plan, a strong team, and so on.  Like any other project, really.&lt;br&gt;
So some of the questions you could ask yourself are:&lt;br&gt;
Do we need in-depth tracking with a lot of custom options?  And connections to different marketing channels?&lt;br&gt;
Or do we just need to track pageviews on the website?&lt;br&gt;
Do we have data elsewhere, where it would create value to combine the data?  Like a CRM or something else.&lt;/p&gt;

&lt;p&gt;It might not matter that much which tool you choose, as long as it gets the job done in a responsible manner.&lt;br&gt;
Again;  It is very important to have control of what is being collected and own the data yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion and next steps
&lt;/h2&gt;

&lt;p&gt;I have done some brief research on a range of different analytics and tracking tools.  Getting my hands dirty is always the first step when I try out new tools.&lt;br&gt;
So next step is gathering even more (and even more relevant) data.  The goal of the next steps is to reach a point where the data can be visualized and usable in other areas of the business.&lt;/p&gt;

&lt;p&gt;But how do we get the data to be usable in the business?  Besides the visualization, then there is a need for integrations with other systems.&lt;br&gt;
Lately, I've seen CDP (Customer Data Platforms) popping up and they do seem to promise to solve a lot of the problems I am facing.&lt;/p&gt;

&lt;p&gt;Collecting data from a wide range of sources (web, app, CRM, whatever) in &lt;strong&gt;ONE&lt;/strong&gt; platform, from where you can make integrations to your marketing tools, economic tools, personalization tools, and so on.&lt;br&gt;
It sounds too good to be true?&lt;/p&gt;

&lt;p&gt;I will continue my journey and explore a few different CDPs and try to do it the manual way.  It usually gives me a lot of insight and helps me innovate.&lt;/p&gt;

&lt;p&gt;So what do we expect from a CDP?&lt;br&gt;
Visualization of data from different sources, but combined.  So I would like to see a customer's orders and which URLs/products he visited.&lt;br&gt;
If he is getting the newsletter AND reading it?  Does he ever click on anything?  And if so, what kind of products?&lt;br&gt;
Also, it would be great to label users with tags and create segments.  Maybe even define your segments and then auto-add users to them based on historical data.&lt;/p&gt;

&lt;p&gt;I hope to get to a level where I can seamlessly create different segments based on all the data points I have from the different systems.&lt;br&gt;
And from there, I would like to be able to expose these users to either Facebook adverts of a certain type, a newsletter, maybe a push message, and if possible some personalization on their app/web.  Maybe even understand their pattern for purchasing and visits, so I get the most value out of both the marketing money and the time the users spend on my website.&lt;/p&gt;

&lt;p&gt;Do I have too high expectations?  I don't think so.  The data is there and we have the tools.  It is just about combining the 2... and in a responsible way of course!&lt;/p&gt;

&lt;p&gt;Times are changing and we need to adapt.  For ages, we have been used to a free web analytics tool that just works.  Now that is in the past we need to readjust and figure out how to transform the new expenditure of a web analytics tool to our advantage and a valid business case.&lt;/p&gt;

&lt;p&gt;Thank you for reading my unstructured thoughts about the next steps for tracking and the first steps for data setups.  I hope I managed to stir up some thoughts or even inspire some new ideas.&lt;/p&gt;

</description>
      <category>gdpr</category>
      <category>webanalytics</category>
      <category>googleanalytics</category>
      <category>gdprcompliance</category>
    </item>
    <item>
      <title>Agile or waterfall ?</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Wed, 22 Sep 2021 19:13:30 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/agile-or-waterfall-1c33</link>
      <guid>https://dev.to/charlibregnballe/agile-or-waterfall-1c33</guid>
      <description>&lt;h2&gt;
  
  
  Agile or waterfall?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;I truly love an agile development process.  The dynamic and flexibility enable the right specialists to make decisions during the process, instead of trying to guess everything beforehand.&lt;/p&gt;

&lt;p&gt;This blogpost was born from a talk I did in a small drupal meetup, where I was presenting Kino.dks &lt;a href="https://streamingguide.kino.dk" rel="noopener noreferrer"&gt;Streamingguide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the following blog post, I will discuss agile and waterfall development methodologies and align them with my own experience, both from a developer, but also from a product owner and project manager's point of view.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;I have had the pleasure of trying out a wide range of different development processes during my professional work life.&lt;br&gt;
First and foremost I want to point out that different models work well for different projects with different people.  I do not believe that we have a one-size-fits-em-all model.&lt;br&gt;
Apart from my own personal projects, I 'v recently "finished" a mid-size project with a truly agile development process.&lt;br&gt;
Before that, I was Product Owner on a very big project, run by the traditional waterfall methodology.&lt;/p&gt;

&lt;h3&gt;
  
  
  Waterfall
&lt;/h3&gt;

&lt;p&gt;I am sure you are already familiar with the waterfall model.  If you know everything about it, you should skip to the next section.&lt;br&gt;
I will briefly outline the most important concepts before we move on.&lt;/p&gt;

&lt;p&gt;The waterfall methodology is as the name prescribes a linear process, where you start with a well-documented project description and then flow through different steps before it's done. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fconfident-code.s3.eu-central-1.amazonaws.com%2FManual%2Bupload%2Fwaterfall-vs-agile%2FWaterfall_model.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fconfident-code.s3.eu-central-1.amazonaws.com%2FManual%2Bupload%2Fwaterfall-vs-agile%2FWaterfall_model.svg" alt="waterfall development methodology"&gt;&lt;/a&gt;&lt;br&gt;
(image is from wikipedia) &lt;/p&gt;

&lt;p&gt;The image lays out the process pretty well.  The project will usually go through the following steps before its completed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analysis; The project and especially the end goal is well defined&lt;/li&gt;
&lt;li&gt;Design; From the requirements, a design is made.  (This is often an iterative process)&lt;/li&gt;
&lt;li&gt;Development;  The developers transform the design to code&lt;/li&gt;
&lt;li&gt;Test; It is being tested and aligned with the requirements&lt;/li&gt;
&lt;li&gt;Maintenance; Updates and changes can be made from here and on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I often see the waterfall methodology used for fixed-price-project, where the goal is clear and the uncertainty is low.  Some would argue that it's not well suited for complex projects, but that is not necessarily true.  Even a complex project can easily be run like this, but it does raises the requirements and sets some high demands to the documentation and project descriptions.&lt;/p&gt;

&lt;p&gt;One important take-away from this is;  When using the waterfall model, it is important that you know "everything" from the start and has everything laid out and described.&lt;br&gt;
It is not well suited for changes in the requirements IN the process, therefor they have to be determined beforehand. &lt;/p&gt;

&lt;h3&gt;
  
  
  Agile
&lt;/h3&gt;

&lt;p&gt;The Agile methodology differs from waterfall by not being a linear process, but rather a continuous loop of iterations; define, build, release steps.&lt;br&gt;
So the process contains smaller steps, where you keep building upon the project and expanding the functionality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FH145nlf-Km32lGZXvdPd_8xAZTN3NVeTaxxC_JAh0u56HJiYmJ0EnO_FtIP9AAxE7uddEanvBWtSI5Tge3dj4H19LcFHqtxLHqP1bxcAPuXBnLMWM6NMi_sZXUA5AV_ukxUV2EoK" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FH145nlf-Km32lGZXvdPd_8xAZTN3NVeTaxxC_JAh0u56HJiYmJ0EnO_FtIP9AAxE7uddEanvBWtSI5Tge3dj4H19LcFHqtxLHqP1bxcAPuXBnLMWM6NMi_sZXUA5AV_ukxUV2EoK"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agile methodology appeared in 2001 and consists of a range of principles to follow.&lt;br&gt;
You can read the manifesto and principles behind &lt;a href="https://agilemanifesto.org/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the advantages of the agile development process is that it lets you change requirements or solutions in the process.&lt;br&gt;
You work in small sprints where you build on top of the current product.  (It could be an initial MVP)&lt;br&gt;
Often it is paired with a scrum methodology, where the team works in sprints.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to choose?
&lt;/h3&gt;

&lt;p&gt;Well, there is no silver bullet.&lt;br&gt;
It all depends on the project, the team, and the culture.&lt;br&gt;
There are a few things to consider though.&lt;br&gt;&lt;br&gt;
This is both the fun and interesting part of this blog post.&lt;/p&gt;

&lt;h3&gt;
  
  
  End product
&lt;/h3&gt;

&lt;p&gt;Let's discuss the end product first.&lt;/p&gt;

&lt;p&gt;The waterfall model is more predictable.  You will most likely get the product you initially wanted.&lt;br&gt;&lt;br&gt;
The developers will be able to plan out the entire project from start till end.  They will be able to make a lot of decisions and agreements before they start coding.  This &lt;strong&gt;might&lt;/strong&gt; lead to a better product, in terms of code quality.&lt;br&gt;
I do often see that the price is being stomped so that the pressure rises during the last period of the project and the developers are forced to rush through some parts.  This often ends up with a decrease in the quality.&lt;/p&gt;

&lt;p&gt;On the other hand, the agile model is not as predictable.  It can be, but it's often not.  Problems are solved as they arrive and decisions are made on the fly.  It's the agile methodology's strength and weakness.  It makes room for changes, which in some cases makes perfect sense, but can also lead to a different end product. &lt;/p&gt;

&lt;h3&gt;
  
  
  Work before or during the project
&lt;/h3&gt;

&lt;p&gt;The approach to a project is very different from the two methodologies.  One of the biggest differences is the work of preparation that's done before the project starts and during the project.&lt;/p&gt;

&lt;p&gt;The waterfall model requires you to have solid and detailed documentation before the developers start coding.  So an end-to-end description, which usually starts with a workshop where the requirements and limits are determined.  Then the design process starts and usually, the developers use a combination of the documentation and the design to plan and build the project.&lt;/p&gt;

&lt;p&gt;Agile is different, while you do prepare beforehand, it does consist of an incremental and iterative process.  A scope is of course required and usually also a design, but there's room for unanswered questions.&lt;br&gt;&lt;br&gt;
The way I usually tackle an agile project is that I describe the absolute minimum of requirements.  I do keep a log of descriptions of a desired feature and end result as well, but I update and edit during the process.&lt;br&gt;
So the agile process starts with an MVP and then builds on top of it, through an iterative process, where features/requirements are determined between each sprint.&lt;br&gt;
And eventually, you will run out of money or time and the project is done.&lt;/p&gt;

&lt;p&gt;This mustn't be an excuse for not being well prepared! &lt;/p&gt;

&lt;h3&gt;
  
  
  Client and stakeholders role
&lt;/h3&gt;

&lt;p&gt;The client or stakeholders' role can vary a lot as well.  Depending on the company, project, methodology, and so on.&lt;/p&gt;

&lt;p&gt;I've tried both the very traditional waterfall, where the project starts after the scope and requirements are determined and then I've gotten weekly or bi-weekly status updates.&lt;br&gt;
Usually, I follow the project on the sideline and watch the process and only participate if there is uncertainty or some things that need clarification.&lt;/p&gt;

&lt;p&gt;For most of the agile projects I've been involved in, both as a developer, product owner, and project manager, the client has been a lot closer to the process.&lt;br&gt;&lt;br&gt;
Some projects that I 'v been involved in, followed true agile processes.&lt;br&gt;&lt;br&gt;
A backlog of tasks, sprints of 1-2-3 weeks, and daily stand-ups, where challenges and progress were discussed.&lt;br&gt;
In these projects, the client was (together with the rest of the team) responsible for managing the backlog and continual testing the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Economy and challenges
&lt;/h3&gt;

&lt;p&gt;The economy around a project is always a challenge.  Either you have to figure out or agree on a price before you start, otherwise, you see how far you can get with the allocated resources.  Neither is perfect.&lt;/p&gt;

&lt;p&gt;I've often dreamt of a more agile economic setup, where the budget came in rates and if you were able to present a valid business case, the budget would dynamically increase.&lt;br&gt;
Following the agile methodology.&lt;/p&gt;

&lt;p&gt;What usually happens for projects with the waterfall methodology, is that you make some kind of fixed-price project, which leaves no flexibility for challenges, details, or quality (expensive) decisions.  You have to make ends meet, where the project is realized with the allocated resources.  By doing this a wide range of risks appear, since you ignore the fact that you might learn something in the process.  Or even worse, something that you haven't thought of came off.&lt;/p&gt;

&lt;p&gt;For agile projects, there will always be a risk that the project will run wild or go crazy.  You can end up with no usable product and no more resources.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Over the years I've come to the conclusion that I rarely am able to see and cover everything in a project.  I have never been involved in a project, where I was able to figure everything out before the project started.&lt;br&gt;&lt;br&gt;
There have always been surprises and decisions to be made, that I wouldn't have been able to do or know at the start of the project.&lt;/p&gt;

&lt;p&gt;The agile process does help me deal with this, but it leaves me with another problem; the budget/resources.  It could seem like I have no idea what I'm doing and I just go with random development and gut feeling.  I would argue that this is not the case. &lt;br&gt;
Often when I find myself in the decision-land, it tends to ignite my innovation.  This is helpful both in terms of concrete solutions, but also regarding improvements, new business ideas, or features.&lt;br&gt;
I believe that there can be great value in the process and should be considered.&lt;/p&gt;

&lt;p&gt;But how can the economy and budget department follow agile development?  Can we somehow align the two?&lt;/p&gt;

&lt;p&gt;At most jobs I 'v had early budgets or fixed project budgets.  I hope to get the chance to try a different and more agile model, where the budgets are made either monthly or quarterly.  To be more flexible and grab the opportunities when they arise, instead of waiting till next year :)&lt;/p&gt;

&lt;p&gt;So what do I prefer?  Well, it depends on both the situation, the project, and the team.  If it's a team I know and trust and the project is perfectly scoped and clearly defined, the waterfall methodology works great for me.&lt;br&gt;
If the project is less accurate or weaker defined and I need to utilize the knowledge of the team, in-depth, then I would go with the agile process.&lt;/p&gt;

&lt;p&gt;Again, no simple answer, but I see great value in both. The conclusion is that both of them are great for different scenarios.&lt;br&gt;
Experience and understanding the strengths and weaknesses of the two is the key value.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>waterfall</category>
      <category>tooling</category>
      <category>development</category>
    </item>
    <item>
      <title>Developing my first mobile app to ~70k users</title>
      <dc:creator>Charli Bregnballe</dc:creator>
      <pubDate>Sun, 12 Sep 2021 22:56:26 +0000</pubDate>
      <link>https://dev.to/charlibregnballe/developing-my-first-mobile-app-to-70k-users-3nbl</link>
      <guid>https://dev.to/charlibregnballe/developing-my-first-mobile-app-to-70k-users-3nbl</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;I've had "App development" on my things-I-want-to-learn-list for some time when suddenly I got the chance to do a deep dive and build a project in the process.&lt;/p&gt;

&lt;p&gt;This blog post is the aftermath of a 6-month long process where I taught myself react-native and developed my first app for iOS and Android.&lt;/p&gt;

&lt;p&gt;I will reflect upon the process of developing my first app without any prior experience and rolling it out to more than 70k users. &lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;Some background information might be useful before I start.&lt;/p&gt;

&lt;p&gt;In my daily job as Head of IT at Kino.dk, a cinema movie website and ticket machine, writing code is not something I do on a normal workday.  Normally I am a one-man-army, where I flex my generalist muscle in different fields like data analysis, dev obs, development, GDPR, business, and strategy.&lt;/p&gt;

&lt;p&gt;So I enjoyed writing some code and doing a deep dive into a specific area for once.&lt;/p&gt;

&lt;p&gt;Another benefit was that it was a perfect scenario for me to practice the deep-work methodology and mindset.  A methodology for strong and narrow focused sessions of uninterrupted work, that I've grown to love and enjoy.  I would like to reflect on the combination of stoicism and deep work, but that is for another blog post. &lt;/p&gt;

&lt;p&gt;This project was born during the covid-19 lockdown of Denmark (and the cinemas), where my workload was limited, but my urge to spend my time productively was strong.&lt;br&gt;
So I decided to see if I was able to create a new app for Kino.dk while the cinemas were closed.&lt;/p&gt;

&lt;p&gt;Maybe I'm a geek, some might even call me a nerd, but I enjoy diving into new tech areas.  Skilling-up as they say.&lt;br&gt;
I keep a (pretty long) list of topics I want to take a look at and try out.&lt;br&gt;
The list grows all the time, because tech moves fast.  I do use it, though.&lt;br&gt;&lt;br&gt;
Every year I pick a topic (or maybe a few) from the list and then make a plan for how I can get my hands dirty with this new technology.&lt;br&gt;
I then create a list of tasks or elements, everything from project ideas, tutorials, blog posts, and so on, actually just picking up resources.&lt;br&gt;
They will be listed in a sensible order and I just plow through them one by one, when I have the time and energy.  Eventually, I end up with some kind of knowledge.&lt;br&gt;&lt;br&gt;
At some point, I will lose my patience and start a project.  This usually happens after I've researched/learned the most essential parts.&lt;/p&gt;

&lt;p&gt;The whole idea behind my "plan" is that I always know what's next. &lt;br&gt;
I don't need to start by figuring out what to do when I sit by the computer, I can always just sit down and start right away.&lt;br&gt;&lt;br&gt;
The progress is very clear and visible. &lt;br&gt;
The goal is to constantly be moving forward.  Consistency is the key to my methodology.  No jumping between topics that are too far apart, no randomness in the steps, just a straightforward and clear path.&lt;/p&gt;

&lt;p&gt;Ouch, this section became longer than expected, but don't worry, we are getting to the good stuff.&lt;/p&gt;
&lt;h3&gt;
  
  
  Planning; limits and requirements
&lt;/h3&gt;

&lt;p&gt;I work by a simple principle.  Plan what you do, do what you plan.&lt;br&gt;
So the first thing I do when I try to learn something new is to read the &lt;a href="https://reactnative.dev/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fexternal-preview.redd.it%2FNWrFUZX9p0ZWkSS8ioH3LYtNIo15rNeO1UIgb9D28bY.jpg%3Fauto%3Dwebp%26s%3D41d516ea004df577ce3d1d3063e2a19968c2cf9f" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fexternal-preview.redd.it%2FNWrFUZX9p0ZWkSS8ioH3LYtNIo15rNeO1UIgb9D28bY.jpg%3Fauto%3Dwebp%26s%3D41d516ea004df577ce3d1d3063e2a19968c2cf9f" alt="documentation and debugging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usually, I read the documentation to get some kind of overview before I start setting up the dev environment and such.  Once that is set I re-read the documentation with a focus on the things I know I need and try out and tinker with the sample code/tutorial/introduction.&lt;/p&gt;

&lt;p&gt;Before I started the actual project, I stitched some rough sketches or wireframes together.&lt;/p&gt;

&lt;p&gt;The goal for the project was clear; &lt;br&gt;
I want to make the fastest way to a cinema ticket, with as few interactions as possible.&lt;br&gt;
When you go to the cinema there are 3 parameters in play.  The movie, the cinema and the date.  If I can get the user to select either one of the 3, I can easily display a good overview of the other 2 options.&lt;br&gt;
Therefore I decided to present the most popular movies and the cinemas closest to the user on the home screen. So the home screen can be quick navigation for the users to either the cinema or movie he is interested in. Pretty simple, huh?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99ttmhswy09tfn1jktaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99ttmhswy09tfn1jktaz.png" alt="homescreen wireframe kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next up is the movie's screen.  Here I want to present a list of movies as a kind of overview.  Nothing new in presenting movies like this.&lt;br&gt;&lt;br&gt;
Since the list tends to get a bit long, I do want to add some kind of search on the top, to help the users who are trying to find a specific movie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrq32pm8g63skr56j2za.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrq32pm8g63skr56j2za.png" alt="movie screen wireframe kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Touching a movie poster will lead to the movie screen, with a more detailed view of the selected movie.  On this screen, the user will be able to view the trailer, read more about the movie, see showtimes, crew, and order tickets.&lt;br&gt;
The vertical bar with the dates is what I think is the easiest way to present selectable dates.  The goal is that the user should be able to touch the date he wants to see the showtimes and they will update.  Default is today's date.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrs4n7fy2f765yuq9yal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrs4n7fy2f765yuq9yal.png" alt="movie show screen wireframe kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A similar structure for the cinemas with an overview screen and a detailed view.&lt;br&gt;&lt;br&gt;
The order of the cinemas is important, though.  By default, the cinemas are sorted in alphabetical order, which is not very useful. &lt;br&gt;
So to improve the user experience, I figured I should prompt the user to let me use his geo coordinates.  I can then use them to calculate the distance from the user to each cinema and sort the cinemas with the nearest first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxr7hgr1769l3vbi7lyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxr7hgr1769l3vbi7lyf.png" alt="cinema screen wireframe kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user can select a cinema and go to the cinema screen to read more about the cinema, see the program, showtimes, and order tickets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjw010h1pbltnduwaj0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjw010h1pbltnduwaj0n.png" alt="cinema show screen wireframe kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last thing is the user login screen.  Users should be able to log in to autofill the form with the info that's needed when ordering tickets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fconfident-code.s3.eu-central-1.amazonaws.com%2FManual%2Bupload%2FkinoApp%2FLogin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fconfident-code.s3.eu-central-1.amazonaws.com%2FManual%2Bupload%2FkinoApp%2FLogin.png" alt="login screen wireframe kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For now, I want to keep it simple and just show the user's purchase history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8nqt83ejwc4xmtrbtz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8nqt83ejwc4xmtrbtz7.png" alt="profile screen wireframe kino"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Besides the different screens, the observant reader might notice the bottom navigation in the app.  This is nothing new, actually pretty standard navigation between the different screens.&lt;/p&gt;

&lt;p&gt;Let me know if you think, I should pursue a career as a designer, ok?&lt;/p&gt;
&lt;h3&gt;
  
  
  Initial setup and the first lines of code
&lt;/h3&gt;

&lt;p&gt;Now that I have some kind of idea of what the app should look like, I can start setting up my dev environment and start the actual coding journey.&lt;/p&gt;

&lt;p&gt;Following the documentation, setting the development environment up on my mac was pretty straightforward.  &lt;a href="https://reactnative.dev/]" rel="noopener noreferrer"&gt;https://reactnative.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting a new app with npx react-native init KinoApp and I had a very basic structure of the app ready.&lt;/p&gt;

&lt;p&gt;I am a bad designer, I know that. Sometimes I miss details, another weakness. Therefore, I like to help myself with some design decisions. So I started out making a "Theme file". It contains a lot of reusable code for the UI. It would help me keep the app design consistent across all screens and components. This is just a habit I've got from web development.  So I created a range of fonts with different sizes, widths, heights, and paddings. I should note that I made the widths and heights dynamic, so they are calculated on the fly to make the best fit on every screen size, but still consistent!&lt;br&gt;
Then I created all the different screens and started wiring them together through the navigation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ytimg.com%2Fvi%2FMk9G40p9Igg%2Fhqdefault.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ytimg.com%2Fvi%2FMk9G40p9Igg%2Fhqdefault.jpg" alt="meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, I knew about stack navigator, bottom tab navigator, and drawer navigator, but making them work together was the hard part. Apparently, I had to nest a stack navigator inside the bottom tab navigator. For experienced developers, this might be obvious, but nevertheless, it took me some time to wrap my head around it.&lt;br&gt;
 It is pretty different from normal web development, because the navigators have their own history, so it's very easy to mess up the "Back" button.&lt;br&gt;
Confused? Me too!&lt;/p&gt;

&lt;p&gt;It is a bit technical, so I will leave that to another post, where I go into detail with the technical decisions.&lt;br&gt;
Somehow, I managed to get the navigation to work as intended, so I could navigate between the different blank screens on my simulator.  Next up: let's fetch some data into the app and start working on the UI and design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3904vshtzkz0fe78pxdn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3904vshtzkz0fe78pxdn.gif" alt="initial navigation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Data
&lt;/h3&gt;

&lt;p&gt;The data used in the app is fetched through JSON feeds and API endpoints from Kino.dk. I wanted to pre-fetch as much data as possible, to make the app fast and with a native feel, once it was loaded.  The data had to be stored somewhere and here react (and react-native) has a wide range of options. Because this is not a normal server-side-rendered website, this is different too! Long story short, I decided to go with the Context API and not the very popular Redux library. I did put a lot of thought into this, keep my limited experience in mind, this did require some research. The reason why I went with the Context API, was that I had no need for very complex data structures, but even more important, I tried to favor the "out-of-the-box" solution. If possible, I tried to avoid using external dependencies. I believe in control over code and with limited dependencies. Hopefully, I did myself a favor when maintaining the app.  For the same reason, I am using the standard javascript fetch() method and not the very popular Axios library. It is another topic I would like to discuss, but that will be for another blog post.&lt;/p&gt;

&lt;p&gt;I set up a data-fetching component, which will run every time the app "wakes up", and on initial load. An array of movies and an array of cinemas are fetched and stored in the context. I remembered to wrap the main component with the contexts, so the data is available everywhere in? the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CinemaProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MovieProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;AuthProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatusBar&lt;/span&gt; &lt;span class="na"&gt;barStyle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"light-content"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FetchData&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BottomTabNavigator&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;AuthProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;MovieProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;CinemaProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This might seem strange for those who are new to react (native).  It was strange to me at least. &lt;br&gt;
Let me clarify;  The CinemaProvider is the Cinema Context component.  It fetches, updates, and exposes the cinema data.  Same with MovieProvider, except it's for movies.  The AuthProvider is used to handle the login of the user.&lt;br&gt;
Then you see the FetchData component I mentioned above, this is a component that pre-fetches the data and stores it in Context.&lt;br&gt;&lt;br&gt;
This means that the data can be available inside all components, where the context is imported.&lt;br&gt;
The last thing is the BottomTabNavigator.  Inside this is where we find the main app component, which contains the app.&lt;br&gt;
So to make the data available in the app, we have to wrap it around the app component.  Pretty simple and pretty strange.&lt;/p&gt;

&lt;p&gt;There are so many resources on this topic so a simple google search will enlighten you far more than my silly post.&lt;/p&gt;
&lt;h3&gt;
  
  
  UI
&lt;/h3&gt;

&lt;p&gt;Finally, some data to work with. Let's start looking at the Movies screen, the screen that has a list of all the movies.&lt;/p&gt;

&lt;p&gt;React-Native has a few components that you quickly will get familiar with if you start coding. Let's shortly inspect a few of the most common ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The

&lt;code&gt;&amp;lt;View&amp;gt;&lt;/code&gt;

component -&amp;gt; This is very similar to the

&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;

tag we know and love from html
- The

&lt;code&gt;&amp;lt;Text&amp;gt;&lt;/code&gt;

component -&amp;gt; This is a component that contains text.  Surprised?  It is similar to tags you know from html:

&lt;code&gt;&amp;lt;p&amp;gt;, &amp;lt;i&amp;gt;, &amp;lt;h1&amp;gt;, &amp;lt;h2&amp;gt;, &amp;lt;h3&amp;gt;&lt;/code&gt;

and so on. 
- The

&lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;

component -&amp;gt; This component can display an image.
- The

&lt;code&gt;&amp;lt;TouchableOpacity&amp;gt;&lt;/code&gt;

component -&amp;gt; This is a bit similar to a view but will make the "area" touchable, which means we can have an onPress function on the component that will do something.  Can be used to navigate the user somewhere.
- The

&lt;code&gt;&amp;lt;FlatList&amp;gt;&lt;/code&gt;

component -&amp;gt; This one is interesting.  This is a list of items.  It takes in an array and loops over the items and displays them.  These items can be anything... images, views, text, or a combination.  Pretty handy, huh? In our case, this component is ideal for our list of movies.
- All the components are well described in the documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I started out creating a FlatList on the movies overview screen. It will take in the array of movies from context and the loop through it and for each item display a poster image and a movie title. Sounds simple, right?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../context/MoviesContext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// import the movies context&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// set the movie context to state&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;movies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMovies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;movies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;selling_position&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Sets the movies list to the constant movies and order it by selling_position to make the most popular movies appear on top.&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FlatList&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;movies&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;numColumns&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;showsVerticalScrollIndicator&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;renderItem&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;keyExtractor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;numColumns is set to 3, so the data is present in 3 columns. The key extractor is an ID that the FlatList needs to identify for each object in the array.  Notice the renderItem function? Good! It's important! It calls a function called Item and takes an item as a parameter. Clever naming, right? - I didn't come up with it, I was inspired! Nevertheless, the Item function is responsible for presenting each item in the array.&lt;/p&gt;

&lt;p&gt;So the function looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Item function is where I continued to work with styling and adding the option to navigate the user to a screen for a single movie. One strange thing, which is actually not strange at all, is that you need to add some kind of width and height to the image, otherwise it won't be visible. Again, thank you documentation!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzauxeohqrikc0o070mc7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzauxeohqrikc0o070mc7.jpg" alt="movie overview kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  (screenshot is from the final app and not the first draft)
&lt;/h6&gt;

&lt;p&gt;I will not go through the cinema overview page, since it's very very similar.  Contains a list of cinemas.  You can see the "final" result here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdgvzep50dt602vdwzhm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdgvzep50dt602vdwzhm.jpg" alt="cinema overview kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  (screenshot is from the final app and not the first draft)
&lt;/h6&gt;

&lt;p&gt;Everything except the navigation has been pretty straightforward until now. Next up was to navigate the user to the movie screen, when pressing a movie poster. I still don't understand why this very basic functionality was so difficult for me, but the combination of the stack and bottomtab navigator created some issues. When I face issues like this, I combine reading on StackOverflow, checking blog posts, and just trying a few things out. A deeper understanding of the problem is required in order to get enough information to make a detailed search for a solution.&lt;/p&gt;

&lt;p&gt;To sum up, I tried to keep the structure simple, with a screen listing all movies and one with all cinemas. From there the user can navigate to the movie or cinema and order tickets.&lt;/p&gt;

&lt;p&gt;In addition to the navigation, I added a search bar on top, where the user can search for a movie or cinema instead of scrolling down. I called it search, but it's actually just a filter functionality!&lt;/p&gt;

&lt;p&gt;When ordering a cinema ticket, there are 3 variables to consider: The movie, the cinema, and the day. We need the user to choose at least 2 of the 3 before we can present a view with showtimes that is not too overwhelming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design
&lt;/h3&gt;

&lt;p&gt;The movie and cinema profile is the last step before selecting a showtime and purchasing a ticket. Therefore, I wanted to keep the information to a bare minimum, so it is very obvious how and where to tap to order a ticket. If the user wants further information, like a review or list of actors, a little more work is required. I hope to satisfy the majority of the users with minimal initial information. Of course, information like a movie title, genre, and so on must be present and easy to see.&lt;/p&gt;

&lt;p&gt;The result currently looks like this for a movie:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2mpj9h559bwvbbzda4e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2mpj9h559bwvbbzda4e.jpg" alt="the father movie profile kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo2n8k80jlfqol38f72h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo2n8k80jlfqol38f72h.jpg" alt="suicide squad movie profile kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some fun featured I decided to implement, was to fetch colors from the movie poster and use them throughout the movie profile.  So all the movie profiles will look different depending on their poster.  Another good thing about this was that I didn't have to figure out some kind of cool color scheme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4fp0wu0og5ubtr7w7kd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4fp0wu0og5ubtr7w7kd.jpg" alt="a quiet place screenshot kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8s92z7udi5qchj5h56h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8s92z7udi5qchj5h56h.jpg" alt="promising young woman screenshot kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31gcccob00t082zmde1g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31gcccob00t082zmde1g.jpg" alt="pagten screenshot kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzs2i4xdssub36ba63o1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzs2i4xdssub36ba63o1.jpg" alt="druk screenshot kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am fetching a primary background color, a primary non-background color, and a secondary color. These are used throughout the different elements to hopefully create a more unique experience for each movie. This feature does create some problems, though. One of the issues is that it works well for some posters, but others will not be that great. And I have no control over this. But somehow I'm still responsible!&lt;/p&gt;

&lt;p&gt;From a technical point of view, this feature does collide a bit with my hopes and dreams about load speed. Keep in mind that each movie screen will have different colors, so these colors must be fetched on the fly, without making the user fall asleep in the process.&lt;/p&gt;

&lt;p&gt;For the cinema profile, I'll use a very similar design, but without the unique colors. The information presented is pretty similar and I want to keep some kind of consistency in the design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4vjr28g3oy2edphqgf2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4vjr28g3oy2edphqgf2.jpg" alt="cinema profile screenshot kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the tougher design decisions, I had to make in the process, was how to present the showtimes. I was (of course) inspired by other apps and figured that the user most likely know which day he wants to go to the cinema. So we can keep the view to be showtimes for 1 day at the time. I tried to follow some conventions by choosing a vertical list that works as a date picker. Selecting a date will fetch showtimes data for the movie or cinema and present it.&lt;/p&gt;

&lt;p&gt;When selecting a cinema, you can see this particular cinemas program for the selected day:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefo1snwhqu1tgnt3melt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefo1snwhqu1tgnt3melt.jpg" alt="cinema show times screen kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you select a movie, you can see the showtimes in the different cinemas for the selected day:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp311tfmxhqio31unaqa6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp311tfmxhqio31unaqa6.jpg" alt="movie show times screenshot kino app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, you will get an overview of the "entire" program for that day. So either the user selects a cinema or a movie and sees the showtimes for that day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animations and smoothness
&lt;/h3&gt;

&lt;p&gt;How do we judge quality?  Whenever something is aesthetically pleasant?&lt;br&gt;
A well-timed and carefully selected animation can do wonders for how the app "feels".&lt;br&gt;
It's an art and something that I by no means master.  I do know if it was successful or not.  But hey!  I figured out how to do animations!&lt;/p&gt;

&lt;p&gt;I have added a few animations to ease the transition between screens and on the loading of screens.&lt;/p&gt;

&lt;p&gt;If you have tried the app, you might have noticed how the images slide back and forth when you go from the movie/cinema overview and to a movie/cinema.  I combine animations and navigations to try to make the transition smooth.&lt;/p&gt;

&lt;p&gt;Also, I do a fade-in with a slight delay on some elements on the movie profile, like the play icon for the trailer.  It "drops in" shortly after the screen is loaded.  Why?  - Well there are a few reasons for it.  One is to draw some attention to the button, if you press this, then you can watch the trailer.  Another reason is that 95% of all movies will have trailers, while some won't.  So I have to do a check in the data to see if the movie has a trailer or not and I don't want to bother the user and make him wait for that check.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqa3hw0le3qowss93v85.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqa3hw0le3qowss93v85.gif" alt="kino app movie profiles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another small and maybe useless animation is when the user presses either a button or poster.  It will mimic a real physical button being pressed down and go back up.&lt;/p&gt;

&lt;p&gt;It's a small thing, but it all adds up and contributes to the overall touch and feel of the app.&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenges in the process and how to overcome them
&lt;/h3&gt;

&lt;p&gt;One of the issues that took me the longest to figure out was the data structure and how to re-arrange it to meet my needs.&lt;/p&gt;

&lt;p&gt;Next up was the geo-location, where I fetch the user's GPS coordinates, pair it with the cinemas coordinations, calculate the distance, and sort the cinema list by distance to the user, with nearest first.&lt;/p&gt;

&lt;p&gt;Simply displaying the showtimes for a movie, for each cinema was a challenge, too.&lt;br&gt;
When users select a showtime, a webview opens because there are no API endpoints for the last few steps of the ticket purchasing flow. So this was my only option and the biggest weakness of the app.&lt;/p&gt;

&lt;p&gt;Figuring out how to auth the user and pass the user to the webview was also something that took me a while to make work.&lt;/p&gt;
&lt;h4&gt;
  
  
  Data structure and restructure
&lt;/h4&gt;

&lt;p&gt;The data structure was one of the first challenges I faced.  To understand the issues, we need a quick overview of the data.  First off we have a list of cinemas and a list of movies.  Each movie will have a list of showtimes, queried by date.  So we can fetch all showtimes for a movie on a specific date.  The showtimes is an array of arrays, where they are grouped by cinema.  It makes sense, right?  And then there is a similar structure for the cinemas, where you can get all showtimes for that cinema on a particular date, grouped by movies.&lt;/p&gt;

&lt;p&gt;Example for a movie:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cinema_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1196251"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"showtimes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"start_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-08-27 12:15:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"room_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sal 4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"showtime_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3852882"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"room_seats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"293"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"ticket_available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"283"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"movie_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"42824"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"start_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-08-27 14:30:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"room_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sal 4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"showtime_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3852884"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"room_seats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"293"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"ticket_available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"288"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"movie_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"42824"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the structure is an array of cinemas and under each cinema, there's a showtime object that contains an array of showtime objects. Mind the "movie_version_id", this is a reference to if it’s a 2D, 3D, or something else. I wanted to group the showtimes by version. So I wrote a small function to restructure and re-arrange the array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showtimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showtimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;movie_version_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though I try to minimize the 3rd party libraries, I am using lodash.  Why isn't this javascript just like this? phew.&lt;br&gt;
Well, it's easy to understand, showtimes are grouped by movie_version_id, which is the version.  So all 2d movies will be grouped under the same version label.  Perfect.&lt;/p&gt;

&lt;p&gt;And the new structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cinema_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1196251"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"City"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"showtimes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"42924"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-08-27 12:15:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"room_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sal 4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"showtime_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3852882"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"room_seats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"293"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ticket_available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"283"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"movie_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"42824"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"start_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-08-27 14:30:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"room_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sal 4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"showtime_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3852884"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"room_seats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"293"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ticket_available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"288"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"movie_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"42824"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Geo Location
&lt;/h4&gt;

&lt;p&gt;Geolocation was another issue. Keep in mind, my goal was to make it as easy and fast as possible to get a cinema ticket. Even though Denmark is a small country, it's very unlikely that people will travel through the entire country to go to a specific cinema. They will almost always want to go to a cinema near their current location. So I implemented the option to fetch the user's geolocation and pair it with each cinema location and calculate the distance from the user to each cinema.  Once the user opens the app, he will be asked if the app can get access to the GPS to determine his location. The location data is not saved, but only used in real-time to calculate the distance to the different cinemas. Let's pretend the user said ok and then some coordinates are returned to us to use.  I wrote a function that will calculate the distance between the location of the user and another location. Then looping through all the cinemas, asking this very question and using each answer to add a "Distance" parameter to the array of cinemas. The distance (big surprise) is how far the user is located from each cinema. And then sorting it with nearest first.&lt;/p&gt;

&lt;p&gt;How the heck do you calculate the distance between 2 sets of coordinates?  And get the answer in kilometers?&lt;br&gt;
Well, thank you internet!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;computeDistance&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;prevLat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prevLong&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;long&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevLatInRad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toRad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevLat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevLongInRad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toRad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevLong&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;latInRad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toRad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;longInRad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toRad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;long&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// In kilometers&lt;/span&gt;
    &lt;span class="mf"&gt;6377.830272&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
    &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;acos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevLatInRad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;latInRad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevLatInRad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
          &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;latInRad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
          &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;longInRad&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;prevLongInRad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toRad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I feel like I want to write more about this because I spent some time researching to understand what is going on and it's fascinating. If you want to talk about this, let me know. I'll buy you a beer that you can drink while I talk nonsense about this.&lt;/p&gt;

&lt;p&gt;Then I made an updateCinemas function in the Cinemas Context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updateCinemas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cinemas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;referenceLat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;referenceLong&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cinemasWithDistance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cinemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cinema&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;cinema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;computeDistance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cinema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cinema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;referenceLat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;referenceLong&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Calculate the distance&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;orderedCinemas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cinemasWithDistance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;distance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update_cinemas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;orderedCinemas&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; 
    &lt;span class="c1"&gt;// Update cinemas is called with cinemas array and user coordinates&lt;/span&gt;
    &lt;span class="c1"&gt;// A distance value is added to each cinema based on user coords and cinema cords&lt;/span&gt;
    &lt;span class="c1"&gt;// cinemas are sorted by distance&lt;/span&gt;
    &lt;span class="c1"&gt;// state is updated with new cinemas array and a value of cinemaSorted to be true&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voila!  The cinema's array now has a distance value and is now sorted by that.  So the cinema that is closest to the user will be the first one on the list.&lt;br&gt;
Notice the comments?  - Yes, I'm a nice guy like that!&lt;/p&gt;
&lt;h4&gt;
  
  
  Geo Location for movie showtimes
&lt;/h4&gt;

&lt;p&gt;Next big issue; How am I going to use this on the cinema overview screen? I need it in the showtimes for each movie, too, so the sorting of cinemas is consistent across the entire app.&lt;/p&gt;

&lt;p&gt;Well, diving into the way I display the showtimes for each movie, I wrote a function that handles the group by showtimes issue but adding the distance value to each cinema. Because this distance value is only in the cinema list, not the list for the movies showtimes. Luckily I could match on the cinema IDs since they were present in both arrays and then merge them.&lt;/p&gt;

&lt;p&gt;Finally, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mergeArrays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arr2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;arr1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;arr1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;arr2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itmInner&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;itmInner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;cinema_id&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showtimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showtimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;movie_version_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each time showtimes are loaded for a movie, data is restructured to have the right sorting and distance value on cinemas.&lt;br&gt;&lt;br&gt;
Now both the list of cinemas on the cinema overview page and the cinemas on the movie screen showtimes are sorted by the distance parameter.&lt;/p&gt;
&lt;h4&gt;
  
  
  Display the showtimes
&lt;/h4&gt;

&lt;p&gt;All of this leads me to the issue of displaying these showtimes. So we talked about FlatLists already. They are great and perfect for this use case. Let's pretend we are looking at showtimes for a movie. The data structure is sensible, because for each movie there is an array of cinemas, and nested inside this cinema’s array there is an array of showtimes. But I grouped all the showtimes by their version and so it's a 3-stack deep nested array before we get the actual showtimes.&lt;/p&gt;

&lt;p&gt;This calls for nested FlatLists! The first FlatList will contain all Cinemas. Then for each cinema, a nested FlatList is rendered, this one will contain all the versions. And finally, inside each movie version, yet another FlatList is rendered, to display the showtimes for this movie version at this cinema. Phew.&lt;br&gt;
 BUT PERFORMANCE? Well, actually it's not a problem, since we use the keyExtractor ID to index the items AND they are lazy-loaded. It is interesting, though, because each time a user selects a date on a movie, all this will happen, including grouping the showtimes by version, merging, and sorting of the cinemas.&lt;br&gt;
Remember, the order of the cinemas will vary depending on the user's location.  I wish I could query the API with longitude and latitude coordinates, and it would then return a perfect structured array of the items, but that would make this section both very short and very boring.&lt;/p&gt;
&lt;h4&gt;
  
  
  NO API end point
&lt;/h4&gt;

&lt;p&gt;The biggest challenge, issue, and flaw in this app is how I handle what happens when a user presses a showtime and wants to select seats and buy a ticket. Kino.dk, the website, has some deeper integrations to the different ticket systems, which makes it feel like a part of kino.dk. There are no API endpoints for this part, so the only option I had was to open a webview on kino.dk targeting the selected showtime.&lt;/p&gt;

&lt;p&gt;This is by no means the best implementation, but the only current option I had. My plan for Kino.dk was to extract the ticket system logic out to an external service and then I could hook both Kino.dk and the app to that service and provide a true native app experience. Without having thought this through, there could still be some issues. I could make the deeper integration with the app and ticket systems/middle layer, so the users can select a number of tickets, select seats, etc, but how did I handle the payment? I had to use the cinema’s/ticket systems payment gateway since we are selling tickets on behalf of the tickets system or cinema. So it is not Kino.dk’s money, but the cinemas’.  It would require Kino to have its own payment gateway that will distribute the money to the cinemas. I am not sure it will happen.&lt;br&gt;
If you got any good ideas on how to solve this, I would love to hear from you!&lt;br&gt;
Another twist with the webview was that I had to fetch cookie and session data and pass it to the webview to make sure the user was logged in.  The webview is just an in-app browser that will show the mobile website. The user will get validated/logged in with the right cookies. These cookies or strings are available to me through the authentication endpoint.  What happens behind the scenes when the user login, is that some strings (cookies) are returned from the API and saved on the phone through AsyncStorage. These strings will be passed as cookies to the webview, to validate the user and log him in, so he doesn't have to add fill out redundant data.&lt;br&gt;
Luckily there's a react-native library (react-native-cookies) to make this easier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;CookieManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://kino.dk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.kino.dk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;httpOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Finalizations
&lt;/h3&gt;

&lt;p&gt;ne thing that surprised me was something the cool people call the 80 / 20 - rule. It means that you can do 80% of the project in 20% of the time. That leaves us with the last 20% that will take 80% of the time. It is not entirely true for my project, but I experienced a lot of missing pieces just before the release.  And that is without talking about the actual release, which is a huge pain.&lt;br&gt;
I eventually ended up reaching out to a freelance React Native developer, who could help me with some code review and speed up the last bit of the process.&lt;/p&gt;

&lt;p&gt;Thank you, Stefan! You are amazing and I admire your patience.&lt;br&gt;
If you need a react native developer, I can recommend this guy.  You can find him at: &lt;a href="https://github.com/Hyllesen" rel="noopener noreferrer"&gt;https://github.com/Hyllesen&lt;/a&gt; and take his course at: &lt;a href="https://www.udemy.com/user/stefan-hyltoft/" rel="noopener noreferrer"&gt;https://www.udemy.com/user/stefan-hyltoft/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole deployment of the app to AppStore and PlayStore should be a chapter by itself. It was not difficult, it just took a long time to make the images fit, fill out the information, and all that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons learned and key take-aways
&lt;/h3&gt;

&lt;p&gt;I have learned a lot in the process and there are a lot of key take-aways that could benefit anyone who might consider similar craziness. When I started out, everything was a bit confusing and I had to look up almost everything. But as I progressed, some of the stuff somehow got stuck in my brain, so I was able to operate more freely. The more you know, the more you know that you don't know. And this is true. But while you build knowledge and insight, your solutions will also become better. And maybe the most important thing when expanding your knowledge is all the ideas and solutions that pops up. Alongside the knowledge expansion, a range of possibilities will become clear and it’s in this space my innovation thrives.&lt;/p&gt;

&lt;p&gt;Even though the last bit of this article was full of problems that I faced in the process, I finish the project with a feeling that this is doable for anyone. I am no genius, just methodical and very stubborn. I have a lot of experience in teaching myself new programing languages and tech stuff in general. I have developed a method (that works for me) for learning new things, which means that I can fairly quickly pick new things up. I keep a list of things I want to dive into and every year I pick a topic (like React Native), make a plan and start my deep dive. It’s just a hobby and the pressure is off, so I can do it out of interest and not out of need.&lt;/p&gt;

&lt;p&gt;I made a checklist with a few notes on what to consider;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy to AppStore and PlayStore early&lt;/li&gt;
&lt;li&gt;Test on physical devices all the time&lt;/li&gt;
&lt;li&gt;Screen sizes -&amp;gt; they vary. So check on different sizes&lt;/li&gt;
&lt;li&gt;Some users have extra big fonts. That will break the design. For me, it was not an option to just force the size of the font. I wanted the design to adjust to users who needed bigger fonts. It took me a while&lt;/li&gt;
&lt;li&gt;Tracking. Think about it from the start. Implement it, test it and then test it again&lt;/li&gt;
&lt;li&gt;Handle what happens if the user is offline&lt;/li&gt;
&lt;li&gt;Some kind of error message to the user, if the API call fails&lt;/li&gt;
&lt;li&gt;Be aware of what happens if the user puts the app in the background, but without closing it. (I used a method where data is refreshed upon making the app active again)&lt;/li&gt;
&lt;li&gt;How do you want to present the app in AppStore and PlayStore? - Creating those images does require some work and if you want it to look good x2 that work&lt;/li&gt;
&lt;li&gt;How consistent is your data? Can you count on every attribute being there? If not, handle it&lt;/li&gt;
&lt;li&gt;There is no caching on the default Image element in react native&lt;/li&gt;
&lt;li&gt;Animations are fun and nice, but they should be used with care&lt;/li&gt;
&lt;li&gt;Plan the component structure&lt;/li&gt;
&lt;li&gt;Follow conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Whats next?
&lt;/h3&gt;

&lt;p&gt;I like to work in small, but never-ending iterations, where I develop an MVP and then take small steps based on a combination of data and user feedback. So far I have got extremely good feedback and some great ideas for the next steps. There has been some bad rating and reviews in the store, though. Annoying as it is, they are all related to the webview implementation, the big weakness of the app.&lt;/p&gt;

&lt;p&gt;I have actually already released a new update, where users can add cinemas as favorites. They will then be listed at the top of the showtimes list for a movie and on the cinema overview. The reason why this is the first feature was that I could see that 20% of the users did not allow geolocation. That means that they will get a list of cinemas in alphabetical order, which is not very useful. And I want to keep the focus narrow and centered on how to make it as fast and easy as possible to order a cinema ticket.&lt;/p&gt;

&lt;p&gt;What else is in the backlog? I have a list and it is pretty long and without any filter.&lt;/p&gt;

&lt;p&gt;I do know for sure that I want to add news to the app, too. Kino.dk is a ticket sales machine for cinema tickets, but it is also Denmark's biggest movie media. So supporting that part of the business would be a natural next step.&lt;br&gt;
I also want to give the editors more freedom to make an impact on the app. That could be promoting a certain movie or communicate with the users either through articles or competitions/polls. How? I have no idea.&lt;/p&gt;

&lt;p&gt;Another idea I consider is to add a view/screen where the user selects a date and then a list of cinemas and their movies (and showtimes) will be displayed. It should answer the question: "What's in the cinema on Saturday? Something worth watching?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Final words
&lt;/h3&gt;

&lt;p&gt;Did you really read all this? Phew, good job!&lt;/p&gt;

&lt;p&gt;Now that the app is up and live, I can show off, brag and all that. There are currently around ~70.000 users on the app and the number keeps increasing without any marketing.&lt;/p&gt;

&lt;p&gt;Honestly, it was pretty hard. At times it felt like a mental marathon. I started with no idea at all how to do this. Doing small baby steps, consistency, no pressure, and lots of time were the key ingredients. I was able to work my way through it and tackle each issue with a calm focus. I did this project alongside my normal job, but on shorter hours. I tried to code at least 1 hour each day, and it took me around 5-6 months to learn and build.&lt;/p&gt;

&lt;p&gt;It was fun to dive into app development and figure out how to build an actual app.  And I will recommend you to give it a shot if you have the time and interest.  I believe that this is doable for anyone who can dedicate the needed time and focus.&lt;/p&gt;

&lt;p&gt;I know for sure that I do not want to be a mobile developer full-time. It's interesting and fun, but I would get tired and I need to dance in the space between tech and business. Not only in one of the 2 camps.&lt;/p&gt;

&lt;p&gt;Thank you for reading the article!  And feel free to leave a comment or reach out to me if you have any feedback, question or want to chat about development and IT.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>showdev</category>
      <category>learning</category>
      <category>development</category>
    </item>
  </channel>
</rss>
