Archive for the ‘Outsourcing’ Category

How to Introduce Architecture and its Changes

The specifics of describing architecture and its changes is in the fact that as opposed to a program code it has no evident representation, except for those cases when it is clearly documented. However, even in this case it is hard to guarantee the correspondence of documented architecture to the factual high-level logical structure which in reality exists in the system.

Structural models can become means of describing architecture and its changes. There are currently a large number of notations and tools supporting structural modeling of software. The possibility of the automatic extraction of models from a code guarantees their precision and allows for their timely updating. This possibility becomes crucial for choosing the necessary tools as the compliance of the model with the factual structure of the existing code in the process of modeling the architecture and its changes happens to be exceptionally important for securing a precise and manageable process.

For the further study of program systems architecture we will use a notation of structural modeling accepted in KLOCwork Architect tool which allows for the automatic extraction of models from a program code and their editing. Here is a brief review of the notation:

Program system models utilized by KLOCwork Architect are somewhat similar to Entity-Relation models. They belong to a class of container models. The model’s basic elements are as follows:

Architecture Block.KLOCwork Architect model consists of so called architecture blocks. Architecture blocks introduce into models structural elements of a program system irrespective of the level of abstraction in which the modeling takes place. Architecture blocks have at least two major attributes, such as name and type. Names of architecture blocks are predetermined by the names of those structural elements of the system which they introduce into models. Types of architecture blocks substantially depend on the level of abstraction where modeling takes place, and a concrete task within which the research of the architecture is carried out. For example, to model systems built within any component technologies “components” will be the type of architecture blocks used. For modeling systems of building software the chiefly used types will be “folders” and “files”.

Relation. In the model KLOCwork Architect relation means a one-way relation between a pair of architecture blocks. Just like architecture blocks, relations can be of various types. The following types of relations can be used as an example:

Instancing: A instances B (block A is a function, block B is a class).

Access to data: A reads data from B (block A is a function, block B is a class or a class attribute).

Between any pair of blocks there can be a random number of differently directed relations. Their types can also be differentiated at the same time.

Architecture Refactoring

architecture_toolsRefactoring is one of the most successful approaches to changing existing software. It is the approach based on systematic transformations of the initial code. Refactoring is the change in the internal structure of software aimed at facilitating the understanding of how it works and simplifying the modification without tackling the observed behavior. It is commonly understood that during a software development process the system design is created first and only then is its code is written. In the course of time the code is modified and the system wholeness, i.e. the correspondence of its structure to the initial design slowly gets worse. The further development of the system gradually shifts from a directed, guided activity to hacking. Refactoring appears to be quite the opposite practice. With its help any chaotic and misguided project can be transformed into a well-designed code. Each step of the process is quite simple. For example, one of the steps involves transferring the field or method from one class into another, class separation, etc. However, the total effect of such minor and seemingly insignificant changes proves to be cumulative and can radically change a project for better. The process of refactoring is a direct opposite to a gradual system code degradation.

For documenting and cataloguing refactoring methods, one uses semiformal notation in which every method is described by means of a so-called pattern. Any pattern describes and names typical tasks which constantly appear in the process of work, and also the principle of their solution. As a result, such solutions can be used over and over again. Patterns name, demarcate and identify key aspects of a general solution structure. Patterns also form the dictionary of solutions to a certain problem area and allow two specialists in that field to name typical solutions and understand each other without explaining the core of solutions.

The refactoring of an object-oriented code has proved to be an efficient means of solving tasks of program evolution and support. However, presently there are practically no studies dealing with refactoring at a higher level of abstraction – the level of software architecture. Correspondingly, the transfer of this methodology to a higher level of abstraction is interesting.

Changing Software Architecture and Refactoring

skypeRecently a tendency has arisen towards lifecycle growth of successful program projects. As a result, the volume of the ancestral code supported by the community of developers also grows. This fact helps explain the exceptional importance of tasks related to facilitating the development of the existing program code. At the same time, these tasks receive little attention from the scientific community and tool developers. As a result, contemporary methodologies overestimate the significance of the initial stage of a program system’s life cycle and practically neglect its further evolution. Therefore, there is currently an apparent lack of methodologies and efficient tools for supporting work with a corresponding code.

