<?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: Jan Wedel</title>
    <description>The latest articles on DEV Community by Jan Wedel (@stealthmusic).</description>
    <link>https://dev.to/stealthmusic</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%2F7617%2Fe540b125-cb79-4116-b986-51152269ba33.png</url>
      <title>DEV Community: Jan Wedel</title>
      <link>https://dev.to/stealthmusic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stealthmusic"/>
    <language>en</language>
    <item>
      <title>Delete All The Codes</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Tue, 08 Aug 2023 09:15:32 +0000</pubDate>
      <link>https://dev.to/stealthmusic/delete-all-the-codes-1gg</link>
      <guid>https://dev.to/stealthmusic/delete-all-the-codes-1gg</guid>
      <description>&lt;p&gt;This article is about is not about writing code, it's about deleting code. Ok, maybe not all the code. But hear me out.&lt;/p&gt;

&lt;p&gt;When I was in fifth grade and starting to program, I was fascinated by big programs. .EXE files that had megabytes in file size whereas my programs only had a few kilobytes. Professional programmers are able to write huge programs and that's a cool thing, I thought.&lt;/p&gt;

&lt;p&gt;But, there reality is that code is a liability. As soon as you write it, is your team's legacy. A legacy in reality can be something good like a house but it can also be something bad like debts. In software development, it is quite often the latter, unfortunately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feed Your Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r4c3UNcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/60jauxc99mu78m8cnrgi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r4c3UNcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/60jauxc99mu78m8cnrgi.jpg" alt="Cookie Monster likes cookies" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One might think that code once written can just stay there for free. It doesn't do harm, right...right?&lt;/p&gt;

&lt;p&gt;Code needs to be maintained. It needs love and care to stay healthy otherwise it might break and take your beloved app with it.&lt;/p&gt;

&lt;p&gt;There are all kinds of things need to be considered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgrading to a new version of a library or framework that requires code changes&lt;/li&gt;
&lt;li&gt;Updating to a new version of the language you use&lt;/li&gt;
&lt;li&gt;Fixing security vulnerabilities in your code base&lt;/li&gt;
&lt;li&gt;Keeping builds green (timing changes might break things)&lt;/li&gt;
&lt;li&gt;Changing requirements might require changes in code that you thought you'd never have to touch again&lt;/li&gt;
&lt;li&gt;Changing infrastructure (e.g. new data base) might require changes (especially if the code is not decoupled)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Best Code Is No Code
&lt;/h2&gt;

&lt;p&gt;Where my younger me had a deep admiration for big program, my older me has learned that code that does not exist is actually the best code. It doesn't need any of the things discussed in the previous section.&lt;/p&gt;

&lt;p&gt;I don't have any personal relationship to my code anymore (which is actually not my code by our team's code anyways) and so you shouldn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KYxTEIBk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0q4nup96ahmu5o158w0m.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KYxTEIBk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0q4nup96ahmu5o158w0m.jpeg" alt="Anakin killed them all" width="798" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I actually feel happy and relieved deleting code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tidy Up
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sDYd_52e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wn4l7fa8tzh6xvodsqf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sDYd_52e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wn4l7fa8tzh6xvodsqf.jpeg" alt="KonMari keeps it tidy" width="635" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To delete code, I actually follow a couple of practices:&lt;/p&gt;

&lt;h3&gt;
  
  
  Boy-Scout-Rule
&lt;/h3&gt;

&lt;p&gt;The Boy-Scout-Rule is a general practice of continuous improvement. It basically says: Leave the fire place cleaner than you found it. Or in more technical terms: If you are working on a part of code, try to improve things in the area that you are working on even if it is not strictly necessary for your current task.&lt;/p&gt;

&lt;p&gt;That includes cleaning and deleting code. Most often, your editor or IDE will tell you about unused code. Delete it. No excuses. There should be tests covering it, if the code is actually necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring
&lt;/h3&gt;

&lt;p&gt;Sometimes you start with a new bigger feature and implement it in the most basic way (TDD, wink wink). But as soon as you add new features around that code, it might need some refactoring.&lt;/p&gt;

&lt;p&gt;If you did it right, most of the time you should be able to actually delete a significant amount of code. For me, this is like the reward I get when I we did a good refactoring. It let's me delete code. I love it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zombie Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j-4puzJF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tocsgu16u91nfuikgp2l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j-4puzJF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tocsgu16u91nfuikgp2l.jpeg" alt="Brains" width="654" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a tricky one. You might have code that is used (by tests) but actually not in production anymore. So it looks like it is used but it is actually some undead code disturbing your neighborhood. This is the case e.g. when you have APIs that are covered by unit tests or even integration test but which are not used, neither by a UI nor by customer.&lt;/p&gt;

&lt;p&gt;This needs a check from time to time. Could be done as a regular item in a team meeting or task in a maintenance sprint etc. Obviously, you could also explicitly deprecate APIs which are used by customers and mark them for removal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time Travel
&lt;/h2&gt;

&lt;p&gt;You might say "But I might need that code!". You might also know the answer. Use your version control system of choice to get the code back. Yes, it might not immediately work but the effort to keep code alive is most often higher. Also, in 99% of the cases, no don't need that code ever.&lt;/p&gt;

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

&lt;p&gt;Keep you code clean and tidy. Delete as much code as you can. Thank me later :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image by &lt;a href="https://unsplash.com/@ujesh?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Ujesh Krishnan&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/7ySd00IGyx4?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Going Fullstack</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Sat, 11 Mar 2023 22:15:37 +0000</pubDate>
      <link>https://dev.to/stealthmusic/going-fullstack-3bc</link>
      <guid>https://dev.to/stealthmusic/going-fullstack-3bc</guid>
      <description>&lt;p&gt;I came from "uhh, I will never touch that frontend thing" to being a passionate full-stack developer.&lt;/p&gt;

&lt;p&gt;I'd like to explain why I love it and to encourage other devs to try it. No matter if you are currently frontend or backend-only.&lt;/p&gt;

&lt;p&gt;But let's have a quick look on where I came from to give you a change to understand my reasoning behind this. I worked with all kinds of languages but I started my professional career in 2007 as a Java developer, writing software for both embedded and backend systems.&lt;/p&gt;

&lt;p&gt;And this is what I did basically until roughly 2017. At that time, I was working in a team consisting of only backend engineers. When there was the need for some frontend work, we had to basically plan this so that one guy from another team would do the work at some time in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoiding Bottlenecks
&lt;/h2&gt;

&lt;p&gt;But UI got more an more important and that got more and more of a bottleneck. Actually, nobody really wanted to do it but one member of our team finally volunteered to get her hands dirty and get into frontend after all. Frontend was viewed as both too trivial as as well as too dirty in terms of code quality.&lt;/p&gt;

&lt;p&gt;But there we were. We had one frontend dev in the team. And it was quite a success as we didn't have to rely on someone from outside the team. However, also that person turned into a bottle neck in our team pretty quickly when we worked on more than one feature at a time that required UI.&lt;/p&gt;

&lt;p&gt;So we knew that something has to change. So whenever we hired someone new, we made sure that person would be already full-stack or at least interested in learning it.&lt;/p&gt;

&lt;p&gt;We were working on a product that allowed storing, monitoring and analyzing a lot of data in an industrial domain with a high degree of inter- and reactivity in the web application. In 2017, the existing frontend tech-stack was AngularJS. The code quality was actually pretty bad (as we assumed), the code was neither readable not maintainable. But after some time, Angular with TypeScript was introduced. For me, this looked very much like Java and Spring Boot so I felt at home immediately and were interested in learning it to help achieving our team goal to go fullstack. Also, now beeing more involved, we tried to apply clean code principles and boy-scout-rule every time we touched existing code.&lt;/p&gt;

