cv in doc format

advertisement
MYKHAILO IEROMKO
Location:
Cell phone:
Email:
Skype:
Website:
LinkedIn profile:
Document version from 04.11.2014
Chernivtsi, Ukraine
+38 (050) 803-58-46
misha.eromko@gmail.com
mike_in_christ
http://lmike-ieromko.info
http://lnkd.in/d66hGmj
SENIOR WEB DEVELOPER & SOFTWARE ENGINEER
Summary
 Able to make your company and you richer. Versatile expert in internet-programming; involved in the development of
successful enterprise web and client-server applications, with 12+ years of experience in commercial development. It allows
me to produce a customer-friendly and easy-to-support high-load systems, that generate interest from prospective customers
- with emphasis on performance, scalability, flexible and security.
 Expanded global presence in the market for one of the leading companies in the industry, being one of the leading developers
of web application that is used by 4,500 corporate and 4 strategic customers with 450-500 orders per day, with the data
coming from 14 partner-suppliers.
 Co-author of a client-server system serving 14 payment centers with a monthly turnover of several million hryvnia ($ 600,000).
 I understand that sometimes I’ll have to sacrifice performance for the sake of achieving business goals, and it's right. At the
same time I’m focused on the main application properties: functionality and usability (the system must do what you want, and
do it better than others), performance (optimization, scalability) and availability (stability, minimization of errors, data
protection).
 Possess advanced skills of refactoring, which I constantly apply, reducing the number of existing and new bugs, as well as
speeding up and simplifying the process of development - thereby reducing the company's losses due to downtime of the
project and the quantity of dissatisfied customers.
 Considerable experience in optimization and automation, the result of which has always been an increase in profits and
reducing payroll by thousands of dollars by automating functions that previously required manual actions.
 Built a generation of accounting documents (300-350 per day). Implemented automated gathering of hotel photos from
suppliers’ galleries by rating the photo quality - 9.5 million photos for 470,000 hotels a month.
 Reached the full automation of the administration that made it possible and safe to perform operations not only for me (the
administrator), but also for managers, ignorant of the details of the project. Also achieved automation of deployment of the
whole client’s workstation. The latter made it possible to deploy the system in seconds.
 Sped up the search process by introducing multi-threading and asynchronous loading results. Acceleration of 3-6 times (from a
minute up to 10-20 seconds).
 Smart, able-bodied and easy to train. Easily support someone else's code. Started to learn PHP, connecting to an already
running PHP-project with a large amount of code, complex logic and harmonious development team. At the same time
effectively developed and accompanied this code and reached the level of the leading developer. Mastered the 46 large and
small tools and technologies.
 Deep understanding of development process - from user requirements gathering, analysis, architecting, developing to
production rollout, documenting and ongoing maintenance. Carried out the design, development and implementation of the
project from scratch in an already functioning industrial process.
 Attentive to details. Independently initiate the task of error correcting. Troubleshooted wide range of production support issues
from minute bug-fixing to complicated problems which gave rise to global refactoring. Gradually decreased monthly error rates
from 1.5% to 0.6% in the project hotelbook.ru.
 Before starting doing something, I always think and plan well ahead first, and only then proceed. Once task is performed - I still
practice constant self-feedback in order to analyze what can be done better.
 Experience of customer service. The customers’ feedback is the main source of ideas for improvement projects in which I
worked on. Was successfully engaged in collecting requirements from users, in searching, studying and evaluating of
alternative solutions.
 Being self-disciplined, possess skills in work planning and estimating best time required; on time task performance. Feel
equally comfortable working both alone and in a large team.
 Over 2 years of Team Lead and technical guidance experience. Interviewing of newcomers, mentoring, code reviewing,
supervision. Participated in team design and planning meetings and provide technical summaries and estimates.
 Proven analysis and design ability with experience developing functionality for wide range of goals including e-сommerce,
billing, document management, customer support, personnel, inventory, social, search engine, semantic analysis, elections.
Architecture experience starting from 3-tier website and classic client-server applications to single system software and
background administrative tools for companies ranging in size from small start-ups to one of Russia's largest tour operator.
 After a long work in a team and some experience in project management I have a great desire to further develop leadership
skills and have the opportunity to be the project manager - learn to create a top-performance cohesive technical team to turn
the boldest business ideas into profitable projects and do it under budget and on schedule. I would like to explore and try out
different software development methodologies and be able to choose the most effective for this purpose, resulting in reduction
the development time.
 I understand that the project manager works in 4 directions - budgeting (expense tracking and approvals, the initiative to
optimize in order to reduce costs and to add new functionality that increase profit), team-building (staff planning, hiring and
staff management), technical planning (choice of tools, technical tasking) and time management (time sheet approval,
planning games, monitoring / penalty / motivation, scheduling enhancements and balancing workload in the group). It is also
clear that the project manager is the link in the interaction of a number of specialists: designers, developers and testers, as
well as clients and senior management.
 I strive to increase my experience in advising clients and solving technical and legal obstructions to project deployment
