Software Engineer: Embedded Applications

Company Description

SparkMeter is a venture-backed company that was founded in late 2013, a spin-off of the non-profit EarthSpark International. We developed our low-cost, pre-pay enabled, smart metering system as a solution for electric utilities in developing countries to serve low-income customers. Our metering system is being widely adopted by utilities serving customers in rural parts of Asia, Sub-Saharan Africa, and Latin America and the Caribbean.

Job description

Come join SparkMeter’s Systems Engineering team and help increase electricity access in developing countries. As an Embedded Systems Engineer, you will design, build, and maintain our base station firmware / software that utility customers around the world depend on to provide reliable power, and the tools that our colleagues need to sell, provision, and support installations of our smart metering systems.

SparkMeter provides a highly integrated solution. As an Embedded Systems Engineer you will play a key role in component design and integration. While the Systems Engineering team has a strong background in software engineering, we are at our best when we are applying these same analytic and design principles to the whole product and working in concert with the rest of the company.

You’ll focus on:

Embedded Software Engineering. Your work will focus on the embedded systems that make up our unique metering platform. You will work closely with the other members of the Systems Engineering team to improve the functionality and robustness of our product. Your knowledge of embedded Linux and application development will be crucial to creating well designed and reliable systems.

Application Development. You will design, implement, and maintain applications running on the embedded system foundation that you create. These applications must communicate locally and over the internet to synchronize data from the cloud to the meters and back.

Systems Engineering. Systems Engineering supports all aspects of the company - not just our product. You’ll take a holistic approach to our systems by working closely with our colleagues in other teams like hardware, customer support, and sales. Your role will be as a technical lead to ensure that systems and designed and implemented to fulfill their part of the product.

What makes our product unique:

At its core, our product revolves around synchronizing data between Cloud servers and embedded equipment over unreliable, low-bandwidth connections

On Cloud servers, scalability, maintainability, ease of deploying new applications, are critical

Resilience and efficiency of the link between the two is critical to the success of our customers

We have hundreds of systems deployed in rural/difficult to reach areas in more than 20 countries.

REQUIREMENTS

You will be a good fit for the role if you meet the following requirements of the role:

Core Concepts of Computer Science: You might have Bachelor's degree in CS, or other quantitative engineering / science degree or learned them on the job. Either way, you have spent time learning and thinking about programming languages, logic, algorithms, data structures, base 2 numbering, complexity analysis, etc. Experience with distributed systems: the tradeoffs, fallacies, and CAP theorem. We believe a solid foundation in these concepts are key to finding the best and most reliably designed solutions for our customers.

Skilled and Efficient Programmer: You are very skilled in C / C++ / Go / Rust or other systems programming language. You have completed several major production projects in one or more of these languages. You understand one or more of these languages at a core level and are very familiar with their standard library (if applicable). Given a problem, you are very comfortable implementing your solution in one or more of these language.

(Embedded) Linux: Embedded Linux is the foundation which you will build applications on. You should feel very comfortable working with this foundations and shaping it to suit your needs. Ideally you have compiled your own custom kernel or entire system. At some point you have dived into the Linux source code or updated, recompiled and loaded a kernel driver. From a user space standpoint, you should be quite familiar with Linux and POSIX standard libraries / interfaces / design principles. You feel very comfortable working on the terminal and with shell scripts.

Constrained Hardware: Developing on embedded devices comes with a whole slue of constraints. Some of the key ones are embedded hardware constraints. If you application needs more memory you simply do not have the option of spinning up more instances. You should have demonstrated experience in optimizing solutions for resource constrained environments and ensuring that this is core part of the design process.

Networking: Network failure is ever present on remote wireless links, you should have demonstrated experience in how to deal with network failures and designing applications to perform reliably in the face of them. You understand the core protocols of networking and when they are applicable: IP, TCP, UDP, DHCP, ARP, ICMP, and DNS. You have a working knowledge of the various modes of failure of the network and how they might manifest in POSIC APIs. Ideally you should have experience with these protocols under poorly functioning links.

Delivered Products: In the Systems Engineering team, we are focused on the overall system. We know that a solution goes beyond implementation and extends into deployment, and support phases. It is thus important to demonstrate that this is key importance to you as well.

Quantitative and Analytical Reasoning: Many questions that we face do not have a clear answer. Bugs come up that are not readily resolved by searching StackOverflow. You must be able to approach difficult problems with an analytical mind and remove possibilities while refining your hypothesis. It is critical to have the necessary quantitative skills to answer tough questions about the system is performing.

Python: While the core focus of this role will utilize a systems language, Python is a core component of a lot of our existing systems. Having at least a working knowledge will really help accelerate your on-boarding. Ideally you would have written several small to medium scripts in Python, are confident that you can implement new tools in Python through the help of the Python docs and you understand the tradeoff between using Python and a systems language.

While these skills aren't a prerequisite for this role, they will help you flourish in this position: