News Contents

Toplam 8 İlan Bulundu

Understanding the meaning of persistence is important for evaluating different data store systems. Given the importance of the data store in most modern applications, making a poorly informed choice could mean substantial downtime or loss of data. In this post, we‘ll discuss persistence and data store design approaches and provide some background on these in the context of Cassandra.

Persistence is "the continuance of an effect after its cause is removed". In the context of storing data in a computer system, this means that the data survives after the process with which it was created has ended. In other words, for a data store to be considered persistent, it must write to non-volatile storage.

If you need persistence in your data store, then you need to also understand the four main design approaches that a data store can take and how (or if) these designs provide persistence:

  • Pure in-memory, no persistence at all, such as memcached or Scalaris
  • In-memory with periodic snapshots, such as Oracle Coherence or Redis
  • Disk-based with update-in-place writes, such as MySQL ISAM or MongoDB
  • Commitlog-based, such as all traditional OLTP databases (Oracle,
    SQL Server, etc.)

In-memory approaches can achieve blazing speed, but at the cost of being limited to a relatively small data set. Most workloads have relatively small "hot" (active) subset of their total data; systems that require the whole dataset to fit in memory rather than just the active part are fine for caches but a bad fit for most other applications. Because the data is in memory only, it will not survive process termination. Therefore these types of data stores are not considered persistent.

The easiest way to add persistence to an in-memory system is with periodic snapshots to disk at a configurable interval. Thus, you can lose up to that interval‘s worth of updates.

Update-in-place and commitlog-based systems store to non-volatile memory immediately, but only commitlog-based persistence provides Durability -- the D in ACID -- with every write persisted before success is returned to the client.

Cassandra implements a commit-log based persistence design, but at the same time provides for tunable levels of durability. This allows you do decide what the right trade off is between safety and performance. You can choose, for each write operation, to wait for that update to be buffered to memory, written to disk on a single machine, written to disk on multiple machines, or even written to disk on multiple machines in different data centers. Or, you can choose to accept writes a quickly as possible, acknowledging their receipt immediately before they have even been fully deserialized from the network.

At the end of the day, you‘re the only one who knows what the right performance/durability trade off is for your data. Making an informed decision on data store technologies is critical to addressing this tradeoff on your terms. Because Cassandra provides such tuneability, it is a logical choice for systems with a need for a durable, performant data store.

Show More Devamı
Tüm Yorumlar - All Comments


Black-Box Testi:
Sadece fonksiyonellik ve ihtiyaçlara yönelik test çeşididir.  Black-box  testleri,   Closed Box,    Fonksiyonellik  testi,veya   Opaque  olarak da adlandırılır.  Black-Box  testleri, yapılacak işlemin fonksiyonelliğine uygun girdi(veri) seçimini ve bu girdinin yapılacak olan işlemin beklenen ya da beklenmeyen çıktı vermesini dikkate alır.

Black-Box  testleri 2 başlık altında incelenebilir.

Kullanıcının Var Olmadığı Testler:

  • Araştırma Testi : Test edilecek olan işlem ya da uygulamanın test öncesinde öğrenilmesi, hakkında fikir edinilmesini amaçlar.
  • Ad-Hoc Testi :  Genellikle yapılacak bütün testlerin sürelerinin belirlenmesini amaçlar.
  • Yenilenme Testi :Uygulamanın herhangi bir hataya karşı ne kadar sürede eski haline geleceğini test eder.Sistem gereksinimlerine göre,tip ve yenileme hızı belirlenir.
  • Seviye Testi : İşlemlerin yapılacağı sistemin uç noktasına kadar zorlanması ve bu uç noktanın belirlenmesi amaçlanır. Seviye Testi : İşlemlerin yapılacağı sistemin uç noktasına kadar zorlanması ve bu uç noktanın belirlenmesi amaçlanır.
  • Fonksiyonellik Testi(FunctionalTesting):  Adından da anlaşılacağı gibi uygulamaya ait fonksiyonların test edilmesidir. Beklenen çıktı alındığı sürece, test devam eder.
  • Kullanılabilirlik Testi(Usability Testing):  Özellikle arayüzünü bir çok kullanıcının kullanacağı ve arayüzün önemli olduğu uygulamalar için yapılması gereken bir test çeşididir.
  • Stres Testi(Stress Testing) : Aynı işlemin(Örn: Üye girişi) aynı anda yüksek adetlerde yapılması ve sonuçlarının izlenmesi olarak tanımlanabilir . Bu testte, yapılan işlemler karşısında sistemin verdiği tepki ve sistemin dayanıklılığı gözlenir.
  • Yükleme Testi(Load Testing):  Sistem performanslarını ölçmek amacı ile yapılır. Burada amaç, kullanılan sistemin nerede ve hangi koşullarda çökeceğini belirlemektir. 
  • Duman Testi(SmokeTesting) :  Genel olarak mantık testi olarak bilinir. Duman testinden geçmiş bir uygulama, daha büyük testler için hazırdır. Yani küçük testler sorunsuz yapılmıştır.

Kullanıcının Gerekli Olduğu Testler:
  • Kabul Testi(Acceptance Testing):  Kullanıcıların sistemin beklentileri karşılayıp karşılamadığına yönelik yaptığı testlerdir.
  • Alfa Testi(Alpha Testing):  Kullanıcıların uygulama geliştirme merkezine çağrıldığı ve kullanıcının burada yapacağı işlemlere göre geliştiricilerin düzeltilmesi/değiştirilmesi gereken kısımları not aldığı testlerdir. 
  • Beta Testi(Beta Testing):  Uygulamanın kullanıcılar tarafından test edildiği bir test çeşididir. Kullanıcılar için beta versiyonu yayınlanır. Ardından kullanıcılardan gelecek geri dönüşler doğrultusunda düzeltmeler yapılır.

Show More Devamı
Tüm Yorumlar - All Comments
Yusuf 15-06-2019 20:31
Yararlı bilgiler teşekkürler


Remember

  1. Multiprogramming – A computer running more than one program at a time (like running Excel and Firefox simultaneously).
  2. Multiprocessing – A computer using more than one CPU at a time.
  3. Multitasking – Tasks sharing a common resource (like 1 CPU).
  4. Multithreading is an extension of multitasking.


async: Do this by yourself somewhere else and notify me when you complete(callback). By the time i can continue to do my thing.

enter image description here

parallel: Hire as many guys(threads) as you wish and split the job to them to complete quicker and let me know(callback) when you complete. By the time i might continue to do my other stuff.

enter image description here

the main difference is parallelism mostly depends on hardware.

Show More Devamı
Tüm Yorumlar - All Comments

Backend-For-Frontend using GraphQL under Microservices

Microservices are an architectural style, in which the analysis and modeling of specific business areas, complex applications are decomposed into a group of services that are small and specific, have a low degree of coupling. Each microservice is a small, independent and deployable application.

This concept of microservice architecture is similar to the concept of separating the frontend and backend. The frontend application controls all of its own UI-level logic, while the business logic is accomplished through API calls to the relevant microservice. After the continuous growth of frontend single page application frameworks, and the spread of mobile apps, whether it is a Mobile Native development or a Hybrid application development, so frontend and backend separation has made Web and Mobile applications become clients. The client only needs to query and modify the resources through the API.

The following figures shows the main difference between the absence of BFF and the addition of BFF on the front and back ends.

1. Traditional frontend and backend separation application

 

In the traditional frontend and backend design, usually the Mobile App or Website directly accesses the backend service, the backend microservices call each other, and then return the final result to the frontend client. For clients (especially mobile), too many HTTP requests are expensive. Therefore, in order to minimize the number of requests, the frontend generally tends to obtain associated data through a single API. It means that sometimes the backend will do some UI-related logic processing to meet the needs of the client .

2. BFF’s frontend and backend architecture

 

The biggest difference in BFF’s frontend and backend architectures is that the frontend (Mobile, Web) no longer directly accesses the backend microservices, but rather accesses it through the BFF layer. And each client will have a BFF service. With BFF, there are fewer mutual calls between microservices. This is because some UI logic is processed at the BFF level.

BFF and API Gateway

From the above understanding of BFF, since BFF is a middle-tier service accessed by frontend and backend, what is the difference between BFF and API Gateway? Let’s first look at the common implementation of API Gateway. (The API Gateway may be designed in many ways. Here are just three examples.)

1. API Gateway provides the same API for all clients

For example: /api/accounts. In this case, API Gateway does not distinguish between client types, as shown below:

 

