Photo

Pablo Vizcay

Senior Software Engineer
https://pablo-vizcay.tech

Summary

I've been interested and working with technology and software since a teenager and always enjoyed understanding how stuff works and solving challenging problems. My first years working as a developer were mostly centered around creating native desktop applications. At the 2012 Buenos Aires RubyConf, I fell in love with Ruby and since 2013 started to work with Ruby on Rails creating web applications as a full-stack developer.

In 2015 I've co-founded Rails Systems S.A. and switched from being an independent software developer to lead a small team of programmers. We are centered around implementing, deploying and selling a multi-tenant ERP web application that connects to the Web Services of our country tax agency (AFIP) for digital invoice authorization.

At present, I'm looking to expand horizons and grow my professional expertise at medium or big tech-related companies outside of Argentina that lead and innovate daily with a customer-centered mindset. My current interests are software architecture, backend microservices and exploring new and refreshing programming languages like Golang, Kotlin, ES2015 alongside Ruby.

Work experience

Lead developer at Rails Systems S.A. 2015 to present
In 2015 it became clear that AgilGestión needed infrastructure and staff around to grow, and co-founded Rails Systems S.A. with a partner that centered around the operational role of the business in order to let me focus in technology:

  • Created the architectural design of our products and chosen the technical stack.
  • Developed the most complex features of our applications.
  • Implemented the development process (merge reviews, Gitlab CI) and mentored the other team members with pair programming.
  • I did the technical hires and was in charge of the interview process.
  • Provisioned the infrastructure needed to run the services: nginx, Puma, Rails apps servers, Sidekiq, Postgresql, Redis and Monit among others (with Ansible & Capistrano).
  • Migrated step by step our main Rails application from 3.2.x to 5.0.x and Ruby from 1.9.3 to 2.4.9.

Independent software developer 2009 to 2015

  • In 2012 I created Impuestos, a still selling desktop application for accountants that supports invoice processing and tax calculations and runs on MS-Windows. The architecture of Impuestos uses to a good extent domain-driven-design with Entities, Factories and Repositories objects.
  • Later, in 2013 I've started to develop and sell AgilGestión, an ERP SaaS in the cloud for a small and medium business that integrates with AFIP digital invoicing web services. Back then I've switched from desktop development to center mostly on backend web development and from being a Windows to a Linux advocate.

Technical support & Junior developer at VissiSoft 2004 to 2009

  • I've made my first steps working as technical support staff, installing and troubleshooting accounting software.
  • In 2004 I've developed a desktop system (Delphi 5 + Interbase) to help an association of physicians to calculate payments and taxes to health insurance companies (this system was in production for 12 years).
  • In 2006 I've developed Contabilidad (Delphi 7 + FirebirdSQL), a desktop application that accountants use for double-entry bookkeeping and reports. The application is still being sold today under the umbrella of Sistemas Vizcay.

Education

National University Centro de la Provincia de Buenos Aires February 2017
Systems Engineer bachelor's degree

For my thesis, I've created RestfulObjects for Ruby, a framework for developing web services that adhere to the Restful Objects specification. Its main purpose is to be completely transparent to the developer and let him focus mainly on the Domain Model that implements the business logic, thereby abstracting him from the API & HTTP issues of exposing the Restful resources.

Personal



Mar del Plata, Bs. As., Argentina


English (upper intermediate)


Spanish (native)

Contact

Products created

Technology experience

Backend development

Ruby
Ruby on Rails
HTTP & WebServices
Postgres, SQLite
Javascript & Node.js
MongoDB & Redis
Golang
Kotlin

Frontend development

HTML5 + CSS3 + JS
Vue.js + Vuex
Bootstrap
Bulma
SASS
UX

Server administration

Linux administration
Ansible provisioning
Nginx

Desktop development

Delphi & Object Pascal
C Programming

Tools of the trade

Software design and quality attributes

Good code quality and getting the right abstractions takes experience. Experience that only can be gained by writing, reading, discussing with your peers and thinking about code and software. For long-lived projects, I advocate for investing the time to write expressive and clean intention code. Source is written for developers to read rather than for computers to run; we are the expensive part nowadays as computation is almost always cheaper in comparison. I support doing a good deal of pair-programming and code reviews of all merge requests.

There are a lot of guidelines and knowledge in this area: clean code and SOLID principles, object-oriented design patterns or CQRS for example. As an engineer, your job is to not get very dogmatic about anything and to know that usually, every complex technical decision has some kind of trade-off that you should understand.