The situation changes when the question of how transformations can be used systemically as a centrally organizing principle in the process of the development and support of the existing software arises. However, the majority of researchers study transformations at a very narrow angle: as transformations at the level of the initial code, refactoring. Meanwhile, there are practically no studies dealing with transformations at a higher level of abstraction, i.e. at the level of software architecture. At the same time, many scenarios of the support and development of the existing code presuppose a change in the architecture of the existing system. Therefore, the development of the methodology and supporting tools aimed at the organization of a foreseeable and manageable process of changing software architecture is very interesting.

See Softage case study on phone number recognizer refactoring here: Phone Number Recognizer refactoring

Differences between Architecture and Classical Refactoring

code refactoringWhen refactoring methodology is transferred to the architecture layer, there are a number of specific features which determine the change of method characteristics:

Objects. While making a transition from classic to architecture refactoring, the objects on which the operations are performed also undergo certain changes. In classic refactoring, such elements as class and class instance are among the entities to be worked on. Architecture refactoring is applied for systems and components. Different types of connections which emerge between objects are also distinguished in various refactoring types.

Scope of changes. Classic refactoring is applied exceptionally in lesser scale. Usually, the consequences of the application of a separate classic refactoring pattern are limited to several files. Architecture refactoring patters are applied to architecture components. As these patterns are projected backwards from the structural model level to a program code, the changes may cover a significantly greater size of the existing code. 

Description of changes. Methods of classic refactoring can be illustrated with static models of language and code fragments. It is more convenient to use specialized structural models and tools which support reverse engineering for the description of architecture refactoring.

Testing. Transformations are considered correct if they don’t cause the change in the general “behavior” of a program system. The availability of a sufficient number of unit tests allows for the verification of the correctness of transformation. This makes unit testing one of the key aspects of classic refactoring. Architecture refactoring is also faced with the task of automated verification of the correctness of transformations. Unit tests allow the developer to be assured the changes are correct even when architecture refactoring is applied. At the same time, it is presently unclear how effectively unit testing works with architecture refactoring methods. In fact, this is determined by the difference in the scope of changes at classic and architecture refactoring.

Next-Generation Approach to the J2EE Mobile Application Container

j2ee mobile softwareJ2EE in its current state needs custom coding to support mobile applications development. A large number of challenges involved in mobile application development can be resolved, provided the developer is equipped with the right set of resources at the J2EE infrastructure level, and the need to write the custom code and patches is eliminated. It is possible to significantly extend J2EE technology with the following services to simplify and enhance mobile application development:

  • Transformation Engine: A scalable engine that applies attributes and features of devices such as device profiles. This transformation engine may have an XML or DOM interface and must also allow for overriding the look and feel.
  • Device Profiling and Personalization Manager: A device profile and personalization manager which models devices with the application of a set of attributes (e.g. screen size, memory, keyboard layout, display capabilities) and the capability to provide applications and content.
  • Memory and Cashing Manager: A stable memory and cashing manager to make an optimal separation and cache the content based on mobile device profiles with links to the server-side cached content.
  • Session Manager: A session manager meeting the needs of mobile devices and accommodating multi-modal sessions, and handling the intermittent connectivity of wireless networks.
  • J2EE Standardization: Support for existing J2EE standards and development methodologies.
  • Data Access Manager: A data access manager leveraging the existing J2EE data access methodologies and integrating to existing Java middle-tier tightly at the API-level.
  • Message and Notification Manager: A message and notification server which simplifies synchronous and asynchronous notification generation, transmission, reception, and administration.

The construction of a container to provide components for satisfying all of these requirements in an integrated fashion is significantly valuable. If such services/components were available separately, there would still be a significant amount of coding needed to integrate these APIs in a servlet and use them in standard development methodologies. For instance, the servlet developer still has to retrieve the device profile and personalization object, storing them in the session, calling the transformation engine, passing the session information, and then calling the cache manger, creating the appropriate links, and storing this additional content in the session as well.