&lt;p&gt;As a result, it was a lot easier for our product owner to prioritize user stories by just business value and not having to think about if the UI and backend devs are available at the same time or even split user stories in non-sensible frontend and backend pieces.&lt;/p&gt;

&lt;p&gt;It just worked out pretty well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Piece of Cake
&lt;/h2&gt;

&lt;p&gt;So remember, I thought frontend development was piece of cake but boy, was I wrong. Building a complex web application with lots of interactive charts, live data and much more was actually a lot more complicated and tough to get into. The abstractions for reactivity in the UI (e.g. rxjs) were hard to comprehend (I still think, that it is not the best abstraction as it is a domain specific language on top of the actual language that you have to learn and understand which is bad IMO). Also styling was tough, tougher than it should be. I always wonder why this is so unnecessarily complicated if you know how you want it too look like and you cannot simply express this with a few understandable steps. We had common components but we needed to build a lot of custom components and thus custom styling was needed. &lt;/p&gt;

&lt;p&gt;But let's not get into the specifics here. I guess the web was just not build for applications, I guess. Bottom line is, it took me way longer to get half-way decent. I would still not consider myself as a UI expert but I can get stuff done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's fun
&lt;/h2&gt;

&lt;p&gt;Now, if you are currently backend-only, you might ask yourself: "Why the fuss?".&lt;/p&gt;

&lt;p&gt;My honest answer is: Because it's fun. It is fun in a couple of ways.&lt;/p&gt;

&lt;p&gt;First, it is really great to see stuff getting alive that you just built. To interact with your code. You add that button, click it and something happens. As trivial as that might sound, it's just a lot different than what you experience when doing backend only.&lt;/p&gt;

&lt;p&gt;Second, it's just great when you implement a feature and you can jump back and forth between front- and backend code. Need to change the model? Just do it! Want to add a field here that makes building the UI easier? Just add it. Boom. No need to ask someone else. No need to discuss APIs, data formats with "the frontend dev", write it down somewhere and then annoying that persone when you need one or two changes. You can also decide, whether it's easier to compute something in the backend or do it in the frontend, depending on the use-case. This is even easier when working with a monorepo containing both backend and frontend.&lt;/p&gt;

&lt;p&gt;As full-stack usually also includes operations (or if you like buzzwords: "DevOps"), it is also great if you can just connect to the cluster, because, lets say the dev environement is not working. You look at the logs, fix that DB migration issue quickly to eventually get your new UI feature online and test it. No more waiting for someone to fix it and being blocked.&lt;/p&gt;

&lt;p&gt;I think all the arguments are equally valid if you are a frontend dev. It will help a lot if you understand where data comes from, how the data is stored, why there are things that are easier in the backend or vice-versa.&lt;/p&gt;

&lt;p&gt;I believe that you end up in writing better software with less compromises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jack-of-all-Trades
&lt;/h2&gt;

&lt;p&gt;One downside of going fullstack is that you probably will not be able to have all the knowledge in both width (knowing different technologies) and depth (knowing all details). But, that is not a big issue as you are not the only one in the team. There will we usually be people that like to focus more on frontend, some will have knowledge in the backend, data bases or operations. In our team, we usually work in pairs or a mob, so there is always someone you could ask if you or StackOverflow doesn't know. Having a couple of different T-shaped developers (known a broad number of technologies with one or two focus areas of expert knowledge) in the team works pretty well as for 80% to 90% of the tasks, you don't need expert knowledge.&lt;/p&gt;

&lt;p&gt;Also, not everyone in the team might be willing to invest team in expanding their knowledge and go fullstack. That is something that the team need to respect. No one should be forced to do it. One way to get them on board is to regularly pair/mob with them working on stories that require both backend and frontend. That might change their mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;As a former Java backend developer, I was used to pretty solid tooling (IDEs, compilers, build tools, debuggers, testing etc.). That changed when learning frontend coding. As web frontend is a much younger profession, slow and fragmented tooling, completely broken dependency management, unstable test frameworks is the result.&lt;/p&gt;

&lt;p&gt;Since starting with frontend, I went from JavaScript, npm, AngularJS, Karma, Protractor to TypeScript, yarn, Angular, Jest and Cypress in just one or two years. The backend Java tooling landscape is just a lot more mature and stable. &lt;/p&gt;

&lt;p&gt;It's a bit annoying but things are slowly evolving for the better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sorry, TDD
&lt;/h2&gt;

&lt;p&gt;If you know my other articles, I am a big fan of testing and Test-Driven-Development. In frontend development, I had to pull-back here a lot more than I want.&lt;/p&gt;

&lt;p&gt;I would not say it's impossible but highly impractical to use TDD for all unit and e2e tests. In my experience, there is usually a lot of exploration necessary to get something working in the UI. You have to understand browser behavior, understand how 3rd-party components are working and behaving. So you basically need to build kind of a prototype first. So I end up using TDD for logic code like mapping, services etc but less for component code. Also, I usually write e2e tests (e.g. with Cypress) after getting thing working as the structure and behavior of the UI will usually change drastically during implementation that writing e2e tests upfront is mostly a waste of time. That also means, I need to intentionally break assertions to see if the tests actually turns red if the code doesn't work. And I feel a bit dirty ^^ afterwards.&lt;/p&gt;

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

