<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Java - Inero Software - Software Consulting</title>
	<atom:link href="https://inero-software.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://inero-software.com/tag/java/</link>
	<description>We unleash innovations using cutting-edge technologies, modern design and AI</description>
	<lastBuildDate>Mon, 06 Mar 2023 08:02:43 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://inero-software.com/wp-content/uploads/2018/11/inero-logo-favicon.png</url>
	<title>Java - Inero Software - Software Consulting</title>
	<link>https://inero-software.com/tag/java/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Spring Boot 3.0 migration overview</title>
		<link>https://inero-software.com/spring-boot-3-0-migration-overview/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Mon, 06 Mar 2023 08:01:19 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Jakarta]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=5008</guid>

					<description><![CDATA[<p>SPRING 3.0 MIGRATION OVERVIEW Spring Boot 3.0 has just been released, packed with exciting new features such as advanced observability, better support for native compilation with Graal, and the ability to utilize the latest Java language features. However, for many individuals, upgrading to this latest version may appear overwhelming. The&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/spring-boot-3-0-migration-overview/">Spring Boot 3.0 migration overview</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<h2><img decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="90" height="90" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 90px) 100vw, 90px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">SPRING 3.0 MIGRATION OVERVIEW</span></h3>
<p><img decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="Paragrapgh icon" width="81" height="81" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 81px) 100vw, 81px" />Spring Boot 3.0 has just been released, packed with exciting new features such as advanced observability, better support for native compilation with Graal, and the ability to utilize the latest Java language features. However, for many individuals, upgrading to this latest version may appear overwhelming. The reason being, it requires the updating of many other aspects, such as the Java versions and a transition to Jakarta EE 9. Additionally, given the probability of your organization running several different dependency versions, the migration process can become even more complicated.</p>
<p>It is common to adopt an approach that revolves around the ideology of &#8220;if it&#8217;s not broken, why fix it?&#8221; However, it is important to note that the support for Spring Boot 2.x is scheduled to end by the end of 2023. Additionally, upgrading to the latest version of Spring Boot will provide you with access to a range of new features available across different tools. For instance, upgrading to Java 17, a prerequisite for Spring Boot 3.0, will not only grant you access to a variety of new Java language features (such as pattern matching, records, switch expressions, etc.), but it will also improve the performance of the virtual machine and garbage collector.</p>
<h2><img decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="62" height="62" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 62px) 100vw, 62px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">MAIN STEPS</span></h3>
<p>Migrating to Spring Boot 3.0 necessitates a series of associated migrations and dependency updates that must be carried out before upgrading to this latest version of Spring Boot. These include:<br />
• Updating your organization&#8217;s applications, infrastructure, and CI/CD pipeline to use Java 17. The upside to this step is that it can be done before updating any of your Spring Boot applications.<br />
• Any pre-existing Spring applications that utilize Java EE will require an update to Jakarta EE 9. While this may seem like a simple task of moving all imports from the javax namespace to the jakarta namespace, it also requires the migration of any third-party libraries to versions that are compatible with Jakarta EE 9.</p>
<pre>import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
-&gt;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;</pre>
<p>There are instances when we may not need to refactor package names when upgrading our software, as some dependencies such as <code>javax.sql.DataSource</code> already belong to JDK 17, not Jakarta EE. In these cases, it is not necessary to make any changes to the package name, as it is already consistent with the latest version of our app. It is important to note, however, that it is essential to thoroughly review and test all dependencies to ensure that they are compatible with the new version of the code.</p>
<p>• Lastly, depending on which version of Spring Boot your applications are being migrated from, there may be a need to make several required changes to both the application&#8217;s code and configuration when moving to Spring Boot 3.0.<br />
It is crucial to take note of these steps, as they are all essential requirements that must be fulfilled before upgrading. Sometimes we need to just upgrade dependency version, sometimes we have to migrate to a new package. For example:</p>
<pre>&lt;dependency&gt;
&lt;groupId&gt;org.springdoc&lt;/groupId&gt;
&lt;artifactId&gt;springdoc-openapi-ui&lt;/artifactId&gt;
&lt;version&gt;1.6.11&lt;/version&gt;
&lt;/dependency&gt;
-&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springdoc&lt;/groupId&gt;
&lt;artifactId&gt;springdoc-openapi-starter-webmvc-ui&lt;/artifactId&gt;
&lt;version&gt;2.0.0&lt;/version&gt;
&lt;/dependency&gt;</pre>
<h2><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="65" height="65" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 65px) 100vw, 65px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">POST MIGRATION ISSUES &#8211; COMMON EXAMPLES</span></h3>
<h4 style="text-align: center;">#1</h4>
<p>Now let&#8217;s look at a situation where we want to update a library used by other applications as a Maven dependency.</p>
<pre>Parameter 0 of constructor in com.some.package.a.Class required a bean of type 'com.some.package.b.SomeExternalClass' that could not be found.</pre>
<p>There is a good chance that exporting configuration files is the cause. Before 3.0, Spring Boot checked for the presence of a <code>META-INF/spring.factories</code> file within your published jar. The file should list your configuration classes under the <code>EnableAutoConfiguration</code> key. Now, instead of providing configuration in META-INF/spring.factories, you would do so in <code>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code>.</p>
<pre>org.springframework.boot.autoconfigure.EnableAutoConfiguration=pl.inero.commons.email.EmailServiceConfiguration
-&gt;
pl.inero.commons.email.EmailServiceConfiguration</pre>
<p>We&#8217;llonfiguration properties for Redis have moved from spring.redis. to spring.data.redis. as redis auto-configuration requires Spring Data to be present on the classpath. Also configuration Properties for Cassandra have moved from spring.data.cassandra. to spring.cassandra..</p>
<p>Now let&#8217;s take some Spring Security related issue.</p>
<h4 style="text-align: center;">#2</h4>
<pre>Invalid CSRF token found for http://localhost:8080/api/test
Responding with 403 status code</pre>
<p>When using Spring Security, it&#8217;s important to be aware of changes between different versions of the framework. For example, in Spring Security version 5, the CsrfToken is loaded by default on each request, which means that even unnecessary requests must have the HttpSession read in a typical setup. However, the default behavior of Spring Security 6 is to postpone the lookup of the CsrfToken until it is actually required.</p>
<p>In our particular application, the CsrfToken is required for every request, so we need to make sure that we specifically opt into the 5.8 defaults to ensure that the CsrfToken is loaded on every request, as it was in version 5. This is a necessary step to ensure that our application runs as intended and that we do not encounter any issues related to the CsrfToken during runtime.</p>
<pre>@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
/ ... /
.csrf(csrf -&gt; csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
/ ... /
}
-&gt;
@Bean
DefaultSecurityFilterChain springSecurity(HttpSecurity http) throws Exception {
CsrfTokenRequestAttributeHandler requestHandler = new CsrfTokenRequestAttributeHandler();
requestHandler.setCsrfRequestAttributeName(null);
return http
/ ... /
.csrf((csrf) -&gt; csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.csrfTokenRequestHandler(requestHandler)
/ ... /
}</pre>
<h4 style="text-align: center;">#3</h4>
<pre>Cannot resolve method 'antMatchers()' (...)</pre>
<p>Methods like antMatchers() (as well as mvcMathcers() and regexMatchers()) have been deprecated and removed with Spring Security 6.0 (have a look at this link if you wonder why: <a href="https://github.com/spring-projects/spring-framework/issues/28552">Deprecate trailing slash match</a>). Overloaded method requestMatchers() was provided as a uniform mean for securing requests. It facilitates all the functionality of the configuration methods that have been removed from the API.</p>
<p>Also, method authorizeRequests() has been deprecated and shouldn&#8217;t be used anymore. A recommended replacement &#8211; authorizeHttpRequests() (you can find more information regarding these changes <a href="https://stackoverflow.com/questions/28907030/spring-security-authorize-request-for-certain-url-http-method-using-httpsecu/74633151#74633151">here</a>). Here we have sample code and how it could have been changed:</p>
<pre>http.requestMatcher(new NegatedRequestMatcher(new AntPathRequestMatcher(API_KEY_URI_MATCHER)))
.httpBasic().and()
.authorizeRequests()
.antMatchers("/ping").permitAll()
.anyRequest().authenticated();

-&gt;

http.securityMatcher(new NegatedRequestMatcher(new AntPathRequestMatcher(API_KEY_URI_MATCHER)))
.httpBasic().and()
.authorizeHttpRequests()
.requestMatchers("/ping").permitAll()
.anyRequest().authenticated();</pre>
<p>&nbsp;</p>
<h2><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="68" height="68" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 68px) 100vw, 68px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">ON CONFIGURATION PROPERTIES</span></h3>
<p>When upgrading to Spring Boot 3.0, it is essential to update the configuration properties in the <code>application.properties</code> or <code>application.yml</code> files to account for any changes or removals of properties. Spring Boot provides a convenient tool called <code>spring-boot-properties-migrator</code> to help with this migration. By adding this module as a dependency to our project, it will migrate the properties temporarily at runtime and analyze the application&#8217;s environment to print diagnostics at startup.</p>
<p>To add the <code>spring-boot-properties-migrator</code> module to our project, we need to add the following dependency to the <code>pom.xml</code> file.</p>
<pre>&lt;dependency&gt;
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-properties-migrator&lt;/artifactId&gt;
&lt;version&gt;3.0.0&lt;/version&gt;
&lt;scope&gt;runtime&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<p>This will ensure that our properties are migrated correctly and that we can benefit from any diagnostics provided by the module during startup.</p>
<p>As always, more tips on migration can be found in the Spring documentation. <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide">Check it out now</a>.</p>
<p>In <a href="http://inero-software.com">Inero Software</a> we build digital products for <a href="https://inero-software.com/services/">digital logistics of tomorrow.</a> We connect active aproach to analysis of business needs and combine with cutting edge technologies and<a href="https://inero-software.com/machine-learning-professionals/"> AI/ML</a>. In the <a href="https://inero-software.com/category/blog/company">blog post section</a> you will find other articles about IT systems and more!</p>
<p>Artykuł <a href="https://inero-software.com/spring-boot-3-0-migration-overview/">Spring Boot 3.0 migration overview</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5008</post-id>	</item>
		<item>
		<title>Java: Scheduling the execution of background tasks using Spring</title>
		<link>https://inero-software.com/java-scheduling-the-execution-of-background-tasks-using-spring/</link>
		
		<dc:creator><![CDATA[Adrian Chojnacki]]></dc:creator>
		<pubDate>Wed, 04 Nov 2020 08:47:18 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Quartz]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=3123</guid>

					<description><![CDATA[<p>Artykuł <a href="https://inero-software.com/java-scheduling-the-execution-of-background-tasks-using-spring/">Java: Scheduling the execution of background tasks using Spring</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<div class="row"><div class="col-sm-4"></div><div class="col-sm-8">
<h3><span style="color: #800080;"><strong>Planning tasks in Java</strong></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /><a href="https://inero-software.com/angular-how-to-manage-back-end-long-running-asynchronous-tasks/">In the last post by my teammate we presented how to manage back-end long-running asynchronous tasks from the client side.</a> This approach is used especially in handling the appropriate flow of processes and the timely implementation of specific IT system services that require significant amount of computations. From the backend implementation perspective, one of the libraries that enable task scheduling and easy integration with Java Spring applications is Quartz. In the following sections of the article, the general problem of running background tasks and a use case presenting an example solution will be described.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><strong>Description of the problem</strong></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />In some cases, the specification of an IT system requires long-running tasks to be performed in background. Compared to synchronous jobs where we wait for output, background jobs allow us to move on to the next job before our primary task is finished. This can be achieved by executing independent tasks in separate threads, which inform the main thread of the application when particular background job is completed. In this case, one thread can be a code block or a method that is a separate unit of work.</p>
<p>The advantages of asynchronous job scheduling tasks include:</p>
<ul>
<li>application performance,</li>
<li>responsiveness and scalability,</li>
<li>the ability to update the progress or parameters of the task,</li>
<li>productive planning of service delivery,</li>
<li>the ability to perform the following tasks without freezing the application state.</li>
</ul>
<p>However, when running background, it is important to remember to skillfully choose between asynchronous and synchronous programming. If You are dealing with simple, short-lived calculations, it is not a good idea to use background tasks. For instance, too many asynchronous calls between main thread and background can make your code less readable, may cause slow application performance or even lead to thread lock and interrupt application lifecycle.</p>
<p>Check out how we deal with such problems in our team.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><strong>Use case, solution</strong></span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />In this post, as an example of using asynchronous programming, we will use a big data download service. Let us assume that a potential user of our website would like to transfer a certain number of files using logic provided by our backend application. As it is presented in the diagram below, the user interface allows to execute task that starts to transfer the file via request made to application server. Since we expect that this task will be a long running one, our goal is to schedule this job to be performed in background thread. Let&#8217;s have a look at details:</p>
<p>&nbsp;</p>
<h3><span style="color: #800080;"><strong><img loading="lazy" decoding="async" data-attachment-id="3139" data-permalink="https://inero-software.com/java-scheduling-the-execution-of-background-tasks-using-spring/tasks/" data-orig-file="https://inero-software.com/wp-content/uploads/2020/10/tasks.png" data-orig-size="1294,370" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="tasks" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2020/10/tasks-300x86.png" data-large-file="https://inero-software.com/wp-content/uploads/2020/10/tasks-1030x295.png" tabindex="0" role="button" class="aligncenter wp-image-3139 size-full" src="https://inero-software.com/wp-content/uploads/2020/10/tasks.png" alt="A drawing about how the interface works" width="1294" height="370" srcset="https://inero-software.com/wp-content/uploads/2020/10/tasks.png 1294w, https://inero-software.com/wp-content/uploads/2020/10/tasks-300x86.png 300w, https://inero-software.com/wp-content/uploads/2020/10/tasks-768x220.png 768w, https://inero-software.com/wp-content/uploads/2020/10/tasks-1030x295.png 1030w, https://inero-software.com/wp-content/uploads/2020/10/tasks-1049x300.png 1049w" sizes="(max-width: 1294px) 100vw, 1294px" /></strong></span></h3>
<p>In applications based on <a href="https://spring.io/">Spring</a>, the aforementioned Quartz library is the perfect choice. It allows you to schedule tasks depending on our needs.</p>
<p>Let&#8217;s make the following assumptions:</p>
<ul>
<li>the user can order to download several files at a time,</li>
<li>in this case, the tasks will be performed sequentially,</li>
<li>the user can  (interrupt) tasks,</li>
<li>user is provided with information about tasks, such as <em>id</em> or user data, in the database.</li>
</ul>
<p>Note that with the use of Quartz, you can execute threads simultaneously, but for the purpose of this post will used the task queue. The key interfaces used in this API are <em>Scheduler</em>, <em>Job, JobDetail, JobDataMap, Trigger</em>.</p>
<p>Initially, you need to create a <em>Scheduler</em> instance as the main interaction component. This can be done by injection into a class or by using the lines of code below.</p>
<pre>SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();</pre>
<p>The next step is to define an example class, in this case <em>FileDownloadJob</em>, extended by the <em>QuartzJobBean</em> class, which implements the <em>Job</em> interface. The main method <em>executeInternal()</em>,  will be called by one of the <em>Scheduler</em> threads after the <em>Trigger</em> is fired. Inside it, the target action of a given task should be performed.</p>
<pre>public class FileDownloadJob extends QuartzJobBean {

   @Override
   protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionExceptions{
       // target code of performed operations
   }
}
</pre>
<p>The job scheduling process consists of assigning a unique key &#8220;<em>JobKey&#8221;</em>, preparing a <em>JobDataMap</em> and building a<em> JobDetail</em> instance. Assuming the &#8220;<em>task&#8221;</em> object is one of the records in the task database repository, the operations in question can be performed with the following lines of code.</p>
<pre>JobKey jobKey = JobKey.jobKey((task.getId());
</pre>
<pre>JobDataMap jobData = new JobDataMap();
jobData.putAll(new HashMap&lt;&gt;() {{
 	  put("email", user.getEmail());
  	  put("name", user.getName());
          put("progress", task.getProgress());
}});
</pre>
<pre>JobDetail jobDetail = newJob().ofType(FileDownloadJob.class)
       				.withIdentity(jobKey)
      				.setJobData(jobData)
      				.build();
</pre>
<p>If we have all the details, we can fire the trigger and plan our task.</p>
<pre>Trigger trigger = newTrigger()
       .startNow()
       .build();

scheduler.scheduleJob(jobDetail, trigger);
</pre>
<p>Returning to the assumptions of the solution, consider the possibility of deleting tasks. In the Quartz library it is possible to additionally implement the <em>InterruptableJob</em> interface in our job class.</p>
<pre>public class FileDownloadJob extends QuartzJobBean implements InterruptableJob</pre>
<p>It implements the <em>interrupt()</em> method where we can stop the job.</p>
<pre>@Override
public void interrupt() {
   _interrupted = true;
}
</pre>
<p>Assuming that the operations performed inside the job are carried out in a loop, we can check the given <em>_interrupted</em> field, and for example if it is equal to <em>True</em>, terminate the job.</p>
<pre>if (_interrupted) {
   break;
}
</pre>
<p>Of course, this is just an example of a job interruption. It is fully dependent on the operations performed within the method of execution. From the <em>Scheduler</em> side, the method shown below allows us to call the <em>interrupt()</em> method inside our <em>FileDownloadJob</em> class.</p>
<pre>scheduler.interrupt(jobKey);
</pre>
<p>Another functionality is the sequential execution of tasks. This can be implemented in various ways, such as <em>JobListener</em> or smart use of <em>JobDataMap</em>. In our use case, we choose the second option, due to the possibility of further expansion, i.e. updating progress, stopping and resuming tasks.<br />
Let&#8217;s add another field in our map and fill it with the <em>id</em> of the next job, assuming that all information about the tasks is stored in the database.</p>
<pre>jobDataMap.put("nextJob", nextTask.getId());
</pre>
<p>Thanks to this, when we finish the operation of the first job, we can check if there is a unique key in the &#8220;<em>nextJob&#8221;</em> field of <em>JobDataMap</em>. If so, we move on to the next task. If we would like to add the functionality of changing the order of task execution, we could define another &#8220;<em>previousTask&#8221;</em> field storing the <em>id</em> of the previous task. Based on this, we could define appropriate methods to modify the queue position. In addition, in our map we can store the previously mentioned information about the current data download process and update it via REST endpoints in the client interface.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h3><span style="color: #800080;"><strong>Java Scheduling &#8211; Summary</strong></span></h3>
<p>Asynchronous programming is an essential element in delivering some IT system services. However, it should be remembered that the use of background tasks should be carefully selected for the problem in order to avoid unnecessary conflicts or system overload. If you are using Java, the Quartz library is a good choice that allows you to easily integrate the planning process with our application. Try this!</p>
<p></p></div><div class="col-sm-4"></div></div>
<h3></h3>
<p>Artykuł <a href="https://inero-software.com/java-scheduling-the-execution-of-background-tasks-using-spring/">Java: Scheduling the execution of background tasks using Spring</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3123</post-id>	</item>
		<item>
		<title>10 Things You Should Know when Working with Remote Dev Teams</title>
		<link>https://inero-software.com/top-10-important-things-you-should-know-when-working-with-remote-dev-teams/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Fri, 21 Dec 2018 16:05:35 +0000</pubDate>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[dev teams]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[hiring dev teams]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[remote]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software vendor]]></category>
		<guid isPermaLink="false">https://sandbox-www.devel.inero.com.pl/?p=792</guid>

					<description><![CDATA[<p>Hiring remote dev teams and using their expertise is a very common practice in many industrial areas including IT, fintech, insurance, logistics and others. Remote dev teams can provide valuable expertise and know-how for significant contribution to overall quality of a new concept and products invented elsewhere, maintaining fair prices&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/top-10-important-things-you-should-know-when-working-with-remote-dev-teams/">10 Things You Should Know when Working with Remote Dev Teams</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="color: #511b73;">Hiring remote dev teams and using their expertise is a very common practice in many industrial areas including IT, fintech, insurance, logistics and others. Remote dev teams can provide valuable expertise and know-how for significant contribution to overall quality of a new concept and products invented elsewhere, maintaining fair prices of business development at the same time.</span></p>
<p><span style="color: #511b73;">Below you may find 10 tips on how to find a good remote development team that matches your expectations, is able to easy go from vision to technical requirements, and finally develop a software product that reflects your concept and business needs.</span></p>
<h2 style="text-align: center;"><span style="color: #511b73;">1. Search for the right team</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">At the beginning, you have to choose wisely the right software dev company that can develop the product based on your concept. There are many ways and things you can do to verify if the company you find is appropriate for your needs. You can define the number of criteria and prepare questions that can help you to distinguish between teams which are potentially good for you and those which are not. Many basic checkings that are always carried out when this issue appears include:</span></p>
<ul>
<li><span style="color: #511b73;">portfolio of the company</span></li>
<li><span style="color: #511b73;">opinions about the company from Google, <a href="https://clutch.co/">Clutch</a> etc.</span></li>
<li><span style="color: #511b73;">does the profile and field of expertise of software company matches the vision of your product</span></li>
<li><span style="color: #511b73;">technology stack etc.</span></li>
<li><span style="color: #511b73;">experience in developing similar solutions</span></li>
<li><span style="color: #511b73;">expert knowledge</span></li>
<li><span style="color: #511b73;">pricing</span></li>
<li><span style="color: #511b73;">dev team availability</span></li>
<li><span style="color: #511b73;">language &amp; communication level</span></li>
<li><span style="color: #511b73;">QA (quality assurance) policy</span></li>
<li><span style="color: #511b73;">etc&#8230;</span></li>
</ul>
<p><span style="color: #511b73;">However, the most important thing that is often not taken under consideration is the <strong>good understanding of your business model.</strong> Before you start the cooperation, you have to make sure that the partner you want to make business with, <strong>understands your idea and analyzes your feedback</strong>. Check if the team is involved in requirements analysis and is actively searching for solutions on how to make your product better. If the dev team asks difficult questions and addresses issues that you were not aware of before the conversation, this is the good sign that it may be a valuable partner for your future cooperation. Good dev team should also share knowledge and expertise with you as a potential future partner. It should provide you with tips on how to talk with other entities and which issues should be raised in your case.</span></p>
<h2 style="text-align: center;"><span style="color: #511b73;">2. Contact</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Don&#8217;t hesitate to get in touch with the people from SH. Here we are people too, we really want to discuss about your vision, and really want to bring it to business reality. <strong>Remember, that software companies will not charge you for initial requirements analysis or just human-2-human conversation about your idea</strong>. Actually, it may be very important if IT experts can verify your idea from technical point of view for free! You can get technical feedback and improve the concept using the expert knowledge.</span></p>
<h2 style="text-align: center;"><span style="color: #511b73;">3. You don&#8217;t need to be technical expert (but you must be a visioner)</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Many potential clients hesitate to make the first contact with SH representatives, wondering if they have enough knowledge and experience to describe what they do or want to do, or how their vision may be translated into a set of technical requirements<strong>. Remember that you don&#8217;t need to know in detail the engineering jargon or know the technical names of solutions </strong>that you wish to be applied in your vision of the product you want to build. It <strong>is up to project manager or SH team to ask you the right questions and make sure that both sides of the conversation understand each other</strong>. Good project manager will try to get as many as possible answers to questions concerning your vision because he wants to truly understand your concept and transfer it to technical language.</span></p>
<p>&nbsp;</p>
<blockquote><p><span style="color: #511b73;">Many potential clients hesitate to make the first contact with SH representatives, wondering if they have enough knowledge and experience to describe what they do or want to do, or how their vision may be translated into a set of technical requirements<strong>. Remember that you don&#8217;t need to know in detail the engineering jargon or know the technical names of solutions </strong>that you wish to be applied in your vision of the product you want to build. It <strong>is up to project manager or SH team to ask you the right questions and make sure that both sides of the conversation understand each other</strong>. Good project manager will try to get as many as possible answers to questions concerning your vision because he wants to truly understand your concept and transfer it to technical language.</span></p></blockquote>
<p>&nbsp;</p>
<h2 style="text-align: center;"><span style="color: #511b73;">4. Use issue trackers and communications tools</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Software development is a process that relies not only on engineering work but also on clear and efficient communication between project participants. If you assume to cooperate with your software vendor for longer period of time it is worth to consider using more convenient and matched communication tools than e-mail, Skype or phone calls. Each SH usually defines their own set of communication tools starting form e-mail and Skype, but as your project becomes more involving and complex it is worth to switch into issue tracking tools that allow you to provide feedback to your dev team members more efficiently. These are slack communicators or issue trackers like JIRA or GitLab.</span></p>
<p>&nbsp;</p>
<blockquote><p><span style="color: #511b73;">Remember that you should not be charged for using communication tools, but you should expect that your project runs smoother and the work is more effective.</span></p></blockquote>
<p>&nbsp;</p>
<h2 style="text-align: center;"><span style="color: #511b73;">5. So&#8230;, how much will it cost?</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Software development, especially when developing innovative products is a complicated process. It often consists of visions, conversations, mind storms, tests, setting up different variants and from time to time unmatched ideas. Once you choose your SH to develop your product, the negotiations about the costs will start. Charges for software development are individual for every company but what you need to know is that generally there are two models of how your financial cooperation may look like, these bare:</span></p>
<ul>
<li><span style="color: #511b73;"><strong>Fixed price (FP)</strong> model is when before you start your cooperation with vendor you determine the total sum of the contract and the schedule of the work needed for your product development.</span></li>
<li><span style="color: #511b73;"><strong>Men &amp; Material (M&amp;M)</strong> which is much more flexible model when both sides of cooperation agree to fixed charge for one working hour of software development. For each period (1 week &#8211; 1 month) you should receive the report from your software vendor that contains the detailed cost calculation on working hours your dev team has spent on developing your product. Usually, invoicing is performed in month periods. That allows you to routinely track the costs of your project and keep your financing predictable.</span></li>
</ul>
<p><span style="color: #511b73;">Many clients and investors choose FP over MM because they want to estimate the exact budget of the project before the project kick-off. From obvious reasons that is very reasonable approach, especially when you want to know the maximum cost of your project and to make sure that you don&#8217;t exceed the financial limits .However, remember that it has significant drawbacks. Firstly, when you look at this from SH point of view, you need to know that when the fixed price model is used, your software vendor ensures that dev works will not exceed internal costs of the project. In this way, SH shifts the risk of unpredicted costs and additional work to your budget at the very beginning of your cooperation. Secondly, once the fixed price budget is settled, additional changes to your concept need to be discussed every time they appear, including financial revision of the budget. That usually slows down the whole process and can lead to timeline violation.</span></p>
<p><span style="color: #511b73;">Fixed price are often more expensive for the client as SH need to set up additional unpredictable cost margin that client is being charged for. M&amp;M model is much more flexible &#8211; all project participants  may continuously observe the costs and match the predicted amount of future work to fit the budget.</span></p>
<p>&nbsp;</p>
<blockquote><p><span style="color: #511b73;">Consider what type of financial cooperation is suitable for you. You can also propose a hybrid model and divide all your work to stages (milestones). First milestone(s) of the project can be realized according to Fixed Price model. Once you get to know your team better and your cooperation runs smoother, you may turn into MM which is much more flexible and efficient in longer period.</span></p></blockquote>
<p>&nbsp;</p>
<h2 style="text-align: center;"><span style="color: #511b73;">6. Listen to suggestions, let the dev team to decide</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Once you have established the schedule and budget of your project, be prepared for improvements and options that your dev team may propose. During the project development the new ideas come along and the obstacles arise on both sides of the partnership. This may lead to some changes in prior arrangements.  If you have trust in expertise of your team, try to be flexible in this area. Carefully analyze all suggestions and provide detail feedback on your decision.</span></p>
<p><span style="color: #511b73;">Remember that good understanding between partners during development process is crucial for overall success!</span></p>
<h2 style="text-align: center;"><span style="color: #511b73;">7.  Routinely monitor the improvement and provide a feedback</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">This is very important part of the development process. In most of the cases today, your software vendor will work on your product using the agile methodology. This is not a place to discuss how the agile methodology works, but the most important thing is that you should be provided with the first version of the software product in 1-4 week period from the beginning of your cooperation. Next, the revised versions of the software product should be provided every 1-2 weeks<strong>. Your job is to verify if the product matches your vision and arrangements.</strong> Every time provide the feedback to your dev team and precisely tell which things are going in good directions and which need to be corrected. Remember that the precise feedback significantly improves the performance of your cooperation, reduces the costs and helps to maintain the schedule of the project.</span></p>
<h2 style="text-align: center;"><span style="color: #511b73;">8. Your success is the dev team&#8217;s success</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Each stage plays a vital part in building a high-functioning team. Dev team you choose should be motivated to achieve the success of the project because once you succeed it is also a proof that your dev team achieves their goals and provides high quality services. Don&#8217;t hesitate to communicate with the team and give information precising which parts of the project are satisfying and which need to be improved. Remember, the dev team also wants you to succeed and achieve the specified business goals.</span></p>
<h2 style="text-align: center;"><span style="color: #511b73;">9. Clean and reusable code</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Ok, here is a little more technical thing you should consider, preferably at the very beginning of the cooperation. Know that you don&#8217;t have to tie to your vendor during the whole product lifetime, although in many cases this is the best option. It is worth to assume that many things happen in life that can unexpectedly disrupt your cooperation with your dev team. The company may got bankrupt, You may have cash flow problem, the change of the business model may prevent your further cooperation &#8211; these things just simply sometimes happen. In order not to waste the investment you have already made to your product development, it is very, very, very important for you to make sure that all the work you paid for remains at your hands. Make sure you get access to so called <strong>source codes repository</strong>, so in case of any catastrophe, other vendors may look back to your project and work on it further.</span></p>
<p>&nbsp;</p>
<blockquote><p><span style="color: #511b73;">Ensure yourself an access to GIT repository of your product. After a few weeks/months of cooperation, hire an external expert that can analyze the code of your product and give his feedback to your vendor. This will allow you to maintain an external control over the quality of your product. You may repeat this procedure every a few weeks. Also, make sure that your vendor follows the suggestions of your expert.</span></p></blockquote>
<p>&nbsp;</p>
<h2 style="text-align: center;"><span style="color: #511b73;">10. Forgive minor faults -&gt; require feedback -&gt; give up cooperation</span></h2>
<p><span style="color: #511b73;"><img loading="lazy" decoding="async" data-attachment-id="2338" data-permalink="https://inero-software.com/document-data-processing-using-gpt-model/inero-glify-11-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" data-orig-size="417,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="" data-image-description="&lt;p&gt;Inero Software&lt;/p&gt;
" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png" tabindex="0" role="button" class="wp-image-2338 aligncenter" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png" alt="Separating icon" width="144" height="72" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1-300x150.png 300w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-11-1.png 417w" sizes="(max-width: 144px) 100vw, 144px" /></span></p>
<p><span style="color: #511b73;">Many business experts say that kicking off the project is the easiest part in developing new products. Once your budget is accepted, business concept is ready, you start to search for software vendor, when you find it, make the agreement, and kick off. However, closing projects and admitting to defeat is that what is most difficult. Every dev team, even the most experienced and motivated ones, make mistakes from time to time. Experienced dev teams have internal processes of software quality assurance (QA) that consist of internal requirements analysis, feedback analysis procedures, built-in software testing procedures and so on. However, problems and delays sometimes appear &#8211; that is the nature of the software development. Once it happens, it is important for you to inform your software vendor about this situation. What is more important is to know how your dev team reacts to your suggestions. Will it introduce the improvements, repair the software errors in assumed time schedule? – this is what is the most important in this case. If such a situation repeats, despite your best will, sometimes the best thing you can do is to finish cooperation and find a new software vendor.</span></p>
<p>&nbsp;</p>
<blockquote><p><span style="color: #511b73;">Verify if your dev team analyzes your feedback. You may check it in the beginning of the cooperation, no necessarily when significant problems appear. You may introduce some small changes in prior arrangements, make minor shift in technical concepts &#8211; see if your suggestions are implemented during your cooperation.</span></p></blockquote>
<p>&nbsp;</p>
<h2><span style="color: #511b73;">Summary</span></h2>
<p><span style="color: #511b73;">Hiring remote teams of developers allows to reduce the cost of software development maintaining the schedule and the reasonable project costs at the same time. In Central Europe, number of software companies provide efficient, scalable and high-quality software services in reasonable prices. Using remote software development services can significantly reduce the costs of development of innovative concepts. Following the tips above will not make your concept 100% successful but certainly can help you to start a good and fruitful cooperation.</span></p>
<p><span style="color: #000000;"><a style="color: #000000;" href="https://inero-software.com/contact-us/"><strong>Inero Software</strong></a> provides knowledge and expertise on how to successfully use cutting edge technologies and data to shape corporate digital products of the future.</span></p>
<p><span style="color: #000000;" data-contrast="auto">In the <a style="color: #000000;" href="https://inero-software.com/category/blog/company/"><strong>blog post</strong></a> section you will find other articles about IT systems and more!</span></p>
<p>Artykuł <a href="https://inero-software.com/top-10-important-things-you-should-know-when-working-with-remote-dev-teams/">10 Things You Should Know when Working with Remote Dev Teams</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">792</post-id>	</item>
	</channel>
</rss>