2. API Gateway provides separate APIs for each client

For example: /services/mobile/api/accounts and /services/web/api/accounts. The API Gateway determines which client it comes from, based on different APIs, and then processes them separately to return the resources required by different clients.

 

3. Multiple API Gateways provide separate APIs for each client

BFF is actually considered like this implementation mode of API Gateway.

 

GraphQL and REST

GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.

What are the similarities and differences between GraphQL and REST? We can understand it by the following example:

REST can be accessed through the following way:

Request:

GET http://127.0.0.1/api/accounts

Response:

[
{
"id": 88,
"name": "Mena Meseha",
"photo": "
http://bucket.s3.amazonaws.com/photo.jpg"
},
...
]

For the same request if accessed with GraphQL, the process is as follows:

Request:

POST http://127.0.0.1/graphql

Body:

query {accounts { id, name, photo } }

Response:

{
"data": {
"accounts": [
{
"id": 88,
"name": "Mena Meseha",
"photo": "
http://bucket.s3.amazonaws.com/photo.jpg"
},
...
]
}
}

Compared to the REST style, GraphQL has the following features:

1. On demand data model definition

For example, for the above /accounts access, if the client is only interested in account.id and account.name. So client only need to pass account {id
name}
to query. The model is defined in the background. The client only needs to obtain the data it cares about.

2. Get many resources in a single request

For example, you may need to obtain account.friends and account.friends.address, In fact, this query need to get the data from 3 different resources which are accountfriends and address. In REST mode, the account data may needs to be sent again to another API to get the friends and address info. GraphQL can query for nested levels of data so it greatly reduces the number of client requests and allows the client to obtain all the required data through a single API as the following query:

{
account(id:88) { // 1st Level
name,
friends { // 2nd Level
name,
address { // 3rd Level
country,
city
}
}
}
}

GraphQL vs REST

For the comparison between GraphQL and REST, there are mainly the following differences:

1. Data Acquisition: REST lacks scalability and GraphQL can be accessed on demand. The payload can be extended when the GraphQL API is called.

2. API calls: REST’s operation for each resource is an endpoint, and GraphQL only needs a single endpoint, but the post body is not the same.

3. Complex data requests: REST requires multiple calls for nested complex data, GraphQL calls once, reducing network overhead.

4. Error code processing: REST can accurately return HTTP error code, GraphQL returns 200 uniformly, and wraps error information.

5. Version number: REST is implemented via v1/v2, and GraphQL is implemented through the Schema extension.

Microservices + GraphQL + BFF Practice

I recommend to use express-graphql to build the BFF side of the project and then deploy it through Docker, and between the BFF and the microservices backend, there is service registration and discovery are performed through Consul.

 
Sample Technical Architecture for Microservices + GraphQL + BFF
 
BFF Technology Stack

Authentication and Authorization

Authentication and authorization are other issue that need to be considered when using GraphQL. Do we process them before or after the GraphQL parsing process?

To answer this question, you can think of GraphQL as a DSL (Domain Specific Language) on top of your own backend data acquisition logic. We just need to think of it as an intermediate layer that can be placed between the client and our actual data service (or multiple services).

Then consider authentication and authorization as another layer. GraphQL is not useful in the actual implementation of authentication or authorization logic because it does not mean it. However, if we want to place these layers behind GraphQL, we can use GraphQL to pass the access token between the client and Auth API. This is very similar to the way we authenticate and authorize via the RESTful API.

3. GraphQL + BFF Practices

Through the following aspects, you can think about some of the better qualities of GraphQL-based BFF:

GraphQL and BFF’s focus on business points

 

From a business point of view, the property manager (PM App) is concerned with property, because the property manager manages a group of houses, so it is necessary to know all the house profiles, and for each house need to know whether there is a corresponding maintenance application. Therefore, PM App BFF data structure is defined, maintemamceRequests is property sub-attribute.

With similar data, the house maintenance supplier (Supplier App) is concerned with maintenance request (maintenance work order), so in the data obtained by the Supplier App, our main body is maintenanceRequest.

So because there are different usage scenarios, different clients have different concerns for the same data. From this perspective, the data structure defined in the BFF is what the client really cares about. BFF is born for the client and is part of the client. It should be noted that the "business focus" does not mean that the BFF will handle all the business logic. The business logic should still be taken care of by the micro service. The BFF is concerned with what the client needs.

