io:format("Hello, World!~n", []).
Ask the right questions to secure the right Erlang 18 talent among an increasingly shrinking pool of talent.
Erlang 18 is a concurrent, functional programming language designed for building scalable, fault-tolerant systems. It was originally developed by Ericsson in the late 1980s to handle telecommunication switches but has since been used extensively in various domains such as finance, e-commerce and computer telephony. Its concurrency model makes it particularly well-suited for real-time distributed applications that require high availability. The language's name "Erlang" pays tribute to Agner Krarup Erlang, a Danish engineer and mathematician known for his work on traffic engineering theory. The release of Erlang 18 introduced numerous enhancements including time correction improvements and support for maps (source: erlang.org).
The next 20 minutes of the interview should attempt to focus more specifically on the development questions used, and the level of depth and skill the engineer possesses.
OTP (Open Telecom Platform) is a set of Erlang libraries, which consists of the Erlang runtime system, a number of ready-to-use components mainly written in Erlang, and a set of design principles for Erlang programs.
In Erlang, errors are handled using a 'let it crash' philosophy. This means that when a process encounters an error, it crashes and sends a message to a supervisor process, which then decides how to handle the error.
Procedural programming is based on the concept of procedure calls where a program is a series of procedures, while functional programming is based on the concept of mathematical functions and avoids changing state and mutable data.
Erlang has several key features including hot swapping, where code can be changed without stopping the system, concurrency, where it can handle many tasks at once, and fault tolerance, where the system can recover from errors.
Erlang is a functional, concurrent, general-purpose programming language and runtime environment. It was built for real-time systems and for systems with high availability and hot swapping.
Test-driven development is a common practice in many modern development workflows. Experience with this indicates a disciplined approach to coding and a focus on quality.
Erlang was designed for building distributed systems. Experience in this area is a strong indicator of a candidate's ability to build robust, scalable applications with Erlang.
OTP is a set of Erlang libraries and design principles providing middle-ware to develop systems. It is widely used in Erlang programming and a good understanding of it is a strong indicator of a candidate's proficiency.
Debugging and optimization are important skills for any developer. For Erlang, this includes understanding how to use tools like the Erlang profiler and debugger.
Erlang is known for its concurrency model. A good Erlang developer should be comfortable with concurrent programming concepts.
This is crucial as it forms the basis of any programming task they will undertake. If they struggle with the basics, they will likely struggle with more complex tasks.
The next 20 minutes of the interview should attempt to focus more specifically on the development questions used, and the level of depth and skill the engineer possesses.
A supervisor in Erlang is a process which supervises other processes, called child processes. The supervisor is responsible for starting, stopping, and monitoring its child processes.
Pattern matching in Erlang is used to match complex data structures. It's a way to destructure data by matching its shape and binding variables to values within that shape.
A list in Erlang is a collection of elements where each element can be of any type, while a tuple is a collection of elements where each element is a specific type and the order matters.
ETS (Erlang Term Storage) tables are in-memory storage that provide constant time data access. They support several data structures (set, ordered set, bag, duplicate bag) and can be protected (private, protected, public).
In Erlang, you can create a process using the spawn function. The spawn function takes a function as an argument and starts a new process running that function.
At this stage, a skilled Erlang 18 engineer should demonstrate proficiency in concurrent programming, error handling in Erlang, and distributed systems. Red flags include lack of knowledge in OTP design principles, inability to explain process communication or struggle with debugging techniques.
io:format("Hello, World!~n", []).
lists:map(fun(X) -> X*X end, [1,2,3,4,5]).
lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
spawn(fun() -> timer:sleep(1000), io:format("Hello, World!~n", []) end).
-module(my_module).
-export([start/0]).
start() -> io:format("Hello, World!~n", []).
-module(my_module).
-export([factorial/1]).
factorial(0) -> 1;
factorial(N) when N > 0 -> N * factorial(N-1).
The final few interview questions for a Erlang 18 candidate should typically focus on a combination of technical skills, personal goals, growth potential, team dynamics, and company culture.
Challenges while scaling an Erlang application might include managing the increasing number of processes, handling the complexity of inter-process communication, and ensuring data consistency. These can be overcome by using tools and techniques like OTP behaviors, supervision trees, and distributed Erlang.
In Erlang, if a process is not responding, you can use the 'monitor' function to monitor the process. If the process dies or is not responding, a message will be sent to the monitoring process.
In synchronous message passing, the sender waits for the receiver to receive the message. In asynchronous message passing, the sender sends the message and continues with its own processing, it doesn't wait for the receiver.
Erlang is designed for distributed systems. It has built-in support for distribution, fault-tolerance and concurrency. It also allows for hot code swapping, which is essential for maintaining a system with high availability.
Hot code swapping in Erlang can be implemented by loading the new version of the module into the system, and then switching the processes to use the new version of the module.
Back-end App Developer
Front-end Web Developer
Full Stack Developer (Java)
Full Stack Developer (.Net)
Full Stack Developer (MEAN)
Full Stack Developer (MERN)
DevOps Engineer
Database Engineer (AzureSQL)
Database Engineer (Oracle)
Database Engineer (General)
Solution Architect (.NET)
Solution Architect (Java)
Solution Architect (Ruby)
Solution Architect (Python)
AI Engineer (Python)
Sr. AI Engineer (Python)
AI Strategist (Python)
Business Intelligence Engineer
Systems Analyst
Mainframe Developer (COBOL)
Mainframe Developer (General)