My primary learning direction is full-stack engineering with probably a frontend focus – I enjoy the complexity of full-stack applications.
Software engineering (in contrast to many other kinds of engineering) contains a widespread array of technologies that change extremely quickly. Hence, self-learning is very important and I believe that over a certain level of experience, one should know what they don’t know. Let’s see a rough assessment of what I learned so far in each area.
If you are curious, too, head over to some roadmap site like https://roadmap.sh/ and assess yourself – I’d be interested to know how your knowledge progressed over time. 🙂
Communication & leadership
I’m putting this first as the scope of my work more increasingly points beyond individual contributions.
I have successfully completed several agile cycles as a squad leader. A squad (as in Shape Up) is a relatively small, but cross-functional team of software engineers, product managers and product/UX designers. They are closely working together with high autonomy to solve often ambiguous problems.
As a squad leader, my primary goal is to make my squad succeed at whatever projects they are assigned to, owning the whole process.
In Shape Up, this means drafting a full project out of short business idea documents, slicing up work to smaller feature scopes & tasks. Leading regular meetings (e.g. standups, stakeholder syncs), navigating the maze of ambiguity and constant change, but freezing scopes when needed.
It’s also about the day-to-day communication with squad members, the constant decision making, architecting and (over-)communicating progress.
I love it so far! 🙂 That’s one success metric… the other one is that so far, every project has been shipped successfully to customers.
Will write pixel-perfect HTML from your Figma design
Everybody mentions these when it comes to frontend development. I can write and easily navigate vanilla HTML/JS/CSS, with or without frameworks, even if it’s not really needed today. I love latest CSS stuff such as flexbox and grid.
I try to write semantic & accessible HTML at all times if possible, even if using some framework to abstract away the details. For JS, I mostly use and prefer Typescript for added type safety.
Next up: keeping up with the latest JS language improvements. Each year the web is getting farther and farther away from vanilla HTML/JS/CSS.
I know the ‘big 3’ FE frameworks
I can use and have had projects in Vue, React and Angular, probably in this order of preference. I see the similarities and the core differences between these frameworks and could teach how to use them to any developer.
State stores are preferred by me if app complexity reaches a certain (not so high) threshold – I have used Ngrx, Vuex and Redux. I also occasionally use some simpler templating libraries like handlebars.
Uncharted: I lack experience with mobile app development such as React Native.
Next up: keep up with new frameworks and keep an eye on truly new ideas like Svelte (which promise faster apps and better development flows but are not quite yet ready for larger-scale apps). IMHO the functional syntax of React hooks (and probably the upcoming Vue 3.0 composition API) will stick with us for a while.
Will have a fair attempt at building your app
I know how a frontend app is built up and can bootstrap it quickly with some tooling like CRA. I can even configure Webpack but like most sane people, I don’prefer to.
I can architect small to midsize apps with relative confidence, including API use & query management, authentication, services, Websocket use.
Tests are useful, and I enjoy using Storybook + Jest for component unit/integration tests and Puppeteer or Cypress for end-to-end testing. (Selenium in my nightmares.)
Next up: I don’t have much hands-on experience with SSR or GRaphQL yet, but it’s just one learning step away from my current knowledge level. These are more like niches that are good to learn but not used everywhere.
This is an interesting part, especially that there is no ‘definitive’ backend framework or language like the HTML/JS/CSS trinity for frontend. Instead we have a lot of languages, ecosystems and even more custom architectures. So rather, we should approach this assessment from a domain perspective.
OS/runtime environment basics
Will hack anything with a terminal… as long as it’s not Microsoft!
I’m a *NIX guy. 🙂 Adept at using Linux systems, terminals, services, SSH tunnels, scripting shell. I don’t have much Windows experience though.
Uncharted: for me, Windows is a peculiar OS necessary to be used when playing some recent games (which is pretty rare now with Proton!) I could maybe learn some WSL or Powershell but don’t really feel inclined to do so.
Trying to keep myself in the twilight zone of the Postgres Meme 😹
I only have PostgreSQL experience, quite much of that. I understand basic ACID principles and can do a lot of stuff that a software engineer needs to do in their everyday life: write some schemas, queries, SQL scripts, migrations, even PL/SQL functions. Identifying and optimizing bottleneck queries is a must when it comes to keeping up app performance.
Next up: I could get some noSQL and in-memory DB (Redis) experience.
Backend architecture & APIs
I understand backend architectural and microservices challenges
I know what backends do and have interacted with architectures from dead simple monoliths to ultra-scalable enterprise-grade stuff with complex message queues. There are a lot of buzzwords, philosophies, languages, technologies and architectures out there.
Even more than for frontend, which may be chaotic and overhyped at times, but ultimately it’s mostly for presenting stuff – so it’s easy to see if something works fine or not. For backend though… It’s hard to cut through the noise of hype and corporate language to see real value. (On the contrary, these technologies tend to change slower.)
Some systems I’ve worked with were doing their job quite fine, some were awful legacy code or over-engineered spaghetti based on custom frameworks solving problems that shouldn’t exist in the first place. But at least they created jobs. I digress.
Today, everything revolves around REST APIs and microservices – they often work great with web apps.
I’ve had the chance to participate in creating some sophisticated & robust backend architectures, optimize performance, introduce asynchronous processing & communicate developments via design documents and UML diagrams.
Uncharted: I got into the game too late (or in the wrong place) to deal with XML & SOAP APIs. Have I missed something?
Next up: pursuing a staff level in a technical sense. This would mean exposing myself to a variety of systems, architectures and leadership challenges.
Scala! ♥️ NodeJs, Java, some Python
I know that experience with languages does matter, but just as I don’t believe in buzzwords or frameworks, I don’t believe in languages. I know what each category is supposed to do so I can get up to speed relatively quick.
- Scala: Play Framework. I’m addicted to the functional syntax.
- Java: mostly Spring, especially WebFlux.
- Django: I have recently picked up Django for some backend projects. It’s opinionated like crazy, but does the job.
Next up: I unfortunately don’t care so much about languages per se unless they contain fun stuff like type pattern matching, immutability or expressive functional syntax. Most don’t. 😥
Infrastructure, devops, CI/CD, monitoring & observability
Not a devops engineer… but still familiar with moving around among the clouds!
I can write a Dockerfile, set up a Git repo with some nice workflow, configure Docker-compose. I can interact with Linux-based systems, modify HTTP server or proxy config etc. Happy to optimize pipeline (e.g. CircleCI) config every once in a while.
It’s important to keep systems monitored and their operation observable. I’ve set up monitoring with New Relic & Grafana dashboards for example.
I have some basic K8S experience and a Certified Kubernetes Application Developer cert. Currently preparing for the AWS Cloud practitioner exam, with plans to move on to Cloud Solution Architect.
Uncharted: Azure & GCP.
Trying to keep my algorithms optimized 😜
Well, I started out as a different kind of engineer (mechatronics). So I actually have good formal education in certain aspects of maths, physics, control systems, mechanical, electrical & simulations engineering… all slowly becoming obsolete in my head.
Since I started software engineering, I have picked up some theory on programming languages, algorithms, data structures and computer security. It’s great to be able to assess algorithmic complexity and bottlenecks of business logic, and to see behind the curtains of programming languages.
Next up: there’s still quite much to discover here. Look at some lambda calculus because it might enlighten me? (Kidding.)
I’ll write and maintain projects that are safe from common vulnerabilities. And then fix whatever the pentesters have found.
I of course know about stuff like OWASP top 10 vulnerabilities and have implemented JWT, oAuth and other authentication methods. I can setup protections like CSP, CORS, CSRF and HSTS for basic security.
Nevertheless, cybersecurity is more than that: it’s about being able to design and implement usable and secure applications, not merely just about assessing vulnerabilities or modeling threats.
I had been working as a ‘security champion’ in my team, fostering good security practices and conducting security reviews of our projects with security specialists.
That’s a long list and it was great to contemplate on my engineering journey so far. It seems that I have progressed a lot. Companies call me a ‘senior engineer’, but I also don’t believe in titles 🙂 since they are… just titles.
For me, seniority as an arbitrary level of competence mostly means that I kind of know what I don’t know.
In fact, if I went to a job interview today, anyone can ask some trivia questions I wouldn’t know. Of course they would learn what I don’t know instead of learning anything about what I do know.
See you next time!