GraphQL support for versioning

 
Figure (1) -> Figure (2) -> Figure (3)

Assume BFF end has been released into the production environment. Now we need to change the structure of Figure (1) to the structure of Figure (2), but in order not to affect the API access of the old users, our BFF API must be compatible at this time. If REST, we may update the API version. But in BFF, we can use the structure of Figure (3) for forward compatibility. At this time, the old APP uses the data structure of the yellow area, while the new APP uses the structure defined by the blue area.

Conclusion

Building a BFF based on GraphQL under microservices is not a silver bullet. It is not necessarily suitable for all projects. For example, after you use GraphQL, you may have to face multiple query performance issues, but this does not prevent it from becoming a good attempt. You do see that Facebook has already used GraphQL, and that Github has also opened GraphQL’s API. This article only serves as an introduction to the idea. I hope that there will be more sharing about the use of BFF in the community.

Show More Devamı
Tüm Yorumlar - All Comments

In web development, such terms as ””web app””, ””front-end architecture””, ””Web 2.0””, and ””HTML5 apps”” are often used in a misleading context which doesn”t consider the full specifics of implementation and usage of web architectures. Today we”ll find out more about the web application architecture types in the light of the latest web trends and key issues that matter to software product owners.

 

We can outline 3 main web application architecture types and discuss their advantages and drawbacks. We can evaluate them according to three points of view: software owner, software developer (member of the dedicated team allocated to the project) and end user. Other possible examples basically come down to these three as subtypes.

 

First let”s define a web application: it”s a client-server application, where there”s a browser (the client) and a web server. The logic of a web application is distributed among the server and the client, there”s a channel for information exchange, and the data is stored mainly on the server. Further details depend on the architecture: different ones place and distribute the logic in different ways.

 

It”s hard to compare completely different architectures impartially. But we”ll try to, using several evaluation criteria.

 

User”s criteria

 


Responsiveness/Usability
Updates of data on pages, switching between pages (response time). Such qualities of user interface as richness and intuitivity.

Linkability
Ability to save bookmarks and links to various sections of the website.

Offline work
Well, this one speaks for itself.

 

Developer”s criteria

 

Speed of development
Introduction of new features, refactoring, parallelization of the software development process.

Performance
Maximum speed of response from the server with minimum consumption of computation power.

Scalability
Ability to increase computation power or disc space under increases in amounts of information and/or number of users. If an allocated scalable system is used, one must provide data consistency, availability and partition tolerance (CAP theorem). It”s also worth noting that the case, when the number of features/screens of the client app is increased at the software owner”s request, depends on the framework and implementation rather than the type of web application architecture.

Testability
Possibility and ease of automated unit testing.

 

Software product owner”s criteria

 

Functional extendability
New functionality within minimal time and budget.

SEO
Users must be able to find the application through any search engine.

Support
Besides software development proper, there are additional expenses: hardware, network infrastructure, maintenance.

Security
The software owner must be sure that both business data and information about users are kept secure. As the main security criterion we”ll consider the possibility of changes in functionality of app behavior on the client side, and all associated risks. Standard dangers are the same for the compared architectures. We do not consider security on the server-client channel, because all these architectures are equally exposed to break-ins. This channel can be the same.

Conversion: website – mobile or desktop application
Conversion into a mobile or desktop application with minimal additional costs. 

 

Some of these criteria might seem inaccurate, but the purpose of the article is not to show what”s good and what”s bad. It”s more of a detailed review that shows the possible options.

 

Let”s outline three main web-based application types according to the roles performed by the server and the client browser.

 

 

Type 1: server-side HTML web application

 

web app

 