&lt;p&gt;If you and/or your team mates are willing to try this experiment, you will benefit as you grow your knowledge (and if you think it's important, it might boost you career), the team including a product owner will benefit as unnecessary bottlenecks are removed and the software you work on will have better quality with less compromises.&lt;/p&gt;

&lt;p&gt;A Win-win-win situation.&lt;/p&gt;

&lt;p&gt;What do you think? Let me know in the comments if you do consider going fullstack. If not, why? Did you already tried it and doesn't like it? If yes, let me know why!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@karsten116?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Karsten Winegeart&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/iqqHQCWU9OI?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Remote Coding Dojos</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Wed, 07 Apr 2021 21:35:12 +0000</pubDate>
      <link>https://dev.to/stealthmusic/remote-coding-dojos-477k</link>
      <guid>https://dev.to/stealthmusic/remote-coding-dojos-477k</guid>
      <description>&lt;p&gt;If you are new to this topic, please read my article about &lt;a href="https://dev.to/stealthmusic/why-you-should-do-coding-dojos-3n4j"&gt;Why You Should Do Coding Dojos&lt;/a&gt;. That article will cover the whys and hows for conventional face-to-face Coding Dojos.&lt;/p&gt;

&lt;p&gt;This article here will just deal with the differences.&lt;/p&gt;

&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;During the pandemic, it is obviously necessary to shift a lot of activities to remote-only. In agile teams, this holds for Dailys, Retrospectives but also for Coding Dojos.&lt;/p&gt;

&lt;p&gt;We had a pretty stable team for years but now we got 4 new developers which created the necessity to start a regular Coding Dojo again. As the new developers were not at the same location anyway, it was clear that we needed to do this remotely.&lt;/p&gt;

&lt;h1&gt;
  
  
  Challenges &amp;amp; Solutions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Decreased Social Interaction
&lt;/h2&gt;

&lt;p&gt;Coding Dojos are more about social interaction and team building than they are about practicing to code. Everyone who attended one or two online workshops knows, that a large percentage usually keeps mostly quiet, more then in a face-to-face situation. Sometimes you cannot even see them because camera is switched off.&lt;/p&gt;

&lt;p&gt;This needs to be addressed in a remote situation. &lt;/p&gt;

&lt;p&gt;First, by &lt;strong&gt;&lt;em&gt;having the camera always on&lt;/em&gt;&lt;/strong&gt;. I had the video screen on the right of my wide-screen display and the IDE on the left.&lt;/p&gt;

&lt;p&gt;Second, by &lt;strong&gt;&lt;em&gt;good moderation&lt;/em&gt;&lt;/strong&gt;. It is important that one team member focuses only on moderation without joining the codingt. That moderator should actively try to get all team members involved by asking them, especially the introvert ones to create a more balanced distribution of speaking time.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;&lt;em&gt;hand-raise function&lt;/em&gt;&lt;/strong&gt; of the collaboration tool (if available) to ask simple yes/no question to the whole team to prevent awkward "everyone/no one talks" situations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling
&lt;/h2&gt;

&lt;p&gt;For a remote Coding Dojo, you obviously need more than a Laptop, keyboard and mouse to get successful.&lt;/p&gt;

&lt;p&gt;We used MS Teams for &lt;strong&gt;&lt;em&gt;voice and video call, chat as well as screen sharing and remote control&lt;/em&gt;&lt;/strong&gt;. Especially the latter is crucial for a successful Dojo. &lt;/p&gt;

&lt;p&gt;The idea should still be to have a single computer that the whole team works on. We tried IntelliJs "Code With Me" plugin (similar to VSCode Live Share) but it was lacking basic functionalities like "Create Files", typing was extremely laggy (3-5s latency) for most attendees and auto-completion did not work for some reasons. This might get better in the future.&lt;/p&gt;

&lt;p&gt;So we quickly moved to &lt;strong&gt;&lt;em&gt;using the "Request Access" feature&lt;/em&gt;&lt;/strong&gt; in Teams which supports multiple cursors and was generally snappy/low latency.&lt;/p&gt;

&lt;p&gt;As an alternative, you could try git hand-over with shifting the screen sharing session. But that wastes a lot of time every 5 minutes and distracts the others with different resolutions, color schemes and maybe even different IDEs/editors. I would not recommend that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyboard Layout
&lt;/h2&gt;

&lt;p&gt;If you have people with different keyboard layouts in the team that control your computer, you should install and switch the layout accordingly to allow them to work as they normally do. This is usually also true for F2F Dojos but since people might have different keyboards at home it is worth to think about that beforehand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;p&gt;You should test the setup first with one team member. E.g. MS Teams eats a lot of CPU resources which can create lag on its own when running the application or tests in parallel. You have to test that everything works as expected in a screen sharing + video situation.&lt;/p&gt;

&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;p&gt;Some short advices based on the sections above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Camera always on&lt;/li&gt;
&lt;li&gt;Good &amp;amp; focused moderation&lt;/li&gt;
&lt;li&gt;Tested and well-prepared tool set-up &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It worked pretty well for us and was a lot of fun. I would think that remote Coding Dojos are not less effective in a remote situation, they are just different.&lt;/p&gt;

&lt;p&gt;You should try it!&lt;/p&gt;

&lt;p&gt;Did you already try it? Leave a comment how it went and if you have suggestions!&lt;/p&gt;

</description>
      <category>teams</category>
      <category>social</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How it Feels to be a DEV Father</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Mon, 16 Nov 2020 21:06:44 +0000</pubDate>
      <link>https://dev.to/stealthmusic/how-it-feels-to-be-a-dev-father-c9n</link>
      <guid>https://dev.to/stealthmusic/how-it-feels-to-be-a-dev-father-c9n</guid>
      <description>&lt;p&gt;Usually, as a DEV, when we talk about parents and children it's about a tree data structure. But this not about programming. It's about life and the balancing act of being a father and a developer.&lt;/p&gt;

&lt;p&gt;I am a proud father of two gorgeous little girls (1 + 5 yrs). And I am a DEV, too.&lt;/p&gt;

&lt;p&gt;I did not become a developer because I thought it was a good idea but because I genuinely love developing software. In fact, I started programming in 5th grade and it soon became one of my hobbies that turned into a well-payed job as a side effect.&lt;/p&gt;

&lt;p&gt;But with the wonder of getting children, you need to adjust your priorities a bit. And you're going to spend your time for different things. &lt;/p&gt;

&lt;p&gt;But at some point, late at night in the quiet of the evening, I sometimes think about the things I'd love to do and I have no time for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning a new programming language (each year)&lt;/li&gt;
&lt;li&gt;Writing more blog posts (I have so many ideas in my head)&lt;/li&gt;
&lt;li&gt;Reading more blog posts&lt;/li&gt;
&lt;li&gt;Reading books (especially tech books)&lt;/li&gt;
&lt;li&gt;Trying out new technologies&lt;/li&gt;
&lt;li&gt;Starting a podcast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't get me wrong, I am not complaining and I would never even hesitate to get kids if I get a second chance. And luckily I have a great job that allows me to learn new stuff along the way and work from home. But there are times where I just wish to have some additional 24h appended to each day.&lt;/p&gt;

&lt;p&gt;How do other DEV parents handle that?&lt;/p&gt;

&lt;p&gt;How do developers without kids think about that matter? Are you looking forward to getting children or is it something you fear?&lt;/p&gt;

</description>
      <category>family</category>
      <category>worklifebalance</category>
    </item>
    <item>
      <title>What is a Good Code-to-Team Ratio?</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Tue, 11 Aug 2020 11:45:13 +0000</pubDate>
      <link>https://dev.to/stealthmusic/what-is-a-good-code-to-team-ratio-53jc</link>
      <guid>https://dev.to/stealthmusic/what-is-a-good-code-to-team-ratio-53jc</guid>
      <description>&lt;p&gt;We have recently had a discussion about the increasing complexity of the system we are building and the decreasing productivity.&lt;/p&gt;

&lt;p&gt;We've counted 19 domain-specific microservices + 21 UI npm modules that we have developed with two teams (5 + 7 devs) over the course of the last 5 years. Although we've automated a lot of stuff and it allows us to run different technologies (vert.x, Spring Boot, AngularJS, Angular), this has become more of a distributed monolith than a true miroservice-based system from an organizational and deployment perspective and the maintenance costs and feature development costs increase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In your experience and opinion, what has been a good size of a system (or part of a system) that can be handled by one team? Do you also operate and support? How to you tackle increasing complexity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It think doesn't make sense to have a fixes metric like LOC/person or so, so please share your views on that topic.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>It's "Just UI", Isn't It?</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Sat, 16 May 2020 11:03:49 +0000</pubDate>
      <link>https://dev.to/stealthmusic/it-s-just-ui-isn-t-it-1bge</link>
      <guid>https://dev.to/stealthmusic/it-s-just-ui-isn-t-it-1bge</guid>
      <description>&lt;p&gt;I was working for years as a backend developer when we decided to go "full-stack" as a team. We were all Java backend developers before but the growing need for web UIs in the product we were working on and the lack of frontend developers made us decide as a team that we want to expand our tech skills. We didn't want to depend on other teams.&lt;/p&gt;

&lt;p&gt;First, one of our team members volunteered to self-train on AngularJS which was the way to go at that time. She was doing an excellent job for quite some time. Then, one by one, we started also learning that tech stack.&lt;/p&gt;

&lt;p&gt;I was one of the last that started learning when we already migrating a huge code base for our single page application consisting of a dozen UI repositories gradually from AngularJS to Angular.&lt;/p&gt;

&lt;p&gt;In the middle of that, I was working on a little existing master/detail that needed to be migrated from AngularJS to Angular. It had a couple of input fields, nothing too complex, I thought. But I was wrong.&lt;/p&gt;

&lt;p&gt;I was actually hearing the phrase "it's just UI" from product owners a couple of times in the past and I knew what they though because I thought the same. How difficult can it be to build the UI when the "real" work is done in the backend? Especially when you already got a component library like Material and we got company styles ready to use. It should be just sticking together the existing stuff and you'll be done.&lt;/p&gt;

&lt;p&gt;Here is how wrong I was:&lt;/p&gt;

&lt;p&gt;First, in the past years, we moved a lot of logic into the front-end. For a couple of use cases, the backend was degraded to a better data base. Then, we had a hybrid stack of Angular and AngularJS stiched together like Frankenstein's monster with some own libraries and cli which made things really hard and slow. JavaScript code that was existing in the AngularJS part, needed to be rewritten in TypeScript and Angular. &lt;/p&gt;

&lt;p&gt;It turned out, that we didn't have any existing code that fetches users from the backend which we needed to auto-complete in the input fields of the form. In some fields, multiple entries were allowed. Some required a static list of possible options, some required backend filtering as you type because the data set was simply to large to fetch all at once. Some required to also enter free-text along pre-populated entries and some required a custom client-side validation. So we needed an auto-completable backend-filterable validatable chip list component for this use case which - suprise, surprise - wasn't there yet. So we needed to write that. We already used existing Angular Material components but it was still a lot of code and even more tests necessary to cover all the egde cases. While building and testing, we saw that the styles did not work properly. We needed to build custom styles to make the resulting component look properly within the given company guidelines. &lt;br&gt;
Then we had some input fields where one of them must be filled out, they were mutual exclusive. This also required code and testing. And this was only unit testing. Once this is working, we will need to write Cypress end-to-end test as well.&lt;/p&gt;

&lt;p&gt;By the time writing, we are working with three developers on that for weeks. Obviously, due to home office, reduced working hours and home child care we are not as productive as before Corona. &lt;/p&gt;

&lt;p&gt;Two things I want to mention: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep in mind that this is huge single page web application for industrial use cases. I would probably not use Anguar for that little web-site with that one form where HTML and CSS without any JS might be a good fit. &lt;/li&gt;
&lt;li&gt;This is not a criticism of Angular/TypeScript. I think it is a well designed framefork/laguage targed for large web applications and if you are used to work with SpringBoot in the backend, you will feel pretty much at home with Angular and TS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that little article, I just wanted to explain how complex doing "Just UI" can be. I'm not sure that it "should be" that complex but after building it myself I honestly do not know how that this could be done in a much simpler way.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
    </item>
    <item>
      <title>Remote Mob Programming</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Tue, 17 Mar 2020 06:02:58 +0000</pubDate>
      <link>https://dev.to/stealthmusic/remote-mob-programming-17o3</link>
      <guid>https://dev.to/stealthmusic/remote-mob-programming-17o3</guid>
      <description>&lt;p&gt;My team was practicing mob programming for some time and since we are now forced to work from home, we have to do it remotely.&lt;/p&gt;

&lt;p&gt;For anyone who wants to try mob programming or wants to know how, I wanted to share this great resource:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.remotemobprogramming.org/"&gt;https://www.remotemobprogramming.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They have assembled a list of best practices and tools that work well remotely.&lt;/p&gt;

&lt;p&gt;Stay healthy! 🦄&lt;/p&gt;

</description>
      <category>teams</category>
      <category>remote</category>
      <category>corona</category>
    </item>
    <item>
      <title>Why You Should Do Coding Dojos</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Wed, 15 Jan 2020 22:19:14 +0000</pubDate>
      <link>https://dev.to/stealthmusic/why-you-should-do-coding-dojos-3n4j</link>
      <guid>https://dev.to/stealthmusic/why-you-should-do-coding-dojos-3n4j</guid>
      <description>&lt;h1&gt;
  
  
  What Is a Coding Dojo?
&lt;/h1&gt;

&lt;p&gt;So in case you don't know what a Coding Dojo is, here is a short introduction. &lt;/p&gt;

&lt;p&gt;I view it basically as a coding gym or training camp where you practice coding in and as a team. "Dojo" is Japanese and means &lt;a href="https://en.wikipedia.org/wiki/D%C5%8Dj%C5%8D" rel="noopener noreferrer"&gt;"...a hall or space for immersive learning..."&lt;/a&gt;. Within that Dojo, you work on coding "Katas" meaning &lt;a href="https://en.wikipedia.org/wiki/Kata" rel="noopener noreferrer"&gt;"a detailed choreographed pattern of movements made to be practiced alone, and also within groups and in unison when training"&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  How Does it Work?
&lt;/h1&gt;

&lt;p&gt;As always, what works for you is fine. This how we do it and have good results with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick a Kata

&lt;ul&gt;
&lt;li&gt;e.g. from &lt;a href="http://codingdojo.org/kata/" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Don't use prod code! (see "No Prod Code" rule below)&lt;/li&gt;
&lt;li&gt;Usually, you don't want to build a full-fledged application with UI, server etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prepare the development environment in advance

&lt;ul&gt;
&lt;li&gt;git repository is set up&lt;/li&gt;
&lt;li&gt;Project is open in IDE&lt;/li&gt;
&lt;li&gt;Test are running (as in "no errors" although you have none)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Choose a room that can comfortably carry your team and has a large display or projector&lt;/li&gt;
&lt;li&gt;Bring one computer, one mouse, one keyboard (or more keyboards, if you need other layouts)&lt;/li&gt;
&lt;li&gt;Block 1,5 hours of time&lt;/li&gt;
&lt;li&gt;Repeat that every iteration (e.g. 2-3 weeks)&lt;/li&gt;
&lt;li&gt;Choose a moderator that will not code (e.g. Scrum Master or any random team member)&lt;/li&gt;
&lt;li&gt;Choose a programming language if multiple options exist (you can e.g. shuffle through every Kata)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Action
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;At the beginning of each new Kata, first discuss a basic approach (top down, bottom up etc). Max 10 minutes.&lt;/li&gt;
&lt;li&gt;First random member gets keyboard and mouse for a maximum of 5 minutes (active member)&lt;/li&gt;
&lt;li&gt;The moderator will check the time box&lt;/li&gt;
&lt;li&gt;The active member will explain all of her/his thoughts while approaching the problem and starts writing a test and then implementation in a &lt;a href="https://en.wikipedia.org/wiki/Test-driven_development" rel="noopener noreferrer"&gt;TDD&lt;/a&gt; fashion.&lt;/li&gt;
&lt;li&gt;The active member may ask for help when stuck.&lt;/li&gt;
&lt;li&gt;The rest of the team must not interrupt or help even if they see a bug, typo or whatever. The moderator must take care of that. Apparent bugs can be fixed in the next slot.&lt;/li&gt;
&lt;li&gt;When the time is up, the keyboard is handed over to the next member in a circle.&lt;/li&gt;
&lt;li&gt;The moderator should check that the code is checked into git as often as possible with sensible message (yes, also that needs practice!)&lt;/li&gt;
&lt;li&gt;When the moderator feels that the team is stuck, another 10 minutes team discussion slot is possible. &lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Important Constraints
&lt;/h1&gt;

&lt;h2&gt;
  
  
  It's Not About Puzzles
&lt;/h2&gt;

&lt;p&gt;One important aspect is that it's not about writing algorithms or solving puzzles. It's not even about finishing the Kata!&lt;/p&gt;

&lt;p&gt;It's about what happens in between. &lt;/p&gt;

&lt;p&gt;It's about team building. It's about the knowledge exchange. It's about the discussions that might happen. It's about learning how people approach problems differently. It's about giving the time to think.&lt;/p&gt;

&lt;h1&gt;
  
  
  The "No Prod Code" Rule
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F36e8wl6hbsm3x503ggk5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F36e8wl6hbsm3x503ggk5.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Someone (maybe managers, maybe even team members) will come up with the idea to just work on a problem in your prod code. But the Coding Dojo must remain a safe space. This is why Katas are used. When the team would work on prod code, you will work under pressure. You will make compromises. You will skip tests.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why you should probably already do it
&lt;/h1&gt;

&lt;p&gt;So, now let's talk about why you should probably do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Norming
&lt;/h2&gt;

&lt;p&gt;The first and most important reason is: To build a sustainable and well-performing team. Every team goes through four phases: &lt;a href="https://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development" rel="noopener noreferrer"&gt;Forming, Storming, Norming, Performing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You want to be the "Performing" phase, obviously. However, after a new team has been formed or after a new member joins, you will very likely come the "Storming" phase again.&lt;/p&gt;

&lt;p&gt;Storming happens, when a team is not normed. E.g. when some members writes tests, some not. Some writes code comments, some not. Some like tabs, the others spaces. You get the idea. When there is no explicit agreement, you will get in troubles sooner or later. So even though you need a common understanding in a team upfront, practicing that in a team during Coding Dojo is really important.&lt;/p&gt;

&lt;p&gt;Norming is not always easy, it's about finding the sweet spot between individual talent and team work that should lead to less discussions and arguments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Responsibility
&lt;/h2&gt;

&lt;p&gt;A special type of "norming" is team responsibility. It means that all members feel responsible for all of the team code. There should not be something like "Hey, you introduced that bug the customer reported, you need to fix it!".&lt;/p&gt;

&lt;p&gt;Because of the fact that the whole team works on the same code, team responsibility is trained and will benefit the prod code as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Craftsmanship
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fba8qcecd4qhl78igv4of.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fba8qcecd4qhl78igv4of.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coding Dojos helps to learn coding as a &lt;a href="http://manifesto.softwarecraftsmanship.org/" rel="noopener noreferrer"&gt;craft&lt;/a&gt;. It's important to repeatedly train your skills.&lt;/p&gt;

&lt;p&gt;When you as a team decide to follow Clean Code rules and Test Driven Design (and you should) or you want to start learning it and are afraid or unsure to practice it on prod code, Code Dojos will help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge Sharing
&lt;/h2&gt;

&lt;p&gt;During a Coding Dojo, every team member - no matter how much experience - will learn something new. Apart from learning general coding styles, team members will learn new design patterns, refactorings, IDE short cuts and tools.&lt;/p&gt;

&lt;p&gt;We used it to learn TypeScripts. We had only Java backend developers that wanted to learn TypeScript to work on front-end code as well. So we did a Kata in TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Social Skills
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg7abqk89aurelr4iz8mb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg7abqk89aurelr4iz8mb.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because of the fact that the team needs to solve a problem together and each non-active member needs to take him/herself back a bit, Coding Dojos train social skills in team communication, openness and self-control.&lt;/p&gt;

&lt;p&gt;Most developers know situations where other team members do have their own idea how to develop software which conflicts with team decisions. Coding Dojos help to make that behavior transparent and work on it. It will slow down very confident developers and give more room for inexperienced ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get a Glimpse Mob Programming
&lt;/h2&gt;

&lt;p&gt;Actually, &lt;a href="https://en.wikipedia.org/wiki/Mob_programming" rel="noopener noreferrer"&gt;mob programming&lt;/a&gt; is currently hyped and a Coding Dojo works similar (but not exactly the same):  You work as a team (mob) on one code base with time boxing. &lt;/p&gt;

&lt;p&gt;The difference is, that the "rest of the mob" is not driving the active member.&lt;/p&gt;

&lt;h1&gt;
  
  
  When to stop?
&lt;/h1&gt;

&lt;p&gt;Now, here comes my confession: My team doesn't do it at the moment. Why not? We have reached Norming and Performing phases. Each team member writes code that the others value and would probably have written in a similar way. We do most coding in pair and even mob sometimes. There are very few discussions or disputes and we feel a strong team responsibility. So we as a team decided to stop it but we will start again no later than when a new member joins.&lt;/p&gt;

&lt;p&gt;So, while you can obviously continue as long as you like, you can stop if the team has formed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://return.co.de/blog/articles/why-you-should-do-coding-dojos/" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>teams</category>
      <category>social</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Java is Dead - Long Live Java</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Mon, 18 Nov 2019 21:57:08 +0000</pubDate>
      <link>https://dev.to/stealthmusic/java-is-dead-long-live-java-19bl</link>
      <guid>https://dev.to/stealthmusic/java-is-dead-long-live-java-19bl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Java is dead. Leave the sinking ship, Kotlin, golang, whatever it is, learn another language!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is that really true?&lt;/p&gt;

&lt;h1&gt;
  
  
  History
&lt;/h1&gt;

&lt;p&gt;Let's look at the history first. I've been doing Java development since about 2005, starting with embedded devices programmed in &lt;a href="https://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition"&gt;J2ME&lt;/a&gt;. Java SE (or J2SE) was already at version 1.5 but in J2ME, the language was compatible with Java 1.3 and only a subset of the JDK was supported. E.g., it didn't even had any Map implementations. &lt;/p&gt;

&lt;p&gt;At the time of writing, Java 13 has already been released and it's been a hell of a journey. Since Java 1.3 over the past 17 years we've had features like those being added:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Java Version&lt;/th&gt;
&lt;th&gt;Selected Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;Regular Expressions, Non-blocking I/O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;Generics, Annotations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;JAX-WS, JWM + Compiler extensions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Dynamic languages support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Lambdas, streams, optionals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Module system, JShell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;var&lt;/code&gt; keyword, Graal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Running Java files like scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Switch expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Text blocks, Class data sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;NIO is still the base of non-blocking and reactive web frameworks. Without annotations, aspect-oriented programming that e.g. the &lt;a href="https://spring.io/"&gt;Spring framework&lt;/a&gt; leverages would have not been possible. Extensions of the compiler made &lt;a href="https://projectlombok.org/"&gt;Lombok&lt;/a&gt; possible. Lambdas, streams and optionals moved Java closer to a functional programming style (although it's still not a functional language) and allowed to reduce the amount of boilerplate. Switch expressions are a little step on the road to pattern matching (see section below). And dynamic language support made it possible or at least easier to bring dynamically typed languages like Ruby and Python to the JVM.&lt;/p&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://howtodoinjava.com/java-version-wise-features-history/"&gt;https://howtodoinjava.com/java-version-wise-features-history/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Java_version_history"&gt;https://en.wikipedia.org/wiki/Java_version_history&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Java = JVM + Language
&lt;/h1&gt;

&lt;p&gt;When we talk about "Java", we should actually talk about the Java Virtual Machine (JVM) and the Java language.&lt;/p&gt;

&lt;p&gt;When you run a Java application, the Java source code (&lt;code&gt;*.java&lt;/code&gt;) first has to be compiled to Java byte code (&lt;code&gt;*.class&lt;/code&gt;) which is the same on all platforms, hence the slogan &lt;a href="https://en.wikipedia.org/wiki/Write_once,_run_anywhere"&gt;"Write once, run everywhere"&lt;/a&gt;. The byte code is optimized to be interpreted and run fast instead of directly interpreting the Java source code as it is done with JavaScript e.g. &lt;/p&gt;

&lt;p&gt;The JVM itself is a platform specific implementation (e.g. Linux, Windows, Mac) of a Java runtime. It basically takes the previously generated byte code and runs it on the target environment. In the early versions of Java, the byte code has been interpreted which was relatively slow. From Java 1.3 on, the &lt;a href="https://en.wikipedia.org/wiki/HotSpot"&gt;HotSpot VM&lt;/a&gt; which is a Just-In-Time (JIT) compiler has become default. It identifies high-frequently run code (i.e. the "hot spot" within the code) and compiles the byte code to native machine code which is much faster.&lt;/p&gt;

&lt;p&gt;Since then, a lot of smart people at Sun / Oracle have improved the the JVM to be extremely fast. And by "extremely fast" I mean comparable or even faster than an equivalent C++ implementation because the JIT can generate more optimized machine code based on the known CPU and knowledge about the actual code and data flow at runtime.&lt;/p&gt;

&lt;h1&gt;
  
  
  Don't Follow the Hype
&lt;/h1&gt;

&lt;p&gt;That is the reason why the JVM ecosystem is flourishing, setting the stage for a whole set of new language that compile to Java byte code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Groovy&lt;/li&gt;
&lt;li&gt;Clojure&lt;/li&gt;
&lt;li&gt;Jython&lt;/li&gt;
&lt;li&gt;Scala&lt;/li&gt;
&lt;li&gt;Kotlin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a &lt;a href="https://en.wikipedia.org/wiki/List_of_JVM_languages"&gt;long and growing list of others&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recently, I found this in my twitter timeline:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1173504123133726720-139" src="https://platform.twitter.com/embed/Tweet.html?id=1173504123133726720"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1173504123133726720-139');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1173504123133726720&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;This looks amazing right? First, let's have a look at what it is. It's the percentage of questions asked about that language that month. So, Kotlin is a relatively new and also popular language, no doubt about it. So, naturally, a lot of people are asking questions. &lt;/p&gt;

&lt;p&gt;But wait... one language is missing! What about Java?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--43Fngxt6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/uqz9x0y7bb66jnsk47if.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--43Fngxt6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/uqz9x0y7bb66jnsk47if.jpg" alt="Java Stackoverflow results compared to other JVM languages" width="714" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, Java has still about 10 times as much questions as Kotlin which has passed Scala. What about popularity?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CuHGmjoy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/un4g7d8kvhkaaf81g5u9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CuHGmjoy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/un4g7d8kvhkaaf81g5u9.png" alt="Alt Text" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: &lt;a href="https://www.tiobe.com/tiobe-index/"&gt;TIOBE Index&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Although the graph is declining, Java is still #1 (I know, I know, TIOBE results are debatable). Let's see where Kotlin and Scala are... Rank 30 and 35, respectively.&lt;/p&gt;

&lt;p&gt;Ok, what about &lt;a href="https://hackr.io/blog/best-programming-languages-to-learn-2019-jobs-future"&gt;job opportunities&lt;/a&gt;? As a Java programmer, you don't have to search very long to find a decently paid job offer in the industry. There might be languages that will provide a higher salary but they are harder to find.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So don't get me wrong: I love new languages, especially when they bring new concepts that expand your horizon a bit and push other languages to adapt faster. Go and learn them!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've learned and used a lot of different language, starting from BASIC, Pascal, Assembler, C, C++ over Erlang, Scala and Python and most recently TypeScript.&lt;/p&gt;

&lt;p&gt;A few years ago, Scala for example has been hyped a lot. People were saying that it is going to replace Java. Although Scala has some very appealing features, eventually it didn't. &lt;/p&gt;

&lt;p&gt;Currently, Kotlin is hyped a lot as well. It has some strategic advantages compared to Scala as it is pushed by both JetBrains (the makers of IntelliJ) and Google (Kotlin is the language to-go for Android development) which allowed it to quickly gain traction. And it's a great language for sure. But similar to Scala, I don't believe that it will replace Java.&lt;/p&gt;

&lt;p&gt;When switching from Java to another language, there are always issues. Some things are just not working as they do with Java, some things are not compatible, some tools are not available. Whatever it is, this results in less people either want to or succeed at switching.&lt;/p&gt;

&lt;p&gt;So the next time you'll hear news like "Mega Corp. uses the new XYZ language" doesn't mean the whole company does. Maybe it's just one or two teams of a 100.000 employees. When a new language has "that great new feature" that Java doesn't have, it doesn't mean it can easily replace Java, the JVM, the community and Java's tooling.&lt;/p&gt;

&lt;p&gt;So why is Java so successful?&lt;/p&gt;

&lt;p&gt;In my opinion, it is the result of a couple of different factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The language is relatively easy to learn and has a similar Syntax as C and C++&lt;/li&gt;
&lt;li&gt;The language is relatively stable, backwards compatible (Java 9, oh, Java 9)&lt;/li&gt;
&lt;li&gt;It is still able to adapt to new paradigms and technologies&lt;/li&gt;
&lt;li&gt;The JVM is a pretty damn fast runtime (see above)&lt;/li&gt;
&lt;li&gt;A lot of large companies are running their business on it which simply means: Job opportunities (see above)&lt;/li&gt;
&lt;li&gt;You'll virtually find any problem already solved as an open source library with licenses that allow commercial use&lt;/li&gt;
&lt;li&gt;The tooling is pretty great&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  The Future
&lt;/h1&gt;

&lt;p&gt;So after looking at the status quo, let's have a look at the future. There are a lot of promising projects that are planned to be included in one of the next releases.&lt;/p&gt;

&lt;p&gt;There are already a couple of in depth articles, so I will just briefly mention them here.&lt;/p&gt;
&lt;h2&gt;
  
  
  Loom
&lt;/h2&gt;

&lt;p&gt;In my opinion, &lt;a href="https://openjdk.java.net/projects/loom/"&gt;Project Loom&lt;/a&gt; is one of the most game-changing additions to the JVM and the language. It might appear to be rather uninteresting at first glance: Loom will bring "Fibers" aka. light-weight threads to the JVM. So why bother? &lt;/p&gt;

&lt;p&gt;Unlike threads, you can run millions of Fibers, which have a low memory footprint, on a single core. Using Fibers, you can build continuations and tail-call optimizations which in turn allow to build non-blocking code that looks synchronous but does not block a thread. That means no code cluttered with chained callbacks or observables as it is common in e.g. vert.x or RxJava. I've written about it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/stealthmusic/dont-drink-too-much-reactive-cool-aid-20lk"&gt;https://dev.to/stealthmusic/dont-drink-too-much-reactive-cool-aid-20lk&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Graal
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.graalvm.org/"&gt;Graal&lt;/a&gt; is another candidate for a game changer, in my opinion. Graal is actually not a single "thing". There is the GraalVm compiler that implements the new compiler extension API of the JVM to replace the existing JIT compiler with a JIT compiler written in plain Java. Then there is GraalVM Native Image that allows to compile Java code to a native binary which can drastically reduce memory usage and increase startup time of an application from seconds to milliseconds.&lt;/p&gt;

&lt;p&gt;Although this sounds amazing and you can already try it, it is still in an early phase. I tried it myself and it was far from being production-ready or even just easy to use. It doesn't play well with frameworks or library that use reflection a lot (Spring, Hibernate). Without further insight, Graal will compile Spring Boot application with JPA to a native image with a fall-back work-around that simply bundles and runs the JVM and JDK within the image which doesn't give you the above advantages.&lt;/p&gt;

&lt;p&gt;There are frameworks like &lt;a href="https://micronaut.io/"&gt;Micronaut&lt;/a&gt; and &lt;a href="https://quarkus.io/"&gt;Quarkus&lt;/a&gt; popping up that allow to leverage the full potential of native image though and I know that the &lt;a href="https://github.com/spring-projects-experimental/spring-graal-native"&gt;Spring team is also working hard&lt;/a&gt; to get it working with Graal.&lt;/p&gt;

&lt;p&gt;This might allow to use Java applications in areas where &lt;a href="https://golang.org/"&gt;golang&lt;/a&gt; currently shines and fast a start-up and low memory usages is a must.&lt;/p&gt;
&lt;h2&gt;
  
  
  Amber
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cr.openjdk.java.net/~briangoetz/amber/datum.html"&gt;Project Amber&lt;/a&gt; brings data classes and sealed types to Java. It is a language feature and attempts to reduce the boilerplate code that is needed when created a POJO: Some fields, getters, setters. It will allow you to write something like &lt;code&gt;record Point(int x, int y) { }&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The features that Amber brings will also make it easier to implement pattern-matching.&lt;/p&gt;

&lt;p&gt;There are a couple of ideas to &lt;a href="https://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html"&gt;pattern-matching&lt;/a&gt;. The first was switch expressions which has been released as a preview with Java 12 that allowed to directly assign the switch expression result to variable e.g.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openjdk.java.net/jeps/305"&gt;Pattern matching in instanceOf&lt;/a&gt; will make it easier to work with unknown types and render type casting ofter an &lt;code&gt;instanceOf&lt;/code&gt; obsolete.&lt;/p&gt;

&lt;p&gt;Then there is object deconstruction that allow to extract parts of an object or list into into its components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int eval(Node n) {
    return switch(n) {
        case IntNode(int i) -&amp;gt; i;
        case NegNode(Node n) -&amp;gt; -eval(n);
        case AddNode(Node left, Node right) -&amp;gt; eval(left) + eval(right);
        case MulNode(Node left, Node right) -&amp;gt; eval(left) * eval(right);
    };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This replaces a lot of code clutter that would be necessary to implement the above. &lt;/p&gt;

&lt;p&gt;And what would be really cool is pattern matching in methods (not sure if this planned):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    int multiply(0, int b) { return 0}
    int multiply(int a, 0) { return 0}
    int multiply(int a, int b) { return a * b}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Valhalla
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://openjdk.java.net/projects/valhalla/"&gt;Project Valhalla&lt;/a&gt; attempts to allow immutable (great for concurrency) reference-free objects. An array e.g. is currently a list of references to its values instead of a list of the values itself. It will also allow to use primitive types (such as &lt;code&gt;int&lt;/code&gt; e.g.) as generic types. E.g. &lt;code&gt;List&amp;lt;int&amp;gt;&lt;/code&gt; instead of &lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;So, to conclude, I honestly don't think that Java is dead. It has an active community, a rich ecosystem including tooling, a ton of libraries and frameworks, it is able to adapt and evolve while being backwards compatible (mostly) and it is still widely used in the industry.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cover Photo by Shoot N' Design on Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Boost your Productiveness with RegEx (a little)</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Tue, 09 Jul 2019 17:52:58 +0000</pubDate>
      <link>https://dev.to/stealthmusic/boost-your-productiveness-with-regex-a-little-2384</link>
      <guid>https://dev.to/stealthmusic/boost-your-productiveness-with-regex-a-little-2384</guid>
      <description>&lt;p&gt;I love &lt;a href="https://en.wikipedia.org/wiki/Regular_expression"&gt;RegEx&lt;/a&gt;, I use it every day and I will show you how to use it to easily get some smaller and larger tasks done. &lt;/p&gt;

&lt;p&gt;But...&lt;/p&gt;

&lt;h1&gt;
  
  
  Don’t use it in production
&lt;/h1&gt;

&lt;p&gt;Ok, first things first: Be very careful using RegEx for anything in production code if you're not absolutely certain it's actually necessary.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1146168236393807872-175" src="https://platform.twitter.com/embed/Tweet.html?id=1146168236393807872"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1146168236393807872-175');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1146168236393807872&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.cloudflare.com/cloudflare-outage/"&gt;This is an example of what could happen&lt;/a&gt;. In 95% of the cases, it's much safer and easier to comprehend to use simple loops to go over data, using something like &lt;code&gt;String.contains()&lt;/code&gt; or &lt;code&gt;String.split(delimiter)&lt;/code&gt; to search and break strings up in a simple and readable way.&lt;/p&gt;

&lt;p&gt;[EDIT] To be very clear: I mean what I said above. Don’t use anything I show you here in production. I personally only use that on log files, test data and manual data creation.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tools
&lt;/h1&gt;

&lt;p&gt;There is actually no special tool I use. Every more or less sophisticated text editor or IDE supports RegEx in search an replace. Most of the work I personally do in &lt;a href="https://www.sublimetext.com/3"&gt;Sublime Text&lt;/a&gt;, sometimes in &lt;a href="https://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Useful RegEx
&lt;/h1&gt;

&lt;p&gt;This is how I most often use RegEx in my day-to-day life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replace start end of line
&lt;/h2&gt;

&lt;p&gt;Consider you have the following text&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Flour
Eggs
Milk
Salt
Maple sirup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And you want to make a bulleted list. You could obviously enter a &lt;code&gt;*&lt;/code&gt; in front of every line manually. But, you can use RegEx, of course.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Replace by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;^&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This will result in:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* Flour
* Eggs
* Milk
* Salt
* Maple sirup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;^&lt;/code&gt; is a special character that matches the beginning of a line. Replacing this with one or more characters will prefix each line.&lt;/p&gt;

&lt;p&gt;The same goes for end of a line. Let's say you need to add a comma at the end of each line.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Foo"
"Bar"
"Baz"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Replace by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;,&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Foo",
"Bar",
"Baz",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The last comma might be unnecessary and thus must be removed manually. There is a more sophisticated search to fix this but most of the time it's not worth the effort. It's always good to let RegEx do the heavy lifting and fix the resulting 2% manually.&lt;/p&gt;
&lt;h2&gt;
  
  
  Swapping Columns
&lt;/h2&gt;

&lt;p&gt;Assume we got the following data&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"foo":8,
"bar":42,
"baz":13,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Replace by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"(\w+)":(\d+),&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"$2":"$1",&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"8":"foo",
"42":"bar",
"13":"baz",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;What's happening here? We are using groups. A group is delimited by parentheses. So we have &lt;code&gt;(group1)(group2)(group3)&lt;/code&gt;. The cool thing about groups is to use them later on. In Sublime, &lt;code&gt;$n&lt;/code&gt; is used where &lt;code&gt;n&lt;/code&gt; is the group index starting with 1. Notice that we did not include the &lt;code&gt;,&lt;/code&gt; and &lt;code&gt;"&lt;/code&gt; inside the groups. Inside each group, I am using &lt;code&gt;\d&lt;/code&gt; which matches a single digit and &lt;code&gt;\w&lt;/code&gt; matching a word character like a-z, A-Z, 0-9 and &lt;code&gt;_&lt;/code&gt;, but no &lt;code&gt;-&lt;/code&gt; e.g. &lt;code&gt;+&lt;/code&gt; matches one ore more characters of the kind.&lt;/p&gt;
&lt;h2&gt;
  
  
  Convert CSV to JSON
&lt;/h2&gt;

&lt;p&gt;Let's assume we have the following CSV:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,35,"Bob"
2,42,"Eric"
3,27,"Jimi"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Replace by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(\d+),(\d+),"(\w+)"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"id":$1,"age":$2,"name":"$3"},&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"id":1,"age":35,"name":"Bob"},
{"id":2,"age":42,"name":"Eric"},
{"id":3,"age":27,"name":"Jimi"},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Again, we're using groups and digit or word matchers.&lt;/p&gt;

&lt;p&gt;The transformed result could easily turned into valid JSON by adding a wrapper object and arrays as well as removing the last comma. But the heavy lifting is done by RegEx.&lt;/p&gt;
&lt;h2&gt;
  
  
  Create Test Data
&lt;/h2&gt;

&lt;p&gt;Sometimes I need test data, a lot.&lt;/p&gt;

&lt;p&gt;What I usually do, is to create a sequence of numbers using...Excel. Yep, Excel. Excel is pretty smart when it comes to sequences. E.g. you can enter something like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then select both an drag on the right bottom corner to fill the cells below. Excel is able to determine that the next number is 30. So based on that that, copy the rows in to Sublime:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10
20
30
40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then I apply the same strategy as before:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Replace by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(\d+)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"id":$1,"username":"user$1"},&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"id":10,"username":"user10"},
{"id":20,"username":"user20"},
{"id":30,"username":"user30"},
{"id":40,"username":"user40"},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Learning
&lt;/h2&gt;
&lt;h2&gt;
  
  
  RegEx101
