Migration to web development from desktop development
Tags: webdev, programming, beginners, motivation
Published: 2022-08-24 17:15:00

## Information Technology

There are many exciting things in the world, and today information technology is one of the most popular areas where society shows colossal interest. What previously seemed impossible is now available to use. What used to take days or weeks now takes hours or minutes. Today, a person may spend more time acquiring skills and solving problems than seeking knowledge. All this is due to the development of information technology.

## My role in the world of information technology

Like many of us, I once asked, "How does it work?". It was with this thought that I began to show interest in programming. And now, for three and a half years, I have been developing commercial desktop applications using C# and Windows Forms.

Before getting my first job, I learned programming using C# and Unity3D. I also considered other technologies such as ASP NET MVC and Windows Forms but settled on Unity3D. It was the first game engine that I met. My first code looked like spaghetti, and it seemed that even I could not figure it out if I left the project for the weekend and returned. This problem is why I was interested in design patterns and principles of writing clean code. Soon I made a resume and began responding to IT company vacancies. After several interviews, I managed to pass one, during which I received a job offer. I got the position of Junior Developer and dealt with tasks related to the client part of an extensive information system with a client-server architecture. At that time, the company had already been on the market for 25 years. I saw as much code as I could not see in my dream in my early education stages when I could spend much time at the computer. But despite the difficulties, I was pleased and passionate about my first job, and two years later, I got the position of Staff Programmer.

## Why I decided to expand my tech stack

As mentioned earlier, the world is evolving. Like each of us, I am a part of this world and should also be engaged in my development. But it doesn't make any sense in development for development's sake. Instead, we need an end goal. In other words, we should answer a series of questions:

- What do I want to end up with?
- How do I know that I'm developing?
- How do I know if I'm mature enough?

Let me explain in more detail with a simple example. Suppose someone decides to learn English. How does this person know that he has learned and knows English? It turns out that there should be an endpoint that will determine that the language is learned. This point is the end goal. Imagine what would happen if a person did not mark such a point. When should he stop, then? Under such conditions, a person can learn English all his life. Therefore, it is essential to designate the end goal.

It is also worth noting that if there is an endpoint, there is also a starting point. Such a starting point may be a situation in which it is profitable to pay the cost of going to the endpoint. In a simple example, it looks like you want to move from point A to point B. But in the real world, people incur costs in such a transition. Such costs can be time, money, effort, health, etc. Therefore, before making the transition from point A to point B, a person evaluates whether it will be beneficial for him to make the transition.

In my case, the starting point was the situation in which I found myself. It looked like this. I work in a big company, using my previously acquired programming skills and knowledge of the C# language. I was superficially familiar with Windows Forms technology, so I gained new knowledge and skills at work. I also noticed that when working in a company that has been on the market for a long time, it is not always possible to work with the latest technologies and frameworks since you need to work with code that wrote many years ago. Maintaining the viability of such a product requires quite a lot of responsibility, a lot of concentration, and time. In addition, desktop applications are moving towards the location in the cloud and their work in the browser. Another case I drew attention to is that many solutions allow you to "host" software development in the cloud today. It will enable you to reduce the load on your local developer's machine, store your settings of the favorite IDE on a remote server, synchronize settings between devices and access them from anywhere with an Internet connection. And this is only part of the benefits. The main advantage is having only the browser installed on the developer's local machine.

Looking in which direction modern web development is developing, I decided to move forward, acquiring new skills and knowledge that will be useful for me in this situation. Thus, I may update the stack of technologies and tools I have used recently.

## Choice conditions

The field of software development is actively developing along with all its areas. There are more and more development tools, and these tools are becoming more and more versatile. So, for example, using one programming language, you can build one extensive information system. To date, there are a large number of programming languages ​​that can operate in various areas of the information system. It can be an interactive web application, mobile application, desktop application, server application, database management, etc. I should note that an utterly universal language does not exist since each language solves some specific problems, which entails "side" effects. We should consider a few short examples.

### Assembly
Assembly language allows the developer to access and manipulate processor registers. For example, place data in registers and perform arithmetic operations on them. But using an assembler, for example, a developer can use one operation at a time and no more than two operands per operation. Let's look at a more detailed example. In the assembler, the line of code `variable = 2 + 2 * 2` can be expanded into the instruction: put the number 2 in register R0, multiply register R0 by 2, and add 2 to register R0.
```assembly
/* pseudo assembly */
mov 2, R0
mul 2, R0
add 2, R0
```
Also, with all the variety of microcircuits and microcontrollers, the code written in the assembler will be different since the assembler is the closest part of the program code written by a human that interacts with a physical device. Using this approach to software development, the developer can create small executable files and get faster code execution than in high-level languages.