The most widespread web application architecture. The server generates HTML content and sends it to the client as a full-fledged HTML-page. Sometimes this architecture is called ””Web 1.0””, since it was the first to appear and currently dominates the sphere of web development.

 

  • Responsiveness/Usability: 1/5. The least optimal value among these architecture examples. A huge amount of data is transferred between the server and the client. The user has to wait until the whole page reloads, responding to trivial actions, for example, when only a part of the page needs to be reloaded. UI templates on the client depend directly on the frameworks applied on the server. Due to the limitations of mobile internet and huge amounts of transferred data, this architecture is hardly applicable in the mobile segment. There are no means of sending instant data updates or changes in real time. If we consider the possibility of real-time updates via generation of ready chunks of content on the server side and updates of the client (through AJAX, WebSockets), plus design with partial changes within a page, we”ll go beyond this architecture.

 
  • Linkability: 5/5. The highest of the three, since it”s the easiest implementable. It”s due to the fact that by default one URL receives particular HTML-content on the server.

 
  • SEO: 5/5. Rather easily implemented, similarly to the previous criterion. The content is known beforehand.

 
  • Speed of development: 5/5. This is the oldest architecture in web development, so it”s possible to choose any server language and framework for particular needs.

 
  • Scalability: 4/5. If we take a look at the generation of HTML, under the increasing load comes the moment when load balance will be needed. There”s a much more complicated situation with scaling databases, but this task is the same for these three examples of software architecture.

 
  • Performance: 3/5. Tightly bound to responsiveness and scalability. Performance is relatively low because a big amount of data must be transferred, containing HTML, design, and business data. Therefore it”s necessary to generate data for the whole page (not only for the changed business data), and all the accompanying information (such as design).

 
  • Testability: 4/5. The good thing is that there”s no need for special tools, which support JavaScript interpretation, to test the front-end, and the content is static.

 
  • Security: 4/5. The application behavior logic is on the server side. However, data are transferred overtly, so a protected channel may be needed (which is basically a story of any architecture that concerns the server). All the security functionality is on the server side.

 
  • Conversion: website – mobile or desktop application: 0/5. In most cases it”s simply impossible. Rarely there”s an exception (more of exotics): for example, if the server is realized upon node.js, and there are no large databases; or if one utilizes third-party web services for data acquisition (however, it”s a more sophisticated variant of architecture). Thus one can wrap the application in node-webkit or analogous means.

 
  • Offline work: 2/5. Implemented with a manifest on the server, which is entered to HTML5 specifications. If the browser supports such a specification, all pages of the application will be cached: in case the connection is off, the user will see a cached page.

 

 

Type 2: JS generation widgets (AJAX)

 

web application

 

This is an evolved architecture of the first type. The difference is that the page, which is displayed in the browser, consists of widgets (functionally independent units). Data is uploaded to these widgets through AJAX query from the server: either as a full-fledged chunk of HTML, or as JSON, and transforms (through JavaScript templating/binding) into the content of the page. The option of uploading chunks of HTML excludes the necessity of using JavaScript-MV* frameworks on the client side; in this case something simpler can be used (for example, jQuery). By lowering interactivity we boost the development speed and make functionality cheaper and more reliable.

 

The foremost advantage is that updates from the server arrive only for the part of the page requested by the client. It”s also good that widgets are separated functionally. A particular widget is in charge of a part of the page; partial changes will not affect the whole page.

 

  • Responsiveness/Usability: 3/5. The volume of transferred data for a part of a page is smaller than for the whole page, that”s why responsiveness is higher. But since a page is a set of widgets, the applicable UI templates in a web application are limited by the chosen UI framework. Cold start (the first full loading) of such a page will take a little longer. The content, which is fully generated and cached on the server, can be instantly displayed on the client; here time is spent on getting the data for the widget and, as a rule, on templating. At the first visit the website will not be that quick to load, but further it will be much more pleasant in use, if compared to sites based on the architecture of the first type. Also it”s worth to mention the possibility of implementation of ””partial”” loading (like it”s done on yahoo.com).

 
  • Linkability: 2/5. Here special tools and mechanisms are needed. As a rule, Hash-Bang mechanism is applied.

 
  • SEO: 2/5. There are special mechanisms for these tasks. For example, for promotion of websites based on this architecture it”s possible to predefine the list of promoted pages and make static URLs for them, without parameters and modifiers.

 
  • Speed of development: 3/5. One needs to know the server-side technologies in web development, and use JavaScript frameworks on the client side. It”s also required to implement web services on the server side.

 
  • Performance: 4/5. The time and resources spent on generation of HTML content are relatively minor if compared to the time spent by the app on retrieving data from the databases, and on their processing before templating. Use of the extended type of this architecture (when data are transferred as JSON) lowers the traffic between the client and the server, but adds an abstraction level to the application: retrieval from database -> data processing, serialization in JSON -> API: JSON -> parsing of JSON -> binding of data object on the client to HTML.

 
  • Scalability: 4/5. Same as for the first type of architecture.

 
  • Testability: 1/5. It”s required to test the server side, the client code, and the web service which returns the data to update widgets.

 
  • Security: 4/5. Part of the logic is shifted to the client JavaScript which can be modified by an intruder.

 
  • Conversion: website – mobile or desktop application: 0/5. Same as for the first type of architecture.

 
  • Offline work: 1/5. The manifest mechanism works in this case, but there”s a problem with updating or caching the data displayed on the widget. This functionality has to be implemented additionally: in the manifest one can indicate only names of the files that will be cached from the server. Correlation between the widget template file, cached in the manifest, and the page behavior logic requires extra effort.

 

 