completion, extending the presence of the software owner in other countries. Have experience with deployment Russian
project in Ukraine (work with currency, local time and features of the legislation in the sphere of tourism services, necessary to
be adapted to the business logic of the project).
Technical Skills
Programming Languages
Architect role
- PHP (expert, 6 years of experience). With applying OOP
principles and patterns and with hands-on knowledge of
ORM (custom ORM and basic in Doctrine), MVC,
Dependency Injection and HTML-templates. Multithreading,
Regular Expressions, Exceptions, Magic Methods, Closures
etc. Beginner in Symphony 2
- JavaScript (expert, 11 years of experience). Ability to create
fully AJAX-ified sites. Expertise utilizing jQuery in various
scenarios, including: AJAX, DOM manipulation, animation,
jQuery UI. jQuery-plugins: AJAX multiple file upload,
jqTransform, History, TableDND etc. YAHOO-widgets etc.
Medium in AngularJS.
- HTML, CSS. Currently used, 11 years of experience. Crossbrowsering, responsive design. Implementing PSD designs
into working code. Deliver clean, isolated code for markup,
JS and CSS. FireBug and browsers' developing tools.
- SQL. Currently used, 11 years of experience.
- Shell Scripts. 5 years ago, 8 years of experience.
- C++, C. 5 years ago, 8 years of experience. With applying
OOP, memory control, using std library (string, map, vector,
list) and some system libraries under FreeBSD OS, gcccompilation, Makefiles.
- Ruby. 5 years ago, 5 years of experience. Whole potential of
OOP imbedded in the language, yield and blocks, new
custom types, working with db, external libraries, compact
syntax in Ruby spirit.
- Understanding and implementing of entire development
cycle.
- Gathering of user requirements and prototyping.
- Refactoring of high-load & large-scale project.
- Technical problem statement.
- Daily & weekly planing, iterations. Time and task complexity
estimating.
Databases
- MySQL. Currently used, 6 years of experience. Optimizing
queries, understanding EXPLAIN command and locks
problem, using SHOW FULL PROCESSLIST and KILL.
Stored procedures.
- MS SQL. Currently used, 2 years of experience. T-SQL,
views from MS SQL to MySQL, stored procedures .
- PostgreSQL. 5 years ago, 5 years of experience. SQL,
optimizing queries, understanding EXPLAIN command,
basic in stored functions.
- noSQL (beginner)
Technologies
- Webservices (SOAP & WSDL).
- One-page application.
- Agile / Scrum / XP (iterations, Planning game, Refactoring,
Coding conventions, feedback with customers).
- Waterfall Approach (step by step through development
cycle).
- Prototyping Approach (making prototype for testing and
feedback with customers).
- 3-Tier Architecture (front-end UI, middle business logic,
back-end database).
- Accurate releases after developing of new large functionality
or after global refactoring.
- Usage of multi-stage server environment (development,
staging, and production).
- Multithreading, Caching. Asynchronous requests and
loading. Job servers.
- Data integrity and validation.
- Cross-browsering, I8N.
- Outsourcing.
Optimization and bug-fixing
Data Formats
- Optimization of high-load project.
- Making slow SQL-queries faster.
- Automatization of routine jobs.
- Troubleshooting of critical errors, when a very limited time is
given for it. Problem identification and fixing by data analysis
and by monitoring using email notification, logs, debugging,
testing, Zabbix, Apache status etc.
- Logging, tracing, profiling and getting metrics.
- XML, JSON, CSV, Excel (xls, xlsx), UTF-8.
Instruments
Networking
- Sockets, cURL, SOAP, RPC, JSONP / CORS.
- HTTP, HTTPS / SSL, TCP, FTP.
- VPN, SSH, PuTTY, Routing.
- NTP, DNS, SMTP / POP3 / IMAP.
External API Integration
- B2B: external booking services integration.
- Media & Social API: Google Maps, Yandex Maps, Twitter,
TripAdvisor API.
- Google Font API.
- SVN, Git (GitLab, Bitbucket).
- Mantis, Redmine, Kanban.
- PhpStorm (code surfing, syntax checking and coloring,
languages reference, help with refactoring, SVN/Git
integration etc). Vim (folding, syntax coloring, auto-indent,
custom hot keys, backup).
- Photoshop (basic knowledge). PSD/PSB to HTML/CSS
Layout.
- Thunderbird (mail filters, grouping of error notifications).
- Sandboxes for RegExp, CSS. JSFiddle.
- Apache and MySQL Server for local testing.
- MySQL Query Browser, pgAdmin III.
- Firefox, Opera, Google Chrome, Internet Explorer.
- Dropbox, tools for making screen-shots.
Administrating / OS / Server
- FreeBSD 4.10/6.2, Ubuntu. 5 years ago, 8 years of
Team Building & Leadership
experience. Advanced user and basic in administration.
- Windows XP/7. Currently used, 12 years of experience.
Advanced user.
- Apache, PostgreSQL, MySQL, PHP basic configuring.
- Batch shell-scripting.
- Sudo.
- Interviewing.
- Supervision. Code review.
- Mentoring, writing documentation.
- Task assignment in team.
Work Experience
2014 - Present
Senior Web-Developer, UTS Group, Moscow, Russia
UTS Group, the owner of my project in Lightsoft Research invited me to continue collaboration with them in the same project
Hotelbook that moved from hotelbook.ru to hotelbook.pro. So I took part in project migration from the company-contractor to the
owner-company (hosting, developers and support team change). I was a member of the team conducting migration in several
stages to make the process for the final client less traumatic and most unnoticed. Then during bug-fixing and making new
fuctionality I retained high level of service getting approval from previously dissatisfied clients as a result.
Keywords: PHP, HTML / CSS, JavaScript, jQuery, MySQL, MS SQL, PostgreSQL, SSL, SOAP & WSDL, acquiring, web-based
design, one-page application, large-scale & high-load software solutions, enterprise systems, booking, billing, multiple-release
management, software team leadership, technology recommendations, flagship product development.
Some of the achievements:
 Project migration.
 Write tools and simple framework to realize new version of built-in client as one-page application.
 Decreased data processing time, increase speed of project reply to client request.
 High level of service
General
 Project migration from the company-contractor to the owner-company (hosting, developers and support team change). I was a
member of the team conducting migration in several stages to make the process for the final client less traumatic and most
unnoticed.
 Retained high level of service getting approval from previously dissatisfied clients as a result.
 Analyzed informational and technical possibilities of potential data providers.
 Consulted other developing teams for interaction with this project API.
 Rated resumes of the applicants, interviewed them and coached newcomers.
Front-end
 New version of built-in client (the port to Hotelbook's funcionality at the agency's website). Achieved maximum simplification of
installation process for built-in client by agency's managers. Manager has only to add HTML tag «script» to the chosen webpage and our JS-library will do the rest.
 Used my own JS-tools and only ready-made engine of JS-templates and URL parser / formatter. The rest examined tools were
either huge and slow, or had small possibilities and didn't fit our task. Realized my own dependency's and module's manager
with dynamic linking of JS and CSS to a web-page. Manager knows about dependencies between different JS-libraries and
between HTML-templates and their sub-templates. It means that all independent files are loaded asynchronously (parallel),
but that files which have dependencies are loaded only after full loading of all their dependencies.
 Fulfilled new architecture of built-in client as one-page application. Firstly root JS-controller is loaded to the web-page where it
is linked. It loads base libraries and defines current state by URL part called «hash». Accordingly to the state root controller
loads particular state controller with its JS-plugins CSS and HTML-templates. URL of data AJAX-request is been getting from
config in root controller and current state. After getting data (or error) template's rendering and data output is doing to the webpage.
 Successfully solved the problem of cross-domain requests using JSONP and CORS (HTTP-header «Access-Control-AllowOrigin»). Realized cross-browser's XmlHttpRequestor of jQuery for main browsers and XdomainRequest for IE.
 Made a significant contribution to the developing of the other project where framework AngularJS is used.
 Fixed bugs in user interface of the project on mobile devices.
