Moving from one technology stack to another can be a daunting task, especially when the new stack is vastly different from what you are used to. In my case, I had to make the switch from C#, .Net Core, jQuery, Windows, Azure, Azure DevOps to Java, SpringBoot, Linux, Openshift, Jenkins, and Bitbucket becuase of a job change, prior job was from a Travel Industry so I have to move as it was impacted by COVID. I was so used to C#, .Net Core, Windows, Azure, Azure DevOps and anything around it since I am using mostly technologies from Microsoft for more than 20 years and it is evident on this blog, now that I moved industries and job the inevitable happened I have to change technologies. Luckily my current boss have faith in me that what ever I learned from the other side would help improve things on this new side I am aligning to.
This is no small feat, and there are bound to be struggles along the way. In this blog post, we’ll take a look at the pros and cons of this move and the steepness of the learning curve. As someone who went through this move last year, I will share my experiences as well.
Pros and Cons
Before diving into the specifics of each technology, let’s take a moment to look at the overall pros and cons of this move. The biggest advantage of moving to Java, SpringBoot, Linux, Openshift, Jenkins, and Bitbucket is that they are all open-source technologies. This means that they are free to use and that there is a vast community of developers who contribute to their development. This also means that there are many resources available online, including documentation, tutorials, and forums.
Another advantage of this move is that the technologies are highly scalable and can be used for a variety of applications. For example, SpringBoot is a popular framework for developing microservices, while Openshift is a container orchestration platform that can be used to manage large-scale deployments.
However, there are also some challenges that come with this move. One of the biggest challenges is the steep learning curve. As you move from C# to Java, you will need to learn a new programming language, which can take some time. Additionally, you will need to become familiar with new frameworks, tools, and platforms, which can be overwhelming at first.
The move to Linux can also be challenging if you are not familiar with the operating system. Linux is a powerful and flexible operating system, but it requires some effort to learn how to use it effectively.
Finally, there is the issue of compatibility. If your team was previously working with Microsoft technologies, there may be some compatibility issues when switching to open-source technologies. For example, you may need to find alternatives to Microsoft Office or other proprietary software that you were previously using.
The learning curve when moving to Java, SpringBoot, Linux, Openshift, Jenkins, and Bitbucket is steep, but it is not insurmountable. With some effort and dedication, you can become proficient in these technologies relatively quickly.
Move from C# to Java
As I mentioned earlier, the first step is to learn the Java programming language. If you are already familiar with C#, this should not be too difficult, as the two languages have many similarities. However, there are also some key differences that you will need to become familiar with which I listed down below
C# and Java are two popular programming languages used to develop a wide range of applications. Although they share many similarities, there are also some significant differences between the two. In this article, we will explore some of the most significant differences between C# and Java.
- Platform Dependence
One of the biggest differences between C# and Java is that C# is a language developed by Microsoft, and is primarily used on Windows platforms. Java, on the other hand, was developed by Sun Microsystems and can be used on multiple platforms, including Windows, Linux, and macOS.
- Syntax and Structure
While C# and Java are similar in many ways, their syntax and structure have some notable differences. C# uses a curly bracket syntax, similar to C and C++, while Java uses curly brackets and semicolons. Additionally, Java requires more explicit declarations of variables and methods, while C# provides more automatic type inference.
- Garbage Collection
Both C# and Java are garbage-collected languages, meaning that they automatically manage memory allocation and deallocation. However, the way that they handle garbage collection is different. Java uses a garbage collector that runs periodically, while C# allows for more control over when and how often garbage collection occurs.
- Platform-Specific Features
As a Microsoft language, C# has access to some platform-specific features that are not available in Java. For example, C# provides a set of libraries for developing Windows-based applications, while Java has its own set of libraries for cross-platform development.
- Libraries and Frameworks
Both C# and Java have a wide variety of libraries and frameworks available, but they are not always interchangeable. For example, C# has the .NET framework, which includes a wide range of libraries for developing desktop and web applications, while Java has the Spring framework, which is widely used for building web applications.
In terms of performance, C# and Java are generally comparable, but there are some differences. C# code can be compiled to native code, which can provide a performance advantage in some cases. On the other hand, Java uses a virtual machine, which can provide better performance in some situations.
- Integration with Other Technologies
Both C# and Java can be integrated with a wide variety of other technologies, but they have different strengths. C# has strong integration with Microsoft technologies, such as Azure and Visual Studio, while Java has strong integration with open-source technologies, such as Linux, Apache, and MySQL.
Move from .NET Core to Spring Framework
Once you have a solid understanding of Java, you can move on to learning the Spring framework. Spring is a powerful framework for building Java applications, and it is widely used in the industry. You will need to become familiar with its various modules which I will be pointing out next.
.NET Core and Spring Framework are two popular software development frameworks used for building web and enterprise applications. Although they share some similarities, there are some significant differences between the two. In this article, we will explore some of the most significant differences between .NET Core and Spring Framework.
- Platform Dependence
One of the biggest differences between .NET Core and Spring Framework is their platform dependence. .NET Core is primarily used on Windows platforms, while Spring Framework can be used on multiple platforms, including Windows, Linux, and macOS. This means that Spring Framework is more versatile and can be used in a wider range of projects.
- Language Support
.NET Core supports a range of programming languages, including C#, F#, and Visual Basic, while Spring Framework is primarily used with Java. This means that .NET Core is more versatile in terms of language support, which can be helpful in situations where multiple languages are used in a project.
Another significant difference between .NET Core and Spring Framework is their architectural approach. .NET Core uses a monolithic architecture, meaning that all components of an application are tightly coupled together. Spring Framework, on the other hand, uses a modular architecture, where different components of an application are more loosely coupled. This makes Spring Framework more flexible and adaptable to different project requirements.
- Dependency Injection
Both .NET Core and Spring Framework support dependency injection, a technique for managing dependencies between components of an application. However, they differ in their approach to dependency injection. .NET Core uses a built-in dependency injection container, while Spring Framework provides a more extensive dependency injection framework, including a range of injection techniques and annotations.
- Development Environment
.NET Core has a well-integrated development environment, including Visual Studio and Visual Studio Code, which provide a range of development tools and debugging features. Spring Framework, on the other hand, is typically used with an Integrated Development Environment (IDE) such as Eclipse or IntelliJ IDEA. While these tools provide a range of useful features, they may require more configuration and setup than .NET Core’s development environment.
- Community and Ecosystem
Both .NET Core and Spring Framework have a large and active community of developers, but they differ in their ecosystem and available resources. .NET Core has a large and well-established ecosystem of libraries, tools, and resources, including the .NET Standard library and the .NET Foundation. Spring Framework, on the other hand, has a large and diverse set of community-driven libraries and tools, including Spring Boot and Spring Data.
Move from Windows to Linux
Next, you will need to learn about Linux and how to use it effectively. This will involve learning how to use the command line interface, as well as some of the basic tools and utilities that are available in Linux. You may also need to learn about package management systems, such as apt-get or yum, depending on the distribution of Linux you are using. To further elaborate on that lets explore the biggest differences between Windows and Linux in terms of usage from a programmer/developer’s point of view.
- Software Development Tools
Windows has a large base of software development tools that are compatible with it, including Visual Studio, .NET Framework, and SQL Server. Microsoft also offers robust development tools for web development, such as ASP.NET, and it is a popular choice for Windows-based desktop application development. However, Linux has also gained popularity as a development platform and has a wide range of development tools available, including IntelliJ,Eclipse, NetBeans, and Sublime Text.
- Command Line Interface
Linux has a powerful command-line interface, which is a significant advantage for developers. The command line in Linux is highly customizable and offers greater control over the operating system. Additionally, Linux’s command-line interface is integrated with powerful tools like grep, sed, and awk, which can make complex text processing much more accessible. In contrast, Windows’ command prompt is not as powerful or flexible as Linux’s command line interface.
- Open Source
Linux is open-source, which means that its source code is freely available, and users can modify and distribute it as they see fit. This is a significant advantage for developers because they can customize and optimize the operating system for their specific needs. Additionally, Linux offers native support for many programming languages, including C, C++, Python, and Perl.
Linux is considered to be more secure than Windows due to its open-source nature. The Linux community is constantly working to improve security by identifying and fixing vulnerabilities. Additionally, Linux users do not typically run their operating systems with admin privileges, which reduces the likelihood of malware infections. In contrast, Windows has been historically more vulnerable to malware and security attacks.
- Development Environment
Developers who prefer to work in a graphical environment may prefer Windows because of its easy-to-use interface. Windows also provides a familiar environment for developers who are used to working with Microsoft tools. On the other hand, Linux is known for its stability, customizability, and flexibility, making it an ideal platform for developing web applications, particularly with the rise of containerization and virtualization technologies.
Move from Azure Container Registry to Linux
After learning about Linux, you can move on to learning about Openshift. This will involve learning how to create and manage containers, as well as how to deploy applications to the platform. You will also need to become familiar with Kubernetes, as Openshift is based on Kubernetes. Azure Container Registry (ACR) and OpenShift are two popular platforms for managing and deploying containers. While they share some similarities, such as support for Kubernetes and Docker, there are some key differences that set them apart and here they are.
- Platform Integration
Azure Container Registry is a service provided by Microsoft Azure and as such it has tight integration with other Azure services, such as Azure Kubernetes Service (AKS), Azure DevOps and Azure Active Directory. This makes it easy to deploy and manage containers on Azure, and to integrate container management into other Azure services. OpenShift, on the other hand, is an independent platform that supports Kubernetes and Docker. While it has integrations with other tools, such as Jenkins, it doesn’t have the same level of integration with other cloud platforms as Azure Container Registry.
- Security and Authentication
Security is always a top concern when it comes to container management, and both Azure Container Registry and OpenShift offer features for securing and authenticating container images. Azure Container Registry provides authentication and authorization through Azure Active Directory and integrates with other Azure security features. OpenShift, on the other hand, includes a built-in authentication and authorization system, as well as role-based access control (RBAC) to control access to resources.
- Deployment and Management
Both Azure Container Registry and OpenShift provide tools for deploying and managing container images, but there are some key differences. Azure Container Registry provides a user-friendly portal for managing container images, as well as a set of APIs and command-line tools for automating deployment and management tasks. OpenShift provides a web-based console for managing containerized applications and supports a range of deployment strategies, including rolling and blue-green deployments.
Pricing is always an important consideration when selecting a container management platform. Azure Container Registry offers a range of pricing options, including pay-as-you-go and subscription-based plans, with pricing based on usage and storage. OpenShift, on the other hand, is available in two editions: OpenShift Container Platform, which is designed for enterprise-scale deployments and requires a license, and OpenShift Origin, which is a community-driven version of the platform that is free to use.
- Community and Ecosystem
Another key difference between Azure Container Registry and OpenShift is their respective communities and ecosystems. Azure has a large and active community of users and contributors, and Microsoft offers a range of resources and support services to help users get the most out of the platform. OpenShift, on the other hand, is built on top of Kubernetes and benefits from the wider Kubernetes community and ecosystem, which includes a range of third-party tools and services.
Move from Azure DevOps and Bitbucket/Jenkins
Jenkins is another important tool that you will need to learn about. Jenkins is a popular continuous integration and continuous deployment (CI/CD) tool that can be used to automate the build, testing, and deployment of applications. You will need to become familiar with its various plugins, such as the Git plugin, as well as its scripting language, which is based on Groovy.
You will also need to learn about Bitbucket, which is a web-based version control repository hosting service. Bitbucket is similar to other version control tools, such as Git and GitHub, but it has some unique features, such as the ability to create and manage code reviews.
While both Azure DevOps and Bitbucket/Jenkins are popular platforms for managing and automating software development workflows and both offer similar features, there are some key differences that set them apart and this is what I had found out.
- Integration with other tools
One of the key differences between Azure DevOps and Bitbucket/Jenkins is their integration with other tools. Azure DevOps is part of the larger Azure platform, which includes a range of tools for cloud computing, storage, and analytics. This tight integration makes it easy to use Azure DevOps alongside other Azure tools, such as Azure Container Registry and Azure Kubernetes Service. Bitbucket and Jenkins are standalone tools that can integrate with a range of other tools and services, but do not have the same level of integration as Azure DevOps with other cloud platforms.
- Continuous Integration and Delivery (CI/CD)
Both Azure DevOps and Bitbucket/Jenkins offer powerful features for Continuous Integration and Delivery (CI/CD). However, there are some differences in how they handle this process. Azure DevOps provides a full suite of features for building, testing, and deploying applications in a single platform, with an intuitive user interface that makes it easy to set up and manage the entire CI/CD pipeline. Bitbucket and Jenkins, on the other hand, require more configuration to set up a full CI/CD pipeline, but offer more flexibility and customization options for the pipeline.
- Version Control
Both Azure DevOps and Bitbucket provide powerful version control features, but Bitbucket is specifically designed for Git version control. Jenkins does not include built-in version control features, but can be integrated with other version control tools such as Git. Azure DevOps provides both Git and Team Foundation Version Control (TFVC) options.
Pricing is another important consideration when selecting a software development platform. Azure DevOps offers a range of pricing options, including a free tier for small teams, and subscription-based plans that are priced according to the number of users and amount of data storage used. Bitbucket and Jenkins both offer free versions for small teams, with subscription-based plans that are priced according to the number of users.
- Community and Ecosystem
Another important factor to consider when selecting a software development platform is the size and vibrancy of the user community and ecosystem. Azure DevOps benefits from the wider Azure community, which includes a large and active community of users and contributors, as well as a range of resources and support services from Microsoft. Bitbucket and Jenkins have their own respective communities, with a wide range of third-party tools and integrations available.
Overall, the learning curve for this move is steep, but it is not insurmountable. With some effort and dedication, you can become proficient in these technologies relatively quickly. It is important to remember that you will not become an expert in all of these technologies overnight, but with time and practice, you can develop the skills necessary to work effectively with them.
As someone who went through this move last year, I can tell you that it was not easy, but it was definitely worth it. The biggest challenge for me was learning Java and the Spring framework. I was used to working with C# and .NET, so it took some time to adjust to the syntax and the differences in the way that Java and Spring work.
Once I became comfortable with Java and Spring, the rest of the move went much more smoothly. Learning Linux was not too difficult, as I had some prior experience with Unix-based systems. Openshift was a new technology for me, but I found it relatively easy to pick up, especially since it is based on Kubernetes. Jenkins was also fairly easy to learn, as I had some prior experience with CI/CD tools.
Another challenge for me was learning Bitbucket, as I had never used it before. However, I found that it was a powerful tool for managing code reviews and version control, and I quickly became comfortable with it.
Overall, the move to Java, SpringBoot, Linux, Openshift, Jenkins, and Bitbucket was a challenging but rewarding experience. I am now much more comfortable working with open-source technologies, and I feel that my skills are more versatile and in-demand as a result. If you are considering a similar move, I would encourage you to take the leap and embrace the challenge. It may be difficult at first, but it will be worth it in the long run.
Now you see the reason why I am not posting recently, I was learning a lot and cant provide any technical challenges yet compared to when I was using .Net as most of what I am doing now is not yet in the same level of complexity that I had when I was with .Net. My technical questions so far is quite simple to answer and widely answered on-line, unlike when I was in the .Net world most of the post I had here are born out of technical difficulties that were not answered yet online because of the intricacy of the solution I was providing before. Hopefully I will get back to speed soon in tacking complicated scenarios so I can start posting back technical challenges on this side of the world.