Type 3: service-oriented single-page web apps (Web 2.0, HTML5 apps)

 

web application

 

The term ””Web 2.0”” isn”t quite correct here. One of peculiarities of Web 2.0 is the principle of involving users into filling and repeated adjustments of content. Basically the term ””Web 2.0”” means projects and services which are actively developed and improved by users themselves: blogs, wikis, social networks. This means Web 2.0 isn”t bound to one technology or a set of technologies.

 

Let”s figure out the essence of this architecture. An HTML-page is downloaded from the server. This page is a container for JavaScript code, which addresses a particular web service and retrieves business data only. The data is used by JavaScript application, which generates the HTML content of the page. This architecture is a self-sufficient and rather complex JavaScript application, where part of the functionality is shifted to the client side. To compare, the architecture of the second type cannot show a high number of interrelated and structured functions.

 

In modern web development, fully offline JavaScript apps are rare (with a few exceptions, e.g. rad-js.com). This approach allows an easily made reverse conversion: publish an existing application on the web.

 

  • Responsiveness/Usability: 5/5. The volume of data transferred for updates, is minimal. That”s why responsiveness is at the highest level. UI is generated via JavaScript, it”s possible to implement any necessary variants. There is an issue with multithreading in JavaScript: in this particular case processing of big volumes of business data should be shifted to the web service.

 
  • Linkability: 1/5. One will need special tools and mechanisms, as well as frameworks which can use, for example, Hash-Bang mechanism.

 
  • SEO: 1/5. The hardest one to promote. If the entire app is promoted directly, there”s no problem: it”s possible to promote the application container. If it”s needed for a part of the application, a special mechanism will be needed for that purpose. Each more or less big search engine offers its own methods of standartization for this process.

 
  • Speed of development: 2/5. It”s required to develop a web service and apply more specialized JavaScript frameworks which build the app architecture. Since the architecture is relatively new, there aren”t many specialists who are able to create a high-quality site/system based on this approach. There aren”t many time-tested tools, frameworks and approaches.

 
  • Performance: 5/5. This criterion is the least influenced on by the server side. The server only has to give the JavaScript application to the browser. On the client side, performance and browser type are of the biggest importance.

 
  • Scalability: 5/5. The web logic is on the client side. There is no content generation on the server. When there”s an increase in the number of users, it”s required to scale only the web services that give the business data.

 
  • Testability: 3/5. It”s required to test web services and the client JavaScript code.

 
  • Security: 0/5. The logic is shifted to the client JavaScript, which can be relatively easily modified by an intruder. For protected systems it”s required to develop a preventive architecture, which considers the peculiarities of open-source applications.

 
  • Conversion: website – mobile or desktop application: 5/5. A website becomes an application with the help of PhoneGap or a similar platform.

 
  • Offline work: 5/5. This architecture is a full-fledged application; it”s possible to save separate data, as well as parts of the application using any storage (for example, local storage). One more advantage is the possibility to switch data storage and management to the offline mode. To compare, the two aforementioned architectures are only partially functional in the offline mode. Here the missing data can be replaced with mocks, it”s possible to show alert windows or use data from the local storage, while synchronization may be left for later.

 

Thus we can see that there”s no perfect architecture. The optimal choice depends on tasks and priorities. If any criterion wasn”t mentioned here, it doesn”t mean it was ignored. It”s just the fact that for each particular software project every criterion has different importance. For every real software development project one of these examples may be defining. It”s also possible to optimize the architecture of the app or implement a hybrid architecture which will meet the specific business requirements.

Show More Devamı
Tüm Yorumlar - All Comments