I have started using LLMs (large language models) like Chat GPT and Claude to make the boring parts of software development less tedious. I have used LLMs to write boilerplate code and tests, generate sample data, and to migrate code to use a different framework. I have found LLMs particularly useful for helping me question my assumptions when troubleshooting and for generating prototype code for libraries, frameworks, and programming languages that I'm not very familiar with.
Until about 2015, my company avoided developing software or mobile apps that involved most APIs, with a few exceptions like payment gateways and accounting systems (such as Stripe, Intuit, Sage, and QuickBooks), as well as Google's mapping API. At that time, many APIs were too expensive, too buggy, and often created more problems than they solved. However, starting in 2016, two significant changes occurred. First, increased competition in the marketplace drove down API licensing costs, making them more accessible to a broader range of businesses. Second, APIs became more stable, reliable, and easier to integrate, thanks to improvements in technology and standardization. This shift resulted in better overall performance and more predictable outcomes, which in turn led to faster deployments and happier stakeholders, both for our end clients and our internal development teams. Additionally, the growing community of developers and more comprehensive documentation provided by API providers contributed to smoother integration processes. The ease of use and enhanced functionality of modern APIs allowed us to streamline our development workflows, reduce the time spent on troubleshooting, and focus more on innovation and delivering high-quality solutions. As a result, APIs have become an integral part of our development strategy, enabling us to build more robust and feature-rich applications. Today, we use APIs in every project, extending beyond just B2B and D2C efforts. For example, we recently developed a real estate application that utilizes numerous APIs from FLEXMLS, the national MLS network, along with various payment gateways, financial accounting, and tax APIs. This approach allowed us to significantly reduce development time, lowering costs, and accelerating our go-to-market launch date. The efficiency and reliability of modern APIs have enabled us to deliver high-quality solutions more rapidly and cost-effectively.
One programming paradigm shift I’ve embraced is the transition to functional programming. By adopting functional programming principles, such as immutability and first-class functions, I’ve significantly improved code reliability and maintainability. This paradigm minimizes side effects and promotes clearer, more predictable code behavior, which enhances debugging and testing processes. As a result, the overall quality of the software has increased, and development time has been reduced due to fewer unexpected issues and easier code refactoring.
Transitioning from Ruby to Python has been a significant paradigm shift that has improved my work in several ways. Python’s simplicity and readability have streamlined the development process, making code easier to write and maintain. The extensive standard library and active community support have provided a wealth of resources and libraries, enhancing productivity and reducing the need to reinvent solutions. Additionally, Python’s versatility across different domains—such as web development, data analysis, and machine learning—has enabled more diverse project opportunities and efficient workflows. Overall, this shift has led to more efficient development and greater flexibility in handling various tasks.
One of the major paradigm shifts in programming that I have really come to love is functional programming. That is a move away from the traditional object-oriented approach to a more functional style, and that really changed everything for me. The thing I love the most about this paradigm is that it really stresses immutability and pure functions, which essentially means my code is far more predictable and way simpler to debug. For example, adhering to the tenets of functional programming, I am able to write cleaner, more modular code with fewer side effects. This shift has made collaborating with others smoother because the code is much more predictable, and it's much easier to reason about. It also quickens development and maintenance since I spend less time dealing with unexpected bugs or complex interactions. This very paradigm, once embraced, increased the quality of my work and made it more enjoyable and efficient to code.