Emacs Lisp Developer Hiring Guide

Hiring Guide for Emacs Lisp Engineers

Ask the right questions to secure the right Emacs Lisp talent among an increasingly shrinking pool of talent.

Emacs Lisp is a dialect of the Lisp programming language used as a scripting language by Emacs, a text editor family first developed in the mid-1970s by Richard Stallman. The primary purpose of Emacs Lisp is to customize and extend the functionality of Emacs. It was influenced by Maclisp, one of oldest member of lisp family and its development has been integral to GNU Project's mission for free software movement since 1985. Unlike many other languages, it was designed for interpretive use from inception due to its close integration with C-coded Emacs editing functions. Today, it remains an essential tool for programmers seeking extensible and customizable text editing capabilities.

First 20 minutes

General Emacs Lisp knowledge and experience

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.

Describe the difference between 'let' and 'setq' in Emacs Lisp.

'let' is used to create local variables, while 'setq' is used to set the value of an existing variable. The scope of a variable defined with 'let' is limited to the 'let' expression.

What is the purpose of the 'car' and 'cdr' functions in Emacs Lisp?

'car' and 'cdr' are used to access the elements of a cons cell. 'car' returns the first element and 'cdr' returns the rest of the elements.

How would you define a function in Emacs Lisp?

You can define a function in Emacs Lisp using the 'defun' keyword. For example, '(defun my-function (arg) (message "Hello, %s" arg))'.

What are the basic data types in Emacs Lisp?

The basic data types in Emacs Lisp include integers, floats, symbols, cons cells, strings, vectors, hash-tables, and functions.

How would you define a variable in Emacs Lisp?

You can define a variable in Emacs Lisp using the 'defvar' or 'setq' function. For example, '(defvar my-variable 10)' or '(setq my-variable 10)'.

The hiring guide has been successfully sent to your email address.
Oops! Something went wrong while submitting the form.

What youre looking for early-on

How does the candidate handle feedback and criticism?

A good candidate should be open to feedback and criticism, as this indicates a willingness to learn and improve.

What is the candidate's approach to problem-solving?

Their approach to problem-solving, especially in the context of Emacs Lisp, gives insight into their ability to handle complex tasks and challenges.

Does the candidate have experience with other Lisp dialects?

While not strictly necessary, experience with other Lisp dialects can be beneficial, as it indicates a broader understanding of the language family.

Is the candidate able to articulate complex Emacs Lisp concepts clearly?

Clear communication is essential for collaboration and to ensure they can explain their code and decisions to non-technical stakeholders.

How well does the candidate understand the Emacs ecosystem?

A strong understanding of the Emacs ecosystem, including packages, modes, and customization, is crucial for the development process.

Does the candidate demonstrate a deep understanding of Emacs Lisp?

This is crucial as it directly affects their ability to produce clean, efficient code and solve complex problems.

Next 20 minutes

Specific Emacs Lisp development questions

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.

How would you manipulate strings in Emacs Lisp?

Emacs Lisp provides several functions to manipulate strings, including 'concat' to concatenate strings, 'substring' to extract a substring, and 'string-match' to match a regular expression.

Describe the difference between 'eq', 'eql', 'equal', and 'equalp' in Emacs Lisp.

'eq' tests if two symbols or cons cells are the same, 'eql' tests if two values are the same and of the same type, 'equal' tests if the structure of two values are the same, and 'equalp' does the same as 'equal' but ignores case for strings and considers numbers of different types to be equal if they represent the same numeric value.

How would you read and write files in Emacs Lisp?

You can read files using the 'insert-file-contents' function and write to files using the 'write-region' function.

What are the different types of loops available in Emacs Lisp?

Emacs Lisp provides several types of loops including 'while', 'dolist', 'dotimes', and recursion.

How would you handle errors in Emacs Lisp?

You can handle errors in Emacs Lisp using the 'condition-case' function. It allows you to catch and handle exceptions.

The hiring guide has been successfully sent to your email address.
Oops! Something went wrong while submitting the form.

The ideal back-end app developer

What you’re looking to see on the Emacs Lisp engineer at this point.

