My first job at Trailhead was to optimize the execution time of an async job which was running on Jenkins. I paired with a more experienced developer to get an idea of how the task accomplished the job. After getting an idea of how it was implemented, I noticed that most of the time was being spent performing I/O operations, in particular uploading images one by one. At that point, we realized that uploading multiple images concurrently would dramatically improve the execution time, so that is what I did, parallelized execution by using threads give us a simple solution which improved the execution time by 80%. We could use another parallelization technique such as enqueuing a specific uploading-image job per each image (or subset) that may work ok but would introduce other problems such as “how do we know when it finishes?” So we decided that threads were good enough.
As part of content processing, I had to integrate with Cloudinary and S3 to store/retrieve images. We had to use both services because Cloudinary offered bandwidth optimization while S3 offered private links.
Since we were handling images from salesforce customers we needed to store them under a private scope. We accomplished that by using S3 Presigned URLs (which gives you a temporal link)
Trailhead offers a lot of publicly accessible courses, those courses are much more requested than the private ones for that case saving bandwidth is a big win. Cloudinary offered image transformations, if you store a 10MB image it can convert it and send you a smaller 1mb image.
Trailhead is the e-learning platform developed by Salesforce.
Trailhead started being a standalone RoR application, during the course of three years it transformed completely into many distributed applications. There were several API Ror projects along with several FrontEnd React apps. Integrate with multiple external services such as fastly-CDN, cloudinary, S3, coveo search, Sumologic, New Relic, Salesfoce-Login All the different applications are developed by different teams, and all of them are deployed to Heroku. Right now the two native mobile apps are being developed. We had to build our Odata API using an internal framework. That adapted Odata for Ruby.
It was interesting to be a witness and active contributor to this transformation. I’ve learned a lot during that time and contribute to some of the most impact projects of the product.
Trailhead
Description
Trailhead.salesforce.com https://www.youtube.com/watch?v=Y8c2Ie3ammM
Summary Trailhead is an e-learning platform.
funcionalidad:
I’ve worked mostly on backend(rails) but ocasionality on frontend(react)
Cuando te preguntan en que trabajaste Entonces puedo hacer un resumen de estos   
Functionality
Multi tenancy support
Key Contributions
Problem
User comes back and continues y
Key technologies
Information
Delivered Features ————————————— Trailhead API (v1): Trailmaker Content: Trail Tracker: Trailmix v1 API and Assignments: Trailmaker Release: Private Content Search: Retrofit Pipeline (Jenkins): Secure Image Management: Authorization Service: Permission Set License: Packcheck Release Check Add-to-Release Subdomains Signed Image URLS Limits and Monitoring Content Service / myTrailhead architect: Prodsec: Performance: L10n: —————————————
Story: The importance of good logging
There are a lot of simple problems that triaging is harder than solving them. Typically you find uncovered cases in production. Triaging could imply:
investigate wrong problems All of this is waste of time and possibly dev-frustration. If production –> act under pressure
I realized that was going to be a pain
No one knew about it In daily standup
Tell me about a challenging situation. Story: Situation Action Result Lo mas challenging que me ha tocado hacer fue implementar lo de las imagenes. pero es muy generico mas especifico problemas: