Welcome to Week 0! Yes, you read that correctly. 🧐
This is the week before the start of my journey towards "Becoming a Modern Developer".
If you haven't read the introduction to this journal/diary/series, then I would recommend you do for some background, but I'll try and summarise it here.
At the end of 2021, I moved from the UK to Japan and decided to try and look for work as a Software Developer.
However, my experience of working in the UK differs greatly from the demands of many roles here, so I intend to fix that.
I also want to document my journey, findings, and thoughts throughout this process, partly as a way to record and monitor my progress, and maybe to serve as something which might be useful and/or insightful to anyone else. 😁
In my last post I said I would outline my plan to achieve this, and I thought I'd pinned down my ideas pretty well, but I can't help but have some doubts.
So I figured I'd try and work them out in writing here.
Let's start with my biases and preferences, then the hopefully somewhat objective requirements, and finally, the "plan" to achieve them. 😆
In the time between trying to work out my future and getting to Japan, so around 2019 to 2021, I'd spent some time learning little bits of different technologies to try and open my eyes to some of the other development practices and opportunities out there in the wider world.
(The course has since been rewritten, which I'll get to shortly.)
I'd modernised my understanding of C# and .NET (specifically .NET Core) at the time, since that was more important in terms of finding work in the local area.
As COVID-19 hit, I somehow found employment, twice actually, but that fact is a story for another day. And while I was able to use the modern skills I'd gained in C# and .NET, I wasn't building upon the other things I had learned.
That was the initial plan anyway... 😅
But since I started looking and applying for work, several factors have become reality, again they were covered in the last post if you wish to read them.
Oh yeah! The plan! I said I'd get to it! 😳
To build up to, and consider myself a "Modern Developer", I've come up with 9 points (or goals) that I need to meet, along with my rationale:
1. Improve my confidence working with the Front-End, along with at least one in-demand SPA Framework.
I've been a Back-End developer for most of my development life, but always dabbled in the Front-End when needed. While I can happily look around HTML and CSS, I've never been that great with building appealing and flexible layouts.
I would love to continue what I have with Vue 3, but the fact that React is in higher demand and what I wish to cover is practically the same, literally starting from scratch, it makes sense to pursue this goal with React instead.
2. Continue to build upon my Back-End experience but within a non-Microsoft language and ecosystem.
I had previously written that the following languages are in high demand here, Java/Kotlin, Python, Ruby, Go, and Rust. But I neglected to mention that Node was also in there, granted it doesn't come up as much as Java or Python. But there is certainly a demand for it, and often seen paired alongside React at least.
There is the temptation to jump into Java or Python, but there is already so much to learn as it is, I don't want to complicate it any further by adding yet another language into the mix. 😵💫
I wouldn't be averse to maybe dabbling in one of them at a later point, once I'd got myself a pretty solid grounding with the rest of the points in this plan.
3. Get good at writing tests, and often, maybe even venturing into Test-Driven Development territory.
I come from a world where writing tests was either unheard of or just a practice in wasting time that could be better spent on writing, well... better code. I've come to learn this isn't the best mindset to think of testing, and instead see it as another tool in your arsenal of software development.
React has its own React Testing Library, which I believe can sit alongside Jest without issue, so it makes sense to learn to work with that in addition.
As for the practice of Test-Driven Development itself? I'd say I would prefer to be more competent with using the tools available to me to start with, before I begin improving the process of using them. However, this might come back to bite me. 😬
4. Learn GraphQL.
When I first tried to learn React, I remember following tutorials which used GraphQL to query data from an external source, as an alternative to working with a RESTful API.
But since nobody was asking for this anywhere around me, the need to learn this was nothing more than an idea.
However, in Japan, it's very clearly in demand, and not having any real experience with it is only hurting my chances of finding work. 😔
5. Improve my understanding of NoSQL database technologies, and working with non-Microsoft SQL databases.
In short, this means getting to grips with MongoDB for the most part, it's clearly in demand and versatile enough to accommodate numerous different applications. I've been learning this somewhat with my Node education, so I just need to continue on this path.
As for SQL, well, I have experience... but I don't technically remember most of it. SQL is something that I started very heavily with during my first developer role working with Microsoft Access (there will be a post on that one day). Since then I learned to work with ORM (Object-Relational Mapping) libraries that took care of most of the heavy lifting and therefore, didn't really need to write any SQL since. Not to mention I was in a Microsoft world, which means SQL Server is all that exists, ever.
In Japan, I see MySQL and PostgreSQL mentioned a lot, not as much as MongoDB, but often alongside it, since we just can't escape SQL no matter how hard we try. 😭
So I need to become more familiar with working with either technology really, and since I'm learning Node, it means learning new ORM libraries to achieve just that.
6. Containers, learn how they work, and how to implement them.
This one is pretty simple to define, learn Docker and Kubernetes. 😆
I need to know how to containerise an application and deploy it, along with how to orchestrate the creation, allocation, and management of containers.
These two technologies are in demand, and I don't think I've seen a job description without them, though it's often listed as a "preferred" skill.
You also can't learn these and avoid the idea of Microservices, which does dictate an applications architecture and deployment process.
I don't want to fully commit to going down this route yet, but I at least need to become familiar with the concepts around Microservices. 🙂
7. Build experience working with Cloud Computing Services.
This one is a little... complicated. Not because of time or experience, but due to (potential) costs. 😓
While these services often have free and limited-free tiers, it's a little concerning that costs can accrue from having just a few applications hosted and maybe the wrong configuration for them in place.
(I'm not talking from experience with Microsoft Azure and hosted SQL Server instances or anything... 😵)
In regards to demand, AWS seems to be the primary candidate, followed by GCP. I've found that since the Microsoft ecosystem is barely mentioned here, Microsoft Azure only gets a passing mention with roles that just want any form of experience in this area.
It makes sense to look at AWS for this goal, and I know some of the material I have to study uses it too. There is a 12-month limited-free tier that would probably give me enough time to learn and use what I need, not just for the study material but for my own efforts too. But I'm hesitant due to potential costs, since... well I'm unemployed. 😬
8. Learn the Theory, from Structures to Algorithms, Design Patterns to Anti-Patterns, Architectural styles and general solution designing.
I don't come from a Computer Science background, my education of choice was Computer Games and Drone Technology. Even though software was an unavoidable part of either degree, there was never any real fundamental education in technical theory and design. 😓
(Something I wish I'd considered strongly at the time of making those decisions, but alas 20/20 hindsight wins again.)
I have already started on this, by looking into formal definitions of Data Structures and measuring Algorithms, there's certainly plenty to get myself into over the next 12 months.
But I do need to expand my understanding of the use of Design Patterns, how they can turn into Anti-Patterns, and how best to design software solutions when faced with a problem that needs solving etc.
You could argue that this is something that is encountered every day by anyone who considers themselves or works as a Software Developer by trade, but the truth is, anyone can write code that works, and for a lot of people that's all they need. Something that works.
If you really want to understand what you are doing, and wish to work in a manner that enables you to build real solutions that will last, you are going to need to know a bit more than writing code that "just works".
9. Put Theory into Practice.
I need to learn how to solve code-based problems, explain technical concepts, design solutions and demonstrate via diagrams and whiteboard drawings.
This, out of all the goals, terrifies me the most. It's one thing to be able to write code and to think you understand it, but when pressed to explain and demonstrate it? I don't blame anyone for faltering, I know I do. 😱
Interviewing in the UK for me never really stretched beyond a simple job application and interview, I think in the last couple of years there would be the odd request to build something. But it just wasn't the norm to do anything more than that, at least where I was based anyway.
But Japan, like what I'd seen with pretty much everything else online, has demands for passing Code Tests and Assessments, along with several rounds of interviews, which I'd assume would cover more than just the team I'd be working with, or the manager I'd work under. 😐
Preparing to show what I can do is going to take a LOT more work than just learning different technologies, this needs to be part of the process throughout my journey.
I have started a little on this goal, since my fear of interviews here pushed me to rush into finding something I could work through.
But what I need to do is spend just a little bit of time each week, it could be a code challenge each day, or just a couple each week to start with. Building up to writing out solutions in the form of diagrams or whiteboard drawings, and starting to try and explain my thought process.
I'll be honest I'm still a little fuzzy on this goal, purely because of my current feelings around it, and the anxiety it induces. But the only way to achieve this one is by constant incremental effort. 😉
So, that's my plan... for now.
I feel like there is a chance for it to flex and change depending on what I learn, or how I think demand is shaping here. But to start with, it seems a pretty clear set of things that need to be achieved.
But, I feel like something is still missing?
I didn't really explain my execution did I? Since... it's all well and good saying what I NEED to learn, but what about the HOW?
Well, again, this is something I kinda took care of a while ago, back when I was in the UK and had an income.
Having spent a large number of hours on sites like YouTube, PluralSight, Udemy, and LinkedIn Learning. I found myself hoarding a series of courses covering several different topics I was curious about. Most of these are on Udemy, and while my opinion of the quality of courses there varies, I feel like I have enough content to cover my goals to an extent.
I mentioned Colt Steele's course - The Web Developer Bootcamp, which has since been redone from when I last completed it, I have actually been working through this very slowly from the start of this year. I had hoped to have it finished by the end of this week to make both mental and physical room for moving on these goals.
However, due to personal delays and interview preparations, I haven't managed to finish the course just yet and should be able to have this completed within the next week.
With theory, I've hastily started Stephen Grider's course - The Coding Interview Bootcamp: Algorithms + Data Structures, which I think I will resume alongside the primary material I'll be studying during the coming weeks.
As for the goals themselves, here are a few of the courses I'm looking to work through:
- The Complete Junior to Senior Web Developer Roadmap (2022)
- Advanced CSS and Sass: Flexbox, Grid, Animations and More!
- Client-Side Data Storage Ultimate Guide
- Progressive Web Apps (PWA) - The Complete Guide
- React - The Complete Guide (incl Hooks, React Router, Redux)
- The Modern React Bootcamp (Hooks, Context, NextJS, Router)
- React and Typescript: Build a Portfolio Project
- Next.js & React - The Complete Guide (incl. Two Paths!)
- Microservices with Node JS and React
- Microfrontends with React: A Complete Developer's Guide
- NodeJS - The Complete Guide (MVC, REST APIs, GraphQL, Deno)
- The Modern GraphQL Bootcamp (with Node.js and Apollo)
- Understanding TypeScript - 2022 Edition
- Unit Testing for Typescript & NodeJs Developers with Jest
- Build a Google Meet Clone from Scratch: WebRTC & Socket io
- Create a Twitter Clone with Node.js, Socket.IO and MongoDB
- Master the Coding Interview: Data Structures + Algorithms
- Master the Coding Interview: Big Tech (FAANG) Interviews
Would you believe this isn't an exhaustive list? This is where my ADHD seems to show itself, and yes it can make things a huge barrier to entry for me.
Staring at that list alone is hardly motivation for climbing the mountain ahead. 😱
So I'm not, I just thought I'd mention it here for the sake of illustrating how my brain might try and see things.
For managing this I'm currently using Trello, which was filled out with these courses along with time estimations, long ago. So all I have to do is pick one and drag it to an "Active" list, record my time and maybe some notes, and return it to the "Course" list.
By giving myself the freedom to pick and choose what I work on, rather than staring at a never-ending list, provided I make sure to log time etc, I should be able to keep an accurate and living record of what I'm working on and the progress I've made.
I've already started taking this approach with writing this series, as it too is a task I can drag into the "Active" list and log time against, etc.
That's all for my plan currently, and I should probably get back to my interview prep and finish off Colt Steele's course, plus I really want to start a React course as soon as possible! 😆
Thanks for reading if you made it this far, and thanks again if you somehow made any sense of it.
See you next week! 😅