At this stage, a skilled Emacs Lisp engineer should have demonstrated proficiency in Emacs Lisp programming, understanding of functional programming concepts, and problem-solving skills. Red flags include lack of practical experience, difficulty articulating thoughts or ideas, or limited understanding of Emacs environment.

Digging deeper

Code questions

These will help you see the candidate's real-world development capabilities with Emacs Lisp.

What does this simple Emacs Lisp code do?

(message "Hello, World!")

This code prints the string "Hello, World!" to the Emacs echo area, which is typically used for displaying messages.

What will be the output of this Emacs Lisp code?

(setq my-list '(1 2 3 4 5))
(car (cdr my-list))

The output of this code will be 2. The 'setq' function sets the value of 'my-list' to a list of numbers. The 'car' function returns the first element of a list, and the 'cdr' function returns a list that is a copy of the original list without the first element. So, '(car (cdr my-list))' returns the second element of 'my-list'.

What does this Emacs Lisp code do?

(mapcar 'sqrt '(1 4 9 16 25))

This code applies the 'sqrt' function to each element of the list '(1 4 9 16 25)', and returns a new list with the results. So, the output will be a list of the square roots of the original list's elements: '(1 2 3 4 5)'.

What does this Emacs Lisp code do?

(defun async-sqrt (n callback)
  (run-at-time 1 nil (lambda () (funcall callback (sqrt n)))))

This code defines an asynchronous function 'async-sqrt' that calculates the square root of a number 'n' after a delay of 1 second, and then calls a callback function with the result. 'run-at-time' is used to schedule the calculation, and 'funcall' is used to call the callback function with the result.

What does this Emacs Lisp code do?

(defclass person ()
  ((name :initarg :name :initform "" :type string :documentation "Name of the person.")
   (age :initarg :age :initform 0 :type number :documentation "Age of the person.")))

This code defines a class 'person' with two slots: 'name' and 'age'. The ':initarg' keyword specifies the argument name for initializing the slot, the ':initform' keyword specifies the default value of the slot, the ':type' keyword specifies the type of the slot, and the ':documentation' keyword provides a description of the slot.

What will be the output of this Emacs Lisp code?

(let ((x 5))
  (defun foo (y)
    (+ x y))
  (foo 3))

The output of this code will be 8. The 'let' form creates a local binding for 'x', and the 'defun' form defines a function 'foo' that adds 'x' and 'y'. When 'foo' is called with the argument 3, it adds 'x' (which is 5) and 'y' (which is 3), resulting in 8.

Wrap-up questions

Final candidate for Emacs Lisp role questions

The final few interview questions for a Emacs Lisp candidate should typically focus on a combination of technical skills, personal goals, growth potential, team dynamics, and company culture.

What are some of the limitations of Emacs Lisp and how would you work around them?

Some limitations of Emacs Lisp include lack of support for concurrency, limited support for interacting with the operating system, and performance. You can work around these limitations by using external programs, using Emacs Lisp's support for asynchronous processes, or by writing performance-critical code in a different language and interfacing with it from Emacs Lisp.

How would you implement concurrency or parallelism in Emacs Lisp?

Emacs Lisp does not natively support concurrency or parallelism. However, you can achieve similar effects using asynchronous processes or threads, although these are limited.

Describe the difference between 'load', 'require', and 'autoload' in Emacs Lisp.

'load' reads and evaluates a file, 'require' does the same but checks if the module is already loaded, and 'autoload' only loads the file when a certain function is called.

How would you interact with the operating system in Emacs Lisp?

You can interact with the operating system using functions like 'shell-command', which runs a shell command, or 'start-process', which starts a new process.

What are macros in Emacs Lisp and how would you define one?

Macros in Emacs Lisp are a way to define new control structures or other language features. You can define a macro using the 'defmacro' keyword.

The hiring guide has been successfully sent to your email address.
Oops! Something went wrong while submitting the form.

Emacs Lisp application related

Product Perfect's Emacs Lisp development capabilities

Beyond hiring for your Emacs Lisp engineering team, you may be in the market for additional help. Product Perfect provides seasoned expertise in Emacs Lisp projects, and can engage in multiple capacities.