&lt;/h2&gt;

&lt;p&gt;There is &lt;a href="https://regex101.com/"&gt;RegEx101&lt;/a&gt; where you can test if RegEx matches. Modern editors like Sublime and IntelliJ will dynamically highlight matches in your current window. However, this page is also great to find errors and to learn what actually matches and why by using hover and the explanation section.&lt;/p&gt;
&lt;h2&gt;
  
  
  RegEx Golf
&lt;/h2&gt;

&lt;p&gt;Then, you can use &lt;a href="https://alf.nu/RegexGolf"&gt;RegEx Golf&lt;/a&gt; as a fun way to learn RegEx.&lt;/p&gt;

&lt;p&gt;And of course, here on dev.to&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/catherinecodes" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LOOJngny--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--ELwv2ONI--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/125321/1483b23f-0788-4271-8eec-59592d6ce6e4.jpeg" alt="catherinecodes"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/catherinecodes/a-regex-cheatsheet-for-all-those-regex-haters-and-lovers--2cj1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;A regex cheatsheet for all those regex haters (and lovers) 👀&lt;/h2&gt;
      &lt;h3&gt;catherine ・ Jan 10 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#computerscience&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;As you can see there are plenty of use cases for RegEx to help you with small and larger tasks that would manually take hours, especially with large data sets.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Fear of Effectiveness</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Thu, 27 Jun 2019 20:44:51 +0000</pubDate>
      <link>https://dev.to/stealthmusic/the-fear-of-effectiveness-36bh</link>
      <guid>https://dev.to/stealthmusic/the-fear-of-effectiveness-36bh</guid>
      <description>&lt;p&gt;I started my first internship as a software developer at a huge German industrial company in 2003. I was ready to rule the world or least code something with great value. It was a big thing and I was exited.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F10qrtofs28pq1a4gaqxt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F10qrtofs28pq1a4gaqxt.jpg" alt="I'm gonna rule the world"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That suddenly stopped  when I learned that I had to program in VBA (Visual Basic for Applications) to automate large Excel sheets. To make it even worse, my main task was to type out large piles of paper into Excel. And when I say "large piles of paper", I meant that literally. We were applying for public tenderings and got thousands of pages of a printed specification. Each page contained a table with items that needed quotation. So two interns and me were hired to type out every item into Excel which would usually take 2-3 weeks and then hand it over to the project managers.&lt;/p&gt;

