From Python to Go and Back: My Experience

META

Activist
SUPREME
MEMBER
Joined
Mar 1, 2026
Messages
118
Reaction score
379
Deposit
0$
**From Python to Go and Back: My Experience**

In this article, I will share how I started programming in Python and why I needed Go, what and how I learned, and why I'm now considering Rust.

I’ll begin with my journey into development, but if you’re not interested in this part, feel free to scroll to the middle — there’s plenty of useful information for those considering studying Go as a second programming language.

**How It All Began**

In my ten years of work experience, there are no entries like "programmer" or "developer." Although I started my career in these positions. I graduated from university with a degree as a "mathematics and computer science teacher," but gradually transitioned into fintech, where I was involved in the digitalization of banking.

Today, it's common for us to pull out our phones, open a banking app, and with a few clicks send money to our parents or pay our utility bills. Twenty years ago, things were different. It was especially daunting — to receive interest on a deposit, you had to go to the bank office and stand in line for hours. For legal entities, there was a specific person who would pull bank statement printouts from a hundred-meter-long perforated paper roll every day. A year before, where my desk was, there stood an archaic teletype for communication with the Central Bank. Employees responsible for transferring money between correspondent accounts worked 12–14 hours a day — there were numerous tasks for automation in any direction.

We started with Perl — a language for creative expression, but later rewrote all internal banking systems in Python. It was then that I first used a language that allowed the team to write understandable code for everyone. Ultimately, I left fintech with remote support set up, security configured, a developed branch network, tens of thousands of salary clients, and a terrible burnout after 9 years of work.

Friends invited me to work as an engineer in a small telecom operator. It was quite a challenge: Roskomnadzor threatened to revoke the license due to violations. About 15,000 customers somehow existed on an ad-hoc billing system with payments made by mail, without any support. My team and I had to automate everything again, delve into the intricacies of network administration and programming, implement licensed billing systems, write components for payment gateway integration, and establish proper tech support instead of the director’s secretary answering the phone.

We wrote observability components in Python, and downtime for equipment drastically reduced — earlier we learned about problems from that same secretary; now we could see the state of affairs on dashboards in real time and received alerts in Jabber. After three years, the operator had a reliable, scalable infrastructure, an increasing customer base, and could easily pass all RKN and other government inspections without anxiety.

Then I went to work for a telecom equipment manufacturer that made components for Nokia and Huawei in Russia. We launched IMS services for MegaFon, MTS, Beeline, and SberTel. I found myself as the leading SRE engineer, working 20 hours a day. Fortunately, I was offered a position at MTS to do almost the same thing, but at the level of an expert manager, whose main tools were a planner, a pen, Outlook, and Visio. I launched products into commercial use: VoLTE, WiFi Calling, RCS, and "My Connect." Throughout these three years, I wanted to return to development, which I enjoyed, and that’s what I did.

**Key Helpers Along My Journey**

My main helpers throughout my journey have been my brain and Python. The capabilities of the language were enough for me, and I learned how to adapt its limitations to solve tasks. It was an invaluable tool for data analysis and creating internal applications like dynamic configuration services, monitoring, and more.

**What If Not Python, and Why Go?**

One day, I was tasked with collecting and analyzing netflow traffic at 250 megabits. I realized that a solution in interpreted Python lagged in performance and reliability compared to programs written in compiled languages with static typing. It was time to realize one of my long-standing dreams — to learn to write in a compiled language. Thus, we reached the choice of language.

My top contenders for developing this service were C++, Rust, and Go. Time was limited, and I was genuinely afraid of C++, so I chose Go for its simple syntax and dove headfirst into the language documentation. I quickly understood that for professional use of the language, there are two options: self-study or take a course.

Ideally, of course, both.

If choosing, the second option is faster, so that's what I went for. By the way, this principle works not only in programming: if a colleague or company has expertise in your query, reach out to them, and you’ll save time reaching a result (but not always money).

Go initially attracts with its apparent simplicity — many say that both Go and Python have a low entry threshold. Yes, but no.

Yes:

Both languages have excellent readability: Go has only 25 keywords, Python has 33, which means you can start writing after a week of immersion.

But no:

At the start, knowledge of the language will be superficial, leading to lower code quality, and such developers may be labeled with a bad reputation.

I’m against generalizations and know excellent Go programmers who mastered the language in a couple of weeks and now write production code. Unfortunately, the overall trend in the job market is distrust toward applicants with weak hard skills and low-quality code. In my opinion, this problem could be solved by Praktikum, as mentors review poorly written code, explain the problems in it, and force revisions — this will be useful later.

**How I Chose a Course**

There is currently a lot of hate and negative feedback about educational platforms:

- They prepare specialists that are not hired anywhere;
- The education received is superficial;
- And this is partially true.

You can take a pile of money, pay for a course, sit in front of a computer, and say:

— Now teach me, and by the end, find me a job, preferably at Yandex.

Or you can take a course and gain a foundation. Plus, read articles, watch YouTube videos on the topic, read Habr, hang out on forums and Reddit — and this knowledge will naturally accumulate on that same foundation. And you may not want to go to Yandex due to algorithms in interviews and salary ranges below market (which you learned from the largest @gogolang Telegram channel where Go developers communicate).

I did a little research on the ed-tech market and realized that only Praktikum prepares for the level I needed (+/- spherical middle), which predetermined my next six months. There are also a few strong courses on Go, the most interesting being the free Route 256 course from Ozon, but there is significant competition for a small number of students, and the selection day resembles "The Hunger Games."

**How I Learned**

While studying, you not only gain knowledge but also immerse yourself in the community around the language you’re studying — my first guides in Go were the mentors at Praktikum. It was amusing: during group assignments in onboarding, the curator heard that I worked at MTS and assigned me to a group where the mentor was a current MTS developer. During my first one-on-one meeting, I assured him that our communication would be solely within the framework of Praktikum and would not influence my job in any way, which apparently relieved him of a great burden of anxiety.

The whole vibe of learning is shaped by the course team, and I was fortunate. Here, you can meet people who enjoy programming even during the tough stages of its learning. One of the mentors left me his contact after my diploma presentation for emergency consultations, but the first and only message of thanks I sent was when I managed to rotate into a Go developer position at MTS.

**Course Internals**

Workshops are one of the main features of the course. An active developer explains the intricacies of working with the language using real examples, patiently answers questions, and imparts best practices in program design. By the way, it was strange to see that only 3–5 out of 50 students attended online workshops, as this is a real opportunity to further bother mentors with questions. The mentor can explain in a couple of sentences if questions arise from the theories discussed in lectures. Plus, after each call, there were online after-parties — in a relaxed atmosphere, mentors and students shared life and professional experiences.

I still keep in touch with some of my classmates; we help each other out. Recently, I saw a message in the corporate chat from a student finishing the same course in another cohort, asking for help with an internship or rotation. We chatted and arranged an interview with the CTO — after Praktikum, you know the level of a person's preparation and what tasks they can handle, so you can confidently recommend someone to the team.

The value of Praktikum lies not in the platform itself but in the fact that you immerse yourself in a developer environment, communicate, and learn to understand the specific processes of the language. Overall, the Go community in Russia is very friendly and non-toxic, but an outsider subconsciously fears responses like RTFM and thus hesitates to join new social groups. Praktikum gently breaks down this barrier — I often see classmates who were initially reserved actively communicating in TG channels about Go.

**Diploma Projects**

The course had two diploma projects — to create a loyalty system for an abstract store and a client-server multi-device password manager with maximum security requirements.

The server must implement the business logic:

- Registration, authentication, and authorization of users;
- Storage of private data;
- Synchronization of data between several authorized clients of the same owner;
- Transfer of private data to the owner upon request.

The client must implement the business logic:

- Authentication and authorization of users on a remote server;
- Access to private data upon request.

Functions, the implementation of which is left to the executor's discretion:

- Creation, editing, and deletion of data on the server or client side;
- Format for registering a new user;
- Choice of storage and format for storing data;
- Ensuring security for data transmission and storage;
- Protocol for interaction between the client and server;
- User authentication mechanisms and authorization to access information.