Back-end
 Decreased financial data processing duration in 7 times (from 37 sec to 4.5 sec) by transfering business logic from slow
accounting software to our porject.
 Essentially improved and expanded the accounting module intigrated in the project. Reimplemented it using SOAP+WSDL.
 Added a lot of new large and small functionality. Some of them are: loyalty bonus system, interaction with API of several new
data providers, possibility of using credit card data for payments without storage.
 Made a significant contribution to the developing of the other project where framework Symphony and ORM Doctrine are
used.
 Massively helped integrate several payment systems. Since that the project had more ways to pay the orders including credit
card through bank API and cash payment through street terminals.
2011 - 2014
Web-developer (2011-2012), Senior Web-developer (2013-2014),
Lightsoft Research, Moscow, Russia
Was employed in hotelbook.ru - high-load b2b project (6 servers, 4,500 corporate clients, 100-130 heavy requests per min, 24/7
booking), which interacts with the external API, and has its own API for clients. This project is e-commerce solution in the field of
tourism services. The service included searching and booking, cancellation, inventory of product deals and tour / hotel guides.
The main task of the service was to provide a ready-made business solution for travel agencies, as well as a powerful and
convenient tool for tracking orders by managers, including the problem orders (with a reconfirmation at the hotel, with penalties,
with invalid data, etc.). As a ready-to-use business solution it can be used in three ways - web interface,XML-gateway API and
client’ site web integration.
The system was hosted on 3 web servers (for load balancing) and 3 database servers (primary, replication and logs). The
project has a 3-tier architecture: UI, business logic programmed in PHP, and back-end based on MySQL.
The web site is comprised of almost 350,000 lines of PHP code across over 2,340 files, about 100,000 lines of HTML code,
30,000 lines of JavaScript and 10,000 lines of CSS and XSD.
Hotelbook is annually participated at the All-Russian exhibition of tourism business, and has led the owning company to a
serious level in its market segment.
My role was to plan, coordinate and conduct multiple complex software engineering activities and to participate in continuous
improvement initiatives. Project during my participation in it has reached stability and growth in the number of clients, increased
the speed of service, friendliness of the interface and has attracted several large strategic partners and customers.
Keywords: PHP, HTML / CSS, JavaScript, jQuery, MySQL, MS SQL, web-based design, large-scale & high-load software
solutions, enterprise systems, booking, billing, Scrum, aggressive project time-lines, multiple-release management, software
team leadership, technology recommendations, developer guidance and mentoring, flagship product development.
Key Responsibilities
 Quick work integration, a study of a large amount of code with complex dependencies and nontrivial logic.
 Design and development of new functionality. Optimization. Technical support.
 Complexity evaluation of the problem, planning, execution time assessment. Itemizing the tasks for development of large new
functionality. Self-organization, in-time task solving.
 Interviews for candidate admission to our development team. Training and supervision. Technical problem statements. Code
review.
 Submission of monthly progress reports.
Front-end
 Designed and implemented the asynchronous loading of search results to the client page. The results are loaded gradually in
real time using AJAX - as they are received from suppliers and processed by our system. Data is dynamically re-sorted. The
only information is loaded that has to be on the selected results page (pagination). If the customer changes the filter or the
searching parameters when all results have not been obtained or loaded yet, a new search and a new results loading cycle
are initiated with interrupting the previous search (thereby saving client resources).
 Built several modules with dynamic complex JS-forms generated by the users' parameters, with tabs and folding blocks.
Added custom form elements (input-element to select a range of dates with modification of the standard jQuery calendar,
number incrementers, predictive search in select-element, files download with custom button).
 Implemented JS-validation with universal highlighting mechanism of the required field in form and with error message output
below. The mechanism can be easily used in any HTML-form.
 Upgraded interface by adding AJAX technique to the web pages. Dynamic lists (for example, updating city list after choosing
the country). User command execution without interface reloading. Searching by the first letter in a long list, which is
impractical to be loaded into the browser.
 Simplified JS code due to the powerful mechanism of selectors and events in jQuery (including elements created after page
load – method «delegate»). Pages look more appealing after my using ready widgets and animation effects of jQuery UI.
 Due to the fact that the JS libraries are open-source, code of some of them was modified for the needs of the project.
Alternatively, methods of some libraries were overridden in our code, so as not to modify the source code and libraries that
can be updated from its official web-sites.
 Twice completely revamped the layout of the project (according to mock-ups). Followed the cross-browser principles, the
correct colors displaying and CSS optimization - allocated shared styles, smashed other styles into separate small CSS-files,
connected to only a few pages, where they are used; abandoned the images in favor of CSS; used sprites.
 Made the transition from Google Maps API v2 to v3 and added to the project the interaction with Yandex Maps API v.2.
Implemented both a static and dynamic maps, hotel markers output from the search results (markerclusterer.js), grouping of
the markers into clusters when scaled.
 Studied the principles of pagination by means of MySQL (offset .. limit). Advantages – accelerates page loading with big data
amount as the amount of data is limited. Disadvantages - when sorting by complex combination of fields with their postprocessing a staging table is required where the data with the already calculated values of the sort fields will be stored.
 Gained experience in increasing the interface friendliness. Floating, always accessible button "up" on long pages. Fixed
header row of a large table. Selecting elements by large lists without having to open the entire list.
Back-end
PHP
 Smartly exploited and studied patterns already applied in the project: «Factory» - selection of the desired constructor of the
element of the order; «Singleton» - to get a connection to the database; «Registry» - multiple access to once created objects;
«Lazy initialization», «Iterator» - in the internal ORM of the project; «Delegation pattern» - the mechanism for setting the
association between the suppliers hotels and Hotelbook hotel (transfer of responsibility for some behavior to the objectparameter); «Strategy» - work with different services in order; «Property Container» - search options; «Template method» - for
the entire project: for example, a request for search and response processing from different suppliers (the definition of the
"skeleton" of the algorithm, in which the descendant can override some of the steps without changing its structure as a whole);
«Messaging design pattern (MDP)» - for the collection of errors and profiling of all parallel search flows. And many others.
 Assessed the importance of MVC pattern; separation of the data model, business logic and interface. I prefer to use "thin"
