<?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: mveillon</title>
    <description>The latest articles on DEV Community by mveillon (@matthieuveillon).</description>
    <link>https://dev.to/matthieuveillon</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%2F561900%2F57e8d48a-86b4-4e40-ba0d-729b87eff3f9.jpeg</url>
      <title>DEV Community: mveillon</title>
      <link>https://dev.to/matthieuveillon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matthieuveillon"/>
    <language>en</language>
    <item>
      <title>Create a starter kit that fits your needs. </title>
      <dc:creator>mveillon</dc:creator>
      <pubDate>Fri, 28 May 2021 15:15:56 +0000</pubDate>
      <link>https://dev.to/matthieuveillon/create-a-starter-kit-that-fit-your-needs-3fog</link>
      <guid>https://dev.to/matthieuveillon/create-a-starter-kit-that-fit-your-needs-3fog</guid>
      <description>&lt;p&gt;I work in a french company called &lt;a href="https://thetribe.io/"&gt;theTribe&lt;/a&gt; where our typical projects are 3 to 6 month long, generally web or mobile app.&lt;/p&gt;

&lt;p&gt;We usually end up choosing a mix of JS / Python or PHP for our web based project and React Native or Flutter for our mobile projects. &lt;/p&gt;

&lt;p&gt;This means a lot of projects, with different needs but also a lot of common tasks we need to solve each time. (think linting, continuous integration, deployment  and provision automation, DB setup, Test setup, authentication etc) &lt;/p&gt;

&lt;h3&gt;
  
  
  the painpoints
&lt;/h3&gt;

&lt;p&gt;A typical bootstrap takes roughly between 3 to 10 days depending on the specificity of the project.&lt;/p&gt;

&lt;p&gt;Historically we had different starter kits, for mobile, php and javascript projects.  Each of them relying on different patterns, and since they were scattered it was difficult to maintain them and/or promote their use.&lt;/p&gt;

&lt;p&gt;Therefore we decided to tackle this painpoint by creating a new generator which would aim : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to centralize our needs.&lt;/li&gt;
&lt;li&gt;allow the dev to choose between the different main tech we use at theTribe&lt;/li&gt;
&lt;li&gt;allow a better maintenance of the project&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  the solution
&lt;/h3&gt;

&lt;p&gt;We ended up choosing Yeoman which allow us to provide a CLI experience with prompts where the dev will be asked a few questions to choose the stack he/she wants to use and some variables for the project identity&lt;/p&gt;

&lt;p&gt;The current MVP covers the most used technologies which are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-End Architecture : you can choose between &lt;code&gt;Create React App&lt;/code&gt; and &lt;code&gt;NextJs&lt;/code&gt; as a boilerplate app&lt;/li&gt;
&lt;li&gt;Backend-End Architecture : you can choose between &lt;code&gt;Node&lt;/code&gt; and &lt;code&gt;Symfony&lt;/code&gt; (Node backend comes with Express and TypeORM)&lt;/li&gt;
&lt;li&gt;Containerization In dev environment with &lt;code&gt;docker-compose&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Provision/Deployment automation with &lt;code&gt;Ansible&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Instance Management with &lt;code&gt;Terraform&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Continuous Integration with &lt;code&gt;CircleCI&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All this comes with the appropriate file structure and allow each dev to kickstart their project easily&lt;/p&gt;

&lt;p&gt;We just have open-sourced it on &lt;a href="https://github.com/thetribeio/generator-project"&gt;https://github.com/thetribeio/generator-project&lt;/a&gt; and we would appreciate any feedback,&lt;/p&gt;

&lt;p&gt;In parallel we also have uploaded it on a the &lt;a href="https://fast-modular-project.com/starters/thetribe-generator-project"&gt;Fast Modular Project&lt;/a&gt; which is a platform which aims to reference different starter kits from different companies and individuals. &lt;/p&gt;

&lt;p&gt;Do not hesitate to pin and like if you appreciated the article ❤️&lt;/p&gt;

