Design Principles and Design Patterns 03 Apr 2023 The relationship between design patterns and design principles is complimentary. Design principles provide high-level guidelines and best practices for designing software. Design patterns provide concrete implementations to specific design problems while adhering to the design principles
Why YOU Should Blog Too! 30 Mar 2023 Even though I liked the idea of blogging, I didn't know why I should blog. What was I going to add to the world when all I know comes from reading others' books and blogs? I had no reason to write about topics that are already written about extensively by experts in that area. I didn't think I knew enough contribute.
Technical Debt 28 Dec 2022 Consequence of Tech Debt is quicker to market now, refactoring effort later. Consequence of bad code is apparent speed now, legacy code and code rewrite later.
Struggles Of A Newcomer To FP 09 Jun 2022 Using a language that promotes functional style of programming does not automatically guarantee simple and maintainable code.
Higher Ranked Types 24 Jan 2019 Monomorphism, Polymorphism, and Higher ranked types
GADTs Talk - Bengaluru Haskell Meetup 29 Nov 2018 Talk I gave at Bangalore Haskell Meetup Group on using GADTs to bring compile time correctness to Haskell programs
The Expression Problem 13 Nov 2018 The expression problem is a well known problem in programming language theory dealing with the expressiveness of a programming language. Whether a language can solve the Expression Problem is a salient indicator of its capacity for expression.
Expressiveness 08 Nov 2018 What is expressiveness of a language?
Expressiveness of Haskell 04 Nov 2018 Demonstrate the expressiveness of Haskell using a simple Binary Tree and in-order traversal in Haskell, Python and Java
Dependent Types To Eliminate Runtime Checks 26 Oct 2018 One of the main advantages of static typing is to catch errors before we deploy code to production. Dependent Types allow us to eliminate some checks that are usually done at run time. I take a simple example to show how dependent types can be used in that regard in day-to-day programming.
Distributed Systems and Scalable Databases 08 Oct 2018 Introduction to distributed systems. How distributed databases work and their scaling model.
Quick Guide to Test-Driven Development (TDD) 11 May 2018 Test-Driven Development (TDD) is a software development approach that emphasises on tests driving the development. It means that tests play a central role in guiding the entire development process. With each new test driving the development of a small piece of functionality, the tests act as both a specification and a guide, providing clear expectations for the code’s behaviour and helping developers stay focused on delivering the required features. The Essence TDD can be summarised by two key principles:
Basic Lambda Calculus 25 Feb 2018 Introduction to Lambda-Calculus
Outward Counterclockwise Spiral Matrix Traversal - Haskell 12 Feb 2018 An efficient, lazy implementation of spiral traversal on a matrix in Haskell.
Notes on Sets, Relations, and Functions 04 Nov 2017 Basic maths - Sets, Relations, and Functions
TensorFlow Basics 02 Oct 2017 TensorFlow is Google's open source library for numerical computation. All computations are represented as Data Flow Graphs. The Nodes in the graph represent operations and Edges represent the data-communication between nodes.
Thinking in Imperative, Object Oriented and Functional way 15 Sep 2017 programming paradigms stem from different concepts about how the world works. They represent different opinions about how to best model the world while we are writing programs.
OO(h!) Principles 23 Oct 2016 An (incomplete) list of principles of OO software development
GADTs To Eliminate Runtime Checks 15 Oct 2016 GADTs generalizes ordinary algebraic data types by permitting value constructors to return specific types. GADTs are used for ensuring program correctness and in generic programming. This article is specific to Haskell programming language. In Haskell GADTs are implemented as a language extension. The article describes these use cases with small programs.
A Detour Called Monads 15 Aug 2016 When learning Haskell, all of us are faced with this monad monster. I too have spent many days and night fighting it - hoping that it will grant me all the wisdom if I survive long enough. I have come to believe that the community as whole has created this monstor. And many of us have taken this detour to master the art of monstor slaying instead of going on ahead - just to realise later that the detour was unnesessory.
Decisions 15 Aug 2016 We all make decisions. We should make decisions to be happy
Duplication Vs Abstraction 05 Jul 2016 When you see code duplication and can’t think of an abstraction to put that piece of code in, it is wise to keep the code separate. At least until you figure out the right abstraction.
Pair Programming - What? Why? And How? 31 Jan 2015 What? Simply put, pair programming is two programmers with a single computer working together to solve a problem! Why? To produce better code To learn more from your peers To learn and practice objectively evaluating possible solutions To collaborate with better programmers How? The Driver is responsible to coding (owns the keyboard) The Navigator is responsible for reviewing the driver’s work 30 min Rule: Role changes every 20-30min (at a logical break point) Take control of the worl.
10 Vim Plugins That Made My Vim Easy 04 Jan 2015 Few days back I posted the below pic online and some of my friends wanted to know how I got there. I am no vim expert and there are myriad of other (possibly better) ways of doing things. So I will just list the plugins I have used in my setup. Note that the side panes (NERDTree on the left and Tagbar on the right) auto-collapse. They magically appear when you summon them and hide themselves when the task is done.
Unscramble - A Word Puzzle 22 Nov 2014 Part 1 of how a newspaper puzzle became coding challenge
Performance Analysis In Python 02 Nov 2014 My recent escapade with Python taught me many things. One of which is to “start doing something that interests you. And each such daring act will teach you many more things.” This time I set out to finding ways of analysing the performance of an application - specifically Python applications. And as always I wasn’t disappointed with the results. Why Python? I just happened to be playing around with Python at the time (what I really mean is I was learning Python!
01 Jan 0001 A Comprehensive Guide to Microservices Components Microservices architecture has gained significant popularity in recent years due to its ability to create scalable and resilient applications. This architectural style involves breaking down complex applications into smaller, independent services that communicate with each other through well-defined APIs. In this blog post, we will explore the key components of microservices architecture, provide examples of their implementation, and discuss advanced concepts to deepen your understanding.
01 Jan 0001 Chapter 1: Introduction to Microservices 1.1 What are Microservices? Microservices, is an architectural style that structures an application as a collection of small, loosely coupled services. Each service is designed to perform a specific business capability and can be developed, deployed, and scaled independently. These services communicate with each other through well-defined APIs, often using lightweight protocols such as HTTP or message queues. The main idea behind microservices is to break down a complex application into a set of smaller, autonomous services that can be developed and deployed independently.
01 Jan 0001 Chapter 10: Microservices and Domain-Driven Design (DDD) 10.1 Introduction to Domain-Driven Design (DDD) In the world of software development, Domain-Driven Design (DDD) has gained significant recognition as an approach that brings a deeper understanding of the problem domain and improves the design of software systems. When combined with microservices architecture, DDD can provide a powerful framework for developing scalable and maintainable applications. DDD emphasises the importance of aligning software design with the domain it serves.
01 Jan 0001 Chapter 2: Microservices Components In microservices architecture, components play a crucial role in designing and building scalable, maintainable, and loosely coupled systems. Components are the building blocks that encapsulate specific functionalities and services within a microservices ecosystem. They enable modular development, deployment, and management of individual services, promoting flexibility and agility in the overall system. Microservices components can be seen as independent, self-contained modules responsible for handling specific business capabilities or technical functionalities.
01 Jan 0001 Microservices Introduction What are microservices? Benefits of microservices architecture Comparison with monolithic architecture Design Principles Single Responsibility Principle (SRP) Loose Coupling Autonomous Services Scalability and Resilience Architectural Components Service Discovery API Gateway Message Brokers Service Orchestration vs. Choreography Containerisation and Orchestration (Docker, Kubernetes) Communication and Protocols RESTful APIs Message-based Communication (e.g., RabbitMQ, Apache Kafka) Event-Driven Architecture (EDA) Service-to-Service Communication Patterns Data Management