controller and the active rather than the passive model.
 Practiced principles of SOLID. In particular, Single responsibility (orientation of PHP class for the sole purpose); Interface
segregation (many client-specific interfaces are better than one general-purpose); Dependency inversion (details should
depend on abstractions, not vice versa), as well as the more general programming principles - encapsulation, inheritance and
polymorphism.
 In the course of work, wrote auxiliary methods grouped in libraries that all the software team had access to and used:
formatting dates for the needs of the project, the decline of Russian names of countries and cities in the genitive and
prepositional case, data selections from the database for predictive search without keyboard layout (in Russian with English
layout and vice versa), and others.
 Studied and maintained a system of exception classes and the use of try-catch structure to filter exceptions of a certain level,
the output of different messages to different groups of users - developers, managers and customers, and for logging errors.
External APIs
 Analyzed and learned API of 12 suppliers of hotels, as well as 2 suppliers of transfers, 2 suppliers of car rental, one of
excursions supplier and one of hotel reviews.
 Added new services to the project - transfers and excursions (supplier UTS Hotels), car rental (Cardelmar).
 Implemented modules to view the calendar of events (UTS Hotels) and reviews about hotels (Trip Advisor).
 Gained experience in circumvention of the external API restrictions. For suppliers, where the offer details (daily prices and
penal terms) can be known only after the starting of the booking process, temporary (virtual) shopping cart was implemented,
which is cleared after details receipt. If the number of rooms (suits) that can be searched in a single query is limited, we added
in a functionality of work with the supplier the mechanism of parallel sub-queries with further merging of results (breakdown of
the search parameters to the allowable number of rooms and the combining them from replies). And when the provider returns
the results page by page, successive subqueries within a single search are made.
 Trained to work with entities, where one can get fined. Have set the key points for myself. For instance, to check the offer
availability just before booking; users notification of penal terms, as well as notification of change in price and surcharges.
After you create an order, it is important to inform the user of impending penalties. If while sending a reservation to the
provider an error occurred (for example, connection was lost), you need to block the booking so that it could be re-send only
by the manager – this would allow the manager to check the booking on the provider’s side and to avoid duplication.
 Developed the practice of forming and parsing XML (in raw format and as the object of SimpleXML library) and JSON.
Practiced working with sockets, TCP, SSL, HTTP protocol (errors, headers). Applied synchronous and asynchronous modes of
interaction with service providers (in the second case the asynchronous response does not come immediately to the request,
but on our URL as freeing supplier resources).
 Introduced to the project automatic generation of accounting reports, invoices and other financial documents in pdf-format
which are based on the data of external financial software and MS SQL. The HTML-templates of PHP were used for
generation of pdf files.
 Added data transferring between MySQL (our project) and MS SQL (financial software) using mssql-functions of PHP and
staging tables on the our project side.
 Implemented automatic synchronization of payments: user sees a real-time status of order payment, sum to be paid and
debts.
Functionality
 Launched the Artex project (Ukrainian version of Hotelbook), working as a satellite project through Hotelbook XML-gateway.
Faced problems with local legislation in the field of tourism services and adapted the business logic of the project to them.
 Implemented in Hotelbook and its subsidiary (designed to work with air-tickets) the system of users with these features: users
are joined into classes according to the level of access to the various functions and different types of pricing, as well as in
groups. Classes can be divided into subclasses. Rights and properties are inherited from the parent class to its subclasses
and from the class to its users. The rights and properties of the members of one group are set through the rights and
properties of the group at one stroke. The rights and properties of the parent user of the group are inherited by the other
members when they are added to the group. The parent user has a simple control panel for user management - the so-called
agent and sub-agent network.
 Got experience with margins that are shared by user classes, suppliers and countries. Advanced this mechanism by adding
functionality of rate plans - the ability to create different margin grids, which can then be correlated to users, unset them, set
other grid for user, make discounts for a specified period with one mouse click, and so on.
 Made possible the fully-automatic currency converting based on daily central bank exchange rate.
 Added feature of photo quality rating (by resolution, size in bytes, color depth in bits, and image format), allowing to automate
the collecting of hotel photos from suppliers.
 Implemented a multilanguage in hotel descriptions (utf-8, 9 languages – English, Russian, German, French, Spanish, Italian,
Japanese, Korean, Chinese). Gained experience with the existing localization and expanded it. Translated description fields in
DB have a common field name and language suffixes. PHP-code and HTML-templates use gettext-wraps to replace the text
and wraps to replace the date format and button image. The control panel has a section with all the phrases for translation.
Date formats, currency conversion in prices and penalties have been accounted.
 Learned and improved automation of routine work by «jobs» in Unix-service «cron» - logs archiving, backups of important
tables, notifications to customers and managers, mailing lists, data synchronization, cache resetting, and so on.
 Made a news module working in two modes. Unread items are displayed for the selected user class at the login to the project
or when moving to the next page (after adding news by the manager); In addition, the news can be added to the list and then
sent to the emails of subscribed users. Mail operates in the queue. News is sent with a certain distribution over time and to
each recipient separately so not look like spam for the mail servers.
 Developed a module of lazy (offline) order, where the client specifies all or part of the parameters of the reservation, on the
basis of which the manager creates a real order.
 Studied and significantly expanded the possibilities of XML-gateway, in particular by adding a searching and booking of such
service as transfers and adding work with these orders. Wrote a full XSD-schemas of all requests and responses. These
schemas are used both to validate requests and responses and as part of the documentation. Requests to the gateway are
the main workload of the project. Two satellite projects of the same company are functioning on the basis of XML-based
gateway (b2c project UTS24 and Ukrainian version of Hotelbook - hotelbook.ua), as well as side projects TopHotels and
HotelsBroker. The search results of hotels through the gateway are available in synchronous and asynchronous modes.
 Got experience in the development and improvement of web module that can be embedded on the client site and providing
search and booking through our backend. I also carried out technical support for the installation of this module in a CMS
(MODx, Joomla) and customers’ back-ends (mainly, Perl).
Technologies
 Succeeded in deciding problematic features of multithreaded programming in PHP - in particular, the connection to the
