Mailtrap and Loggly

Here are a couple of online applications you'll appreciate if you are a developer (descriptions copied from their websites):

  • Mailtrap: A fake SMTP server for development teams to test, view and share emails sent from the development and staging environments without spamming real customers.
  • Loggly: A cloud-based log management service that helps technical teams make sense of logs that are being produced by cloud-centric applications in order to solve operational problems faster.

If you haven't heard from them before, go and check them out because changes are you already need them.

Looking back on my 10th-graduation anniversary

Last week I realized that this June represents my 10th-graduation anniversary. An entire decade since I got my college degree after 5 long years and started working as a professional software engineer. That was the summer of 2004, and I wanted to celebrate the occasion taking a quick look back.

2004 - 2008

After graduating, I started working as a software developer in ETECSA, the only telecommunications company in Cuba. Back then in my town this was one of the best gigs a developer could get. Right now with the introduction of private-owned businesses, it's probably one of the worsts.

I worked there for four years, give or take, mainly developing on .NET, specifically with ASP.NET Web Forms (I think I first used ASP.NET MVC after leaving ETECSA, although I'm not totally sure). I spent some time during my last year there working on a big-flop project with Java and Eclipse RCP (of course, this app didn't go anywhere).

I specifically remember a couple of web applications I created and were used in several offices across the country, and a set of integration tools to streamline the onboarding process for new employees. The tools connected our Human Resource database (a Microsoft Access DB) with our Windows Domain (LDAP) server. These were fun and tricky to develop, and taught me to hate Microsoft Access and everything related to it.

Here is a quick summary of all the important things I remember that happened during these 4 years:

  • For the first time I had the opportunity to work in real applications used by real people. More important, I had the opportunity to deal with changes on already-deployed applications.
  • I spent the majority of my time on events and forums presenting over and over again the applications I once created. This was a lot of fun because I traveled a lot, but more importantly gave me tons of free time that I used to work on freelance projects.
  • I learned that Cuba gives a shit about its economy and it's all about politics.
  • I learned that the only way to advance your career in Cuba is by moving to Havana and become another cog in "The Process". Outside Havana, people are just invisible. Outside "The Process", there's nothing worth looking at.
  • For a software developer living in Cuba, the only way to do something meaningful is by doing it yourself and forgetting about any support from your company. They are going to promise a lot, but it will never come. Trust me.
  • In Cuba nobody cares.

2008 - 2009

By the end of my time in ETECSA, I had already given up trying to move forward the technical state of the company. I became another frustrated professional pursuing an impossible cause, so I decided to go with a 24/7 freelancer life. There was way more money, and way more opportunities to learn.

I had done some freelancing work before, but at this point I was ready to take it more seriously. I moved full time to a room at home and started working with another 3 friends. A crappy Internet connection (modem at ~56kbps) was enough for us, so we started working on several projects for a north american company.

It's hard to remember on how many projects I participated during this time, but I'd guess they were about a couple dozen. I started as a developer, but soon enough I took more of a lead role. My job was basically communicating with our client, organizing/distributing all the work, and putting fires out whenever needed.

This was my real introduction to the web. Almost all applications we worked on during this period were web applications, although I remember a couple of desktop apps here and there.

Around winter of 2008, when money stopped to be a problem, I decided to leave Cuba and move to United States. My boss at the time promised me a job, and the uncertainty of leaving the country added that extra adrenaline that I needed. I touched American soil on May 2009, and then a total new chapter started on my career.

Some of the highlights for these years:

  • It was the first time I took JavaScript, CSS, and HTML seriously. In the middle of my ignorance I honestly believed those were for amateurs.
  • Learned a lot about how important is to be on time, up-front with clients, proactive, and how to solve problems.
  • Learned a ton about managing software projects and spliting and assigning work to different developers.
  • Learned a lot about writing and reading English. (If you are reading this and you consider it bad, try to picture it 5 years ago).
  • Learned how to appreciate small things, like my slow-as-crap 56kbps modem, or a microwaved lunch.

2009 - 2010

Days after coming to U.S. I started working with/for my boss. I did it by creating my own company, and although most of the work came from my boss's company, I scored a few new clients that helped me pay the bills.

This was the time when I started learning how to live on a capitalist country. The change was brutal on every aspect of my life, but it was totally worth it.