&lt;p&gt;VBA was actually only used to calculate intermediate sums for each sections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ff2cq7hbbhhkiwk7zz54r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ff2cq7hbbhhkiwk7zz54r.jpg" alt="So exciting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So after one or two of these specifications, I was wondering what this little floppy disk are, that most boxes contained together with the paper.&lt;/p&gt;

&lt;p&gt;I asked the other interns but they did not know. I asked the project manager and they told me it's some special file format they cannot read with Excel and they don't have any other program that could read it. But it may contain the specification.&lt;/p&gt;

&lt;p&gt;So it appeared that they hired three interns for years instead of buying the application that could actually the the file.&lt;/p&gt;

&lt;p&gt;I decided that I would not waste my time anymore. Instead, I reverse-engineered the format and implemented a parser in Excel that would directly create a well-formatted Excel sheet in a few minutes instead of weeks.&lt;/p&gt;

&lt;p&gt;I was quite happy to demo that to the other interns. The reaction was not what I had anticipated. They told me to not use it because it would kill our jobs.&lt;/p&gt;

&lt;p&gt;I did not listen and went to the project manager. He had a look at the resulting Excel sheet and found a couple of encoding errors (German umlauts have not been decoded correctly) and decided that my program was not correct and I must do this by hand because it's more accurate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhx8kt6sg77o0vcnk1lje.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhx8kt6sg77o0vcnk1lje.jpg" alt="Yeah...but no"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obviously, I did not listen again. For the rest of my time there, I used my program, fixed the umlauts and other issues manually and reading stuff online the rest of the time. When one of the project manager came around, I opened an Excel sheet I had always prepared in background and pretended I was working. &lt;/p&gt;

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