database is initially common in all threads (copied when creating a thread), and it needs to be reopened, so that when the
child processes are terminated, they will not shut down the overall connection. Also, when PHP is running as a module in
Apache, you need to "kill" the child process, and not just exit it. Because for Apache when the process are forking not only a
new PHP proces are screated, but also the new process of entire web server. Therefore when «exit» command was executed
the PHP stops, but the new Apache thread is still running («zombie» problem). Used database tables to collect information
from the threads (error collecting and execution time profiling).
 Studied the importance and benefits of detailed monitoring for bug-fixing. Used logs of interaction with external API (with
suppliers), logs which stores the time of each page generation (runtime of logic blocks in the code), search profiling
(separately for suppliers and stages of the search process). Used logging of the whole work with orders and with important
sections of the control panel, and other logs. This repeatedly allowed me to reproduce the causes of failures in the most
complicated situations and to eliminate them.
 Got experience in the use and development of custom HTML-templates (context variables, conditional branching, nested
loops, predefined variables, PHP function calls, output modifiers, caching of compiled templates). Adding my own modifiers
and template functions (using inheritance and overriding).
 Learned custom ORM from inside. This ORM maps dependencies between PHP-classes in the structure of the database:
class inheritance realized through the primary key which is common for all tables (table of parent class and tables of all
descendants). And the links between object and its collections and between object from the collection and its owner
implemented through the foreign key. This ORM also saves changes in database after real change of entity only. Lazy loading
from the database (only after access to the item in the collection), events and object collections are also implemented in this
ORM.
 I have gone through the power of caching technology in practice. There are many things that are cached in the project: the
paths to PHP classes (by autoloader), the result of HTML-template compiling, the results of tourist service searching, selecting
of the static data from the database and others.
 Got familiarized with the technology of execution queue. For slow scripts working with large amounts of information, its
lunching through the control panel was implemented asynchronously: the script is added to the queue and will execute later.
Its status could be viewed from the control panel (if it started / completed), as well as the execution log.
 Worked with RewriteRule in .htaccess (definition of PHP-script for each entry point and for the home page).
 Took part in the discussion and implementation of application availability initiatives (data replication, load balancing, etc).
 Developed new approaches, applied existing criteria in new ways, comparing their efficiency and making conclusions.
Optimization
 I have proposed and implemented optimization of the searching process - multithreaded asynchronous search. Searching
process for each supplier has its own thread. There is possible to limit their number, then suppliers are distributed equally
among every thread - so that each thread would offer the same time for searching at its suppliers. Average search time for
each supplier is updated every time you search. Ideally, when resources allow to allocate a separate thread for each provider,
the search speed equals to the speed of the slowest response from the provider (and not the amount of time spent on the
search for all suppliers, as before). Search results from a specific provider are available immediately after their processing,
even if the other suppliers haven't given results yet. Thus, the client gets some of the results available as quickly as possible.
Before this optimization results were available only after data processing from all suppliers.
 Whenever necessary, just while implementing new development and making technical support I performed the refactoring
(moving common methods from descendants to the base classes; making changes in architecture, dependencies and
inheritance schema; preservating uniformity of architecture of similar functionalities, sticking to a coding standard).
 Suggested refactoring of the work with PHP sessions. Standard PHP-sessions have one feature - they are consistent: the
session file is locked until the end of the script, and the client gets all requests hanging, if any of them run for a long time. We
used the session, which was copied to all streams of parallel searches. So it was decided to work like this: at the start we
open the session for a short period of time, read all the data in a global variable and immediately close it. And then open it
only in the required places.
 Got optimization experience in saving space in the database: instead of the standard PHP-method «serialize» data are
combined by the selected symbol, so the resulting string is shorter. And serialization and deserialization are based on the
description of the data structure that we are packing.
 Repeatedly optimized slow queries to the database, using command «explain» and indexes. In some situations, subqueries
are faster than JOINs (it’s better to select keys and then to use them in the parent «select» statement, instead of joining of the
entire table and checking conditions of joining for each row).
 Got experience in how to optimize the records deletion in a large table which is loaded with requests - instead of delete, you
create a table with the same structure and insert there the data that you want to leave. The old table is droped and a new table
is renamed to the original.
 Learned that tables storing cached data and having frequent queries from them benefit from move those tables into the engine
memory (ENGINE = MEMORY). In addition, the separation of such tables into parts (similar to the partitioning in PostgreSQL)
helps to accelerate work with the database. By row id system determines which of the N tables will work. This reduces the
problem of locks in MySQL, where such problem is unfortunately common. It is also useful to use temporary tables for heavy
intermediate operations on data. For instance, such tables were created for each search, and after the completion of
processing of the results, they were transferred into a common cache table.
 Added the separation of huge log tables into two parts - operational data and archive - to avoid project’s freezing up when
writing to the log. Large archives have been split by months (in which log rows are inserted), and some by days, to avoid
control panel’s freezing up at viewing. A separate database server was delegated for storing log tables.
 Faced that ORM was used not only when dealing with a complex object (that is when appropriate), but when working with a
