ProgrammingPro #42: Angular Signals, VS Code Voice Sessions, Cutting-edge .NET, Java Concurrency, and Reducing Technical Debt
Bite-sized actionable content, practical tutorials, and resources for programmers
Welcome to this week’s edition of ProgrammingPro!
In today’s Expert Insight, we bring you an excerpt from the book Angular Design Patterns and Best Practices, that takes you through simplifying application states using Angular Signals.
News Highlights: Visual Studio Code introduces voice sessions and configurable auto-save, while Forrester predicts varied futures for low-code with AI's influence. jQuery 4.0 prioritizes modernization, and Go 1.22 resolves loop variable issues.
My top 5 picks from today’s learning resources:
Analyzing "Sorting a million 32-bit integers in 2MB of RAM using Python"🔢
Mastering Concurrency - An In-Depth Guide to Java's ExecutorService🔗
Enterprise Application Architecture - Best Practices and Strategies🏢
But before you dive into the rest, we've got something special for you! As a token of our appreciation for being a loyal newsletter subscriber, we're offering you an exclusive 50% off your first month with Packt Library. Why Packt? Because you get:
Ad-Free Learning: Unlimited eBooks and video courses.
Fresh Content Monthly: Over 50 new titles, including early access to some.
Innovative Tools: AI assistants, code explainers, and more.
Vast Resources: A wide range of tech topics covered.
This is your chance to upgrade your tech skills at half the price. But hurry, this offer is time-sensitive!
Enjoy Learning and Stay Awesome!
Divya Anne Selvaraj
Editor-in-Chief
🗞️News and Analysis🔎
Hey Code: Visual Studio Code now supports voice sessions as well as configurable auto-save and other updates: The "Hey Code" feature offers accessibility through voice commands and requires a Copilot subscription and the VS Code Speech extension, which is still in development. Read to learn how the new voice sessions work.
Forrester predicts three possible outcomes for the future of low-code: The three possibilities include continued growth, acceleration by AI, or deceleration due to AI making traditional coding more efficient. Read to learn about Forrester's analysis of the low-code market's potential directions and the the impact of AI.
jQuery 4.0 hits beta, with reduced support for Internet Explorer and breaking changes: This update emphasizes removals alongside bug fixes and performance enhancements, affecting older web browsers and deprecated APIs, and adopts ES modules with Rollup packaging. Read for insights into broader trends in web development towards modern standards and away from legacy systems.
Go language fixes for loop issue: The new version of Go, launched this week, resolves the accidental sharing of loop variables by creating new variables in each iteration, and adds the ability to range over integers. Read to learn more about the technical advancements in Go 1.22.
Agile process can spur micromanagement and poorly maintained code, says ex-Google software engineer: An ex-Google software engineer, drawing from his extensive experience and feedback from peers, highlights how Agile's emphasis on close collaboration between business and developers can diminish engineer autonomy. Read for insights into how Agile implementation without conforming to certain core principles can lead to decreased software quality and dissatisfaction.
🎓Tutorials and Learning Resources💡
Python
🎓Tutorial | Get started with Flask 3.0: This quick-start tutorial on Flask 3.0 introduces the framework's ease of use for web development with Python. Read for a guide focusing on basic application setup, routing, and templating with Jinja2.
🎓Tutorial | Get started with Python in Visual Studio Code: This article emphasizes the importance of the Python extension and Pylance for enhanced coding support, and mentions additional extensions for formatting. Read to learn how to leverage the Python extension to enhance your workflow.
Analyzing "Sorting a million 32-bit integers in 2MB of RAM using Python": This article revisits Guido Van Rossum's method for sorting a million 32-bit integers in 2MB of RAM using Python, showcasing the use of modules like struct, array, heapq, and generators. Read to learn an innovative approach to sorting large datasets with limited memory.
Java
Mastering Concurrency - An In-Depth Guide to Java's ExecutorService: This article shows you how to effectively use Java's ExecutorService to improve application performance and scalability. Read to understand thread pool implementations, and implement best practices for task execution and thread management.
Exploring the New Eclipse JNoSQL Version 1.1.0 - A Dive Into Oracle NoSQL: The new version enhances Java-NoSQL database integration, introducing Jakarta Data annotations and custom repositories to simplify code and focus on business logic. Read to learn how to effectively integrate and utilize the latest version.
Nobody Gets Fired For Choosing Java: This article emphasizes the strategic importance of choosing the right programming language, particularly Java for payment applications in fintech startups. Read for insights into the broader implications of technology choices on startup viability.
Go
Golang Co-Creator Rob Pike: ‘What Go Got Right and Wrong’: Read to gain insights into the design philosophy and practical decisions that shaped Golang, which have made it a robust and widely adopted programming language.
How to Send and Receive Emails with Go: This guide details how to send HTML emails, emails with attachments, and to multiple recipients. Read to learn practical approaches to implementing email functionality in Go applications.
PHP
Stop using old-fashioned closures in modern PHP. There are 4* ways to replace them: This article critiques the use of old-fashioned closures in PHP, particularly for complex logic. Read to learn about modern PHP practices for handling complex logic.
Dive into the Streamlined Directory Structure in Laravel 11: This article talks about the specific changes in Laravel 11's directory structure, including middleware customization. Read to be able to facilitate a smoother transition and more organized project development.
SQL
Local AI with Postgres, pgvector and llama2, inside a Tauri app: This article details the development of a local-first AI application using Postgres, pgvector, and llama2 within a Tauri app. Read to learn about innovative approaches to building local-first AI applications.
Mastering SQL Joins - A Comprehensive Guide for Data Science: This guide delves into advanced SQL techniques, focusing on multi-table joins crucial for data science. Read to gain insights into effectively using SQL joins for complex data retrieval and analysis.
Scala
Programming in Scala as a “Better” Java: This article introduces Scala as a versatile language for JVM, emphasizing its dual nature of supporting both object-oriented and functional programming. Read to learn about Scala's advantages over Java.
Kotlin
🎓Tutorial | Read and Write CSV Files With Kotlin: This article concludes that while pure Kotlin can be used for specific, unchanging parsing needs, libraries like Apache CSV and Jackson offer more versatile and powerful solutions for dealing with CSV files. Read to efficiently manage CSV data in Kotlin applications.
Game Dev.
MAME Debugging: This guide offers practical tips and an introduction to using MAME for debugging, particularly for modifying the Neo Geo game Puzzle Bobble to replace joystick controls with a rotary dial. Read to learn how to effectively use MAME's debugging tools and Lua scripting for game modifications.
🎓Tutorial | C# Gaming Magic - Craft Awesome Desktop Games: This article covers setting up the development environment, choosing the right IDE, and understanding game development frameworks like Unity, Godot, and MonoGame. Read to learn the essentials of C# in game development.
C/C++/C#
On Competing with C Using Haskell: This article explores the feasibility of achieving C-like performance with Haskell. Read to gain insights into the practicality of using Haskell for applications traditionally reserved for languages like C.
🎓Tutorial | Implementation of the Raft Consensus Algorithm Using C++20 Coroutines: This tutorial highlights the challenges in building a consensus module for distributed systems and the development of a specialized network library. Read to gain insights into creating efficient, coroutine-based network libraries.
Learn the C# Programming Language – Full Book for Beginners: This free to access book covers the basics and advanced features, including data types, control structures, loops, methods, classes, and new .NET versions, with practical examples using Visual Studio tools. Read to start learning.
JavaScript and TypeScript
💼Case Study | From many to one: Moving our JavaScript code into a monorepo: This article provides an in-depth look at the motivations, challenges, decision-making process, and outcomes of Aha!'s experience during the transition. Read if you are considering a similar move.
Blazing Fast JS - Part I - (*as fast as possible): This article introduces techniques for optimizing file manipulation and debugging NodeJS applications using Chrome Dev Tools. Read to learn strategies for profiling and optimizing NodeJS applications.
Authentication + Database Speed Run [React.js & Firebase]: This guide offers a swift setup for integrating authentication and database functionalities using React.js and Firebase. Read to be able to swiftly kickstart your full-stack projects with secure authentication.
TypeScript – Popular, enterprise ready and an ideal option for AI application development: With TypeScript's user share tripling recently, it's seen as increasingly important for developers leveraging LLMs. Read to learn more about TypeScript's growing relevance.
.NET
🎓Tutorial | Create an exception handler in ASP.NET Core 8: The recently introduced IExceptionHandler interface, allows developers to implement a centralized class for managing exceptions. Read to learn how to effectively use the interface to handle exceptions.
Dev Tunnels - A Game Changer for Mobile Developers: The feature in Visual Studio 2022 offers a solution for mobile developers facing challenges with back-end access from emulators or devices. Read to learn more.
🎓Tutorial | Create a recommendation app with .NET MAUI and ChatGPT:
This tutorial guides you through building a .NET MAUI app in Visual Studio that integrates OpenAI's ChatGPT API for location-based recommendations. Read to learn how to set up the project, add UI elements, reference the Azure.AI.OpenAI library, and implement API calls.
Ruby
Running Open-Source AI Models Locally With Ruby: This article discusses the advantages of using open-source AI models locally with Ruby, focusing on data security and control. Read to learn how to implementing AI models locally.
A Deep Dive Into RSpec Tests in Ruby on Rails: This article covers various test types including unit, controller, integration, system, request, mailer, job, and routing tests, emphasizing the importance of SOLID principles. Read to learn strategies for efficiently testing.
Rust
Rust Won’t Save Us - An Analysis of 2023’s Known Exploited Vulnerabilities: An analysis of exploited vulnerabilities, as per the CISA KEV catalog, reveals that a significant portion of critical vulnerabilities are enabled by insecure exposed functions. Read to understand the importance of vendor knowledge, and other strategies.
Unraveling the Power of Concurrency in Rust - A Deep Dive: This article explores Rust's ability to handle concurrency, detailing its abstractions like threads, message passing, and shared state. Read to learn about Rust's concurrency mechanisms.
Swift
App Preview Videos Capturing using the Xcode simulator: This article describes efficient techniques for creating App Preview Videos that meet Apple's specifications. Read to learn how to use tools like Xcode's Simulator and RocketSim to streamline the process.
Swift tricks: The author of this article shares 204 Swift programming tricks, highlighting dynamic member lookup in dictionaries, converting OrderedDictionary to Dictionary, and lots more. Read to up your game.
Microservices
🎓Tutorial | AI and Rules for Agile Microservices in Minutes: This article introduces a swift method to create agile microservices by combining AI with API/Logic Automation, and further customizing with Python, Rules, and Flask. Read to learn how to rapidly develop and iterate on microservices.
🌟Best Practices🚀
The beautiful theory of TDD and the reality check of practice: This article discusses the challenges and limitations of implementing TDD in software development, emphasizing the importance of experience, context, and the nature of the project. Read to understand why TDD's benefits are not universally applicable.
Enterprise Application Architecture - Best Practices and Strategies: This article explores the challenges of maintainability and the transformative power of Clean Architecture principles. Read to gain insights into optimizing application architecture for longevity, scalability, and adaptability.
What Is Platform Engineering?: The approach empowers development teams, optimizes resource utilization, ensures security, and fosters collaboration. Read to learn about the principles, functions, and impact of platform engineering.
Redefining PAM to Secure OT and IoT Devices: This article discusses the need to redefine Privileged Access Management (PAM) for securing Operational Technology (OT) and Internet of Things (IoT) devices. Read to learn about strategies to bolster overall cybersecurity resilience in OT environments.
How to Reduce Technical Debt – a Guide for CTOs [2024]: Managing technical debt is crucial as it impacts costs, customer satisfaction, and security. Read to learn strategies to identify, prevent, and reduce technical debt, ensuring product quality, security, and customer satisfaction while minimizing development costs and risks.
Take the Survey and request a resource for next week
🧠 Expert Insight 📚
Here’s an exclusive excerpt from “Chapter 13, The Angular Renaissance” in the book, Angular Design Patterns and Best Practices by Alvaro Camillo Neto.
Simplifying application states – Angular Signals
Controlling the state of a frontend application is one of the biggest challenges for a developer, as by nature, the interface
is dynamic and needs to react to various user actions. Angular, with its stacks included philosophy, already had tools suitable for this task, and we studied
in Chapters 5, Angular Services and the Singleton Pattern, and Chapter 9, Exploring Reactivity with RxJS, how to use these tools. However, despite being effective, the Angular community and team recognize that they are a bit complex for new developers and for simple cases of reactivity in frontend projects. To fill this gap, the Angular team introduced, from version 17 onward, a new element to the framework, called Signals.
According to the Angular documentation, a signal is a wrapper around a value that notifies consumers when that value changes. An analogy that you can associate with a signal is a cell in a spreadsheet. It can contain a value and we can create formulas in other cells that use its value to create other values.
Before refactoring our application, let’s illustrate this with a simpler example:
let a = signal<number>(2);
let b = signal<number>(3);
let sum = computed(() => a() + b());
console.log(sum());
To create a signal, we use the signal function, where we define what type of value it will store and declare an initial value for it. A signal can be writable or read-only; in this case, the variables a and b are writable. The variable c is also a signal but of a specific type, called computed. The computed type is, in our analogy of a spreadsheet, a cell that contains a formula where you can read the values of other cells to determine its value. Finally, we are reading the value of the signal by simply calling it as a function. The result of this code snippet is the value 5.
We will now change the example:
let a = signal<number>(2);
let b = signal<number>(3);
let sum = computed(() => a() + b());
console.log(sum());
a.set(9);
console.log(sum());
In this change, we are updating the value of signal a using the set method. When reading the sum signal, we can notice that the value was updated to 12. Notice that the calculation reacts in real time just like it would in a spreadsheet.
Another way to update the value of a writable signal is by using the update method:
let a = signal<number>(2);
let b = signal<number>(3);
let sum = computed(() => a() + b());
console.log(sum());
a.set(9);
console.log(sum());
b.update((oldValue) => oldValue * 2);
console.log(sum());
The update method allows you to update the signal based on the last value contained there.
Despite being simple, signal allows many possibilities as it can contain any type of value, from primitive ones such as numeric, string, and Boolean to complex objects.
…Signals are elements that will be increasingly improved by the Angular team, giving more control over the reactivity of our applications. An important point that we need to pay attention to is that Signals will not replace RxJS; in fact, they complement each other as we still need observables to control asynchronous flows and more complex flows.
Packt subscribers can continue reading for free here. Angular Design Patterns and Best Practices by Alvaro Camillo Neto was published in January 2023. You can buy the book here.
🛠️ Useful Tools ⚒️
ClimateTriage: an open-source Next.js platform linking developers to sustainability projects, enhancing natural resource management through technology.
Astro: a fast, SEO-friendly web framework for content sites, integrating JS-to-HTML streaming and multiple frontend tech compatibilities.
copilot-gpt4-service: a tool that transforms GitHub Copilot into a ChatGPT interface, offering chat and embeddings APIs for versatile deployment and third-party client compatibility.
dspy: a framework that automates language model prompt and weight optimization, improving system development with self-enhancing pipelines for task performance and reliability.
That’s all for today.
We have an entire range of newsletters with focused content for tech pros. Subscribe to the ones you find the most useful here. Complete ProgrammingPro archives can be found here. Complete PythonPro archives are here.
📢 If your company is interested in reaching an audience of developers, software engineers, and tech decision makers, you may want to advertise with us.
If you have any feedback, leave a comment below.