Additional requirements:

- The client must be distributed as a CLI application that can run on Windows, Linux, and Mac OS;
- The client must give the user the ability to obtain information about the version and build date of the client binary file.

The authors claim that these projects are not embarrassing to show in an interview — I agree, but in my case, the second project should be shown from the perspective of "how not to do projects in Go":

For the client, I chose a GUI implementation using [fyne], which turned the code into an unreadable monster with hundreds of callbacks — during the thesis defense, I was burning with shame. Interestingly, all students used [fyne] during their defense, even though the specification strictly suggested using CLI, but we, without collusion, decided to surprise the mentors with our madness. Don't do this!

**So How to Switch?**

Switching between languages is like using a car and a bicycle: you calmly hop on the bike if the city is in heavy traffic or use the car for family trips. The principle is the same; the rules differ, but it’s not critical. The switching process is intuitive and doesn’t demand immense cognitive effort.

The key to changing stacks or jobs is a clear understanding of why you are doing it and what goals you want to achieve. A goal like “I’m bored and want something different” isn’t suitable.

Psychologists have a technique: ask yourself the question "why?" several times until you find a clear and coherent answer. The last answer is the true goal and motivation, the vector you should aim for.

**Best Practices for Successful Work in Two Languages**

How to switch without making mistakes:

- Gain experience to understand, based on experience, which language to use for what — you use (your cap).

- Keep in mind that when developing services you use a constant environment like databases, message brokers, etc., which does not depend on the language used, only on specific implementations of interaction.

- Have an IDE — I use Idea with plugins for Go and Python, but many use VSCode.

**My Career: What Has Changed**

During my studies, Praktikum persistently suggested going through a career track; I agreed. During a consultation with an HR mentor, we reaffirmed my goal — to move into the rotation system within MTS without rejecting other offers.

**About Rotation**

At MTS, you can change professions. A huge thank you to MTS President Vyacheslav Nikolaev for such a tool — he did it himself several times. You go to your manager, express your desire to enter rotation, and if they're okay with it, you fall under the care of an HR manager. They take on the initial communication with the teams where you want to work. This way, you are taken out of the recruiter’s screening process but are not excluded from passing all interview stages. I’m sure that MTS is not unique in this regard, and similar tools exist in other companies, so for "switchers," this is an excellent opportunity to realize their ideas.

While I was rotating, I passed all interview stages at Yadro and received an offer. But I decided to stay in the MTS group as I joined an excellent product team.

**How Life Has Changed After Go**

Now Go is my primary tool — I've archived the Telegram chats about Python, but I haven’t abandoned the language itself. When I need to do something quickly and skip the compilation steps, the interpreter comes in handy.

I like Go for its built-in multithreading, decoupling through interfaces, static typing, a large standard library, the ecosystem, and a pleasant, open community. The downsides, I can stretch to say, are that due to the language's design, some tasks aren't always easy to solve, but that's just a matter of taste that can be addressed.

What would I change about my path of changing jobs? It took me a year from my initial thoughts to pay for the course, and I understand that this time could have been shortened, but I have no regrets.

The first topic in the course was the net/http package and the task of writing a full-fledged server and client. It’s a hallmark — we were thrown into the water to learn to swim and watched to see who would float. Everyone floated, though with varying degrees of success — Praktikum sets strict deadlines for the sprint but can accommodate a couple of extra days for finishing up. Then it took off — multithreading, code generation, patterns and anti-patterns, generics, profiling, security, networks, and much more. During the process, you can choose a project for these six months — a link shortener or a mini-Prometheus.

**What’s Next?**

I am considering moving towards Rust. There's a task in the backlog that suits a language with direct memory management, but it's not urgent. So, I'm focused on my current work and grateful for the experience I gained through Yandex Praktikum and MTS.

The fear of not learning a new language is understandable. But it’s not as difficult as it seems at the beginning. Does anyone have an example where this process ended in failure? It would be interesting to discuss and share experiences.
 
Top Bottom