large list of objects (for the statistics module, for example), which led to a drastic slow down with the statistics - for me it was
the experience “where you shouldn’t use ORM”. Rewrote the statistics module without ORM.
Training, Team-building & Leadership
 Interviewed applicants to our development team.
 Wrote documentation (corporate wiki) for our newcomers, made technical problem statements and code review.
 Trained co-workers via Skype conferences.
 Analyzed each code module and HTML-template and documented the logic and function declarations in the code (and basic
logiс in the corporate wiki for other developers).
2003 - 2010
Software Developer (2003-2005), Leading Software Developer (2006-2010),
Branch office of Gaz of Ukraine, Chernivtsi, Ukraine
In this company I was lucky to be a co-author of a client-server system of receiving payments for gas, electricity, water delivery,
municipal heating, cable TV and other public services. This system during its use was considered one of the best in Ukraine. I
have piloted it through the entire development cycle - from analysis of customer requirements and the creation of several
prototypes to implementation, deployment, documentation and technical support. Design, development and implementation of
the project took place on the move, in an already functioning industrial process.
Text user interface of the system was based on Turbo Vision library with adding my own widgets and functionality. The client
side also includes written in C driver for the cash register and Jabber-client (based on the Loudmouth library). The server part is
written in Ruby. PostgreSQL was selected as the database. Web-based interface providing document management, statistics,
and some automation of HR was designed for administrative and accounting modules.
Server based on FreeBSD, hosting the business logic and the database, was connected to a modem rack and LAN. It served
requests from desks operators and provided tools for administrators, accountants and management personnel. To ensure
continuous service availability, databases were replicated, and emergency power had 2 options - UPS and diesel electric minigenerator.
The client part of the system has been installed at 14 offices, serving most of the inhabitants of our town, so we were VIPpartner for all public service providers.
Users’ feedback largely helped to create a comfortable and productive system with an intuitive interface. Emphasis was placed
on maximum automation and fault tolerance, as well as the optimization and standardization of code to facilitate its maintenance
and flexibility of further development. The code is well documented (there are comments in the code and documentation for the
customer). Continuous optimization of business logic and increase of interface friendliness have led to continued growth of our
serviced customers.
As architect and developer on this project, I was responsible for designing and building interface and control-panel. When my
partner resigned, my duties was enlarged to such new responsibilities: extension and optimization of business rules of this
system, modification of data structures and optimization of database queries. Also, I was training new programmers in my
development team.
Unfortunately, Chernivtsi branch of "Gas of Ukraine" was eliminated due to the restructuring of the company, but because of the
bureaucracy and the conservatism of many government officials and businessmen, our system remains undervalued.
Source code is available upon request.
Keywords: C++/C, Ruby, PostgreSQL, HTML / CSS. RPC / XML, OOP patterns, prototyping, software architecting and
development, usability, optimization, automation, release management, software team leadership, developer/client guidance
and mentoring, billing, document management, customer support, personnel.
Key Responsibilities
 Interviewing clients for interface design requirements. Following through on requests that had previously been neglected.
 Design, development and deployment of our software.
 Technical support, maintenance of our software.
 Supervising (making decision to whom I need to direct a message about the problem - to engineers, accountants,
programmers or manager).
 Training new programmers.
Front-end
C / C++
 Thoughtfully applied OOP patterns. “Singleton” and “Register” to the main form of the application. “Command” and “Chain of
responsibility” for the exchange of messages between objects. Identity Map to load data from the database. “Gateway” is a
wrapper for C ++ to methods of C-driver of a cash register (i.e. for communication between different programming languages).
“Factory” is to hide the details of a cash register connected to the workplace (which driver is needed). When developing user
interface, the pattern “MVC” was in use (data structure and rules of their formation and processing are apart from widgets and
from the logic of the application).
 Principles of inheritance and polymorphism were actively used when writing code. Basic widgets were defined and further, as
appropriate, their descendants were created with new functionality, giving ease of maintenance and expansion of the widgets
system.
 Conducted a neat job with the isolation and purification of memory to avoid leaks in C/C++ code.
 Opted for a C ++ library of Turbo Vision, allowing me to build the UI in text mode, as the client application was run on slower
PCs.
 Added some visual elements: combobox, predictive search (with or without case sensitivity and for different fields of list items for item code and item name), numeric incrementers; input for payment sums with filtering and validation, input for entering
dates with incrementation by days, and time inputs with incrementation by minutes; complex forms with specific elements
navigation convenient for the system operator; windows for displaying static text with embedded text printing; nested lists
(when user selects an item from the list, a new window opens with a new, more detailed list or the final window with a form or
static text, the parent lists being dynamically updated during the work and changes in the form), and others.
 Got experience with the developed event system in Turbo Vision: sending a message about an event, the chain of responsible
ones (parents, offspring), the processing of events. Event system was used to respond to user actions and for interactions of
interface elements.
 While working, acquired the practice of using C ++ library «std» for working with strings (class «string»), associative arrays
(class «map»), for more advanced working with standard arrays («vector» and «list»). Used libraries like «rhtvision»,
«xmlrpc», «signal», «sys».
 Wrote drivers for the cash register in C, using a low-level API of the manufacturer through a serial device, message exchange
with the cash register and checking messages data integrity through CRC. There was support for both synchronous and
asynchronous modes for the corresponding model of the device, resend of critical commands (for example, finishing of the
receipt), work with cash register display.
Functionality
 To interact with the server, RPC and XML were selected. Name of the called method and data in XML-format are transferred to
back-end. The result is also passed in XML (therefore, any complex structures can be transmitted).
 Developed two modes in which the client part of the system could operate: online mode with a cash register and printer; and
offline mode, without a modem connection and emulation devices. Application initialization was run with the local configuration
file (higher priority), or could be based on the configuration sent from the server.
 Wrote driver to work with cash registers. In the configuration of a cash register its type is indicated, to which on the client’s side
the correspondent driver is connected.
 Included automatic update of the client application at logon. When changing the front-end, patch is imposed on the back-end,
and when you are signing in, your workstation receives a list of all the non-use patches. They are being downloaded and
applied (by «bspatch» utility).
 I have provided for emergencies. During disconnection or when there is no power in the server room, client side has a function
of cash data dumping to a floppy disk or flash drive. If the modem line is broken and serious repair will take a few days, it is
possible to work with the lightweight server copy on the desk. If the cash desk was attacked, besides the alarm the signal
goes to the server with one of hot keys.
 Thought over and implemented a flexible mechanism of debt cards - debts of all public services of a customer can be seen on
a single screen. There is the possibility of comprehensive editing of the card by the operator, a powerful system of hot keys,
and context menus, search by contract number or address, viewing the details (the meter, pay period), payment history (by
date or by service) and ability to print a receipt for the last payment.
 Gave special attention to the safety and reliability of working with cash. All input payments were verified by the entered period
of payment and by meter values, as well as by accrual and tariff for the service. And if the estimated amount of payment for
these parameters is significantly different from the amount entered, the system warns you that the payment might be paid by
the wrong subscriber. Address and the recipient's name were also controlled - the operator is notified of the address that is
different from the address of the majority of services in the card (the same for the person's name).
 Provided the possibility of correction and cancellation of payments made in cash current day, and also undeleting of payments
and subscribers.
 Thoroughly implemented data validation, depending on the type of data, with clear error messages and an indication
(highlighting) of the form elements, filled with incorrect information.
 Added predictive search in the long lists and the ability to add new items to the list by the new custom UI widget.
 Developed a calculator widget for calculating total sums, change sum and for other operations with history of operations and
with memory.
 Included the possibility to chat for cashiers between each other and for communication between cashiers and managers. Used
Loudmouth library for working with XMPP (Jabber). New posts and updates of the list of the connected interlocutors were
implemented in the background, based on the GNOME execution cycle («main event loop») and on two threads – one for
Jabber (messages, contact list) and one for the chat interface. Data exchange between the threads was made through the
files and system signals. Sending a message in chat was possible to several interlocutors. Messages are formatted with the
division on the sent and received. There was autoscrolling of the messages list.
Optimization
 Brought to the project the mechanism of caching of static data (cities, streets, companies and their services). This data is
loaded from the server one time at startup). Further, the messages, exchanged between the client and the server, have only
codes by which the names of cities, organizations, and so on are taken from the cache. Thus, the traffic between client and
server has been reduced, and the application was sped up.
 When it was necessary to transfer large amounts of data the compact format was used: "<string> Bn <string> Bn ...", where
