Coding Podcast

Tanmay Ambre
9 min readApr 11, 2021

This is the script of a podcast that I recently recorded. It’s about Coding and some generic guidance on it.

Hello All. My name is Tanmay Ambre. I am an IT Architect by profession with expertise on major technology transformation and modernization programs. However, most importantly I am also a developer with expertise on Event Driven Architectures, Microservices and Java. Coding is my passion. I love coding. And I do it almost every day. When I develop something new and see it working for the first time, it’s very exhilarating. My journey of coding started 24 years back in my first year of engineering. The first language I learnt was Pascal. I then went on to learn C, C++, Java and most recently Python. Back then, I was new to logic and new to computers. Initially it was difficult for me as I was new to logic. So, I had to first understand logic and algorithms.

Today I am going to talk about coding. IT is a technology centric industry. This, mandates having deep understanding of the technology and using it to solve real world business problems. And I am of the firm opinion unless one is hands-on, he would struggle in IT industry. This is evident from the significant rise in demand for coding specific roles and expertise. Developers command a premium. Opportunities for folks lacking hands-on experience are fast shrinking.

Also I firmly believe that unless one has hands-on experience in building systems — he or she can’t create good solutions. Because there are so many nuances and issues that can happen during implementation and render the originally created solution useless. This applies to all roles in IT industry. An Architect can’t create a good architecture unless he has experienced a full lifecycle of development and developed code. A project manager can’t produce good project plan unless he has development experience.

Does that mean having couple of years of coding experience is enough? In my opinion no. Development languages, frameworks, and toolchains are evolving at a very rapid pace. Technologies that were prevalent couple of years back are becoming obsolete. Advancements in frameworks and toolchains have made development easy. New programming paradigms have emerged. New standards have emerged. Hence it is important to keep learning and coding. This is especially true for Architects, Technology specialists, and developers.

I must keep myself updated and build experience on using new features in Java and java-based frameworks. I find it very difficult to create a solution if I don’t have a grasp on the technology stack that needs to be used. I can’t provide optimal effort estimates. I can’t identify risks in the solution if I don’t have implementation experience.

Coding is fascinating and very similar to real-life

I think one of the best ways to develop expertise in programming is by trying to find similarities or analogies in real life. For instance, the factory pattern which is used to produce things at a large scale. Similarly, chain of responsibility pattern and the command pattern — have very close resemblance to military operations. After all, the most complex system we know of is the real-world in which we interact with each other, nature, and environment to achieve an outcome. There are a set of rules on which human life is based upon. Similarly, there are certain set of rules on which computer systems are based upon.

This way of learning has stuck with me till date. I try to find similarities or analogies between the virtual world and the real world. May be that is one of the reasons why I love Event driven architectures. The whole world is event driven and why can’t IT systems be event driven?

It fascinates me to see how we react to different events occurring around us. And when I see a software system reacting to events, I naturally tend to correlate that to human behavior. We are exhausted when we do things at a rapid pace. Similarly, a CPU gets over heated under load. How we get diseases when we do something in excess and how a program crashes due to its excessive greed for memory. How we can solve a difficult problem by using divide and conquer technique and that is exactly what we do in our programs — we solve smaller problems through functions and chain them to solve a larger problem. How we can finish multiple tasks in less time when we add more people to the team and how we increase throughput of an application when we scale them.

There are many such similarities. I think the systems we develop, reflect the real-world.

The point I am trying to make here is if we try to correlate the programming problem with a real-world analogy — it provides many insights on how to optimize and write effective programs. It also makes understanding the problem easy.

Is learning one language enough?

Answer is no. We need to have experience in at least a couple of languages that are important in our field of work.

We need to be aware of different programming paradigms such as OOP, Functional Programming, Reactive programming, etc. Some of the languages are universal and some are specific to programming paradigms. Some languages are better suited for a given technology domain. For e.g. Python is considered much more advanced for AI/ML related workloads. Go and NodeJS are good for API development.

However, given the plethora of programming languages and frameworks and toolchains — it is not possible to master all of them. What do we do in this situation? This is where the “T”-model of learning is important. One must have a deep understanding of at least 1 or 2 programming languages and at the same time have a broad level of understanding of various other programming languages. For instance, I have deep knowledge of Java and have some knowledge of Python, Go, NodeJS. As an architect it helps me to make decisions about choosing a language for developing a particular component. Which one would be less effort intensive? Which one would help me with meeting the non-functional requirements?

So, my advice is, develop deep expertise in a programming language of your choice and keep yourself updated. Also develop some level of understanding of other programming languages.

