This started when we offered free sparring sessions with our experts for anyone (developers, designers, consultants..) in the Reaktor Development Discussion campaign. We quickly got a whopping 255 applications and were obviously not able to meet everyone in person.
We did, however, spot some recurring themes that we hope to be able to help with by simply sharing some insights from our team. For instance, there was a lot of demand for learning specific technological skills or more generally, getting tips for what is worth learning and how to find learning resources. Hence, let me present, an assortment of frequently asked questions, with some answers to most of them!
Huge thanks to all Reaktorians who offered their help!
This document is meant to never be complete. That's why we need your input! If there's anything that you'd always wanted to know but have hesitated to ask, this is the place to get an answer. You can post an issue detailing what it is that's on your mind and we'll try and get it answered.
The whole idea of this campaign was to help people with their careers and skills development and many were wondering what are the possible career paths for developers and more specifically, how to get from developer to architect or consultant.
Only half-jokingly, the traditional career path for developers is to promote the best of them to a managerial position so that they can no longer do what they do best. In a flat-hierarchy technology consultancy like Reaktor, there are many other options though. You can extend your knowledge horizontally to different domains and technologies or vertically almost infinitely deeper into specific topics, or "higher up" to overall architecture or technology strategy.
You can extend your reach also to the business side of things, helping clients not only with technology, but also with improving theirs business. Not to mention taking part in developing your company itself. Then, the borders between design (business, product, user interface, visuals) and technology are made to be crossed too and being able to contribute on a broader spectrum is highly appreciated and also something we help people to achieve. So, starting from a "mere" software developer, there are infinitely many different paths you can take, given you have the motivation to do so.
So, as a developer you can go to all directions (H, J, K and L if you know what I mean), but staying put is not an option, because of obvious reasons. Always keep learning and expanding your skills, and remember to step out of your comfort zone.
So, how to become a software architect? There are many kinds of architects, for sure, but IMO a good software architect is someone who can come up with realistic plans for implementing a larger-scale software system, and actually implement them too with a team. You’ll need deep and wide hands of experience with different technologies, some stories of success and failure. It’s essential to understand that you cannot just draw a diagram in PowerPoint and ask someone to code it. You can only plan your architecture up to a point and have to verify your assumptions at a sufficiently early stage of development to avoid huge mistakes from showing up in a later stage when they are harder to fix. You cannot isolate yourself into the proverbial ivory tower, because need to understand your application domain, your customer and your team. To achieve this you’re actually going to have to talk to people a lot. I wholly agree on system architecture usually reflecting the structure of the organization that’s been working on on it. To make all pieces fit optimally, the people working on them should work together towards the same goal and communicate.
So, to become a good software architect, get diverse hands-on experience in software development, get involved in decision making and ask a lot of questions to understand why certain decisions are made. To be able to pick the best option, you need to understand your success criteria, be aware of a wide range of options and validate your decisions with data.
Recommended books about teamwork and self improvement:
Many seem to be interested in learning Agile methods and modern working practices for software teams. So, here are some recommendations from our coaches, mostly from @cryptotommi-joentakanen:
Many asked for directions for learning. Here are some popular questions and some answers from our experts.
@cryptotommi-joentakanen: Fix your filter. If you’re interested in a particular technology, find out who the insiders in the scene are and then follow who they follow, eliminate other sources of information -> signal to noise. Only follow them on Twitter and Medium. Read everything they write. Find out what the trusted aggregated sources of news and knowledge are. Every conference later gets listed on Youtube, watch the talks on double speed, skip the first third of the video. Participate in meetups and talk to people. Then, think for yourself. Place bets if you’re brave, skin in the game helps you learn and stay up to date.
@cryptotommi-joentakanen: Nobody can accurately predict exponential growth of technology over a long period of time, especially post-singularity. But if I had to bet, I would place my money on AI in combination with trustless general purpose computation / decentralisation tech (e.g blockchain / crypto)
@raimohanska My tip is to make sure understand the relatively static basics before jumping to any flavor-of-the day bandwagon. See my "skills list" below.
... and relatedly, how to get a job without previous working experience?
@raimohanska To land a job as a coder, make sure you've got your basics covered. Build a portfolio (on Github or similar) of your work. This implies that you need to have done some coding! If you haven't pick something interesting and build it. Then show it off. The deeper and more diverse skills you can demonstrate the better. Always remember to write a README for any repository to point out what this is about, what technologies you're using and why. And how to build and run your application. Write a CV that points our your key skills and achievements and what you actually want do do. Be sure to include language (spoken and written) skills and place of residence!
Here are some basics I'd make sure to cover at some depth, at least.
More specific skills (too name a few)
@mwing: - Understanding of SSL certificates and why you'd better serve everything over SSL (https://www.troyhunt.com/heres-why-your-static-website-needs-https/)
@cryptotommi-joentakanen: - Seek one that seeks to always lead the way into the future, not just follow. - Seek one that allows you to manifest your passion - Seek one that aligns with your values - Seek one where you’ll be competent but still pushing yourself - Seek one that embraces diversity of thought - If you don’t find the qualities above, form your own
@raimohanska Find a place where you can find people with something to teach you. If you want to improve as a developer, join a team of other, more experienced developers. Look for a culture of sharing and working together, with shared ownersip, instead of working alone in silos. If you want to specialize in a certain area or domain, you might be looking for a product development firm. If you want to broaden your spectrum and work on a more varied range of domains and technologies, you're probably looking for a consultancy.
Backend: - A language or a few for doing backend developlent (Node.Js, Java, Scala, Clojure, C#, F#, pick your poison) - Databases, yes even NoSQL to understand when to use on and especially when not to use one - Understanding of web server software (apache, nginx..) - Understanding of the server OS, mainly Linux nowdays - Networking, especially when working with cloud providers - Cloud providers, the knowledge is transferrable as long as you understand how for example AWS is used
@mwing: Not at all required, but I've found that learning to use keyboard shortcuts of the programs you use as much as possible can free you from derailing your train of thought by having to switch between the keyboard and mouse / trackpad. IDE's nowdays come with thousands of features and learning shortcuts for all of them is impossible but you'll most likely use a handful of them 90% of time.
@cryptotommi-joentakanen: - Game theory - Mechanism design - Marketing - Personal branding - Social Dynamics
@mwing: I've found out that a developer should understand at least the basics of UX as you might end up somewhere without anyone with UX skills
Some were seeking the best resources for learning in general, but this is something we’ll address through our answers to more specific questions below.
Yet, as @cryptotommi-joentakanen said: Can’t beat books, if you had to choose one.
I classified some questions and topics into Core Software Engineering skills, because they are relevant in all kinds of software development, whether it's embedded, web, cloud or mobile.
First, the Teach Yourself Computer Science site recommended by @jussisaurio and others gives an excellent overview on the field, along with great recommendations for learning resources.
@raimohanska Here are some books that have influenced me. They are a bit old (as I too) and object oriented but the main principles still hold and are probably still worth a look: - Clean Code by Uncle Bob - Pragmatic Programmer - Design Patterns - Elements of Reusable Object-Oriented Software by the "gang of four" - Refactoring by Martin Fowler
@auramo points out a couple of "programming philosophy" presentations for the "post-object-oriented" world. - The Value of Values with Rich Hickey https://www.youtube.com/watch?v=-6BsiVyC1kM - Simple Made Easy https://www.infoq.com/presentations/Simple-Made-Easy - ... and also the ever-relevant Domain Driven Design by Eric Evans. - Also Steve Yegge's rants, highly opinionated, have been very influential. For example: https://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html
@eagleflow I’ve read http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ multiple times. Everyone who is interested in programming language design should read it. tl;dr: there are costs to introducing additional colors of functions to your codebase. Weight the options carefully.
@raimohanska: Colin S Gordon has a real treasure trove of linked free Computer Science books here.
These are especially recommended for self-taught programmers who feel they might want to beef up their understanding on the theoretical side of computer programming.
@raimohanska Then some more functional-programming oriented books:
@Korkkii Test automation is in my opinion crucial for maintainability of a code base, because it allows you to add features, refactor code and fix bugs while ensuring that you most likely did not break existing functionality. When developing a new feature or fixing a bug, make it a habit to add some test cases that check for the cases you noticed to be most relevant. You don’t need to achieve 100% code coverage for whole codebase as long as you achieve a high number for the most critical parts of your code whether that is your business logic, routing logic, or some other must-not-break part of the codebase. In many cases, Pareto principle works so you gain most of the test benefits by building good automated tests for the most critical parts of the codebase.
Good automated tests are usually independent of each other, fast and test expected behaviour instead of internals. The independence of tests guarantees that you can run only the one failing test in isolation in order to find what is broken and fix it. This way you can find the problems faster due less clutter. Second, fast tests provide you short feedback loop that allows less interruptions when concentrating. Your unit tests especially should run fast (seconds, maximum of couple minutes for huge codebase’s all tests) and if they don’t, it pays off to improve the performance of your test suites. Lastly, tests should not break when tested code’s internals change while their functionality stays the same. When writing a test for some behaviour, I suggest comment out the behaviour you are testing and make sure the expected tests fail. This check makes sure that your tests are actually testing what you hope them to be testing. Writing behaviour-based tests is usually the hardest part to do correct and I personally learned it from and liked the way it was taught in Robert Martin’s Clean Code.
For more about good test automation, I suggest reading about software testing anti-patterns which goes through many very typical mishaps about testing and provides good alternatives to try out.
@cryptotommi-joentakanen tips for Site Reliability Engineering: - DropBox – https://www.youtube.com/watch?v=ggizCjUCCqE - Uber – https://www.youtube.com/watch?v=qJnS-EfIIIE - Atlassian – https://www.youtube.com/watch?v=LMguiL0a90I
@raimohanska As a developer, especially when working with anything related to the Internet or the WWW, you'll want to know you Networking, TCP/IP, HTTP and Data Security. A basic understanding of cryptography won't hurt either. Here are some learning tips from my collagues.
@raimohanska Nowadays, you'll often have a baffling number of options to consider when starting to build something new. It's often not an easy choice and you should take time to find the viable alternatives and more importantly, your selection criteria. Things to consider include when picking between, say A and B.
When picking your technologies, you might want to involve the whole team in the discussions instead of having an Architect dictate the choices. Better decicisions often get made when those affected by the decision are part of the decision making process.
Also, make sure you have enough information to make your decision and be prepared to take it back. It might make sense to make a list of concerns with a choice, then eliminate the concerns by building a "spike" solution that focuses on them. For instance, if you're concerned about the performance of a system based on a certain technology (you should be!) build the minimal viable performance test setup to find out how things play out.
@raimohanska Here are some beginner-friendly learning resources from my collagues:
@tknuutin If you're just starting to learn a given area of tech, like frontend, it's probably a good idea to stick to one of the current industry standards. Even if they can be "flavor of the month" and get untrendy in a couple of years, they're probably at least not completely awful and broken and there's likely a lot of help available in various communities. It's also good to select as few as you can get away with. Start with just a couple of tools, then add more once you start to feel the pain, so to speak. The current trendy options would seem be React, Angular, or Vue (I recommend React). @lauripiispanen Since I personally believe that work can be a very good educator, as a beginner it makes sense to study the most common options just to make yourself more "employable". Hence I'd definitely recommend React.
@eagleflo Take time to learn SQL. It’s one of those gifts from the early 70s, and it’s not going anywhere. It doesn’t take that much time to grok how relational databases work, and that skill will come in handy in basically every backend project you ever work on. You don’t have to become a full-fledged DBA in order to be confident in your ability to design sane schemas, migrating insane legacy schemas towards sanity, and writing efficient queries. Also, check this out: https://use-the-index-luke.com/
@mwing: You'll most likely work a lot with Unix/Linux servers, so an understanding on how to configure and maintain a server is really helpful. Learn to use the command line efficiently and understand the Unix philosofy (https://en.wikipedia.org/wiki/Unix_philosophy)
@kettuniko The Twelve Factor App (https://12factor.net/) gives good practises for building scalable services.
@cryptotommi-joentakanen has some suggestions for you!
@simoraman Often when people hear serverless they think AWS Lambda. However AWS Fargate is also a form of serverless computing. It removes the server setup and management work without requiring complete paradigm shift regarding how the application is built. Docker technology is not tied to AWS and the software could also be deployed to regular server without docker without the need for a rewrite. It should be noted that in regards of pricing and scalability Fargate is very different from Lambda. @raimohanska For starters, serverless means just that you're running your code on somebody else's servers. I agree with Simo and would like to point out that also easy-to-use PaaS services like Heroku are very much serverless too in the sense that you can easily push your application online and have the service provider take care of setting up servers and scaling out. The main difference to, say, AWS lambda is though that you'll be paying for the resources (instances, dynos whatnow) you've reserved while with Lambda you only pay for the computations that actually occurred. Also, don't confuse the serverless concept with Serverless framework which allegedly make it easy to build serverless applications.
@eagleflo make your app “deep linkable”. Store state in the URL, so that each person who clicks a link will see the same content. Seen way too many SPAs which don’t follow that, kind of breaking what it means to be a web app.
Some randomish tips from our experts for web development:
@timorantalaiho Plan and test for performance from the start (
abhttps://httpd.apache.org/docs/2.4/programs/ab.html is a good friend of anyone working with REST APIs). Just remember to not optimise prematurely.
@paavohuhtala Invest in developer experience. Hot reload, fast build times, and type hints in your editor of choice can be massive boosts to productivity, even in smaller projects.
Then, some very specific technologies were mentioned quite a few times too, including
@raimohanska One of the go-to tools you’ll want to integrate into your web application toolchain. Comes with create-react-app for instance and is worth understanding properly. In general, you should understand how your application is put together, even though using easy boilerplate tools.
To be really effective with React (or any tech actually) it makes sense to know how it works under the hood. What a better way to achieve this than Build your own React!
@raimohanska I suggest you learn your React first before applying external state management tools. You should, once again, understand the problem first before jumping for solutions.
@tknuutin Like raimohanska said, when you're just learning, focus on just React first. It will help you understand why the external management tools are needed, and sometimes when you can live without them.
Once you get beyond React class components, the approach of having a single large immutable State object and passing that around in one way or another has become the most popular solution for state management. Redux is the most common library. I've also heard good things about MobX but can't say much about it.
My recommendation is to first use just Redux without any other plugins for it, and write something that involves async logic (like fetching from an API) to see the problems that raises. Then try something like Redux-saga or Redux-thunk that build more of a framework around Redux. These are useful tools, but my recommendation is to eventually learn functional-reactive-programming and use Redux-observable. Note that FRP can have a very steep learning curve and it's still more of a niche paradigm, just one that I think works incredibly well for frontend.
@raimohanska Promises are now part of the ES standard and you should master them. The async-await syntax makes their use easier to understand and less error-prone, but make sure you understand how promises work underneath, too.
Unsurprisingly, many are seeking to get or stay aboard the cloud infrastructure fast train.
@raimohanska The AWS Certified Solutions Architect - Associate online course is a good way to get started with AWS. For me, it's a bit too much geared towards getting certificate, but gives a good overall impression on AWS cloud services. You'll of course need some hands-on experience on top of this but the course definitely gives an overall impression on what's available.
@lauripiispanen: Some trends at the time of writing (Dec 2018) are
IMO when dealing with increasing abstraction, it is still always a very good thing to understand what's going under the hood. Things higher in the abstraction spectrum change much more quickly than the underlying things. Therefore when it comes to cloud, it's useful to have a grasp of computer networking (routing, firewalls, VPCs etc.), operating systems (linux or windows if you're using Azure), databases etc. Learning these things will stay relevant much longer and will give you a good base to understand "simpler" higher-level things. When designing software, higher abstraction often gives you possibilities to do more with less work (or offload some of your work to a 3rd party), albeit with the cost of change making your selected solution irrelevant or ineffective faster. You trade speed/cost with flexibility, and this is always a tradeoff when choosing between highly abstract managed services vs. rolling your own - you and only you can know what is important in your particular situation, and you cannot make these decisions without taking your own context into account.
I think @jylitalo's answer to the next question is very relevant when talking about hybrid clouds: there are definite overlaps between cloud providers, and usually the lower you go in the level of abstraction, the more things start to look the same. This, again, highlights that learning the lower level stuff is usually more portable. Application/managed services are what changes the most between different providers and therefore in order to fully leverage hybrid solutions, you need to know what these products are.
@jylitalo I recommend mastering one platform first (be it AWS, Azure or GCP) and only after that expanding to other platforms, since the skills needed do overlap quite a bit. Also, of course, you need to master at least one of these properly to get anything done.
@raimohanska First off, get an overall understanding on the AWS service offering and architecture. Then, familiarize yourself with the concept of Infrastructure as Code and learn to use an automation tool (CloudFormation or Terraform) and build a system using that. Using automation tools you can repeatedly set up and tear down your whole infrastructure and get separate, identical, test and production environments without code duplication.
@raimohanska Here's some entry-level stuff for getting into grips of what containers are and how Docker and Kubernetes fit into the picture. It's good to know the relationships between things before just
@lauripiispanen: Kubernetes is a "container orchestration system for automating application deployment, scaling, and management". There are other solutions for the same problem, but as of Mar 2020 Kubernetes is by far the most popular. As per its definition, Kubernetes is a complex system. My recommendation is that if you're thinking "should I use Kubernetes", the answer in 99% of the cases is "no" (see other "serverless container engines" such as AWS Fargate). Also, even if you use Kubernetes, in 99% of the cases you do not wish to host one yourself (see GKE, EKS or AKS). All that being said, Kubernetes is something that you may be faced with in your career, particularly if you're working with larger IT organizations. Therefore, it is somewhat beneficial to learn how to use it.
There are several online courses for Kubernetes (e.g. cloud academy). Additionally, the Cloud Native Computing Foundation offers two certifications: Certified Kubernetes Application Developer (CKAD) and Certified Kubernetes Administrator (CKA). Both of the certifications exams are very hands-on, and they are not easy.
DigitalOcean has a fun exercise/tutorial for deploying Kubernetes with kubeadm. For added fun, I recommend doing this with a fully infrastructure-as-a-code setup.
Suggestions for a good course/self study resource on CI/CD:
There are some many ways to do mobile these days, starting with native iOS and Android development and the very promising cross-platform Flutter, not to forget the possibility of writing a PWA (just a web page really) that fit some needs pretty well too. For both of these good starting points are here.
@arimkevi Among our experts, there seems to be a strong consensus here that on Android you should use Kotlin (see resource list). Download Android Studio, fire up an emulator and get started on building something! Official documentations has a good step-by-step on how to do this. It is also beneficial to check out the best practices by Futurice. The best practice guide has a extensive listing of libraries and tooling often used.
If you like to check out some courses first, Google and Udacity provide a very extensive free training program in the Google Developer Training portal. Free courses range from total beginner to advanced and UX and design.
Once you need a backend for your application, it’s good to check out what Firebase has to offer. It’s a quick way to get your crash reporting, analytics, persistence and APIs up and going fast.
To call the API’s you will need to handle the concurrency. Android blocks async requests on the UI thread. For this we love reactive programming and tools like RxJava and bindings for it: RxAndroid, RxKotlin. To make the calls in a reactive manner Retrofit is the tool of choice.
@WickedLynx If you go with iOS, you might want to start with this online course and check out this always updated mega list for iOS. Don’t let the number of alternatives stop you from starting to learn though!
@luotsi To get a practical and pythonesque, but not too superficial overview covering pretty much the essential classical algorithms, strong heads-up for Raschka-Mirjalili Python Machine Learning. Includes a toe-dip in deep learning. We looked at several books to suggest for our Reaktor Dev2DS Academy, and ended up working through this one.
So, to get started, you could
Learning Python seems a popular topic! No wonder, since it’s the go-to language for data scientists and machine learning (I was told). Asking our experts (and beginners) I got a really varied set of stories how people learned Python. Here are some stories and tips:
As an added bonus, we compiled a list of tech-related YouTube-channels that we, Reaktorians, are watching. Enjoy!
@JaniL - Fun Fun Function: https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q - Jetbrains tv: https://www.youtube.com/user/JetBrainsTV