Bn is byte with number of nesting level (n),
Support and Documentation
 Advanced help system was built into the interface: tips in the status bar, the intuitive name of menus and fields in forms,
extensive online instruction.
 Wrote and formatted a detailed guide with screenshots and tips (A5 booklet). It was a detailed description of all the features of
the system and the algorithm of work. The manual used language clear to ordinary users, who may be totally new with the
PC. The list of “hot” keys listed at the back. For imposition I used Adobe Acrobat Pro with PLugin Quite Imposing Plus.
Back-end
 To ensure data integrity, a powerful ideology of transaction was implemented to the system. Mechanism implemented here can
be briefly described as follows: "DB - cash register - DB." Payments were sent from the client part. To save them to the
database a SQL was made on the back-end. Next, front-end would print the cashier's check and send the amount of
payments actually printed. And only after that the server would save the payments. Thus, there remained only the completed
payments, which were stored at the cash register. If during the payment the back-end rebooted, the payment would be
considered printed and all stored in the database.
 Gained experience of semi-automatic normalization of subscriber addresses according to consonants from their street name
and to house number. Problem arose whenever the contract with the new organization was signed, or when adding new
addresses in the databases of the already connected providers of public services. Because of the manual data input our
partners used different formats of addresses and customer names. Often, the format was missing at all, which led to one
street called differently in different databases, and houses having similar but not identical numbering. Having analyzed this I
found a common denominator (with an admissible error) and implemented the method of converting the variety of addresses
in a common format for services paid from one apartment could be fit in one subscriber card.
 Studied created by the partner automate downloading of monthly accruals and debts to the server through a Ruby-script with
Gtk2-interface. Loading ran parallel to each organization (multi-threaded) with errors saving to the log and report on
completion of loading. Protection against re-download (from duplicates). Because of a massive data insertion and to ensure
optimizing, the indexes on the tables which were in use were temporarily disabled. The data were updated directly during our
system functioning, so it was hot updating. All operations were performed within a transaction, with the possibility of rolling
back. List of cities, streets, and subscribers were also updated within this transaction.
 Added a semi-automatic definition of the situations, when the payment is not entered correctly. This is a situation where, for
example, the meter values for the sequential payments are with a gap or where payment amount does not match the
expected (which is calculated from the rate and period of the debt). Also, the operator is notified that the subscriber card was
changed incorrectly when the address of the new service does not match the location of the majority of services in the card.
 Improved the logging of all queries to the back-end that my partner had added before. This made it easier to monitor and
search for the causes of failures.
 Implemented statistics calculating, and automatic generation of reports and other financial documents.
 For troubleproof functioning of back-end I learned how to use the dumping and restoring operative data (connections to the
database, queries from clients and others) after back-end reboot.
Database
 Developed a data structure created by the partner.
 Optimized and corrected queries to PostgreSQL database.
 Optimized statistics data collection using triggers: when new payments arrived they were immediately grouped and stored in a
table of statistics using triggers. Reports were made on already grouped data instead of being built each time from initial
information, which would be much slower.
 Triggers are also used for logging table changes. Just when system changes tables storing payments and debts the old and
new version of the data stored in the log table using triggers.
 Configured the database backup using SQL-dump.
 Used stored functions - they help saving of complex queries for reuse.
Administrating and Deployment
 Automated programming of ZyXEL modems, writing csh-scripts with a set of AT-commands.
 Configured APC UPS: battery monitoring; server's shutdown, when the battery is 90% low. Made flexible configuration of
switching between battery and main power.
 Configured Apache and other services. Learned how to configure the server so that the back-end of the project would launch
with the start of the server.
 Built cut version of OS FreeBSD to the client side (our own version of the kernel and system files).
 Built a ready image of the system (OS, system libraries, application itself, all configuration files), which was enough just to be
copied to the hard drive for the new payment office.
 Set up own development environment: a virtual machine (QEMU), an analogue of the PC on which operators would work.
 Actively used the Makefile to compile and bind the source (because for editing convenience, each class was in its own cppfile), as well as for the automatic uploading to the server the new version of the client part (that is automate generation of
patches) and dumping of backups before compiling new.
Control Panel
 Built a control panel which is a web interface for administration and daily routine. Intuitive interface and the presence of
automatic checks made it possible to perform these operations not only by me, but also by managers, ignorant of the project
details. Control panel has several sections.
 Developed the administrator section for remote modem rebooting and for monitoring of modem connections with the cashier.
At break a message is sent to jabber, it also outputs to the control panel, goes off alarm and sent to the cell phone.
 At the request of accountants I have added a section for accounting and management: statistics, diagrams (bar graphs and
charts based on the DOCTYPE SVG), subscribers data browse (some functionality of the cashier with a focus on finding and
correcting data), payment fixing and duplication of some important cashier's operations for cash register (if the cashier has a
broken link or there was other force-majeure).
 The third section implemented a few functions to automate the work with the staff. In particular - for the development of work
schedule (simple drag-n-drop interface and validation of the created timetable).
 Used my own libraries of Ruby-methods for building web-based interface and Ruby-controllers of admin panel. There was
library for working with database sessions: wrapper, opening and closing the session, which needs only be passed an
anonymous function). In addition there was methods of making repetitive requests (getting a list of streets, organisations, cash
desks and so on). Other library implemented errors and messages output in the admin panel. I also wrote builder of HTMLforms and tables of different format with supporting methods. Being some inexperienced I had “reinvent the wheel”.
Software Developer (by contract),
Broadcasting company Planeta, Chernivtsi, Ukraine
04/2009
Web application that implements working with subscriber accounts. It was made for one of the partners of the payment system
(of Gas of Ukraine) - for Broadcasting Company Planeta. It was written out of duty at the request of this partner. The application
had led to company’s saving of about 60 working hours per month.
Source code is available upon request.
Keywords: HTML/CSS, Ruby, SQLite, billing, automation.
 Added the following functionality: the addition of the subscriber; overview and editing the subscriber data; removing; view a list