Professionally, it was the first time I used a decent Internet connection, so all of the sudden I had infinite opportunities right opened before my eyes. I learned a lot working on all the projects I had (a few dozen I'd guess). I had to code like crazy, but I spent most of my time on a management role.

The most important career-related highlights:

  • Learned a lot of English. Heck, I had to living among Americans.
  • The Internet opened for me a sea of possibilities and life-changing opportunities: For the first time I started following blogs, reading career-relevant stories, tweeting, using different online tools, etc.
  • Worked on my first Android application after buying my first Android phone.
  • Learned that getting somebody to sign a check for you is a difficult task. You have to work hard to get money out of people's pockets.
  • Learned that businesses love to pay your invoices after they are overdue. (And sometimes a little later than that).
  • Realized that freelancing is just not for me. I love the entrepreneurial mindset, but I'd rather work in a different environment.
  • Started blogging.
  • Started hating Adobe Flash. And right to its death (at least on the mobile side), I hated it.
  • Worked a lot. A whole lot more that I had ever worked before in my life.

2010 - 2014

By the end of 2010, a small digital agency located in South Florida contacted me looking for help on a project with one of their biggest clients. It was Java, so I decided to go. They brought me on-site to work from their office.

Small company I remember. I think there were around 10 employees at the time. I worked on the thing, helped the team release it, and when I was done, the company asked me to come on board as a full time employee.

Hell, why not? I was a little bit tired chasing clients around, so I gave it a shot and took the offer.

The rest is history. Levatas is close to a hundred employees right now, and I'm very proud to be part of that growth. From a Senior Software Engineer position I found my way to an Engineer Manager role, and I couldn't be happier doing it (well, not true, humans can always be happier!).

During all these years I have touched literally hundreds of projects, mostly small ones, although you can throw a handful of multi-year engagements on that list. Working for big names like IBM, Cisco, HP, Dell, Avaya, Emerson, Fujitsu, and HSBC is something that you can't get everyday, and I'm very grateful to my company for that opportunity.

The most interesting events:

  • Got my first paycheck as a full time employee.
  • For the first time I started speaking the HTML5 lingo.
  • Had the opportunity to work for several Fortune 500 companies.
  • Worked on my first iOS application. (I liked Android way more but Java probably biased this assessment).
  • Released on GitHub my first open source project, an Android application to check the stock market.
  • Started working with Scrum, leaving behind years of Waterfall experience.
  • Started working with NoSQL databases, scalable technologies, and cloud applications.
  • Participated on Google I/O 2013. It was a blast and I don't remember any other time when I was able to absorb so much knowledge in just a few days.
  • Participated on Google Chrome Summit 2013. It was good, although Google I/O had already spoiled the event for me.
  • Was introduced to managing people (not projects). A little bit different to what I expected, and 100 times harder.

Another set of important events

Here are some other important events that happened during this time, but are hard for me to time-box under specific years:

  • Became a phone-aholic.
  • Learned to appreciate soft-skills on professionals, like self-organization, motivation, passion, perseverance, among others.
  • Became really passionate about performance on websites.
  • Realized that email can be a time-sucking machine.
  • Realized that there's a lot to do for me in the next 10 years.

Looking forward to the next 10 years

Luckily for me, this is just the beginning. I feel like I've never been so much excited before about what's about to come. Hopefully, I'll be able to look back in 2024 to do the 20-year summary just like this one.

Here I come!

Building the blog - Episode 10 - Related Posts

A great way to increase the visibility of your posts is by adding a "Related posts" section at the end of each article. There are several services out there that channel your content and create this list for you, but I'm all about free and fast, so I decided to build my own engine.

And it turned out to be a very simple and clean implementation.

I started by adding the ability to tag my posts. This way I can add keywords to each post that will later serve as the indicator for the related posts engine. (The not-so-fun part was going back and updating several old posts with tags. I didn't update all of them though, so I'll have to at some point). ​​

When a post is about to be served, the engine finds related posts using a weighted list where tag coincidence and post date are the two important pieces. If there are no matchings the section is not displayed.

Since everything on the blog is heavily cached, the engine will have to run only the first time a post is visited, but will serve results from memcache after that.

The engine is implemented on the Mapping class (you can see the complete source code here) and it's less than 40 lines of code.

And while at it, I decided to make some tweaks to the design of the blog to add a little bit of color. Very subtle but I'm happy with how it turned out (basically links are now blue, making them easy to spot).

The HTML5 progress element

Like datalist and meter, the progress element is another HTML5 tag that I've never used before.

The progress element represents the completion progress of a task. Progress bars are widespread on the Internet, and are usually created with a combination of images and CSS. Well, now you can do something cleaner and use the HTML5 progress element.

​​There are two specific attributes supported by this element:

  • value - Specifies the current position of the progress bar (how much the task has been completed).
  • max - Specifies the upper bound of the progress bar.

If these attributes are omitted, the browser will render an indeterminate progress bar to show constant (and indeterminate) progress.

Here is an example of progress in action:

<progress value="50" max="100" />

And here is the current browser compatibility status.

It's time to look at Dart

I heard about Dart some time ago, but I didn't pay too much attention. I guess the risk was higher back then when Dart was just released and the community was non-existent.

Today it's different. A much more stable version and a stronger community piqued my interest, so I'm very excited to take a closer look and see how it feels.

I've got to be honest: I read somewhere that Dart might be replacing Java for Android development. Probably is not happening, but somehow it makes sense. I think this was the trigger for this new interest on Dart.

So I'm still not sure where and when I'm going to start, but I definitively will.

P.S. Added bonus: There's a port of AngularJS named AngularDart. This will be interesting.

The small stuff

With a big team working on an app (around 10 guys), it's really easy for the whole picture to start fading away from everybody's mind. Usually, everyone is so focused on their work, that the entire system starts falling apart without anyone noticing.

This is just a reminder to stop from time to time and take a broader look at the entire application.

The small details connecting the pieces make all the difference. They seem very simple, but together they account for most development time of a team.

I've always believed that what makes a developer a good developer is the ability to recognize and tie all loose ends. Yes, the small stuff. The stuff that everyone knows how to do, but usually gets forgotten.

The HTML5 meter element

Like datalist, the meter element is another HTML5 tag that I've never used before.

A meter is a gauge that you can use to represent a given value within a range. Instead of having to create different images or CSS hacks, now you can use the meter element and style it using CSS to your convenience.

​The following are some of the specific attributes that this element supports:

  • value - Specifies the current value of the gauge. This value must be between min and max. This is the only required attribute of the meter element.
  • min - Specifies the minimum value of the range. This value must be less than value.
  • max - Specifies the maximum value of the range. This value must be greater than value.
  • low - Specifies the upper bound of the range that is considered to be low. This value must be greater than min, and less than high and max.
  • high - Specifies the lower bound of the range that is considered to be high. This value must be less than max, and greater than low and min.
  • optimum - Specifies the optimum value for the gauge.

Here is one example of meter in action:

<meter value="5" min="1" max="10" low="3" high="7" />

And here is the current browser compatibility status.