How do you choose which languages to master?

Again, I would draw an analogy from the real-world. In today’s world one needs to communicate with people spread around the world. So, I need to know English. At the same if I am working very closely with my colleagues and clients in Germany — it would be good if I know German. So basically, choose the languages which are required for your core area of work. I also advice picking up languages in your area of interest and where your long-term aspirations are. I picked up Python because I have a budding interest in AI and ML. In few years’ time — I would want to become an expert in AI and ML. Also, some of the languages are becoming obsolete — so keep an eye on the future. I remember in my engineering days folks having knowledge of C and C++ were the programming Gurus. And then the rise of Java started. Today billions of devices run on Java.

Is having knowledge of language syntax and constructs sufficient?

Programming is not just about having awareness of syntax. It’s also about having expertise in algorithms, design patterns, data structures, popular frameworks or libraries of that language, and problem-solving skills. Just knowing the syntax of the language doesn’t make one a seasoned developer. I have seen many developers lacking knowledge of algorithms, patterns, and data structures. They are the basic building blocks that are required for building good applications. Given a programming task — folks end up writing very large and inefficient programs — if they would have known which patterns and algorithms to use, it would take less time, less effort and have less bugs. Irrespective of the language — one must master algorithms, patterns, and data structures. At the same time, it is important to know the best practices and standards for that language.

A real-world example would be building a house — there are established patterns which are used to build. Every time a new house has to be built — the architects, and builders draw upon the established patterns and processes to build a house within the given time and budget. They don’t invent ways of building the walls, floor and roof every time. They might make modifications to an established pattern. They will also use best practices and standards while building it.

How does one go about mastering a new language?

Start with the basics. Understand the syntax, understand the programming construct. Write a few “hello world” programs to explore different features of the language. Try to compare it with how you would do it in the language you know? Try to identify differences between the language you already know and the one you are trying to learn. This helps to deepen your understanding of the new language. Try to understand in which scenarios this language is more efficient and in which scenarios it won’t be efficient. Draw analogies with the real-world to deepen your understanding. Create your own library of programs which you can refer to while programming.

What are the best practices you should follow?

We should feel proud of what we develop. That can happen when we use patterns, use correct data structures, applicable algorithms and follow best practices and standards.

We should avoid becoming defensive about what we have implemented. We develop a bias and don’t easily agree with the review comments. Unless we are ready to accept and understand comments, we will not learn. This also impacts our ability to resolve issues. Always keep an open mind about accepting comments. We should accept and evaluate comments without any bias.

We should keep reviewing the code we develop and keep improving it. i.e. continuously review and refactor. Just like we do in real-life — we keep improving the way we do things.

We should not allow technical debt to build up. If you see something is not correct, just fix it. If we allow tech debt to accumulate, we are creating problems for ourselves.

We should avoid doing repetitive tasks. Many a times we just follow established practices even if they are repetitive and manual in nature. It might take some time to automate them. But once done — it would save a lot of time. This typically applies to testing. Writing better unit tests, developing test automation will save many hours of manual effort and help in building reliable software. Also, as I mentioned earlier build your own library of reusable code — this helps a lot in saving time.

Spend some effort in setting up local environments. It saves a lot of time.

Always be ready for change. It could be a change in the requirement or change in design or fixing an issue which requires a major change. Its ok. Postponing a change causes issues later. Its better to do it as quickly as it is identified.

Spend some time in designing your code. And keep that design in mind when coding. Think of patterns that you can use. Think of algorithms. Think where you have done it before, and how you can use it with some tweaks.

Always write code with reusability in mind. Make the code configurable. Write reusable functions.

If developing microservices keep the 12-factor app principles in mind.

Keep continuous focus and attention on performance and resource utilization. Non-functional requirements can only be met if the design and code have been developed with focus on NFR. Even a minor mistake in the program could impact performance or even crash the system.

Conclusion

To conclude this podcast — I would suggest never let your programming skills rust. Keep them up to date by coding continuously. If its been years since you have opened an IDE and developed a program, get started right now. Pick a new language to learn. Its fun and satisfying. It also helps in our career as an IT professional. Whether you are an architect, technical specialist, or a developer — keep coding.

Build understanding of programming paradigms. Build expertise on algorithms, data structures, design patterns. Build knowledge on non-functional requirements and how to write high performant and efficient code. Always follow best practices and standards while coding.

Thank you for listening. I would conclude by quoting a t-shirt message from one of the Hackathons — “May the code be with you!”

--

--

Tanmay Ambre

Executive I.T. Architect — Financial Services Sector, IBM India