of subscribers; search by account number and subscriber address; logging (with the ability to restore mistakenly deleted
user); uploading of debts for payment system "Gas of Ukraine."
 SQLite has been chosen as a DBMS.
 Back-end was written in Ruby, interface was built with HTML / CSS and JS.
2004
Software Developer, own project SMS-Friend (christian-oriented)
My own project "SMS-friend." This is a social non-profit project that aims to spread morality, the right values and a good mood to
everyone. Messages were sent to the mobile phone through the mechanism of email gateway (which is provided by the cell
operators). Subscription and advertising of the project followed the principle of network marketing through the social circle of
those who has already signed. It all started as a small home application with a half dozen subscribers and almost completely
hand-mail-out. But soon the application required a complete automation and transfer to a stand-alone hosting, when the
information on this service spread to several regions of the country and the number of users has grown to hundreds.
Source code is available upon request.
Keywords: social project, C++ Builder, Ruby, Gtk, cron, SMS broadcasting, automation.
 Implemented a news posting of encouraging words and quotations of wise men to members via email gateway to mobile
phones.
 Built with C ++ Builder the interface with the following functionality: the addition of a subscriber; the addition of a gateway of
new cell operator; adding new SMS text; configuration of the posting (to whom, when, and what); actually, posting;
congratulation the subscriber on birthday; SMS division by themes (the Bible, quotes, humor).
 Over time, I moved the entire interface in Ruby. Now It was in two versions - with a GUI (GTK2) and command line.
 Added automation based on Unix-service «cron».
 Subsequently, added new features: the ability to send a SMS with transliteration to selected subscribers (Cyrillic letters were
substituted by Latin letters); grouping of subscribers (SMS sending to a particular group); logging and some tricks against
spam filters.
2003
Software Developer, Chernivtsi University, Ukraine
Implementation of the thesis is writing an online library at the Department of Mathematics, University of Chernivtsi. My
supervisor and I wanted to create a document management system with the ability to find specific information stored in a variety
of formats, and make the system user friendly. It was a web project of the University for the internal network (intranet),
consisting of the documents download, their keyword searching and browsing.
Uploading documents had a modular structure: work with each document format was conducted in a separate module, PHPscript. New modules could easily be added as they were created, and existing could safely be improved, without affecting other
modules. The operation of each module consisted of getting the text from the document. Then followed document indexing:
system estimated weight of each word in the text, excluding the words with no meaning (conjunctions, prepositions, etc.) and
the words whose weight was below a given threshold. The search was performed by separate words using Boolean algebra.
Language features (i. e. cases) were taken into account.
Thus the system consisted of an interface (HTML / CSS and JS). Back-end was implemented in PHP. To store the document
index DBMS MySQL were used.
At the time of my graduation the system supported document formats rtf, doc, xls, pdf, dbf, html. Search could be done in the
Russian, Ukrainian and English.
Keywords: document management, search engine, semantic analysis, usability, HTML, PHP, MySQL, FreeBSD.
2002
Instructor, Computer school Nimpha, Chernivtsi, Ukraine
Taught the following courses (both individual and group): HTML, CSS, JavaScript.
2001
Web-Developer, West Regional Registrar, Chernivtsi, Ukraine
west-register.ua
Head of my University department introduced me to the Registrar of western Ukraine to build a site with all legal entities
registered at his office. It was my first professional order. In the process of writing the site I have studied HTML, CSS and the
basics of cross-browsering. Also I got the skills to work with Macromedia Flash and its programming language ActionScript. The
site was written using Microsoft FrontPage, information about organizations stored in Microsoft Access. Flash was used for the
main page and for logo header on all pages.
election.cv.ua
Director of the Registrar was a member of the city election commission at the next elections to the Supreme Council of Ukraine.
Therefore, I was put in front of my second task: to create a website displaying the process of votes counting in Chernivtsi region
in real time. I successfully managed the task, receiving my first payment for work.
Two interfaces were created. The first one, for the Regional Election Commission, providing an opportunity to input the
information of vote counting with data about each candidate, each divisional commission, etc. The second one, for users,
displaying the counting process in the diagrams, tables, and had a built-in forum where voters were able to discuss the results.
Keywords: election software, HTML, Perl, MySQL, inventory, Flash, ActionScript, FrontPage, Access.
References available upon request
Education & Certificates
2003
1998-2002
1996-1998
Master of Science in Applied Mathematics (with honors), University of Chernivtsi, Ukraine
Bachelor of Science in Applied Mathematics, University of Chernivtsi, Ukraine
Mathematical Lyceum of Chernivtsi, Ukraine
With all excellent marks (grade of A ) except two good marks (grade of B)
Certificates:
...
Personal
 Technologies and tools can be learned relatively quickly, but the programmer's way of thinking and the general approaches - is
something more important, resulting from many years of practical experience in designing, implementing, and deploying
software.
 Programs design and development encourage me. This is what helps me self-actualize. I greatly appreciate the well designed,
flexible, and stable code that works for a long time and is beneficial to a large number of clients. I’m fascinated by mediumand long-term tasks, giving tangible benefits and having the potential to develop into new tasks and projects. I will be happy to
learn and share my experiences and make a beautiful, well-designed code.
 I keep my base of knowledge, experience and tips, a list of solutions to common programming problems and situations and
optimization. This makes my professional experience easy and quickly accessible.
 Program code should be well commented and standardized, especially if it is large. This will facilitate its further support and
development. Name of the methods and parameters should be self-describing. If you are unable to accommodate short title to
essence of the method, then most likely method should be divided into several simpler (single responsibility principle).
 Acceptance of the fact that time is non-regenerative resource has taught me to follow the concept of time management to
increase workflow efficiency and increase my efficiency. The basic principles that I use: the rule of “20/80”; two criteria of
priorities - the urgency and importance; planning, further assessment of my capabilities from the results and re-planning;
splitting tasks into subtasks, and splitting the plan into the steps, at the same time not forgetting the long-term objectives; the
power of motivating; the ability to say “no” to unnecessary; the ability to relax; irritants exception and organization of relevant
work conditions.
Download