Johan Ronsse

  • Home
  • Projects
  • Blog
  • Thoughts on Tailwind CSS

    November 11, 2019 - Posted in css development - 4 comments

    I looked deeper into Tailwind this weekend. I was aware of this framework and its popularity, but I wanted to dive deeper into it as I was researching it for a future project.

    If you have to choose your CSS strategy in 2019, there are different options:

    • Use a framework that “comes with everything”: frameworks like Bootstrap / Foundation / Fomantic UI / …
    • Work with a utility first framework like Tailwind (…there’s probably others?)
    • Custom: build it yourself
    • A combination of the above
    • … (and probably something else I forgot now)

    And then, in regards to coding strategies, there are different techniques:

    • Just keep on adding CSS (would not really consider this a strategy…!)
    • BEM and ITCSS that can be combined well
    • Use something like styled-components or emotion to have CSS-in-JS – which puts you on an entirely different path. And which is definitely something you want to avoid, but that is a topic in itself.

    For development speed purposes, a framework is a good thing, especially if it has an underlying layer of Javascript components that are well maintained (I am thinking about the more complex things like datepickers, popovers, etc.)

    First up is a disclaimer, I am by no means experienced with Tailwind – I am merely looking into whether it’s a good idea to invest time in it in the first place.

    Feel free to counter my arguments in the comments and let’s make it a conversation.

    What is Tailwind? What’s the coding strategy?

    Tailwind is not as opinionated as most frameworks. It is a set of customizable classes, almost like a set of pre-defined design tokens that you can then use to customize your UI.

    This is interesting, especially if you create lots of different things with different looks. You can then change the tokens based on the project you are working on but use similar code to lay out responsive designs.

    The general code strategy is to use lots of utility classes to build up a component, for example (from the Tailwind homepage):

    <div class="bg-white rounded-lg p-6">
      <img class="h-16 w-16 rounded-full mx-auto" src="avatar.jpg">
      <div class="text-center">
        <h2 class="text-lg">Erin Lindford</h2>
        <div class="text-purple-500">Customer Support</div>
        <div class="text-gray-600">erinlindford@example.com</div>
        <div class="text-gray-600">(555) 765-4321</div>
      </div>
    </div>

    This code strategy leads to new problems, especially when used at scale. Most notably the problem with Tailwind is that your template code is littered with CSS classes. Below is an actual example from the docs for a simple card component.

    In my opinion this template code already looks complex, and there is not even any logic going on. So a real-life template could become a bit of a monster. And a real-life template is just one of hundreds in a web app codebase.

    In the Tailwind documentation there is a page called “extracting components” which talks about strategies to counter this problem. This is good as it shows the framework authors are aware of the disadvantages of their methodology.

    The first method the author argues for is to simply extract the code into a component, for example if you are using Vue, you would create a new Vue component and then put the markup in that component. In the “overview” page you can then run v-for loop so the markup for something like 6 items becomes 1 item. The author claims the code is clean enough that way, and the right abstraction is made.

    This might be the logical for some situations, but I am not sure about this for the reasons stated above – real world templates are just simply more complex than the stated examples. At least they are in the apps I am working on. However, your mileage may vary; I heard on Twitter that some people were very happy with Tailwind, but then they pointed to their small-ish websites as proof.

    The second method for reducing complexity is using something called @apply. This is a Tailwind-specific thing where you use @apply to combine Tailwind utilities into its own CSS class.

    For example:

    .btn {
      @apply font-bold py-2 px-4 rounded;
    }

    This would then make .btn available as a CSS class, with the consistent design tokens. The processing for this is done with PostCSS.

    I think this is interesting but then I worry about how this actually simplifies my code.

    Here is some button code from a recent project. This is BEM/ITCSS based. Warning, it is quite long. First up is just the layout code, this is not even about the different variants of the button. I made the code boxes scrollable so you can scan this blog post.

    /* ==========================================================================
      Component: Buttons
      ---
      This code is about button layout.
       ========================================================================== */
    
    /* Variables
       ========================================================================== */
    
    // Border radius
    $c-button-border-radius: 0.3rem !default;
    
    // Sizes (heights)
    
    $c-button-height: 3.6rem !default;
    $c-button-height-small: 3.2rem !default;
    
    // Font size
    
    $c-button-font-size: 1.5rem;
    $c-button-font-size-small: 1.4rem;
    
    // Line height
    
    $c-button-line-height: 2.4rem;
    $c-button-line-height-small: 1.8rem;
    
    // Horizontal padding (border included)
    
    $c-button-padding-horizontal: 1.6rem !default;
    $c-button-padding-horizontal-small: 1rem !default;
    
    // Spacing between icon and label
    
    $c-button-icon-spacing: 0.8rem !default;
    $c-button-icon-spacing-small: 0 !default;
    
    
    /* Default size
       ========================================================================== */
    
    .c-button {
      appearance: none; // Fix for Mobile Safari
      text-decoration: none; // to reset <a> element
      cursor: pointer;
      vertical-align: middle;
      border-radius: $c-button-border-radius;
      padding: (($c-button-height - $c-button-line-height) / 2) $c-button-padding-horizontal;
      font-size: $c-button-font-size;
      text-align: center;
      align-items: center;
      font-weight: 500;
    }
    
    a.c-button {
      display: inline-flex;
      justify-content: center;
    }
    
    button.c-button {
      appearance: none;
      margin: 0;
    
      &::-moz-focus-inner {
        border: 0;
        padding: 0;
      }
    }
    
    .c-button .c-button__content {
      align-items: center;
      display: flex;
      justify-content: center;
    }
    
    .c-button__label {
      line-height: $c-button-line-height;
      white-space: nowrap;
    }
    
    .o-svg-icon + .c-button__label,
    .c-button__label + .o-svg-icon {
      margin-left: $c-button-icon-spacing;
    }
    
    .c-button:not(.c-button--icon) .o-svg-icon:first-child {
      margin-left: -0.4rem;
    }
    
    .c-button:not(.c-button--icon) .o-svg-icon:last-child {
      margin-right: -0.4rem;
    }
    
    /* Small size
       ========================================================================== */
    
    .c-button--small {
      font-size: $c-button-font-size-small;
      padding: (($c-button-height-small - $c-button-line-height-small) / 2) $c-button-padding-horizontal-small;
    
      .c-button__label {
        line-height: $c-button-line-height-small;
      }
    
      .o-svg-icon {
        height: $c-button-line-height-small;
        width: $c-button-line-height-small;
      }
    
      .o-svg-icon + .c-button__label,
      .c-button__label + .o-svg-icon {
        margin-left: $c-button-icon-spacing-small;
      }
    
      &.c-button--icon {
        padding: ($c-button-height-small - $c-button-line-height-small) /2;
      }
    }
    
    /* Icon-only Button (Square)
       ========================================================================== */
    
    .c-button--icon {
      padding: ($c-button-height - $c-button-line-height)/2;
    }
    
    .c-button--small.c-button--icon {
      padding: ($c-button-height-small - $c-button-line-height-small)/2;;
    }
    
    /* Block button
       ========================================================================== */
    
    .c-button--block {
      width: 100%;
      text-align: center;
    }
    
    /* Link button
       ========================================================================== */
    
    .c-button--link {
      padding-left: 0;
      padding-right: 0;
      font-weight: 600;
      text-decoration: none;
      &:hover,
      &:active,
      &:hover svg *,
      &:active svg * {
        color: darken($color-primary, 15%);
      }
    }
    

    Then, we have the code for the color variants in the button. This code has been simplified for purposes of this blog post.

    /* ==========================================================================
      Component: Button Skins
      ---
      Rules of this file: you CAN'T touch the box model here, just colors.
       ========================================================================== */
    
    /* Variables
       ========================================================================== */
    
    $c-button-text-color: $g-text-color !default;
    $c-button-hover-border-color: $color-gray-150 !default;
    $c-button-outline-color: $color-primary !default;
    $c-button-focus-ring-color: $color-primary !default;
    $c-button-link-color: $color-primary !default;
    
    .c-button {
      transition: 0.18s background ease-in;
    }
    
    /* Primary
       ========================================================================== */
    
    .c-button.c-button--primary {
      border: none;
      background: $color-primary;
      color: #FFF;
    
      svg * {
        fill: #FFF;
      }
    
      &:hover,
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        background: darken($color-primary, 15%);
      }
    
    }
    
    /* Secondary
       ========================================================================== */
    
       .c-button.c-button--secondary {
        border: 1px solid $color-primary;
        background: none;
        color: $color-primary;
    
        svg * {
          fill: $color-primary;
        }
    
        &:hover,
        &:active,
        &.c-button--active,
        &:active:focus,
        &.c-button--active:focus {
          background: $color-brand-blue-200;
        }
    
      }
    
    
    /* Tertiary
       ========================================================================== */
    
    .c-button.c-button--tertiary {
      border: 1px solid $color-gray-200;
      background: #fff;
      color: $color-gray-700;
    
      svg * {
        fill: $color-gray-700;
      }
    
      &:hover,
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        background: $color-gray-50;
      }
    
    }
    
    
    /* Default
       ========================================================================== */
    
    .c-button.c-button--default {
      border: 1px solid $color-gray-200;
      background: #fff;
      color: $color-gray-700;
    
      &:hover,
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        background: $color-gray-100;
      }
    
    
    }
    /* Danger
       ========================================================================== */
    
    .c-button.c-button--danger {
      border: none;
      background: $color-red-500;
      color: #FFF;
    
      svg * {
        fill: #FFF;
      }
    
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        background: darken($color-red-500, 10%);
      }
    
    }
    
    /* Borderless
       ========================================================================== */
    
    .c-button.c-button--borderless {
      color: $c-button-text-color;
      background: none;
      border: 0;
    
      &:hover {
        box-shadow: inset 0 0 0 0.1rem $c-button-hover-border-color;
      }
    
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        background: $color-gray-100;
        box-shadow: inset 0 0 0 0.1rem $c-button-hover-border-color;
      }
    
    }
    
    /* Borderless
       ========================================================================== */
    
    .c-button.c-button--borderless-i {
      color: rgba(#FFF,0.5);
      background: none;
      border: 0;
    
      &:hover {
        box-shadow: inset 0 0 0 0.1rem rgba(#FFF,0.25);
      }
    
      &:focus {
        outline: 0;
      }
    
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        background: rgba(#FFF,0.1);
        box-shadow: inset 0 0 0 0.1rem rgba(#FFF,0.25);
      }
    
    }
    
    /* Shared disabled state for all buttons
       ========================================================================== */
    
    .c-button.c-button--primary,
    .c-button.c-button--default,
    .c-button.c-button--danger,
    .c-button.c-button--danger-hover {
      &:disabled,
      &.c-button--disabled {
        background: $color-gray-50;
        color: $color-gray-200;
        pointer-events: none;
        border: none;
      }
    }
    

    If we were to rewrite this last CSS partial to Tailwind, we might end up with something like this:

    /* ==========================================================================
      Component: Button Skins
      ---
      Rules of this file: you CAN'T touch the box model here, just colors.
       ========================================================================== */
    
    /* General
       ========================================================================== */
    
    .c-button {
      transition: 0.18s background ease-in;
    }
    
    /* Primary
       ========================================================================== */
    
    .c-button.c-button--primary {
      @apply no-border bg-indigo-600 color-white;
    
      svg * {
        fill: #FFF;
      }
    
      &:hover,
      &:active,
      &.c-button--active,
      &:active:focus,
      &.c-button--active:focus {
        @apply bg-indigo-700;
      }
    
    }
    
    /* Secondary
       ========================================================================== */
    
    .c-button.c-button--secondary {
        @apply border-indigo-600 bg-none color-indigo-600;
    
        svg * {
          @apply fill-indigo-600 // Q: How would I reference this variable in a way that works with the framework? Would I now have to make a set of fill utility classes?
        }
    
        &:hover,
        &:active,
        &.c-button--active,
        &:active:focus,
        &.c-button--active:focus {
          @apply color-indigo-200;
        }
    
      }
    }

    I can’t help but wonder where this kind of code change actually helps us. With the @apply rules you the order of the CSS specificity is much harder to see. You get into niche issues – like, is there a utility class for SVG fill? Does @apply even parse in nested SCSS? (I guess not, and you would have to convert all code to PostCSS logic?)

    I really don’t see how @apply would really help to improve the code to make it more legible or understandable. The only thing I can think of is that your design tokens stay consistent, but that’s what we have SCSS variables or native CSS variables for.

    Default payload + controlling file size

    The payload of Tailwind.css is +-475kb (huge!), which then they advice you can cut down by using PurgeCSS, a project to automatically cut down on the CSS used by scanning templates with a regex (More info can be found on the docs page about controlling file size.)

    My first reaction was that I sort of object to this way of working. Automatic removal of CSS can lead to bugs and untestable code.

    My feeling is that a real life codebase is just not as simple as scanning a few .html templates for whether a class occurs or not. Template code can come from a variety of places, it can get inserted dynamically through JS, you might build up class names dynamically… in my mind there is no way that a simple template scan can lead to good code.

    Just to understand which perspective I am talking from I will talk a bit about my projects. The framework I am working with currently powers over 50 projects. The last project I did was a monolothic web app with over 50 modules (not 50 templates, 50 different modules of functionality, so we are talking hundreds of templates).

    What if I fix a bug that only occurs inside an @print media query like I did just a few days ago? How sure am I that its code will remain in the CSS after running PurgeCSS? What if there is a bug in PurgeCSS? I find this a bit dangerous.

    But! There is a big but. Eliminating dead code is super interesting. If you would be able to automatically remove the right code, then that is super great. If you would get hints about which code can be safely removed, that is also very cool.

    I would need to know more about the PurgeCSS project and look more into it and how well maintained it is to make a final decision. From looking at the docs site it actually looks like quite a mature project, so the jury is still out.

    What speaks for Tailwind: better customizability

    All frameworks are made from a need, and a framework like Tailwind can definitely be helpful in a lot of cases.

    I think it is immensely helpful to make sure people default to good design choices. Especially if you are not that design-savvy this is great. The flipside is that you end up with something that looks very default.

    Tying in to the typical client wish for our agency projects to have a platform that looks branded, and incorporates just enough of the brand – a framework that (a) looks very – default – and (b) that is actually quite hard to customize will work against us.

    The fact that you can customize Tailwind by first putting in the right design tokens makes a lot of sense. You can customize frameworks like Bootstrap, but “not really”, in a sense that the skinning mechanism only goes so far. By tokenizing your design logic (i.e. padding is multiples of 8, colors are x, y and z) you can basically -really- customize a design instead of putting a slight visual change on a framework.

    Bootstrap vs. Tailwind when it comes to the resulting look

    Using Bootstrap we have a problem: the project will look too much like Bootstrap. Bootstrap comes with a specific default look, which you might to avoid specifically if you have custom brand needs.

    If you deliver custom designs (e.g. fully custom designs made in a design app like Figma) and then compare that to the standard look of Bootstrap, decide on Bootstrap as the base framework, you now have to marry the two. No matter how much work you put into it, the standard look of Bootstrap will always shine through. It seems like with Tailwind, you can entirely avoid that problem by using your own set of design tokens.

    PostCSS and its stability

    There’s other smaller reasons why I worry that Tailwind as a technology is not the best choice. It depends on PostCSS which is not as mature as SCSS. In fact, when I tried to install a PostCSS plugin for VSCode the first one I found was from an author who said she will no longer maintain it as she moved back to Sass/SCSS ?.

    My Friday night experiment night led me to a lot of unfinished Github projects, niche issues with PostCSS, PurgeCSS combined with Vue etc.

    I feel like these are not the kind of choices you want to make when you are developing a new project and you want the codebase to have some kind of longevity.

    Stable ground

    For any web app codebase you will want to use stable ground, frameworks that have proven themselves, and then customize that.

    Bootstrap is a great example of a framework that I have extensive experience with and that has proven itself over and over again for a good CRUD app. I am coming back to what I stated in the beginning of this post, a framework is powerful especially if it has an underlying layer of Javascript components that are well maintained.

    In our position as an agency delivering different solutions for different clients we will never have the time to dive so deep into every detail as the Bootstrap team did over the years.

    It is naive to think that if your project is 2 months long that you can do better than an open source project that has been worked on for 5+ years with thousands of contributors.

    My preferred methods – a bit about BEM/ITCSS

    I have very good experiences with BEM/ITCSS, so that’s where I am coming from, and that’s what I am comparing Tailwind based CSS against.

    A good BEM/ITCSS codebase is probably anyone’s best bet for the most custom look and to build upon for the future. But it does require certain skills to make it.

    BEM is a set of manual code conventions, and requires some specific knowledge to be able to follow. Not just any dev in the team can typically do a good job in a BEM environment. In my experience, in any dev team there’s only a small percentage of developers who are really into that front-end part and who really get how to write proper BEM-based CSS.

    Many developers simply don’t understand how to do it properly. That’s the reality out there. And we can’t be naive to that fact. It is because BEM is too hard to understand? Is it because too many people write production CSS when they really shouldn’t given their skillset? I don’t know, but I see a lot of bad BEM-based code, and that makes me think.

    I still believe it is one of the best methods to deliver a good code base. The reasons why are varied and I would have to explain the whole ITCSS metholody to make sense of it. This blog post is already way too long, so I am just going to focus on one aspect.

    If you have to start your project today, and you start with BEM/ITCSS, you can easily simplify the logic if you have scoped components in the future, because the right abstractions are already made (1 CSS file per component ).

    E.g. with BEM style CSS you could start with SCSS partials in your main SCSS file e.g. main.scss:

    @import _c-component.scss; // import the component
    @import _c-component-2.scss; // 2nd component

    In _c-component.scss:

    .c-component__child { }
    .c-component__child--state { }

    These are the styles for a single component (where .c- is a custom namespace for components)

    As the web will move on to newer tech, this can become simpler.

    For example, if you have a compiler like in Svelte that automatically scopes the styles to a component (a trend that I can see become really popular next 1-2 years), the code from the original BEM/ITCSS component can simply become:

    .component-child { }
    .component-child--state { }

    So, without the namespacing, but still with the double dash (--) naming convention for --state – because it still makes sense to see the difference.

    So my point is that you can easily refactor a BEM/ITCSS based codebase to a styles-per-component style codebase in the future.

    In some cases, depending on the framework, you could even do away with giving everything a CSS class. Here’s a link to a Svelte component where all the styles are very simple, just because they are scoped to its own component. This is not unique to this REPL, it’s the case for every Svelte component.

    With the kind of CSS scoping provided by the compiler you can even directly style <button> in a component itself which is awesome for custom components. No more inventing of the umpteenth variation of a button and giving it a specific name.

    (Do note this example is just a code example, a real finished component would be prettier.)

    I believe this kind of CSS scoping is the future, but while Svelte is only now getting popular, and we need to ship code today, sticking to BEM/ITCSS for a while is a logical thing.

    Especially because it is not tied to any given JS framework, and because of its set of conventions you can easily refactor it to a simpler version if called for; you could do a global search on all .c- substrings within all _(.*).scss partials and you would be literally done in minutes to simplify the code.

    Now, what does all of the above have to do with Tailwind? Well, if you litter hundreds of templates with hundreds of utility classes, you are pretty much ****** if you ever decide to refactor the codebase.

    That would be one of my main worries with Tailwind, and that’s why I would probably only use it for smaller projects.

    The problem then is that for smaller projects, I don’t want the burden of a framework – I will just write things custom, even in plain CSS, not even using SCSS, and be much faster.

    The point of a framework is re-use. But then again, Tailwind is maybe not a traditional framework, but it does come with the “stack burden” of a framework (e.g. a specific way of compiling and cleaning your CSS).

    I am aware that I have other “resources” than a single developer (I am a designer – we have a whole design team that can come up with good designs) so I can definitely see the usage for a developer who is not that design-savvy.

    Conclusions

    Like most technology choices, Tailwind has things going for it and comes with its own set of disadvantages. I am not entirely convinced but the framework is interesting enough that it triggered me to write this super long blog post, so that’s something.

    There are definitely good ideas in there and I will have to use the framework in practice to come up with a more conclusive opinion.

  • Blijven bijleren

    November 5, 2019 - Posted in development javascript react

    Ik heb een tijd geleden online een gast leren kennen die bij Netlify werkt, die een hele interessante filosofie heeft: #learninpublic. Het komt er op neer dat hij op zijn blog vanalles post, screencasts maakt met uitleg, en door het gesprek errond veel bijleert, maar tegelijk anderen inhoud geeft waar zij uit kunnen bijleren.

    Ik vind dat een intrigerende manier om om te gaan met de complexiteit van web development. Als je er van uit gaat dat niemand het grote gelijk heeft, dat iedereen ook maar aan het leren is, en dan deelt waar je mee bezig bent, dan kan iemand anders daar van leren.

    Voor mij heeft november een beetje een React-thema. Daar wil ik wat meer over bijleren. De resources rond Svelte zijn beperkt en ik wil weten hoe je productief in een React codebase kan werken.

    De insteek is een betere deliverable. Je kan met HTML/CSS templates maar zo ver gaan… en dan moeten die nog vertaald worden naar een front-end framework. Ik heb me lange tijd afzijdig gehouden van daar in te werken (met de logica “dat is voor de programmeurs” of “wij doen enkel het presentational deel”), maar ik voel nu de nood om er toch in te investeren om uiteindelijk een betere UI te kunnen afleveren.

    Zeker omdat wij zien dat ons prototypes soms té lang blijven leven als 2e codebase, met alle maintenance vandien, wat volgens mij niet gezond is. Het voordeel daaraan is dan weer dat die tot nu toe niet de framework-du-jour volgen (yay for permanence), maar aan de andere kant valt sommige CSS-logica — BEM/ITCSS om maar iets te noemen — ook compleet weg afhankelijk van je framework en zijn capaciteiten (e.g. dead code removal, automated CSS scoping).

    Binnenkort komt Bram een workshop geven om ons React-niveau wat op te krikken. Daarnaast ben ik vorige zaterdag begonnen aan deze React: Creating and Hosting a Full-Stack Site. Ik heb de talk over React Hooks bekeken. Als iemand nog aanraders heeft, is dat zeker welkom. #learninpublic

  • Sim Racing (4)

    October 26, 2019 - Posted in games simracing

    In de vorige episode ging het nog over verschillende games testen, waarna ik uiteindelijk op Gran Turismo Sport was geland.

    Dat is het spel dat ik de laatste tijd het meest gespeeld heb.

    David Perel, mijn huidige raceheld (check zeker de man zijn YouTube kanaal) , zei eens dat sim racen een beetje is zoals trainen. Hoe meer je traint, hoe beter je wordt.

    Ik heb dat ter harte genomen, en ik “train” dus op mijn sim racen om telkens beter te worden. Ik ben ook real-life beginnen trainen maar dat is een ander topic.

    Een deelaspect van beter worden is volgens mij analyse van je werkpunten. Daarom ben ik begonnen met video’s te maken, om duidelijk te kunnen zien waar ik bv. een slechte rijlijn neem of waar ik iets sneller zou kunnen zijn.

    Vorige week maakte ik deze video over de Daily Race B.

    Gran Turismo – Daily Race B – Dragon Trail Seaside – 1:30:806

    Toen heb ik gemerkt dat als je de input (brake/acceleration) niet kan zien dat het niet zo nuttig is om een filmpje te hebben. Dat kan beter dacht ik. Vandaag maakte ik een 2e filmpje waar je de inputs op kan zien.

    First online victory at Suzuka (Daily Race B.)

    In deze video geef ik uitgebreid commentaar op een race. Voor mij is dit ook weer een manier om wat bij te leren over video’s bewerken.

    Het lastige hier is dat je dus constant je PS4 beeld moet opnemen via de “broadcast gameplay” functie. Er bestaan ook van die Elgato bakjes, maar dat is weer een kostelijke affaire.

    En hetgene mij daar vooral in tegenhoudt is dat je dan ook een ontvanger moet hebben, een PC dus, en mijn gaming setup staat op een ander verdiep dan mijn PC. Enige praktische bezwaren dus. Moest Apple nu eens een deftige laptop uitbrengen had ik nooit een iMac gekocht. Maar ik wijk af.

    Volgende stap: betere kwaliteit. Een beter verhaal vertellen. En misschien eens experimenteren met een camerabeeld van het stuur/de pedalen zelf.

    In de reeks “tijden” om te vergelijken binnen 6 maanden:

    • Gr 2 – Dragon trail Seaside – 1:30:806 (Xanavi Nismo)
    • Gr 3 – Suzuka – 2:03:186 (Audi R8)

    Sim racer out!

  • Kandidatuur – Raad van Bestuur Jong VLD Nationaal

    October 24, 2019 - Posted in jongvld politiek

    Ik ben kandidaat voor de Raad van Bestuur voor Jong VLD Nationaal. In deze blog post vind je de twee redenen waarom ik jouw stem verdien.

    Ik heb mij enkel kandidaat gesteld voor de Vlaamse kring, omdat ik tegen de provincies ben. Daar zou ik een heel epistel over kunnen schrijven maar dat ga ik u besparen.

    1. Een beter congres – Werken vanuit de inhoud

    Ik ben nieuw in de politiek sinds januari 2019. Na een exploratie op lokaal niveau was het me duidelijk dat mijn interesse vooral lag op Federale en Vlaamse onderwerpen.

    Ik wil mij verder verdiepen in de thema’s die mij dierbaar zijn: openbaar vervoer, digitalisering, ondernemen, werkgelegenheid, subsidiëring (en de nood daaraan) en fiscaliteit.

    Ik wil met kennis van zaken kunnen spreken over belangrijke topics die iedereen aangaan, en werken aan oplossingen om het beter te doen. En ik wil anderen helpen om dat ook te doen.

    Ik ben daarom het meest geïnteresseerd in meewerken aan congressen en inhoudelijke debatten. De enige manier om politiek sterk te staan is door kennis van zaken te hebben. Als je niet waarover je spreekt, word je zo onderuit gehaald in een debat.

    Eerste tussenkomst in februari 2019 op het jongerencongres.
    Mijn 1e reactie na de verkiezingsuitslag

    2. Een betere website – Betere online communicatie

    Als lid van de Raad van Bestuur van Jong VLD Nationaal wil ik in het bijzonder de online communicatie van Jong VLD verbeteren.

    Ik wil zorgen dat mensen die interesse hebben om zich aan te sluiten bij Jong VLD een duidelijk pad hebben om dat te doen.

    Momenteel hebben we een redelijke slechte Wix website en ik heb grote plannen om die om te vormen naar iets beters. Vanuit mijn verleden als webdesigner en huidig werk als UI/UX designer kan ik mijn steentje bijdragen.

    Ik zoek daarvoor trouwens nog vrijwilligers om iets moois te bouwen.

    Waarom RvB Nationaal?

    Ik weet dat je geen lid van de Raad van Bestuur moet zijn om een engagement uit te dragen voor Jong VLD.

    Maar vanuit het bedrijfsleven weet ik dat het wel helpt om in een positie van beslissingsname te zitten om effectief iets te kunnen doen en uitvoeren.

    Daarom wil ik lid zijn van de RvB. Dit om ook te kunnen kiezen voor het juiste kernbestuur.

    Samengevat

    Samengevat – wil je een betere Jong VLD website? Wil je dat we inhoudelijk sterker staan als partij? Wil je een beter georganiseerd congres? Stem Johan Ronsse.

    Kandidaat Jong VLD Nationaal – Raad van Bestuur

  • Kwaliteit, deel #304

    October 17, 2019 - Posted in nederlands rant - 1 comment

    Ik wil over het algemeen niet teveel zagen over kwaliteit, en al zeker niet te veel kritiek geven op het werk van anderen, maar als ik rond mij kijk is er nog bijzonder veel werk.

    Overheidswebsites die niet toegankelijk zijn, terwijl dat wettelijk verplicht is sinds september. Agencies die met werk afkomen dat objectief slechter is dan tien jaar geleden omdat de developers enkel Javascript hebben geleerd op school.

    Functionele webapps van bedrijven die opgebouwd zijn met een stevige overheidssteun die 2 dagen down zijn.

    Websites die een loopje nemen met je privacy… zelfs de website van het ziekenfonds geeft je zoekopdrachten door aan derden. Hoe kan dit?

    Ik blijf elke dag vechten voor kwaliteit, op het web en in software, maar ik zou het waarderen moesten wat meer mensen dat doen.

    Ik heb soms het gevoel dat heel wat mensen de fundamenten missen van waar ze nu eigenlijk mee bezig zijn.

  • Writing Javascript data objects for beginners

    October 7, 2019 - Posted in development javascript

    There is a difference between JS data objects and JSON, but let’s not go into that for the purposes of this post.

    Let’s keep it simple.

    Create a new text file. Open 2 square brackets (create an array).

    [
    
    ]

    Start an object:

    [
        {
        
        }
    ]

    Within the object, set a key and a value.

    [
        {
            "title": "My title"
        }
    ]
    

    Repeat your object if you want multiple entries:

    [
        {
            "title": "My title"
        },
        {
            "title": "My title 2"
        }
    ]

    Let’s go back to 1 entry to make this shorter, and let’s add some more properties.

    [
        {
            "title": "My title",
            "date": "September 27, 2019",
            "content": "My blog post content"
        },
    ]

    Now let’s go back to 2 entries to have a logical endpoint to “loop over”.

    [
        {
            "title": "My title",
            "date": "September 27, 2019",
            "content": "My blog post content"
        },
        {
            "title": "My title 2",
            "date": "September 29, 2019",
            "content": "My blog post content 2"
        },
    ]

    Now you can use this object over in various templating languages or just using plain Javascript.

    Here’s an example of a loop with this data object in the Svelte REPL.

    Here’s a Codepen using Pug.

  • Deze politieke week

    October 5, 2019 - Posted in belgische-problemen politiek vlaams parlement - 1 comment

    Op maandag was het bekend dat er een akkoord was voor de Vlaamse regeringsvorming. De krijtlijnen werden aangekondigd op een persconferentie rond de middag. De tekst van het Vlaamse regeerakkoord zelf kwam dinsdag rond 13u online, een dikke 300 pagina’s.

    Ik heb zelf wegens werkverplichtingen en door ziekte geveld dit nog maar deels kunnen doornemen. Dus mijn mening heb ik nog niet helemaal gevormd. Maar over deze week kunnen we wel wat vertellen.

    Congres voor de vorm

    Diezelfde avond hadden de 3 meerderheidspartijen dan allemaal een congres. Als lid van 1 van die partijen zou je het regeerakkoord dan moeten goedkeuren, met dus zelfs geen avond ertussen om het te lezen. Dat deze timing een beetje belachelijk was en dat enige ledenbekrachtiging dan maar gewoon voor de vorm was moet ik niemand vertellen.

    Dat die partijcongressen gewoon een goednieuwsshow waren vond ik nog enigszins aanvaardbaar. Er zijn betere momenten om uw politieke stempel te willen drukken dan de bekendmaking van een regeerakkoord. Na een lange en moeilijke onderhandeling gaat de partijtop niet terug naar de andere partijen gaan omdat 1 van de leden “iets heeft gezegd op het partijcongres”.

    Nu, moest er iets in staan dat écht niet door de beugel kan, kan het dan wel zijn dat de leden de regeringsdeelname wegstemmen. Dus daar zit een zekere “check” in die op zich welkom is in woelige tijden.

    Je moet redelijk zijn, als in je statuten staat dat de leden iets moeten goedkeuren, moeten ze ook de kans hebben om het te lezen.

    Particratie at work

    Zoals sommigen wel weten ben ik sinds kort actief bij Open VLD (en Jong VLD). Ik heb momenteel geen sterke politieke ambities maar ik ben wel actief geworden binnen de partij omdat de politiek me interesseert, en ik me in de liberale partij het beste kan vinden. Ik vind het momenteel interessanter om mijn bedrijf te runnen dan te gaan voor een politieke carrière, maar ik sluit niet uit dat ik er later iets mee doe. In tussentijd maak ik mij nuttig waar ik dat zelf kies. Mijn favoriete activiteiten zijn de inhoudelijke, als het echt over de politieke inhoud kan gaan.

    Ik kan door mijn positie lekker mijn eigen mening zeggen, want ik heb weinig te winnen of te verliezen… ik word niet betaald door de partij, ik ben gewoon lid en ik heb een mening. Ik moet niet specifiek snel doorstoten of iets dergelijks. Ik kan gewoon mijn eigen mening verkondigen en ik ben van plan dat te blijven doen. Ik heb soms de indruk dat er veel volgers zijn die wel schrik hebben om te zeggen wat ze denken. De particratie is erg stevig in België. Daar schreef ik ook een stukje over – voer voor een latere blogpost.

    Deze politieke week had ik vooral bewondering voor enkele leden binnen de eigen partij die op een correcte manier voor hun mening opkwamen: well done “dissidenten” Lieselotte Thys, Sihame el Kaouakibi en Hans Maes.

    Speeltuin Vlaams Parlement

    Het politieke schouwspel deze week deed me meerdere keren mijn wenkbrauwen fronsen.

    Zo waren er mensen van “de oppositie” die al een regeerakkoord konden neersabelen voor het gelezen te hebben. Ik moet misschien eens stoppen met Twitter, want dat is eigenlijk niet goed voor mijn hart.

    Dan was er het gedoe met de cijfers. Een Mr. Jambon die op een sponsordiner verkondigt voor eigen kerk dat hij de cijfers al wel heeft maar ze nog niet wil geven. Erg onhandig. Waarom niet gewoon verklaren dat het altijd even duurt eer je de berekening hebt gedaan nadat je tot een akkoord bent gekomen? Je hebt altijd al cijfers, ze zijn gewoon nog niet afgewerkt. 

    Als toppunt van de week was er de escalatie op vrijdag ochtend: het parlement dat leegloopt nog voor de vergadering goed en wel was begonnen, met een afgelaste middagvergadering. Argumentatie was dat er geen cijfers waren. In mijn ogen kan je op een 300 pagina’s dik document ook inhoudelijke kritiek geven zonder cijfers. Moet je daarom weglopen? Als je wegloopt zet je jezelf uit het debat. Dan moet je in feite dezelfde vergadering de volgende week plannen, en zo verlies je tijd. Wat heeft de oppositie ‘s middags dan gedaan op vrijdag? Boos een terrasje gaan doen? Ik hoop dat zij vanuit hun functie dan toch tenminste de tijd hebben genomen om het regeerakkoord grondig te bekijken. 

    Dat de cijfers moeten berekend worden na de landing van een regeerakkoord lijkt me de normaalste zaak van de wereld eigenlijk. Dat je dat zo veel mogelijk in de onderhandelingen zelf doet ook. Maar je moet in mijn ogen redelijk zijn in de timing van de dingen. Als je een akkoord afklopt kan je het becijferen. Tijdens de onderhandeling werk je met tijdelijke cijfers. Erna kan je gaan naar definitievere cijfers. Is het zo moeilijk om hier een gedachteredenering over op te bouwen?

    Blijkbaar komen ze bij Groen en Sp.a niet verder dan de gedachte: “ik heb geen cijfers dus ik kan niks doen”. Hebben zij geen eigen studiedienst met cijfers waar ze de voorlopig aangekondigde beslissingen aan kunnen aftoetsen?

    Het is trouwens bijzonder spijtig dat het een partij als Groen fulmineert over het gebrek aan cijfers, maar in de Brusselse regering zelf al 2 maanden geen cijfers heeft. Er moet toch enig besef zijn dat het even duurt eer je alles bij elkaar hebt (ja, ja, ik realiseer mij dat ook Open VLD in de Brusselse regering zit – en dat Sven Gatz minister van begroting is).

    Daarnaast herinner ik mij ook een slecht becijferd klimaatplan voor de verkiezingen. Je kan veel roepen maar je moet ook zaken in de praktijk kunnen brengen. Dat is nu nét mijn probleem met Groen.

    Voor de oppositie lijkt het soms bijna alsof ze het bewust niet willen begrijpen. In interviews met zowel SPA (Conner Rousseau) als Groen (Björn Rzoska) wordt er gefocust op het gebrek aan cijfers. Er wordt gesproken over “holle woorden” en “geen echt debat willen aangaan”, maar voor mij is het wel duidelijk wie er geen debat wou aangaan.

    Laten we in het algemeen alsjeblieft in het algemeen stoppen met focussen op kleinigheden en het uitvergroten van 1 zinnetje. Zo ga je geen werk gedaan krijgen. Ja, een spelletje spelen op je GSM is niet OK. Ja, het was een onhandige uitspraak daar bij Doorbraak.be. Maar alstublieft.

    Neem je job serieus. Er zijn belangrijke beslissingen te nemen die iedereen aangaan. Laat het over de inhoud gaan en niet over de vorm.

    Ieder parlementslid moet een kritisch debat aangaan over wat er in het regeerakkoord staat en wat dat betekent voor de samenleving. Deze week misschien zonder de exacte cijfers. Volgende week met wat meer cijfers, en de week erna met misschien nog wat meer cijfers. Er is zoveel te leren en te weten.

    Zouden de parlementsleden weten wat het gemiddelde budget is van de Vlaamse overheid? Zouden ze weten wat de verdeling was van de kostenposten in de vorige regering? Cijfers of geen cijfers, er zouden wel eens een paar anciens door de mand kunnen vallen bij zulke vragen denk ik.

    Ik zou daar trouwens ook niet op kunnen antwoorden. Maar ik ben mijn eigen kleine studiedienst. Ik schrijf het op wanneer ik iets nuttigs zie en breidt mijn kennis uit. In mijn vrije tijd. Als dit je job is en je bent ervoor verkozen door het volk heb ik als burger verwachtingen.

    Referenties:

    • De Standaard – 5 oktober – De macht speelt spelletjes
  • Sim racing (3)

    September 21, 2019 - Posted in games simracing

    Zie de vorige delen in deze reeks:

    • Sim Racing (1)
    • Sim Racing (2)

    Nooit gedacht dat een nieuwe hobby zo’n blijver ging zijn. Na het uitgebreid testen van Assetto Corsa 1 was ik op een bepaald moment de ongebalanceerde AI van het spel een beetje beu en keek ik naar andere horizonten.

    Zelfs met de hulp van de hoofd-developer van Kunos zijn YouTube video’s (#1, #2) lukte het mij niet om bepaalde stukken in de career mode te verslaan. Online vond ik ook klachten over de ongebalanceerde career mode op de PS4-versie. Ik heb wel wat vermogen om iets een aantal keren te proberen maar er is ook een grens. (Misschien lag het ook gewoon aan mijn skills.)

    Logische 1e test was Assetto Corsa Competizione: een spel voor PC, dus hup, de sim racing setup verhuisd van “het salon” (beneden) naar mijn werk bureau. Mijn collega’s hebben een paar weken een PlaySeat in de achtergrond zien staan. Zeer professioneel, dat.

    Met dat ik eindelijk terug een computer heb waar je effectief een stukje op kan gamen, begon ik eraan. Mijn ACC ervaring was interessant getimed met de real-life F1 races van Spa Francorchamps en van Monza, twee circuits die ook beschikbaar zijn in het spel.

    Het spel is grafisch impressionant, de nachtraces zijn cool en het spel zit over het algemeen interessant in elkaar. Maar er miste iets. Ten eerste was het minder fijn gamen dan op mijn TV + PS4. Ten tweede was het opeens wel heel – heel moeilijk. Dus dan besloot ik: misschien moet ik maar eerst beter leren racen in een andere klasse.

    Simracende vrienden spreken lovend over iRacing. Dus, ik aan de iRacing. Na een web formulier dat precies uit 1998 kwam ingevuld te hebben op een redelijk verdacht uitziende website en 12*3 dollar (denk ik) te hebben overgemaakt via PayPal voor 3 maanden iRacing kon mijn iRacing ervaring beginnen. Het begint met een MX5 op Laguna Seca. In oefenmode, zodat je “iRating” niet omlaag gaat. Ik ging een keer in een practice race en botste tegen iemand en werd direct naar het hoofd geslingerd dat ik de track offline moest leren. Euh, OK, ik dacht dat deze lobby “practice” noemt for a reason? iRacers don’t mess around.

    Laguna Seca is een leuk circuit en de MX5 is een fijn karretje maar wel iets heel anders als je van de group 3 auto’s komt. Dat was leuk voor even maar na de 40e ronde keek ik ook eens naar iets anders.

    Als ik dan eens keek naar wat voor anders er in het spel zat, dan kwam ik vooral veel content tegen die €15 het stuk kostte. Een Ferrari voor €15 hier, een track van €15 daar – allemaal misschien legit als het laser scanned content is die nergens anders verkrijgbaar is, maar als beginnende sim racer heb ik nog veel te verkennen – in andere games waar ik al voor betaald heb.

    Ik was ook super unimpressed door het Silverstone circuit in iRacing. En eigenlijk over de graphics in het algemeen. En de randomness van de base content. Ik ben echt niet geïnteresseerd in van die NASCAR achtige circuits. De force feedback was ook niet echt je dat (ik heb nu geleerd dat het een setting is… dus later nog eens testen). Dat was de druppel om terug te switchen van game. (Wees gerust R., ik geef het later nog een kans!)

    Dus, eerst terug naar Assetto Corsa Competizione. Na ongeveer de helft van de career mode gespeeld te hebben (klinkt uitgebreid maar na 2-3 avonden zit je daar al) een aantal conclusies. Ten eerste, het is leuk om een circuit als Zolder te leren, dat is in het echt in de buurt, en het is goed je circuits te kennen voor toekomstige real-life ervaringen. Twee, als je een track van één spel kent dan kan je het makkelijk in een ander spel toepassen (de Hungaroring reed ik al in F1 2018). Ten derde, Misano World Circuit is een erg cool circuit. Na 5 rondjes kwam die al in mijn top circuit lijst*.

    Maar weer bekroop me het idee dat ik een beetje aan het sukkelen was en dat ik op een andere manier beter kon worden. Ook de online kritiek op ACC deed er geen goed aan om verder te investeren in dit spel.

    Vrienden raden me al eens “one track, one car” aan. Zijnde dus dat je zo lang mogelijk 1 circuit met 1 auto moet oefenen. Dat klopt tot op een zekere hoogte, maar ik argumenteer daar ook tegen dat dat gewoon veel te saai is.

    Ik heb een beetje variatie nodig of het is niet interessant. Voor mij zit er ook veel plezier in tracks en auto’s leren kennen. Zo heb ik een rare fascinatie gekregen voor wat ik vroeger als johnnybakken beschouwde. Dus, beste vrienden & familie, als ik opeens in een getunede VW Sirocco kom aanrollen: blame simracing.

    Er zijn ook veel mensen die claimen dat je eerst met een lagere klasse moet leren rijden om met een hogere klasse te kunnen rijden. Dat is wellicht correct en goedbedoeld advies, maar het is ook een game, het moet een beetje plezant blijven. Liever een Huracan “onder mijn gat” dan een Renault Clio. En in mijn ogen word je door met een Clio te rijden enkel maar beter in met een Clio rijden…

    Na een zondagse sim racing sessie met een makker waar ik nog eens Assetto Corsa 1 had opgestart vond ik de variatie die ik zocht terug: driften met een AE86 op een landweggetje. Een MX7 race op Imola. Scheuren met een Ferrari 488 op de old-school layout van Monza. Jaaa! Hier kan ik enthousiast van worden.

    Dit in combinatie met enkele YouTube video’s van de kanalen die ik ondertussen volg — David Perel (aanrader!), Jimmy Broadbent, EIRISS en Super GT — bracht me terug bij een game die ik eigenlijk al 2 jaar geleden had gekocht: Gran Turismo Sport.

    In een oud interview met de makers ging het erover dat zij de game zagen als een ervaring die mettertijd zou groeien, en dat ze van het principe waren dat ze mensen konden leren racen via het spel. Met dit en de enorme variatie die dit spel te bieden heeft in het achterhoofd gaf ik het een nieuwe kans.

    Ik heb Gran Turismo altijd te “arcadey” gevonden en nooit echt beschouwd als een simulator, maar hier moet ik me dus corrigeren. Het is effectief een simulator, en zelfs een behoorlijk verregaande (ook hier pro tip: zet de force feedback op maximum!)

    Het zit gewoon in een commercieel gelikt jasje waardoor je in de indruk hebt dat het heel toegankelijk is. Dat is het ook, maar om toptijden te halen, online races te winnen en (in de single player mode) alle “gouden bollen” te verzamelen zal je als racer serieus zweten.

    Je hebt in Gran Turismo, net als in iRacing, het concept van een “safety rating” en een “driver rating” (Ik denk dat het in iRacing een gecombineerde rating is). Je gedraagt je dus maar beter op het circuit of je zal laag ranken. En laag ranken betekent: racen tegen mensen die het een goed idee vinden om er een botsauto feest van te maken. En da’s net niet plezant.

    Vanaf je in Gran Turismo een beetje betere tijden dan de gemiddelde persoon haalt, dan begint het plezierige deel. Dan ben je aan het racen tegen mensen met hetzelfde niveau. Nek aan nek races waar je strategisch moet bekijken waar je juist remt, hoe je rempunt verschuift omdat je in de slipstream zit, hoe je een andere lijn volgt op het circuit dan anders om strategische race redenen,… het is uitgebreid en plezant. Ik heb na wat effort een 3e plaats gehaald in een online race en dat voelde aan als een achievement.

    Nu hoop ik ooit wel eens eerste te zijn… maar daar is dus nog werk aan. Ik zie mijn skills beetje bij beetje evolueren. Ik zal me troosten met het feit dat Nico Hülkenberg als 170 keer op de F1 grid is gestart en nog nooit gewonnen is. De aanhouder wint.

    Daar ben ik dus momenteel mee bezig. Het is iets raars, dat racen. Het is eigenlijk veel dieper dan je zou denken. En het is spannend en interessant als je er wat meer over weet. Voor mezelf, voor binnen zes maand, twee recente records waar ik wel blij mee ben:

    • GT Sport – Red Bull Ring – Huracan (Gr3) – 1:30:841
    • GT Sport – Nordschleife – BMW M6 (Gr3) – 6:56:352

    Ik heb nogal eens de neiging om van hobby’s te wisselen. Gaat deze hobby een blijver zijn? Voorlopig denk ik van wel. Deze sim racer groet u.

    *De Lijst, momenteel:

    1. Red Bull Ring
    2. Misano
    3. Mugello
    4. Spa Francorchamps
    5. Imola
    6. Silverstone
    7. Nurburgring GP
    8. Nordschleife
    9. Autopolis
    10. Hungaroring
  • Skilliverse demo

    September 16, 2019 - Posted in data-visualisation development svelte

    A demo I made of my “skilliverse” app that I made with Svelte.

  • Improving my programming skills

    September 14, 2019 - Posted in computers development interface javascript side-projects svelte

    Somewhere this year I started a journey to learn some more Javascript, mostly triggered by wanting to reach a next level in terms of user interface. In August the learning suddenly accelerated fast, mostly by getting excited about Svelte and finding myself with some extra time on my hands for the first time in a long time.

    I built a few demos and things got rolling. I built work upon other work and was happy with the results which motivated me to work more and more.

    View this post on Instagram

    #sideproject #svelte #radarchart #programming #ipad

    A post shared by Johan Ronsse (@wolfr_) on Aug 26, 2019 at 6:39am PDT

    I’ve learned a bit of Javascript over the years, mostly some jQuery things to manipulate the DOM and some practical knowledge like how to work with certain plugins like HighCharts or Select2. I think I even once wrote a (poorly architected) plugin. But I have never really learned the basics since I have never really needed them. I’ve been vaguely aware of the different string manipulation methods and how to call events to do something with the DOM and I could do something relatively standard like implement a library and then maybe change it a little bit, but nothing more than that.

    I’ve hacked away on our prototype project Bedrock occasionally over the past few years but this was mostly modifying code that someone else wrote. I’ve always been enchanted by the idea of node.js — with the possibility of being both server & client — and the fact that it can access the file system.

    This makes me feel like I has the possibility to write “real” apps as most of the professional things I want to do involve automation and that in turn needs a lot of file handling. I never got to that of course as my focus is on UI design.

    In general I’ve kept away from writing too much JS in my day job for the past years, mostly focussing on the UI designs themselves and delivering well-architected HTML and CSS to help the developers on their way to build the entire UI in a full stack environment (And now coaching others to do so as well)

    I also don’t like spending hours on something when I know that I will be inefficient at doing it. I would rather leave the JS work to the persons who I always jokingly call the “real programmers”.

    I want to change that and start writing more JS in my day to day. First of all I feel like I reached a knowledge level where I have similar skills as the “real programmers” anyway. It’s not a competition BTW, that’s just an observation for myself to feel certain enough to do programming types of tasks in a (paid) project context. In the end we have to work together to make great products.

    Next to that our team is growing and there are more people with more skills in it that can also teach me a thing or two about modern JS.

    We’re not going to turn into a development company overnight now. We’ve always been designers that use code as a means to an end – to explain an interaction, to show what is possible responsively.

    I just feel like I just need to know more about manipulating what’s on the screen in a programmatic way to reach a next level in UI. You can only do so much if you stick to HTML and CSS. At some level I also feel like the standardista’s I grew up with are holding on to 10-15 year old opinions that are no longer valid, because the world has moved on, but that is another discussion in itself.

    I’ve always liked stuff like D3.js – there are things like MapBox that I can geek out about – there’s plugins for Figma – there’s two.js and Zdog – and I’m excited by the possibilities of web components.

    What all of the things above have in common is that they are Javascript-heavy. I feel like I need to be smooth at manipulating it in order to create what I want to create.

    The timing feels right to improve my level of Javascript. The market need is there to have a better deliverable (i.e. a web components based one). The resources to learn it properly are out there too, now. A few years ago you’d be hard pressed to find a decent Javascript course. Now there are tons of resources out there.

    Now, about learning Svelte specifically. Svelte was quite difficult to grasp in the beginning of the year. I tried to get into it in February but it just wasn’t finished in terms of documentation and external resources.

    Things are better now, with much improved documentation. Some of the demos on the REPL are really impressive (I love this tree for instance). One problem I encountered for now is there’s not many resources about Svelte out there. There are plenty of React courses but for Svelte there is just this one course, that’s apparently not very good because it teaches you to think too much in React-style coding.

    In order to counter this I’ve been patching bits and pieces of thinking together to get to an understanding, documenting things along the way for myself, both publicly and privately. I’ve changed my mindset about how I should learn to code – not by listening to a video tutorial but by doing, reading other people’s code, and documenting how I solved the problems. If you have to wait for an external resource to explain eloquently why you need to do things a certain way you will always be behind the curve.

    Moreso, these isolated examples can help our company grow as a team.

    So that’s a bit about my recent programming experiments/learnings/process. I hope I can inspire someone to do something similar or that some of the thoughts or references in this post get you thinking.

← older
newer →
  • ©2025 Johan Ronsse
  • X
  • Mastodon
  • Portfolio 2024