</description>
      <category>react</category>
      <category>architecture</category>
      <category>javascript</category>
      <category>news</category>
    </item>
    <item>
      <title>Continuous integration and deployment workflow with Vercel, Firebase and CircleCI</title>
      <dc:creator>mveillon</dc:creator>
      <pubDate>Wed, 03 Mar 2021 06:51:07 +0000</pubDate>
      <link>https://dev.to/matthieuveillon/continuous-integration-and-deployment-workflow-with-vercel-firebase-and-circleci-20n8</link>
      <guid>https://dev.to/matthieuveillon/continuous-integration-and-deployment-workflow-with-vercel-firebase-and-circleci-20n8</guid>
      <description>&lt;p&gt;I've recently set up the whole CI/CD workflow for a project at work, this was the first time I was really diving into CI configuration and automated deployment with this stack. With the combination of the tools below, I feel we have achieved the right mix of confidence / automation for our current needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools and their responsibilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CI&lt;/strong&gt; : We use &lt;a href="https://circleci.com/"&gt;CircleCI&lt;/a&gt; for running all our tests / linting / type checking for both front end and backend. It also orchestrates backend deployment for Firebase function&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; : We use &lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt; to deploy our front end. It is linked to our github repo to automatically deploy the front-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; : We use &lt;a href="https://firebase.google.com/"&gt;Firebase&lt;/a&gt; for the backend (serverless functions as well as database and authentication). Generally we'll use one project for development and one project for prod.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zEzWaD2_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9c1bu09fac35kapr6tze.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zEzWaD2_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9c1bu09fac35kapr6tze.jpeg" alt="CI_CD_Firebase_Vercel_overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Front-End
&lt;/h3&gt;

&lt;p&gt;Our client is basically a &lt;a href="https://nextjs.org/"&gt;NextJs&lt;/a&gt; React app. It pairs really well with Vercel since they are the ones behind NextJs, the integration / tooling is really fluid.&lt;/p&gt;

&lt;p&gt;To get started you'll need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have 2 branches on github (usually I go with develop and master)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel.com/docs/custom-domains#adding-a-domain"&gt;Register your prod and dev domains on Vercel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel.com/docs/custom-domains#assigning-a-domain-to-a-git-branch"&gt;Link your 2 domains to the right github branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should be enough to get you started and being able to deploy automatically whenever you merge on your configured branch on vercel.&lt;/p&gt;

&lt;p&gt;If you need to customize the build-step, whereas it is the command or the output folder, you can follow their &lt;a href="https://vercel.com/docs/build-step"&gt;documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment variable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All your environment variables &lt;a href="https://vercel.com/docs/environment-variables"&gt;can be set up directly on Vercel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you need to provide different values in your codebase based on the branch you're on (and therefore whether you target your staging or prod domain) you can rely on the &lt;a href="https://vercel.com/docs/environment-variables#system-environment-variables"&gt;System Env Variables&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getEnvVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&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;isProd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_VERCEL_GITHUB_COMMIT_REF&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;master&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NEXT_PUBLIC_FIREBASE_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isProd&lt;/span&gt;
                &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_PROD_FIREBASE_API_KEY&lt;/span&gt;
                &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_FIREBASE_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`key &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is not recognized `&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;&lt;strong&gt;Note on firebase hosting :&lt;/strong&gt;&lt;br&gt;
To deploy it we were initially using firebase hosting, but it was rather slow as you need to rely on a serverless function from firebase to serve the server side content.&lt;/p&gt;

&lt;p&gt;If you want to use Firebase Hosting you would be limited to a function in &lt;code&gt;us-central1&lt;/code&gt;. This is a &lt;a href="https://stackoverflow.com/questions/65304321/serve-dynamic-content-with-firebase-hosting-functions-in-eu"&gt;known limitation&lt;/a&gt; and for the meantime if you want to serve dynamic content you would have to configure &lt;a href="https://firebase.google.com/docs/hosting/cloud-run"&gt;Google Cloud Run&lt;/a&gt; instead&lt;/p&gt;
&lt;h3&gt;
  
  
  Back end - firebase serverless functions
