Systems Engineering
We build APIs
The systems engineering team primarily builds services and APIs that power the mobile and web apps we build for Vokal's clients.
Languages
The two primary languages we use to build API servers at Vokal are Python and Go. Python is a popular language for rapid development using frameworks like Django and falcon. Go is an increasingly popular systems programming language developed by Google; it's syntax is C-like, but offers type safety, performance, and a simple asynchronous programming paradigm.
In addition to Python and Go, you will likely need to write direct database queries. We primarily use Postgres as our database engine of choice, but most databases (including MySQL, MSSQL, Cloud SQL, Aurora, etc) use some flavor of SQL (or, Standard Query Language).
Finally, when dealing with Linux-style servers, you'll have occasion to write shell scripts to automate tasks. We have relevant code standards for all these languages:
- Vokal Python Coding Standards
- Vokal Go Coding Standards
- Vokal Shell Scripting Standards
- Vokal SQL Coding Standards
Framework-specific standards and best practices are also documented for:
Core Skills
Systems engineers are expected to be self-directed in skill acquisition on these subjects, in addition to the shared core skills.
- Python language fundamentals understanding
- Docker and docker-compose
- Automated deployment processes (Fabric, etc)
- Database design and administration (table and relational design, migrations)
- Basic Linux system administration (package installation, web server configuration, upstart config)
- HTTP status codes
- AWS stack setup (including load balancing, auto scale groups, Rt. 53, credentials and TLS certificate)
- Unit testing with py.test or unittest
- Package management and pip
- Logging and system monitoring setup (New Relic, AWS Cloudwatch)
- Django + Django Rest Framework
- Falcon
- Flask
- Webhooks
- Lambda architecture
- Understanding of push notifications and email notifications (SNS and SES)
Devops
As systems engineers, we are also responsible for the deployment and operation of the servers we develop. We largely leverage IaaS from Amazon in the form of Amazon Web Services (AWS). You'll want to familiarize yourself with Vokal's existing tooling for devops, and be sure you've gathered important prerequisites from the client before kicking off development.
It's always wise to keep abreast of deployment platforms available since each client has different needs and budgets, however. Google's competing Cloud Platform IaaS also offers interesting services and tools (and often a price advantage).
Documentation
Documentation is important—arguably as important as the APIs we build. Clear documentation makes it possible for iOS, Android, and Web engineers to use those APIs and build apps for our clients. Be sure to familiarize yourself with our API Documentation Standards and the GitHub-Flavored Markdown we use.
It's also very helpful to use git tags and mark commits that represent the state of the code that is released to production as a "release" on GitHub. Details about how to do so are outlined in the Release Notes documentation.
Testing
All code needs tests that cover as close to 100% as possible. If you build a feature or come up with a bug-fix, write tests that prove it works as intended. No patch will be accepted without tests, period; this is enforced company-wide, and helps eliminate bugs ending up in the wild.
We also have our own coverage reporting tool called cvr. For Systems projects, we expect at least 95% test coverage for a build to pass; you should configure this in the settings for your project on cvr.
Here are sample scripts you can use as examples to add to your project's .drone.yml
file to report test coverage to cvr. Be sure to have a senior engineer add your project's token to the drone configuration for your project.
Django:
build:
commands:
- pip install -r requirements.txt
- cd <projectdirectory>
- coverage run --source='.' manage.py test
- coverage xml
- export CVR_URL="https://cvr.vokal.io/coverage?commit=$DRONE_COMMIT&owner=$REPO_OWNER&repo=$REPO_NAME&prependpath=<projectdirectory>&coveragetype=cobertura"
- curl -F coverage=@coverage.xml $CVR_URL
- cd ..
Falcon:
build:
commands:
- pip install -r requirements.txt
- nosetests -v --with-coverage --cover-package=app --cover-xml
- export CVR_URL="https://cvr.vokal.io/coverage?commit=$DRONE_COMMIT&owner=$REPO_OWNER&repo=$REPO_NAME&coveragetype=cobertura"
- curl -F coverage=@coverage.xml $CVR_URL
Go:
build:
commands:
- go get
- go get -t
- go build
- go test -gocheck.v -coverprofile=coverage.txt -covermode=count
- export CVR_URL="https://cvr.vokal.io/coverage?commit=$DRONE_COMMIT&owner=$REPO_OWNER&repo=$REPO_NAME&coveragetype=gocover"
- curl -F coverage=@coverage.txt $CVR_URL