- Foreword
- Career progress
- Methods and working practices
- Directions for learning
- Core Software Engineering skills
- Web Technologies
- Cloud and infrastructure skills
- DevOps
- Mobile development
- Getting started with ML, AI (popular!)
- Analytics
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!
Btw. If you want to know everything about Reaktor and can read Finnish, check out our AmA thread on Reddit.
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:
- The Anatomy of Peace: Resolving the Heart of Conflict
- Leadership and Self-Deception: Getting Out of the Box
- The Five dysfunctions of a team
- Switch: How to change things when change is hard
- Mindset: The New Psychology of Success
- The Power of Habit: Why We Do What We Do, and How to Change
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:
- Full map of most things agile: https://www.mindmeister.com/425542788/agile-world?fullscreen=1
- Product Owner TL;DR: https://www.youtube.com/watch?v=502ILHjX9EE
- Kanban: TL;DR https://www.youtube.com/watch?v=R8dYLbJiTUE, Advanced: Eric Brechner – https://www.youtube.com/watch?v=CD0y-aU1sXo
- Jeff Sutherland’s “Scrum” Audiobook: https://www.youtube.com/watch?v=qr8hjVX4GX0
- Craig Larman’s LeSS (Scaling Scrum) book https://www.amazon.com/Large-Scale-Scrum-More-Craig-Larman/dp/0321985710
- Ran Nyman – https://www.youtube.com/watch?v=ZISdTPrtS0o
- Craig Larman – https://www.youtube.com/watch?v=HmdGvq_8rVQ
- Richard Hackman’s Leading Teams (Performance): https://www.amazon.com/Leading-Teams-Setting-Stage-Performances/dp/1578513332/ref=sr_1_1?s=books&ie=UTF8&qid=1544604704&sr=1-1&keywords=leading+teams
- Evolutionary Teal Paradigm (the one we’re currently in)
- Reinventing Organizations
- Holacracy
- Could be the next paradigm after Teal:
- Fred George’s Developer Anarchy (Managing Manager‐less Processes) https://www.youtube.com/watch?v=Zop0wTPrbk8 (In use at pioneering tech startups like Parity.io)
- Distributed Teams: https://medium.com/boost-vc/distributed-teams-dont-forget-the-fun-780427fa1cd5
- Remote first: https://www.forbes.com/sites/michalbohanes/2018/10/10/how-to-manage-a-distributed-team-5-best-practices-from-uk-startup-leaders/#4850255c4720
- Nature of the firm 2.0 by Joe Lubin https://www.youtube.com/watch?v=SQbcGhnv4jw
- Systems Thinking:
- Russ Ackoff – https://www.youtube.com/watch?v=OqEeIG8aPPk
- Peter Sange – https://www.youtube.com/watch?v=0QtQqZ6Q5-o
- Motivation - Daniel Pink – https://www.youtube.com/watch?v=u6XAPnuFjJc
- Business Agility - Jim Highsmith – https://www.youtube.com/watch?v=EEj6zVipqq0
- Lean Startup - Eric Ries – https://www.youtube.com/watch?v=fEvKo90qBns
- Silicon Valley Product Group books - https://www.svpg.com/books/
- Blogs of Reaktorians:
- Jarkko Kailanto: https://coachjarkko.com/
- Sami Lilja: https://samililja.wordpress.com/
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.
- Depth and width of skillset: need to have at least 1 domain (preferably more) where you’re ready to go and productive. Could be, for instance, frontend development with React or backend integrations with Scala. The narrower your applicable skillset is, the deeper it has to be.
- Understanding, analysing and writing good and maintainable code
- Refactoring with confidence based on a sufficient set of automatic tests
- Communications, talking about code, understanding other’s code, code reviewing
- Version control best practises and knowhow
- Deploying code with various techniques, understanding the infrastructure your code is running on
- Different levels of abstraction and different type systems. For instance, C vs Java vs JS.
- Paradigms like OOP, FP, imperative vs declarative. For instance, C vs Java vs Typescript vs Haskell
- Memory management, stack, heap, static, GC, borrowing, ref counting. Understanding the different approaches in programming languages, for instance C vs Rust vs Swift vs Python.
- Algorithms, data structures and complexity. What’s wrong with O(n^2)?
- State machines, formal languages, parsers and compilers
More specific skills (too name a few)
- Web and networking fundamentals. HTTP(S), TCP, TLS, REST, HTML, XML, JSON, CORS etc.
- Cloud infrastructure understanding and automation skills
- Web / mobile frontend skills with different technologies
- Architecture of large-scale distributed systems
- Unix system and command-line skills
- Databases, different flavors including relational, document storage, data warehouses, ACID, consistency models, scalability, replication, sharding...
@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.
@raimohanska Make sure understand the relatively static basics first and check my "skills list". Then consider your definition of full-stack: mine includes not only frontend and backend javascript. My kind of full-stack developer knows how to deliver value to their customers (be they inhouse or a client) by not only considering the how but also making sure you have a common understanding on what are the most important things to do. Yet, to get back to actual developer skills, you should have a solid understanding of web technologies, networking, runtime infrastructure, databases etc. It's good to know your tools under the hood, but also to know more than one tool for the job. Get out of your comfort zone and keep learning.
@mwing: My shortlist for skills and technologies for a "full-stack developer", more of these in the Web Technologies section. Frontend techs:
- Javascript (native, but why not some of the different dialects/languages such as TypeScript)
- React.js
- CSS3 (especially Flexbox, maybe even CSS Grid)
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.
- Value, success, happiness, learning to learn
- https://twitter.com/naval/status/1002103360646823936?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1002103360646823936&ref_url=https%3A%2F%2Fmedium.com%2Fmedia%2F7176a1ee4cdeec7e82b0139f16bb7a65%3FpostId%3Da5fd60ac5788
- https://medium.com/@bensimblog/15-lessons-i-learnt-on-success-happiness-reading-love-and-life-from-naval-ravikant-6808ac8d7b2
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](Domain Driven Design https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215) 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.
@srosenda: For bottom-up learning I recommend wholeheartedly Ben Eater’s video lessons and Nand to Tetris.
@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.
- @lauripiispanen: Stanford's Algorithms on Coursera
- @RikuMantysalo: Harvard's CS50
- @erikssa3: The Imposter's Handbook
- @jlehva: Programming Languages: Principles and Paradigms and Arto Wikla's Ohjelmointikielten periaatteet at the University of Helsinki
@raimohanska Then some more functional-programming oriented books:
- SICP, i.e Structure and Interpretation of Computer Programs now freely available online. Uses Scheme Lisp as the programming language.
- Javascript version of SICP
- Programming in Scala
- Real World Haskell
- Functional Javascript by Michael Fogus
- Mostly Adequate Guide to Functional Programming
- More on our Functional Programming Reading List
@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.
- @sluukkonen and @JaniL recommend Computer Networking: A Top-Down Approach which is also part of the curriculum in Helsinki University
- @kiesila This is excellent for networking: Computer Networks by Andrew S. Tanenbaum (Plus you get the chance to read stuff from one of the giants of CS, plus the man behind notorious comments about Linux...)
- @timorantalaiho I studied networking basics from TCP/IP Network Administration by Craig Hunt
- @jkseppan check out TCP/IP Illustrated by W. Richard Stevens
- @joonamo OWASP Top 10 Most Critical Web Application Security Risks
- @raimohanska check out Web Application Hacker's Handbook for in-depth knowledge of security breaches, attacks and defenses
- @jkseppan if you're ever tempted to roll your own crypto, working through even a few of these exercises should give you an idea of what you are up against: cryptopals.com
- @pihvi Cloudflare Blog
- @miso For security, follow a few blogs (https://krebsonsecurity.com/, https://www.schneier.com/, https://www.troyhunt.com/), visit meetups, attend conferences
- @miso The OWASP Secure coding practices page has some useful information for defensive coding (https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide)
@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.
- Getting started - how well your team knows A vs B. Will affect how quickly you'll get started
- Maintainability - how does the long-term game look for the alternatives? Will you be in need of version updates and will those be available in the future? Is the technology open and simple enough for the team to be able to contribute to it themselves instead of reliying on external support
- Costs - is this free software or do you have to pay for it? What are the projected initial and recurring costs. When it comes to hosting services, you're unlikely to have free options.
- External limitations - does your client or IT team have a fixed set of available options that they let you choose from? Are these negotiable? Are they based on the right assumptions?
- Performance - response times, CPU consumption, network bandwidth requirements, memory consumption. All of these often affect both costs and user experience.
- Developer productivity - sometimes it makes more sense to use higher levels of abstraction to sacrifice some raw performance for improved productivity. An extreme example would be the choice between writing something in Assembly or Elm.
- Fun and learning - will the team have fun while working with the selected option? Don't discount this, because a motivated team will be much more productive than a reluctant team that's been forced to use a technology they hate. Developers usually enjoy picking up new, interesting tecnhologies, instead of banging with the same tools from year to year. Yet, everyone's different
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:
- @eagleflo Mozilla - Getting started with the Web https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web
- @matthiaskern Eloquent Javascript https://eloquentjavascript.net/index.html
- @raine Web developer roadmap https://github.com/kamranahmedse/developer-roadmap might be a bit intimidating but gives you an idea on what there is to learn. You don't have to know all this stuff to be productive though!
- @kenkku The Helsinki University has a good Fullstack MOOC https://fullstackopen.com/ (edit: updated to 2020 version)
- @ksnabb Helsinki University has good fullstack courses that can be found here
- @serhatsezer Freecodecamp has really good hands-on articles and video tutorials about full stack web development
@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!
- Martin Fowler – https://www.youtube.com/watch?v=wgdBVIX9ifA
- Kevin Goldsmith (Spotify) https://www.youtube.com/watch?v=7LGPeBgNFuU
- Ruslan Meshenberg (Netflix) – https://www.youtube.com/watch?v=57UK46qfBLY
- Rodrigue Schaefer (Zalando) – https://www.youtube.com/watch?v=gEeHZwjwehs
- Randy Shoup (Google, eBay) – https://www.youtube.com/watch?v=9vS7TbgirgY
@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.
Javascript skills in general are highly useful in all things web, as you can use the same language on both client and server.
@henrikauppinen Invest enough time in learning the foundations, you will reap the benefits by being able to look at and dig deeper into any library or framework. Here are some links for learning Javascript!
- https://frontendmasters.com/courses/javascript-the-good-parts/
- https://github.com/getify/You-Dont-Know-JS
- https://frontendmasters.com/courses/javascript-foundations/
@auramo I recommend Effective Javascript by David Herman, which has points similar to those in "Javascript the Good parts" but in a more analytical way.
@kettuniko The Event Loop is one of the fundamental things in JavaScript runtimes, and understanding it will help you with your day-to-day development tasks. Watch Jake Archibald's great presentation about how browser's event loop works https://www.youtube.com/watch?v=cCOL7MC4Pl0
@jonikanerva Recommends The Javascript Allonge
@raimohanska Nowadays a lot of Javascript development has seemed to moved to static typing with TypeScript. It's definitely worth checking out. You might want to start with reading TypeScript Deep Dive.
Some randomish tips from our experts for web development:
@timorantalaiho Plan and test for performance from the start (ab
https://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 I suggest you understand the basics of web technology, including Javascript and the DOM before reaching for tools like React. Yet, learning React makes sense and is worth investing your time into!
@raimohanska When you've already dirtied (and burned?) your hands with React, you might want to check out the You Might Not Need an Effect article.
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 If you understand the basics of web techonologies in general and know your Javascript, Node.js is a good fit for your simple server-side needs. Make sure you understand how it works though. Know your callbacks, promises and async-await.
@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
- increasing abstraction level in cloud services ("cloud native" software)
- "hybrid" clouds which encompass multiple providers and/or on-premises servers.
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 docker run
.
- What are containers (spoiler: they are Linux + cgroups)
- Container runtimes and Docker
@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:
- Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))
- Github Actions documentation
- Helsinki University fullstackopen part 11 (added January 2021)
(added December 2021)
- https://roadmap.sh/devops this is quite comprehensive roadmap
- Learn one cloud (with e.g. AWS Solutions Architect associate)
- Learn one CI/CD tool (e.g. Github Actions, Gitlab CI)
- Learn one IaaC tool (e.g. Terraform)
- Learn the main concepts of virtualisation, containers and orchestration. (e.g. what’s the difference between serverless, container, vm and baremetal / difference between EKS, ECS and Fargate / understand how Docker works under the hood
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
- work through a book like this one
- take the Coursera ML course by Andrew NG https://www.coursera.org/learn/machine-learning
- try the stuff out on simple public competition datasets (Kaggle)
- ... and do not underestimate the math-ish parts ... to quote a dev2ds alumni @maglob , "OMG, It's full of dot products!"
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:
- @jkseppan My generic advice is "build something [in Python] that interests you and is slightly above your current skill level, repeat until skill level is sufficient". The user interface at https://devdocs.io includes documentation for Python and several interesting libraries, so I recommend keeping it open in a browser and learning how to search effectively.
- @eagleflo When I first started programming Python in early 2000s, I was stunned how easy-to-read and informative the official tutorial is. It remains that way to this date: https://docs.python.org/3/tutorial/index.html.
- @janihell I got a flying start with a hands-on tutorial by Dr. Andrew N. Harrington. The course explains the basics in detail which made the language easy to grasp. https://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/index.html. I’d also recommend Udacity’s free Python courses that are very streamlined and user-friendly. The courses have plenty of small coding puzzles and quizzes that enable you to apply the things you’ve just learned. www.udacity.com
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
@joonamo
- Digital Foundry https://www.youtube.com/channel/UC9PBzalIcEQCsiIkq36PyUA
- The 8-Bit Guy https://www.youtube.com/channel/UC8uT9cgJorJPWu7ITLGo9Ww
@rjoonas
- Black Hat conference https://www.youtube.com/channel/UCJ6q9Ie29ajGqKApbLqfBOg
@kenkku
- Tom Scott https://www.youtube.com/user/enyay
- Wendover Productions https://www.youtube.com/user/Wendoverproductions
- Practical Engineering https://www.youtube.com/channel/UCMOqf8ab-42UUQIdVoKwjlQ
@paavohuhtala
- Ashens https://www.youtube.com/channel/UCxt9Pvye-9x_AIcb1UtmF1Q
- Technology Connections https://www.youtube.com/channel/UCy0tKL1T7wFoYcxCe0xjN6Q
@JereNurminen
- Computerphile https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnA
@jkseppan
@bembu
- Andreas Spiess https://www.youtube.com/channel/UCu7_D0o48KbfhpEohoP7YSQ
- Strange Parts https://www.youtube.com/channel/UCO8DQrSp5yEP937qNqTooOw
- GreatScott! https://www.youtube.com/user/greatscottlab
- SmarterEveryDay https://www.youtube.com/user/destinws2
- The Coding Train https://www.youtube.com/user/shiffman
- Linus Tech Tips https://www.youtube.com/user/LinusTechTips
- Marques Brownlee https://www.youtube.com/user/marquesbrownlee
@eagleflo
- Computer History Museum: https://www.youtube.com/channel/UCHDr4RtxwA1KqKGwxgdK4Vg
- Two Minute Papers: https://www.youtube.com/channel/UCbfYPyITQ-7l4upoX8nvctg
@teijo
- Computer hardware
- Ben Eater (computer from scratch) https://www.youtube.com/channel/UCS0N5baNlQWJCUrhCEo8WlA
- Construction
- Essential Craftsman (blacksmithing, construction) https://www.youtube.com/channel/UCzr30osBdTmuFUS8IfXtXmg
- Practical Engineering (civil engineering) https://www.youtube.com/channel/UCMOqf8ab-42UUQIdVoKwjlQ
- Design
- Game Maker's Toolkit https://www.youtube.com/channel/UCqJ-Xo29CKyLTjn6z2XwYAw
- Electronics
- EEVblog https://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ
- ElectroBOOM (edutainment) https://www.youtube.com/channel/UCJ0-OtVpF0wOKEqT2Z1HEtA
- Fran Blanche https://www.youtube.com/user/ContourCorsets
- Jeri Ellsworth https://www.youtube.com/user/jeriellsworth
- Kaizer Power Electronics (RF and high power gear) https://www.youtube.com/channel/UCSukTlgTEWiL-sl0UeYeJvQ
- Mr Carlson's Lab https://www.youtube.com/channel/UCU9SoQxJewrWb_3GxeteQPA
- Robert Feranec (PCB design) https://www.youtube.com/channel/UCJQkHVpk3A8bgDmPlJlOJOA
- mikeselectricstuff https://www.youtube.com/channel/UCcs0ZkP_as4PpHDhFcmCHyA
- History
- AT&T Tech Channel https://www.youtube.com/channel/UCnpDurxReTSpFs5-AhDo8Kg
- Nostalgia Nerd https://www.youtube.com/user/nostalgianerdvideos
- PeninsulaSrsVideos (military aviation) https://www.youtube.com/channel/UChYBaJlXRd8-f9Ejz7nf6uw
- Technology Connections (legacy home entertainment technologies) https://www.youtube.com/channel/UCy0tKL1T7wFoYcxCe0xjN6Q
- Mechanical engineering
- Abom79 (machining) https://www.youtube.com/user/Abom79
- AgentJayZ (jet engines) https://www.youtube.com/channel/UCh57rwk3ySElDpzgCDLh9KA
- JoergSprave (Slingshot Channel) https://www.youtube.com/channel/UCVZlxkKqlvVqzRJXhAGq42Q
- This Old Tony (machining) https://www.youtube.com/channel/UC5NO8MgTQKHAWXp6z8Xl7yQ
- Watch Repair Channel https://www.youtube.com/user/jewldood/videos
- thang010146 (mechanisms) https://www.youtube.com/channel/UCli_RJkGWfZvw4IlDLHNCQg
- oxtoolco (toolmaking) https://www.youtube.com/user/oxtoolco
- Misc
- Applied Science https://www.youtube.com/channel/UCivA7_KLKWo43tFcCkFvydw
- Real Engineering https://www.youtube.com/channel/UCR1IuLEqb6UEA_zQ81kwXfg
- Scott Manley (space) https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-A
- styropyro (lasers) https://www.youtube.com/channel/UCJYJgj7rzsn0vdR7fkgjuIA
- RF
- TRX Bench (repairs) https://www.youtube.com/user/TRXBench
- The Signal Path (high end experiments, repairs, and gear) https://www.youtube.com/channel/UCKxRARSpahF1Mt-2vbPug-g
- W0QE (RF simulations) https://www.youtube.com/channel/UCKSyLSu4fm_1RHoO3Jvk4YQ
- w2aew https://www.youtube.com/channel/UCiqd3GLTluk2s_IBt7p_LjA
- Chemistry
- U.S. Chemical Safety and Hazard Investigation Board (accident investigations for chemical industry) https://www.youtube.com/user/USCSB
- NileRed (expeirments) https://www.youtube.com/user/TheRedNile
- Periodic Videos (history, experiments, academia) https://www.youtube.com/user/periodicvideos
@erikssa3
- IppSec (security, pentesting, CTF) https://www.youtube.com/c/ippsec/