&lt;/h3&gt;

&lt;p&gt;This part is a bit trickier between local and prod setup. There are a few firebase key concepts behind it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firebase project&lt;/strong&gt; : usually you use a firebase project for your prod, and one for your staging. Meaning that you will need to switch between project whenever you want to deploy code on staging or on prod. This will be automated through CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service account&lt;/strong&gt; : This is one of the way to authenticate yourself as an admin of a firebase project. Your service account can be generated in the firebase console&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RuntimeConfig :&lt;/strong&gt; this is the config you can set up through &lt;code&gt;firebase CLI&lt;/code&gt; usually to add env variables associated to your firebase project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase CLI :&lt;/strong&gt; The command line tool which allow you to perform several tasks on firebase like :&lt;/li&gt;
&lt;li&gt;login into your firebase project.&lt;/li&gt;
&lt;li&gt;adding/selecting the project you're currently working on&lt;/li&gt;
&lt;li&gt;adding env variable to your project&lt;/li&gt;
&lt;li&gt;generate the firebaseToken needed to deploy through the CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll go through each of them in the setup below, don't worry (I'm mostly speaking to myself for the next time I need to configure this 😄)&lt;/p&gt;

&lt;p&gt;Setup commmon to both local and staging/prod&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firebase Project Configuration :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You'll therefore first need access to one or two firebase projects. This setup will mostly walkthrough having 2 firebase projects (staging and prod) with each their own authentication and database. Just log on &lt;a href="https://console.firebase.google.com/"&gt;firebase and follow the steps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install firebase-cli
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; firebase-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Login through firebase-cli. This allows the next steps
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Once you're logged in you'll be able to add different firebase projects to your current configuration by :
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase use &lt;span class="nt"&gt;--add&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This should result in &lt;code&gt;.firebaserc&lt;/code&gt; file in your project where you'll have a list of your projects. This is important as we'll rely on those aliases to target the right project to deploy based on the branch later on. Would you have any issue you can refer to &lt;a href="https://firebase.google.com/docs/cli#install-cli-mac-linux"&gt;firebase-cli documentation&lt;/a&gt; which rather good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment variable :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For your env variables you can add them directly to your firebase project through firebase CLI :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase functions:config:set someservice.id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"THE CLIENT ID"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can later on access it through :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const functions = require('firebase-functions');
...
const id = functions.config().someservice.id,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt;&lt;br&gt;
Those environment variables are stored directly in your project on firebase and as such you don't need them locally. Usually you download them locally to verify a value manually. Might be a good idea to gitignore them, just in case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialize admin SDK :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To configure and add your firebase-admin sdk, you'll need to &lt;a href="https://firebase.google.com/docs/admin/setup#initialize-sdk"&gt;add a service account&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This will result in a local .json file, that you will place under a specific gitignore folder on your machine.&lt;/p&gt;

