I'm building every aspect of the business and technical product myself. App Evolved is something I'll always be working on. Selling my apartment provided the initial capital I used to get the company off the ground and I am running the company on a very tight budget
Incorporated App Evolved as a limited liability company in two countries:
Ensured accounting was configured and that the company is tax compliant with the annual returns filed and I opened a business bank account. I work with accountants in both South Africa and the UK
The SaaS application includes its own support tracking system, billing and invoicing, referral ecosystem, central monitoring with incident reports, task scheduler and customer instant messaging
A big part of what the application does is extends the functionality of CloudWatch. I've built an automation layer that attempts to rectify CloudWatch alarms/issues automatically and this automation layer can be extended easily
I've reinvented the company. We build awesome apps and manage clouds
SaaS application that helps freelance software developers find work and it makes it easy for companies to hire great freelance talent
The app is also supported in Thai, Filipino and Vietnamese. The frontend web server renders the initial SPA in the localised language and backend API responses are returned in the localised language as well
The name used to be Freelance Factory but I had some issues with the Madrid Protocol/trademark so I had to change the name. I launched the app on Product Hunt, Indie Hackers and Hacker News and the app attracted 85 freelancers
You can hire me for Full Stack Web Application Development or Platform/DevOps Engineering. I have a passion for both. I’m very interested in practical computer science and building applications that are useful and I enjoy solving real world problems
Please visit https://git.bruceblacklaws.com/ if you would like to get an idea on how I work. These are only commits in personal repositories. My professional repositories are hosted elsewhere
The work descriptions and my skills listed here are only brief summaries. I can elaborate on the details and provide comprehensive information during an interview
I'm not interested in networking anymore
My predominantly used and favourite stack is LAMP-memcached (Linux, Apache, MySQL, PHP and memcached) and I've built most of my app backends using this technology stack
Some of my apps use a Node.js backend in AWS Lambda behind API Gateway
When I build a relational database schema, I ensure it's well designed and that the referential integrity is always maintained
I've built single page applications (SPAs) with RESTful backend APIs and I've built applications using server-side rendering (SSR)
I definitely prefer working on the app backend although, you can hire me for a full stack position. I don't like being abstracted by frameworks, both on the frontend and the backend. I write vanilla JavaScript and I enjoy learning about it's core concepts
I have a very good understanding of how the Document Object Model (DOM) API and how the XMLHttpRequest (XHR) API work. Visual Studio Code is my IDE of choice and I'm familiar with Git. All of my projects source code is hosted in GitHub
A microservice that returns a country's geographical location information
I developed Get Country Data because I wanted to reduce the amount of costly calls my apps were making to the Google Geocoding/Places API and I wanted to know additional information like currency names, currency acronyms, currency symbols (HTML entities) and international telephone calling codes
The data came out of multiple other projects I was working on and is not read from any external source or a local database but rather it's kept in-memory
The Relational Database API allows access to MySQL over HTTP and ensures the price is low and predictable
This enables me to prevent direct access to the MySQL server and the query result table is returned in an associative array and is optionally serialized and stored in memcached
The API connects to the MySQL server using a user account that is granted all privileges on all databases and tables. It determines what user account to use by parsing the connection string read from the virtual host environment variables
The Relational Database Client is shipped with my PHP projects via Composer and JSON is the data interchange format
My build process works by concatenating all JS and pushing it through Babel and then through UglifyJS
Percy is invoked by the CI/CD pipeline and performs a pixel-diff
The JS and external stylesheets are cached by the browser and will be re-cached after a production deployment (the frontend web server sets the Cache-Control header)
The Google Cloud Storage API and client allows my stateless containerised apps to have persistent storage
It makes sense to ship this functionality as a microservice API because that way I can manage this logic in a central place for all my apps
I have experience with Puppet and managing large scale server deployments globally (servers > 150) and I have experience with monitoring using New Relic (APM, Infrastructure), Zabbix and Nagios
I've built highly available GNU/Linux server infrastructure capable of scaling the hosted application to thousands of concurrent connections using horizontal scaling and application load balancing techniques
I'm happy architecting and building backend infrastructure both in the public cloud and on physical hardware on-premises
I've created CI/CD pipelines that are invoked by Jenkins and deploy into autoscaling EC2 fleets using the blue-green and rolling deployment strategies
All my Platform and DevOps engineering work is in code
I run all my app server infrastructure on cost effective Linode virtual machines and I do all the systems administration myself
The frontend and backend web servers run Apache HTTPd with mod_php and each run a local instance of memcached
All of my app backends are integrated into Papertrail, that I used for exception and general logging, and Papertrail invokes a Slack webhook and these exceptions are readable on my mobile phone
I host and maintain all my DNS zones myself using the BIND9 name server. Shell access is protected by private key and 2-factor authentication
I use Semaphore CI with all my apps and the pipeline is described in YAML and travels with the git repository and deploys into my static App Server Infrastructure
The deployment strategy is rolling and the webroot directory is a symlink which is updated after the source code is tarball'ed and transferred via SCP
I'm able to do plenty production deployments in a day without negatively effecting the users
For my frontend projects, Semaphore CI invokes Percy and all notifications are pushed into Slack
Puppet manages my app servers configuration and is directly applied on each server manually
There is no master and all the Puppet modules and manifests are in Git
Puppet manages everything from the user accounts and SSH server configuration to the Apache virtual hosts and PHP configuration
My App Server Infrastructure is in code and can be provisioned and managed with Terraform
If the infrastructure is newly created, Terraform will copy up and execute a shell script that installs Puppet and clones the Puppet Masterless Git repository and applies the configuration
This keeps my server infrastructure, configuration consistent and managed in code
I built a comprehensive Knative installation shell script that deploys Knative into managed Kubernetes from DigitalOcean
I can go from source code/container to a fully functional URL, with legitimate TLS, in seconds
Solve problems. Build products. Perform work on the ground. Get customers. Launch startups. Fail. Try again
My favourite subjects were history and computer science. I partook in extracurricular computer science classes that taught programming in Java
Certified Ethical Hacker (C|EH)
Linux+ Certified Professional
Cisco Certified Entry Networking Technician
Effective Communication and Human Relations (self-paid for seminar, 7 weeks)
I used to run Gentoo 2006.1 (vanilla 2.6 kernel) with Xorg and Xfce and now I use OS X on a 13" Macbook Pro Mid-2010 Mid-2014 Mid-2017
I learn by doing, by building, by experimenting and by taking risks. If I don't understand something, I take the time to figure it out and I never give up. Ever
I've failed many technical interviews and I really don't care about your opinion on what you think I should know or how you think I should come to know it. I learn about various design paterns, specific algorithms and esoteric data structures when it becomes apparent that I need to know what they are and how they work. Some of these concepts I commit to memory and you can test me on them, others I don't and what are you expecting?
I'm probably not smart enough to solve the halting problem and I don't enjoy hardcore math concepts but I have a passion for how the web works and I have a lifetime of learning to do
Native or bilingual proficiency
Elementary proficiency