&lt;p&gt;Eventually, I couldn't take the boredom anymore and applied for another internship internally.&lt;/p&gt;

&lt;p&gt;What was your first internship or maybe first job like?&lt;/p&gt;

</description>
      <category>story</category>
      <category>internship</category>
      <category>beginners</category>
    </item>
    <item>
      <title>dev.to Proofreading Community</title>
      <dc:creator>Jan Wedel</dc:creator>
      <pubDate>Sun, 02 Jun 2019 10:54:42 +0000</pubDate>
      <link>https://dev.to/stealthmusic/dev-to-proofreading-community-hbg</link>
      <guid>https://dev.to/stealthmusic/dev-to-proofreading-community-hbg</guid>
      <description>&lt;p&gt;When writing an article, proofreading is one important step before publishing. But even with thorough proofreading by the author, problems of any kind will slip through. It could be small typos, structural issues or things that the author assumed the readers to know.&lt;br&gt;
Luckily, this great inclusive community does not make fun of authors. But I would assume, that most authors strives to write a good article, no matter how indulgent the readers are.&lt;/p&gt;

&lt;p&gt;As I am not a native speaker, I appreciate someone proofreading my articles, moreover I would value any feedback regarding content and structure. And don’t know why, but I don’t want my colleagues to proofread (for no specific reason).&lt;/p&gt;

&lt;p&gt;Long story short: What do you think about building up a proofreading community?&lt;/p&gt;

&lt;p&gt;I’m thinking about something that could be backed by technology on dev.to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authors can join the proofreading community&lt;/li&gt;
&lt;li&gt;the can provide tags they are familiar with&lt;/li&gt;
&lt;li&gt;once an article is done by the author, the status can change to “proofreading”&lt;/li&gt;
&lt;li&gt;authors with matching tags will get it in their inbox&lt;/li&gt;
&lt;li&gt;you could even get some credits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m sure this will only work with mutual help but this awesome community could make it work.&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;

</description>
      <category>proofreading</category>
      <category>authors</category>
    </item>
  </channel>
</rss>