Testing and TDD

I strongly support that a good test suite improves dramatically the extensibility and maintainability quality attributes of software. For complex and business-critical projects is a must, as it is having a sensible code coverage metric value and Continuous Integration. It allows us to add features faster and with confidence. Also, it provides a safety net around refactoring to improve the internal design and battle the ever-present technical debt.

Tests came in different flavors: from unit level to acceptance tests that mount your application and exercise it via Selenium for example. A good developer should understand which amount to write of each of those and how to asses the value that they are adding (as they are code to maintain too). I do Test-driven-design sometimes and think it has its merits, but I'm not completely orthodox about it. In some cases, I choose to start by "exploring" a possible solution to the problem and then writing the specs.

Living at the terminal and mastering your tools

The terminal is where I belong and feel more comfortable, currently using Bash and tmux for my sessions. That means also trying to grok the suite of interconnecting command-line utilities available in the UNIX-like ecosystem that allows automating work with elegant simplicity. No programmer toolbox can be complete without a solid usage of the git source code versioning system. Also, I've been using neoVim as my editor for quite some time now and I can say there is no way back. Once you grasp Vim's normal mode power and it's responsiveness it allows you to edit and type code at an incredible speed.

Ruby ecosystem

Gems

Here is a, non-exhaustive, list of gems I've experience with: Sinatra, Puma, sidekiq, RSpec, Capistrano, byebug, jbuilder, prawn, prawn-table, roo, request-log-analyzer, savon, rack-mini-profiler, Capybara, selenium-webdriver, webpacker, sidekiq-satus, google_sign_in, gon, axslsx.

Open-source contributions

Ruby on Rails

Although not exactly a complex one, in 2015 I've found a bug while working with Rails. I've located it in the source code, created a regression test and finally fixed it. The pull request was approved and merged into master.

Firebird Extension Library for Ruby

When I started working with Rails I choose Firebird as the backend database, a tool I was used to. I've found a few problems in the driver gem, which was coded in C as it needed to bridge the Ruby world with the low-level database API. All the SQL Decimal and Numeric values were returned as Floats (which, if your work with money transactions you know it can be a nasty source of problems when base 10 rounding starts to happen). I've contributed a commit to the project to solve the issue.

Currently reading

Building Microservices: Designing Fine-Grained Systems

Sam Newman (2015)

Release It!: Design and Deploy Production-Ready Software

Michael T. Nygard (2018)

Kotlin in Action

Dmitry Jemerov and Svetlana Isakova (2017)

Technical books I've read

Software Design & Architecture

The Pragmatic Programmer: From Journeyman to Master

Andrew Hunt, David Thomas (1999)

Domain-Driven Design: Tackling Complexity in the Heart of Software

Eric Evans (2003)

Patterns of Enterprise Application Architecture

Martin Fowler (2002)

Refactoring: Improving the Design of Existing Code

Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts, Erich Gamma (1999)

Design Patterns: Elements of Reusable Object-Oriented Software

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Grady Booch (1994)

Software Architecture in Practice

Len Bass, Paul Clements, Rick Kazman (2003)

Documenting Software Architectures: Views and Beyond

Paul Clements, Felix Bachmann, Len Bass & et al (2010)

Large-Scale Software Architecture: A Practical Guide using UML

Jeff Garland, Richard Anthony (2009)

HTTP & WebServices

HTTP: The Definitive Guide

David Gourley, Brian Totty, et al. (2002)

RESTful Web Services

Leonard Richardson, Sam Ruby, et al. (2007)

Ruby & Ruby on Rails

Programming Ruby 1.9 & 2.0: The Pragmatic Programmers' Guide

Dave Thomas, Andy Hunt, Chad Fowler (2013)

Agile Web Development with Rails 5.1

Sam Ruby, David B. Copeland, Dave Thomas (2017)

The RSpec Book: Behaviour Driven Development with RSpec, Cucumber and Friends

David Chelimsky, Dave Astels & et. al. (2010)

Metaprogramming Ruby: Program Like the Ruby Pros

Paolo Perrotta (2010)

Practical Object-Oriented Design in Ruby: An Agile Primer

Sandi Metz (2012)

The Well-Grounded Rubyist

David A. Black, Mark Thomas (2018)

Ruby Under a Microscope: An Illustrated Guide to Ruby Internals

Pat Shaughnessy (2013)

Ruby Performance Optimization: Why Ruby is Slow, and How to Fix It

Alexander Dymo (2015)