&lt;p&gt;Firebase then recommends putting the path of the file in an environment variable (previous section) - you can refer to the &lt;a href="https://firebase.google.com/docs/admin/setup#initialize-sdk"&gt;firebase docs if needed&lt;/a&gt;&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;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;admin&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;firebase-admin&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initializeApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;google_application&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;databaseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;project_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.firebaseio.com`&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Local Setup
&lt;/h3&gt;

&lt;p&gt;To develop locally, usually I end up using the staging project for database/auth and serverless function. This can be achieved by :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;select your firebase project manually through firebase CLI with &lt;code&gt;firebase --use XXX&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt;&lt;br&gt;
Pay attention to which project you're currently using, sometimes you want to run a script against prod and you end up using &lt;code&gt;firebase --use master&lt;/code&gt; which will be the selected project untill you reselect staging / your test env&lt;/p&gt;

&lt;p&gt;We want to avoid deploying the serverless functions manually at this stage and want to pass this responsibility to the CI&lt;/p&gt;
&lt;h3&gt;
  
  
  CI Setup
&lt;/h3&gt;

&lt;p&gt;The CI will be responsible for deploying our functions to firebase.&lt;/p&gt;

&lt;p&gt;There is obviously some constraints :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you don't want to expose your serviceAccount in your repo&lt;/li&gt;
&lt;li&gt;you need to switch the project used to deploy based on the branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To achieve those goals we have to configure a few things :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;take the path to where your service account is supposed to be stored and save it as an env variable on CircleCI.&lt;/li&gt;
&lt;li&gt;take your local serviceAccount and &lt;a href="https://support.circleci.com/hc/en-us/articles/360003540393-How-to-insert-files-as-environment-variables-with-Base64"&gt;encode it to base64&lt;/a&gt; to save it as an env variable on circleCI. This allows CircleCI to store complex structure as a string.&lt;/li&gt;
&lt;li&gt;a good practice is to add &lt;code&gt;BASE_64&lt;/code&gt; at the end of your variable name. Usually I end up with 2 var in circleCI, something like : &lt;code&gt;FUNCTION_PROD_SERVICE_ACCOUNT_BASE64&lt;/code&gt; and &lt;code&gt;FUNCTION_STAGING_SERVICE_ACCOUNT_BASE64&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;take the serviceAccount from circleCI and decode/copy it through the CI to your build folder :
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;command&lt;/span&gt;: &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;.key_env_name &amp;gt;&amp;gt; | base64 -di &amp;gt; ./keys/&amp;lt;&amp;lt; parameters.key_path &amp;gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Now your code should be ready to be deployed, but you still need to make sure you have the token to allow your CI to handle the deployment. This can be done with &lt;a href="https://firebase.google.com/docs/cli"&gt;the firebase token.&lt;/a&gt; This is done only once - you don't need to do it each time you switch the project you're using.&lt;/li&gt;
&lt;li&gt;From there you should be able to deploy your serverless functions based on your branch like so :
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;command&lt;/span&gt;: ./node_modules/.bin/firebase deploy &lt;span class="nt"&gt;--token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FIREBASE_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;.environment &amp;gt;&amp;gt; --only functions:hubspot,functions:users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This can only be triggered based on the branch you're running the merge against. Like so&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;functions_deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;functions-build&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;staging&lt;/span&gt;
    &lt;span class="na"&gt;key_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$STAGING_SERVICE_ACCOUNT_PATH&lt;/span&gt;
    &lt;span class="na"&gt;key_env_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$FUNCTION_STAGING_SERVICE_ACCOUNT_BASE64&lt;/span&gt;
    &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;develop&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;functions_deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;functions-build&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
    &lt;span class="na"&gt;key_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$PROD_SERVICE_ACCOUNT_PATH&lt;/span&gt;
    &lt;span class="na"&gt;key_env_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$FUNCTION_PROD_SERVICE_ACCOUNT_BASE64&lt;/span&gt;
    &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;functions_deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;executor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
    &lt;span class="na"&gt;key_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
    &lt;span class="na"&gt;key_env_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;working_directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/project/app/functions&lt;/span&gt;
  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/project&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;attach_workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/project&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add service account&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo &amp;lt;&amp;lt; parameters.key_env_name &amp;gt;&amp;gt; | base64 -di &amp;gt; ./keys/&amp;lt;&amp;lt; parameters.key_path &amp;gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Firebase Deploy&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./node_modules/.bin/firebase deploy --token "$FIREBASE_TOKEN" -P &amp;lt;&amp;lt; parameters.environment &amp;gt;&amp;gt; --only functions:hubspot,functions:users&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That should be it and you should now have a fully automated deployment with Vercel and Firebase for both the front end and backend on your staging and prod environment.&lt;/p&gt;

&lt;p&gt;I hope this has been helpful to you and that you learned a few things along the way, I surely did !&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>devops</category>
      <category>firebase</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to not learn Javascript</title>
      <dc:creator>mveillon</dc:creator>
      <pubDate>Mon, 25 Jan 2021 05:28:58 +0000</pubDate>
      <link>https://dev.to/matthieuveillon/how-to-not-learn-javascript-465e</link>
      <guid>https://dev.to/matthieuveillon/how-to-not-learn-javascript-465e</guid>
      <description>&lt;p&gt;When I was preparing for my bootcamp a year and half ago I was trying to figure out the best way to learn. (still figuring...). What I learnt finally over the last year, is not what is the best way to learn Javascript, but rather what doesn't work for me.&lt;/p&gt;

&lt;p&gt;So instead of recommending you what to do, I'm going to focus on what failed for me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resources overload&lt;/li&gt;
&lt;li&gt;Not knowing how to learn&lt;/li&gt;
&lt;li&gt;Too many topics at the same time (following my first job as a dev I had to learn Redux, c#, SQL, RxJs. Mixing all those together was a bad idea)&lt;/li&gt;
&lt;li&gt;Not Planning and Chunking&lt;/li&gt;
&lt;li&gt;Too much screen time&lt;/li&gt;
&lt;li&gt;Comparing to other too much&lt;/li&gt;
&lt;li&gt;Not being indulgent with yourself&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources overload
&lt;/h3&gt;

&lt;p&gt;What should I learn and what are the best resources to learn out there ? Those were the first questions I asked. And Google served me well there,&lt;br&gt;
with a lot of good resources and opinionated learning roadmap.&lt;/p&gt;

&lt;p&gt;I was literally trying to read too much. Anytime I was seeing a good article, or a link recommended by someone it was ending on a todo list somewhere.&lt;/p&gt;

&lt;p&gt;If you've been there, you might recognise you in the situation below :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- List of paid course on Udemy that you haven't even started (I'm talking about those 2yrs old course which are now outdated)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Trello backlog full of articles links that never shortens.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Medium bookmark section that is not even scrollable anymore.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bookmarking good content in itself is not a bad habit, but I felt like I would never catch up on my plan, which is kind of depressing.&lt;br&gt;
I'm still kind of there, but I decided to not bookmark medium articles neither buying udemy course anymore, unless I'm doing them right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not knowing how to learn
&lt;/h3&gt;

&lt;p&gt;Before switching career, I did some Coursera/PMP certifications, but there were short bursts, and the main objective was to get the certification - I was not paying attention on how I achieved this goal.&lt;br&gt;
When I entered the more technical field of web dev, it felt like a new world to me, where I would need to learn differently.&lt;/p&gt;

&lt;p&gt;At first my learning practice consisted mainly in reading article on a topic (according my never ending trello backlog), and then try to apply the learning in a side project.&lt;br&gt;
This was at first intuitive to me, but while I was learning Redux, it was dissatisfying.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First because, there were always some more resources or links to go through. I kinda felt depressed to find &lt;strong&gt;Mark Erikson&lt;/strong&gt; &lt;a href="https://github.com/markerikson/react-redux-links"&gt;awesome list or resources&lt;/a&gt;. as I felt like I should go through it .&lt;/li&gt;
&lt;li&gt;Secondly because, I was trying to learn everything upfront at the same time. (redux, redux thunk, redux-connect, rxJs)&lt;/li&gt;
&lt;li&gt;Finally, because after a while I thought I was forgetting my previous learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After I took a step back - I decided to make some corrections in my approach :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus my learning on specific platforms/authors.&lt;/li&gt;
&lt;li&gt;Chunking and Planning&lt;/li&gt;
&lt;li&gt;Learning by repetition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have a few authors who are my go-to mentors because I like the way they teach.&lt;br&gt;
When I can't find what I'm looking through them, then I go in the wild - not before.&lt;/p&gt;

&lt;p&gt;Chunking and planning is discussed just below.&lt;/p&gt;

&lt;p&gt;As regards for repetition, I remember when I was at school preparing for some exams, I created those flashCard - they were a pain to make,&lt;br&gt;
but by the process of making them and having them around allowed me to get the best marks I ever got and still remember them. Fast-forward 15 years later, I thought I could use some of this wisdom,&lt;br&gt;
by creating Cards on different learning topics. This works pretty well at least for high-lvl concepts, for example when you approach a new topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not Planning and Chunking
&lt;/h3&gt;

&lt;p&gt;My main objective for 2018 was to learn Redux, GraphQL and Advanced React Internals while working on a side project. I haven't touched GraphQL, very few of React internals, and my side project has seen  a few commits but way less than I would have expected.&lt;/p&gt;

&lt;p&gt;The culprit ? The preceding points for sure, but also the way I was planning my learning journey.&lt;br&gt;
Learning Redux is a big bold statement, but it didn't serve me well as I didn't feel I was making progress towards the overall goal.&lt;/p&gt;

&lt;p&gt;I should have before chunked Redux in some smaller part would have been preferable and more digest to learn.&lt;/p&gt;

&lt;p&gt;For 2019, I have some similar main goals (JS fundamentals - again..., GraphQL, Node) but in a way more specific manner. I try to chunk those big topic in weekly learning chunks, that I can apply in my side project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Too much screen Time
&lt;/h3&gt;

&lt;p&gt;I try to pay attention to my screen time - coming from project management world where meetings were the norm (for bad or for good),&lt;br&gt;
switching to dev was a huge increase into my computer hours. I feel it painful sometimes to go back at home to practice/learn to code in front of my computer.&lt;/p&gt;

&lt;p&gt;That's where I like flashcards and books. Not all resources are equals, and some books are more helpful to sleep than to learn.&lt;br&gt;
Adjust accordingly to your energy level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparing to other too much
&lt;/h3&gt;

&lt;p&gt;We're getting personal here, but during the bootcamp and through my first job year, I realized that I compared myself to my co-workers. A lot.&lt;br&gt;
Doing so prevented me to learn from my environment as much as I could as I felt diminished when I wasn't performing enough.&lt;/p&gt;

&lt;p&gt;It takes a lot of energy to manage this kind of emotion. This is a net loss that you cannot put in good use to learn from your coworkers or peers.&lt;/p&gt;

&lt;p&gt;I don't have the answer yet to this, but paying attention to this emotion and pattern allow me to avoid getting caught in too much.&lt;br&gt;
Knowing that my interest lies in welcoming learning opportunities rather than feeling diminished by them helps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not being indulgent/empathic with yourself
&lt;/h3&gt;

&lt;p&gt;This is kind of linked to the previous point. I have moment in my journey where I mostly focus on what I'm lacking or not doing well enough.&lt;/p&gt;

&lt;p&gt;When this happens I try to take a step back.&lt;/p&gt;

&lt;p&gt;Learning to Code is hard.&lt;/p&gt;

&lt;p&gt;Switching Career is hard.&lt;/p&gt;

&lt;p&gt;It's a long journey, and I should already be proud of where I am. So should you.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>First Job as a junior dev - find a place where you can build confidence</title>
      <dc:creator>mveillon</dc:creator>
      <pubDate>Mon, 18 Jan 2021 06:25:33 +0000</pubDate>
      <link>https://dev.to/matthieuveillon/first-job-as-a-junior-dev-find-a-place-where-you-can-build-confidence-4h5b</link>
      <guid>https://dev.to/matthieuveillon/first-job-as-a-junior-dev-find-a-place-where-you-can-build-confidence-4h5b</guid>
      <description>&lt;p&gt;I switched career at 33 through a bootcamp. A lot of us do it at various ages, some younger, some later on. I globally really enjoyed the ride and learning experience.&lt;/p&gt;

&lt;p&gt;During the bootcamp we were exposed to the concept of &lt;a href="https://fs.blog/2015/03/carol-dweck-mindset/"&gt;growth vs fixed mindset&lt;/a&gt;, at this stage the concept seemed to click - it was feeling comfortable, I was confident in my ability to learn and proud of my capacity to pivot.&lt;/p&gt;

&lt;p&gt;And then it happened after the first few months at my first dev job - I realised the hardest thing for me was to embrace &lt;strong&gt;being a beginner once again&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I don't consider myself having a big ego (but who does ? 🤔 ), nevertheless it became a hindrance after a few months when I was often comparing myself to other devs, most of them senior, all of them having a more valuable contribution to the company than me.&lt;/p&gt;

&lt;p&gt;I believe this feeling came from 2 main dimensions :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;my own mental capacity to cope with the career switch / impostor syndrome&lt;/li&gt;
&lt;li&gt;the job environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Impostor Syndrome / Self Doubts
&lt;/h3&gt;

&lt;p&gt;There is a lot of &lt;a href="https://www.codingdojo.com/blog/programmer-imposter-syndrome"&gt;good advices&lt;/a&gt; on how to cope with impostor syndrome over the internet.&lt;br&gt;
Impostor syndrome is mostly self doubts and as such can be difficult to handle.&lt;br&gt;
I don't have much more advices to share on the way to handle it from within yourself, but rather I want to focus on the second point where I might have a bit more concrete advices : &lt;strong&gt;picking a healthy job environment.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Job Environment
&lt;/h3&gt;

&lt;p&gt;During my first job hunt as a dev I tried to get the job with the best learning environment.&lt;/p&gt;

&lt;p&gt;Naively I thought that a company with a lot of senior dev + "standard best practices" would be the best to learn from.&lt;/p&gt;

&lt;p&gt;I was wrong.&lt;/p&gt;

&lt;p&gt;I ended up in a company which had a lot of senior devs, some of them being really impressive in their technical knowledge and problem solving skills.  I still learned a lot from them, but while months were going on I began to realize that the place was &lt;strong&gt;not feeling safe&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We're not talking about physical integrity but rather about an environment where it feels safe to learn / grow / fail. There is &lt;a href="https://rework.withgoogle.com/blog/five-keys-to-a-successful-google-team/"&gt;an interesting study on google teams&lt;/a&gt; or the well known book : &lt;a href="https://www.goodreads.com/book/show/21343.The_Five_Dysfunctions_of_a_Team"&gt;5 dysfunctions of a team&lt;/a&gt; which explains how this can be impacting.&lt;/p&gt;

&lt;p&gt;It's kind of difficult when you begin your dev career, to differentiate the impostor syndrome and its consequences (lack of confidence etc) versus a more rooted issue from the environment itself.&lt;/p&gt;

&lt;p&gt;The question always comes up as a personal issue till you're able to articulate it with other colleagues and you realise that the feelings are shared.&lt;/p&gt;

&lt;p&gt;Concretely here are some symptoms we were experiencing :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lack of encouragement&lt;/li&gt;
&lt;li&gt;Code review feedback lacked empathy&lt;/li&gt;
&lt;li&gt;We didn't feel our work was valuable to the company&lt;/li&gt;
&lt;li&gt;Subtle but constant pressure about our capacity to match senior output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are mostly perception related things and it could vary from one individual to another - but when they stack, they definitely create a non productive environment for those who are not confident enough by themselves.&lt;/p&gt;

&lt;p&gt;It often leads you to doubt about your skills, your learning abilities etc. When you switch career and don't have much experience to compare with, you can even doubt about your initial move of becoming a developer.&lt;br&gt;
This level of self-doubts affects obviously your personal life.&lt;/p&gt;

&lt;p&gt;This should be a red flag about the company and the environment, if you see it not only as a punctual feeling/experience you have, but rather a trend/direction.&lt;/p&gt;

&lt;p&gt;With some perspective now I feel there were several root causes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;company capacity to make junior dev grow&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cultural misfit&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first company, and I cannot blame them for that, was not used to recruit junior dev. They had a strong stable and trusted team for a long-lived product for which they were only recruiting seniors. It's difficult to be good at something you don't practice.&lt;/p&gt;

&lt;p&gt;Cultural fit is to me how you share values and you can relate to your colleagues. When difficult times arise (as it will), you will rely on this fundamental aspect to be able to communicate/articulate the issue. As those topics are already difficult to share, when you feel out of place, it will be all the more difficult to share and address them.&lt;/p&gt;

&lt;p&gt;In all honesty when we talk with my ex colleagues, we're still grateful for the experience as we learned a lot by just being in contact of great knowledgeable developers.&lt;/p&gt;

&lt;p&gt;But having now experienced others working environments - I think as a first job, the best learning environment is a place where it can feel safe to grow.  I don't say it has to be all comfortable and indulging (quite the opposite in fact) but rather an environment where you feel  you can tackle challenge and you can go out of your comfort zone while being supported.&lt;/p&gt;

&lt;p&gt;That's why I think it's an important skill to be able to assess those aspects early on in the recruiting process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get a first job where you can build confidence in your skill
&lt;/h3&gt;

&lt;p&gt;I understand that the situation is not identical for all students / junior dev and that we cannot always "choose" our first job - that being said, knowing how to assess your future job environment is a skill in itself, and that will be useful for all your other jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Company capacity to make junior dev grow :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my opinion, you can have a good idea of the company capacity to support the growth of junior dev by looking at :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;onboarding process&lt;/li&gt;
&lt;li&gt;junior dev turnover / frequency of hiring junior&lt;/li&gt;
&lt;li&gt;collaboration process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of those aspects can be assessed fairly well during the recruiting process, by asking questions such as :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the process to onboard new team members ?&lt;/li&gt;
&lt;li&gt;What are the expectations for a junior dev at 3 months, 6 months, a year ?&lt;/li&gt;
&lt;li&gt;Do you often onboard junior dev&lt;/li&gt;
&lt;li&gt;Do you have a Career Framework ?&lt;/li&gt;
&lt;li&gt;What are the values important to your team to ensure a  good collaboration ?&lt;/li&gt;
&lt;li&gt;What space/trust/ownership has a developer to explore some feature/aspect/optimization ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Special mention about the Career Framework - This is usually something which comes up when you have more than XX devs - therefore the lack of it might not be a red flag in itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cultural fit :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This can be trickier I feel to assess as there is a lot of "marketing" these days around it with culture books and shiny endeavour which do not always guarantee a concrete translation in a day to day work.&lt;/p&gt;

&lt;p&gt;I think this is best assessed by meeting team members and asking questions about their own journey / struggles and how you can relate to those.&lt;/p&gt;

&lt;p&gt;Meeting people that went through the same path/steps as you do will prove useful and will facilitate meaningful support when needed.&lt;/p&gt;

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

&lt;p&gt;As previously mentioned, and I want to reiterate, I'm still grateful for all my previous experiences and all the learnings that came out of it (technical or non technical related).&lt;/p&gt;

&lt;p&gt;That being said, we as fresh bootcamp student (or fresh graduates in general) tend to rush to accept the first offer. Despite the urge and pressure of doing that, we should be able to gauge a company environment in term of learning expectations not only through the tech stack but also through team dynamics, process and values.&lt;/p&gt;

&lt;p&gt;Genuinely foster a learning environment for all is a difficult task,  and we also have a responsibility as junior dev and future seniors to be a part of improving/creating it.&lt;/p&gt;

&lt;p&gt;Some resources to go beyond this post and inspire a broader perspective on the question&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=YL-6RCTywbc"&gt;a talk of Sarah May about power dynamic in agile teams&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://www.learninpublic.org/#learn-more"&gt;swyx excellent book on the coding career&lt;/a&gt;. There are specific chapters around the career guides section.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