### C Language
The C language is a language that is easier for a human to understand, i.e., a person can spend less effort reading the program code and also on writing program code. The program's source code has become more readable as the developer can give names to variables, functions, and their parameters. Also, keywords appear in the program's source code that defines a set of assembler instructions generated by the compiler when building an executable file. In addition to writing program code that is more human-readable, the developer can insert code written in assembler if the need arises.
```c
/* long-expression */
int integerResult = 2 + 2 * 2;

/* reusable function */
int square(int operand) {
    return operand * operand;
}

/* inline-assembly */
__asm__("asm code here"
        "asm code here");
```
But with the convenience of reading and writing code in C, it is pretty challenging to find a problematic place in the source code of a program. For example, if you create an array of integers from three elements `int array[3];` and then access the element at index 3, which does not exist because indexing starts from 0. As a result, you will see an error message without specifying a line in the source code (same as in assembler). The message will be `*** stack smashing detected ***: terminated` or something like that. This behavior creates some problems, especially when the program's source code has many lines of program code.

### C Sharp
The C# language offers the developer a way to develop software in which the program code is executed in an environment commonly called runtime. With this approach, the developer can focus on problem-solving and on writing the program code, and the runtime developers, in turn, take care of the runtime for the final platform. Ideally, the developer does not need to compile or rebuild the application for different platforms. It has also become much easier to catch errors in the source code because the code executes in the runtime environment. For example, it is possible to specify a line of code in the program's source code that led to the error. However, this approach also has disadvantages, and one of these disadvantages is the dependence on the runtime environment. In other words, if the target platform does not have a runtime environment, then the program will fail to run on that platform.

### Multilevel System
The above have been condensed and are short examples of the differences between programming languages. I should also note that when I use "programming language," I mean not only the syntax of a particular language but technology in general. As a developer, I got the impression that the software development industry can be thought of as a layer cake or a layered system in which each layer is designed to solve specific problems. From this, it follows that the developer needs to decide at what level of this extensive system he will be most comfortable with, choose the tools used, and develop within the selected level.

## Criterias of choice

The developer, like every person, has areas of activity that are most interesting to him than others. Someone may be interested in how security systems work, someone else in the development of game engines, or someone else in creating user interfaces. Everyone decides what he likes the most. For the most part, I'm attracted to creating something beautiful that I want to interact with, like an interface or a computer game. As I mentioned earlier, many technologies allow you to solve tasks related to different parts of one information system. If earlier, for example, it was necessary to write a browser game using ActionScript and Flash, now there is no need to use third-party technologies. The browser already includes such tools as Canvas. Nowadays, web development has a fairly strong foundation that allows you to develop new technologies around what is already laid in this foundation. For example, GTK, the cross-platform toolkit, uses CSS, and Unity uses UXML and USS like XML and CSS to create a user interface. Using JavaScript today, you can create desktop and mobile applications for Android and iOS platforms, browser games, and applications, and that's not all where you can apply the stack or part of the web technology stack. Such application variability made the technology popular, attracted many developers, and as a result, a large number of tools appeared to solve problems for a particular niche.
Given the above, we can conclude that there are many areas where web technologies can be applied. Also, there are many educational materials on technology on the Internet, many developers, and development tools, and most of the development tools are open source. Most importantly, this is a low entry threshold. I mean that if we divide the developer's knowledge into two parts - knowledge of development technology and knowledge of the project. We could have a situation where if a new developer is connected, he will need to learn only the part related to the project in the ideal case. This situation will allow him to use a lot of time in favor of the project. In my opinion, the use of web technologies is growing, and it will continue to grow, so studying it will be beneficial for developers who like to create information systems with which the user must interact.

## How the migration occurs

I decided that I should devote time and attention to activities that would help me achieve my goal. So, for example, one way to learn HTML and CSS is to tweet or write articles on your blog about the lessons learned. This method will help to consolidate the lesson in memory. I often see other people learning web development using this method, and it is worth noting that this is an excellent approach to learning. In addition to the fact that people study, they also set an example for others. Also, all those tweets and blog posts are like a student's publicly available abstract notes at the university. You can always look at another student's lecture notes and add to your own what you missed. An excellent way to learn can be the "100 Days Of X" challenge. And I considered this method but decided that such a challenge is not suitable for me, since according to the rules you need to spend at least one hour a day for a hundred days on training. I got the impression that if you spend a small amount of time, but every day on one thing, such a thing can soon cause fatigue and some negative thoughts. I decided that if I got tired of studying, I needed to take as much rest as I needed and therefore stopped at the notes and tweets. But just lessons and notes are not enough. Another small project should be taken into work when writing which you can reproduce the knowledge gained. Writing a project will be a beneficial activity. It allows you to gain experience and see where you should focus more on studying.

## Conclusion

In conclusion, I would add that every developer should keep their skills and knowledge up to date to help build business processes at a high level of quality. Also, sharing your experience with other developers allows you to improve your skills and make the community a better place.

---

Glad you read my post. I hope it helped you in solving your problems. If you already have experience in similar situations, write about it in the comments 💭 below. I also look forward to your reactions and feedback. Stay safe and have fun!