No description, website, or topics provided.
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
README.md Add opinions about test automation to README Jan 17, 2019

README.md

This started when we offered free sparring sessions with our experts for anyone (developers, designers, consultants..) in the Reaktor Development Discussion campaign. We quicky 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!

Career progress

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.

Methods and working practices

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:

Directions for learning

Many asked for directions for learning. Here are some popular questions and some answers from our experts.

How to stay up to date with rapidly evolving technology (popular!)

@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.

Which technologies are worth learning in the long run

@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.

Skills and technologies to learn to get a job! (popular!)

... 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 tecnhologies 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...
  • 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...

What kind of workplace should I seek, to learn better

@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.

What are the most important skills for a “full-stack developer” (popular!)

@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.

What should I learn to diversify my skills

@cryptotommi-joentakanen:

  • Game theory
  • Mechanism design
  • Marketing
  • Personal branding
  • Social Dynamics

Learning resources

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.

Core Software Engineering skills

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.

Recommendations

@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:

@raimohanska Then some more functional-programming oriented books:

@auramo points out a couple of "programming philosophy" presentations for the "post-object-oriented" world.

@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.

Test automation

@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.

Writing modular code

Developing for maintainability and reliability

@cryptotommi-joentakanen tips for Site Reliability Engineering:

Building systems with good data security

Build tools and pipelines

Assessing different architecture/technological options

@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.

Web Technologies

Understanding web technologies

@raimohanska Here are some beginner-friendly learning resources from my collagues:

How to select frontend tools

@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.

Backend skills

@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/

Developing scalable web services

@kettuniko The Twelve Factor App (https://12factor.net/) gives good practises for building scalable services.

Microservice backed design

@cryptotommi-joentakanen has some suggestions for you!

Serverless solutions

@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.

Single Page Application best practices:

@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.

Learning Javascript

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!

@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

Random tips

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

Webpack

@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.

React and related technologies

@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!

Relatedly, Redux and other state management solutions for 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.

Node.js

@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.

Javascript Promises

@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.

Cloud and infrastructure skills

Unsurprisingly, many are seeking to get or stay aboard the cloud infrastructure fast train.

Learning cloud architecture skills

@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.

Future of cloud infrastructure; what to learn to stay relevant

@lauripiispanen: Some trends at the time of writing (Dec 2018) are

  1. increasing abstraction level in cloud services ("cloud native" software)
  2. "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.

Do I need to master multiple cloud platforms or one. Which one?

@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.

Publishing software to the “cloud”

Serverless solutions

AWS

@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.

Kubernetes

Containers/docker

Kafka

Mobile development

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.

Android

@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.

iOS

@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!

Getting started with ML, AI (popular!)

@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!"

Python

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
  • @hhamalai Python is easy to learn, but the idiomatic, functional-ish way is the only right way. https://github.com/sfermigier/awesome-functional-python

Analytics

Needed skills in becoming a successful analytics professional

Channels to watch

As an added bonus, we compiled a list of tech-related YouTube-channels that we, Reaktorians, are watching. Enjoy!

@JaniL

@joonamo

@rjoonas

@kenkku

@paavohuhtala

@JereNurminen

@jkseppan

@bembu

@eagleflo