You can call me Badu.
November 10, 2017Bogdan Dinu Curriculum Vitae Resume
About 21 minutes of reading.
Note for Recruiters
my name is Bogdan and I am a Go language enthusiast. In case you want to skip to Go language skills, click here.
I’ve started to program computers in 1991.
I was an entrepreneur. I’ve been a mentor.
Proven leader and project manager, providing technical oversight for small teams of software developers.
I’ve driven architecture decisions and lead projects from concept through the release process.
I learn quickly, care about detail, and love computers, physics and mathematics.
You can write me on badu[at]badu.ro, contact me on Skype as badu[dot]bogdan or use the links at the bottom of the page.
- Architect and lead projects from concept until released
- Broad and deep technical knowledge of several technological stacks
- Take the most responsible approach regarding work and decisions made
- Provide technical leadership for software engineers and oversee development
- Communicate effectively and relate well to people
- Represent an abstract problem in the form of some finite real object of the system, so everyone understands it
- Write tools and automated test software
- Create native applications for Android devices
(November 2017 - now)
- Freelancing for various customers
- Looking for telecommute work
Technical Lead at Activemall
(April 2015 - October 2017)
- Provided technical leadership and consultancy which resulted in two European funded projects
- Overseen a small team of developers using SCRUM / Agile technique
- Built a platform for photographers which performed calculus based on customers choices
- Built publish-free ads website using a innovative taxonomy system
- Driven architecture and development for a voice over ip selling solution
- Developed a platform for farmers using google maps for keeping work history on soil
- Left the company because I want to work remotely
Senior Software Consultant at Altfactor
(October 2013 - March 2015)
- Built a second screen application prototype, running on smart TV, tablet and server
- Built an educational platform for quizzes
- Left the company because it split-up
Senior Software Developer at Workzone (Norway)
(February 2010 - May 2013)
- Designed and implemented an advanced and scalable platform for the delivery and management of video content
- Wrote automated workflow for uploading video resources to a centralized server cluster
- Live broadcasting tool with control a live event and combine video with synchronized slides
- Delivered an experimental Android application (ahead of it’s time) for live broadcasts
- Left the company because the contract was over
Adobe User Group Manager for Romanian Flex User Group
(2009 - 2012)
- Started mentoring a group of young pupils
- Started to broad my communication skills
- Blogging regarding Adobe Flex
- Host for events like launch parties and popularizing Flex
- Wrote an Actionscript dependency injection framework called Roless
- I’ve started enjoying Java because the Flex compiler was written with it
- Left the position because Flash was discontinued and I’ve fell in love with Spring Boot
Freelancer for various clients (U.S. and Europe)
(2007 - 2010)
- Built a bookmarks manager with social networking capabilities - learned a lot about taxonomies and group theory
- Built an application for a client that synchronized sales data with a SAP server
- Multitouch SDK based on FLOSC for SensyTouch - a startup that took off
- Code generators for SQLite, Zend, Actionscript Message Format and many others
- Stopped freelancing because Workzone hired me
Entrepreneur Synergy Design
(2003 - 2007)
- Planned, designed and implemented web and desktop applications
- Managed a small team of developers and marketers
- Biggest project was called Eurobiz - a 60000 Romanian companies database organized by their domain of activity
- Closed the company due to economical climate
Programmer at Secure Software
- Contributed in choosing the right tool for the right job, after management tried Delphi and C# (solution was Adobe Flash)
- Left the company so I can start my own
I have a master degree in naval engineering, and graduated from the University of Low Danube Galati in 2002.
During studies, I have developed engineering software to help with calculus in various disciplines like mechanics and materials resistance.
For my final-year project I designed a software being able to calculate the heat transfer in the galley, using the finite element method.
Master degree’s project was also a software based on finite element method, which calculates vibration and noises on main crankshaft of the ships.
After more than 25 years of experience, I can say “what a journey”. I won’t bore you with stories about how I’ve started to program or the fact that I know assembly language for 8086 CPUs.
The reason for this section here is not to brag about my accomplishments - I feel that there is no faster way to get introduced, other than briefly present my journey.
I have grouped some of my experiences by category, presenting you briefly with what I’ve learned in my life (not only as a developer) along the way.
A large project I’ve been working on was code named
It was the era of Adobe Flash, Flex and all the neat work that Adobe did to push the browser experience farther.
What could you do with Fluvi : you could deliver recorded videos or live streams to Internet consumers. The live streaming was done with
Wowza Media Server, which was written in Java and you could develop plugins for it. As a side note, because of Wowza, I’ve started my Java era.
Fluvi had an automated workflow for uploading videos to a server cluster from which those videos were tagged using metadata, encoded to various formats (e.g. “.mp4” to “.flv”). We’ve called that
transcoding. That’s how I gained experience in video encoding, decoding, streaming and all the real time related problems.
All video content could be used either as an embed video in an article (using integration with content management systems) or as a stand alone solution using a video portal.
Fluvi was also an archive system for videos and other resources as well, so we had to build an Elasticsearch based search engine.
Both player and portal were customizable in terms of look-and-feel and there tools for skinning them. This customization could be done for each client-company.
The live broadcasting tool (code named Livecaster), allowed users to control a live event and combine video with synchronized slides, near or on top of the player. Livecaster was suitable for transmission of press conferences, lectures, council meetings.
For live events the participants that were attending the event via Internet, could post live questions that were sent in real time to the moderators (and, of course, the answers were live).
Last but not least, I’ve built an Android application, packed with
Adobe AIR and written entirely in ActionScript that allowed live webcasts from an Android device. The application connected to Fluvi backend and started to stream from the mobile phone video camera. In order to save mobile phone battery and optimize application’s speed, I’ve used OpenGL capabilities.
As you can tell, this was probably the most experience bringer project of them all : Java, live streaming, heavy search engines, not to mention the Actionscript and Apache Flex SDK for which I was brought on the project. According to my colleagues back then, I had important contributions to the architecture of the whole system from frontend to backend : they used to laugh about my sayings mimicking me with a German accent - “to be very precise”!
Experimental (Cutting Edge)
Adobe era, I’ve met two enthusiasts that were trying to build a multi touch table. This was long before you could buy such a device from the market.
I’ve joined their cause probono (yeap, no money - just fun) and built an Actionscript 3 SDK for creating multi touch applications, based on FLOSC / TUIO. Among the demo applications were Draw (like Paint but with ten fingers), a Puzzle, a Media Viewer, Fluids (for nice visuals), Piano, Ping Pong game, Hockey game. These were created for helping them showcasing the multi touch tables to potential customers. Worth mentioning that demo applications had to solve quite a number of problems, mostly optimizations for speed.
In the end, I advised them to switch to Java, since they needed more and more speed and Actionscript was not multi threading capable. They still exist. They still sell tables.
Another experimental project dear to me was
eduSofa. In 2013 I’ve joined a local company that was looking for a developer that could solve a tight deadline on a very interesting project.
The project was a second screen application prototype - tells you nothing, I know. Imagine you are watching TV and you have a tablet in your lap. While watching a TV show, the tabled would synchronise with the TV and provide contextual information about what you were watching. That contextual information was actually a micro website having a metadata that should match the metadata of the TV show data. To be more explicit, if you were watching a TV program with a show about whales, then the tablet would have presented you with what could you find out more about whales.
We’ve decided that server side should be developed with Spring Boot because was a really fast way to implement a REST API. To that, I had to add a MQTT communication layer between multiple customers, so we had features like having the tablet owners share their thoughts while watching the same TV show. This naturally lead to the idea that those micro websites could also represent a game, that the customers that share a local hub (to be read “people who live in the same house”) could play.
The front end application consisted of two components: an Android application and a smart TV application, which was developed by a colleague. Special about the Android application was the implementation of a custom UPNP discovery library (that allows smart TVs to connect with it), the MQTT consumer library and last but not least, the custom protocol we had to define for exchanging commands with smart TV application.
I’ve manage to build a fully working prototype (frontend and backend) in just three months.
We have continued the development of eduSofa, until it’s death due to unnatural causes. In that process we’ve been using Hadoop and Akka for making TV shows recommendations based on the social side of the application, had to build an custom Electronic program guide display Android component, which was challenging in terms of speed of update and scrolling in both directions in the same time (for neat looking).
Imagine booking keeping of the agricultural work on a farm or a group of farms (we’ve been consuming Google Maps APIs for that - of course).
The main challenge was the slowness of drawing the parcels (in browser) due to the large number of points that needed to be displayed (coordinates were collected with total station - a GPS device that makes highly accurate GPS measurements).
The solution was to use an algorithm to eliminate points that were not needed for displaying a good enough approximate. Having a node with two neighbours, we’ve measured how much distance is between that node and the line that it’s neighbours define and if it was beyond a certain tolerance, the node was removed from the polygon that needed to be drawn.
We also had to detect if the polygons do not overlap and solved that using a Gilbert-Johnson-Keerthi collision detection algorithm.
I enjoy working with maps and coordinates, so if your project has challenges related with maps, I’ll be more than happy to dive into them.
My very first official developer job was at a company that was building educational content. Later, I had to build an standalone educational platform for online testing, which I code named
Examo. I’ve chosen Spring Boot framework for backend and AngularJS for frontend, since I was the only developer on the project.
The modelling - I love building data centric application - was interesting because we had to support a number of species of exams, each with certain conditions like shuffling, allow retaking and resuming the exams, measuring points and statistics.
Later the client decided to use MongoDB instead of MySQL, so structured database to non structured database it was.
I’ve mentioned education here because I enjoy building projects that involve education. It probably has something to do with my perpetual learning experience, where the saying “If you can’t explain it, you don’t understand it well enough” it’s the most meaningful.
From time to time, I have to explain quite difficult concepts and techniques to persons close to me, and that have nothing - or little - to do with that field of work. I enjoy doing so, mostly because I have to test myself and clear any doubts that I understand it correctly myself.
I had the opportunity to build an application that would collect data from sellers and synchronized them with a SAP ERP server. For that reason, I had to come up with solutions to solve redundant data exchange problems and timezone related issues, while the application I was building was not in control of the process. SAP was the one that controlled the synchronization time.
In another interesting application, codenamed
PhotoX, I had to solve the challenge of providing a way to customize the choices a customer would have and build a price based on its choices. Let’s say you want to “build” your own printed photo album product and you have at your disposal, various types of paper, covers and other choices that you can make.
One might think that’s no big deal in building such a system, but I was stubborn enough to build it
agnostic, which means you only have to respect the same referential system and you could sell customized furniture. For building it agnostic - or, maybe I should say, generic - I had to do a constant check on not mixing the business rules (discounts, referrals, etc) with the core.
Code Generators and Frameworks
Yes, I’m lazy, like all developers are. For lazy part of me, I had to build myself tools, all sort of tools, that would write those boring pieces of code instead of me.
For that reason, Dynamic Form Generator Library was an SDK that used Apache Flex SDK to auto-magically build forms from XML document descriptors. It supported check boxes, combo boxes, date-time, expandable text inputs and areas, non editable text, numeric stepper, rating and file uploader. Forms could be organized as sections. It was accompanied by an application, called DynaFormer, which was intended to help user generate the XML document that represented a form, by dragging and dropping the form components into place and completing all the necessary details for that form, like validation of the fields and other data. My final intention was to create a product from this, that would generate Flex forms that can be altered without recompiling the entire application. However, it was not all in vane, this functionality was used in Fluvi.
I’ve also built a both ActionScript and Flex SDK version of a dependency injection framework that worked with signals and commands, called Roless. By the time it was stable enough, I was able to modify Adobe Flex compiler (written in Java) and deal with of custom programming language grammars, abstract syntax trees and the whole necessary arsenal.
I have created and donated to the Apache Software Foundation some components that were missing in Apache Flex SDK 4.0 : Alert, ColorPicker, Dividers (horizontal and vertical), Menu and MenuBar, ProgressBar.
Maybe you don’t consider this relevant for my current Go related work, but rest assured I am using code generation in Go, as well and posses my own custom built tools for that. Last year I have returned to those programming languages grammars (PEG, ANTLR) this time in Go, because Go’s YACC was not enough for what I was intended.
In almost every project I’ve worked on since 2002, I’ve been using databases. Due to the nature of developer roles that I had over time, I have became what one might call an optimisation freak. The sets of problems that I encountered over time and the fact that I favour model centric development, won’t allow me to be happy having two tables named “prices” and “discounts” in the same database, or the lack of minimum one index per table.
I’m always searching for ways of representing data for human readability while helping the database engine to run as fast as possible. Even if harder to read, I would always trade a
closure table to a classical (naive) tree approach - for the simple reason that you don’t have to stress the database engine in order to read such a structure (one query is enough).
As a side note, in a project not so long ago, we’ve built a Go user defined function that was doing push notifications after a SQL query.
Servers and Linux Administration
I have a friend (former colleague at my last working place) which is considered to be an expert in server administration. He does that with passion and responsibility. Probably one of the reason we’ve became friends is related to the conversations regarding security, protocols and best practices for Linux servers, because a long long time ago I had to maintain my own server.
Coaching / Tutoring
There was a time when I was going to high-schools and kept presentations about Flex. While doing so, the most interesting question that I’ve received from someone was rewarded with an invitation to join a small group of pupils that I was about to help become developers. Before that, I’ve helped a couple of friends take this road.
Why did I do it ? I wanted two things : one was to leave something behind me and the second to consolidate my knowledge by being able to explain it to others.
Why Go language ?
As we all know, cross-compiling used to be quite difficult, that’s why my journey towards Go was via Java. I’m still follow news about Spring Boot framework, but for the last years I’ve been doing Go every single day.
Spring Boot was providing mostly everything to me and the Java ecosystem was so large that you could not say there isn’t a library for this or that.
Starting to learn Go made me think again about how programs are designed and the fact that writing something generic might reduce speed. And after all, I’ve chosen Go mainly for speed, for being as close as possible to the metal.
Third reason was minimal protection to reverse engineering. Reverse engineering Java might be illegal, but it’s quite easy.
Projects in Production
My first Go project was an application for publish-free ads (based on categories, any person would be able to publish a selling/buying message with pictures attached). As methodical approach I’ve realised that I would learn Go if I will stay away from other libraries than standard ones. I know, one might think that I was reinventing the wheel, but at that time most of the well known libraries were young anyway, so, no damage taken.
After learning my way with the standard packages, for the project in question I’ve needed and implemented the following :
- a HTTP router that would be able to support both secured and unsecured routes, serving both HTML rendered pages and Json
- at the time there was no such thing as the
context.Context, so I needed to define an interface with similar capabilities
- for this router, as HTTP middleware I needed CORS, gzip, security, rate limiter and file upload
- a small template engine with auto-reload capabilities for development and in memory caching for production
- a set of packages for paginating, captcha (because customers should be allowed to upload files without being logged in), cron like service (which would cleanup uploaded and abandoned files), sign in with Google and Facebook, email communication service
- a package for database storage (both postgres and mysql adapter)
The frontend was as light weight as possible, since I was the only developer on this project : just jQuery with materialize theme.
Looking back at that code, all of it revolve around the solid design principles and the right tool for the right job. After years have passed, looking at it, I would not change much - maybe add another layer here, or minor improvements there. This shows the power and simplicity of Go : code that does not deprecate a couple of months after going to production.
After first project was delivered, we’ve started a new project, this time inside a larger team. This project was for a client in the VoIP business, which wanted an application for managing his operations.
Aside from GORM - which I consider to be a regretful decision - we haven’t needed (again) any other third party packages.
By the time I’ve left the company (one year development time), the following worth mentioning features were implemented :
- an audit system (event based) that could keep track of operators that performed changes on sensitive data
- a reflect based generic comparator : comparing two model structs would have produced two usable pieces of information, one for gorm to perform updates (without running queries like crazy - as it usually does) and one for the audit system
- a reflect based middleware that would unmarshal json in accordance with the parameters accepted by the registered controller function. If the unmarshaled struct implements a validation interface signature, validation was called before calling the controller function
- a plugin system for interoperability with various REST / SOAP APIs : the system could be configured which kind of partner services to consume for provisioning, shipping hardware items, taxes calculation, etc.
- an automation system that got started by user defined triggers. E.g. if an order has status changed from “new” to “send”, automation system would perform the following actions (send emails, prepare PDFs, etc). Both conditions and actions were definable by the administrators
- a standardized way of serializing json responses, search and filter for entities
- an access control list that could allow creation of every possible combination of roles to access APIs
I’ve decided to rewrite Gorm and invested a couple of hours a day in doing so. After three months, I’ve stopped because I realised it’s going nowhere - excuse me, I won’t share the details here.
You’ve probably noticed that I haven’t mentioned Docker anywhere. Nor did I say GraphQL. Or ScillaDB. It’s not because I’m ignorant.
My daily routine starts by looking at other people code, reading articles and getting myself familiar with the
Recruiters Frequently Asked Questions
Recruiter : How much experience do you have with Go ?
Me : I’ve started to learn it in April 2016. Three months later, I was delivering my first project. I’ve been working Go ever since and plan to do so in the future.
Recruiter : What do you consider to be the most challenging about Go?
Me : The fact that I had to change paradigm - again - from being a strongly object oriented programmer to a how fast something can be developed without violating solid design principles. With the right amount of patience and a plan, one can migrate from Java to Go in about 3 months - for me that was a good enough learning curve. Finally, Go is not that challenging itself, but the philosophical problems that it raises are.
Recruiter : What was most challenging thing in your Go projects ?
Me : My first project was built without using other packages than standard ones. This implies a lot of test driven development, a huge amount of time, but in the end it payed off.
Recruiter : How much exposure to the cloud technologies do you have ?
Me : I haven’t been exposed to any clouds other than rain. Explain if you actually intended to say “Internet” when you say “cloud”, because I’ve been on this market for too long to know that fancy words are just fancy words. In general, I know that you - the recruiter - have no idea what it’s behind those words, but let’s be on the same page. I’ve worked with the Internet technologies for long enough to consider that I know a lot about it.
Recruiter : How much money do you want ?
Me : Let’s apply common sense : if you contacted me, make me an offer. If I contact you, you are surely not a recruiter. Ok ?
Recruiter : Are you willing to go on site if required ?
Me : Yes, but no longer than 3 weeks at a time (every 3 months or so), with all the details covered (airplane tickets, accommodation, expense allowances) by the company.
Recruiter : Why are you being so hostile in this F.A.Q. ?
Me : Well, all my professional life is about trying to be the best at what I do. Can you say that about yourself ? If your answer is yes, maybe we should go technical about our conversation. Read this to find out why I am so disappointed with recruiters these days.