A container which could manage these services and offer support for standard J2EE development methodologies, if provided, can surely manage the real power of these services. For example, such a container could allow for the development of “actions” or content in the form of Java (DOM) or XML. The session information would be managed and readily available in any action residing in the container. The developer would simply create an action in JSP or Java and need not manage the calling of the services as the profile object and device personalization objects would be instance variables in the container. The mobile action container can also pool objects and may distribute and manage the service across different JVMs or even across different servers. Each server would provide a specific service.

The application would be made future-proof with the help of such a container which would provide clear separation between the application and server code. This container may be realized within the servlet or EJB containers, or be worked out as a new J2EE container.

New Model for Corporate Applications

Flexible components form basis for the J2EE applied model. This simplifies the development of powerful applications. It allows utilization of all the advantages of Java technology in all J2EE applications, namely scalability, transferability and easy programming.

j2ee enterprise software
BluePrints Design Guidelines from Sun Microsystems for the J2EE platform describe the application model and uses. The J2EE model was developed on the basis of the Java 2 Platform, Enterprise Edition, and simplifies the principles of the development of scalable and widely accessible Internet and Intranet applications.

Here we ask: what functions are missing from Java 2 Platform, Enterprise Edition? The solution of various complex tasks to be performed by corporate applications, namely the management of business operations, life cycle, the merging of resources are all already embedded in the platform and are performed automatically for all supported constituents. So what should be the primary emphasis for developers in terms of solving tasks related to new functions? Most likely business logic and user interface.

There is yet another advantage of J2EE which is in the fact that the application model includes levels of functional possibilities in certain types of constituents. Business logic is included in Enterprise Java Beans (EJB) constituents. The interaction with a client can be realized by means of ordinary HL webpages, by means of webpages using applets based on Java technologies, Java Servlets API or JavaServer Pages technologies, or by means of autonomous Java applications. The components interact openly, using various standards, like HL, XML, HTTP, SSL, RMI, etc.

The possibility of a multiple use of J2EE constituents offers enterprise software developers and IT organizations a compatible choice. J2EE will allow them to collect applications from the combination of standard, widely accessible constituents and of their own customized constituents. It is assumed that a number of standardized functional capabilities of J2EE will be able to carry out a wide range of tasks, from the development of generally business applied constituents to the solution of problems for vertical markets.

This means that an e-commerce website can be designed with the application of a combination of ready-made EJB constituents for the (organization of work of a consumer basket); modified EJB constituents for the creation of specialized services for a client and completely new levels with the JavaServer Pages application technology which will make the website unique.

This approach to creating a website means that less time will be required for its development, and better quality of performance, maintainability, and transferability within the limits of a wide range of platforms will be achieved. Among the major advantages of such an approach are improved performance by the programmer, computer resource utilization strategy  and a substantially increased ROI from technology.

Moving East for Outsourcing

investmentIn times when companies have to rely heavily on offshore outsourcing, many Eastern European corporations are now moving out of the shadows to become new offshore destinations. A number of factors have added to the ever-growing popularity of the region as an outsourcing hub, namely a highly skilled workforce and the high levels unemployment in Eastern Europe, as well as the ability to rapidly construct office premises. The success of Eastern Europe as an outsourcing destination has also been contributed to by the crisis in the Western labor market and a lack of qualified IT personnel.

Although countries such as India and China are still on the charts as popular outsourcing spots, emerging markets like the Czech Republic are already gaining a foothold in offshore outsourcing and promise to become more popular in the near future despite the current small number of offshore projects in these countries. Russia, Belarus, Ukraine, Poland and the Baltic states are among other attractive offshore work centres. Some other issues like a high labor turnover and the fact that India, for instance, has always played a role of an “executer” rather than a “thinker” have also made for changing trends in favour of outsourcing in Eastern Europe.

Driven by the need to improve its economic situation, Eastern Europe is hungry for skilled IT projects that demand a professional approach and expertise. Making use of their highly qualified personnel and fast developing local resources, Eastern European companies are ready to offer their clients the most innovative and sophisticated services.

According to Gartner analyses, in the next several years, companies will have to make a tremendous effort in order to stay afloat in harsh competitive conditions, which call for a thorough mastery and ability to implement the most state-of-the art, innovative technologies. Given such circumstances, and combined with the region’s advanced technological capital and potential, Eastern Europe is likely to be in greater and greater demand, even eclipsing the likes of India and China in terms of outsourcing.