Jan Ploski – Services – Software development

Software development means to me the creation and optimization of software systems based on engineering principles, according to functional, quality and economic requirements of my clients, and under consideration of pre-existing technical and business constraints.

My services cover all phases of the software development process (requirements analysis, design and implementation, testing, deployment and maintenance), with a particular emphasis on the following activities:

Reverse engineering

Reverse engineering is the analysis of existing (often scarcely documented) software systems to reconstruct an original design and as a precondition for well-founded decisions about the further development or redesign measures. Experience shows that many developers tend to perceive unfamiliar, externally produced software as "bad" and reject it outright, even when no objective points of criticism can be brought up. This is because reverse engineering is a psychologically taxing activity. However, a redesign from scratch without a comprehensive analysis and understanding of existing software is certainly a risky proposition for the system's stakeholders. In such case, the business logic embedded in the legacy software has to be elicited from other sources - and this is a difficult and error-prone process compared to systematically undertaken reverse engineering.

Troubleshooting and debugging

Debugging can be described as the causal explanation and removal of software defects. Although general debugging procedures are nowadays well-researched and widely understood, in practice effective debugging still requires highly trained thinking, use of specialized tools, and deep knowledge of (system) software in order to formulate adequate fault hypotheses. These requirements normally exceed those of high-level application development, and they contribute significantly to the efficiency differences observable between individual software developers.

Performance assessment

Run-time performance is a critical aspect, which is often insufficiently taken care of during software specification and in the following implementation. A traditional rule of thumb recommends to analyse performance bottlenecks (perform profiling) late during development in order to avoid trade-offs in other software quality attributes due to premature optimization. However, the most difficult performance problems are seldom found in a single software module and easy to locate in half-automated manner. Rather, they can be emergent system-scope problems whose correction may require a careful data analysis and architectural changes.


Refactoring is a quality assurance activity embedded in a software development process. It aims at preparing the software for future modifications by adjusting its internal structure without modifying functionality. Through refactoring known hazards from events such as the increase of user numbers, including new developers in the project can be addressed early, and chances offered by technological advances can be taken advantage of fully.

In day-to-day work, I mostly use the programming languages Perl, PHP (Drupal), and Java, so I am currently most familiar with the idioms, libraries and frameworks of these languages.

That said, in my past development projects I used many different programming languages according to the client's requirements and project circumstances: C++, x86 Assembler, PL/SQL, Visual Basic, Python, PHP, JavaScript, Lisp, Prolog, NCL, Bourne Shell... Accordingly, introducing myself to a new programming language or development environment does not pose a challenge. I am firmly convinced that the underlying principles of good software engineering are language-independent, much like the principles of scientific reasoning are independent from a particular natural language. Of course, it does not follow that the individual programming languages are equally suited for all applications.